Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Remote Application Platform (RAP) » [Tree] Focus Problem  () 1 Vote
[Tree] Focus Problem [message #495242] Wed, 04 November 2009 10:23 Go to next message
Steffen Kay is currently offline Steffen KayFriend
Messages: 14
Registered: September 2009
Junior Member
Hello,

i have found an issue in the Tree-Control.

Tested against CVS-Head (4th November).

The Problem:
You click (also doubleclick) on a TreeItem to set the focus to a specific Text-Control. The Text-Control get its focusGain-Event and there seems to be no problem. However, if you click a second time on the same TreeItem so that the same Text-Control should gain the focus it does not get the focus. I expect by clicking on a TreeItem the Text-Ctrl get first a focusLost-Event because the Tree-Control gain the Focus but this is not the case. Only if you manually set the focus to another control, e.g. with your mousepointer, the Text-Ctrl get the focusLost-Event and you are able to reset the focus to the same Text-Ctrl by clicking on the appropriate TreeItem.

Strangely, if you use a Table-Control instead you can't reproduce this problem. By using this control the Text-Control always get the focusLost-Event.

In following source you can find a sample-code for testing. Implemented is also a Table-Control to see the difference.

package raptest;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

public class MClass
{
	enum CtrlEnum
	{
		Ctrl_1,
		Ctrl_2,
		Ctrl_3,
	};
	
	enum EventDialog
	{
		TextDlg,
		TreeDlg,
		TableDlg,
	};
	
	private TextDialog textDialog;
	private TreeDialog treeDialog;
	private TableDialog tableDialog;
	
	public MClass(Display display)
	{
		// Init Dialogs and size/locate them
		textDialog = new TextDialog(display, this);
		treeDialog = new TreeDialog(display, this);
		tableDialog = new TableDialog(display, this);
		
		textDialog.setSize(400,200);
		treeDialog.setSize(400,200);
		tableDialog.setSize(400,200);
		
		textDialog.setLocation(50,50);
		treeDialog.setLocation(50,250);
		tableDialog.setLocation(50,450);
		
		textDialog.layout(true,true);
		textDialog.open();
		treeDialog.open();
		tableDialog.open();
		blockShell(treeDialog);
	}
	
	public static void blockShell(Shell shell)
	{
		Display display = null;
		if (shell == null)
		{
			display = Display.getCurrent();
		}
		else
		{
			display = shell.getDisplay();
		}

		while (shell != null && !shell.isDisposed())
		{
			if (!display.readAndDispatch())
			{
				display.sleep();
			}
		}
	}
	
	public void ClickedEventHandler(CtrlEnum ctrlEnum, EventDialog eventDialog)
	{
		if(eventDialog != EventDialog.TextDlg)
		{
			textDialog.setFocusToItem(ctrlEnum);
		}
		if(eventDialog != EventDialog.TreeDlg)
		{
			treeDialog.setFocusToItem(ctrlEnum);
		}
		if(eventDialog != EventDialog.TableDlg)
		{
			tableDialog.setFocusToItem(ctrlEnum);
		}
	}
	
	public class TextDialog extends Shell
	{
		private Tree tree;
		
		public TextDialog(Display display, final MClass mClass)
		{
			super(display);
			this.getShell().setText("TextDialog");
			RowLayout rowLayout = new RowLayout();
			//rowLayout.pack = true;
			rowLayout.type = SWT.VERTICAL;
			rowLayout.fill = true;
			
			this.setLayout(rowLayout);
			
			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				Text text = new Text(this, SWT.BORDER);
				text.setData(ctrlEnum);
				text.setText(ctrlEnum.toString());
				Point size = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
				text.setLayoutData(new RowData(200, size.y));
				
				// Give every Text-Control a FocusListener
				text.addFocusListener(new FocusListener()
				{
					@Override
					public void focusLost(FocusEvent event)
					{
						Text text = (Text)event.widget;
						System.out.println("focusLost (" + text.getData().toString() + ")" + System.currentTimeMillis());
					}
					
					@Override
					public void focusGained(FocusEvent event)
					{
						Text text = (Text)event.widget;				
						
						System.out.println("focusGain (" + text.getData().toString() + ")" + System.currentTimeMillis());
						
						setFocusToTreeItem((CtrlEnum) text.getData());
						
						mClass.ClickedEventHandler((CtrlEnum) text.getData(), EventDialog.TextDlg);
					}
				});
			}
			
			tree = new Tree(this, SWT.SINGLE | SWT.BORDER);
			tree.setSize(100, 100);

			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				TreeItem treeItem = new TreeItem(tree, SWT.NONE);
				treeItem.setData(ctrlEnum);
				treeItem.setText(ctrlEnum.toString());
			}
			
			tree.addSelectionListener(new SelectionListener()
			{
				
				@Override
				public void widgetSelected(SelectionEvent e){ }
				
				@Override
				public void widgetDefaultSelected(SelectionEvent e)
				{
					TreeItem[] selItems = tree.getSelection();
					if(selItems.length > 0)
					{
						// we have a Single-Selection
						System.out.println("widgetDefaultSelected");
						CtrlEnum ctrlEnum = (CtrlEnum) selItems[0].getData();
						mClass.ClickedEventHandler(ctrlEnum, EventDialog.TreeDlg);
					}
				}
			});
		}
		
		private void setFocusToTreeItem(CtrlEnum ctrlEnum)
		{
			for(TreeItem treeItem : tree.getItems())
			{
				CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
				
				if(ctrlEnum == ctrlEnumData)
				{		
					treeItem.setText(treeItem.getData().toString() + " SELECTED");
				}
				else 
				{
					treeItem.setText(treeItem.getData().toString());
				}
			}
		}
		
		public void setFocusToItem(CtrlEnum ctrlEnum)
		{
			// Search the matching Text-Control
			for(Control control : getChildren())
			{
				if(control instanceof Text)
				{
					
					CtrlEnum ctrlEnumData = (CtrlEnum) control.getData();
					if(ctrlEnum == ctrlEnumData)
					{
						Text text = (Text)control;						
						text.selectAll();
						text.setFocus();
						break;
					}
				}
			}
			
			setFocusToTreeItem(ctrlEnum);
		}
	}
	
	public class TreeDialog extends Shell
	{
		private Tree tree;
		public TreeDialog(Display display, final MClass mClass)
		{
			super(display);
			this.getShell().setText("TreeDialog");			
			this.setLayout(new FillLayout());
			
			tree = new Tree(this, SWT.SINGLE);

			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				TreeItem treeItem = new TreeItem(tree, SWT.NONE);
				treeItem.setData(ctrlEnum);
				treeItem.setText(ctrlEnum.toString());
			}
			
			tree.addSelectionListener(new SelectionListener()
			{
				
				@Override
				public void widgetSelected(SelectionEvent e){ }
				
				@Override
				public void widgetDefaultSelected(SelectionEvent e)
				{
					TreeItem[] selItems = tree.getSelection();
					if(selItems.length > 0)
					{
						// we have a Single-Selection
						System.out.println("widgetDefaultSelected");
						CtrlEnum ctrlEnum = (CtrlEnum) selItems[0].getData();
						mClass.ClickedEventHandler(ctrlEnum, EventDialog.TreeDlg);
					}
				}
			});
		}
		
		public void setFocusToItem(CtrlEnum ctrlEnum)
		{
			// Search the matching treeItem
			for(TreeItem treeItem : tree.getItems())
			{
				CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
				
				if(ctrlEnum == ctrlEnumData)
				{		
					treeItem.setText(treeItem.getData().toString() + " SELECTED");
				}
				else 
				{
					treeItem.setText(treeItem.getData().toString());
				}
			}
		}
	}
	
	public class TableDialog extends Shell
	{
		private Table table;
		public TableDialog(Display display, final MClass mClass)
		{
			super(display);
			this.getShell().setText("TableDialog");
			this.setLayout(new FillLayout());
			
			table = new Table(this, SWT.SINGLE);

			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				TableItem tableItem = new TableItem(table, SWT.NONE);
				tableItem.setData(ctrlEnum);
				tableItem.setText(ctrlEnum.toString());
			}
			
			table.addSelectionListener(new SelectionListener()
			{
				
				@Override
				public void widgetSelected(SelectionEvent e){ }
				
				@Override
				public void widgetDefaultSelected(SelectionEvent e)
				{
					TableItem[] selItems = table.getSelection();
					if(selItems.length > 0)
					{
						// we have a Single-Selection
						System.out.println("widgetDefaultSelected");
						CtrlEnum ctrlEnum = (CtrlEnum) selItems[0].getData();
						mClass.ClickedEventHandler(ctrlEnum, EventDialog.TreeDlg);
					}
				}
			});
		}
		
		public void setFocusToItem(CtrlEnum ctrlEnum)
		{
			// Search the matching treeItem
			for(TableItem treeItem : table.getItems())
			{
				CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
				
				if(ctrlEnum == ctrlEnumData)
				{		
					treeItem.setText(treeItem.getData().toString() + " SELECTED");
				}
				else 
				{
					treeItem.setText(treeItem.getData().toString());
				}
			}
		}
	}
}

[Updated on: Wed, 04 November 2009 14:51]

Report message to a moderator

Re: [Tree] Focus Problem [message #495289 is a reply to message #495242] Wed, 04 November 2009 13:50 Go to previous messageGo to next message
Ivan Furnadjiev is currently offline Ivan FurnadjievFriend
Messages: 2426
Registered: July 2009
Location: Sofia, Bulgaria
Senior Member
Hi Steffen,

you ran into this bug:
275113: [Tree] Tree has a focus problem
https://bugs.eclipse.org/bugs/show_bug.cgi?id=275113
which has been fixed in CVS HEAD and will be part of 1.3M3 release.

Best,
Ivan

Steffen wrote:
> Hello,
>
> i have found an issue in the Tree-Control.
> The Problem:
> You click (also doubleclick) on a TreeItem to set the focus to a
> specific Text-Control. The Text-Control get its focusGain-Event and
> there seems to be no problem. However, if you click a second time on
> the same TreeItem so that the same Text-Control should gain the focus
> it does not get the focus. I expect by clicking on a TreeItem the
> Text-Ctrl get first a focusLost-Event because the Tree-Control gain
> the Focus but this is not the case. Only if you manually set the focus
> to another control, e.g.with your mousepointer, the Text-Ctrl get the
> focusLost-Event and you are able to reset the focus to the same
> Text-Ctrl by clicking on the appropriate TreeItem.
>
> Strangely, if you use a Table-Control instead you can't reproduce this
> problem. By using this control the Text-Control always get the
> focusLost-Event.
>
> In the attachment you can find a sample-code for testing. Implemented
> is also a Table-Control to see the difference.
>
Re: [Tree] Focus Problem [message #495293 is a reply to message #495242] Wed, 04 November 2009 14:08 Go to previous messageGo to next message
Steffen Kay is currently offline Steffen KayFriend
Messages: 14
Registered: September 2009
Junior Member
Steffen wrote on Wed, 04 November 2009 05:23

Tested against CVS-Head (4th November).



How i said, i have tested against the actual CVS HEAD.

This Bug-Entry was also known to me but the Bug seems to be not fixed.

[Updated on: Wed, 04 November 2009 14:14]

Report message to a moderator

Re: [Tree] Focus Problem [message #495307 is a reply to message #495293] Wed, 04 November 2009 14:25 Go to previous messageGo to next message
Ivan Furnadjiev is currently offline Ivan FurnadjievFriend
Messages: 2426
Registered: July 2009
Location: Sofia, Bulgaria
Senior Member
Steffen,

where is the attachment?

Best,
Ivan

Steffen wrote:
> Steffen wrote on Wed, 04 November 2009 05:23
>> Tested against CVS-Head (4th November).
>
>
> How i said, i tested against the actual CVS HEAD.
Re: [Tree] Focus Problem [message #495308 is a reply to message #495307] Wed, 04 November 2009 14:53 Go to previous messageGo to next message
Steffen Kay is currently offline Steffen KayFriend
Messages: 14
Registered: September 2009
Junior Member
Ivan Furnadjiev wrote on Wed, 04 November 2009 09:25
Steffen,

where is the attachment?

Best,
Ivan



Oh sorry, i was not able to add an attachment, so i added the sample-source in my first post Rolling Eyes

[Updated on: Wed, 04 November 2009 14:53]

Report message to a moderator

Re: [Tree] Focus Problem [message #495341 is a reply to message #495308] Wed, 04 November 2009 15:51 Go to previous messageGo to next message
Ivan Furnadjiev is currently offline Ivan FurnadjievFriend
Messages: 2426
Registered: July 2009
Location: Sofia, Bulgaria
Senior Member
Steffen,

maybe your first post is truncated... It ends with:
"In the attachment you can find a sample-code for testing. Implemented
is also a Table-Control to see the difference. "
No code, no RAP version used...

Best,
Ivan

Steffen wrote:
> Ivan Furnadjiev wrote on Wed, 04 November 2009 09:25
>> Steffen,
>>
>> where is the attachment?
>>
>> Best,
>> Ivan
>
>
> Oh sorry, i was not able to add an attachment, so i added the
> sample-source in my first post. (the ultra long source :lol: )
>
Re: [Tree] Focus Problem [message #496186 is a reply to message #495242] Mon, 09 November 2009 10:21 Go to previous messageGo to next message
Steffen Kay is currently offline Steffen KayFriend
Messages: 14
Registered: September 2009
Junior Member
Here the source a 2nd time:
RAP-Version: CVS-Head (4th November)


package raptest;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

public class MClass
{
	enum CtrlEnum
	{
		Ctrl_1,
		Ctrl_2,
		Ctrl_3,
	};
	
	enum EventDialog
	{
		TextDlg,
		TreeDlg,
		TableDlg,
	};
	
	private TextDialog textDialog;
	private TreeDialog treeDialog;
	private TableDialog tableDialog;
	
	public MClass(Display display)
	{
		// Init Dialogs and size/locate them
		textDialog = new TextDialog(display, this);
		treeDialog = new TreeDialog(display, this);
		tableDialog = new TableDialog(display, this);
		
		textDialog.setSize(400,200);
		treeDialog.setSize(400,200);
		tableDialog.setSize(400,200);
		
		textDialog.setLocation(50,50);
		treeDialog.setLocation(50,250);
		tableDialog.setLocation(50,450);
		
		textDialog.layout(true,true);
		textDialog.open();
		treeDialog.open();
		tableDialog.open();
		blockShell(treeDialog);
	}
	
	public static void blockShell(Shell shell)
	{
		Display display = null;
		if (shell == null)
		{
			display = Display.getCurrent();
		}
		else
		{
			display = shell.getDisplay();
		}

		while (shell != null && !shell.isDisposed())
		{
			if (!display.readAndDispatch())
			{
				display.sleep();
			}
		}
	}
	
	public void ClickedEventHandler(CtrlEnum ctrlEnum, EventDialog eventDialog)
	{
		if(eventDialog != EventDialog.TextDlg)
		{
			textDialog.setFocusToItem(ctrlEnum);
		}
		if(eventDialog != EventDialog.TreeDlg)
		{
			treeDialog.setFocusToItem(ctrlEnum);
		}
		if(eventDialog != EventDialog.TableDlg)
		{
			tableDialog.setFocusToItem(ctrlEnum);
		}
	}
	
	public class TextDialog extends Shell
	{
		private Tree tree;
		
		public TextDialog(Display display, final MClass mClass)
		{
			super(display);
			this.getShell().setText("TextDialog");
			RowLayout rowLayout = new RowLayout();
			//rowLayout.pack = true;
			rowLayout.type = SWT.VERTICAL;
			rowLayout.fill = true;
			
			this.setLayout(rowLayout);
			
			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				Text text = new Text(this, SWT.BORDER);
				text.setData(ctrlEnum);
				text.setText(ctrlEnum.toString());
				Point size = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
				text.setLayoutData(new RowData(200, size.y));
				
				// Give every Text-Control a FocusListener
				text.addFocusListener(new FocusListener()
				{
					@Override
					public void focusLost(FocusEvent event)
					{
						Text text = (Text)event.widget;
						System.out.println("focusLost (" + text.getData().toString() + ")" + System.currentTimeMillis());
					}
					
					@Override
					public void focusGained(FocusEvent event)
					{
						Text text = (Text)event.widget;				
						
						System.out.println("focusGain (" + text.getData().toString() + ")" + System.currentTimeMillis());
						
						setFocusToTreeItem((CtrlEnum) text.getData());
						
						mClass.ClickedEventHandler((CtrlEnum) text.getData(), EventDialog.TextDlg);
					}
				});
			}
			
			tree = new Tree(this, SWT.SINGLE | SWT.BORDER);
			tree.setSize(100, 100);

			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				TreeItem treeItem = new TreeItem(tree, SWT.NONE);
				treeItem.setData(ctrlEnum);
				treeItem.setText(ctrlEnum.toString());
			}
			
			tree.addSelectionListener(new SelectionListener()
			{
				
				@Override
				public void widgetSelected(SelectionEvent e){ }
				
				@Override
				public void widgetDefaultSelected(SelectionEvent e)
				{
					TreeItem[] selItems = tree.getSelection();
					if(selItems.length > 0)
					{
						// we have a Single-Selection
						System.out.println("widgetDefaultSelected");
						CtrlEnum ctrlEnum = (CtrlEnum) selItems[0].getData();
						mClass.ClickedEventHandler(ctrlEnum, EventDialog.TreeDlg);
					}
				}
			});
		}
		
		private void setFocusToTreeItem(CtrlEnum ctrlEnum)
		{
			for(TreeItem treeItem : tree.getItems())
			{
				CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
				
				if(ctrlEnum == ctrlEnumData)
				{		
					treeItem.setText(treeItem.getData().toString() + " SELECTED");
				}
				else 
				{
					treeItem.setText(treeItem.getData().toString());
				}
			}
		}
		
		public void setFocusToItem(CtrlEnum ctrlEnum)
		{
			// Search the matching Text-Control
			for(Control control : getChildren())
			{
				if(control instanceof Text)
				{
					
					CtrlEnum ctrlEnumData = (CtrlEnum) control.getData();
					if(ctrlEnum == ctrlEnumData)
					{
						Text text = (Text)control;						
						text.selectAll();
						text.setFocus();
						break;
					}
				}
			}
			
			setFocusToTreeItem(ctrlEnum);
		}
	}
	
	public class TreeDialog extends Shell
	{
		private Tree tree;
		public TreeDialog(Display display, final MClass mClass)
		{
			super(display);
			this.getShell().setText("TreeDialog");			
			this.setLayout(new FillLayout());
			
			tree = new Tree(this, SWT.SINGLE);

			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				TreeItem treeItem = new TreeItem(tree, SWT.NONE);
				treeItem.setData(ctrlEnum);
				treeItem.setText(ctrlEnum.toString());
			}
			
			tree.addSelectionListener(new SelectionListener()
			{
				
				@Override
				public void widgetSelected(SelectionEvent e){ }
				
				@Override
				public void widgetDefaultSelected(SelectionEvent e)
				{
					TreeItem[] selItems = tree.getSelection();
					if(selItems.length > 0)
					{
						// we have a Single-Selection
						System.out.println("widgetDefaultSelected");
						CtrlEnum ctrlEnum = (CtrlEnum) selItems[0].getData();
						mClass.ClickedEventHandler(ctrlEnum, EventDialog.TreeDlg);
					}
				}
			});
		}
		
		public void setFocusToItem(CtrlEnum ctrlEnum)
		{
			// Search the matching treeItem
			for(TreeItem treeItem : tree.getItems())
			{
				CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
				
				if(ctrlEnum == ctrlEnumData)
				{		
					treeItem.setText(treeItem.getData().toString() + " SELECTED");
				}
				else 
				{
					treeItem.setText(treeItem.getData().toString());
				}
			}
		}
	}
	
	public class TableDialog extends Shell
	{
		private Table table;
		public TableDialog(Display display, final MClass mClass)
		{
			super(display);
			this.getShell().setText("TableDialog");
			this.setLayout(new FillLayout());
			
			table = new Table(this, SWT.SINGLE);

			for(CtrlEnum ctrlEnum : CtrlEnum.values())
			{
				TableItem tableItem = new TableItem(table, SWT.NONE);
				tableItem.setData(ctrlEnum);
				tableItem.setText(ctrlEnum.toString());
			}
			
			table.addSelectionListener(new SelectionListener()
			{
				
				@Override
				public void widgetSelected(SelectionEvent e){ }
				
				@Override
				public void widgetDefaultSelected(SelectionEvent e)
				{
					TableItem[] selItems = table.getSelection();
					if(selItems.length > 0)
					{
						// we have a Single-Selection
						System.out.println("widgetDefaultSelected");
						CtrlEnum ctrlEnum = (CtrlEnum) selItems[0].getData();
						mClass.ClickedEventHandler(ctrlEnum, EventDialog.TreeDlg);
					}
				}
			});
		}
		
		public void setFocusToItem(CtrlEnum ctrlEnum)
		{
			// Search the matching treeItem
			for(TableItem treeItem : table.getItems())
			{
				CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
				
				if(ctrlEnum == ctrlEnumData)
				{		
					treeItem.setText(treeItem.getData().toString() + " SELECTED");
				}
				else 
				{
					treeItem.setText(treeItem.getData().toString());
				}
			}
		}
	}
}

[Updated on: Mon, 09 November 2009 10:29]

Report message to a moderator

Re: [Tree] Focus Problem [message #496200 is a reply to message #496186] Mon, 09 November 2009 10:44 Go to previous messageGo to next message
Ivan Furnadjiev is currently offline Ivan FurnadjievFriend
Messages: 2426
Registered: July 2009
Location: Sofia, Bulgaria
Senior Member
Hi Steffen,

the problem exists only if you click on the tree that is in non focused
(active) shell (dialog). If you have only one Shell - TextDialog for
example, everything is working as expected. The actual problem is that,
clicking on the Tree does not activate the parent shell. Please file a
bugzilla about this issue.

Best,
Ivan

Steffen wrote:
> Here the source a 2nd time:
>
>
> package raptest;
>
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.events.FocusEvent;
> import org.eclipse.swt.events.FocusListener;
> import org.eclipse.swt.events.SelectionEvent;
> import org.eclipse.swt.events.SelectionListener;
> import org.eclipse.swt.graphics.Point;
> import org.eclipse.swt.layout.FillLayout;
> import org.eclipse.swt.layout.RowData;
> import org.eclipse.swt.layout.RowLayout;
> import org.eclipse.swt.widgets.Control;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Shell;
> import org.eclipse.swt.widgets.Table;
> import org.eclipse.swt.widgets.TableItem;
> import org.eclipse.swt.widgets.Text;
> import org.eclipse.swt.widgets.Tree;
> import org.eclipse.swt.widgets.TreeItem;
>
> public class MClass
> {
> enum CtrlEnum
> {
> Ctrl_1,
> Ctrl_2,
> Ctrl_3,
> };
>
> enum EventDialog
> {
> TextDlg,
> TreeDlg,
> TableDlg,
> };
>
> private TextDialog textDialog;
> private TreeDialog treeDialog;
> private TableDialog tableDialog;
>
> public MClass(Display display)
> {
> // Init Dialogs and size/locate them
> textDialog = new TextDialog(display, this);
> treeDialog = new TreeDialog(display, this);
> tableDialog = new TableDialog(display, this);
>
> textDialog.setSize(400,200);
> treeDialog.setSize(400,200);
> tableDialog.setSize(400,200);
>
> textDialog.setLocation(50,50);
> treeDialog.setLocation(50,250);
> tableDialog.setLocation(50,450);
>
> textDialog.layout(true,true);
> textDialog.open();
> treeDialog.open();
> tableDialog.open();
> blockShell(treeDialog);
> }
>
> public static void blockShell(Shell shell)
> {
> Display display = null;
> if (shell == null)
> {
> display = Display.getCurrent();
> }
> else
> {
> display = shell.getDisplay();
> }
>
> while (shell != null && !shell.isDisposed())
> {
> if (!display.readAndDispatch())
> {
> display.sleep();
> }
> }
> }
>
> public void ClickedEventHandler(CtrlEnum ctrlEnum, EventDialog
> eventDialog)
> {
> if(eventDialog != EventDialog.TextDlg)
> {
> textDialog.setFocusToItem(ctrlEnum);
> }
> if(eventDialog != EventDialog.TreeDlg)
> {
> treeDialog.setFocusToItem(ctrlEnum);
> }
> if(eventDialog != EventDialog.TableDlg)
> {
> tableDialog.setFocusToItem(ctrlEnum);
> }
> }
>
> public class TextDialog extends Shell
> {
> private Tree tree;
>
> public TextDialog(Display display, final MClass mClass)
> {
> super(display);
> this.getShell().setText("TextDialog");
> RowLayout rowLayout = new RowLayout();
> //rowLayout.pack = true;
> rowLayout.type = SWT.VERTICAL;
> rowLayout.fill = true;
>
> this.setLayout(rowLayout);
>
> for(CtrlEnum ctrlEnum : CtrlEnum.values())
> {
> Text text = new Text(this, SWT.BORDER);
> text.setData(ctrlEnum);
> text.setText(ctrlEnum.toString());
> Point size = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
> text.setLayoutData(new RowData(200, size.y));
>
> // Give every Text-Control a FocusListener
> text.addFocusListener(new FocusListener()
> {
> @Override
> public void focusLost(FocusEvent event)
> {
> Text text = (Text)event.widget;
> System.out.println("focusLost (" +
> text.getData().toString() + ")" + System.currentTimeMillis());
> }
>
> @Override
> public void focusGained(FocusEvent event)
> {
> Text text = (Text)event.widget;
>
> System.out.println("focusGain (" +
> text.getData().toString() + ")" + System.currentTimeMillis());
>
> setFocusToTreeItem((CtrlEnum) text.getData());
>
> mClass.ClickedEventHandler((CtrlEnum)
> text.getData(), EventDialog.TextDlg);
> }
> });
> }
>
> tree = new Tree(this, SWT.SINGLE | SWT.BORDER);
> tree.setSize(100, 100);
>
> for(CtrlEnum ctrlEnum : CtrlEnum.values())
> {
> TreeItem treeItem = new TreeItem(tree, SWT.NONE);
> treeItem.setData(ctrlEnum);
> treeItem.setText(ctrlEnum.toString());
> }
>
> tree.addSelectionListener(new SelectionListener()
> {
>
> @Override
> public void widgetSelected(SelectionEvent e){ }
>
> @Override
> public void widgetDefaultSelected(SelectionEvent e)
> {
> TreeItem[] selItems = tree.getSelection();
> if(selItems.length > 0)
> {
> // we have a Single-Selection
> System.out.println("widgetDefaultSelected");
> CtrlEnum ctrlEnum = (CtrlEnum)
> selItems[0].getData();
> mClass.ClickedEventHandler(ctrlEnum,
> EventDialog.TreeDlg);
> }
> }
> });
> }
>
> private void setFocusToTreeItem(CtrlEnum ctrlEnum)
> {
> for(TreeItem treeItem : tree.getItems())
> {
> CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
>
> if(ctrlEnum == ctrlEnumData)
> {
> treeItem.setText(treeItem.getData().toString() + "
> SELECTED");
> }
> else {
> treeItem.setText(treeItem.getData().toString());
> }
> }
> }
>
> public void setFocusToItem(CtrlEnum ctrlEnum)
> {
> // Search the matching Text-Control
> for(Control control : getChildren())
> {
> if(control instanceof Text)
> {
>
> CtrlEnum ctrlEnumData = (CtrlEnum) control.getData();
> if(ctrlEnum == ctrlEnumData)
> {
> Text text = (Text)control;
> text.selectAll();
> text.setFocus();
> break;
> }
> }
> }
>
> setFocusToTreeItem(ctrlEnum);
> }
> }
>
> public class TreeDialog extends Shell
> {
> private Tree tree;
> public TreeDialog(Display display, final MClass mClass)
> {
> super(display);
> this.getShell().setText("TreeDialog");
> this.setLayout(new FillLayout());
>
> tree = new Tree(this, SWT.SINGLE);
>
> for(CtrlEnum ctrlEnum : CtrlEnum.values())
> {
> TreeItem treeItem = new TreeItem(tree, SWT.NONE);
> treeItem.setData(ctrlEnum);
> treeItem.setText(ctrlEnum.toString());
> }
>
> tree.addSelectionListener(new SelectionListener()
> {
>
> @Override
> public void widgetSelected(SelectionEvent e){ }
>
> @Override
> public void widgetDefaultSelected(SelectionEvent e)
> {
> TreeItem[] selItems = tree.getSelection();
> if(selItems.length > 0)
> {
> // we have a Single-Selection
> System.out.println("widgetDefaultSelected");
> CtrlEnum ctrlEnum = (CtrlEnum)
> selItems[0].getData();
> mClass.ClickedEventHandler(ctrlEnum,
> EventDialog.TreeDlg);
> }
> }
> });
> }
>
> public void setFocusToItem(CtrlEnum ctrlEnum)
> {
> // Search the matching treeItem
> for(TreeItem treeItem : tree.getItems())
> {
> CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
>
> if(ctrlEnum == ctrlEnumData)
> {
> treeItem.setText(treeItem.getData().toString() + "
> SELECTED");
> }
> else {
> treeItem.setText(treeItem.getData().toString());
> }
> }
> }
> }
>
> public class TableDialog extends Shell
> {
> private Table table;
> public TableDialog(Display display, final MClass mClass)
> {
> super(display);
> this.getShell().setText("TableDialog");
> this.setLayout(new FillLayout());
>
> table = new Table(this, SWT.SINGLE);
>
> for(CtrlEnum ctrlEnum : CtrlEnum.values())
> {
> TableItem tableItem = new TableItem(table, SWT.NONE);
> tableItem.setData(ctrlEnum);
> tableItem.setText(ctrlEnum.toString());
> }
>
> table.addSelectionListener(new SelectionListener()
> {
>
> @Override
> public void widgetSelected(SelectionEvent e){ }
>
> @Override
> public void widgetDefaultSelected(SelectionEvent e)
> {
> TableItem[] selItems = table.getSelection();
> if(selItems.length > 0)
> {
> // we have a Single-Selection
> System.out.println("widgetDefaultSelected");
> CtrlEnum ctrlEnum = (CtrlEnum)
> selItems[0].getData();
> mClass.ClickedEventHandler(ctrlEnum,
> EventDialog.TreeDlg);
> }
> }
> });
> }
>
> public void setFocusToItem(CtrlEnum ctrlEnum)
> {
> // Search the matching treeItem
> for(TableItem treeItem : table.getItems())
> {
> CtrlEnum ctrlEnumData = (CtrlEnum) treeItem.getData();
>
> if(ctrlEnum == ctrlEnumData)
> {
> treeItem.setText(treeItem.getData().toString() + "
> SELECTED");
> }
> else {
> treeItem.setText(treeItem.getData().toString());
> }
> }
> }
> }
> }
>
>
Re: [Tree] Focus Problem [message #496242 is a reply to message #495242] Mon, 09 November 2009 13:07 Go to previous message
Steffen Kay is currently offline Steffen KayFriend
Messages: 14
Registered: September 2009
Junior Member
Here the Bugzilla-Entry:
Bug 294592
Previous Topic:[Databinding]Binding multiple TreeViewers in different session to single model
Next Topic:RAP ready for business use?
Goto Forum:
  


Current Time: Thu Apr 25 19:44:59 GMT 2024

Powered by FUDForum. Page generated in 0.04246 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top