/*
@ITMillApache2LicenseForJavaFiles@
*/
package com.vaadin.automatedtests.featurebrowser;
import java.util.HashMap;
import java.util.Iterator;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.HierarchicalContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.terminal.ExternalResource;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.AbstractSelect;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Layout;
import com.vaadin.ui.Select;
import com.vaadin.ui.SplitPanel;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.Table;
import com.vaadin.ui.Tree;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Button.ClickEvent;
/**
*
* @author IT Mill Ltd.
* @see com.vaadin.ui.Window
*/
@SuppressWarnings("serial")
public class FeatureBrowser extends com.vaadin.Application implements
Select.ValueChangeListener {
// Property IDs
private static final Object PROPERTY_ID_CATEGORY = "Category";
private static final Object PROPERTY_ID_NAME = "Name";
private static final Object PROPERTY_ID_DESC = "Description";
private static final Object PROPERTY_ID_CLASS = "Class";
private static final Object PROPERTY_ID_VIEWED = "Viewed";
// Global components
private Tree tree;
private Table table;
private TabSheet ts;
// Example "cache"
private final HashMap exampleInstances = new HashMap();
private String section;
// List of examples
private static final Object[][] demos = new Object[][] {
// Category, Name, Desc, Class, Viewed
// Getting started: Labels
{ "Getting started", "Labels", "Some variations of Labels",
LabelExample.class },
// Getting started: Buttons
{ "Getting started", "Buttons and links",
"Various Buttons and Links", ButtonExample.class },
// Getting started: Fields
{ "Getting started", "Basic value input",
"TextFields, DateFields, and such", ValueInputExample.class },
//
{ "Getting started", "RichText", "Rich text editing",
RichTextExample.class },
// Getting started: Selects
{ "Getting started", "Choices, choices",
"Some variations of simple selects", SelectExample.class },
// Layouts
{ "Layouts", "Basic layouts", "Laying out components",
LayoutExample.class },
// Layouts
{ "Layouts", "Accordion", "Play the Accordion!",
AccordionExample.class },
// Wrangling data: ComboBox
{ "Wrangling data", "ComboBox", "ComboBox - the swiss army select",
ComboBoxExample.class },
// Wrangling data: Table
{
"Wrangling data",
"Table (\"grid\")",
"Table with bells, whistles, editmode and actions (contextmenu)",
TableExample.class },
// Wrangling data: Form
{ "Wrangling data", "Form", "Every application needs forms",
FormExample.class },
// Wrangling data: Tree
{ "Wrangling data", "Tree", "A hierarchy of things",
TreeExample.class },
// Misc: Notifications
{ "Misc", "Notifications", "Notifications can improve usability",
NotificationExample.class },
// Misc: Caching
{ "Misc", "Client caching", "Demonstrating of client-side caching",
ClientCachingExample.class },
// Misc: Embedded
{ "Misc", "Embedding",
"Embedding resources - another site in this case",
EmbeddedBrowserExample.class },
// Windowing
{ "Misc", "Windowing", "About windowing", WindowingExample.class },
// JavaScript API
{ "Misc", "JavaScript API",
"JavaScript to IT Mill Toolkit communication",
JavaScriptAPIExample.class },
// END
};
@Override
public void init() {
// Need to set a theme for ThemeResources to work
setTheme("example");
// Create new window for the application and give the window a visible.
final Window main = new Window("IT Mill Toolkit 5");
main.setDebugId("mainWindow");
// set as main window
setMainWindow(main);
final SplitPanel split = new SplitPanel(
SplitPanel.ORIENTATION_HORIZONTAL);
split.setSplitPosition(200, SplitPanel.UNITS_PIXELS);
main.setLayout(split);
final HashMap sectionIds = new HashMap();
final HierarchicalContainer container = createContainer();
final Object rootId = container.addItem();
Item item = container.getItem(rootId);
Property p = item.getItemProperty(PROPERTY_ID_NAME);
p.setValue("All examples");
for (int i = 0; i < demos.length; i++) {
final Object[] demo = demos[i];
final String section = (String) demo[0];
Object sectionId;
if (sectionIds.containsKey(section)) {
sectionId = sectionIds.get(section);
} else {
sectionId = container.addItem();
sectionIds.put(section, sectionId);
container.setParent(sectionId, rootId);
item = container.getItem(sectionId);
p = item.getItemProperty(PROPERTY_ID_NAME);
p.setValue(section);
}
final Object id = container.addItem();
container.setParent(id, sectionId);
initItem(container.getItem(id), demo);
}
tree = new Tree();
tree.setDebugId("FeatureBrowser: Main Tree");
tree.setSelectable(true);
tree.setMultiSelect(false);
tree.setNullSelectionAllowed(false);
tree.setContainerDataSource(container);
tree.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
tree.setItemCaptionPropertyId(PROPERTY_ID_NAME);
tree.addListener(this);
tree.setImmediate(true);
tree.expandItemsRecursively(rootId);
for (Iterator> i = container.getItemIds().iterator(); i.hasNext();) {
Object id = i.next();
if (container.getChildren(id) == null) {
tree.setChildrenAllowed(id, false);
}
}
split.addComponent(tree);
final SplitPanel split2 = new SplitPanel();
split2.setSplitPosition(200, SplitPanel.UNITS_PIXELS);
split.addComponent(split2);
table = new Table();
table.setDebugId("FeatureBrowser: Main Table");
table.setSizeFull();
table.setColumnReorderingAllowed(true);
table.setColumnCollapsingAllowed(true);
table.setSelectable(true);
table.setMultiSelect(false);
table.setNullSelectionAllowed(false);
try {
table.setContainerDataSource((IndexedContainer) container.clone());
} catch (final Exception e) {
e.printStackTrace(System.err);
}
// Hide some columns
table.setVisibleColumns(new Object[] { PROPERTY_ID_CATEGORY,
PROPERTY_ID_NAME, PROPERTY_ID_DESC, PROPERTY_ID_VIEWED });
table.addListener(this);
table.setImmediate(true);
split2.addComponent(table);
final VerticalLayout exp = new VerticalLayout();
exp.setSizeFull();
exp.setMargin(true);
split2.addComponent(exp);
final HorizontalLayout wbLayout = new HorizontalLayout();
Button b = new Button("Open in sub-window", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
Component component = (Component) ts.getComponentIterator()
.next();
String caption = ts.getTabCaption(component);
try {
component = component.getClass().newInstance();
} catch (Exception e) {
// Could not create
return;
}
Window w = new Window(caption);
w.setWidth("640px");
if (Layout.class.isAssignableFrom(component.getClass())) {
w.setLayout((Layout) component);
} else {
// w.getLayout().getSize().setSizeFull();
w.addComponent(component);
}
getMainWindow().addWindow(w);
}
});
b.setStyleName(Button.STYLE_LINK);
wbLayout.addComponent(b);
b = new Button("Open in native window", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
Component component = (Component) ts.getComponentIterator()
.next();
final String caption = ts.getTabCaption(component);
Window w = getWindow(caption);
if (w == null) {
try {
component = component.getClass().newInstance();
} catch (final Exception e) {
// Could not create
return;
}
w = new Window(caption);
w.setName(caption);
if (Layout.class.isAssignableFrom(component.getClass())) {
w.setLayout((Layout) component);
} else {
// w.getLayout().getSize().setSizeFull();
w.addComponent(component);
}
addWindow(w);
}
getMainWindow().open(new ExternalResource(w.getURL()), caption);
}
});
b.setStyleName(Button.STYLE_LINK);
wbLayout.addComponent(b);
exp.addComponent(wbLayout);
exp.setComponentAlignment(wbLayout, Alignment.TOP_RIGHT);
ts = new TabSheet();
ts.setSizeFull();
ts.addTab(new Label(""), "Choose example", null);
exp.addComponent(ts);
exp.setExpandRatio(ts, 1);
final Label status = new Label(
"Developer Area"
+ " | Documentation");
status.setContentMode(Label.CONTENT_XHTML);
exp.addComponent(status);
exp.setComponentAlignment(status, Alignment.MIDDLE_RIGHT);
// select initial section ("All")
tree.setValue(rootId);
getMainWindow()
.showNotification(
"Welcome",
"Choose an example to begin.
And remember to experiment!",
Window.Notification.TYPE_TRAY_NOTIFICATION);
}
private void initItem(Item item, Object[] data) {
int p = 0;
Property prop = item.getItemProperty(PROPERTY_ID_CATEGORY);
prop.setValue(data[p++]);
prop = item.getItemProperty(PROPERTY_ID_NAME);
prop.setValue(data[p++]);
prop = item.getItemProperty(PROPERTY_ID_DESC);
prop.setValue(data[p++]);
prop = item.getItemProperty(PROPERTY_ID_CLASS);
prop.setValue(data[p++]);
}
private HierarchicalContainer createContainer() {
final HierarchicalContainer c = new HierarchicalContainer();
c.addContainerProperty(PROPERTY_ID_CATEGORY, String.class, null);
c.addContainerProperty(PROPERTY_ID_NAME, String.class, "");
c.addContainerProperty(PROPERTY_ID_DESC, String.class, "");
c.addContainerProperty(PROPERTY_ID_CLASS, Class.class, null);
c.addContainerProperty(PROPERTY_ID_VIEWED, Embedded.class, null);
return c;
}
public void valueChange(ValueChangeEvent event) {
if (event.getProperty() == tree) {
final Object id = tree.getValue();
if (id == null) {
return;
}
final Item item = tree.getItem(id);
//
String newSection;
if (tree.isRoot(id)) {
newSection = ""; // show all sections
} else if (tree.hasChildren(id)) {
newSection = (String) item.getItemProperty(PROPERTY_ID_NAME)
.getValue();
} else {
newSection = (String) item
.getItemProperty(PROPERTY_ID_CATEGORY).getValue();
}
table.setValue(null);
final IndexedContainer c = (IndexedContainer) table
.getContainerDataSource();
if (newSection != null && !newSection.equals(section)) {
c.removeAllContainerFilters();
c.addContainerFilter(PROPERTY_ID_CATEGORY, newSection, false,
true);
}
section = newSection;
if (!tree.hasChildren(id)) {
// Example, not section
// update table selection
table.setValue(id);
}
} else if (event.getProperty() == table) {
if (table.getValue() != null) {
table.removeListener(this);
tree.setValue(table.getValue());
table.addListener(this);
final Item item = table.getItem(table.getValue());
final Class> c = (Class>) item.getItemProperty(
PROPERTY_ID_CLASS).getValue();
final Component component = getComponent(c);
if (component != null) {
final String caption = (String) item.getItemProperty(
PROPERTY_ID_NAME).getValue();
ts.removeAllComponents();
ts.addTab(component, caption, null);
}
// update "viewed" state
final Property p = item.getItemProperty(PROPERTY_ID_VIEWED);
if (p.getValue() == null) {
p.setValue(new Embedded("", new ThemeResource(
"icons/ok.png")));
}
table.requestRepaint();
}
}
}
private Component getComponent(Class> componentClass) {
if (!exampleInstances.containsKey(componentClass)) {
try {
final Component c = (Component) componentClass.newInstance();
exampleInstances.put(componentClass, c);
} catch (final Exception e) {
return null;
}
}
return (Component) exampleInstances.get(componentClass);
}
}