/******************************************************************************* * Copyright (C) 2003-2005, 2013, Guillaume Brocker * * 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: * Guillaume Brocker - Initial API and implementation * ******************************************************************************/ package eclox.ui.editor.advanced.filters; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.IManagedForm; import eclox.core.doxyfiles.Doxyfile; import eclox.core.doxyfiles.Setting; import eclox.ui.Images; import eclox.ui.Plugin; public class Custom implements IFilter { /** * the combo box containing the text used for the setting filtering */ private Combo combo; /** * the clear button */ private Button clearButton; /** * an array of strings containing the saved combo items */ private String[] savedComboItems = null; /** * a string containing the saved combo text */ private String savedComboText = new String(); /** * a string containing the text to use for filtering */ private String filterText; /** * the viewer being filtered */ private StructuredViewer viewer; /** * the viewer filter currently installed in the viewer to filter */ private MyViewerFiler viewerFilter; /** * Implements a timer task that will trigger the viewer refresh after * the user changed the custom filter text and update the items available * in the filter combo control. */ private class MyRunnable implements Runnable { private String referenceText; public MyRunnable( String referenceText ) { this.referenceText = new String( referenceText ); } public void run() { // Pre-condition assert combo != null; assert viewer != null; // Retrieves the combo text and checks that the user has not entered additionnal text. String comboText = combo.getText(); if( comboText.equalsIgnoreCase(referenceText) == false ) { return; } if( comboText.length() == 0 ) { combo.select( -1 ); } else { // Scans combo text items for the combo text. String comboItems[] = combo.getItems(); boolean found = false; for( int i = 0; i < comboItems.length; ++i ) { if( comboItems[i].equalsIgnoreCase(comboText) == true ) { found = true; break; } } if( found == false ) { combo.add( comboText, 0 ); } } // Refreshes the combo so the elements will be refiltered. viewer.refresh(); } }; /** * Implements a viewer filter that will search for setting matching the * string entered by the user in the combo control. */ private class MyViewerFiler extends ViewerFilter { /** * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public boolean select(Viewer viewer, Object parentElement, Object element) { // Pre-condition assert element instanceof Setting; // Tests if the current setting matches the query string. if( filterText != null ) { Setting setting = (Setting) element; final String settingText = setting.getProperty(Setting.TEXT); return ( settingText != null ) && ( settingText.toLowerCase().indexOf(filterText.toLowerCase()) != -1 ); } else { return true; } } }; /** * Implements a combo modification listener that will trigger * the viewer refresh. */ private class MyComboModifyListener implements ModifyListener { public void modifyText(ModifyEvent e) { // Pre-condition assert combo != null; filterText = new String( combo.getText() ); combo.getDisplay().timerExec( 450, new MyRunnable(filterText) ); } }; /** * Implements a selection listsner for the managed clear button. */ private class MyClearSelectionListener implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { // Pre-condition assert combo != null; // Clears the managed combo text. combo.select( -1 ); combo.setText( new String() ); } public void widgetSelected(SelectionEvent e) { // Pre-condition assert combo != null; // Clears the managed combo text. combo.select( -1 ); combo.setText( new String() ); } } /** * @see eclox.ui.editor.advanced.filters.IFilter#createControls(org.eclipse.ui.forms.IManagedForm, org.eclipse.swt.widgets.Composite) */ public void createControls(IManagedForm managedForm, Composite parent) { // Pre-condition assert combo == null; assert clearButton == null; // Creates the combo control allowing the user to enter text to search. combo = new Combo( parent, SWT.FLAT|SWT.BORDER ); // Fills the combo with the eventual saved items. if( this.savedComboItems != null ) { combo.setItems( this.savedComboItems ); } else { combo.setText("type filter text"); } // Restores the saved combo selected item. combo.setText( this.savedComboText ); combo.setSelection( new Point(0,combo.getText().length()) ); // Attaches a modify listener. combo.addModifyListener( new MyComboModifyListener() ); // Creates the clear button. clearButton = managedForm.getToolkit().createButton( parent, null, SWT.FLAT ); clearButton.setImage( Plugin.getImageDescriptor( Images.ERASE ).createImage() ); clearButton.addSelectionListener( new MyClearSelectionListener() ); // Installs the layout into the parent, and layout data on controls GridLayout layout = new GridLayout( 2, false ); layout.marginTop = 0; layout.marginRight = 0; layout.marginBottom = 0; layout.marginLeft = 0; layout.marginWidth = 0; layout.marginHeight = 0; parent.setLayout( layout ); combo.setLayoutData( new GridData(GridData.FILL_BOTH|GridData.GRAB_HORIZONTAL) ); // Post-condition assert combo != null; assert clearButton != null; } /** * @see eclox.ui.editor.advanced.filters.IFilter#createViewerFilters(org.eclipse.jface.viewers.StructuredViewer) */ public void createViewerFilters(StructuredViewer viewer) { // Pre-condition assert viewer == null; assert viewerFilter == null; // Installes the viewer filter. this.viewer = viewer; this.viewerFilter = new MyViewerFiler(); this.viewer.addFilter( this.viewerFilter ); // Post-condition assert this.viewer != null; assert this.viewerFilter != null; } /** * @see eclox.ui.editor.advanced.filters.IFilter#disposeControls() */ public void disposeControls() { // Pre-condition assert combo != null; assert clearButton != null; // Saves some state of the managed combo widget. this.savedComboItems = combo.getItems(); this.savedComboText = combo.getText(); // Disposes all managed widgets. combo.dispose(); clearButton.dispose(); combo = null; clearButton = null; // Post-condition assert combo == null; assert clearButton == null; } /** * @see eclox.ui.editor.advanced.filters.IFilter#disposeViewerFilers(org.eclipse.jface.viewers.StructuredViewer) */ public void disposeViewerFilers(StructuredViewer viewer) { // Pre-condition assert this.viewer != null; assert viewerFilter != null; // Uninstalles the viewer filter. viewer.removeFilter( this.viewerFilter ); this.viewerFilter = null; this.viewer = null; // Post-condition assert this.viewer == null; assert this.viewerFilter == null; } /** * @see eclox.ui.editor.advanced.filters.IFilter#getName() */ public String getName() { return "Custom"; } /** * @see eclox.ui.editor.advanced.filters.IFilter#setDoxyfile(eclox.doxyfiles.Doxyfile) */ public void setDoxyfile(Doxyfile doxyfile) { // Nothing to do. } }