3 import java
.util
.logging
.Level
;
4 import java
.util
.logging
.Logger
;
7 import java
.awt
.event
.*;
8 import java
.util
.ArrayList
;
10 public class Workspace
extends JScrollPane
implements MouseListener
, MouseMotionListener
, ActionListener
, KeyListener
{
12 private Workarea workarea
;
13 private Diagram diagram
;
14 private ArrayList
<DiagramObject
> selectedList
;
15 private Tool currentTool
;
16 private Rectangle visibleRectangle
;
17 private CanvasRectangle selectRectangle
;
18 private int startX
, startY
;
19 private JPopupMenu dObjectPopupmenu
;
20 private JPopupMenu dPopupmenu
;
21 private JMenuItem cutItem
;
22 private JMenuItem copyItem
;
23 private JMenuItem pasteItem
;
24 private JMenuItem deleteItem
;
25 private ArrayList
<DiagramObject
> clipboard
;
26 private boolean clipboardCopy
;
28 private DiagramFigure resizerObject
;
29 private DiagramObject inserterObject
;
30 private JMenuItem
[] extendedMenu
;
32 public Workspace(Diagram diagram
)
35 this.diagram
= diagram
;
36 diagram
.setWorkspace(this);
38 workarea
= new Workarea(this);
39 setViewportView(workarea
);
41 workarea
.addMouseListener(this);
42 workarea
.addMouseMotionListener(this);
46 visibleRectangle
= new Rectangle();
47 selectedList
= new ArrayList
<DiagramObject
>();
48 // Menu para objeto seleccionado
49 dObjectPopupmenu
= new JPopupMenu();
51 dPopupmenu
= new JPopupMenu();
52 cutItem
= new JMenuItem("Cortar");
53 cutItem
.addActionListener(this);
54 dObjectPopupmenu
.add(cutItem
);
55 copyItem
= new JMenuItem("Copiar");
56 copyItem
.addActionListener(this);
57 dObjectPopupmenu
.add(copyItem
);
58 deleteItem
= new JMenuItem("Eliminar");
59 deleteItem
.addActionListener(this);
60 dObjectPopupmenu
.add(deleteItem
);
61 pasteItem
= new JMenuItem("Pegar");
62 pasteItem
.addActionListener(this);
63 dPopupmenu
.add(pasteItem
);
64 pasteItem
.setEnabled(false);
65 dObjectPopupmenu
.add(new JSeparator());
66 clipboard
= new ArrayList
<DiagramObject
>();
68 getInputMap().put(KeyStroke
.getKeyStroke(KeyEvent
.VK_X
, KeyEvent
.CTRL_DOWN_MASK
), "pressed");
69 getInputMap().put(KeyStroke
.getKeyStroke(KeyEvent
.VK_V
, KeyEvent
.CTRL_DOWN_MASK
), "pressed");
70 getInputMap().put(KeyStroke
.getKeyStroke(KeyEvent
.VK_C
, KeyEvent
.CTRL_DOWN_MASK
), "pressed");
71 getInputMap().put(KeyStroke
.getKeyStroke(KeyEvent
.VK_Z
, KeyEvent
.CTRL_DOWN_MASK
), "pressed");
77 public void setDNDiagram(Diagram diagram
)
79 this.diagram
= diagram
;
82 public Diagram
getDNDiagram()
87 public void addElement(DiagramObject element
)
89 if(inserterObject
!= null) {
92 inserterObject
.unselect();
95 inserterObject
= element
;
98 diagram
.addElement(element
);
101 setTool(Tool
.INSERTER
);
104 public void updateWorkspace()
108 // No queremos que se redimensione con el rectangulo de selección
109 if(selectRectangle
== null) {
110 Canvas canvas
= diagram
.getCanvas();
114 ArrayList
<DiagramObject
> elements
= diagram
.getElements();
115 for(DiagramObject o
: elements
)
117 CanvasSmartObject cso
= o
.getDrawing();
118 Point p
= cso
.getPosition();
119 if(p
.x
< 0 && -p
.x
> xMove
) {
123 if(p
.y
< 0 && -p
.y
> yMove
) {
128 for(DiagramObject o
: elements
) {
129 Point p
= o
.getDrawing().getPosition();
134 Dimension pd
= canvas
.getSize();
137 barWidth
= Math
.max(15, getVerticalScrollBar().getWidth());
138 pd
.width
= Math
.max(pd
.width
, getSize().width
- barWidth
);
139 barWidth
= Math
.max(15, getHorizontalScrollBar().getWidth());
140 pd
.height
= Math
.max(pd
.height
, getSize().height
- barWidth
);
142 workarea
.setPreferredSize(pd
);
143 workarea
.setMinimumSize(pd
);
145 /* Creen que es correcto setear View cada vez que un componente
146 * cambia una propiedad de interes ?
148 setViewportView(workarea
);
154 public void mouseClicked(MouseEvent e
)
159 public void mouseEntered(MouseEvent e
)
164 public void mouseExited(MouseEvent e
)
169 private void deleteSelected() {
170 for (DiagramObject o
: selectedList
) {
171 if(o
instanceof DiagramVertice
)
172 ((DiagramVertice
)o
).disconnect();
174 diagram
.removeElement(o
);
178 private void unselectAll()
180 for(DiagramObject o
: selectedList
)
183 selectedList
.clear();
186 private void selectAll()
188 for(DiagramObject o
: selectedList
)
192 private void moveSelectedList(int xDiff
, int yDiff
) {
193 for (DiagramObject o
: selectedList
) {
194 Point curPos
= o
.getDrawing().getPosition();
201 private void showMenu(JPopupMenu menu
)
203 Point mousePosition
= getViewport().getMousePosition();
204 menu
.show(this, mousePosition
.x
, mousePosition
.y
);
208 public void mousePressed(MouseEvent e
) {
209 DiagramObject diagramObject
;
210 Canvas canvas
= diagram
.getCanvas();
214 switch (currentTool
) {
216 Point evPoint
= canvas
.toCanvasCoordinate(e
.getPoint());
219 if ((diagramObject
= diagram
.getElementIn(startX
, startY
)) != null) {
220 CanvasSmartObject drawing
= diagramObject
.getDrawing();
221 if (!selectedList
.contains(diagramObject
)) {
223 if (selectedList
.size() > 0) {
227 selectedList
.add(diagramObject
);
228 diagramObject
.select();
230 diagram
.removeElement(diagramObject
);
231 diagram
.addElement(diagramObject
);
234 } else if(diagramObject
instanceof DiagramFigure
&& e
.getButton() == MouseEvent
.BUTTON1
){
235 // Es un objeto seleccionado
236 // Reviso si el cursor esta en la esquina inferior derecha.
237 int cornerX
= drawing
.getPosition().x
+ drawing
.getWidth();
238 int cornerY
= drawing
.getPosition().y
+ drawing
.getHeight();
239 System
.out
.println(cornerX
);
240 System
.out
.println(cornerY
);
242 System
.out
.println(evPoint
);
243 if(evPoint
.x
>= cornerX
-6 && evPoint
.x
<= cornerX
+ 6 && evPoint
.y
>= cornerY
- 6 && evPoint
.y
<= cornerY
+ 6) {
244 setTool(Tool
.RESIZER
);
245 resizerObject
= (DiagramFigure
) diagramObject
;
246 resizerObject
.unselect();
247 selectRectangle
= new CanvasRectangle(new Point(drawing
.getPosition().x
, drawing
.getPosition().y
), drawing
.getWidth(), drawing
.getHeight());
248 selectRectangle
.setBackground(new Color(0, 200, 0, 180));
249 canvas
.addElement(selectRectangle
);
254 if (e
.getButton() == MouseEvent
.BUTTON3
) {
256 if(extendedMenu
!= null)
257 for(JMenuItem mi
: extendedMenu
) {
258 dObjectPopupmenu
.remove(mi
);
261 extendedMenu
= diagramObject
.getExtendedMenu();
262 if(extendedMenu
!= null)
263 for(JMenuItem mi
: extendedMenu
) {
264 dObjectPopupmenu
.add(mi
);
267 showMenu(dObjectPopupmenu
);
271 if(selectedList
.size() > 0)
274 if(selectRectangle
!= null)
275 canvas
.removeElement(selectRectangle
);
277 if(e
.getButton() == MouseEvent
.BUTTON1
) {
278 selectRectangle
= new CanvasRectangle(new Point(startX
, startY
), 0, 0);
279 selectRectangle
.setBackground(new Color(0, 255, 0, 50));
280 canvas
.addElement(selectRectangle
);
281 } else if(e
.getButton() == MouseEvent
.BUTTON3
)
282 showMenu(dPopupmenu
);
287 startX
= e
.getPoint().x
;
288 startY
= e
.getPoint().y
;
291 inserterObject
.unselect();
292 inserterObject
= null;
298 public void mouseReleased(MouseEvent e
) {
299 Canvas canvas
= diagram
.getCanvas();
301 switch (currentTool
) {
303 if (selectRectangle
!= null) {
304 canvas
.removeElement(selectRectangle
);
305 if(Math
.abs(selectRectangle
.getWidth() + selectRectangle
.getHeight()) > 0)
306 diagram
.getElementsIn(selectedList
, selectRectangle
.getEffectivePosition().x
, selectRectangle
.getEffectivePosition().y
, selectRectangle
.getWidth(), selectRectangle
.getHeight());
309 selectRectangle
= null;
316 canvas
.removeElement(selectRectangle
);
318 int width
= selectRectangle
.getWidth();
319 int height
= selectRectangle
.getHeight();
321 Point p
= resizerObject
.getDrawing().getPosition();
333 resizerObject
.resize(width
, height
);
335 selectRectangle
= null;
336 resizerObject
.select();
337 resizerObject
= null;
338 currentTool
= oldTool
;
341 setTool(currentTool
);
345 public void mouseDragged(MouseEvent e
)
347 Canvas canvas
= diagram
.getCanvas();
348 Point evPoint
= canvas
.toCanvasCoordinate(e
.getPoint());
350 switch(currentTool
) {
353 if(selectedList
.size() > 0) {
354 moveSelectedList(evPoint
.x
- startX
, evPoint
.y
- startY
);
355 workarea
.setCursor(Cursor
.getPredefinedCursor(Cursor
.MOVE_CURSOR
));
356 } else if(selectRectangle
!= null) {
357 selectRectangle
.setWidth(selectRectangle
.getWidth() + evPoint
.x
- startX
);
358 selectRectangle
.setHeight(selectRectangle
.getHeight() + evPoint
.y
- startY
);
364 JViewport vp
= getViewport();
365 Dimension visibleDimension
= vp
.getExtentSize();
366 Point mousePosition
= vp
.getMousePosition();
367 if(mousePosition
!= null) {
368 int xDistance
= e
.getPoint().x
- startX
;
369 int yDistance
= e
.getPoint().y
- startY
;
372 visibleRectangle
.x
= mousePosition
.x
;
373 visibleRectangle
.width
= 0;
375 // Arrastre hacia la izquierda
377 visibleRectangle
.x
= visibleDimension
.width
;
378 visibleRectangle
.width
= -xDistance
;
379 } else { // Arrastre hacia la derecha
380 visibleRectangle
.x
= -xDistance
;
381 visibleRectangle
.width
= xDistance
;
385 visibleRectangle
.y
= mousePosition
.y
;
386 visibleRectangle
.height
= 0;
388 // Arrastre hacia arriba
390 visibleRectangle
.y
= visibleDimension
.height
;
391 visibleRectangle
.height
= -yDistance
;
392 } else { // Arrastre hacia abajo
393 visibleRectangle
.y
= -yDistance
;
394 visibleRectangle
.height
= yDistance
;
396 vp
.scrollRectToVisible(visibleRectangle
);
401 int width
= evPoint
.x
- resizerObject
.getX();
402 int height
= evPoint
.y
- resizerObject
.getY();
403 selectRectangle
.setWidth(width
);
404 selectRectangle
.setHeight(height
);
412 public void mouseMoved(MouseEvent e
)
414 Canvas canvas
= diagram
.getCanvas();
415 Point evPoint
= canvas
.toCanvasCoordinate(e
.getPoint());
417 switch(currentTool
) {
419 Point p
= inserterObject
.getDrawing().getPosition();
428 public void actionPerformed(ActionEvent e
) {
429 if (selectedList
.size() > 0) {
430 if (e
.getSource() == cutItem
) {
431 clipboardCopy
= false;
433 pasteItem
.setEnabled(true);
434 clipboard
.addAll(selectedList
);
437 Point mousePosition
= workarea
.getMousePosition();
438 for (DiagramObject o
: clipboard
) {
439 Point p
= o
.getDrawing().getPosition();
440 p
.x
-= mousePosition
.x
*(1.0/o
.getDrawing().getCanvas().getZoom());
441 p
.y
-= mousePosition
.y
*(1.0/o
.getDrawing().getCanvas().getZoom());
445 } else if (e
.getSource() == copyItem
) {
446 clipboardCopy
= true;
448 pasteItem
.setEnabled(true);
449 Point mousePosition
= workarea
.getMousePosition();
450 DiagramObject clonedO
;
451 for (DiagramObject o
: selectedList
) {
454 clonedO
= (DiagramObject
) o
.clone();
456 Point p
= clonedO
.getDrawing().getPosition();
457 p
.x
-= mousePosition
.x
* (1.0 / o
.getDrawing().getCanvas().getZoom());
458 p
.y
-= mousePosition
.y
* (1.0 / o
.getDrawing().getCanvas().getZoom());
459 clipboard
.add(clonedO
);
460 } catch (CloneNotSupportedException ex
) {
461 Logger
.getLogger(Workspace
.class.getName()).log(Level
.SEVERE
, null, ex
);
463 System
.out
.println("Copiado");
467 } else if (e
.getSource() == deleteItem
) {
473 if (clipboard
.size() > 0) {
474 if (e
.getSource() == pasteItem
) {
476 Point mousePosition
= getViewport().getMousePosition();
477 selectedList
.addAll(clipboard
);
480 for(DiagramObject o
: selectedList
) {
482 clipboard
.add((DiagramObject
) o
.clone());
483 } catch (CloneNotSupportedException ex
) {
484 Logger
.getLogger(Workspace
.class.getName()).log(Level
.SEVERE
, null, ex
);
488 pasteItem
.setEnabled(false);
490 for (DiagramObject o
: selectedList
) {
491 diagram
.addElement(o
);
492 Point p
= o
.getDrawing().getPosition();
493 p
.x
+= mousePosition
.x
*(1.0/o
.getDrawing().getCanvas().getZoom());
494 p
.y
+= mousePosition
.y
*(1.0/o
.getDrawing().getCanvas().getZoom());
502 public void setTool(Tool tool
)
504 oldTool
= currentTool
;
508 workarea
.setCursor(Cursor
.getPredefinedCursor(Cursor
.CROSSHAIR_CURSOR
));
511 if(selectedList
.size() > 0) {
515 workarea
.setCursor(Cursor
.getPredefinedCursor(Cursor
.HAND_CURSOR
));
521 public Workarea
getWorkarea()
526 public void setZoom(double factor
)
528 Canvas canvas
= diagram
.getCanvas();
529 canvas
.setZoom(factor
);
534 public void keyTyped(KeyEvent e
) {
538 public void keyPressed(KeyEvent e
) {
539 ActionEvent aEvent
= null;
540 if(e
.getModifiers() == KeyEvent
.CTRL_MASK
) {
541 switch(e
.getKeyCode()) {
543 aEvent
= new ActionEvent(cutItem
, 0, null, 0);
546 aEvent
= new ActionEvent(pasteItem
, 0, null, 0);
549 aEvent
= new ActionEvent(copyItem
, 0, null, 0);
553 actionPerformed(aEvent
);
557 public void keyReleased(KeyEvent arg0
) {