| /******************************************************************************* |
| * 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(); |
| } |
| } |
| } |
| } |