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.MiscUtilities; import org.gjt.sp.jedit.jEdit; 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") public class DirsOptionPane extends AbstractOptionPane { static public final String OPTION = CtagsInterfacePlugin.OPTION; static public final String MESSAGE = CtagsInterfacePlugin.MESSAGE; static public final String DIRS = OPTION + "dirs."; JList dirs; DefaultListModel dirsModel; private DefaultListModel archivesModel; private JList archives; public DirsOptionPane() { super("CtagsInterface-Dirs"); setBorder(new EmptyBorder(5, 5, 5, 5)); dirsModel = new DefaultListModel(); Vector<String> trees = getDirs(); for (int i = 0; i < trees.size(); i++) dirsModel.addElement(trees.get(i)); dirs = new JList(dirsModel); JScrollPane scroller = new JScrollPane(dirs); scroller.setBorder(BorderFactory.createTitledBorder( jEdit.getProperty(MESSAGE + "dirs"))); addComponent(scroller, GridBagConstraints.HORIZONTAL); JPanel buttons = new JPanel(); JButton add = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); buttons.add(add); JButton remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); buttons.add(remove); JButton tag = new JButton("Tag"); buttons.add(tag); addComponent(buttons); archivesModel = new DefaultListModel(); Vector<String> archiveFiles = getArchives(); for (int i = 0; i < archiveFiles.size(); i++) archivesModel.addElement(archiveFiles.get(i)); archives = new JList(archivesModel); scroller = new JScrollPane(archives); scroller.setBorder(BorderFactory.createTitledBorder( jEdit.getProperty(MESSAGE + "archives"))); addComponent(scroller, GridBagConstraints.HORIZONTAL); buttons = new JPanel(); JButton addArchive = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); buttons.add(addArchive); JButton removeArchive = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); buttons.add(removeArchive); JButton tagArchive = new JButton("Tag"); buttons.add(tagArchive);// TODO: tagArchive action? addComponent(buttons); add.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { VFSFileChooserDialog chooser = new VFSFileChooserDialog( GUIUtilities.getParentDialog(DirsOptionPane.this), jEdit.getActiveView(), null, VFSBrowser.CHOOSE_DIRECTORY_DIALOG, false, false); chooser.setTitle("Select root of source tree"); chooser.setVisible(true); if (chooser.getSelectedFiles() == null) return; String dir = chooser.getSelectedFiles()[0]; if (dirsModel.contains(MiscUtilities.resolveSymlinks(dir))) return; dirsModel.addElement(MiscUtilities.resolveSymlinks(dir)); } }); remove.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int i = dirs.getSelectedIndex(); if (i >= 0) dirsModel.removeElementAt(i); } }); tag.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int i = dirs.getSelectedIndex(); if (i >= 0) { String tree = (String) dirsModel.getElementAt(i); CtagsInterfacePlugin.refreshOrigin(OriginType.DIRECTORY, tree); } } }); addArchive.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { VFSFileChooserDialog chooser = new VFSFileChooserDialog( GUIUtilities.getParentDialog(DirsOptionPane.this), jEdit.getActiveView(), null, VFSBrowser.OPEN_DIALOG, false, false); chooser.setTitle("Select source archive"); chooser.setVisible(true); if (chooser.getSelectedFiles() == null) return; String archive = chooser.getSelectedFiles()[0]; if (! VFSHelper.checkArchiveVFS(archive) || archivesModel.contains(archive)) return; archivesModel.addElement(archive); } }); removeArchive.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int i = archives.getSelectedIndex(); if (i >= 0) archivesModel.removeElementAt(i); } }); } 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); } @Override protected void _save() { saveOrigins(OriginType.DIRECTORY, dirsModel); saveOrigins(OriginType.ARCHIVE, archivesModel); } static public Vector<String> getDirs() { Vector<String> dirs = new Vector<String>(); CtagsInterfacePlugin.getIndex().getOrigins(OriginType.DIRECTORY, dirs); return dirs; } static public Vector<String> getArchives() { Vector<String> archives = new Vector<String>(); CtagsInterfacePlugin.getIndex().getOrigins(OriginType.ARCHIVE, archives); return archives; } }