com.nokia.s60ct.gui.views.SettingEditorView.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.s60ct.gui.views.SettingEditorView.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 "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.s60ct.gui.views;

import interfaces.DeleteEObjectSet;

import java.util.List;

import objectview.IObjectView;

import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheetPage;

import s60ct.provider.ParentSettingForFeatureView;
import s60ct.provider.S60CTItemProviderAdapterFactory;

import com.nokia.s60ct.gui.editors.ConfigurationBrowser;
import com.nokia.s60ct.gui.filter.ReadOnlyFilter;
import com.nokia.s60ct.gui.filter.SettingEditorFilter;
import com.nokia.s60ct.gui.viewer.DCAdapterFactoryContentProvider;
import com.nokia.s60ct.gui.viewer.DCAdapterFactoryLabelProvider;
import com.nokia.s60ct.gui.viewer.DCTreeViewer;

import concepts.EObjectStructuralFeature;
import configurationemf.ConfigurationemfPackage;
import configurationemf.Feature;
import configurationemf.Frame;
import configurationemf.LeafSetting;
import configurationemf.LeafSettingDelegator;
import configurationemf.ParentSetting;
import configurationemf.Ref;
import configurationemf.Referable;
import configurationemf.Setting;
import configurationemf.TYPE;

public class SettingEditorView extends ViewPart
        implements ISelectionListener, IMenuListener, IViewerProvider, IObjectView {

    public static final String ID = "com.nokia.S60CT.gui.SettingEditor";

    private Feature feature = null;
    private Composite rootComposite = null;
    DCTreeViewer viewer = null;
    SequenceMenu sequenceMenu = null;
    private ITableLabelProvider labelProvider = null;
    private IContentProvider contentProvider = null;
    PropertySheetPage propertySheetPage = null;

    private static final int STYLE = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL
            | SWT.FULL_SELECTION;

    public static int def_column_order[] = null;
    public static int value_position = 2;
    public static final String COLUMN_INT_KEY = "cint";

    private static final Object[][] NORMAL_SETTINGS = new Object[][] {
            new Object[] { ParentSetting.class, ConfigurationemfPackage.eINSTANCE.getFeature_ParentSetting() },
            new Object[] { LeafSettingDelegator.class,
                    ConfigurationemfPackage.eINSTANCE.getParentSetting_LeafSetting() },
            new Object[] { LeafSetting.class, ConfigurationemfPackage.eINSTANCE.getParentSetting_LeafSetting() } };

    private static final Object[][] RO_SETTINGS = new Object[][] {
            new Object[] { Setting.class, ConfigurationemfPackage.eINSTANCE.getSetting_Ro() } };

    private static final DeleteEObjectSet DELETE_EOBJECT_SET = new DeleteEObjectSet() {
        public Object[][] getParentFeature() {
            return NORMAL_SETTINGS;
        }

        public Object[][] getRoFeatures() {
            return RO_SETTINGS;
        }
    };

    private static final String[][] COLUMNS = new String[][] {
            new String[] { "Setting", "Setting Name", ParentSettingForFeatureView.PROP_NAME },
            new String[] { "Type", "Setting Type", ParentSettingForFeatureView.PROP_TYPE },
            new String[] { "Default", "Setting Default Value", ParentSettingForFeatureView.PROP_DEF },
            new String[] { "Value", "Modified Value", ParentSettingForFeatureView.PROP_VALUE },
            new String[] { "Ref", "Reference", ParentSettingForFeatureView.PROP_REF },
            new String[] { "Cust.Config.", "Customer Configurable", ParentSettingForFeatureView.PROP_READONLY } };
    private static final int COLUMN_NAME = 0;
    private static final int COLUMN_TTEXT = 1;
    private static final int COLUMN_PROP = 2;

    public SettingEditorView() {
        labelProvider = new DCAdapterFactoryLabelProvider(new S60CTItemProviderAdapterFactory());
        contentProvider = new DCAdapterFactoryContentProvider(new S60CTItemProviderAdapterFactory());
    }

    @SuppressWarnings("unchecked")
    public Object getAdapter(Class adapter) {
        if (adapter.equals(IPropertySheetPage.class)) {
            return getPropertySheetPage();
        } else if (adapter.equals(DeleteEObjectSet.class)) {
            return DELETE_EOBJECT_SET;

        }
        return super.getAdapter(adapter);
    }

    public IPropertySheetPage getPropertySheetPage() {
        if (propertySheetPage == null && feature != null) {
            propertySheetPage = new ExtendedPropertySheetPage(
                    (AdapterFactoryEditingDomain) AdapterFactoryEditingDomain.getEditingDomainFor(feature)) {
                public void setSelectionToViewer(List<?> selection) {
                    viewer.setSelection(new StructuredSelection(selection.toArray()), true);
                }

            };
            propertySheetPage.setPropertySourceProvider(
                    new AdapterFactoryContentProvider(new S60CTItemProviderAdapterFactory()));
        }
        return propertySheetPage;
    }

    @Override
    public void createPartControl(Composite parent) {
        this.rootComposite = parent;
        parent.setLayout(new GridLayout(1, true));
        parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        createTable(parent);
        //createSequenceMenu(parent);
    }

    private void setSeqMenuVisible(boolean visible) {
        if (visible) {
            if (sequenceMenu == null) {
                createSequenceMenu(rootComposite);
                rootComposite.layout(true);
                rootComposite.redraw();
            }
        } else {
            if (sequenceMenu != null) {
                sequenceMenu.dispose();
                sequenceMenu = null;
                rootComposite.layout(true);
                rootComposite.redraw();

            }
        }
    }

    private void createSequenceMenu(Composite parent) {
        sequenceMenu = new SequenceMenu(parent, this);
    }

    private void createTable(Composite parent) {
        Composite container = new Composite(parent, SWT.FILL);
        TreeColumnLayout layout = new TreeColumnLayout();
        container.setLayout(layout);
        container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Tree tree = new Tree(container, STYLE);
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);

        viewer = new DCTreeViewer(tree);
        this.setActiveColumns(viewer);

        layout.setColumnData(tree.getColumn(0), new ColumnWeightData(4, 1, true));
        for (int i = 1; i < tree.getColumnCount(); i++)
            layout.setColumnData(tree.getColumn(i), new ColumnWeightData(1, 1, true));

        tree.setData("name", "Setting Editor");
        viewer.setLabelProvider(labelProvider);
        viewer.setContentProvider(contentProvider);
        viewer.addFilter(SettingEditorFilter.INSTANCE);

        viewer.addFilter(ReadOnlyFilter.INSTANCE);
        ReadOnlyFilter.INSTANCE.addViewer(viewer);

        DragSource source = new DragSource(viewer.getControl(), DND.DROP_DEFAULT | DND.DROP_COPY | DND.DROP_MOVE);
        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
        source.setTransfer(types);
        source.addDragListener(new DragSourceAdapter() {
            public void dragSetData(DragSourceEvent event) {
                Object object = viewer.getTree().getSelection()[0].getData();
                if (object instanceof LeafSettingDelegator) {
                    // Sequence type
                    Feature feature = (Feature) viewer.getTree().getSelection()[0].getParent().getData();
                    ParentSetting setting = (ParentSetting) viewer.getTree().getSelection()[0].getParentItem()
                            .getParentItem().getData();
                    LeafSetting leaf = ((LeafSettingDelegator) object).getLeafSetting();
                    event.data = setting.getName() + "///" + leaf.getName() + ";sequenceitem;" + feature.getRef()
                            + "/" + setting.getRef() + ";" + leaf.getType() + ";" + leaf.getRef();
                } else {
                    Setting setting = (Setting) object;
                    if (setting.getType().equals(TYPE.SEQUENCE)) {
                        ParentSetting pSetting = (ParentSetting) setting;
                        Frame frame = pSetting.getTemplate();
                        String leafSettings = ""; //this stores the leafsettings as name1/type1/ref1;name2/type2/ref2
                        for (LeafSettingDelegator lsd : frame.getLeafSettings()) {

                            String ref = lsd.getLeafSetting().getRef();
                            if (ref == null)
                                ref = "";
                            String name = lsd.getName();
                            if (name == null)
                                name = "";
                            leafSettings = leafSettings + ";" + name + "/" + lsd.getType().getName() + "/" + ref;
                        }
                        event.data = setting.getName() + ";" + setting.getType() + ";" + setting.getAbsRef()
                                + leafSettings;
                    } else
                        event.data = setting.getName() + ";" + setting.getType() + ";" + setting.getAbsRef();
                }
            }
        });

        createContextMenuFor(viewer);
        getSite().setSelectionProvider(viewer);
        getSite().getPage().addSelectionListener(this);
    }

    public void setActiveColumns(TreeViewer treeViewer) {
        final Tree tree = treeViewer.getTree();
        String[] columnProp = new String[COLUMNS.length];
        for (int i = 0; i < COLUMNS.length; i++) {
            String name = COLUMNS[i][COLUMN_NAME];
            String tip = COLUMNS[i][COLUMN_TTEXT];
            String prop = COLUMNS[i][COLUMN_PROP];
            TreeColumn column = new TreeColumn(tree, SWT.NONE);
            column.setText(name);
            column.setToolTipText(tip);
            columnProp[i] = prop;
        }
        treeViewer.setColumnProperties(columnProp);
        treeViewer.setCellEditors(new CellEditor[tree.getColumnCount()]);
    }

    @Override
    public void setFocus() {
        viewer.getTree().setFocus();
    }

    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        Object selectedObject = null;
        if (selection instanceof IStructuredSelection) {
            IStructuredSelection structedSelection = (IStructuredSelection) selection;
            selectedObject = structedSelection.getFirstElement();
        }
        if (part instanceof ConfigurationBrowser) {
            if (canShow(selectedObject)) {
                show(selectedObject, false);
            } else {
                setFeature(null);
            }
            updateSequenceMenu(selectedObject);
        } else if (part instanceof SettingEditorView) {
            try {
                updateSequenceMenu(selectedObject);
            } catch (Exception exc) {
                System.err.println("Error:" + exc.toString());
            }
        }
    }

    private void updateSequenceMenu(Object selectedObject) {

        boolean shouldBeVisible = false;
        if (selectedObject instanceof ParentSetting) {
            if (((ParentSetting) selectedObject).getType().equals(TYPE.SEQUENCE)) {
                shouldBeVisible = true;
            }
        } else if (selectedObject instanceof Frame) {
            shouldBeVisible = true;
        } else if (selectedObject instanceof LeafSettingDelegator) {
            shouldBeVisible = true;
        }
        setSeqMenuVisible(shouldBeVisible);
        if (shouldBeVisible)
            sequenceMenu.setSetting(selectedObject);
    }

    protected void setFeature(Feature feature) {
        this.feature = feature;
        viewer.setInput(feature);
    }

    public void updateView() {
        viewer.refresh();
    }

    @Override
    public void dispose() {

        if (propertySheetPage != null)
            propertySheetPage.dispose();
        if (!viewer.getTree().isDisposed())
            viewer.getTree().dispose();
        getSite().getPage().removeSelectionListener(this);
        super.dispose();
    }

    public void menuAboutToShow(IMenuManager manager) {

    }

    protected void createContextMenuFor(StructuredViewer viewer) {
        MenuManager contextMenu = new MenuManager("#PopupMenu");
        contextMenu.setRemoveAllWhenShown(true);
        contextMenu.addMenuListener(this);

        Menu menu = contextMenu.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));
    }

    /**
     * @deprecated use getViewer() (from ViewerProvider interface) instead. 
     * @return
     */
    public TreeViewer getTreeViewer() {
        return viewer;
    }

    public TreeViewer getViewer() {
        return viewer;
    }

    //clean setting editor if all configuration browsers are closed
    public void cleanViewer(EditorPart editor) {
        IEditorReference[] references = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                .getEditorReferences();
        boolean bExist = false;
        for (IEditorReference editorReference : references) {
            if (editorReference.getId().compareTo(ConfigurationBrowser.ID) == 0)
                bExist = true;
        }
        if (!bExist)
            viewer.setInput(null);
        viewer.refresh();
    }

    //
    // Showing/displaying objects
    //

    /**
     * Returns true, if successful
     */
    public boolean selectAttribute(Setting setting, EStructuralFeature feature) {
        selectSetting(setting);

        TreeItem[] items = viewer.getTree().getSelection();
        for (int i = 0; i < COLUMNS.length; i++) {
            if (feature.equals(ParentSettingForFeatureView.getAttributeByProperty(COLUMNS[i][COLUMN_PROP]))) {
                viewer.getCursor().setSelection(items[0], i);
                return true;
            }
        }
        return false;
    }

    public void selectSetting(Setting setting) {
        // Find out the parent feature
        EObject loc = setting;
        while (loc != null && !(loc instanceof Feature))
            loc = loc.eContainer();

        if (loc instanceof Feature) {
            setFeature((Feature) loc);
            getViewer().setSelection(new TreeSelection(new TreePath(new Object[] { setting })));
        }
    }

    public boolean canShow(Object object) {
        if (object instanceof EObjectStructuralFeature) {
            // Able to point out to attributes
            return ((EObjectStructuralFeature) object).getEObject() instanceof Setting;
        } else if (object instanceof Setting || object instanceof Feature) {
            return true;
        } else if (object instanceof Ref && ((Ref) object).getReferable() instanceof Setting) {
            return true;
        }
        return false;
    }

    public void show(Object object, boolean tryActivate) throws IllegalArgumentException {
        if (!canShow(object)) {
            throw new IllegalArgumentException();
        }
        if (object instanceof EObjectStructuralFeature) {
            EObjectStructuralFeature featureRef = (EObjectStructuralFeature) object;
            selectAttribute((Setting) featureRef.getEObject(), featureRef.getEStructuralFeature());
        } else if (object instanceof Ref) {
            Ref ref = (Ref) object;
            Referable referable = ref.getReferable();
            selectAttribute((Setting) referable, ConfigurationemfPackage.eINSTANCE.getSetting_CurrentValue());
        } else if (object instanceof Setting) {
            selectSetting((Setting) object);
        } else if (object instanceof Feature) {
            setFeature((Feature) object);
        }
    }
}