com.skratchdot.electribe.model.esx.presentation.EsxEditorPart.java Source code

Java tutorial

Introduction

Here is the source code for com.skratchdot.electribe.model.esx.presentation.EsxEditorPart.java

Source

/*******************************************************************************
 * Copyright (c) 2009-2013 SKRATCHDOT.COM
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * http://www.eclipse.org/legal/epl-v10.html
 *  
 * Contributors:
 *     JEFF |:at:| SKRATCHDOT |:dot:| COM
 *******************************************************************************/
package com.skratchdot.electribe.model.esx.presentation;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;

import com.skratchdot.electribe.model.esx.EsxFile;
import com.skratchdot.electribe.model.esx.editor.util.EsxEditorUtil;

/**
 * http://www.eclipse.org/articles/article.php?file=Article-Integrating-EMF-GMF-Editors/index.html
 */
public abstract class EsxEditorPart extends EditorPart
        implements IEditingDomainProvider, IMenuListener, ISelectionListener, IPropertyChangeListener {
    public static final String ID = "com.skratchdot.electribe.model.esx.presentation.EsxEditorPart"; //$NON-NLS-1$

    protected EsxEditor parentEditor;
    protected EsxFile esxFile;

    /**
     * @param parent
     */
    public EsxEditorPart(EsxEditor parent) {
        super();
        this.parentEditor = parent;
        Resource resource = (Resource) this.getEditingDomain().getResourceSet().getResources().get(0);
        Object rootObject = resource.getContents().get(0);
        if (rootObject instanceof EsxFile) {
            this.esxFile = (EsxFile) rootObject;
        }
    }

    /**
     * Sets the input to this editor.  This method simply updates the internal
     * member variables of the editor.
     * 
     * @param input
     */
    public abstract void setInput(Object input);

    /**
     * Refreshes this editor with information freshly obtained from the editor's model.
     * This method is called by the main editor whenever a command on the command stack
     * has been called.  It is up to the subclasses to determine what needs to be refreshed.
     */
    public abstract void refresh();

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        // nothing to do here - this is handled by the editor part subclasses
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    @Override
    public void setFocus() {
        // nothing to do here - this is handled by the editor part subclasses
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        // nothing to do here - this is handled by the editor part subclasses
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
     */
    public void propertyChange(PropertyChangeEvent event) {
        // nothing to do here - this is handled by the editor part subclasses
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
     */
    @Override
    public void doSave(IProgressMonitor monitor) {
        // nothing to do here - this is handled by the parent editor
    }

    @Override
    public void doSaveAs() {
        // nothing to do here - this is handled by the parent editor
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
     */
    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        setSite(site);
        setInput(input);
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#isDirty()
     */
    @Override
    public boolean isDirty() {
        return getCommandStack().isSaveNeeded();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
     */
    @Override
    public boolean isSaveAsAllowed() {
        return true;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
     */
    public void menuAboutToShow(IMenuManager manager) {
        // pass the request to show the context menu on to the parent editor
        ((IMenuListener) parentEditor.getEditorSite().getActionBarContributor()).menuAboutToShow(manager);
    }

    /* (non-Javadoc)
     * @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
     */
    public EditingDomain getEditingDomain() {
        return parentEditor.getEditingDomain();
    }

    /**
     * @return
     */
    protected BasicCommandStack getCommandStack() {
        return ((BasicCommandStack) getEditingDomain().getCommandStack());
    }

    /**
     * @return
     */
    protected AdapterFactory getAdapterFactory() {
        return parentEditor.getAdapterFactory();
    }

    /**
     * @param viewer the viewer in which to create a context menu for
     * @param menuManagerId the id of the menu manager
     */
    protected void createContextMenuFor(StructuredViewer viewer, String menuId) {
        MenuManager contextMenu = new MenuManager("#PopUp");
        contextMenu.add(new Separator("additions"));
        contextMenu.setRemoveAllWhenShown(true);

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

    /**
     * @param viewer the viewer that will have EMF drag-and-drop support
     */
    protected void addEmfDragAndDropSupport(StructuredViewer viewer) {
        int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
        Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };
        viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
        viewer.addDropSupport(dndOperations, transfers,
                new EditingDomainViewerDropAdapter(getEditingDomain(), viewer));
    }

    /**
     * @param tableViewer The TableViewer that a column will be added to
     * @param text The name of the column. Will show up in the column header.
     * @param width If null, then pack() will be called. If a valid integer, then the column will have this width
     */
    protected void addColumnToTableViewer(TableViewer tableViewer, String text, Integer width) {
        EsxEditorUtil.addColumnToTableViewer(tableViewer, text, width);
    }

    /**
     * @param viewer
     * @param scrollSpeedListener
     * @param scrollSpeed
     * @param useScrollSpeed
     * @return
     */
    protected TableScrollSpeedListener syncScrollSpeedWithPreference(TableViewer viewer,
            TableScrollSpeedListener scrollSpeedListener, Integer scrollSpeed, Boolean useScrollSpeed) {
        if (useScrollSpeed) {
            return enableScrollSpeed(viewer, scrollSpeedListener, scrollSpeed);
        } else {
            return disableScrollSpeed(viewer, scrollSpeedListener);
        }
    }

    /**
     * @param viewer
     * @param scrollSpeedListener
     * @param scrollSpeed
     * @return
     */
    private TableScrollSpeedListener enableScrollSpeed(TableViewer viewer,
            TableScrollSpeedListener scrollSpeedListener, Integer scrollSpeed) {
        if (scrollSpeedListener == null) {
            disableScrollSpeed(viewer, scrollSpeedListener);
        }
        scrollSpeedListener = new TableScrollSpeedListener(viewer.getTable(), scrollSpeed);
        viewer.getTable().addListener(SWT.MouseDown, scrollSpeedListener);
        viewer.getTable().addListener(SWT.MouseUp, scrollSpeedListener);
        viewer.getTable().addListener(SWT.MouseExit, scrollSpeedListener);
        return scrollSpeedListener;
    }

    /**
     * @param viewer
     * @param scrollSpeedListener
     * @return
     */
    private TableScrollSpeedListener disableScrollSpeed(TableViewer viewer,
            TableScrollSpeedListener scrollSpeedListener) {
        if (scrollSpeedListener != null) {
            viewer.getTable().removeListener(SWT.MouseDown, scrollSpeedListener);
            viewer.getTable().removeListener(SWT.MouseUp, scrollSpeedListener);
            viewer.getTable().removeListener(SWT.MouseExit, scrollSpeedListener);
            scrollSpeedListener = null;
        }
        return scrollSpeedListener;
    }

    /**
     * @return the main TableViewer of this part if one exists, else returns null.
     */
    public TableViewer getTableViewer() {
        return null;
    }

}