/* * 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.layout; 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; /** * A container that manages a list of sections of widgets, each with a header. Sometimes called an "Accordion". <P> * SectionStack can be configured so that only one section is visible at a time (similar to MS Outlook's left-hand Nav), or * to allow multiple sections to be visible and share the available space. */ public class SectionStack extends VLayout implements com.smartgwt.client.widgets.layout.events.HasSectionHeaderClickHandlers { public static SectionStack getOrCreateRef(JavaScriptObject jsObj) { if(jsObj == null) return null; BaseWidget obj = BaseWidget.getRef(jsObj); if(obj != null) { return (SectionStack) obj; } else { return new SectionStack(jsObj); } } public SectionStack(){ scClassName = "SectionStack"; } public SectionStack(JavaScriptObject jsObj){ super(jsObj); } protected native JavaScriptObject create()/*-{ var config = this.@com.smartgwt.client.widgets.BaseWidget::getConfig()(); var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName; var widget = $wnd.isc[scClassName].create(config); this.@com.smartgwt.client.widgets.BaseWidget::doInit()(); return widget; }-*/; // ********************* Properties / Attributes *********************** /** * If true, sections are animated during expand/collapse and addition/removal of SectionItems is likewise animated. * * @param animateSections animateSections Default value is null * @see <a href="http://www.smartclient.com/smartgwt/showcase/#effects_animation_sections" target="examples">Section Reveal Example</a> */ public void setAnimateSections(Boolean animateSections) { setAttribute("animateSections", animateSections, true); } /** * If true, sections are animated during expand/collapse and addition/removal of SectionItems is likewise animated. * * * @return Boolean * @see <a href="http://www.smartclient.com/smartgwt/showcase/#effects_animation_sections" target="examples">Section Reveal Example</a> */ public Boolean getAnimateSections() { return getAttributeAsBoolean("animateSections"); } /** * Whether sections can be drag reordered by the user dragging the section header. <P> Note that, with * <code>canReorderSections:true</code>, sections with {@link * com.smartgwt.client.widgets.layout.SectionStackSection#getCanReorder section.canReorder:false} will not be able to be * drag-reordered (though their index may still be changed by dropping other sections above or below them in the section * stack). * <p><b>Note : </b> This is an advanced setting</p> * * @param canReorderSections canReorderSections Default value is false * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setCanReorderSections(Boolean canReorderSections) throws IllegalStateException { setAttribute("canReorderSections", canReorderSections, false); } /** * Whether sections can be drag reordered by the user dragging the section header. <P> Note that, with * <code>canReorderSections:true</code>, sections with {@link * com.smartgwt.client.widgets.layout.SectionStackSection#getCanReorder section.canReorder:false} will not be able to be * drag-reordered (though their index may still be changed by dropping other sections above or below them in the section * stack). * * * @return Boolean */ public Boolean getCanReorderSections() { return getAttributeAsBoolean("canReorderSections"); } /** * Whether sections can be drag resized by the user dragging the section header. <P> Note that, with * <code>canResizeSections:true</code>, not all sections can be resized: sections that contain only {@link * com.smartgwt.client.widgets.Button#getAutoFit autofitting} components or that are marked with {@link * com.smartgwt.client.widgets.layout.SectionStackSection#getResizeable section.resizeable:false} will not be resizeable. * <p><b>Note : </b> This is an advanced setting</p> * * @param canResizeSections canResizeSections Default value is true * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setCanResizeSections(Boolean canResizeSections) throws IllegalStateException { setAttribute("canResizeSections", canResizeSections, false); } /** * Whether sections can be drag resized by the user dragging the section header. <P> Note that, with * <code>canResizeSections:true</code>, not all sections can be resized: sections that contain only {@link * com.smartgwt.client.widgets.Button#getAutoFit autofitting} components or that are marked with {@link * com.smartgwt.client.widgets.layout.SectionStackSection#getResizeable section.resizeable:false} will not be resizeable. * * * @return Boolean */ public Boolean getCanResizeSections() { return getAttributeAsBoolean("canResizeSections"); } /** * If true, the headers for the sections (if shown) will be included in the page's tab order for accessibility. May be * overridden at the Section level via canTabToHeader <P> If unset, section headers will be focusable if * setScreenReaderMode has been called. See {@link com.smartgwt.client.docs.Accessibility}. * <p><b>Note : </b> This is an advanced setting</p> * * @param canTabToHeaders canTabToHeaders Default value is null * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setCanTabToHeaders(Boolean canTabToHeaders) throws IllegalStateException { setAttribute("canTabToHeaders", canTabToHeaders, false); } /** * If true, the headers for the sections (if shown) will be included in the page's tab order for accessibility. May be * overridden at the Section level via canTabToHeader <P> If unset, section headers will be focusable if * setScreenReaderMode has been called. See {@link com.smartgwt.client.docs.Accessibility}. * * * @return Boolean */ public Boolean getCanTabToHeaders() { return getAttributeAsBoolean("canTabToHeaders"); } /** * Height of headers for sections. * * @param headerHeight headerHeight Default value is 20 * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setHeaderHeight(int headerHeight) throws IllegalStateException { setAttribute("headerHeight", headerHeight, false); } /** * Height of headers for sections. * * * @return int */ public int getHeaderHeight() { return getAttributeAsInt("headerHeight"); } /** * Size, in pixels, of indentation of all member items relative to the end of the alignment axis. For instance, for * left-aligned members, itemStartIndent specifies indentation for every item from the right side of the section stack. * * @param itemEndIndent itemEndIndent Default value is undefined * @see com.smartgwt.client.docs.LayoutMember LayoutMember overview and related methods */ public void setItemEndIndent(int itemEndIndent) { setAttribute("itemEndIndent", itemEndIndent, true); } /** * Size, in pixels, of indentation of all member items relative to the end of the alignment axis. For instance, for * left-aligned members, itemStartIndent specifies indentation for every item from the right side of the section stack. * * * @return int * @see com.smartgwt.client.docs.LayoutMember LayoutMember overview and related methods */ public int getItemEndIndent() { return getAttributeAsInt("itemEndIndent"); } /** * Size, in pixels, of indentation of all member items. Items will be offset and reduced in width by this amount. * Overridden by {@link com.smartgwt.client.widgets.layout.SectionStack#getItemStartIndent itemStartIndent} or {@link * com.smartgwt.client.widgets.layout.SectionStack#getItemEndIndent itemEndIndent}. Setting itemIndent is equivalent to * setting itemStartIndent to the same amount and itemEndIndent to 0. * * @param itemIndent itemIndent Default value is 0 * @see com.smartgwt.client.docs.LayoutMember LayoutMember overview and related methods */ public void setItemIndent(int itemIndent) { setAttribute("itemIndent", itemIndent, true); } /** * Size, in pixels, of indentation of all member items. Items will be offset and reduced in width by this amount. * Overridden by {@link com.smartgwt.client.widgets.layout.SectionStack#getItemStartIndent itemStartIndent} or {@link * com.smartgwt.client.widgets.layout.SectionStack#getItemEndIndent itemEndIndent}. Setting itemIndent is equivalent to * setting itemStartIndent to the same amount and itemEndIndent to 0. * * * @return int * @see com.smartgwt.client.docs.LayoutMember LayoutMember overview and related methods */ public int getItemIndent() { return getAttributeAsInt("itemIndent"); } /** * Size, in pixels, of indentation of all member items relative to the start of the alignment axis. For instance, for * left-aligned members, itemStartIndent specifies indentation for every item from the left side of the section stack. * Overrides {@link com.smartgwt.client.widgets.layout.SectionStack#getItemIndent itemIndent}. * * @param itemStartIndent itemStartIndent Default value is undefined * @see com.smartgwt.client.docs.LayoutMember LayoutMember overview and related methods */ public void setItemStartIndent(int itemStartIndent) { setAttribute("itemStartIndent", itemStartIndent, true); } /** * Size, in pixels, of indentation of all member items relative to the start of the alignment axis. For instance, for * left-aligned members, itemStartIndent specifies indentation for every item from the left side of the section stack. * Overrides {@link com.smartgwt.client.widgets.layout.SectionStack#getItemIndent itemIndent}. * * * @return int * @see com.smartgwt.client.docs.LayoutMember LayoutMember overview and related methods */ public int getItemStartIndent() { return getAttributeAsInt("itemStartIndent"); } /** * When AutoTest.getElement is used to parse locator strings generated by link{isc.AutoTest.getLocator()}, how should * sections within this stack be identified? By default if section has a specified name this will always be used. For * sections with no name, the following options are available: <ul> <li><code>"title"</code> use the title as an * identifier</li> <li><code>"index"</code> use the index of the section in the sections array as an identifier</li> </ul> * If unset, and the section has no specified name, default behavior is to identify by title (if available), otherwise by * index. * <p><b>Note : </b> This is an advanced setting</p> * * @param locateSectionsBy locateSectionsBy Default value is null */ public void setLocateSectionsBy(LocatorStrategy locateSectionsBy) { setAttribute("locateSectionsBy", locateSectionsBy == null ? null : locateSectionsBy.getValue(), true); } /** * When AutoTest.getElement is used to parse locator strings generated by link{isc.AutoTest.getLocator()}, how should * sections within this stack be identified? By default if section has a specified name this will always be used. For * sections with no name, the following options are available: <ul> <li><code>"title"</code> use the title as an * identifier</li> <li><code>"index"</code> use the index of the section in the sections array as an identifier</li> </ul> * If unset, and the section has no specified name, default behavior is to identify by title (if available), otherwise by * index. * * * @return LocatorStrategy */ public LocatorStrategy getLocateSectionsBy() { return EnumUtil.getEnum(LocatorStrategy.values(), getAttribute("locateSectionsBy")); } /** * {@link com.smartgwt.client.types.LocatorTypeStrategy} to use when finding Sections within this section Stack. * <p><b>Note : </b> This is an advanced setting</p> * * @param locateSectionsType locateSectionsType Default value is null */ public void setLocateSectionsType(LocatorTypeStrategy locateSectionsType) { setAttribute("locateSectionsType", locateSectionsType == null ? null : locateSectionsType.getValue(), true); } /** * {@link com.smartgwt.client.types.LocatorTypeStrategy} to use when finding Sections within this section Stack. * * * @return LocatorTypeStrategy */ public LocatorTypeStrategy getLocateSectionsType() { return EnumUtil.getEnum(LocatorTypeStrategy.values(), getAttribute("locateSectionsType")); } /** * Normal {@link com.smartgwt.client.types.Overflow} settings can be used on layouts, for example, an overflow:auto Layout * will scroll if sections are resized to exceed the specified size, whereas an overflow:visible Layout will grow to * accommodate the resized sections. * * @param overflow overflow Default value is "hidden" * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setOverflow(Overflow overflow) throws IllegalStateException { setAttribute("overflow", overflow == null ? null : overflow.getValue(), false); } /** * Normal {@link com.smartgwt.client.types.Overflow} settings can be used on layouts, for example, an overflow:auto Layout * will scroll if sections are resized to exceed the specified size, whereas an overflow:visible Layout will grow to * accommodate the resized sections. * * * @return Overflow */ public Overflow getOverflow() { return EnumUtil.getEnum(Overflow.values(), getAttribute("overflow")); } /** * If an expanded or shown section expands past the current viewport and this property is true, then the viewport will * auto-scroll to fit as much of the section content into the viewport without scrolling the top of the section out of the * viewport. * * @param scrollSectionIntoView scrollSectionIntoView Default value is true * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setScrollSectionIntoView(Boolean scrollSectionIntoView) throws IllegalStateException { setAttribute("scrollSectionIntoView", scrollSectionIntoView, false); } /** * If an expanded or shown section expands past the current viewport and this property is true, then the viewport will * auto-scroll to fit as much of the section content into the viewport without scrolling the top of the section out of the * viewport. * * * @return Boolean */ public Boolean getScrollSectionIntoView() { return getAttributeAsBoolean("scrollSectionIntoView"); } /** * Name of a Smart GWT class to use for creating section headers. This will default to either {@link * com.smartgwt.client.widgets.layout.SectionHeader "SectionHeader"} or {@link * com.smartgwt.client.widgets.layout.ImgSectionHeader "ImgSectionHeader"} depending on the skin. You can use the * SmartClient class system to create a simple Smart GWT subclass of either SectionHeader or ImgSectionHeader for use * with this API - see the {@link com.smartgwt.client.docs.Skinning Skinning Guide} for details. * <p><b>Note : </b> This is an advanced setting</p> * * @param sectionHeaderClass sectionHeaderClass Default value is "SectionHeader" * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setSectionHeaderClass(String sectionHeaderClass) throws IllegalStateException { setAttribute("sectionHeaderClass", sectionHeaderClass, false); } /** * Name of a Smart GWT class to use for creating section headers. This will default to either {@link * com.smartgwt.client.widgets.layout.SectionHeader "SectionHeader"} or {@link * com.smartgwt.client.widgets.layout.ImgSectionHeader "ImgSectionHeader"} depending on the skin. You can use the * SmartClient class system to create a simple Smart GWT subclass of either SectionHeader or ImgSectionHeader for use * with this API - see the {@link com.smartgwt.client.docs.Skinning Skinning Guide} for details. * * * @return String */ public String getSectionHeaderClass() { return getAttributeAsString("sectionHeaderClass"); } /** * Whether to show the Expand/Collapse controls in the headers of sections. If false, hides the expand/collapse controls * and, instead, treats a click anywhere on the header as if it were a click on the expand control. * * @param showExpandControls showExpandControls Default value is true */ public void setShowExpandControls(Boolean showExpandControls) { setAttribute("showExpandControls", showExpandControls, true); } /** * Whether to show the Expand/Collapse controls in the headers of sections. If false, hides the expand/collapse controls * and, instead, treats a click anywhere on the header as if it were a click on the expand control. * * * @return Boolean */ public Boolean getShowExpandControls() { return getAttributeAsBoolean("showExpandControls"); } /** * Default CSS style for the SectionStack as a whole. * * @param styleName styleName Default value is "sectionStack" * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setStyleName(String styleName) throws IllegalStateException { setAttribute("styleName", styleName, false); } /** * Default CSS style for the SectionStack as a whole. * * * @return String */ public String getStyleName() { return getAttributeAsString("styleName"); } /** * Should any specified {@link com.smartgwt.client.widgets.layout.SectionStackSection#getID ID} be applied to the generated * SectionHeader widget for the section as a widget ID? If set to false, SectionStackSection.ID will behave as a synonym * for SectionStackSection.name. * * @param useGlobalSectionIDs useGlobalSectionIDs Default value is false * @throws IllegalStateException this property cannot be changed after the component has been created */ public void setUseGlobalSectionIDs(Boolean useGlobalSectionIDs) throws IllegalStateException { setAttribute("useGlobalSectionIDs", useGlobalSectionIDs, false); } /** * Should any specified {@link com.smartgwt.client.widgets.layout.SectionStackSection#getID ID} be applied to the generated * SectionHeader widget for the section as a widget ID? If set to false, SectionStackSection.ID will behave as a synonym * for SectionStackSection.name. * * * @return Boolean */ public Boolean getUseGlobalSectionIDs() { return getAttributeAsBoolean("useGlobalSectionIDs"); } /** * Whether multiple sections can be visible at once * * @param visibilityMode visibilityMode Default value is "mutex" * @see com.smartgwt.client.types.VisibilityMode * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_sections_expand_collapse" target="examples">Expand / Collapse Example</a> */ public void setVisibilityMode(VisibilityMode visibilityMode) { setAttribute("visibilityMode", visibilityMode == null ? null : visibilityMode.getValue(), true); } /** * Whether multiple sections can be visible at once * * * @return VisibilityMode * @see com.smartgwt.client.types.VisibilityMode * @see <a href="http://www.smartclient.com/smartgwt/showcase/#layout_sections_expand_collapse" target="examples">Expand / Collapse Example</a> */ public VisibilityMode getVisibilityMode() { return EnumUtil.getEnum(VisibilityMode.values(), getAttribute("visibilityMode")); } // ********************* Methods *********************** /** * Returns the position of the specified section in the SectionStack. The numbering is zero-based. * @param sectionName name of a section for which you want to obtain the position. * * @return Position of the section in the SectionStack or -1 if the specified section is not a member of this * SectionStack. */ public native int getSectionNumber(String sectionName) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); return self.getSectionNumber(sectionName); }-*/; /** * Search for a section that contains passed item. * @param item item to show * * @return section that contains passed item. */ public native SectionStackSection sectionForItem(Canvas item) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); var ret = self.sectionForItem(item.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()()); if(ret == null || ret === undefined) return null; var retVal = @com.smartgwt.client.core.RefDataClass::getRef(Lcom/google/gwt/core/client/JavaScriptObject;)(ret); if(retVal == null) { retVal = @com.smartgwt.client.widgets.layout.SectionStackSection::new(Lcom/google/gwt/core/client/JavaScriptObject;)(ret); } return retVal; }-*/; /** * Method intended to be called by the sectionHeader when it is clicked on. * @param sectionHeader the sectionHeader clicked on */ public native void sectionHeaderClick(Canvas sectionHeader) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); self.sectionHeaderClick(sectionHeader.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()()); }-*/; // ********************* Static Methods *********************** /** * Class level method to set the default properties of this class. If set, then all subsequent instances of this * class will automatically have the default properties that were set when this method was called. This is a powerful * feature that eliminates the need for users to create a separate hierarchy of subclasses that only alter the default * properties of this class. Can also be used for skinning / styling purposes. * <P> * <b>Note:</b> This method is intended for setting default attributes only and will effect all instances of the * underlying class (including those automatically generated in JavaScript). * This method should not be used to apply standard EventHandlers or override methods for * a class - use a custom subclass instead. * * @param sectionStackProperties properties that should be used as new defaults when instances of this class are created */ public static native void setDefaultProperties(SectionStack sectionStackProperties) /*-{ var properties = $wnd.isc.addProperties({},sectionStackProperties.@com.smartgwt.client.widgets.BaseWidget::getConfig()()); delete properties.ID; $wnd.isc.SectionStack.addProperties(properties); }-*/; // *********************************************************** public void setSections(SectionStackSection... sections) { for (SectionStackSection section : sections) { addSection(section); } } /** * Add a section to the SectionStack. * * @param section the section to add */ public void addSection(SectionStackSection section) { JavaScriptObject componentJS = section.getJsObj(); if (isCreated()) { addSectionPostCreate(componentJS); } else { addSectionPreCreate(componentJS); } section.stack = this; } /** * Add a section to the SectionStack. * * @param section the section to add * @param position index for the new section */ public void addSection(SectionStackSection section, int position) { JavaScriptObject componentJS = section.getJsObj(); if (isCreated()) { addSectionPostCreate(componentJS, position); } else { addSectionPreCreate(componentJS, position); } section.stack = this; } private native void addSectionPreCreate(JavaScriptObject componentJS) /*-{ var config = this.@com.smartgwt.client.widgets.BaseWidget::config; if(!config.sections) { config.sections = @com.smartgwt.client.util.JSOHelper::createJavaScriptArray()(); } config.sections.push(componentJS); }-*/; private native void addSectionPostCreate(JavaScriptObject componentJS) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.addSection(componentJS); }-*/; private native void addSectionPreCreate(JavaScriptObject componentJS, int position) /*-{ var config = this.@com.smartgwt.client.widgets.BaseWidget::config; if(!config.sections) { config.sections = @com.smartgwt.client.util.JSOHelper::createJavaScriptArray()(); } config.sections = config.sections.splice(position,0, componentJS);; }-*/; private native void addSectionPostCreate(JavaScriptObject componentJS, int position) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); if (position < 0 || container.sections == null) position = 0; else if (position > container.sections.length) position = container.sections.length; container.addSection(componentJS, position); }-*/; /** * Remove a section from the SectionStack. The removed sections' header and items (if any) are automatically * destroyed. * * @param index the section index */ public native void removeSection(int index) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.removeSection(index); }-*/; /** * Remove a section from the SectionStack. The removed sections' header and items (if any) are automatically * destroyed. * * @param sectionID the section ID */ public native void removeSection(String sectionID) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.removeSection(sectionID); }-*/; /** * Expands a section. This action shows all the items assigned to the section. If the section is currently hidden, * it is shown first and then expanded. Calling this method is equivalent to the user clicking on the SectionHeader * of a collapsed section. * * @param index the section index */ public native void expandSection(int index) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.expandSection(index); }-*/; /** * Expands a section. This action shows all the items assigned to the section. If the section is currently hidden, * it is shown first and then expanded. Calling this method is equivalent to the user clicking on the SectionHeader * of a collapsed section. * * @param sectionID the section ID */ public native void expandSection(String sectionID) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.expandSection(sectionID); }-*/; /** * Collapse a section. This action hides all the items assigned to the section. Calling this method is equivalent to * the user clicking on the SectionHeader of an expanded section. * * @param index the section index */ public native void collapseSection(int index) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.collapseSection(index); }-*/; /** * Collapse a section. This action hides all the items assigned to the section. Calling this method is equivalent to * the user clicking on the SectionHeader of an expanded section. * * @param sectionID the section ID */ public native void collapseSection(String sectionID) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.collapseSection(sectionID); }-*/; /** * Hides a section. This includes the section header and its items. The space vacated by this action is reassigned * to the nearest visible section item above this section. If there are no visible section items above this section, * the space is reassigned to the nearest visible section item below this section. * * @param index the section index */ public native void hideSection(int index) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.hideSection(index); }-*/; /** * Hides a section. This includes the section header and its items. The space vacated by this action is reassigned * to the nearest visible section item above this section. If there are no visible section items above this section, * the space is reassigned to the nearest visible section item below this section. * * @param sectionID the section ID */ public native void hideSection(String sectionID) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.hideSection(sectionID); }-*/; /** * Shows a section. This includes the section header and its items. If the section is collapsed, only the header is * shown. If the section is expanded, the section header and all items are shown. * * @param index the section index */ public native void showSection(int index) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.showSection(index); }-*/; /** * Shows a section. This includes the section header and its items. If the section is collapsed, only the header is * shown. If the section is expanded, the section header and all items are shown. * * @param sectionID the section ID */ public native void showSection(String sectionID) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.showSection(sectionID); }-*/; /** * Moves the specified section to a new position in the SectionStack order. * * @param index the section index * @param position new position index for the section */ public native void moveSection(int index, int position) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.moveSection(index, position); }-*/; /** * Moves the specified section to a new position in the SectionStack order. * * @param sectionID the section ID * @param position new position index for the section */ public native void moveSection(String sectionID, int position) /*-{ var container = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); container.moveSection(sectionID, position); }-*/; /** * Returns true if the specified section is expanded, false if it is collapsed. * * @param index position of the section in the SectionStack * @return true if the section is expanded, false if it is not. */ public native boolean sectionIsExpanded(int index) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); return self.sectionIsExpanded(index); }-*/; /** * Returns true if the specified section is expanded, false if it is collapsed. * * @param sectionID the section ID * @return true if the section is expanded, false if it is not. */ public native boolean sectionIsExpanded(String sectionID) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); return self.sectionIsExpanded(sectionID); }-*/; /** * Returns true if the specified section is visible, false if it is not. A section is visible if it shows a header * and the header is visible or if it has items and the first item is visible. . * * @param index position of the section in the SectionStack * @return ttrue if the section is visible, false if it is not */ public native boolean sectionIsVisible(int index) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); return self.sectionIsVisible(index); }-*/; /** * Returns true if the specified section is visible, false if it is not. A section is visible if it shows a header * and the header is visible or if it has items and the first item is visible. * * @param sectionID the section ID * @return true if the section is visible, false if it is not */ public native boolean sectionIsVisible(String sectionID) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); return self.sectionIsVisible(sectionID); }-*/; /** * Changes the title of a Section Header. * * @param sectionID ID of the section whose title you want to change * @param newTitle new title for the Section Header */ public native void setSectionTitle(String sectionID, String newTitle) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); return self.setSectionTitle(sectionID, newTitle); }-*/; /** * Changes the title of a Section Header. * * @param index index of the section whose title you want to change * @param newTitle new title for the Section Header */ public native void setSectionTitle(int index, String newTitle) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); return self.setSectionTitle(index, newTitle); }-*/; /** * Return the SectionStackSection for a section. * * @param sectionID ID of the section for which you want the header * * @return the section indicated */ public native SectionStackSection getSection(String sectionID) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); var ret = self.getSectionConfig(sectionID); if(ret == null || ret === undefined) return null; var retVal = @com.smartgwt.client.widgets.layout.SectionStackSection::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(ret); return retVal; }-*/; /** * Return the SectionStackSection for a section. * @param index index of the section for which you want the header * * @return the section header indicated */ public native SectionStackSection getSection(int index) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); var ret = self.getSectionConfig(index); if(ret == null || ret === undefined) return null; var retVal = @com.smartgwt.client.widgets.layout.SectionStackSection::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(ret); return retVal; }-*/; public native SectionStackSection[] getSections() /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); var ret = self.sections; if(ret == null || ret === undefined) return null; var sectionsArr = @com.smartgwt.client.util.JSOHelper::createJavaScriptArray()(); for (var i = 0; i < ret.length; i++) { var jsSectionHeader = ret[i]; sectionsArr[i] = jsSectionHeader.getSectionConfig ? jsSectionHeader.getSectionConfig() : jsSectionHeader; } return this.@com.smartgwt.client.widgets.layout.SectionStack::convertToSectionArray(Lcom/google/gwt/core/client/JavaScriptObject;)(sectionsArr); }-*/; private SectionStackSection[] convertToSectionArray(JavaScriptObject nativeArray) { if (nativeArray == null) { return new SectionStackSection[]{}; } JavaScriptObject[] componentsj = JSOHelper.toArray(nativeArray); SectionStackSection[] objects = new SectionStackSection[componentsj.length]; for (int i = 0; i < componentsj.length; i++) { JavaScriptObject componentJS = componentsj[i]; SectionStackSection obj = SectionStackSection.getOrCreateRef(componentJS); objects[i] = obj; } return objects; } /** * Add a onSectionHeaderClick handler. * <p> * Notification method fired when the user clicks on a section header. Returning false will cancel the default behavior (expanding / collapsing the section) * * @param handler the onSectionHeaderClick handler * @return {@link com.google.gwt.event.shared.HandlerRegistration} used to remove this handler */ public HandlerRegistration addSectionHeaderClickHandler(com.smartgwt.client.widgets.layout.events.SectionHeaderClickHandler handler) { if(getHandlerCount(com.smartgwt.client.widgets.layout.events.SectionHeaderClickEvent.getType()) == 0) setupSectionHeaderClickEvent(); return doAddHandler(handler, com.smartgwt.client.widgets.layout.events.SectionHeaderClickEvent.getType()); } private native void setupSectionHeaderClickEvent() /*-{ var obj = null; var selfJ = this; if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) { obj = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()(); obj.addProperties({onSectionHeaderClick:$debox($entry(function(){ var param = {"section" : arguments[0]}; var event = @com.smartgwt.client.widgets.layout.events.SectionHeaderClickEvent::new(Lcom/google/gwt/core/client/JavaScriptObject;)(param); selfJ.@com.smartgwt.client.widgets.BaseWidget::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event); var ret = event.@com.smartgwt.client.event.Cancellable::isCancelled()(); return !ret; })) }); } else { obj = this.@com.smartgwt.client.widgets.BaseWidget::getConfig()(); obj.onSectionHeaderClick = $debox($entry(function(){ var param = {"section" : arguments[0]}; var event = @com.smartgwt.client.widgets.layout.events.SectionHeaderClickEvent::new(Lcom/google/gwt/core/client/JavaScriptObject;)(param); selfJ.@com.smartgwt.client.widgets.BaseWidget::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event); var ret = event.@com.smartgwt.client.event.Cancellable::isCancelled()(); return !ret; })); } }-*/; /** * Set arbitrary properties for a particular section in this SectionStack. Properties will be applied to the sectionHeader * for the section. <P> Note that where APIs exist to explicitly manipulate section properties these should be used in * preference to this method. For example, to add or remove items in a section use {@link * com.smartgwt.client.widgets.layout.SectionStack#addItem} or {@link * com.smartgwt.client.widgets.layout.SectionStack#removeItem}. To change the title of a section, use {@link * com.smartgwt.client.widgets.layout.SectionStack#setSectionTitle}. <P> Also note that to modify properties of items * within a section, call the appropriate setter methods directly on the item you want to modify. * @param section ID or index of the section to modify * @param properties properties to apply to the section. */ public native void setSectionProperties(String section, SectionStackSection properties) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); var props = properties.@com.smartgwt.client.widgets.layout.SectionStackSection::getJsObj()(); self.setSectionProperties(section, props); }-*/; /** * Set arbitrary properties for a particular section in this SectionStack. Properties will be applied to the sectionHeader * for the section. <P> Note that where APIs exist to explicitly manipulate section properties these should be used in * preference to this method. For example, to add or remove items in a section use {@link * com.smartgwt.client.widgets.layout.SectionStack#addItem} or {@link * com.smartgwt.client.widgets.layout.SectionStack#removeItem}. To change the title of a section, use {@link * com.smartgwt.client.widgets.layout.SectionStack#setSectionTitle}. <P> Also note that to modify properties of items * within a section, call the appropriate setter methods directly on the item you want to modify. * @param section ID or index of the section to modify * @param properties properties to apply to the section. */ public native void setSectionProperties(int section, SectionStackSection properties) /*-{ var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(); var props = properties.@com.smartgwt.client.widgets.layout.SectionStackSection::getJsObj()(); self.setSectionProperties(section, props); }-*/; }