+ /**
+ * 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
+ */
+ private void maybeShowContextMenu(MouseEvent mouseEvent) {
+ if (!mouseEvent.isPopupTrigger()) {
+ return;
+ }
+ List<ProjectFileWrapper> selectedProjectFileWrappers = getSelectedProjectFileWrappers(false);
+ TreePath clickedPath = fileTree.getPathForLocation(mouseEvent.getX(), mouseEvent.getY());
+ ProjectFileWrapper clickedProjectFileWrapper = (ProjectFileWrapper) clickedPath.getLastPathComponent();
+ if (!selectedProjectFileWrappers.contains(clickedProjectFileWrapper)) {
+ fileTree.setSelectionPath(clickedPath);
+ selectedProjectFileWrappers = getSelectedProjectFileWrappers(false);
+ }
+ logger.log(Level.FINEST, "selectedProjectFileWrappers.size(): " + selectedProjectFileWrappers.size());
+ if (selectedProjectFileWrappers.size() == 1) {
+ ProjectFileWrapper projectFileWrapper = selectedProjectFileWrappers.get(0);
+ ProjectFile projectFile = projectFileWrapper.getProjectFile();
+ setDefaultFileAction.setEnabled(!isHidden(projectFileWrapper) && projectFile.isFile() && !projectFile.getCompletePath().equals(project.getDefaultFile()));
+ } else {
+ setDefaultFileAction.setEnabled(false);
+ }
+ overrideMenu.setVisible(selectedProjectFileWrappers.size() > 1);
+ treeContextMenu.show(fileTree, mouseEvent.getX(), mouseEvent.getY());
+ }
+
+ /**
+ * Finds whether the {@link ProjectFile} given by
+ * <code>projectFileWrapper</code> is hidden.
+ *
+ * @param projectFileWrapper
+ * The wrapped project file
+ * @return <code>true</code> if the file is hidden and should not be
+ * inserted, <code>false</code> otherwise
+ */
+ private boolean isHidden(ProjectFileWrapper projectFileWrapper) {
+ ProjectFile projectFile = projectFileWrapper.getProjectFile();
+ FileOverride fileOverride = project.getFileOverrides().get(projectFile.getCompletePath());
+ logger.log(Level.FINEST, "fileOverride: " + fileOverride);
+ return ((fileOverride == null) && projectFile.isHidden()) || ((fileOverride != null) && (fileOverride.isInsert() == null) && projectFile.isHidden()) || ((fileOverride != null) && (fileOverride.isInsert() != null) && (Boolean.FALSE.equals(fileOverride.isInsert())));
+ }
+
+ /**
+ * Opens the “apply insert override” dialog and lets the user apply an
+ * override for the “insert” setting for multiple files.
+ */
+ private void applyInsertOverride() {
+ JCheckBox insertCheckBox = new JCheckBox(I18n.get("fileManager.menu.item.insert.name"));
+ String okString = I18n.get("general.button.okay.name");
+ String cancelString = I18n.get("general.button.cancel.name");
+ int choice = JOptionPane.showOptionDialog(this, new Object[] { I18n.get("fileManager.dialog.insertOverride.message"), insertCheckBox }, I18n.get("fileManager.dialog.insertOverride.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] { okString, cancelString }, okString);
+ logger.log(Level.FINEST, "choice: " + choice);
+ if ((choice == JOptionPane.CLOSED_OPTION) || (choice == 1)) {
+ return;
+ }
+ logger.log(Level.INFO, "selected insert override: " + insertCheckBox.isSelected());
+ List<ProjectFileWrapper> selectedProjectFileWrappers = getSelectedProjectFileWrappers(true);
+ for (ProjectFileWrapper selectedProjectFileWrapper : selectedProjectFileWrappers) {
+ ProjectFile projectFile = selectedProjectFileWrapper.getProjectFile();
+ FileOverride fileOverride = project.getFileOverride(projectFile);
+ if (fileOverride == null) {
+ fileOverride = new FileOverride();
+ project.addFileOverride(projectFile, fileOverride);
+ }
+ fileOverride.setInsert(insertCheckBox.isSelected());
+ }
+ /* HACK - Swing sucks a bit */
+ fileTree.setShowsRootHandles(false);
+ }
+
+ /**
+ * Opens the “apply mime type override” dialog and lets the user apply an
+ * override for the “mime type” setting for multiple files.
+ */
+ private void applyMimeTypeOverride() {
+ List<String> allMimeTypes = MimeTypes.getAllMimeTypes();
+ allMimeTypes.add(0, null);
+ JComboBox mimeTypeComboBox = new JComboBox(allMimeTypes.toArray());
+ String okString = I18n.get("general.button.okay.name");
+ String cancelString = I18n.get("general.button.cancel.name");
+ int choice = JOptionPane.showOptionDialog(this, new Object[] { I18n.get("fileManager.dialog.mimeTypeOverride.message"), mimeTypeComboBox }, I18n.get("fileManager.dialog.mimeTypeOverride.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] { okString, cancelString }, okString);
+ if ((choice == JOptionPane.CLOSED_OPTION) || (choice == 1)) {
+ return;
+ }
+ logger.log(Level.FINE, "selected mime type: " + mimeTypeComboBox.getSelectedItem());
+ List<ProjectFileWrapper> selectedProjectFileWrappers = getSelectedProjectFileWrappers(true);
+ for (ProjectFileWrapper selectedProjectFileWrapper : selectedProjectFileWrappers) {
+ ProjectFile projectFile = selectedProjectFileWrapper.getProjectFile();
+ FileOverride fileOverride = project.getFileOverride(projectFile);
+ if (fileOverride == null) {
+ fileOverride = new FileOverride();
+ project.addFileOverride(projectFile, fileOverride);
+ }
+ fileOverride.setContentType((String) mimeTypeComboBox.getSelectedItem());
+ }
+ }
+
+ /**
+ * Removes the overrides of all selected files.
+ */
+ private void removeOverride() {
+ String continueString = I18n.get("general.button.continue.name");
+ String cancelString = I18n.get("general.button.cancel.name");
+ List<ProjectFileWrapper> selectedProjectFileWrappers = getSelectedProjectFileWrappers(true);
+ int choice = JOptionPane.showOptionDialog(this, I18n.get("fileManager.dialog.removeOverride.message", selectedProjectFileWrappers.size()), I18n.get("fileManager.dialog.removeOverride.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, new Object[] { continueString, cancelString }, continueString);
+ if ((choice == JOptionPane.CLOSED_OPTION) || (choice == 1)) {
+ return;
+ }
+ for (ProjectFileWrapper selectedProjectFileWrapper : selectedProjectFileWrappers) {
+ project.removeFileOverride(selectedProjectFileWrapper.getProjectFile());
+ }
+ }
+
+ /**
+ * Returns all currently selected {@link ProjectFileWrapper}s.
+ *
+ * @param filesOnly
+ * <code>true</code> to return only selected files,
+ * <code>false</code> to include directories
+ * @return All selected project file wrappers
+ */
+ private List<ProjectFileWrapper> getSelectedProjectFileWrappers(boolean filesOnly) {
+ List<ProjectFileWrapper> selectedProjectFileWrappers = new ArrayList<ProjectFileWrapper>();
+ TreePath[] selectedPaths = fileTree.getSelectionPaths();
+ if (selectedPaths != null) {
+ for (TreePath selectedPath : selectedPaths) {
+ ProjectFileWrapper projectFileWrapper = (ProjectFileWrapper) selectedPath.getLastPathComponent();
+ if (filesOnly && !projectFileWrapper.getProjectFile().isFile()) {
+ continue;
+ }
+ selectedProjectFileWrappers.add(projectFileWrapper);
+ }
+ }
+ 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);
+ }
+
+ /**
+ * 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);
+ }
+ }
+