1 16 package com.google.gwt.user.client.ui; 17 18 import com.google.gwt.user.client.DOM; 19 import com.google.gwt.user.client.Element; 20 import com.google.gwt.user.client.Event; 21 22 import java.util.Iterator ; 23 24 28 abstract class SplitPanel extends Panel { 29 30 35 static final void addElementClipping(final Element elem) { 36 DOM.setStyleAttribute(elem, "overflow", "hidden"); 37 } 38 39 44 static final void addElementScrolling(final Element elem) { 45 DOM.setStyleAttribute(elem, "overflow", "auto"); 46 } 47 48 56 static final Element preventElementBoxStyles(final Element elem) { 57 DOM.setIntStyleAttribute(elem, "padding", 0); 58 DOM.setIntStyleAttribute(elem, "margin", 0); 59 DOM.setStyleAttribute(elem, "border", "none"); 60 return elem; 61 } 62 63 68 static final void preventElementPadding(final Element elem) { 69 DOM.setStyleAttribute(elem, "padding", "0"); 70 } 71 72 78 static final void setElementClassname(final Element elem, 79 final String className) { 80 DOM.setElementProperty(elem, "className", className); 81 } 82 83 private final Widget[] widgets = new Widget[2]; 85 86 private final Element[] elements = new Element[2]; 88 89 private final Element splitElem; 91 92 private boolean isResizing = false; 94 95 103 SplitPanel(Element mainElem, Element splitElem, Element headElem, 104 Element tailElem) { 105 setElement(mainElem); 106 this.splitElem = splitElem; 107 elements[0] = headElem; 108 elements[1] = tailElem; 109 sinkEvents(Event.MOUSEEVENTS); 110 } 111 112 public void add(Widget w) { 113 if (getWidget(0) == null) { 114 setWidget(0, w); 115 } else if (getWidget(1) == null) { 116 setWidget(1, w); 117 } else { 118 throw new IllegalStateException ( 119 "A Splitter can only contain two Widgets."); 120 } 121 } 122 123 129 public boolean isResizing() { 130 return isResizing; 131 } 132 133 public Iterator iterator() { 134 return WidgetIterators.createWidgetIterator(this, widgets); 135 } 136 137 public void onBrowserEvent(Event event) { 138 switch (DOM.eventGetType(event)) { 139 140 case Event.ONMOUSEDOWN: { 141 Element target = DOM.eventGetTarget(event); 142 if (DOM.isOrHasChild(splitElem, target)) { 143 startResizingFrom(DOM.eventGetClientX(event) - getAbsoluteLeft(), 144 DOM.eventGetClientY(event) - getAbsoluteTop()); 145 DOM.eventPreventDefault(event); 146 } 147 break; 148 } 149 150 case Event.ONMOUSEUP: { 151 stopResizing(); 152 break; 153 } 154 155 case Event.ONMOUSEMOVE: { 156 if (isResizing()) { 157 onSplitterResize(DOM.eventGetClientX(event) - getAbsoluteLeft(), 158 DOM.eventGetClientY(event) - getAbsoluteTop()); 159 DOM.eventPreventDefault(event); 160 } 161 break; 162 } 163 } 164 } 165 166 public boolean remove(Widget widget) { 167 if (widget == null) { 168 throw new IllegalArgumentException ("Widget must not be null"); 169 } 170 171 if (widgets[0] == widget) { 172 setWidget(0, null); 173 return true; 174 } else if (widgets[1] == widget) { 175 setWidget(1, null); 176 return true; 177 } 178 179 return false; 180 } 181 182 188 public abstract void setSplitPosition(String size); 189 190 196 protected Element getElement(int index) { 197 return elements[index]; 198 } 199 200 205 protected Element getSplitElement() { 206 return splitElem; 207 } 208 209 215 protected Widget getWidget(int index) { 216 return widgets[index]; 217 } 218 219 225 protected final void setWidget(int index, Widget w) { 226 if (widgets[index] != null) { 227 disown(widgets[index]); 228 } 229 230 widgets[index] = w; 231 232 if (w != null) { 233 adopt(w, elements[index]); 234 } 235 } 236 237 243 abstract void onSplitterResize(int x, int y); 244 245 251 abstract void onSplitterResizeStarted(int x, int y); 252 253 private void startResizingFrom(int x, int y) { 254 isResizing = true; 255 onSplitterResizeStarted(x, y); 256 } 257 258 private void stopResizing() { 259 isResizing = false; 260 } 261 } 262 | Popular Tags |