package com.eas.widgets;
import com.eas.core.HasPublished;
import com.eas.core.XElement;
import com.eas.menu.HasComponentPopupMenu;
import com.eas.menu.PlatypusPopupMenu;
import com.eas.ui.HasEventsExecutor;
import com.eas.ui.HasImageResource;
import com.eas.ui.HasJsFacade;
import com.eas.ui.events.AddEvent;
import com.eas.ui.events.AddHandler;
import com.eas.ui.events.EventsExecutor;
import com.eas.ui.events.HasAddHandlers;
import com.eas.ui.events.HasHideHandlers;
import com.eas.ui.events.HasRemoveHandlers;
import com.eas.ui.events.HasShowHandlers;
import com.eas.ui.events.HideEvent;
import com.eas.ui.events.HideHandler;
import com.eas.ui.events.RemoveEvent;
import com.eas.ui.events.RemoveHandler;
import com.eas.ui.events.ShowEvent;
import com.eas.ui.events.ShowHandler;
import com.eas.widgets.boxes.ImageLabel;
import com.eas.widgets.containers.TabsDecoratedPanel;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.event.logical.shared.HasResizeHandlers;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasEnabled;
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TabLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
public class TabbedPane extends TabsDecoratedPanel implements HasJsFacade, HasEnabled, HasComponentPopupMenu, HasEventsExecutor, HasShowHandlers, HasHideHandlers, HasResizeHandlers, HasAddHandlers,
HasRemoveHandlers, HasChildrenPosition {
public static class TabLabel extends FlowPanel implements HasHTML, HasImageResource {
protected ImageLabel label;
protected SimplePanel closer = new SimplePanel();
protected Widget subject;
public TabLabel(final TabLayoutPanel aParentTabs, final Widget subject, String aText, boolean asHtml, ImageResource aImage) {
label = new ImageLabel(aText, asHtml, aImage);
closer.getElement().getStyle().setDisplay(Style.Display.INLINE_BLOCK);
closer.getElement().getStyle().setVerticalAlign(Style.VerticalAlign.TOP);
closer.getElement().addClassName("tab-close-tool");
closer.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
aParentTabs.remove(subject);
}
}, ClickEvent.getType());
add(label);
add(closer);
label.setImageResource(aImage);
}
@Override
public String getText() {
return label.getText();
}
@Override
public void setText(String text) {
label.setText(text);
}
@Override
public String getHTML() {
return label.getHTML();
}
@Override
public void setHTML(String html) {
label.setHTML(html);
}
@Override
public ImageResource getImageResource() {
return label.getImageResource();
}
@Override
public void setImageResource(ImageResource aValue) {
label.setImageResource(aValue);
}
}
protected EventsExecutor eventsExecutor;
protected PlatypusPopupMenu menu;
protected boolean enabled = true;
protected String name;
protected JavaScriptObject published;
public TabbedPane() {
super(30, Style.Unit.PX);
getElement().getStyle().setOverflow(Style.Overflow.HIDDEN);
getElement().getStyle().setPosition(Style.Position.RELATIVE);
}
@Override
public HandlerRegistration addAddHandler(AddHandler handler) {
return addHandler(handler, AddEvent.getType());
}
@Override
public HandlerRegistration addRemoveHandler(RemoveHandler handler) {
return addHandler(handler, RemoveEvent.getType());
}
@Override
public HandlerRegistration addResizeHandler(ResizeHandler handler) {
return addHandler(handler, ResizeEvent.getType());
}
@Override
public void onResize() {
super.onResize();
if (isAttached()) {
ResizeEvent.fire(this, getElement().getOffsetWidth(), getElement().getOffsetHeight());
}
}
@Override
public HandlerRegistration addHideHandler(HideHandler handler) {
return addHandler(handler, HideEvent.getType());
}
@Override
public HandlerRegistration addShowHandler(ShowHandler handler) {
return addHandler(handler, ShowEvent.getType());
}
@Override
public void setVisible(boolean visible) {
boolean oldValue = isVisible();
super.setVisible(visible);
if (oldValue != visible) {
if (visible) {
ShowEvent.fire(this, this);
} else {
HideEvent.fire(this, this);
}
}
}
@Override
public EventsExecutor getEventsExecutor() {
return eventsExecutor;
}
@Override
public void setEventsExecutor(EventsExecutor aExecutor) {
eventsExecutor = aExecutor;
}
@Override
public PlatypusPopupMenu getPlatypusPopupMenu() {
return menu;
}
protected HandlerRegistration menuTriggerReg;
@Override
public void setPlatypusPopupMenu(PlatypusPopupMenu aMenu) {
if (menu != aMenu) {
if (menuTriggerReg != null)
menuTriggerReg.removeHandler();
menu = aMenu;
if (menu != null) {
menuTriggerReg = super.addDomHandler(new ContextMenuHandler() {
@Override
public void onContextMenu(ContextMenuEvent event) {
event.preventDefault();
event.stopPropagation();
menu.setPopupPosition(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY());
menu.show();
}
}, ContextMenuEvent.getType());
}
}
}
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void setEnabled(boolean aValue) {
boolean oldValue = enabled;
enabled = aValue;
if (!oldValue && enabled) {
getElement().<XElement> cast().unmask();
} else if (oldValue && !enabled) {
getElement().<XElement> cast().disabledMask();
}
}
@Override
public String getJsName() {
return name;
}
@Override
public void setJsName(String aValue) {
name = aValue;
}
public void add(final Widget child, String text, boolean asHtml, ImageResource aImage) {
tabs.insert(child, new TabLabel(tabs, child, text, asHtml, aImage), tabs.getWidgetCount());
AddEvent.fire(this, child);
}
public void add(final Widget child, TabLabel aLabel) {
tabs.insert(child, aLabel, tabs.getWidgetCount());
AddEvent.fire(this, child);
}
public TabLayoutPanel getTabs(){
return tabs;
}
@Override
public boolean remove(Widget w) {
boolean res = super.remove(w);
if (res) {
RemoveEvent.fire(this, w);
}
return res;
}
public int getSelectedIndex() {
return selected != null ? tabs.getSelectedIndex() : -1;
}
public void setSelectedIndex(int aIndex) {
if (aIndex != -1)
tabs.selectTab(aIndex);
else
setSelected(null);
}
public Widget getSelected() {
return selected;
}
public void setSelected(Widget aWidget) {
if (selected != aWidget && (aWidget == null || tabs.getWidgetIndex(aWidget) != -1)) {
selected = aWidget;
if (selected != null)
tabs.selectTab(selected);
}
}
@Override
public JavaScriptObject getPublished() {
return published;
}
@Override
public void setPublished(JavaScriptObject aValue) {
if (published != aValue) {
published = aValue;
if (published != null) {
publish(this, aValue);
}
}
}
private native static void publish(HasPublished aWidget, JavaScriptObject published)/*-{
Object.defineProperty(published, "selectedIndex", {
get : function() {
return aWidget.@com.eas.widgets.TabbedPane::getSelectedIndex()();
},
set : function(aValue) {
aWidget.@com.eas.widgets.TabbedPane::setSelectedIndex(I)(aValue);
}
});
Object.defineProperty(published, "selectedComponent", {
get : function() {
var comp = aWidget.@com.eas.widgets.TabbedPane::getSelected()();
return @com.eas.core.Utils::checkPublishedComponent(Ljava/lang/Object;)(comp);
},
set : function(aValue) {
if(aValue != null)
aWidget.@com.eas.widgets.TabbedPane::setSelected(Lcom/google/gwt/user/client/ui/Widget;)(aValue.unwrap());
}
});
published.add = function(toAdd, aTabTitle, aTabIcon){
if(toAdd && toAdd.unwrap){
if(toAdd.parent == published)
throw 'A widget already added to this container';
if(!aTabTitle)
aTabTitle = "";
if(!aTabIcon)
aTabIcon = null;
if(aTabTitle.indexOf("<html>") == 0)
aWidget.@com.eas.widgets.TabbedPane::add(Lcom/google/gwt/user/client/ui/Widget;Ljava/lang/String;ZLcom/google/gwt/resources/client/ImageResource;)(toAdd.unwrap(), aTabTitle.substring(6), true, aTabIcon);
else
aWidget.@com.eas.widgets.TabbedPane::add(Lcom/google/gwt/user/client/ui/Widget;Ljava/lang/String;ZLcom/google/gwt/resources/client/ImageResource;)(toAdd.unwrap(), aTabTitle, false, aTabIcon);
}
};
}-*/;
@Override
public int getTop(Widget aWidget) {
assert aWidget.getParent() == this : "widget should be a child of this container";
return 0;
}
@Override
public int getLeft(Widget aWidget) {
assert aWidget.getParent() == this : "widget should be a child of this container";
return 0;
}
}