Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 102081 | Differences between
and this patch

Collapse All | Expand All

(-)Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredComboTree.java (-59 / +175 lines)
Lines 10-30 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.ui.internal.dialogs;
11
package org.eclipse.ui.internal.dialogs;
12
12
13
import java.util.ArrayList;
14
import java.util.List;
15
13
import org.eclipse.jface.dialogs.IDialogSettings;
16
import org.eclipse.jface.dialogs.IDialogSettings;
14
import org.eclipse.swt.SWT;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.events.ControlAdapter;
19
import org.eclipse.swt.events.ControlEvent;
15
import org.eclipse.swt.events.DisposeEvent;
20
import org.eclipse.swt.events.DisposeEvent;
16
import org.eclipse.swt.events.DisposeListener;
21
import org.eclipse.swt.events.DisposeListener;
17
import org.eclipse.swt.events.FocusAdapter;
22
import org.eclipse.swt.events.FocusAdapter;
18
import org.eclipse.swt.events.FocusEvent;
23
import org.eclipse.swt.events.FocusEvent;
24
import org.eclipse.swt.events.KeyAdapter;
25
import org.eclipse.swt.events.KeyEvent;
19
import org.eclipse.swt.events.SelectionAdapter;
26
import org.eclipse.swt.events.SelectionAdapter;
20
import org.eclipse.swt.events.SelectionEvent;
27
import org.eclipse.swt.events.SelectionEvent;
21
import org.eclipse.swt.events.TraverseEvent;
28
import org.eclipse.swt.events.TraverseEvent;
22
import org.eclipse.swt.events.TraverseListener;
29
import org.eclipse.swt.events.TraverseListener;
23
import org.eclipse.swt.graphics.Point;
30
import org.eclipse.swt.graphics.Point;
24
import org.eclipse.swt.widgets.Combo;
31
import org.eclipse.swt.graphics.Rectangle;
32
import org.eclipse.swt.layout.GridData;
33
import org.eclipse.swt.layout.GridLayout;
25
import org.eclipse.swt.widgets.Composite;
34
import org.eclipse.swt.widgets.Composite;
26
import org.eclipse.swt.widgets.Control;
27
import org.eclipse.swt.widgets.Display;
35
import org.eclipse.swt.widgets.Display;
36
import org.eclipse.swt.widgets.Event;
37
import org.eclipse.swt.widgets.Listener;
38
import org.eclipse.swt.widgets.Shell;
39
import org.eclipse.swt.widgets.Table;
40
import org.eclipse.swt.widgets.TableItem;
41
import org.eclipse.swt.widgets.Text;
28
import org.eclipse.ui.internal.WorkbenchPlugin;
42
import org.eclipse.ui.internal.WorkbenchPlugin;
29
43
30
/**
44
/**
Lines 32-44 Link Here
32
 * editable combo rather than just a text.
46
 * editable combo rather than just a text.
33
 */
47
 */
34
public class FilteredComboTree extends FilteredTree {
48
public class FilteredComboTree extends FilteredTree {
35
49
    //A list contains all strings in search history
36
	private Combo filterCombo;
50
	private List searchHistory;
37
	
51
	
38
	private static final String SEARCHHISTORY = "search"; //$NON-NLS-1$
52
	private static final String SEARCHHISTORY = "search"; //$NON-NLS-1$
39
53
	
40
	//Set a number limitation of items to be saved in combo
54
	//A table which contains only strings begin with typed strings
41
	private static final int maxNumItems = 20;
55
	private Table table;
42
	/**
56
	/**
43
	 * Create a new instance of the receiver.
57
	 * Create a new instance of the receiver.
44
	 * @param parent
58
	 * @param parent
Lines 61-74 Link Here
61
	/* (non-Javadoc)
75
	/* (non-Javadoc)
62
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#createFilterControl(org.eclipse.swt.widgets.Composite)
76
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#createFilterControl(org.eclipse.swt.widgets.Composite)
63
	 */
77
	 */
64
	protected void createFilterControl(Composite parent) {
78
	protected void createFilterControl(final Composite parent) {
65
		filterCombo = new Combo(parent, SWT.DROP_DOWN | SWT.BORDER);
79
		filterText = new Text(parent, SWT.DROP_DOWN | SWT.BORDER);
66
		filterCombo.setFont(parent.getFont());
80
		filterText.setFont(parent.getFont());
67
		getPreferenceSearchHistory();
81
		searchHistory = getPreferenceSearchHistory();
68
		filterCombo.addTraverseListener( new TraverseListener () {
82
		
83
		final Shell shell = new Shell (parent.getShell(), SWT.NO_TRIM );
84
		shell.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
85
		GridLayout shellGL = new GridLayout();
86
		shellGL.marginHeight = 0;
87
		shellGL.marginWidth = 0;
88
		shell.setLayout(shellGL);
89
		shell.setLayoutData (new GridData((GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL)));
90
		
91
		table = new Table(shell, SWT.SINGLE |SWT.BORDER);  
92
		table.setLayoutData(new GridData((GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL)));
93
		
94
		
95
		filterText.addTraverseListener( new TraverseListener () {
69
			public void keyTraversed(TraverseEvent e) {
96
			public void keyTraversed(TraverseEvent e) {
70
				if (e.detail == SWT.TRAVERSE_RETURN) {
97
				if (e.detail == SWT.TRAVERSE_RETURN) {
71
					e.doit = false;
98
					e.doit = false;
99
					shell.setVisible(false);
72
					if (getViewer().getTree().getItemCount() == 0) {
100
					if (getViewer().getTree().getItemCount() == 0) {
73
						Display.getCurrent().beep();
101
						Display.getCurrent().beep();
74
						setFilterText(""); //$NON-NLS-1$
102
						setFilterText(""); //$NON-NLS-1$
Lines 78-118 Link Here
78
				}
106
				}
79
			}
107
			}
80
		});
108
		});
81
		filterCombo.addFocusListener(new FocusAdapter(){
109
		
110
		filterText.addKeyListener(new KeyAdapter() {
111
112
            /*
113
             * (non-Javadoc)
114
             * 
115
             * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
116
             */
117
            public void keyReleased(KeyEvent e) {
118
                
119
                   if(e.keyCode == SWT.ARROW_DOWN){
120
                	   if(table.isVisible())
121
                		   table.setFocus();	                    		
122
	                   else
123
	                	   treeViewer.getTree().setFocus();
124
                   }
125
                               		    
126
                   else{
127
                	   if(e.character == '\r')
128
                		   return;
129
                   
130
	            	   textChanged();
131
	                   List result = new ArrayList();           		
132
	                   result = reduceSearch(searchHistory,filterText.getText());
133
	                   upDateTable(table,result);
134
	                                        
135
	                   if(table.getItemCount()> 0){
136
	                	   Rectangle textBounds = filterText.getBounds();
137
	                       Point point = getDisplay().map(parent, null, textBounds.x, textBounds.y);
138
	                	   int space = table.getItemHeight();
139
	                       shell.setBounds(point.x, point.y + textBounds.height,textBounds.width, 
140
	                			   table.getItemHeight()*table.getItemCount()+ space);
141
	                       
142
	                	   if(shell.isDisposed())
143
	                		    shell.open ();
144
	                		                	   
145
	                	   if(!shell.getVisible()){	                   		
146
		                   		shell.setVisible(true);
147
		                   		filterText.setFocus();
148
	                	   }
149
	                	   
150
	                   }else
151
	                   		shell.setVisible(false);
152
                   }
153
	            	   	                   			
154
            }
155
		});
156
		
157
				
158
		filterText.addFocusListener(new FocusAdapter(){
82
			/* (non-Javadoc)
159
			/* (non-Javadoc)
83
			 * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)
160
			 * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)
84
			 */
161
			 */
85
			public void focusLost(FocusEvent e) {
162
			public void focusLost(FocusEvent e) {
86
				String [] textValues = filterCombo.getItems();
163
				Object[] textValues = searchHistory.toArray();
87
				String newText = filterCombo.getText();
164
				String newText = filterText.getText();
88
				
165
				
89
				if((newText.equals(""))||(newText .equals(initialText)))//$NON-NLS-1$
166
				if((newText.equals(""))||(newText .equals(initialText)))//$NON-NLS-1$
90
					return;
167
					return;
91
			
168
			
92
				for (int i = 0; i < textValues.length; i++) {
169
				for (int i = 0; i < textValues.length; i++) {
93
					if(textValues[i].equals(newText))
170
					if(((String)textValues[i]).equals(newText))
94
						return;					
171
						return;					
95
				}
172
				}
96
					
173
					
97
				if(textValues.length >= maxNumItems)				
174
				searchHistory.add(newText);
98
					//Discard the oldest search to get space for new search 
175
			}
99
					filterCombo.remove(maxNumItems-1);
176
		});
100
				
177
		
101
				filterCombo.add(newText,0);
178
		parent.getDisplay().addFilter(SWT.MouseDown , new Listener(){
179
180
			public void handleEvent(Event event) {				
181
				if(!shell.isDisposed())
182
					shell.setVisible(false);
183
			}});
184
		
185
		getShell().addControlListener(new ControlAdapter(){
186
			public void controlMoved(ControlEvent e) {
187
								
188
				shell.setVisible(false);
102
			}
189
			}
103
		});
190
		});
104
		filterCombo.addSelectionListener(new SelectionAdapter(){
191
		table.addSelectionListener(new SelectionAdapter(){
105
			/* (non-Javadoc)
192
			/* (non-Javadoc)
106
			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
193
			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
107
			 */
194
			 */
108
			public void widgetSelected(SelectionEvent e) {
195
			public void widgetSelected(SelectionEvent e) {
196
				
197
				setFilterText(table.getSelection()[0].getText());
109
				textChanged();
198
				textChanged();
110
			}
199
			}
200
			
201
			public void widgetDefaultSelected(SelectionEvent e) {
202
				shell.setVisible(false);
203
			}
111
		});
204
		});
205
			
206
		filterText.addDisposeListener(new DisposeListener() {
112
		
207
		
113
		filterCombo.addDisposeListener(new DisposeListener() {
208
			/*
114
		
209
			 (non-Javadoc)
115
			/* (non-Javadoc)
116
			 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
210
			 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
117
			 */
211
			 */
118
			public void widgetDisposed(DisposeEvent e) {
212
			public void widgetDisposed(DisposeEvent e) {
Lines 120-172 Link Here
120
			}
214
			}
121
		});
215
		});
122
		
216
		
123
		filterCombo.getAccessible().addAccessibleListener(getAccessibleListener());
124
		
217
		
125
	}
218
		filterText.getAccessible().addAccessibleListener(getAccessibleListener());
126
219
		
127
	/* (non-Javadoc)
128
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterControl()
129
	 */
130
	public Control getFilterControl() {
131
		return filterCombo;
132
	}
220
	}
133
221
134
	/* (non-Javadoc)
222
	/* (non-Javadoc)
135
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterControlText()
223
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterControlText()
136
	 */
224
	 */
137
	protected String getFilterControlText() {
225
	protected String getFilterControlText() {
138
		return filterCombo.getText();
226
		return filterText.getText();
139
	}
227
	}
140
228
141
	/* (non-Javadoc)
229
	/* (non-Javadoc)
142
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#setFilterText(java.lang.String)
230
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#setFilterText(java.lang.String)
143
	 */
231
	 */
144
	protected void setFilterText(String string) {
232
	protected void setFilterText(String string) {
145
		filterCombo.setText(string);
233
		filterText.setText(string);
146
		selectAll();
147
	}
234
	}
148
	
235
	
149
	protected void selectAll() {
150
		filterCombo.setSelection(new Point(0,filterCombo.getText().length()));
151
	}
152
	
236
	
153
	/**
237
	 /**
154
	 * Get the combo box used by the receiver.
238
	 * Find all items which start with typyed words
155
	 * @return Combo
239
	 *  list the list contains all strings of the search history
240
	 * @param wordsEntered
241
	 * @return a list in which all strings start from the typed letter(s)
156
	 */
242
	 */
157
	public Combo getFilterCombo() {
243
	public List reduceSearch(List list,String wordsEntered){
158
		return filterCombo;
244
	     List result = new ArrayList();
159
	}
245
	     for(int i = 0; i<list.size();i++){
246
	     	if(filterText.getText()== "") //$NON-NLS-1$
247
	     		return result;
248
	     	else if(((String)list.get(i)).startsWith(wordsEntered))
249
	             result.add(list.get(i));
250
	     }
251
	     
252
	     return result;
253
	 }
254
	 
255
	 
256
	 /**Copy all elements from a list to a table
257
	  * @param table
258
	  * @param list
259
	  */
260
	 public void upDateTable(Table table, List list){
261
	     table.removeAll();
262
	     if(list.size()>0){
263
		        TableItem newItem ;
264
		        for(int i=0;i<list.size();i++){
265
		            newItem = new TableItem(table, SWT.NULL, i);
266
		            newItem.setText((String)list.get(i));
267
		            
268
		        }
269
	     }
270
	     
271
	 }
160
	
272
	
161
	/* (non-Javadoc)
162
	 * @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterText()
163
	 */
164
	protected String getFilterText() {
165
		return filterCombo.getText();
166
	}
167
		
168
	/**
273
	/**
169
     * Return a dialog setting section for this dialog
274
     * Return a dialog setting section for this dialog
275
     * @return IDialogSettings
170
     */
276
     */
171
    private IDialogSettings getDialogSettings() {
277
    private IDialogSettings getDialogSettings() {
172
        IDialogSettings settings = WorkbenchPlugin.getDefault()
278
        IDialogSettings settings = WorkbenchPlugin.getDefault()
Lines 182-199 Link Here
182
	/**
288
	/**
183
	 * Get the preferences search history for this eclipse's start, 
289
	 * Get the preferences search history for this eclipse's start, 
184
	 * Note that this history will not be cleared until this eclipse closes
290
	 * Note that this history will not be cleared until this eclipse closes
185
	 * 
291
	 * @return a list
186
	 */
292
	 */
187
	public void getPreferenceSearchHistory(){		
293
	public List getPreferenceSearchHistory(){		
188
		IDialogSettings settings = getDialogSettings();
294
		IDialogSettings settings = getDialogSettings();
189
		String[] search = settings.getArray(SEARCHHISTORY); //$NON-NLS-1$
295
		String[] search = settings.getArray(SEARCHHISTORY); //$NON-NLS-1$
190
		
296
		
191
		if(search == null)
297
		if(search == null)
192
			return;
298
			return null;
193
		
299
		
194
		for(int i = 0; i < search.length;i++){
300
		List searchList = new ArrayList();
195
			filterCombo.add(search[i]);
301
		for(int i = 0; i < search.length;i++)
196
		}
302
			searchList.add(search[i]);
303
		return searchList;
197
				
304
				
198
	}
305
	}
199
	
306
	
Lines 204-210 Link Here
204
    	IDialogSettings settings =getDialogSettings();
311
    	IDialogSettings settings =getDialogSettings();
205
    	
312
    	
206
    	//If the settings contains the same key, the previous value will be replaced by new one
313
    	//If the settings contains the same key, the previous value will be replaced by new one
207
    	settings.put(SEARCHHISTORY,filterCombo.getItems());
314
    	String []result = new String[searchHistory.size()];
315
    	listToArray(searchHistory,result);
316
    	settings.put(SEARCHHISTORY, result);
208
               
317
               
209
    }
318
    }
319
    
320
    private void listToArray(List list,String[] string){
321
    	int size = list.size();
322
    	for(int i=0;i<size;i++)
323
    		string[i]=(String)list.get(i);
324
    }
325
    
210
}
326
}
(-)Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java (-3 / +2 lines)
Lines 34-40 Link Here
34
import org.eclipse.jface.viewers.TreeViewer;
34
import org.eclipse.jface.viewers.TreeViewer;
35
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.SWT;
36
import org.eclipse.swt.graphics.Font;
36
import org.eclipse.swt.graphics.Font;
37
import org.eclipse.swt.graphics.Point;
38
import org.eclipse.swt.layout.GridData;
37
import org.eclipse.swt.layout.GridData;
39
import org.eclipse.swt.layout.GridLayout;
38
import org.eclipse.swt.layout.GridLayout;
40
import org.eclipse.swt.widgets.Composite;
39
import org.eclipse.swt.widgets.Composite;
Lines 123-130 Link Here
123
		
122
		
124
		//if the tree has only one or zero pages, make the combo area disable
123
		//if the tree has only one or zero pages, make the combo area disable
125
		if(hasAtMostOnePage(tree)){
124
		if(hasAtMostOnePage(tree)){
126
			filteredTree.getFilterCombo().setEnabled(false);
125
			filteredTree.getFilterControl().setEnabled(false);
127
			filteredTree.getFilterCombo().setSelection(new Point(0,0));
126
			//filteredTree.getFilterControl().setSelection(new Point(0,0));
128
		}
127
		}
129
		
128
		
130
		
129
		
(-)Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredTree.java (-25 / +4 lines)
Lines 28-39 Link Here
28
import org.eclipse.swt.events.DisposeListener;
28
import org.eclipse.swt.events.DisposeListener;
29
import org.eclipse.swt.events.FocusEvent;
29
import org.eclipse.swt.events.FocusEvent;
30
import org.eclipse.swt.events.FocusListener;
30
import org.eclipse.swt.events.FocusListener;
31
import org.eclipse.swt.events.KeyAdapter;
32
import org.eclipse.swt.events.KeyEvent;
33
import org.eclipse.swt.graphics.Color;
31
import org.eclipse.swt.graphics.Color;
34
import org.eclipse.swt.layout.GridData;
32
import org.eclipse.swt.layout.GridData;
35
import org.eclipse.swt.layout.GridLayout;
33
import org.eclipse.swt.layout.GridLayout;
36
import org.eclipse.swt.widgets.Combo;
37
import org.eclipse.swt.widgets.Composite;
34
import org.eclipse.swt.widgets.Composite;
38
import org.eclipse.swt.widgets.Control;
35
import org.eclipse.swt.widgets.Control;
39
import org.eclipse.swt.widgets.Text;
36
import org.eclipse.swt.widgets.Text;
Lines 52-62 Link Here
52
 */
49
 */
53
public class FilteredTree extends Composite {
50
public class FilteredTree extends Composite {
54
51
55
    private Text filterText;
52
    protected Text filterText;
56
53
    
57
    private ToolBarManager filterToolBar;
54
    private ToolBarManager filterToolBar;
58
55
59
    private TreeViewer treeViewer;
56
    protected TreeViewer treeViewer;
60
57
61
    private Composite filterParent;
58
    private Composite filterParent;
62
59
Lines 133-157 Link Here
133
                | GridData.GRAB_HORIZONTAL));
130
                | GridData.GRAB_HORIZONTAL));
134
131
135
        createFilterControl(filterParent);
132
        createFilterControl(filterParent);
136
	        getFilterControl().addKeyListener(new KeyAdapter() {
133
	       
137
	
138
	            /*
139
	             * (non-Javadoc)
140
	             * 
141
	             * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
142
	             */
143
	            public void keyReleased(KeyEvent e) {
144
	            	// on a CR we want to transfer focus to the list
145
	            	if(e.keyCode == SWT.ARROW_DOWN){
146
147
	                    if (!(getFilterControl() instanceof Combo)) {
148
	                    	treeViewer.getTree().setFocus();
149
	                    }
150
	            	} else
151
	            		textChanged();
152
	            }
153
	        });
154
155
        GridData data = new GridData(GridData.FILL_HORIZONTAL
134
        GridData data = new GridData(GridData.FILL_HORIZONTAL
156
                | GridData.GRAB_HORIZONTAL);
135
                | GridData.GRAB_HORIZONTAL);
157
        getFilterControl().setLayoutData(data);
136
        getFilterControl().setLayoutData(data);

Return to bug 102081