package ctagsinterface.options;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.border.Border;
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.gui.RolloverButton;
import org.gjt.sp.util.StandardUtilities;
import ctagsinterface.index.TagIndex.OriginType;
import ctagsinterface.main.CtagsInterfacePlugin;
import ctagsinterface.projects.ProjectWatcher;
@SuppressWarnings("serial")
public class ProjectsOptionPane extends AbstractOptionPane
{
static public final String OPTION = CtagsInterfacePlugin.OPTION;
static public final String MESSAGE = CtagsInterfacePlugin.MESSAGE;
static public final String PROJECTS = OPTION + "projects.";
static public final String TRACK_PROJECTS = OPTION + "trackProjectList";
static public final String AUTO_UPDATE = OPTION + "autoUpdateProjects";
static public final String GLOBAL = OPTION + "searchGlobally";
static public final String ACTIVE_ONLY = OPTION + "searchActiveProjectOnly";
static public final String ACTIVE_AND_DEPS = OPTION + "searchActiveProjectAndDeps";
static public final String ACTIVE_FIRST = OPTION + "searchActiveProjectFirst";
JList projects;
DefaultListModel projectsModel;
ProjectWatcher pvi;
JCheckBox trackProjectList;
JCheckBox autoUpdate;
JRadioButton global;
JRadioButton activeOnly;
JRadioButton activeAndDeps;
JRadioButton activeFirst;
public ProjectsOptionPane()
{
super("CtagsInterface-Projects");
setBorder(new EmptyBorder(5, 5, 5, 5));
projectsModel = new DefaultListModel();
Vector<String> trees = getProjects();
for (int i = 0; i < trees.size(); i++)
projectsModel.addElement(trees.get(i));
projects = new JList(projectsModel);
JScrollPane scroller = new JScrollPane(projects);
scroller.setBorder(BorderFactory.createTitledBorder(
jEdit.getProperty(MESSAGE + "projects")));
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);
trackProjectList = new JCheckBox(jEdit.getProperty(MESSAGE + "trackProjectList"),
jEdit.getBooleanProperty(TRACK_PROJECTS));
addComponent(trackProjectList);
autoUpdate = new JCheckBox(jEdit.getProperty(MESSAGE + "autoUpdateProjects"),
jEdit.getBooleanProperty(AUTO_UPDATE));
addComponent(autoUpdate);
JPanel p = new JPanel(new GridLayout(0, 1));
Border b = BorderFactory.createTitledBorder(jEdit.getProperty(MESSAGE + "searchScope"));
p.setBorder(b);
addComponent(p);
ButtonGroup g = new ButtonGroup();
global = new JRadioButton(jEdit.getProperty(MESSAGE + "searchGlobally"),
jEdit.getBooleanProperty(GLOBAL));
p.add(global);
g.add(global);
activeOnly = new JRadioButton(jEdit.getProperty(MESSAGE + "searchActiveProjectOnly"),
jEdit.getBooleanProperty(ACTIVE_ONLY));
p.add(activeOnly);
g.add(activeOnly);
activeAndDeps = new JRadioButton(jEdit.getProperty(MESSAGE + "searchActiveProjectAndDeps"),
jEdit.getBooleanProperty(ACTIVE_AND_DEPS));
p.add(activeAndDeps);
g.add(activeAndDeps);
activeFirst = new JRadioButton(jEdit.getProperty(MESSAGE + "searchActiveProjectFirst"),
jEdit.getBooleanProperty(ACTIVE_FIRST));
p.add(activeFirst);
g.add(activeFirst);
pvi = CtagsInterfacePlugin.getProjectWatcher();
if (pvi == null)
{
add.setEnabled(false);
tag.setEnabled(false);
}
else
{
add.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
Vector<String> nameVec = pvi.getProjects();
String [] names = new String[nameVec.size()];
nameVec.toArray(names);
Arrays.sort(names, new StandardUtilities.StringCompare<String>(true));
String selected = (String) JOptionPane.showInputDialog(
ProjectsOptionPane.this, "Select project:", "Projects",
JOptionPane.QUESTION_MESSAGE, null, names, names[0]);
if (selected != null && !projectsModel.contains(selected))
projectsModel.addElement(selected);
}
});
tag.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
int i = projects.getSelectedIndex();
if (i >= 0)
{
String project = (String) projectsModel.getElementAt(i);
CtagsInterfacePlugin.refreshOrigin(OriginType.PROJECT,
project);
}
}
});
}
remove.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
int i = projects.getSelectedIndex();
if (i >= 0)
projectsModel.removeElementAt(i);
}
});
}
@Override
protected void _save()
{
Vector<String> names = new Vector<String>();
int nProjects = projectsModel.size();
for (int i = 0; i < nProjects; i++)
names.add((String) projectsModel.getElementAt(i));
CtagsInterfacePlugin.updateOrigins(OriginType.PROJECT, names);
jEdit.setBooleanProperty(TRACK_PROJECTS, trackProjectList.isSelected());
jEdit.setBooleanProperty(AUTO_UPDATE, autoUpdate.isSelected());
jEdit.setBooleanProperty(GLOBAL, global.isSelected());
jEdit.setBooleanProperty(ACTIVE_ONLY, activeOnly.isSelected());
jEdit.setBooleanProperty(ACTIVE_AND_DEPS, activeAndDeps.isSelected());
jEdit.setBooleanProperty(ACTIVE_FIRST, activeFirst.isSelected());
}
static public Vector<String> getProjects()
{
Vector<String> projects = new Vector<String>();
CtagsInterfacePlugin.getIndex().getOrigins(OriginType.PROJECT, projects);
return projects;
}
static public boolean getTrackProjectList()
{
return jEdit.getBooleanProperty(TRACK_PROJECTS);
}
static public boolean getAutoUpdateProjects()
{
return jEdit.getBooleanProperty(AUTO_UPDATE);
}
static public boolean getSearchGlobally()
{
return jEdit.getBooleanProperty(GLOBAL);
}
static public boolean getSearchActiveProjectOnly()
{
return jEdit.getBooleanProperty(ACTIVE_ONLY);
}
static public boolean getSearchActiveProjectAndDeps()
{
return jEdit.getBooleanProperty(ACTIVE_AND_DEPS);
}
static public boolean getSearchActiveProjectFirst()
{
return jEdit.getBooleanProperty(ACTIVE_FIRST);
}
}