import java.awt.BorderLayout;
import java.awt.Checkbox;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextComponent;
import java.awt.TextField;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.Method;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class TouchKeyboardAutoShowTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                final Frame frame = new Frame("TouchKeyboardAutoShowTest");
                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        frame.dispose();
                    }
                });
                frame.setLayout(new BorderLayout(5, 5));

                // Create a panel with AWT text components.
                Panel awtCompsPanel = new Panel();
                awtCompsPanel.setLayout(new BoxLayout(awtCompsPanel,
                        BoxLayout.Y_AXIS));
                frame.add(awtCompsPanel, BorderLayout.WEST);

                Label awtCompsPanelHdrLbl = new Label("AWT Text Components");
                Font hdrFont = new Font(Font.SANS_SERIF, Font.BOLD, 14);
                awtCompsPanelHdrLbl.setFont(hdrFont);
                awtCompsPanel.add(createFlowLayoutPanelWithComp(
                        awtCompsPanelHdrLbl));

                final TextField textField = new TextField("TextField", 30);
                awtCompsPanel.add(createControlPanelWithTextComp(textField,
                        "TextField"));

                final TextArea textArea = new TextArea("TextArea", 5, 30);
                awtCompsPanel.add(createControlPanelWithTextComp(textArea,
                        "TextArea"));

                awtCompsPanel.add(Box.createVerticalStrut(150));

                // Create a panel with Swing text components.
                JPanel swingCompsPanel = new JPanel();
                swingCompsPanel.setLayout(new BoxLayout(swingCompsPanel,
                        BoxLayout.Y_AXIS));
                frame.add(swingCompsPanel, BorderLayout.CENTER);

                JLabel swingCompsPanelHdrLbl = new JLabel(
                    "Swing Text Components");
                swingCompsPanelHdrLbl.setFont(hdrFont);
                swingCompsPanel.add(createFlowLayoutJPanelWithComp(
                        swingCompsPanelHdrLbl));

                final JTextField jTextField = new JTextField("JTextField", 25);
                swingCompsPanel.add(createControlJPanelWithTextComp(jTextField,
                        "JTextField"));

                final JTextArea jTextArea = new JTextArea("JTextArea", 5, 25);
                swingCompsPanel.add(createControlJPanelWithTextComp(jTextArea,
                        "JTextArea"));

                final JEditorPane editorPane = new JEditorPane("text/plain",
                    "JEditorPane JEditorPane\r\nJEditorPane JEditorPane\r\n");
                editorPane.setPreferredSize(new Dimension(300, 150));
                swingCompsPanel.add(createControlJPanelWithTextComp(editorPane,
                        "JEditorPane"));

                // Create a panel with Swing components containing text
                // components.
                JPanel miscCompsPanel = new JPanel();
                miscCompsPanel.setLayout(new BoxLayout(miscCompsPanel,
                        BoxLayout.Y_AXIS));
                frame.add(miscCompsPanel, BorderLayout.EAST);

                JLabel miscCompsPanelHdrLbl = new JLabel(
                        "Swing Components with Text Components");
                miscCompsPanelHdrLbl.setFont(hdrFont);
                miscCompsPanel.add(createFlowLayoutJPanelWithComp(
                        miscCompsPanelHdrLbl));

                DefaultMutableTreeNode itemsNode =
                    new DefaultMutableTreeNode("Items");
                itemsNode.add(new DefaultMutableTreeNode("Ball"));
                itemsNode.add(new DefaultMutableTreeNode("Shoe"));
                JTree tree = new JTree(itemsNode);
                tree.setEditable(true);
                tree.setShowsRootHandles(true);
                tree.setPreferredSize(new Dimension(200, 150));
                miscCompsPanel.add(createControlJPanelWithTextComp(tree,
                        "JTree"));

                String[] columnNames = {"ID", "Color"};
                Object[][] data = {{"1", "Black"}, {"2", "White"}};
                JTable table = new JTable(data, columnNames);
                table.setPreferredSize(new Dimension(200, 150));
                miscCompsPanel.add(createControlJPanelWithTextComp(table,
                        "JTable"));

                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    private static Panel createFlowLayoutPanelWithComp(Component comp) {
        return createFlowLayoutPanelWithComp(comp, FlowLayout.CENTER);
    }

    private static Panel createFlowLayoutPanelWithComp(Component comp,
        int allign) {
        Panel panel = new Panel(new FlowLayout(allign));
        if (comp != null) {
            panel.add(comp);
        }
        return panel;
    }

    private static JPanel createFlowLayoutJPanelWithComp(JComponent comp) {
        return createFlowLayoutJPanelWithComp(comp, FlowLayout.CENTER);
    }

    private static JPanel createFlowLayoutJPanelWithComp(JComponent comp,
        int allign) {
        JPanel panel = new JPanel(new FlowLayout(allign));
        if (comp != null) {
            panel.add(comp);
        }
        return panel;
    }

    private static ItemListener createItemListenerToEnableComp(
        final Component compToEnable) {
        return new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (compToEnable != null) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        compToEnable.setEnabled(true);
                    } else if (e.getStateChange() == ItemEvent.DESELECTED) {
                        compToEnable.setEnabled(false);
                    }
                }
            }
        };
    }

    private static ItemListener createItemListenerToSetCompEditable(
        final Component compToSetEditable) {
        return new ItemListener() {
            private Method setEditableMethod;
            {
                try {
                    setEditableMethod = compToSetEditable.getClass().getMethod(
                        "setEditable", boolean.class);
                } catch (Exception e) {}
            }

            @Override
            public void itemStateChanged(ItemEvent e) {
                if ((compToSetEditable != null) &&
                    (setEditableMethod != null)) {
                    try {
                        if (e.getStateChange() == ItemEvent.SELECTED) {
                            setEditableMethod.invoke(compToSetEditable, true);
                        } else if (e.getStateChange() == ItemEvent.DESELECTED) {
                            setEditableMethod.invoke(compToSetEditable, false);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        };
    }

    private static Panel createControlPanelWithTextComp(
        final TextComponent textComp, String title) {
        Panel panel = new Panel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        if ((title != null) && !title.trim().isEmpty()) {
            panel.add(createFlowLayoutPanelWithComp(new Label(title),
                    FlowLayout.LEFT));
        }
        panel.add(createFlowLayoutPanelWithComp(textComp, FlowLayout.LEFT));

        Panel panelForCheckboxes = new Panel(new FlowLayout(FlowLayout.LEFT));
        panel.add(panelForCheckboxes);

        Checkbox setEnabledCheckbox = new Checkbox("Enabled/Disabled:", true);
        setEnabledCheckbox.addItemListener(createItemListenerToEnableComp(
                textComp));
        panelForCheckboxes.add(setEnabledCheckbox);

        Checkbox setEditableCheckbox = new Checkbox("Editable/Not editable:",
            true);
        setEditableCheckbox.addItemListener(
            createItemListenerToSetCompEditable(textComp));
        panelForCheckboxes.add(setEditableCheckbox);

        return panel;
    }

    private static JPanel createControlJPanelWithTextComp(
        final JComponent comp, String title) {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        if ((title != null) && !title.trim().isEmpty()) {
            panel.add(createFlowLayoutJPanelWithComp(new JLabel(title),
                    FlowLayout.LEFT));
        }
        if ((comp instanceof JTextArea) ||
            (comp instanceof JEditorPane) ||
            (comp instanceof JTree) ||
            (comp instanceof JTable)) {
            JScrollPane scrollPane = new JScrollPane(comp,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            scrollPane.setPreferredSize(comp.getPreferredSize());
            panel.add(createFlowLayoutJPanelWithComp(scrollPane,
                    FlowLayout.LEFT));
        } else {
            panel.add(createFlowLayoutJPanelWithComp(comp,
                    FlowLayout.LEFT));
        }

        JPanel panelForCheckboxes = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panel.add(panelForCheckboxes);

        JCheckBox setEnabledCheckbox = new JCheckBox("Enabled/Disabled:", true);
        setEnabledCheckbox.addItemListener(createItemListenerToEnableComp(
                comp));
        panelForCheckboxes.add(setEnabledCheckbox);

        if (!(comp instanceof JTable)) {
            JCheckBox setEditableCheckbox = new JCheckBox(
                    "Editable/Not editable:", true);
            setEditableCheckbox.addItemListener(
                    createItemListenerToSetCompEditable(comp));
            panelForCheckboxes.add(setEditableCheckbox);
        }

        return panel;
    }
}
