/* *************************************************************************
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 AbstractComponentContainer implements Layout,
Sizeable {
/* 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 height;
private int heightUnit;
private int width;
private int widthUnit;
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;
}
/**
* 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;
}
/**
* 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 {
// TODO refine size attributes
if (width > 0) {
target.addAttribute("width", width + UNIT_SYMBOLS[widthUnit]);
} else {
target.addAttribute("width", "100%");
}
if (height > 0) {
target.addAttribute("height", height + UNIT_SYMBOLS[heightUnit]);
} else {
target.addAttribute("height", "100%");
}
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 this.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.
*
* Supported Units are {@link Sizeable}.UNITS_PERSENTAGE and
* Sizeable.UNITS_PIXELS
*
* @param pos
* size of the first region
* @oaran unit the unit (from {@link Sizeable}) in which the size is given.
*/
public void setSplitPosition(int pos, int unit) {
this.pos = pos;
this.posUnit = unit;
}
public int getHeight() {
return height;
}
public int getHeightUnits() {
return heightUnit;
}
public int getWidth() {
return width;
}
public int getWidthUnits() {
return widthUnit;
}
public void setHeight(int height) {
this.height = height;
}
public void setHeightUnits(int units) {
this.heightUnit = units;
}
public void setWidth(int width) {
this.width = width;
}
public void setWidthUnits(int units) {
this.widthUnit = units;
}
}