package org.eclipse.papyrus.uml.diagram.sequence.apex.part;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.RangeModel;
import org.eclipse.draw2d.Viewport;
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.parts.IDiagramGraphicalViewer;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.papyrus.uml.diagram.common.util.DiagramEditPartsUtil;
import org.eclipse.papyrus.uml.diagram.sequence.apex.part.tweaks.EditorTweak;
import org.eclipse.papyrus.uml.diagram.sequence.apex.part.tweaks.TweakStyledLabelProvider;
import org.eclipse.papyrus.uml.diagram.sequence.apex.part.tweaks.TweakViewer;
import org.eclipse.papyrus.uml.diagram.sequence.part.UMLDiagramEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class SequenceEditorTweak extends EditorTweak implements PropertyChangeListener, NotificationListener {
private TweakViewer fViewer;
public SequenceEditorTweak(UMLDiagramEditor editorPart) {
super(editorPart);
}
public void init() {
IDiagramGraphicalViewer viewer = getDiagramEditor().getDiagramGraphicalViewer();
Control control = viewer.getControl();
if (control instanceof FigureCanvas) {
FigureCanvas canvas = (FigureCanvas)control;
canvas.getViewport().getHorizontalRangeModel().addPropertyChangeListener(this);
}
Diagram diagram = getDiagramEditor().getDiagram();
List<View> views = DiagramEditPartsUtil.findViews(diagram.getElement(), viewer);
for (View view : views) {
addNotificationListener(view, this);
}
}
@Override
protected TweakViewer createViewer(Composite parent) {
fViewer = new SequenceTweakViewer(parent, SWT.HORIZONTAL, getDiagramEditor());
fViewer.setLabelProvider(createLabelProvider());
fViewer.setContentProvider(createContentProvider());
fViewer.setToolTipLabelProvider(createTooltipLabelProvider());
return fViewer;
}
@Override
protected Object getCurrentInput() {
return getDiagramEditor().getDiagram();
}
@Override
public void setInput(Object element) {
if (element == null) {
element = getCurrentInput();
}
super.setInput(element);
}
@Override
protected boolean open(Object element) {
return false;
}
@Override
protected boolean reveal(Object element) {
return false;
}
@Override
protected void activateTweak() {
}
@Override
protected void deactivateTweak() {
}
private ILabelProvider createLabelProvider() {
// AdapterFactoryLabelProvider adapterFactoryLabelProvider = new AdapterFactoryLabelProvider(UMLDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory());
// SequenceTweakStyledLabelProvider labelProvider = new SequenceTweakStyledLabelProvider(adapterFactoryLabelProvider);
LifelineLabelProvider lifelineLabelProvider = new LifelineLabelProvider();
TweakStyledLabelProvider labelProvider = new TweakStyledLabelProvider(lifelineLabelProvider);
return new DecoratingSequenceLabelProvider(labelProvider);
}
private IContentProvider createContentProvider() {
return new SequenceTweakContentProvider(getDiagramEditor().getDiagramGraphicalViewer());
}
private ILabelProvider createTooltipLabelProvider() {
return null;
}
public void propertyChange(PropertyChangeEvent evt) {
RangeModel model = null;
if (evt.getSource() instanceof RangeModel) {
model = (RangeModel)evt.getSource();
} else if (evt.getSource() instanceof Viewport) {
if (Viewport.PROPERTY_VIEW_LOCATION.equals(evt.getPropertyName())) {
Viewport viewport = (Viewport)evt.getSource();
model = viewport.getHorizontalRangeModel();
}
}
if (model != null) {
refreshViewer(false);
}
}
private DiagramEventBroker getDiagramEventBroker() {
TransactionalEditingDomain editingDomain = getEditingDomain();
if (editingDomain != null) {
return DiagramEventBroker.getInstance(editingDomain);
}
return null;
}
protected void addNotificationListener(EObject target, NotificationListener listener) {
DiagramEventBroker diagramEventBroker = getDiagramEventBroker();
if (diagramEventBroker != null) {
diagramEventBroker.addNotificationListener(target, listener);
}
}
protected void removeNotificationListener(EObject target, NotificationListener listener) {
DiagramEventBroker diagramEventBroker = getDiagramEventBroker();
if (diagramEventBroker != null) {
diagramEventBroker.removeNotificationListener(target, listener);
}
}
public void notifyChanged(Notification notification) {
Object notifier = notification.getNotifier();
if (notifier instanceof View) {
EObject parentElement = ((View)notifier).getElement();
if (Notification.ADD == notification.getEventType()) {
if (notification.getNewValue() instanceof View) {
View newView = (View)notification.getNewValue();
if (!parentElement.equals(newView.getElement())) {
addNotificationListener(newView, this);
}
}
} else if (Notification.REMOVE == notification.getEventType()) {
if (notification.getOldValue() instanceof View) {
View oldView = (View)notification.getOldValue();
removeNotificationListener(oldView, this);
refreshViewer(true);
}
}
}
Object feature = notification.getFeature();
if (NotationPackage.eINSTANCE.getLocation_X().equals(feature) ||
NotationPackage.eINSTANCE.getSize_Width().equals(feature)) {
refreshViewer(true);
} else if (NotationPackage.eINSTANCE.getNode_LayoutConstraint().equals(feature)) {
refreshViewer(true);
}
}
}