Java tutorial
/*<Dynamic Refactoring Plugin For Eclipse 2.0 - Plugin that allows to perform refactorings on Java code within Eclipse, as well as to dynamically create and manage new refactorings> Copyright (C) 2009 Laura Fuente De La Fuente This file is part of Foobar Foobar 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. This program 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 this program. If not, see <http://www.gnu.org/licenses/>.*/ package dynamicrefactoring.interfaz.wizard; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import dynamicrefactoring.domain.DynamicRefactoringDefinition; import dynamicrefactoring.domain.RefactoringExample; /** * Sexta pgina del asistente de creacin o edicin de refactorizaciones. * * <p> * Permite asociar hasta un mximo de dos ejemplos concretos a la * refactorizacin. Cada uno de los ejemplos vendr definido por un fichero con * el estado del sistema antes de la refactorizacin, y otro con su estado * posterior, una vez ejecutada. * </p> * * <p> * Los ficheros aceptados pueden ser ficheros de texto <code>.TXT</code> o * directamente ficheros fuente Java. * </p> * * @author <A HREF="mailto:lfd0002@alu.ubu.es">Laura Fuente de la Fuente</A> * @author <A HREF="mailto:sfd0009@alu.ubu.es">Sonia Fuente de la Fuente</A> * @author <A HREF="mailto:ehp0001@alu.ubu.es">Enrique Herrero Paredes</A> */ public class RefactoringWizardPage6 extends WizardPage { /** * Campo de texto con la ruta del fichero que contiene el estado del primer * ejemplo antes de la refactorizacin. */ private Text textBefore1; /** * Campo de texto con la ruta del fichero que contiene el estado del primer * ejemplo despus de la refactorizacin. */ private Text textAfter1; /** * Campo de texto con la ruta del fichero que contiene el estado del segundo * ejemplo antes de la refactorizacin. */ private Text textBefore2; /** * Campo de texto con la ruta del fichero que contiene el estado del segundo * ejemplo despus de la refactorizacin. */ private Text textAfter2; /** * Refactorizacin configurada a travs del asistente y que debe ser creada * finalmente (si se trata de una nueva refactorizacin) o modificada (si se * est editando una ya existente). */ private DynamicRefactoringDefinition refactoring = null; /** * ltima ruta en la que se seleccion un archivo de ejemplo. */ private String lastSelectionPath = null; /** * Model. */ private RefactoringExampleModel model; /** * Constructor. * * @param refactoring * refactorizacin que se est editando o <code>null * </code> si se est creando una nueva. */ public RefactoringWizardPage6(DynamicRefactoringDefinition refactoring) { super("Wizard page"); //$NON-NLS-1$ setDescription(Messages.RefactoringWizardPage6_DescriptionInputElementsExamples); this.refactoring = refactoring; } /** * Hace visible o invisible la pgina del asistente. * * @param visible * si la pgina se debe hacer visible o no. */ @Override public void setVisible(boolean visible) { if (visible) { Object[] messageArgs = { ((RefactoringWizard) getWizard()).getOperationAsString() }; MessageFormat formatter = new MessageFormat(""); //$NON-NLS-1$ formatter.applyPattern(Messages.RefactoringWizardPage6_DynamicRefactoring); setTitle(formatter.format(messageArgs) + " (" + //$NON-NLS-1$ Messages.RefactoringWizardPage6_Step + ")"); //$NON-NLS-1$ } super.setVisible(visible); } /** * Crea el contenido de la pgina del asistente. * * @param parent * el elemento padre de esta pgina del asistente. */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); container.setLayout(new FormLayout()); setControl(container); final Composite composite = new Composite(container, SWT.NONE); final FormData fd_composite = new FormData(); fd_composite.left = new FormAttachment(0, 5); fd_composite.top = new FormAttachment(0, 5); fd_composite.bottom = new FormAttachment(100, -5); fd_composite.right = new FormAttachment(100, -5); composite.setLayoutData(fd_composite); final Label itsPossibleToLabel = new Label(composite, SWT.NONE); itsPossibleToLabel.setText(Messages.RefactoringWizardPage6_AddExamples); itsPossibleToLabel.setBounds(106, 26, 431, 13); final Group example1Group = new Group(composite, SWT.NONE); example1Group.setText(Messages.RefactoringWizardPage6_Example1); example1Group.setBounds(23, 55, 602, 117); final Label beforeRefactoringLabel = new Label(example1Group, SWT.NONE); beforeRefactoringLabel.setText(Messages.RefactoringWizardPage6_BeforeRefactoring); beforeRefactoringLabel.setBounds(10, 29, 116, 13); final Label afterRefactoringLabel = new Label(example1Group, SWT.NONE); afterRefactoringLabel.setText(Messages.RefactoringWizardPage6_AfterRefactoring); afterRefactoringLabel.setBounds(10, 75, 116, 13); textBefore1 = new Text(example1Group, SWT.BORDER); textBefore1.setBounds(132, 26, 420, 25); textBefore1.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); final Button bt_examineBefore1 = new Button(example1Group, SWT.NONE); bt_examineBefore1.setText("..."); //$NON-NLS-1$ bt_examineBefore1.setBounds(558, 29, 30, 18); bt_examineBefore1.addSelectionListener(new ExampleChooserAction(textBefore1)); textAfter1 = new Text(example1Group, SWT.BORDER); textAfter1.setBounds(132, 72, 420, 25); textAfter1.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); final Button btExamineAfter1 = new Button(example1Group, SWT.NONE); btExamineAfter1.setText("..."); //$NON-NLS-1$ btExamineAfter1.setBounds(558, 75, 30, 18); btExamineAfter1.addSelectionListener(new ExampleChooserAction(textAfter1)); final Group example1Group_1 = new Group(composite, SWT.NONE); example1Group_1.setBounds(23, 195, 602, 117); example1Group_1.setText(Messages.RefactoringWizardPage6_Example2); final Label beforeRefactoringLabel_1 = new Label(example1Group_1, SWT.NONE); beforeRefactoringLabel_1.setBounds(10, 29, 118, 13); beforeRefactoringLabel_1.setText(Messages.RefactoringWizardPage6_BeforeRefactoring); final Label afterRefactoringLabel_1 = new Label(example1Group_1, SWT.NONE); afterRefactoringLabel_1.setBounds(10, 75, 118, 13); afterRefactoringLabel_1.setText(Messages.RefactoringWizardPage6_AfterRefactoring); textBefore2 = new Text(example1Group_1, SWT.BORDER); textBefore2.setBounds(134, 26, 418, 25); textBefore2.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); final Button bt_examineBefore2 = new Button(example1Group_1, SWT.NONE); bt_examineBefore2.setBounds(558, 29, 30, 18); bt_examineBefore2.setText("..."); //$NON-NLS-1$ bt_examineBefore2.addSelectionListener(new ExampleChooserAction(textBefore2)); textAfter2 = new Text(example1Group_1, SWT.BORDER); textAfter2.setBounds(134, 72, 418, 25); textAfter2.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); final Button bt_examineAfter2 = new Button(example1Group_1, SWT.NONE); bt_examineAfter2.setBounds(558, 75, 30, 18); bt_examineAfter2.setText("..."); //$NON-NLS-1$ bt_examineAfter2.addSelectionListener(new ExampleChooserAction(textAfter2)); model = new RefactoringExampleModel(); DataBindingContext dbc = new DataBindingContext(); dbc.bindValue(SWTObservables.observeText(textBefore1, SWT.Modify), BeansObservables.observeValue(model, "beforeExample1"), null, null); dbc.bindValue(SWTObservables.observeText(textBefore2, SWT.Modify), BeansObservables.observeValue(model, "beforeExample2"), null, null); dbc.bindValue(SWTObservables.observeText(textAfter1, SWT.Modify), BeansObservables.observeValue(model, "afterExample1"), null, null); dbc.bindValue(SWTObservables.observeText(textAfter2, SWT.Modify), BeansObservables.observeValue(model, "afterExample2"), null, null); if (refactoring != null) { fillInRefactoringData(); if (refactoring.getExamplesAbsolutePath().size() > 0) { model.setBeforeExample1(refactoring.getExamplesAbsolutePath().get(0).getBefore()); model.setAfterExample1(refactoring.getExamplesAbsolutePath().get(0).getAfter()); } if (refactoring.getExamplesAbsolutePath().size() > 1) { model.setBeforeExample2(refactoring.getExamplesAbsolutePath().get(1).getBefore()); model.setAfterExample2(refactoring.getExamplesAbsolutePath().get(1).getAfter()); } } } /** * Puebla los campos del formulario del asistente con la informacin que se * pueda obtener de la refactorizacin existente que se est editando. */ private void fillInRefactoringData() { if (refactoring.getExamples() != null) { List<RefactoringExample> examples = refactoring.getExamples(); // Se intentan cargar los datos del primer ejemplo. if (examples.size() > 0) { textBefore1.setText(new File(examples.get(0).getBefore()).getName()); textAfter1.setText(new File(examples.get(0).getAfter()).getName()); } // Se intentan cargar los datos del segundo ejemplo. if (examples.size() > 1) { textBefore2.setText(new File(examples.get(1).getBefore()).getName()); textAfter2.setText(new File(examples.get(1).getAfter()).getName()); } dialogChanged(); } } /** * Obtiene los ejemplos asociados a la refactorizacin. * * @return una lista de arrays de cadenas en que cada array contiene dos * cadenas: una con la ruta del fichero que contiene el estado del * ejemplo antes de la refactorizacin, y otra con la ruta del * fichero que contiene el estado del ejemplo despus de la * refactorizacin. */ public List<RefactoringExample> getExamples() { List<RefactoringExample> examples = new ArrayList<RefactoringExample>(); if (!textBefore1.getText().trim().isEmpty() && !textAfter1.getText().trim().isEmpty()) { //$NON-NLS-1$ //$NON-NLS-2$ examples.add(new RefactoringExample(model.getBeforeExample1().trim(), model.getAfterExample1().trim())); } if (!textBefore2.getText().trim().isEmpty() && !textAfter2.getText().trim().isEmpty()) { //$NON-NLS-1$ //$NON-NLS-2$ examples.add(new RefactoringExample(model.getBeforeExample2().trim(), model.getAfterExample2().trim())); } return examples; } /** * Se asegura de que ambos ejemplos estn completos o vacos, es decir, no * se admite la asociacin de solo uno de los dos ficheros que componen el * ejemplo. */ private void dialogChanged() { if (isNotValidString(textBefore1) || isNotValidString(textAfter1) || isNotValidString(textBefore2) || isNotValidString(textAfter2)) { updateStatus(Messages.RefactoringWizardPage6_MustBeType); return; } if ((textBefore1.getText() != "" && textAfter1.getText() == "") || //$NON-NLS-1$ //$NON-NLS-2$ (textBefore1.getText() == "" && textAfter1.getText() != "")) { //$NON-NLS-1$ //$NON-NLS-2$ updateStatus(Messages.RefactoringWizardPage6_FirstIncomplete); return; } if ((textBefore2.getText() != "" && textAfter2.getText() == "") || //$NON-NLS-1$ //$NON-NLS-2$ (textBefore2.getText() == "" && textAfter2.getText() != "")) { //$NON-NLS-1$ //$NON-NLS-2$ updateStatus(Messages.RefactoringWizardPage6_SecondIncomplete); return; } updateStatus(null); } /** * Comprueba si un campo de texto no vaco contiene una cadena terminada en * la extensin <i>.txt</i> o <i>.java</i>. * * @param field * campo de texto cuyo contenido se debe verificar. * * @return <code>true</code> si el campo de texto no est vaco y su * contenido no termina en la extensin <i>.txt</i> ni <i>.java</i>, * o est vaco. <code>false</code> si tiene contenido y termina en * una de dichas extensiones. */ private boolean isNotValidString(Text field) { return (!field.getText().isEmpty()) && //$NON-NLS-1$ !(field.getText().toLowerCase().endsWith(".txt") || //$NON-NLS-1$ field.getText().toLowerCase().endsWith(".java")); //$NON-NLS-1$ } /** * Actualiza el estado de la pantalla de dilogo del asistente. * * @param message * mensaje asociado al estado actual de la pantalla. */ private void updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null); } /** * Implementa el proceso de eleccin de uno de los ficheros de texto o Java * con el estado del modelo de uno de los ejemplos. * * @author <A HREF="mailto:sfd0009@alu.ubu.es">Sonia Fuente de la Fuente</A> * @author <A HREF="mailto:ehp0001@alu.ubu.es">Enrique Herrero Paredes</A> */ private class ExampleChooserAction implements SelectionListener { /** * Plantillas con alguna de las cuales debern conformar los ficheros * para poder pasar el filtro y poder ser seleccionados. */ private final String[] extensions = { "*.java", "*.txt" }; //$NON-NLS-1$ //$NON-NLS-2$ /** * Descripciones breves de las plantillas en {@link #extensions}. */ private final String[] descriptions = { Messages.RefactoringWizardPage6_JavaFile, Messages.RefactoringWizardPage6_TextFile }; /** * Campo de texto en que se guardar la ruta del fichero seleccionado. */ private Text textField; /** * Constructor. * <p> * * @param textField * campo de texto en que se guardar la ruta del fichero * seleccionado. */ public ExampleChooserAction(Text textField) { super(); this.textField = textField; } /** * Recibe una notificacin de que se ha pulsado el botn que permite * seleccionar un fichero de ejemplo asociado a la refactorizacin. * * <p> * Abre una ventana de seleccin de fichero con un filtro que permite * seleccionar solamente ficheros Java con extensin <i>.java</i> o * ficheros de texto con extensin <i>.txt</i>. * </p> * * @param e * el evento de seleccin disparado. * * @see SelectionListener#widgetSelected(SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { FileDialog chooser = new FileDialog(getShell(), SWT.OPEN); chooser.setText(Messages.RefactoringWizardPage6_SelectFile); chooser.setFilterExtensions(extensions); chooser.setFilterNames(descriptions); String openingPath = null; if (lastSelectionPath == null) openingPath = Platform.getLocation().toOSString() + File.separatorChar + ".."; //$NON-NLS-1$ //$NON-NLS-2$ else openingPath = lastSelectionPath; chooser.setFilterPath(openingPath); String returnVal = chooser.open(); if (returnVal != null) { textField.setText(returnVal); lastSelectionPath = returnVal.substring(0, returnVal.lastIndexOf(File.separatorChar)); //$NON-NLS-1$ dialogChanged(); } } /** * Recibe notificaciones cuando el elemento observado ha sido seleccionado * por defecto. * * @param e evento de seleccin disparado en la interfaz. * * @see SelectionListener#widgetDefaultSelected(SelectionEvent) */ @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } } /** * Modelo de los ejemplos de las refactorizaciones. * */ public static class RefactoringExampleModel { /** * Ejemplo 1, antes. */ private String beforeExample1; /** * Ejemplo 1, despus. */ private String afterExample1; /** * Ejemplo 2, antes. */ private String beforeExample2; /** * Ejemplo 3, despus. */ private String afterExample2; /** * Establece el antes del ejemplo1. * * @see #getBeforeExample1 * * @param beforeExample1 * the beforeExample1 to set */ public void setBeforeExample1(String beforeExample1) { this.beforeExample1 = beforeExample1; } /** * Obtiene el antes del ejemplo 1. * * @return the beforeExample1 */ public String getBeforeExample1() { return beforeExample1; } /** * Establece el despus del ejemplo1. * * @param afterExample1 * the afterExample1 to set */ public void setAfterExample1(String afterExample1) { this.afterExample1 = afterExample1; } /** * Obtiene el despus del ejemplo1. * * @return the afterExample1 */ public String getAfterExample1() { return afterExample1; } /** * Establece el antes del ejemplo 2. * * @param beforeExample2 * the beforeExample2 to set */ public void setBeforeExample2(String beforeExample2) { this.beforeExample2 = beforeExample2; } /** * Obtiene el antes del ejemplo 2. * * @return the beforeExample2 */ public String getBeforeExample2() { return beforeExample2; } /** * Establece el despus del ejemplo 2. * * @param afterExample2 * the afterExample2 to set */ public void setAfterExample2(String afterExample2) { this.afterExample2 = afterExample2; } /** * Obtiene el despus del ejemplo 2. * * @return the afterExample2 */ public String getAfterExample2() { return afterExample2; } /** * Permite hacer databinding de las modificaciones en los campos de los * ejemplos. */ private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); /** * Agrega un listener de cambios en los campos. * * @param propertyName * nombre de la propiedad * @param listener * observador */ public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(propertyName, listener); } /** * Elimina un listener de cambios en los campos. * * @param propertyName * nombre de la propiedad * @param listener * observador */ public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(propertyName, listener); } } }