org.codehaus.groovy.eclipse.preferences.ScriptFolderSelectorPreferences.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.groovy.eclipse.preferences.ScriptFolderSelectorPreferences.java

Source

/*
 * Copyright 2003-2010 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.codehaus.groovy.eclipse.preferences;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.jdt.groovy.core.Activator;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
import org.eclipse.jdt.internal.ui.viewsupport.ImageDescriptorRegistry;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
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.Label;

/**
 * Dialog for creating and editing script folders in the workspace
 *
 * @author andrew eisenberg
 * @created Sep 14, 2010
 */
public class ScriptFolderSelectorPreferences {

    private static final ImageDescriptor DESCRIPTOR = JavaPluginImages.DESC_OBJS_INCLUSION_FILTER_ATTRIB;

    private static final int IDX_ADD = 0;

    private static final int IDX_EDIT = 1;

    private static final int IDX_REMOVE = 2;

    private static final int IDX_CHECKALL = 3;

    private static final int IDX_UNCHECKALL = 4;

    private static final String[] buttonLabels = { "Add", "Edit", "Remove", "Check all", "Uncheck all" };

    private static class ScriptLabelProvider extends LabelProvider {

        private Image fElementImage;

        public ScriptLabelProvider(ImageDescriptor descriptor) {
            ImageDescriptorRegistry registry = JavaPlugin.getImageDescriptorRegistry();
            fElementImage = registry.get(descriptor);
        }

        @Override
        public Image getImage(Object element) {
            return fElementImage;
        }

        @Override
        public String getText(Object element) {
            return BasicElementLabels.getFilePattern((String) element);
        }

    }

    private class ScriptPatternAdapter 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) {
        }

    }

    private final Composite parent;

    private CheckedListDialogField patternList;

    private BooleanFieldEditor disableButton;

    private final IEclipsePreferences preferences;

    private final IPreferenceStore store;

    public ScriptFolderSelectorPreferences(Composite parent, IEclipsePreferences preferences,
            IPreferenceStore store) {
        this.parent = parent;
        this.preferences = preferences;
        this.store = store;
    }

    public ListDialogField createListContents() {
        Label label = new Label(parent, SWT.WRAP);
        label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
        label.setText("Groovy Script Folders:");
        label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));

        Composite inner = new Composite(parent, SWT.BORDER);
        inner.setFont(parent.getFont());
        GridLayout layout = new GridLayout();
        layout.marginHeight = 3;
        layout.marginWidth = 3;
        layout.numColumns = 1;
        inner.setLayout(layout);
        inner.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        disableButton = new BooleanFieldEditor(Activator.GROOVY_SCRIPT_FILTERS_ENABLED,
                "Enable script folder support", BooleanFieldEditor.DEFAULT, inner);

        disableButton.setPreferenceStore(store);
        disableButton.load();

        // inner composite contains the dialog itself
        final Composite innerInner = new Composite(inner, SWT.NONE);
        innerInner.setFont(parent.getFont());
        layout = new GridLayout();
        layout.marginHeight = 3;
        layout.marginWidth = 3;
        layout.numColumns = 3;
        innerInner.setLayout(layout);
        innerInner.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        innerInner.setToolTipText("CHECKED boxes are COPIED to output folder.\nUNCHECKED boxes are NOT copied.");
        boolean enabled = disableButton.getBooleanValue();
        innerInner.setEnabled(enabled);

        // enable/disable pattern list based
        disableButton.setPropertyChangeListener(new IPropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                if (event.getProperty() == FieldEditor.VALUE) {
                    Object o = event.getNewValue();
                    if (o instanceof Boolean) {
                        boolean enabled = ((Boolean) o);
                        innerInner.setEnabled(enabled);
                        for (Control c : innerInner.getChildren()) {
                            c.setEnabled(enabled);
                        }
                    }
                }
            }
        });

        ScriptPatternAdapter adapter = new ScriptPatternAdapter();

        patternList = new CheckedListDialogField(adapter, buttonLabels, new ScriptLabelProvider(DESCRIPTOR));
        patternList.setDialogFieldListener(adapter);
        patternList.setLabelText("Groovy files that match these patterns are treated as scripts.  "
                + "They will not be compiled and will be copied as-is to the output folder.\n\n"
                + "CHECKED boxes will be COPIED to the output folder.  UNCHECKED boxes are NOT copied to the output folder.");
        patternList.setRemoveButtonIndex(IDX_REMOVE);
        patternList.enableButton(IDX_EDIT, false);
        patternList.setCheckAllButtonIndex(IDX_CHECKALL);
        patternList.setUncheckAllButtonIndex(IDX_UNCHECKALL);

        patternList.doFillIntoGrid(innerInner, 3);
        Label l = patternList.getLabelControl(innerInner);
        GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false);
        gd.widthHint = 200;
        l.setLayoutData(gd);

        resetElements();
        patternList.enableButton(IDX_ADD, true);
        patternList.setViewerComparator(new ViewerComparator());

        // finally force greying out of tree if required
        innerInner.setEnabled(enabled);
        for (Control c : innerInner.getChildren()) {
            c.setEnabled(enabled);
        }

        return patternList;
    }

    // returns the list of patterns alternating with their docopy state
    private List<String> findPatterns() {
        return Activator.getDefault().getListStringPreference(preferences, Activator.GROOVY_SCRIPT_FILTERS,
                Activator.DEFAULT_GROOVY_SCRIPT_FILTER);
    }

    protected void doCustomButtonPressed(ListDialogField field, int index) {
        if (index == IDX_ADD) {
            addEntry(field);
        } else if (index == IDX_EDIT) {
            editEntry(field);
        }
    }

    protected void doSelectionChanged(ListDialogField field) {
        @SuppressWarnings("unchecked")
        List<String> selected = field.getSelectedElements();
        field.enableButton(IDX_EDIT, canEdit(selected));
    }

    protected void doDoubleClicked(ListDialogField field) {
        editEntry(field);
    }

    private boolean canEdit(List<String> selected) {
        return selected.size() == 1;
    }

    private void addEntry(ListDialogField field) {
        InputDialog dialog = createInputDialog("");
        if (dialog.open() == Window.OK) {
            field.addElement(dialog.getValue());
        }
    }

    private InputDialog createInputDialog(String initial) {
        InputDialog dialog = new InputDialog(parent.getShell(), "Add script folder",
                "Enter a pattern for denoting script files in Groovy projects. Allowed wildcards are '*', '?' and '**'. Examples: 'java/util/A*.java', 'java/util/', '**/Test*'.  All patterns are relative to the current project.",
                initial, null);
        return dialog;
    }

    private void editEntry(ListDialogField field) {
        @SuppressWarnings("unchecked")
        List<String> selElements = field.getSelectedElements();
        if (selElements.size() != 1) {
            return;
        }
        String entry = (String) selElements.get(0);
        InputDialog dialog = createInputDialog(entry);
        if (dialog.open() == Window.OK) {
            field.replaceElement(entry, dialog.getValue());
        }
    }

    @SuppressWarnings("unchecked")
    public void applyPreferences() {
        // must do the store before setting the preference
        // to ensure that the store is flushed
        disableButton.store();
        List<String> elts = patternList.getElements();
        List<String> result = new ArrayList<String>(elts.size() * 2);
        for (String elt : elts) {
            result.add(elt);
            result.add(patternList.isChecked(elt) ? "y" : "n");
        }
        Activator.getDefault().setPreference(preferences, Activator.GROOVY_SCRIPT_FILTERS, result);

    }

    public void restoreDefaultsPressed() {
        // must do the store before setting the preference
        // to ensure that the store is flushed
        disableButton.loadDefault();
        Activator.getDefault().setPreference(preferences, Activator.GROOVY_SCRIPT_FILTERS,
                Activator.DEFAULT_GROOVY_SCRIPT_FILTER);
        resetElements();
    }

    private void resetElements() {
        List<String> elements = findPatterns();
        List<String> filteredElements = new ArrayList<String>(elements.size() / 2);
        List<String> checkedElements = new ArrayList<String>(elements.size() / 2);
        for (Iterator<String> eltIter = elements.iterator(); eltIter.hasNext();) {
            String elt = eltIter.next();
            filteredElements.add(elt);
            if (eltIter.hasNext()) {
                String doCopy = eltIter.next();
                if (doCopy.equals("y")) {
                    checkedElements.add(elt);
                }
            }
        }
        patternList.setElements(filteredElements);
        patternList.setCheckedElements(checkedElements);
        patternList.selectFirstElement();
    }

}