Skip to main content
summaryrefslogtreecommitdiffstats
blob: a39595a9d2c9e47068e0c2615631919adb05954c (plain) (blame)
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);
	}
}

Back to the top