package ctagsinterface.options; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder; import org.gjt.sp.jedit.AbstractOptionPane; import org.gjt.sp.jedit.GUIUtilities; import org.gjt.sp.jedit.jEdit; import org.gjt.sp.jedit.Macros; import org.gjt.sp.jedit.browser.VFSBrowser; import org.gjt.sp.jedit.browser.VFSFileChooserDialog; import org.gjt.sp.jedit.gui.RolloverButton; import ctagsinterface.index.TagIndex.OriginType; import ctagsinterface.main.CtagsInterfacePlugin; import ctagsinterface.main.VFSHelper; @SuppressWarnings("serial") /** * Pane for adding and removing tag files and individual source files */ public class FilesOptionPane extends AbstractOptionPane { static public final String OPTION = CtagsInterfacePlugin.OPTION; static public final String MESSAGE = CtagsInterfacePlugin.MESSAGE; static public final String TagFiles = OPTION + "TagFiles."; static public final String SourceFiles = OPTION + "SourceFiles."; private JList tagFiles; private DefaultListModel tagFilesModel; private JList sourceFiles; private DefaultListModel sourceFilesModel; public FilesOptionPane() { super("CtagsInterface-Files"); setBorder(new EmptyBorder(5, 5, 5, 5)); sourceFilesModel = new DefaultListModel(); Vector<String> SourceFileList = getSourceFiles(); for (int i = 0; i < SourceFileList.size(); i++) sourceFilesModel.addElement(SourceFileList.get(i)); sourceFiles = new JList(sourceFilesModel); JScrollPane sourceScroller = new JScrollPane(sourceFiles); sourceScroller.setBorder(BorderFactory.createTitledBorder( jEdit.getProperty(MESSAGE + "sourceFiles"))); addComponent(sourceScroller, GridBagConstraints.HORIZONTAL); JPanel sourceButtons = new JPanel(); JButton addSourceFile = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); sourceButtons.add(addSourceFile); JButton removeSourceFile = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); sourceButtons.add(removeSourceFile); JButton tagSourceFile = new JButton("Tag"); sourceButtons.add(tagSourceFile); addComponent(sourceButtons); addSourceFile.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { VFSFileChooserDialog chooser = new VFSFileChooserDialog( GUIUtilities.getParentDialog(FilesOptionPane.this), jEdit.getActiveView(), null, VFSBrowser.OPEN_DIALOG, false, false); chooser.setTitle("Select tag file"); chooser.setVisible(true); if (chooser.getSelectedFiles() == null) return; String SourceFilePath = chooser.getSelectedFiles()[0]; if (!sourceFilesModel.contains(SourceFilePath)) sourceFilesModel.addElement(SourceFilePath); } }); removeSourceFile.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int i = sourceFiles.getSelectedIndex(); if (i >= 0) sourceFilesModel.removeElementAt(i); } }); tagSourceFile.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int i = sourceFiles.getSelectedIndex(); if (i >= 0) { String sourceFilePath = (String) sourceFilesModel.getElementAt(i); CtagsInterfacePlugin.addFile(jEdit.getActiveView(), sourceFilePath); } } }); setBorder(new EmptyBorder(5, 5, 5, 5)); tagFilesModel = new DefaultListModel(); Vector<String> tagFileList = getTagFiles(); for (int i = 0; i < tagFileList.size(); i++) tagFilesModel.addElement(tagFileList.get(i)); tagFiles = new JList(tagFilesModel); JScrollPane tagFileScroller = new JScrollPane(tagFiles); tagFileScroller.setBorder(BorderFactory.createTitledBorder( jEdit.getProperty(MESSAGE + "tagFiles"))); addComponent(tagFileScroller, GridBagConstraints.HORIZONTAL); JPanel tagFileButtons = new JPanel(); JButton addTagFile = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); tagFileButtons.add(addTagFile); JButton removeTagFile = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); tagFileButtons.add(removeTagFile); JButton tagTagFile = new JButton("Tag"); tagFileButtons.add(tagTagFile); addComponent(tagFileButtons); addTagFile.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { VFSFileChooserDialog chooser = new VFSFileChooserDialog( GUIUtilities.getParentDialog(FilesOptionPane.this), jEdit.getActiveView(), null, VFSBrowser.OPEN_DIALOG, false, false); chooser.setTitle("Select tag file"); chooser.setVisible(true); if (chooser.getSelectedFiles() == null) return; String tagFilePath = chooser.getSelectedFiles()[0]; if (!VFSHelper.checkFileExtension(tagFilePath, "tag")) { Macros.message(jEdit.getActiveView(), "File name needs to end with \".tag\""); return; } if (!tagFilesModel.contains(tagFilePath)) tagFilesModel.addElement(tagFilePath); } }); removeTagFile.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int i = tagFiles.getSelectedIndex(); if (i >= 0) tagFilesModel.removeElementAt(i); } }); tagTagFile.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int i = tagFiles.getSelectedIndex(); if (i >= 0) { String tagFile = (String) tagFilesModel.getElementAt(i); CtagsInterfacePlugin.addTagFile(tagFile); } } }); } public void saveOrigins(OriginType origin, DefaultListModel model) { Vector<String> names = new Vector<String>(); int nItems = model.size(); for (int i = 0; i < nItems; i++) names.add((String) model.getElementAt(i)); CtagsInterfacePlugin.updateOrigins(origin, names); } public void saveSourceFiles(DefaultListModel model) { Vector<String> sourceFiles = getSourceFiles(); // Remove obsolete files for (String sf : sourceFiles) { if (!sourceFilesModel.contains(sf)) { CtagsInterfacePlugin.deleteFile(jEdit.getActiveView(), sf); } } // Add new files for (int i = 0; i < sourceFilesModel.size(); i++) { String sf = sourceFilesModel.getElementAt(i).toString(); if (!sourceFiles.contains(sf)) { CtagsInterfacePlugin.addFile(jEdit.getActiveView(), sf); } } } @Override protected void _save() { saveOrigins(OriginType.TAGFILE, tagFilesModel); saveSourceFiles(sourceFilesModel); } static public Vector<String> getTagFiles() { return CtagsInterfacePlugin.getIndex().getOrigins(OriginType.TAGFILE); } static public Vector<String> getSourceFiles() { return CtagsInterfacePlugin.getIndex().getFilesOfOrigin(OriginType.MISC); } }