1 | // Copyright 2004-2007 Jean-Francois Poilpret |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // http://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | |
15 | package net.sourceforge.hiveboard.command; |
16 | |
17 | import java.awt.image.BufferedImage; |
18 | import java.io.File; |
19 | import java.io.IOException; |
20 | import java.util.ArrayList; |
21 | import java.util.HashMap; |
22 | import java.util.List; |
23 | import java.util.Map; |
24 | |
25 | import javax.imageio.IIOImage; |
26 | import javax.imageio.ImageIO; |
27 | import javax.imageio.ImageWriteParam; |
28 | import javax.imageio.ImageWriter; |
29 | import javax.imageio.event.IIOWriteWarningListener; |
30 | import javax.imageio.stream.ImageOutputStream; |
31 | |
32 | import org.apache.commons.logging.Log; |
33 | import org.apache.commons.logging.LogFactory; |
34 | import org.jdesktop.application.Action; |
35 | |
36 | import net.sourceforge.hivegui.component.ImageSaveChooser; |
37 | import net.sourceforge.hivegui.component.OverwriteFileConfirmer; |
38 | import net.sourceforge.hivegui.message.UserChoice; |
39 | |
40 | /** |
41 | * @author Jean-Francois Poilpret |
42 | */ |
43 | public class SaveBoardCommands extends AbstractCommandHolder |
44 | { |
45 | static private final Log _logger = LogFactory.getLog(SaveBoardCommands.class); |
46 | |
47 | public SaveBoardCommands(ImageSaveChooser chooser) |
48 | { |
49 | _chooser = chooser; |
50 | _chooser.setOverwriteFileConfirmer(new OverwriteFileConfirmer() |
51 | { |
52 | public boolean confirm(File file) |
53 | { |
54 | return showMessage( "confirm-overwrite-file", |
55 | file.getName()) == UserChoice.YES; |
56 | } |
57 | }); |
58 | } |
59 | |
60 | @Action(enabledProperty = DRAW_BOARD_SELECTED) |
61 | public void saveBoard() |
62 | { |
63 | doSave(false); |
64 | } |
65 | |
66 | @Action(enabledProperty = DRAW_BOARD_SELECTED) |
67 | public void saveBoardAs() |
68 | { |
69 | doSave(true); |
70 | } |
71 | |
72 | protected void doSave(boolean saveAs) |
73 | { |
74 | if (_guiContext.getImageModel() != null) |
75 | { |
76 | int board = _guiContext.getDrawBoard().getId(); |
77 | try |
78 | { |
79 | if ( saveAs |
80 | || !_boardFiles.containsKey(board)) |
81 | { |
82 | // Show file save dialog |
83 | saveAs(); |
84 | } |
85 | else |
86 | { |
87 | save(); |
88 | } |
89 | } |
90 | catch (IOException e) |
91 | { |
92 | _logger.error("doExecute()", e); |
93 | BoardFile info = _boardFiles.get(board); |
94 | showMessage("io-error-when-saving", |
95 | info.getFile().getName(), |
96 | e, |
97 | e.getMessage()); |
98 | } |
99 | } |
100 | } |
101 | |
102 | protected void saveAs() throws IOException |
103 | { |
104 | BufferedImage image = _guiContext.getImageModel().getImage(); |
105 | _chooser.setImage(image); |
106 | _chooser.setContext(_context); |
107 | |
108 | if (!_application.showDialog(_chooser)) |
109 | { |
110 | return; |
111 | } |
112 | |
113 | // Get File Path |
114 | ImageWriter writer = _chooser.getImageWriter(); |
115 | if (writer == null) |
116 | { |
117 | _logger.error("saveAs() no ImageWriter found"); |
118 | showMessage("unexpected-error"); |
119 | return; |
120 | } |
121 | ImageWriteParam params = _chooser.getImageWriteParam(); |
122 | File file = _chooser.getSelectedFile(); |
123 | _logger.debug("saveAs() selected file = " + file); |
124 | |
125 | _boardFiles.put(_guiContext.getDrawBoard().getId(), |
126 | new BoardFile(writer, params, file)); |
127 | // Transform into required format |
128 | save(); |
129 | } |
130 | |
131 | protected void save() throws IOException |
132 | { |
133 | int board = _guiContext.getDrawBoard().getId(); |
134 | BoardFile info = _boardFiles.get(board); |
135 | ImageWriter writer = info.getWriter(); |
136 | ImageWriteParam param = info.getWriteParam(); |
137 | File file = info.getFile(); |
138 | BufferedImage image = _guiContext.getImageModel().getImage(); |
139 | _warnings.reset(); |
140 | // Transform into required format |
141 | ImageOutputStream ios = ImageIO.createImageOutputStream(file); |
142 | writer.addIIOWriteWarningListener(_warnings); |
143 | writer.setOutput(ios); |
144 | writer.write(null, new IIOImage(image, null, null), param); |
145 | ios.flush(); |
146 | ios.close(); |
147 | |
148 | if (_warnings.hasWarnings()) |
149 | { |
150 | StringBuffer warn = new StringBuffer(); |
151 | String[] warnings = _warnings.getWarnings(); |
152 | _logger.debug("save() ImageWriter raised warnings for file " + file.getName()); |
153 | // Concatenate all warnings into one string with \n |
154 | for (int i = 0; i < warnings.length; i++) |
155 | { |
156 | _logger.debug("Warning: " + warnings[i]); |
157 | warn.append('\n'); |
158 | warn.append(warnings[i]); |
159 | } |
160 | showMessage("warning-when-saving", file.getName(), warn.toString()); |
161 | } |
162 | } |
163 | |
164 | static protected class BoardFile |
165 | { |
166 | public BoardFile( ImageWriter writer, |
167 | ImageWriteParam param, |
168 | File file) |
169 | { |
170 | _writer = writer; |
171 | _param = param; |
172 | _file = file; |
173 | } |
174 | |
175 | public ImageWriter getWriter() |
176 | { |
177 | return _writer; |
178 | } |
179 | |
180 | public ImageWriteParam getWriteParam() |
181 | { |
182 | return _param; |
183 | } |
184 | |
185 | public File getFile() |
186 | { |
187 | return _file; |
188 | } |
189 | |
190 | private final ImageWriter _writer; |
191 | private final ImageWriteParam _param; |
192 | private final File _file; |
193 | } |
194 | |
195 | static protected class ImageWriterWarning implements IIOWriteWarningListener |
196 | { |
197 | public void reset() |
198 | { |
199 | _warnings.clear(); |
200 | } |
201 | |
202 | public boolean hasWarnings() |
203 | { |
204 | return !_warnings.isEmpty(); |
205 | } |
206 | |
207 | public String[] getWarnings() |
208 | { |
209 | return _warnings.toArray(new String[_warnings.size()]); |
210 | } |
211 | |
212 | public void warningOccurred(ImageWriter source, int imageIndex, String warning) |
213 | { |
214 | _warnings.add(warning); |
215 | } |
216 | |
217 | private List<String> _warnings = new ArrayList<String>(); |
218 | } |
219 | |
220 | protected final ImageSaveChooser _chooser; |
221 | protected final Map<Integer, BoardFile> _boardFiles = new HashMap<Integer, BoardFile>(); |
222 | protected final ImageWriterWarning _warnings = new ImageWriterWarning(); |
223 | } |