fix wrong enable state of override content type checkbox
[jSite2.git] / src / net / pterodactylus / jsite / gui / FileManager.java
index e513d23..996d609 100644 (file)
@@ -46,17 +46,22 @@ import javax.swing.AbstractAction;
 import javax.swing.AbstractButton;
 import javax.swing.Action;
 import javax.swing.BorderFactory;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListCellRenderer;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JDialog;
 import javax.swing.JLabel;
+import javax.swing.JList;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
 import javax.swing.JTextField;
 import javax.swing.JTree;
+import javax.swing.SwingConstants;
 import javax.swing.event.TreeModelEvent;
 import javax.swing.event.TreeModelListener;
 import javax.swing.event.TreeSelectionEvent;
@@ -65,14 +70,14 @@ import javax.swing.tree.DefaultTreeCellRenderer;
 import javax.swing.tree.TreeModel;
 import javax.swing.tree.TreePath;
 
+import net.pterodactylus.jsite.core.FileOverride;
+import net.pterodactylus.jsite.core.Project;
+import net.pterodactylus.jsite.core.ProjectFile;
 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.jsite.i18n.gui.I18nMenu;
-import net.pterodactylus.jsite.project.FileOverride;
-import net.pterodactylus.jsite.project.Project;
-import net.pterodactylus.jsite.project.ProjectFile;
 import net.pterodactylus.util.io.MimeTypes;
 import net.pterodactylus.util.logging.Logging;
 import net.pterodactylus.util.swing.SwingUtils;
@@ -138,8 +143,8 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
        /** The “file size” text field. */
        private JTextField fileSizeTextField;
 
-       /** The “override” label. */
-       private I18nLabel fileSettingsLabel;
+       /** The “insert settings” label. */
+       private I18nLabel insertSettingsLabel;
 
        /** The “insert default” label. */
        private I18nLabel insertDefaultLabel;
@@ -159,6 +164,27 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
        /** The “override insert” checkbox. */
        private JCheckBox insertOverrideCheckBox;
 
+       /** The “content type settings” label. */
+       private I18nLabel contentTypeSettingsLabel;
+
+       /** The “content type default” label. */
+       private I18nLabel contentTypeDefaultLabel;
+
+       /** The “content type default” text field. */
+       private JTextField contentTypeDefaultTextField;
+
+       /** The “override content type default” action. */
+       private I18nAction overrideContentTypeDefaultAction;
+
+       /** The “override content type default” checkbox. */
+       private JCheckBox overrideContentTypeDefaultCheckBox;
+
+       /** The “content type override” action. */
+       private Action contentTypeOverrideAction;
+
+       /** The “content type override” combo box. */
+       private JComboBox contentTypeOverrideComboBox;
+
        /** The context menu for the tree. */
        private JPopupMenu treeContextMenu;
 
@@ -342,6 +368,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                        /**
                         * {@inheritDoc}
                         */
+                       @SuppressWarnings("synthetic-access")
                        public void actionPerformed(ActionEvent actionEvent) {
                                boolean insertOverride = insertOverrideCheckBox.isSelected();
                                List<ProjectFileWrapper> selectedProjectFileWrappers = getSelectedProjectFileWrappers(true);
@@ -354,6 +381,62 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                        }
                };
                insertOverrideAction.setEnabled(false);
+               overrideContentTypeDefaultAction = new I18nAction("fileManager.checkbox.overrideContentTypeDefault") {
+
+                       /**
+                        * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+                        */
+                       @SuppressWarnings("synthetic-access")
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               boolean contentTypeOverrideEnabled = overrideContentTypeDefaultCheckBox.isSelected();
+                               contentTypeOverrideComboBox.setEnabled(contentTypeOverrideEnabled);
+                               List<ProjectFileWrapper> selectedProjectFileWrappers = getSelectedProjectFileWrappers(true);
+                               ProjectFileWrapper projectFileWrapper = selectedProjectFileWrappers.get(0);
+                               ProjectFile projectFile = projectFileWrapper.getProjectFile();
+                               FileOverride fileOverride = project.getFileOverride(projectFile);
+                               if (contentTypeOverrideEnabled) {
+                                       if (fileOverride == null) {
+                                               fileOverride = new FileOverride();
+                                               project.addFileOverride(projectFile, fileOverride);
+                                       }
+                                       fileOverride.setContentType(MimeTypes.getMimeType(getFileExtension(projectFile.getName())));
+                               } else {
+                                       fileOverride.setContentType(null);
+                                       if (fileOverride.isEmpty()) {
+                                               project.removeFileOverride(projectFile);
+                                       }
+                               }
+                       }
+               };
+               overrideContentTypeDefaultAction.setEnabled(false);
+               contentTypeOverrideAction = new AbstractAction() {
+
+                       /**
+                        * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+                        */
+                       @SuppressWarnings("synthetic-access")
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               if (!contentTypeOverrideComboBox.isEnabled()) {
+                                       return;
+                               }
+                               String selectedContentType = (String) contentTypeOverrideComboBox.getSelectedItem();
+                               logger.log(Level.FINEST, "selectedContentType: " + selectedContentType);
+                               if ("--".equals(selectedContentType)) {
+                                       return;
+                               }
+                               List<ProjectFileWrapper> selectedProjectFileWrappers = getSelectedProjectFileWrappers(true);
+                               for (ProjectFileWrapper projectFileWrapper : selectedProjectFileWrappers) {
+                                       ProjectFile projectFile = projectFileWrapper.getProjectFile();
+                                       FileOverride fileOverride = project.getFileOverride(projectFile);
+                                       if (fileOverride == null) {
+                                               fileOverride = new FileOverride();
+                                               project.addFileOverride(projectFile, fileOverride);
+                                       }
+                                       fileOverride.setContentType(selectedContentType);
+                               }
+                       }
+               };
+               contentTypeOverrideAction.setEnabled(false);
        }
 
        /**
@@ -413,11 +496,11 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                JPanel propertiesPanel = new JPanel(new GridBagLayout());
                rightPanel.add(propertiesPanel, BorderLayout.CENTER);
                propertiesPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(12, 12, 12, 12)));
-               propertiesPanel.setPreferredSize(new Dimension(400, 350));
+               propertiesPanel.setPreferredSize(new Dimension(500, 350));
 
                filePropertiesLabel = new I18nLabel("fileManager.label.fileProperties");
                filePropertiesLabel.setFont(filePropertiesLabel.getFont().deriveFont(Font.BOLD));
-               propertiesPanel.add(filePropertiesLabel, new GridBagConstraints(0, 0, 4, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
+               propertiesPanel.add(filePropertiesLabel, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
 
                filePathLabel = new I18nLabel("fileManager.label.filePath");
                filePathTextField = new JTextField();
@@ -438,9 +521,9 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                propertiesPanel.add(fileSizeTextField, new GridBagConstraints(1, 3, 3, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0));
 
                /* file settings. */
-               fileSettingsLabel = new I18nLabel("fileManager.label.fileSettings");
-               fileSettingsLabel.setFont(fileSettingsLabel.getFont().deriveFont(Font.BOLD));
-               propertiesPanel.add(fileSettingsLabel, new GridBagConstraints(0, 4, 4, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(24, 0, 0, 0), 0, 0));
+               insertSettingsLabel = new I18nLabel("fileManager.label.insertSetting");
+               insertSettingsLabel.setFont(insertSettingsLabel.getFont().deriveFont(Font.BOLD));
+               propertiesPanel.add(insertSettingsLabel, new GridBagConstraints(0, 4, 2, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(24, 0, 0, 0), 0, 0));
 
                insertDefaultLabel = new I18nLabel("fileManager.label.insertDefault");
                propertiesPanel.add(insertDefaultLabel, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 24, 0, 0), 0, 0));
@@ -448,12 +531,30 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                insertDefaultCheckBox.setEnabled(false);
                propertiesPanel.add(insertDefaultCheckBox, new GridBagConstraints(1, 5, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0));
                overrideInsertDefaultCheckBox = new JCheckBox(overrideInsertDefaultAction);
-               propertiesPanel.add(overrideInsertDefaultCheckBox, new GridBagConstraints(2, 5, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0));
+               propertiesPanel.add(overrideInsertDefaultCheckBox, new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 24, 0, 0), 0, 0));
                insertOverrideCheckBox = new JCheckBox(insertOverrideAction);
-               propertiesPanel.add(insertOverrideCheckBox, new GridBagConstraints(3, 5, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0));
+               propertiesPanel.add(insertOverrideCheckBox, new GridBagConstraints(1, 6, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0));
+
+               /* content type settings. */
+               contentTypeSettingsLabel = new I18nLabel("fileManager.label.contentTypeSetting");
+               contentTypeSettingsLabel.setFont(contentTypeSettingsLabel.getFont().deriveFont(Font.BOLD));
+               propertiesPanel.add(contentTypeSettingsLabel, new GridBagConstraints(0, 7, 2, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(24, 0, 0, 0), 0, 0));
+
+               contentTypeDefaultLabel = new I18nLabel("fileManager.label.contentTypeDefault");
+               propertiesPanel.add(contentTypeDefaultLabel, new GridBagConstraints(0, 8, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 24, 0, 0), 0, 0));
+               contentTypeDefaultTextField = new JTextField();
+               contentTypeDefaultTextField.setEditable(false);
+               propertiesPanel.add(contentTypeDefaultTextField, new GridBagConstraints(1, 8, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0));
+               overrideContentTypeDefaultCheckBox = new JCheckBox(overrideContentTypeDefaultAction);
+               propertiesPanel.add(overrideContentTypeDefaultCheckBox, new GridBagConstraints(0, 9, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 24, 0, 0), 0, 0));
+               contentTypeOverrideComboBox = new JComboBox(new DefaultComboBoxModel());
+               contentTypeOverrideComboBox.setRenderer(new MimeTypeComboBoxRenderer());
+               contentTypeOverrideComboBox.addActionListener(contentTypeOverrideAction);
+               contentTypeOverrideComboBox.setEnabled(false);
+               propertiesPanel.add(contentTypeOverrideComboBox, new GridBagConstraints(1, 9, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(12, 12, 0, 0), 0, 0));
 
                /* glue panel. */
-               propertiesPanel.add(new JPanel(), new GridBagConstraints(0, 6, 4, 1, 1.0, 1.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
+               propertiesPanel.add(new JPanel(), new GridBagConstraints(0, 10, 2, 1, 1.0, 1.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
 
                /* action button panel */
                JPanel actionButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 12, 12));
@@ -677,6 +778,43 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                }
        }
 
+       /**
+        * Returns the extension of the given filename. If the file name does not
+        * have an extension, the name of the file (without any path components) is
+        * returned.
+        * 
+        * @param fileName
+        *            The name of the file
+        * @return The extension of the file
+        */
+       private String getFileExtension(String fileName) {
+               String lastComponent = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
+               return lastComponent.substring(lastComponent.lastIndexOf('.') + 1);
+       }
+
+       /**
+        * Repopulates the content type combo box with all content types, putting
+        * the most probably ones to the front of the list.
+        * 
+        * @param fileName
+        *            The name of the file
+        */
+       private void fillComboBox(String fileName) {
+               String fileExtension = getFileExtension(fileName);
+               List<String> allMimeTypes = MimeTypes.getAllMimeTypes();
+               List<String> eligibleMimeTypes = MimeTypes.getMimeTypes(fileExtension);
+               for (String mimeType : eligibleMimeTypes) {
+                       allMimeTypes.remove(mimeType);
+                       allMimeTypes.add(eligibleMimeTypes.indexOf(mimeType), mimeType);
+               }
+               allMimeTypes.add(eligibleMimeTypes.size(), "--");
+               DefaultComboBoxModel contentTypeOverrideComboBoxModel = (DefaultComboBoxModel) contentTypeOverrideComboBox.getModel();
+               contentTypeOverrideComboBoxModel.removeAllElements();
+               for (String mimeType : allMimeTypes) {
+                       contentTypeOverrideComboBoxModel.addElement(mimeType);
+               }
+       }
+
        //
        // INTERFACE I18nable
        //
@@ -708,6 +846,11 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                boolean overrideInsertSelected = false;
                boolean insertOverrideEnabled = false;
                boolean insertOverrideSelected = false;
+               String defaultContentType = "";
+               boolean overrideContentTypeEnabled = false;
+               boolean overrideContentTypeSelected = false;
+               boolean contentTypeOverrideEnabled = false;
+               String contentTypeOverride = "--";
                if (selectedProjectFileWrappers.size() == 1) {
                        ProjectFileWrapper projectFileWrapper = selectedProjectFileWrappers.get(0);
                        ProjectFile projectFile = projectFileWrapper.getProjectFile();
@@ -721,13 +864,22 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                                fileSizeText = String.valueOf(projectFile.getSize());
                                insertDefaultSelected = !projectFile.isHidden();
                                overrideInsertEnabled = true;
+                               overrideContentTypeEnabled = true;
+                               defaultContentType = MimeTypes.getMimeType(getFileExtension(projectFile.getName()));
                                FileOverride fileOverride = project.getFileOverride(projectFile);
                                if (fileOverride != null) {
                                        Boolean overrideInsert = fileOverride.isInsert();
                                        overrideInsertSelected = overrideInsert != null;
                                        insertOverrideEnabled = overrideInsertSelected;
                                        insertOverrideSelected = overrideInsertSelected ? overrideInsert : !projectFile.isHidden();
+                                       String contentType = fileOverride.getContentType();
+                                       if (contentType != null) {
+                                               contentTypeOverride = contentType;
+                                               overrideContentTypeSelected = true;
+                                               contentTypeOverrideEnabled = true;
+                                       }
                                }
+                               fillComboBox(projectFile.getName());
                        }
                } else if (selectedProjectFileWrappers.size() > 1) {
                        /* TODO */
@@ -740,6 +892,11 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
                setSelected(overrideInsertDefaultCheckBox, overrideInsertSelected);
                setEnabled(insertOverrideAction, insertOverrideEnabled);
                setSelected(insertOverrideCheckBox, insertOverrideSelected);
+               contentTypeDefaultTextField.setText(defaultContentType);
+               overrideContentTypeDefaultAction.setEnabled(overrideContentTypeEnabled);
+               overrideContentTypeDefaultCheckBox.setSelected(overrideContentTypeSelected);
+               contentTypeOverrideComboBox.setEnabled(contentTypeOverrideEnabled);
+               contentTypeOverrideComboBox.setSelectedItem(contentTypeOverride);
        }
 
        //
@@ -1135,4 +1292,38 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe
 
        }
 
+       /**
+        * A cell renderer for combo boxes that converts the string “--” to a
+        * separator.
+        * 
+        * @author David ‘Bombe’ Roden &lt;bombe@freenetproject.org&gt;
+        */
+       private class MimeTypeComboBoxRenderer extends DefaultListCellRenderer {
+
+               /** The separator component. */
+               private final JSeparator separator = new JSeparator(SwingConstants.HORIZONTAL);
+
+               /**
+                * Empty constructor.
+                */
+               MimeTypeComboBoxRenderer() {
+                       /* do nothing. */
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               @Override
+               public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+                       if ("--".equals(value)) {
+                               return separator;
+                       }
+                       if (value == null) {
+                               return super.getListCellRendererComponent(list, "\u00a0", index, isSelected, cellHasFocus);
+                       }
+                       return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+               }
+
+       }
+
 }