/* * Smart GWT (GWT for SmartClient) * Copyright 2008 and beyond, Isomorphic Software, Inc. * * Smart GWT is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. Smart GWT is also * available under typical commercial license terms - see * http://smartclient.com/license * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package com.smartgwt.client.widgets.tab; import com.smartgwt.client.event.*; import com.smartgwt.client.core.*; import com.smartgwt.client.types.*; import com.smartgwt.client.data.*; import com.smartgwt.client.data.events.*; import com.smartgwt.client.rpc.*; import com.smartgwt.client.widgets.*; import com.smartgwt.client.widgets.events.*; import com.smartgwt.client.widgets.form.*; import com.smartgwt.client.widgets.form.validator.*; import com.smartgwt.client.widgets.form.fields.*; import com.smartgwt.client.widgets.tile.*; import com.smartgwt.client.widgets.tile.events.*; import com.smartgwt.client.widgets.grid.*; import com.smartgwt.client.widgets.grid.events.*; import com.smartgwt.client.widgets.chart.*; import com.smartgwt.client.widgets.layout.*; import com.smartgwt.client.widgets.layout.events.*; import com.smartgwt.client.widgets.menu.*; import com.smartgwt.client.widgets.tab.*; import com.smartgwt.client.widgets.toolbar.*; import com.smartgwt.client.widgets.tree.*; import com.smartgwt.client.widgets.tree.events.*; import com.smartgwt.client.widgets.viewer.*; import com.smartgwt.client.widgets.calendar.*; import com.smartgwt.client.widgets.calendar.events.*; import com.smartgwt.client.widgets.cube.*; import java.util.Date; import java.util.List; import java.util.Map; import java.util.HashMap; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.Element; import com.smartgwt.client.util.*; import com.google.gwt.event.shared.*; import com.google.gwt.event.shared.HasHandlers; /** * Tabs are specified as objects, not class instances. For example, when * developing in JavaScript, a typical initialization block for a TabSet would look like * this: * <pre> * TabSet.create({ * tabs: [ * {title: "tab1", pane: "pane1"}, * {title: "tab2"} * ] * }); * </pre> * And in XML: * <pre> * <TabSet> * <tabs> * <Tab title="tab1" pane="pane1"/> * <Tab title="tab2"/> * </tabs> * </TabSet> * </pre> */ public class Tab extends RefDataClass implements com.smartgwt.client.widgets.tab.events.HasTabDeselectedHandlers, com.smartgwt.client.widgets.tab.events.HasTabSelectedHandlers { public static Tab getOrCreateRef(JavaScriptObject jsObj) { if(jsObj == null) return null; RefDataClass obj = RefDataClass.getRef(jsObj); if(obj != null) { obj.setJsObj(jsObj); return (Tab) obj; } else { return new Tab(jsObj); } } public Tab(){ setID(com.smartgwt.client.util.SC.generateID(getClass().getName())); } public Tab(JavaScriptObject jsObj){ super(jsObj); } public Tab(String title) { setTitle(title); setID(com.smartgwt.client.util.SC.generateID(getClass().getName())); } public Tab(String title, String icon) { setTitle(title); setIcon(icon); setID(com.smartgwt.client.util.SC.generateID(getClass().getName())); } // ********************* Properties / Attributes *********************** /** * Determines whether this tab should show an icon allowing the user to dismiss the tab by clicking on it directly. The URL * for this icon's image will be derived from {@link com.smartgwt.client.widgets.tab.TabSet#getCloseTabIcon closeTabIcon} * by default, but may be overridden by explicitly specifying {@link com.smartgwt.client.widgets.tab.Tab#getCloseIcon * closeIcon}. <P> If unset, this property is derived from {@link com.smartgwt.client.widgets.tab.TabSet#getCanCloseTabs * canCloseTabs} * * @param canClose canClose Default value is null * @see com.smartgwt.client.widgets.tab.TabSet#closeClick * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_tabs_closeable" target="examples">Closeable Tabs Example</a> */ public void setCanClose(Boolean canClose) { setAttribute("canClose", canClose); } /** * Determines whether this tab should show an icon allowing the user to dismiss the tab by clicking on it directly. The URL * for this icon's image will be derived from {@link com.smartgwt.client.widgets.tab.TabSet#getCloseTabIcon closeTabIcon} * by default, but may be overridden by explicitly specifying {@link com.smartgwt.client.widgets.tab.Tab#getCloseIcon * closeIcon}. <P> If unset, this property is derived from {@link com.smartgwt.client.widgets.tab.TabSet#getCanCloseTabs * canCloseTabs} * * * @return Boolean * @see com.smartgwt.client.widgets.tab.TabSet#closeClick * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_tabs_closeable" target="examples">Closeable Tabs Example</a> */ public Boolean getCanClose() { return getAttributeAsBoolean("canClose"); } /** * If specified, overrides the {@link com.smartgwt.client.widgets.tab.TabSet#getCanEditTabTitles canEditTabTitles} setting, * for this one tab only. * * @param canEditTitle canEditTitle Default value is null * @see com.smartgwt.client.widgets.tab.TabSet#setCanEditTabTitles */ public void setCanEditTitle(Boolean canEditTitle) { setAttribute("canEditTitle", canEditTitle); } /** * If specified, overrides the {@link com.smartgwt.client.widgets.tab.TabSet#getCanEditTabTitles canEditTabTitles} setting, * for this one tab only. * * * @return Boolean * @see com.smartgwt.client.widgets.tab.TabSet#getCanEditTabTitles */ public Boolean getCanEditTitle() { return getAttributeAsBoolean("canEditTitle"); } /** * Custom src for the close icon for this tab to display if it is closeable. See {@link * com.smartgwt.client.widgets.tab.Tab#getCanClose canClose} and {@link * com.smartgwt.client.widgets.tab.TabSet#getCanCloseTabs canCloseTabs}. * * @param closeIcon closeIcon Default value is null */ public void setCloseIcon(String closeIcon) { setAttribute("closeIcon", closeIcon); } /** * Custom src for the close icon for this tab to display if it is closeable. See {@link * com.smartgwt.client.widgets.tab.Tab#getCanClose canClose} and {@link * com.smartgwt.client.widgets.tab.TabSet#getCanCloseTabs canCloseTabs}. * * * @return String */ public String getCloseIcon() { return getAttributeAsString("closeIcon"); } /** * Size of the {@link com.smartgwt.client.widgets.tab.Tab#getCloseIcon closeIcon} for this tab. If unspecified the icon * will be sized according to {@link com.smartgwt.client.widgets.tab.TabSet#getCloseTabIconSize closeTabIconSize} * * @param closeIconSize closeIconSize Default value is null */ public void setCloseIconSize(Integer closeIconSize) { setAttribute("closeIconSize", closeIconSize); } /** * Size of the {@link com.smartgwt.client.widgets.tab.Tab#getCloseIcon closeIcon} for this tab. If unspecified the icon * will be sized according to {@link com.smartgwt.client.widgets.tab.TabSet#getCloseTabIconSize closeTabIconSize} * * * @return Integer */ public Integer getCloseIconSize() { return getAttributeAsInt("closeIconSize"); } /** * If {@link com.smartgwt.client.widgets.tab.Tab#getIcon icon} is specified, this property may be used to specify a size * for the icon * * @param iconHeight iconHeight Default value is null */ public void setIconHeight(Integer iconHeight) { setAttribute("iconHeight", iconHeight); } /** * If {@link com.smartgwt.client.widgets.tab.Tab#getIcon icon} is specified, this property may be used to specify a size * for the icon * * * @return Integer */ public Integer getIconHeight() { return getAttributeAsInt("iconHeight"); } /** * If {@link com.smartgwt.client.widgets.tab.Tab#getIcon icon} is specified, this property may be used to specify a size * for the icon. Per side sizing may be specified instead via {@link com.smartgwt.client.widgets.tab.Tab#getIconWidth * iconWidth} and {@link com.smartgwt.client.widgets.tab.Tab#getIconHeight iconHeight}. * * @param iconSize iconSize Default value is null */ public void setIconSize(Integer iconSize) { setAttribute("iconSize", iconSize); } /** * If {@link com.smartgwt.client.widgets.tab.Tab#getIcon icon} is specified, this property may be used to specify a size * for the icon. Per side sizing may be specified instead via {@link com.smartgwt.client.widgets.tab.Tab#getIconWidth * iconWidth} and {@link com.smartgwt.client.widgets.tab.Tab#getIconHeight iconHeight}. * * * @return Integer */ public Integer getIconSize() { return getAttributeAsInt("iconSize"); } /** * If {@link com.smartgwt.client.widgets.tab.Tab#getIcon icon} is specified, this property may be used to specify a size * for the icon * * @param iconWidth iconWidth Default value is null */ public void setIconWidth(Integer iconWidth) { setAttribute("iconWidth", iconWidth); } /** * If {@link com.smartgwt.client.widgets.tab.Tab#getIcon icon} is specified, this property may be used to specify a size * for the icon * * * @return Integer */ public Integer getIconWidth() { return getAttributeAsInt("iconWidth"); } /** * If {@link com.smartgwt.client.widgets.tab.TabSet#getShowTabPicker showTabPicker} is true for this TabSet, if set this * property will determine the title of the picker menu item for this tab. If unset, {@link * com.smartgwt.client.widgets.tab.Tab#getTitle title} will be used instead * * @param pickerTitle pickerTitle Default value is null * @see com.smartgwt.client.widgets.tab.TabSet#setShowTabPicker * @see com.smartgwt.client.widgets.tab.Tab#setTitle */ public void setPickerTitle(String pickerTitle) { setAttribute("pickerTitle", pickerTitle); } /** * If {@link com.smartgwt.client.widgets.tab.TabSet#getShowTabPicker showTabPicker} is true for this TabSet, if set this * property will determine the title of the picker menu item for this tab. If unset, {@link * com.smartgwt.client.widgets.tab.Tab#getTitle title} will be used instead * * * @return String * @see com.smartgwt.client.widgets.tab.TabSet#getShowTabPicker * @see com.smartgwt.client.widgets.tab.Tab#getTitle */ public String getPickerTitle() { return getAttributeAsString("pickerTitle"); } /** * Specifies the prompt to be displayed when the mouse hovers over the tab. * * @param prompt prompt Default value is null */ public void setPrompt(String prompt) { setAttribute("prompt", prompt); } /** * Specifies the prompt to be displayed when the mouse hovers over the tab. * * * @return String */ public String getPrompt() { return getAttributeAsString("prompt"); } /** * You can specify an explicit width for the tab using this property. Note that tabs automatically size to make room for * the full title, but if you want to e.g. specify a uniform width for all tabs in a TabSet, this property enables you to * do so. * * @param width width Default value is 100 */ public void setWidth(int width) { setAttribute("width", width); } /** * You can specify an explicit width for the tab using this property. Note that tabs automatically size to make room for * the full title, but if you want to e.g. specify a uniform width for all tabs in a TabSet, this property enables you to * do so. * * * @return int */ public int getWidth() { return getAttributeAsInt("width"); } // ********************* Methods *********************** /** * Add a tabDeselected handler. * <p> * Optional handler to fire when a tab is deselected. Returning false will cancel the new selection, leaving this tab * selected. As with {@link com.smartgwt.client.widgets.tab.TabSet#addTabSelectedHandler TabSet.tabSelected} this method * only fires when the tabset is drawn. * * @param handler the tabDeselected handler * @return {@link HandlerRegistration} used to remove this handler */ public HandlerRegistration addTabDeselectedHandler(com.smartgwt.client.widgets.tab.events.TabDeselectedHandler handler) { if(getHandlerCount(com.smartgwt.client.widgets.tab.events.TabDeselectedEvent.getType()) == 0) setupTabDeselectedEvent(); return doAddHandler(handler, com.smartgwt.client.widgets.tab.events.TabDeselectedEvent.getType()); } private native void setupTabDeselectedEvent() /*-{ var obj = null; obj = this.@com.smartgwt.client.core.DataClass::getJsObj()(); var selfJ = this; obj.tabDeselected = $debox($entry(function(){ var param = {"tabSet" : arguments[0], "tabNum" : arguments[1], "tabPane" : arguments[2], "ID" : arguments[3], "tab" : arguments[4], "newTab" : arguments[5]}; var event = @com.smartgwt.client.widgets.tab.events.TabDeselectedEvent::new(Lcom/google/gwt/core/client/JavaScriptObject;)(param); selfJ.@com.smartgwt.client.core.DataClass::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event); var ret = event.@com.smartgwt.client.event.Cancellable::isCancelled()(); return !ret; })); }-*/; /** * Add a tabSelected handler. * <p> * Optional handler to fire when a tab is selected. As with {@link * com.smartgwt.client.widgets.tab.TabSet#addTabSelectedHandler TabSet.tabSelected} this method only fires when the tabset * is drawn. * * @param handler the tabSelected handler * @return {@link HandlerRegistration} used to remove this handler */ public HandlerRegistration addTabSelectedHandler(com.smartgwt.client.widgets.tab.events.TabSelectedHandler handler) { if(getHandlerCount(com.smartgwt.client.widgets.tab.events.TabSelectedEvent.getType()) == 0) setupTabSelectedEvent(); return doAddHandler(handler, com.smartgwt.client.widgets.tab.events.TabSelectedEvent.getType()); } private native void setupTabSelectedEvent() /*-{ var obj = null; obj = this.@com.smartgwt.client.core.DataClass::getJsObj()(); var selfJ = this; obj.tabSelected = $entry(function(){ var param = {"tabSet" : arguments[0], "tabNum" : arguments[1], "tabPane" : arguments[2], "ID" : arguments[3], "tab" : arguments[4]}; var event = @com.smartgwt.client.widgets.tab.events.TabSelectedEvent::new(Lcom/google/gwt/core/client/JavaScriptObject;)(param); selfJ.@com.smartgwt.client.core.DataClass::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event); }); }-*/; // ********************* Static Methods *********************** // *********************************************************** /** * Optional ID for the tab, which can later be used to reference the tab. APIs requiring a reference to a tab will accept * the tabs ID [including {@link com.smartgwt.client.widgets.tab.TabSet#selectTab TabSet.selectTab}, {@link * com.smartgwt.client.widgets.tab.TabSet#updateTab TabSet.updateTab}, {@link * com.smartgwt.client.widgets.tab.TabSet#removeTab TabSet.removeTab}].<br> The ID will also be passed to the {@link * com.smartgwt.client.widgets.tab.TabSet#addTabSelectedHandler TabSet.tabSelected} and {@link * com.smartgwt.client.widgets.tab.TabSet#addTabDeselectedHandler TabSet.tabDeselected} handler functions, if specified. * <p> Note that if you provide an ID, it must be globally unique. * * @param ID ID Default value is null */ public void setID(String ID) { IDManager.isValidID(ID); setAttribute("ID", ID); } /** * Optional ID for the tab, which can later be used to reference the tab. APIs requiring a reference to a tab will accept * the tabs ID [including {@link com.smartgwt.client.widgets.tab.TabSet#selectTab TabSet.selectTab}, {@link * com.smartgwt.client.widgets.tab.TabSet#updateTab TabSet.updateTab}, {@link * com.smartgwt.client.widgets.tab.TabSet#removeTab TabSet.removeTab}].<br> The ID will also be passed to the {@link * com.smartgwt.client.widgets.tab.TabSet#addTabSelectedHandler TabSet.tabSelected} and {@link * com.smartgwt.client.widgets.tab.TabSet#addTabDeselectedHandler TabSet.tabDeselected} handler functions, if specified. * <p> Note that if you provide an ID, it must be globally unique. * * * @return String */ public String getID() { return getAttributeAsString("ID"); } /** * Specifies the title of the this tab. To change the title after the TabSet has been created, call {@link * com.smartgwt.client.widgets.tab.TabSet#setTabTitle TabSet.setTabTitle}. * * @param title title Default value is null */ public void setTitle(String title) { if(tabSet == null || !tabSet.isDrawn()) { setAttribute("title", title); } else { tabSet.setTabTitle(this, title); } } /** * Specifies the title of the this tab. * * @return String */ public String getTitle() { if(tabSet == null || !tabSet.isDrawn()) { return getAttributeAsString("title"); } else { return tabSet.getTab(getID()).getAttributeAsString("title"); } } /** * If specified, this tab will initially be rendered in a disabled state. * * @param disabled disabled Default value is null */ public void setDisabled(boolean disabled) { if(tabSet == null || !tabSet.isDrawn()) { setAttribute("disabled", disabled); } else { if(disabled) { tabSet.disableTab(getID()); } else { tabSet.enableTab(getID()); } } } /** * If specified, this tab will initially be rendered in a disabled state. To enable or disable tabs on the fly use the * {@link com.smartgwt.client.widgets.tab.TabSet#enableTab TabSet.enableTab}, and {@link * com.smartgwt.client.widgets.tab.TabSet#disableTab TabSet.disableTab} methods. * * * @return Boolean */ public Boolean getDisabled() { if(tabSet == null || !tabSet.isDrawn()) { return getAttributeAsBoolean("disabled"); } else { return tabSet.getTab(getID()).getAttributeAsBoolean("disabled"); } } /** * If specified, this tab will show an icon next to the tab title. Note that as with {@link * com.smartgwt.client.widgets.Button#getIcon icon}, the URL of a tabs icon will be updated to reflect disabled state.<br> * If desired a click handler may be assigned to the icon, which will be fired when the user clicks the tab. This method * takes a single parameter <code>tab</code>, a pointer to the tab object. * * @param icon icon Default value is null * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_tabs_orientation" target="examples">Orientation Example</a> */ public void setIcon(String icon) { if(tabSet == null || !tabSet.isDrawn()) { setAttribute("icon", icon); } else { tabSet.setTabIcon(getID(), icon); } } /** * If specified, this tab will show an icon next to the tab title. Note that as with {@link * com.smartgwt.client.widgets.Button#getIcon icon}, the URL of a tabs icon will be updated to reflect disabled state.<br> * If desired a click handler may be assigned to the icon, which will be fired when the user clicks the tab. This method * takes a single parameter <code>tab</code>, a pointer to the tab object. * * @param icon icon Default value is null * @param iconWidth the icon width * @param iconHeight the icon height * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_tabs_orientation" target="examples">Orientation Example</a> */ public void setIcon(String icon, int iconWidth, int iconHeight) { setIcon(icon); setIconWidth(iconWidth); setIconHeight(iconHeight); } /** * If specified, this tab will show an icon next to the tab title. Note that as with {@link * com.smartgwt.client.widgets.Button#getIcon icon}, the URL of a tabs icon will be updated to reflect disabled state.<br> * If desired a click handler may be assigned to the icon, which will be fired when the user clicks the tab. This method * takes a single parameter <code>tab</code>, a pointer to the tab object. * * @param icon icon Default value is null * @param iconSize the icon size * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_tabs_orientation" target="examples">Orientation Example</a> */ public void setIcon(String icon, int iconSize) { setIcon(icon); setIconSize(iconSize); } /** * If specified, this tab will show an icon next to the tab title. Note that as with {@link * com.smartgwt.client.widgets.Button#getIcon icon}, the URL of a tabs icon will be updated to reflect disabled state.<br> * If desired a click handler may be assigned to the icon, which will be fired when the user clicks the tab. This method * takes a single parameter <code>tab</code>, a pointer to the tab object. * * * @return String * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_tabs_orientation" target="examples">Orientation Example</a> */ public String getIcon() { if(tabSet == null || !tabSet.isDrawn()) { return getAttributeAsString("icon"); } else { return tabSet.getTab(getID()).getAttributeAsString("icon"); } } public void setCanClose(boolean canClose) { setAttribute("canClose", canClose); } public void setPaneID(String paneID) { setAttribute("pane", paneID); } /** * Provide a separate style for the title text. If set and the ImgTab is vertical, a "v" will be automatically * prepended to the style name (hence "tabTitle" -> "vtabTitle"). * * @param titleStyle the title style */ public void setTitleStyle(String titleStyle) { setAttribute("titleStyle", titleStyle); } /** * A separate style for the title text. If set and the ImgTab is vertical, a "v" will be automatically * prepended to the style name (hence "tabTitle" -> "vtabTitle"). * * @return the title style */ public String getTitleStyle() { return getAttribute("titleStyle"); } /** * Specifies the pane associated with this tab. You can change the pane associated with a given tab after the TabSet * has been created by calling {@link com.smartgwt.client.widgets.tab.TabSet#updateTab(int, com.smartgwt.client.widgets.Canvas)} * * @param pane the tab pane */ public void setPane(Canvas pane) { if (tabSet == null || !tabSet.isCreated()) { setAttribute("pane", pane.getOrCreateJsObj()); } else { tabSet.updateTab(this, pane); } } /** * The pane associated with the tab. * * @return the tab pane */ public Canvas getPane() { return Canvas.getOrCreateRef(getAttributeAsJavaScriptObject("pane")); } /** * Context menu to show for this tab. * * @param contextMenu contextMenu Default value is null */ public void setContextMenu(Menu contextMenu) { setAttribute("contextMenu", contextMenu.getOrCreateJsObj()); } /** * Context menu to show for this object, an instance of the Menu widget. * * @return Menu */ public Menu getContextMenu() { return Menu.getOrCreateRef(getAttributeAsJavaScriptObject("contextMenu")); } private TabSet tabSet; public TabSet getTabSet() { return tabSet; } public void setTabSet(TabSet tabSet) { this.tabSet = tabSet; } private static boolean isTab(JavaScriptObject jsObj) { Object ref = JSOHelper.getAttributeAsObject((JavaScriptObject) jsObj, SC.REF); return ref instanceof Tab; } private static TabSet getTabSet(JavaScriptObject jsObj) { Object ref = JSOHelper.getAttributeAsObject((JavaScriptObject) jsObj, SC.REF); if(ref instanceof Tab) { return ((Tab) ref).getTabSet(); } else { return null; } } /** * Returns the live Canvas used to represent this tab in a tabSet. * Will return null if this Tab has not been added to a TabSet or if the tabset is not yet drawn. * <P> * The underlying SmartClient class of the returned canvas depends on {@link #getUseSimpleTabs}. * If this property is false, the returned canvas will be a {@link com.smartgwt.client.widgets.tab.ImgTab} * instance. If true the canvas will be a {@link com.smartgwt.client.widgets.tab.Button} instance. * Note that you can make use of ImgTab APIs by using the <code>getJsObj()</code> and <code>create()</code> * APIs to "cast" to the appropriate type - for example:<br> * <code>ImgTab liveTab = ImgTab.create(myTabSet.getTabCanvas(2).getJsObj());</code> * @return live Canvas for this tab in a tabSet. */ public StatefulCanvas getTabCanvas () { if (tabSet == null) return null; JavaScriptObject canvasJS = this.getTabCanvasJS(tabSet.getJsObj(), this.getJsObj()); if (canvasJS == null) return null; return StatefulCanvas.getOrCreateRef(canvasJS); } private native JavaScriptObject getTabCanvasJS (JavaScriptObject tabSet, JavaScriptObject tabConfig) /*-{ if (tabSet == null || tabConfig == null) return null; var tab = tabSet.getTab(tabConfig); if ($wnd.isc.isA.Canvas(tab)) return tab; return null; }-*/; }