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 |
} |