// Copyright 2011 Palantir Technologies // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.palantir.ptoss.cinch.example.demo; import java.awt.BorderLayout; import java.awt.Color; import java.awt.EventQueue; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JSeparator; import javax.swing.JSlider; import javax.swing.JTextField; import com.palantir.ptoss.cinch.core.Bindable; import com.palantir.ptoss.cinch.core.Bindings; import com.palantir.ptoss.cinch.core.CallOnUpdate; import com.palantir.ptoss.cinch.example.Examples; import com.palantir.ptoss.cinch.example.demo.DemoModel.DemoEnum; import com.palantir.ptoss.cinch.swing.Action; import com.palantir.ptoss.cinch.swing.Bound; import com.palantir.ptoss.cinch.swing.BoundSelection; import com.palantir.ptoss.cinch.swing.EnabledIf; import com.palantir.ptoss.cinch.swing.OnClick; import com.palantir.ptoss.cinch.swing.OnClick.Button; import com.palantir.ptoss.cinch.swing.VisibleIf; @Bindable public class DemoView { private final Bindings bindings = new Bindings(); private final JPanel panel = new JPanel(); private final DemoModel demoModel = new DemoModel(); @SuppressWarnings("unused") // used by binding @Bindable private final DemoController controller = new DemoController(demoModel); @Bound(to = "demoBoolean") // TODO: autodiscover bound variable name private final JCheckBox demoBooleanCheckBox = new JCheckBox("Enable Button 1/Show Button 2"); @Action(call = "demoAction") @EnabledIf(to = "demoBoolean") private final JButton demoButton1 = new JButton("Button 1"); @Action(call = "demoAction2") @VisibleIf(to = "demoBoolean") private final JButton demoButton2 = new JButton("Button 2"); @Bound(to = "demoRadioBoolean", value = "true") private final JRadioButton trueButton = new JRadioButton("True"); @Bound(to = "demoRadioBoolean", value = "false") private final JRadioButton falseButton = new JRadioButton("False"); @Bound(to = "demoEnum", value = "FOO") private final JRadioButton fooButton = new JRadioButton("Foo"); @Bound(to = "demoEnum", value = "BAR") private final JRadioButton barButton = new JRadioButton("Bar"); @Bound(to = "demoEnum", value = "BAZ") private final JRadioButton bazButton = new JRadioButton("Baz (Red Background)"); @Action(call = "setToFoo") private final JButton setToFooButton = new JButton("Foo"); @Bound(to = "filterText") private final JTextField filterText = new JTextField(15); @Bound(to = "filteredList", on = "LIST") @BoundSelection(to = "selectedItem") private final JList demoList = new JList(); @Action(call = "changeList") private final JButton changeList = new JButton("Change List"); @Action(call = "selectFox") private final JButton changeSelection = new JButton("Select Fox"); @OnClick(call = "listClicked", button = Button.RIGHT, count = 2) private final JLabel listChangedLabel = new JLabel(); @Bound(to = "demoMultiList", on = "MULTILIST") @BoundSelection(to = "multiSelectedItems", multi = true) private final JList demoMultiselectList = new JList(); @Bound(to = "multiSelectedItems") private final JLabel multiselectContents = new JLabel(); @Action(call = "selectMulti") private final JButton selectMulti = new JButton("Select Bravo/Delta"); public static final String NULL_VALUE = "<--none-->"; @Bound(to = "comboList", nullValue = "NULL_VALUE", on = "COMBO") @BoundSelection(to = "selectedComboItem", nullValue = "NULL_VALUE") private final JComboBox comboBox = new JComboBox(); @Bound(to = "selectedComboItemString") private final JLabel selItem = new JLabel(); private final DrawingCanvasModel canvasModel = new DrawingCanvasModel(); private final DrawingCanvas canvas = new DrawingCanvas(canvasModel); @Bound(to = "mode", value = "POINT") private final JRadioButton pointButton = new JRadioButton("Points"); @Bound(to = "mode", value = "LINE") private final JRadioButton lineButton = new JRadioButton("Lines"); @Bound(to = "allowDrag") private final JCheckBox allowDrag = new JCheckBox("Allow Drag"); @Action(call = "clear") private final JButton clearButton = new JButton("Clear"); @Bound(to = "sliderValue") private final JSlider slider = new JSlider(0, 100); @Bound(to = "sliderValue") private final JLabel sliderValue = new JLabel(); @Action(call = "setSlider") private final JButton setSlider = new JButton("Set to 50"); private DemoView() { // private } public static DemoView create() { DemoView demo = new DemoView(); demo.bindings.bind(demo); demo.showUi(); return demo; } private static JPanel panelOf(JComponent... comps) { JPanel p = new JPanel(); p.setOpaque(false); for (JComponent comp : comps) { p.add(comp); } return p; } private void showUi() { JFrame frame = new JFrame("Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(100, 100); frame.setSize(600, 800); JPanel controlsPanel = new JPanel(); controlsPanel.setOpaque(false); BoxLayout box = new BoxLayout(controlsPanel, BoxLayout.Y_AXIS); controlsPanel.setLayout(box); controlsPanel.add(panelOf( new JLabel("Enabling Button:"), demoBooleanCheckBox, demoButton1, demoButton2)); controlsPanel.add(panelOf( new JLabel("Bind Radio Buttons to boolean:"), trueButton, falseButton)); controlsPanel.add(new JSeparator()); controlsPanel.add(panelOf( new JLabel("Bind Radio Buttons to enum:"), fooButton, barButton, bazButton, setToFooButton)); controlsPanel.add(new JSeparator()); controlsPanel.add(panelOf( new JLabel("Filtering JList:"), filterText, demoList, changeList, changeSelection, listChangedLabel)); controlsPanel.add(new JSeparator()); controlsPanel.add(panelOf( new JLabel("Multiselect JList:"), demoMultiselectList, multiselectContents, selectMulti)); controlsPanel.add(new JSeparator()); controlsPanel.add(panelOf( new JLabel("Bind JComboBox:"), comboBox, selItem)); controlsPanel.add(new JSeparator()); controlsPanel.add(panelOf( new JLabel("Slider:"), slider, sliderValue, setSlider)); controlsPanel.add(new JSeparator()); String text = "test\nlabel\ttab"; JLabel testLabel = new JLabel(text); JTextField testField = new JTextField(text); controlsPanel.add(panelOf( testLabel, testField)); controlsPanel.add(panelOf( new JLabel("Custom component:"), pointButton, lineButton, allowDrag, clearButton)); controlsPanel.add(canvas); panel.setLayout(new BorderLayout()); panel.add(controlsPanel, BorderLayout.NORTH); panel.add(canvas, BorderLayout.CENTER); frame.setContentPane(panel); frame.setVisible(true); } public void listClicked() { System.out.println("listClicked"); } @CallOnUpdate(model = "demoModel") public void updateBackgroundColor() { Color color = null; if (demoModel.getDemoEnum() == DemoEnum.BAZ) { color = Color.RED; } panel.setBackground(color); panel.repaint(); } int listChangeCount = 0; @CallOnUpdate(model = "demoModel", on = "LIST") public void listChanged() { ++listChangeCount; listChangedLabel.setText("list changes: " + listChangeCount); } public void setSlider() { demoModel.setSliderValue(50); } public static void main(String[] args) { Examples.initializeLogging(); EventQueue.invokeLater(new Runnable() { public void run() { DemoView.create(); } }); } }