001: /* ====================================================================
002: * The JRefactory License, Version 1.0
003: *
004: * Copyright (c) 2001 JRefactory. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by the
021: * JRefactory (http://www.sourceforge.org/projects/jrefactory)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "JRefactory" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please contact seguin@acm.org.
028: *
029: * 5. Products derived from this software may not be called "JRefactory",
030: * nor may "JRefactory" appear in their name, without prior written
031: * permission of Chris Seguin.
032: *
033: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
034: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
035: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
036: * DISCLAIMED. IN NO EVENT SHALL THE CHRIS SEGUIN OR
037: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
038: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
039: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
040: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
041: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
042: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
043: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
044: * SUCH DAMAGE.
045: * ====================================================================
046: *
047: * This software consists of voluntary contributions made by many
048: * individuals on behalf of JRefactory. For more information on
049: * JRefactory, please see
050: * <http://www.sourceforge.org/projects/jrefactory>.
051: */
052: package org.acm.seguin.uml.refactor;
053:
054: import java.awt.Dimension;
055: import java.awt.GridBagConstraints;
056: import java.awt.GridBagLayout;
057: import java.awt.event.ActionEvent;
058: import java.awt.event.ActionListener;
059: import java.io.File;
060: import java.io.IOException;
061: import javax.swing.*;
062: import org.acm.seguin.awt.ExceptionPrinter;
063: import org.acm.seguin.refactor.RefactoringException;
064: import org.acm.seguin.refactor.RefactoringFactory;
065: import org.acm.seguin.refactor.type.MoveClass;
066: import org.acm.seguin.summary.*;
067: import org.acm.seguin.uml.UMLPackage;
068: import org.acm.seguin.uml.loader.ReloaderSingleton;
069:
070: /**
071: * Creates a dialog box to prompt for the new package name
072: *
073: *@author Chris Seguin
074: *@created September 12, 2001
075: */
076: public class NewPackageDialog extends JDialog implements ActionListener {
077: // Instance Variables
078: private JComboBox packageName;
079: private TypeSummary[] typeArray;
080:
081: /**
082: * Constructor for NewPackageDialog
083: *
084: *@param initTypes Description of Parameter
085: */
086: public NewPackageDialog(TypeSummary initTypes[]) {
087: super ();
088:
089: typeArray = initTypes;
090:
091: // Set the window size and layout
092: setTitle("Move class to new package");
093: GridBagLayout gridbag = new GridBagLayout();
094: getContentPane().setLayout(gridbag);
095: setSize(310, 150);
096:
097: // Add components
098: PackageList packageList = new PackageList();
099: packageName = packageList.add(this );
100:
101: JButton okButton = new JButton("OK");
102: GridBagConstraints gbc = new GridBagConstraints();
103: gbc.gridx = 2;
104: gbc.gridy = 2;
105: gbc.gridwidth = 1;
106: gbc.gridheight = 1;
107: gridbag.setConstraints(okButton, gbc);
108: okButton.addActionListener(this );
109: getContentPane().add(okButton);
110:
111: JButton cancelButton = new JButton("Cancel");
112: gbc = new GridBagConstraints();
113: gbc.gridx = 3;
114: gbc.gridy = 2;
115: gbc.gridwidth = 1;
116: gbc.gridheight = 1;
117: gridbag.setConstraints(cancelButton, gbc);
118: cancelButton.addActionListener(this );
119: getContentPane().add(cancelButton);
120:
121: JPanel blank = new JPanel();
122: gbc.gridx = 1;
123: gbc.gridy = 3;
124: gbc.gridwidth = 3;
125: Dimension blankDim = new Dimension(50, cancelButton
126: .getPreferredSize().height * 4);
127: blank.setMinimumSize(blankDim);
128: blank.setPreferredSize(blankDim);
129: getContentPane().add(blank, gbc);
130:
131: pack();
132:
133: org.acm.seguin.awt.CenterDialog.center(this );
134: }
135:
136: /**
137: * Respond to a button press
138: *
139: *@param evt the action event
140: */
141: public void actionPerformed(ActionEvent evt) {
142: if (evt.getActionCommand().equals("OK")) {
143: dispose();
144: String result = (String) packageName.getSelectedItem();
145: if (result.startsWith("<")) {
146: result = "";
147: }
148: repackage(result);
149: } else if (evt.getActionCommand().equals("Cancel")) {
150: dispose();
151: }
152: }
153:
154: /**
155: * Repackage the files
156: *
157: *@param destinationPackage the new package name
158: */
159: public void repackage(String destinationPackage) {
160: // Create the move class
161: MoveClass moveClass = RefactoringFactory.get().moveClass();
162:
163: // Set the destination package
164: moveClass.setDestinationPackage(destinationPackage);
165:
166: // Get the files
167: String parentDir = null;
168: for (int ndx = 0; ndx < typeArray.length; ndx++) {
169: parentDir = addType(typeArray[ndx], moveClass);
170: }
171:
172: // Run it
173: try {
174: moveClass.run();
175: } catch (RefactoringException re) {
176: JOptionPane.showMessageDialog(null, re.getMessage(),
177: "Refactoring Exception", JOptionPane.ERROR_MESSAGE);
178: }
179:
180: ReloaderSingleton.reload();
181: }
182:
183: /**
184: * Adds a type to the refactoring
185: *
186: *@param moveClass the refactoring
187: *@param type The feature to be added to the Type attribute
188: *@return Description of the Returned Value
189: */
190: private String addType(TypeSummary type, MoveClass moveClass) {
191: String parentDir = null;
192:
193: FileSummary parent = (FileSummary) type.getParent();
194: File file = parent.getFile();
195: if (file == null) {
196: return null;
197: }
198:
199: try {
200: String canonicalPath = file.getCanonicalPath();
201: parentDir = (new File(canonicalPath)).getParent();
202: } catch (IOException ioe) {
203: ExceptionPrinter.print(ioe, false);
204: }
205:
206: moveClass.setDirectory(parentDir);
207: moveClass.add(file.getName());
208:
209: return parentDir;
210: }
211: }
|