diff --git a/AppThinker/src/ArgumentsPropertiesWindow.java b/AppThinker/src/ArgumentsPropertiesWindow.java index 742679e..7d719b5 100644 --- a/AppThinker/src/ArgumentsPropertiesWindow.java +++ b/AppThinker/src/ArgumentsPropertiesWindow.java @@ -13,7 +13,7 @@ import java.util.Vector; * Classe permettant la création de fenêtres pour la modification des arguments d'une méthode d'une classe. * @author V.BOULANGER */ -public class ArgumentsPropertiesWindow extends JFrame { +public class ArgumentsPropertiesWindow extends JDialog { private UmlDiagram _umlDiagram; private Method _method; @@ -30,11 +30,12 @@ public class ArgumentsPropertiesWindow extends JFrame { //Paramétrage de la fenêtre this.setTitle("Edit arguments - " + m.getName()); - this.setSize(new Dimension(800, 300)); + this.setModal(true); + this.setSize(new Dimension(800, 350)); Image img = null; try { img = ImageIO.read(AppThinker.class.getResource("img/logoAppThinker.png")); } catch (Exception ex) { } this.setIconImage(img); - this.setResizable(true); + this.setResizable(false); this.setLocationRelativeTo(null); this.setLayout(new BorderLayout()); @@ -60,22 +61,54 @@ public class ArgumentsPropertiesWindow extends JFrame { JPanel argumentsTableModifier = new JPanel(); argumentsTableModifier.setLayout(new BoxLayout(argumentsTableModifier, BoxLayout.Y_AXIS)); - JButton addArgument = new JButton("+"); + JButton addArgument = new JButton(" + "); + addArgument.setToolTipText("Add a new argument."); addArgument.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addArgument(); } }); - JButton removeArgument = new JButton("-"); + argumentsTableModifier.add(addArgument); + JButton removeArgument = new JButton(" - "); + removeArgument.setToolTipText("Remove the selected argument."); removeArgument.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { removeArgument(); } }); - argumentsTableModifier.add(addArgument); argumentsTableModifier.add(removeArgument); + JButton upArgument = new JButton("▲"); + upArgument.setToolTipText("Go up the selected attribute."); + upArgument.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int selected = _argumentsTable.getSelectedRow(); + if(_method.upArgument(selected)){ + save(false); + listArguments(); + _argumentsTable.setRowSelectionInterval(selected - 1, selected - 1); + _umlDiagram.repaint(); + } + } + }); + argumentsTableModifier.add(upArgument); + JButton downArgument = new JButton("▼"); + downArgument.setToolTipText("Go down the selected argument."); + downArgument.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int selected = _argumentsTable.getSelectedRow(); + if(_method.downArgument(selected)){ + save(false); + listArguments(); + _argumentsTable.setRowSelectionInterval(selected + 1, selected + 1); + _umlDiagram.repaint(); + } + } + }); + argumentsTableModifier.add(downArgument); argumentsPan.add(argumentsTableModifier); @@ -86,7 +119,7 @@ public class ArgumentsPropertiesWindow extends JFrame { saveBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - saveAndClose(); + save(true); } }); generalPanel.add(saveBtn); @@ -103,6 +136,7 @@ public class ArgumentsPropertiesWindow extends JFrame { * Ajoute un argument à la méthode sélectionnée et rafraîchit la liste des arguments. */ public void addArgument(){ + save(false); _method.addArgument(new Argument()); _classProp.getEditingClass().computeMinSize(); _umlDiagram.repaint(); @@ -115,6 +149,7 @@ public class ArgumentsPropertiesWindow extends JFrame { public void removeArgument(){ int i = _argumentsTable.getSelectedRow(); if(i != -1){ + save(false); _method.removeArgument(i); _classProp.getEditingClass().computeMinSize(); _umlDiagram.repaint(); @@ -150,8 +185,9 @@ public class ArgumentsPropertiesWindow extends JFrame { /** * Sauvegarde les modifications pour la méthode en cours et ferme la fenêtre. + * @param quit Fermer la fenêtre après la sauvegarde. */ - public void saveAndClose(){ + public void save(boolean quit){ //Termine l'édition en sélectionnant une autre cellule _argumentsTable.editCellAt(0,0); //Enregistrement des attributs @@ -164,6 +200,6 @@ public class ArgumentsPropertiesWindow extends JFrame { //Rafraichissement de l'affichage _classProp.getEditingClass().computeMinSize(); _umlDiagram.repaint(); - this.dispose(); + if(quit) this.dispose(); } } diff --git a/AppThinker/src/Class.java b/AppThinker/src/Class.java index dbb6616..9ceb9d7 100644 --- a/AppThinker/src/Class.java +++ b/AppThinker/src/Class.java @@ -2,6 +2,7 @@ import javax.swing.*; import java.awt.*; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -292,6 +293,35 @@ public class Class implements Serializable { this.computeMinSize(); } + /** + * Faire remonter l'attribut sélectionné dans la liste. + * @param index L'index de l'attribut concerné. + * @return true if succeed, false if failed + */ + public boolean upAttribute(int index){ + int attrNumber = this._attributes.size(); + //Si au moins 2 attributs et que l'attribut n'est pas en 1ère position, on le remonte + if(index != 0 && attrNumber > 1){ + Collections.swap(_attributes, index, index - 1); + return true; + } + return false; + } + + /** + * Faire descendre l'attribut sélectionné dans la liste. + * @param index L'index de l'attribut sélectionné. + */ + public boolean downAttribute(int index){ + int attrNumber = this._attributes.size(); + //Si au moins 2 attributs et que l'attribut n'est pas en dernière position, on le descend + if(index != attrNumber - 1 && attrNumber > 1){ + Collections.swap(_attributes, index, index + 1); + return true; + } + return false; + } + /** * Récupère toutes les méthodes de la classe. * @return Les méthodes de la classe. @@ -335,6 +365,36 @@ public class Class implements Serializable { this.computeMinSize(); } + /** + * Faire remonter la méthode sélectionnée dans la liste. + * @param index L'index de la méthode concernée. + * @return true if succeed, false if failed + */ + public boolean upMethod(int index){ + int methNumber = this._methods.size(); + //Si au moins 2 méthodes et que la méthode n'est pas en 1ère position, on la remonte + if(index != 0 && methNumber > 1){ + Collections.swap(_methods, index, index - 1); + return true; + } + return false; + } + + /** + * Faire descendre la méthode sélectionnée dans la liste. + * @param index L'index de la méthode concernée. + * @return true if succeed, false if failed + */ + public boolean downMethod(int index){ + int methNumber = this._methods.size(); + //Si au moins 2 méthodes et que la méthode n'est pas en dernière position, on la descend + if(index != methNumber - 1 && methNumber > 1){ + Collections.swap(_methods, index, index + 1); + return true; + } + return false; + } + /** * Permet de redimensionner la classe vers le haut. * @param posY La position en ordonnée du curseur. diff --git a/AppThinker/src/ClassPropertiesWindow.java b/AppThinker/src/ClassPropertiesWindow.java index 6076555..b6c2b06 100644 --- a/AppThinker/src/ClassPropertiesWindow.java +++ b/AppThinker/src/ClassPropertiesWindow.java @@ -12,7 +12,11 @@ import java.util.Vector; * Classe permettant la création de fenêtres pour la modification des propriétés des classes. * @author V.BOULANGER */ -public class ClassPropertiesWindow extends JFrame { +public class ClassPropertiesWindow extends JDialog { + + public static int UPDATE_ATTR = 0; + public static int UPDATE_METH = 1; + private static int UPDATE_ALL = 2; private UmlDiagram _umlDiagram; private Class _class; @@ -38,7 +42,8 @@ public class ClassPropertiesWindow extends JFrame { //Paramétrage de la fenêtre this.setTitle("Edit properties - " + a.getName()); - this.setSize(new Dimension(800, 300)); + this.setModal(true); + this.setSize(new Dimension(800, 350)); Image img = null; try { img = ImageIO.read(AppThinker.class.getResource("img/logoAppThinker.png")); } catch (Exception ex) { } this.setIconImage(img); @@ -49,7 +54,6 @@ public class ClassPropertiesWindow extends JFrame { //Espace général de la fenêtre JPanel generalPanel = new JPanel(); generalPanel.setLayout(new BoxLayout(generalPanel, BoxLayout.Y_AXIS)); - generalPanel.setAlignmentX(LEFT_ALIGNMENT); //Espace de modification du nom JPanel namePan = new JPanel(); @@ -78,23 +82,54 @@ public class ClassPropertiesWindow extends JFrame { JPanel attributesTableModifier = new JPanel(); attributesTableModifier.setLayout(new BoxLayout(attributesTableModifier, BoxLayout.Y_AXIS)); - JButton addAttribute = new JButton("+"); + JButton addAttribute = new JButton(" + "); + addAttribute.setToolTipText("Add a new attribute."); addAttribute.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addAttribute(); } }); - JButton removeAttribute = new JButton("-"); + attributesTableModifier.add(addAttribute); + JButton removeAttribute = new JButton(" - "); + removeAttribute.setToolTipText("Remove the selected attribute."); removeAttribute.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { removeAttribute(); } }); - attributesTableModifier.add(addAttribute); attributesTableModifier.add(removeAttribute); - + JButton upAttribute = new JButton("▲"); + upAttribute.setToolTipText("Go up the selected attribute."); + upAttribute.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int selected = _attributesTable.getSelectedRow(); + if(_class.upAttribute(selected)){ + save(ClassPropertiesWindow.UPDATE_ATTR, false); + listAttributes(); + _attributesTable.setRowSelectionInterval(selected - 1, selected - 1); + _umlDiagram.repaint(); + } + } + }); + attributesTableModifier.add(upAttribute); + JButton downAttribute = new JButton("▼"); + downAttribute.setToolTipText("Go down the selected attribute."); + downAttribute.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int selected = _attributesTable.getSelectedRow(); + if(_class.downAttribute(selected)){ + save(ClassPropertiesWindow.UPDATE_ATTR, false); + listAttributes(); + _attributesTable.setRowSelectionInterval(selected + 1, selected + 1); + _umlDiagram.repaint(); + } + } + }); + attributesTableModifier.add(downAttribute); attributesPan.add(attributesTableModifier); generalPanel.add(attributesPan); @@ -128,22 +163,66 @@ public class ClassPropertiesWindow extends JFrame { JPanel methodsTableModifier = new JPanel(); methodsTableModifier.setLayout(new BoxLayout(methodsTableModifier, BoxLayout.Y_AXIS)); - JButton addMethod = new JButton("+"); + JButton addMethod = new JButton(" + "); + addMethod.setToolTipText("Add a new method."); addMethod.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addMethod(); } }); - JButton removeMethod = new JButton("-"); + methodsTableModifier.add(addMethod); + + JButton generateConstructor = new JButton("Generate constructor"); + generateConstructor.setToolTipText("Generate constructor for this class."); + generateConstructor.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + System.out.println("Generate constructor"); + } + }); + methodsTableModifier.add(generateConstructor); + + JButton removeMethod = new JButton(" - "); + removeMethod.setToolTipText("Remove the selected method."); removeMethod.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { removeMethod(); } }); - methodsTableModifier.add(addMethod); methodsTableModifier.add(removeMethod); + JButton upMethod = new JButton("▲"); + upMethod.setToolTipText("Go up the selected method."); + upMethod.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int selected = _methodsTable.getSelectedRow(); + if(_class.upMethod(selected)){ + save(ClassPropertiesWindow.UPDATE_METH, false); + listMethods(); + _methodsTable.setRowSelectionInterval(selected - 1, selected - 1); + _umlDiagram.repaint(); + } + } + }); + methodsTableModifier.add(upMethod); + JButton downMethod = new JButton("▼"); + downMethod.setToolTipText("Go down the selected method."); + downMethod.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int selected = _methodsTable.getSelectedRow(); + if(_class.downMethod(selected)){ + save(ClassPropertiesWindow.UPDATE_METH, false); + listMethods(); + _methodsTable.setRowSelectionInterval(selected + 1, selected + 1); + _umlDiagram.repaint(); + } + } + }); + + methodsTableModifier.add(downMethod); methodsPan.add(methodsTableModifier); @@ -154,7 +233,7 @@ public class ClassPropertiesWindow extends JFrame { saveBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - saveAndClose(); + save(ClassPropertiesWindow.UPDATE_ALL, true); } }); generalPanel.add(saveBtn); @@ -188,6 +267,7 @@ public class ClassPropertiesWindow extends JFrame { * Ajoute un attribut à la classe et rafraîchit la liste des attributs. */ public void addAttribute(){ + this.save(ClassPropertiesWindow.UPDATE_ATTR, false); _class.addAttribute(new Attribute()); this.listAttributes(); } @@ -196,6 +276,7 @@ public class ClassPropertiesWindow extends JFrame { * Retire un attribut à la classe et rafraîchit la liste des attributs. */ public void removeAttribute(){ + this.save(ClassPropertiesWindow.UPDATE_ATTR, false); int i = _attributesTable.getSelectedRow(); if(i != -1){ _class.removeAttribute(i); @@ -271,6 +352,7 @@ public class ClassPropertiesWindow extends JFrame { * Ajoute une méthode à la classe et rafraîchit la liste des méthodes. */ public void addMethod(){ + this.save(ClassPropertiesWindow.UPDATE_METH, false); _class.addMethod(new Method()); this.listMethods(); } @@ -279,6 +361,7 @@ public class ClassPropertiesWindow extends JFrame { * Retire une méthode à la classe et rafraîchit la liste des méthodes. */ public void removeMethod(){ + this.save(ClassPropertiesWindow.UPDATE_METH, false); int i = _methodsTable.getSelectedRow(); if(i != -1){ _class.removeMethod(i); @@ -358,65 +441,74 @@ public class ClassPropertiesWindow extends JFrame { /** * Sauvegarde les modifications pour la classe en cours et ferme la fenêtre. + * @param focusUpdate Les éléments à sauvegarder. + * @param quit Fermer la fenêtre après la sauvegarde. */ - public void saveAndClose(){ - //Termine l'édition en sélectionnant une autre cellule - _attributesTable.editCellAt(0,0); - //Changement du nom de la classe - _class.setName(_nameField.getText()); - //Enregistrement des attributs - for(int i = 0; i <= _attributeModel.getRowCount()-1; i++){ - Vector vect = (Vector)_attributeModel.getDataVector().elementAt(i); - String access = vect.get(1).toString(); - switch(access){ - case "PRIVATE" : - _class.getAttributes().get(i).setAccess(Attribute.PRIVATE); - break; - case "PUBLIC" : - _class.getAttributes().get(i).setAccess(Attribute.PUBLIC); - break; - case "PROTECTED" : - _class.getAttributes().get(i).setAccess(Attribute.PROTECTED); - break; + public void save(int focusUpdate, boolean quit){ + //Si la sauvegarde des attributs est demandée + if(focusUpdate == ClassPropertiesWindow.UPDATE_ATTR || focusUpdate == ClassPropertiesWindow.UPDATE_ALL){ + //Termine l'édition en sélectionnant une autre cellule + _attributesTable.editCellAt(0,0); + //Changement du nom de la classe + _class.setName(_nameField.getText()); + //Enregistrement des attributs + for(int i = 0; i <= _attributeModel.getRowCount()-1; i++){ + Vector vect = (Vector)_attributeModel.getDataVector().elementAt(i); + String access = vect.get(1).toString(); + switch(access){ + case "PRIVATE" : + _class.getAttributes().get(i).setAccess(Attribute.PRIVATE); + break; + case "PUBLIC" : + _class.getAttributes().get(i).setAccess(Attribute.PUBLIC); + break; + case "PROTECTED" : + _class.getAttributes().get(i).setAccess(Attribute.PROTECTED); + break; + } + _class.getAttributes().get(i).setName(vect.get(0).toString()); + _class.getAttributes().get(i).setType(vect.get(2).toString()); + _class.getAttributes().get(i).setStatic((boolean) vect.get(3)); + _class.getAttributes().get(i).setFinal((boolean) vect.get(4)); + _class.getAttributes().get(i).setAbstract((boolean) vect.get(5)); + _class.getAttributes().get(i).setSynchronized((boolean) vect.get(6)); + _class.getAttributes().get(i).setVolatile((boolean) vect.get(7)); + _class.getAttributes().get(i).setTransient((boolean) vect.get(8)); } - _class.getAttributes().get(i).setName(vect.get(0).toString()); - _class.getAttributes().get(i).setType(vect.get(2).toString()); - _class.getAttributes().get(i).setStatic((boolean) vect.get(3)); - _class.getAttributes().get(i).setFinal((boolean) vect.get(4)); - _class.getAttributes().get(i).setAbstract((boolean) vect.get(5)); - _class.getAttributes().get(i).setSynchronized((boolean) vect.get(6)); - _class.getAttributes().get(i).setVolatile((boolean) vect.get(7)); - _class.getAttributes().get(i).setTransient((boolean) vect.get(8)); + } - //Enregistrement des méthodes - _methodsTable.editCellAt(0,0); - for(int i = 0; i <= _methodModel.getRowCount()-1; i++){ - Vector vect = (Vector)_methodModel.getDataVector().elementAt(i); - String access = vect.get(1).toString(); - switch(access){ - case "PRIVATE" : - _class.getMethods().get(i).setAccess(Method.PRIVATE); - break; - case "PUBLIC" : - _class.getMethods().get(i).setAccess(Method.PUBLIC); - break; - case "PROTECTED" : - _class.getMethods().get(i).setAccess(Method.PROTECTED); - break; + //Si la sauvegarde des méthodes est demandée + if(focusUpdate == ClassPropertiesWindow.UPDATE_METH || focusUpdate == ClassPropertiesWindow.UPDATE_ALL){ + //Enregistrement des méthodes + _methodsTable.editCellAt(0,0); + for(int i = 0; i <= _methodModel.getRowCount()-1; i++){ + Vector vect = (Vector)_methodModel.getDataVector().elementAt(i); + String access = vect.get(1).toString(); + switch(access){ + case "PRIVATE" : + _class.getMethods().get(i).setAccess(Method.PRIVATE); + break; + case "PUBLIC" : + _class.getMethods().get(i).setAccess(Method.PUBLIC); + break; + case "PROTECTED" : + _class.getMethods().get(i).setAccess(Method.PROTECTED); + break; + } + _class.getMethods().get(i).setName(vect.get(0).toString()); + _class.getMethods().get(i).setType(vect.get(2).toString()); + _class.getMethods().get(i).setStatic((boolean) vect.get(4)); + _class.getMethods().get(i).setFinal((boolean) vect.get(5)); + _class.getMethods().get(i).setAbstract((boolean) vect.get(6)); + _class.getMethods().get(i).setSynchronized((boolean) vect.get(7)); + _class.getMethods().get(i).setVolatile((boolean) vect.get(8)); + _class.getMethods().get(i).setTransient((boolean) vect.get(9)); } - _class.getMethods().get(i).setName(vect.get(0).toString()); - _class.getMethods().get(i).setType(vect.get(2).toString()); - _class.getMethods().get(i).setStatic((boolean) vect.get(4)); - _class.getMethods().get(i).setFinal((boolean) vect.get(5)); - _class.getMethods().get(i).setAbstract((boolean) vect.get(6)); - _class.getMethods().get(i).setSynchronized((boolean) vect.get(7)); - _class.getMethods().get(i).setVolatile((boolean) vect.get(8)); - _class.getMethods().get(i).setTransient((boolean) vect.get(9)); } //Rafraichissement de l'affichage this._class.computeMinSize(); _umlDiagram.repaint(); - this.dispose(); + if(quit) this.dispose(); } } diff --git a/AppThinker/src/Method.java b/AppThinker/src/Method.java index cd843ff..f70ea71 100644 --- a/AppThinker/src/Method.java +++ b/AppThinker/src/Method.java @@ -1,5 +1,6 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -148,6 +149,36 @@ public class Method implements Serializable { this._arguments.clear(); } + /** + * Faire remonter l'argument sélectionné dans la liste. + * @param index L'index de l'argument concerné. + * @return true if succeed, false if failed + */ + public boolean upArgument(int index){ + int argNumber = this._arguments.size(); + //Si au moins 2 arguments et que l'argument n'est pas en 1ère position, on le remonte + if(index != 0 && argNumber > 1){ + Collections.swap(_arguments, index, index - 1); + return true; + } + return false; + } + + /** + * Faire descendre l'argument sélectionné dans la liste. + * @param index L'index de l'argument concerné. + * @return true if succeed, false if failed + */ + public boolean downArgument(int index){ + int argNumber = this._arguments.size(); + //Si au moins 2 arguments et que l'argument n'est pas en dernière position, on le descend + if(index != argNumber - 1 && argNumber > 1){ + Collections.swap(_arguments, index, index + 1); + return true; + } + return false; + } + /** * Retourne si l'attribut est statique ou non. * @return true : l'attribut est statique, false: l'attribut n'est pas statique.