net.sf.eclipsensis.installoptions.properties.tabbed.section.GeneralPropertySection.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.eclipsensis.installoptions.properties.tabbed.section.GeneralPropertySection.java

Source

/*******************************************************************************
 * Copyright (c) 2004-2010 Sunil Kamath (IcemanK).
 * All rights reserved.
 * This program is made available under the terms of the Common Public License
 * v1.0 which is available at http://www.eclipse.org/legal/cpl-v10.html
 *
 * Contributors:
 *     Sunil Kamath (IcemanK) - initial API and implementation
 *******************************************************************************/
package net.sf.eclipsensis.installoptions.properties.tabbed.section;

import java.beans.*;
import java.util.*;
import java.util.List;

import net.sf.eclipsensis.installoptions.InstallOptionsPlugin;
import net.sf.eclipsensis.installoptions.model.*;
import net.sf.eclipsensis.installoptions.model.commands.InstallOptionsCommandHelper;
import net.sf.eclipsensis.installoptions.properties.descriptors.PropertyDescriptorHelper;
import net.sf.eclipsensis.util.*;
import net.sf.eclipsensis.viewer.CollectionContentProvider;

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.views.properties.*;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import org.eclipse.ui.views.properties.tabbed.*;

public class GeneralPropertySection extends InstallOptionsElementPropertySection {
    @Override
    protected Control createSection(InstallOptionsElement element, Composite parent, TabbedPropertySheetPage page,
            InstallOptionsCommandHelper commandHelper) {
        if (element instanceof InstallOptionsWidget) {
            InstallOptionsWidget widget = (InstallOptionsWidget) element;
            int cols = 2;
            IPropertySectionCreator customSectionCreator = widget.getPropertySectionCreator();
            if (customSectionCreator != null) {
                cols++;
            }

            Composite parent2 = createSectionComposite(parent);
            GridLayout layout = new GridLayout(cols, false);
            layout.marginHeight = layout.marginWidth = 0;
            parent2.setLayout(layout);

            Control c = createGeneralSection(widget, parent2, commandHelper);
            GridData data = new GridData(SWT.FILL, SWT.FILL, false, true);
            c.setLayoutData(data);

            if (customSectionCreator != null) {
                Composite composite = getWidgetFactory().createComposite(parent2);
                layout = new GridLayout(1, false);
                layout.marginHeight = layout.marginWidth = 0;
                composite.setLayout(layout);
                composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
                c = customSectionCreator.createPropertySection(composite, getWidgetFactory(), commandHelper);
                if (c != null) {
                    c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
                }
            }
            if (widget.getTypeDef().getFlags().size() > 0 || widget.getFlags().size() > 0) {
                c = createFlagsSection(widget, parent2, commandHelper);
                data = new GridData(SWT.FILL, SWT.FILL, false, true);
                c.setLayoutData(data);
            }
            return parent2;
        }
        return null;
    }

    private Control createFlagsSection(final InstallOptionsWidget widget, Composite parent,
            final InstallOptionsCommandHelper commandHelper) {
        final String displayName = widget.getPropertyDescriptor(InstallOptionsModel.PROPERTY_FLAGS)
                .getDisplayName();

        TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
        Composite group = factory.createGroup(parent, displayName);
        GridLayout layout = new GridLayout(2, true);
        group.setLayout(layout);

        final boolean[] nonUserChange = { false };

        final Table table = factory.createTable(group, SWT.FLAT | SWT.CHECK | SWT.SINGLE | SWT.HIDE_SELECTION);
        GC gc = new GC(table);
        gc.setFont(JFaceResources.getDialogFont());
        FontMetrics fontMetrics = gc.getFontMetrics();
        gc.dispose();
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
        data.horizontalSpan = 2;
        data.widthHint = fontMetrics.getAverageCharWidth() * 30;
        data.heightHint = fontMetrics.getHeight() * 10;
        table.setLayoutData(data);

        final CheckboxTableViewer viewer = new CheckboxTableViewer(table);
        viewer.setContentProvider(new CollectionContentProvider());
        viewer.setLabelProvider(new LabelProvider());
        viewer.setComparer(new IElementComparer() {
            public boolean equals(Object a, Object b) {
                return Common.objectsAreEqual(a, b);
            }

            public int hashCode(Object element) {
                if (element != null) {
                    return element.hashCode();
                }
                return 0;
            }
        });
        table.addListener(SWT.EraseItem, new Listener() {
            public void handleEvent(Event event) {
                event.detail &= ~(SWT.SELECTED | SWT.FOCUSED);
            }
        });
        final List<String> flags = new ArrayList<String>(widget.getFlags());
        final Collection<String> availableFlags = widget.getTypeDef().getFlags();
        final IPropertyDescriptor descriptor = widget.getPropertyDescriptor(InstallOptionsModel.PROPERTY_FLAGS);
        final ICellEditorValidator validator = PropertyDescriptorHelper
                .getCellEditorValidator((PropertyDescriptor) descriptor);
        final Runnable runnable = new Runnable() {
            public void run() {
                nonUserChange[0] = true;
                try {
                    if (validator != null) {
                        String error = validator.isValid(flags);
                        if (error != null) {
                            Common.openError(table.getShell(), error, InstallOptionsPlugin.getShellImage());
                            viewer.setCheckedElements(widget.getFlags().toArray());
                            return;
                        }
                    }
                    commandHelper.propertyChanged(InstallOptionsModel.PROPERTY_FLAGS, descriptor.getDisplayName(),
                            widget, flags);
                } finally {
                    nonUserChange[0] = false;
                }
            }
        };
        viewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                String flag = (String) event.getElement();
                boolean checked = event.getChecked();
                if (checked) {
                    flags.add(flag);
                } else {
                    flags.remove(flag);
                }
                runnable.run();
            }
        });
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (!event.getSelection().isEmpty()) {
                    String flag = (String) ((IStructuredSelection) event.getSelection()).getFirstElement();
                    viewer.setSelection(StructuredSelection.EMPTY);
                    boolean checked = viewer.getChecked(flag);
                    viewer.setChecked(flag, !checked);
                    if (!checked) {
                        flags.add(flag);
                    } else {
                        flags.remove(flag);
                    }
                    runnable.run();
                }
            }
        });

        Button b = factory.createButton(group, InstallOptionsPlugin.getResourceString("select.all.label"), //$NON-NLS-1$
                SWT.PUSH | SWT.FLAT);
        b.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                flags.clear();
                flags.addAll(availableFlags);
                viewer.setCheckedElements(availableFlags.toArray());
                runnable.run();
            }
        });
        b.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        b = factory.createButton(group, InstallOptionsPlugin.getResourceString("deselect.all.label"), //$NON-NLS-1$
                SWT.PUSH | SWT.FLAT);
        b.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                flags.clear();
                viewer.setCheckedElements(Common.EMPTY_STRING_ARRAY);
                runnable.run();
            }
        });
        b.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        viewer.setInput(availableFlags == null ? Collections.EMPTY_LIST : availableFlags);
        viewer.setCheckedElements(flags.toArray());
        final PropertyChangeListener listener = new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals(InstallOptionsModel.PROPERTY_FLAGS)) {
                    if (!nonUserChange[0]) {
                        List<String> newFlags = widget.getFlags();
                        if (Common.isValid(viewer.getControl())) {
                            viewer.setCheckedElements(
                                    newFlags == null ? Common.EMPTY_STRING_ARRAY : newFlags.toArray());
                            flags.clear();
                            flags.addAll(newFlags);
                        }
                    }
                }
            }
        };
        widget.addPropertyChangeListener(listener);
        group.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                widget.removePropertyChangeListener(listener);
            }
        });
        return group;
    }

    private Control createGeneralSection(final InstallOptionsWidget widget, Composite parent,
            final InstallOptionsCommandHelper commandHelper) {
        TabbedPropertySheetWidgetFactory factory = getWidgetFactory();

        Composite parent2 = factory.createGroup(parent,
                InstallOptionsPlugin.getResourceString("basic.section.label")); //$NON-NLS-1$
        parent2.setLayout(new GridLayout(1, false));

        final boolean[] nonUserChange = { false };
        Composite composite = factory.createComposite(parent2);
        composite.setLayout(new GridLayout(2, false));
        final String indexName = widget.getPropertyDescriptor(InstallOptionsModel.PROPERTY_INDEX).getDisplayName();
        CLabel l = factory.createCLabel(composite, indexName);
        l.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));

        final CCombo indexCombo = factory.createCCombo(composite,
                SWT.FLAT | SWT.READ_ONLY | SWT.DROP_DOWN | SWT.BORDER);
        indexCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        for (int i = 0; i < widget.getParent().getChildren().size(); i++) {
            indexCombo.add(Integer.toString(i + 1));
        }
        int index = widget.getIndex();
        if (index >= 0 && index < indexCombo.getItemCount()) {
            indexCombo.select(index);
        }
        indexCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                if (!nonUserChange[0]) {
                    commandHelper.propertyChanged(InstallOptionsModel.PROPERTY_INDEX, indexName, widget,
                            new Integer(indexCombo.getSelectionIndex()));
                }
            }
        });

        final String typeName = widget.getPropertyDescriptor(InstallOptionsModel.PROPERTY_TYPE).getDisplayName();
        l = factory.createCLabel(composite, typeName);
        l.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        final CCombo typeCombo = factory.createCCombo(composite, SWT.FLAT | SWT.DROP_DOWN | SWT.BORDER);
        typeCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));

        final Collection<InstallOptionsModelTypeDef> coll = InstallOptionsModel.INSTANCE.getControlTypeDefs();
        String type = widget.getType();
        int selected = -1;
        index = 0;
        for (Iterator<InstallOptionsModelTypeDef> iter = coll.iterator(); iter.hasNext();) {
            InstallOptionsModelTypeDef typeDef = iter.next();
            final String t = typeDef.getType();
            typeCombo.add(t);
            if (t.equalsIgnoreCase(type)) {
                selected = index;
            }
            index++;
        }
        if (selected >= 0) {
            typeCombo.select(selected);
        } else {
            typeCombo.setText(type);
        }

        final Runnable r = new Runnable() {
            public void run() {
                if (!nonUserChange[0]) {
                    String type = typeCombo.getText();
                    for (Iterator<InstallOptionsModelTypeDef> iter = coll.iterator(); iter.hasNext();) {
                        InstallOptionsModelTypeDef typeDef = iter.next();
                        final String t = typeDef.getType();
                        if (t.equalsIgnoreCase(type)) {
                            type = t;
                            break;
                        }
                    }
                    if (!Common.stringsAreEqual(type, widget.getType())) {
                        commandHelper.propertyChanged(InstallOptionsModel.PROPERTY_TYPE, indexName, widget, type);
                    }
                }
            }
        };

        typeCombo.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.character == '\t') {
                    r.run();
                }
            }
        });

        typeCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                r.run();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent event) {
                r.run();
            }
        });

        typeCombo.addTraverseListener(new TraverseListener() {
            public void keyTraversed(TraverseEvent e) {
                if (e.detail == SWT.TRAVERSE_ESCAPE || e.detail == SWT.TRAVERSE_RETURN) {
                    e.doit = false;
                }
            }
        });

        typeCombo.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent e) {
                r.run();
            }
        });

        final String positionName = widget.getPropertyDescriptor(InstallOptionsModel.PROPERTY_POSITION)
                .getDisplayName();
        Group group = factory.createGroup(parent2, positionName);
        group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        group.setLayout(new GridLayout(2, false));
        final Position position = widget.getPosition().getCopy();
        final Text[] positionTexts = new Text[4];
        String[] names = { "left.property.name", "top.property.name", //$NON-NLS-1$ //$NON-NLS-2$
                "right.property.name", "bottom.property.name" }; //$NON-NLS-1$ //$NON-NLS-2$
        int[] values = { position.left, position.top, position.right, position.bottom };
        VerifyListener verifyListener = new NumberVerifyListener(true);
        TraverseListener traverseListener = new TraverseListener() {
            public void keyTraversed(TraverseEvent e) {
                if (e.widget instanceof Text) {
                    Text text = (Text) e.widget;
                    if (Common.isEmpty(text.getText())) {
                        Common.openError(text.getShell(),
                                InstallOptionsPlugin.getResourceString("empty.numeric.value.error"), //$NON-NLS-1$
                                InstallOptionsPlugin.getShellImage());
                        e.doit = false;
                    }
                }
            }
        };
        final String indexDataName = "INDEX"; //$NON-NLS-1$
        TextChangeHelper helper = new TextChangeHelper(new ICellEditorValidator() {
            public String isValid(Object value) {
                if (value instanceof String && Common.isEmpty((String) value)) {
                    return InstallOptionsPlugin.getResourceString("empty.numeric.value.error"); //$NON-NLS-1$
                }
                return null;
            }
        }) {
            @Override
            protected String getResetValue(Text text) {
                Integer index = (Integer) text.getData(indexDataName);
                if (index != null) {
                    String value;
                    switch (index.intValue()) {
                    case 0:
                        value = Integer.toString(position.left);
                        break;
                    case 1:
                        value = Integer.toString(position.top);
                        break;
                    case 2:
                        value = Integer.toString(position.right);
                        break;
                    default:
                        value = Integer.toString(position.bottom);
                    }
                    return value;
                }
                return null;
            }

            @Override
            protected void handleTextChange(Text text) {
                Integer index = (Integer) text.getData(indexDataName);
                if (index != null) {
                    int value = Integer.parseInt(text.getText());
                    int oldValue;
                    switch (index.intValue()) {
                    case 0:
                        oldValue = position.left;
                        position.left = value;
                        break;
                    case 1:
                        oldValue = position.top;
                        position.top = value;
                        break;
                    case 2:
                        oldValue = position.right;
                        position.right = value;
                        break;
                    default:
                        oldValue = position.bottom;
                        position.bottom = value;
                    }

                    if (oldValue != value) {
                        commandHelper.propertyChanged(InstallOptionsModel.PROPERTY_POSITION, positionName, widget,
                                position);
                    }
                }
            }
        };

        for (int i = 0; i < positionTexts.length; i++) {
            l = factory.createCLabel(group, InstallOptionsPlugin.getResourceString(names[i]));
            l.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
            positionTexts[i] = factory.createText(group, Integer.toString(values[i]), SWT.FLAT | SWT.SINGLE);
            positionTexts[i].setEditable(!widget.isLocked());
            positionTexts[i].setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
            positionTexts[i].setData(indexDataName, new Integer(i));
            positionTexts[i].addVerifyListener(verifyListener);
            positionTexts[i].addTraverseListener(traverseListener);
            helper.connect(positionTexts[i]);
        }

        final String lockedName = widget.getPropertyDescriptor(InstallOptionsWidget.PROPERTY_LOCKED)
                .getDisplayName();
        final Button lockedButton = factory.createButton(parent2, lockedName, SWT.FLAT | SWT.CHECK);
        lockedButton.setSelection(widget.isLocked());
        lockedButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                if (!nonUserChange[0]) {
                    commandHelper.propertyChanged(InstallOptionsWidget.PROPERTY_LOCKED, lockedName, widget,
                            (lockedButton.getSelection() ? Boolean.TRUE : Boolean.FALSE));
                }
            }
        });

        final PropertyChangeListener propertyListener = new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                nonUserChange[0] = true;
                try {
                    if (evt.getPropertyName().equals(InstallOptionsModel.PROPERTY_INDEX)) {
                        int index = ((Integer) evt.getNewValue()).intValue();
                        if (Common.isValid(indexCombo) && indexCombo.getSelectionIndex() != index) {
                            indexCombo.select(index);
                        }
                    } else if (evt.getPropertyName().equals(InstallOptionsWidget.PROPERTY_LOCKED)) {
                        boolean locked = ((Boolean) evt.getNewValue()).booleanValue();
                        if (Common.isValid(lockedButton) && lockedButton.getSelection() != locked) {
                            lockedButton.setSelection(locked);
                        }
                        for (int i = 0; i < positionTexts.length; i++) {
                            if (Common.isValid(positionTexts[i])) {
                                positionTexts[i].setEditable(!locked);
                            }
                        }
                    } else if (evt.getPropertyName().equals(InstallOptionsModel.PROPERTY_CHILDREN)) {
                        if (Common.isValid(indexCombo) && evt.getOldValue() == widget
                                && evt.getNewValue() instanceof Integer) {
                            Integer index = (Integer) evt.getNewValue();
                            indexCombo.select(index.intValue());
                        }
                    } else if (evt.getPropertyName().equals(InstallOptionsModel.PROPERTY_POSITION)) {
                        Position pos = (Position) evt.getNewValue();
                        if (!position.equals(pos)) {
                            if (Common.isValid(positionTexts[0])) {
                                positionTexts[0].setText(Integer.toString(pos.left));

                            }
                            if (Common.isValid(positionTexts[1])) {
                                positionTexts[1].setText(Integer.toString(pos.top));

                            }
                            if (Common.isValid(positionTexts[2])) {
                                positionTexts[2].setText(Integer.toString(pos.right));

                            }
                            if (Common.isValid(positionTexts[3])) {
                                positionTexts[3].setText(Integer.toString(pos.bottom));

                            }
                            position.set(pos);
                        }
                    } else if (evt.getPropertyName().equals(InstallOptionsModel.PROPERTY_TYPE)) {
                        String type = (String) evt.getNewValue();
                        for (Iterator<InstallOptionsModelTypeDef> iter = coll.iterator(); iter.hasNext();) {
                            InstallOptionsModelTypeDef typeDef = iter.next();
                            final String t = typeDef.getType();
                            if (t.equalsIgnoreCase(type)) {
                                type = t;
                                break;
                            }
                        }
                        if (Common.isValid(typeCombo)) {
                            typeCombo.setText(type);
                        }
                    }
                } finally {
                    nonUserChange[0] = false;
                }
            }
        };
        widget.addPropertyChangeListener(propertyListener);
        widget.getParent().addPropertyChangeListener(propertyListener);
        composite.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                InstallOptionsDialog dialog = widget.getParent();
                if (dialog != null) {
                    dialog.removePropertyChangeListener(propertyListener);
                }
                widget.removePropertyChangeListener(propertyListener);
            }
        });

        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        return parent2;
    }
}