blob: c1d87cc6a046e2f1f5d8d5af5b0c1ee381c8cd65 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2008 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.adt.typeviz.design.figures;
import org.eclipse.core.runtime.Assert;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.StructureEditPart;
import org.eclipse.wst.xsd.ui.internal.adt.design.figures.IFieldFigure;
import org.eclipse.wst.xsd.ui.internal.adt.design.figures.IStructureFigure;
import org.eclipse.wst.xsd.ui.internal.adt.typeviz.design.layouts.RowLayout;
public class FieldFigure extends Figure implements IFieldFigure
{
// TODO: put this color is some common class
public static final Color cellColor = new Color(null, 224, 233, 246);
// For fix to https://bugs.eclipse.org/bugs/show_bug.cgi?id=161940
// public static final Color leftOuterBorderColor = new Color(null, 253, 196, 88);
// public static final Color leftInnerBorderColor = new Color(null, 253, 226, 172);
// public static final Color rightOuterBorderColor = new Color(null, 150, 179, 224);
// public static final Color rightInnerBorderColor = new Color(null, 49, 106, 197);
// Formatting constraints
public static final int TOP_MARGIN = 2; // pixels
public static final int BOTTOM_MARGIN = TOP_MARGIN + 1; // extra pixel for the
// footer line
public static final int LEFT_MARGIN = 2;
public static final int RIGHT_MARGIN = LEFT_MARGIN;
public static final int RIGHT_SIDE_PADDING = 6;
// States requiring decorators, and their icons
// protected static final Image errorIcon = ICON_ERROR;
// Labels which handle presentation of name and type
public Figure rowFigure;
protected Label nameLabel;
protected Label nameAnnotationLabel; // for occurrence text, or error icons
protected Label typeLabel;
protected Label typeAnnotationLabel; // for occurrence text, or error icons
protected Label toolTipLabel;
public boolean hasFocus = false;
public FieldFigure()
{
super();
setLayoutManager(new ToolbarLayout());
rowFigure = new Figure();
RowLayout rowLayout = new RowLayout();
rowFigure.setLayoutManager(rowLayout);
add(rowFigure);
nameLabel = new Label();
nameLabel.setBorder(new MarginBorder(3, 5, 3, 5));
nameLabel.setLabelAlignment(PositionConstants.LEFT);
nameLabel.setOpaque(true);
rowFigure.add(nameLabel);
nameAnnotationLabel = new Label();
nameAnnotationLabel.setBorder(new MarginBorder(3, 5, 3, 5));
nameAnnotationLabel.setLabelAlignment(PositionConstants.LEFT);
nameAnnotationLabel.setOpaque(true);
rowFigure.add(nameAnnotationLabel);
toolTipLabel = new Label();
// Don't show tooltip for now. Annoying vertical line shows up. Safe fix.
// nameLabel.setToolTip(toolTipLabel);
typeLabel = new Label();
// cs : we need to add some additional padding to the right
// so that when we edit the field there's room for the combobox's arrow
// and the type name won't be partially obscured
//
typeLabel.setBorder(new MarginBorder(3, 5, 3, 20));
typeLabel.setLabelAlignment(PositionConstants.LEFT);
typeLabel.setOpaque(true);
rowFigure.add(typeLabel);
typeAnnotationLabel = new Label() {
public Dimension getPreferredSize(int wHint, int hHint)
{
if (getText() == null || getText().equals(""))
{
return new Dimension(0, 0);
}
return super.getPreferredSize(wHint, hHint);
}
};
typeAnnotationLabel.setBorder(new MarginBorder(3, 5, 3, 5));
typeAnnotationLabel.setLabelAlignment(PositionConstants.LEFT);
typeAnnotationLabel.setOpaque(true);
rowFigure.add(typeAnnotationLabel);
// Don't show tooltip for now. Annoying vertical line shows up. Safe fix.
// typeAnnotationLabel.setToolTip(toolTipLabel);
rowLayout.setConstraint(nameLabel, "name");
rowLayout.setConstraint(nameAnnotationLabel, "nameAnnotation");
rowLayout.setConstraint(typeLabel, "type");
rowLayout.setConstraint(typeAnnotationLabel, "typeAnnotation");
}
/**
* @return Returns the "name" string used by this figure.
*/
public String getName()
{
return nameLabel.getText();
}
/**
* @return Returns the figure representing the attribute name
*/
public Label getNameLabel()
{
return nameLabel;
}
/**
* @return Returns the "type" string used by this figure.
*/
public String getType()
{
return typeLabel.getText();
}
/**
* @return Returns the figure representing the attribute's type
*/
public Label getTypeLabel()
{
return typeLabel;
}
/**
* @param name
* Set the "name" string used by this figure.
*/
public void setName(String name)
{
nameLabel.setText(name);
}
/**
* @param type
* Set the "type" string used by this figure.
*/
public void setType(String type)
{
typeLabel.setText(type);
}
public void setTypeToolTipText(String toolTip)
{
setNameToolTipText(toolTip);
}
public void setNameToolTipText(String toolTip)
{
if (toolTip.length() > 0)
{
nameLabel.setToolTip(toolTipLabel);
toolTipLabel.setText(toolTip);
}
else
{
nameLabel.setToolTip(null);
}
}
public void setNameAnnotationLabel(String text)
{
nameAnnotationLabel.setText(text);
}
public void setNameAnnotationLabelIcon(Image icon)
{
nameAnnotationLabel.setIcon(icon);
}
public Label getNameAnnotationLabel()
{
return nameAnnotationLabel;
}
public void setTypeAnnotationLabel(String text)
{
typeAnnotationLabel.setText(text);
}
public void setTypeAnnotationLabelIcon(Image icon)
{
typeAnnotationLabel.setIcon(icon);
}
public Label getTypeAnnotationLabel()
{
return typeAnnotationLabel;
}
public void recomputeLayout()
{
RowLayout layout = (RowLayout)rowFigure.getLayoutManager();
if (layout != null && layout.getColumnData() != null)
{
layout.getColumnData().clearColumnWidths();
}
}
public void editPartAttached(EditPart owner)
{
StructureEditPart structureEditPart = null;
for (EditPart parent = owner.getParent(); parent != null; parent = parent.getParent())
{
if (parent instanceof StructureEditPart)
{
structureEditPart = (StructureEditPart) parent;
break;
}
}
RowLayout rowLayout = (RowLayout)rowFigure.getLayoutManager();
IStructureFigure typeFigure = structureEditPart.getStructureFigure();
Assert.isTrue(typeFigure instanceof StructureFigure, "Expected object of type StructureFigure");
rowLayout.setColumnData(((StructureFigure)typeFigure).getColumnData());
}
public void addSelectionFeedback()
{
boolean highContrast = false;
try
{
highContrast = Display.getDefault().getHighContrast();
}
catch (Exception e)
{
}
if (highContrast)
{
rowFigure.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
rowFigure.setBackgroundColor(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
}
else
{
rowFigure.setBackgroundColor(cellColor);
}
}
public void removeSelectionFeedback()
{
boolean highContrast = false;
try
{
highContrast = Display.getDefault().getHighContrast();
}
catch (Exception e)
{
}
if (highContrast)
{
rowFigure.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
rowFigure.setBackgroundColor(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
}
else
{
rowFigure.setBackgroundColor(getBackgroundColor());
}
}
public void refreshVisuals(Object model)
{
}
public void paint(Graphics graphics)
{
super.paint(graphics);
if (hasFocus)
{
try
{
graphics.pushState();
Rectangle r = getBounds();
graphics.setXORMode(true);
graphics.drawFocus(r.x, r.y + 1, r.width - 1, r.height - 2);
}
finally
{
graphics.popState();
}
}
}
}