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(); + + } +}