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