]> source.dussan.org Git - vaadin-framework.git/commitdiff
implemented splitpanel
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 23 Aug 2007 12:27:06 +0000 (12:27 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 23 Aug 2007 12:27:06 +0000 (12:27 +0000)
svn changeset:2111/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanel.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelHorizontal.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/ISplitPanelVertical.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css
src/com/itmill/toolkit/terminal/gwt/public/component-themes/splitpanel/css/splitpanel.css [new file with mode: 0644]
src/com/itmill/toolkit/ui/SplitPanel.java [new file with mode: 0644]

index ad3de9b975cb87f4a5327fc345de3956cf90b863..3b0143e41197f92e2c3dda4f1a97ab2595c90907 100644 (file)
@@ -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 (file)
index 0000000..36a7171
--- /dev/null
@@ -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 (file)
index 0000000..6eca5d1
--- /dev/null
@@ -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 (file)
index 0000000..e30935b
--- /dev/null
@@ -0,0 +1,8 @@
+package com.itmill.toolkit.terminal.gwt.client.ui;
+
+public class ISplitPanelVertical extends ISplitPanel {
+
+       public ISplitPanelVertical() {
+               super(ISplitPanel.ORIENTATION_HORIZONTAL);
+       }
+}
index 917555e03b0bf0212fc421a03e388a9352f3b183..db140e966f45edb69eb10274c9a4fea9461fd7b7 100644 (file)
@@ -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 (file)
index 0000000..75a77dc
--- /dev/null
@@ -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 (file)
index 0000000..529385b
--- /dev/null
@@ -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.
+ * 
+ * <code>SplitPanel</code> 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
+        * <code>ORIENTATION_VERTICAL</code>.
+        */
+       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;
+       }
+}