MyBookshelf.java

/*
 * @author Hermann Wöhrmann
 *
 * Description:
 *
 * Version Date       Comments
 * 1.01.01 03.11.2004 created
 *
 */

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import speed.jg.*;

import speed.util.*;
import java.awt.event.*;
import javax.swing.tree.*;
import javax.swing.event.*;

class MyBookshelfGUI extends GUIObject
{
  protected MyBookshelfGUI()
  { JFrame myBookshelf = new JFrame();
    myBookshelf.setBounds(80, 60, 640, 480);
    myBookshelf.getContentPane().setLayout(new BorderLayout());
    myBookshelf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    myBookshelf.setTitle("JTree Example - My Bookshelf");
    myBookshelf.setResizable(true);
    { JMenuBar menuBar = new JMenuBar();
      { JMenu fileMenu = new JMenu();
        fileMenu.setText("File");
        { JMenuItem exitMenuItem = new JMenuItem();
          exitMenuItem.setText("Exit");
          exitMenuItem.setName("exitMenuItem");
          super.add(exitMenuItem);
          fileMenu.add(exitMenuItem);
        }
        fileMenu.setName("fileMenu");
        super.add(fileMenu);
        menuBar.add(fileMenu);
      }
      menuBar.setName("menuBar");
      super.add(menuBar);
      myBookshelf.setJMenuBar(menuBar);
    }
    { JSplitPane centerSplitPane = new JSplitPane();
      centerSplitPane.setOneTouchExpandable(true);
      { JPanel selectionPanel = new JPanel()
        { public Dimension getPreferredSize()
          { Dimension preferred = super.getPreferredSize();
            return GUIObject.getPreferredSize(preferred, getParent(), "4", null, null, null, null, null);
          }
        };
        selectionPanel.setLayout(new BoxLayout(selectionPanel, BoxLayout.PAGE_AXIS));
        selectionPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.WHITE, Color.BLUE), "Selection", TitledBorder.LEFT, TitledBorder.BELOW_TOP, new Font("Dialog", Font.PLAIN, 12), Color.BLUE));
        { JTree bookshelfTree = new JTree();
          bookshelfTree.setName("bookshelfTree");
          super.add(bookshelfTree);
          JScrollPane treeScrollPane = new JScrollPane(bookshelfTree);
          treeScrollPane.setName("treeScrollPane");
          super.add(treeScrollPane);
          selectionPanel.add(treeScrollPane);
        }
        selectionPanel.setName("selectionPanel");
        super.add(selectionPanel);
        centerSplitPane.setLeftComponent(selectionPanel);
      }
      { JSplitPane rightSplitPane = new JSplitPane();
        rightSplitPane.setOneTouchExpandable(true);
        rightSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
        { JPanel presentationPanel = new JPanel()
          { public Dimension getPreferredSize()
            { Dimension preferred = super.getPreferredSize();
              return GUIObject.getPreferredSize(preferred, getParent(), "4", null, "3", null, null, null);
            }
          };
          presentationPanel.setLayout(new BoxLayout(presentationPanel, BoxLayout.Y_AXIS));
          presentationPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.WHITE, Color.BLUE), "XML Representation", TitledBorder.RIGHT, TitledBorder.BELOW_TOP, new Font("Dialog", Font.PLAIN, 12), Color.BLUE));
          { JTextArea xmlTextArea = new JTextArea();
            xmlTextArea.setFont(new Font("Monospaced", Font.PLAIN, 12));
            xmlTextArea.setEditable(false);
            xmlTextArea.setColumns(1);
            xmlTextArea.setRows(1);
            xmlTextArea.setName("xmlTextArea");
            super.add(xmlTextArea);
            JScrollPane scrollPane = new JScrollPane(xmlTextArea);
            scrollPane.setName("scrollPane");
            super.add(scrollPane);
            presentationPanel.add(scrollPane);
          }
          presentationPanel.setName("presentationPanel");
          super.add(presentationPanel);
          rightSplitPane.setLeftComponent(presentationPanel);
        }
        { JPanel editPanel = new JPanel()
          { public Dimension getPreferredSize()
            { Dimension preferred = super.getPreferredSize();
              return GUIObject.getPreferredSize(preferred, getParent(), "4", null, "3", null, null, null);
            }
          };
          editPanel.setLayout(new BorderLayout());
          editPanel.setBorder(BorderFactory.createCompoundBorder(new BevelBorder(BevelBorder.RAISED, Color.WHITE, Color.LIGHT_GRAY, Color.BLACK, Color.LIGHT_GRAY), BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.WHITE, Color.BLUE), BorderFactory.createEmptyBorder(2, 2, 2, 2))));
          { JPanel epTitlePrice = new JPanel();
            epTitlePrice.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
            { JLabel lbTitle = new JLabel()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "6", null, null, null, null, null);
                }
              };
              lbTitle.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0));
              lbTitle.setText("Title");
              lbTitle.setName("lbTitle");
              super.add(lbTitle);
              epTitlePrice.add(lbTitle);
            }
            { JTextField tfTitle = new JTextField()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "2", null, null, null, null, null);
                }
              };
              tfTitle.setName("tfTitle");
              super.add(tfTitle);
              epTitlePrice.add(tfTitle);
            }
            { JLabel lbPrice = new JLabel()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "6", null, null, null, null, null);
                }
              };
              lbPrice.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0));
              lbPrice.setText("Price");
              lbPrice.setName("lbPrice");
              super.add(lbPrice);
              epTitlePrice.add(lbPrice);
            }
            { JTextField tfPrice = new JTextField()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "6", null, null, null, null, null);
                }
              };
              tfPrice.setName("tfPrice");
              super.add(tfPrice);
              epTitlePrice.add(tfPrice);
            }
            epTitlePrice.setName("epTitlePrice");
            super.add(epTitlePrice);
            editPanel.add(epTitlePrice, BorderLayout.NORTH);
          }
          { JPanel epDescription = new JPanel();
            epDescription.setLayout(new BorderLayout());
            { JLabel lbDescription = new JLabel()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "6", null, null, null, null, null);
                }
              };
              lbDescription.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0));
              lbDescription.setText("Descr.");
              lbDescription.setVerticalAlignment(SwingConstants.TOP);
              lbDescription.setName("lbDescription");
              super.add(lbDescription);
              epDescription.add(lbDescription, BorderLayout.WEST);
            }
            { JTextArea taDescription = new JTextArea();
              taDescription.setName("taDescription");
              super.add(taDescription);
              JScrollPane spDescription = new JScrollPane(taDescription);
              spDescription.setName("spDescription");
              super.add(spDescription);
              epDescription.add(spDescription, BorderLayout.CENTER);
            }
            epDescription.setName("epDescription");
            super.add(epDescription);
            editPanel.add(epDescription, BorderLayout.CENTER);
          }
          { JPanel epBtn = new JPanel();
            epBtn.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
            { JLabel epBtnFiller = new JLabel()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "6", null, null, null, null, null);
                }
              };
              epBtnFiller.setName("epBtnFiller");
              super.add(epBtnFiller);
              epBtn.add(epBtnFiller);
            }
            { JButton btnAdd = new JButton()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "4", null, null, null, null, null);
                }
              };
              btnAdd.setEnabled(false);
              btnAdd.setText("Add");
              btnAdd.setName("btnAdd");
              super.add(btnAdd);
              epBtn.add(btnAdd);
            }
            { JButton btnChange = new JButton()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "4", null, null, null, null, null);
                }
              };
              btnChange.setEnabled(false);
              btnChange.setText("Change");
              btnChange.setName("btnChange");
              super.add(btnChange);
              epBtn.add(btnChange);
            }
            { JButton btnRemove = new JButton()
              { public Dimension getPreferredSize()
                { Dimension preferred = super.getPreferredSize();
                  return GUIObject.getPreferredSize(preferred, getParent(), "4", null, null, null, null, null);
                }
              };
              btnRemove.setEnabled(false);
              btnRemove.setText("Remove");
              btnRemove.setName("btnRemove");
              super.add(btnRemove);
              epBtn.add(btnRemove);
            }
            epBtn.setName("epBtn");
            super.add(epBtn);
            editPanel.add(epBtn, BorderLayout.SOUTH);
          }
          editPanel.setName("editPanel");
          super.add(editPanel);
          rightSplitPane.setRightComponent(editPanel);
        }
        rightSplitPane.setDividerLocation(250);
        rightSplitPane.setResizeWeight(0.6);
        rightSplitPane.setName("rightSplitPane");
        super.add(rightSplitPane);
        centerSplitPane.setRightComponent(rightSplitPane);
      }
      centerSplitPane.setDividerLocation(205);
      centerSplitPane.setResizeWeight(0.35);
      centerSplitPane.setName("centerSplitPane");
      super.add(centerSplitPane);
      myBookshelf.getContentPane().add(centerSplitPane, BorderLayout.CENTER);
    }
    myBookshelf.setName("myBookshelf");
    super.add(myBookshelf);
  }
}

public class MyBookshelf extends MyBookshelfController
{ XMLDocumentTree xmlTreeModel;

  public MyBookshelf()
  { super(new MyBookshelfGUI());
    myBookshelf.show();
  }

//==============================================================================
// XML Tree Rendering ...
//------------------------------------------------------------------------------
  class XMLTreeCellRenderer extends DefaultTreeCellRenderer implements XMLTreeNodeFilter
  { private ImageIcon[] XMLTreeIcons =
    { new ImageIcon(GUIObject.getImageResource("/images/misc/BookShelf18.gif")),
      new ImageIcon(GUIObject.getImageResource("/images/misc/Book18.gif"))
    };

    // implementing the XMLTreeNodeFilter interface
    public boolean isVisibleXMLTreeNode(XMLElement node)
    { String xmlNodeName = node.getName();
      return (xmlNodeName.equals("Bookshelf") || xmlNodeName.equals("Book"));
    }

    // rendering the tree
    public Component getTreeCellRendererComponent(
      JTree tree, Object value, boolean sel,  boolean expanded,
      boolean leaf, int row,  boolean hasFocus)
    { super.getTreeCellRendererComponent(
        tree, value, sel, expanded, leaf, row, hasFocus);
      String name = ((XMLElement)value).getName();
      if (name.equals("Bookshelf"))
      { setIcon(XMLTreeIcons[0]);
      }
      else if (name.equals("Book"))
      { setIcon(XMLTreeIcons[1]);
        setText(((XMLElement)value).getElement("Title").getValue());
      }
      return this;
    }
  }

//==============================================================================
// Tree Support ...
//------------------------------------------------------------------------------

  XMLElement getSelectedTreeNode()
  { TreePath selectionPath = bookshelfTree.getSelectionPath();
    if (selectionPath != null)
    { Object[] path = selectionPath.getPath();
      if (path.length > 0)
      { return (XMLElement)path[path.length - 1]; // last node ...
      }
    }
    return null;
  }

  void setSelectedTreeNode(XMLElement node)
  { TreePath treePath = new TreePath(xmlTreeModel.getPathToRoot(node));
    bookshelfTree.setSelectionPath(treePath);
    bookshelfTree.scrollPathToVisible(treePath);
  }

  void showNodeContent(XMLElement nodeElement)
  { xmlTextArea.setText(nodeElement.asXMLString());
    xmlTextArea.setCaretPosition(0);
    String xmlNodeName = nodeElement.getName();
    btnAdd.setEnabled(xmlNodeName.equals("Bookshelf"));
    btnChange.setEnabled(xmlNodeName.equals("Book"));
    btnRemove.setEnabled(xmlNodeName.equals("Book"));
    if (xmlNodeName.equals("Book"))
    { tfPrice.setText(nodeElement.getAttribute("Price"));
      tfTitle.setText(nodeElement.getElement("Title").getValue());
      taDescription.setText(nodeElement.getElement("Description").getValue());
    }
    else
    { tfTitle.setText(null);
      tfPrice.setText(null);
      taDescription.setText(null);
    }
  }

//==============================================================================
// Overwritten MyBookshelfController methods ...
//------------------------------------------------------------------------------

  void initialize()
  { xmlTreeModel = new XMLDocumentTree(new XMLElement("Bookshelf"));
    bookshelfTree.setModel(xmlTreeModel);
    XMLTreeCellRenderer renderer = new XMLTreeCellRenderer();
    xmlTreeModel.setTreeNodeFilter(renderer);
    bookshelfTree.setCellRenderer(renderer);
  }

//==============================================================================
// ActionListener event handling ...
//------------------------------------------------------------------------------

  void handleBtnAddActionPerformedEvent(ActionEvent e) throws Exception
  { XMLElement currentSelection = getSelectedTreeNode();
    if (currentSelection != null)
    { XMLElement newBookElement = new XMLElement("Book");
      newBookElement.setAttribute("Price", tfPrice.getText());
      newBookElement.addElement(new XMLElement("Title")
          .setValue(tfTitle.getText()));
      newBookElement.addElement(new XMLElement("Description")
          .setValue(taDescription.getText()));
      xmlTreeModel.addXMLTreeNode(currentSelection, newBookElement);
      setSelectedTreeNode(newBookElement);
    }
  }

  void handleBtnChangeActionPerformedEvent(ActionEvent e) throws Exception
  { XMLElement bookElement = getSelectedTreeNode();
    if (bookElement != null)
    { bookElement.setAttribute("Price", tfPrice.getText());
      bookElement.getElement("Title").setValue(tfTitle.getText());
      bookElement.getElement("Description").setValue(taDescription.getText());
      xmlTreeModel.fireTreeNodeChanged(bookElement);
      showNodeContent(bookElement);
    }
  }

  void handleBtnRemoveActionPerformedEvent(ActionEvent e) throws Exception
  { xmlTreeModel.removeXMLTreeNode(getSelectedTreeNode());
    setSelectedTreeNode((XMLElement)xmlTreeModel.getRoot());
  }

  void handleExitMenuItemActionPerformedEvent(ActionEvent e) throws Exception
  { System.exit(0);
  }

//==============================================================================
// TreeSelectionListener event handling ...
//------------------------------------------------------------------------------

  void handleBookshelfTreeValueChangedEvent(TreeSelectionEvent e) throws Exception
  { Object[] path = e.getPath().getPath();
    if (path.length > 0)
    { showNodeContent((XMLElement)path[path.length - 1]);
    }
  }

//==============================================================================
// Execute this MyBookshelf Program ...
//------------------------------------------------------------------------------

  public static void main(String[] args)
  { MyBookshelf myBookshelf = new MyBookshelf();
  }

}