blob: 2d967194581d1016d310ed40346cb827be74151b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.graph.editparts;
import java.util.Collections;
import java.util.List;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editpolicies.SelectionEditPolicy;
import org.eclipse.gef.requests.LocationRequest;
import org.eclipse.gef.ui.parts.AbstractEditPartViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wst.xsd.ui.internal.gef.util.editparts.AbstractComponentViewerRootEditPart;
import org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout;
import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
import org.eclipse.wst.xsd.ui.internal.graph.XSDComponentViewer;
import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
import org.eclipse.wst.xsd.ui.internal.graph.model.ModelAdapter;
import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDModelGroupDefinition;
import org.eclipse.xsd.XSDNamedComponent;
public class TopLevelComponentEditPart extends BaseEditPart implements IFeedbackHandler
{
protected Label label;
//protected Label arrowLabel;
protected ContainerFigure labelHolder = new ContainerFigure();
protected SelectionHandlesEditPolicyImpl selectionHandlesEditPolicy;
protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
protected boolean isReadOnly;
protected boolean isSelected;
protected IFigure createFigure()
{
ContainerFigure typeGroup = new ContainerFigure();
typeGroup.getContainerLayout().setHorizontal(true);
//arrowLabel = new Label();
//arrowLabel.setIcon(XSDEditorPlugin.getPlugin().getImage("icons/forward.gif"));
//typeGroup.add(arrowLabel);
labelHolder = new ContainerFigure();
FillLayout fillLayout = new FillLayout();
labelHolder.setLayoutManager(fillLayout);
labelHolder.setFill(true);
typeGroup.add(labelHolder);
label = new Label();
label.setBorder(new MarginBorder(0, 2, 2, 1));
label.setForegroundColor(ColorConstants.black);
labelHolder.add(label);
try
{
// evil hack to provide underlines
Object model = getModel();
boolean isLinux = java.io.File.separator.equals("/");
if (model instanceof XSDComplexTypeDefinition ||
model instanceof XSDElementDeclaration ||
model instanceof XSDModelGroupDefinition)
{
if (!isLinux)
{
FontData oldData = GraphicsConstants.medium.getFontData()[0];
FontData fontData = new FontData(oldData.getName(), oldData.getHeight(), SWT.NONE);
// TODO... clean this awful code up... we seem to be leaking here too
// we can't call this directly since the methods are OS dependant
// fontData.data.lfUnderline = 1
// so instead we use reflection
Object data = fontData.getClass().getField("data").get(fontData);
// System.out.println("data" + data.getClass());
data.getClass().getField("lfUnderline").setByte(data, (byte)1);
Font font = new Font(Display.getCurrent(), fontData);
label.setFont(font);
}
}
}
catch (Exception e)
{
}
//FontData data = label.getFont().getFontData()[0];
//data.data.lfUnderline = 1;
//RectangleFigure line = new RectangleFigure();
//line.setPreferredSize(2, 1);
//labelHolder.add(line, 1);
//label.getFont().getFontData()[0].setStyle()
return typeGroup;
}
public void refreshVisuals()
{
ModelAdapter adapter = XSDModelAdapterFactory.getAdapter(getModel());
if (adapter != null)
{
// isReadOnly = Boolean.TRUE.equals(adapter.getProperty(getModel(), "isReadOnly"));
isReadOnly = !XSDGraphUtil.isEditable(getModel());
label.setForegroundColor(computeLabelColor());
label.setText((String)adapter.getProperty(getModel(), ModelAdapter.LABEL_PROPERTY));
Image image = (Image)adapter.getProperty(getModel(), ModelAdapter.IMAGE_PROPERTY);
if (image != null) label.setIcon(image);
//arrowLabel.setVisible(Boolean.TRUE.equals(adapter.getProperty(getModel(), "drillDown")));
}
else
{
label.setText("unknown object" + getModel().getClass().getName());
//arrowLabel.setVisible(false);
}
if (reselect)
{
getViewer().select(this);
setReselect(false);
}
}
public XSDNamedComponent getXSDNamedComponent()
{
return (XSDNamedComponent) getModel();
}
public List getModelChildren()
{
return Collections.EMPTY_LIST;
}
protected void createEditPolicies()
{
//installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new NonResizableEditPolicy());
//selectionHandlesEditPolicy = new SelectionHandlesEditPolicyImpl();
//installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionHandlesEditPolicy);
SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);
SelectionEditPolicy feedBackSelectionEditPolicy = new SelectionEditPolicy()
{
protected void hideSelection()
{
EditPart editPart = getHost();
if (editPart instanceof IFeedbackHandler)
{
((IFeedbackHandler)editPart).removeFeedback();
}
}
protected void showSelection()
{
EditPart editPart = getHost();
if (editPart instanceof IFeedbackHandler)
{
((IFeedbackHandler)editPart).addFeedback();
}
}
};
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, feedBackSelectionEditPolicy);
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
}
public Color computeLabelColor()
{
Color color = ColorConstants.black;
if (isSelected)
{
color = ColorConstants.white;
}
else if (isReadOnly)
{
color = ColorConstants.gray;
}
return color;
}
public void addFeedback()
{
isSelected = true;
labelHolder.setBackgroundColor(ColorConstants.black);
label.setForegroundColor(computeLabelColor());
labelHolder.setFill(true);
if (doScroll)
{
CategoryEditPart categoryEP = (CategoryEditPart)getParent();
categoryEP.scrollTo(this);
setScroll(false);
}
}
private boolean doScroll = false;
public void setScroll(boolean doScroll)
{
this.doScroll = doScroll;
}
public void removeFeedback()
{
isSelected = false;
labelHolder.setBackgroundColor(null);
label.setForegroundColor(computeLabelColor());
labelHolder.setFill(false);
}
public void performRequest(Request request)
{
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT ||
request.getType() == RequestConstants.REQ_OPEN)
{
Object model = getModel();
if (model instanceof XSDComplexTypeDefinition ||
model instanceof XSDElementDeclaration ||
model instanceof XSDModelGroupDefinition)
{
if (request instanceof LocationRequest)
{
LocationRequest locationRequest = (LocationRequest)request;
Point p = locationRequest.getLocation();
if (hitTest(labelHolder, p))
{
performDrillDownAction();
}
}
}
}
}
public boolean hitTest(IFigure target, Point location)
{
Rectangle b = target.getBounds().getCopy();
target.translateToAbsolute(b);
return b.contains(location);
}
protected void performDrillDownAction()
{
Runnable runnable = new Runnable()
{
public void run()
{
//((XSDComponentViewer)getViewer()).setInput((XSDConcreteComponent)getModel());
EditPart editPart = ((AbstractEditPartViewer)getViewer()).getRootEditPart().getContents();
if (editPart instanceof AbstractComponentViewerRootEditPart)
{
AbstractComponentViewerRootEditPart rootEditPart = (AbstractComponentViewerRootEditPart)editPart;
rootEditPart.setInput((XSDConcreteComponent)getModel());
}
else if (editPart instanceof BaseEditPart)
{
((XSDComponentViewer)getViewer()).setInput((XSDConcreteComponent)getModel());
}
}
};
Display.getCurrent().asyncExec(runnable);
}
public void doEditName()
{
removeFeedback();
Object object = getModel();
if (object instanceof XSDNamedComponent)
{
ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, (XSDNamedComponent)object);
simpleDirectEditPolicy.setDelegate(manager);
manager.show();
}
}
static boolean reselect = false;
public void setReselect(boolean state)
{
reselect = state;
}
}