/** * 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); } }