org.yakindu.sct.ui.editor.propertysheets.AbstractEditorPropertySection.java Source code

Java tutorial

Introduction

Here is the source code for org.yakindu.sct.ui.editor.propertysheets.AbstractEditorPropertySection.java

Source

/**
 * Copyright (c) 2011 committers of YAKINDU 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:
 *    committers of YAKINDU - initial API and implementation
 * 
 */
package org.yakindu.sct.ui.editor.propertysheets;

import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.ui.properties.sections.AbstractModelerPropertySection;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.dialogs.IDialogLabelKeys;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.help.IWorkbenchHelpSystem;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.yakindu.base.xtext.utils.jface.fieldassist.CompletionProposalAdapter;
import org.yakindu.base.xtext.utils.jface.viewers.FilteringMenuManager;
import org.yakindu.base.xtext.utils.jface.viewers.StyledTextXtextAdapter;
import org.yakindu.base.xtext.utils.jface.viewers.util.ActiveEditorTracker;
import org.yakindu.sct.domain.extension.DomainRegistry;
import org.yakindu.sct.domain.extension.IDomain;
import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
import org.yakindu.sct.model.sgraph.util.ContextElementAdapter.IContextElementProvider;
import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;

import com.google.inject.Injector;

/**
 * 
 * @author andreas muelder - Initial contribution and API
 * 
 */
public abstract class AbstractEditorPropertySection extends AbstractModelerPropertySection
        implements IContextElementProvider {

    public abstract void createControls(Composite parent);

    public abstract void bindModel(EMFDataBindingContext context);

    private FormToolkit toolkit;

    private EMFDataBindingContext bindingContext;

    private Form form;

    private CompletionProposalAdapter completionProposalAdapter;

    public final static String CONTEXTMENUID = "org.yakindu.base.xtext.utils.jface.viewers.StyledTextXtextAdapterContextMenu";

    @Override
    public void refresh() {
        super.refresh();
        if (bindingContext != null)
            bindingContext.dispose();
        bindingContext = new ValidatingEMFDatabindingContext(this, form.getShell());
        bindModel(bindingContext);
    }

    @Override
    public void dispose() {
        super.dispose();
        if (bindingContext != null)
            bindingContext.dispose();
        if (toolkit != null)
            toolkit.dispose();
    }

    @Override
    public final void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) {
        toolkit = new FormToolkit(parent.getDisplay());
        toolkit.setBorderStyle(SWT.BORDER);
        super.createControls(parent, aTabbedPropertySheetPage);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(parent);
        parent.setLayout(new GridLayout(1, true));
        form = toolkit.createForm(parent);
        toolkit.decorateFormHeading(form);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(form);
        form.getBody().setLayout(createBodyLayout());
        createControls(form.getBody());
    }

    protected Layout createBodyLayout() {
        return new GridLayout(1, false);
    }

    public FormToolkit getToolkit() {
        return toolkit;
    }

    protected void enableXtext(Control styledText, Injector injector) {
        final StyledTextXtextAdapter xtextAdapter = new StyledTextXtextAdapter(injector);
        xtextAdapter.getFakeResourceContext().getFakeResource().eAdapters().add(new ContextElementAdapter(this));
        xtextAdapter.adapt((StyledText) styledText);

        initContextMenu(styledText);

        completionProposalAdapter = new CompletionProposalAdapter(styledText, xtextAdapter.getContentAssistant(),
                KeyStroke.getInstance(SWT.CTRL, SWT.SPACE), null);
    }

    protected void initContextMenu(Control control) {
        MenuManager menuManager = new FilteringMenuManager();
        Menu contextMenu = menuManager.createContextMenu(control);
        control.setMenu(contextMenu);
        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        IWorkbenchPartSite site = window.getActivePage().getActiveEditor().getSite();
        site.registerContextMenu(CONTEXTMENUID, menuManager, site.getSelectionProvider());
    }

    public CompletionProposalAdapter getCompletionProposalAdapter() {
        return completionProposalAdapter;
    }

    protected Injector getInjector(String semanticTarget) {
        IEditorPart editor = ActiveEditorTracker.getLastActiveEditor();
        if (editor instanceof StatechartDiagramEditor) {
            IDomain domain = DomainRegistry.getDomain(((StatechartDiagramEditor) editor).getDiagram().getElement());
            return domain.getInjector(IDomain.FEATURE_EDITOR, semanticTarget);
        }
        throw new IllegalArgumentException("Unknown editor " + editor);

    }

    public EObject getContextObject() {
        return getEObject();
    }

    protected void createHelpWidget(final Composite parent, final Control control, String helpId) {
        final ImageHyperlink helpWidget = toolkit.createImageHyperlink(parent, SWT.CENTER);
        Image defaultImage = PlatformUI.getWorkbench().getSharedImages()
                .getImage(ISharedImages.IMG_LCL_LINKTO_HELP);
        helpWidget.setImage(defaultImage);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(helpWidget);
        helpWidget.setToolTipText(JFaceResources.getString(IDialogLabelKeys.HELP_LABEL_KEY));
        helpWidget.addMouseListener(new MouseAdapter() {
            public void mouseDown(MouseEvent e) {
                control.setFocus();
                PlatformUI.getWorkbench().getHelpSystem().displayDynamicHelp();
            }
        });
        GridDataFactory.fillDefaults().applyTo(helpWidget);
        helpWidget.setEnabled(true);
        setHelpContext(control, helpId);
    }

    protected void setHelpContext(Control control, String helpId) {
        IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem();
        helpSystem.setHelp(control, helpId);
    }

}