com.nokia.sdt.symbian.ui.editors.ArrayEditorDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.sdt.symbian.ui.editors.ArrayEditorDialog.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.sdt.symbian.ui.editors;

import com.nokia.sdt.component.property.ISequencePropertySource;
import com.nokia.sdt.component.symbian.properties.ArrayEditableValue;
import com.nokia.sdt.component.symbian.properties.CompoundPropertyTypeDescriptor;
import com.nokia.sdt.datamodel.util.ModelUtils;
import com.nokia.sdt.symbian.ui.UIPlugin;
import com.nokia.sdt.symbian.ui.noexport.Messages;
import com.nokia.sdt.uidesigner.ui.UndoablePropertySheetEntry;
import com.nokia.sdt.uidesigner.ui.EditValidatingCommandStack;
import com.nokia.cpp.internal.api.utils.core.TextUtils;
import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;
import com.swtdesigner.ResourceManager;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
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 java.util.List;

public class ArrayEditorDialog extends Dialog implements IPropertySourceProvider {

    private static final String HELP_CONTEXT_ID = UIPlugin.PLUGIN_ID + "arrayEditorDialogContextId";
    private TableViewer tableViewer;
    private int lastSelectedIndex = -1;
    private PropertySheetPage propertyPage;
    private ArrayEditableValue editValue;
    private ILabelProvider labelProvider;
    private boolean fixedLengthArray;
    private List arrayItems;
    private StatusLineManager statusLineManager;
    private Button newButton;
    private Button deleteButton;
    private Button downButton;
    private Button upButton;

    /**
     * Create the dialog
     * @param parentShell
     * @param startValue the input value to the dialog
     * @param labelProvider label provider for element values
     * @param fixedLengthArray true if item addition and removal is prohibited
     */
    public ArrayEditorDialog(Shell parentShell, ArrayEditableValue startValue, ILabelProvider labelProvider,
            boolean fixedLengthArray) {
        super(parentShell);
        this.editValue = new ArrayEditableValue(startValue);
        this.labelProvider = labelProvider;
        this.fixedLengthArray = fixedLengthArray;
    }

    public IPropertySource getPropertySource(Object object) {
        IPropertySource result = null;
        if (object instanceof IPropertySource) {
            result = (IPropertySource) object;
        }
        return result;
    }

    public ArrayEditableValue getValue() {
        return editValue;
    }

    /**
     * Create contents of the dialog
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);
        container.setLayout(new FormLayout());

        final Composite tableContainer = new Composite(container, SWT.NONE);
        final FormData formData = new FormData();
        formData.right = new FormAttachment(0, 245);
        formData.bottom = new FormAttachment(100, -5);
        formData.top = new FormAttachment(0, 5);
        formData.left = new FormAttachment(0, 5);
        tableContainer.setLayoutData(formData);
        tableContainer.setLayout(new FormLayout());

        tableViewer = new TableViewer(tableContainer, SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
        tableViewer.setContentProvider(new IStructuredContentProvider() {
            public Object[] getElements(Object inputElement) {
                Object[] result;
                if (inputElement instanceof ArrayEditableValue) {
                    ArrayEditableValue value = (ArrayEditableValue) inputElement;
                    ISequencePropertySource sps = value.getValue();
                    arrayItems = sps.toList();
                    result = arrayItems.toArray();
                } else {
                    result = new Object[0];
                }
                return result;
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }
        });

        tableViewer.setLabelProvider(new TableLabelProvider(labelProvider));
        tableViewer.setComparer(new IElementComparer() {

            public boolean equals(Object a, Object b) {
                return a == b;
            }

            public int hashCode(Object element) {
                return element.hashCode();
            }
        });

        tableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                int newIndex = tableViewer.getTable().getSelectionIndex();
                if (newIndex != lastSelectedIndex) {
                    lastSelectedIndex = newIndex;
                    setPropertyViewInputToSelectedItem();
                    updateButtons();
                    updateCellEditor();

                    Display.getCurrent().asyncExec(new Runnable() {
                        public void run() {
                            Object item = selectedArrayItem();
                            if (item != null) {
                                tableViewer.editElement(item, 1);
                            }
                        }
                    });
                }
            }
        });

        final Table table = tableViewer.getTable();

        table.addControlListener(new ControlAdapter() {
            @Override
            public void controlResized(ControlEvent e) {
                Rectangle bounds = tableViewer.getTable().getBounds();
                TableColumn col = table.getColumn(0);
                col.setWidth(25);
                col = table.getColumn(1);
                col.setWidth(bounds.width - 28);
            }

        });

        @SuppressWarnings("unused") //$NON-NLS-1$
        TableColumn tc = new TableColumn(table, SWT.LEFT);
        tc = new TableColumn(table, SWT.LEFT);
        final FormData formData_2 = new FormData();
        formData_2.bottom = new FormAttachment(0, 240);
        formData_2.right = new FormAttachment(100, -5);
        formData_2.top = new FormAttachment(0, 5);
        formData_2.left = new FormAttachment(0, 10);
        table.setLayoutData(formData_2);
        tableViewer.setInput(editValue);

        final Composite buttonContainer = new Composite(tableContainer, SWT.NONE);
        final FormData formData_3 = new FormData();
        formData_3.bottom = new FormAttachment(100, -5);
        formData_3.right = new FormAttachment(100, -5);
        formData_3.top = new FormAttachment(0, 255);
        formData_3.left = new FormAttachment(0, 11);
        buttonContainer.setLayoutData(formData_3);

        newButton = new Button(buttonContainer, SWT.NONE);
        newButton.setBounds(1, 2, 63, 26);
        newButton.setText(Messages.getString("ArrayEditorDialog.NewButtonTitle")); //$NON-NLS-1$
        newButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                addArrayItem();
            }
        });

        deleteButton = new Button(buttonContainer, SWT.NONE);
        deleteButton.setBounds(75, 2, 60, 26);
        deleteButton.setText(Messages.getString("ArrayEditorDialog.DeleteButtonTitle")); //$NON-NLS-1$
        deleteButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                deleteArrayItem();
            }
        });

        upButton = new Button(buttonContainer, SWT.NONE);
        upButton.setBounds(160, 2, 27, 26);
        upButton.setImage(ResourceManager.getPluginImage(UIPlugin.getDefault(), "icons/upArrow.png")); //$NON-NLS-1$
        upButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                moveItem(-1);
            }
        });

        downButton = new Button(buttonContainer, SWT.NONE);
        downButton.setBounds(191, 2, 27, 26);
        downButton.setImage(ResourceManager.getPluginImage(UIPlugin.getDefault(), "icons/downArrow.png")); //$NON-NLS-1$
        downButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                moveItem(1);
            }
        });

        final Composite propertySheetContainer = new Composite(container, SWT.NONE);
        propertySheetContainer.setLayout(new FormLayout());
        final FormData formData_x = new FormData();
        formData_x.bottom = new FormAttachment(tableContainer, 0, SWT.BOTTOM);
        formData_x.right = new FormAttachment(100, -5);
        formData_x.top = new FormAttachment(tableContainer, 0, SWT.TOP);
        formData_x.left = new FormAttachment(0, 260);
        propertySheetContainer.setLayoutData(formData_x);

        final Composite propertySheetWrapper = new Composite(propertySheetContainer, SWT.NONE);
        propertySheetWrapper.setLayout(new FillLayout());
        final FormData formData_4 = new FormData();
        formData_4.bottom = new FormAttachment(0, 240);
        formData_4.top = new FormAttachment(0, 5);
        formData_4.right = new FormAttachment(100, -5);
        formData_4.left = new FormAttachment(0, 3);
        propertySheetWrapper.setLayoutData(formData_4);

        final Label statusLabel = new Label(propertySheetContainer, SWT.WRAP);
        final FormData formData_1 = new FormData();
        formData_1.bottom = new FormAttachment(100, -5);
        formData_1.right = new FormAttachment(propertySheetWrapper, 0, SWT.RIGHT);
        formData_1.top = new FormAttachment(propertySheetWrapper, 5, SWT.DEFAULT);
        formData_1.left = new FormAttachment(0, 5);
        statusLabel.setLayoutData(formData_1);

        createPropertyPage(propertySheetWrapper, statusLabel);

        if (arrayItems != null && arrayItems.size() > 0) {
            tableViewer.setSelection(new StructuredSelection(arrayItems.get(0)));
            setPropertyViewInputToSelectedItem();
        }

        WorkbenchUtils.setHelpContextId(container, HELP_CONTEXT_ID);
        return container;
    }

    private void createPropertyPage(Composite propertyContainer, Label statusLabel) {
        propertyPage = new PropertySheetPage();
        EditValidatingCommandStack unusedCommandStack = new EditValidatingCommandStack();
        unusedCommandStack.initialize(propertyContainer.getShell(), ModelUtils.getModel(editValue.getEObject()));
        UndoablePropertySheetEntry rootEntry = new UndoablePropertySheetEntry(unusedCommandStack);
        rootEntry.setPropertySourceProvider(this);
        propertyPage.setRootEntry(rootEntry);
        propertyPage.createControl(propertyContainer);

        statusLineManager = new StatusLineManager(statusLabel);

        propertyPage.makeContributions(new NullMenuManager(), new NullToolBarManager(), statusLineManager);

        final IPropertySheetEntryListener listener = new IPropertySheetEntryListener() {
            public void childEntriesChanged(IPropertySheetEntry node) {
                IPropertySheetEntry[] childEntries = node.getChildEntries();
                for (IPropertySheetEntry entry : childEntries) {
                    entry.addPropertySheetEntryListener(this);
                }
            }

            public void valueChanged(IPropertySheetEntry entry) {
                Object item = selectedArrayItem();
                if (item != null) {
                    tableViewer.update(selectedArrayItem(), null);
                }
            }

            public void errorMessageChanged(IPropertySheetEntry entry) {
            }
        };
        rootEntry.addPropertySheetEntryListener(listener);
    }

    private void updateCellEditor() {
        tableViewer.cancelEditing();
        final int index = tableViewer.getTable().getSelectionIndex();
        CellEditor[] cellEditors = tableViewer.getCellEditors();
        if (cellEditors != null && cellEditors.length == 2 && cellEditors[0] != null) {
            cellEditors[1].dispose();
        }
        tableViewer.setCellEditors(null);

        CompoundPropertyTypeDescriptor cptd = editValue.getCompoundPropertyTypeDescriptor();
        if (index >= 0 && cptd != null) {
            final String PROPERTY = "value";
            tableViewer.setColumnProperties(new String[] { null, PROPERTY });
            tableViewer.setCellModifier(new ICellModifier() {

                public boolean canModify(Object element, String property) {
                    return true;
                }

                public Object getValue(Object element, String property) {
                    Object result = element;
                    if (element instanceof IPropertySource) {
                        result = ((IPropertySource) element).getEditableValue();
                    }
                    return result;
                }

                public void modify(Object element, String property, Object value) {
                    // TableViewer passes a TableItem instead of the model object
                    if (element instanceof TableItem) {
                        element = ((TableItem) element).getData();
                    }
                    String id = Integer.valueOf(index).toString();
                    editValue.getValue().setPropertyValue(id, value);
                    tableViewer.refresh(element);
                    setPropertyViewInputToSelectedItem();
                }
            });
            CellEditor ce = cptd.createPropertyEditor(tableViewer.getTable(), SWT.NONE, editValue.getEObject(),
                    editValue.getValue().getElementPath(index));
            tableViewer.setCellEditors(new CellEditor[] { null, ce });
        }

    }

    class TableLabelProvider extends LabelProvider implements ITableLabelProvider {

        private ILabelProvider itemSpecificProvider;

        TableLabelProvider(ILabelProvider labelProvider) {
            this.itemSpecificProvider = labelProvider;
        }

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            String result = null;
            if (columnIndex == 0) {
                int index = getItemIndex(element);
                result = Integer.toString(index) + "."; //$NON-NLS-1$
            } else {
                if (itemSpecificProvider != null) {
                    result = itemSpecificProvider.getText(element);
                }
                if (result == null) {
                    result = element.toString();
                }
            }
            return result;
        }
    }

    /**
     * Create contents of the button bar
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        // override to create with no default button. The user should
        // be able to press Enter to begin editing in the property sheet but
        // that would trigger the default button.
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Return the initial size of the dialog
     */
    @Override
    protected Point getInitialSize() {
        return new Point(541, 375);
    }

    Object selectedArrayItem() {
        Object result = null;
        IStructuredSelection ss = (IStructuredSelection) tableViewer.getSelection();
        if (ss != null) {
            result = ss.getFirstElement();
        }
        return result;
    }

    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(Messages.getString("ArrayEditorDialog.DialogTitle")); //$NON-NLS-1$
    }

    private void setPropertyViewInputToSelectedItem() {
        int index = tableViewer.getTable().getSelectionIndex();
        if (index >= 0) {
            IPropertySource ps = (IPropertySource) selectedArrayItem();
            // if the elements are compound then we need a "fake"
            // parent value, containing just this single property source
            // child, in order to allow editing of the "editable" value
            CompoundPropertyTypeDescriptor cptd = editValue.getCompoundPropertyTypeDescriptor();
            if (cptd != null && false && cptd.hasCellEditor()) {
                CompoundPropertySourceWrapper wrapper = new CompoundPropertySourceWrapper(ps,
                        editValue.getEObject(), Integer.valueOf(index),
                        editValue.getCompoundPropertyTypeDescriptor());
                setPropertyViewInput(wrapper);
            } else {
                setPropertyViewInput(ps);
            }
        } else {
            setPropertyViewInput(null);
        }
    }

    private void setPropertyViewInput(Object obj) {
        if (obj == null) {
            propertyPage.selectionChanged(null, StructuredSelection.EMPTY);
        } else if (obj instanceof IPropertySource) {
            IStructuredSelection ss = new StructuredSelection(obj);
            propertyPage.selectionChanged(null, ss);
        }
    }

    private void updateButtons() {
        // Commented out code to disable image buttons because they look very strange when disabled.
        Object selectedItem = selectedArrayItem();
        if (selectedItem != null) {
            //   int selectedIndex = getItemIndex(selectedItem);
            //   upButton.setEnabled(selectedIndex > 0);
            //   downButton.setEnabled(selectedIndex < (arrayItems.size() - 1));
            deleteButton.setEnabled(!fixedLengthArray);

        } else {
            //   downButton.setEnabled(false);
            //   upButton.setEnabled(false);
            deleteButton.setEnabled(false);
        }
        newButton.setEnabled(!fixedLengthArray);
    }

    private void addArrayItem() {
        int insertPos = arrayItems.size();
        Object selectedItem = selectedArrayItem();
        if (selectedItem != null) {
            insertPos = getItemIndex(selectedItem) + 1;
        }
        ISequencePropertySource sps = editValue.getValue();
        if (sps.isCompoundElement()) {
            sps.addCompoundProperty(insertPos);
        } else {
            sps.addSimpleProperty(insertPos, null);
        }
        tableViewer.setInput(editValue);
        tableViewer.setSelection(new StructuredSelection(arrayItems.get(insertPos)));
        setPropertyViewInputToSelectedItem();
        updateButtons();
    }

    private void moveItem(int delta) {
        tableViewer.cancelEditing();
        int currIndex = getItemIndex(selectedArrayItem());
        if (currIndex >= 0) {
            int newIndex = currIndex + delta;
            if (newIndex >= 0 && newIndex < arrayItems.size()) {
                editValue.getValue().move(currIndex, newIndex);
                tableViewer.setInput(editValue);
                tableViewer.getTable().select(newIndex);
                setPropertyViewInputToSelectedItem();
            }
        }
    }

    int getItemIndex(Object item) {
        int result = -1;
        if (arrayItems != null && item != null) {
            for (int i = 0; i < arrayItems.size(); i++) {
                if (arrayItems.get(i) == item) {
                    result = i;
                    break;
                }
            }
        }
        return result;
    }

    private void deleteArrayItem() {
        tableViewer.cancelEditing();
        Object selectedItem = selectedArrayItem();
        if (selectedItem != null) {
            ISequencePropertySource sps = editValue.getValue();
            int index = getItemIndex(selectedItem);
            if (index >= 0) {
                sps.remove(index);
                tableViewer.refresh();
                if (index >= arrayItems.size()) {
                    index = arrayItems.size() - 1;
                }
                tableViewer.getTable().select(index);
                updateButtons();
            }
        }
    }

    static class StatusLineManager implements IStatusLineManager {

        private Label label;
        private String normalMessage;
        private String errorMessage;

        StatusLineManager(Label label) {
            this.label = label;
        }

        private void updateLabel() {
            if (!TextUtils.isEmpty(errorMessage)) {
                Color color = JFaceColors.getErrorText(Display.getCurrent());
                label.setForeground(color);
                label.setText(errorMessage);
            } else {
                Color color = Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND);
                label.setForeground(color);
                label.setText(normalMessage != null ? normalMessage : ""); //$NON-NLS-1$
            }
        }

        public IProgressMonitor getProgressMonitor() {
            return null;
        }

        public boolean isCancelEnabled() {
            return false;
        }

        public void setCancelEnabled(boolean enabled) {
        }

        public void setErrorMessage(String message) {
            errorMessage = message;
            updateLabel();
        }

        public void setErrorMessage(Image image, String message) {
            setErrorMessage(message);
        }

        public void setMessage(String message) {
            normalMessage = message;
            updateLabel();
        }

        public void setMessage(Image image, String message) {
            setMessage(message);
        }

        public void add(IAction action) {
        }

        public void add(IContributionItem item) {
        }

        public void appendToGroup(String groupName, IAction action) {
        }

        public void appendToGroup(String groupName, IContributionItem item) {
        }

        public IContributionItem find(String id) {
            return null;
        }

        public IContributionItem[] getItems() {
            return null;
        }

        public IContributionManagerOverrides getOverrides() {
            return null;
        }

        public void insertAfter(String id, IAction action) {
        }

        public void insertAfter(String id, IContributionItem item) {
        }

        public void insertBefore(String id, IAction action) {
        }

        public void insertBefore(String id, IContributionItem item) {
        }

        public boolean isDirty() {
            return false;
        }

        public boolean isEmpty() {
            return false;
        }

        public void markDirty() {
        }

        public void prependToGroup(String groupName, IAction action) {
        }

        public void prependToGroup(String groupName, IContributionItem item) {
        }

        public IContributionItem remove(String id) {
            return null;
        }

        public IContributionItem remove(IContributionItem item) {
            return null;
        }

        public void removeAll() {
        }

        public void update(boolean force) {
        }
    }

    static class NullMenuManager implements IMenuManager {
        public void addMenuListener(IMenuListener listener) {
        }

        public IMenuManager findMenuUsingPath(String path) {
            return null;
        }

        public IContributionItem findUsingPath(String path) {
            return null;
        }

        public boolean getRemoveAllWhenShown() {
            return false;
        }

        public boolean isEnabled() {
            return false;
        }

        public void removeMenuListener(IMenuListener listener) {
        }

        public void setRemoveAllWhenShown(boolean removeAll) {
        }

        public void updateAll(boolean force) {
        }

        public void add(IAction action) {
        }

        public void add(IContributionItem item) {
        }

        public void appendToGroup(String groupName, IAction action) {
        }

        public void appendToGroup(String groupName, IContributionItem item) {
        }

        public IContributionItem find(String id) {
            return null;
        }

        public IContributionItem[] getItems() {
            return null;
        }

        public IContributionManagerOverrides getOverrides() {
            return null;
        }

        public void insertAfter(String id, IAction action) {
        }

        public void insertAfter(String id, IContributionItem item) {
        }

        public void insertBefore(String id, IAction action) {
        }

        public void insertBefore(String id, IContributionItem item) {
        }

        public boolean isDirty() {
            return false;
        }

        public boolean isEmpty() {
            return false;
        }

        public void markDirty() {
        }

        public void prependToGroup(String groupName, IAction action) {
        }

        public void prependToGroup(String groupName, IContributionItem item) {
        }

        public IContributionItem remove(String id) {
            return null;
        }

        public IContributionItem remove(IContributionItem item) {
            return null;
        }

        public void removeAll() {
        }

        public void update(boolean force) {
        }

        public void dispose() {
        }

        public void fill(Composite parent) {
        }

        public void fill(Menu parent, int index) {
        }

        public void fill(ToolBar parent, int index) {
        }

        public void fill(CoolBar parent, int index) {
        }

        public String getId() {
            return null;
        }

        public boolean isDynamic() {
            return false;
        }

        public boolean isGroupMarker() {
            return false;
        }

        public boolean isSeparator() {
            return false;
        }

        public boolean isVisible() {
            return false;
        }

        public void saveWidgetState() {
        }

        public void setParent(IContributionManager parent) {
        }

        public void setVisible(boolean visible) {
        }

        public void update() {
        }

        public void update(String id) {
        }
    }

    static class NullToolBarManager implements IToolBarManager {
        public void add(IAction action) {
        }

        public void add(IContributionItem item) {
        }

        public void appendToGroup(String groupName, IAction action) {
        }

        public void appendToGroup(String groupName, IContributionItem item) {
        }

        public IContributionItem find(String id) {
            return null;
        }

        public IContributionItem[] getItems() {
            return null;
        }

        public IContributionManagerOverrides getOverrides() {
            return null;
        }

        public void insertAfter(String id, IAction action) {
        }

        public void insertAfter(String id, IContributionItem item) {
        }

        public void insertBefore(String id, IAction action) {
        }

        public void insertBefore(String id, IContributionItem item) {
        }

        public boolean isDirty() {
            return false;
        }

        public boolean isEmpty() {
            return false;
        }

        public void markDirty() {
        }

        public void prependToGroup(String groupName, IAction action) {
        }

        public void prependToGroup(String groupName, IContributionItem item) {
        }

        public IContributionItem remove(String id) {
            return null;
        }

        public IContributionItem remove(IContributionItem item) {
            return null;
        }

        public void removeAll() {
        }

        public void update(boolean force) {
        }
    }
}