X-Git-Url: http://secure.phpeclipse.com
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/filters/CustomFiltersDialog.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/filters/CustomFiltersDialog.java
new file mode 100644
index 0000000..0d30cf1
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/filters/CustomFiltersDialog.java
@@ -0,0 +1,444 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.ui.filters;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Stack;
+import java.util.StringTokenizer;
+
+import net.sourceforge.phpdt.internal.ui.IJavaHelpContextIds;
+import net.sourceforge.phpdt.internal.ui.util.SWTUtil;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+//incastrix
+//import org.eclipse.jface.text.Assert;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+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.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+public class CustomFiltersDialog extends SelectionDialog {
+
+ private static final String SEPARATOR = ","; //$NON-NLS-1$
+
+ private String fViewId;
+
+ private boolean fEnablePatterns;
+
+ private String[] fPatterns;
+
+ private String[] fEnabledFilterIds;
+
+ private FilterDescriptor[] fBuiltInFilters;
+
+ private CheckboxTableViewer fCheckBoxList;
+
+ private Button fEnableUserDefinedPatterns;
+
+ private Text fUserDefinedPatterns;
+
+ private Stack fFilterDescriptorChangeHistory;
+
+ /**
+ * Creates a dialog to customize Java element filters.
+ *
+ * @param shell
+ * the parent shell
+ * @param viewId
+ * the id of the view
+ * @param enablePatterns
+ * true
if pattern filters are enabled
+ * @param patterns
+ * the filter patterns
+ * @param enabledFilterIds
+ * the Ids of the enabled filters
+ */
+ public CustomFiltersDialog(Shell shell, String viewId,
+ boolean enablePatterns, String[] patterns, String[] enabledFilterIds) {
+
+ super(shell);
+ Assert.isNotNull(viewId);
+ Assert.isNotNull(patterns);
+ Assert.isNotNull(enabledFilterIds);
+
+ fViewId = viewId;
+ fPatterns = patterns;
+ fEnablePatterns = enablePatterns;
+ fEnabledFilterIds = enabledFilterIds;
+
+ fBuiltInFilters = FilterDescriptor.getFilterDescriptors(fViewId);
+ fFilterDescriptorChangeHistory = new Stack();
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ }
+
+ protected void configureShell(Shell shell) {
+ setTitle(FilterMessages.getString("CustomFiltersDialog.title")); //$NON-NLS-1$
+ setMessage(FilterMessages
+ .getString("CustomFiltersDialog.filterList.label")); //$NON-NLS-1$
+ super.configureShell(shell);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
+ IJavaHelpContextIds.CUSTOM_FILTERS_DIALOG);
+ }
+
+ /**
+ * Overrides method in Dialog
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite)
+ */
+ protected Control createDialogArea(Composite parent) {
+ initializeDialogUnits(parent);
+ // create a composite with standard margins and spacing
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ composite.setFont(parent.getFont());
+ Composite group = composite;
+
+ // Checkbox
+ fEnableUserDefinedPatterns = new Button(group, SWT.CHECK);
+ fEnableUserDefinedPatterns.setFocus();
+ fEnableUserDefinedPatterns.setText(FilterMessages
+ .getString("CustomFiltersDialog.enableUserDefinedPattern")); //$NON-NLS-1$
+
+ // Pattern field
+ fUserDefinedPatterns = new Text(group, SWT.SINGLE | SWT.BORDER);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
+ | GridData.GRAB_HORIZONTAL);
+ data.widthHint = convertWidthInCharsToPixels(59);
+ fUserDefinedPatterns.setLayoutData(data);
+ String patterns = convertToString(fPatterns, SEPARATOR);
+ fUserDefinedPatterns.setText(patterns);
+
+ // Info text
+ final Label info = new Label(group, SWT.LEFT);
+ info.setText(FilterMessages
+ .getString("CustomFiltersDialog.patternInfo")); //$NON-NLS-1$
+
+ // Enabling / disabling of pattern group
+ fEnableUserDefinedPatterns.setSelection(fEnablePatterns);
+ fUserDefinedPatterns.setEnabled(fEnablePatterns);
+ info.setEnabled(fEnablePatterns);
+ fEnableUserDefinedPatterns.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ boolean state = fEnableUserDefinedPatterns.getSelection();
+ fUserDefinedPatterns.setEnabled(state);
+ info.setEnabled(fEnableUserDefinedPatterns.getSelection());
+ if (state)
+ fUserDefinedPatterns.setFocus();
+ }
+ });
+
+ // Filters provided by extension point
+ if (fBuiltInFilters.length > 0)
+ createCheckBoxList(group);
+
+ applyDialogFont(parent);
+ return parent;
+ }
+
+ private void createCheckBoxList(Composite parent) {
+ // Filler
+ new Label(parent, SWT.NONE);
+
+ Label info = new Label(parent, SWT.LEFT);
+ info.setText(FilterMessages
+ .getString("CustomFiltersDialog.filterList.label")); //$NON-NLS-1$
+
+ fCheckBoxList = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.heightHint = fCheckBoxList.getTable().getItemHeight() * 10;
+ fCheckBoxList.getTable().setLayoutData(data);
+
+ fCheckBoxList.setLabelProvider(createLabelPrivder());
+ fCheckBoxList.setContentProvider(new ArrayContentProvider());
+
+ fCheckBoxList.setInput(fBuiltInFilters);
+ setInitialSelections(getEnabledFilterDescriptors());
+
+ List initialSelection = getInitialElementSelections();
+ if (initialSelection != null && !initialSelection.isEmpty())
+ checkInitialSelections();
+
+ // Description
+ info = new Label(parent, SWT.LEFT);
+ info.setText(FilterMessages
+ .getString("CustomFiltersDialog.description.label")); //$NON-NLS-1$
+ final Text description = new Text(parent, SWT.LEFT | SWT.WRAP
+ | SWT.MULTI | SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.heightHint = convertHeightInCharsToPixels(3);
+ description.setLayoutData(data);
+ fCheckBoxList
+ .addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ Object selectedElement = ((IStructuredSelection) selection)
+ .getFirstElement();
+ if (selectedElement instanceof FilterDescriptor)
+ description
+ .setText(((FilterDescriptor) selectedElement)
+ .getDescription());
+ }
+ }
+ });
+ fCheckBoxList.addCheckStateListener(new ICheckStateListener() {
+ /*
+ * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
+ */
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ Object element = event.getElement();
+ if (element instanceof FilterDescriptor) {
+ // renew if already touched
+ if (fFilterDescriptorChangeHistory.contains(element))
+ fFilterDescriptorChangeHistory.remove(element);
+ fFilterDescriptorChangeHistory.push(element);
+ }
+ }
+ });
+
+ addSelectionButtons(parent);
+ }
+
+ private void addSelectionButtons(Composite composite) {
+ Composite buttonComposite = new Composite(composite, SWT.RIGHT);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ buttonComposite.setLayout(layout);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END
+ | GridData.GRAB_HORIZONTAL);
+ data.grabExcessHorizontalSpace = true;
+ composite.setData(data);
+
+ // Select All button
+ String label = FilterMessages
+ .getString("CustomFiltersDialog.SelectAllButton.label"); //$NON-NLS-1$
+ Button selectButton = createButton(buttonComposite,
+ IDialogConstants.SELECT_ALL_ID, label, false);
+ SWTUtil.setButtonDimensionHint(selectButton);
+ SelectionListener listener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ fCheckBoxList.setAllChecked(true);
+ fFilterDescriptorChangeHistory.clear();
+ for (int i = 0; i < fBuiltInFilters.length; i++)
+ fFilterDescriptorChangeHistory.push(fBuiltInFilters[i]);
+ }
+ };
+ selectButton.addSelectionListener(listener);
+
+ // De-select All button
+ label = FilterMessages
+ .getString("CustomFiltersDialog.DeselectAllButton.label"); //$NON-NLS-1$
+ Button deselectButton = createButton(buttonComposite,
+ IDialogConstants.DESELECT_ALL_ID, label, false);
+ SWTUtil.setButtonDimensionHint(deselectButton);
+ listener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ fCheckBoxList.setAllChecked(false);
+ fFilterDescriptorChangeHistory.clear();
+ for (int i = 0; i < fBuiltInFilters.length; i++)
+ fFilterDescriptorChangeHistory.push(fBuiltInFilters[i]);
+ }
+ };
+ deselectButton.addSelectionListener(listener);
+ }
+
+ private void checkInitialSelections() {
+ Iterator itemsToCheck = getInitialElementSelections().iterator();
+ while (itemsToCheck.hasNext())
+ fCheckBoxList.setChecked(itemsToCheck.next(), true);
+ }
+
+ protected void okPressed() {
+ if (fBuiltInFilters != null) {
+ ArrayList result = new ArrayList();
+ for (int i = 0; i < fBuiltInFilters.length; ++i) {
+ if (fCheckBoxList.getChecked(fBuiltInFilters[i]))
+ result.add(fBuiltInFilters[i]);
+ }
+ setResult(result);
+ }
+ super.okPressed();
+ }
+
+ private ILabelProvider createLabelPrivder() {
+ return new LabelProvider() {
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ public String getText(Object element) {
+ if (element instanceof FilterDescriptor)
+ return ((FilterDescriptor) element).getName();
+ else
+ return null;
+ }
+ };
+ }
+
+ // ---------- result handling ----------
+
+ protected void setResult(List newResult) {
+ super.setResult(newResult);
+ if (fUserDefinedPatterns.getText().length() > 0) {
+ fEnablePatterns = fEnableUserDefinedPatterns.getSelection();
+ fPatterns = convertFromString(fUserDefinedPatterns.getText(),
+ SEPARATOR);
+ } else {
+ fEnablePatterns = false;
+ fPatterns = new String[0];
+ }
+ }
+
+ /**
+ * @return the patterns which have been entered by the user
+ */
+ public String[] getUserDefinedPatterns() {
+ return fPatterns;
+ }
+
+ /**
+ * @return the Ids of the enabled built-in filters
+ */
+ public String[] getEnabledFilterIds() {
+ Object[] result = getResult();
+ Set enabledIds = new HashSet(result.length);
+ for (int i = 0; i < result.length; i++)
+ enabledIds.add(((FilterDescriptor) result[i]).getId());
+ return (String[]) enabledIds.toArray(new String[enabledIds.size()]);
+ }
+
+ /**
+ * @return true
if the user-defined patterns are disabled
+ */
+ public boolean areUserDefinedPatternsEnabled() {
+ return fEnablePatterns;
+ }
+
+ /**
+ * @return a stack with the filter descriptor check history
+ * @since 3.0
+ */
+ public Stack getFilterDescriptorChangeHistory() {
+ return fFilterDescriptorChangeHistory;
+ }
+
+ private FilterDescriptor[] getEnabledFilterDescriptors() {
+ FilterDescriptor[] filterDescs = fBuiltInFilters;
+ List result = new ArrayList(filterDescs.length);
+ List enabledFilterIds = Arrays.asList(fEnabledFilterIds);
+ for (int i = 0; i < filterDescs.length; i++) {
+ String id = filterDescs[i].getId();
+ if (enabledFilterIds.contains(id))
+ result.add(filterDescs[i]);
+ }
+ return (FilterDescriptor[]) result.toArray(new FilterDescriptor[result
+ .size()]);
+ }
+
+ public static String[] convertFromString(String patterns, String separator) {
+ StringTokenizer tokenizer = new StringTokenizer(patterns, separator,
+ true);
+ int tokenCount = tokenizer.countTokens();
+ List result = new ArrayList(tokenCount);
+ boolean escape = false;
+ boolean append = false;
+ while (tokenizer.hasMoreTokens()) {
+ String token = tokenizer.nextToken().trim();
+ if (separator.equals(token)) {
+ if (!escape)
+ escape = true;
+ else {
+ addPattern(result, separator);
+ append = true;
+ }
+ } else {
+ if (!append)
+ result.add(token);
+ else
+ addPattern(result, token);
+ append = false;
+ escape = false;
+ }
+ }
+ return (String[]) result.toArray(new String[result.size()]);
+ }
+
+ private static void addPattern(List list, String pattern) {
+ if (list.isEmpty())
+ list.add(pattern);
+ else {
+ int index = list.size() - 1;
+ list.set(index, ((String) list.get(index)) + pattern);
+ }
+ }
+
+ public static String convertToString(String[] patterns, String separator) {
+ int length = patterns.length;
+ StringBuffer strBuf = new StringBuffer();
+ if (length > 0)
+ strBuf.append(escapeSeparator(patterns[0], separator));
+ else
+ return ""; //$NON-NLS-1$
+ int i = 1;
+ while (i < length) {
+ strBuf.append(separator);
+ strBuf.append(" "); //$NON-NLS-1$
+ strBuf.append(escapeSeparator(patterns[i++], separator));
+ }
+ return strBuf.toString();
+ }
+
+ private static String escapeSeparator(String pattern, String separator) {
+ int length = pattern.length();
+ StringBuffer buf = new StringBuffer(length);
+ for (int i = 0; i < length; i++) {
+ char ch = pattern.charAt(i); //$NON-NLS-1$
+ if (separator.equals(String.valueOf(ch)))
+ buf.append(ch);
+ buf.append(ch);
+ }
+ return buf.toString();
+
+ }
+}