package com.iambookmaster.client.common;
import java.util.ArrayList;
import java.util.List;
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.HorizontalSplitPanel;
import com.google.gwt.user.client.ui.HorizontalSplitPanelImages;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class TrueHorizontalSplitPanel extends VerticalPanel {
// private static final String cursorStyle = "sp4_split_panel_cursor";
private static final AbstractImagePrototype abstractImagePrototype = new AbstractImagePrototype() {
public void applyTo(Image image) {
}
public Image createImage() {
return null;
}
public String getHTML() {
return "<table class=\"spilit_panel_table\"><tr><td><table class=\"spilit_panel_sub_table\"><tr><td><img width=\"1px\" height=\"1px\" src=\"clear.cache.gif\"/></td></tr></table></td></tr></table>";
}
};
private final HorizontalSplitPanel panel;
private List<ResizeListener> listeners = new ArrayList<ResizeListener>();
private boolean splitEnabled=true;
private String position="50%";
private boolean activated;
public TrueHorizontalSplitPanel() {
panel = new HorizontalSplitPanel(new HorizontalPanelSplitter());
setSize("100%", "100%");
super.add(panel);
setCellHeight(panel, "100%");
setCellWidth(panel, "100%");
}
/**
* @deprecated Use setLeftWidget or setRightWidget
* @param widget
*/
public void add(Widget widget) {
}
/**
* @deprecated Use setLeftWidget or setRightWidget
* @param widget
*/
public boolean remove(Widget widget) {
return false;
}
/**
* @deprecated Use setLeftWidget or setRightWidget
* @param widget
*/
public int getWidgetsCount() {
return 0;
}
public void setLeftWidget(Widget widget) {
panel.setLeftWidget(widget);
}
public void setRightWidget(Widget widget) {
panel.setRightWidget(widget);
}
public void setStyleName(String style) {
super.setStyleName(style);
panel.setStyleName(style);
}
public void addStyleName(String style) {
super.addStyleName(style);
panel.addStyleName(style);
}
public void removeStyleName(String style) {
super.removeStyleName(style);
panel.removeStyleName(style);
}
public void activate() {
if (activated==false) {
activated = true;
//not initialized yet
DeferredCommand.addCommand(new Command() {
public void execute() {
panel.setSplitPosition(position);
fireResizeListeners();
}
});
}
}
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
fireResizeListeners();
}
}
};
Element element = panel.getElement();
int events = DOM.getEventsSunk(element);
DOM.setEventListener(element,interseptor);
DOM.sinkEvents(element, events);
if (panel.getLeftWidget() != null) {
Element el = DOM.getParent(panel.getLeftWidget().getElement());
DOM.setStyleAttribute(el, "overflow", "hidden");
}
if (panel.getRightWidget() != null) {
Element el = DOM.getParent(panel.getRightWidget().getElement());
DOM.setStyleAttribute(el, "overflow", "hidden");
}
}
private void fireResizeListeners() {
if (listeners.size()==1) {
//most of cases
((ResizeListener)listeners.get(0)).onResize(TrueHorizontalSplitPanel.this);
} else {
for (int i=0;i<listeners.size();i++) {
((ResizeListener)listeners.get(i)).onResize(TrueHorizontalSplitPanel.this);
}
}
}
public void addResizeListener(ResizeListener listener) {
listeners.add(listener);
}
public void removeResizeListener(ResizeListener listener) {
listeners.remove(listener);
}
public boolean isSplitEnabled() {
return splitEnabled;
}
public void setSplitEnabled(boolean splitEnabled) {
if (splitEnabled) {
if (this.splitEnabled=false) {
setSplitElement("<table class='hsplitter' height='100%' cellpadding='0' "
+ "cellspacing='0'><tr><td align='center' valign='middle'>"
+ abstractImagePrototype.getHTML());
}
} else {
if (this.splitEnabled) {
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 HorizontalPanelSplitter implements HorizontalSplitPanelImages {
public AbstractImagePrototype horizontalSplitPanelThumb() {
return abstractImagePrototype;
};
}
}