1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
/*******************************************************************************
* Copyright (c) 2009, 2010 Hiroyuki Inaba and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hiroyuki Inaba - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.provisional.commons.ui;
import java.lang.reflect.Field;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TypedListener;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
/**
* A {@link FilteredTree} that uses the new look on Eclipse 3.5 and later.
*
* @author Hiroyuki Inaba
* @deprecated use {@link org.eclipse.mylyn.commons.ui.workbench.EnhancedFilteredTree} instead
*/
// TODO e3.5 remove this class and replace with FilteredTree
@Deprecated
public class EnhancedFilteredTree extends FilteredTree {
protected boolean useNewLook;
private TextSearchControl searchControl;
public EnhancedFilteredTree(Composite parent, int treeStyle, PatternFilter filter, boolean useNewLook) {
super(parent, treeStyle, filter);
}
public EnhancedFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
super(parent, treeStyle, filter);
}
public EnhancedFilteredTree(Composite parent) {
super(parent);
}
@Override
protected void createControl(Composite parent, int treeStyle) {
super.createControl(parent, treeStyle);
// set this after so that there isn't a double border created around the search
useNewLook = setNewLook(this);
}
@Override
protected Composite createFilterControls(Composite parent) {
createFilterText(parent);
return parent;
}
public static boolean setNewLook(FilteredTree tree) {
try {
Field newStyleField = FilteredTree.class.getDeclaredField("useNewLook"); //$NON-NLS-1$
newStyleField.setAccessible(true);
newStyleField.setBoolean(tree, true);
return newStyleField.getBoolean(tree);
} catch (Exception e) {
// ignore
}
return false;
}
@Override
protected void createFilterText(Composite parent) {
super.createFilterText(parent);
// This code is here to make it so that the key listener for the down arrow listens to the KeyEvent.doit
// flag so that the history popup dialog can be keyboard accessible and the down arrow works to select items
// from the history
if (searchControl != null && searchControl.hasHistorySupport()) {
Text textControl = searchControl.getTextControl();
KeyListener downArrowListener = null;
Listener[] listeners = textControl.getListeners(SWT.KeyDown);
if (listeners != null && listeners.length > 0) {
for (Listener listener : listeners) {
if (listener instanceof TypedListener
&& ((TypedListener) listener).getEventListener()
.getClass()
.getName()
.startsWith("org.eclipse.ui.dialogs.FilteredTree$") //$NON-NLS-1$
&& ((TypedListener) listener).getEventListener() instanceof KeyListener) {
downArrowListener = (KeyListener) ((TypedListener) listener).getEventListener();
break;
}
}
}
if (downArrowListener != null) {
final KeyListener oldKeyListener = downArrowListener;
textControl.removeKeyListener(downArrowListener);
textControl.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.doit) {
oldKeyListener.keyPressed(e);
}
}
@Override
public void keyReleased(KeyEvent e) {
if (e.doit) {
oldKeyListener.keyReleased(e);
}
}
});
}
}
}
@Override
protected Text doCreateFilterText(Composite parent) {
searchControl = new TextSearchControl(parent, true, getHistoryPopupDialog());
searchControl.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
if (e.detail == TextSearchControl.ICON_CANCEL) {
clearText();
}
if (e.detail == TextSearchControl.ICON_SEARCH) {
textChanged();
}
}
});
searchControl.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
return searchControl.getTextControl();
}
public TextSearchControl getTextSearchControl() {
return searchControl;
}
protected SearchHistoryPopUpDialog getHistoryPopupDialog() {
return new SearchHistoryPopUpDialog(getShell(), SWT.TOP);
}
}
|