packages feed

pianola-0.1.1: backends/java-swing-testapp/src/main/java/info/danidiaz/pianola/testapp/TestAppFrame.java

package info.danidiaz.pianola.testapp;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.border.BevelBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

public class TestAppFrame extends JFrame {

    private final JTextField textField = new JTextField(18);
    
    private final JLabel statusLabel;
    private final JButton clearStatusLabel;        
    
    public TestAppFrame() throws HeadlessException {
        super("Test app frame");
        
        getContentPane().setLayout(new BorderLayout());
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("tab one", createTabOne());
        tabbedPane.setToolTipTextAt(0, "tooltip for tab one");
        tabbedPane.addTab("tab two", createTabTwo());
        tabbedPane.setToolTipTextAt(1, "tooltip for tab two");
        JPanel panels [] = createTabJTree();
        tabbedPane.addTab("tab JTree a", panels[0]);
        tabbedPane.setToolTipTextAt(2, "tooltip for tab three");
        tabbedPane.addTab("tab JTree b", panels[1]);
        tabbedPane.setToolTipTextAt(3, "tooltip for tab four");
        tabbedPane.addTab("labels", createTabLabeledFields());
        tabbedPane.setToolTipTextAt(4, "tooltip for labels");

        getContentPane().add(tabbedPane, BorderLayout.CENTER);
                     
                       
        JPanel statusPanel = new JPanel(new BorderLayout());
        statusPanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
        statusPanel.setPreferredSize(new Dimension(this.getWidth(), 36));
        //statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.X_AXIS));
                
        statusLabel = new JLabel("");
        statusLabel.setName("status bar");
        statusLabel.setHorizontalAlignment(SwingConstants.LEFT);
        statusPanel.add(statusLabel,BorderLayout.CENTER);
        
        clearStatusLabel = new JButton("clear");
        clearStatusLabel.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {
                    statusLabel.setText("");
                
            }
        });
        statusPanel.add(clearStatusLabel, BorderLayout.EAST);
        

        getContentPane().add(statusPanel, BorderLayout.SOUTH);
                
        JMenu menu = new JMenu("Menu1");
        JMenuItem item1 = new JMenuItem("item1"); 
        JMenuItem item2 = new JMenuItem("item2");        
        menu.add(item1);
        menu.add(item2);
        JMenu subMenu = new JMenu("SubMenu1");     
        JMenuItem menuitem1 = new JMenuItem("submenuitem1");
        menuitem1.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {
                statusLabel.setText("clicked on submenuitem1");               
            }
        });
        subMenu.add(menuitem1);
        final JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem("submenuitem2");
        checkBoxMenuItem.addItemListener(new ItemListener() {
            
            @Override
            public void itemStateChanged(ItemEvent arg0) {
                statusLabel.setText("checkbox in menu is now "+checkBoxMenuItem.isSelected());                
            }
        });
        subMenu.add(checkBoxMenuItem);
        menu.add(subMenu);         
        
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);
        setJMenuBar(menuBar);
        
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                
        

    }
    
    private void createAndShowDialog(JFrame frame) {
        final JDialog dialog = new JDialog(frame,true);
        dialog.setTitle("foo dialog");
        dialog.getContentPane().setLayout(new BorderLayout());
        dialog.getContentPane().add(new JTextArea(18, 10),BorderLayout.CENTER);
        
        JButton actionButton = new JButton("click this");
        actionButton.addActionListener(new ActionListener() {            
            @Override
            public void actionPerformed(ActionEvent arg0) {                
                statusLabel.setText("clicked button in dialog");
            }
        });        
        
        JButton dialogButton = new JButton("close dialog");
        dialogButton.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
                
            }
        });
        dialog.getContentPane().add(actionButton,BorderLayout.NORTH);
        dialog.getContentPane().add(dialogButton,BorderLayout.SOUTH);
        //Display the window.
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);        
    }
   
    private JPanel createTabOne() {
        JPanel mainPanel = new JPanel(new BorderLayout());
        JPanel textPanel = new JPanel(new BorderLayout());
        
        textField.setText("En un lugar de la Mancha");
        textField.getDocument().addDocumentListener(new DocumentListener() {
            
            @Override
            public void removeUpdate(DocumentEvent arg0) {
                statusLabel.setText(textField.getText());                               
            }
            
            @Override
            public void insertUpdate(DocumentEvent arg0) {
                statusLabel.setText(textField.getText());                            
            }
            
            @Override
            public void changedUpdate(DocumentEvent arg0) {
                statusLabel.setText(textField.getText());                
            }
        });
        
        textPanel.add(textField,BorderLayout.NORTH); 
        
        textPanel.add(new JTextArea(18, 28),BorderLayout.CENTER);
        JButton fooButton = new JButton("open dialog");
        fooButton.setToolTipText("open dialog tooltip");
        fooButton.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                
                createAndShowDialog(TestAppFrame.this);
            }
        });
        
        JPanel dialogButtonPanel = new JPanel(new GridLayout(2,1));
        dialogButtonPanel.add(fooButton);
        JButton slowDialogButton = new JButton("open slow dialog");
        slowDialogButton.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {                       
                new DialogOpenDelayer(TestAppFrame.this,statusLabel).execute();                
            }
        });
        dialogButtonPanel.add(slowDialogButton);        
        
        textPanel.add(dialogButtonPanel,BorderLayout.SOUTH);
        
        JPanel westPanel = new JPanel(new GridLayout(6,1));
        JComboBox combo = new JComboBox(new Object [] { "aaa","bbb","ccc",
                "ddd",
                "eee",
                "fff",
                "ggg",
                "hhh",
                "iii",
                "111",
                "222",
                "333"                
            }); 
        combo.addItemListener(new ItemListener() {            
            @Override
            public void itemStateChanged(ItemEvent arg0) {
                statusLabel.setText("selected in combo: " + arg0.getItem());
                
            }
        });
                    
        westPanel.add(combo);
        final JCheckBox checkBox = new JCheckBox("This is a checkbox");
        checkBox.addItemListener(new ItemListener() {
            
            @Override
            public void itemStateChanged(ItemEvent arg0) {
                statusLabel.setText("checkbox is now "+checkBox.isSelected());                                
            }
        });
        westPanel.add(checkBox);
        
        
        JLabel label = new JLabel("This is a label");
        
        final JPopupMenu popup = new JPopupMenu();
        JMenuItem popupitem1 = new JMenuItem("popupitem1"); 
        JMenuItem popupitem2 = new JMenuItem("popupitem2");
        popupitem2.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {
                statusLabel.setText("clicked on popupitem2");                
            }
        });
        popup.add(popupitem1);
        popup.add(popupitem2);
        label.addMouseListener(new  MouseAdapter() {
            
            @Override
            public void mousePressed(MouseEvent e){
                if (e.isPopupTrigger())
                    doPop(e);
            }
            @Override
            public void mouseReleased(MouseEvent e){
                if (e.isPopupTrigger())
                    doPop(e);
            }

            private void doPop(MouseEvent e){                
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
             
        });
      
        westPanel.add(label);  
  
        JLabel label2 = new JLabel("click dbl click");
        label2.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                
                if (e.getClickCount() == 1) {
                    statusLabel.setText("clicked on label");
                } else if (e.getClickCount() == 2) {
                    statusLabel.setText("double-clicked on label");
                }
            }
        });
        westPanel.add(label2);
        
        final JFileChooser fc = new JFileChooser();
        final JButton fileChooserButton = new JButton("Open file chooser");
        fileChooserButton.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {
                int returnVal = fc.showOpenDialog(fileChooserButton);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    statusLabel.setText("file is: " + file);                    
                } 
            }
        });
        westPanel.add(fileChooserButton);
       
        mainPanel.add(textPanel,BorderLayout.CENTER);        
        mainPanel.add(westPanel,BorderLayout.EAST);
        
        return mainPanel;
    }
    
    private JPanel createTabTwo() {
        JPanel mainPanel = new JPanel(new BorderLayout());
        
        final JTable table = new JTable(new DefaultTableModel(               
                    new Object[][] {
                            new Object[] { "row1", 2, 3  },
                            new Object[] { "row2", 4 , 6 },
                            new Object[] { "row3", 6 , 7 },
                    },                
                    
                    new Object[] { "col1", "col2", "col3" }                              
                ));
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            
            @Override
            public void valueChanged(ListSelectionEvent arg0) {
                ListSelectionModel lsm = (ListSelectionModel)arg0.getSource();
                if (lsm.isSelectionEmpty()) {
                } else {                    
                    int minIndex = lsm.getMinSelectionIndex();
                    statusLabel.setText("selected index in table: "+ minIndex);
                }                
            }
        });
        table.getModel().addTableModelListener(new TableModelListener() {
            
            @Override
            public void tableChanged(TableModelEvent arg0) {
                int row = arg0.getFirstRow();
                int col = arg0.getColumn();                
                Object o = table.getModel().getValueAt(row,col);
                statusLabel.setText("table value at row "+row+" col " +col + " is "+o);
            }
        });
        mainPanel.add(table,BorderLayout.CENTER);
        return mainPanel;
    }

    private JPanel[] createTabJTree() {
        JPanel[] panels = new JPanel[2];
        panels [0] = new JPanel(new BorderLayout());
        panels [1] = new JPanel(new BorderLayout());
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("this is the root");
        DefaultMutableTreeNode leafa = new DefaultMutableTreeNode("leaf a");
        root.add(leafa);
        DefaultMutableTreeNode leafaa = new DefaultMutableTreeNode("leaf a a");
        leafa.add(leafaa);
        
        DefaultMutableTreeNode leafaaa = new DefaultMutableTreeNode("leaf a a a");
        DefaultMutableTreeNode leafaab = new DefaultMutableTreeNode("leaf a a b");
        DefaultMutableTreeNode leafaac = new DefaultMutableTreeNode("leaf a a c");
        leafaa.add(leafaaa);
        leafaa.add(leafaab);
        leafaa.add(leafaac);
        
        DefaultMutableTreeNode leafab = new DefaultMutableTreeNode("leaf a b");
        leafa.add(leafab);
        DefaultMutableTreeNode leafb = new DefaultMutableTreeNode("leaf b");
        DefaultMutableTreeNode leafba = new DefaultMutableTreeNode("leaf b a");
        leafb.add(leafba);
        
        root.add(leafb);
        
        DefaultTreeModel model = new DefaultTreeModel(root);
      
        Object o [] = new Object[] { root, leafa };
        final TreePath treepath = new TreePath(o);
                               
        final JTree tree = new JTree(model);
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.setRootVisible(true);
        tree.addTreeExpansionListener(new TreeExpansionListener() {
            
            @Override
            public void treeExpanded(TreeExpansionEvent arg0) {
                statusLabel.setText("leaf a is collapsed: "+tree.isCollapsed(treepath));                
            }
            
            @Override
            public void treeCollapsed(TreeExpansionEvent arg0) {
                statusLabel.setText("leaf a is collapsed: "+tree.isCollapsed(treepath));                
            }
        });
        panels[0].add(new JScrollPane(tree),BorderLayout.CENTER);
        
        final JTree tree2 = new JTree(model);
        tree2.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree2.setRootVisible(false);
        tree2.addTreeExpansionListener(new TreeExpansionListener() {
            
            @Override
            public void treeExpanded(TreeExpansionEvent arg0) {
                statusLabel.setText("leaf a is collapsed: "+tree2.isCollapsed(treepath));                
            }
            
            @Override
            public void treeCollapsed(TreeExpansionEvent arg0) {
                statusLabel.setText("leaf a is collapsed: "+tree2.isCollapsed(treepath));                
            }
        });        
        panels[1].add(new JScrollPane(tree2),BorderLayout.CENTER);
                
        return panels;
    }
    
    private JPanel createTabLabeledFields() {
        JPanel mainPanel = new JPanel(new BorderLayout());
        JPanel gridPanel = new JPanel(new GridLayout(3,2,10,10));
        gridPanel.add(new JLabel("label1"));
        
        final JTextField textField = new JTextField(10);
        textField.getDocument().addDocumentListener(new DocumentListener() {
            
            @Override
            public void removeUpdate(DocumentEvent arg0) {
                statusLabel.setText(textField.getText());                               
            }
            
            @Override
            public void insertUpdate(DocumentEvent arg0) {
                statusLabel.setText(textField.getText());                            
            }
            
            @Override
            public void changedUpdate(DocumentEvent arg0) {
                statusLabel.setText(textField.getText());                
            }
        });        
        gridPanel.add(textField);
        gridPanel.add(new JLabel("label2"));
        gridPanel.add(new JTextField(10));
        gridPanel.add(new JLabel("label3"));        
        gridPanel.add(new JButton("boo"));
        mainPanel.add(gridPanel,BorderLayout.NORTH);
        return mainPanel;
    }
    
    private static class DialogOpenDelayer extends SwingWorker<Object, Object> {

        JFrame frame;
        JLabel statusLabel;                     

        public DialogOpenDelayer(JFrame frame, JLabel statusLabel) {
            super();
            this.frame = frame;
            this.statusLabel = statusLabel;
        }

        @Override
        protected Object doInBackground() throws Exception {
            Thread.currentThread().sleep(3000);
            return "";
        }

        @Override
        protected void done() {
            super.done();
            
            final JDialog dialog = new JDialog(frame,true);
            dialog.setTitle("slow dialog");
            dialog.getContentPane().setLayout(new BorderLayout());
            dialog.getContentPane().add(new JTextArea(18, 10),BorderLayout.CENTER);
            
            JButton dialogButton = new JButton("close dialog");
            dialogButton.addActionListener(new ActionListener() {
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    new DialogCloseDelayer(dialog, statusLabel).execute();
                    
                }
            });
            dialog.getContentPane().add(dialogButton,BorderLayout.SOUTH);
            //Display the window.
            dialog.pack();
            dialog.setLocationRelativeTo(null);
            dialog.setVisible(true);        
        }                
    }
    
    private static class DialogCloseDelayer extends SwingWorker<Object, Object> {

        JDialog dialog;
        JLabel statusLabel;

        public DialogCloseDelayer(JDialog dialog,JLabel statusLabel) {
            super();
            this.dialog = dialog;
            this.statusLabel = statusLabel;
        }

        @Override
        protected Object doInBackground() throws Exception {
            Thread.currentThread().sleep(3000);
            return "";
        }

        @Override
        protected void done() {
            super.done();
            statusLabel.setText("Performed delayed close");
            dialog.setVisible(false);
        }                
    }
}