X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fgui%2FFileManager.java;h=996d6093d06b7e8d63cf30c0f9c14058bf573504;hb=2ce8ea7269138d93a99cab2f10ddba9f82bd1331;hp=5bd52e8833bd8725e57c9166065c3d133d7cbc00;hpb=b6e4ce772f4c7a823dad0d3aa0a28f6432a7540b;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/gui/FileManager.java b/src/net/pterodactylus/jsite/gui/FileManager.java index 5bd52e8..996d609 100644 --- a/src/net/pterodactylus/jsite/gui/FileManager.java +++ b/src/net/pterodactylus/jsite/gui/FileManager.java @@ -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; @@ -275,6 +301,8 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe } String completePath = projectFileWrapper.getProjectFile().getCompletePath(); project.setDefaultFile(completePath); + fileTree.setShowsRootHandles(false); + fileTree.repaint(); } }; applyInsertOverrideAction = new I18nAction("fileManager.menu.item.applyInsertOverride") { @@ -340,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 selectedProjectFileWrappers = getSelectedProjectFileWrappers(true); @@ -352,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 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 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); } /** @@ -411,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(); @@ -436,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)); @@ -446,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)); @@ -675,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 allMimeTypes = MimeTypes.getAllMimeTypes(); + List 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 // @@ -706,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(); @@ -719,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 */ @@ -738,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); } // @@ -1133,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 <bombe@freenetproject.org> + */ + 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); + } + + } + }