Statistics
| Revision:

root / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / layout / fframes / FFrame.java @ 6117

History | View | Annotate | Download (25 KB)

1
/*
2
 * Created on 17-may-2004
3
 *
4
 */
5
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
6
 *
7
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License
11
 * as published by the Free Software Foundation; either version 2
12
 * of the License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
22
 *
23
 * For more information, contact:
24
 *
25
 *  Generalitat Valenciana
26
 *   Conselleria d'Infraestructures i Transport
27
 *   Av. Blasco Ib??ez, 50
28
 *   46010 VALENCIA
29
 *   SPAIN
30
 *
31
 *      +34 963862235
32
 *   gvsig@gva.es
33
 *      www.gvsig.gva.es
34
 *
35
 *    or
36
 *
37
 *   IVER T.I. S.A
38
 *   Salamanca 50
39
 *   46005 Valencia
40
 *   Spain
41
 *
42
 *   +34 963163400
43
 *   dac@iver.es
44
 */
45
package com.iver.cit.gvsig.gui.layout.fframes;
46

    
47
import com.iver.andami.PluginServices;
48
import com.iver.andami.messages.NotificationManager;
49

    
50
import com.iver.cit.gvsig.AddLayer;
51
import com.iver.cit.gvsig.ProjectExtension;
52
import com.iver.cit.gvsig.fmap.DriverException;
53
import com.iver.cit.gvsig.gui.layout.FLayoutUtilities;
54
import com.iver.cit.gvsig.gui.layout.Layout;
55
import com.iver.cit.gvsig.gui.layout.dialogs.Tag;
56
import com.iver.cit.gvsig.gui.project.OpenException;
57
import com.iver.cit.gvsig.gui.project.SaveException;
58
import com.iver.cit.gvsig.project.Project;
59

    
60
import com.iver.utiles.XMLEntity;
61

    
62
import java.awt.Color;
63
import java.awt.Cursor;
64
import java.awt.Font;
65
import java.awt.Graphics2D;
66
import java.awt.Image;
67
import java.awt.Rectangle;
68
import java.awt.event.MouseEvent;
69
import java.awt.geom.AffineTransform;
70
import java.awt.geom.Point2D;
71
import java.awt.geom.Rectangle2D;
72
import java.awt.image.BufferedImage;
73

    
74
import java.net.URL;
75

    
76
import javax.swing.ImageIcon;
77

    
78

    
79
/**
80
 * Clase que implementa la interface IFFrame con los m?todos por defecto de
81
 * todos los FFrames  que extenderan de este, dejando uno como m?todo
82
 * abstracto para implementar por todos los  FFrames para ser dibujados.
83
 *
84
 * @author Vicente Caballero Navarro
85
 */
86
public abstract class FFrame implements IFFrame {
87
    protected String m_name = "FFrame";
88
    private Rectangle2D.Double m_BoundBox = new Rectangle2D.Double();
89
    private Rectangle2D.Double m_BoundingBox = new Rectangle2D.Double();
90
    protected int m_Selected = 0;
91
    protected Rectangle n = new Rectangle();
92
    protected Rectangle ne = new Rectangle();
93
    protected Rectangle e = new Rectangle();
94
    protected Rectangle se = new Rectangle();
95
    protected Rectangle s = new Rectangle();
96
    protected Rectangle so = new Rectangle();
97
    protected Rectangle o = new Rectangle();
98
    protected Rectangle no = new Rectangle();
99
    private String tag = null;
100
    protected int num = 0;
101
    private double m_rotation = 0;
102
    private int level = -1;
103
        private Rectangle2D lastMoveRect;
104

    
105
    /**
106
     * Dibuja los handlers sobre el boundingBox en el graphics que se pasa como
107
     * par?metro.
108
     *
109
     * @param g Graphics sobre el que dibujar.
110
     */
111
    public void drawHandlers(Graphics2D g) {
112
        int size = 10;
113
        Rectangle2D r = getBoundingBox(null);
114
        Point2D p = new Point2D.Double();
115
        g.rotate(Math.toRadians(getRotation()), r.getX() + (r.getWidth() / 2),
116
            r.getY() + (r.getHeight() / 2));
117

    
118
        AffineTransform atRotate = new AffineTransform();
119
        atRotate.rotate(Math.toRadians(getRotation()),
120
            r.getX() + (r.getWidth() / 2), r.getY() + (r.getHeight() / 2));
121

    
122
        g.fillRect((int) r.getX() - size, (int) r.getY() - size, size, size);
123
        atRotate.transform(new Point2D.Double(r.getX() - size, r.getY() - size),
124
            p);
125
        no.setRect((int) p.getX(), (int) p.getY(), size, size);
126

    
127
        g.fillRect((int) r.getMaxX(), (int) r.getY() - size, size, size);
128
        atRotate.transform(new Point2D.Double(r.getMaxX(), r.getY() - size), p);
129
        ne.setRect((int) p.getX(), (int) p.getY(), size, size);
130

    
131
        g.fillRect((int) r.getX() - size, (int) r.getMaxY(), size, size);
132
        atRotate.transform(new Point2D.Double(r.getX() - size, r.getMaxY()), p);
133
        so.setRect((int) p.getX(), (int) p.getY(), size, size);
134

    
135
        g.fillRect((int) r.getMaxX(), (int) r.getMaxY(), size, size);
136
        atRotate.transform(new Point2D.Double(r.getMaxX(), r.getMaxY()), p);
137
        se.setRect((int) p.getX(), (int) p.getY(), size, size);
138

    
139
        g.fillRect((int) r.getCenterX() - (size / 2), (int) r.getY() - size,
140
            size, size);
141
        atRotate.transform(new Point2D.Double(r.getCenterX() - (size / 2),
142
                r.getY() - size), p);
143
        n.setRect((int) p.getX(), (int) p.getY(), size, size);
144

    
145
        g.fillRect((int) r.getCenterX() - (size / 2), (int) r.getMaxY(), size,
146
            size);
147
        atRotate.transform(new Point2D.Double(r.getCenterX() - (size / 2),
148
                r.getMaxY()), p);
149
        s.setRect((int) p.getX(), (int) p.getY(), size, size);
150

    
151
        g.fillRect((int) r.getX() - size, (int) r.getCenterY() - (size / 2),
152
            size, size);
153
        atRotate.transform(new Point2D.Double(r.getX() - size,
154
                r.getCenterY() - (size / 2)), p);
155
        o.setRect((int) p.getX(), (int) p.getY(), size, size);
156

    
157
        g.fillRect((int) r.getMaxX(), (int) r.getCenterY() - (size / 2), size,
158
            size);
159
        atRotate.transform(new Point2D.Double(r.getMaxX(),
160
                r.getCenterY() - (size / 2)), p);
161
        e.setRect((int) p.getX(), (int) p.getY(), size, size);
162
        g.rotate(Math.toRadians(-getRotation()), r.getX() + (r.getWidth() / 2),
163
            r.getY() + (r.getHeight() / 2));
164
    }
165

    
166
    /**
167
     * Establece que tipo de selecci?n se realiza sobre el fframe.
168
     *
169
     * @param p punto sobre el que se debe de establecer si se selecciona o no
170
     *        el fframe.
171
     */
172
    public void setSelected(Point2D p,MouseEvent e) {
173
        m_Selected = getContains(p);
174
    }
175

    
176
    /**
177
     * Actualiza el BoundBox del FFrame a partir de su rect?ngulo en pixels y
178
     * la matriz de transformaci?n.
179
     *
180
     * @param r Rect?ngulo.
181
     * @param at Matriz de transformaci?n.
182
     */
183
    public void updateRect(Rectangle2D r, AffineTransform at) {
184
        Rectangle2D.Double rec = FLayoutUtilities.toSheetRect(r, at);
185
        rec.setRect((int) rec.getMinX(), (int) rec.getMinY(),
186
            (int) rec.getWidth(), (int) rec.getHeight());
187
        setBoundBox(rec);
188
    }
189

    
190
    /**
191
     * Devuelve el rect?ngulo a partir del desplazamiento en el eje x y el
192
     * desplazamiento en el eje y.
193
     *
194
     * @param difx desplazamiento sobre el eje x.
195
     * @param dify desplazamiento sobre el eje y.
196
     *
197
     * @return rect?ngulo modificado en funci?n del desplazamiento realizado.
198
     */
199
    public Rectangle2D getMovieRect(int difx, int dify) {
200
        double x = 0;
201
        double y = 0;
202
        double w = 0;
203
        double h = 0;
204

    
205
        lastMoveRect = new Rectangle2D.Double(this.getBoundingBox(
206
                    null).x, this.getBoundingBox(null).y,
207
                this.getBoundingBox(null).width,
208
                this.getBoundingBox(null).height);
209
        Rectangle2D.Double rec = this.getBoundingBox(null);
210
        int difn = 0;
211
        difn = difx;
212
        x = lastMoveRect.getX();
213
        y = lastMoveRect.getY();
214
        w = lastMoveRect.getWidth();
215
        h = lastMoveRect.getHeight();
216

    
217
        switch (this.getSelected()) {
218
            case (RECT):
219
                lastMoveRect.setRect((x + difx), (y + dify), w, h);
220

    
221
                break;
222

    
223
            case (N):
224

    
225
                if ((y + dify) > rec.getMaxY()) {
226
                    y = rec.getMaxY();
227
                } else {
228
                    y = y + dify;
229
                }
230

    
231
                lastMoveRect.setRect(x, y, w, Math.abs(h - dify));
232

    
233
                break;
234

    
235
            case (O):
236

    
237
                if ((x + difx) > rec.getMaxX()) {
238
                    x = rec.getMaxX();
239
                } else {
240
                    x = x + difx;
241
                }
242

    
243
                lastMoveRect.setRect(x, y, Math.abs(w - difx), h);
244

    
245
                break;
246

    
247
            case (S):
248

    
249
                if (y > (rec.getMaxY() + dify)) {
250
                    y = rec.getMaxY() + dify;
251
                }
252

    
253
                lastMoveRect.setRect(x, y, w, Math.abs(h + dify));
254

    
255
                break;
256

    
257
            case (E):
258

    
259
                if (x > (rec.getMaxX() + difx)) {
260
                    x = rec.getMaxX() + difx;
261
                }
262

    
263
                lastMoveRect.setRect(x, y, Math.abs(w + difx), h);
264

    
265
                break;
266

    
267
            case (NE):
268

    
269
                if ((y - difn) > rec.getMaxY()) {
270
                    y = rec.getMaxY();
271
                    x = rec.getMaxX() + difn;
272
                } else {
273
                    y = y - difn;
274
                }
275

    
276
                lastMoveRect.setRect(x, y, Math.abs(w + difn), Math.abs(h + difn));
277

    
278
                break;
279

    
280
            case (NO):
281

    
282
                if ((y + difn) > rec.getMaxY()) {
283
                    y = rec.getMaxY();
284
                    x = rec.getMaxX();
285
                } else {
286
                    x = x + difn;
287
                    y = y + difn;
288
                }
289

    
290
                lastMoveRect.setRect(x, y, Math.abs(w - difn), Math.abs(h - difn));
291

    
292
                break;
293

    
294
            case (SE):
295

    
296
                if (y > (rec.getMaxY() + difn)) {
297
                    y = rec.getMaxY() + difn;
298
                    x = rec.getMaxX() + difn;
299
                }
300

    
301
                lastMoveRect.setRect(x, y, Math.abs(w + difn), Math.abs(h + difn));
302

    
303
                break;
304

    
305
            case (SO):
306

    
307
                if ((x + difn) > rec.getMaxX()) {
308
                    x = rec.getMaxX();
309
                    y = rec.getMaxY() - difn;
310
                } else {
311
                    x = x + difn;
312
                }
313

    
314
                lastMoveRect.setRect(x, y, Math.abs(w - difn), Math.abs(h - difn));
315

    
316
                break;
317

    
318
            default:
319
                lastMoveRect.setRect((x), (y), w, h);
320
        }
321

    
322
        return lastMoveRect;
323
    }
324
    /**
325
     * Devuelve el rect?ngulo que representa el ?ltimo generado al desplazar o modificar el tama?o del fframe.
326
     *
327
     * @return Rectangle2D
328
     *
329
     */
330
    public Rectangle2D getLastMoveRect(){
331
            return lastMoveRect;
332
    }
333
    /**
334
     * Devuelve un entero que representa el tipo de selecci?n que se ha
335
     * realizado sobre el fframe.
336
     *
337
     * @return tipo de selecci?n que se ha realizado.
338
     */
339
    public int getSelected() {
340
        return m_Selected;
341
    }
342

    
343
    /**
344
     * Devuelve true, si el punto que se pasa como par?metro esta contenido
345
     * dentro del boundingbox del fframe.
346
     *
347
     * @param p punto a comprobar.
348
     *
349
     * @return true si el punto esta dentro del boundingbox.
350
     */
351
    public boolean contains(Point2D p) {
352
        return getBoundingBox(null).contains(p.getX(), p.getY());
353
    }
354

    
355
    /**
356
     * Devuelve un entero que representa donde esta contenido el punto que se
357
     * pasa como par?metro.
358
     *
359
     * @param p punto a comparar.
360
     *
361
     * @return entero que representa como esta contenido el punto.
362
     */
363
    public int getContains(Point2D p) {
364
        if (n.contains(p.getX(), p.getY())) {
365
            return N;
366
        } else if (ne.contains(p.getX(), p.getY())) {
367
            return NE;
368
        } else if (e.contains(p.getX(), p.getY())) {
369
            return E;
370
        } else if (se.contains(p.getX(), p.getY())) {
371
            return SE;
372
        } else if (s.contains(p.getX(), p.getY())) {
373
            return S;
374
        } else if (so.contains(p.getX(), p.getY())) {
375
            return SO;
376
        } else if (o.contains(p.getX(), p.getY())) {
377
            return O;
378
        } else if (no.contains(p.getX(), p.getY())) {
379
            return NO;
380
        } else if (getBoundingBox(null).contains(p.getX(), p.getY())) {
381
            return RECT;
382
        }
383

    
384
        return NOSELECT;
385
    }
386

    
387
    /**
388
     * Devuelve el Cursor adecuado seg?n como est? contenido el punto, si es
389
     * para desplazamiento, o cambio de tama?o.
390
     *
391
     * @param p punto a comprobar.
392
     *
393
     * @return Cursor adecuado a la posici?n.
394
     */
395
    public Cursor getMapCursor(Point2D p) {
396
        int select = getContains(p);
397

    
398
        switch (select) {
399
            case (N):
400
                return Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);
401

    
402
            case (NE):
403
                return Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR);
404

    
405
            case (E):
406
                return Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
407

    
408
            case (SE):
409
                return Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR);
410

    
411
            case (S):
412
                return Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);
413

    
414
            case (SO):
415
                return Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR);
416

    
417
            case (O):
418
                return Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
419

    
420
            case (NO):
421
                return Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR);
422

    
423
            case (RECT):
424
                return Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
425
        }
426

    
427
        return null;
428
    }
429

    
430
    /**
431
     * Este m?todo se implementa en cada una de las fframe, ya que cada una se
432
     * dibuja de una forma diferente sobre el graphics. M?todo que dibuja
433
     * sobre el graphics que se le pasa como par?metro, seg?n la transformada
434
     * afin que se debe de aplicar y el rect?ngulo que se debe de dibujar.
435
     * M?todo que dibuja sobre el graphics que se le pasa como par?metro,
436
     * seg?n la transformada afin que se debe de aplicar y el rect?ngulo que
437
     * se debe de dibujar.
438
     *
439
     * @param g Graphics
440
     * @param at Transformada afin.
441
     * @param r rect?ngulo sobre el que hacer un clip.
442
     * @param imgBase DOCUMENT ME!
443
     *
444
     * @throws DriverException
445
     */
446
    public abstract void draw(Graphics2D g, AffineTransform at, Rectangle2D r,
447
        BufferedImage imgBase) throws DriverException;
448

    
449
    /**
450
     * Devuelve el nombre que representa al fframe.
451
     *
452
     * @return String
453
     */
454
    public String getName() {
455
        return m_name;
456
    }
457

    
458
    /**
459
     * Rellena el String que representa al nombre del fframe.
460
     *
461
     * @param n nombre del fframe.
462
     */
463
    public void setName(String n) {
464
        m_name = n;
465
    }
466

    
467
    /**
468
     * Devuelve el boundingBox del fframe en funci?n de la transformada af?n
469
     * que se pasa como par?metro. Si se pasa como par?metro null, devuelve el
470
     * ?ltimo boundingbox que se calcul?.
471
     *
472
     * @param at Transformada af?n
473
     *
474
     * @return Rect?ngulo que representa el BoundingBox del fframe.
475
     */
476
    public Rectangle2D.Double getBoundingBox(AffineTransform at) {
477
        if (at == null) {
478
            return m_BoundingBox;
479
        }
480

    
481
        m_BoundingBox = FLayoutUtilities.fromSheetRect(m_BoundBox, at);
482

    
483
        return m_BoundingBox;
484
    }
485

    
486
    /**
487
     * Rellena con el rect?ngulo que se pasa como par?metro el boundBox(en
488
     * cent?metros) del fframe del cual con una transformaci?n se podr?
489
     * calcular el BoundingBox (en pixels).
490
     *
491
     * @param r Rect?ngulo en cent?metros.
492
     */
493
    public void setBoundBox(Rectangle2D r) {
494
        m_BoundBox.setRect(r.getX(), r.getY(), r.getWidth(), r.getHeight());
495
    }
496

    
497
    /**
498
     * Devuelve el rect?ngulo que representa el fframe en cent?metros.
499
     *
500
     * @return Rect?ngulo en centimetros.
501
     */
502
    public Rectangle2D.Double getBoundBox() {
503
        return m_BoundBox;
504
    }
505

    
506
    /**
507
     * Pasando como par?metro true,  se toma como que esta seleccionado el
508
     * fframe  y si es false como que esta sin seleccionar,  de esta forma se
509
     * selecciona un fframe directamente  sin comprobar si un punto esta
510
     * contenido en ?l.
511
     *
512
     * @param b true si se quiere seleccionar y false si se quiere
513
     *        deseleccionar.
514
     */
515
    public void setSelected(boolean b) {
516
        if (b) {
517
            m_Selected = RECT;
518
        } else {
519
            m_Selected = IFFrame.NOSELECT;
520
        }
521
    }
522

    
523
    /**
524
     * Crea un Objeto FFrame seg?n el tipo que sea, a partir de la informaci?n
525
     * del XMLEntity.
526
     *
527
     * @param xml XMLEntity
528
     * @param l Layout.
529
     * @param p Proyecto.
530
     *
531
     * @return Objeto de esta clase.
532
     */
533
    public static IFFrame createFFrame03(XMLEntity xml, Layout l, Project p) {
534
        IFFrame fframe = null;
535

    
536
        try {
537
            Class clase = Class.forName(xml.getStringProperty("className"));
538
            fframe = (IFFrame) clase.newInstance();
539
        } catch (Exception e) {
540
            NotificationManager.addError("Clase de Frame sobre el Layout no reconocida",
541
                e);
542
        }
543

    
544
        if (fframe instanceof IFFrameUseProject) {
545
            ((IFFrameUseProject) fframe).setProject(p);
546
        }
547

    
548
        fframe.setBoundBox(new Rectangle2D.Double(xml.getDoubleProperty("x"),
549
                xml.getDoubleProperty("y"), xml.getDoubleProperty("w"),
550
                xml.getDoubleProperty("h")));
551
        fframe.setXMLEntity03(xml, l);
552
        fframe.setName(xml.getStringProperty("m_name"));
553

    
554
        fframe.setTag(xml.getStringProperty("tag"));
555

    
556
        return fframe;
557
    }
558

    
559
    /**
560
     * Crea un Objeto FFrame seg?n el tipo que sea, a partir de la informaci?n
561
     * del XMLEntity.
562
     *
563
     * @param xml XMLEntity
564
     * @param p Proyecto.
565
     *
566
     * @return Objeto de esta clase.
567
     *
568
     * @throws OpenException DOCUMENT ME!
569
     */
570
    public static IFFrame createFFrame(XMLEntity xml, Project p,Layout layout)
571
        throws OpenException {
572
        IFFrame fframe = null;
573
        String className = "IFFrame";
574
        Class clase = null;
575

    
576
        try {
577
            className = xml.getStringProperty("className");
578
            clase = Class.forName(className);
579
        } catch (ClassNotFoundException e) {
580
            NotificationManager.addError("Clase de Frame sobre el Layout no reconocida",
581
                e);
582
        }
583

    
584
        try {
585
            fframe = (IFFrame) clase.newInstance();
586
        } catch (InstantiationException e) {
587
            NotificationManager.addError("Fallo creando el Frame: " +
588
                clase.getName(), e);
589
        } catch (IllegalAccessException e) {
590
            NotificationManager.addError("Fallo creando el Frame: " +
591
                clase.getName(), e);
592
        }
593

    
594
        try {
595
            if (fframe instanceof IFFrameUseProject) {
596
                ((IFFrameUseProject) fframe).setProject(p);
597
            }
598
            if (fframe instanceof IFFrameLayoutDependence) {
599
                ((IFFrameLayoutDependence) fframe).setLayout(layout);
600
            }
601

    
602

    
603
            if (xml.contains("level")) {
604
                fframe.setLevel(xml.getIntProperty("level"));
605
            }
606
            if (xml.contains("num")){
607
                    fframe.setNum(xml.getIntProperty("num"));
608
            }
609
            fframe.setName(xml.getStringProperty("m_name"));
610
            fframe.setBoundBox(new Rectangle2D.Double(xml.getDoubleProperty("x"),
611
                    xml.getDoubleProperty("y"), xml.getDoubleProperty("w"),
612
                    xml.getDoubleProperty("h")));
613
            fframe.setXMLEntity(xml);
614
            fframe.setTag(xml.getStringProperty("tag"));
615
        } catch (Exception e) {
616
            throw new OpenException(e, className);
617
        }
618

    
619
        return fframe;
620
    }
621

    
622
    /**
623
     * Dibuja sobre el graphics el rect?ngulo del fframe en modo borrador.
624
     *
625
     * @param g Graphics so bre el que dibujar.
626
     */
627
    public void drawDraft(Graphics2D g) {
628
        Rectangle2D r = getBoundingBox(null);
629

    
630
        g.setColor(Color.lightGray);
631
        g.fillRect((int) r.getX(), (int) r.getY(), (int) r.getWidth(),
632
            (int) r.getHeight());
633
        g.setColor(Color.black);
634

    
635
        int scale = (int) (r.getWidth() / 12);
636
        Font f = new Font("SansSerif", Font.PLAIN, scale);
637
        g.setFont(f);
638
        g.drawString(getName(),
639
            (int) (r.getCenterX() - ((getName().length() * scale) / 4)),
640
            (int) (r.getCenterY()));
641
    }
642

    
643
    /**
644
     * Rellena con el n?mero de FFrame.
645
     *
646
     * @param i n?mero
647
     */
648
    public void setNum(int i) {
649
        num = i;
650
    }
651

    
652
    /**
653
     * Dibuja sobre el graphics el rect?ngulo del fframe pero vacio, mostrando
654
     * el nombre del fframe y vacio.
655
     *
656
     * @param g Graphics sobre el que dibujar.
657
     */
658
    public void drawEmpty(Graphics2D g) {
659
        Rectangle2D r = getBoundingBox(null);
660
        g.setColor(Color.lightGray);
661
        g.fillRect((int) r.getX(), (int) r.getY(), (int) r.getWidth(),
662
            (int) r.getHeight());
663
        g.setColor(Color.darkGray);
664
        g.drawRect((int) r.getX(), (int) r.getY(), (int) r.getWidth(),
665
                (int) r.getHeight());
666
        g.setColor(Color.black);
667

    
668
        int scale = (int) (r.getWidth() / 12);
669
        Font f = new Font("SansSerif", Font.PLAIN, scale);
670
        g.setFont(f);
671

    
672
        String s = this.getNameFFrame() + " " +
673
            PluginServices.getText(this, "vacia");
674

    
675
        g.drawString(s, (int) (r.getCenterX() - ((s.length() * scale) / 4)),
676
            (int) (r.getCenterY()));
677
    }
678

    
679
    /**
680
     * Devuelve true si el rect?ngulo primero es null o si es distinto de null
681
     * e intersecta.
682
     *
683
     * @param rv Rect?ngulo
684
     * @param r Rect?ngulo
685
     *
686
     * @return True si intersecta o es null.
687
     */
688
    public boolean intersects(Rectangle2D rv, Rectangle2D r) {
689
        return (((rv != null) && rv.intersects(r)) || (rv == null));
690
    }
691

    
692
    /**
693
     * Abre el di?logo para cambiar o a?adir el tag.
694
     */
695
    public void openTag() {
696
        Tag tag = new Tag(this);
697
        PluginServices.getMDIManager().addView(tag);
698
    }
699

    
700
    /**
701
     * Rellena el tag del FFrame.
702
     *
703
     * @param s String que representa el valor a guardar en el tag.
704
     */
705
    public void setTag(String s) {
706
        tag = s;
707
    }
708

    
709
    /**
710
     * Devuelve el tag.
711
     *
712
     * @return tag.
713
     */
714
    public String getTag() {
715
        return tag;
716
    }
717

    
718
    /**
719
     * Dibuja sobre el graphics que se pasa como par?metro el icono que
720
     * representa que contiene un tag.
721
     *
722
     * @param g Graphics sobre el que dibujar el icono.
723
     */
724
    public void drawSymbolTag(Graphics2D g) {
725
        Rectangle2D rec = getBoundingBox(null);
726
        g.rotate(Math.toRadians(getRotation()),
727
            rec.getX() + (rec.getWidth() / 2),
728
            rec.getY() + (rec.getHeight() / 2));
729

    
730
        try {
731
            URL url = AddLayer.class.getClassLoader().getResource("images/symbolTag.gif");
732
            Image image = new ImageIcon(url).getImage();
733
            g.drawImage(image, (int) rec.getX(), (int) rec.getY(), 25, 30, null);
734
        } catch (NullPointerException npe) {
735
        }
736

    
737
        g.rotate(Math.toRadians(-getRotation()),
738
            rec.getX() + (rec.getWidth() / 2),
739
            rec.getY() + (rec.getHeight() / 2));
740
    }
741

    
742
    /**
743
     * Rellenar la rotaci?n para aplicar al FFrame.
744
     *
745
     * @param rotation rotaci?n que se quiere aplicar.
746
     */
747
    public void setRotation(double rotation) {
748
        m_rotation = rotation;
749
    }
750

    
751
    /**
752
     * Devuelve la rotaci?n del FFrame.
753
     *
754
     * @return Rotaci?n del FFrame.
755
     */
756
    public double getRotation() {
757
        return m_rotation;
758
    }
759

    
760
    /**
761
     * Devuelve el nivel en el que se encuentra el FFrame.
762
     *
763
     * @return nivel
764
     */
765
    public int getLevel() {
766
        return level;
767
    }
768

    
769
    /**
770
     * Inserta el nivel al que se encuentra el FFrame.
771
     *
772
     * @param l entero que refleja el nivel del FFrame.
773
     */
774
    public void setLevel(int l) {
775
        level = l;
776
    }
777

    
778
    /**
779
     * DOCUMENT ME!
780
     *
781
     * @param layout DOCUMENT ME!
782
     *
783
     * @return DOCUMENT ME!
784
     */
785
    public IFFrame cloneFFrame(Layout layout) {
786
        Project p = ((ProjectExtension) PluginServices.getExtension(ProjectExtension.class)).getProject();
787
        IFFrame frame = null;
788

    
789
        try {
790
            frame = createFFrame(this.getXMLEntity(), p,layout);
791
        } catch (OpenException e) {
792
            e.showError();
793
        } catch (SaveException e) {
794
            e.showError();
795
        }
796

    
797
        if (frame instanceof IFFrameLayoutDependence) {
798
            ((IFFrameLayoutDependence) frame).setLayout(layout);
799
        }
800

    
801
        if (frame instanceof IFFrameViewDependence) {
802
            ((IFFrameViewDependence) frame).initDependence(layout.getAllFFrames());
803
        }
804

    
805
        return frame;
806
    }
807

    
808
    /**
809
     * DOCUMENT ME!
810
     *
811
     * @return DOCUMENT ME!
812
     *
813
     * @throws SaveException DOCUMENT ME!
814
     */
815
    public XMLEntity getXMLEntity() throws SaveException {
816
        XMLEntity xml = new XMLEntity();
817
        xml.putProperty("className", this.getClass().getName());
818
        xml.putProperty("m_name", m_name);
819
        xml.putProperty("x", getBoundBox().x);
820
        xml.putProperty("y", getBoundBox().y);
821
        xml.putProperty("w", getBoundBox().width);
822
        xml.putProperty("h", getBoundBox().height);
823
        xml.putProperty("m_Selected", m_Selected);
824
        xml.putProperty("tag", getTag());
825
        xml.putProperty("m_rotation", getRotation());
826
        xml.putProperty("level",getLevel());
827
        xml.putProperty("num",num);
828
        return xml;
829
    }
830

    
831
}