/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: DesignRulesTab.java * * Copyright (c) 2004 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.text.TextUtils; import com.sun.electric.database.geometry.DBMath; import com.sun.electric.technology.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Collections; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; /** * Class to handle the "Design Rules" tab of the Preferences frame. */ public class DesignRulesPanel extends JPanel { private Technology curTech; private JList designRulesFromList, designRulesToList, designRulesNodeList; private DefaultListModel designRulesToModel; private DRCRules drRules; private boolean designRulesUpdating = false; private boolean [] designRulesValidLayers; private List<DRCTemplate> wideSpacingRules; private Foundry.Type foundry; /** Creates new form DesignRulesTab */ public DesignRulesPanel() { initComponents(); // make all text fields select-all when entered EDialog.makeTextFieldSelectAllOnTab(drNodeWidth); EDialog.makeTextFieldSelectAllOnTab(drNodeHeight); EDialog.makeTextFieldSelectAllOnTab(drNodeRule); EDialog.makeTextFieldSelectAllOnTab(drLayerWidth); EDialog.makeTextFieldSelectAllOnTab(drLayerWidthRule); EDialog.makeTextFieldSelectAllOnTab(drLayerArea); EDialog.makeTextFieldSelectAllOnTab(drLayerAreaRule); EDialog.makeTextFieldSelectAllOnTab(drLayerEAreaRule); EDialog.makeTextFieldSelectAllOnTab(drLayerEnclosure); EDialog.makeTextFieldSelectAllOnTab(drNormalConnected); EDialog.makeTextFieldSelectAllOnTab(drNormalConnectedRule); EDialog.makeTextFieldSelectAllOnTab(drNormalUnconnected); EDialog.makeTextFieldSelectAllOnTab(drNormalUnconnectedRule); EDialog.makeTextFieldSelectAllOnTab(drNormalEdge); EDialog.makeTextFieldSelectAllOnTab(drNormalEdgeRule); EDialog.makeTextFieldSelectAllOnTab(drMultiUnconnected); EDialog.makeTextFieldSelectAllOnTab(drMultiUnconnectedRule); EDialog.makeTextFieldSelectAllOnTab(drLengths); EDialog.makeTextFieldSelectAllOnTab(drSpacings); EDialog.makeTextFieldSelectAllOnTab(drSpacingsRule); EDialog.makeTextFieldSelectAllOnTab(drWidths); } /** * Method called at the start of the frame. * Caches current values and displays them in the Design Rules tab. */ public void init(Technology tech, Foundry.Type foun, DRCRules drcR) { curTech = tech; foundry = foun; drRules = drcR; if (drRules == null) { drShowOnlyLinesWithRules.setEnabled(false); drNormalConnected.setEnabled(false); drNormalConnectedRule.setEnabled(false); drNormalUnconnected.setEnabled(false); drNormalUnconnectedRule.setEnabled(false); drNormalEdge.setEnabled(false); drNormalEdgeRule.setEnabled(false); drWidths.setEnabled(false); drLengths.setEnabled(false); drSpacings.setEnabled(false); drMultiUnconnected.setEnabled(false); drMultiUnconnectedRule.setEnabled(false); return; } // figure out which layers are valid int numLayers = curTech.getNumLayers(); designRulesValidLayers = new boolean[numLayers]; for(int i=0; i<numLayers; i++) designRulesValidLayers[i] = false; for(Iterator<PrimitiveNode> it = curTech.getNodes(); it.hasNext(); ) { PrimitiveNode np = it.next(); if (np.isNotUsed()) continue; Technology.NodeLayer [] layers = np.getNodeLayers(); for(Technology.NodeLayer nl : layers) { Layer layer = nl.getLayer(); designRulesValidLayers[layer.getIndex()] = true; } } for(Iterator<ArcProto> it = curTech.getArcs(); it.hasNext(); ) { ArcProto ap = it.next(); if (ap.isNotUsed()) continue; for(Iterator<Layer> lIt = ap.getLayerIterator(); lIt.hasNext(); ) { Layer layer = lIt.next(); designRulesValidLayers[layer.getIndex()] = true; } } // build the "node" list DefaultListModel designRulesNodeModel = new DefaultListModel(); designRulesNodeList = new JList(designRulesNodeModel); designRulesNodeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); drNodeList.setViewportView(designRulesNodeList); designRulesNodeList.clearSelection(); designRulesNodeList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { designRulesGetSelectedNode(); } }); for(Iterator<PrimitiveNode> it = curTech.getNodes(); it.hasNext(); ) { PrimitiveNode np = it.next(); designRulesNodeModel.addElement(np.getName()); } designRulesNodeList.setSelectedIndex(0); // build the "from" layer list DefaultListModel designRulesFromModel = new DefaultListModel(); designRulesFromList = new JList(designRulesFromModel); designRulesFromList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); drFromList.setViewportView(designRulesFromList); designRulesFromList.clearSelection(); designRulesFromList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { designRulesGetSelectedLayerLoadDRCToList(); } }); for(int i=0; i<designRulesValidLayers.length; i++) { if (!designRulesValidLayers[i]) continue; designRulesFromModel.addElement(curTech.getLayer(i).getName()); } designRulesFromList.setSelectedIndex(0); // build the "to" layer list designRulesToModel = new DefaultListModel(); designRulesToList = new JList(designRulesToModel); designRulesToList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); drToList.setViewportView(designRulesToList); designRulesToList.clearSelection(); designRulesToList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { designRulesShowSelectedLayerRules(); } }); // catch the "show only lines with valid rules" checkbox drShowOnlyLinesWithRules.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { designRulesGetSelectedLayerLoadDRCToList(); } }); // catch changes to the width rules popup drSpacingsList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { widePopupChanged(false); } }); // have changes to edit fields get detected immediately designRulesUpdating = false; DRCDocumentListener listener = new DRCDocumentListener(this, drNormalConnected, DRCDocType.SPACING); drNormalConnected.getDocument().addDocumentListener(listener); drNormalConnectedRule.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drNormalUnconnected, DRCDocType.SPACING); drNormalUnconnected.getDocument().addDocumentListener(listener); drNormalUnconnectedRule.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drNormalEdge, DRCDocType.SPACING); drNormalEdge.getDocument().addDocumentListener(listener); drNormalEdgeRule.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drLayerWidth, DRCDocType.MINIMUM); drLayerWidth.getDocument().addDocumentListener(listener); drLayerWidthRule.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drLayerArea, DRCDocType.MINIMUM); drLayerArea.getDocument().addDocumentListener(listener); drLayerAreaRule.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drLayerEnclosure, DRCDocType.MINIMUM); drLayerEnclosure.getDocument().addDocumentListener(listener); drLayerEAreaRule.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drSpacings, DRCDocType.SPACING); drWidths.getDocument().addDocumentListener(listener); drLengths.getDocument().addDocumentListener(listener); drSpacingsRule.getDocument().addDocumentListener(listener); drSpacings.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drMultiUnconnected, DRCDocType.SPACING); drMultiUnconnected.getDocument().addDocumentListener(listener); drMultiUnconnectedRule.getDocument().addDocumentListener(listener); listener = new DRCDocumentListener(this, drNodeWidth, DRCDocType.NODE); drNodeWidth.getDocument().addDocumentListener(listener); drNodeHeight.getDocument().addDocumentListener(listener); drNodeRule.getDocument().addDocumentListener(listener); designRulesGetSelectedLayerLoadDRCToList(); } /** * Class to handle special changes to design rules. */ private enum DRCDocType {NODE, MINIMUM, SPACING} private static class DRCDocumentListener implements DocumentListener { private DesignRulesPanel frame; private JTextField field; private DRCDocType type; DRCDocumentListener(DesignRulesPanel dialog, JTextField text, DRCDocType type) { this.frame = dialog; this.field = text; this.type = type; } private void update() { switch (type) { case NODE: frame.editChangedOnNodeRules(field); break; case MINIMUM: frame.editChangedOnMinRules(field); break; case SPACING: frame.designRulesEditChanged(field); break; } } public void changedUpdate(DocumentEvent e) { update(); } public void insertUpdate(DocumentEvent e) { update(); } public void removeUpdate(DocumentEvent e) { update(); } } private int getLayerFromToIndex() { // get layer information int layer1 = designRulesGetSelectedLayer(designRulesFromList); if (layer1 < 0) return -1; int layer2 = designRulesGetSelectedLayer(designRulesToList); if (layer2 < 0) return -1; return (drRules.getRuleIndex(layer1, layer2)); } /** * Method called when the user changes any edit field handling node rules * @param field */ private void editChangedOnNodeRules(JTextField field) { assert(drNodeWidth == field || drNodeHeight == field || drNodeRule == field); if (designRulesUpdating) return; designRulesUpdating = true; // pickup changes to node rules int nodeIndex = designRulesNodeList.getSelectedIndex(); String widthText = drNodeWidth.getText().trim(); String heightText = drNodeHeight.getText().trim(); double width = -1, height = -1; if (widthText.length() > 0 || heightText.length() > 0) { width = TextUtils.atofDistance(widthText); height = TextUtils.atofDistance(heightText); } double[] vals = {width, height}; DRCTemplate tmp = new DRCTemplate(drNodeRule.getText(), DRCTemplate.DRCMode.ALL.mode(), DRCTemplate.DRCRuleType.NODSIZ, 0, 0, null, null, vals, -1); drRules.addRule(nodeIndex, tmp, DRCTemplate.DRCRuleType.NONE, false); designRulesUpdating = false; } /** * Method called when the user changes any edit field. * @param field */ private void editChangedOnMinRules(JTextField field) { if (designRulesUpdating) return; designRulesUpdating = true; // get layer information int layer1 = designRulesGetSelectedLayer(designRulesFromList); if (layer1 < 0) return; Layer layer = curTech.getLayer(layer1); String minSizeText, minSizeRuleName; double minSize; // width related fields touched if (field == drLayerWidth) { // pickup changes to layer minimum size rule minSizeText = drLayerWidth.getText().trim(); minSize = TextUtils.atofDistance(minSizeText); minSizeRuleName = drLayerWidthRule.getText().trim(); if (minSizeText.length() > 0 && minSizeRuleName.length() > 0) drRules.setMinValue(layer, minSizeRuleName, minSize, DRCTemplate.DRCRuleType.MINWID); } else if (field == drLayerArea) { // pickup changes to layer min area rule minSizeText = drLayerArea.getText().trim(); minSize = TextUtils.atof(minSizeText); minSizeRuleName = drLayerAreaRule.getText().trim(); if (minSizeText.length() > 0) drRules.setMinValue(layer, minSizeRuleName, minSize, DRCTemplate.DRCRuleType.MINAREA); } else if (field == drLayerEnclosure) { // pickup changes to layer min enclose area rule minSizeText = drLayerEnclosure.getText().trim(); minSize = TextUtils.atof(minSizeText); minSizeRuleName = drLayerEAreaRule.getText().trim(); if (minSizeText.length() > 0) drRules.setMinValue(layer, minSizeRuleName, minSize, DRCTemplate.DRCRuleType.MINENCLOSEDAREA); } else System.out.println("Invalid field in editChangedOnMinRules"); designRulesUpdating = false; } /** * Method called when the user changes any edit field. * @param field */ private void designRulesEditChanged(JTextField field) { if (designRulesUpdating) return; designRulesUpdating = true; // get layer information int layer1 = designRulesGetSelectedLayer(designRulesFromList); if (layer1 < 0) return; int dindex = getLayerFromToIndex(); if (dindex == -1) return; List<DRCTemplate> list = new ArrayList<DRCTemplate>(); double value; if (field == drNormalConnected) { // get new normal spacing values value = TextUtils.atofDistance(drNormalConnected.getText()); list.add(new DRCTemplate(drNormalConnectedRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.CONSPA, 0, 0, null, null, new double[]{value}, -1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.SPACING, false); } else if (field == drNormalUnconnected) { value = TextUtils.atofDistance(drNormalUnconnected.getText()); list.add(new DRCTemplate(drNormalUnconnectedRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.UCONSPA, 0, 0, null, null, new double[]{value}, -1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.SPACING, false); } else if (field == drMultiUnconnected) { value = TextUtils.atofDistance(drMultiUnconnected.getText()); list.add(new DRCTemplate(drMultiUnconnectedRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.UCONSPA2D, 0, 0, null, null, new double[]{value}, 1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.UCONSPA2D, false); } else if (field == drNormalEdge) { // get new edge values value = TextUtils.atofDistance(drNormalEdge.getText()); list.add(new DRCTemplate(drNormalEdgeRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.CONSPA, 0, 0, null, null, new double[]{value}, -1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.SPACINGE, false); } else if (field == drSpacings) { // get new wide spacing values int curWid = drSpacingsList.getSelectedIndex(); // int curWid = drSpacingsList.getItemCount() - 1; if (curWid >= 0 && curWid < wideSpacingRules.size()) { DRCTemplate wr = wideSpacingRules.get(curWid); double maxW = TextUtils.atofDistance(drWidths.getText().trim()); double minL = TextUtils.atofDistance(drLengths.getText().trim()); double minV = TextUtils.atofDistance(drSpacings.getText().trim()); String newName = drSpacingsRule.getText().trim(); boolean diffW = (DBMath.isGreaterThan(maxW, 0) && !DBMath.areEquals(wr.maxWidth, maxW)); boolean diffL = (DBMath.isGreaterThan(minL, 0) && !DBMath.areEquals(wr.minLength, minL)); boolean diffV = (DBMath.isGreaterThan(minV, 0) && !DBMath.areEquals(wr.getValue(0), minV)); boolean diffN = !wr.ruleName.equals(newName); if (diffW || diffL || diffV || diffN) // they have to be > 0 { if (diffW) wr.maxWidth = maxW; if (diffL) wr.minLength = minL; if (diffV) wr.setValue(0, minV); if (diffN) wr.ruleName = newName; drRules.setSpacingRules(dindex, wideSpacingRules, DRCTemplate.DRCRuleType.SPACING, true); } } } designRulesUpdating = false; } /** * Method to handle selection of a different node in the top scroll list. */ private void designRulesGetSelectedNode() { designRulesUpdating = true; int nodeIndex = designRulesNodeList.getSelectedIndex(); DRCTemplate nr = drRules.getRule(nodeIndex, DRCTemplate.DRCRuleType.NODSIZ); drNodeWidth.setText(""); drNodeHeight.setText(""); drNodeRule.setText(""); if (nr != null) { drNodeWidth.setText(TextUtils.formatDistance(nr.getValue(0))); drNodeHeight.setText(TextUtils.formatDistance(nr.getValue(1))); drNodeRule.setText(nr.ruleName); } designRulesUpdating = false; } /** * Method called when the wide rules popup changes. */ private void widePopupChanged(boolean delete) { int index = drSpacingsList.getSelectedIndex(); if (index < 0 || index >= wideSpacingRules.size()) return; designRulesUpdating = true; DRCTemplate tmp = wideSpacingRules.get(index); drWidths.setText(""); drLengths.setText(""); drSpacingsRule.setText(""); drSpacings.setText(""); // Delete the wde rule if (delete) { drRules.deleteRule(index, tmp); wideSpacingRules.remove(tmp); drSpacingsList.removeItemAt(index); if (wideSpacingRules.size() != 0) drSpacingsList.setSelectedIndex(0); } else { if (tmp.maxWidth != 0) drWidths.setText(TextUtils.formatDistance(tmp.maxWidth)); if (tmp.minLength != 0) drLengths.setText(TextUtils.formatDistance(tmp.minLength)); drSpacings.setText(TextUtils.formatDistance(tmp.getValue(0))); drSpacingsRule.setText(tmp.ruleName); } designRulesUpdating = false; } /** * Method called when the user clicks on the "from layer" list or the "show only lines with rules" checkbox. */ private void designRulesGetSelectedLayerLoadDRCToList() { designRulesUpdating = true; // show layer information boolean onlyvalid = drShowOnlyLinesWithRules.isSelected(); int j = designRulesGetSelectedLayer(designRulesFromList); if (j >= 0) { designRulesToModel.clear(); int count = 0; for(int i=0; i<designRulesValidLayers.length; i++) { if (!designRulesValidLayers[i]) continue; int dindex = drRules.getRuleIndex(j, i); String line = drMakeToListLine(dindex, i, onlyvalid); if (line.length() == 0) continue; designRulesToModel.addElement(line); count++; } if (count > 0) designRulesToList.setSelectedIndex(0); } // show minimum layer size Layer layer = curTech.getLayer(j); DRCTemplate lr = drRules.getMinValue(layer, DRCTemplate.DRCRuleType.MINWID); if (lr != null) { drLayerWidth.setText(TextUtils.formatDistance(lr.getValue(0))); drLayerWidthRule.setText(lr.ruleName); } else { drLayerWidth.setText(""); drLayerWidthRule.setText(""); } // Show min area lr = drRules.getMinValue(layer, DRCTemplate.DRCRuleType.MINAREA); if (lr != null) { drLayerArea.setText(TextUtils.formatDouble(lr.getValue(0))); drLayerAreaRule.setText(lr.ruleName); } else { drLayerArea.setText(""); drLayerAreaRule.setText(""); } // Show min enclosure area lr = drRules.getMinValue(layer, DRCTemplate.DRCRuleType.MINENCLOSEDAREA); if (lr != null) { drLayerEnclosure.setText(TextUtils.formatDistance(lr.getValue(0))); drLayerEAreaRule.setText(lr.ruleName); } else { drLayerEnclosure.setText(""); drLayerEAreaRule.setText(""); } designRulesUpdating = false; designRulesShowSelectedLayerRules(); } /** * Method called when the user clicks in the "to layer" list. */ private void designRulesShowSelectedLayerRules() { if (designRulesUpdating) return; // show layer information designRulesUpdating = true; drNormalConnected.setText(""); drNormalConnectedRule.setText(""); drNormalUnconnected.setText(""); drNormalUnconnectedRule.setText(""); drMultiUnconnected.setText(""); drMultiUnconnectedRule.setText(""); drNormalEdge.setText(""); drNormalEdgeRule.setText(""); int dindex = getLayerFromToIndex(); if (dindex != -1) { // double wideLimit = 0; List<DRCTemplate> spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, false); for (DRCTemplate tmp : spacingRules) { if (tmp.ruleType == DRCTemplate.DRCRuleType.CONSPA) { drNormalConnected.setText(TextUtils.formatDistance(tmp.getValue(0))); drNormalConnectedRule.setText(tmp.ruleName); } else if (tmp.ruleType == DRCTemplate.DRCRuleType.UCONSPA) { drNormalUnconnected.setText(TextUtils.formatDistance(tmp.getValue(0))); drNormalUnconnectedRule.setText(tmp.ruleName); } // if (tmp.maxWidth > 0) wideLimit = tmp.maxWidth; } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, true); Collections.sort(spacingRules, DRCTemplate.templateSort); wideSpacingRules = new ArrayList<DRCTemplate>(); drSpacingsList.removeAllItems(); // Not iterator otherwise the order is lost for (DRCTemplate tmp : spacingRules) { if (tmp.ruleType != DRCTemplate.DRCRuleType.UCONSPA) continue; wideSpacingRules.add(tmp); drSpacingsList.addItem("Rule " + wideSpacingRules.size()); } // To stop the update of blank information designRulesUpdating = true; drWidths.setText(""); drLengths.setText(""); drSpacingsRule.setText(""); drSpacings.setText(""); designRulesUpdating = false; if (wideSpacingRules.size() != 0) drSpacingsList.setSelectedIndex(0); spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.UCONSPA2D, false); assert(spacingRules.size() <= 1); if (spacingRules.size() == 1) { DRCTemplate cutTmp = spacingRules.get(0); drMultiUnconnected.setText(TextUtils.formatDistance(cutTmp.getValue(0))); drMultiUnconnectedRule.setText(cutTmp.ruleName); } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACINGE, false); for (DRCTemplate tmp : spacingRules) { // Any is fine drNormalEdge.setText(TextUtils.formatDistance(tmp.getValue(0))); drNormalEdgeRule.setText(tmp.ruleName); } drAddRule.setEnabled(drRules.doesAllowMultipleWideRules(dindex)); } designRulesUpdating = false; } private int designRulesGetSelectedLayer(JList theList) { int lineNo = theList.getSelectedIndex(); if (lineNo < 0) return -1; String lName = (String)theList.getSelectedValue(); int termPos = lName.indexOf(" ("); if (termPos >= 0) lName = lName.substring(0, termPos); for(int layer=0; layer<designRulesValidLayers.length; layer++) if (lName.equals(curTech.getLayer(layer).getName())) return layer; return -1; } private String drMakeToListLine(int dindex, int lindex, boolean onlyValid) { boolean gotRule = false; List<DRCTemplate> spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, false); for (DRCTemplate tmp : spacingRules) { if (tmp.getValue(0) > 0) gotRule = true; } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, true); for (DRCTemplate tmp : spacingRules) { if (tmp.getValue(0) > 0) gotRule = true; } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.UCONSPA2D, false); assert(spacingRules.size() <= 1); for (DRCTemplate tmp : spacingRules) { if (tmp.getValue(0) > 0) gotRule = true; } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACINGE, false); for (DRCTemplate tmp : spacingRules) { if (tmp.getValue(0) > 0) gotRule = true; } if (onlyValid && !gotRule) return ""; return curTech.getLayer(lindex).getName(); } /** * Method called when the "OK" panel is hit. * Updates any changed fields in the Design Rules tab. */ // public void term() // { // // Getting last changes // designRulesEditChanged(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. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; bottom = new javax.swing.JPanel(); drMultiUnconnectedRule = new javax.swing.JTextField(); drMultiUnconnected = new javax.swing.JTextField(); drNormalEdgeRule = new javax.swing.JTextField(); drNormalEdge = new javax.swing.JTextField(); drNormalUnconnected = new javax.swing.JTextField(); drNormalConnectedRule = new javax.swing.JTextField(); drNormalConnected = new javax.swing.JTextField(); multiCutNameLabel = new javax.swing.JLabel(); drNormalEdgeLabel = new javax.swing.JLabel(); drNormalUnconnectedLabel = new javax.swing.JLabel(); drNormalConnectedLabel = new javax.swing.JLabel(); normalRuleLabel = new javax.swing.JLabel(); normalValueLabel = new javax.swing.JLabel(); normalNameLabel = new javax.swing.JLabel(); drToList = new javax.swing.JScrollPane(); drShowOnlyLinesWithRules = new javax.swing.JCheckBox(); drFromList = new javax.swing.JScrollPane(); jLabel1 = new javax.swing.JLabel(); toLabel = new javax.swing.JLabel(); drWidths = new javax.swing.JTextField(); drLengths = new javax.swing.JTextField(); drSpacings = new javax.swing.JTextField(); drSpacingsRule = new javax.swing.JTextField(); drLengthsLabel = new javax.swing.JLabel(); drWidthsLabel = new javax.swing.JLabel(); drSpacingsList = new javax.swing.JComboBox(); multiSeparator = new javax.swing.JSeparator(); wideSeparator = new javax.swing.JSeparator(); drLayerWLabel = new javax.swing.JLabel(); drLayerWidth = new javax.swing.JTextField(); drLayerWidthRule = new javax.swing.JTextField(); wideNameLabel = new javax.swing.JLabel(); wideValueLabel = new javax.swing.JLabel(); wideRuleLabel = new javax.swing.JLabel(); multiCutValueLabel = new javax.swing.JLabel(); multiCutRuleLabel = new javax.swing.JLabel(); drAddRule = new javax.swing.JButton(); drDeleteRule = new javax.swing.JButton(); drLayerALabel = new javax.swing.JLabel(); drLayerAreaRule = new javax.swing.JTextField(); ruleLabel = new javax.swing.JLabel(); drLayerArea = new javax.swing.JTextField(); normalSeparator = new javax.swing.JSeparator(); valueLabel = new javax.swing.JLabel(); drLayerEALabel = new javax.swing.JLabel(); drLayerEAreaRule = new javax.swing.JTextField(); drLayerEnclosure = new javax.swing.JTextField(); drNormalUnconnectedRule = new javax.swing.JTextField(); top = new javax.swing.JPanel(); drNodeList = new javax.swing.JScrollPane(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel(); drNodeWidth = new javax.swing.JTextField(); drNodeRule = new javax.swing.JTextField(); drNodeHeight = new javax.swing.JTextField(); setLayout(new java.awt.GridBagLayout()); setAlignmentX(0.0F); setAlignmentY(0.0F); setMinimumSize(new java.awt.Dimension(359, 556)); setPreferredSize(new java.awt.Dimension(359, 556)); bottom.setLayout(new java.awt.GridBagLayout()); bottom.setBorder(javax.swing.BorderFactory.createTitledBorder("Layer Rules")); bottom.setPreferredSize(new java.awt.Dimension(359, 452)); drMultiUnconnectedRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 18; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(0, 0, 4, 4); bottom.add(drMultiUnconnectedRule, gridBagConstraints); drMultiUnconnected.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 18; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0); bottom.add(drMultiUnconnected, gridBagConstraints); drNormalEdgeRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 9; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(0, 0, 4, 4); bottom.add(drNormalEdgeRule, gridBagConstraints); drNormalEdge.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 9; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0); bottom.add(drNormalEdge, gridBagConstraints); drNormalUnconnected.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 8; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); bottom.add(drNormalUnconnected, gridBagConstraints); drNormalConnectedRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(4, 0, 0, 4); bottom.add(drNormalConnectedRule, gridBagConstraints); drNormalConnected.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(4, 4, 0, 0); bottom.add(drNormalConnected, gridBagConstraints); multiCutNameLabel.setText("Multiple via cuts:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 17; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(multiCutNameLabel, gridBagConstraints); drNormalEdgeLabel.setText("Edge:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 9; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(0, 14, 4, 4); bottom.add(drNormalEdgeLabel, gridBagConstraints); drNormalUnconnectedLabel.setText("Not connected:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 8; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(0, 14, 0, 4); bottom.add(drNormalUnconnectedLabel, gridBagConstraints); drNormalConnectedLabel.setText("When connected:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(4, 14, 4, 0); bottom.add(drNormalConnectedLabel, gridBagConstraints); normalRuleLabel.setText("Rule"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 6; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(normalRuleLabel, gridBagConstraints); normalValueLabel.setText("Distance"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 6; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(normalValueLabel, gridBagConstraints); normalNameLabel.setText("Normal:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(normalNameLabel, gridBagConstraints); drToList.setOpaque(false); drToList.setPreferredSize(new java.awt.Dimension(100, 200)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.gridheight = 13; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.5; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(drToList, gridBagConstraints); drShowOnlyLinesWithRules.setText("Show only \"to\" entries with rules"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(drShowOnlyLinesWithRules, gridBagConstraints); drFromList.setOpaque(false); drFromList.setPreferredSize(new java.awt.Dimension(100, 100)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridheight = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(drFromList, gridBagConstraints); jLabel1.setText("From Layer:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(jLabel1, gridBagConstraints); toLabel.setText("To Layer:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(toLabel, gridBagConstraints); drWidths.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 13; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(drWidths, gridBagConstraints); drLengths.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 14; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(drLengths, gridBagConstraints); drSpacings.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 12; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 0); bottom.add(drSpacings, gridBagConstraints); drSpacingsRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 12; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 0, 4, 4); bottom.add(drSpacingsRule, gridBagConstraints); drLengthsLabel.setText("and Length >"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 14; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(drLengthsLabel, gridBagConstraints); drWidthsLabel.setText("If Width >"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 13; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(drWidthsLabel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 12; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4); bottom.add(drSpacingsList, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 16; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 0, 4, 0); bottom.add(multiSeparator, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 10; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 0, 4, 0); bottom.add(wideSeparator, gridBagConstraints); drLayerWLabel.setText("Size:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(0, 14, 0, 0); bottom.add(drLayerWLabel, gridBagConstraints); drLayerWidth.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); bottom.add(drLayerWidth, gridBagConstraints); drLayerWidthRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4); bottom.add(drLayerWidthRule, gridBagConstraints); wideNameLabel.setText("Wide rules:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 11; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(wideNameLabel, gridBagConstraints); wideValueLabel.setText("Distance"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 11; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(wideValueLabel, gridBagConstraints); wideRuleLabel.setText("Rule"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 11; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(wideRuleLabel, gridBagConstraints); multiCutValueLabel.setText("Distance"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 17; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(multiCutValueLabel, gridBagConstraints); multiCutRuleLabel.setText("Rule"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 17; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(multiCutRuleLabel, gridBagConstraints); drAddRule.setText("Add Wide Rule"); drAddRule.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { drAddRuleActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 15; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4); bottom.add(drAddRule, gridBagConstraints); drDeleteRule.setText("Delete Wide Rule"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 15; gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4); bottom.add(drDeleteRule, gridBagConstraints); drLayerALabel.setText("Area:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(0, 14, 0, 4); bottom.add(drLayerALabel, gridBagConstraints); drLayerAreaRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4); bottom.add(drLayerAreaRule, gridBagConstraints); ruleLabel.setText("Rule"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(ruleLabel, gridBagConstraints); drLayerArea.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); bottom.add(drLayerArea, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 0, 4, 0); bottom.add(normalSeparator, gridBagConstraints); valueLabel.setText("Min. Value"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); bottom.add(valueLabel, gridBagConstraints); drLayerEALabel.setText("Enclosure Area:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 14, 0, 4); bottom.add(drLayerEALabel, gridBagConstraints); drLayerEAreaRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4); bottom.add(drLayerEAreaRule, gridBagConstraints); drLayerEnclosure.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); bottom.add(drLayerEnclosure, gridBagConstraints); drNormalUnconnectedRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 8; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4); bottom.add(drNormalUnconnectedRule, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.5; add(bottom, gridBagConstraints); top.setLayout(new java.awt.GridBagLayout()); top.setBorder(javax.swing.BorderFactory.createTitledBorder("Node Rules")); top.setAlignmentX(0.0F); top.setAlignmentY(0.0F); top.setPreferredSize(new java.awt.Dimension(167, 104)); drNodeList.setOpaque(false); drNodeList.setPreferredSize(new java.awt.Dimension(200, 100)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridheight = 6; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(drNodeList, gridBagConstraints); jLabel4.setText("Width:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(jLabel4, gridBagConstraints); jLabel5.setText("Height:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(jLabel5, gridBagConstraints); jLabel7.setText("Min. Size"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(jLabel7, gridBagConstraints); jLabel8.setText("Rule"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(jLabel8, gridBagConstraints); drNodeWidth.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.25; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(drNodeWidth, gridBagConstraints); drNodeRule.setColumns(9); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; gridBagConstraints.gridheight = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.25; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(drNodeRule, gridBagConstraints); drNodeHeight.setColumns(6); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); top.add(drNodeHeight, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.5; add(top, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents private void drAddRuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_drAddRuleActionPerformed int dindex = getLayerFromToIndex(); if (dindex == -1) return; int soFar = drSpacingsList.getItemCount(); double maxW = TextUtils.atofDistance(drWidths.getText().trim()); double minLen = TextUtils.atofDistance(drLengths.getText().trim()); double value = TextUtils.atofDistance(drSpacings.getText()); String ruleText = drSpacingsRule.getText(); if (ruleText.length() > 0 && value > 0 && (maxW > 0 || minLen > 0)) { drSpacingsList.addItem("Rule " + (soFar+1)); DRCTemplate wr = new DRCTemplate(drSpacingsRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.CONSPA, maxW, minLen, null, null, new double[]{value}, -1); drRules.addRule(dindex, wr, DRCTemplate.DRCRuleType.SPACING, true); wideSpacingRules.add(wr); // to be consistent, now adding the unconnected one wr.ruleType = DRCTemplate.DRCRuleType.UCONSPA; drRules.addRule(dindex, wr, DRCTemplate.DRCRuleType.SPACING, true); } else soFar = 0; // reset to first element ; if (wideSpacingRules.size() > 0) drSpacingsList.setSelectedIndex(soFar); drAddRule.setEnabled(drRules.doesAllowMultipleWideRules(getLayerFromToIndex())); }//GEN-LAST:event_drAddRuleActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel bottom; private javax.swing.JButton drAddRule; private javax.swing.JButton drDeleteRule; private javax.swing.JScrollPane drFromList; private javax.swing.JLabel drLayerALabel; private javax.swing.JTextField drLayerArea; private javax.swing.JTextField drLayerAreaRule; private javax.swing.JLabel drLayerEALabel; private javax.swing.JTextField drLayerEAreaRule; private javax.swing.JTextField drLayerEnclosure; private javax.swing.JLabel drLayerWLabel; private javax.swing.JTextField drLayerWidth; private javax.swing.JTextField drLayerWidthRule; private javax.swing.JTextField drLengths; private javax.swing.JLabel drLengthsLabel; private javax.swing.JTextField drMultiUnconnected; private javax.swing.JTextField drMultiUnconnectedRule; private javax.swing.JTextField drNodeHeight; private javax.swing.JScrollPane drNodeList; private javax.swing.JTextField drNodeRule; private javax.swing.JTextField drNodeWidth; private javax.swing.JTextField drNormalConnected; private javax.swing.JLabel drNormalConnectedLabel; private javax.swing.JTextField drNormalConnectedRule; private javax.swing.JTextField drNormalEdge; private javax.swing.JLabel drNormalEdgeLabel; private javax.swing.JTextField drNormalEdgeRule; private javax.swing.JTextField drNormalUnconnected; private javax.swing.JLabel drNormalUnconnectedLabel; private javax.swing.JTextField drNormalUnconnectedRule; private javax.swing.JCheckBox drShowOnlyLinesWithRules; private javax.swing.JTextField drSpacings; private javax.swing.JComboBox drSpacingsList; private javax.swing.JTextField drSpacingsRule; private javax.swing.JScrollPane drToList; private javax.swing.JTextField drWidths; private javax.swing.JLabel drWidthsLabel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel multiCutNameLabel; private javax.swing.JLabel multiCutRuleLabel; private javax.swing.JLabel multiCutValueLabel; private javax.swing.JSeparator multiSeparator; private javax.swing.JLabel normalNameLabel; private javax.swing.JLabel normalRuleLabel; private javax.swing.JSeparator normalSeparator; private javax.swing.JLabel normalValueLabel; private javax.swing.JLabel ruleLabel; private javax.swing.JLabel toLabel; private javax.swing.JPanel top; private javax.swing.JLabel valueLabel; private javax.swing.JLabel wideNameLabel; private javax.swing.JLabel wideRuleLabel; private javax.swing.JSeparator wideSeparator; private javax.swing.JLabel wideValueLabel; // End of variables declaration//GEN-END:variables }