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(0166));
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(44));
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(44));
086     panel.setBorder(new EmptyBorder(5656));
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 = (Filefiles[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 }