Statistics
| Revision:

svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / project / documents / layout / FLayoutDraw.java @ 28231

History | View | Annotate | Download (27.5 KB)

1
/*
2
 * Created on 27-sep-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.project.documents.layout;
46

    
47
import java.awt.Color;
48
import java.awt.Component;
49
import java.awt.Graphics2D;
50
import java.awt.Image;
51
import java.awt.geom.AffineTransform;
52
import java.awt.geom.Point2D;
53
import java.awt.geom.Rectangle2D;
54
import java.awt.image.BufferedImage;
55
import java.awt.print.PageFormat;
56
import java.awt.print.PrinterException;
57
import java.io.BufferedOutputStream;
58
import java.io.File;
59
import java.io.FileOutputStream;
60
import java.io.IOException;
61
import java.io.OutputStream;
62

    
63
import javax.print.Doc;
64
import javax.print.DocFlavor;
65
import javax.print.DocPrintJob;
66
import javax.print.PrintException;
67
import javax.print.SimpleDoc;
68
import javax.print.StreamPrintService;
69
import javax.print.StreamPrintServiceFactory;
70
import javax.print.attribute.PrintRequestAttributeSet;
71
import javax.swing.JOptionPane;
72

    
73
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
74
import com.iver.andami.PluginServices;
75
import com.iver.cit.gvsig.Print;
76
import com.iver.cit.gvsig.project.documents.layout.fframes.IFFrame;
77
import com.iver.cit.gvsig.project.documents.layout.gui.Layout;
78
import com.lowagie.text.Document;
79
import com.lowagie.text.DocumentException;
80
import com.lowagie.text.pdf.PdfContentByte;
81
import com.lowagie.text.pdf.PdfWriter;
82

    
83

    
84
/**
85
 * Clase que implementa los m?todos del Layout que dibujan sobre el Graphics.
86
 *
87
 * @author Vicente Caballero Navarro
88
 */
89
public class FLayoutDraw {
90
    private Layout layout;
91

    
92

    
93
    /**
94
     * Crea un nuevo FLayoutDraw.
95
     *
96
     * @param l Referencia al Layout.
97
     */
98
    public FLayoutDraw(Layout l) {
99
        layout = l;
100
    }
101

    
102
    /**
103
     * M?todo para dibujar el Layout y modificar la matriz de transformaci?n  a
104
     * partir del tama?o en pixels que tenga rect y el formato de papel
105
     * seleccionado.
106
     *
107
     * @param g2
108
     * @param imgBase Si es null, est?s imprimiendo. Si no, la usas para el
109
     *        c?digo de  optimizaci?n.
110
     *
111
     * @throws ReadDriverException
112
     */
113
    public void drawLayout(Graphics2D g2, BufferedImage imgBase)
114
        throws ReadDriverException {
115
            LayoutControl layoutControl=layout.getLayoutControl();
116
            LayoutContext layoutContext= layout.getLayoutContext();
117
            Attributes attributes=layoutContext.getAtributes();
118
            Rectangle2D rLayout=layoutControl.getRect();
119
            AffineTransform at=layoutContext.getAT();
120

    
121
            layoutControl.setCancelDrawing(false);
122
        double scale = 0;
123
        scale = rLayout.getHeight() / attributes.m_sizePaper.getAlto() * 1;
124
        AffineTransform escalado = new AffineTransform();
125
        AffineTransform translacion = new AffineTransform();
126
        translacion.setToTranslation(rLayout.getMinX(),
127
            rLayout.getMinY());
128
        escalado.setToScale(scale, scale);
129
        at.setToIdentity();
130
        at.concatenate(translacion);
131
        at.concatenate(escalado);
132
        attributes.setDistanceUnitX(rLayout);
133
        attributes.setDistanceUnitY(rLayout);
134
        IFFrame[] fframes=layoutContext.getFFrames();
135
        for (int i = 0; i < fframes.length; i++) {
136
                IFFrame f = fframes[i];
137
                //original, lento (NO MAC)
138
                    f.draw(g2, at, layoutControl.getVisibleRect(),imgBase);
139
                // ESTILO MAC
140
                /* if (f instanceof FFrameView)
141
                {
142
                        FFrameView fframe = (FFrameView) f;
143
                        BufferedImage img = new BufferedImage((int) layoutControl.getWidth(),
144
                                    (int) layoutControl.getHeight(), BufferedImage.TYPE_INT_ARGB);
145

146

147
                        fframe.draw(img.createGraphics(), at,        layoutControl.getVisibleRect(), imgBase);
148
                        g2.drawImage(img, 0, 0, layoutControl);
149
                        fframe.setBufferedImage(img);
150
                }
151
                else
152
                {
153
                        f.draw(g2, at, layoutControl.getVisibleRect(),imgBase);
154
                } */
155

    
156
            //          Dibuja el s?mbolo de que contiene un tag.
157
            if ((f.getTag() != null) && (layout.isShowIconTag())) {
158
                f.drawSymbolTag(g2);
159
            }
160
        }
161

    
162
        if (!(fframes.length==0)) {
163
            layoutControl.setStatus(LayoutControl.ACTUALIZADO);
164
        } else {
165
            layoutControl.setStatus(LayoutControl.DESACTUALIZADO);
166
        }
167
    }
168

    
169
    /**
170
     * Dibuja sobre un Graphics2D el rect?ngulo que representa al folio.
171
     *
172
     * @param g Graphics2D
173
     */
174
    public void drawRectangle(Graphics2D g) {
175
            Attributes attributes=layout.getLayoutContext().getAtributes();
176
            Rectangle2D rLayout=layout.getLayoutControl().getRect();
177
            AffineTransform at=layout.getLayoutContext().getAT();
178

    
179
            double unidadesX = attributes.getNumUnitsX();
180
        double unidadesY = attributes.getNumUnitsY();
181

    
182
        if ((unidadesX == 0) && (unidadesY == 0)) {
183
            return;
184
        }
185

    
186
        g.setColor(Color.darkGray);
187

    
188
        Rectangle2D.Double rectBig = new Rectangle2D.Double(rLayout.getX(),
189
                rLayout.getY(), rLayout.getWidth(),
190
                rLayout.getHeight());
191

    
192
        g.fillRect((int) rectBig.x + 7, (int) rectBig.y + 7,
193
            (int) rectBig.width, (int) rectBig.height);
194

    
195
        Rectangle2D.Double r = new Rectangle2D.Double();
196

    
197
        if (attributes.isMargin()) {
198

    
199
            r = new Rectangle2D.Double((rLayout.getX() +
200
                    FLayoutUtilities.fromSheetDistance(
201
                        attributes.m_area[2], at)),
202
                    (rLayout.getY() +
203
                    FLayoutUtilities.fromSheetDistance(
204
                        attributes.m_area[0], at)),
205
                    (rLayout.getWidth() -
206
                    FLayoutUtilities.fromSheetDistance(
207
                            attributes.m_area[2] +
208
                        attributes.m_area[3], at)),
209
                    (rLayout.getHeight() -
210
                    FLayoutUtilities.fromSheetDistance(
211
                            attributes.m_area[0] +
212
                        attributes.m_area[1], at)));
213
        } else {
214
            r.setRect(rLayout);
215
        }
216

    
217
        g.setColor(Color.white);
218
        g.fill(rLayout);
219

    
220
        g.setColor(Color.darkGray);
221
        g.drawRect((int) rLayout.getMinX(),
222
            (int) rLayout.getMinY(),
223
            (int) rLayout.getWidth(),
224
            (int) rLayout.getHeight());
225

    
226
        if (attributes.isMargin()) {
227
            g.setColor(Color.black);
228

    
229
            g.drawRect((int) r.x, (int) r.y, (int) r.width, (int) r.height);
230
        }
231
    }
232

    
233
    /**
234
     * DOCUMENT ME!
235
     *
236
     * @param g DOCUMENT ME!
237
     */
238
    public void drawGrid(Graphics2D g) {
239
        int unidadesMin = 6;
240
        LayoutContext layoutContext= layout.getLayoutContext();
241
        Attributes attributes=layoutContext.getAtributes();
242
            Rectangle2D rLayout=layout.getLayoutControl().getRect();
243
            AffineTransform at=layoutContext.getAT();
244

    
245

    
246
            double unidadesX = attributes.getUnitInPixelsX();
247
        double unidadesY = attributes.getUnitInPixelsY();
248

    
249
        Rectangle2D.Double r = new Rectangle2D.Double();
250

    
251
        if (attributes.isMargin()) {
252
            r = new Rectangle2D.Double((rLayout.getX() +
253
                    FLayoutUtilities.fromSheetDistance(
254
                        attributes.m_area[2], at)),
255
                    (rLayout.getY() +
256
                    FLayoutUtilities.fromSheetDistance(
257
                        attributes.m_area[0], at)),
258
                    (rLayout.getWidth() -
259
                    FLayoutUtilities.fromSheetDistance(attributes.m_area[2] +
260
                        attributes.m_area[3], at)),
261
                    (rLayout.getHeight() -
262
                    FLayoutUtilities.fromSheetDistance(attributes.m_area[0] +
263
                        attributes.m_area[1], at)));
264
        } else {
265
            r.setRect(rLayout);
266
        }
267
        if ((unidadesX == 0) && (unidadesY == 0)) {
268
            return;
269
        }
270
        g.setColor(Color.darkGray);
271

    
272
        if (((unidadesX > unidadesMin) || (unidadesY > unidadesMin)) &&
273
                layoutContext.isGridVisible()) {
274
            double ax = r.getMinX();
275
            double ay;
276

    
277
            while (ax < (r.getMaxX())) {
278
                ay = (r.getMinY());
279

    
280
                while (ay < (r.getMaxY())) {
281
                    g.drawLine((int) ax, (int) ay, (int) ax, (int) ay);
282
                    ay = ay + unidadesY;
283
                }
284

    
285
                ax = ax + unidadesX;
286
            }
287
        }
288
    }
289

    
290
    /**
291
     * Dibuja sobre el graphics2d las reglas.
292
     *
293
     * @param g graphics2d sobre el que se dibuja.
294
     * @param color Color de la regla.
295
     */
296
    public void drawRuler(Graphics2D g, Color color) {
297
            LayoutControl layoutControl=layout.getLayoutControl();
298
            LayoutContext layoutContext= layout.getLayoutContext();
299
            Attributes attributes=layoutContext.getAtributes();
300
            Rectangle2D rLayout=layoutControl.getRect();
301
            AffineTransform at=layoutContext.getAT();
302

    
303
        if (layoutContext.getRuler()) {
304
            int ini = 10;
305
            int w = 30;
306
            int wi = 16;
307

    
308
            g.setColor(new Color(250, 255, 250, 180));
309
            g.fillRect(ini, w, wi, layoutControl.getHeight() - w);
310
            g.fillRect(w, ini, layoutControl.getWidth() - w, wi);
311

    
312
            g.setColor(new Color(100, 155, 150, 180));
313
            g.fillRect(w, ini, (int) rLayout.getX() - w, wi);
314
            g.fillRect((int) rLayout.getMaxX(), ini,
315
                layoutControl.getWidth() - (int) rLayout.getMaxX(), wi);
316

    
317
            g.fillRect(ini, w, wi, (int) rLayout.getY() - w);
318
            g.fillRect(ini, (int) rLayout.getMaxY(), wi,
319
                layoutControl.getHeight() - (int) rLayout.getMaxY());
320

    
321
            if (attributes.isMargin()) {
322
                g.setColor(new Color(50, 55, 50, 180));
323
                g.fillRect((int) rLayout.getX(), ini,
324
                    (int) FLayoutUtilities.fromSheetDistance(
325
                        attributes.m_area[2], at), wi);
326
                g.fillRect((int) rLayout.getMaxX() -
327
                    (int) FLayoutUtilities.fromSheetDistance(
328
                        attributes.m_area[3], at), ini,
329
                    (int) FLayoutUtilities.fromSheetDistance(
330
                        attributes.m_area[3], at), wi);
331

    
332
                g.fillRect(ini, (int) rLayout.getY(), wi,
333
                    (int) FLayoutUtilities.fromSheetDistance(
334
                        attributes.m_area[0], at));
335
                g.fillRect(ini,
336
                    (int) rLayout.getMaxY() -
337
                    (int) FLayoutUtilities.fromSheetDistance(
338
                        attributes.m_area[1], at), wi,
339
                    (int) FLayoutUtilities.fromSheetDistance(
340
                        attributes.m_area[1], at));
341
            }
342

    
343
            g.setColor(color);
344
            g.drawLine(w, wi + ini, layoutControl.getWidth(), wi + ini);
345
            g.drawLine(w, ini, layoutControl.getWidth(), ini);
346
            g.drawLine(ini, w, ini, layoutControl.getHeight());
347
            g.drawLine(wi + ini, w, wi + ini, layoutControl.getHeight());
348

    
349
            drawLineY(g, 5, 12, 22, rLayout.getY(), 0);
350
            drawLineX(g, 5, 12, 22, rLayout.getX(), 0);
351

    
352
            if (FLayoutUtilities.fromSheetDistance(1, at) > 15) {
353
                drawLineY(g, 1, 12, 22, rLayout.getY(), 0);
354
                drawLineX(g, 1, 12, 22, rLayout.getX(), 0);
355

    
356
                if (FLayoutUtilities.fromSheetDistance(1, at) > 25) {
357
                    drawLineY(g, 1, 18, 22, rLayout.getY(), 0.5);
358
                    drawLineY(g, 0.1, 21, 22, rLayout.getY(), 0);
359
                    drawLineX(g, 1, 18, 22, rLayout.getX(), 0.5);
360
                    drawLineX(g, 0.1, 21, 22, rLayout.getX(), 0);
361
                }
362
            }
363
        }
364
    }
365

    
366
    /**
367
     * Dibuja sobre el graphics2d las l?neas verticales que representan a las
368
     * unidades de medida.
369
     *
370
     * @param g Graphics2d sobre el que se dibuja.
371
     * @param dist distancia en cent?metros de una l?nea a otra.
372
     * @param init inicio de la l?nea.
373
     * @param end fin de la l?nea.
374
     * @param y rect?ngulo, dentro del cual se dibujan las l?neas.
375
     * @param desp Desplazamiento.
376
     */
377
    private void drawLineY(Graphics2D g, double dist, int init, int end,
378
        double y, double desp) {
379
            AffineTransform at=layout.getLayoutContext().getAT();
380
            LayoutControl layoutControl=layout.getLayoutControl();
381

    
382
            double distY = FLayoutUtilities.fromSheetDistance(dist, at);
383
        double rota = Math.toRadians(90);
384

    
385
        if (distY > 4) {
386
            double despY = FLayoutUtilities.fromSheetDistance(desp,
387
                    at);
388

    
389
            double posUnitY = y + despY;
390
            double posUnitYNeg = posUnitY;
391
            int num = 0;
392
            double iniY = 40;
393
            Point2D.Double pfin = FLayoutUtilities.fromSheetPoint(new Point2D.Double(
394
                        layoutControl.getWidth(), layoutControl.getHeight()), at);
395

    
396
            while (posUnitY < (pfin.y - 5)) {
397
                posUnitYNeg -= distY;
398

    
399
                if (distY > 16) {
400
                    if (init == 12) {
401
                        if (posUnitY > iniY) {
402
                            g.rotate(-rota, 20, posUnitY - 12);
403
                            g.drawString(String.valueOf(num), 10,
404
                                (int) posUnitY - 12);
405
                            g.rotate(rota, 20, posUnitY - 12);
406
                        }
407

    
408
                        if (dist == 5) {
409
                            num = num + 5;
410
                        } else {
411
                            num++;
412
                        }
413

    
414
                        if (posUnitYNeg > iniY) {
415
                            g.rotate(-rota, 20, posUnitYNeg - 12);
416
                            g.drawString(String.valueOf(-num), 10,
417
                                (int) posUnitYNeg - 12);
418
                            g.rotate(rota, 20, posUnitYNeg - 12);
419
                        }
420
                    }
421
                }
422

    
423
                if (posUnitY > iniY) {
424
                    g.drawLine( 2 + init, (int) posUnitY, 2 + end,
425
                        (int) posUnitY);
426
                }
427

    
428
                if (posUnitYNeg > iniY) {
429
                    g.drawLine(2 + init, (int) posUnitYNeg,
430
                        2 + end, (int) posUnitYNeg);
431
                }
432

    
433
                posUnitY += distY;
434
            }
435
        }
436
    }
437

    
438
    /**
439
     * Dibuja sobre el graphics2d las l?neas horizontales que representan a las
440
     * unidades de medida.
441
     *
442
     * @param g Graphics2d sobre el que se dibuja.
443
     * @param dist distancia en cent?metros de una l?nea a otra.
444
     * @param init inicio de la l?nea.
445
     * @param end fin de la l?nea.
446
     * @param x rect?ngulo, dentro del cual se dibujan las l?neas.
447
     * @param desp Desplazamiento.
448
     */
449
    private void drawLineX(Graphics2D g, double dist, int init, int end,
450
        double x, double desp) {
451
            AffineTransform at=layout.getLayoutContext().getAT();
452
            LayoutControl layoutControl=layout.getLayoutControl();
453

    
454
            double distX = FLayoutUtilities.fromSheetDistance(dist, at);
455

    
456
        if (distX > 4) {
457
            double despX = FLayoutUtilities.fromSheetDistance(desp,
458
                    at);
459
            double posUnitX = x + despX;
460
            double posUnitXNeg = posUnitX;
461
            int num = 0;
462
            double iniX = 40;
463
            Point2D.Double pfin = FLayoutUtilities.fromSheetPoint(new Point2D.Double(
464
                        layoutControl.getWidth(), layoutControl.getHeight()), at);
465

    
466
            while (posUnitX < (pfin.x - 5)) {
467
                posUnitXNeg -= distX;
468

    
469
                if (init == 12) {
470
                    if (distX > 16) {
471
                        if (posUnitX > iniX) {
472
                            g.drawString(String.valueOf(num),
473
                                (int) posUnitX + 3, 20);
474
                        }
475

    
476
                        if (dist == 5) {
477
                            num = num + 5;
478
                        } else {
479
                            num++;
480
                        }
481

    
482
                        if (posUnitXNeg > iniX) {
483
                            g.drawString(String.valueOf(-num),
484
                                (int) posUnitXNeg + 3, 20);
485
                        }
486
                    }
487
                }
488

    
489
                if (posUnitX > iniX) {
490
                    g.drawLine((int) posUnitX, 2 + init, (int) posUnitX,
491
                        2 + end);
492
                }
493

    
494
                if (posUnitXNeg > iniX) {
495
                    g.drawLine((int) posUnitXNeg, 2 + init,
496
                        (int) posUnitXNeg, 2 + end);
497
                }
498

    
499
                posUnitX += distX;
500
            }
501
        }
502
    }
503

    
504
    /**
505
     * Dibuja los handlers sobre los fframes que esten seleccionados.
506
     *
507
     * @param g Graphics sobre el que se dibuja.
508
     * @param color Color de los Handlers.
509
     */
510
    public void drawHandlers(Graphics2D g, Color color) {
511
            LayoutContext layoutContext= layout.getLayoutContext();
512

    
513
        g.setColor(color);
514
        IFFrame[] fframes=layoutContext.getFFrames();
515
        for (int i = 0; i < fframes.length; i++) {
516
            IFFrame fframe = fframes[i];
517

    
518
            if (fframe.getSelected() != IFFrame.NOSELECT) {
519
                fframe.drawHandlers(g);
520
            }
521
        }
522
    }
523

    
524
    /**
525
     * A partir de un fichero que se pasa como par?metro se crea un pdf con el
526
     * contenido del Layout.
527
     *
528
     * @param pdf
529
     */
530
 /*   public void toPS(File ps) {
531

532
             try {
533
                 // Open the image file
534
                // InputStream is = new BufferedInputStream(
535
                //     new FileInputStream("filename.gif"));
536

537
                 // Prepare the output file to receive the postscript
538
                 OutputStream fos = new BufferedOutputStream(
539
                     new FileOutputStream("filename.ps"));
540

541
                 // Find a factory that can do the conversion
542
                 //DocFlavor flavor = DocFlavor.INPUT_STREAM.GIF;
543
                 DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
544
                 StreamPrintServiceFactory[] factories =
545
                     StreamPrintServiceFactory.lookupStreamPrintServiceFactories(
546
                         flavor,
547
                         DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType());
548

549
                 if (factories.length > 0) {
550
                     StreamPrintService service = factories[0].getPrintService(fos);
551

552
                     // Create the print job
553
                     DocPrintJob job = service.createPrintJob();
554
                     Print print= (Print)PluginServices.getExtension(
555
                               com.iver.cit.gvsig.Print.class);
556
                     print.setLayout(layout);
557
                     Doc doc = new SimpleDoc((Printable)print, flavor, null);
558
                     //Doc doc = new SimpleDoc(is, flavor, null);
559
                     // Monitor print job events; for the implementation of PrintJobWatcher,
560
                     // see e702 Determining When a Print Job Has Finished
561
                     //PrintJobWatcher pjDone = new PrintJobWatcher(job);
562
//                   Actualizar attributes
563
                      PrintRequestAttributeSet att = layout.getAtributes()
564
                                                           .toPrintAttributes();
565
                     // Print it
566
                     job.print(doc, att);
567

568
                     // Wait for the print job to be done
569
                     //pjDone.waitForDone();
570
                     // It is now safe to close the streams
571
                 }
572

573
                // is.close();
574
                 fos.close();
575
             } catch (PrintException e) {
576
             } catch (IOException e) {
577
             }
578
             }
579
             */
580

    
581
/*
582
             public void printLayout(Layout layout) {
583
                 l = layout;
584

585
                 try {
586
                     printerJob.setPrintable((Printable) PluginServices.getExtension(
587
                             com.iver.cit.gvsig.Print.class));
588

589
                     //Actualizar attributes
590
                     PrintRequestAttributeSet att = layout.getAtributes()
591
                                                          .toPrintAttributes();
592
                     DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
593

594
                     if (m_cachePrintServices == null) {
595
                         m_cachePrintServices = PrintServiceLookup.lookupPrintServices(flavor,
596
                                 null);
597
                     }
598

599
                     PrintService defaultService = null;
600

601
                     if (m_cachePrintService == null) {
602
                         defaultService = PrintServiceLookup.lookupDefaultPrintService();
603
                     }
604

605
                     if (m_cachePrintService == null) {
606
                         m_cachePrintService = ServiceUI.printDialog(null, 200, 200,
607
                                 m_cachePrintServices, defaultService, flavor, att);
608
                     }
609

610
                     if (m_cachePrintService != null) {
611
                         DocPrintJob jobNuevo = m_cachePrintService.createPrintJob();
612
                         PrintJobListener pjlistener = new PrintJobAdapter() {
613
                                 public void printDataTransferCompleted(PrintJobEvent e) {
614
                                     System.out.println("Fin de impresi?n");
615
                                 }
616
                             };
617

618
                         jobNuevo.addPrintJobListener(pjlistener);
619

620
                         Doc doc = new SimpleDoc((Printable) PluginServices.getExtension(
621
                                     com.iver.cit.gvsig.Print.class), flavor, null);
622
                         jobNuevo.print(doc, att);
623
                     }
624
                 } catch (PrintException pe) {
625
                     pe.printStackTrace();
626
                 }
627
             }
628

629
        document.close();
630

631
        layout.fullRect();
632
    }
633
*/
634

    
635

    
636

    
637
    /**
638
     * A partir de un fichero que se pasa como par?metro se crea un ps con el
639
     * contenido del Layout.
640
     *
641
     * @param ps
642
     */
643
    public void toPS(File ps) {
644
            Attributes attributes=layout.getLayoutContext().getAtributes();
645
            LayoutControl layoutControl=layout.getLayoutControl();
646

    
647
            try {
648
            // Prepare the output file to receive the postscript
649
            OutputStream fos = new BufferedOutputStream(
650
                new FileOutputStream(ps));
651

    
652
            // Find a factory that can do the conversion
653
            //DocFlavor flavor = DocFlavor.INPUT_STREAM.GIF;
654
            DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
655
            StreamPrintServiceFactory [] factories =
656
                 StreamPrintServiceFactory.lookupStreamPrintServiceFactories(flavor,
657
                       "application/postscript");
658

    
659
            if (factories.length > 0) {
660
                StreamPrintService service = factories[0].getPrintService(fos);
661

    
662
                // Create the print job
663
                DocPrintJob job = service.createPrintJob();
664
                Print print= new Print();//(Print)PluginServices.getExtension(
665
//                            com.iver.cit.gvsig.Print.class);
666
                print.setLayout(layout);
667
                Doc doc = new SimpleDoc(print, flavor, null);
668
                //Doc doc = new SimpleDoc(is, flavor, null);
669
                // Monitor print job events; for the implementation of PrintJobWatcher,
670
                // see e702 Determining When a Print Job Has Finished
671
                //PrintJobWatcher pjDone = new PrintJobWatcher(job);
672
//              Actualizar attributes
673
                 PrintRequestAttributeSet att = attributes
674
                                                      .toPrintAttributes();
675
                // Print it
676
                job.print(doc, att);
677

    
678
                // Wait for the print job to be done
679
                //pjDone.waitForDone();
680
                // It is now safe to close the streams
681
            }
682

    
683
           // is.close();
684
            fos.close();
685
        } catch (PrintException e) {
686
        } catch (IOException e) {
687
        }
688
    /*    PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
689
        DocPrintJob printerJob = defaultPrintService.createPrintJob();
690

691
        try {
692
                DocFlavor flavor=DocFlavor.URL.POSTSCRIPT;
693
                if (!defaultPrintService.isDocFlavorSupported(flavor)) {
694
                           System.err.println("The printer does not support the appropriate DocFlavor");
695
                }else {
696

697
                SimpleDoc simpleDoc;
698
            simpleDoc = new SimpleDoc(ps.toURL(),flavor, null);
699
            printerJob.print(simpleDoc, null);
700
                }
701
        } catch (MalformedURLException e) {
702
            // TODO Auto-generated catch block
703
            e.printStackTrace();
704
        } catch (PrintException e) {
705
            // TODO Auto-generated catch block
706
            e.printStackTrace();
707
        }
708
        */
709
         layoutControl.fullRect();
710
    }
711

    
712

    
713
    /**
714
     * A partir de un fichero que se pasa como par?metro se crea un pdf con el
715
     * contenido del Layout.
716
     *
717
     * @param pdf
718
     */
719
    public void toPDF(File pdf) {
720
            Attributes attributes=layout.getLayoutContext().getAtributes();
721
            LayoutControl layoutControl=layout.getLayoutControl();
722

    
723
            double w = 0;
724
        double h = 0;
725
        Document document = new Document();
726

    
727
        if (attributes.isLandSpace()) {
728
            w = ((attributes.m_sizePaper.getAlto() * Attributes.DPISCREEN) / Attributes.PULGADA);
729
            h = ((attributes.m_sizePaper.getAncho() * Attributes.DPISCREEN) / Attributes.PULGADA);
730
        } else {
731
            w = ((attributes.m_sizePaper.getAncho() * Attributes.DPISCREEN) / Attributes.PULGADA);
732
            h = ((attributes.m_sizePaper.getAlto() * Attributes.DPISCREEN) / Attributes.PULGADA);
733
        }
734

    
735
        document.setPageSize(new com.lowagie.text.Rectangle((float) w, (float) h));
736

    
737
        try {
738
                FileOutputStream fos=new FileOutputStream(pdf);
739
            PdfWriter writer = PdfWriter.getInstance(document,fos);
740
            document.open();
741

    
742
            Print print = new Print();
743
            print.setLayout(layout);
744

    
745
            PdfContentByte cb = writer.getDirectContent();
746
            Graphics2D g2 = cb.createGraphicsShapes((float) w, (float) h);
747

    
748
            try {
749
                if (attributes.isLandSpace()) {
750
                    g2.rotate(Math.toRadians(-90), 0 + (w / (h / w)),
751
                        0 + (h / 2));
752
                    print.print(g2, new PageFormat(), 0);
753
                    g2.rotate(Math.toRadians(90), 0 + (w / (h / w)), 0 +
754
                        (h / 2));
755
                } else {
756
                    print.print(g2, new PageFormat(), 0);
757
                }
758
            } catch (PrinterException e) {
759
                e.printStackTrace();
760
            }
761

    
762
            g2.dispose();
763

    
764
        } catch (DocumentException de) {
765
            System.err.println(de.getMessage());
766
        } catch (IOException ioe) {
767
            JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(),
768
                ioe.getMessage());
769
        }
770

    
771
        document.close();
772

    
773
        layoutControl.fullRect();
774
      }
775
}