001 package de.java2html.gui;
002 
003 import java.awt.Font;
004 import java.awt.GridBagConstraints;
005 import java.awt.GridBagLayout;
006 import java.awt.Insets;
007 import java.io.IOException;
008 import java.io.StringWriter;
009 
010 import javax.swing.JComponent;
011 import javax.swing.JLabel;
012 import javax.swing.JPanel;
013 import javax.swing.JScrollPane;
014 import javax.swing.JTextArea;
015 import javax.swing.JTextField;
016 import javax.swing.border.EmptyBorder;
017 import javax.swing.event.ChangeEvent;
018 import javax.swing.event.ChangeListener;
019 import javax.swing.event.DocumentEvent;
020 import javax.swing.event.DocumentListener;
021 
022 import de.java2html.JavaSourceConversionSettings;
023 import de.java2html.converter.IJavaSourceConverter;
024 import de.java2html.javasource.TypedSource;
025 import de.java2html.javasource.JavaSourceParser;
026 import de.java2html.util.Ensure;
027 
028 public class DirectTextConversionPanel {
029 
030   private final JComponent content;
031   private final static Font FONT = new Font("Monospaced", Font.PLAIN, 11);
032   private final JTextArea taInput;
033   private final JTextArea taOutput;
034   private final JTextField tfTitle;
035   private final Java2HtmlOptionsPanel optionsPanel;
036   private final IStatisticsView statisticsView;
037 
038   public DirectTextConversionPanel(Java2HtmlOptionsPanel optionsPanel, IStatisticsView statisticsView) {
039     Ensure.ensureArgumentNotNull(optionsPanel);
040     Ensure.ensureArgumentNotNull(statisticsView);
041     this.statisticsView = statisticsView;
042     this.optionsPanel = optionsPanel;
043     //Create UI:
044     final JLabel l1 = new JLabel("Title (optional):");
045     tfTitle = new JTextField(30);
046     final DocumentListener documentListener = new DocumentListener() {
047       public void changedUpdate(DocumentEvent e) {
048         convert();
049       }
050 
051       public void removeUpdate(DocumentEvent e) {
052         convert();
053       }
054 
055       public void insertUpdate(DocumentEvent e) {
056         convert();
057       }
058     };
059     tfTitle.getDocument().addDocumentListener(documentListener);
060 
061     taInput = new JTextArea(1080);
062     taInput.getDocument().addDocumentListener(documentListener);
063     taInput.setFont(FONT);
064     taOutput = new JTextArea(1080);
065     taOutput.setEditable(false);
066     taOutput.setFont(FONT);
067 
068     final JPanel panel = new JPanel(new GridBagLayout());
069     panel.setBorder(new EmptyBorder(5656));
070 
071     final GridBagConstraints twoColumnLineConstraints = new GridBagConstraints();
072     twoColumnLineConstraints.anchor = GridBagConstraints.WEST;
073     twoColumnLineConstraints.gridx = 0;
074     twoColumnLineConstraints.gridwidth = 2;
075     twoColumnLineConstraints.fill = GridBagConstraints.HORIZONTAL;
076     twoColumnLineConstraints.weightx = 1.0;
077     twoColumnLineConstraints.insets = new Insets(6222);
078 
079     final GridBagConstraints twoColumnBlockConstraints = new GridBagConstraints();
080     twoColumnBlockConstraints.anchor = GridBagConstraints.WEST;
081     twoColumnBlockConstraints.gridx = 0;
082     twoColumnBlockConstraints.gridwidth = 2;
083     twoColumnBlockConstraints.fill = GridBagConstraints.BOTH;
084     twoColumnBlockConstraints.weightx = 1.0;
085     twoColumnBlockConstraints.weighty = 1.0;
086     twoColumnBlockConstraints.insets = new Insets(2222);
087 
088     final GridBagConstraints leftColumnConstraints = new GridBagConstraints();
089     leftColumnConstraints.insets = new Insets(2222);
090     leftColumnConstraints.gridx = 0;
091     leftColumnConstraints.anchor = GridBagConstraints.EAST;
092 
093     final GridBagConstraints rightColumnConstraints = new GridBagConstraints();
094     rightColumnConstraints.insets = new Insets(2222);
095     rightColumnConstraints.gridx = 1;
096     rightColumnConstraints.fill = GridBagConstraints.HORIZONTAL;
097     rightColumnConstraints.anchor = GridBagConstraints.WEST;
098 
099     panel.add(l1, leftColumnConstraints);
100     panel.add(tfTitle, rightColumnConstraints);
101     panel.add(new JLabel("Java source (paste your source code here):"), twoColumnLineConstraints);
102     panel.add(new JScrollPane(taInput), twoColumnBlockConstraints);
103     panel.add(
104         new JLabel("Converted source (copy and paste this to where you want it):"),
105         twoColumnLineConstraints);
106     panel.add(new JScrollPane(taOutput), twoColumnBlockConstraints);
107 
108     optionsPanel.addChangeListener(new ChangeListener() {
109       public void stateChanged(ChangeEvent e) {
110         convert();
111       }
112     });
113 
114     this.content = panel;
115   }
116 
117   public JComponent getContent() {
118     return content;
119   }
120 
121   private void convert() {
122     String title = tfTitle.getText();
123     if (title.equals("")) {
124       title = null;
125     }
126 
127     final String input = taInput.getText();
128     if (input.trim().equals("")) {
129       taOutput.setText("");
130       statisticsView.setStatistics(null);
131       return;
132     }
133     final JavaSourceConversionSettings settings = optionsPanel.getConversionSettings();
134     settings.getConversionOptions().setShowJava2HtmlLink(true);
135     final JavaSourceParser parser = new JavaSourceParser(settings.getConversionOptions());
136     final TypedSource source = parser.parse(input);
137     source.setFileName(title);
138 
139     //Create the converter
140     final IJavaSourceConverter converter = settings.createConverter();
141 
142     final StringWriter writer = new StringWriter();
143     try {
144       converter.writeDocumentHeader(writer, settings.getConversionOptions(), title);
145       converter.convert(source, settings.getConversionOptions(), writer);
146       converter.writeDocumentFooter(writer, settings.getConversionOptions());
147     }
148     catch (final IOException e) {
149       throw new RuntimeException(e)//should never happen
150     }
151 
152     taOutput.setText(writer.toString());
153     statisticsView.setStatistics(source.getStatistic());
154     taOutput.selectAll();
155   }
156 
157   public void requestFocus() {
158     taInput.requestFocus();
159   }
160 }