summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/FileScopePreferencePage.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/FileScopePreferencePage.java')
-rw-r--r--org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/FileScopePreferencePage.java312
1 files changed, 312 insertions, 0 deletions
diff --git a/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/FileScopePreferencePage.java b/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/FileScopePreferencePage.java
new file mode 100644
index 0000000..149dee9
--- /dev/null
+++ b/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/FileScopePreferencePage.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Alena Laskavaia 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:
+ * Alena Laskavaia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.internal.ui.preferences;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.cdt.codan.core.param.FileScopeProblemPreference;
+import org.eclipse.cdt.codan.internal.ui.CodanUIActivator;
+import org.eclipse.cdt.codan.internal.ui.CodanUIMessages;
+import org.eclipse.cdt.codan.internal.ui.dialogs.ExclusionInclusionEntryDialog;
+import org.eclipse.cdt.codan.internal.ui.widgets.BasicElementLabels;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.IListAdapter;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+public class FileScopePreferencePage extends PreferencePage {
+ private ListDialogField fInclusionPatternList;
+ private ListDialogField fExclusionPatternList;
+ private FileScopeProblemPreference fCurrElement;
+ private IProject fCurrProject;
+ private IContainer fCurrSourceFolder;
+ private static final int IDX_ADD = 0;
+ private static final int IDX_ADD_MULTIPLE = 1;
+ private static final int IDX_EDIT = 2;
+ private static final int IDX_REMOVE = 4;
+
+ public FileScopePreferencePage(FileScopeProblemPreference entryToEdit) {
+ setTitle(CodanUIMessages.ExclusionInclusionDialog_title);
+ setDescription(CodanUIMessages.ExclusionInclusionDialog_description2);
+ fCurrElement = entryToEdit;
+ fCurrProject = entryToEdit.getProject();
+ IWorkspaceRoot root = fCurrProject != null ? fCurrProject
+ .getWorkspace().getRoot() : ResourcesPlugin.getWorkspace()
+ .getRoot();
+ IResource res = root.findMember(entryToEdit.getPath());
+ if (res instanceof IContainer) {
+ fCurrSourceFolder = (IContainer) res;
+ }
+ if (res == null)
+ fCurrSourceFolder = root;
+ String excLabel = CodanUIMessages.ExclusionInclusionDialog_exclusion_pattern_label;
+ ImageDescriptor excDescriptor = null; //JavaPluginImages.DESC_OBJS_EXCLUSION_FILTER_ATTRIB;
+ String[] excButtonLabels = new String[] {
+ CodanUIMessages.ExclusionInclusionDialog_exclusion_pattern_add,
+ CodanUIMessages.ExclusionInclusionDialog_exclusion_pattern_add_multiple,
+ CodanUIMessages.ExclusionInclusionDialog_exclusion_pattern_edit,
+ null,
+ CodanUIMessages.ExclusionInclusionDialog_exclusion_pattern_remove };
+ String incLabel = CodanUIMessages.ExclusionInclusionDialog_inclusion_pattern_label;
+ ImageDescriptor incDescriptor = null; //JavaPluginImages.DESC_OBJS_INCLUSION_FILTER_ATTRIB;
+ String[] incButtonLabels = new String[] {
+ CodanUIMessages.ExclusionInclusionDialog_inclusion_pattern_add,
+ CodanUIMessages.ExclusionInclusionDialog_inclusion_pattern_add_multiple,
+ CodanUIMessages.ExclusionInclusionDialog_inclusion_pattern_edit,
+ null,
+ CodanUIMessages.ExclusionInclusionDialog_inclusion_pattern_remove };
+ fExclusionPatternList = createListContents(entryToEdit,
+ FileScopeProblemPreference.EXCLUSION, excLabel, null,
+ excButtonLabels);
+ fInclusionPatternList = createListContents(entryToEdit,
+ FileScopeProblemPreference.INCLUSION, incLabel, null,
+ incButtonLabels);
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite inner = new Composite(parent, SWT.NONE);
+ inner.setFont(parent.getFont());
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.numColumns = 2;
+ inner.setLayout(layout);
+ inner.setLayoutData(new GridData(GridData.FILL_BOTH));
+ fInclusionPatternList.doFillIntoGrid(inner, 3);
+ LayoutUtil.setHorizontalSpan(
+ fInclusionPatternList.getLabelControl(null), 2);
+ LayoutUtil.setHorizontalGrabbing(fInclusionPatternList
+ .getListControl(null));
+ fExclusionPatternList.doFillIntoGrid(inner, 3);
+ LayoutUtil.setHorizontalSpan(
+ fExclusionPatternList.getLabelControl(null), 2);
+ LayoutUtil.setHorizontalGrabbing(fExclusionPatternList
+ .getListControl(null));
+ setControl(inner);
+ Dialog.applyDialogFont(inner);
+ return inner;
+ }
+
+ private static class ExclusionInclusionLabelProvider extends LabelProvider {
+ private Image fElementImage;
+
+ public ExclusionInclusionLabelProvider(String descriptorPath) {
+ if (descriptorPath != null) {
+ ImageDescriptor d = CodanUIActivator
+ .getImageDescriptor(descriptorPath);
+ }
+ fElementImage = null; // XXX
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return fElementImage;
+ }
+
+ @Override
+ public String getText(Object element) {
+ return BasicElementLabels.getFilePattern((String) element);
+ }
+ }
+
+ private ListDialogField createListContents(
+ FileScopeProblemPreference entryToEdit, String key, String label,
+ String descriptor, String[] buttonLabels) {
+ ExclusionPatternAdapter adapter = new ExclusionPatternAdapter();
+ ListDialogField patternList = new ListDialogField(adapter,
+ buttonLabels, new ExclusionInclusionLabelProvider(descriptor));
+ patternList.setDialogFieldListener(adapter);
+ patternList.setLabelText(label);
+ patternList.enableButton(IDX_EDIT, false);
+ IPath[] pattern = entryToEdit.getAttribute(key);
+ ArrayList elements = new ArrayList(pattern.length);
+ for (int i = 0; i < pattern.length; i++) {
+ String patternName = pattern[i].toString();
+ if (patternName.length() > 0)
+ elements.add(patternName);
+ }
+ patternList.setElements(elements);
+ patternList.selectFirstElement();
+ patternList.enableButton(IDX_ADD_MULTIPLE, fCurrSourceFolder != null);
+ patternList.setViewerComparator(new ViewerComparator());
+ return patternList;
+ }
+
+ protected void doCustomButtonPressed(ListDialogField field, int index) {
+ if (index == IDX_ADD) {
+ addEntry(field);
+ } else if (index == IDX_EDIT) {
+ editEntry(field);
+ } else if (index == IDX_ADD_MULTIPLE) {
+ addMultipleEntries(field);
+ } else if (index == IDX_REMOVE) {
+ field.removeElements(field.getSelectedElements());
+ }
+ updateStatus();
+ }
+
+ private void updateStatus() {
+ fCurrElement.setAttribute(FileScopeProblemPreference.INCLUSION,
+ getInclusionPattern());
+ fCurrElement.setAttribute(FileScopeProblemPreference.EXCLUSION,
+ getExclusionPattern());
+ }
+
+ protected void doDoubleClicked(ListDialogField field) {
+ editEntry(field);
+ updateStatus();
+ }
+
+ protected void doSelectionChanged(ListDialogField field) {
+ List selected = field.getSelectedElements();
+ field.enableButton(IDX_EDIT, canEdit(selected));
+ }
+
+ private boolean canEdit(List selected) {
+ return selected.size() == 1;
+ }
+
+ private void editEntry(ListDialogField field) {
+ List selElements = field.getSelectedElements();
+ if (selElements.size() != 1) {
+ return;
+ }
+ List existing = field.getElements();
+ String entry = (String) selElements.get(0);
+ ExclusionInclusionEntryDialog dialog = new ExclusionInclusionEntryDialog(
+ getShell(), isExclusion(field), entry, existing, fCurrElement);
+ if (dialog.open() == Window.OK) {
+ field.replaceElement(entry, dialog.getExclusionPattern());
+ }
+ }
+
+ private boolean isExclusion(ListDialogField field) {
+ return field == fExclusionPatternList;
+ }
+
+ private void addEntry(ListDialogField field) {
+ List existing = field.getElements();
+ ExclusionInclusionEntryDialog dialog = new ExclusionInclusionEntryDialog(
+ getShell(), isExclusion(field), null, existing, fCurrElement);
+ if (dialog.open() == Window.OK) {
+ field.addElement(dialog.getExclusionPattern());
+ }
+ }
+
+ // -------- ExclusionPatternAdapter --------
+ private class ExclusionPatternAdapter implements IListAdapter,
+ IDialogFieldListener {
+ /**
+ * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#customButtonPressed(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField,
+ * int)
+ */
+ public void customButtonPressed(ListDialogField field, int index) {
+ doCustomButtonPressed(field, index);
+ }
+
+ /**
+ * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#selectionChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField)
+ */
+ public void selectionChanged(ListDialogField field) {
+ doSelectionChanged(field);
+ }
+
+ /**
+ * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#doubleClicked(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField)
+ */
+ public void doubleClicked(ListDialogField field) {
+ doDoubleClicked(field);
+ }
+
+ /**
+ * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener#dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField)
+ */
+ public void dialogFieldChanged(DialogField field) {
+ }
+ }
+
+ protected void doStatusLineUpdate() {
+ }
+
+ protected void checkIfPatternValid() {
+ }
+
+ private IPath[] getPattern(ListDialogField field) {
+ Object[] arr = field.getElements().toArray();
+ Arrays.sort(arr);
+ IPath[] res = new IPath[arr.length];
+ for (int i = 0; i < res.length; i++) {
+ res[i] = new Path((String) arr[i]);
+ }
+ return res;
+ }
+
+ public IPath[] getExclusionPattern() {
+ return getPattern(fExclusionPatternList);
+ }
+
+ public IPath[] getInclusionPattern() {
+ return getPattern(fInclusionPatternList);
+ }
+
+ /*
+ * @see org.eclipse.jface.window.Window#configureShell(Shell)
+ */
+ protected void configureShell(Shell newShell) {
+ }
+
+ private void addMultipleEntries(ListDialogField field) {
+ String title, message;
+ if (isExclusion(field)) {
+ title = CodanUIMessages.ExclusionInclusionDialog_ChooseExclusionPattern_title;
+ message = CodanUIMessages.ExclusionInclusionDialog_ChooseExclusionPattern_description;
+ } else {
+ title = CodanUIMessages.ExclusionInclusionDialog_ChooseInclusionPattern_title;
+ message = CodanUIMessages.ExclusionInclusionDialog_ChooseInclusionPattern_description;
+ }
+ IPath[] res = ExclusionInclusionEntryDialog.chooseExclusionPattern(
+ getShell(), fCurrSourceFolder, title, message, null, true);
+ if (res != null) {
+ for (int i = 0; i < res.length; i++) {
+ field.addElement(res[i].toString());
+ }
+ }
+ }
+
+ @Override
+ public void noDefaultAndApplyButton() {
+ super.noDefaultAndApplyButton();
+ }
+}