/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.ui.pages.editor.edit;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.FreeformViewport;
import org.eclipse.draw2d.IFigure;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.CompoundSnapToHelper;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.Request;
import org.eclipse.gef.SnapToGeometry;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.SnapToGuides;
import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.requests.SelectionRequest;
import org.eclipse.gef.rulers.RulerProvider;
import org.eclipse.gef.tools.DeselectAllTracker;
import org.eclipse.gef.tools.MarqueeDragTracker;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.jboss.tools.common.model.event.XModelTreeEvent;
import org.jboss.tools.common.model.event.XModelTreeListener;
import org.jboss.tools.common.model.options.PreferenceModelUtilities;
import org.jboss.tools.seam.pages.xml.model.SeamPagesPreference;
import org.jboss.tools.seam.ui.pages.editor.ecore.pages.Page;
import org.jboss.tools.seam.ui.pages.editor.ecore.pages.PagesModel;
import org.jboss.tools.seam.ui.pages.editor.ecore.pages.PagesModelListener;
import org.jboss.tools.seam.ui.pages.editor.figures.DiagramFigure;
public class PagesDiagramEditPart extends ContainerEditPart implements
LayerConstants, PagesModelListener, Adapter, XModelTreeListener{
/*
*
*/
private DiagramFigure fig;
/**
* Public constructor
* @return
*/
public boolean isGridVisible() {
return SeamPagesPreference.SHOW_GRID.getValue().equals("yes");
}
/**
*
* @return
*/
public int getVisualGridStep() {
return Integer.parseInt(SeamPagesPreference.GRID_STEP.getValue());
}
/**
*
*/
public void setModel(Object model) {
super.setModel(model);
}
/**
*
*/
public PagesModel getPagesModel() {
return (PagesModel) getModel();
}
/**
*
*/
public boolean isStrutsModelListenerEnabled() {
return true;
}
/**
*
* @param editPart
*/
public void setToFront(EditPart editPart) {
int index = getChildren().indexOf(editPart);
if (index == -1)
return;
if (index != getChildren().size() - 1)
reorderChild(editPart, getChildren().size() - 1);
}
protected AccessibleEditPart createAccessible() {
return new AccessibleGraphicalEditPart() {
public void getName(AccessibleEvent event) {
event.result = "Pages Diagram";
}
};
}
/**
* Installs edit policies for this part.
*/
protected void createEditPolicies() {
super.createEditPolicies();
installEditPolicy(EditPolicy.NODE_ROLE, null);
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
installEditPolicy(EditPolicy.COMPONENT_ROLE, new PagesDiagramEditPolicy());
}
/**
* Returns a figure
*
* @return Figure.
*/
protected IFigure createFigure() {
fig = new DiagramFigure(this);
return fig;
}
/**
*
* @return
*/
public FreeformViewport getFreeformViewport() {
return (FreeformViewport) getAncestor(fig, FreeformViewport.class);
}
/**
*
* @param figure
* @param cls
* @return
*/
public IFigure getAncestor(IFigure figure, Class cls) {
IFigure parent = fig;
while (parent != null) {
if (parent.getClass().equals(cls))
return parent;
parent = parent.getParent();
}
return null;
}
/**
*
*/
public DragTracker getDragTracker(Request req) {
if (req instanceof SelectionRequest
&& ((SelectionRequest) req).getLastButtonPressed() == 3)
return new DeselectAllTracker(this);
return new MarqueeDragTracker();
}
/**
* it does not hold any connections. .
*
* @return <code>NULL</code>
*/
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart editPart) {
return null;
}
/**
* It does not hold any connections.
*
* @return <code>NULL</code>
*/
public ConnectionAnchor getSourceConnectionAnchor(int x, int y) {
return null;
}
/**
* It does not hold any connections.
*
* @return <code>NULL</code>
*/
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart editPart) {
return null;
}
/**
* It does not hold any connections.
*
* @return <code>NULL</code>
*/
public ConnectionAnchor getTargetConnectionAnchor(int x, int y) {
return null;
}
public void nodeChanged(XModelTreeEvent event){
String path = event.getModelObject().getPath();
if(path.equals(SeamPagesPreference.SEAM_PAGES_EDITOR_PATH)){
refresh();
}
}
public void structureChanged(XModelTreeEvent event){
}
/**
*
*/
protected void refreshVisuals() {
}
/**
*
*/
protected List getModelChildren() {
ArrayList list = new ArrayList();
for(int i = 0; i < getPagesModel().getChildren().size(); i++){
list.add(getPagesModel().getChildren().get(i));
if(getPagesModel().getChildren().get(i) instanceof Page){
Page page = (Page)getPagesModel().getChildren().get(i);
if(!page.getChildren().isEmpty() && page.isParamsVisible()){
PageWrapper wrapper = page.getParamList();
list.add(wrapper);
}
}
}
return list;
}
/**
*
*/
public Object getAdapter(Class adapter) {
if (adapter == SnapToHelper.class) {
List<Object> snapStrategies = new ArrayList<Object>();
Boolean val = (Boolean) getViewer().getProperty(
RulerProvider.PROPERTY_RULER_VISIBILITY);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGuides(this));
val = (Boolean) getViewer().getProperty(
SnapToGeometry.PROPERTY_SNAP_ENABLED);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGeometry(this));
val = (Boolean) getViewer().getProperty(
SnapToGrid.PROPERTY_GRID_ENABLED);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGrid(this));
if (snapStrategies.isEmpty())
return null;
if (snapStrategies.size() == 1)
return (SnapToHelper) snapStrategies.get(0);
SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
for (int i = 0; i < snapStrategies.size(); i++)
ss[i] = (SnapToHelper) snapStrategies.get(i);
return new CompoundSnapToHelper(ss);
}
return super.getAdapter(adapter);
}
/**
* @see org.eclipse.gef.EditPart#activate()
*/
public void activate() {
if (isActive())
return;
((Notifier) getModel()).eAdapters().add(this);
PreferenceModelUtilities.getPreferenceModel().addModelTreeListener(this);
super.activate();
}
public void deactivate(){
if (!isActive())
return;
((Notifier) getModel()).eAdapters().remove(this);
PreferenceModelUtilities.getPreferenceModel().removeModelTreeListener(this);
super.deactivate();
}
/**
* @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void notifyChanged(Notification notification) {
refresh();
refreshVisuals();
}
/**
* )
*
* @see org.eclipse.emf.common.notify.Adapter#getTarget()
*/
public Notifier getTarget() {
return null;
}
/**
* @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
*/
public boolean isAdapterForType(Object type) {
return false;
}
/**
* @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
*/
public void setTarget(Notifier newTarget) {
}
}