/** * Title: AGG<p> * Description: <p> * Copyright: Copyright (c) Michael Matz<p> * Company: TU Berlin<p> * @author Michael Matz * @version 1.0 */ package agg.gui.treeview.dialog; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Hashtable; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreeSelectionModel; import agg.editor.impl.EdType; import agg.editor.impl.EdTypeSet; import agg.gui.editor.EditorConstants; @SuppressWarnings("serial") public class SelectChildOfNodeTypeDialog extends JDialog implements ActionListener { final JTree typeTree; final DefaultTreeModel treeModel; final EdTypeSet typeSet; final EdType nodeType; final Hashtable<DefaultMutableTreeNode, EdType> treeNode2NodeType = new Hashtable<DefaultMutableTreeNode, EdType>(); final JButton Ok, cancel; final JPanel dialogPanel; JFrame f; public SelectChildOfNodeTypeDialog(JFrame parent, EdTypeSet typeset, EdType nodetype) { super(parent, " Node type: <"+nodetype.getName()+"> ", true); this.typeSet = typeset; this.nodeType = nodetype; this.typeTree = new JTree(); this.typeTree.setCellRenderer(new MyTreeCellRenderer()); DefaultMutableTreeNode top = new DefaultMutableTreeNode(this.nodeType.getName(), true); this.treeNode2NodeType.put(top, this.nodeType); this.treeModel = new DefaultTreeModel(top); this.typeTree.setModel(this.treeModel); this.typeTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); initTypeTree(top, this.nodeType); JLabel text = new JLabel("Please select a child type to be created."); this.Ok = new JButton("Ok"); this.Ok.addActionListener(this); this.cancel = new JButton("Cancel"); this.cancel.addActionListener(this); JPanel buttons = new JPanel(new FlowLayout()); buttons.add(this.Ok); buttons.add(this.cancel); JPanel below = new JPanel(new BorderLayout()); below.add(text, BorderLayout.CENTER); below.add(buttons, BorderLayout.SOUTH); this.dialogPanel = new JPanel(new BorderLayout()); this.dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); this.dialogPanel.add(new JScrollPane(this.typeTree), BorderLayout.CENTER); this.dialogPanel.add(below, BorderLayout.SOUTH); this.dialogPanel.setPreferredSize(new Dimension(300, 200)); getContentPane().setLayout(new BorderLayout()); getContentPane().add(this.dialogPanel, BorderLayout.CENTER); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); this.pack(); this.setLocation(100, 100); this.setVisible(true); } private void initTypeTree(DefaultMutableTreeNode treetypenode, EdType nodetype) { Vector<agg.xt_basis.Type> children = nodetype.getBasisType().getChildren(); for (int i=0; i<children.size(); i++) { agg.xt_basis.Type childType = children.get(i); EdType edchildType = this.typeSet.getNodeType(childType); // System.out.println(edchildType.getName()); DefaultMutableTreeNode childnode = new DefaultMutableTreeNode(edchildType.getName(), true); this.treeNode2NodeType.put(childnode, edchildType); this.treeModel.insertNodeInto(childnode, treetypenode, i); if (!this.typeTree.isExpanded(this.typeTree.getPathForRow(0))) this.typeTree.expandPath(this.typeTree.getPathForRow(0)); initTypeTree(childnode, edchildType); } } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Ok")) { if (this.typeTree.getSelectionPath() == null) { String msg = "Please select a child type or cancel this dialog."; JOptionPane.showMessageDialog(this, msg); return; } setVisible(false); } else setVisible(false); } public EdType getSelectedChildType() { DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) this.typeTree.getSelectionPath().getLastPathComponent(); EdType t = this.treeNode2NodeType.get(treeNode); return t; } public class MyTreeCellRenderer extends JLabel implements TreeCellRenderer { boolean selected; final Color SelectedBackgroundColor = new Color(153, 153, 255); public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { String stringValue = tree.convertValueToText(value, sel, expanded, leaf, row, hasFocus); /* Set the text. */ setText(stringValue); EdType userObject = SelectChildOfNodeTypeDialog.this.treeNode2NodeType.get(value); if (userObject != null) { setIconTextGap(5); Icon icon = getNodeTypeIcon(userObject.getShape(), userObject.getColor()); setIcon(icon); } this.selected = sel; return this; } public void paint(Graphics g) { Color bColor = Color.WHITE; Color fColor = Color.BLACK; Icon currentI = getIcon(); if (this.selected) bColor = this.SelectedBackgroundColor; else bColor = Color.WHITE; //getBackground(); g.setColor(bColor); setForeground(fColor); if (currentI != null && getText() != null) { int offset = (currentI.getIconWidth() + getIconTextGap()); g.fillRect(offset, 0, getWidth() - 1 - offset, getHeight() - 1); } else g.fillRect(0, 0, getWidth() - 1, getHeight() - 1); super.paint(g); } private Icon getNodeTypeIcon(int shape, Color color) { Icon icon = null; switch (shape) { case EditorConstants.RECT: icon = (new agg.gui.icons.RectShapeIcon(color)); break; case EditorConstants.ROUNDRECT: icon = (new agg.gui.icons.RoundRectShapeIcon(color)); break; case EditorConstants.CIRCLE: icon = (new agg.gui.icons.CircleShapeIcon(color)); break; case EditorConstants.OVAL: icon = (new agg.gui.icons.OvalShapeIcon(color)); break; default: break; } return icon; } } }