1 /* Copyright (C) 2005-2011 Fabio Riccardi */
2 
3 package com.lightcrafts.ui.export;
4 
5 import com.lightcrafts.image.export.ImageExportOptions;
6 import com.lightcrafts.image.types.ImageType;
7 import com.lightcrafts.image.types.JPEGImageType;
8 import com.lightcrafts.image.types.TIFFImageType;
9 import com.lightcrafts.platform.Platform;
10 
11 import javax.swing.*;
12 import java.awt.*;
13 import java.awt.event.ItemEvent;
14 import java.awt.event.ItemListener;
15 import java.io.File;
16 import java.util.ArrayList;
17 import java.util.List;
18 
19 public class ExportMultiControls extends JPanel implements ItemListener {
20 
21     // Items for an export image type combo box:
22     static class ExportComboItem {
23 
24         private ImageExportOptions exportOptions;
25 
ExportComboItem(ImageExportOptions exportOptions)26         private ExportComboItem(ImageExportOptions exportOptions) {
27             this.exportOptions = exportOptions;
28         }
29 
toString()30         public String toString() {
31             return exportOptions.getImageType().getName();
32         }
33 
getExportOptions()34         private ImageExportOptions getExportOptions() {
35             return exportOptions;
36         }
37     }
38     // Keep track of the expanded/collapsed state of the controls toggle:
39     private ExportCtrlToggle toggle;
40 
41     private JComboBox combo;
42 
43     private ExportComboItem oldFilter;
44 
45     private boolean textResize;
46 
47     // An enclosing window, to repack when the advanced options change:
48     private Window window;
49 
ExportMultiControls( ImageExportOptions options, Window window, boolean textResize )50     public ExportMultiControls(
51         ImageExportOptions options, Window window, boolean textResize
52     ) {
53         this.window = window;
54         this.textResize = textResize;
55 
56         ExportComboItem defaultItem = null;
57 
58         // Set up all the image format options:
59         List<ExportComboItem> filters = getAllFilters();
60         ImageType defaultType = options.getImageType();
61 
62         combo = new JComboBox();
63         combo.addItemListener(this);
64 
65         setLayout(new BorderLayout());
66 
67         // Initialize all the image type filters:
68         for (ExportComboItem filter : filters) {
69             ImageExportOptions filterOptions = filter.getExportOptions();
70             ImageType filterType = filterOptions.getImageType();
71             if (defaultType.equals(filterType)) {
72                 // For the default filter, use the default options:
73                 filter = new ExportComboItem(options);
74                 defaultItem = filter;
75             }
76         }
77         // Add the default filter first, so that other filters will inherit
78         // its settings according to ExportLogic.mergeExportOptions().
79         if (defaultItem != null) {
80             combo.addItem(defaultItem);
81         }
82         for (ExportComboItem filter : filters) {
83             ImageExportOptions filterOptions = filter.getExportOptions();
84             ImageType filterType = filterOptions.getImageType();
85             if (! defaultType.equals(filterType)) {
86                 combo.addItem(filter);
87             }
88         }
89         if (defaultItem != null) {
90             combo.setSelectedItem(defaultItem);
91         }
92         combo.setMaximumSize(combo.getPreferredSize());
93     }
94 
getSelectedExportOptions()95     public ImageExportOptions getSelectedExportOptions() {
96         ExportComboItem filter = (ExportComboItem) combo.getSelectedItem();
97         ImageExportOptions options = filter.getExportOptions();
98         return options;
99     }
100 
getAllFilters()101     private static List<ExportComboItem> getAllFilters() {
102         ExportComboItem filter;
103         ArrayList<ExportComboItem> filters = new ArrayList<ExportComboItem>();
104 
105         filter = new ExportComboItem(TIFFImageType.INSTANCE.newExportOptions());
106         filters.add(filter);
107 
108         filter = new ExportComboItem(JPEGImageType.INSTANCE.newExportOptions());
109         filters.add(filter);
110 
111         return filters;
112     }
113 
114     // Respond to changes in the export image type combo box:
itemStateChanged(ItemEvent event)115     public void itemStateChanged(ItemEvent event) {
116         if (event.getStateChange() == ItemEvent.SELECTED) {
117             ExportComboItem newFilter =
118                 (ExportComboItem) combo.getSelectedItem();
119 
120             // The oldFilter may be null, first time an ExportComboItem is set.
121             ImageExportOptions newOptions = newFilter.getExportOptions();
122             if (oldFilter != null) {
123                 ImageExportOptions oldOptions = oldFilter.getExportOptions();
124                 ExportLogic.mergeExportOptions(oldOptions, newOptions);
125             }
126             ExportControls ctrls = new ExportControls(newOptions, textResize);
127             toggle = new ExportCtrlToggle(ctrls, window);
128 
129             removeAll();
130 
131             Box comboBox = Box.createHorizontalBox();
132             comboBox.add(combo);
133             comboBox.add(Box.createHorizontalGlue());
134 
135             add(comboBox, BorderLayout.NORTH);
136             add(toggle);
137 
138             if (window != null) {
139                 window.pack();
140             }
141             repaint();
142 
143             oldFilter = newFilter;
144         }
145     }
146 
main(String[] args)147     public static void main(String[] args) throws Exception {
148         UIManager.setLookAndFeel(Platform.getPlatform().getLookAndFeel());
149 
150         TIFFImageType.ExportOptions options =
151             TIFFImageType.INSTANCE.newExportOptions();
152         File dir = new File(System.getProperty("user.home"));
153         File file = new File(dir, "test.tif");
154         options.setExportFile(file);
155 
156         JFrame frame = new JFrame();
157 
158         ExportMultiControls multi =
159             new ExportMultiControls(options, frame, false);
160 
161         frame.setContentPane(multi);
162         frame.pack();
163         frame.setLocationRelativeTo(null);
164         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
165         frame.setVisible(true);
166     }
167 }
168