Statistics
| Revision:

svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / layout / fframes / FFrameLegend.java @ 312

History | View | Annotate | Download (28.3 KB)

1
/*
2
 * Created on 20-feb-2004
3
 *
4
 * To change the template for this generated file go to
5
 * Window>Preferences>Java>Code Generation>Code and Comments
6
 */
7
package com.iver.cit.gvsig.gui.layout.fframes;
8

    
9
import com.iver.cit.gvsig.fmap.FConstant;
10
import com.iver.cit.gvsig.fmap.FGraphicUtilities;
11
import com.iver.cit.gvsig.fmap.FLayers;
12
import com.iver.cit.gvsig.fmap.FLyrGroup;
13
import com.iver.cit.gvsig.fmap.FLyrVect;
14
import com.iver.cit.gvsig.fmap.FMap;
15
import com.iver.cit.gvsig.fmap.FRenderer;
16
import com.iver.cit.gvsig.fmap.FSymbol;
17
import com.iver.cit.gvsig.fmap.IFLayer;
18
import com.iver.cit.gvsig.gui.layout.FLayoutUtilities;
19
import com.iver.cit.gvsig.gui.layout.Layout;
20
import com.iver.cit.gvsig.gui.toc.FTheme;
21
import com.iver.cit.gvsig.project.Project;
22

    
23
import com.iver.utiles.XMLEntity;
24

    
25
import java.awt.Color;
26
import java.awt.Font;
27
import java.awt.Graphics2D;
28
import java.awt.Rectangle;
29
import java.awt.font.FontRenderContext;
30
import java.awt.font.TextLayout;
31
import java.awt.geom.AffineTransform;
32
import java.awt.geom.Rectangle2D;
33
import java.awt.image.BufferedImage;
34

    
35

    
36
/**
37
 * FFrame para introducir la leyenda de la vista que seleccionemos en el
38
 * Layout.
39
 *
40
 * @author Vicente Caballero Navarro
41
 */
42
public class FFrameLegend extends FFrame {
43
    private static final int PRESENTACION = 0;
44
    private static final int BORRADOR = 1;
45
    private int m_numLayers = 0;
46
    private int m_max = 0;
47
    private int m_quality = 0;
48
    private int m_viewing = 0;
49
    private FontRenderContext m_frc = null;
50
    private FMap m_fmap = null;
51
    private Font m_f = new Font("Monospaced", Font.PLAIN, 9);
52
    private FFrameView fframeview = null;
53
    private int num = 0;
54

    
55
    /**
56
     * Creates a new FFrameLegend object.
57
     */
58
    public FFrameLegend() {
59
    }
60

    
61
    /**
62
     * DOCUMENT ME!
63
     *
64
     * @param f DOCUMENT ME!
65
     */
66
    public void setFFrameView(FFrameView f) {
67
        fframeview = f;
68
    }
69

    
70
    /**
71
     * DOCUMENT ME!
72
     *
73
     * @return DOCUMENT ME!
74
     */
75
    public FFrameView getFFrameView() {
76
        return fframeview;
77
    }
78

    
79
    /**
80
     * Rellena el FMap de la vista que se representa en esta leyenda.
81
     *
82
     * @return DOCUMENT ME!
83
     */
84

    
85
    /* public void setFMap(FMap map) {
86
       m_fmap = map;
87
       }
88
     */
89

    
90
    /**
91
     * Devuelve el FMap de la vista que se representa en esta leyenda.
92
     *
93
     * @return FMap.
94
     */
95
    public FMap getFMap() {
96
        return fframeview.getFMap();
97
    }
98

    
99
    /**
100
     * Rellena la calidad que se quiere aplicar.
101
     *
102
     * @param q entero que representa la calidad a aplicar.
103
     */
104
    public void setQuality(int q) {
105
        m_quality = q;
106
    }
107

    
108
    /**
109
     * Devuelve un entero que representa la calidad que est? seleccionada.
110
     *
111
     * @return tipo de calidad selccionada.
112
     */
113
    public int getQuality() {
114
        return m_quality;
115
    }
116

    
117
    /**
118
     * Devuelve un entero que representa la forma en que se actualiza la vista.
119
     *
120
     * @return forma que se actualiza la vista.
121
     */
122
    public int getViewing() {
123
        return m_viewing;
124
    }
125

    
126
    /**
127
     * Rellena la forma de actualizar la vista.
128
     *
129
     * @param v entero que representa la forma de actualizar la vista.
130
     */
131
    public void setViewing(int v) {
132
        m_viewing = v;
133
    }
134

    
135
    /**
136
     * M?todo que dibuja sobre el graphics que se le pasa como par?metro, seg?n
137
     * la transformada afin que se debe de aplicar y el rect?ngulo que se debe
138
     * de dibujar.
139
     *
140
     * @param g Graphics
141
     * @param at Transformada afin.
142
     * @param rv rect?ngulo sobre el que hacer un clip.
143
     * @param imgBase DOCUMENT ME!
144
     */
145
    public void draw(Graphics2D g, AffineTransform at, Rectangle2D rv,
146
        BufferedImage imgBase) {
147
        Rectangle2D.Double re = getBoundingBox(at);
148
        FLayers layers = null;
149

    
150
        if ((fframeview != null) && (fframeview.getFMap() != null)) {
151
            layers = fframeview.getFMap().getLayers();
152
        }
153

    
154
        m_max = 0;
155

    
156
        if (intersects(rv, re)) {
157
            if (layers == null) { //Si no se ha seleccionado ninguna vista para crear la leyenda.
158
                drawEmpty(g);
159
            } else {
160
                if ((rv == null) || (getQuality() == PRESENTACION)) {
161
                    /////Aqu? hay que calcular cuantos layers y sublayers hay, para saber que distancias dejar entre uno y otro.
162
                    ///y adem?s el tama?o de cada uno de ellos para saber que anchura dejar.
163
                    m_numLayers = 0;
164

    
165
                    for (int i = 0; i < layers.getLayersCount(); i++) {
166
                        IFLayer layer = (IFLayer) layers.getLayer(i);
167

    
168
                        if (layer.getName().length() > m_max) {
169
                            m_max = layers.getLayer(i).getName().length();
170
                        }
171

    
172
                        if (layer instanceof FLyrVect) {
173
                            m_numLayers += getNumInVect((FLyrVect) layer);
174
                        }
175

    
176
                        if (layer instanceof FLyrGroup) {
177
                            m_numLayers += getNumInLyrGroup((FLyrGroup) layer);
178
                        }
179
                    }
180

    
181
                    m_frc = g.getFontRenderContext();
182

    
183
                    int[] pos = new int[8];
184
                    pos[0] = 5; //x
185
                    pos[1] = 0; //y
186
                    pos[2] = 0; //i
187
                    pos[3] = 0; //j
188
                    pos[4] = 0; //k
189
                    pos[5] = 0; //in
190
                    pos[6] = 0; //kn
191
                    pos[7] = 0;
192

    
193
                    //////Se recorren los layers dibujando el s?mbolo y su nombre sobre el graphics        
194
                    for (pos[2] = layers.getLayersCount() - 1; pos[2] >= 0;
195
                            pos[2]--) {
196
                        IFLayer layer = layers.getLayer(pos[2]);
197

    
198
                        if (layer.isVisible()) {
199
                            //pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
200
                            //    pos[3] + pos[4])) + pos[0]) * 0.9);
201
                            if (layer instanceof FLyrVect) {
202
                                drawVect(g, re, layer, pos);
203
                            }
204

    
205
                            if (layer instanceof FLyrGroup) {
206
                                drawGroup(g, re, layer, pos);
207
                            }
208

    
209
                            // if lyrGroup
210
                        }
211

    
212
                        //if isVisible()
213
                    }
214
                } else {
215
                    drawDraft(g);
216
                }
217
            }
218
        }
219
        m_numLayers--;
220
        
221
    }
222

    
223
    /**
224
     * DOCUMENT ME!
225
     *
226
     * @param layer DOCUMENT ME!
227
     *
228
     * @return DOCUMENT ME!
229
     */
230
    private int getNumInVect(FLyrVect layer) {
231
        int num = 0;
232

    
233
        if (((FLyrVect) layer).isVisible()) {
234
            num++;
235

    
236
            if ((((FLyrVect) layer).getRenderer().getLegendType() == FConstant.LEGEND_TYPE_BREAK) ||
237
                    (((FLyrVect) layer).getRenderer().getLegendType() == FConstant.LEGEND_TYPE_VALUE)) {
238
                num = num + ((FLyrVect) layer).getRenderer().getValueCount();
239

    
240
                ///controlar la anchura de los s?mbolos.
241
                for (int j = 0;
242
                        j < ((FLyrVect) layer).getRenderer().getValueCount();
243
                        j++) {
244
                    String s = ((FLyrVect) layer).getRenderer().getSymbolByID(j).m_Descrip;
245

    
246
                    if (s.length() > m_max) {
247
                        m_max = s.length();
248
                    }
249
                }
250
            }
251
        }
252

    
253
        return num;
254
    }
255

    
256
    /**
257
     * DOCUMENT ME!
258
     *
259
     * @param layer DOCUMENT ME!
260
     *
261
     * @return DOCUMENT ME!
262
     */
263
    private int getNumInLyrGroup(FLyrGroup layer) {
264
        int num = 0;
265

    
266
        if (((FLyrGroup) layer).isVisible()) {
267
            num+=2;
268

    
269
            for (int k = 0; k < ((FLyrGroup) layer).getLayers().size(); k++) {
270
                FLyrVect subLayer = (FLyrVect) ((FLyrGroup) layer).getLayers()
271
                                                .get(k);
272

    
273
                if (subLayer.isVisible()) {
274
                        num+=getNumInVect(subLayer);
275
                    //num = num + subLayer.getRenderer().getValueCount();
276

    
277
                    //m_numLayers++;
278
                    for (int j = 0;
279
                            j < ((FLyrVect) subLayer).getRenderer()
280
                                     .getValueCount(); j++) {
281
                        String s = ((FLyrVect) subLayer).getRenderer()
282
                                    .getSymbolByID(j).m_Descrip;
283

    
284
                        if (s.length() > m_max) {
285
                            m_max = s.length();
286
                        }
287
                    }
288
                }
289
            }
290
        }
291

    
292
        return num;
293
    }
294

    
295
    /**
296
     * Rellena la fuente a utilizar al dibujar los String sobre el graphics.
297
     *
298
     * @param f Font.
299
     */
300
    public void setFont(Font f) {
301
        m_f = f;
302
    }
303

    
304
    /**
305
     * Devuelve la fuente que esta utilizando.
306
     *
307
     * @return Font.
308
     */
309
    public Font getFont() {
310
            if (m_f!=null){
311
        return new Font(m_f.getFontName(), m_f.getStyle(), 9);
312
            }
313
            return null;
314
    }
315

    
316
    /**
317
     * Dibuja el String sobre el graphics con el tama?o y posici?n que pasamos
318
     * como par?metro.
319
     *
320
     * @param g Graphics sobre el que dibujamos.
321
     * @param size Tama?o de la fuente.
322
     * @param s Cadena a dibujar.
323
     * @param posX Posici?n en el eje de las X.
324
     * @param posY Posici?n en el eje de las Y.
325
     */
326
    private void drawName(Graphics2D g, int size, String s, float posX,
327
        float posY) {
328
            if (m_f!=null){
329
        m_f = new Font(m_f.getFontName(), m_f.getStyle(), size);
330
            }else{
331
                    m_f=new Font("SansSerif",Font.PLAIN,size);
332
            }
333
        g.setColor(Color.black);
334

    
335
        TextLayout textLayout = new TextLayout(s, m_f, m_frc);
336
        textLayout.draw(g, posX, posY);
337
    }
338

    
339
    /**
340
     * Dibuja sobre el graphics la leyenda de la capa vectorial que se pasa
341
     * como par?metro.
342
     *
343
     * @param g Graphics sobre el que se dibuja.
344
     * @param re Rect?ngulo del FFrame.
345
     * @param layer Capa a representar.
346
     * @param pos Array de enteros con informaci?n sobre la posici?n donde
347
     *        dibujar el nombre y s?mbolo de la leyenda.
348
     */
349
    private void drawVect(Graphics2D g, Rectangle2D.Double re, IFLayer layer,
350
        int[] pos) {
351
        double dif1 = 0.7;
352
        double dif2 = 0.2;
353
        Rectangle rec = new Rectangle((int) (re.x + pos[0]),
354
                (int) (re.y + pos[1]), (int) ((re.width * dif2) / 2),
355
                (int) (re.height / m_numLayers * dif1));
356
        int sizeText = (int) ((re.width * 1.4) / m_max);
357
        AffineTransform mT2 = new AffineTransform();
358
        mT2.setToIdentity();
359

    
360
        FLyrVect lyrVect = (FLyrVect) layer;
361
        FRenderer r = lyrVect.getRenderer();
362

    
363
        FSymbol theSymbol = null;
364

    
365
        switch (r.getLegendType()) {
366
            case FConstant.LEGEND_TYPE_DEFAULT:
367
                pos[1] = (int) (((re.height / m_numLayers * (pos[5] + pos[6] +
368
                    pos[7])) + pos[0]) * dif1);
369

    
370
                /* rec.y = ((int) re.y + pos[1] + (rec.height / 2)) -
371
                   (sizeText / 2);
372
                 */
373
                theSymbol = r.getDefaultSymbol();
374
                rec.y = ((int) re.y + pos[1]);// + (rec.height / 2)) -
375
                    //(sizeText / 2);
376
                rec.width = (int) (re.width * dif2);
377
                rec.height = (int) sizeText;
378
                                
379
                                if (theSymbol.m_Font!=null){
380
                                        theSymbol.m_Font=new Font("SansSerif", Font.PLAIN, sizeText/3);
381
                                }
382
                FGraphicUtilities.DrawSymbol((Graphics2D) g, mT2, rec, theSymbol);
383
                drawName(g, sizeText, layer.getName(),
384
                    (float) (rec.x + ((re.width * dif1) / 2)),
385
                    (float) (rec.y + (rec.height * dif1)));
386
                pos[5]++;
387

    
388
                break;
389

    
390
            case FConstant.LEGEND_TYPE_BREAK:
391
            case FConstant.LEGEND_TYPE_VALUE:
392
                pos[1] = (int) (((re.height / m_numLayers * (pos[5] + pos[6] +
393
                    pos[7])) + pos[0]) * dif1);
394
                rec.y = ((int) re.y + pos[1] + (rec.height / 2)) -
395
                    (sizeText / 2);
396
                drawName(g, sizeText, layer.getName(), (float) (rec.x),
397
                    (float) (rec.y + (rec.height * dif1)));
398
                pos[5]++;
399

    
400
                for (pos[3] = 0; pos[3] < r.getValueCount(); pos[3]++) {
401
                    theSymbol = r.getSymbolByID(pos[3]);
402
                    pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
403
                        pos[3] + pos[6] + pos[7])) + pos[0]) * dif1);
404

    
405
                    int size1 = (int) ((re.width * 1) / m_max);
406

    
407
                    rec.x = (int) (re.x + (re.width * dif2));
408
                    rec.y = ((int) re.y + pos[1] + (rec.height / 2)) -
409
                        (size1 / 2);
410
                    rec.height = (int) (size1 * dif1);
411
                    rec.width = (int) ((re.width * dif2) / 3);
412
                    FGraphicUtilities.DrawSymbol((Graphics2D) g, mT2, rec,
413
                        theSymbol);
414
                    drawName(g, size1, theSymbol.m_Descrip,
415
                        (float) (rec.x + ((re.width * dif2) / 2)),
416
                        (float) (rec.y + (rec.height * dif1)));
417
                }
418

    
419
                pos[7] += pos[3];
420

    
421
                break;
422
        }
423

    
424
        pos[5]++;
425
    }
426

    
427
    /**
428
     * Dibuja sobre el graphics la leyenda de la capa Grupo que se pasa como
429
     * par?metro.
430
     *
431
     * @param g Graphics sobre el que se dibuja.
432
     * @param re Rect?ngulo del FFrame.
433
     * @param layer Capa a representar.
434
     * @param pos Array de enteros con informaci?n sobre la posici?n donde
435
     *        dibujar el nombre y s?mbolo de la leyenda.
436
     */
437
    private void drawGroup(Graphics2D g, Rectangle2D.Double re, IFLayer layer,
438
        int[] pos) {
439
        double dif1 = 0.7;
440
        double dif2 = 0.2;
441
        FLyrGroup lyrGroup = (FLyrGroup) layer;
442
        int sizeText = (int) ((re.width * 1.4) / m_max);
443
                pos[1] = (int) (((re.height / m_numLayers * (pos[5] + pos[6] +
444
                                                        pos[7])) + pos[0]) * dif1);
445

    
446
        Rectangle rec = new Rectangle((int) (re.x + pos[0]),
447
                (int) (re.y + pos[1]), (int) (re.width * dif2),
448
                (int) (re.height / m_numLayers * dif1));
449
        AffineTransform mT2 = new AffineTransform();
450

    
451
        mT2.setToIdentity();
452

    
453
        drawName(g, sizeText, layer.getName(),
454
            (float) (rec.x + ((re.width * dif2) / 2)),
455
            (float) (rec.y + (rec.height * dif1)));
456
                pos[6]++;
457
        for (pos[4] = 0; pos[4] < lyrGroup.getLayers().size(); pos[4]++) {
458
            IFLayer subLayer = (IFLayer) lyrGroup.getLayers().get(pos[4]);
459
            FTheme elSubTema = new FTheme(subLayer);
460

    
461
            if (subLayer instanceof FLyrVect) {
462
                FLyrVect lyrVect = (FLyrVect) subLayer;
463
                FRenderer r = lyrVect.getRenderer();
464
                drawVect(g,re,subLayer,pos);
465
            }
466

    
467
            //if isVisible() subLayer
468
        }
469

    
470
        // for k
471
    }
472

    
473
    /**
474
     * Transforma un FFrameLegend en FFrameText y FFrameSymbol, tantos como
475
     * leyendas visibles hayan.
476
     *
477
     * @param layout
478
     */
479
    public void toFFrames(Layout layout) {
480
        Rectangle2D.Double re = getBoundingBox(null);
481
        double dif1 = 0.7;
482
        double dif2 = 0.2;
483
        FLayers layers = fframeview.getFMap().getLayers();
484
        int sizeText = (int) ((re.width * 1.4) / m_max);
485
        int[] pos = new int[8];
486

    
487
        pos[0] = 5; //posx
488
        pos[1] = 0; //posy
489
        pos[2] = 0; //i
490
        pos[3] = 0; //j
491
        pos[4] = 0; //k
492
        pos[5] = 0; //in
493
        pos[6] = 0; //kn
494
        pos[7] = 0;
495

    
496
        //////Se recorren los layers dibujando el s?mbolo y su nombre sobre el graphics        
497
        for (pos[2] = layers.getLayersCount() - 1; pos[2] >= 0; pos[2]--) {
498
            IFLayer layer = layers.getLayer(pos[2]);
499

    
500
            if (layer.isVisible()) {
501
                pos[1] = (int) (((re.height / m_numLayers * (pos[5] + pos[3] +
502
                    pos[4])) + pos[0]) * dif1);
503

    
504
                Rectangle rec = new Rectangle((int) re.x + pos[0],
505
                        (int) re.y + pos[1], (int) (re.width * dif2),
506
                        (int) (re.height / m_numLayers * dif1));
507

    
508
                if (layer instanceof FLyrVect) {
509
                    FLyrVect lyrVect = (FLyrVect) layer;
510
                    FRenderer r = lyrVect.getRenderer();
511
                    FSymbol theSymbol = null;
512

    
513
                    switch (r.getLegendType()) {
514
                        case FConstant.LEGEND_TYPE_DEFAULT:
515
                            pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
516
                                pos[6] + pos[7])) + pos[0]) * dif1);
517
                            rec.y = ((int) re.y + pos[1] + (rec.height / 2)) -
518
                                (sizeText / 2);
519

    
520
                            theSymbol = r.getDefaultSymbol();
521
                            rec.x = (int) (rec.x + ((re.width * dif2) / 2));
522
                            rec.y = ((int) re.y + pos[1] + (rec.height / 2)) -
523
                                (sizeText / 2);
524
                            rec.width = (int) (re.width * dif2);
525
                            rec.height = (int) sizeText;
526
                            pos[5]++;
527
                            theSymbol = r.getDefaultSymbol();
528
                            addFFrameSymbol(theSymbol, layout, rec);
529
                            rec.x = (int) (rec.x + (re.width * dif2));
530
                            addFFrameText(false, rec, re, layout,
531
                                layer.getName());
532

    
533
                            break;
534

    
535
                        case FConstant.LEGEND_TYPE_BREAK:
536
                        case FConstant.LEGEND_TYPE_VALUE:
537
                            pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
538
                                pos[6] + pos[7])) + pos[0]) * dif1);
539
                            rec.y = ((int) re.y + pos[1] + (rec.height / 2)) -
540
                                (sizeText / 2);
541
                            addFFrameText(false, rec, re, layout,
542
                                layer.getName());
543
                            pos[5]++;
544

    
545
                            for (pos[3] = 0; pos[3] < r.getValueCount();
546
                                    pos[3]++) {
547
                                theSymbol = r.getSymbolByID(pos[3]);
548
                                pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
549
                                    pos[3] + pos[6] + pos[7])) + pos[0]) * dif1);
550

    
551
                                int size1 = (int) ((re.width * 1) / m_max);
552

    
553
                                rec.x = (int) (re.x + (re.width * dif2));
554
                                rec.y = ((int) re.y + pos[1] +
555
                                    (rec.height / 2)) - (size1 / 2);
556
                                rec.height = (int) (size1 * dif1);
557
                                rec.width = (int) ((re.width * dif2) / 3);
558
                                addFFrameSymbol(theSymbol, layout, rec);
559
                                addFFrameText(true, rec, re, layout,
560
                                    theSymbol.m_Descrip);
561
                            }
562

    
563
                            pos[7] += pos[3];
564

    
565
                            break;
566
                    }
567

    
568
                    pos[5]++;
569
                }
570

    
571
                if (layer instanceof FLyrGroup) {
572
                    FLyrGroup lyrGroup = (FLyrGroup) layer;
573
                    rec = new Rectangle((int) (re.x + pos[0]),
574
                            (int) (re.y + pos[1]), (int) (re.width * dif2),
575
                            (int) (re.height / m_numLayers * dif1));
576
                    addFFrameText(false, rec, re, layout, layer.getName());
577

    
578
                    for (pos[4] = 0; pos[4] < lyrGroup.getLayers().size();
579
                            pos[4]++) {
580
                        IFLayer subLayer = (IFLayer) lyrGroup.getLayers().get(pos[4]);
581
                        FTheme elSubTema = new FTheme(subLayer);
582

    
583
                        if (subLayer instanceof FLyrVect) {
584
                            FLyrVect lyrVect = (FLyrVect) subLayer;
585
                            FRenderer r = lyrVect.getRenderer();
586
                            FSymbol theSymbol = null;
587

    
588
                            if (subLayer.isVisible()) {
589
                                switch (r.getLegendType()) {
590
                                    case FConstant.LEGEND_TYPE_DEFAULT:
591
                                        pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
592
                                            pos[6] + pos[3] + 1)) + pos[0]) * dif1);
593
                                        theSymbol = r.getDefaultSymbol();
594
                                        rec.y = ((int) re.y + pos[1] +
595
                                            (rec.height / 2)) - (sizeText / 2);
596
                                        rec.height = sizeText;
597
                                        addFFrameSymbol(theSymbol, layout, rec);
598
                                        addFFrameText(false, rec, re, layout,
599
                                            subLayer.getName());
600

    
601
                                        break;
602

    
603
                                    case FConstant.LEGEND_TYPE_VALUE:
604
                                    case FConstant.LEGEND_TYPE_BREAK:
605
                                        pos[6]++;
606
                                        pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
607
                                            pos[6] + pos[7])) + pos[0]) * dif1);
608
                                        rec.y = ((int) re.y + pos[1] +
609
                                            (rec.height / 2)) - (sizeText / 2);
610
                                        addFFrameText(false, rec, re, layout,
611
                                            subLayer.getName());
612
                                        pos[6]++;
613

    
614
                                        for (pos[3] = 0;
615
                                                pos[3] < r.getValueCount();
616
                                                pos[3]++) {
617
                                            theSymbol = r.getSymbolByID(pos[3]);
618
                                            pos[1] = (int) (((re.height / m_numLayers * (pos[5] +
619
                                                pos[3] + pos[6] + pos[7])) +
620
                                                pos[0]) * dif1);
621

    
622
                                            int size1 = (int) ((re.width * 1) / m_max);
623
                                            rec.x = (int) (re.x +
624
                                                ((re.width * dif2) / 2));
625
                                            rec.y = (int) ((re.y + pos[1] +
626
                                                (rec.height / 2)) -
627
                                                (size1 / 2));
628
                                            rec.height = (int) (size1 * dif1);
629
                                            rec.width = (int) ((re.width * dif2) / 2);
630
                                            addFFrameSymbol(theSymbol, layout,
631
                                                rec);
632
                                            rec.height = (int) (size1 * dif2);
633
                                            rec.width = (int) ((re.width * dif2) / 4);
634
                                            addFFrameText(true, rec, re,
635
                                                layout, theSymbol.m_Descrip);
636
                                        }
637

    
638
                                        pos[7] += pos[3];
639

    
640
                                        break;
641
                                } // switch
642

    
643
                                pos[6]++;
644
                            }
645

    
646
                            // if subLayer
647
                        }
648

    
649
                        //if isVisible() subLayer
650
                    }
651

    
652
                    // for k
653
                }
654

    
655
                // if lyrGroup
656
            }
657

    
658
            //if isVisible()
659
        }
660

    
661
        layout.getFFrames().remove(this);
662
    }
663

    
664
    /**
665
     * A?ade al ArrayList del Layout un fframe del tipo FFrameText.
666
     *
667
     * @param isSublayer
668
     * @param rec
669
     * @param re
670
     * @param layout
671
     * @param name
672
     */
673
    private void addFFrameText(boolean isSublayer, Rectangle rec,
674
        Rectangle2D.Double re, Layout layout, String name) {
675
        IFFrame fframetext = new FFrameText();
676
        double t = 1.3;
677
        double w = 0.15;
678

    
679
        if (isSublayer == true) {
680
            t = 1;
681
            w = 0.15;
682
        }
683

    
684
        Font f = new Font("SansSerif", Font.ITALIC,
685
                ((int) (re.width * t)) / m_max);
686
        TextLayout tl = new TextLayout(name, f, m_frc);
687
        Rectangle2D rt4 = tl.getBounds();
688
        Rectangle rt5 = new Rectangle((int) rt4.getMinX(), (int) rt4.getMinY(),
689
                (int) rt4.getWidth(), (int) rt4.getHeight());
690
        rt5.setRect(rec.x + (re.width * w), rec.y, rt5.getWidth(),
691
            rt5.getHeight());
692
        fframetext.setBoundBox(FLayoutUtilities.toSheetRect((Rectangle) rt5,
693
                layout.getAT()));
694
        ((FFrameText) fframetext).addText(name);
695
        fframetext.setSelected(true);
696
        layout.addFFrame(fframetext, false);
697
    }
698

    
699
    /**
700
     * A?ade al ArrayList del Layout un fframe del tipo FFrameSymbol.
701
     *
702
     * @param theSymbol
703
     * @param layout
704
     * @param rec
705
     */
706
    private void addFFrameSymbol(FSymbol theSymbol, Layout layout, Rectangle rec) {
707
        IFFrame fframesymbol = new FFrameSymbol();
708
        fframesymbol.setBoundBox(FLayoutUtilities.toSheetRect(rec,
709
                layout.getAT()));
710
        ((FFrameSymbol) fframesymbol).setSymbol(theSymbol);
711
        fframesymbol.setSelected(true);
712
        layout.addFFrame(fframesymbol, false);
713
    }
714

    
715
    /**
716
     * A?ade los layers que contiene la vista que se ha seleccionado.
717
     *
718
     * @return DOCUMENT ME!
719
     */
720

    
721
    /* public void setLayers(FLayers layers) {
722
       m_layers = layers;
723
       }
724
     */
725

    
726
    /**
727
     * @see com.iver.cit.gvsig.gui.layout.fframes.IFFrame#getXMLEntity()
728
     */
729
    public XMLEntity getXMLEntity() {
730
        XMLEntity xml = super.getXMLEntity();
731
        xml.putProperty("type", Layout.RECTANGLELEGEND);
732
        xml.putProperty("m_numLayers", m_numLayers);
733
        xml.putProperty("m_max", m_max);
734
        xml.putProperty("m_quality", m_quality);
735
        xml.putProperty("m_viewing", m_viewing);
736
        xml.putProperty("fontName", m_f.getFontName());
737
        xml.putProperty("fontStyle", m_f.getStyle());
738
        xml.addChild(fframeview.getXMLEntity());
739

    
740
        //De este ?ndice se debe de obtener el arrayList de layers.
741

    
742
        /* ProjectExtension pe = (ProjectExtension) App.instance.getPc()
743
           .getExtension(ProjectExtension.class);
744
           ArrayList views = pe.getProject().getViews();
745
           boolean hasIndex = false;
746
           for (int i = 0; i < views.size(); i++) {
747
               if (m_fmap == ((ProjectView) views.get(i)).getMapContext()) {
748
                   xml.putProperty("indice", i);
749
                   hasIndex = true;
750
               }
751
           }
752
           if (!hasIndex) {
753
               xml.putProperty("indice", -1);
754
           }
755
         */
756
        return xml;
757
    }
758

    
759
    /**
760
     * Crea un Objeto de esta clase a partir de la informaci?n del XMLEntity.
761
     *
762
     * @param xml XMLEntity
763
     * @param p DOCUMENT ME!
764
     *
765
     * @return Objeto de esta clase.
766
     */
767
    public static FFrameLegend createFFrameLegend(XMLEntity xml, Project p) {
768
        FFrameLegend fframe = new FFrameLegend();
769

    
770
        if (xml.getIntProperty("m_Selected") != 0) {
771
            fframe.setSelected(true);
772
        } else {
773
            fframe.setSelected(false);
774
        }
775

    
776
        fframe.m_numLayers = xml.getIntProperty("m_numLayers");
777
        fframe.m_max = xml.getIntProperty("m_max");
778
        fframe.m_quality = xml.getIntProperty("m_quality");
779
        fframe.m_viewing = xml.getIntProperty("m_viewing");
780
        fframe.m_f = new Font(xml.getStringProperty("fontName"),
781
                xml.getIntProperty("fontStyle"), 9);
782

    
783
        /*
784
           int indice = xml.getIntProperty("indice");
785
           if (indice != -1) {
786
               ProjectView view = (ProjectView) p.getViews().get(indice);
787
               fframe.m_fmap = view.getMapContext();
788
           }
789
           //fframe.setLayers(fframe.m_fmap.getLayers());
790
         */
791
        fframe.setFFrameView((FFrameView) FFrameView.createFFrame(xml.getChild(
792
                    0), p));
793

    
794
        return fframe;
795
    }
796

    
797
    /**
798
     * @see com.iver.cit.gvsig.gui.layout.fframes.IFFrame#updateNum()
799
     */
800
    public void updateNum() {
801
        num = Layout.numLegend++;
802
    }
803

    
804
    /**
805
     * DOCUMENT ME!
806
     *
807
     * @return DOCUMENT ME!
808
     */
809
    public int getNum() {
810
        return num;
811
    }
812
}