001 package de.java2html.gui;
002
003 import java.awt.BorderLayout;
004 import java.awt.FlowLayout;
005 import java.awt.GridLayout;
006 import java.awt.Toolkit;
007 import java.awt.datatransfer.Clipboard;
008 import java.awt.datatransfer.StringSelection;
009 import java.awt.event.ActionEvent;
010 import java.awt.event.ActionListener;
011 import java.io.File;
012 import java.io.IOException;
013 import java.io.StringWriter;
014
015 import javax.swing.DefaultListModel;
016 import javax.swing.JButton;
017 import javax.swing.JComponent;
018 import javax.swing.JFileChooser;
019 import javax.swing.JLabel;
020 import javax.swing.JList;
021 import javax.swing.JOptionPane;
022 import javax.swing.JPanel;
023 import javax.swing.JScrollPane;
024 import javax.swing.border.EmptyBorder;
025 import javax.swing.event.ListDataEvent;
026 import javax.swing.event.ListDataListener;
027 import javax.swing.event.ListSelectionEvent;
028 import javax.swing.event.ListSelectionListener;
029 import javax.swing.filechooser.FileFilter;
030
031 import de.java2html.JavaSourceConversionSettings;
032 import de.java2html.converter.IJavaSourceConverter;
033 import de.java2html.javasource.TypedSource;
034 import de.java2html.javasource.JavaSourceParser;
035 import de.java2html.util.Ensure;
036
037 public class FileConversionPanel implements ActionListener {
038
039 private final DefaultListModel fileListModel = new DefaultListModel();
040 private final JList list;
041 private final JButton bAdd;
042 private final JButton bRemove;
043 private final JButton bConvert;
044 private final JButton bClear;
045 private File currentDirectory;
046 private final JComponent content;
047 private final Java2HtmlOptionsPanel optionsPanel;
048
049 public FileConversionPanel(Java2HtmlOptionsPanel optionsPanel) {
050 Ensure.ensureArgumentNotNull(optionsPanel);
051 this.optionsPanel = optionsPanel;
052 list = new JList(fileListModel);
053
054 bAdd = new JButton("Add...");
055 bAdd.addActionListener(this);
056
057 bRemove = new JButton("Remove");
058 bRemove.addActionListener(this);
059 bRemove.setEnabled(false);
060
061 bClear = new JButton("Clear");
062 bClear.addActionListener(this);
063 bClear.setEnabled(false);
064
065 bConvert = new JButton("Convert");
066 bConvert.addActionListener(this);
067 bConvert.setEnabled(false);
068
069 final JPanel fileButtonPanel = new JPanel(new GridLayout(0, 1, 6, 6));
070 fileButtonPanel.add(bAdd);
071 fileButtonPanel.add(bRemove);
072 fileButtonPanel.add(bClear);
073
074 final JPanel buttonPanel = new JPanel(new BorderLayout());
075 buttonPanel.add(fileButtonPanel, BorderLayout.NORTH);
076
077 final JPanel filesToConvertPanel = new JPanel(new BorderLayout(4, 4));
078 filesToConvertPanel.add(new JLabel("Files to convert:"), BorderLayout.NORTH);
079 filesToConvertPanel.add(new JScrollPane(list), BorderLayout.CENTER);
080 filesToConvertPanel.add(buttonPanel, BorderLayout.EAST);
081
082 final JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
083 southPanel.add(bConvert);
084
085 final JPanel panel = new JPanel(new BorderLayout(4, 4));
086 panel.setBorder(new EmptyBorder(5, 6, 5, 6));
087 panel.add(filesToConvertPanel, BorderLayout.CENTER);
088 panel.add(southPanel, BorderLayout.SOUTH);
089 this.content = panel;
090
091 list.addListSelectionListener(new ListSelectionListener() {
092 public void valueChanged(ListSelectionEvent e) {
093 updateButtonsEnabled();
094 }
095 });
096 fileListModel.addListDataListener(new ListDataListener() {
097 public void contentsChanged(ListDataEvent e) {
098 updateButtonsEnabled();
099 }
100
101 public void intervalRemoved(ListDataEvent e) {
102 updateButtonsEnabled();
103 }
104
105 public void intervalAdded(ListDataEvent e) {
106 updateButtonsEnabled();
107 }
108 });
109 updateButtonsEnabled();
110 }
111
112 private void updateButtonsEnabled() {
113 bRemove.setEnabled(!list.isSelectionEmpty());
114 bClear.setEnabled(!fileListModel.isEmpty());
115 bConvert.setEnabled(!fileListModel.isEmpty());
116 }
117
118 private void add() {
119 final JFileChooser chooser = new JFileChooser(currentDirectory);
120 chooser.setDialogTitle("Open Java Source");
121 chooser.setFileFilter(new FileFilter() {
122 @Override
123 public String getDescription() {
124 return "*.java";
125 }
126
127 @Override
128 public boolean accept(File f) {
129 return f.isDirectory() || f.getName().toLowerCase().endsWith(".java");
130 }
131 });
132 final int result = chooser.showOpenDialog(content);
133 if (result != JFileChooser.APPROVE_OPTION) {
134 return;
135 }
136 final File selectedFile = chooser.getSelectedFile();
137 currentDirectory = selectedFile.getParentFile();
138 fileListModel.addElement(selectedFile);
139 }
140
141 private void remove() {
142 final Object[] files = list.getSelectedValues();
143 for (int i = 0; i < files.length; ++i) {
144 fileListModel.removeElement(files[i]);
145 }
146 }
147
148 private void clear() {
149 fileListModel.clear();
150 }
151
152 private void convert() {
153 final JavaSourceConversionSettings settings = optionsPanel.getConversionSettings();
154 settings.getConversionOptions().setShowJava2HtmlLink(true);
155
156 //Collect statistical information
157 final StringBuffer report = new StringBuffer();
158
159 //Collect conversion-results
160 final StringWriter writer = new StringWriter();
161
162 //Create the converter
163 final IJavaSourceConverter converter = settings.createConverter();
164
165 final Object[] files = fileListModel.toArray();
166 try {
167 converter.writeDocumentHeader(writer, settings.getConversionOptions(), "");
168
169 for (int count = 0; count < files.length; ++count) {
170 final File file = (File) files[count];
171 report.append("<li>File " + (count + 1) + ": " + file.getName() + "<blockquote>");
172
173 try {
174 if (count > 0) {
175 converter.writeBlockSeparator(writer, settings.getConversionOptions());
176 }
177 final JavaSourceParser parser = new JavaSourceParser(settings.getConversionOptions());
178 final TypedSource source = parser.parse(file);
179 converter.convert(source, settings.getConversionOptions(), writer);
180
181 writer.write('\n');
182
183 report.append(source.getStatistic().getScreenString("<br>") + "</blockquote></li>");
184 }
185 catch (final IOException e) {
186 //TODO Sep 13, 2004 (Markus Gebhard): Error handling!
187 System.err.println("Error converting " + file + ": " + e);
188 }
189 }
190
191 converter.writeDocumentFooter(writer, settings.getConversionOptions());
192 }
193 catch (final IOException e) {
194 // TODO Sep 13, 2004 (Markus Gebhard): Error handling!
195 System.err.println("Error converting files " + e);
196 }
197
198 //Copy result to system clipboard
199 final StringSelection sel = new StringSelection(writer.getBuffer().toString());
200 final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
201 clipboard.setContents(sel, sel);
202
203 String plural = "";
204 if (files.length > 1) {
205 plural = "s";
206 }
207
208 //Show success-dialog
209
210 final String title = "File" + plural + " converted";
211 final String text = "<html><b>"
212 + files.length
213 + " File"
214 + plural
215 + " successfully converted.</b>"
216 + "<ul>"
217 + report.toString()
218 + "</ul>"
219 + "<b>The converted source code has been copied the system clipboard</b>"
220 + "</html>";
221 JOptionPane.showMessageDialog(content, text, title, JOptionPane.INFORMATION_MESSAGE);
222 }
223
224 public JComponent getContent() {
225 return content;
226 }
227
228 public void actionPerformed(ActionEvent evt) {
229 final Object source = evt.getSource();
230 if (source == bAdd) {
231 add();
232 }
233 else if (source == bRemove) {
234 remove();
235 }
236 else if (source == bClear) {
237 clear();
238 }
239 else {
240 convert();
241 }
242 }
243 }
|