/* * FilesChangedDialog.java - Files changed on disk * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2003 Slava Pestov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit.gui; //{{{ Imports import javax.swing.border.*; import javax.swing.event.*; import javax.swing.tree.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; import org.gjt.sp.jedit.*; import org.gjt.sp.util.EnhancedTreeCellRenderer; //}}} /** * Files changed on disk dialog. * * @author Slava Pestov * @version $Id: FilesChangedDialog.java 23221 2013-09-29 20:03:32Z shlomy $ */ public class FilesChangedDialog extends EnhancedDialog { //{{{ FilesChangedDialog constructor public FilesChangedDialog(View view, int[] states, boolean alreadyReloaded) { super(view,jEdit.getProperty("files-changed.title"),false); this.view = view; JPanel content = new JPanel(new BorderLayout(12,12)); content.setBorder(new EmptyBorder(12,12,12,12)); setContentPane(content); Box iconBox = new Box(BoxLayout.Y_AXIS); iconBox.add(new JLabel(UIManager.getIcon("OptionPane.warningIcon"))); iconBox.add(Box.createGlue()); content.add(BorderLayout.WEST,iconBox); JPanel centerPanel = new JPanel(new BorderLayout()); JLabel label = new JLabel(jEdit.getProperty("files-changed.caption")); label.setBorder(new EmptyBorder(0,0,6,0)); centerPanel.add(BorderLayout.NORTH,label); DefaultMutableTreeNode deleted = new DefaultMutableTreeNode( jEdit.getProperty("files-changed.deleted"),true); DefaultMutableTreeNode changed = new DefaultMutableTreeNode( jEdit.getProperty("files-changed.changed" + (alreadyReloaded ? "-auto" : "")),true); DefaultMutableTreeNode changedDirty = new DefaultMutableTreeNode( jEdit.getProperty("files-changed.changed-dirty" + (alreadyReloaded ? "-auto" : "")),true); Buffer[] buffers = jEdit.getBuffers(); for(int i = 0; i < states.length; i++) { Buffer buffer = buffers[i]; DefaultMutableTreeNode addTo; switch(states[i]) { case Buffer.FILE_DELETED: addTo = deleted; break; case Buffer.FILE_CHANGED: addTo = buffer.isDirty() ? changedDirty : changed; break; default: addTo = null; break; } if(addTo != null) { addTo.add(new DefaultMutableTreeNode( buffer.getPath())); } } root = new DefaultMutableTreeNode("",true); if(deleted.getChildCount() != 0) { root.add(deleted); } if(changed.getChildCount() != 0) { root.add(changed); } if(changedDirty.getChildCount() != 0) { root.add(changedDirty); } bufferTreeModel = new DefaultTreeModel(root); bufferTree = new JTree(bufferTreeModel); bufferTree.setRootVisible(false); bufferTree.setVisibleRowCount(10); bufferTree.setCellRenderer(new Renderer()); bufferTree.getSelectionModel().addTreeSelectionListener(new TreeHandler()); bufferTree.getSelectionModel().setSelectionMode( TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); centerPanel.add(BorderLayout.CENTER,new JScrollPane(bufferTree)); content.add(BorderLayout.CENTER,centerPanel); Box buttons = new Box(BoxLayout.X_AXIS); buttons.add(Box.createGlue()); if(!alreadyReloaded) { selectAll = new JButton(jEdit.getProperty( "files-changed.select-all")); selectAll.setMnemonic(jEdit.getProperty( "files-changed.select-all.mnemonic").charAt(0)); buttons.add(selectAll); selectAll.addActionListener(new ActionHandler()); buttons.add(Box.createHorizontalStrut(12)); reload = new JButton(jEdit.getProperty( "files-changed.reload")); reload.setMnemonic(jEdit.getProperty( "files-changed.reload.mnemonic").charAt(0)); buttons.add(reload); reload.addActionListener(new ActionHandler()); buttons.add(Box.createHorizontalStrut(12)); ignore = new JButton(jEdit.getProperty("files-changed.ignore")); ignore.setMnemonic(jEdit.getProperty( "files-changed.ignore.mnemonic").charAt(0)); buttons.add(ignore); ignore.addActionListener(new ActionHandler()); buttons.add(Box.createHorizontalStrut(12)); } close = new JButton(jEdit.getProperty("common.close")); getRootPane().setDefaultButton(close); buttons.add(close); close.addActionListener(new ActionHandler()); buttons.add(Box.createGlue()); content.add(BorderLayout.SOUTH,buttons); bufferTree.expandPath(new TreePath( new Object[] { root, deleted })); bufferTree.expandPath(new TreePath( new Object[] { root, changed })); bufferTree.expandPath(new TreePath( new Object[] { root, changedDirty })); GUIUtilities.requestFocus(this,bufferTree); updateEnabled(); pack(); setLocationRelativeTo(view); setVisible(true); } //}}} //{{{ ok() method public void ok() { dispose(); } //}}} //{{{ cancel() method public void cancel() { dispose(); } //}}} //{{{ Private members private View view; private JTree bufferTree; private DefaultTreeModel bufferTreeModel; private DefaultMutableTreeNode root; private JButton selectAll; // hack so that 'select all' does not change current buffer private boolean selectAllInProgress; private JButton reload; private JButton ignore; private JButton close; //{{{ updateEnabled() method private void updateEnabled() { TreePath[] paths = bufferTree .getSelectionPaths(); boolean enabled = false; if(paths != null) { for (TreePath tp : paths) { Object[] path = tp.getPath(); if (path.length == 3) enabled = true; } } if(reload != null) reload.setEnabled(enabled); if (ignore != null) ignore.setEnabled(enabled); } //}}} //{{{ selectAll() method private void selectAll() { selectAllInProgress = true; TreeNode[] path = new TreeNode[3]; path[0] = root; for(int i = 0; i < root.getChildCount(); i++) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i); path[1] = node; for(int j = 0; j < node.getChildCount(); j++) { DefaultMutableTreeNode node2 = (DefaultMutableTreeNode) node.getChildAt(j); path[2] = node2; bufferTree.getSelectionModel() .addSelectionPath( new TreePath(path)); } } selectAllInProgress = false; updateEnabled(); } //}}} //{{{ reload() method private void action(String action) { TreePath[] paths = bufferTree .getSelectionPaths(); if(paths == null || paths.length == 0) return; int row = bufferTree.getRowForPath(paths[0]); for (TreePath path : paths) { // is it a header? if (path.getPathCount() == 2) continue; DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); if (!(node.getUserObject() instanceof String)) return; Buffer buffer = jEdit.getBuffer((String) node.getUserObject()); if (buffer == null) return; if ("RELOAD".equals(action)) buffer.reload(view); else { buffer.setAutoReload(false); buffer.setAutoReloadDialog(false); } DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent(); parent.remove(node); } bufferTreeModel.reload(root); // we expand those that are non-empty, and // remove those that are empty TreeNode[] nodes = { root, null }; // remove empty category branches for(int j = 0; j < root.getChildCount(); j++) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(j); if(root.getChildAt(j) .getChildCount() == 0) { root.remove(j); j--; } else { nodes[1] = node; bufferTree.expandPath( new TreePath(nodes)); } } if(root.getChildCount() == 0) dispose(); else { if(row >= bufferTree.getRowCount()) row = bufferTree.getRowCount() - 1; TreePath path = bufferTree.getPathForRow(row); if(path.getPathCount() == 2) { // selected a header; skip to the next row bufferTree.setSelectionRow(row + 1); } else bufferTree.setSelectionPath(path); } } //}}} //}}} //{{{ ActionHandler class class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if(source == selectAll) selectAll(); else if(source == reload) action("RELOAD"); else if(source == close) dispose(); else if (source == ignore) action("IGNORE"); } } //}}} //{{{ TreeHandler class class TreeHandler implements TreeSelectionListener { public void valueChanged(TreeSelectionEvent evt) { if(selectAllInProgress) return; updateEnabled(); TreePath[] paths = bufferTree .getSelectionPaths(); if(paths == null || paths.length == 0) return; TreePath path = paths[paths.length - 1]; DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); if(node.getUserObject() instanceof String) { Buffer buffer = jEdit.getBuffer( (String)node.getUserObject()); if(buffer != null) view.showBuffer(buffer); } } } //}}} //{{{ Renderer class static class Renderer extends EnhancedTreeCellRenderer { Renderer() { entryFont = UIManager.getFont("Tree.font"); if(entryFont == null) entryFont = jEdit.getFontProperty("metal.secondary.font"); groupFont = entryFont.deriveFont(Font.BOLD); } @Override protected TreeCellRenderer newInstance() { return new Renderer(); } @Override protected void configureTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; if(node.getParent() == tree.getModel().getRoot()) setFont(groupFont); else setFont(entryFont); setIcon(null); } private Font entryFont; private Font groupFont; } //}}} }