/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: CellBrowser.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.change.DatabaseChangeEvent; import com.sun.electric.database.change.DatabaseChangeListener; import com.sun.electric.database.hierarchy.Cell; import com.sun.electric.database.hierarchy.Library; import com.sun.electric.database.hierarchy.View; import com.sun.electric.database.text.TextUtils; import com.sun.electric.tool.user.CellChangeJobs; import com.sun.electric.tool.user.CircuitChanges; import com.sun.electric.tool.user.UserInterfaceMain; import com.sun.electric.tool.user.menus.CellMenu; import com.sun.electric.tool.user.ui.PaletteFrame; import com.sun.electric.tool.user.ui.WindowFrame; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.prefs.Preferences; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; /** * Class to browse the list of cells and do specific things to them (delete, rename). * * <p>The CellBrowser is a general purpose browser that can browse * by Library, View, and Cell. It can filter Cell names using a regular * expression. * <p>The DoAction class is checked to adjust several configurable features: * <p>- What action to perform * <p>- What buttons are available * <p>- What additional JComponents are included * <p>- If the Cell List is multi- or single-select. */ public class CellBrowser extends EDialog implements DatabaseChangeListener { private static final long serialVersionUID = 1L; private static Preferences prefs = Preferences.userNodeForPackage(CellBrowser.class); private static final String prefFilter = "CellBrowser-Filter"; private static final String prefSelectedLib = "CellBrowser-SelectedLib"; private static final String prefSelectedView = "CellBrowser-SelectedView"; private static final String prefSelectedCell = "CellBrowser-SelectedCell"; private static final String prefEditInNewWindow = "CellBrowser-EditInNewWindow"; private static final String prefSortLexically = "CellBrowser-SortLexically"; private String lastSelectedLib = null; private String lastSelectedView = null; private String lastSelectedCell = null; private String lastFilter = ""; private static Pattern lastPattern = null; private static boolean confirmDelete = true; private boolean cancelled; private DoAction action; private List<Cell> cellList = null; // list of cells displayed private List<String> cellListNames = null; // list of cells by name displayed (matches cellList) /** * Class to do a cell browser action. */ public static class DoAction { public String title; public String name; private DoAction(String name, String title) { this.name = name; this.title = title; } public String toString() { return name; } public static final DoAction newInstance = new DoAction("New Cell Instance", "Create a Cell Instance"); public static final DoAction editCell = new DoAction("Edit Cell", "Edit a Cell"); public static final DoAction renameCell = new DoAction("Rename Cell", "Rename Cells"); public static final DoAction duplicateCell = new DoAction("Duplicate Cell", "Duplicate a Cell"); public static final DoAction deleteCell = new DoAction("Delete Cell", "Delete Cells"); public static final DoAction selectCellToAssoc = new DoAction("Select Cell", "Which Cell is Associated with this Data?"); public static final DoAction selectCellToCopy = new DoAction("Select Cell", "Copy Parameters from which Cell?"); } /** Creates new form CellBrowser */ public CellBrowser(Frame parent, boolean modal, DoAction action) { super(parent, modal); this.action = action; cancelled = false; initComponents(); // init components (netbeans generated method) setTitle(action.title); // set the dialog title doAction.setText(action.name); // set the action button's text getRootPane().setDefaultButton(doAction); // return will do action lastFilter = prefs.get(action+prefFilter, ""); lastPattern = Pattern.compile(lastFilter); lastSelectedCell = prefs.get(action+prefSelectedCell, null); cellFilter.setText(lastFilter); // restore last filter initExtras(); // set up an extra components initComboBoxes(); // set up the combo boxes UserInterfaceMain.addDatabaseChangeListener(this); finishInitialization(); pack(); } public void databaseChanged(DatabaseChangeEvent e) { if (!isVisible()) return; // would take too long to search for change we care about, just reload it updateCellList(); } // public void databaseEndChangeBatch(Undo.ChangeBatch batch) { // if (!isVisible()) return; // // would take too long to search for change we care about, just reload it // updateCellList(); // } // public void databaseChanged(Undo.Change evt) {} // public boolean isGUIListener() { return true; } protected void escapePressed() { cancelActionPerformed(null); } /** 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. */ private void initComponents() {//GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; jLabel1 = new javax.swing.JLabel(); libraryComboBox = new javax.swing.JComboBox(); jLabel2 = new javax.swing.JLabel(); viewComboBox = new javax.swing.JComboBox(); jLabel3 = new javax.swing.JLabel(); cellFilter = new javax.swing.JTextField(); jSeparator1 = new javax.swing.JSeparator(); jPanel1 = new javax.swing.JPanel(); cancel = new javax.swing.JButton(); doAction = new javax.swing.JButton(); done = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); jList1 = new javax.swing.JList(); extrasPanel = new javax.swing.JPanel(); getContentPane().setLayout(new java.awt.GridBagLayout()); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); jLabel1.setText("Library:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(jLabel1, gridBagConstraints); libraryComboBox.setFont(new java.awt.Font("Dialog", 0, 12)); libraryComboBox.setMinimumSize(new java.awt.Dimension(32, 20)); libraryComboBox.setPreferredSize(new java.awt.Dimension(32, 20)); libraryComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { libraryComboBoxItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); getContentPane().add(libraryComboBox, gridBagConstraints); jLabel2.setText("View:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(jLabel2, gridBagConstraints); viewComboBox.setFont(new java.awt.Font("Dialog", 0, 12)); viewComboBox.setMinimumSize(new java.awt.Dimension(32, 20)); viewComboBox.setPreferredSize(new java.awt.Dimension(32, 20)); viewComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { viewComboBoxItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); getContentPane().add(viewComboBox, gridBagConstraints); jLabel3.setText("Filter:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(7, 4, 7, 4); getContentPane().add(jLabel3, gridBagConstraints); cellFilter.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { cellFilterKeyReleased(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); getContentPane().add(cellFilter, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(6, 6, 6, 6); getContentPane().add(jSeparator1, gridBagConstraints); jPanel1.setLayout(new java.awt.GridBagLayout()); cancel.setText("Cancel"); cancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); jPanel1.add(cancel, gridBagConstraints); doAction.setText("doAction"); doAction.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { doActionActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); jPanel1.add(doAction, gridBagConstraints); done.setText("Done"); done.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { doneActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.weightx = 1.0; jPanel1.add(done, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; getContentPane().add(jPanel1, gridBagConstraints); jScrollPane1.setPreferredSize(new java.awt.Dimension(230, 350)); jList1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jList1.setPreferredSize(new java.awt.Dimension(150, 300)); jList1.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jList1ValueChanged(evt); } }); jList1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jList1MouseClicked(evt); } }); jScrollPane1.setViewportView(jList1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); getContentPane().add(jScrollPane1, gridBagConstraints); extrasPanel.setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; getContentPane().add(extrasPanel, gridBagConstraints); pack(); }//GEN-END:initComponents // ---------------------------- Extra Initialization --------------------------------- /** Initialize Combo Boxes */ private void initComboBoxes() { // initialize library combo box with choices libraryComboBox.addItem("All"); lastSelectedLib = prefs.get(action+prefSelectedLib, null); if (lastSelectedLib == null) // only in this case uses current cell { Cell cell = WindowFrame.getCurrentCell(); if (cell != null) lastSelectedLib = cell.getLibrary().getName(); } int curLibIndex = -1; int curIndex = -1; int i = 1; for (Library lib : Library.getVisibleLibraries()) { libraryComboBox.addItem(lib.getName()); if (lib.getName().equals(lastSelectedLib)) curIndex = i; // see if this is the last selected lib if (lib == Library.getCurrent()) curLibIndex = i; // see if this is the current lib i++; } if (curIndex == -1) curIndex = curLibIndex; if (curIndex > 0) libraryComboBox.setSelectedIndex(curIndex); viewComboBox.addItem("All"); lastSelectedView = prefs.get(action+prefSelectedView, null); curIndex = -1; i = 1; List<View> viewList = View.getOrderedViews(); for (View view : viewList) { viewComboBox.addItem(view.getFullName()); if (view.getFullName().equals(lastSelectedView)) curIndex = i; // see if this is the last selected view i++; } if (curIndex == -1) curIndex = 0; viewComboBox.setSelectedIndex(curIndex); } private JCheckBox sortNumerically; // ---- Edit Cell extras ---- private JCheckBox editInNewWindow; // ---- Rename Cell extras ---- private JLabel newCellNameLabel; private JTextField newCellName; // ---- Delete Cell extras ---- private JCheckBox confirmDeletions; private void initExtras() { // extras should be added in gridboxlayout inside JPanel "extrasPanel", // starting with gridx = 0, gridy=0. GridBagConstraints gridBagConstraints; int yPos = 0; // add in a check box to choose cell sorting method boolean lexSort = prefs.getBoolean(prefSortLexically, false); sortNumerically = new JCheckBox("Evaluate Numbers when Sorting Names", !lexSort); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = yPos++; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; extrasPanel.add(sortNumerically, gridBagConstraints); sortNumerically.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent evt) { updateCellList(); } }); if (action == DoAction.newInstance) { doAction.setText("New Instance"); done.setText("New Instance & Close"); } else if (action == DoAction.editCell) { // add in a check box to open in a new window boolean checked = prefs.getBoolean(prefEditInNewWindow, false); editInNewWindow = new JCheckBox("Edit in New Window", checked); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = yPos++; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; extrasPanel.add(editInNewWindow, gridBagConstraints); // remove done button, this is a one-shot action button jPanel1.remove(done); // however, it would be cool to be able to pick several cells to edit jList1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); } else if (action == DoAction.renameCell) { // add in a text box for the new name newCellNameLabel = new JLabel("New Cell Name: "); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = yPos; gridBagConstraints.gridwidth = 1; gridBagConstraints.fill = GridBagConstraints.BOTH; extrasPanel.add(newCellNameLabel, gridBagConstraints); newCellName = new JTextField(); if (lastSelectedCell != null) { String nameOnly = lastSelectedCell.replaceAll("\\{.*?\\}", ""); newCellName.setText(nameOnly); } gridBagConstraints.gridx = 1; gridBagConstraints.gridy = yPos++; gridBagConstraints.gridwidth = 1; gridBagConstraints.weightx = 1.0; gridBagConstraints.fill = GridBagConstraints.BOTH; extrasPanel.add(newCellName, gridBagConstraints); // not a one-shot action: doAction.setText("Apply Rename"); } else if (action == DoAction.deleteCell) { confirmDeletions = new JCheckBox("Confirm Deletions", confirmDelete); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = yPos++; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; extrasPanel.add(confirmDeletions, gridBagConstraints); // set current cell as the default Cell cell = WindowFrame.getCurrentCell(); setCell(cell); // not a one-shot action: jList1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); doAction.setText("Apply Delete"); } else if (action == DoAction.duplicateCell || action == DoAction.selectCellToAssoc) { // set current cell as the default Cell cell = WindowFrame.getCurrentCell(); setCell(cell); // remove done button, this is a one-shot action button jPanel1.remove(done); } } // --------------------------------- Actions ---------------------------------- private void jList1ValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_jList1ValueChanged int index = jList1.getSelectedIndex(); jList1.ensureIndexIsVisible(index); if (jList1.getSelectedValue() != null) { lastSelectedCell = (String)jList1.getSelectedValue(); } if (action == DoAction.renameCell) { if (lastSelectedCell != null && newCellName != null) { String nameOnly = lastSelectedCell.replaceAll("\\{.*?\\}", ""); newCellName.setText(nameOnly); } } }//GEN-LAST:event_jList1ValueChanged private void cellFilterKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_cellFilterKeyReleased updateCellList(); }//GEN-LAST:event_cellFilterKeyReleased private void viewComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_viewComboBoxItemStateChanged updateCellList(); }//GEN-LAST:event_viewComboBoxItemStateChanged private void libraryComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_libraryComboBoxItemStateChanged updateCellList(); }//GEN-LAST:event_libraryComboBoxItemStateChanged private void jList1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseClicked // do action on double click, close dialog if (evt.getClickCount() >= 2) performAction(); if (jList1.getSelectedValue() != null) { lastSelectedCell = (String)jList1.getSelectedValue(); } }//GEN-LAST:event_jList1MouseClicked private void doActionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_doActionActionPerformed performAction(); }//GEN-LAST:event_doActionActionPerformed private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed cancelled = true; closeDialog(null); }//GEN-LAST:event_cancelActionPerformed private void doneActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_doneActionPerformed if (action == DoAction.newInstance) performAction(); closeDialog(null); }//GEN-LAST:event_doneActionPerformed /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog // save all preferences prefs.put(action+prefSelectedLib, (String)libraryComboBox.getSelectedItem()); prefs.put(action+prefSelectedView, (String)viewComboBox.getSelectedItem()); if (jList1.getSelectedValue() != null) { prefs.put(action+prefSelectedCell, (String)jList1.getSelectedValue()); } prefs.put(action+prefFilter, lastFilter); prefs.putBoolean(prefSortLexically, !sortNumerically.isSelected()); if (action == DoAction.editCell) { prefs.putBoolean(prefEditInNewWindow, editInNewWindow.isSelected()); } else if (action == DoAction.deleteCell) { confirmDelete = confirmDeletions.isSelected(); } setVisible(false); UserInterfaceMain.removeDatabaseChangeListener(this); dispose(); }//GEN-LAST:event_closeDialog private void performAction() { if (action == DoAction.newInstance) { Cell cell = getSelectedCell(); if (cell == null) return; PaletteFrame.placeInstance(cell, null, false); } else if (action == DoAction.editCell) { boolean newWindow = editInNewWindow.isSelected(); List<Cell> cells = getSelectedCells(); for (Cell cell : cells) { WindowFrame wf = WindowFrame.getCurrentWindowFrame(); if (!newWindow && wf == null) newWindow = true; if (newWindow) { WindowFrame.createEditWindow(cell); } else { wf.setCellWindow(cell, null); } // if multiple cells selected, all cells after first // should be opened in new window newWindow = true; } closeDialog(null); // we have performed the action } else if (action == DoAction.deleteCell) { confirmDelete = confirmDeletions.isSelected(); List<Cell> cells = getSelectedCells(); Set<String> deletedCells = new HashSet<String>(); for(Cell cell : cells) { // make sure the user really wants to delete the cell if (confirmDelete) { int response = JOptionPane.showConfirmDialog(Main.getCurrentJFrame(), "Are you sure you want to delete " + cell + "?", "Confirm Cell Deletion", JOptionPane.YES_NO_OPTION); if (response != JOptionPane.YES_OPTION) return; } // delete references to cell CircuitChanges.cleanCellRef(cell); deletedCells.add(cell.noLibDescribe()); } // delete all requested cells new CellChangeJobs.DeleteManyCells(cells); // pick a new selected cell lastSelectedCell = null; for (int i=cellListNames.size()-2; i>=0; i--) { String name = cellListNames.get(i); String nextName = cellListNames.get(i+1); if (deletedCells.contains(name) && !deletedCells.contains(nextName)) { lastSelectedCell = nextName; break; } } if (lastSelectedCell == null) { for (int i=0; i<cellListNames.size(); i++) { String name = cellListNames.get(i); if (!deletedCells.contains(name)) { lastSelectedCell = name; break; } } } updateCellList(); } else if (action == DoAction.renameCell) { Cell cell = getSelectedCell(); if (cell == null) return; String newName = newCellName.getText(); if (newName == null || newName.equals("")) return; CircuitChanges.renameCellInJob(cell, newName); lastSelectedCell = newName + cell.getView().getAbbreviationExtension(); //setCell(cell); } else if (action == DoAction.duplicateCell) { Cell cell = getSelectedCell(); if (cell == null) return; new CellMenu.NewCellName(false, cell); closeDialog(null); // we have performed the action updateCellList(); } else if (action == DoAction.selectCellToAssoc || action == DoAction.selectCellToCopy) { closeDialog(null); // we have performed the action } } // -------------------------------- Set State of Dialog ------------------------------ private void setLibrary(Library lib) { String libName = lib.getName(); libraryComboBox.setSelectedItem(libName); } private void setView(View view) { String viewName = view.getFullName(); viewComboBox.setSelectedItem(viewName); } private void setCell(Cell cell) { // clear filter cellFilter.setText(""); if (cell != null) { // this will make cell selected on update of list lastSelectedCell = cell.noLibDescribe(); Library lib = cell.getLibrary(); setLibrary(lib); View view = cell.getView(); setView(view); } updateCellList(); } // ---------------------------------- List ---------------------------------------- /** * Updates the Cell list depending on the library, view selected, and any filter in * the text box. */ private void updateCellList() { String libName = (String)libraryComboBox.getSelectedItem(); String viewName = (String)viewComboBox.getSelectedItem(); String filter = cellFilter.getText(); // get library if specified (all if not) Library lib = Library.findLibrary(libName); // get view if specified (all if not) View view = null; for (Iterator<View> it = View.getViews(); it.hasNext(); ) { View v = it.next(); if (v.getFullName().equals(viewName)) { view = v; break; } } // use cached (last) filter Pattern if no change Pattern pat; if (filter.equals("*")) filter = ""; if (filter.equals(lastFilter)) { pat = lastPattern; } else { try { pat = Pattern.compile(filter, Pattern.CASE_INSENSITIVE); } catch(java.util.regex.PatternSyntaxException e) { pat = null; filter = ""; } lastPattern = pat; lastFilter = filter; } cellList = new ArrayList<Cell>(); if (lib == null) { // do all libraries for (Iterator<Library> it = Library.getLibraries(); it.hasNext(); ) { Library library = it.next(); for (Iterator<Cell> it2 = library.getCells(); it2.hasNext(); ) { Cell c = it2.next(); if (view != null) { if (view != c.getView()) continue; // skip if not filtered view } if (pat != null) { Matcher mat = pat.matcher(c.noLibDescribe()); if (!mat.find()) continue; // skip if doesn't match filter } cellList.add(c); } } } else { // just do selected library for (Iterator<Cell> it = lib.getCells(); it.hasNext(); ) { Cell c = it.next(); if (view != null) { if (view != c.getView()) continue; // skip if not filtered view } if (!filter.equals("")) { Matcher mat = pat.matcher(c.noLibDescribe()); if (!mat.find()) continue; // skip if doesn't match filter } cellList.add(c); } } // sort appropriately if (sortNumerically.isSelected()) { // sort list by name, considering numbers Collections.sort(cellList); } else { // sort list by name, not considering numbers Collections.sort(cellList, new TextUtils.CellsByName()); } cellListNames = new ArrayList<String>(); for (Cell c : cellList) { cellListNames.add(c.noLibDescribe()); } jList1.setListData(cellListNames.toArray()); // if nothing selected or found, then disable the button doAction.setEnabled(cellListNames.size()>0); // update JScrollPane's scroll bars for new size list jList1.setVisibleRowCount(jList1.getModel().getSize()); jList1.setPreferredSize(jList1.getPreferredScrollableViewportSize()); jList1.revalidate(); // changing lists will have triggered update to cell list, go to last selected cell now if (lastSelectedCell != null) { int i; for (i=0; i<cellListNames.size(); i++) { String name = cellListNames.get(i); if (name.equals(lastSelectedCell)) { jList1.setSelectedIndex(i); break; } } if (i == cellListNames.size()) { lastSelectedCell = null; } } if (lastSelectedCell == null) { // didn't find anything, try to find current cell in the list Cell cell = WindowFrame.getCurrentCell(); if (cell != null) { String findname = cell.noLibDescribe(); for (int i=0; i<cellListNames.size(); i++) { String name = cellListNames.get(i); if (name.equals(findname)) { jList1.setSelectedIndex(i); lastSelectedCell = findname; break; } } } } } /** * Get selected Cell by user in Cell List * @return Cell or null if no cell is selected */ public Cell getSelectedCell() { if (cancelled) return null; int i = jList1.getSelectedIndex(); return (i == -1)? null : cellList.get(i); } /** * Get a list of selected Cells. * @return a list of selected Cells, or an empty list if none selected. */ private List<Cell> getSelectedCells() { int [] is = jList1.getSelectedIndices(); ArrayList<Cell> list = new ArrayList<Cell>(); for (int i=0; i<is.length; i++) { int celli = is[i]; Cell cell = cellList.get(celli); if (cell == null) continue; list.add(cell); } return list; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancel; private javax.swing.JTextField cellFilter; private javax.swing.JButton doAction; private javax.swing.JButton done; private javax.swing.JPanel extrasPanel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JList jList1; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSeparator jSeparator1; private javax.swing.JComboBox libraryComboBox; private javax.swing.JComboBox viewComboBox; // End of variables declaration//GEN-END:variables }