/* This file is part of Green. * * Copyright (C) 2005 The Research Foundation of State University of New York * All Rights Under Copyright Reserved, The Research Foundation of S.U.N.Y. * * Green is free software, licensed under the terms of the Eclipse * Public License, version 1.0. The license is available at * http://www.eclipse.org/legal/epl-v10.html */ package edu.buffalo.cse.green.dialogs; import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_FILTERS_MEMBER; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import edu.buffalo.cse.green.PlugIn; import edu.buffalo.cse.green.editor.DiagramEditor; import edu.buffalo.cse.green.editor.model.filters.MemberFilter; /** * Provides the user with the ability to create and enable/disable filters used * in Green. Filters can be used to remove members with different visibilities * and support pattern matching in the members' names. * * @author bcmartin * @author <a href="mailto:zgwang@sourceforge.net">Gene Wang</a> * */ public class ManageFiltersDialog extends Dialog implements OKCancelListener { private Composite _buttonComposite; Table _filterTable; Button _addFilterButton; Button _editFilterButton; Button _removeFiltersButton; public ManageFiltersDialog(Shell shell) { super(shell); create(); getShell().setText("Manage Filters"); getShell().setSize(450, 300); } /** * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite) */ protected Control createContents(Composite parent) { parent.setLayout(new GridLayout(1, false)); Composite setFiltersComposite = new Composite(parent, 0); setFiltersComposite.setLayout(new GridLayout(3, true)); _filterTable = new Table(parent, SWT.MULTI | SWT.CHECK | SWT.BORDER); _filterTable.setLayout(new GridLayout(1, false)); _filterTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); _filterTable.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { //Do nothing } public void widgetSelected(SelectionEvent e) { if(_filterTable.getSelection().length == 1) { _editFilterButton.setEnabled(true); } else { _editFilterButton.setEnabled(false); } if(_filterTable.getSelection().length == 0) { _removeFiltersButton.setEnabled(false); } else { _removeFiltersButton.setEnabled(true); } tableChanged(); } }); _filterTable.addMouseListener(new MouseListener() { public void mouseDoubleClick(MouseEvent e) { editSelectedFilter(); } public void mouseDown(MouseEvent e) { //Do nothing } public void mouseUp(MouseEvent e) { //Do nothing } }); _buttonComposite = new OKCancelComposite(this, parent, true); _buttonComposite.setLayout(new GridLayout(3, true)); _buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); ((OKCancelComposite) _buttonComposite).setApplyEnabled(false); _addFilterButton = new Button(setFiltersComposite, 0); _addFilterButton.setText("Add Filter"); _addFilterButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); _addFilterButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { addNewFilter(); } public void widgetDefaultSelected(SelectionEvent e) { //Do nothing } }); _editFilterButton = new Button(setFiltersComposite, 0); _editFilterButton.setText("Edit Filter"); _editFilterButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); _editFilterButton.setEnabled(false); _editFilterButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { //Do nothing } public void widgetSelected(SelectionEvent e) { editSelectedFilter(); } }); _removeFiltersButton = new Button(setFiltersComposite, 0); _removeFiltersButton.setText("Remove Highlighted Filters"); _removeFiltersButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); _removeFiltersButton.setEnabled(false); _removeFiltersButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { removeFilters(); _removeFiltersButton.setEnabled(false); _editFilterButton.setEnabled(false); } public void widgetDefaultSelected(SelectionEvent e) { //Do nothing } }); for (MemberFilter filter : PlugIn.getMemberFilters()) { addFilter(filter); } return parent; } void addNewFilter() { //Assumes this is only called when filter table has a selection EditFiltersDialog d = new EditFiltersDialog(getShell(), null); d.setBlockOnOpen(true); if (d.open() == OK) { addFilter(d.getFilter()); } } void editSelectedFilter() { //Assumes this is only called when filter table has a SINGLE selection int selectionIndex = _filterTable.getSelectionIndex(); MemberFilter filter = (MemberFilter) _filterTable.getSelection()[0].getData(); EditFiltersDialog d = new EditFiltersDialog(getShell(), filter); d.setBlockOnOpen(true); if (d.open() == OK) { TableItem tableItem = _filterTable.getItem(selectionIndex); MemberFilter newFilter = d.getFilter(); tableItem.setText(newFilter.getDescription()); tableItem.setData(newFilter); tableItem.setChecked(newFilter.isEnabled()); tableChanged(); } } void tableChanged() { ((OKCancelComposite) _buttonComposite).setApplyEnabled(true); } /** * Removes the selected filters from the filter list */ void removeFilters() { _filterTable.remove(_filterTable.getSelectionIndices()); tableChanged(); } /** * Adds the given filter to the list of filters and resets the dialog's * settings to the defaults. * * @param filter - The given <code>MemberFilter</code>. */ void addFilter(MemberFilter filter) { TableItem tableItem = new TableItem(_filterTable, 0); tableItem.setText(filter.getDescription()); tableItem.setData(filter); tableItem.setChecked(filter.isEnabled()); tableChanged(); } /** * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ public void okPressed() { applyPressed(); close(); } /** * @see org.eclipse.jface.dialogs.Dialog#cancelPressed() */ public void cancelPressed() { super.cancelPressed(); } /** * @see edu.buffalo.cse.green.dialogs.OKCancelListener#applyPressed() */ public void applyPressed() { StringBuffer buffer = new StringBuffer(); if (_filterTable.getItems().length > 0) { for (TableItem item : _filterTable.getItems()) { MemberFilter filter = (MemberFilter) item.getData(); if (item.getChecked() != filter.isEnabled()) { int val = filter.getEnabledValue(); if (item.getChecked()) { filter.setEnabled(val + 2); } else { filter.setEnabled(val - 2); } } buffer.append("|"); buffer.append(filter); } } else { buffer.append("|"); } PlugIn.getDefault().getPreferenceStore().putValue(P_FILTERS_MEMBER, buffer.toString().substring(1)); // refresh the editor for (DiagramEditor editor : DiagramEditor.getEditors()) { editor.refresh(); } ((OKCancelComposite) _buttonComposite).setApplyEnabled(false); } }