/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: GetInfoExport.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.geometry.Poly;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.hierarchy.Export;
import com.sun.electric.database.prototype.PortCharacteristic;
import com.sun.electric.database.text.TextUtils;
import com.sun.electric.database.variable.ElectricObject;
import com.sun.electric.database.variable.Variable;
import com.sun.electric.technology.Technology;
import com.sun.electric.tool.Client;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.JobException;
import com.sun.electric.tool.user.Highlight;
import com.sun.electric.tool.user.HighlightListener;
import com.sun.electric.tool.user.Highlighter;
import com.sun.electric.tool.user.User;
import com.sun.electric.tool.user.UserInterfaceMain;
import com.sun.electric.tool.user.ui.EditWindow;
import java.awt.Frame;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JFrame;
/**
* Class to handle the "Export Get-Info" dialog.
*/
public class GetInfoExport extends EModelessDialog implements HighlightListener, DatabaseChangeListener
{
private static final long serialVersionUID = 1L;
private static GetInfoExport theDialog = null;
private Export shownExport;
private String initialName;
private String initialRefName;
private String initialCharacteristicName;
private boolean initialBodyOnly, initialAlwaysDrawn;
private TextInfoPanel textPanel;
/**
* Method to show the Export Get-Info dialog.
*/
public static void showDialog()
{
if (Client.getOperatingSystem() == Client.OS.UNIX) {
// JKG 07Apr2006:
// On Linux, if a dialog is built, closed using setVisible(false),
// and then requested again using setVisible(true), it does
// not appear on top. I've tried using toFront(), requestFocus(),
// but none of that works. Instead, I brute force it and
// rebuild the dialog from scratch each time.
if (theDialog != null) theDialog.dispose();
theDialog = null;
}
if (theDialog == null)
{
JFrame jf = null;
jf = (JFrame) Main.getCurrentJFrame();
theDialog = new GetInfoExport(jf);
}
theDialog.loadExportInfo();
if (!theDialog.isVisible())
{
theDialog.pack();
theDialog.ensureProperSize();
theDialog.setVisible(true);
}
theDialog.toFront();
}
/**
* Reloads the dialog when Highlights change
*/
public void highlightChanged(Highlighter which)
{
if (!isVisible()) return;
loadExportInfo();
}
/**
* Called when by a Highlighter when it loses focus. The argument
* is the Highlighter that has gained focus (may be null).
* @param highlighterGainedFocus the highlighter for the current window (may be null).
*/
public void highlighterLostFocus(Highlighter highlighterGainedFocus) {
if (!isVisible()) return;
loadExportInfo();
}
/**
* Respond to database changes
* @param e database change event
*/
public void databaseChanged(DatabaseChangeEvent e) {
if (!isVisible()) return;
// update dialog if we care about the changes
if (e.objectChanged(shownExport))
loadExportInfo();
}
private void loadExportInfo()
{
// update current window
EditWindow curWnd = EditWindow.getCurrent();
if (curWnd == null)
{
disableDialog();
return;
}
// must have a single export selected
Export pp = null;
int exportCount = 0;
for(Highlight h : curWnd.getHighlighter().getHighlights())
{
if (!h.isHighlightText()) continue;
if (h.getVarKey() != Export.EXPORT_NAME) continue;
ElectricObject eobj = h.getElectricObject();
if (eobj instanceof Export)
{
pp = (Export)eobj;
exportCount++;
}
}
if (exportCount > 1) pp = null;
boolean enabled = true;
if (pp == null) enabled = false;
EDialog.focusClearOnTextField(theText);
// set enabled state of dialog
theText.setEditable(enabled);
bodyOnly.setEnabled(enabled);
alwaysDrawn.setEnabled(enabled);
characteristics.setEnabled(enabled);
refName.setEditable(enabled);
if (!enabled) {
disableDialog();
return;
}
// set name
initialName = pp.getName();
theText.setText(initialName);
// set location
Poly poly = pp.getPoly();
Technology tech = curWnd.getCell().getTechnology();
centerLoc.setText("Center: (" + TextUtils.formatDistance(poly.getCenterX(), tech) + "," +
TextUtils.formatDistance(poly.getCenterY(), tech) + ")");
// set Body and Always Drawn check boxes
initialBodyOnly = pp.isBodyOnly();
bodyOnly.setSelected(initialBodyOnly);
initialAlwaysDrawn = pp.isAlwaysDrawn();
alwaysDrawn.setSelected(initialAlwaysDrawn);
// set characteristic and reference name
PortCharacteristic initialCharacteristic = pp.getCharacteristic();
initialCharacteristicName = initialCharacteristic.getName();
characteristics.setSelectedItem(initialCharacteristicName);
initialRefName = "";
if (initialCharacteristic == PortCharacteristic.REFBASE ||
initialCharacteristic == PortCharacteristic.REFIN ||
initialCharacteristic == PortCharacteristic.REFOUT)
{
Variable var = pp.getVar(Export.EXPORT_REFERENCE_NAME);
if (var != null)
initialRefName = var.describe(-1);
refName.setEditable(true);
} else
{
refName.setEditable(false);
}
refName.setText(initialRefName);
// set text info panel
textPanel.setTextDescriptor(Export.EXPORT_NAME, pp);
shownExport = pp;
EDialog.focusOnTextField(theText);
}
private void disableDialog() {
shownExport = null;
theText.setText("");
refName.setText("");
centerLoc.setText("");
textPanel.setTextDescriptor(null, null);
}
/** Creates new form Export Get-Info */
private GetInfoExport(Frame parent)
{
super(parent, false);
initComponents();
getRootPane().setDefaultButton(ok);
// make all text fields select-all when entered
EDialog.makeTextFieldSelectAllOnTab(refName);
EDialog.makeTextFieldSelectAllOnTab(theText);
// add myself as a listener for highlight changes
UserInterfaceMain.addDatabaseChangeListener(this);
Highlighter.addHighlightListener(this);
// set characteristic combo box
List<PortCharacteristic> chars = PortCharacteristic.getOrderedCharacteristics();
for(PortCharacteristic ch : chars)
{
characteristics.addItem(ch.getName());
}
// add textPanel
textPanel = new TextInfoPanel(false, false);
java.awt.GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
getContentPane().add(textPanel, gridBagConstraints);
pack();
loadExportInfo();
finishInitialization();
}
protected void escapePressed() { cancelActionPerformed(null); }
private static class ChangeExport extends Job
{
private static final long serialVersionUID = 1L;
private Export pp;
private String oldName;
private String newName;
private boolean newBodyOnly, newAlwaysDrawn;
private String newCharName;
private String newRefName;
protected ChangeExport(Export pp,
String oldName,
String newName,
boolean newBodyOnly, boolean newAlwaysDrawn,
String newCharName, String newRefName)
{
super("Modify Export", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
this.pp = pp;
this.oldName = oldName;
this.newName = newName;
this.newBodyOnly = newBodyOnly;
this.newAlwaysDrawn = newAlwaysDrawn;
this.newCharName = newCharName;
this.newRefName = newRefName;
startJob();
}
public boolean doIt() throws JobException
{
// change the name
if (!oldName.equals(newName)) pp.rename(newName);
// change the body-only
pp.setBodyOnly(newBodyOnly);
// change always drawn
pp.setAlwaysDrawn(newAlwaysDrawn);
// change the characteristic
PortCharacteristic newChar = PortCharacteristic.findCharacteristic(newCharName);
if (newChar != pp.getCharacteristic())
{
pp.setCharacteristic(newChar);
// change characteristic in all views
List<Cell> othersChanged = new ArrayList<Cell>();
Cell thisCell = pp.getParent();
for(Iterator<Cell> it = thisCell.getCellGroup().getCells(); it.hasNext(); )
{
Cell otherCell = it.next();
if (otherCell == thisCell) continue;
Export otherPP = pp.getEquivalentPort(otherCell);
if (otherPP != null)
{
if (otherPP.getCharacteristic() != newChar)
{
otherPP.setCharacteristic(newChar);
othersChanged.add(otherCell);
}
}
}
if (othersChanged.size() > 0)
{
System.out.print("Also changed the characteristic of this export in");
for(int i=0; i<othersChanged.size(); i++)
{
Cell otherCell = othersChanged.get(i);
if (i != 0) System.out.print(",");
System.out.print(" " + otherCell.describe(false));
}
System.out.println();
}
}
// change reference name
if (newChar.isReference())
pp.newVar(Export.EXPORT_REFERENCE_NAME, newRefName);
return true;
}
}
/** 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;
cancel = new javax.swing.JButton();
ok = new javax.swing.JButton();
apply = new javax.swing.JButton();
leftSide = new javax.swing.JPanel();
jLabel10 = new javax.swing.JLabel();
characteristics = new javax.swing.JComboBox();
jLabel1 = new javax.swing.JLabel();
refName = new javax.swing.JTextField();
bodyOnly = new javax.swing.JCheckBox();
alwaysDrawn = new javax.swing.JCheckBox();
centerLoc = new javax.swing.JLabel();
header = new javax.swing.JLabel();
theText = new javax.swing.JTextField();
setTitle("Export Properties");
setName(""); // NOI18N
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
closeDialog(evt);
}
});
getContentPane().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.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.weightx = 0.25;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
getContentPane().add(cancel, gridBagConstraints);
ok.setText("OK");
ok.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 3;
gridBagConstraints.weightx = 0.25;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
getContentPane().add(ok, gridBagConstraints);
apply.setText("Apply");
apply.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
applyActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.weightx = 0.25;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
getContentPane().add(apply, gridBagConstraints);
leftSide.setBorder(javax.swing.BorderFactory.createEtchedBorder());
leftSide.setLayout(new java.awt.GridBagLayout());
jLabel10.setText("Characteristics:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
leftSide.add(jLabel10, gridBagConstraints);
characteristics.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
characteristicsActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
leftSide.add(characteristics, gridBagConstraints);
jLabel1.setText("Reference name:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
leftSide.add(jLabel1, gridBagConstraints);
refName.setText(" ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
leftSide.add(refName, gridBagConstraints);
bodyOnly.setText("Body only");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 0);
leftSide.add(bodyOnly, gridBagConstraints);
alwaysDrawn.setText("Always drawn");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 0);
leftSide.add(alwaysDrawn, gridBagConstraints);
centerLoc.setText("Center:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
leftSide.add(centerLoc, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
getContentPane().add(leftSide, gridBagConstraints);
header.setText("Export name:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
getContentPane().add(header, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
getContentPane().add(theText, gridBagConstraints);
pack();
}// </editor-fold>//GEN-END:initComponents
private void characteristicsActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_characteristicsActionPerformed
{//GEN-HEADEREND:event_characteristicsActionPerformed
String stringNow = (String)characteristics.getSelectedItem();
PortCharacteristic ch = PortCharacteristic.findCharacteristic(stringNow);
refName.setEditable(ch.isReference());
}//GEN-LAST:event_characteristicsActionPerformed
private void applyActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_applyActionPerformed
{//GEN-HEADEREND:event_applyActionPerformed
if (shownExport == null) return;
// check if changes to be made
boolean changed = false;
// check name
String newName = theText.getText();
if (!newName.equals(initialName)) changed = true;
// check body only
boolean newBodyOnly = bodyOnly.isSelected();
if (newBodyOnly != initialBodyOnly) changed = true;
// check always drawn
boolean newAlwaysDrawn = alwaysDrawn.isSelected();
if (newAlwaysDrawn != initialAlwaysDrawn) changed = true;
// check characteristic
String newCharName = (String)characteristics.getSelectedItem();
if (!newCharName.equals(initialCharacteristicName)) changed = true;
// check reference name
String newRefName = refName.getText();
if (!newRefName.equals(initialRefName)) changed = true;
if (changed) {
// generate Job to change export port options
new ChangeExport(shownExport, initialName, newName, newBodyOnly, newAlwaysDrawn, newCharName, newRefName);
}
// possibly generate job to change export text options
textPanel.applyChanges(true);
initialName = newName;
initialBodyOnly = newBodyOnly;
initialAlwaysDrawn = newAlwaysDrawn;
initialCharacteristicName = newCharName;
initialRefName = newRefName;
}//GEN-LAST:event_applyActionPerformed
private void okActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_okActionPerformed
{//GEN-HEADEREND:event_okActionPerformed
applyActionPerformed(evt);
closeDialog(null);
}//GEN-LAST:event_okActionPerformed
private void cancelActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cancelActionPerformed
{//GEN-HEADEREND:event_cancelActionPerformed
closeDialog(null);
}//GEN-LAST:event_cancelActionPerformed
/** Closes the dialog */
private void closeDialog(java.awt.event.WindowEvent evt)//GEN-FIRST:event_closeDialog
{
super.closeDialog();
}//GEN-LAST:event_closeDialog
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox alwaysDrawn;
private javax.swing.JButton apply;
private javax.swing.JCheckBox bodyOnly;
private javax.swing.JButton cancel;
private javax.swing.JLabel centerLoc;
private javax.swing.JComboBox characteristics;
private javax.swing.JLabel header;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JPanel leftSide;
private javax.swing.JButton ok;
private javax.swing.JTextField refName;
private javax.swing.JTextField theText;
// End of variables declaration//GEN-END:variables
}