/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.diagram.factories;
import gov.redhawk.diagram.edit.parts.DomainFinderEditPart;
import gov.redhawk.diagram.edit.parts.DomainFinderNameEditPart;
import gov.redhawk.diagram.edit.parts.DomainFinderTypeEditPart;
import gov.redhawk.diagram.edit.parts.FindByStubCompartmentEditPart;
import gov.redhawk.diagram.edit.parts.FindByStubEditPart;
import gov.redhawk.diagram.edit.parts.FindByStubNameEditPart;
import gov.redhawk.diagram.edit.parts.NamingServiceEditPart;
import gov.redhawk.diagram.edit.parts.NamingServiceNameEditPart;
import gov.redhawk.diagram.part.PartitioningVisualIDRegistry;
import gov.redhawk.diagram.part.PartitioningVisualIDRegistry.MAPPING_ID;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.core.view.factories.ViewFactory;
import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
import org.eclipse.gmf.runtime.notation.DecorationNode;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.FontStyle;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.NotationFactory;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.Routing;
import org.eclipse.gmf.runtime.notation.RoutingStyle;
import org.eclipse.gmf.runtime.notation.Shape;
import org.eclipse.gmf.runtime.notation.Smoothness;
import org.eclipse.gmf.runtime.notation.Style;
import org.eclipse.gmf.runtime.notation.TitleStyle;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.FontData;
/**
* @since 3.0
*
*/
public class PartitioningViewFactory implements ViewFactory {
private final PartitioningVisualIDRegistry visualIdRegistry;
private final IPartitioningViewFactory basicViewProvider;
public PartitioningViewFactory(final PartitioningVisualIDRegistry visualIdRegistry, final IPartitioningViewFactory basicViewProvider) {
this.visualIdRegistry = visualIdRegistry;
this.basicViewProvider = basicViewProvider;
}
@Override
public View createView(final IAdaptable semanticAdapter, final View containerView, final String semanticHint, final int index, final boolean persisted,
final PreferencesHint preferencesHint) {
final int visualId = this.visualIdRegistry.getVisualID(semanticHint);
final EObject domainElement = (EObject) semanticAdapter.getAdapter(EObject.class);
switch (visualId) {
case FindByStubEditPart.VISUAL_ID:
return createFindByStub(domainElement, containerView, index, persisted, preferencesHint);
case DomainFinderEditPart.VISUAL_ID:
return createDomainFinder(domainElement, containerView, index, persisted, preferencesHint);
case NamingServiceEditPart.VISUAL_ID:
return createNamingService(domainElement, containerView, index, persisted, preferencesHint);
default:
final MAPPING_ID mappingId = this.visualIdRegistry.getMappingID(visualId);
if (mappingId != null) {
switch (mappingId) {
case ConnectInterfaceEditPart:
return createConnectInterface(domainElement, containerView, index, persisted, preferencesHint);
case ComponentPlacementEditPart:
return this.basicViewProvider.basicCreateComponentPlacement(domainElement, containerView, index, persisted, preferencesHint);
case ComponentSupportedInterfaceStubEditPart:
return this.basicViewProvider.basicCreateComponentSupportedInterfaceStub(domainElement, containerView, index, persisted, preferencesHint);
case ProvidesPortStubEditPart:
return this.basicViewProvider.basicCreateProvidesPortStub(domainElement, containerView, index, persisted, preferencesHint);
case UsesPortStubEditPart:
return this.basicViewProvider.basicCreateUsesPortStub(domainElement, containerView, index, persisted, preferencesHint);
default:
break;
}
}
}
return null;
}
public Edge createConnectInterface(final EObject domainElement, final View containerView, final int index, final boolean persisted, // SUPPRESS CHECKSTYLE methodName
final PreferencesHint preferencesHint) {
final Edge retVal = this.basicViewProvider.basicCreateConnectInterface(domainElement, containerView, index, persisted, preferencesHint);
final Style style = retVal.getStyle(NotationPackage.eINSTANCE.getRoutingStyle());
if (style instanceof RoutingStyle) {
final RoutingStyle routingStyle = (RoutingStyle) style;
routingStyle.setAvoidObstructions(true);
routingStyle.setRouting(Routing.RECTILINEAR_LITERAL);
routingStyle.setSmoothness(Smoothness.NONE_LITERAL);
}
return retVal;
}
public Node createFindByStub(final EObject domainElement, final View containerView, final int index, final boolean persisted,
final PreferencesHint preferencesHint) {
final Shape node = NotationFactory.eINSTANCE.createShape();
node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
node.setType(this.visualIdRegistry.getType(FindByStubEditPart.VISUAL_ID));
ViewUtil.insertChildView(containerView, node, index, persisted);
node.setElement(domainElement);
stampShortcut(containerView, node);
// initializeFromPreferences
final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
final org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
final FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
if (nodeFontStyle != null) {
final FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
nodeFontStyle.setFontName(fontData.getName());
nodeFontStyle.setFontHeight(fontData.getHeight());
nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
final org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
}
final org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
createCompartment(node, this.visualIdRegistry.getType(FindByStubCompartmentEditPart.VISUAL_ID), false, false, true, true);
createLabel(node, this.visualIdRegistry.getType(FindByStubNameEditPart.VISUAL_ID));
return node;
}
public Node createNamingService(final EObject domainElement, final View containerView, final int index, final boolean persisted,
final PreferencesHint preferencesHint) {
final Shape node = NotationFactory.eINSTANCE.createShape();
node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
node.setType(this.visualIdRegistry.getType(NamingServiceEditPart.VISUAL_ID));
ViewUtil.insertChildView(containerView, node, index, persisted);
node.setElement(domainElement);
// initializeFromPreferences
final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
final org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
final FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
if (nodeFontStyle != null) {
final FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
nodeFontStyle.setFontName(fontData.getName());
nodeFontStyle.setFontHeight(fontData.getHeight());
nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
final org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
}
final org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
createLabel(node, this.visualIdRegistry.getType(NamingServiceNameEditPart.VISUAL_ID));
return node;
}
public Node createDomainFinder(final EObject domainElement, final View containerView, final int index, final boolean persisted,
final PreferencesHint preferencesHint) {
final Shape node = NotationFactory.eINSTANCE.createShape();
node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
node.setType(this.visualIdRegistry.getType(DomainFinderEditPart.VISUAL_ID));
ViewUtil.insertChildView(containerView, node, index, persisted);
node.setElement(domainElement);
// initializeFromPreferences
final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
final org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
final FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
if (nodeFontStyle != null) {
final FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
nodeFontStyle.setFontName(fontData.getName());
nodeFontStyle.setFontHeight(fontData.getHeight());
nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
final org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
}
final org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
createLabel(node, this.visualIdRegistry.getType(DomainFinderNameEditPart.VISUAL_ID));
createLabel(node, this.visualIdRegistry.getType(DomainFinderTypeEditPart.VISUAL_ID));
return node;
}
@SuppressWarnings("unchecked")
private Node createCompartment(final View owner, final String hint, final boolean canCollapse, final boolean hasTitle, final boolean canSort,
final boolean canFilter) {
//SemanticListCompartment rv = NotationFactory.eINSTANCE.createSemanticListCompartment();
//rv.setShowTitle(showTitle);
//rv.setCollapsed(isCollapsed);
Node rv;
if (canCollapse) {
rv = NotationFactory.eINSTANCE.createBasicCompartment();
} else {
rv = NotationFactory.eINSTANCE.createDecorationNode();
}
if (hasTitle) {
final TitleStyle ts = NotationFactory.eINSTANCE.createTitleStyle();
ts.setShowTitle(true);
rv.getStyles().add(ts);
}
if (canSort) {
rv.getStyles().add(NotationFactory.eINSTANCE.createSortingStyle());
}
if (canFilter) {
rv.getStyles().add(NotationFactory.eINSTANCE.createFilteringStyle());
}
rv.setType(hint);
ViewUtil.insertChildView(owner, rv, ViewUtil.APPEND, true);
return rv;
}
private Node createLabel(final View owner, final String hint) {
final DecorationNode rv = NotationFactory.eINSTANCE.createDecorationNode();
rv.setType(hint);
ViewUtil.insertChildView(owner, rv, ViewUtil.APPEND, true);
return rv;
}
private void stampShortcut(final View containerView, final Node target) {
if (!this.visualIdRegistry.getModelID().equals(this.visualIdRegistry.getModelID(containerView))) {
final EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
shortcutAnnotation.getDetails().put("modelID", this.visualIdRegistry.getModelID()); //$NON-NLS-1$
target.getEAnnotations().add(shortcutAnnotation);
}
}
}