com.siteview.mde.internal.ui.editor.feature.DataSection.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.ui.editor.feature.DataSection.java

Source

/*******************************************************************************
 *  Copyright (c) 2000, 2010 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.siteview.mde.internal.ui.editor.feature;

import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
import com.siteview.mde.core.IModel;
import com.siteview.mde.core.IModelChangedEvent;
import com.siteview.mde.internal.core.ICoreConstants;
import com.siteview.mde.internal.core.feature.FeatureData;
import com.siteview.mde.internal.core.feature.FeaturePlugin;
import com.siteview.mde.internal.core.ifeature.*;
import com.siteview.mde.internal.ui.MDEPlugin;
import com.siteview.mde.internal.ui.MDEUIMessages;
import com.siteview.mde.internal.ui.editor.*;
import com.siteview.mde.internal.ui.elements.DefaultContentProvider;
import com.siteview.mde.internal.ui.parts.TablePart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.dialogs.ResourceSelectionDialog;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

public class DataSection extends TableSection {
    private TableViewer fDataViewer;

    private Action fNewAction;

    private Action fOpenAction;

    private Action fDeleteAction;

    class PluginContentProvider extends DefaultContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object parent) {
            if (parent instanceof IFeature) {
                return ((IFeature) parent).getData();
            }
            return new Object[0];
        }
    }

    public DataSection(MDEFormPage page, Composite parent) {
        super(page, parent, Section.DESCRIPTION, new String[] { MDEUIMessages.FeatureEditor_DataSection_new });
        getSection().setText(MDEUIMessages.FeatureEditor_DataSection_title);
        getSection().setDescription(MDEUIMessages.FeatureEditor_DataSection_desc);
        getTablePart().setEditable(false);
    }

    public void commit(boolean onSave) {
        super.commit(onSave);
    }

    public void createClient(Section section, FormToolkit toolkit) {

        section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1));
        GridData data = new GridData(GridData.FILL_BOTH);
        section.setLayoutData(data);

        Composite container = createClientContainer(section, 2, toolkit);

        createViewerPartControl(container, SWT.MULTI, 2, toolkit);
        TablePart tablePart = getTablePart();
        fDataViewer = tablePart.getTableViewer();
        fDataViewer.setContentProvider(new PluginContentProvider());
        fDataViewer.setLabelProvider(MDEPlugin.getDefault().getLabelProvider());
        toolkit.paintBordersFor(container);
        makeActions();
        section.setClient(container);
        initialize();
    }

    protected void handleDoubleClick(IStructuredSelection selection) {
        fOpenAction.run();
    }

    protected void buttonSelected(int index) {
        if (index == 0)
            handleNew();
    }

    public void dispose() {
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        if (model != null)
            model.removeModelChangedListener(this);
        super.dispose();
    }

    public boolean setFormInput(Object object) {
        if (object instanceof IFeatureData) {
            fDataViewer.setSelection(new StructuredSelection(object), true);
            return true;
        }
        return false;
    }

    protected void fillContextMenu(IMenuManager manager) {
        manager.add(fOpenAction);
        manager.add(new Separator());
        manager.add(fNewAction);
        manager.add(fDeleteAction);
        manager.add(new Separator());
        getPage().getMDEEditor().getContributor().contextMenuAboutToShow(manager);
    }

    private void handleNew() {
        final IFeatureModel model = (IFeatureModel) getPage().getModel();
        IResource resource = model.getUnderlyingResource();
        final IContainer folder = resource.getParent();

        BusyIndicator.showWhile(fDataViewer.getTable().getDisplay(), new Runnable() {
            public void run() {
                ResourceSelectionDialog dialog = new ResourceSelectionDialog(fDataViewer.getTable().getShell(),
                        folder, null);
                dialog.open();
                Object[] result = dialog.getResult();
                processNewResult(model, folder, result);
            }
        });
    }

    private void processNewResult(IFeatureModel model, IContainer folder, Object[] result) {
        if (result == null || result.length == 0)
            return;
        IPath folderPath = folder.getProjectRelativePath();
        ArrayList entries = new ArrayList();
        for (int i = 0; i < result.length; i++) {
            Object item = result[i];
            if (item instanceof IFile) {
                IFile file = (IFile) item;
                IPath filePath = file.getProjectRelativePath();
                int matching = filePath.matchingFirstSegments(folderPath);
                IPath relativePath = filePath.removeFirstSegments(matching);
                String path = relativePath.toString();
                if (canAdd(model, path))
                    entries.add(path);
            }
        }
        if (entries.size() > 0) {
            try {
                IFeatureData[] array = new IFeatureData[entries.size()];
                for (int i = 0; i < array.length; i++) {
                    IFeatureData data = model.getFactory().createData();
                    String path = (String) entries.get(i);
                    data.setId(path);
                    array[i] = data;
                }
                model.getFeature().addData(array);
                fDataViewer.setSelection(new StructuredSelection(array[0]));
            } catch (CoreException e) {
                MDEPlugin.logException(e);
            }
        }
    }

    private boolean canAdd(IFeatureModel model, String path) {
        if (ICoreConstants.FEATURE_FILENAME_DESCRIPTOR.equals(path))
            return false;
        IFeatureData[] data = model.getFeature().getData();
        for (int i = 0; i < data.length; i++) {
            if (path.equals(data[i].getId()))
                return false;
        }
        return true;

    }

    private void handleSelectAll() {
        IStructuredContentProvider provider = (IStructuredContentProvider) fDataViewer.getContentProvider();
        Object[] elements = provider.getElements(fDataViewer.getInput());
        StructuredSelection ssel = new StructuredSelection(elements);
        fDataViewer.setSelection(ssel);
    }

    private void handleDelete() {
        IStructuredSelection ssel = (IStructuredSelection) fDataViewer.getSelection();

        if (ssel.isEmpty())
            return;
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        if (!model.isEditable()) {
            return;
        }
        IFeature feature = model.getFeature();

        try {
            IFeatureData[] removed = new IFeatureData[ssel.size()];
            int i = 0;
            for (Iterator iter = ssel.iterator(); iter.hasNext();) {
                IFeatureData iobj = (IFeatureData) iter.next();
                removed[i++] = iobj;
            }
            feature.removeData(removed);
        } catch (CoreException e) {
            MDEPlugin.logException(e);
        }
    }

    public boolean doGlobalAction(String actionId) {
        if (actionId.equals(ActionFactory.DELETE.getId())) {
            BusyIndicator.showWhile(fDataViewer.getTable().getDisplay(), new Runnable() {
                public void run() {
                    handleDelete();
                }
            });
            return true;
        }
        if (actionId.equals(ActionFactory.SELECT_ALL.getId())) {
            BusyIndicator.showWhile(fDataViewer.getTable().getDisplay(), new Runnable() {
                public void run() {
                    handleSelectAll();
                }
            });
            return true;
        }
        if (actionId.equals(ActionFactory.CUT.getId())) {
            // delete here and let the editor transfer
            // the selection to the clipboard
            handleDelete();
            return false;
        }
        if (actionId.equals(ActionFactory.PASTE.getId())) {
            doPaste();
            return true;
        }
        return false;
    }

    protected void selectionChanged(IStructuredSelection selection) {
        getPage().getMDEEditor().setSelection(selection);
    }

    public void initialize() {
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        refresh();
        getTablePart().setButtonEnabled(0, model.isEditable());
        model.addModelChangedListener(this);
    }

    public void modelChanged(IModelChangedEvent e) {
        if (e.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
            markStale();
            return;
        }
        Object obj = e.getChangedObjects()[0];
        if (obj instanceof IFeatureData && !(obj instanceof IFeaturePlugin)) {
            if (e.getChangeType() == IModelChangedEvent.CHANGE) {
                fDataViewer.update(obj, null);
            } else if (e.getChangeType() == IModelChangedEvent.INSERT) {
                fDataViewer.add(e.getChangedObjects());
            } else if (e.getChangeType() == IModelChangedEvent.REMOVE) {
                fDataViewer.remove(e.getChangedObjects());
            }
        }
    }

    private void makeActions() {
        IModel model = (IModel) getPage().getModel();
        fNewAction = new Action() {
            public void run() {
                handleNew();
            }
        };
        fNewAction.setText(MDEUIMessages.Menus_new_label);
        fNewAction.setEnabled(model.isEditable());

        fDeleteAction = new Action() {
            public void run() {
                BusyIndicator.showWhile(fDataViewer.getTable().getDisplay(), new Runnable() {
                    public void run() {
                        handleDelete();
                    }
                });
            }
        };
        fDeleteAction.setEnabled(model.isEditable());
        fDeleteAction.setText(MDEUIMessages.Actions_delete_label);
        fOpenAction = new OpenReferenceAction(fDataViewer);
    }

    public void setFocus() {
        if (fDataViewer != null)
            fDataViewer.getTable().setFocus();
    }

    public void refresh() {
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        IFeature feature = model.getFeature();
        fDataViewer.setInput(feature);
        super.refresh();
    }

    /**
     * @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#canPaste(Object,
     *      Object[])
     */
    protected boolean canPaste(Object target, Object[] objects) {
        for (int i = 0; i < objects.length; i++) {
            if (objects[i] instanceof FeaturePlugin || !(objects[i] instanceof FeatureData))
                return false;
        }
        return true;
    }

    /**
     * @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#doPaste()
     */
    protected void doPaste() {
        Clipboard clipboard = getPage().getMDEEditor().getClipboard();
        ModelDataTransfer modelTransfer = ModelDataTransfer.getInstance();
        Object[] objects = (Object[]) clipboard.getContents(modelTransfer);
        if (objects != null) {
            doPaste(null, objects);
        }
    }

    /**
     * @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#doPaste(Object,
     *      Object[])
     */
    protected void doPaste(Object target, Object[] objects) {
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        IFeature feature = model.getFeature();
        if (!model.isEditable()) {
            return;
        }
        FeatureData[] fData = new FeatureData[objects.length];
        try {
            for (int i = 0; i < objects.length; i++) {
                if (objects[i] instanceof FeatureData && !(objects[i] instanceof FeaturePlugin)) {
                    FeatureData fd = (FeatureData) objects[i];
                    fd.setModel(model);
                    fd.setParent(feature);
                    fData[i] = fd;
                }
            }
            feature.addData(fData);
        } catch (CoreException e) {
            MDEPlugin.logException(e);
        }
    }

    void fireSelection() {
        ISelection sel = fDataViewer.getSelection();
        if (!sel.isEmpty()) {
            fDataViewer.setSelection(fDataViewer.getSelection());
        } else if (fDataViewer.getElementAt(0) != null) {
            fDataViewer.setSelection(new StructuredSelection(fDataViewer.getElementAt(0)));
        }
    }
}