package hep.aida.ref.plotter.style.registry;
import hep.aida.ref.plotter.Style;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
/**
* This class is a stand-alone Style Store Editor
*
*/
public class StyleStoreEditor extends JSplitPane {
private JTabbedPane tabbedPanel;
private JTree tree;
private JPopupMenu entryMenu;
private JPopupMenu storeMenu;
private CreateStyleStorePanel createPanel;
private OpenStyleStorePanel openPanel;
private AddStyleStoreEntryPanel addStyleStoreEntryPanel;
private WriteStyleStorePanel writeStyleStorePanel;
public StyleStoreEditor() {
super(JSplitPane.HORIZONTAL_SPLIT);
init();
}
private void init() {
ActionListener aL = new ActionListener() {
public void actionPerformed(ActionEvent ev) {
String command = ev.getActionCommand();
if (command == null || command.trim().equals("")) return;
if (command.equals("Move Up")) moveStoreEntryUpAction();
else if (command.equals("Move Down")) moveStoreEntryDownAction();
else if (command.equals("Remove This Entry")) removeStoreEntryAction();
else if (command.equals("Save IPlotterStyle to XML...")) savePlotterStyleAction();
else if (command.equals("Add Store Entry...")) addStoreEntryAction();
else if (command.equals("Save As...")) saveStoreAsAction();
else if (command.equals("Commit Store")) commitStoreAction();
else if (command.equals("Close Store")) closeStoreAction();
}
};
JMenuItem item = null;
entryMenu = new JPopupMenu("Store Entry Menu");
item = new JMenuItem("Edit this Entry");
item.addActionListener(aL);
entryMenu.add(item);
item = new JMenuItem("Move Up");
item.addActionListener(aL);
entryMenu.add(item);
item = new JMenuItem("Move Down");
item.addActionListener(aL);
entryMenu.add(item);
item = new JMenuItem("Remove This Entry");
item.addActionListener(aL);
entryMenu.add(item);
item = new JMenuItem("Save IPlotterStyle to XML...");
item.addActionListener(aL);
entryMenu.add(item);
storeMenu = new JPopupMenu("Store Menu");
item = new JMenuItem("Add Store Entry...");
item.addActionListener(aL);
storeMenu.add(item);
item = new JMenuItem("Save As...");
item.addActionListener(aL);
storeMenu.add(item);
item = new JMenuItem("Commit Store");
item.addActionListener(aL);
storeMenu.add(item);
item = new JMenuItem("Close Store");
item.addActionListener(aL);
storeMenu.add(item);
tabbedPanel = new JTabbedPane();
this.setRightComponent(new JScrollPane(tabbedPanel));
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
DefaultTreeModel treeModel = new DefaultTreeModel(root);
//treeModel.addTreeModelListener(new MyTreeModelListener());
tree = new JTree(treeModel);
tree.setRootVisible(false);
tree.setEditable(false);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setExpandsSelectedPaths(true);
// Fistern for double-click events on the leaf nodes
MouseListener ml = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) popupAction(e);
else if(e.getClickCount() == 2) doubleClickAction(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) popupAction(e);
}
};
tree.addMouseListener(ml);
this.setLeftComponent(new JScrollPane(tree));
this.setDividerLocation(150);
}
private void addMenus(JMenuBar menuBar) {
// FILE Menu
JMenu fileMenu = new JMenu("File");
JMenuItem item = new JMenuItem("Create Style Store...");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
newStoreAction();
}
});
fileMenu.add(item);
item = new JMenuItem("Open Style Store...");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
openStoreAction();
}
});
fileMenu.add(item);
item = new JMenuItem("Save As...");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
saveStoreAsAction();
}
});
item.setEnabled(false);
//fileMenu.add(item);
item = new JMenuItem("Close Store");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
closeStoreAction();
}
});
item.setEnabled(false);
//fileMenu.add(item);
fileMenu.addSeparator();
item = new JMenuItem("Exit");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
exitAction();
}
});
fileMenu.add(item);
menuBar.add(fileMenu);
}
// Menu item actions
void newStoreAction() {
if (createPanel == null) createPanel = new CreateStyleStorePanel(this);
try {
IStyleStore store = createPanel.createStore();
if (store != null) {
addStoreNode(store);
}
} catch (Exception e) {
e.printStackTrace();
}
}
void openStoreAction() {
if (openPanel == null) openPanel = new OpenStyleStorePanel(this);
else openPanel.updateAction();
try {
IStyleStore store = openPanel.openStore();
if (store != null) addStoreNode(store);
} catch (Exception e) {
e.printStackTrace();
//app.error("Error while openning IStyleStore: "+e.getMessage(), e);
}
}
void addStoreNode(IStyleStore store) {
DefaultMutableTreeNode storeNode = new DefaultMutableTreeNode(store, true);
String[] names = store.getAllStyleNames();
StyleStoreEntry entry = null;
StoreEntryNode node = null;
for (int i=0; i<names.length; i++) {
if (store instanceof BaseStyleStore) entry = ((BaseStyleStore) store).getStoreEntry(names[i]);
else entry = new StyleStoreEntry(names[i], store.getStyle(names[i]), store.getRuleForStyle(names[i]));
node = new StoreEntryNode(entry);
storeNode.add(node);
}
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
((DefaultTreeModel) tree.getModel()).insertNodeInto(storeNode, root, root.getChildCount());
tree.setSelectionPath(new TreePath(((DefaultTreeModel) tree.getModel()).getPathToRoot(storeNode)));
}
void commitStoreAction() {
try {
IStyleStore store = getSelectedStore();
store.commit();
} catch (Exception e) {
e.printStackTrace();
//app.error("Error while Committing StyleStore: \n\t"+e.getMessage(), e);
}
}
void saveStoreAsAction() {
if (writeStyleStorePanel == null) writeStyleStorePanel = new WriteStyleStorePanel(this);
try {
IStyleStore store = getSelectedStore();
writeStyleStorePanel.writeStore(store);
} catch (Exception e) {
e.printStackTrace();
//app.error("Error while Writing StyleStore to XML File: \n\t"+e.getMessage(), e);
}
}
void closeStoreAction() {
IStyleStore store = getSelectedStore();
// Remove Store Node and its children from the Tree
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
int index = findInNode(root, store.getStoreName());
DefaultMutableTreeNode storeNode = (DefaultMutableTreeNode) root.getChildAt(index);
for (int i=0; i<storeNode.getChildCount(); i++) {
TreeNode child = storeNode.getChildAt(i);
if (child instanceof StoreEntryNode) {
JComponent page = ((StoreEntryNode) child).getPage();
if (page != null) {
tabbedPanel.remove(page);
}
}
}
storeNode.removeAllChildren();
root.remove(index);
((DefaultTreeModel) tree.getModel()).nodeStructureChanged(root);
store.close();
}
void addStoreEntryAction() {
if (addStyleStoreEntryPanel == null) addStyleStoreEntryPanel = new AddStyleStoreEntryPanel(this);
try {
StyleStoreEntry entry = addStyleStoreEntryPanel.createStoreEntry();
if (entry == null) return;
IStyleStore store = getSelectedStore();
String styleName = entry.getName();
String fullStyleName = store.getStoreName() + "." + styleName;
entry.getStyle().setParameter(Style.PLOTTER_STYLE_NAME, fullStyleName);
if (store instanceof BaseStyleStore) {
((BaseStyleStore) store).addStoreEntry(entry);
} else {
store.addStyle(styleName, entry.getStyle(), entry.getRule());
}
// Now rearrange the Store Node
StoreEntryNode node = new StoreEntryNode(entry);
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
int index = findInNode(root, store.getStoreName());
DefaultMutableTreeNode storeNode = (DefaultMutableTreeNode) root.getChildAt(index);
storeNode.add(node);
((DefaultTreeModel) tree.getModel()).nodeStructureChanged(storeNode);
} catch (Exception e) {
e.printStackTrace();
//app.error("Error while creating StyleStoreEntry: \n\t"+e.getMessage(), e);
}
}
void removeStoreEntryAction() {
StyleStoreEntry entry = getSelectedEntry();
if (entry == null) return;
String nodeName = entry.getName();
IStyleStore store = getSelectedStore();
store.removeStyle(nodeName);
// Now rearrange the Store Node
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
int index = findInNode(root, store.getStoreName());
DefaultMutableTreeNode storeNode = (DefaultMutableTreeNode) root.getChildAt(index);
index = findInNode(storeNode, nodeName);
if (index < 0) return;
storeNode.remove(index);
((DefaultTreeModel) tree.getModel()).nodeStructureChanged(storeNode);
}
void moveStoreEntryUpAction() {
StyleStoreEntry entry = getSelectedEntry();
if (entry == null) return;
String nodeName = entry.getName();
IStyleStore store = getSelectedStore();
store.moveUp(nodeName);
// Now rearrange the Store Node
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
int index = findInNode(root, store.getStoreName());
DefaultMutableTreeNode storeNode = (DefaultMutableTreeNode) root.getChildAt(index);
index = findInNode(storeNode, nodeName);
if (index <= 0) return;
DefaultMutableTreeNode entryNode = (DefaultMutableTreeNode) storeNode.getChildAt(index);
storeNode.remove(index);
storeNode.insert(entryNode, index-1);
((DefaultTreeModel) tree.getModel()).nodeStructureChanged(storeNode);
}
void moveStoreEntryDownAction() {
StyleStoreEntry entry = getSelectedEntry();
if (entry == null) return;
String nodeName = entry.getName();
IStyleStore store = getSelectedStore();
store.moveDown(nodeName);
// Now rearrange the Store Node
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
int index = findInNode(root, store.getStoreName());
DefaultMutableTreeNode storeNode = (DefaultMutableTreeNode) root.getChildAt(index);
index = findInNode(storeNode, nodeName);
if (index >= (storeNode.getChildCount()-1)) return;
DefaultMutableTreeNode entryNode = (DefaultMutableTreeNode) storeNode.getChildAt(index);
storeNode.remove(index);
storeNode.insert(entryNode, index+1);
((DefaultTreeModel) tree.getModel()).nodeStructureChanged(storeNode);
}
void savePlotterStyleAction() {
}
void editStoreEntry() {
StoreEntryNode node = null;
Object obj = tree.getLastSelectedPathComponent();
if (obj instanceof StoreEntryNode) node = (StoreEntryNode) obj;
else return;
showEntryPage(node);
}
void exitAction() {
int n = tabbedPanel.getTabCount();
for (int i=n-1; i>=0; i--) {
Component comp = tabbedPanel.getComponentAt(i);
if (comp instanceof StoreEntryEditorPanel) {
((StoreEntryEditorPanel) comp).close();
}
tabbedPanel.removeTabAt(i);
}
System.exit(0);
}
void doubleClickAction(MouseEvent e) {
int selRow = tree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
if(selRow == -1) return;
StoreEntryNode node = null;
Object obj = tree.getLastSelectedPathComponent();
if (obj instanceof StoreEntryNode) node = (StoreEntryNode) obj;
else return;
showEntryPage(node);
}
void popupAction(MouseEvent e) {
int selRow = tree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
if(selRow == -1) return;
tree.setSelectionPath(selPath);
Object obj = tree.getLastSelectedPathComponent();
enableMenus();
if (obj instanceof StoreEntryNode) {
entryMenu.show(tree, e.getX(), e.getY());
} else if (obj instanceof DefaultMutableTreeNode) {
storeMenu.show(tree, e.getX(), e.getY());
}
}
// can do enable/disable of menu elements here
private void enableMenus() {
}
private void showEntryPage(StoreEntryNode node) {
JComponent page = node.getPage();
if (page == null) {
page = new StoreEntryEditorPanel(node.getStoreEntry());
node.setPage(page);
}
int index = tabbedPanel.indexOfComponent(page);
if (index >= 0) tabbedPanel.setSelectedIndex(index);
else {
tabbedPanel.addTab(node.getName(), page);
tabbedPanel.setSelectedComponent(page);
}
}
private StyleStoreEntry getSelectedEntry() {
StyleStoreEntry entry = null;
Object obj = tree.getLastSelectedPathComponent();
if (obj instanceof StoreEntryNode) {
entry = ((StoreEntryNode) obj).getStoreEntry();
}
return entry;
}
private IStyleStore getSelectedStore() {
IStyleStore store = null;
Object node = tree.getLastSelectedPathComponent();
if (node instanceof StoreEntryNode) {
store = (IStyleStore) ((DefaultMutableTreeNode) ((StoreEntryNode) node).getParent()).getUserObject();
} else if (node instanceof DefaultMutableTreeNode) {
Object obj = ((DefaultMutableTreeNode) node).getUserObject();
if (obj instanceof IStyleStore) store = (IStyleStore) obj;
}
return store;
}
private int findInNode(DefaultMutableTreeNode node, String childName) {
int index = -1;
for (int i=0; i<node.getChildCount(); i++) {
TreeNode child = node.getChildAt(i);
String tmpName = null;
if (child instanceof StoreEntryNode) tmpName = ((StoreEntryNode) child).getName();
else if (child != null) tmpName = child.toString();
if (childName.equals(tmpName)) {
index = i;
break;
}
}
return index;
}
public static void main(String[] args) {
StyleStoreEditor editor = new StyleStoreEditor();
JFrame frame = new JFrame("Style Store Editor");
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
editor.addMenus(menuBar);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add("Center", editor);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setSize(700, 600);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation( (d.width-frame.getSize().width )/2, (d.height-frame.getSize().height )/2 );
frame.setVisible(true);
}
}