001 package de.java2html.gui;
002 
003 import java.awt.GridBagConstraints;
004 import java.awt.GridBagLayout;
005 import java.awt.Insets;
006 import java.awt.event.ItemEvent;
007 import java.awt.event.ItemListener;
008 import java.util.ArrayList;
009 import java.util.Iterator;
010 import java.util.List;
011 
012 import javax.swing.JCheckBox;
013 import javax.swing.JComboBox;
014 import javax.swing.JComponent;
015 import javax.swing.JLabel;
016 import javax.swing.JPanel;
017 import javax.swing.JSpinner;
018 import javax.swing.SpinnerNumberModel;
019 import javax.swing.event.ChangeEvent;
020 import javax.swing.event.ChangeListener;
021 
022 import de.java2html.JavaSourceConversionSettings;
023 import de.java2html.converter.IJavaSourceConverter;
024 import de.java2html.converter.JavaSourceConverterProvider;
025 import de.java2html.options.HorizontalAlignment;
026 import de.java2html.options.JavaSourceConversionOptions;
027 import de.java2html.options.JavaSourceStyleTable;
028 
029 public class Java2HtmlOptionsPanel {
030   private final static JavaSourceStyleTable[] styles = JavaSourceStyleTable.getPredefinedTables();
031   private final static HorizontalAlignment[] alignments = new HorizontalAlignment[]{
032       HorizontalAlignment.LEFT,
033       HorizontalAlignment.CENTER,
034       HorizontalAlignment.RIGHT };
035 
036   private final SpinnerNumberModel tabModel = new SpinnerNumberModel(20161);
037 
038   private final JSpinner chTab;
039   private final JComboBox chTarget;
040   private final JComboBox chStyle;
041   private final JComboBox chAlignment;
042   private final JCheckBox cbShowLineNumbers;
043   private final JCheckBox cbShowTableBorder;
044   private final List/*<ChangeListener>*/listeners = new ArrayList();
045 
046   private final JComponent content;
047 
048   public Java2HtmlOptionsPanel() {
049     chTab = new JSpinner(tabModel);
050     final ItemListener itemListener = new ItemListener() {
051       public void itemStateChanged(ItemEvent e) {
052         fireStateChanged();
053       }
054     };
055     tabModel.addChangeListener(new ChangeListener() {
056       public void stateChanged(ChangeEvent e) {
057         fireStateChanged();
058       }
059     });
060 
061     chTarget = new JComboBox(JavaSourceConverterProvider.getAllConverters());
062     chTarget.setRenderer(new AbstractSimpleListCellRenderer() {
063       @Override
064       protected String getLabel(Object value) {
065         final IJavaSourceConverter converter = (IJavaSourceConvertervalue;
066         return converter.getMetaData().getPrintName();
067       }
068     });
069     chTarget.addItemListener(itemListener);
070 
071     chStyle = new JComboBox(styles);
072     chStyle.setRenderer(new AbstractSimpleListCellRenderer() {
073       @Override
074       protected String getLabel(Object value) {
075         final JavaSourceStyleTable table = (JavaSourceStyleTablevalue;
076         return table.getName();
077       }
078     });
079     chStyle.addItemListener(itemListener);
080 
081     chAlignment = new JComboBox(alignments);
082     chAlignment.setRenderer(new AbstractSimpleListCellRenderer() {
083       @Override
084       protected String getLabel(Object value) {
085         final HorizontalAlignment alignment = (HorizontalAlignmentvalue;
086         return alignment.getName();
087       }
088     });
089     chAlignment.addItemListener(itemListener);
090 
091     cbShowLineNumbers = new JCheckBox("Line numbers"true);
092     cbShowLineNumbers.addItemListener(itemListener);
093 
094     cbShowTableBorder = new JCheckBox("Table border"true);
095     cbShowTableBorder.addItemListener(itemListener);
096 
097     final JPanel panel = new JPanel(new GridBagLayout());
098     final GridBagConstraints leftColumnConstraints = new GridBagConstraints();
099     leftColumnConstraints.insets = new Insets(2222);
100     leftColumnConstraints.gridx = 0;
101     leftColumnConstraints.anchor = GridBagConstraints.EAST;
102 
103     final GridBagConstraints rightColumnConstraints = new GridBagConstraints();
104     rightColumnConstraints.insets = new Insets(2222);
105     rightColumnConstraints.gridx = 1;
106     rightColumnConstraints.fill = GridBagConstraints.NONE;
107     rightColumnConstraints.anchor = GridBagConstraints.WEST;
108 
109     final GridBagConstraints twoColumnConstraints = new GridBagConstraints();
110     twoColumnConstraints.insets = new Insets(2222);
111     twoColumnConstraints.gridx = 0;
112     twoColumnConstraints.gridwidth = 2;
113     twoColumnConstraints.anchor = GridBagConstraints.WEST;
114 
115     panel.add(new JLabel("Target:"), leftColumnConstraints);
116     panel.add(chTarget, rightColumnConstraints);
117     panel.add(new JLabel("Style:"), leftColumnConstraints);
118     panel.add(chStyle, rightColumnConstraints);
119     panel.add(new JLabel("Tab-space:"), leftColumnConstraints);
120     panel.add(chTab, rightColumnConstraints);
121     panel.add(new JLabel("Alignment:"), leftColumnConstraints);
122     panel.add(chAlignment, rightColumnConstraints);
123     panel.add(cbShowLineNumbers, twoColumnConstraints);
124     panel.add(cbShowTableBorder, twoColumnConstraints);
125 
126     this.content = panel;
127 
128     initDefaultOptions();
129   }
130 
131   public JComponent getContent() {
132     return content;
133   }
134 
135   private void initDefaultOptions() {
136     final JavaSourceConversionOptions options = JavaSourceConversionOptions.getDefault();
137     tabModel.setValue(new Integer(options.getTabSize()));
138 
139     chStyle.setSelectedItem(options.getStyleTable());
140     cbShowLineNumbers.setSelected(options.isShowLineNumbers());
141     cbShowTableBorder.setSelected(options.isShowTableBorder());
142     chAlignment.setSelectedItem(options.getHorizontalAlignment());
143   }
144 
145   public JavaSourceConversionSettings getConversionSettings() {
146     final IJavaSourceConverter selectedConverter = JavaSourceConverterProvider.getAllConverters()[chTarget
147         .getSelectedIndex()];
148     final String converterName = selectedConverter.getMetaData().getName();
149     return new JavaSourceConversionSettings(getConversionOptions(), converterName);
150   }
151 
152   private JavaSourceConversionOptions getConversionOptions() {
153     final JavaSourceConversionOptions options = JavaSourceConversionOptions.getDefault();
154     final int tabs = tabModel.getNumber().intValue();
155     options.setTabSize(tabs);
156     options.setStyleTable(styles[chStyle.getSelectedIndex()]);
157     options.setShowLineNumbers(cbShowLineNumbers.isSelected());
158     options.setShowTableBorder(cbShowTableBorder.isSelected());
159     options.setHorizontalAlignment(alignments[chAlignment.getSelectedIndex()]);
160     return options;
161   }
162 
163   public synchronized void addChangeListener(ChangeListener listener) {
164     listeners.add(listener);
165   }
166 
167   public synchronized void removeChangeListener(ChangeListener listener) {
168     listeners.remove(listener);
169   }
170 
171   private synchronized void fireStateChanged() {
172     final ChangeEvent event = new ChangeEvent(this);
173     for (final Iterator iter = new ArrayList(listeners).iterator(); iter.hasNext();) {
174       final ChangeListener listener = (ChangeListeneriter.next();
175       listener.stateChanged(event);
176     }
177   }
178 }