X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fgui%2FFileManager.java;h=953e05dc894ee4e6f5c67510ba4d0b6cda743243;hb=a5fcf3cbb126fe4115ff32d5adc0026f2fcf9e7f;hp=677148717a44ff9ed74b3050ca699b6dae4faa91;hpb=b2b988f8db27bedf00c1c87895b20032d282215e;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/gui/FileManager.java b/src/net/pterodactylus/jsite/gui/FileManager.java index 6771487..953e05d 100644 --- a/src/net/pterodactylus/jsite/gui/FileManager.java +++ b/src/net/pterodactylus/jsite/gui/FileManager.java @@ -46,19 +46,24 @@ import javax.swing.AbstractAction; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.BorderFactory; -import javax.swing.ComboBoxModel; +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.JSplitPane; import javax.swing.JTextField; import javax.swing.JTree; -import javax.swing.event.ListDataListener; +import javax.swing.SwingConstants; +import javax.swing.border.EmptyBorder; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.event.TreeSelectionEvent; @@ -67,21 +72,21 @@ 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; /** * Manages physical and virtual files in a project. - * + * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> */ public class FileManager extends JDialog implements I18nable, TreeSelectionListener, MouseListener { @@ -163,7 +168,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** The “content type settings” label. */ private I18nLabel contentTypeSettingsLabel; - + /** The “content type default” label. */ private I18nLabel contentTypeDefaultLabel; @@ -199,7 +204,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Creates a new file manager. - * + * * @param swingInterface * The Swing interface * @param project @@ -251,16 +256,19 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe public void actionPerformed(ActionEvent e) { String defaultFile = project.getDefaultFile(); if ((defaultFile == null) || (defaultFile.length() == 0)) { - /* TODO - i18n */ - JOptionPane.showMessageDialog(FileManager.this, I18n.get(""), I18n.get(""), JOptionPane.ERROR_MESSAGE); - return; - } - ProjectFile projectFile = project.getFile(defaultFile); - if (projectFile == null) { - JOptionPane.showMessageDialog(FileManager.this, I18n.get(""), I18n.get(""), JOptionPane.ERROR_MESSAGE); - return; + int selectedOption = JOptionPane.showOptionDialog(FileManager.this, I18n.get("fileManager.dialog.noDefaultFileSet.message"), I18n.get("fileManager.dialog.noDefaultFileSet.title"), 0, JOptionPane.WARNING_MESSAGE, null, new String[] { I18n.get("general.button.continue.name"), I18n.get("general.button.cancel.name") }, I18n.get("general.button.cancel.name")); + if (selectedOption == 1) { + return; + } + } else { + ProjectFile projectFile = project.getFile(defaultFile); + if (projectFile == null) { + /* TODO - i18n */ + JOptionPane.showMessageDialog(FileManager.this, I18n.get(""), I18n.get(""), JOptionPane.ERROR_MESSAGE); + return; + } + setVisible(false); } - setVisible(false); } }; rescanAction = new I18nAction("fileManager.button.rescan") { @@ -357,6 +365,8 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe project.removeFileOverride(projectFile); } } + fileTree.setShowsRootHandles(false); + fileTree.repaint(); } }; overrideInsertDefaultAction.setEnabled(false); @@ -365,6 +375,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); @@ -382,8 +393,30 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ + @SuppressWarnings("synthetic-access") public void actionPerformed(ActionEvent actionEvent) { - /* TODO */ + 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); + } + String projectFileName = projectFile.getName(); + String mimeType = MimeTypes.getMimeType(getFileExtension(projectFileName)); + fileOverride.setContentType(mimeType); + fillComboBox(projectFileName); + contentTypeOverrideComboBox.setSelectedItem(mimeType); + } else { + fileOverride.setContentType(null); + if (fileOverride.isEmpty()) { + project.removeFileOverride(projectFile); + } + } } }; overrideContentTypeDefaultAction.setEnabled(false); @@ -392,8 +425,26 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ + @SuppressWarnings("synthetic-access") public void actionPerformed(ActionEvent actionEvent) { - /* TODO */ + 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); @@ -425,15 +476,17 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Creates the main panel with the file tree and the file properties. - * + * * @return The mail panel */ private Component createFileManagerPanel() { - JPanel fileManagerPanel = new JPanel(new BorderLayout(12, 12)); + JSplitPane fileManagerPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true); + fileManagerPanel.setBorder(null); /* file tree panel */ JPanel fileTreePanel = new JPanel(new BorderLayout(12, 12)); - fileManagerPanel.add(fileTreePanel, BorderLayout.LINE_START); + fileTreePanel.setBorder(new EmptyBorder(0, 0, 0, 12)); + fileManagerPanel.setLeftComponent(fileTreePanel); fileTree = new JTree(fileTreeModel); fileTree.setShowsRootHandles(false); @@ -450,7 +503,8 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /* the right panel */ JPanel rightPanel = new JPanel(new BorderLayout(12, 12)); - fileManagerPanel.add(rightPanel, BorderLayout.CENTER); + rightPanel.setBorder(new EmptyBorder(0, 12, 0, 0)); + fileManagerPanel.setRightComponent(rightPanel); /* properties panel */ JPanel propertiesPanel = new JPanel(new GridBagLayout()); @@ -499,7 +553,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe 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(); @@ -507,8 +561,10 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe 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 = 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. */ @@ -527,7 +583,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Creates the button panel. - * + * * @return The button panel */ private Component createButtonPanel() { @@ -569,7 +625,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Checks whether the given mouse event is a popup trigger and occured over * a file. If so, the context menu is shown. - * + * * @param mouseEvent * The mouse event to check */ @@ -599,7 +655,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Finds whether the {@link ProjectFile} given by * projectFileWrapper is hidden. - * + * * @param projectFileWrapper * The wrapped project file * @return true if the file is hidden and should not be @@ -685,7 +741,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Returns all currently selected {@link ProjectFileWrapper}s. - * + * * @param filesOnly * true to return only selected files, * false to include directories @@ -709,7 +765,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * 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 @@ -724,7 +780,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * 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 @@ -740,7 +796,7 @@ 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 @@ -750,19 +806,29 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe 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) { + for (String mimeType : eligibleMimeTypes) { allMimeTypes.remove(mimeType); allMimeTypes.add(eligibleMimeTypes.indexOf(mimeType), mimeType); } allMimeTypes.add(eligibleMimeTypes.size(), "--"); - allMimeTypes.add(0, null); - contentTypeOverrideComboBox.set + DefaultComboBoxModel contentTypeOverrideComboBoxModel = (DefaultComboBoxModel) contentTypeOverrideComboBox.getModel(); + contentTypeOverrideComboBoxModel.removeAllElements(); + for (String mimeType : allMimeTypes) { + contentTypeOverrideComboBoxModel.addElement(mimeType); + } } - + // // INTERFACE I18nable // @@ -794,7 +860,11 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe boolean overrideInsertSelected = false; boolean insertOverrideEnabled = false; boolean insertOverrideSelected = false; - String defaultContentType = MimeTypes.DEFAULT_CONTENT_TYPE; + 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(); @@ -808,6 +878,7 @@ 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) { @@ -815,7 +886,14 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe 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 */ @@ -829,6 +907,10 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe setEnabled(insertOverrideAction, insertOverrideEnabled); setSelected(insertOverrideCheckBox, insertOverrideSelected); contentTypeDefaultTextField.setText(defaultContentType); + overrideContentTypeDefaultAction.setEnabled(overrideContentTypeEnabled); + overrideContentTypeDefaultCheckBox.setSelected(overrideContentTypeSelected); + contentTypeOverrideComboBox.setEnabled(contentTypeOverrideEnabled); + contentTypeOverrideComboBox.setSelectedItem(contentTypeOverride); } // @@ -873,7 +955,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Tree cell renderer that takes care of certain display properties for * project-specific stuff. - * + * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> */ private class FileCellRenderer extends DefaultTreeCellRenderer { @@ -942,7 +1024,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * TreeModel that is based on {@link Project#getBaseFile()}. - * + * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> */ private class ProjectFileTreeModel implements TreeModel, PropertyChangeListener { @@ -986,7 +1068,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Notifies all listeners that a node has changed. - * + * * @param changedProjectFileWrapper * The wrapper around the changed project file */ @@ -1008,7 +1090,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Notifies all listeners that the tree structure has changed * significantly. - * + * * @see TreeModelListener#treeStructureChanged(TreeModelEvent) * @param newRootNode */ @@ -1024,7 +1106,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Sets the new base project file. This causes the model to reload. - * + * * @param baseProjectFile * The new base project file */ @@ -1045,7 +1127,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Creates {@link ProjectFileWrapper}s for all files below the given * project file. - * + * * @param projectFile * The base project file for all project files to create * wrappers for @@ -1173,7 +1255,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Wrapper around a {@link ProjectFile} that overwrites * {@link Object#toString()} to return the project file’s name. - * + * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> */ private static class ProjectFileWrapper { @@ -1186,7 +1268,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Creates a new wrapper around a project file. - * + * * @param projectFile * The project file to wrap */ @@ -1196,7 +1278,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Returns the wrapped project file. - * + * * @return The wrapped project file */ public ProjectFile getProjectFile() { @@ -1206,7 +1288,7 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe /** * Sets the name override. If the name override is not null * it will be shown insted of the project file’s name. - * + * * @param nameOverride * The name override */ @@ -1224,55 +1306,38 @@ public class FileManager extends JDialog implements I18nable, TreeSelectionListe } - private class MimeTypeListModel implements ComboBoxModel { - - private List listDataListeners = new ArrayList(); - private Object selectedItem; - - /** - * @see javax.swing.ListModel#addListDataListener(javax.swing.event.ListDataListener) - */ - public void addListDataListener(ListDataListener listDataListener) { - listDataListeners.add(listDataListener); - } + /** + * 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 { - /** - * @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; - } + /** The separator component. */ + private final JSeparator separator = new JSeparator(SwingConstants.HORIZONTAL); /** - * @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; - } + * Empty constructor. + */ + MimeTypeComboBoxRenderer() { + /* do nothing. */ + } /** - * @see javax.swing.ListModel#getSize() - */ - public int getSize() { - // TODO Auto-generated method stub - return 0; - } + * {@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); + } } - + }