package comeon.ui.preferences.templates; import com.google.inject.Inject; import com.google.inject.Singleton; import comeon.model.TemplateKind; import comeon.templates.Templates; import comeon.ui.UI; import comeon.ui.preferences.SubPanel; import org.netbeans.validation.api.builtin.stringvalidation.StringValidators; import org.netbeans.validation.api.ui.ValidationGroup; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.nio.charset.Charset; @Singleton public final class TemplateSubPanel extends SubPanel<TemplateModel> { public static final String SELECTED_FILE_PROPERTY = "selectedFile"; private static final long serialVersionUID = 1L; private final JTextField nameField; private final JTextArea descriptionField; private final JScrollPane descriptionPane; private final JTextField fileField; private final JButton fileButton; private final JComboBox<Charset> charsetField; private final JComboBox<TemplateKind> kindField; private final JFileChooser fileChooser; @Inject public TemplateSubPanel(final TemplateSubController templateSubController, final Templates templates) { this.nameField = new JTextField(COLUMNS); this.nameField.setName(UI.BUNDLE.getString("prefs.templates.name")); this.nameField.requestFocusInWindow(); this.descriptionField = new JTextArea(3, 0); this.descriptionField.setName(UI.BUNDLE.getString("prefs.templates.description")); this.descriptionPane = new JScrollPane(descriptionField, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); this.fileField = new JTextField(COLUMNS); this.fileField.setName(UI.BUNDLE.getString("prefs.templates.path")); this.fileField.setEditable(false); this.fileButton = new JButton(UI.BUNDLE.getString("prefs.templates.path.pick.title")); this.fileButton.setMnemonic(UI.BUNDLE.getString("prefs.templates.path.pick.mnemo").charAt(0)); this.charsetField = new JComboBox<>(templates.getSupportedCharsets()); this.charsetField.setName(UI.BUNDLE.getString("prefs.templates.charset")); this.kindField = new JComboBox<>(templates.getTemplateKinds().toArray(new TemplateKind[0])); this.kindField.setName(UI.BUNDLE.getString("prefs.templates.kind")); this.fileChooser = new JFileChooser(); this.fileChooser.setMultiSelectionEnabled(false); this.fileButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final int option = fileChooser.showOpenDialog(SwingUtilities.getRoot(TemplateSubPanel.this)); switch (option) { case JFileChooser.APPROVE_OPTION: final File selectedFile = fileChooser.getSelectedFile(); TemplateSubPanel.this.firePropertyChange(SELECTED_FILE_PROPERTY, null, selectedFile); break; default: break; } } }); } }); this.layoutComponents(); templateSubController.setView(this); } JTextField getNameField() { return nameField; } JTextArea getDescriptionField() { return descriptionField; } JTextField getFileField() { return fileField; } JButton getFileButton() { return fileButton; } JComboBox<Charset> getCharsetField() { return charsetField; } JComboBox<TemplateKind> getKindField() { return kindField; } JFileChooser getFileChooser() { return fileChooser; } @Override protected void doLayoutComponents(final GroupLayout layout) { final JLabel[] labels = new JLabel[]{ new AssociatedLabel("prefs.templates.name", nameField), new AssociatedLabel("prefs.templates.description", descriptionField), new AssociatedLabel("prefs.templates.path", fileField), new AssociatedLabel("prefs.templates.charset", charsetField), new AssociatedLabel("prefs.templates.kind", kindField) }; layout.setVerticalGroup( layout.createSequentialGroup() .addGroup(layout.createParallelGroup().addComponent(labels[0]).addComponent(nameField)) .addGroup(layout.createParallelGroup().addComponent(labels[1]).addComponent(descriptionPane)) .addGroup(layout.createParallelGroup().addComponent(labels[2]).addComponent(fileField).addComponent(fileButton)) .addGroup(layout.createParallelGroup().addComponent(labels[3]).addComponent(charsetField)) .addGroup(layout.createParallelGroup().addComponent(labels[4]).addComponent(kindField)) ); layout.setHorizontalGroup( layout.createSequentialGroup() .addGroup(layout.createParallelGroup().addComponent(labels[0]).addComponent(labels[1]).addComponent(labels[2]).addComponent(labels[3]).addComponent(labels[4])) .addGroup(layout.createParallelGroup().addComponent(nameField).addComponent(descriptionPane).addComponent(fileField).addComponent(charsetField).addComponent(kindField)) .addGroup(layout.createParallelGroup().addComponent(fileButton)) ); } protected void doAttach(ValidationGroup validationGroup) { validationGroup.add(nameField, StringValidators.REQUIRE_NON_EMPTY_STRING); validationGroup.add(descriptionField, StringValidators.REQUIRE_NON_EMPTY_STRING); validationGroup.add(fileField, StringValidators.FILE_MUST_BE_FILE); validationGroup.add(charsetField, StringValidators.REQUIRE_NON_EMPTY_STRING); validationGroup.add(kindField, StringValidators.REQUIRE_NON_EMPTY_STRING); } }