]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/symbollibrary/ui/FilterArea.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / symbollibrary / ui / FilterArea.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.symbollibrary.ui;\r
13 \r
14 import org.eclipse.jface.layout.GridDataFactory;\r
15 import org.eclipse.jface.layout.GridLayoutFactory;\r
16 import org.eclipse.jface.resource.FontDescriptor;\r
17 import org.eclipse.jface.resource.ImageDescriptor;\r
18 import org.eclipse.jface.resource.JFaceResources;\r
19 import org.eclipse.jface.resource.LocalResourceManager;\r
20 import org.eclipse.swt.SWT;\r
21 import org.eclipse.swt.accessibility.ACC;\r
22 import org.eclipse.swt.accessibility.AccessibleAdapter;\r
23 import org.eclipse.swt.accessibility.AccessibleControlAdapter;\r
24 import org.eclipse.swt.accessibility.AccessibleControlEvent;\r
25 import org.eclipse.swt.accessibility.AccessibleEvent;\r
26 import org.eclipse.swt.events.MouseAdapter;\r
27 import org.eclipse.swt.events.MouseEvent;\r
28 import org.eclipse.swt.events.MouseMoveListener;\r
29 import org.eclipse.swt.events.MouseTrackListener;\r
30 import org.eclipse.swt.events.SelectionAdapter;\r
31 import org.eclipse.swt.events.SelectionEvent;\r
32 import org.eclipse.swt.graphics.Image;\r
33 import org.eclipse.swt.graphics.Point;\r
34 import org.eclipse.swt.layout.GridData;\r
35 import org.eclipse.swt.widgets.Composite;\r
36 import org.eclipse.swt.widgets.Control;\r
37 import org.eclipse.swt.widgets.Display;\r
38 import org.eclipse.swt.widgets.Label;\r
39 import org.eclipse.swt.widgets.Text;\r
40 import org.eclipse.ui.ISharedImages;\r
41 import org.eclipse.ui.internal.WorkbenchImages;\r
42 import org.eclipse.ui.internal.WorkbenchMessages;\r
43 \r
44 @SuppressWarnings("restriction")\r
45 public class FilterArea extends Composite {\r
46 \r
47     private final LocalResourceManager resourceManager;\r
48 \r
49     private Text                       filterText;\r
50 \r
51     /**\r
52      * The control representing the clear button for the filter text entry. This\r
53      * value may be <code>null</code> if no such button exists, or if the\r
54      * controls have not yet been created.\r
55      */\r
56     protected Control                  clearButtonControl;\r
57 \r
58     /**\r
59      * Construct the filter area UI component.\r
60      * \r
61      * @param explorer\r
62      * @param queryProcessor\r
63      * @param parent\r
64      * @param style\r
65      */\r
66     public FilterArea(final Composite parent, int style) {\r
67         super(parent, style | SWT.BORDER);\r
68 \r
69         resourceManager = new LocalResourceManager(JFaceResources.getResources(parent.getDisplay()), this);\r
70 \r
71 //        GridDataFactory.fillDefaults().grab(true, false).applyTo(this);\r
72 //        GridLayoutFactory.fillDefaults().applyTo(this);\r
73 //\r
74 //        filterText = new Text(this, SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL);\r
75 //        filterText.setFont(resourceManager.createFont(FontDescriptor.createFrom(filterText.getFont()).increaseHeight(-1)));\r
76 //        filterText.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.BEGINNING).create());\r
77 \r
78         GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(this);\r
79         GridLayoutFactory.fillDefaults().margins(0, 0).spacing(0, 0).numColumns(2).equalWidth(false).applyTo(this);\r
80 \r
81         createFilterText(this);\r
82         createFilterCancelIcon(this);\r
83 \r
84         this.setBackground(filterText.getBackground());\r
85     }\r
86 \r
87     private void createFilterText(FilterArea filterArea) {\r
88         //filterText = new Text(this, SWT.SINGLE | SWT.FLAT | SWT.SEARCH | SWT.ICON_CANCEL);\r
89         filterText = new Text(this, SWT.SINGLE | SWT.ICON_CANCEL);\r
90         GridDataFactory.fillDefaults().grab(true, false).applyTo(filterText);\r
91 \r
92         filterText.setFont(resourceManager.createFont(FontDescriptor.createFrom(filterText.getFont()).increaseHeight(-1)));\r
93 \r
94         // if we're using a field with built in cancel we need to listen for\r
95         // default selection changes (which tell us the cancel button has been\r
96         // pressed)\r
97         if ((filterText.getStyle() & SWT.ICON_CANCEL) != 0) {\r
98             filterText.addSelectionListener(new SelectionAdapter() {\r
99                 @Override\r
100                 public void widgetDefaultSelected(SelectionEvent e) {\r
101                     if (e.detail == SWT.ICON_CANCEL)\r
102                         clearText();\r
103                 }\r
104             });\r
105         }\r
106 \r
107         GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true);\r
108 \r
109         // if the text widget supported cancel then it will have it's own\r
110         // integrated button. We can take all of the space.\r
111         if ((filterText.getStyle() & SWT.ICON_CANCEL) != 0)\r
112             gridData.horizontalSpan = 2;\r
113         filterText.setLayoutData(gridData);\r
114     }\r
115 \r
116     private void createFilterCancelIcon(Composite parent) {\r
117         // only create the button if the text widget doesn't support one\r
118         // natively\r
119         if ((filterText.getStyle() & SWT.ICON_CANCEL) == 0) {\r
120             final Image inactiveImage = WorkbenchImages.getImage(ISharedImages.IMG_ETOOL_CLEAR_DISABLED);\r
121             final Image activeImage = WorkbenchImages.getImage(ISharedImages.IMG_ETOOL_CLEAR);\r
122             final Image pressedImage = (Image) resourceManager.get( ImageDescriptor.createWithFlags( ImageDescriptor.createFromImage( activeImage ), SWT.IMAGE_GRAY ) );\r
123 \r
124             final Label clearButton= new Label(parent, SWT.NONE);\r
125             clearButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));\r
126             clearButton.setImage(inactiveImage);\r
127             clearButton.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));\r
128             clearButton.setToolTipText(WorkbenchMessages.FilteredTree_ClearToolTip);\r
129             clearButton.addMouseListener(new MouseAdapter() {\r
130                 private MouseMoveListener fMoveListener;\r
131 \r
132                 @Override\r
133                 public void mouseDown(MouseEvent e) {\r
134                     clearButton.setImage(pressedImage);\r
135                     fMoveListener= new MouseMoveListener() {\r
136                         private boolean fMouseInButton= true;\r
137 \r
138                         public void mouseMove(MouseEvent e) {\r
139                             boolean mouseInButton= isMouseInButton(e);\r
140                             if (mouseInButton != fMouseInButton) {\r
141                                 fMouseInButton= mouseInButton;\r
142                                 clearButton.setImage(mouseInButton ? pressedImage : inactiveImage);\r
143                             }\r
144                         }\r
145                     };\r
146                     clearButton.addMouseMoveListener(fMoveListener);\r
147                 }\r
148 \r
149                 @Override\r
150                 public void mouseUp(MouseEvent e) {\r
151                     if (fMoveListener != null) {\r
152                         clearButton.removeMouseMoveListener(fMoveListener);\r
153                         fMoveListener= null;\r
154                         boolean mouseInButton= isMouseInButton(e);\r
155                         clearButton.setImage(mouseInButton ? activeImage : inactiveImage);\r
156                         if (mouseInButton) {\r
157                             clearText();\r
158                             filterText.setFocus();\r
159                         }\r
160                     }\r
161                 }\r
162 \r
163                 private boolean isMouseInButton(MouseEvent e) {\r
164                     Point buttonSize = clearButton.getSize();\r
165                     return 0 <= e.x && e.x < buttonSize.x && 0 <= e.y && e.y < buttonSize.y;\r
166                 }\r
167             });\r
168             clearButton.addMouseTrackListener(new MouseTrackListener() {\r
169                 public void mouseEnter(MouseEvent e) {\r
170                     clearButton.setImage(activeImage);\r
171                 }\r
172 \r
173                 public void mouseExit(MouseEvent e) {\r
174                     clearButton.setImage(inactiveImage);\r
175                 }\r
176 \r
177                 public void mouseHover(MouseEvent e) {\r
178                 }\r
179             });\r
180             clearButton.getAccessible().addAccessibleListener(\r
181                     new AccessibleAdapter() {\r
182                         @Override\r
183                         public void getName(AccessibleEvent e) {\r
184                             e.result= WorkbenchMessages.FilteredTree_AccessibleListenerClearButton;\r
185                         }\r
186                     });\r
187             clearButton.getAccessible().addAccessibleControlListener(\r
188                     new AccessibleControlAdapter() {\r
189                         @Override\r
190                         public void getRole(AccessibleControlEvent e) {\r
191                             e.detail= ACC.ROLE_PUSHBUTTON;\r
192                         }\r
193                     });\r
194             this.clearButtonControl = clearButton;\r
195         }\r
196     }\r
197 \r
198     /**\r
199      * Clears the text in the filter text widget.\r
200      */\r
201     protected void clearText() {\r
202         filterText.setText(""); //$NON-NLS-1$\r
203         //textChanged();\r
204     }\r
205 \r
206     public Text getText() {\r
207         return filterText;\r
208     }\r
209 \r
210     public void focus() {\r
211         if (filterText.isDisposed())\r
212             return;\r
213         Display d = filterText.getDisplay();\r
214         if (d.getThread() == Thread.currentThread()) {\r
215             doSetFocus();\r
216         } else {\r
217             d.asyncExec(new Runnable() {\r
218                 @Override\r
219                 public void run() {\r
220                     if (filterText.isDisposed())\r
221                         return;\r
222                     doSetFocus();\r
223                 }\r
224             });\r
225         }\r
226     }\r
227 \r
228     protected void doSetFocus() {\r
229         filterText.selectAll();\r
230         filterText.setFocus();\r
231     }\r
232 \r
233 }\r