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