aboutsummaryrefslogtreecommitdiffstats
path: root/documentation/layout/layout-tabsheet.asciidoc
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/layout/layout-tabsheet.asciidoc')
-rw-r--r--documentation/layout/layout-tabsheet.asciidoc250
1 files changed, 250 insertions, 0 deletions
diff --git a/documentation/layout/layout-tabsheet.asciidoc b/documentation/layout/layout-tabsheet.asciidoc
new file mode 100644
index 0000000000..6fa324c4e7
--- /dev/null
+++ b/documentation/layout/layout-tabsheet.asciidoc
@@ -0,0 +1,250 @@
+---
+title: TabSheet
+order: 9
+layout: page
+---
+
+[[layout.tabsheet]]
+= [classname]#TabSheet#
+
+The [classname]#TabSheet# is a multicomponent container that allows switching
+between the components with "tabs". The tabs are organized as a tab bar at the
+top of the tab sheet. Clicking on a tab opens its contained component in the
+main display area of the layout. If there are more tabs than fit in the tab bar,
+navigation buttons will appear.
+
+[[figure.tabsheet.example1]]
+.A Simple TabSheet Layout
+image::img/tabsheet-example1.png[]
+
+[[layout.tabsheet.adding]]
+== Adding Tabs
+
+You add new tabs to a tab sheet with the [methodname]#addTab()# method. The
+simple version of the method takes as its parameter the root component of the
+tab. You can use the root component to retrieve its corresponding
+[classname]#Tab# object. Typically, you put a layout component as the root
+component.
+
+You can also give the caption and the icon as parameters for the
+[methodname]#addTab()# method. The following example demonstrates the creation
+of a simple tab sheet, where each tab shows a different [classname]#Label#
+component. The tabs have an icon, which are (in this example) loaded as Java
+class loader resources from the application.
+
+
+[source, java]
+----
+TabSheet tabsheet = new TabSheet();
+layout.addComponent(tabsheet);
+
+// Create the first tab
+VerticalLayout tab1 = new VerticalLayout();
+tab1.addComponent(new Embedded(null,
+ new ThemeResource("img/planets/Mercury.jpg")));
+tabsheet.addTab(tab1, "Mercury",
+ new ThemeResource("img/planets/Mercury_symbol.png"));
+
+// This tab gets its caption from the component caption
+VerticalLayout tab2 = new VerticalLayout();
+tab2.addComponent(new Embedded(null,
+ new ThemeResource("img/planets/Venus.jpg")));
+tab2.setCaption("Venus");
+tabsheet.addTab(tab2).setIcon(
+ new ThemeResource("img/planets/Venus_symbol.png"));
+...
+----
+
+
+[[layout.tabsheet.tab]]
+== Tab Objects
+
+Each tab in a tab sheet is represented as a [classname]#Tab# object, which
+manages the tab caption, icon, and attributes such as hidden and visible. You
+can set the caption with [methodname]#setCaption()# and the icon with
+[methodname]#setIcon()#. If the component added with [methodname]#addTab()# has
+a caption or icon, it is used as the default for the [classname]#Tab# object.
+However, changing the attributes of the root component later does not affect the
+tab, but you must make the setting through the [classname]#Tab# object. The
+[methodname]#addTab()# returns the new [classname]#Tab# object, so you can
+easily set an attribute using the reference.
+
+
+[source, java]
+----
+// Set an attribute using the returned reference
+tabsheet.addTab(myTab).setCaption("My Tab");
+----
+
+[[layout.tabsheet.tab.disabling]]
+=== Disabling and Hiding Tabs
+
+A tab can be disabled by setting [methodname]#setEnabled(false)# for the
+[classname]#Tab# object, thereby disallowing selecting it.
+
+A tab can be made invisible by setting [methodname]#setVisible(false)# for the
+[classname]#Tab# object. The [methodname]#hideTabs()# method allows hiding the
+tab bar entirely. This can be useful in tabbed document interfaces (TDI) when
+there is only one tab.
+
+ifdef::web[]
+[[figure.tabsheet.example2]]
+.A TabSheet with Hidden and Disabled Tabs
+image::img/tabsheet-example2.png[]
+endif::web[]
+
+
+
+[[layout.tabsheet.events]]
+== Tab Change Events
+
+Clicking on a tab selects it. This fires a
+[classname]#TabSheet.SelectedTabChangeEvent#, which you can handle by
+implementing the [classname]#TabSheet.SelectedTabChangeListener# interface. You
+can access the tabsheet of the event with [methodname]#getTabSheet()#, and find
+the new selected tab with [methodname]#getSelectedTab()#.
+
+You can programmatically select a tab with [methodname]#setSelectedTab()#, which
+also fires the [classname]#SelectedTabChangeEvent# (beware of recursive events).
+Reselecting the currently selected tab does not fire the event.
+
+Notice that when the first tab is added, it is selected and the change event is
+fired, so if you want to catch that, you need to add your listener before adding
+any tabs.
+
+ifdef::web[]
+[[layout.tabsheet.events.dynamic]]
+=== Creating Tab Content Dynamically
+
+In the following example, we create the tabs as empty content layouts, and add
+the tab content dynamically when a tab is selected:
+
+
+[source, java]
+----
+TabSheet tabsheet = new TabSheet();
+
+// Create tab content dynamically when tab is selected
+tabsheet.addSelectedTabChangeListener(
+ new TabSheet.SelectedTabChangeListener() {
+ public void selectedTabChange(SelectedTabChangeEvent event) {
+ // Find the tabsheet
+ TabSheet tabsheet = event.getTabSheet();
+
+ // Find the tab (here we know it's a layout)
+ Layout tab = (Layout) tabsheet.getSelectedTab();
+
+ // Get the tab caption from the tab object
+ String caption = tabsheet.getTab(tab).getCaption();
+
+ // Fill the tab content
+ tab.removeAllComponents();
+ tab.addComponent(new Image(null,
+ new ThemeResource("img/planets/"+caption+".jpg")));
+ }
+});
+
+// Have some tabs
+String[] tabs = {"Mercury", "Venus", "Earth", "Mars"};
+for (String caption: tabs)
+ tabsheet.addTab(new VerticalLayout(), caption,
+ new ThemeResource("img/planets/"+caption+"_symbol.png"));
+----
+
+endif::web[]
+
+
+[[layout.tabsheet.closing]]
+== Enabling and Handling Closing Tabs
+
+You can enable a close button for individual tabs with the
+[literal]#++closable++# property in the [classname]#TabSheet.Tab# objects.
+
+
+[source, java]
+----
+// Enable closing the tab
+tabsheet.getTab(tabComponent).setClosable(true);
+----
+
+[[figure.layout.tabsheet.closing]]
+.TabSheet with Closable Tabs
+image::img/tabsheet-tabclose.png[]
+
+[[layout.tabsheet.closing.handling]]
+=== Handling Tab Close Events
+
+You can handle closing tabs by implementing a custom
+[classname]#TabSheet.CloseHandler#. The default implementation simply calls
+[methodname]#removeTab()# for the tab to be closed, but you can prevent the
+close by not calling it. This allows, for example, opening a dialog window to
+confirm the close.
+
+
+[source, java]
+----
+tabsheet.setCloseHandler(new CloseHandler() {
+ @Override
+ public void onTabClose(TabSheet tabsheet,
+ Component tabContent) {
+ Tab tab = tabsheet.getTab(tabContent);
+ Notification.show("Closing " + tab.getCaption());
+
+ // We need to close it explicitly in the handler
+ tabsheet.removeTab(tab);
+ }
+});
+----
+
+
+
+ifdef::web[]
+[[layout.tabsheet.css]]
+== CSS Style Rules
+
+
+[source, css]
+----
+.v-tabsheet {}
+.v-tabsheet-tabs {}
+.v-tabsheet-content {}
+.v-tabsheet-deco {}
+.v-tabsheet-tabcontainer {}
+.v-tabsheet-tabsheetpanel {}
+.v-tabsheet-hidetabs {}
+
+.v-tabsheet-scroller {}
+.v-tabsheet-scrollerPrev {}
+.v-tabsheet-scrollerNext {}
+.v-tabsheet-scrollerPrev-disabled{}
+.v-tabsheet-scrollerNext-disabled{}
+
+.v-tabsheet-tabitem {}
+.v-tabsheet-tabitem-selected {}
+.v-tabsheet-tabitemcell {}
+.v-tabsheet-tabitemcell-first {}
+
+.v-tabsheet-tabs td {}
+.v-tabsheet-spacertd {}
+----
+
+The entire tabsheet has the [literal]#++v-tabsheet++# style. A tabsheet consists
+of three main parts: the tabs on the top, the main content pane, and decorations
+around the tabsheet.
+
+The tabs area at the top can be styled with [literal]#++v-tabsheet-tabs++#,
+[literal]#++v-tabsheet-tabcontainer++# and [literal]#++v-tabsheet-tabitem*++#.
+
+The style [literal]#++v-tabsheet-spacertd++# is used for any empty space after
+the tabs. If the tabsheet has too little space to show all tabs, scroller
+buttons enable browsing the full tab list. These use the styles
+[literal]#++v-tabsheet-scroller*++#.
+
+The content area where the tab contents are shown can be styled with
+[literal]#++v-tabsheet-content++#, and the surrounding decoration with
+[literal]#++v-tabsheet-deco++#.
+
+endif::web[]
+
+
+