continue work on file manager
[jSite2.git] / src / net / pterodactylus / jsite / gui / FileManager.java
index 33a07ce..6771487 100644 (file)
@@ -29,7 +29,6 @@ import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.beans.PropertyChangeEvent;
@@ -47,6 +46,7 @@ import javax.swing.AbstractAction;
 import javax.swing.AbstractButton;
 import javax.swing.Action;
 import javax.swing.BorderFactory;
+import javax.swing.ComboBoxModel;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
@@ -58,6 +58,7 @@ import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
 import javax.swing.JTree;
+import javax.swing.event.ListDataListener;
 import javax.swing.event.TreeModelEvent;
 import javax.swing.event.TreeModelListener;
 import javax.swing.event.TreeSelectionEvent;
@@ -83,7 +84,7 @@ import net.pterodactylus.util.swing.SwingUtils;
  * 
  * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
  */
-public class FileManager extends JDialog implements I18nable, ActionListener, TreeSelectionListener, MouseListener {
+public class FileManager extends JDialog implements I18nable, TreeSelectionListener, MouseListener {
 
        /** Logger. */
        private static final Logger logger = Logging.getLogger(FileManager.class.getName());
@@ -139,8 +140,8 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
        /** 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;
@@ -160,6 +161,27 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
        /** 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;
 
@@ -276,6 +298,8 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                                }
                                String completePath = projectFileWrapper.getProjectFile().getCompletePath();
                                project.setDefaultFile(completePath);
+                               fileTree.setShowsRootHandles(false);
+                               fileTree.repaint();
                        }
                };
                applyInsertOverrideAction = new I18nAction("fileManager.menu.item.applyInsertOverride") {
@@ -353,6 +377,26 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                        }
                };
                insertOverrideAction.setEnabled(false);
+               overrideContentTypeDefaultAction = new I18nAction("fileManager.checkbox.overrideContentTypeDefault") {
+
+                       /**
+                        * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+                        */
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               /* TODO */
+                       }
+               };
+               overrideContentTypeDefaultAction.setEnabled(false);
+               contentTypeOverrideAction = new AbstractAction() {
+
+                       /**
+                        * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+                        */
+                       public void actionPerformed(ActionEvent actionEvent) {
+                               /* TODO */
+                       }
+               };
+               contentTypeOverrideAction.setEnabled(false);
        }
 
        /**
@@ -412,11 +456,11 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                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();
@@ -437,9 +481,9 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                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));
@@ -447,12 +491,28 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                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();
+               contentTypeOverrideComboBox.addActionListener(contentTypeOverrideAction);
+               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));
@@ -646,6 +706,63 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                return selectedProjectFileWrappers;
        }
 
+       /**
+        * Sets the given action’s enabled state to the given enabled state if the
+        * action’s current enabled state is not the given enabled state.
+        * 
+        * @param action
+        *            The action to set the enabled state on
+        * @param enabled
+        *            The new enabled state of the action
+        */
+       private void setEnabled(Action action, boolean enabled) {
+               if (action.isEnabled() != enabled) {
+                       action.setEnabled(enabled);
+               }
+       }
+
+       /**
+        * Sets the given button’s selected state to the given selected state if the
+        * button’s current selected state is not the given selected state.
+        * 
+        * @param button
+        *            The button to set the selected state on
+        * @param selected
+        *            The new selected state of the button
+        */
+       private void setSelected(AbstractButton button, boolean selected) {
+               if (button.isSelected() != selected) {
+                       button.setSelected(selected);
+               }
+       }
+
+       /**
+        * 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);
+       }
+
+       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(), "--");
+               allMimeTypes.add(0, null);
+               contentTypeOverrideComboBox.set
+       }
+       
        //
        // INTERFACE I18nable
        //
@@ -677,6 +794,7 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                boolean overrideInsertSelected = false;
                boolean insertOverrideEnabled = false;
                boolean insertOverrideSelected = false;
+               String defaultContentType = MimeTypes.DEFAULT_CONTENT_TYPE;
                if (selectedProjectFileWrappers.size() == 1) {
                        ProjectFileWrapper projectFileWrapper = selectedProjectFileWrappers.get(0);
                        ProjectFile projectFile = projectFileWrapper.getProjectFile();
@@ -690,6 +808,7 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                                fileSizeText = String.valueOf(projectFile.getSize());
                                insertDefaultSelected = !projectFile.isHidden();
                                overrideInsertEnabled = true;
+                               defaultContentType = MimeTypes.getMimeType(getFileExtension(projectFile.getName()));
                                FileOverride fileOverride = project.getFileOverride(projectFile);
                                if (fileOverride != null) {
                                        Boolean overrideInsert = fileOverride.isInsert();
@@ -709,47 +828,7 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
                setSelected(overrideInsertDefaultCheckBox, overrideInsertSelected);
                setEnabled(insertOverrideAction, insertOverrideEnabled);
                setSelected(insertOverrideCheckBox, insertOverrideSelected);
-       }
-
-       /**
-        * Sets the given action’s enabled state to the given enabled state if the
-        * action’s current enabled state is not the given enabled state.
-        * 
-        * @param action
-        *            The action to set the enabled state on
-        * @param enabled
-        *            The new enabled state of the action
-        */
-       private void setEnabled(Action action, boolean enabled) {
-               if (action.isEnabled() != enabled) {
-                       action.setEnabled(enabled);
-               }
-       }
-
-       /**
-        * Sets the given button’s selected state to the given selected state if the
-        * button’s current selected state is not the given selected state.
-        * 
-        * @param button
-        *            The button to set the selected state on
-        * @param selected
-        *            The new selected state of the button
-        */
-       private void setSelected(AbstractButton button, boolean selected) {
-               if (button.isSelected() != selected) {
-                       button.setSelected(selected);
-               }
-       }
-
-       //
-       // INTERFACE ActionListener
-       //
-
-       /**
-        * {@inheritDoc}
-        */
-       public void actionPerformed(ActionEvent actionEvent) {
-               /* TODO */
+               contentTypeDefaultTextField.setText(defaultContentType);
        }
 
        //
@@ -1145,4 +1224,55 @@ public class FileManager extends JDialog implements I18nable, ActionListener, Tr
 
        }
 
+       private class MimeTypeListModel implements ComboBoxModel {
+
+               private List<ListDataListener> listDataListeners = new ArrayList<ListDataListener>();
+               private Object selectedItem;
+               
+               /**
+         * @see javax.swing.ListModel#addListDataListener(javax.swing.event.ListDataListener)
+         */
+        public void addListDataListener(ListDataListener listDataListener) {
+               listDataListeners.add(listDataListener);
+        }
+
+               /**
+         * @see javax.swing.ListModel#removeListDataListener(javax.swing.event.ListDataListener)
+         */
+        public void removeListDataListener(ListDataListener listDataListener) {
+               listDataListeners.remove(listDataListener);
+        }
+               
+               /**
+         * @see javax.swing.ComboBoxModel#getSelectedItem()
+         */
+        public Object getSelectedItem() {
+               return selectedItem;
+        }
+
+               /**
+         * @see javax.swing.ComboBoxModel#setSelectedItem(java.lang.Object)
+         */
+        public void setSelectedItem(Object anItem) {
+               selectedItem = anItem;
+        }
+        
+               /**
+         * @see javax.swing.ListModel#getElementAt(int)
+         */
+        public Object getElementAt(int index) {
+               // TODO Auto-generated method stub
+               return null;
+        }
+
+               /**
+         * @see javax.swing.ListModel#getSize()
+         */
+        public int getSize() {
+               // TODO Auto-generated method stub
+               return 0;
+        }
+
+       }
+       
 }