/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: Project.java * Project management tool * Written by: Steven M. Rubin * * Copyright (c) 2005 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.project; import com.sun.electric.database.hierarchy.Library; import com.sun.electric.database.text.TextUtils; import com.sun.electric.tool.Job; import com.sun.electric.tool.JobException; import com.sun.electric.tool.user.dialogs.EDialog; import com.sun.electric.tool.user.ui.WindowFrame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; /** * This is the Project Management tool. */ public class LibraryDialog extends EDialog { private JList libList; private DefaultListModel libModel; /** * Method to prompt for all libraries in the repository and * choose one to retrieve. */ public static void getALibrary() { Project.pmActive = true; // find a list of files (libraries) in the repository String dirName = Project.getRepositoryLocation(); File dir = new File(dirName); File [] filesInDir = dir.listFiles(); if (filesInDir == null && dirName.length() == 0) { Job.getUserInterface().showInformationMessage("No repository location is set. Use the 'Project Management' Preferences to set it.", "Warning"); return; } // choose one and read it in new LibraryDialog(filesInDir); } LibraryDialog(File [] filesInDir) { super(null, true); initComponents(filesInDir); setVisible(true); } protected void escapePressed() { doButton(false); } private void doButton(boolean retrieve) { if (retrieve) { int index = libList.getSelectedIndex(); String libName = (String)libModel.getElementAt(index); new RetrieveLibraryFromRepositoryJob(libName); } dispose(); } private void initComponents(File [] filesInDir) { getContentPane().setLayout(new GridBagLayout()); setTitle("Retrieve a Library from the Repository"); setName(""); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { doButton(false); } }); JScrollPane libPane = new JScrollPane(); libModel = new DefaultListModel(); libList = new JList(libModel); libList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); libPane.setViewportView(libList); libList.clearSelection(); libList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) doButton(true); } }); // consider the files in the repository, too // String dirName = Project.getRepositoryLocation(); // File dir = new File(dirName); // File [] filesInDir = dir.listFiles(); // if (filesInDir == null && dirName.length() == 0) // { // Job.getUserInterface().showInformationMessage("No repository location is set. Use the 'Project Management' Preferences to set it.", "Warning"); // } // if (filesInDir != null) { List<String> libNames = new ArrayList<String>(); for(int i=0; i<filesInDir.length; i++) { File subFile = filesInDir[i]; if (subFile.isDirectory()) libNames.add(subFile.getName()); } Collections.sort(libNames, new TextUtils.ObjectsByToString()); for(String libName : libNames) { libModel.addElement(libName); } } GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 2; gbc.weightx = gbc.weighty = 1; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(4, 4, 4, 4); getContentPane().add(libPane, gbc); // OK and Cancel JButton ok = new JButton("OK"); getRootPane().setDefaultButton(ok); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 1; gbc.anchor = GridBagConstraints.CENTER; gbc.insets = new Insets(4, 4, 4, 4); getContentPane().add(ok, gbc); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { doButton(true); } }); JButton cancel = new JButton("Cancel"); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 1; gbc.anchor = GridBagConstraints.CENTER; gbc.insets = new Insets(4, 4, 4, 4); getContentPane().add(cancel, gbc); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { doButton(false); } }); pack(); } /** * This class gets a library from the Project Management repository. */ private static class RetrieveLibraryFromRepositoryJob extends Job { private ProjectDB pdb; private String libName; private RetrieveLibraryFromRepositoryJob(String libName) { super("Retrieve Library from Repository", Project.getProjectTool(), Job.Type.CHANGE, null, null, Job.Priority.USER); this.pdb = Project.projectDB; this.libName = libName; startJob(); } public boolean doIt() throws JobException { Library lib = Library.findLibrary(libName); if (lib != null) throw new JobException("Library '" + lib.getName() + "' already exists"); lib = Library.newInstance(libName, null); String projFile = Project.getRepositoryLocation() + File.separator + libName + File.separator + Project.PROJECTFILE; File pf = new File(projFile); if (!pf.exists()) throw new JobException("Cannot find project file '" + projFile + "'...retrieve aborted."); lib.newVar(Project.PROJPATHKEY, projFile); ProjectLibrary pl = pdb.findProjectLibrary(lib); // prevent tools (including this one) from seeing the change Project.setChangeStatus(true); // make a list of the most recent cells that are not checked-out List<ProjectCell> cellsToGet = new ArrayList<ProjectCell>(); String lastName = ""; for(Iterator<ProjectCell> it = pl.getProjectCells(); it.hasNext(); ) { ProjectCell pc = it.next(); String name = pc.describe(); if (pc.getOwner().length() > 0) continue; if (name.equals(lastName)) cellsToGet.remove(cellsToGet.size()-1); cellsToGet.add(pc); lastName = name; } //System.out.println("BEFORE:================================"); //for(ProjectLibrary pll : pdb.getProjectLibraries()) //{ // for(Iterator<ProjectCell> it = pll.getProjectCells(); it.hasNext(); ) // { // ProjectCell pc = it.next(); // System.out.println("PL="+pll.getLibrary().getName()+" PC="+pc.describe()); // } //} // check them out String userName = Project.getCurrentUserName(); for(ProjectCell pc : cellsToGet) { if (pc.getCell() == null) { Project.getCellFromRepository(pdb, pc, lib, true, true); // CHANGES DATABASE if (pc.getCell() == null) { Project.setChangeStatus(false); throw new JobException("Error retrieving old version of cell"); } } if (pc.getCell() != null) { boolean youOwn = userName.length() > 0 && pc.getOwner().equals(userName); Project.markLocked(pc.getCell(), !youOwn); // CHANGES DATABASE } } // allow changes Project.setChangeStatus(false); //System.out.println("AFTER:================================"); //for(ProjectLibrary pll : pdb.getProjectLibraries()) //{ // for(Iterator<ProjectCell> it = pll.getProjectCells(); it.hasNext(); ) // { // ProjectCell pc = it.next(); // System.out.println("PL="+pll.getLibrary().getName()+" PC="+pc.describe()); // } //} System.out.println("Library " + lib.getName() + " has been retrieved from the repository"); fieldVariableChanged("pdb"); return true; } public void terminateOK() { // take the new version of the project database from the server Project.projectDB = pdb; // update explorer tree WindowFrame.wantToRedoLibraryTree(); } } }