manipulateports.java

来自「The ElectricTM VLSI Design System is an 」· Java 代码 · 共 677 行 · 第 1/2 页

JAVA
677
字号
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: ManipulatePorts.java * * Copyright (c) 2006 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.database.hierarchy.Cell;import com.sun.electric.database.hierarchy.Export;import com.sun.electric.database.text.TextUtils;import com.sun.electric.database.topology.Connection;import com.sun.electric.database.topology.NodeInst;import com.sun.electric.database.topology.PortInst;import com.sun.electric.database.variable.EditWindow_;import com.sun.electric.database.variable.UserInterface;import com.sun.electric.technology.ArcProto;import com.sun.electric.technology.technologies.Generic;import com.sun.electric.tool.Job;import com.sun.electric.tool.user.ExportChanges;import com.sun.electric.tool.user.Highlighter;import com.sun.electric.tool.user.ui.EditWindow;import com.sun.electric.tool.user.ui.TopLevel;import java.awt.Frame;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.swing.JTable;import javax.swing.table.AbstractTableModel;import javax.swing.table.JTableHeader;import javax.swing.table.TableColumn;import javax.swing.table.TableColumnModel;/** * Class to handle the "Manipulate Ports" dialog. */public class ManipulatePorts extends EDialog{	private static final String [] columnNames = {" ", "Name", "Characteristic", "Connections", "Arcs", "Exports"};	private class PortsTable extends JTable	{		private PortTableModel model;		/**		 * Constructor for PortsTable		 */		public PortsTable(NodeInst ni)		{			model = new PortTableModel(ni);			for(Iterator<PortInst> it = ni.getPortInsts(); it.hasNext(); )			{				PortInst pi = it.next();				model.newVar(pi);			}			model.sortTable(1, true);			setModel(model);			TableColumn tc = getColumn(getColumnName(0));			if (tc != null) tc.setPreferredWidth(20);			tc = getColumn(getColumnName(1));			if (tc != null) tc.setPreferredWidth(120);			tc = getColumn(getColumnName(2));			if (tc != null) tc.setPreferredWidth(100);			tc = getColumn(getColumnName(3));			if (tc != null) tc.setPreferredWidth(90);			tc = getColumn(getColumnName(4));			if (tc != null) tc.setPreferredWidth(30);			tc = getColumn(getColumnName(5));			if (tc != null) tc.setPreferredWidth(120);		}		public void toggleSelection()		{			int [] rows = getSelectedRows();			for(int i=0; i<rows.length; i++)			{				Boolean b = (Boolean)model.getValueAt(rows[i], 0);				model.setValueAt(Boolean.valueOf(!b.booleanValue()), rows[i], 0);			}		}		public PortTableModel getModel() { return model; }		public void selectAll() { model.selectAll(); }		public void deselectAll() { model.deselectAll(); }		public void reExportSelected() { model.reExportSelected(); }		public void unExportSelected() { model.unExportSelected(); }		public void showSelected() { model.showSelected(); }	}	/**	 * Model for storing Table data	 */	private class PortTableModel extends AbstractTableModel	{		private NodeInst ni;		private List<PortEntry> ports;		private class PortEntry		{			private boolean selected;			private PortInst pi;			private PortEntry(PortInst pi) { this.pi = pi; }			private PortInst getPort() { return pi; }			private boolean isSelected() { return selected; }			private void setSelected(boolean s) { selected = s; }			private String getConnections()			{				ArcProto [] conns = pi.getPortProto().getBasePort().getConnections();				StringBuffer buf = new StringBuffer();				for(int i=0; i<conns.length; i++)				{					if (conns[i].getTechnology() == Generic.tech())					{						if (ni.getProto().getTechnology() != Generic.tech()) continue;					}					if (buf.length() > 0) buf.append(", ");					buf.append(conns[i].getName());				}				return buf.toString();			}			private int getNumArcs()			{				int num = 0;				for(Iterator<Connection> it = pi.getNodeInst().getConnections(); it.hasNext(); )				{					Connection con = it.next();					if (con.getPortInst() == pi) num++;				}				return num;			}			private String getExports()			{				StringBuffer buf = new StringBuffer();				for(Iterator<Export> it = pi.getNodeInst().getExports(); it.hasNext(); )				{					Export e = it.next();					if (e.getOriginalPort() != pi) continue;					if (buf.length() > 0) buf.append(", ");					buf.append(e.getName());				}				return buf.toString();			}		}		/**		 * Class to sort ports.		 */		public class PortEntrySort implements Comparator<PortEntry>		{			private int column;			private boolean ascending;			PortEntrySort(int column, boolean ascending)			{				this.column = column;				this.ascending = ascending;			}			public int compare(PortEntry p1, PortEntry p2)			{				if (!ascending)				{					PortEntry swap = p1;					p1 = p2;					p2 = swap;				}				String s1 = null, s2 = null;				switch (column)				{					case 0:						boolean b1 = p1.isSelected();						boolean b2 = p2.isSelected();						if (b1 == b2) return 0;						if (b1) return 1;						return -1;					case 1:						s1 = p1.getPort().getPortProto().getName();						s2 = p2.getPort().getPortProto().getName();						break;					case 2:						s1 = p1.getPort().getPortProto().getCharacteristic().getName();						s2 = p2.getPort().getPortProto().getCharacteristic().getName();						return s1.compareTo(s2);					case 3:						s1 = p1.getConnections();						s2 = p2.getConnections();						break;					case 4:						int i1 = p1.getNumArcs();						int i2 = p2.getNumArcs();						if (i1 == 12) return 0;						if (i1 < i2) return 1;						return -1;					case 5:						s1 = p1.getExports();						s2 = p2.getExports();						break;				}				return TextUtils.STRING_NUMBER_ORDER.compare(s1, s2);			}		}		// constructor		private PortTableModel(NodeInst ni)		{			this.ni = ni;			ports = new ArrayList<PortEntry>();		}		/**		 * Create a new var with default properties		 */		public void newVar(PortInst pi)		{			PortEntry ve = new PortEntry(pi);			ports.add(ve);		}		public void sortTable(int column, boolean ascending)		{			Collections.sort(ports, new PortEntrySort(column, ascending));			fireTableDataChanged();		}		public void selectAll()		{			int i = 0;			for(PortEntry pe : ports)			{				pe.setSelected(true);				fireTableCellUpdated(i++, 0);			}		}		public void deselectAll()		{			int i = 0;			for(PortEntry pe : ports)			{				pe.setSelected(false);				fireTableCellUpdated(i++, 0);			}		}		public void reExportSelected()		{			List<PortInst> queuedExports = new ArrayList<PortInst>();			for(PortEntry pe : ports)			{				if (!pe.isSelected()) continue;				queuedExports.add(pe.getPort());			}	        new ExportChanges.ReExportPorts(ni.getParent(), queuedExports, true, true, true, false, null);		}		public void unExportSelected()		{			List<Export> queuedExports = new ArrayList<Export>();			for(PortEntry pe : ports)			{				if (!pe.isSelected()) continue;				for(Iterator<Export> eIt = pe.getPort().getExports(); eIt.hasNext(); )				{					Export e = eIt.next();					queuedExports.add(e);				}			}			ExportChanges.deleteExports(ni.getParent(), queuedExports);		}		public void showSelected()		{			UserInterface ui = Job.getUserInterface();			EditWindow_ wnd = ui.getCurrentEditWindow_();			if (wnd == null) return;			wnd.clearHighlighting();			for(PortEntry pe : ports)			{				if (!pe.isSelected()) continue;				wnd.addElectricObject(pe.getPort(), ni.getParent());			}			wnd.finishedHighlighting();		}		/** Method to get the number of columns. */		public int getColumnCount() { return 6; }		/** Method to get the number of rows. */		public int getRowCount() { return ports.size(); }		/** Method to get a location in the table. */		public Object getValueAt(int rowIndex, int columnIndex) {			PortEntry pe = ports.get(rowIndex);			if (pe == null) return null;			switch (columnIndex)			{				// selected				case 0: return Boolean.valueOf(pe.isSelected());				// name				case 1: return pe.getPort().getPortProto().getName();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?