Résolution tickets #6, #14

This commit is contained in:
2020-12-05 16:16:49 +01:00
parent f091f236cb
commit 3283cd2f02
10 changed files with 218 additions and 134 deletions

View File

@@ -14,6 +14,10 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
private List<Class> _classes;
private List<Link> _links;
private Object _selected;
private String cornerSelection = null;
private int _shiftX;
private int _shiftY;
/**
* Constructeur - Crée un nouveau diagramme UML à partir d'un projet.
@@ -23,6 +27,7 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
_project = p;
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.setPreferredSize(new Dimension(3000,3000));
}
/**
@@ -31,34 +36,48 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
*/
@Override
public void paintComponent(Graphics g){
Font font = new Font("Arial", Font.PLAIN, 14);
Font font1 = new Font("Arial", Font.PLAIN, 14);
FontMetrics metrics1 = this.getFontMetrics(font1);
Font font2 = new Font("Arial", Font.PLAIN, 10);
FontMetrics metrics2 = this.getFontMetrics(font2);
g.setColor(new Color(127, 158, 178));
g.drawString("UML Diagram", 10, 20);
for(Class a : _classes){
g.setFont(font1);
int posX = a.getPosX() - (a.getSizeX()/2);
int posY = a.getPosY() - (a.getSizeY()/2);
//Dessin du rectangle
g.setColor(Color.GRAY);
g.fillRoundRect(posX, posY, a.getSizeX(), a.getSizeY(), 10, 10);
g.setColor(new Color(127, 158, 178));
g.fillRect(posX, posY, a.getSizeX(), a.getSizeY());
g.setColor(Color.BLACK);
//Dessin du nom de la classe
int posCounter = posY + font.getSize();
FontMetrics metrics = this.getFontMetrics(font);
g.setFont(font);
g.drawString(a.getName(), posX + a.getSizeX()/2 - metrics.stringWidth(a.getName())/2, posCounter);
g.setColor(new Color(39, 76, 94));
int posCounter = posY + font1.getSize();
g.drawString(a.getName(), posX + a.getSizeX()/2 - metrics1.stringWidth(a.getName())/2, posCounter);
posCounter += 5;
g.setColor(new Color(218, 233, 244));
//Ligne de séparation
g.drawLine(posX, posY + font.getSize() + 5, posX + a.getSizeX()-1, posY + font.getSize() + 5);
g.drawLine(posX, posY + font1.getSize() + 5, posX + a.getSizeX()-1, posY + font1.getSize() + 5);
g.setFont(font2);
posCounter += font2.getSize();
g.drawString("attributes", posX + a.getSizeX()/2 - metrics2.stringWidth("attributes")/2, posCounter);
//Affichage des attributs
g.setColor(new Color(39, 76, 94));
for(Attribute b : a.getAttributes()){
posCounter += font.getSize();
posCounter += font2.getSize();
g.drawString(b.getAccess() + " " + b.getName() + " : " + b.getType(), posX, posCounter);
}
posCounter += 5;
g.setColor(new Color(218, 233, 244));
//Ligne de séparation
g.drawLine(posX, posCounter, posX + a.getSizeX()-1, posCounter);
posCounter += font2.getSize();
g.drawString("methods", posX + a.getSizeX()/2 - metrics2.stringWidth("methods")/2, posCounter);
//Dessin des méthodes
g.setColor(new Color(39, 76, 94));
for(Method m : a.getMethods()){
posCounter += font.getSize();
posCounter += font2.getSize();
String chain = m.getAccess() + " " + m.getName() + "(";
for(Argument ar : m.getArguments()){
chain += ar.getName() + " : " + ar.getType() + ", ";
@@ -69,6 +88,7 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
}
//Si la classe est sélectionnée
if((Class)_selected == a){
g.setColor(new Color(39, 76, 94));
AppThinker.getWindow().getStatusbar().setSizeLabel(a.getSizeX(), a.getSizeY());
//Top Left
g.fillOval(posX-4, posY-4, 8, 8);
@@ -91,7 +111,7 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
}
else AppThinker.getWindow().getStatusbar().setSizeLabel(0, 0);
}
AppThinker.getProject().getGrid().updateUI();
AppThinker.getWindow().repaint();
}
/**
@@ -123,8 +143,11 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
for(Class a : _classes){
int posX = a.getPosX()-(a.getSizeX()/2);
int posY = a.getPosY()-(a.getSizeY()/2);
if(getX >= posX && getX <= (posX + a.getSizeX())){
if(getY >= posY && getY <= (posY + a.getSizeY())){
//Si la souris est dans la classe
if (getX >= posX && getX <= (posX + a.getSizeX())) {
if (getY >= posY && getY <= (posY + a.getSizeY())) {
this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
//On sélectionne la classe
classSelected = true;
_selected = a;
break;
@@ -132,6 +155,12 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
}
}
if(classSelected == false && linkSelected == false) _selected = null;
//Si la classe est sélectionnée, on enregistre le décalage entre la souris et le centre de la classe
if(_selected instanceof Class){
Class a = (Class) _selected;
_shiftX = getX - a.getPosX();
_shiftY = getY - a.getPosY();
}
this.repaint();
}
@@ -177,6 +206,7 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
//On essaie d'ajouter une classe
case AppThinkerToolbar.CLASS_TOOL:
Class newClass = new Class(e.getX(), e.getY(), Class.RECTANGLE);
newClass.addAttribute(new Attribute("_TestAttribut1", Attribute.PROTECTED, "int"));
AppThinker.getProject().addClass(newClass);
break;
case AppThinkerToolbar.ASSOCIATION_TOOL:
@@ -190,7 +220,6 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
break;
}
this.displayDiagram();
}
@Override
@@ -214,20 +243,102 @@ public class UmlDiagram extends JPanel implements MouseListener, MouseMotionList
*/
@Override
public void mouseDragged(MouseEvent e) {
//Mise à jour des coordonnées de la souris dans la statusbar
int posX = e.getX();
int posY = e.getY();
AppThinker.getWindow().getStatusbar().setPosLabel(posX, posY);
if(_selected instanceof Class){
Class a = (Class)_selected;
a.setPosX(e.getX());
a.setPosY(e.getY());
int shiftX = 0;
int shiftY = 0;
//Si un coin est sélectionné, on redimensionne
if(cornerSelection != null){
switch(cornerSelection){
case "N":
a.resizeUp(posY);
break;
case "NE":
a.resizeUp(posY);
a.resizeRight(posX);
case "E":
a.resizeRight(posX);
break;
case "SE":
a.resizeDown(posY);
a.resizeRight(posX);
//Redimensionnement bas
case "S":
a.resizeDown(posY);
break;
case "SW":
a.resizeDown(posY);
a.resizeLeft(posX);
break;
case "W":
a.resizeLeft(posX);
break;
case "NW":
a.resizeUp(posY);
a.resizeLeft(posX);
break;
}
}
//Sinon on déplace
else{
//On repositionne la classe en prenant en compte le décalage mesuré au clic de la souris
a.setPosX(posX - _shiftX);
a.setPosY(posY - _shiftY);
this.setCursor(new Cursor(Cursor.MOVE_CURSOR));
}
}
this.repaint();
}
/**
* La souris bouge dans la grille. On affiche les coordonnées de la souris dans la statusbar.
* La souris bouge dans la grille.
* @param e L'événement souris.
*/
@Override
public void mouseMoved(MouseEvent e) {
int getX = e.getX();
int getY = e.getY();
int sens = 5;
//Mise à jour des coordonnées de la souris dans la statusbar
AppThinker.getWindow().getStatusbar().setPosLabel(e.getX(), e.getY());
//Si une classe est sélectionnée
if (_selected instanceof Class) {
Class a = (Class) _selected;
int posX = a.getPosX() - (a.getSizeX() / 2);
int posY = a.getPosY() - (a.getSizeY() / 2);
//Si la souris est à proximité d'un lien, on affiche le curseur de redimensionnement
if (getX >= posX - sens && getX <= posX + sens && getY >= posY - sens && getY <= posY + sens) {
cornerSelection = "NW";
this.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR));
} else if (getX >= posX + a.getSizeX() / 2 - sens && getX <= posX + a.getSizeX() / 2 + sens && getY >= posY - sens && getY <= posY + sens) {
cornerSelection = "N";
this.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
} else if (getX >= posX + a.getSizeX() - sens && getX <= posX + a.getSizeX() + sens && getY >= posY - sens && getY <= posY + sens) {
cornerSelection = "NE";
this.setCursor(new Cursor(Cursor.NE_RESIZE_CURSOR));
} else if (getX >= posX + a.getSizeX() - sens && getX <= posX + a.getSizeX() + sens && getY >= posY + a.getSizeY() / 2 - sens && getY <= posY + a.getSizeY() / 2 + sens) {
cornerSelection = "E";
this.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
} else if (getX >= posX + a.getSizeX() - sens && getX <= posX + a.getSizeX() + sens && getY >= posY + a.getSizeY() - sens && getY <= posY + a.getSizeY() + sens) {
cornerSelection = "SE";
this.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
} else if (getX >= posX + a.getSizeX() / 2 - sens && getX <= posX + a.getSizeX() / 2 + sens && getY >= posY + a.getSizeY() - sens && getY <= posY + a.getSizeY() + sens) {
cornerSelection = "S";
this.setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
} else if (getX >= posX - sens && getX <= posX + sens && getY >= posY + a.getSizeY() - sens && getY <= posY + a.getSizeY() + sens) {
cornerSelection = "SW";
this.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR));
} else if (getX >= posX - sens && getX <= posX + sens && getY >= posY + a.getSizeY() / 2 - sens && getY <= posY + a.getSizeY() / 2 + sens) {
cornerSelection = "W";
this.setCursor(new Cursor(Cursor.W_RESIZE_CURSOR));
} else {
cornerSelection = null;
this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
}
}