/******************************************************************************* * Copyright (c) 2004, 2006 Sybase, Inc. 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.facesconfig.ui.preference; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.AncestorListener; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.ConnectionLayer; import org.eclipse.draw2d.FreeformFigure; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.FreeformLayeredPane; import org.eclipse.draw2d.FreeformLayout; import org.eclipse.draw2d.FreeformListener; import org.eclipse.draw2d.FreeformViewport; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Layer; import org.eclipse.draw2d.LayeredPane; import org.eclipse.draw2d.ScalableFreeformLayeredPane; import org.eclipse.draw2d.ScrollPane; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.editparts.GridLayer; import org.eclipse.gef.editparts.GuideLayer; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; /** * A ScollPane used as figure container * */ /*package*/ class WindowFigure extends ScrollPane implements IContainerFigure, LayerConstants, FreeformFigure { private TabbedWindowBorder windowBorder; private TabbedTitleBarBorder titleBarBorder; private FreeformViewport myViewport; // private FreeformLayeredPane layeredPane; private ScalableFreeformLayeredPane scaledLayers; private LayeredPane innerLayers; private LayeredPane printableLayers; private FreeformLayer primaryLayer; private final static Font defaultFont = JFaceResources.getFontRegistry().get( JFaceResources.DEFAULT_FONT); private final static Color defaultForegroundColor = ColorConstants.black; private final static Color defaultBackgroundColor = ColorConstants.white; private final static Color defaultGridColor = ColorConstants.lightGray; private final static Dimension defaultGridSpacing = null; private final static boolean defaultGridEnabled = false; // Line Routing is not used within the WindowFigure class; it just serves as // a storage // location for communicating between the GEMPreferences and EditParts that // actually // create the line routers. private final static int LINE_ROUTING_MANUAL = 0; // TODO: should this really be static? private static int defaultLineRoutingStyle = LINE_ROUTING_MANUAL; private class MyGridLayer extends GridLayer { // public Point getOrigin() { // return origin.getCopy(); // } } private class MyFeedbackLayer extends FreeformLayer { MyFeedbackLayer() { setEnabled(false); } } /** * Default constructor */ public WindowFigure() { super(); windowBorder = new TabbedWindowBorder(this); titleBarBorder = (TabbedTitleBarBorder) windowBorder.getInnerBorder(); setBorder(windowBorder); setFont(defaultFont); setForegroundColor(defaultForegroundColor); setBackgroundColor(defaultBackgroundColor); innerLayers = new FreeformLayeredPane(); createLayers(innerLayers); myViewport = new FreeformViewport(); myViewport.setContents(innerLayers); setViewport(myViewport); // CR389495: Working with nested complex activities causes in the BP // editor causes lockup // not related to this CR but discovered while working on it: // make sure we observe grid visibility from preferences getGridLayer().setVisible(defaultGridEnabled); getGridLayer().setSpacing(defaultGridSpacing); getGridLayer().setForegroundColor(defaultGridColor); setText(PreferenceMessages.WindowFigure_Title); addTabbedWindowListener(new WindowFigureListener() { public void tabChanged(int oldIndex, int newIndex) { internalSetCurrentTab(newIndex); validate(); } }); addAncestorListener(new AncestorListener() { public void ancestorAdded(IFigure ancestor) { setVisible(true); } public void ancestorMoved(IFigure ancestor) { // validateComposite(); } public void ancestorRemoved(IFigure ancestor) { setVisible(false); } }); } // ////////////////////////////////////////////////////////////////////////// // Layer management // ////////////////////////////////////////////////////////////////////////// /** * @param layeredPane */ protected void createLayers(LayeredPane layeredPane) { layeredPane.add(getScaledLayers(), SCALABLE_LAYERS); layeredPane.add(new FreeformLayer(), HANDLE_LAYER); // CR377650: Horizontal scrolling needs to be improved // moved the feedback layer into printable layers so it shows up in // content outline // layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER); layeredPane.add(new GuideLayer(), GUIDE_LAYER); } /** * @return the pane */ protected ScalableFreeformLayeredPane createScaledLayers() { ScalableFreeformLayeredPane layers = new ScalableFreeformLayeredPane(); layers.add(createGridLayer(), GRID_LAYER); layers.add(getPrintableLayers(), PRINTABLE_LAYERS); // CR389070: Figures are abbreviating rule figures names and making them // unreadable // not needed (?) // layers.add(new MyFeedbackLayer(), SCALED_FEEDBACK_LAYER); return layers; } /** * @return layered pane */ protected LayeredPane getScaledLayers() { if (scaledLayers == null) scaledLayers = createScaledLayers(); return scaledLayers; } /** * @return layered pane */ protected LayeredPane createPrintableLayers() { FreeformLayeredPane layeredPane = new FreeformLayeredPane(); PrintedPageLayer pageTileLayer = new PrintedPageLayer(this); // TODO: get the printer page size from printer preferences // and set into the PageTileLayer. pageTileLayer.setPageSize(new Dimension(0, 0)); layeredPane.add(pageTileLayer, PrintedPageLayer.PRINTED_PAGE_LAYER, -1); // CR400208: Lines bleed from the bp canvas through the Fault handler // window // changed z-order of connection layer so that it is below figures layeredPane.add(new ConnectionLayer(), CONNECTION_LAYER, -1); primaryLayer = new FreeformLayer(); layeredPane.add(primaryLayer, PRIMARY_LAYER, -1); primaryLayer.setLayoutManager(new FreeformLayout()); // CR377650: Horizontal scrolling needs to be improved // let's put the feedback layer in with the printable layers so // we can see the feedback figures in the content outline viewer layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER); return layeredPane; } /** * @return the layered pane */ protected LayeredPane getPrintableLayers() { if (printableLayers == null) printableLayers = createPrintableLayers(); return printableLayers; } /** * @return the grid layer */ protected GridLayer createGridLayer() { return new MyGridLayer(); } /** * @return the grid layer */ public GridLayer getGridLayer() { return (GridLayer) getLayer(GRID_LAYER); } public Layer getLayer(Object key) { // ScalableFreeformRootEditPart: Layer layer = null; if (scaledLayers != null) layer = scaledLayers.getLayer(key); if (layer != null) return layer; // FreeformGraphicalRootEditPart: if (innerLayers == null) return null; layer = innerLayers.getLayer(key); if (layer != null) return layer; if (printableLayers == null) return null; return printableLayers.getLayer(key); } // ////////////////////////////////////////////////////////////////////////// // Properties // ////////////////////////////////////////////////////////////////////////// /** * @return the scroll position */ public Point getScrollPosition() { int x = getHorizontalScrollBar().getRangeModel().getValue(); int y = getVerticalScrollBar().getRangeModel().getValue(); return new Point(x, y); } /** * @return the border */ public TabbedTitleBarBorder getTabbedTitleBarBorder() { return titleBarBorder; } /** * @return the border */ public TabbedWindowBorder getTabbedWindowBorder() { return windowBorder; } /** * @param listener */ public void addTabbedWindowListener(WindowFigureListener listener) { titleBarBorder.addTabbedWindowListener(listener); } /** * @param listener */ public void removeTabbedWindowListener(WindowFigureListener listener) { titleBarBorder.removeTabbedWindowListener(listener); } public Dimension getMinimumSize(int wHint, int hHint) { Dimension d = titleBarBorder.getMinimumSize(wHint, hHint); d.expand(getInsets().getWidth(), getInsets().getHeight()); return d; } /** * @param s * @return the previous number of tabs */ public int addTab(String s) { return titleBarBorder.addTab(s); } /** * @param index */ public void removeTab(int index) { titleBarBorder.removeTab(index); internalSetCurrentTab(titleBarBorder.getCurrentTab()); } private void internalSetCurrentTab(int index) { // Object contents = titleBarBorder.getContents(index); // if (contents instanceof IFigure) // setContents((IFigure) contents); } /** * @param index */ public void setCurrentTab(int index) { internalSetCurrentTab(index); titleBarBorder.setCurrentTab(index); } /** * @return the current tab index */ public int getCurrentTab() { return titleBarBorder.getCurrentTab(); } public void setContents(IFigure figure) { titleBarBorder.setContents(0, figure); super.setContents(figure); } /** * @param index * @param contents */ public void setContents(int index, Object contents) { if (contents instanceof IFigure) setContents((IFigure) contents); titleBarBorder.setContents(index, contents); } /** * @param index * @return the content object of the index */ public Object getContents(int index) { return titleBarBorder.getContents(index); } public void setVisible(boolean flag) { super.setVisible(flag); windowBorder.setVisible(flag); // hide/show the window contents if it's a SWT composite Object contents = getContents(); if (contents instanceof Composite) ((Composite) contents).setVisible(flag); } public void setHighlight(boolean flag) { windowBorder.setHighlight(flag); } public void setFont(Font f) { titleBarBorder.setFont(f); } public void setForegroundColor(Color c) { titleBarBorder.setTextColor(c); } /** * @param style */ public void setLineRoutingStyle(int style) { defaultLineRoutingStyle = style; revalidate(); } /** * @return the line routing style */ public int getLineRoutingStyle() { return defaultLineRoutingStyle; } public Dimension getPreferredSize(int wHint, int hHint) { if (prefSize == null) { IFigure parent = getParent(); prefSize = parent.getSize(); this.getLayoutManager().invalidate(); Dimension m = super.getPreferredSize(wHint, hHint); if (getParent() instanceof CompoundNodeFigure) { if (((CompoundNodeFigure) parent).getState() == CompoundNodeFigure.RESTORED) { Insets in = ((CompoundNodeFigure) getParent()) .getAnchorInsets(); prefSize.width -= in.getWidth(); prefSize.height -= in.getHeight(); } } else { if (m.width > prefSize.width) prefSize.width = m.width; if (m.height > prefSize.height) prefSize.height = m.height; } } return prefSize; } protected boolean isValidationRoot() { return true; } // private void validateComposite() { // Object contents = getContents(); // // System.out.println("validate: "+titleBarBorder.getLabel(0)+" // // "+contents); // if (contents instanceof Composite) { // if (getParent() == null) { // System.err.println("TabbedWindowFigure.validate() - ERROR"); // return; // } // Rectangle r = getBounds().getCopy(); // r.crop(getInsets()); // Dimension ps = getParent().getParent().getPreferredSize(); // Rectangle pr = getParent().getParent().getBounds(); // titleBarBorder.invalidate(); // titleBarBorder.getInsets(this); // Insets in = getParent().getParent().getInsets(); // Composite comp = (Composite) getContents(); // comp.setBounds(pr.x + r.x + in.left, pr.y + r.y, r.width, r.height); // comp.moveAbove(null); // } // } public void invalidate() { prefSize = null; super.invalidate(); } // ////////////////////////////////////////////////////////////////////// // IBaseFigure methods // ////////////////////////////////////////////////////////////////////// /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText(String * text) */ public void setText(String name) { titleBarBorder.setLabel(name); } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText() */ public String getText() { if (titleBarBorder == null) return PreferenceMessages.WindowFigure_NoTitleText; return titleBarBorder.getLabel(); } /* * CR374981: Long activity labels do not get wrapped or truncated This * method was added to the IBaseFigure interface to support direct edit of * figure labels on the canvas. */ public Rectangle getTextBounds() { Rectangle r = getClientArea().getCopy(); r.height = titleBarBorder.getTextExtents(this).height; r.x += getInsets().left; r.y -= getInsets().top; return r; } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon() */ public Image getIcon() { return null; } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setIcon(org.eclipse.swt.graphics.Image) */ public void setIcon(Image image) { // do nothing } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText(java.lang.String) */ public void setToolTipText(String text) { // do nothing } public String getToolTipText() { return null; } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator) */ public void addDecorator(BaseFigureDecorator decorator) { // do nothing } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator() */ public void removeDecorator() { // do nothing } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int) */ public void removeDecorator(int position) { // do nothing } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators() */ public List getDecorators() { return null; } // ////////////////////////////////////////////////////////////////////// // FreeformFigure methods // ////////////////////////////////////////////////////////////////////// private WindowFreeformHelper helper = new WindowFreeformHelper(this); /* * (non-Javadoc) * * @see org.eclipse.draw2d.FreeformFigure#addFreeformListener(org.eclipse.draw2d.FreeformListener) */ public void addFreeformListener(FreeformListener listener) { addListener(FreeformListener.class, listener); } /* * (non-Javadoc) * * @see org.eclipse.draw2d.FreeformFigure#fireExtentChanged() */ public void fireExtentChanged() { Iterator iter = getListeners(FreeformListener.class); while (iter.hasNext()) ((FreeformListener) iter.next()).notifyFreeformExtentChanged(); } /* * (non-Javadoc) * * @see org.eclipse.draw2d.FreeformFigure#getFreeformExtent() */ public Rectangle getFreeformExtent() { Rectangle r = helper.getFreeformExtent(); r.x = 0; r.y = 0; return r; } /* * (non-Javadoc) * * @see org.eclipse.draw2d.FreeformFigure#removeFreeformListener(org.eclipse.draw2d.FreeformListener) */ public void removeFreeformListener(FreeformListener listener) { removeListener(FreeformListener.class, listener); } /* * (non-Javadoc) * * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(org.eclipse.draw2d.geometry.Rectangle) */ public void setFreeformBounds(Rectangle bounds) { helper.setFreeformBounds(bounds); } }