package org.eclipse.papyrus.uml.diagram.sequence.apex.part;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.diagram.core.listener.DiagramEventBroker;
import org.eclipse.gmf.runtime.diagram.core.listener.NotificationListener;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.papyrus.uml.diagram.sequence.apex.part.tweaks.TweakItem;
import org.eclipse.papyrus.uml.diagram.sequence.apex.part.tweaks.TweakViewer;
import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.InteractionInteractionCompartmentEditPart;
import org.eclipse.swt.widgets.Composite;
public class SequenceTweakViewer extends TweakViewer {
private final NotificationListenerImpl fNotificationListener = new NotificationListenerImpl();
private TransactionalEditingDomain fEditingDomain;
private IDiagramGraphicalViewer fViewer;
private Viewport fViewport;
public SequenceTweakViewer(Composite parent, int style) {
super(parent, style);
}
public SequenceTweakViewer(Composite parent, int style, DiagramEditor editor) {
super(parent, style);
fEditingDomain = editor.getEditingDomain();
fViewer = editor.getDiagramGraphicalViewer();
}
@Override
protected void hookTweakItems(List<TweakItem> items) {
for (TweakItem item : items) {
if (item.getData() instanceof EObject) {
EObject view = (EObject)item.getData();
DiagramEventBroker broker = DiagramEventBroker.getInstance(fEditingDomain);
broker.addNotificationListener(view, fNotificationListener);
}
if (item.getData() instanceof IGraphicalEditPart) {
IGraphicalEditPart editPart = (IGraphicalEditPart)item.getData();
// EObject element = editPart.resolveSemanticElement();
EObject view = editPart.getNotationView();
DiagramEventBroker broker = DiagramEventBroker.getInstance(editPart.getEditingDomain());
// broker.addNotificationListener(element, fNotificationListener);
broker.addNotificationListener(view, fNotificationListener);
}
}
}
@Override
protected void unhookTweakItems(List<TweakItem> items) {
for (TweakItem item : items) {
if (item.getData() instanceof EObject) {
EObject view = (EObject)item.getData();
DiagramEventBroker broker = DiagramEventBroker.getInstance(fEditingDomain);
broker.removeNotificationListener(view, fNotificationListener);
}
if (item.getData() instanceof IGraphicalEditPart) {
IGraphicalEditPart editPart = (IGraphicalEditPart)item.getData();
// EObject element = editPart.resolveSemanticElement();
EObject view = editPart.getNotationView();
DiagramEventBroker broker = DiagramEventBroker.getInstance(editPart.getEditingDomain());
// broker.removeNotificationListener(element, fNotificationListener);
broker.removeNotificationListener(view, fNotificationListener);
}
}
}
@Override
public int getHorizontalOffset() {
if (fViewport == null && fViewer != null) {
Map registry = fViewer.getEditPartRegistry();
for (Iterator iterator = registry.keySet().iterator(); iterator.hasNext(); ) {
Object key = iterator.next();
Object value = registry.get(key);
if (value instanceof InteractionInteractionCompartmentEditPart) {
InteractionInteractionCompartmentEditPart editPart = (InteractionInteractionCompartmentEditPart)value;
ResizableCompartmentFigure compartmentFigure = editPart.getCompartmentFigure();
fViewport = compartmentFigure.getScrollPane().getViewport();
break;
}
}
}
if (fViewport != null) {
Rectangle bounds = fViewport.getBounds().getCopy();
fViewport.translateToAbsolute(bounds);
return bounds.x;
}
return super.getHorizontalOffset();
}
private class NotificationListenerImpl implements NotificationListener {
public void notifyChanged(Notification notification) {
Object feature = notification.getFeature();
if (NotationPackage.eINSTANCE.getLocation_X().equals(feature)) {
refresh();
} else if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)) {
refresh();
}
}
}
}