From: Matti Tahvonen Date: Thu, 23 Aug 2007 12:27:06 +0000 (+0000) Subject: implemented splitpanel X-Git-Tag: 6.7.0.beta1~6079 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a31bafceac9808abf01a89c783ce02c1fe7256c6;p=vaadin-framework.git implemented splitpanel svn changeset:2111/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java index ad3de9b975..3b0143e411 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java @@ -22,6 +22,9 @@ import com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar; import com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable; import com.itmill.toolkit.terminal.gwt.client.ui.ISelect; import com.itmill.toolkit.terminal.gwt.client.ui.ISlider; +import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanel; +import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal; +import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical; import com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging; import com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet; import com.itmill.toolkit.terminal.gwt.client.ui.ITextArea; @@ -131,6 +134,12 @@ public class DefaultWidgetFactory implements WidgetFactory { } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IUpload" .equals(className)) { return new IUpload(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal" + .equals(className)) { + return new ISplitPanelHorizontal(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical" + .equals(className)) { + return new ISplitPanelVertical(); } return new IUnknownComponent(); @@ -217,6 +226,10 @@ public class DefaultWidgetFactory implements WidgetFactory { return "com.itmill.toolkit.terminal.gwt.client.ui.IForm"; } else if ("upload".equals(tag)) { return "com.itmill.toolkit.terminal.gwt.client.ui.IUpload"; + } else if ("hsplitpanel".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal"; + } else if ("vsplitpanel".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical"; } return "com.itmill.toolkit.terminal.gwt.client.ui.IUnknownComponent"; diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java new file mode 100644 index 0000000000..36a7171419 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java @@ -0,0 +1,118 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +import com.google.gwt.user.client.ui.HorizontalSplitPanel; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.VerticalSplitPanel; +import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; +import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.UIDL; + +public class ISplitPanel extends SimplePanel implements Paintable { + public static final int ORIENTATION_HORIZONTAL = 0; + public static final int ORIENTATION_VERTICAL = 1; + + private int orientation; + private HorizontalSplitPanel sph; + private VerticalSplitPanel spv; + private Widget firstChild; + private Widget secondChild; + + public ISplitPanel() { + this(ORIENTATION_HORIZONTAL); + } + + public ISplitPanel(int orientation) { + super(); + setOrientetion(orientation); + } + + private void setOrientetion(int orientation) { + this.orientation = orientation; + if(orientation == ORIENTATION_HORIZONTAL) { + this.sph = new HorizontalSplitPanel(); + this.setWidget(sph); + if(spv != null) { + // TODO cleanup contained widgets + this.spv = null; + } + } else { + this.spv = new VerticalSplitPanel(); + this.setWidget(spv); + if(sph != null) { + // TODO cleanup contained widgets + this.sph = null; + } + } + } + + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + client.updateComponent(this, uidl, true); + + setSplitPosition(uidl.getStringAttribute("position")); + + setWidth(uidl.getStringAttribute("width")); + setHeight(uidl.getStringAttribute("height")); + + + Paintable newFirstChild = (Paintable) client.getWidget(uidl.getChildUIDL(0)); + Paintable newSecondChild = (Paintable) client.getWidget(uidl.getChildUIDL(1)); + if(firstChild != newFirstChild) { + if(firstChild != null) + client.unregisterPaintable((Paintable) firstChild); + setFirstWidget((Widget) newFirstChild); + } + if(secondChild != newSecondChild) { + if(secondChild != null) + client.unregisterPaintable((Paintable) secondChild); + setSecondWidget((Widget) newSecondChild); + } + newFirstChild.updateFromUIDL(uidl.getChildUIDL(0), client); + newSecondChild.updateFromUIDL(uidl.getChildUIDL(1), client); + } + + private void setSplitPosition(String pos) { + if(orientation == ORIENTATION_HORIZONTAL) { + this.sph.setSplitPosition(pos); + } else { + this.spv.setSplitPosition(pos); + } + } + + private void setFirstWidget(Widget w) { + firstChild = w; + if(orientation == ORIENTATION_HORIZONTAL) { + this.sph.setLeftWidget(w); + } else { + this.spv.setTopWidget(w); + } + } + + private void setSecondWidget(Widget w) { + secondChild = w; + if(orientation == ORIENTATION_HORIZONTAL) { + this.sph.setRightWidget(w); + } else { + this.spv.setBottomWidget(w); + } + } + + public void setHeight(String height) { + super.setHeight(height); + if(orientation == ORIENTATION_HORIZONTAL) { + sph.setHeight(height); + } else { + spv.setHeight(height); + } + } + + public void setWidth(String width) { + super.setWidth(width); + if(orientation == ORIENTATION_HORIZONTAL) { + sph.setWidth(width); + } else { + spv.setWidth(width); + } + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelHorizontal.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelHorizontal.java new file mode 100644 index 0000000000..6eca5d1a68 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelHorizontal.java @@ -0,0 +1,8 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +public class ISplitPanelHorizontal extends ISplitPanel { + + public ISplitPanelHorizontal() { + super(ISplitPanel.ORIENTATION_VERTICAL); + } +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelVertical.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelVertical.java new file mode 100644 index 0000000000..e30935bdfb --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelVertical.java @@ -0,0 +1,8 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +public class ISplitPanelVertical extends ISplitPanel { + + public ISplitPanelVertical() { + super(ISplitPanel.ORIENTATION_HORIZONTAL); + } +} diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css index 917555e03b..db140e966f 100644 --- a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css +++ b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css @@ -9,4 +9,5 @@ @import "window/css/window.css"; @import "caption/css/caption.css"; @import "tree/css/tree.css"; +@import "splitpanel/css/splitpanel.css"; diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/splitpanel/css/splitpanel.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/splitpanel/css/splitpanel.css new file mode 100644 index 0000000000..75a77dc58f --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/splitpanel/css/splitpanel.css @@ -0,0 +1,4 @@ +.gwt-HorizontalSplitPanel .hsplitter, +.gwt-VerticalSplitPanel .vsplitter { + +} diff --git a/src/com/itmill/toolkit/ui/SplitPanel.java b/src/com/itmill/toolkit/ui/SplitPanel.java new file mode 100644 index 0000000000..529385b8c0 --- /dev/null +++ b/src/com/itmill/toolkit/ui/SplitPanel.java @@ -0,0 +1,346 @@ +/* ************************************************************************* + + 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 com.itmill.toolkit.terminal.PaintException; +import com.itmill.toolkit.terminal.PaintTarget; +import com.itmill.toolkit.terminal.Sizeable; + +import java.util.Iterator; +import java.util.LinkedList; + +import org.apache.tools.ant.taskdefs.Tstamp.Unit; + +/** + * 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 = Sizeable.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 < 2) + return true; + return false; + } + + public Object next() { + i++; + if(i == 1) + return firstComponent; + else if(i == 2) + return secondComponent; + return null; + } + + public void remove() { + if(i == 1) + setFirstComponent(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 { + + // Adds the attributes: orientation + // note that the default values (b/vertival) are omitted + if (orientation == ORIENTATION_HORIZONTAL) + target.addAttribute("orientation", "horizontal"); + + // TODO refine size attributes + if(width > 0) { + target.addAttribute("width", width + (widthUnit == Sizeable.UNITS_PIXELS ? "px" : "%")); + } else { + target.addAttribute("width", "100%"); + } + if(height > 0) { + target.addAttribute("height", height + (heightUnit == Sizeable.UNITS_PIXELS ? "px" : "%")); + } else { + target.addAttribute("height", "100%"); + } + + String position = pos + ""; + switch (posUnit) { + case Sizeable.UNITS_PIXELS: + position += "px"; + break; + case Sizeable.UNITS_PERCENTAGE: + default: + position += "%"; + break; + } + + 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, Sizeable.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; + } +}