001 /* 002 * CRIMSON 003 * Copyright (c) 2006, Stephen Fisher, Susan Davidson, and Junhyong Kim, 004 * University of Pennsylvania. 005 * 006 * This program is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU General Public License as 008 * published by the Free Software Foundation; either version 2 of the 009 * License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, but 012 * WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with this program; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 019 * 02110-1301 USA. 020 * 021 * @(#)ModelManager.java 022 */ 023 024 package edu.upenn.crimson.gui; 025 026 import edu.upenn.crimson.*; 027 import edu.upenn.crimson.io.*; 028 import java.awt.*; 029 import java.awt.event.*; 030 import javax.swing.*; 031 import javax.swing.event.*; 032 import javax.swing.border.Border; 033 034 /** 035 * Browse existing Queries. 036 * 037 * @author Stephen Fisher 038 * @version $Id: ModelManager.java,v 1.10 2007/05/17 19:02:15 fisher Exp $ 039 */ 040 041 public class ModelManager { 042 private static PanelFrame panelFrame = null; 043 044 /** Only allow one instance of PanelFrame. */ 045 public static JFrame show() { 046 if (panelFrame == null) panelFrame = new PanelFrame(); 047 panelFrame.setVisible(true); 048 return panelFrame; 049 } 050 051 /** 052 * Redraw the window. This is necessary when the currently 053 * selected model is edited. Otherwise, the ModelManager won't 054 * show the changes until after the window is redrawn. 055 */ 056 public static void redraw() { 057 if ((panelFrame != null) && panelFrame.isShowing()) panelFrame.repaint(); 058 } 059 060 private static class PanelFrame extends JFrame { 061 /** List of all queries in current database. */ 062 private JTable table; 063 private ModelTableModel tableModel; 064 065 /** Reference to the selected model. */ 066 private Model model = null; 067 private JLabel notesL = new JLabel(""); 068 069 private JButton newB; 070 private JButton copyB; 071 private JButton refreshB; 072 private JButton viewB; 073 private JButton editB; 074 private JButton deleteB; 075 private JButton closeB; 076 private JLabel statusBar; 077 078 PanelFrame thisFrame; 079 080 public PanelFrame() { 081 super("Model Manager"); 082 083 // keep pointer to self so can 'dispose' Frame below 084 thisFrame = this; 085 086 setDefaultCloseOperation(DISPOSE_ON_CLOSE); 087 088 // if no database connection then error 089 if (! Database.isOpen()) { 090 CrimsonUtils.printError("Must open a database before opening the model manager."); 091 setVisible(false); 092 return; 093 } 094 095 // ************************************************* 096 // CREATE VARIOUS BORDERS 097 Border emptyBorder = BorderFactory.createEmptyBorder(5,5,5,5); 098 Border loweredBorder = BorderFactory.createLoweredBevelBorder(); 099 // Border raisedBorder = BorderFactory.createRaisedBevelBorder(); 100 Border etchedBorder = BorderFactory.createEtchedBorder(); 101 Border etchedPadBorder5 = BorderFactory.createCompoundBorder(etchedBorder, emptyBorder); 102 // Border loweredPadBorder5 = BorderFactory.createCompoundBorder(loweredBorder, emptyBorder); 103 // Border etchedPadBorder10 = BorderFactory.createCompoundBorder(etchedBorder, BorderFactory.createEmptyBorder(0,10,10,10)); 104 // Border raisedPadBorder = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(1,1,2,1), raisedBorder); 105 106 // ************************************************* 107 // TOOLBAR SETUP 108 JToolBar toolBar = new JToolBar(); 109 toolBar.setFloatable(false); 110 JToolBar toolBarR = new JToolBar(); 111 toolBarR.setFloatable(false); 112 // add Buttons 113 newB = new JButton(new ImageIcon("icons/new.png")); 114 newB.setToolTipText("New"); 115 newB.addMouseListener(new MouseAdapter() { 116 // add status bar text when mouse moves over button 117 public void mouseEntered(MouseEvent e) { statusBar.setText("Create a new model"); } 118 // clear status bar when mouse moves off button 119 public void mouseExited(MouseEvent e) { statusBar.setText(""); } 120 }); 121 newB.addActionListener(new ActionListener() { 122 public void actionPerformed(ActionEvent e) { 123 Root.runCommand("newModel()"); 124 } 125 }); 126 copyB = new JButton(new ImageIcon("icons/copy.png")); 127 copyB.setToolTipText("Duplicate"); 128 copyB.setEnabled(false); 129 copyB.addMouseListener(new MouseAdapter() { 130 // add status bar text when mouse moves over button 131 public void mouseEntered(MouseEvent e) { statusBar.setText("Duplicate the selected model"); } 132 // clear status bar when mouse moves off button 133 public void mouseExited(MouseEvent e) { statusBar.setText(""); } 134 }); 135 copyB.addActionListener(new ActionListener() { 136 public void actionPerformed(ActionEvent e) { 137 // clone the model and then open in edit window 138 if (model == null) return; 139 String id = ModelUtils.getModelID(ObjectHandles.randomModelID(model.getID() + "_")); 140 if (id != null) model.clone(id); 141 } 142 }); 143 refreshB = new JButton(new ImageIcon("icons/refresh.png")); 144 refreshB.setToolTipText("Refresh tree list"); 145 refreshB.addMouseListener(new MouseAdapter() { 146 // add status bar text when mouse moves over button 147 public void mouseEntered(MouseEvent e) { statusBar.setText("Refresh the list of models"); } 148 // clear status bar when mouse moves off button 149 public void mouseExited(MouseEvent e) { statusBar.setText(""); } 150 }); 151 refreshB.addActionListener(new ActionListener() { 152 public void actionPerformed(ActionEvent e) { 153 Root.runCommand("loadAllModels()"); 154 } 155 }); 156 viewB = new JButton(new ImageIcon("icons/view.png")); 157 viewB.setToolTipText("View"); 158 viewB.setEnabled(false); 159 viewB.addMouseListener(new MouseAdapter() { 160 // add status bar text when mouse moves over button 161 public void mouseEntered(MouseEvent e) { statusBar.setText("View the selected model."); } 162 // clear status bar when mouse moves off button 163 public void mouseExited(MouseEvent e) { statusBar.setText(""); } 164 }); 165 viewB.addActionListener(new ActionListener() { 166 public void actionPerformed(ActionEvent e) { 167 if (model == null) return; 168 Root.runCommand("viewModel(\"" + model.getID() + "\")"); 169 } 170 }); 171 editB = new JButton(new ImageIcon("icons/edit.png")); 172 editB.setToolTipText("Edit"); 173 editB.setEnabled(false); 174 editB.addMouseListener(new MouseAdapter() { 175 // add status bar text when mouse moves over button 176 public void mouseEntered(MouseEvent e) { statusBar.setText("Edit the selected model"); } 177 // clear status bar when mouse moves off button 178 public void mouseExited(MouseEvent e) { statusBar.setText(""); } 179 }); 180 editB.addActionListener(new ActionListener() { 181 public void actionPerformed(ActionEvent e) { 182 if (model == null) return; 183 ModelUtils.editModel(model.getID()); 184 } 185 }); 186 deleteB= new JButton(new ImageIcon("icons/delete.png")); 187 deleteB.setToolTipText("Delete Tree"); 188 deleteB.setEnabled(false); 189 deleteB.addMouseListener(new MouseAdapter() { 190 // add status bar text when mouse moves over button 191 public void mouseEntered(MouseEvent e) { statusBar.setText("PERMANENTLY DELETE THE SELECTED MODEL"); } 192 // clear status bar when mouse moves off button 193 public void mouseExited(MouseEvent e) { statusBar.setText(""); } 194 }); 195 deleteB.addActionListener(new ActionListener() { 196 public void actionPerformed(ActionEvent e) { 197 if (model == null) return; 198 ModelUtils.deleteModel(model.getID()); 199 } 200 }); 201 closeB = new JButton(new ImageIcon("icons/close.png")); 202 closeB.setToolTipText("Close"); 203 closeB.addMouseListener(new MouseAdapter() { 204 // add status bar text when mouse moves over button 205 public void mouseEntered(MouseEvent e) { statusBar.setText("Close the model manager"); } 206 // clear status bar when mouse moves off button 207 public void mouseExited(MouseEvent e) { statusBar.setText(""); } 208 }); 209 closeB.addActionListener(new ActionListener() { 210 public void actionPerformed(ActionEvent e) { 211 thisFrame.setVisible(false); 212 } 213 }); 214 // add ToolBar 215 toolBar.addSeparator(new Dimension(15, 0)); 216 toolBar.add(newB); 217 toolBar.addSeparator(new Dimension(30, 25)); 218 toolBar.add(copyB); 219 toolBar.addSeparator(new Dimension(30, 25)); 220 toolBar.add(refreshB); 221 toolBar.addSeparator(new Dimension(30, 25)); 222 toolBar.add(viewB); 223 toolBar.addSeparator(new Dimension(30, 25)); 224 toolBar.add(editB); 225 toolBar.addSeparator(new Dimension(15, 0)); 226 toolBarR.addSeparator(new Dimension(15, 0)); 227 toolBarR.add(deleteB); 228 toolBarR.addSeparator(new Dimension(30, 25)); 229 toolBarR.add(closeB); 230 toolBarR.addSeparator(new Dimension(15, 0)); 231 // END TOOLBAR SETUP 232 // ************************************************* 233 234 // ************************************************* 235 // TABLE SETUP 236 tableModel = ObjectHandles.getModelTableModel(); 237 table = new JTable(tableModel); 238 table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 239 table.setColumnSelectionAllowed(false); 240 // table.setShowGrid(true); 241 // table.setShowHorizontalLines(true); 242 table.setShowVerticalLines(false); 243 // this should disallow rearranging cols 244 table.setDragEnabled(false); 245 // add the table to a scrollPane 246 JScrollPane tableSP = new JScrollPane(table); 247 tableSP.setBorder(etchedBorder); 248 /* 249 TableColumn column = null; 250 for (int i = 0; i < tableModel.getColumnCount(); i++) { 251 column = table.getColumnModel().getColumn(i); 252 // first 2 columns should be smaller 253 if (i < 2) column.setPreferredWidth(10); 254 else column.setPreferredWidth(100); 255 } 256 */ 257 258 // ***** SETUP TABLE LISTENER ***** 259 DefaultListSelectionModel dlsm = new DefaultListSelectionModel(); 260 table.setSelectionModel(dlsm); 261 // only allow single item selection 262 dlsm.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 263 dlsm.addListSelectionListener(new ListSelectionListener() { 264 public void valueChanged(ListSelectionEvent e) { 265 if (e.getValueIsAdjusting()) return; 266 267 if ((table.getRowCount() > 0) 268 && (table.getSelectedRowCount() > 0)) { 269 // an item is selected 270 model = tableModel.getRow(table.getSelectedRow()); 271 272 // setup notesL 273 notesL.setText(" " + model.getNotes()); 274 // notesL.setCaretPosition(0); // move cursor to begin of field 275 276 copyB.setEnabled(true); 277 viewB.setEnabled(true); 278 editB.setEnabled(true); 279 deleteB.setEnabled(true); 280 } else { 281 model = null; 282 283 // empty notesTF 284 notesL.setText(""); 285 286 copyB.setEnabled(false); 287 viewB.setEnabled(false); 288 editB.setEnabled(false); 289 deleteB.setEnabled(false); 290 } 291 } 292 }); 293 // END TABLE SETUP 294 // ************************************************* 295 296 // ************************************************* 297 // MODEL NOTES INFO SETUP 298 JPanel notesP = new JPanel(new BorderLayout()); 299 notesP.setBorder(etchedPadBorder5); 300 notesP.add(new JLabel("Notes: "), BorderLayout.WEST); 301 notesL.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0,0,0,5), 302 loweredBorder)); 303 notesP.add(notesL, BorderLayout.CENTER); 304 // END MODEL NOTES INFO SETUP 305 // ************************************************* 306 307 // ************************************************* 308 // STATUS BAR SETUP 309 JLabel statusBarSpacer = new JLabel(" "); 310 statusBar = new JLabel(" "); 311 JPanel statusBarP = new JPanel(false); 312 statusBarP.setBorder(loweredBorder); 313 statusBarP.setLayout(new BorderLayout()); 314 statusBarP.add(statusBarSpacer, BorderLayout.WEST); 315 statusBarP.add(statusBar, BorderLayout.CENTER); 316 // END STATUS BAR SETUP 317 // ************************************************* 318 319 // setup main panel 320 JPanel listP = new JPanel(new BorderLayout()); 321 listP.add(tableSP, BorderLayout.CENTER); 322 listP.add(notesP, BorderLayout.SOUTH); 323 324 // this will keep the toolbar on the left and right edges 325 Box box = Box.createHorizontalBox(); 326 box.add(toolBar); 327 box.add(Box.createHorizontalGlue()); 328 box.add(toolBarR); 329 330 getContentPane().add(box, BorderLayout.NORTH); 331 getContentPane().add(listP, BorderLayout.CENTER); 332 getContentPane().add(statusBarP, BorderLayout.SOUTH); 333 pack(); 334 335 // set the default window size 336 setSize(getSize().width, getSize().height + 100); 337 338 // display the window 339 setVisible(true); 340 } 341 } 342 } // ModelManager.java 343