blob: 0f85b800c3160a1c44452a67ad8cb3c1f5aedc0f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.dialogs;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.internal.WorkbenchPlugin;
/**
* The FilteredComboTree is a filtered tree that uses an
* editable combo rather than just a text.
*/
public class FilteredComboTree extends FilteredTree {
private Combo filterCombo;
private static final String SEARCHHISTORY = "search"; //$NON-NLS-1$
//Set a number limitation of items to be saved in combo
private static final int maxNumItems = 20;
/**
* Create a new instance of the receiver.
* @param parent
* @param treeStyle
*/
public FilteredComboTree(Composite parent, int treeStyle) {
super(parent, treeStyle);
}
/**
* Create a new instance of the receiver with a supplied filter.
* @param parent
* @param treeStyle
* @param filter
*/
public FilteredComboTree(Composite parent, int treeStyle, PatternItemFilter filter) {
super(parent, treeStyle, filter);
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.dialogs.FilteredTree#createFilterControl(org.eclipse.swt.widgets.Composite)
*/
protected void createFilterControl(Composite parent) {
filterCombo = new Combo(parent, SWT.DROP_DOWN | SWT.BORDER);
filterCombo.setFont(parent.getFont());
getPreferenceSearchHistory();
filterCombo.addTraverseListener( new TraverseListener () {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_RETURN) {
e.doit = false;
if (getViewer().getTree().getItemCount() == 0) {
Display.getCurrent().beep();
setFilterText(""); //$NON-NLS-1$
} else {
getViewer().getTree().setFocus();
}
}
}
});
filterCombo.addFocusListener(new FocusAdapter(){
/* (non-Javadoc)
* @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)
*/
public void focusLost(FocusEvent e) {
String [] textValues = filterCombo.getItems();
String newText = filterCombo.getText();
if((newText.equals(""))||(newText .equals(initialText)))//$NON-NLS-1$
return;
for (int i = 0; i < textValues.length; i++) {
if(textValues[i].equals(newText))
return;
}
if(textValues.length >= maxNumItems)
//Discard the oldest search to get space for new search
filterCombo.remove(maxNumItems-1);
filterCombo.add(newText,0);
}
});
filterCombo.addSelectionListener(new SelectionAdapter(){
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
textChanged();
}
});
filterCombo.addDisposeListener(new DisposeListener() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(DisposeEvent e) {
saveDialogSettings();
}
});
filterCombo.getAccessible().addAccessibleListener(getAccessibleListener());
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterControl()
*/
public Control getFilterControl() {
return filterCombo;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterControlText()
*/
protected String getFilterControlText() {
return filterCombo.getText();
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.dialogs.FilteredTree#setFilterText(java.lang.String)
*/
protected void setFilterText(String string) {
filterCombo.setText(string);
selectAll();
}
protected void selectAll() {
filterCombo.setSelection(new Point(0,filterCombo.getText().length()));
}
/**
* Get the combo box used by the receiver.
* @return Combo
*/
public Combo getFilterCombo() {
return filterCombo;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterText()
*/
protected String getFilterText() {
return filterCombo.getText();
}
/**
* Return a dialog setting section for this dialog
*/
private IDialogSettings getDialogSettings() {
IDialogSettings settings = WorkbenchPlugin.getDefault()
.getDialogSettings();
IDialogSettings thisSettings = settings
.getSection(getClass().getName());
if (thisSettings == null)
thisSettings = settings.addNewSection(getClass().getName());
return thisSettings;
}
/**
* Get the preferences search history for this eclipse's start,
* Note that this history will not be cleared until this eclipse closes
*
*/
public void getPreferenceSearchHistory(){
IDialogSettings settings = getDialogSettings();
String[] search = settings.getArray(SEARCHHISTORY);
if(search == null)
return;
for(int i = 0; i < search.length;i++){
filterCombo.add(search[i]);
}
}
/**
* Saves the search history.
*/
private void saveDialogSettings() {
IDialogSettings settings =getDialogSettings();
//If the settings contains the same key, the previous value will be replaced by new one
settings.put(SEARCHHISTORY,filterCombo.getItems());
}
}