1
package jspecview.export;
3
import java.io.BufferedReader;
5
import javajs.api.GenericFileInterface;
6
import javajs.util.Base64;
8
import javajs.util.Lst;
12
import jspecview.api.ExportInterface;
13
import jspecview.api.JSVExporter;
14
import jspecview.api.JSVFileHelper;
15
import jspecview.api.JSVPanel;
16
import jspecview.common.ExportType;
17
import jspecview.common.Spectrum;
18
import jspecview.common.JSVFileManager;
19
import jspecview.common.JSViewer;
20
import jspecview.common.PanelData;
21
import jspecview.common.PrintLayout;
22
import jspecview.common.Annotation.AType;
24
public class Exporter implements ExportInterface {
26
static final String newLine = System.getProperty("line.separator");
29
// for reflection; called directly only from MainFrame
33
public String write(JSViewer viewer, Lst<String> tokens, boolean forInkscape) {
34
// MainFrame or applet WRITE command
36
return printPDF(viewer, null, false);
39
String fileName = null;
42
JSVPanel jsvp = viewer.selectedPanel;
44
switch (tokens.size()) {
48
fileName = PT.trimQuotes(tokens.get(0));
49
if (fileName.indexOf(".") >= 0)
53
eType = ExportType.getType(fileName);
58
return exportTheSpectrum(viewer, eType, null, null, -1, -1, null, false);
61
viewer.fileHelper.setFileChooser(eType);
62
String[] items = getExportableItems(viewer, eType.equals(ExportType.SOURCE));
63
int index = (items == null ? -1 : viewer.getOptionFromDialog(items, "Export", "Choose a spectrum to export"));
64
if (index == Integer.MIN_VALUE)
66
GenericFileInterface file = viewer.fileHelper.getFile(getSuggestedFileName(viewer, eType), jsvp, true);
69
out = viewer.getOutputChannel(file.getFullPath(), false);
70
String msg = exportSpectrumOrImage(viewer, eType, index, out);
71
boolean isOK = msg.startsWith("OK");
73
viewer.si.siUpdateRecentMenus(file.getFullPath());
77
type = tokens.get(0).toUpperCase();
78
fileName = PT.trimQuotes(tokens.get(1));
81
String ext = fileName.substring(fileName.lastIndexOf(".") + 1)
83
if (ext.equals("BASE64")) {
84
fileName = ";base64,";
85
} else if (ext.equals("JDX")) {
88
} else if (ExportType.isExportMode(ext)) {
90
} else if (ExportType.isExportMode(type)) {
91
fileName += "." + type;
93
eType = ExportType.getType(type);
94
if (forInkscape && eType == ExportType.SVG)
95
eType = ExportType.SVGI;
97
out = viewer.getOutputChannel(fileName, false);
98
return exportSpectrumOrImage(viewer, eType, -1, out);
99
} catch (Exception e) {
100
System.out.println(e);
107
* This export method will clip the data based on the current display
113
* @return status line message
115
private String exportSpectrumOrImage(JSViewer viewer, ExportType eType,
118
PanelData pd = viewer.pd();
119
if (index < 0 && (index = pd.getCurrentSpectrumIndex()) < 0)
120
return "Error exporting spectrum: No spectrum selected";
121
spec = pd.getSpectrumAt(index);
122
int startIndex = pd.getStartingPointIndex(index);
123
int endIndex = pd.getEndingPointIndex(index);
126
boolean asBase64 = out.isBase64();
127
msg = exportTheSpectrum(viewer, eType, out, spec, startIndex, endIndex, pd, asBase64);
130
if (msg.startsWith("OK"))
131
return "OK - Exported " + eType.name() + ": " + out.getFileName() + msg.substring(2);
132
} catch (Exception ioe) {
133
msg = ioe.toString();
135
return "Error exporting " + out.getFileName() + ": " + msg;
139
public String exportTheSpectrum(JSViewer viewer, ExportType mode,
140
OC out, Spectrum spec, int startIndex, int endIndex,
141
PanelData pd, boolean asBase64) throws Exception {
142
JSVPanel jsvp = viewer.selectedPanel;
143
String type = mode.name();
162
viewer.fileHelper.setFileChooser(mode);
163
String name = getSuggestedFileName(viewer, mode);
164
GenericFileInterface file = viewer.fileHelper.getFile(name, jsvp, true);
167
return jsvp.saveImage(type.toLowerCase(), file, out);
169
return printPDF(viewer, "PDF", asBase64);
173
return fileCopy(jsvp.getPanelData().getSpectrum().getFilePath(), out);
177
return ((JSVExporter) JSViewer.getInterface("jspecview.export."
178
+ type.toUpperCase() + "Exporter")).exportTheSpectrum(viewer, mode,
179
out, spec, startIndex, endIndex, null, false);
182
@SuppressWarnings("resource")
183
private String printPDF(JSViewer viewer, String pdfFileName, boolean isBase64) {
185
boolean isJob = (pdfFileName == null || pdfFileName.length() == 0);
186
if (!isBase64 && !viewer.si.isSigned())
187
return "Error: Applet must be signed for the PRINT command.";
188
PanelData pd = viewer.pd();
191
boolean useDialog = false;
200
pd.closeAllDialogsExcept(AType.NONE);
203
pl = viewer.getDialogPrint(isJob);
207
pl.asPDF = true; // JavaScript only
208
if (isJob && pl.asPDF) {
212
JSVPanel jsvp = viewer.selectedPanel;
213
if (!isBase64 && !isJob) {
214
JSVFileHelper helper = viewer.fileHelper;
215
helper.setFileChooser(ExportType.PDF);
216
if (pdfFileName.equals("?") || pdfFileName.equalsIgnoreCase("PDF"))
217
pdfFileName = getSuggestedFileName(viewer, ExportType.PDF);
218
GenericFileInterface file = helper.getFile(pdfFileName, jsvp, true);
222
viewer.setProperty("directoryLastExportedFile",
223
helper.setDirLastExported(file.getParentAsFile().getFullPath()));
224
pdfFileName = file.getFullPath();
228
OC out = (isJob ? null :
229
isBase64 ? new OC().setParams(null, ";base64,", false, null)
230
: viewer.getOutputChannel(pdfFileName, true));
231
String printJobTitle = pd.getPrintJobTitle(true);
233
printJobTitle = jsvp.getInput("Title?", "Title for Printing",
235
if (printJobTitle == null)
238
jsvp.printPanel(pl, out, printJobTitle);
240
} catch (Exception e) {
241
jsvp.showMessage(e.toString(), "File Error");
246
private String[] getExportableItems(JSViewer viewer,
247
boolean isSameType) {
248
PanelData pd = viewer.pd();
249
boolean isView = viewer.currentSource.isView;
250
// From popup menu click SaveAs or Export
251
// if JSVPanel has more than one spectrum...Choose which one to export
252
int nSpectra = pd.getNumberOfSpectraInCurrentSet();
253
if (nSpectra == 1 || !isView && isSameType
254
|| pd.getCurrentSpectrumIndex() >= 0)
256
String[] items = new String[nSpectra];
257
for (int i = 0; i < nSpectra; i++)
258
items[i] = pd.getSpectrumAt(i).getTitle();
262
private String getSuggestedFileName(JSViewer viewer, ExportType imode) {
263
PanelData pd = viewer.pd();
264
String sourcePath = pd.getSpectrum().getFilePath();
265
String newName = JSVFileManager.getTagName(sourcePath);
266
if (newName.startsWith("$"))
267
newName = newName.substring(1);
268
int pt = newName.lastIndexOf(".");
269
String name = (pt < 0 ? newName : newName.substring(0, pt));
271
boolean isPrint = false;
280
if (!(name.endsWith("_" + imode)))
293
ext = "." + imode.toString().toLowerCase();
295
if (viewer.currentSource.isView)
296
name = pd.getPrintJobTitle(isPrint);
301
private static String fileCopy(String name, OC out) {
303
BufferedReader br = JSVFileManager.getBufferedReaderFromName(name,
306
while ((line = br.readLine()) != null) {
311
return "OK " + out.getByteCount() + " bytes";
312
} catch (Exception e) {