/* ************************************************************************* IT Mill Toolkit Development of Browser User Interfaces Made Easy Copyright (C) 2000-2006 IT Mill Ltd ************************************************************************* This product is distributed under commercial license that can be found from the product package on license.pdf. Use of this product might require purchasing a commercial license from IT Mill Ltd. For guidelines on usage, see licensing-guidelines.html ************************************************************************* For more information, contact: IT Mill Ltd phone: +358 2 4802 7180 Ruukinkatu 2-4 fax: +358 2 4802 7181 20540, Turku email: info@itmill.com Finland company www: www.itmill.com Primary source for information and releases: www.itmill.com ********************************************************************** */ package com.itmill.toolkit.ui; import java.util.Iterator; import com.itmill.toolkit.terminal.PaintException; import com.itmill.toolkit.terminal.PaintTarget; import com.itmill.toolkit.terminal.Sizeable; /** * SplitPanel. * * SplitPanel is a component container, that can contain two * components (possibly containers) which are split by divider element. * * @author IT Mill Ltd. * @version * @VERSION@ * @since 5.0 */ public class SplitPanel extends AbstractLayout { /* Predefined orientations ***************************************** */ /** * Components are to be layed out vertically. */ public static int ORIENTATION_VERTICAL = 0; /** * Components are to be layed out horizontally. */ public static int ORIENTATION_HORIZONTAL = 1; private Component firstComponent; private Component secondComponent; /** * Orientation of the layout. */ private int orientation; private int pos = 50; private int posUnit = UNITS_PERCENTAGE; /** * Creates a new split panel. The orientation of the panels is * ORIENTATION_VERTICAL. */ public SplitPanel() { orientation = ORIENTATION_VERTICAL; setSizeFull(); } /** * Create a new split panels. The orientation of the panel is given as * parameters. * * @param orientation * the Orientation of the layout. */ public SplitPanel(int orientation) { this.orientation = orientation; setSizeFull(); } /** * Gets the component UIDL tag. * * @return the Component UIDL tag as string. */ public String getTag() { if (orientation == ORIENTATION_HORIZONTAL) { return "hsplitpanel"; } else { return "vsplitpanel"; } } /** * Add a component into this container. The component is added to the right * or under the previous component. * * @param c * the component to be added. */ public void addComponent(Component c) { if (firstComponent == null) { firstComponent = c; } else if (secondComponent == null) { secondComponent = c; } else { throw new UnsupportedOperationException( "Split panel can contain only two components"); } super.addComponent(c); requestRepaint(); } public void setFirstComponent(Component c) { if (firstComponent != null) { // detach old removeComponent(firstComponent); } firstComponent = c; super.addComponent(c); } public void setSecondComponent(Component c) { if (secondComponent != null) { // detach old removeComponent(c); } secondComponent = c; super.addComponent(c); } /** * Removes the component from this container. * * @param c * the component to be removed. */ public void removeComponent(Component c) { super.removeComponent(c); if (c == firstComponent) { firstComponent = null; } else { secondComponent = null; } requestRepaint(); } /** * Gets the component container iterator for going trough all the components * in the container. * * @return the Iterator of the components inside the container. */ public Iterator getComponentIterator() { return new Iterator() { int i = 0; public boolean hasNext() { if (i < (firstComponent == null ? 0 : 1) + (secondComponent == null ? 0 : 1)) { return true; } return false; } public Object next() { if (!hasNext()) { return null; } i++; if (i == 1) { return firstComponent == null ? secondComponent : firstComponent; } else if (i == 2) { return secondComponent; } return null; } public void remove() { if (i == 1) { if (firstComponent != null) { setFirstComponent(null); i = 0; } else { setSecondComponent(null); } } else if (i == 2) { setSecondComponent(null); } } }; } /** * Paints the content of this component. * * @param target * the Paint Event. * @throws PaintException * if the paint operation failed. */ public void paintContent(PaintTarget target) throws PaintException { super.paintContent(target); String position = pos + UNIT_SYMBOLS[posUnit]; target.addAttribute("position", position); if (firstComponent != null) { firstComponent.paint(target); } else { (new OrderedLayout()).paint(target); } if (secondComponent != null) { secondComponent.paint(target); } else { (new OrderedLayout()).paint(target); } } /** * Gets the orientation of the container. * * @return the Value of property orientation. */ public int getOrientation() { return orientation; } /** * Set the orientation of the container. * * @param orientation * the New value of property orientation. */ public void setOrientation(int orientation) { // Checks the validity of the argument if (orientation < ORIENTATION_VERTICAL || orientation > ORIENTATION_HORIZONTAL) { throw new IllegalArgumentException(); } this.orientation = orientation; requestRepaint(); } /* Documented in superclass */ public void replaceComponent(Component oldComponent, Component newComponent) { if (oldComponent == firstComponent) { setFirstComponent(newComponent); } else if (oldComponent == secondComponent) { setSecondComponent(secondComponent); } requestRepaint(); } /** * Moves the position of the splitter. * * @param pos * the new size of the first region in persentage */ public void setSplitPosition(int pos) { setSplitPosition(pos, UNITS_PERCENTAGE); } /** * Moves the position of the splitter with given position and unit. * * @param pos * size of the first region * @param unit * the unit (from {@link Sizeable}) in which the size is * given. */ public void setSplitPosition(int pos, int unit) { this.pos = pos; posUnit = unit; } }