summaryrefslogtreecommitdiff
path: root/docs/examples/swing/UIDemo.scala
diff options
context:
space:
mode:
Diffstat (limited to 'docs/examples/swing/UIDemo.scala')
-rw-r--r--docs/examples/swing/UIDemo.scala147
1 files changed, 147 insertions, 0 deletions
diff --git a/docs/examples/swing/UIDemo.scala b/docs/examples/swing/UIDemo.scala
new file mode 100644
index 0000000000..6d77c049e0
--- /dev/null
+++ b/docs/examples/swing/UIDemo.scala
@@ -0,0 +1,147 @@
+package examples.swing
+
+import swing._
+import event._
+import Swing._
+import ListView._
+
+object UIDemo extends SimpleSwingApplication {
+ def top = new MainFrame {
+ title = "Scala Swing Demo"
+
+ /*
+ * Create a menu bar with a couple of menus and menu items and
+ * set the result as this frame's menu bar.
+ */
+ menuBar = new MenuBar {
+ contents += new Menu("A Menu") {
+ contents += new MenuItem("An item")
+ contents += new MenuItem(Action("An action item") {
+ println("Action '"+ title +"' invoked")
+ })
+ contents += new Separator
+ contents += new CheckMenuItem("Check me")
+ contents += new CheckMenuItem("Me too!")
+ contents += new Separator
+ val a = new RadioMenuItem("a")
+ val b = new RadioMenuItem("b")
+ val c = new RadioMenuItem("c")
+ val mutex = new ButtonGroup(a,b,c)
+ contents ++= mutex.buttons
+ }
+ contents += new Menu("Empty Menu")
+ }
+
+ /*
+ * The root component in this frame is a panel with a border layout.
+ */
+ contents = new BorderPanel {
+ import BorderPanel.Position._
+
+ var reactLive = false
+
+ val tabs = new TabbedPane {
+ import TabbedPane._
+ val buttons = new FlowPanel {
+ border = Swing.EmptyBorder(5,5,5,5)
+
+ contents += new BoxPanel(Orientation.Vertical) {
+ border = CompoundBorder(TitledBorder(EtchedBorder, "Radio Buttons"), EmptyBorder(5,5,5,10))
+ val a = new RadioButton("Green Vegetables")
+ val b = new RadioButton("Red Meat")
+ val c = new RadioButton("White Tofu")
+ val mutex = new ButtonGroup(a,b,c)
+ contents ++= mutex.buttons
+ }
+ contents += new BoxPanel(Orientation.Vertical) {
+ border = CompoundBorder(TitledBorder(EtchedBorder, "Check Boxes"), EmptyBorder(5,5,5,10))
+ val paintLabels = new CheckBox("Paint Labels")
+ val paintTicks = new CheckBox("Paint Ticks")
+ val snapTicks = new CheckBox("Snap To Ticks")
+ val live = new CheckBox("Live")
+ contents.append(paintLabels, paintTicks, snapTicks, live)
+ listenTo(paintLabels, paintTicks, snapTicks, live)
+ reactions += {
+ case ButtonClicked(`paintLabels`) =>
+ slider.paintLabels = paintLabels.selected
+ case ButtonClicked(`paintTicks`) =>
+ slider.paintTicks = paintTicks.selected
+ case ButtonClicked(`snapTicks`) =>
+ slider.snapToTicks = snapTicks.selected
+ case ButtonClicked(`live`) =>
+ reactLive = live.selected
+ }
+ }
+ contents += new Button(Action("Center Frame") { centerOnScreen() })
+ }
+ pages += new Page("Buttons", buttons)
+ pages += new Page("GridBag", GridBagDemo.ui)
+ pages += new Page("Converter", CelsiusConverter2.ui)
+ pages += new Page("Tables", TableSelection.ui)
+ pages += new Page("Dialogs", Dialogs.ui)
+ pages += new Page("Combo Boxes", ComboBoxes.ui)
+ pages += new Page("Split Panes",
+ new SplitPane(Orientation.Vertical, new Button("Hello"), new Button("World")) {
+ continuousLayout = true
+ })
+
+ val password = new FlowPanel {
+ contents += new Label("Enter your secret password here ")
+ val field = new PasswordField(10)
+ contents += field
+ val label = new Label(field.text)
+ contents += label
+ listenTo(field)
+ reactions += {
+ case EditDone(`field`) => label.text = field.password.mkString
+ }
+ }
+
+ pages += new Page("Password", password)
+ pages += new Page("Painting", LinePainting.ui)
+ //pages += new Page("Text Editor", TextEditor.ui)
+ }
+
+ val list = new ListView(tabs.pages) {
+ selectIndices(0)
+ selection.intervalMode = ListView.IntervalMode.Single
+ renderer = ListView.Renderer(_.title)
+ }
+ val center = new SplitPane(Orientation.Vertical, new ScrollPane(list), tabs) {
+ oneTouchExpandable = true
+ continuousLayout = true
+ }
+ layout(center) = Center
+
+ /*
+ * This slider is used above, so we need lazy initialization semantics.
+ * Objects or lazy vals are the way to go, but objects give us better
+ * type inference at times.
+ */
+ object slider extends Slider {
+ min = 0
+ value = tabs.selection.index
+ max = tabs.pages.size-1
+ majorTickSpacing = 1
+ }
+ layout(slider) = South
+
+ /*
+ * Establish connection between the tab pane, slider, and list view.
+ */
+ listenTo(slider)
+ listenTo(tabs.selection)
+ listenTo(list.selection)
+ reactions += {
+ case ValueChanged(`slider`) =>
+ if(!slider.adjusting || reactLive) tabs.selection.index = slider.value
+ case SelectionChanged(`tabs`) =>
+ slider.value = tabs.selection.index
+ list.selectIndices(tabs.selection.index)
+ case SelectionChanged(`list`) =>
+ if (list.selection.items.length == 1)
+ tabs.selection.page = list.selection.items(0)
+ }
+ }
+ }
+}