package ctagsinterface.main; import java.util.ArrayList; import javax.swing.JOptionPane; import org.gjt.sp.jedit.EditAction; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.jEdit; import ctagsinterface.options.ActionsOptionPane; import ctagsinterface.projects.ProjectWatcher; public class QueryAction extends EditAction { private static int MAX_RESULTS = 1000; public enum QueryType { JUMP_TO_TAG("Jump to tag"), SEARCH_SUBSTRING("Search substring"), SEARCH_PREFIX("Search prefix"); private QueryType(String txt) { text = txt; } public final String text; }; public static final String TAG = "{tag}"; public static final String PROJECT = "{project}"; public static final String FILE = "{file}"; private String query; private String desc; private QueryType queryType; private boolean callImmediately; public QueryAction(String name, String query, QueryType queryType, boolean showImmediately) { super(name); jEdit.setTemporaryProperty(name + ".label", name); this.query = query; this.queryType = queryType; this.callImmediately = showImmediately; desc = getDesc(); } public QueryAction(int index) { super(jEdit.getProperty(ActionsOptionPane.ACTIONS + index + ".name")); jEdit.setTemporaryProperty(getName() + ".label", getName()); String base= ActionsOptionPane.ACTIONS + index + "."; query = jEdit.getProperty(base + "query"); String queryTypeString = jEdit.getProperty(base + "queryType"); if (queryTypeString == null || queryTypeString.length() == 0) queryType = QueryType.JUMP_TO_TAG; else queryType = QueryType.valueOf(queryTypeString); callImmediately = jEdit.getBooleanProperty(base + "callImmediately", false); desc = getDesc(); } private String getDesc() { return name + " (" + queryType.text + " - \"" + query + "\")"; } private String fillQueryParameters(View view) { ProjectWatcher pvi = CtagsInterfacePlugin.getProjectWatcher(); String project = (pvi == null) ? null : pvi.getActiveProject(view); if (project == null && query.contains(PROJECT)) { JOptionPane.showMessageDialog(view, "No active project exists"); return null; } String s = query; if (project != null) s = s.replace(PROJECT, project); s = s.replace(FILE, view.getBuffer().getPath()); if (s.contains(TAG)) { String tag = CtagsInterfacePlugin.getDestinationTag(view); if (tag == null) { JOptionPane.showMessageDialog(view, "No tag selected nor identified at caret"); return null; } s = s.replace(TAG, tag); } return s; } @Override public void invoke(View view) { String s = fillQueryParameters(view); switch (queryType) { case JUMP_TO_TAG: ArrayList<Tag> tags = new ArrayList<Tag>(); CtagsInterfacePlugin.getIndex().queryTags(s, MAX_RESULTS, tags); CtagsInterfacePlugin.jumpToTags(view, tags); break; case SEARCH_PREFIX: new QuickSearchTagDialog(view, QuickSearchTagDialog.Mode.PREFIX, name, s, callImmediately); break; case SEARCH_SUBSTRING: new QuickSearchTagDialog(view, QuickSearchTagDialog.Mode.SUBSTRING, name, s, callImmediately); break; } } public String toString() { return desc; } public String getQuery() { return query; } public QueryType getQueryType() { return queryType; } public boolean isShowImmediately() { return callImmediately; } public void save(int index) { String base = ActionsOptionPane.ACTIONS + index + "."; jEdit.setProperty(base + "name", getName()); jEdit.setProperty(base + "query", query); jEdit.setProperty(base + "queryType", queryType.toString()); jEdit.setBooleanProperty(base + "callImmediately", callImmediately); } }