OSDN Git Service

bbd29a889ebbc43c33baf8bb272988d374f0d16f
[posterdivider/PosterDivider.git] / src / jp / sourceforge / posterdivider / MainFrame.java
1 //
2 // MainFrame.java
3 // This file is part of PosterDivider.
4 //
5 package jp.sourceforge.posterdivider;
6
7 import java.awt.Button;
8 import java.awt.Checkbox;
9 import java.awt.Choice;
10 import java.awt.Dimension;
11 import java.awt.FileDialog;
12 import java.awt.FlowLayout;
13 import java.awt.Frame;
14 import java.awt.Label;
15 import java.awt.Menu;
16 import java.awt.MenuBar;
17 import java.awt.MenuItem;
18 import java.awt.MenuShortcut;
19 import java.awt.Panel;
20 import java.awt.TextField;
21 import java.awt.event.ActionEvent;
22 import java.awt.event.ActionListener;
23 import java.awt.event.ItemEvent;
24 import java.awt.event.ItemListener;
25 import java.awt.event.KeyEvent;
26 import java.awt.event.WindowEvent;
27 import java.awt.event.WindowListener;
28 import java.io.ByteArrayOutputStream;
29 import java.io.File;
30 import java.io.FileOutputStream;
31 import java.io.IOException;
32 import java.text.SimpleDateFormat;
33 import java.util.ArrayList;
34 import java.util.Date;
35
36 import javax.swing.BoxLayout;
37
38 public class MainFrame extends Frame {
39         private static final long serialVersionUID = 1L;
40
41         // Components
42         private Label labelSrcFile;
43         private TextField textFieldSrcFileName;
44         private Label labelSrcFileType;
45         private Button buttonSrcFileChange;
46         private Label labelSrcPageNum;
47         private Choice choiceSrcPageNum;
48         private Label labelSrcImageSize;
49         private NumberField numberFieldSrcImageWidth;
50         private NumberField numberFieldSrcImageHeight;
51         private Choice choiceSrcImageSizeUnit;
52         private Label labelSrcRect;
53         private Checkbox checkboxSrcRectWholeOfPage;
54         private NumberField numberFieldSrcLeft;
55         private NumberField numberFieldSrcBottom;
56         private NumberField numberFieldSrcRight;
57         private NumberField numberFieldSrcTop;
58         private Choice choiceSrcRectUnit;
59         private Label labelPosterSize;
60         private Choice choicePosterSize;
61         private NumberField numberFieldPosterWidth;
62         private NumberField numberFieldPosterHeight;
63         private Choice choicePosterSizeUnit;
64         private Checkbox checkboxPosterSizeKeepAspectRatio;
65         private Label labelPaperSize;
66         private Choice choicePaperSize;
67         private NumberField numberFieldPaperWidth;
68         private NumberField numberFieldPaperHeight;
69         private Choice choicePaperSizeUnit;
70         private Label labelPaperMargin;
71         private NumberField numberFieldPaperMargin;
72         private Choice choicePaperMarginUnit;
73         private Checkbox checkboxPaperRotate;
74         private Button buttonPaperOptimize;
75         private Label labelPreview;
76         private Label labelOutputPaperCount;
77         private NumberField numberFieldOutputPaperCount;
78         private CanvasPreview canvasPreview;
79         private Label labelOutputFileName;
80         private TextField textFieldOutputFileName;
81         private Label labelMessage;
82         private Button buttonOutput;
83
84         // Variables
85         private File srcFile;
86         private FileContainer fc;
87         private ImageContainer ic;
88         private float srcImageWidth;
89         private float srcImageHeight;
90         private ArrayList<Double> listSrcImageSizeUnit = new ArrayList<Double>();
91         private float srcLeft;
92         private float srcBottom;
93         private float srcRight;
94         private float srcTop;
95         private ArrayList<Double> listSrcRectUnit = new ArrayList<Double>();
96         private ArrayList<PaperSize> listPosterSize = new ArrayList<PaperSize>();
97         // preferredPosterSize と keepAspectRatio から posterSize が決まる
98         private float preferredPosterWidth;
99         private float preferredPosterHeight;
100         private float posterWidth;
101         private float posterHeight;
102         private ArrayList<Double> listPosterSizeUnit = new ArrayList<Double>();
103         private ArrayList<PaperSize> listPaperSize = new ArrayList<PaperSize>();
104         private float paperWidth;
105         private float paperHeight;
106         private boolean paperRotated;
107         private ArrayList<Double> listPaperSizeUnit = new ArrayList<Double>();
108         private float paperMargin;
109         private ArrayList<Double> listPaperMarginUnit = new ArrayList<Double>();
110
111         private String generateFileName(String str) {
112                 str = str.replace("{pwd}", System.getProperty("user.dir"));
113                 if (this.srcFile != null) {
114                         str = str.replace("{input}", this.srcFile.getName());
115                 }
116                 str = str.replace("{date}", new SimpleDateFormat("yyyyMMddHHmmss")
117                                 .format(new Date()));
118                 return str;
119         }
120
121     public File getSrcFile() {
122         return this.srcFile;
123     }
124         public boolean checkFileLoaded() {
125                 return this.ic != null;
126         }
127
128         private void simulateOutput() {
129                 // 設定値が変更されたときに canvasPreview 等を更新する
130
131                 labelMessage.setText("");
132
133                 PdfGenerator.CreatePosterArgs args = new PdfGenerator.CreatePosterArgs();
134                 args.setSrcRect(srcLeft, srcBottom, srcRight, srcTop);
135                 args.setPosterSize(posterWidth, posterHeight);
136                 args.setPaperSize(paperWidth, paperHeight);
137                 args.setMargin(paperMargin, paperMargin, paperMargin, paperMargin);
138
139                 int outputPaperCount = PdfGenerator.simulateOutputPaperCount(args);
140                 numberFieldOutputPaperCount.setValue(outputPaperCount);
141
142                 canvasPreview.setArgs(args);
143                 canvasPreview.repaint();
144         }
145
146         private void optimizePaperRotated() {
147                 // 出力枚数が少なくなるように印刷用紙の向きを更新する
148
149                 PdfGenerator.CreatePosterArgs args1 = new PdfGenerator.CreatePosterArgs();
150                 args1.setSrcRect(srcLeft, srcBottom, srcRight, srcTop);
151                 args1.setPosterSize(posterWidth, posterHeight);
152                 args1.setPaperSize(paperWidth, paperHeight);
153                 args1.setMargin(paperMargin, paperMargin, paperMargin, paperMargin);
154                 int outputPaperCount1 = PdfGenerator.simulateOutputPaperCount(args1);
155                 if (outputPaperCount1 < 0) {
156                         // 不正なとき
157                         outputPaperCount1 = Integer.MAX_VALUE;
158                 }
159
160                 PdfGenerator.CreatePosterArgs args2 = new PdfGenerator.CreatePosterArgs();
161                 args2.setSrcRect(srcLeft, srcBottom, srcRight, srcTop);
162                 args2.setPosterSize(posterWidth, posterHeight);
163                 args2.setPaperSize(paperHeight, paperWidth); // 印刷用紙を回転する
164                 args2.setMargin(paperMargin, paperMargin, paperMargin, paperMargin);
165                 int outputPaperCount2 = PdfGenerator.simulateOutputPaperCount(args2);
166                 if (outputPaperCount2 < 0) {
167                         outputPaperCount2 = Integer.MAX_VALUE;
168                 }
169
170                 if (outputPaperCount1 > outputPaperCount2
171                                 || (outputPaperCount1 == outputPaperCount2 && paperRotated)) {
172                         // 最適化
173                         checkboxPaperRotate.setState(!paperRotated);
174                         checkboxPaperRotate_itemStateChanged();
175                 }
176         }
177
178         public void outputPdf() {
179                 if (!checkFileLoaded()) {
180                         labelMessage.setText(Lib.getMessage("Text.NoInputFiles"));
181                         this.validateTree();
182                         return;
183                 }
184
185                 PdfGenerator.CreatePosterArgs args = new PdfGenerator.CreatePosterArgs();
186                 args.setSrcRect(srcLeft, srcBottom, srcRight, srcTop);
187                 args.setPosterSize(posterWidth, posterHeight);
188                 args.setPaperSize(paperWidth, paperHeight);
189                 args.setMargin(paperMargin, paperMargin, paperMargin, paperMargin);
190                 String outputFileName = generateFileName(textFieldOutputFileName
191                                 .getText());
192                 try {
193                         ByteArrayOutputStream baos = new ByteArrayOutputStream();
194                         PdfGenerator.createPoster(ic, args, baos);
195                         try {
196                                 FileOutputStream fos = new FileOutputStream(outputFileName);
197                                 baos.writeTo(fos);
198                                 fos.close();
199
200                                 labelMessage.setText(String.format(
201                                                 Lib.getMessage("Text.Saved"), outputFileName));
202                         } catch (IOException ex) {
203                                 labelMessage.setText(String.format(Lib
204                                                 .getMessage("Text.FailedWrite"), outputFileName));
205                         }
206                 } catch (Exception ex) {
207                         labelMessage.setText(Lib.getMessage("Text.FailedGenerate"));
208                 }
209                 this.validateTree();
210         }
211
212         private void changePageSuccess(ImageContainer ic) {
213                 this.ic = ic;
214
215                 choiceSrcPageNum.select(ic.getPageNum() - 1);
216
217                 srcImageWidth = ic.getImageWidth();
218                 srcImageHeight = ic.getImageHeight();
219                 numberFieldSrcImageSize_setValue();
220
221                 choiceSrcImageSizeUnit.setEnabled(true);
222                 checkboxSrcRectWholeOfPage.setEnabled(true);
223                 choiceSrcRectUnit.setEnabled(true);
224                 buttonPaperOptimize.setEnabled(true);
225
226                 canvasPreview.setImageContainer(ic);
227                 simulateOutput();
228         }
229
230         public void changePage(int pageNum) {
231                 if (fc == null) {
232                         return;
233                 }
234                 try {
235                         ImageContainer ic = new ImageContainer(fc, pageNum);
236                         changePageSuccess(ic);
237                 } catch (Exception ex) {
238
239                 }
240                 this.validateTree();
241         }
242
243         private void changeFileSuccess(File file, FileContainer fc) {
244                 this.srcFile = file;
245                 this.fc = fc;
246
247                 try {
248                     textFieldSrcFileName.setText(file.getCanonicalPath());
249                 } catch (Exception ex) {
250                     textFieldSrcFileName.setText(file.getAbsolutePath());
251                 }
252
253                 labelSrcFileType.setText(Lib.getFileTypeName(fc.getFileType()));
254
255                 choiceSrcPageNum.removeAll();
256                 for (int i = 1; i <= fc.getPageCount(); i++) {
257                         choiceSrcPageNum.add(Integer.toString(i));
258                 }
259                 choiceSrcPageNum.select(0);
260                 choiceSrcPageNum.setEnabled(fc.getFileType() == Lib.FT_PDF);
261
262                 choiceSrcImageSizeUnit_initialize(fc.getFileType());
263                 choiceSrcImageSizeUnit.select(0);
264
265                 choiceSrcRectUnit_initialize(fc.getFileType());
266                 choiceSrcRectUnit.select(0);
267
268                 changePage(choiceSrcPageNum.getSelectedIndex() + 1);
269
270                 checkboxSrcRectWholeOfPage.setState(true);
271                 checkboxSrcRectWholeOfPage_itemStateChanged();
272         }
273
274     public void changeFile(File file) {
275         try {
276             FileContainer fc = new FileContainer(file);
277             changeFileSuccess(file, fc);
278         } catch (Exception ex) {
279             String filePath;
280             try {
281                 filePath = file.getCanonicalPath();
282             } catch (Exception ex2) {
283                 filePath = file.getAbsolutePath();
284             }
285             labelMessage.setText(String.format(Lib.getMessage("Text.FailedOpen"), filePath));
286         }
287         this.validateTree();
288     }
289
290         private void updatePosterSize() {
291                 // preferredPosterSize から posterSize を更新する
292                 // KeepAspectRatio なら srcRect を拡大して preferredPosterSize に入る最大の Size を
293                 // posterSize とする
294                 posterWidth = preferredPosterWidth;
295                 posterHeight = preferredPosterHeight;
296                 if (checkboxPosterSizeKeepAspectRatio.getState()) {
297                         if ((srcRight - srcLeft) * preferredPosterHeight > (srcTop - srcBottom)
298                                         * preferredPosterWidth) {
299                                 // Src が横長
300                                 if (srcRight != srcLeft) {
301                                         posterHeight = posterWidth * (srcTop - srcBottom)
302                                                         / (srcRight - srcLeft);
303                                 }
304                         } else {
305                                 if (srcTop != srcBottom) {
306                                         posterWidth = posterHeight * (srcRight - srcLeft)
307                                                         / (srcTop - srcBottom);
308                                 }
309                         }
310                 }
311         }
312
313         /*
314          * private void revisePosterSize(int direction) { // direction は固定する方向
315          * 0->Width, 1->Height boolean changed = false; if
316          * (checkboxPosterSizeKeepAspectRatio.getState()) { switch (direction) {
317          * case 0: if (srcRight != srcLeft) { posterHeight = posterWidth * (srcTop -
318          * srcBottom) / (srcRight - srcLeft); changed = true; } break; case 1: if
319          * (srcTop != srcBottom) { posterWidth = posterHeight * (srcRight - srcLeft) /
320          * (srcTop - srcBottom); changed = true; } break; default: break; } } if
321          * (changed) { numberFieldPosterSize_setValue(); simulateOutput(); } }
322          */
323
324     private File showFileLoadDialog()
325     {
326         FileDialog fd = new FileDialog(this, Lib.getMessage("App.LowerTitle"), FileDialog.LOAD);
327         fd.setVisible(true);
328
329         if (fd.getFile() == null) {
330             return null;
331         } else {
332             return new File(fd.getDirectory(), fd.getFile());
333         }
334     }
335
336     private void menuItemNewWindow_actionPerformed() {
337         Program.createFrame();
338     }
339
340     private void menuItemOpenFile_actionPerformed() {
341         File file = showFileLoadDialog();
342         if (file != null) {
343             switch(Lib.getOS()) {
344             case Lib.OS_MAC:
345                 MainFrame frame = Program.getSameFileFrame(file);
346                 if(frame != null) {
347                     frame.setVisible(true);
348                 } else if (!checkFileLoaded()) {
349                     changeFile(file);
350                 } else {
351                     Program.createFrame(file, false);
352                 }
353                 break;
354             default:
355                 changeFile(file);
356                 break;
357             }
358         }
359     }
360
361         private void menuItemCloseWindow_actionPerformed() {
362                 this.dispose();
363         }
364
365         private void menuItemOutput_actionPerformed() {
366                 outputPdf();
367         }
368
369         private void menuItemExit_actionPerformed() {
370                 System.exit(0);
371         }
372
373     private void buttonSrcFileChange_actionPerformed() {
374         File file = showFileLoadDialog();
375         if (file != null) {
376             switch(Lib.getOS()) {
377             case Lib.OS_MAC:
378                 MainFrame frame = Program.getSameFileFrame(file);
379                 if(frame != null) {
380                     frame.setVisible(true);
381                 } else {
382                     changeFile(file);
383                 }
384                 break;
385             default:
386                 changeFile(file);
387                 break;
388             }
389         }
390     }
391
392         private void choiceSrcPageNum_itemStateChanged() {
393                 int pageNum = choiceSrcPageNum.getSelectedIndex() + 1;
394                 if (this.ic.getPageNum() != pageNum) {
395                         changePage(pageNum);
396                 }
397         }
398
399         private void numberFieldSrcImageSize_setValue() {
400                 double rate = listSrcImageSizeUnit.get(choiceSrcImageSizeUnit
401                                 .getSelectedIndex());
402                 numberFieldSrcImageWidth.setValue(srcImageWidth * rate);
403                 numberFieldSrcImageHeight.setValue(srcImageHeight * rate);
404         }
405
406         private void choiceSrcImageSizeUnit_add(String key, double value) {
407                 choiceSrcImageSizeUnit.add(key);
408                 listSrcImageSizeUnit.add(value);
409         }
410
411         private void choiceSrcImageSizeUnit_initialize(int fileType) {
412                 choiceSrcImageSizeUnit.removeAll();
413                 listSrcImageSizeUnit.clear();
414                 switch (fileType) {
415                 case Lib.FT_PDF:
416                         choiceSrcImageSizeUnit_add(Lib.getMessage("Str.MM"), Lib.UNIT_POINT_MM);
417                         choiceSrcImageSizeUnit_add(Lib.getMessage("Str.CM"), Lib.UNIT_POINT_CM);
418                         choiceSrcImageSizeUnit_add(Lib.getMessage("Str.M"), Lib.UNIT_POINT_M);
419                         choiceSrcImageSizeUnit_add(Lib.getMessage("Str.Inch"),
420                                         Lib.UNIT_POINT_INCH);
421                         choiceSrcImageSizeUnit_add(Lib.getMessage("Str.Point"),
422                                         Lib.UNIT_POINT_POINT);
423                         break;
424                 case Lib.FT_BMP:
425                 case Lib.FT_GIF:
426                 case Lib.FT_JBIG2:
427                 case Lib.FT_JPEG:
428                 case Lib.FT_JPEG2000:
429                 case Lib.FT_PNG:
430                 case Lib.FT_TIFF:
431                 case Lib.FT_WMF:
432                 case Lib.FT_OTHERIMAGE:
433                         choiceSrcImageSizeUnit_add(Lib.getMessage("Str.Pixel"),
434                                         Lib.UNIT_PIXEL_PIXEL);
435                         break;
436                 default:
437                         break;
438                 }
439         }
440
441         private void choiceSrcImageSizeUnit_itemStateChanged() {
442                 numberFieldSrcImageSize_setValue();
443         }
444
445         private void checkboxSrcRectWholeOfPage_itemStateChanged() {
446                 boolean b = checkboxSrcRectWholeOfPage.getState();
447                 numberFieldSrcLeft.setEnabled(!b);
448                 numberFieldSrcTop.setEnabled(!b);
449                 numberFieldSrcRight.setEnabled(!b);
450                 numberFieldSrcBottom.setEnabled(!b);
451                 if (b) {
452                         srcLeft = 0;
453                         srcBottom = 0;
454                         srcRight = srcImageWidth;
455                         srcTop = srcImageHeight;
456                         numberFieldSrcRect_setValue();
457                         updatePosterSize();
458                         numberFieldPosterSize_setValue();
459                         // revisePosterSize(0);
460                         simulateOutput();
461                 }
462         }
463
464         private void numberFieldSrcRect_actionPerformed(Object obj) {
465                 double rate = listSrcRectUnit.get(choiceSrcRectUnit.getSelectedIndex());
466                 srcLeft = (float) (numberFieldSrcLeft.getValue() / rate);
467                 srcTop = (float) (numberFieldSrcTop.getValue() / rate);
468                 srcRight = (float) (numberFieldSrcRight.getValue() / rate);
469                 srcBottom = (float) (numberFieldSrcBottom.getValue() / rate);
470                 numberFieldSrcRect_setValue();
471                 updatePosterSize();
472                 numberFieldPosterSize_setValue();
473                 // revisePosterSize(0);
474                 simulateOutput();
475         }
476
477         private void numberFieldSrcRect_setValue() {
478                 if (listSrcRectUnit.isEmpty()) {
479                         return;
480                 }
481                 double rate = listSrcRectUnit.get(choiceSrcRectUnit.getSelectedIndex());
482                 numberFieldSrcLeft.setValue(srcLeft * rate);
483                 numberFieldSrcTop.setValue(srcTop * rate);
484                 numberFieldSrcRight.setValue(srcRight * rate);
485                 numberFieldSrcBottom.setValue(srcBottom * rate);
486         }
487
488         private void choiceSrcRectUnit_add(String key, double value) {
489                 choiceSrcRectUnit.add(key);
490                 listSrcRectUnit.add(value);
491         }
492
493         private void choiceSrcRectUnit_initialize(int fileType) {
494                 choiceSrcRectUnit.removeAll();
495                 listSrcRectUnit.clear();
496                 switch (fileType) {
497                 case Lib.FT_PDF:
498                         choiceSrcRectUnit_add(Lib.getMessage("Str.MM"), Lib.UNIT_POINT_MM);
499                         choiceSrcRectUnit_add(Lib.getMessage("Str.CM"), Lib.UNIT_POINT_CM);
500                         choiceSrcRectUnit_add(Lib.getMessage("Str.M"), Lib.UNIT_POINT_M);
501                         choiceSrcRectUnit_add(Lib.getMessage("Str.Inch"), Lib.UNIT_POINT_INCH);
502                         choiceSrcRectUnit_add(Lib.getMessage("Str.Point"), Lib.UNIT_POINT_POINT);
503                         break;
504                 case Lib.FT_BMP:
505                 case Lib.FT_GIF:
506                 case Lib.FT_JBIG2:
507                 case Lib.FT_JPEG:
508                 case Lib.FT_JPEG2000:
509                 case Lib.FT_PNG:
510                 case Lib.FT_TIFF:
511                 case Lib.FT_WMF:
512                 case Lib.FT_OTHERIMAGE:
513                         choiceSrcRectUnit_add(Lib.getMessage("Str.Pixel"), Lib.UNIT_PIXEL_PIXEL);
514                         break;
515                 default:
516                         break;
517                 }
518         }
519
520         private void choiceSrcRectUnit_itemStateChanged() {
521                 numberFieldSrcRect_setValue();
522         }
523
524         private void choicePosterSize_add(String key, PaperSize value) {
525                 choicePosterSize.add(key);
526                 listPosterSize.add(value);
527         }
528
529         private void choicePosterSize_initialize() {
530                 choicePosterSize.removeAll();
531                 listPosterSize.clear();
532                 // TODO:後で減らす
533                 choicePosterSize_add(Lib.getMessage("Str.A0"), PaperSize.A0);
534                 choicePosterSize_add(Lib.getMessage("Str.A1"), PaperSize.A1);
535                 choicePosterSize_add(Lib.getMessage("Str.A2"), PaperSize.A2);
536                 choicePosterSize_add(Lib.getMessage("Str.A3"), PaperSize.A3);
537                 choicePosterSize_add(Lib.getMessage("Str.A4"), PaperSize.A4);
538                 choicePosterSize_add(Lib.getMessage("Str.A5"), PaperSize.A5);
539                 choicePosterSize_add(Lib.getMessage("Str.A6"), PaperSize.A6);
540                 choicePosterSize_add(Lib.getMessage("Str.B0"), PaperSize.B0);
541                 choicePosterSize_add(Lib.getMessage("Str.B1"), PaperSize.B1);
542                 choicePosterSize_add(Lib.getMessage("Str.B2"), PaperSize.B2);
543                 choicePosterSize_add(Lib.getMessage("Str.B3"), PaperSize.B3);
544                 choicePosterSize_add(Lib.getMessage("Str.B4"), PaperSize.B4);
545                 choicePosterSize_add(Lib.getMessage("Str.B5"), PaperSize.B5);
546                 choicePosterSize_add(Lib.getMessage("Str.B6"), PaperSize.B6);
547                 choicePosterSize_add(Lib.getMessage("Str.Custom"), PaperSize.CUSTOM);
548         }
549
550         private void choicePosterSize_itemStateChanged() {
551                 PaperSize size = listPosterSize
552                                 .get(choicePosterSize.getSelectedIndex());
553                 boolean custom = size.isCustom();
554                 numberFieldPosterWidth.setEnabled(custom);
555                 numberFieldPosterHeight.setEnabled(custom);
556                 // checkboxPosterSizeKeepAspectRatio.setEnabled(custom);
557                 // if (!custom) {
558                 // checkboxPosterSizeKeepAspectRatio.setState(false);
559                 // posterWidth = size.getWidth();
560                 // posterHeight = size.getHeight();
561                 // numberFieldPosterSize_setValue();
562                 // simulateOutput();
563                 // }
564                 if (!custom) {
565                         preferredPosterWidth = size.getWidth();
566                         preferredPosterHeight = size.getHeight();
567                         updatePosterSize();
568                         numberFieldPosterSize_setValue();
569                         simulateOutput();
570                 }
571         }
572
573         private void numberFieldPosterSize_actionPerformed(Object obj) {
574                 double rate = listPosterSizeUnit.get(choicePosterSizeUnit
575                                 .getSelectedIndex());
576                 // posterWidth = (float) (numberFieldPosterWidth.getValue() / rate);
577                 // posterHeight = (float) (numberFieldPosterHeight.getValue() / rate);
578                 // if (obj == numberFieldPosterWidth) {
579                 // revisePosterSize(0);
580                 // }
581                 // if (obj == numberFieldPosterHeight) {
582                 // revisePosterSize(1);
583                 // }
584                 preferredPosterWidth = (float) (numberFieldPosterWidth.getValue() / rate);
585                 preferredPosterHeight = (float) (numberFieldPosterHeight.getValue() / rate);
586                 if (checkboxPosterSizeKeepAspectRatio.getState()) {
587                         if (obj == numberFieldPosterWidth) {
588                                 if (srcRight != srcLeft) {
589                                         preferredPosterHeight = preferredPosterWidth
590                                                         * (srcTop - srcBottom) / (srcRight - srcLeft);
591                                 }
592                         }
593                         if (obj == numberFieldPosterHeight) {
594                                 if (srcTop != srcBottom) {
595                                         preferredPosterWidth = preferredPosterHeight
596                                                         * (srcRight - srcLeft) / (srcTop - srcBottom);
597                                 }
598                         }
599                 }
600                 updatePosterSize();
601                 numberFieldPosterSize_setValue();
602                 simulateOutput();
603         }
604
605         private void numberFieldPosterSize_setValue() {
606                 double rate = listPosterSizeUnit.get(choicePosterSizeUnit
607                                 .getSelectedIndex());
608                 numberFieldPosterWidth.setValue(posterWidth * rate);
609                 numberFieldPosterHeight.setValue(posterHeight * rate);
610         }
611
612         private void choicePosterSizeUnit_add(String key, double value) {
613                 choicePosterSizeUnit.add(key);
614                 listPosterSizeUnit.add(value);
615         }
616
617         private void choicePosterSizeUnit_initialize() {
618                 choicePosterSizeUnit.removeAll();
619                 listPosterSizeUnit.clear();
620                 choicePosterSizeUnit_add(Lib.getMessage("Str.MM"), Lib.UNIT_POINT_MM);
621                 choicePosterSizeUnit_add(Lib.getMessage("Str.CM"), Lib.UNIT_POINT_CM);
622                 choicePosterSizeUnit_add(Lib.getMessage("Str.M"), Lib.UNIT_POINT_M);
623                 choicePosterSizeUnit_add(Lib.getMessage("Str.Inch"), Lib.UNIT_POINT_INCH);
624                 choicePosterSizeUnit_add(Lib.getMessage("Str.Point"), Lib.UNIT_POINT_POINT);
625         }
626
627         private void choicePosterSizeUnit_itemStateChanged() {
628                 numberFieldPosterSize_setValue();
629         }
630
631         private void checkboxPosterSizeKeepAspectRatio_itemStateChanged() {
632                 // revisePosterSize(0);
633                 updatePosterSize();
634                 numberFieldPosterSize_setValue();
635                 simulateOutput();
636         }
637
638         private void choicePaperSize_add(String key, PaperSize value) {
639                 choicePaperSize.add(key);
640                 listPaperSize.add(value);
641         }
642
643         private void choicePaperSize_initialize() {
644                 choicePaperSize.removeAll();
645                 listPaperSize.clear();
646                 choicePaperSize_add(Lib.getMessage("Str.A4"), PaperSize.A4);
647                 choicePaperSize_add(Lib.getMessage("Str.A3"), PaperSize.A3);
648                 choicePaperSize_add(Lib.getMessage("Str.B5"), PaperSize.B5);
649                 choicePaperSize_add(Lib.getMessage("Str.B4"), PaperSize.B4);
650                 choicePaperSize_add(Lib.getMessage("Str.Custom"), PaperSize.CUSTOM);
651         }
652
653         private void choicePaperSize_itemStateChanged() {
654                 PaperSize size = listPaperSize.get(choicePaperSize.getSelectedIndex());
655                 boolean custom = size.isCustom();
656                 numberFieldPaperWidth.setEnabled(custom);
657                 numberFieldPaperHeight.setEnabled(custom);
658                 if (!custom) {
659                         if (paperRotated) {
660                                 paperWidth = size.getHeight();
661                                 paperHeight = size.getWidth();
662                         } else {
663                                 paperWidth = size.getWidth();
664                                 paperHeight = size.getHeight();
665                         }
666                         numberFieldPaperSize_setValue();
667                         simulateOutput();
668                 }
669         }
670
671         private void numberFieldPaperSize_actionPerformed(Object obj) {
672                 double rate = listPaperSizeUnit.get(choicePaperSizeUnit
673                                 .getSelectedIndex());
674                 paperWidth = (float) (numberFieldPaperWidth.getValue() / rate);
675                 paperHeight = (float) (numberFieldPaperHeight.getValue() / rate);
676                 numberFieldPaperSize_setValue();
677                 simulateOutput();
678         }
679
680         private void numberFieldPaperSize_setValue() {
681                 double rate = listPaperSizeUnit.get(choicePaperSizeUnit
682                                 .getSelectedIndex());
683                 numberFieldPaperWidth.setValue(paperWidth * rate);
684                 numberFieldPaperHeight.setValue(paperHeight * rate);
685         }
686
687         private void choicePaperSizeUnit_add(String key, double value) {
688                 choicePaperSizeUnit.add(key);
689                 listPaperSizeUnit.add(value);
690         }
691
692         private void choicePaperSizeUnit_initialize() {
693                 choicePaperSizeUnit.removeAll();
694                 listPaperSizeUnit.clear();
695                 choicePaperSizeUnit_add(Lib.getMessage("Str.MM"), Lib.UNIT_POINT_MM);
696                 choicePaperSizeUnit_add(Lib.getMessage("Str.CM"), Lib.UNIT_POINT_CM);
697                 choicePaperSizeUnit_add(Lib.getMessage("Str.M"), Lib.UNIT_POINT_M);
698                 choicePaperSizeUnit_add(Lib.getMessage("Str.Inch"), Lib.UNIT_POINT_INCH);
699                 choicePaperSizeUnit_add(Lib.getMessage("Str.Point"), Lib.UNIT_POINT_POINT);
700         }
701
702         private void choicePaperSizeUnit_itemStateChanged() {
703                 numberFieldPaperSize_setValue();
704         }
705
706         private void numberFieldPaperMargin_actionPerformed(Object obj) {
707                 double rate = listPaperMarginUnit.get(choicePaperMarginUnit
708                                 .getSelectedIndex());
709                 paperMargin = (float) (numberFieldPaperMargin.getValue() / rate);
710                 numberFieldPaperMargin_setValue();
711                 simulateOutput();
712         }
713
714         private void numberFieldPaperMargin_setValue() {
715                 double rate = listPaperMarginUnit.get(choicePaperMarginUnit
716                                 .getSelectedIndex());
717                 numberFieldPaperMargin.setValue(paperMargin * rate);
718         }
719
720         private void choicePaperMarginUnit_add(String key, double value) {
721                 choicePaperMarginUnit.add(key);
722                 listPaperMarginUnit.add(value);
723         }
724
725         private void choicePaperMarginUnit_initialize() {
726                 choicePaperMarginUnit.removeAll();
727                 listPaperMarginUnit.clear();
728                 choicePaperMarginUnit_add(Lib.getMessage("Str.MM"), Lib.UNIT_POINT_MM);
729                 choicePaperMarginUnit_add(Lib.getMessage("Str.CM"), Lib.UNIT_POINT_CM);
730                 choicePaperMarginUnit_add(Lib.getMessage("Str.M"), Lib.UNIT_POINT_M);
731                 choicePaperMarginUnit_add(Lib.getMessage("Str.Inch"), Lib.UNIT_POINT_INCH);
732                 choicePaperMarginUnit_add(Lib.getMessage("Str.Point"), Lib.UNIT_POINT_POINT);
733         }
734
735         private void choicePaperMarginUnit_itemStateChanged() {
736                 numberFieldPaperMargin_setValue();
737         }
738
739         private void checkboxPaperRotate_itemStateChanged() {
740                 boolean paperRotated = checkboxPaperRotate.getState();
741                 if (this.paperRotated != paperRotated) {
742                         float a = this.paperWidth;
743                         this.paperWidth = this.paperHeight;
744                         this.paperHeight = a;
745                         this.paperRotated = paperRotated;
746                         numberFieldPaperSize_setValue();
747                         simulateOutput();
748                 }
749         }
750
751         private void buttonPaperOptimize_actionPerformed() {
752                 optimizePaperRotated();
753         }
754
755         private void buttonOutput_actionPerformed() {
756                 outputPdf();
757         }
758
759         private void numberField_initialize(NumberField numberField) {
760                 numberField.setColumns(7);
761                 numberField.setDisplayDigit(2);
762                 numberField.setUnitIncrement(0.1);
763         }
764
765         private void mainFrame_initializeComponents() {
766             this.setTitle(Lib.getMessage("App.LowerTitle"));
767                 this.setSize(800, 600);
768                 this.setLocationRelativeTo(null);
769                 this.addWindowListener(new WindowListener() {
770                         public void windowActivated(WindowEvent e) {
771                         }
772
773                         public void windowClosed(WindowEvent e) {
774                         }
775
776                         public void windowClosing(WindowEvent e) {
777                                 dispose();
778                         }
779
780                         public void windowDeactivated(WindowEvent e) {
781                         }
782
783                         public void windowDeiconified(WindowEvent e) {
784                         }
785
786                         public void windowIconified(WindowEvent e) {
787                         }
788
789                         public void windowOpened(WindowEvent e) {
790                                 buttonOutput.requestFocus();
791                         }
792                 });
793
794                 MenuBar menuBar = new MenuBar();
795                 Menu menuFile = new Menu(Lib.getMessage(Lib.getOS() == Lib.OS_WIN ? "menuFile.Label.Win" : Lib.getOS() == Lib.OS_MAC ? "menuFile.Label.Mac" : "menuFile.Label"));
796                 MenuItem menuItemNewWindow = new MenuItem(Lib.getMessage(Lib.getOS() == Lib.OS_WIN ? "menuItemNewWindow.Label.Win" : Lib.getOS() == Lib.OS_MAC ? "menuItemNewWindow.Label.Mac" : "menuItemNewWindow.Label"));
797                 menuItemNewWindow.setShortcut(new MenuShortcut(KeyEvent.VK_N, false));
798                 menuItemNewWindow.addActionListener(new ActionListener() {
799                         public void actionPerformed(ActionEvent e) {
800                                 menuItemNewWindow_actionPerformed();
801                         }
802                 });
803                 MenuItem menuItemOpenFile = new MenuItem(Lib.getMessage(Lib.getOS() == Lib.OS_WIN ? "menuItemOpenFile.Label.Win" : Lib.getOS() == Lib.OS_MAC ? "menuItemOpenFile.Label.Mac" : "menuItemOpenFile.Label") + "...");
804                 menuItemOpenFile.setShortcut(new MenuShortcut(KeyEvent.VK_O, false));
805                 menuItemOpenFile.addActionListener(new ActionListener() {
806                         public void actionPerformed(ActionEvent e) {
807                                 menuItemOpenFile_actionPerformed();
808                         }
809                 });
810                 MenuItem menuItemCloseWindow = new MenuItem(Lib.getMessage(Lib.getOS() == Lib.OS_WIN ? "menuItemCloseWindow.Label.Win" : Lib.getOS() == Lib.OS_MAC ? "menuItemCloseWindow.Label.Mac" : "menuItemCloseWindow.Label"));
811                 menuItemCloseWindow.setShortcut(new MenuShortcut(KeyEvent.VK_W, false));
812                 menuItemCloseWindow.addActionListener(new ActionListener() {
813                         public void actionPerformed(ActionEvent e) {
814                                 menuItemCloseWindow_actionPerformed();
815                         }
816                 });
817                 MenuItem menuItemOutput = new MenuItem(Lib.getMessage(Lib.getOS() == Lib.OS_WIN ? "menuItemOutput.Label.Win" : Lib.getOS() == Lib.OS_MAC ? "menuItemOutput.Label.Mac" : "menuItemOutput.Label"));
818                 menuItemOutput.addActionListener(new ActionListener() {
819                         public void actionPerformed(ActionEvent e) {
820                                 menuItemOutput_actionPerformed();
821                         }
822                 });
823                 MenuItem menuItemExit = new MenuItem(Lib.getMessage(Lib.getOS() == Lib.OS_WIN ? "menuItemExit.Label.Win" : Lib.getOS() == Lib.OS_MAC ? "menuItemExit.Label.Mac" : "menuItemExit.Label"));
824                 menuItemExit.addActionListener(new ActionListener() {
825                         public void actionPerformed(ActionEvent e) {
826                                 menuItemExit_actionPerformed();
827                         }
828                 });
829
830                 labelSrcFile = new Label();
831                 labelSrcFile.setText(Lib.getMessage("labelSrcFile.Text"));
832
833                 textFieldSrcFileName = new TextField();
834                 textFieldSrcFileName.setEditable(false);
835                 textFieldSrcFileName.setColumns(50);
836
837                 labelSrcFileType = new Label();
838
839                 buttonSrcFileChange = new Button();
840                 buttonSrcFileChange.setLabel(Lib.getMessage("buttonSrcFileChange.Label") + "...");
841                 buttonSrcFileChange.addActionListener(new ActionListener() {
842                         public void actionPerformed(ActionEvent e) {
843                                 buttonSrcFileChange_actionPerformed();
844                         }
845                 });
846
847                 labelSrcPageNum = new Label();
848                 labelSrcPageNum.setText(Lib.getMessage("labelSrcPageNum.Text"));
849
850                 choiceSrcPageNum = new Choice();
851                 choiceSrcPageNum.setEnabled(false);
852                 choiceSrcPageNum.addItemListener(new ItemListener() {
853                         public void itemStateChanged(ItemEvent e) {
854                                 choiceSrcPageNum_itemStateChanged();
855                         }
856                 });
857
858                 labelSrcImageSize = new Label();
859                 labelSrcImageSize.setText(Lib.getMessage("labelSrcImageSize.Text"));
860
861                 numberFieldSrcImageWidth = new NumberField();
862                 numberField_initialize(numberFieldSrcImageWidth);
863                 numberFieldSrcImageWidth.setEnabled(false);
864
865                 numberFieldSrcImageHeight = new NumberField();
866                 numberField_initialize(numberFieldSrcImageHeight);
867                 numberFieldSrcImageHeight.setEnabled(false);
868
869                 choiceSrcImageSizeUnit = new Choice();
870                 choiceSrcImageSizeUnit.setEnabled(false);
871                 choiceSrcImageSizeUnit.addItemListener(new ItemListener() {
872                         public void itemStateChanged(ItemEvent e) {
873                                 choiceSrcImageSizeUnit_itemStateChanged();
874                         }
875                 });
876
877                 labelSrcRect = new Label();
878                 labelSrcRect.setText(Lib.getMessage("labelSrcRect.Text"));
879
880                 checkboxSrcRectWholeOfPage = new Checkbox();
881                 checkboxSrcRectWholeOfPage.setLabel(Lib.getMessage("checkboxSrcRectWholeOfPage.Label"));
882                 checkboxSrcRectWholeOfPage.setEnabled(false);
883                 checkboxSrcRectWholeOfPage.addItemListener(new ItemListener() {
884                         public void itemStateChanged(ItemEvent e) {
885                                 checkboxSrcRectWholeOfPage_itemStateChanged();
886                         }
887                 });
888
889                 numberFieldSrcLeft = new NumberField();
890                 numberField_initialize(numberFieldSrcLeft);
891                 numberFieldSrcLeft.setEnabled(false);
892                 numberFieldSrcLeft.addActionListener(new ActionListener() {
893                         public void actionPerformed(ActionEvent e) {
894                                 numberFieldSrcRect_actionPerformed(e.getSource());
895                         }
896                 });
897
898                 numberFieldSrcBottom = new NumberField();
899                 numberField_initialize(numberFieldSrcBottom);
900                 numberFieldSrcBottom.setEnabled(false);
901                 numberFieldSrcBottom.addActionListener(new ActionListener() {
902                         public void actionPerformed(ActionEvent e) {
903                                 numberFieldSrcRect_actionPerformed(e.getSource());
904                         }
905                 });
906
907                 numberFieldSrcRight = new NumberField();
908                 numberField_initialize(numberFieldSrcRight);
909                 numberFieldSrcRight.setEnabled(false);
910                 numberFieldSrcRight.addActionListener(new ActionListener() {
911                         public void actionPerformed(ActionEvent e) {
912                                 numberFieldSrcRect_actionPerformed(e.getSource());
913                         }
914                 });
915
916                 numberFieldSrcTop = new NumberField();
917                 numberField_initialize(numberFieldSrcTop);
918                 numberFieldSrcTop.setEnabled(false);
919                 numberFieldSrcTop.addActionListener(new ActionListener() {
920                         public void actionPerformed(ActionEvent e) {
921                                 numberFieldSrcRect_actionPerformed(e.getSource());
922                         }
923                 });
924
925                 choiceSrcRectUnit = new Choice();
926                 choiceSrcRectUnit.setEnabled(false);
927                 choiceSrcRectUnit.addItemListener(new ItemListener() {
928                         public void itemStateChanged(ItemEvent e) {
929                                 choiceSrcRectUnit_itemStateChanged();
930                         }
931                 });
932
933                 labelPosterSize = new Label();
934                 labelPosterSize.setText(Lib.getMessage("labelPosterSize.Text"));
935
936                 choicePosterSize = new Choice();
937                 choicePosterSize_initialize();
938                 choicePosterSize.addItemListener(new ItemListener() {
939                         public void itemStateChanged(ItemEvent e) {
940                                 choicePosterSize_itemStateChanged();
941                         }
942                 });
943
944                 numberFieldPosterWidth = new NumberField();
945                 numberField_initialize(numberFieldPosterWidth);
946                 numberFieldPosterWidth.addActionListener(new ActionListener() {
947                         public void actionPerformed(ActionEvent e) {
948                                 numberFieldPosterSize_actionPerformed(e.getSource());
949                         }
950                 });
951
952                 numberFieldPosterHeight = new NumberField();
953                 numberField_initialize(numberFieldPosterHeight);
954                 numberFieldPosterHeight.addActionListener(new ActionListener() {
955                         public void actionPerformed(ActionEvent e) {
956                                 numberFieldPosterSize_actionPerformed(e.getSource());
957                         }
958                 });
959
960                 choicePosterSizeUnit = new Choice();
961                 choicePosterSizeUnit_initialize();
962                 choicePosterSizeUnit.addItemListener(new ItemListener() {
963                         public void itemStateChanged(ItemEvent e) {
964                                 choicePosterSizeUnit_itemStateChanged();
965                         }
966                 });
967
968                 checkboxPosterSizeKeepAspectRatio = new Checkbox();
969                 checkboxPosterSizeKeepAspectRatio.setLabel(Lib
970                                 .getMessage("checkboxPosterSizeKeepAspectRatio.Label"));
971                 checkboxPosterSizeKeepAspectRatio.addItemListener(new ItemListener() {
972                         public void itemStateChanged(ItemEvent e) {
973                                 checkboxPosterSizeKeepAspectRatio_itemStateChanged();
974                         }
975                 });
976
977                 labelPaperSize = new Label();
978                 labelPaperSize.setText(Lib.getMessage("labelPaperSize.Text"));
979
980                 choicePaperSize = new Choice();
981                 choicePaperSize_initialize();
982                 choicePaperSize.addItemListener(new ItemListener() {
983                         public void itemStateChanged(ItemEvent e) {
984                                 choicePaperSize_itemStateChanged();
985                         }
986                 });
987
988                 numberFieldPaperWidth = new NumberField();
989                 numberField_initialize(numberFieldPaperWidth);
990                 numberFieldPaperWidth.addActionListener(new ActionListener() {
991                         public void actionPerformed(ActionEvent e) {
992                                 numberFieldPaperSize_actionPerformed(e.getSource());
993                         }
994                 });
995
996                 numberFieldPaperHeight = new NumberField();
997                 numberField_initialize(numberFieldPaperHeight);
998                 numberFieldPaperHeight.addActionListener(new ActionListener() {
999                         public void actionPerformed(ActionEvent e) {
1000                                 numberFieldPaperSize_actionPerformed(e.getSource());
1001                         }
1002                 });
1003
1004                 choicePaperSizeUnit = new Choice();
1005                 choicePaperSizeUnit_initialize();
1006                 choicePaperSizeUnit.addItemListener(new ItemListener() {
1007                         public void itemStateChanged(ItemEvent e) {
1008                                 choicePaperSizeUnit_itemStateChanged();
1009                         }
1010                 });
1011
1012                 labelPaperMargin = new Label();
1013                 labelPaperMargin.setText(Lib.getMessage("labelPaperMargin.Text"));
1014
1015                 numberFieldPaperMargin = new NumberField();
1016                 numberField_initialize(numberFieldPaperMargin);
1017                 numberFieldPaperMargin.addActionListener(new ActionListener() {
1018                         public void actionPerformed(ActionEvent e) {
1019                                 numberFieldPaperMargin_actionPerformed(e.getSource());
1020                         }
1021                 });
1022
1023                 choicePaperMarginUnit = new Choice();
1024                 choicePaperMarginUnit_initialize();
1025                 choicePaperMarginUnit.addItemListener(new ItemListener() {
1026                         public void itemStateChanged(ItemEvent e) {
1027                                 choicePaperMarginUnit_itemStateChanged();
1028                         }
1029                 });
1030
1031                 checkboxPaperRotate = new Checkbox();
1032                 checkboxPaperRotate.setLabel(Lib.getMessage("checkboxPaperRotate.Label"));
1033                 checkboxPaperRotate.addItemListener(new ItemListener() {
1034                         public void itemStateChanged(ItemEvent e) {
1035                                 checkboxPaperRotate_itemStateChanged();
1036                         }
1037                 });
1038
1039                 buttonPaperOptimize = new Button();
1040                 buttonPaperOptimize.setLabel(Lib.getMessage("buttonPaperOptimize.Label"));
1041                 buttonPaperOptimize.setEnabled(false);
1042                 buttonPaperOptimize.addActionListener(new ActionListener() {
1043                         public void actionPerformed(ActionEvent e) {
1044                                 buttonPaperOptimize_actionPerformed();
1045                         }
1046                 });
1047
1048                 labelPreview = new Label();
1049                 labelPreview.setText(Lib.getMessage("labelPreview.Text"));
1050
1051                 labelOutputPaperCount = new Label();
1052                 labelOutputPaperCount.setText(Lib.getMessage("labelOutputPaperCount.Text"));
1053
1054                 numberFieldOutputPaperCount = new NumberField();
1055                 numberFieldOutputPaperCount.setColumns(7);
1056                 numberFieldOutputPaperCount.setDisplayDigit(0);
1057                 numberFieldOutputPaperCount.setEditable(false);
1058
1059                 canvasPreview = new CanvasPreview();
1060                 canvasPreview.setMaximumSize(new Dimension(500, 400));
1061                 canvasPreview.setMinimumSize(new Dimension(0, 0));
1062                 canvasPreview.setPreferredSize(new Dimension(500, 200));
1063
1064                 labelOutputFileName = new Label();
1065                 labelOutputFileName.setText(Lib.getMessage("labelOutputFileName.Text"));
1066
1067                 textFieldOutputFileName = new TextField();
1068                 textFieldOutputFileName.setColumns(40);
1069
1070                 labelMessage = new Label();
1071
1072                 buttonOutput = new Button();
1073                 buttonOutput.setLabel(Lib.getMessage("buttonOutput.Label"));
1074                 buttonOutput.addActionListener(new ActionListener() {
1075                         public void actionPerformed(ActionEvent e) {
1076                                 buttonOutput_actionPerformed();
1077                         }
1078                 });
1079
1080                 if(Lib.getOS() == Lib.OS_MAC) {
1081                         menuFile.add(menuItemNewWindow);
1082                         menuFile.add(menuItemOpenFile);
1083                         menuFile.addSeparator();
1084                         menuFile.add(menuItemCloseWindow);
1085                         menuFile.add(menuItemOutput);
1086                 } else {
1087                         menuFile.add(menuItemNewWindow);
1088                         menuFile.add(menuItemOpenFile);
1089                         menuFile.add(menuItemCloseWindow);
1090                         menuFile.addSeparator();
1091                         menuFile.add(menuItemOutput);
1092                         menuFile.addSeparator();
1093                         menuFile.add(menuItemExit);
1094                 }
1095
1096                 menuBar.add(menuFile);
1097
1098                 Panel panelSrcFile = new Panel();
1099                 panelSrcFile.setLayout(new FlowLayout(FlowLayout.LEFT));
1100                 panelSrcFile.add(labelSrcFile);
1101                 panelSrcFile.add(textFieldSrcFileName);
1102                 panelSrcFile.add(labelSrcFileType);
1103                 panelSrcFile.add(buttonSrcFileChange);
1104
1105                 Panel panelSrc = new Panel();
1106                 panelSrc.setLayout(new FlowLayout(FlowLayout.LEFT));
1107                 panelSrc.add(labelSrcPageNum);
1108                 panelSrc.add(choiceSrcPageNum);
1109                 panelSrc.add(labelSrcImageSize);
1110                 panelSrc.add(numberFieldSrcImageWidth);
1111                 panelSrc.add(numberFieldSrcImageHeight);
1112                 panelSrc.add(choiceSrcImageSizeUnit);
1113
1114                 Panel panelSrcRect = new Panel();
1115                 panelSrcRect.setLayout(new FlowLayout(FlowLayout.LEFT));
1116                 panelSrcRect.add(labelSrcRect);
1117                 panelSrcRect.add(checkboxSrcRectWholeOfPage);
1118                 panelSrcRect.add(numberFieldSrcLeft);
1119                 panelSrcRect.add(numberFieldSrcBottom);
1120                 panelSrcRect.add(numberFieldSrcRight);
1121                 panelSrcRect.add(numberFieldSrcTop);
1122                 panelSrcRect.add(choiceSrcRectUnit);
1123
1124                 Panel panelPosterSize = new Panel();
1125                 panelPosterSize.setLayout(new FlowLayout(FlowLayout.LEFT));
1126                 panelPosterSize.add(labelPosterSize);
1127                 panelPosterSize.add(choicePosterSize);
1128                 panelPosterSize.add(numberFieldPosterWidth);
1129                 panelPosterSize.add(numberFieldPosterHeight);
1130                 panelPosterSize.add(choicePosterSizeUnit);
1131                 panelPosterSize.add(checkboxPosterSizeKeepAspectRatio);
1132
1133                 Panel panelPaperSize = new Panel();
1134                 panelPaperSize.setLayout(new FlowLayout(FlowLayout.LEFT));
1135                 panelPaperSize.add(labelPaperSize);
1136                 panelPaperSize.add(choicePaperSize);
1137                 panelPaperSize.add(numberFieldPaperWidth);
1138                 panelPaperSize.add(numberFieldPaperHeight);
1139                 panelPaperSize.add(choicePaperSizeUnit);
1140                 panelPaperSize.add(labelPaperMargin);
1141                 panelPaperSize.add(numberFieldPaperMargin);
1142                 panelPaperSize.add(choicePaperMarginUnit);
1143                 panelPaperSize.add(checkboxPaperRotate);
1144                 panelPaperSize.add(buttonPaperOptimize);
1145
1146                 Panel panelPreviewText = new Panel();
1147                 panelPreviewText.setLayout(new FlowLayout(FlowLayout.LEFT));
1148                 panelPreviewText.add(labelPreview);
1149                 panelPreviewText.add(labelOutputPaperCount);
1150                 panelPreviewText.add(numberFieldOutputPaperCount);
1151
1152                 Panel panelOutputFileName = new Panel();
1153                 panelOutputFileName.setLayout(new FlowLayout(FlowLayout.LEFT));
1154                 panelOutputFileName.add(labelOutputFileName);
1155                 panelOutputFileName.add(textFieldOutputFileName);
1156
1157                 Panel panelOutput = new Panel();
1158                 switch(Lib.getOS()) {
1159                 case Lib.OS_MAC:
1160                     panelOutput.setLayout(new FlowLayout(FlowLayout.RIGHT));
1161                     panelOutput.add(labelMessage);
1162                     panelOutput.add(buttonOutput);
1163                     break;
1164                 default:
1165                     panelOutput.setLayout(new FlowLayout(FlowLayout.LEFT));
1166                     panelOutput.add(buttonOutput);
1167                     panelOutput.add(labelMessage);
1168                     break;
1169                 }
1170
1171                 this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
1172                 this.setMenuBar(menuBar);
1173                 this.add(panelSrcFile);
1174                 this.add(panelSrc);
1175                 this.add(panelSrcRect);
1176                 this.add(panelPosterSize);
1177                 this.add(panelPaperSize);
1178                 this.add(panelPreviewText);
1179                 this.add(canvasPreview);
1180                 this.add(panelOutputFileName);
1181                 this.add(panelOutput);
1182         }
1183
1184         private void mainFrame_initialize() {
1185
1186                 this.preferredPosterWidth = PaperSize.A1.getWidth();
1187                 this.preferredPosterHeight = PaperSize.A1.getHeight();
1188                 updatePosterSize();
1189                 numberFieldPosterSize_setValue();
1190                 choicePosterSize.select(choicePosterSize.getItemCount() - 1);
1191                 choicePosterSize_itemStateChanged();
1192                 checkboxPosterSizeKeepAspectRatio.setState(true);
1193                 checkboxPosterSizeKeepAspectRatio_itemStateChanged();
1194
1195                 choicePaperSize.select(0);
1196                 choicePaperSize_itemStateChanged();
1197                 choicePaperSizeUnit.select(0);
1198                 choicePaperSizeUnit_itemStateChanged();
1199                 this.paperMargin = 72;
1200                 numberFieldPaperMargin_setValue();
1201                 choicePaperMarginUnit.select(0);
1202                 choicePaperMarginUnit_itemStateChanged();
1203
1204                 textFieldOutputFileName.setText(String.format("{pwd}%s%s_{input}_{date}.pdf", File.separator, Lib.getMessage("App.LowerTitle")));
1205
1206                 simulateOutput();
1207         }
1208
1209         public MainFrame() {
1210                 super();
1211                 mainFrame_initializeComponents();
1212                 mainFrame_initialize();
1213         }
1214 }