/*
* 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 org.vaadin.smartgwt.server.layout;
import org.vaadin.smartgwt.client.ui.layout.VSectionStack;
import org.vaadin.smartgwt.server.core.ComponentList;
import org.vaadin.smartgwt.server.core.ComponentPropertyPainter;
import org.vaadin.smartgwt.server.types.LocatorStrategy;
import org.vaadin.smartgwt.server.types.LocatorTypeStrategy;
import org.vaadin.smartgwt.server.types.Overflow;
import org.vaadin.smartgwt.server.types.VisibilityMode;
import org.vaadin.smartgwt.server.util.EnumUtil;
import com.vaadin.terminal.PaintException;
import com.vaadin.terminal.PaintTarget;
import com.vaadin.ui.ClientWidget;
//@formatter:off
/**
* 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.
*/
@ClientWidget(value=VSectionStack.class)
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(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.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.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.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 the Canvas subclass to use as a header that labels the section and allows showing and hiding. The default class can be skinned, or trivial
* subclasses created to allow different appearances for headers in different SectionStacks.
* <P>
* Very advanced developers can use the following information to create custom header classes.
* <P>
* The SectionStack will instantiate this class, giving the following properties on init:
* <ul>
* <li><code>layout</code>: the SectionStack
* <li><code>expanded</code>: true or false
* <li><code>hidden</code>: true or false
* <li><code>title</code>: section title
* </ul>
* From then on, when the sectionHeader is clicked on, it should call {@link com.smartgwt.client.widgets.layout.SectionStack#sectionHeaderClick
* SectionStack.sectionHeaderClick}.
* <P>
* Whenever the section is hidden or shown, sectionHeader.setExpanded(true|false) will be called if implemented.
* <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 the Canvas subclass to use as a header that labels the section and allows showing and hiding. The default class can be skinned, or trivial
* subclasses created to allow different appearances for headers in different SectionStacks.
* <P>
* Very advanced developers can use the following information to create custom header classes.
* <P>
* The SectionStack will instantiate this class, giving the following properties on init:
* <ul>
* <li><code>layout</code>: the SectionStack
* <li><code>expanded</code>: true or false
* <li><code>hidden</code>: true or false
* <li><code>title</code>: section title
* </ul>
* From then on, when the sectionHeader is clicked on, it should call {@link com.smartgwt.client.widgets.layout.SectionStack#sectionHeaderClick
* SectionStack.sectionHeaderClick}.
* <P>
* Whenever the section is hidden or shown, sectionHeader.setExpanded(true|false) will be called if implemented.
*
*
* @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.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);
// }-*/;
//
// /**
// * 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 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);
// }-*/;
// @formatter:on
private final ComponentPropertyPainter propertyPainter = new ComponentPropertyPainter(this);
private final ComponentList<SectionStackSection> sections = propertyPainter.addComponentList("sections");
public SectionStack() {
scClassName = "SectionStack";
}
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) {
sections.add(section);
}
/**
* 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) {
sections.add(position, section);
}
/**
* 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 void setSectionTitle(String sectionID, String newTitle) {
for (SectionStackSection section : sections) {
if (sectionID.equals(section.getName())) {
section.setTitle(newTitle);
return;
}
}
}
@Override
public void paintContent(PaintTarget target) throws PaintException {
propertyPainter.paintContent(target);
super.paintContent(target);
}
}