/******************************************************************************* * Copyright (c) 2012 VMware, Inc. * 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: * VMware, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.config.graph.figures; import org.eclipse.draw2d.ActionListener; import org.eclipse.draw2d.ButtonModel; import org.eclipse.draw2d.ChangeEvent; import org.eclipse.draw2d.ChangeListener; import org.eclipse.draw2d.Clickable; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.FreeformLayout; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.Triangle; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; /** * @author Leo Dos Santos */ public class BorderedContainerFigure extends SubgraphFigure { private class Expander extends Clickable { private final Triangle triangle; public Expander() { setStyle(Clickable.STYLE_TOGGLE); triangle = new Triangle(); triangle.setSize(10, 10); triangle.setBackgroundColor(ColorConstants.black); triangle.setForegroundColor(ColorConstants.black); triangle.setFill(true); triangle.setDirection(Triangle.EAST); triangle.setLocation(new Point(5, 3)); setLayoutManager(new FreeformLayout()); add(triangle); setPreferredSize(15, 15); addChangeListener(new ChangeListener() { public void handleStateChanged(ChangeEvent event) { if (event.getPropertyName().equals(ButtonModel.SELECTED_PROPERTY)) { handleExpandedStateChanged(); } else if (event.getPropertyName().equals(ButtonModel.MOUSEOVER_PROPERTY)) { repaint(); } } }); } protected void open() { triangle.setDirection(Triangle.SOUTH); } protected void close() { triangle.setDirection(Triangle.EAST); } } private final Expander expander; private boolean isExpanded = false; public BorderedContainerFigure(Label header, int direction) { super(header, new Label(""), direction); //$NON-NLS-1$ expander = new Expander(); add(expander); setBorder(new ConnectorBorder(direction, 0, 0)); setOpaque(true); } public void addActionListener(ActionListener listener) { expander.addActionListener(listener); } @Override public Dimension getPreferredSize(int wHint, int hHint) { Dimension dim = new Dimension(); int wHeader = getHeader().getPreferredSize().width; wHeader += expander.getPreferredSize().width; int wFooter = getFooter().getPreferredSize().width; dim.width = wHeader >= wFooter ? wHeader : wFooter; dim.width += getInsets().getWidth(); dim.height = 50; return dim; } protected void handleExpandedStateChanged() { if (isExpanded) { expander.close(); } else { expander.open(); } isExpanded = !isExpanded; } public boolean isExpanded() { return isExpanded; } @Override public void setBounds(Rectangle rect) { super.setBounds(rect); getClientArea(rect); Dimension size = expander.getPreferredSize(); expander.setSize(size); int dy = 0; int headerHeight = header.getBounds().height; int expanderHeight = expander.getBounds().height; if (headerHeight > expanderHeight) { dy = (headerHeight - expanderHeight) / 2; } expander.setLocation(rect.getTopLeft().translate(0, dy)); header.translate(expander.getSize().width, 0); footer.setLocation(new Point(0, 0)); footer.setSize(0, 0); } }