001: /* *************************************************************************
002:
003: Millstone(TM)
004: Open Sourced User Interface Library for
005: Internet Development with Java
006:
007: Millstone is a registered trademark of IT Mill Ltd
008: Copyright (C) 2000-2005 IT Mill Ltd
009:
010: *************************************************************************
011:
012: This library is free software; you can redistribute it and/or
013: modify it under the terms of the GNU Lesser General Public
014: license version 2.1 as published by the Free Software Foundation.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: *************************************************************************
026:
027: For more information, contact:
028:
029: IT Mill Ltd phone: +358 2 4802 7180
030: Ruukinkatu 2-4 fax: +358 2 4802 7181
031: 20540, Turku email: info@itmill.com
032: Finland company www: www.itmill.com
033:
034: Primary source for MillStone information and releases: www.millstone.org
035:
036: ********************************************************************** */
037:
038: package org.millstone.base.ui;
039:
040: import org.millstone.base.terminal.PaintTarget;
041: import org.millstone.base.terminal.PaintException;
042: import java.util.Iterator;
043: import java.util.LinkedList;
044:
045: /** Ordered layout.
046: *
047: * Ordered layout is a component container, which shows the subcomponents in the
048: * order of their addition in specified orientation.
049: *
050: * @author IT Mill Ltd.
051: * @version 3.1.1
052: * @since 3.0
053: */
054: public class OrderedLayout extends AbstractComponentContainer implements
055: Layout {
056:
057: /* Predefined orientations ***************************************** */
058:
059: /** Components are to be layed out vertically. */
060: public static int ORIENTATION_VERTICAL = 0;
061: /** Components are to be layed out horizontally. */
062: public static int ORIENTATION_HORIZONTAL = 1;
063:
064: /** Custom layout slots containing the components */
065: private LinkedList components = new LinkedList();
066:
067: /** Orientation of the layout. */
068: private int orientation;
069:
070: /** Create a new ordered layout.
071: * The order of the layout is ORIENTATION_VERTICAL.
072: */
073: public OrderedLayout() {
074: orientation = ORIENTATION_VERTICAL;
075: }
076:
077: /** Create a new ordered layout.
078: * The orientation of the layout is given as parameters.
079: *
080: * @param orientation Orientation of the layout.
081: */
082: public OrderedLayout(int orientation) {
083: this .orientation = orientation;
084: }
085:
086: /** Get component UIDL tag.
087: * @return Component UIDL tag as string.
088: */
089: public String getTag() {
090: return "orderedlayout";
091: }
092:
093: /** Add a component into this container. The component is added to the
094: * right or under the previous component.
095: * @param c The component to be added.
096: */
097: public void addComponent(Component c) {
098: components.add(c);
099: super .addComponent(c);
100: requestRepaint();
101: }
102:
103: /** Add a component into this container. The component is added to the
104: * left or on top of the other components.
105: * @param c The component to be added.
106: */
107: public void addComponentAsFirst(Component c) {
108: components.addFirst(c);
109: super .addComponent(c);
110: requestRepaint();
111: }
112:
113: /** Add a component into indexed position in this container.
114: * @param c The component to be added.
115: * @param index Index of the component position.
116: * The components currently in and after the position are shifted forwards.
117: */
118: public void addComponent(Component c, int index) {
119: components.add(index, c);
120: super .addComponent(c);
121: requestRepaint();
122: }
123:
124: /** Remove a component from this container.
125: * @param c The component to be removed.
126: */
127: public void removeComponent(Component c) {
128: super .removeComponent(c);
129: components.remove(c);
130: requestRepaint();
131: }
132:
133: /** Get component container iterator for going trough all the components in
134: * the container.
135: * @return Iterator of the components inside the container.
136: */
137: public Iterator getComponentIterator() {
138: return components.iterator();
139: }
140:
141: /** Paint the content of this component.
142: * @param event PaintEvent.
143: * @throws PaintException The paint operation failed.
144: */
145: public void paintContent(PaintTarget target) throws PaintException {
146:
147: // Add the attributes: orientation
148: // note that the default values (b/vertival) are omitted
149: if (orientation == ORIENTATION_HORIZONTAL)
150: target.addAttribute("orientation", "horizontal");
151:
152: // Add all items in all the locations
153: for (Iterator i = components.iterator(); i.hasNext();) {
154: Component c = (Component) i.next();
155: if (c != null) {
156: c.paint(target);
157: }
158: }
159: }
160:
161: /** Get the orientation of the container.
162: * @return Value of property orientation.
163: */
164: public int getOrientation() {
165: return this .orientation;
166: }
167:
168: /** Set the orientation of the container.
169: * @param orientation New value of property orientation.
170: */
171: public void setOrientation(int orientation) {
172:
173: // Check the validity of the argument
174: if (orientation < ORIENTATION_VERTICAL
175: || orientation > ORIENTATION_HORIZONTAL)
176: throw new IllegalArgumentException();
177:
178: this .orientation = orientation;
179: }
180:
181: /* Documented in superclass */
182: public void replaceComponent(Component oldComponent,
183: Component newComponent) {
184:
185: // Get the locations
186: int oldLocation = -1;
187: int newLocation = -1;
188: int location = 0;
189: for (Iterator i = components.iterator(); i.hasNext();) {
190: Component component = (Component) i.next();
191:
192: if (component == oldComponent)
193: oldLocation = location;
194: if (component == newComponent)
195: newLocation = location;
196:
197: location++;
198: }
199:
200: if (oldLocation == -1)
201: addComponent(newComponent);
202: else if (newLocation == -1) {
203: removeComponent(oldComponent);
204: addComponent(newComponent, oldLocation);
205: } else {
206: if (oldLocation > newLocation) {
207: components.remove(oldComponent);
208: components.add(newLocation, oldComponent);
209: components.remove(newComponent);
210: components.add(oldLocation, newComponent);
211: } else {
212: components.remove(newComponent);
213: components.add(oldLocation, newComponent);
214: components.remove(oldComponent);
215: components.add(newLocation, oldComponent);
216: }
217:
218: requestRepaint();
219: }
220: }
221: }
|