import com.itmill.toolkit.demo.sampler.features.tabsheets.TabSheetDisabled;
import com.itmill.toolkit.demo.sampler.features.tabsheets.TabSheetIcons;
import com.itmill.toolkit.demo.sampler.features.tabsheets.TabSheetScrolling;
+import com.itmill.toolkit.demo.sampler.features.windows.WindowChild;
+import com.itmill.toolkit.demo.sampler.features.windows.WindowNativeNew;
+import com.itmill.toolkit.demo.sampler.features.windows.WindowNativeShared;
/**
* Contains the FeatureSet implementation and the structure for the feature
new Tabsheets(), //
new Accordions(), //
new Panels(), //
+ new Windows(), //
});
}
}
}
}
+ public static class Windows extends FeatureSet {
+ public Windows() {
+ super("Windows", new Feature[] {
+ //
+ new WindowNativeShared(), //
+ new WindowNativeNew(), //
+ new WindowChild(), //
+ });
+ }
+ }
+
// ----------------------------------------------------------
/*
* FeatureSet implementation follows.
\r
import com.itmill.toolkit.data.Property;\r
import com.itmill.toolkit.data.Property.ValueChangeEvent;\r
+import com.itmill.toolkit.ui.AbstractSelect;\r
import com.itmill.toolkit.ui.ComboBox;\r
import com.itmill.toolkit.ui.VerticalLayout;\r
import com.itmill.toolkit.ui.AbstractSelect.Filtering;\r
\r
public class ComboBoxNewItemsExample extends VerticalLayout implements\r
- Property.ValueChangeListener {\r
-\r
+ Property.ValueChangeListener, AbstractSelect.NewItemHandler {\r
private static final String[] cities = new String[] { "Berlin", "Brussels",\r
"Helsinki", "Madrid", "Oslo", "Paris", "Stockholm" };\r
private ComboBox l;\r
+ private Boolean lastAdded = false;\r
\r
public ComboBoxNewItemsExample() {\r
setSpacing(true);\r
\r
l.setFilteringMode(Filtering.FILTERINGMODE_OFF);\r
l.setNewItemsAllowed(true);\r
+ l.setNewItemHandler(this);\r
l.setImmediate(true);\r
l.addListener(this);\r
\r
* Shows a notification when a selection is made.\r
*/\r
public void valueChange(ValueChangeEvent event) {\r
- Boolean newItem = true;\r
- String s = event.getProperty().toString();\r
-\r
- for (int i = 0; i < cities.length; i++) {\r
- if (s == null || s.equals(cities[i])) {\r
- newItem = false;\r
- }\r
+ if (!lastAdded) {\r
+ getWindow().showNotification(\r
+ "Selected city: " + event.getProperty());\r
}\r
- if (newItem) {\r
- getWindow().showNotification("Selected an added item: " + s);\r
- } else {\r
- getWindow().showNotification("Selected city: " + s);\r
+ lastAdded = false;\r
+ }\r
+\r
+ public void addNewItem(String newItemCaption) {\r
+ if (!l.containsId(newItemCaption)) {\r
+ getWindow().showNotification("Added city: " + newItemCaption);\r
+ lastAdded = true;\r
+ l.addItem(newItemCaption);\r
+ l.setValue(newItemCaption);\r
}\r
}\r
}\r
--- /dev/null
+package com.itmill.toolkit.demo.sampler.features.windows;\r
+\r
+import com.itmill.toolkit.demo.sampler.APIResource;\r
+import com.itmill.toolkit.demo.sampler.Feature;\r
+import com.itmill.toolkit.demo.sampler.NamedExternalResource;\r
+import com.itmill.toolkit.ui.Window;\r
+\r
+public class WindowChild extends Feature {\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "Creates and opens a new floating child window with its own state."\r
+ + "<br>Child windows are typically used for Dialog Windows and"\r
+ + " Multiple Document Interface applications.";\r
+ }\r
+\r
+ @Override\r
+ public APIResource[] getRelatedAPI() {\r
+ return new APIResource[] { new APIResource(Window.class) };\r
+ }\r
+\r
+ @Override\r
+ public Class[] getRelatedFeatures() {\r
+ return new Class[] { WindowNativeShared.class, WindowNativeNew.class };\r
+ }\r
+\r
+ @Override\r
+ public NamedExternalResource[] getRelatedResources() {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.itmill.toolkit.demo.sampler.features.windows;\r
+\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.VerticalLayout;\r
+import com.itmill.toolkit.ui.Window;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+import com.itmill.toolkit.ui.Window.CloseEvent;\r
+\r
+public class WindowChildExample extends VerticalLayout implements\r
+ Window.CloseListener {\r
+\r
+ private Button b1;\r
+ private Button b2;\r
+ private Label l;\r
+\r
+ public WindowChildExample() {\r
+ setSpacing(true);\r
+\r
+ b1 = new Button(\r
+ "Create and open a new child window with its own state", this,\r
+ "openButtonClick");\r
+ addComponent(b1);\r
+\r
+ l = new Label("Amount of child windows attached to the main window: x");\r
+ addComponent(l);\r
+\r
+ b2 = new Button("Refresh", this, "refreshButtonClick");\r
+ addComponent(b2);\r
+ }\r
+\r
+ public void openButtonClick(ClickEvent event) {\r
+ Window w = new Window("New child window");\r
+ Label desc = new Label("This is a new child window with its own state."\r
+ + " The child window is added to the main window"\r
+ + " instead of the application.");\r
+ w.addComponent(desc);\r
+ w.addListener(this);\r
+ w.setResizable(false);\r
+ getApplication().getMainWindow().addWindow(w);\r
+ }\r
+\r
+ public void refreshButtonClick(ClickEvent event) {\r
+ l.setValue("Amount of child windows attached to the main window: "\r
+ + getApplication().getMainWindow().getChildWindows().size());\r
+ }\r
+\r
+ public void windowClose(CloseEvent e) {\r
+ // In this example, the window will be removed after closing\r
+ getApplication().getMainWindow().removeWindow(e.getWindow());\r
+ System.err.println("Sampler->WindowChildExample: Window close event");\r
+ }\r
+\r
+}
\ No newline at end of file
--- /dev/null
+package com.itmill.toolkit.demo.sampler.features.windows;\r
+\r
+import com.itmill.toolkit.demo.sampler.APIResource;\r
+import com.itmill.toolkit.demo.sampler.Feature;\r
+import com.itmill.toolkit.demo.sampler.NamedExternalResource;\r
+import com.itmill.toolkit.ui.Window;\r
+\r
+public class WindowNativeNew extends Feature {\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "Creates and opens a new native browser window with its own state."\r
+ + "<br>Native browser"\r
+ + " windows can either share the same state (instance) or have their own"\r
+ + " internal state (instance). In practice the former option means that the"\r
+ + " URL of the window will always be same (pointing to the same Window object"\r
+ + ", whereas using the latter option generates a new URL (and Window instance)"\r
+ + " for each new window."\r
+ + "<br>It is essential to remember to remove the closed windows from the"\r
+ + " application e.g. by implementing the Window.CloseListener interface.";\r
+ }\r
+\r
+ @Override\r
+ public APIResource[] getRelatedAPI() {\r
+ return new APIResource[] { new APIResource(Window.class) };\r
+ }\r
+\r
+ @Override\r
+ public Class[] getRelatedFeatures() {\r
+ return new Class[] { WindowNativeShared.class, WindowChild.class };\r
+ }\r
+\r
+ @Override\r
+ public NamedExternalResource[] getRelatedResources() {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.itmill.toolkit.demo.sampler.features.windows;\r
+\r
+import com.itmill.toolkit.terminal.ExternalResource;\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.VerticalLayout;\r
+import com.itmill.toolkit.ui.Window;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+import com.itmill.toolkit.ui.Window.CloseEvent;\r
+\r
+public class WindowNativeNewExample extends VerticalLayout implements\r
+ Window.CloseListener {\r
+\r
+ private Button b1;\r
+ private Button b2;\r
+ private Label l;\r
+\r
+ public WindowNativeNewExample() {\r
+ setSpacing(true);\r
+\r
+ b1 = new Button(\r
+ "Create and open a new native window with its own state", this,\r
+ "openButtonClick");\r
+ addComponent(b1);\r
+\r
+ l = new Label("Amount of windows in memory:");\r
+ addComponent(l);\r
+\r
+ b2 = new Button("Refresh", this, "refreshButtonClick");\r
+ addComponent(b2);\r
+ }\r
+\r
+ public void openButtonClick(ClickEvent event) {\r
+ Window w = new Window("Native subwindow");\r
+ Label desc = new Label(\r
+ "This is a new native window with its own state."\r
+ + " You'll notice that if you open a new window several"\r
+ + " times, the URL will be unique for each window, and the"\r
+ + " amount of windows in memory will increase by one."\r
+ + " When you close this window, the amount of windows in"\r
+ + " memory should decrease by one."\r
+ + " The window is added to the application and then"\r
+ + " opened through its unique URL.");\r
+ w.addComponent(desc);\r
+ w.addListener(this);\r
+ getApplication().addWindow(w);\r
+ getApplication().getMainWindow().open(new ExternalResource(w.getURL()),\r
+ "_blank");\r
+ }\r
+\r
+ public void refreshButtonClick(ClickEvent event) {\r
+ l.setValue("Amount of windows in memory: "\r
+ + getApplication().getWindows().size());\r
+ }\r
+\r
+ public void windowClose(CloseEvent e) {\r
+ // In this example, the window will be removed after closing,\r
+ getApplication().removeWindow(e.getWindow());\r
+ System.err\r
+ .println("Sampler->WindowNativeNewExample: Window close event");\r
+ }\r
+\r
+}
\ No newline at end of file
--- /dev/null
+package com.itmill.toolkit.demo.sampler.features.windows;\r
+\r
+import com.itmill.toolkit.demo.sampler.APIResource;\r
+import com.itmill.toolkit.demo.sampler.Feature;\r
+import com.itmill.toolkit.demo.sampler.NamedExternalResource;\r
+import com.itmill.toolkit.ui.Window;\r
+\r
+public class WindowNativeShared extends Feature {\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "Creates and opens a new native browser window with shared state. If the"\r
+ + " window object has already been created, it will only be reopened."\r
+ + "<br>Native browser"\r
+ + " windows can either share the same state (instance) or have their own"\r
+ + " internal state (instance). In practice the former option means that the"\r
+ + " URL of the window will always be same (pointing to the same Window object"\r
+ + ", whereas using the latter option generates a new URL (and Window instance)"\r
+ + " for each new window."\r
+ + "<br>When using the latter option it is essential to remember to remove"\r
+ + " the closed windows from the"\r
+ + " application e.g. by implementing the Window.CloseListener interface.";\r
+ }\r
+\r
+ @Override\r
+ public APIResource[] getRelatedAPI() {\r
+ return new APIResource[] { new APIResource(Window.class) };\r
+ }\r
+\r
+ @Override\r
+ public Class[] getRelatedFeatures() {\r
+ return new Class[] { WindowNativeNew.class, WindowChild.class };\r
+ }\r
+\r
+ @Override\r
+ public NamedExternalResource[] getRelatedResources() {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.itmill.toolkit.demo.sampler.features.windows;\r
+\r
+import java.net.URL;\r
+\r
+import com.itmill.toolkit.terminal.ExternalResource;\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.VerticalLayout;\r
+import com.itmill.toolkit.ui.Window;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+import com.itmill.toolkit.ui.Window.CloseEvent;\r
+\r
+public class WindowNativeSharedExample extends VerticalLayout implements\r
+ Window.CloseListener {\r
+\r
+ private URL nativeWindowURL = null;\r
+ private Button b1;\r
+ private Button b2;\r
+ private Label l;\r
+\r
+ public WindowNativeSharedExample() {\r
+ setSpacing(true);\r
+\r
+ b1 = new Button("Create/open a new native window with shared state",\r
+ this, "openButtonClick");\r
+ addComponent(b1);\r
+\r
+ l = new Label("Amount of windows in memory:");\r
+ addComponent(l);\r
+\r
+ b2 = new Button("Refresh", this, "refreshButtonClick");\r
+ addComponent(b2);\r
+ }\r
+\r
+ public void openButtonClick(ClickEvent event) {\r
+ if (nativeWindowURL == null) {\r
+ final Window w = new Window("Native subwindow");\r
+ final Label desc = new Label(\r
+ "This is a new native window with a shared state."\r
+ + " You'll notice that even if you open this several"\r
+ + " times, the URL will always be the same, and the"\r
+ + " amount of windows in memory will not increase. "\r
+ + " The window is added to the application and then"\r
+ + " opened through its unique URL.");\r
+ w.addComponent(desc);\r
+ w.addListener(this);\r
+ getApplication().addWindow(w);\r
+ nativeWindowURL = w.getURL();\r
+ }\r
+ getApplication().getMainWindow().open(\r
+ new ExternalResource(nativeWindowURL), "_blank");\r
+ }\r
+\r
+ public void refreshButtonClick(ClickEvent event) {\r
+ l.setValue("Amount of windows in memory: "\r
+ + getApplication().getWindows().size());\r
+ }\r
+\r
+ public void windowClose(CloseEvent e) {\r
+ // In this example, the window will not be removed after closing,\r
+ // in order to preserve the window's URL functional. Normally you would\r
+ // remove the window after closing as follows:\r
+ // getApplication().removeWindow(e.getWindow());\r
+\r
+ System.err\r
+ .println("Sampler->WindowNativeSharedExample: Window close event");\r
+ }\r
+\r
+}
\ No newline at end of file