001 /****************************************************************************** 002 * Copyright (C) MActor Developers. All rights reserved. * 003 * ---------------------------------------------------------------------------* 004 * This file is part of MActor. * 005 * * 006 * MActor is free software; you can redistribute it and/or modify * 007 * it under the terms of the GNU General Public License as published by * 008 * the Free Software Foundation; either version 2 of the License, or * 009 * (at your option) any later version. * 010 * * 011 * MActor is distributed in the hope that it will be useful, * 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 014 * GNU General Public License for more details. * 015 * * 016 * You should have received a copy of the GNU General Public License * 017 * along with MActor; if not, write to the Free Software * 018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 019 ******************************************************************************/ 020 package org.mactor.ui.gui.project; 021 022 import java.awt.BorderLayout; 023 import java.awt.Frame; 024 import java.awt.event.MouseAdapter; 025 import java.awt.event.MouseEvent; 026 import java.io.File; 027 028 import javax.swing.BorderFactory; 029 import javax.swing.JOptionPane; 030 import javax.swing.JPanel; 031 import javax.swing.JPopupMenu; 032 import javax.swing.JScrollPane; 033 import javax.swing.SwingUtilities; 034 import javax.swing.event.TreeSelectionListener; 035 import javax.swing.tree.TreePath; 036 037 import org.mactor.framework.MactorException; 038 import org.mactor.framework.spec.ProjectContext; 039 import org.mactor.ui.gui.ActionsManager; 040 import org.mactor.ui.gui.MenuBuilder; 041 042 public class ProjectExplorerPanel extends JPanel { 043 ActionsManager am; 044 MenuBuilder mb; 045 ProjectModel model; 046 ProjectTree tree; 047 JPopupMenu treePopupMessageBrokerConfig; 048 JPopupMenu treePopupTest; 049 JPopupMenu treePopupMockBattery; 050 JPopupMenu treePopupTestRun; 051 JPopupMenu treePopupGlobalConfig; 052 ProjectControlListener projectControlListener; 053 String nodeName; 054 TreeSelectionListener tl = new TreeSelectionListener() { 055 public void valueChanged(javax.swing.event.TreeSelectionEvent e) { 056 ProjectTreeNode oldNode = null; 057 ProjectTreeNode newNode = null; 058 if (e.getNewLeadSelectionPath() != null && e.getNewLeadSelectionPath().getPathCount() > 0) { 059 newNode = (ProjectTreeNode) e.getNewLeadSelectionPath().getLastPathComponent(); 060 } 061 if (e.getOldLeadSelectionPath() != null && e.getOldLeadSelectionPath().getPathCount() > 0) { 062 oldNode = (ProjectTreeNode) e.getOldLeadSelectionPath().getLastPathComponent(); 063 } 064 projectControlListener.onProjectTreeSelectionChanged(newNode, oldNode); 065 if (oldNode != null && nodeName != null) { 066 if (!nodeName.equals(oldNode.getName())) 067 model.notifyNodeNameChanged(oldNode); 068 } 069 if (newNode != null) 070 nodeName = newNode.getName(); 071 }; 072 }; 073 public ProjectController getProjectController() { 074 return projectController; 075 } 076 private ProjectContext.ProjectContextListener projectContextListener = new ProjectContext.ProjectContextListener() { 077 public void onDirty() { 078 SwingUtilities.invokeLater(new Runnable() { 079 public void run() { 080 projectControlListener.onProjectDirty(); 081 } 082 }); 083 } 084 }; 085 ProjectController projectController = new ProjectController() { 086 public ProjectModel getProjectModel() { 087 return model; 088 } 089 public void closeProject() throws MactorException { 090 // TODO Auto-generated method stub 091 } 092 public Frame getControllerFrame() { 093 return JOptionPane.getFrameForComponent(ProjectExplorerPanel.this); 094 } 095 public void startEditingNode(ProjectTreeNode node) { 096 tree.startEditingAtPath(new TreePath(ProjectModel.getPath(node))); 097 } 098 public void insertNodeIntoNode(ProjectTreeNode destNode, ProjectTreeNode nodeToInsert) throws MactorException { 099 model.insertInto(destNode, nodeToInsert); 100 tree.expandPath(new TreePath(ProjectModel.getPath(destNode))); 101 int row = tree.getRowForPath(new TreePath(ProjectModel.getPath(nodeToInsert))); 102 tree.setSelectionRow(row); 103 } 104 public void insertNodeAfterNode(ProjectTreeNode destNode, ProjectTreeNode nodeToInsert) throws MactorException { 105 model.insertAfter(destNode, nodeToInsert); 106 tree.expandPath(new TreePath(ProjectModel.getPath(nodeToInsert))); 107 tree.setSelectionRow(tree.getRowForPath(new TreePath(ProjectModel.getPath(nodeToInsert)))); 108 } 109 public void openProject(File path) throws MactorException { 110 ProjectContext.getGlobalInstance().setProjectDir(path); 111 reloadProject(); 112 projectControlListener.onProjectLoaded(); 113 } 114 public void reloadProject() throws MactorException { 115 model.reload(ProjectContext.getGlobalInstance().getProjectDir()); 116 tree.setSelectionRow(0); 117 projectControlListener.onProjectLoaded(); 118 ProjectContext.getGlobalInstance().setDirty(false); 119 ProjectContext.getGlobalInstance().setListener(projectContextListener); 120 } 121 public void deleteNode(ProjectTreeNode node) throws MactorException { 122 model.delete(node); 123 } 124 public void requestGuiAction(ProjectTreeNode node, String action) { 125 projectControlListener.onRequestGuiAction(node, action); 126 } 127 }; 128 public MenuBuilder getMenuBuilder() { 129 return mb; 130 } 131 public ProjectExplorerPanel(ProjectControlListener projectControlListener) throws MactorException { 132 super(new BorderLayout()); 133 this.projectControlListener = projectControlListener; 134 model = new ProjectModel(ProjectContext.getGlobalInstance().getProjectDir()); 135 tree = new ProjectTree(model); 136 am = new ActionsManager(projectController, tree); 137 mb = new MenuBuilder(am); 138 setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 139 JScrollPane treeSp = new JScrollPane(tree); 140 add(treeSp, BorderLayout.CENTER); 141 tree.setEditable(true); 142 tree.addTreeSelectionListener(tl); 143 treePopupGlobalConfig = mb.buildPopuMenu("Global Configuration"); 144 treePopupMessageBrokerConfig = mb.buildPopuMenu("Message Broker Configuration"); 145 treePopupTest = mb.buildPopuMenu("Test"); 146 treePopupMockBattery = mb.buildPopuMenu("Mock Battery"); 147 treePopupTestRun = mb.buildPopuMenu("Test Run"); 148 tree.setInvokesStopCellEditing(true); 149 tree.addMouseListener(new MouseAdapter() { 150 public void mousePressed(MouseEvent evt) { 151 int row = tree.getRowForLocation(evt.getX(), evt.getY()); 152 tree.setSelectionRow(row); 153 showPopup(evt); 154 } 155 public void mouseReleased(MouseEvent evt) { 156 if (evt.isPopupTrigger()) { 157 showPopup(evt); 158 } 159 } 160 }); 161 tree.setSelectionRow(0); 162 } 163 private void showPopup(final MouseEvent evt) { 164 if (evt.isPopupTrigger()) { 165 TreePath p = tree.getSelectionPath(); 166 if (p != null && p.getLastPathComponent() instanceof ProjectTreeNode) { 167 ProjectTreeNode node = (ProjectTreeNode) p.getLastPathComponent(); 168 ProjectTreeNode orgNode = ProjectTreeUtil.navigateToOrganizationNode(node); 169 if (orgNode != null) { 170 if (ProjectNodeType.PROJECT_GLOBAL_CONFIG.equals(orgNode.getNodeType())) 171 treePopupGlobalConfig.show(evt.getComponent(), evt.getX(), evt.getY()); 172 else if (ProjectNodeType.PROJECT_MESSAGE_BROKER_CONFIG.equals(orgNode.getNodeType())) 173 treePopupMessageBrokerConfig.show(evt.getComponent(), evt.getX(), evt.getY()); 174 else if (ProjectNodeType.PROJECT_TEST.equals(orgNode.getNodeType())) 175 treePopupTest.show(evt.getComponent(), evt.getX(), evt.getY()); 176 else if (ProjectNodeType.PROJECT_MOCK_BATTERY.equals(orgNode.getNodeType())) 177 treePopupMockBattery.show(evt.getComponent(), evt.getX(), evt.getY()); 178 else if (ProjectNodeType.PROJECT_TEST_RUN.equals(orgNode.getNodeType())) 179 treePopupTestRun.show(evt.getComponent(), evt.getX(), evt.getY()); 180 } 181 } 182 } 183 } 184 }