// $Id: SourcePathDialog.java 13667 2007-10-11 04:58:45Z tfmorris $
// Copyright (c) 1996-2007 The Regents of the University of California. All
// Rights Reserved. Permission to use, copy, modify, and distribute this
// software and its documentation without fee, and without a written
// agreement is hereby granted, provided that the above copyright notice
// and this paragraph appear in all copies. This software program and
// documentation are copyrighted by The Regents of the University of
// California. The software program and documentation are supplied "AS
// IS", without any accompanying services from The Regents. The Regents
// does not warrant that the operation of the program will be
// uninterrupted or error-free. The end-user understands that the program
// was developed for research purposes and is advised not to rely
// exclusively on the program for any reason. IN NO EVENT SHALL THE
// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
package org.argouml.uml.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableColumn;
import org.argouml.i18n.Translator;
import org.argouml.util.ArgoDialog;
/**
* This dialog appears when selecting
* <code>Generation -> Settings for Generate for Project...</code>
* in the menu.<p>
*
* Provides support for setting a source path tagged value used in Java
* round trip engineering.
*/
public class SourcePathDialog extends ArgoDialog implements ActionListener {
private SourcePathController srcPathCtrl = new SourcePathControllerImpl();
private SourcePathTableModel srcPathTableModel =
srcPathCtrl.getSourcePathSettings();
private JTable srcPathTable;
private JButton delButton;
private ListSelectionModel rowSM;
/**
* The constructor.
*
*/
public SourcePathDialog() {
super(
Translator.localize("action.generate-code-for-project"),
ArgoDialog.OK_CANCEL_OPTION,
true);
srcPathTable = new JTable();
srcPathTable.setModel(srcPathTableModel);
srcPathTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
// Hack: don't show first column, where the model element object is
// placed.
TableColumn elemCol = srcPathTable.getColumnModel().getColumn(0);
elemCol.setMinWidth(0);
elemCol.setMaxWidth(0);
delButton = new JButton(Translator.localize("button.delete"));
delButton.setEnabled(false);
addButton(delButton, 0);
rowSM = srcPathTable.getSelectionModel();
rowSM.addListSelectionListener(new SelectionListener());
delButton.addActionListener(this);
setContent(new JScrollPane(srcPathTable));
}
////////////////////////////////////////////////////////////////
// event handlers
/*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
super.actionPerformed(e);
// OK Button ------------------------------------------
if (e.getSource() == getOkButton()) {
buttonOkActionPerformed();
}
// Delete Button
if (e.getSource() == delButton) {
deleteSelectedSettings();
}
}
/**
* The OK button is pressed.
*/
private void buttonOkActionPerformed() {
srcPathCtrl.setSourcePath(srcPathTableModel);
}
/**
* Retrieve the selected rows indexes.
*/
private int[] getSelectedIndexes() {
int firstSelectedRow = rowSM.getMinSelectionIndex();
int lastSelectedRow = rowSM.getMaxSelectionIndex();
LinkedList selectedIndexesList = new LinkedList();
int numSelectedRows = 0;
for (int i = firstSelectedRow; i <= lastSelectedRow; i++) {
if (rowSM.isSelectedIndex(i)) {
numSelectedRows++;
selectedIndexesList.add(Integer.valueOf(i));
}
}
int[] indexes = new int[selectedIndexesList.size()];
java.util.Iterator it = selectedIndexesList.iterator();
for (int i = 0; i < indexes.length && it.hasNext(); i++) {
indexes[i] = ((Integer) it.next()).intValue();
}
return indexes;
}
/**
* Delete the source path settings of the selected table rows.
*/
private void deleteSelectedSettings() {
// find selected rows and make a list of the model elements
// that are selected
int[] selectedIndexes = getSelectedIndexes();
// confirm with the user that he wants to delete, presenting the
// list of settings to delete
StringBuffer msg = new StringBuffer();
msg.append(Translator.localize("dialog.source-path-del.question"));
for (int i = 0; i < selectedIndexes.length; i++) {
msg.append("\n");
msg.append(srcPathTableModel.getMEName(selectedIndexes[i]));
msg.append(" (");
msg.append(srcPathTableModel.getMEType(selectedIndexes[i]));
msg.append(")");
}
int res = JOptionPane.showConfirmDialog(this,
msg.toString(),
Translator.localize("dialog.title.source-path-del"),
JOptionPane.OK_CANCEL_OPTION);
if (res == JOptionPane.OK_OPTION) {
// procede with the deletion in the model
int firstSel = rowSM.getMinSelectionIndex();
for (int i = 0; i < selectedIndexes.length && firstSel != -1; i++) {
srcPathCtrl.deleteSourcePath(srcPathTableModel
.getModelElement(firstSel));
srcPathTableModel.removeRow(firstSel);
firstSel = rowSM.getMinSelectionIndex();
}
// disable the button since no row will be selected now
delButton.setEnabled(false);
}
}
/**
* Class that listens to selection events.
*/
class SelectionListener implements ListSelectionListener {
public void valueChanged(javax.swing.event.ListSelectionEvent e) {
if (!delButton.isEnabled()) {
delButton.setEnabled(true);
}
}
}
} /* end class SourcePathDialog */