Source code: com/port80/eclipse/jdt/history/GotoVisitedAction.java
1 package com.port80.eclipse.jdt.history;
2
3 import java.util.Arrays;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import org.eclipse.jface.action.Action;
8 import org.eclipse.jface.action.IAction;
9 import org.eclipse.jface.action.IMenuCreator;
10 import org.eclipse.jface.action.IStatusLineManager;
11 import org.eclipse.jface.viewers.ISelection;
12 import org.eclipse.swt.SWT;
13 import org.eclipse.swt.events.ArmEvent;
14 import org.eclipse.swt.events.ArmListener;
15 import org.eclipse.swt.events.MenuAdapter;
16 import org.eclipse.swt.events.MenuEvent;
17 import org.eclipse.swt.events.SelectionAdapter;
18 import org.eclipse.swt.events.SelectionEvent;
19 import org.eclipse.swt.widgets.Control;
20 import org.eclipse.swt.widgets.Menu;
21 import org.eclipse.swt.widgets.MenuItem;
22 import org.eclipse.ui.IWorkbenchWindow;
23 import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;
24 import org.eclipse.ui.internal.Workbench;
25 import org.eclipse.ui.internal.WorkbenchWindow;
26
27 import com.port80.eclipse.jdt.JdtPlugin;
28 import com.port80.eclipse.jdt.util.PersistentItem;
29 import com.port80.eclipse.util.NavigateHistory;
30 import com.port80.eclipse.util.UtilPluginImages;
31
32 /**
33 * Popup a dialog to let user choose the sort key from a list.
34 * @author chrisl
35 */
36 public class GotoVisitedAction extends Action implements IMenuCreator, IWorkbenchWindowPulldownDelegate {
37
38 private static final String NAME = "GotoVisitedAction";
39 private static final boolean DEBUG = true;
40
41 IWorkbenchWindow fWindow;
42
43 // private static final int HISTORY_MENU_LENGTH = 8;
44
45 /** Fast action is go back. */
46 public void run() {
47 //JdtPlugin.getNavHistory().goBack();
48 }
49
50 /**
51 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
52 */
53 public void run(IAction action) {
54 if (DEBUG)
55 System.err.println(NAME + ".run(IAction)");
56 }
57
58 /**
59 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
60 */
61 public void selectionChanged(IAction action, ISelection selection) {
62 if (DEBUG)
63 System.err.println(NAME + ".selectionChanged()");
64 }
65
66 /**
67 * Popup menu.
68 * Method declared on IWorkbenchWindowPulldownDelegate.
69 */
70 public Menu getMenu(Control parent) {
71 Menu menu = new Menu(parent);
72 return createMenu(menu);
73 }
74
75 /**
76 * Pulldown menu.
77 */
78 public Menu getMenu(Menu parent) {
79 Menu menu = new Menu(parent);
80 return createMenu(menu);
81 }
82
83 /* (non-Javadoc)
84 * Method declared on IWorkbenchWindowActionDelegate.
85 */
86 public void dispose() {
87 }
88
89 /* (non-Javadoc)
90 * Method declared on IWorkbenchWindowActionDelegate.
91 */
92 public void init(IWorkbenchWindow window) {
93 fWindow = window;
94 UtilPluginImages.setToolImageDescriptors(this, UtilPluginImages.IMG_GOTO);
95 setMenuCreator(this);
96 }
97
98 /**
99 * Creates the menu for the action
100 */
101 private Menu createMenu(Menu menu) {
102 // Add listener to repopulate the menu each time
103 // it is shown because of dynamic history list
104 menu.addMenuListener(new MenuAdapter() {
105 public void menuShown(MenuEvent e) {
106 Menu m = (Menu) e.widget;
107 MenuItem[] items = m.getItems();
108 for (int i = 0; i < items.length; i++)
109 items[i].dispose();
110 populateMenu(m);
111 }
112 });
113 return menu;
114 }
115
116 /**
117 * Populates the menu with its items
118 */
119 void populateMenu(Menu menu) {
120 final EditorHistory editorhistory = JdtPlugin.getEditorHistory();
121 if (editorhistory == null)
122 return;
123 final NavigateHistory history = editorhistory.getHistory();
124 // Add a menu item for each tool in the history.
125 Map map = new HashMap();
126 String sortedkey;
127 PersistentItem item;
128 int size;
129 int pos;
130 MenuItem mi;
131 //
132 size = history.visitedSize();
133 for (int i = 0; i < size; ++i) {
134 Object a = history.getVisited(i);
135 if (a instanceof PersistentItem) {
136 item = (PersistentItem) a;
137 //FIXME: See if this is too time consuming.
138 if (item.resolve() == null)
139 continue;
140 sortedkey = item.getName() + "\0" + item.toString();
141 map.put(sortedkey, new Integer(i));
142 }
143 }
144 Object[] sorted = map.keySet().toArray();
145 Arrays.sort(sorted);
146 mi = new MenuItem(menu, SWT.NONE);
147 mi.setText("Visited:");
148 mi.setEnabled(false);
149 for (int i = 0; i < sorted.length; ++i) {
150 mi = new MenuItem(menu, SWT.NONE);
151 sortedkey = (String) sorted[i];
152 pos = ((Integer) map.get(sortedkey)).intValue();
153 mi.setData(map.get(sortedkey));
154 sortedkey = sortedkey.substring(0, sortedkey.indexOf("\0"));
155 sortedkey = ((pos == size - 1) ? "->" : "- ") + sortedkey;
156 mi.setText(sortedkey);
157 mi.addArmListener(new ArmListener() {
158 public void widgetArmed(ArmEvent e) {
159 Integer n = (Integer) e.widget.getData();
160 PersistentItem a = (PersistentItem) history.getVisited(n.intValue());
161 Workbench workbench = (Workbench) JdtPlugin.getDefault().getWorkbench();
162 WorkbenchWindow window = (WorkbenchWindow) workbench.getActiveWorkbenchWindow();
163 IStatusLineManager status = window.getActionBars().getStatusLineManager();
164 status.setMessage(a.getFullPath());
165 }
166 });
167 mi.addSelectionListener(new SelectionAdapter() {
168 public void widgetSelected(SelectionEvent e) {
169 Integer n = (Integer) e.widget.getData();
170 history.gotoVisited(n.intValue());
171 }
172 });
173 }
174 //
175 size = history.historySize();
176 if (size > 0) {
177 new MenuItem(menu, SWT.SEPARATOR);
178 mi = new MenuItem(menu, SWT.NONE);
179 mi.setText("History:");
180 mi.setEnabled(false);
181 pos = history.historyPos();
182 int start = 0; // Math.max(0, size - HISTORY_MENU_LENGTH);
183 for (int i = start; i < history.historySize(); ++i) {
184 Object a = history.getHistory(i);
185 if (!(a instanceof PersistentItem))
186 continue;
187 item = (PersistentItem) a;
188 mi = new MenuItem(menu, SWT.NONE);
189 sortedkey = ((i == pos) ? "->" : "- ") + item.getName();
190 mi.setText(sortedkey);
191 mi.setData(new Integer(i));
192 mi.addArmListener(new ArmListener() {
193 public void widgetArmed(ArmEvent e) {
194 Integer n = (Integer) e.widget.getData();
195 PersistentItem a = (PersistentItem) history.getHistory(n.intValue());
196 Workbench workbench = (Workbench) JdtPlugin.getDefault().getWorkbench();
197 WorkbenchWindow window =
198 (WorkbenchWindow) workbench.getActiveWorkbenchWindow();
199 IStatusLineManager status =
200 window.getActionBars().getStatusLineManager();
201 status.setMessage(a.getFullPath());
202 }
203 });
204 mi.addSelectionListener(new SelectionAdapter() {
205 public void widgetSelected(SelectionEvent e) {
206 Integer n = (Integer) e.widget.getData();
207 history.gotoHistory(n.intValue());
208 }
209 });
210 }
211 }
212 }
213
214 ////////////////////////////////////////////////////////////////////////
215 }