package com.iambookmaster.client.common; import java.util.ArrayList; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalSplitPanel; import com.google.gwt.user.client.ui.VerticalSplitPanelImages; import com.google.gwt.user.client.ui.Widget; /** * This widget should provide Vertical Split Table * @author ggadyatskiy * */ public class TrueVerticalSplitPanel extends VerticalPanel { private static final AbstractImagePrototype abstractImagePrototype = new AbstractImagePrototype() { public void applyTo(Image image) { } public Image createImage() { return null; } public String getHTML() { return "<table class=\"split_panel_ver_table\"><tr><td><table class=\"split_panel_sub_ver_table\"><tr><td><img width=\"1px\" height=\"1px\" src=\"clear.cache.gif\"/></td></tr></table></td></tr></table>"; } }; private final VerticalSplitPanel panel; private ArrayList<ResizeListener> listeners; private boolean splitEnabled=true; private String position="50%"; private boolean activated; private boolean disableScrollingTop=true; private boolean disableScrollingBottom=true; public TrueVerticalSplitPanel() { panel = new VerticalSplitPanel(new VerticalPanelSplitter()); setSize("100%", "100%"); panel.setSize("100%", "100%"); super.add(panel); setCellHeight(panel, "100%"); setCellWidth(panel, "100%"); // panel.addStyleName(cursorStyle); } // public TrueVerticalSplitPanel(Widget topVidget, Widget bottomWidget) { // setSize("100%", "100%"); // panel = new VerticalSplitPanel(new VerticalPanelSplitter()); // panel.setTopWidget(topVidget); // panel.setBottomWidget(bottomWidget); // panel.setSize("100%", "100%"); // super.add(panel); // setCellHeight(panel, "100%"); // setCellWidth(panel, "100%"); //// panel.addStyleName(cursorStyle); // } public TrueVerticalSplitPanel(boolean enableScrollingTop, boolean enableScrollingBottom) { this(); this.disableScrollingTop = (enableScrollingTop==false); this.disableScrollingBottom = (enableScrollingBottom==false); } /** * @deprecated User setTopWidget or setBottomWidget * @param widget */ public void add(Widget widget) { } /** * @deprecated User setTopWidget or setBottomWidget * @param widget */ public boolean remove(Widget widget) { return false; } /** * @deprecated User setTopWidget or setBottomWidget * @param widget */ public int getWidgetsCount() { return 0; } public void activate() { if (activated==false) { activated = true; //not initialized yet DeferredCommand.addCommand(new Command() { public void execute() { panel.setSplitPosition(position); onActivate(); } }); } } protected void onActivate() { } public void setTopWidget(Widget widget) { panel.setTopWidget(widget); } public void setBottomWidget(Widget widget) { panel.setBottomWidget(widget); } public void setStyleName(String style) { super.setStyleName(style); panel.setStyleName(style); // if (splitEnabled) { // panel.addStyleName(cursorStyle); // } } public void addStyleName(String style) { super.addStyleName(style); panel.addStyleName(style); } public void removeStyleName(String style) { super.removeStyleName(style); panel.removeStyleName(style); } public void setSplitPosition(String pos) { position = pos; panel.setSplitPosition(pos); } protected void onAttach() { super.onAttach(); EventListener interseptor = new EventListener() { public void onBrowserEvent(Event event) { if (splitEnabled==false) { return; } boolean resize = panel.isResizing(); panel.onBrowserEvent(event); if (resize && DOM.eventGetType(event)==Event.ONMOUSEUP && listeners !=null) { //change size if (listeners.size()==1) { //most of cases ((ResizeListener)listeners.get(0)).onResize(TrueVerticalSplitPanel.this); } else { for (int i=0;i<listeners.size();i++) { ((ResizeListener)listeners.get(i)).onResize(TrueVerticalSplitPanel.this); } } } } }; Element element = panel.getElement(); int events = DOM.getEventsSunk(element); DOM.setEventListener(element,interseptor); DOM.sinkEvents(element, events); if (disableScrollingTop && panel.getTopWidget() != null) { Element el = DOM.getParent(panel.getTopWidget().getElement()); DOM.setStyleAttribute(el, "overflow", "hidden"); } if (disableScrollingBottom &&panel.getBottomWidget() != null) { Element el = DOM.getParent(panel.getBottomWidget().getElement()); DOM.setStyleAttribute(el, "overflow", "hidden"); } } public void addResizeListener(ResizeListener listener) { if (listeners==null) { listeners = new ArrayList<ResizeListener>(); } listeners.add(listener); } public void removeResizeListener(ResizeListener listener) { if (listeners==null) { return; } listeners.remove(listener); } public boolean isSplitEnabled() { return splitEnabled; } public void setSplitEnabled(boolean splitEnabled) { if (splitEnabled) { if (this.splitEnabled==false) { // panel.addStyleName(cursorStyle); setSplitElement("<div class='vsplitter' " + "style='text-align:center;'>" + abstractImagePrototype.getHTML() + "</div>"); } } else { if (this.splitEnabled) { // panel.removeStyleName(cursorStyle); setSplitElement(" "); } } this.splitEnabled = splitEnabled; } private void setSplitElement(String elem) { Element element = DOM.getChild(panel.getElement(), 0); if (element != null) { Element elementSplit = DOM.getChild(element, 1); if (elementSplit != null) { DOM.setInnerHTML(elementSplit,elem ); } } } /** * Splitter for Horizontal Split Panel * @author ggadyatskiy * */ public class VerticalPanelSplitter implements VerticalSplitPanelImages { public AbstractImagePrototype verticalSplitPanelThumb() { return abstractImagePrototype; }; } public int getSplitPosition() { Element element = DOM.getChild(panel.getElement(), 0); if (element == null) { return 0; } else { return DOM.getChild(element, 0).getOffsetHeight(); } } }