/* * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package com.arsdigita.bebop; import com.arsdigita.bebop.util.GlobalizationUtil ; import com.arsdigita.util.Assert; import com.arsdigita.xml.Element; /** * Consists of two table cells with a dividing * bar in the middle. This container is used only for layout. * It is intended to be used as a parent class for a wizard-type * SplitWizard component. *
*
* This container contains three components: "left", "right" and "header".
* All three components must be present (non-null) before SplitPanel
* is locked. An exception will be thrown if this is not the case.
*
* @author Stanislav Freidin
* @version $Id: SplitPanel.java 287 2005-02-22 00:29:02Z sskracic $
*/
public class SplitPanel extends SimpleContainer {
private Component m_left, m_right, m_header;
private int m_divider;
/**
* The border attribute.
*/
public final static String BORDER = "border";
/**
* Constructs a new, empty SplitPanel.
*/
public SplitPanel() {
this(new Label(" ", false), new Label(" ", false), new Label(" ", false));
}
/**
* Constructs a new SplitPanel with the specified left and right
* components.
*/
public SplitPanel(Component left, Component right) {
this(new Label(" ", false), left, right);
}
/**
* Constructs a new SplitPanel with the specified left, right and header
* components.
*/
public SplitPanel(Component header, Component left, Component right) {
super();
setDivider(25);
if (header != null) {
setHeader(header);
}
if (left != null) {
setLeftComponent(left);
}
if (right != null) {
setRightComponent(right);
}
setAttribute("cellpadding", "5");
setAttribute("cellspacing" , "0");
setAttribute("width", "100%");
setBorder(true);
}
/**
* Sets the divider position. The position must be an integer in
* the range of 0 (all the way to the left) to 100
* (all the way to the right).
*
* @param divider the position of the divider
*/
public void setDivider(int divider) {
Assert.isUnlocked(this);
if (divider < 0 || divider > 100) {
throw new IllegalArgumentException("Divider must be in range 0..100");
}
m_divider = divider;
}
/**
* Retrieves the divider position
*
* @return the divider position in HTML, such as "25%".
*/
public final int getDivider() {
return m_divider;
}
/**
*
* Sets the border.
* @param hasBorder true if the split panel
* will have a border
*
*/
public void setBorder(boolean border) {
setAttribute(BORDER, border ? "1" : "0");
}
/**
*
* Determine whether this panel has a border.
*
* @return true if the split panel has a border;
* false otherwise.
*/
public boolean getBorder() {
String border = getAttribute(BORDER);
return ("1".equals(border));
}
/**
* Gets the left component.
*
* @return the component on the left.
*/
public final Component getLeftComponent() {
return m_left;
}
/**
* Gets the right component.
*
* @return the component on the right.
*/
public final Component getRightComponent() {
return m_right;
}
/**
* Gets the header component.
*
* @return the component at the top.
*/
public final Component getHeader() {
return m_header;
}
/**
* Sets the header. Will throw an IllegalStateException
* if the header component has already been set.
*
* @param c the new component to be put in the header
*/
public void setHeader(Component c) {
Assert.isUnlocked(this);
if (!super.contains(c)) {
super.add(c);
}
m_header = c;
}
/**
* Sets the left component. Will throw an IllegalStateException
* if the left component has already been set.
*
* @param c the new component to be put in the left slot
*/
public void setLeftComponent(Component c) {
Assert.isUnlocked(this);
if (!super.contains(c)) {
super.add(c);
}
m_left = c;
}
/**
* Sets the right component. Will throw an IllegalStateException
* if the right component has already been set.
*
* @param c the new component to be put in the right slot
*/
public void setRightComponent(Component c) {
Assert.isUnlocked(this);
if (!super.contains(c)) {
super.add(c);
}
m_right = c;
}
/**
* Generates XML for the panel. The DOM fragment will look
* like the following:
*
* @param state the current page state
* @param parent the parent under which the XML should be placed
*
*/
public void generateXML(PageState state, Element parent) {
if ( ! isVisible(state) ) {
return;
}
Element panel = parent.newChildElement("bebop:splitPanel", BEBOP_XML_NS);
exportAttributes(panel);
panel.addAttribute("divider_left", Integer.toString(m_divider) + "%");
panel.addAttribute("divider_right", Integer.toString(100 - m_divider) + "%");
Element header = panel.newChildElement("bebop:cell", BEBOP_XML_NS);
Element left = panel.newChildElement("bebop:cell", BEBOP_XML_NS);
Element right = panel.newChildElement("bebop:cell", BEBOP_XML_NS);
getHeader().generateXML(state, header);
getLeftComponent().generateXML(state, left);
getRightComponent().generateXML(state, right);
}
/**
* Verifies that the header, left, and right components exist.
*/
public void lock() {
Assert.exists(getHeader(), "Header");
Assert.exists(getLeftComponent(), "Left Component");
Assert.exists(getRightComponent(), "Right Component");
super.lock();
}
}
* <bebop:splitPanel>
* <XML for the left component />
* <XML for the right component />
* </bebop:splitPanel>