X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fgui%2FProjectPanel.java;h=187e0571ca6be16b27ce94b01fdae5232265bb92;hb=954a1a33392ef83e007b1045e2aaeac173361289;hp=c16f2a527a8906a4f5a91647eb5387c7efddd092;hpb=faca58518e84a345f6a737fab1dc1e2a6a1f9579;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/gui/ProjectPanel.java b/src/net/pterodactylus/jsite/gui/ProjectPanel.java index c16f2a5..187e057 100644 --- a/src/net/pterodactylus/jsite/gui/ProjectPanel.java +++ b/src/net/pterodactylus/jsite/gui/ProjectPanel.java @@ -20,37 +20,336 @@ package net.pterodactylus.jsite.gui; import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.AbstractAction; +import javax.swing.Action; import javax.swing.BorderFactory; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.Document; + +import net.pterodactylus.jsite.core.Node; +import net.pterodactylus.jsite.core.Project; +import net.pterodactylus.jsite.i18n.I18n; +import net.pterodactylus.jsite.i18n.I18nable; +import net.pterodactylus.jsite.i18n.gui.I18nAction; +import net.pterodactylus.jsite.i18n.gui.I18nLabel; +import net.pterodactylus.util.logging.Logging; /** * A panel that contains all information about a project and lets the user edit * the properties of the project. * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> - * @version $Id$ */ -public class ProjectPanel extends JPanel { +public class ProjectPanel extends JPanel implements DocumentListener, I18nable { + + /** Logger. */ + @SuppressWarnings("unused") + private static final Logger logger = Logging.getLogger(ProjectPanel.class.getName()); + + /** The Swing interface. */ + private final SwingInterface swingInterface; + + /** The project to show. */ + private final Project project; + + /** The “change base path” action. */ + private I18nAction changeBasePathAction; + + /** The “edit files” action. */ + private I18nAction editFilesAction; + + /** The “name” label. */ + private I18nLabel nameLabel; + + /** The “name” textfield. */ + private JTextField nameTextField; + + /** The “description” label. */ + private I18nLabel descriptionLabel; + + /** The “description” textfield. */ + private JTextField descriptionTextField; + + /** The “base path” label. */ + private I18nLabel basePathLabel; + + /** The “base path” textfield. */ + private JTextField basePathTextField; + + /** The “node” label. */ + private I18nLabel nodeLabel; + + /** The “node” action. */ + private Action nodeAction; + + /** The “node” combo box. */ + private JComboBox nodeComboBox; /** * Creates a new project panel. + * + * @param swingInterface + * The Swing interface + * @param project + * The project to display */ - public ProjectPanel() { + public ProjectPanel(SwingInterface swingInterface, Project project) { super(new BorderLayout(12, 12)); + logger.log(Level.FINEST, "project: " + project); + this.swingInterface = swingInterface; + this.project = project; + initActions(); initComponents(); } // + // ACCESSORS + // + + /** + * Returns the project that is displayed in this panel. + * + * @return The project of this panel + */ + public Project getProject() { + return project; + } + + // + // ACTIONS + // + + /** + * Adds the given node to the node combo boxes in all {@link ProjectPanel}s. + * + * @param node + * The node to add + */ + public void addNode(Node node) { + ((DefaultComboBoxModel) nodeComboBox.getModel()).addElement(node); + } + + /** + * Removes the given node from the node combo boxes in all + * {@link ProjectPanel}s. + * + * @param node + * The node to remove + */ + public void removeNode(Node node) { + ((DefaultComboBoxModel) nodeComboBox.getModel()).removeElement(node); + } + + // // PRIVATE METHODS // /** + * Initializes all actions. + */ + private void initActions() { + changeBasePathAction = new I18nAction("projectPanel.button.changeBasePath") { + + /** + * {@inheritDoc} + */ + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionEvent) { + changeBasePath(); + } + }; + editFilesAction = new I18nAction("projectPanel.button.editFiles") { + + /** + * {@inheritDoc} + */ + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionEvent) { + editFiles(); + } + }; + nodeAction = new AbstractAction() { + + /** + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionEvent) { + Node node = (Node) nodeComboBox.getSelectedItem(); + project.setNode(node); + } + }; + } + + /** * Initializes all components of the panel. */ private void initComponents() { setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); - + + JPanel propertiesPanel = createPropertiesPanel(); + add(propertiesPanel, BorderLayout.CENTER); + + JPanel buttonPanel = createButtonPanel(); + add(buttonPanel, BorderLayout.PAGE_END); + } + + /** + * Creates the properties panel. + * + * @return The properties panel + */ + private JPanel createPropertiesPanel() { + JPanel propertiesPanel = new JPanel(new GridBagLayout()); + + nameTextField = new JTextField(project.getName()); + nameTextField.getDocument().addDocumentListener(this); + nameLabel = new I18nLabel("projectPanel.label.name", nameTextField); + propertiesPanel.add(nameLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); + propertiesPanel.add(nameTextField, new GridBagConstraints(1, 0, 3, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 12, 0, 0), 0, 0)); + + descriptionTextField = new JTextField(project.getDescription()); + descriptionTextField.getDocument().addDocumentListener(this); + descriptionLabel = new I18nLabel("projectPanel.label.description", descriptionTextField); + propertiesPanel.add(descriptionLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 0, 0, 0), 0, 0)); + propertiesPanel.add(descriptionTextField, new GridBagConstraints(1, 1, 3, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0)); + + basePathTextField = new JTextField(project.getBasePath()); + basePathTextField.setEditable(false); + basePathLabel = new I18nLabel("projectPanel.label.basePath"); + JButton changeBasePathButton = new JButton(changeBasePathAction); + JButton editFilesButton = new JButton(editFilesAction); + propertiesPanel.add(basePathLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 0, 0, 0), 0, 0)); + propertiesPanel.add(basePathTextField, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(12, 12, 0, 0), 0, 0)); + propertiesPanel.add(changeBasePathButton, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0)); + propertiesPanel.add(editFilesButton, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0)); + + nodeComboBox = new JComboBox(new DefaultComboBoxModel()); + ((DefaultComboBoxModel) nodeComboBox.getModel()).addElement(null); + for (Node node : swingInterface.getNodes()) { + ((DefaultComboBoxModel) nodeComboBox.getModel()).addElement(node); + } + nodeComboBox.setSelectedItem(project.getNode()); + nodeComboBox.addActionListener(nodeAction); + nodeLabel = new I18nLabel("projectPanel.label.node", nodeComboBox); + propertiesPanel.add(nodeLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 0, 0, 0), 0, 0)); + propertiesPanel.add(nodeComboBox, new GridBagConstraints(1, 3, 3, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0)); + + propertiesPanel.add(new JPanel(), new GridBagConstraints(0, 4, 4, 1, 1.0, 1.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); + + return propertiesPanel; + } + + /** + * Creates the button panel. + * + * @return The button panel + */ + private JPanel createButtonPanel() { + JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING, 12, 12)); + buttonPanel.setBorder(BorderFactory.createEmptyBorder(-12, -12, -12, -12)); + + buttonPanel.add(new JButton(swingInterface.getDeleteProjectAction(project))); + buttonPanel.add(new JButton(swingInterface.getCloneProjectAction(project))); + + return buttonPanel; + } + + /** + * Updates the project from changes in the text fields. + * + * @param document + * The document that was changed + */ + private void textFieldsUpdated(Document document) { + if (nameTextField.getDocument() == document) { + project.setName(nameTextField.getText()); + } else if (descriptionTextField.getDocument() == document) { + project.setDescription(descriptionTextField.getText()); + } + } + + // + // PRIVATE ACTIONS + // + + /** + * Lets the user select a new base path and repopulates the file list. + */ + void changeBasePath() { + JFileChooser fileChooser = new JFileChooser(project.getBasePath()); + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + fileChooser.setApproveButtonText(I18n.get("projectPanel.button.approve.name")); + int chooseAction = fileChooser.showOpenDialog(this); + if (chooseAction == JFileChooser.APPROVE_OPTION) { + String newBasePath = fileChooser.getSelectedFile().getPath(); + basePathTextField.setText(newBasePath); + project.setBasePath(newBasePath); + } + } + + /** + * Pops up the file manager and lets the user edit the parameters for the + * physical and virtual files. + */ + private void editFiles() { + FileManager fileManager = new FileManager(swingInterface, project); + fileManager.setVisible(true); + } + + // + // INTERFACE I18nable + // + + /** + * {@inheritDoc} + */ + public void updateI18n() { + nameLabel.updateI18n(); + descriptionLabel.updateI18n(); + basePathLabel.updateI18n(); + changeBasePathAction.updateI18n(); + editFilesAction.updateI18n(); + } + + // + // INTERFACE DocumentListener + // + + /** + * {@inheritDoc} + */ + public void changedUpdate(DocumentEvent documentEvent) { + textFieldsUpdated(documentEvent.getDocument()); + } + + /** + * {@inheritDoc} + */ + public void insertUpdate(DocumentEvent documentEvent) { + textFieldsUpdated(documentEvent.getDocument()); + } + + /** + * {@inheritDoc} + */ + public void removeUpdate(DocumentEvent documentEvent) { + textFieldsUpdated(documentEvent.getDocument()); } }