| /* |
| * Copyright (c) 2007, 2009 Borland Software Corporation |
| * |
| * 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: |
| * Dmitry Stadnik (Borland) - initial API and implementation |
| */ |
| |
| «IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'» |
| |
| «DEFINE ValidationDecoratorProvider FOR gmfgen::GenDiagram-» |
| «EXPAND xpt::Common::copyright FOR editorGen-» |
| package «providersPackageName»; |
| |
| «EXPAND xpt::Common::generatedClassComment» |
| public class «validationDecoratorProviderClassName» |
| extends org.eclipse.gmf.runtime.common.core.service.AbstractProvider |
| implements org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorProvider { |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private static final String KEY = "validationStatus"; «EXPAND xpt::Common::nonNLS» |
| «IF editorGen.application = null-» |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private static final String MARKER_TYPE = «editorGen.plugin.getActivatorQualifiedClassName()».ID + |
| ".«getValidationDiagnosticMarkerType()»"; «EXPAND xpt::Common::nonNLS» |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private static MarkerObserver fileObserver; |
| «ENDIF-» |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private static java.util.Map/*<String, List<IDecorator>>*/ allDecorators = new java.util.HashMap(); |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void createDecorators(org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget decoratorTarget) { |
| org.eclipse.gef.EditPart editPart = (org.eclipse.gef.EditPart) decoratorTarget.getAdapter(org.eclipse.gef.EditPart.class); |
| if (editPart instanceof org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart || |
| editPart instanceof org.eclipse.gef.editparts.AbstractConnectionEditPart) { |
| Object model = editPart.getModel(); |
| if ((model instanceof org.eclipse.gmf.runtime.notation.View)) { |
| org.eclipse.gmf.runtime.notation.View view = (org.eclipse.gmf.runtime.notation.View) model; |
| if (!(view instanceof org.eclipse.gmf.runtime.notation.Edge) && !view.isSetElement()) { |
| return; |
| } |
| } |
| org.eclipse.gef.EditDomain ed = editPart.getViewer().getEditDomain(); |
| if (!(ed instanceof org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain)) { |
| return; |
| } |
| if (((org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain) ed).getEditorPart() instanceof |
| «editorGen.editor.getQualifiedClassName()») { |
| decoratorTarget.installDecorator(KEY, new StatusDecorator(decoratorTarget)); |
| } |
| } |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public boolean provides(org.eclipse.gmf.runtime.common.core.service.IOperation operation) { |
| if (!(operation instanceof org.eclipse.gmf.runtime.diagram.ui.services.decorator.CreateDecoratorsOperation)) { |
| return false; |
| } |
| org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget decoratorTarget = |
| ((org.eclipse.gmf.runtime.diagram.ui.services.decorator.CreateDecoratorsOperation) operation).getDecoratorTarget(); |
| org.eclipse.gmf.runtime.notation.View view = (org.eclipse.gmf.runtime.notation.View) decoratorTarget.getAdapter( |
| org.eclipse.gmf.runtime.notation.View.class); |
| return view != null && «EXPAND xpt::editor::VisualIDRegistry::modelID».equals(«EXPAND xpt::editor::VisualIDRegistry::getModelIDMethodCall»(view)); |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public static void refreshDecorators(org.eclipse.gmf.runtime.notation.View view) { |
| refreshDecorators(org.eclipse.gmf.runtime.diagram.core.util.ViewUtil.getIdStr(view), view.getDiagram()); |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private static void refreshDecorators(String viewId, org.eclipse.gmf.runtime.notation.Diagram diagram) { |
| final java.util.List decorators = viewId != null ? (java.util.List) allDecorators.get(viewId) : null; |
| if (decorators == null || decorators.isEmpty() || diagram == null) { |
| return; |
| } |
| final org.eclipse.gmf.runtime.notation.Diagram fdiagram = diagram; |
| org.eclipse.ui.PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { |
| |
| public void run() { |
| try { |
| org.eclipse.emf.transaction.util.TransactionUtil.getEditingDomain(fdiagram).runExclusive(new Runnable() { |
| |
| public void run() { |
| for (java.util.Iterator it = decorators.iterator(); it.hasNext();) { |
| org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecorator decorator = |
| (org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecorator) it.next(); |
| decorator.refresh(); |
| } |
| } |
| }); |
| } catch (Exception e) { |
| «editorGen.plugin.getActivatorQualifiedClassName()».getInstance().logError( |
| "Decorator refresh failure", e); «EXPAND xpt::Common::nonNLS» |
| } |
| } |
| }); |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public static class StatusDecorator extends org.eclipse.gmf.runtime.diagram.ui.services.decorator.AbstractDecorator { |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private String viewId; |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public StatusDecorator(org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget decoratorTarget) { |
| super(decoratorTarget); |
| try { |
| final org.eclipse.gmf.runtime.notation.View view = (org.eclipse.gmf.runtime.notation.View) getDecoratorTarget().getAdapter( |
| org.eclipse.gmf.runtime.notation.View.class); |
| org.eclipse.emf.transaction.util.TransactionUtil.getEditingDomain(view).runExclusive(new Runnable() { |
| |
| public void run() { |
| StatusDecorator.this.viewId = view != null ? |
| org.eclipse.gmf.runtime.diagram.core.util.ViewUtil.getIdStr(view) : null; |
| } |
| }); |
| } catch (Exception e) { |
| «editorGen.plugin.getActivatorQualifiedClassName()».getInstance().logError( |
| "ViewID access failure", e); «EXPAND xpt::Common::nonNLS» |
| } |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void refresh() { |
| removeDecoration(); |
| org.eclipse.gmf.runtime.notation.View view = (org.eclipse.gmf.runtime.notation.View) getDecoratorTarget().getAdapter( |
| org.eclipse.gmf.runtime.notation.View.class); |
| if (view == null || view.eResource() == null) { |
| return; |
| } |
| org.eclipse.gef.EditPart editPart = (org.eclipse.gef.EditPart) getDecoratorTarget().getAdapter(org.eclipse.gef.EditPart.class); |
| if (editPart == null || editPart.getViewer() == null) { |
| return; |
| } |
| |
| // query for all the validation markers of the current resource |
| «IF editorGen.application = null-» |
| String elementId = org.eclipse.gmf.runtime.diagram.core.util.ViewUtil.getIdStr(view); |
| if (elementId == null) { |
| return; |
| } |
| int severity = org.eclipse.core.resources.IMarker.SEVERITY_INFO; |
| org.eclipse.core.resources.IMarker foundMarker = null; |
| org.eclipse.core.resources.IResource resource = org.eclipse.emf.workspace.util.WorkspaceSynchronizer.getFile(view.eResource()); |
| if (resource == null || !resource.exists()) { |
| return; |
| } |
| org.eclipse.core.resources.IMarker[] markers = null; |
| try { |
| markers = resource.findMarkers(MARKER_TYPE, true, org.eclipse.core.resources.IResource.DEPTH_INFINITE); |
| } catch (org.eclipse.core.runtime.CoreException e) { |
| «editorGen.plugin.getActivatorQualifiedClassName()».getInstance().logError( |
| "Validation markers refresh failure", e); «EXPAND xpt::Common::nonNLS» |
| } |
| «ELSE-» |
| int severity = org.eclipse.core.runtime.IStatus.INFO; |
| «EXPAND xpt::editor::ValidationMarker::qualifiedClassName» foundMarker = null; |
| «EXPAND xpt::editor::ValidationMarker::qualifiedClassName»[] markers = |
| «EXPAND xpt::editor::ValidationMarker::qualifiedClassName».getMarkers(editPart.getViewer(), viewId); |
| «ENDIF-» |
| if (markers == null || markers.length == 0) { |
| return; |
| } |
| org.eclipse.draw2d.Label toolTip = null; |
| for (int i = 0; i < markers.length; i++) { |
| «IF editorGen.application = null-» |
| org.eclipse.core.resources.IMarker marker = markers[i]; |
| String attribute = marker.getAttribute(org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID, ""); «EXPAND xpt::Common::nonNLS» |
| if (attribute.equals(elementId)) { |
| int nextSeverity = marker.getAttribute(org.eclipse.core.resources.IMarker.SEVERITY, |
| org.eclipse.core.resources.IMarker.SEVERITY_INFO); |
| «ELSE-» |
| «EXPAND xpt::editor::ValidationMarker::qualifiedClassName» marker = markers[i]; |
| int nextSeverity = marker.getStatusSeverity(); |
| «ENDIF-» |
| org.eclipse.swt.graphics.Image nextImage = getImage(nextSeverity); |
| if (foundMarker == null) { |
| foundMarker = marker; |
| toolTip = new org.eclipse.draw2d.Label( |
| «IF editorGen.application = null-» |
| marker.getAttribute(org.eclipse.core.resources.IMarker.MESSAGE, ""), «EXPAND xpt::Common::nonNLS» |
| «ELSE-» |
| marker.getMessage(), |
| «ENDIF-» |
| nextImage); |
| } else { |
| if (toolTip.getChildren().isEmpty()) { |
| org.eclipse.draw2d.Label comositeLabel = new org.eclipse.draw2d.Label(); |
| org.eclipse.draw2d.FlowLayout fl = new org.eclipse.draw2d.FlowLayout(false); |
| fl.setMinorSpacing(0); |
| comositeLabel.setLayoutManager(fl); |
| comositeLabel.add(toolTip); |
| toolTip = comositeLabel; |
| } |
| toolTip.add(new org.eclipse.draw2d.Label( |
| «IF editorGen.application = null-» |
| marker.getAttribute(org.eclipse.core.resources.IMarker.MESSAGE, ""), «EXPAND xpt::Common::nonNLS» |
| «ELSE-» |
| marker.getMessage(), |
| «ENDIF-» |
| nextImage)); |
| } |
| severity = (nextSeverity > severity) ? nextSeverity : severity; |
| «IF editorGen.application = null-» |
| } |
| «ENDIF-» |
| } |
| if (foundMarker == null) { |
| return; |
| } |
| |
| // add decoration |
| if (editPart instanceof org.eclipse.gef.GraphicalEditPart) { |
| if (view instanceof org.eclipse.gmf.runtime.notation.Edge) { |
| setDecoration(getDecoratorTarget().addConnectionDecoration(getImage(severity), 50, true)); |
| } else { |
| int margin = -1; |
| if (editPart instanceof org.eclipse.gef.GraphicalEditPart) { |
| margin = org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeUtil.getMapMode( |
| ((org.eclipse.gef.GraphicalEditPart) editPart).getFigure()).DPtoLP(margin); |
| } |
| setDecoration(getDecoratorTarget().addShapeDecoration(getImage(severity), |
| org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget.Direction.NORTH_EAST, margin, true)); |
| } |
| getDecoration().setToolTip(toolTip); |
| } |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private org.eclipse.swt.graphics.Image getImage(int severity) { |
| String imageName = org.eclipse.ui.ISharedImages.IMG_OBJS_ERROR_TSK; |
| switch (severity) { |
| «IF editorGen.application = null-» |
| case org.eclipse.core.resources.IMarker.SEVERITY_ERROR: |
| imageName = org.eclipse.ui.ISharedImages.IMG_OBJS_ERROR_TSK; |
| break; |
| case org.eclipse.core.resources.IMarker.SEVERITY_WARNING: |
| imageName = org.eclipse.ui.ISharedImages.IMG_OBJS_WARN_TSK; |
| break; |
| «ELSE-» |
| case org.eclipse.core.runtime.IStatus.ERROR: |
| imageName = org.eclipse.ui.ISharedImages.IMG_OBJS_ERROR_TSK; |
| break; |
| case org.eclipse.core.runtime.IStatus.WARNING: |
| imageName = org.eclipse.ui.ISharedImages.IMG_OBJS_WARN_TSK; |
| break; |
| «ENDIF-» |
| default: |
| imageName = org.eclipse.ui.ISharedImages.IMG_OBJS_INFO_TSK; |
| } |
| return org.eclipse.ui.PlatformUI.getWorkbench().getSharedImages().getImage(imageName); |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void activate() { |
| if (viewId == null) { |
| return; |
| } |
| |
| // add self to global decorators registry |
| java.util.List list = (java.util.List) allDecorators.get(viewId); |
| if (list == null) { |
| list = new java.util.ArrayList(2); |
| list.add(this); |
| allDecorators.put(viewId, list); |
| } else if (!list.contains(this)) { |
| list.add(this); |
| } |
| «IF editorGen.application = null-» |
| |
| // start listening to changes in resources |
| org.eclipse.gmf.runtime.notation.View view = (org.eclipse.gmf.runtime.notation.View) getDecoratorTarget().getAdapter( |
| org.eclipse.gmf.runtime.notation.View.class); |
| if (view == null) { |
| return; |
| } |
| org.eclipse.gmf.runtime.notation.Diagram diagramView = view.getDiagram(); |
| if (diagramView == null) { |
| return; |
| } |
| if (fileObserver == null) { |
| org.eclipse.gmf.runtime.common.ui.resources.FileChangeManager.getInstance().addFileObserver( |
| fileObserver = new MarkerObserver(diagramView)); |
| } |
| «ENDIF-» |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void deactivate() { |
| if (viewId == null) { |
| return; |
| } |
| |
| // remove self from global decorators registry |
| java.util.List list = (java.util.List) allDecorators.get(viewId); |
| if (list != null) { |
| list.remove(this); |
| if (list.isEmpty()) { |
| allDecorators.remove(viewId); |
| } |
| } |
| «IF editorGen.application = null-» |
| |
| // stop listening to changes in resources if there are no more decorators |
| if (fileObserver != null && allDecorators.isEmpty()) { |
| org.eclipse.gmf.runtime.common.ui.resources.FileChangeManager.getInstance().removeFileObserver(fileObserver); |
| fileObserver = null; |
| } |
| «ENDIF-» |
| super.deactivate(); |
| } |
| } |
| «IF editorGen.application = null-» |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| static class MarkerObserver implements org.eclipse.gmf.runtime.common.ui.resources.IFileObserver { |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private org.eclipse.gmf.runtime.notation.Diagram diagram; |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private MarkerObserver(org.eclipse.gmf.runtime.notation.Diagram diagram) { |
| this.diagram = diagram; |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void handleFileRenamed(org.eclipse.core.resources.IFile oldFile, org.eclipse.core.resources.IFile file) { |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void handleFileMoved(org.eclipse.core.resources.IFile oldFile, org.eclipse.core.resources.IFile file) { |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void handleFileDeleted(org.eclipse.core.resources.IFile file) { |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void handleFileChanged(org.eclipse.core.resources.IFile file) { |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void handleMarkerAdded(org.eclipse.core.resources.IMarker marker) { |
| if (marker.getAttribute(org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID, null) != null) { |
| handleMarkerChanged(marker); |
| } |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void handleMarkerDeleted(org.eclipse.core.resources.IMarker marker, java.util.Map attributes) { |
| String viewId = (String) attributes.get(org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID); |
| refreshDecorators(viewId, diagram); |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| public void handleMarkerChanged(org.eclipse.core.resources.IMarker marker) { |
| if (!MARKER_TYPE.equals(getType(marker))) { |
| return; |
| } |
| String viewId = marker.getAttribute( |
| org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID, ""); «EXPAND xpt::Common::nonNLS» |
| refreshDecorators(viewId, diagram); |
| } |
| |
| «EXPAND xpt::Common::generatedMemberComment» |
| private String getType(org.eclipse.core.resources.IMarker marker) { |
| try { |
| return marker.getType(); |
| } catch (org.eclipse.core.runtime.CoreException e) { |
| «editorGen.plugin.getActivatorQualifiedClassName()».getInstance().logError( |
| "Validation marker refresh failure", e); «EXPAND xpt::Common::nonNLS» |
| return ""; «EXPAND xpt::Common::nonNLS» |
| } |
| } |
| } |
| «ENDIF-» |
| «EXPAND additions-» |
| } |
| «ENDDEFINE» |
| |
| «DEFINE additions FOR gmfgen::GenDiagram»«ENDDEFINE» |