/* * Copyright (c) 2006, 2010 Borland Software 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: * Alexander Shatalin (Borland) - initial API and implementation */ package org.eclipse.gmf.tests.setup; import java.lang.reflect.Field; import org.junit.Assert; import org.eclipse.draw2d.DelegatingLayout; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.LayeredPane; import org.eclipse.draw2d.ScalableLayeredPane; import org.eclipse.draw2d.geometry.Translatable; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartFactory; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.gef.editparts.ScalableRootEditPart; import org.eclipse.gmf.codegen.gmfgen.GenDiagram; import org.eclipse.gmf.gmfgraph.BasicFont; import org.eclipse.gmf.gmfgraph.Font; import org.eclipse.gmf.gmfgraph.FontStyle; import org.eclipse.gmf.gmfgraph.GMFGraphFactory; import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramCommandStack; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain; import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants; import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; public abstract class AbstractGeneratorConfiguration implements GeneratorConfiguration, ViewerConfiguration.Factory { public ViewerConfiguration createViewerConfiguration(Composite parent, Diagram canvas, GeneratedDiagramPlugin genPlugin) { try { EditPartViewer viewer = createViewer(parent, canvas, genPlugin); return createViewerConfiguration(viewer, genPlugin); } catch (Exception ex) { Assert.fail(ex.toString()); } return null; } public EditPartViewer createViewer(Composite parent, Diagram canvas, GeneratedDiagramPlugin genPlugin) throws Exception { // make sure there's display for current thread Display.getDefault(); EditPartViewer gv = createViewerInstance(); gv.createControl(parent); DiagramEditDomain ded = new DiagramEditDomain(null); gv.setEditDomain(ded); gv.getEditDomain().setCommandStack(new DiagramCommandStack(ded)); String epFactoryClassName = genPlugin.getGenDiagram().getEditPartFactoryQualifiedClassName(); Class<?> epFactory = genPlugin.loadGeneratedClass(epFactoryClassName); assert EditPartFactory.class.isAssignableFrom(epFactory); gv.setEditPartFactory((EditPartFactory) epFactory.newInstance()); gv.setContents(canvas); return gv; } protected abstract EditPartViewer createViewerInstance(); protected static abstract class AbstractViewerConfiguration implements ViewerConfiguration { private final EditPartViewer myViewer; private final GeneratedDiagramPlugin myGeneratedPlugin; private PreferencesHint myDefaultPreferences; public AbstractViewerConfiguration(EditPartViewer viewer, GeneratedDiagramPlugin genPlugin) { myViewer = viewer; myGeneratedPlugin = genPlugin; } public EditPartViewer getViewer() { return myViewer; } public EditPart findEditPart(View notationElement) { return (EditPart) myViewer.getEditPartRegistry().get(notationElement); } public Font getDefaultFont() { BasicFont result = GMFGraphFactory.eINSTANCE.createBasicFont(); FontData defaultFontData = PreferenceConverter.getDefaultFontData(getDefaultPreferences(), IPreferenceConstants.PREF_DEFAULT_FONT); result.setFaceName(defaultFontData.getName()); result.setHeight(defaultFontData.getHeight()); result.setStyle(FontStyle.get(defaultFontData.getStyle())); return result; } protected final Class<?> loadGeneratedClass(String qualifiedClassName) throws Exception { return myGeneratedPlugin.loadGeneratedClass(qualifiedClassName); } protected GenDiagram getGenModel() { return myGeneratedPlugin.getGenDiagram(); } protected IPreferenceStore getDefaultPreferences() { return (IPreferenceStore) getDefaultPreferencesHint().getPreferenceStore(); } protected PreferencesHint getDefaultPreferencesHint() { if (myDefaultPreferences == null){ try { Class<?> activatorClazz = loadGeneratedClass(myGeneratedPlugin.getGenDiagram().getEditorGen().getPlugin().getActivatorQualifiedClassName()); Field field = activatorClazz.getField("DIAGRAM_PREFERENCES_HINT"); myDefaultPreferences = (PreferencesHint)field.get(null); } catch (Exception e) { myDefaultPreferences = PreferencesHint.USE_DEFAULTS; } } return myDefaultPreferences; } } // TODO: Merge with NoUpdateViewer protected static abstract class AbstractFakeViewer extends NoUpdateViewer { protected void createDefaultRoot() { // Important for MapModeUtil.getMapMode() method implementation. setRootEditPart(new ScalableRootEditPart() { protected ScalableLayeredPane createScaledLayers() { class LayeredPane extends ScalableLayeredPane implements IMapMode { public int DPtoLP(int deviceUnit) { return deviceUnit; } public Translatable DPtoLP(Translatable t) { t.performScale(1.0); return t; } public int LPtoDP(int logicalUnit) { return logicalUnit; } public Translatable LPtoDP(Translatable t) { t.performScale(1.0); return t; } } ScalableLayeredPane layers = new LayeredPane(); layers.add(createGridLayer(), GRID_LAYER); layers.add(getPrintableLayers(), PRINTABLE_LAYERS); FreeformLayer feedbackLayer = new FreeformLayer(); feedbackLayer.setEnabled(false); layers.add(feedbackLayer, SCALED_FEEDBACK_LAYER); return layers; } }); //code from <...>GenDiagramEditor -- required to work with external labels LayerManager root = (LayerManager) getRootEditPart(); LayeredPane printableLayers = (LayeredPane) root.getLayer(LayerConstants.PRINTABLE_LAYERS); FreeformLayer extLabelsLayer = new FreeformLayer(); extLabelsLayer.setLayoutManager(new DelegatingLayout()); printableLayers.addLayerAfter(extLabelsLayer, "External Node Labels", LayerConstants.PRIMARY_LAYER); } } }