/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: SavedViews.java * * Copyright (c) 2003 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.tool.user.dialogs; import com.sun.electric.Main; import com.sun.electric.database.hierarchy.Cell; import com.sun.electric.database.variable.Variable; import com.sun.electric.tool.Job; import com.sun.electric.tool.JobException; import com.sun.electric.tool.user.HighlightListener; import com.sun.electric.tool.user.Highlighter; import com.sun.electric.tool.user.User; import com.sun.electric.tool.user.ui.EditWindow; import com.sun.electric.tool.user.ui.WindowFrame; import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.util.Iterator; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.ListSelectionModel; /** * Class to handle the "Saved Views" dialog. */ public class SavedViews extends EModelessDialog implements HighlightListener { private static final long serialVersionUID = 1L; private static SavedViews theDialog = null; private JList viewList; private DefaultListModel viewListModel; public static void showSavedViewsDialog() { if (theDialog == null) { JFrame jf = null; jf = (JFrame) Main.getCurrentJFrame(); theDialog = new SavedViews(jf); } theDialog.setVisible(true); theDialog.toFront(); } /** Creates new form Saved Views */ private SavedViews(Frame parent) { super(parent, false); initComponents(); Highlighter.addHighlightListener(this); // build the change list viewListModel = new DefaultListModel(); viewList = new JList(viewListModel); viewList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); viewPane.setViewportView(viewList); viewList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) restoreView(null); } }); finishInitialization(); loadInfo(); } protected void escapePressed() { done(null); } private void loadInfo() { // update current window viewListModel.clear(); EditWindow curWnd = EditWindow.getCurrent(); if (curWnd == null) return; Cell cell = curWnd.getCell(); if (cell == null) return; boolean found = false; for(Iterator<Variable> it = cell.getVariables(); it.hasNext(); ) { Variable var = it.next(); String name = var.getKey().getName(); if (name.startsWith("USER_windowview_")) { viewListModel.addElement(name.substring(16)); found = true; } } if (found) viewList.setSelectedIndex(0); } /** * Reloads the dialog when Highlights change */ public void highlightChanged(Highlighter which) { if (!isVisible()) return; loadInfo(); } /** * Called when by a Highlighter when it loses focus. The argument * is the Highlighter that has gained focus (may be null). * @param highlighterGainedFocus the highlighter for the current window (may be null). */ public void highlighterLostFocus(Highlighter highlighterGainedFocus) { if (!isVisible()) return; loadInfo(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; done = new javax.swing.JButton(); restoreView = new javax.swing.JButton(); viewPane = new javax.swing.JScrollPane(); jLabel1 = new javax.swing.JLabel(); viewName = new javax.swing.JTextField(); saveView = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.GridBagLayout()); setTitle("Window Views"); setName(""); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); done.setText("Done"); done.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { done(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(done, gridBagConstraints); restoreView.setText("Restore View"); restoreView.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { restoreView(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(restoreView, gridBagConstraints); viewPane.setMinimumSize(new java.awt.Dimension(150, 150)); viewPane.setPreferredSize(new java.awt.Dimension(150, 150)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(viewPane, gridBagConstraints); jLabel1.setText("View name:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(jLabel1, gridBagConstraints); viewName.setColumns(10); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(viewName, gridBagConstraints); saveView.setText("Save This View"); saveView.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveViewActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(saveView, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents private void saveViewActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_saveViewActionPerformed {//GEN-HEADEREND:event_saveViewActionPerformed // get the saved name String name = viewName.getText().trim(); if (name.length() == 0) return; // make sure there is a cell WindowFrame wf = WindowFrame.getCurrentWindowFrame(); if (wf == null) return; if (!(wf.getContent() instanceof EditWindow)) return; EditWindow wnd = (EditWindow)wf.getContent(); Cell cell = wnd.getCell(); if (cell == null) return; // save the view double scale = wnd.getScale(); Point2D off = wnd.getOffset(); new SaveViewJob(this, cell, name, scale, off.getX(), off.getY()); }//GEN-LAST:event_saveViewActionPerformed /** * Class to change the node/arc type in a new thread. */ private static class SaveViewJob extends Job { private static final long serialVersionUID = 1L; private transient SavedViews dialog; private Cell cell; private String name; private double scale, offX, offY; protected SaveViewJob(SavedViews dialog, Cell cell, String name, double scale, double offX, double offY) { super("Save Window View", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER); this.dialog = dialog; this.cell = cell; this.name = name; this.scale = scale; this.offX = offX; this.offY = offY; startJob(); } public boolean doIt() throws JobException { Double [] pos = new Double[3]; pos[0] = new Double(scale); pos[1] = new Double(offX); pos[2] = new Double(offY); cell.newVar("USER_windowview_" + name, pos); return true; } public void terminateOK() { dialog.loadInfo(); } } private void done(java.awt.event.ActionEvent evt)//GEN-FIRST:event_done {//GEN-HEADEREND:event_done closeDialog(null); }//GEN-LAST:event_done private void restoreView(java.awt.event.ActionEvent evt)//GEN-FIRST:event_restoreView {//GEN-HEADEREND:event_restoreView // get the current cell WindowFrame wf = WindowFrame.getCurrentWindowFrame(); if (wf == null) return; if (!(wf.getContent() instanceof EditWindow)) return; EditWindow wnd = (EditWindow)wf.getContent(); Cell cell = wnd.getCell(); if (cell == null) return; // get the saved information int index = viewList.getSelectedIndex(); String name = (String)viewListModel.get(index); Variable var = cell.getVar("USER_windowview_" + name); if (var == null) return; // adjust the window Double [] pos = (Double[])var.getObject(); wnd.setScale(pos[0].doubleValue()); Point2D off = new Point2D.Double(pos[1].doubleValue(), pos[2].doubleValue()); wnd.setOffset(off); wnd.fullRepaint(); }//GEN-LAST:event_restoreView /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt)//GEN-FIRST:event_closeDialog { Highlighter.removeHighlightListener(this); setVisible(false); dispose(); theDialog = null; }//GEN-LAST:event_closeDialog // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton done; private javax.swing.JLabel jLabel1; private javax.swing.JButton restoreView; private javax.swing.JButton saveView; private javax.swing.JTextField viewName; private javax.swing.JScrollPane viewPane; // End of variables declaration//GEN-END:variables }