PageRenderTime 53ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/org.erlide.ui/src/org/erlide/ui/internal/search/ErlangSearchResultPage.java

https://github.com/fhix/erlide
Java | 360 lines | 282 code | 41 blank | 37 comment | 35 complexity | e674e12f37543f2abeeaa6a1896f90d0 MD5 | raw file
  1. package org.erlide.ui.internal.search;
  2. import java.text.MessageFormat;
  3. import org.eclipse.core.resources.IContainer;
  4. import org.eclipse.core.resources.IMarker;
  5. import org.eclipse.core.runtime.CoreException;
  6. import org.eclipse.jface.action.IMenuManager;
  7. import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
  8. import org.eclipse.jface.viewers.ILabelProvider;
  9. import org.eclipse.jface.viewers.IStructuredContentProvider;
  10. import org.eclipse.jface.viewers.ITreeContentProvider;
  11. import org.eclipse.jface.viewers.OpenEvent;
  12. import org.eclipse.jface.viewers.StructuredViewer;
  13. import org.eclipse.jface.viewers.TableViewer;
  14. import org.eclipse.jface.viewers.TreeViewer;
  15. import org.eclipse.jface.viewers.Viewer;
  16. import org.eclipse.jface.viewers.ViewerComparator;
  17. import org.eclipse.search.ui.ISearchResultViewPart;
  18. import org.eclipse.search.ui.NewSearchUI;
  19. import org.eclipse.search.ui.text.AbstractTextSearchResult;
  20. import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
  21. import org.eclipse.search.ui.text.Match;
  22. import org.eclipse.ui.IEditorPart;
  23. import org.eclipse.ui.IMemento;
  24. import org.eclipse.ui.IPageLayout;
  25. import org.eclipse.ui.PartInitException;
  26. import org.eclipse.ui.PlatformUI;
  27. import org.eclipse.ui.actions.ActionContext;
  28. import org.eclipse.ui.actions.ActionGroup;
  29. import org.eclipse.ui.ide.IDE;
  30. import org.eclipse.ui.part.IPageSite;
  31. import org.eclipse.ui.part.IShowInTargetList;
  32. import org.erlide.core.model.erlang.IErlModule;
  33. import org.erlide.core.services.builder.MarkerUtils;
  34. import org.erlide.ui.editors.erl.ErlangEditor;
  35. import org.erlide.ui.editors.util.EditorUtility;
  36. public class ErlangSearchResultPage extends AbstractTextSearchViewPage {
  37. @Override
  38. protected void handleOpen(final OpenEvent event) {
  39. super.handleOpen(event);
  40. }
  41. public static class DecoratorIgnoringViewerSorter extends ViewerComparator {
  42. private final ILabelProvider fLabelProvider;
  43. public DecoratorIgnoringViewerSorter(final ILabelProvider labelProvider) {
  44. fLabelProvider = labelProvider;
  45. }
  46. @Override
  47. public int category(final Object element) {
  48. if (element instanceof IContainer) {
  49. return 1;
  50. }
  51. return 2;
  52. }
  53. @SuppressWarnings("unchecked")
  54. @Override
  55. public int compare(final Viewer viewer, final Object e1, final Object e2) {
  56. final int cat1 = category(e1);
  57. final int cat2 = category(e2);
  58. if (cat1 != cat2) {
  59. return cat1 - cat2;
  60. }
  61. String name1 = fLabelProvider.getText(e1);
  62. String name2 = fLabelProvider.getText(e2);
  63. if (name1 == null) {
  64. name1 = "";//$NON-NLS-1$
  65. }
  66. if (name2 == null) {
  67. name2 = "";//$NON-NLS-1$
  68. }
  69. return getComparator().compare(name1, name2);
  70. }
  71. }
  72. private static final String KEY_SORTING = "org.eclipse.search.resultpage.sorting"; //$NON-NLS-1$
  73. private static final String KEY_LIMIT = "org.eclipse.search.resultpage.limit"; //$NON-NLS-1$
  74. private static final int DEFAULT_ELEMENT_LIMIT = 1000;
  75. private ActionGroup fActionGroup;
  76. private int fCurrentSortOrder;
  77. // private final SortAction fSortByNameAction;
  78. // private final SortAction fSortByPathAction;
  79. private IErlSearchContentProvider fContentProvider;
  80. // private final EditorOpener fEditorOpener = new EditorOpener();
  81. private static final String[] SHOW_IN_TARGETS = new String[] { IPageLayout.ID_PROJECT_EXPLORER };
  82. private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
  83. @SuppressWarnings("synthetic-access")
  84. public String[] getShowInTargetIds() {
  85. return SHOW_IN_TARGETS;
  86. }
  87. };
  88. private SearchResultLabelProvider innerLabelProvider = null;
  89. public ErlangSearchResultPage() {
  90. // fSortByNameAction = new SortAction(
  91. // SearchMessages.FileSearchPage_sort_name_label, this,
  92. // FileLabelProvider.SHOW_LABEL_PATH);
  93. // fSortByPathAction = new SortAction(
  94. // SearchMessages.FileSearchPage_sort_path_label, this,
  95. // FileLabelProvider.SHOW_PATH_LABEL);
  96. setElementLimit(Integer.valueOf(DEFAULT_ELEMENT_LIMIT));
  97. }
  98. @Override
  99. public void setElementLimit(final Integer elementLimit) {
  100. super.setElementLimit(elementLimit);
  101. final int limit = elementLimit.intValue();
  102. getSettings().put(KEY_LIMIT, limit);
  103. }
  104. @Override
  105. public StructuredViewer getViewer() {
  106. return super.getViewer();
  107. }
  108. private void addDragAdapters(final StructuredViewer viewer) {
  109. // final Transfer[] transfers = new Transfer[] { ResourceTransfer
  110. // .getInstance() };
  111. // final int ops = DND.DROP_COPY | DND.DROP_LINK;
  112. // viewer.addDragSupport(ops, transfers, new
  113. // ResourceTransferDragAdapter(
  114. // viewer));
  115. }
  116. @Override
  117. protected void configureTableViewer(final TableViewer viewer) {
  118. viewer.setUseHashlookup(true);
  119. viewer.setLabelProvider(new DecoratingStyledCellLabelProvider(
  120. getInnerLabelProvider(), PlatformUI.getWorkbench()
  121. .getDecoratorManager().getLabelDecorator(), null));
  122. viewer.setContentProvider(new ErlangSearchTableContentProvider(this));
  123. viewer.setComparator(new DecoratorIgnoringViewerSorter(
  124. getInnerLabelProvider()));
  125. fContentProvider = (IErlSearchContentProvider) viewer
  126. .getContentProvider();
  127. addDragAdapters(viewer);
  128. }
  129. private SearchResultLabelProvider getInnerLabelProvider() {
  130. if (innerLabelProvider == null) {
  131. innerLabelProvider = new SearchResultLabelProvider(this,
  132. fCurrentSortOrder, false);
  133. }
  134. return innerLabelProvider;
  135. }
  136. @Override
  137. protected void configureTreeViewer(final TreeViewer viewer) {
  138. viewer.setUseHashlookup(true);
  139. innerLabelProvider = new SearchResultLabelProvider(this,
  140. SearchResultLabelProvider.SHOW_LABEL, true);
  141. viewer.setLabelProvider(new DecoratingStyledCellLabelProvider(
  142. innerLabelProvider, PlatformUI.getWorkbench()
  143. .getDecoratorManager().getLabelDecorator(), null));
  144. viewer.setContentProvider(new ErlangSearchTreeContentProvider(viewer,
  145. this));
  146. viewer.setComparator(new DecoratorIgnoringViewerSorter(
  147. innerLabelProvider));
  148. fContentProvider = (IErlSearchContentProvider) viewer
  149. .getContentProvider();
  150. addDragAdapters(viewer);
  151. }
  152. @Override
  153. protected void showMatch(final Match match, final int offset,
  154. final int length, final boolean activate) throws PartInitException {
  155. final Object element = match.getElement();
  156. if (element instanceof ErlangSearchElement) {
  157. final ErlangSearchElement ese = (ErlangSearchElement) element;
  158. final IErlModule module = ese.getModule();
  159. final IEditorPart editor = EditorUtility.openInEditor(module);
  160. if (offset != 0) {
  161. if (editor instanceof ErlangEditor) {
  162. final ErlangEditor ee = (ErlangEditor) editor;
  163. ee.selectAndReveal(offset, length);
  164. } else if (editor != null) {
  165. showWithMarker(editor, module, offset, length);
  166. }
  167. }
  168. }
  169. }
  170. private void showWithMarker(final IEditorPart editor,
  171. final IErlModule module, final int offset, final int length)
  172. throws PartInitException {
  173. IMarker marker = null;
  174. try {
  175. marker = MarkerUtils.createSearchResultMarker(module,
  176. NewSearchUI.SEARCH_MARKER, offset, length);
  177. IDE.gotoMarker(editor, marker);
  178. } catch (final CoreException e) {
  179. throw new PartInitException(
  180. "SearchMessages.FileSearchPage_error_marker", e);
  181. } finally {
  182. if (marker != null) {
  183. try {
  184. marker.delete();
  185. } catch (final CoreException e) {
  186. // ignore
  187. }
  188. }
  189. }
  190. }
  191. protected boolean hasChildren(final Object element) {
  192. final ITreeContentProvider contentProvider = (ITreeContentProvider) getViewer()
  193. .getContentProvider();
  194. return contentProvider.hasChildren(element);
  195. }
  196. @Override
  197. protected void fillContextMenu(final IMenuManager mgr) {
  198. super.fillContextMenu(mgr);
  199. addSortActions(mgr);
  200. fActionGroup.setContext(new ActionContext(getSite()
  201. .getSelectionProvider().getSelection()));
  202. fActionGroup.fillContextMenu(mgr);
  203. }
  204. private void addSortActions(final IMenuManager mgr) {
  205. if (getLayout() != FLAG_LAYOUT_FLAT) {
  206. return;
  207. }
  208. // final MenuManager sortMenu = new MenuManager(
  209. // "Sort by");
  210. // sortMenu.add(fSortByNameAction);
  211. // sortMenu.add(fSortByPathAction);
  212. //
  213. // fSortByNameAction.setChecked(fCurrentSortOrder == fSortByNameAction
  214. // .getSortOrder());
  215. // fSortByPathAction.setChecked(fCurrentSortOrder == fSortByPathAction
  216. // .getSortOrder());
  217. //
  218. // mgr.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP,
  219. // sortMenu);
  220. }
  221. @Override
  222. public void setViewPart(final ISearchResultViewPart part) {
  223. super.setViewPart(part);
  224. fActionGroup = new NewErlSearchActionGroup(part);
  225. }
  226. @Override
  227. public void init(final IPageSite site) {
  228. super.init(site);
  229. // final IMenuManager menuManager =
  230. // site.getActionBars().getMenuManager();
  231. // menuManager.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES,
  232. // new OpenSearchPreferencesAction());
  233. }
  234. @Override
  235. public void dispose() {
  236. fActionGroup.dispose();
  237. super.dispose();
  238. }
  239. @Override
  240. protected void elementsChanged(final Object[] objects) {
  241. if (fContentProvider != null) {
  242. fContentProvider.elementsChanged(objects);
  243. }
  244. }
  245. @Override
  246. protected void clear() {
  247. if (fContentProvider != null) {
  248. fContentProvider.clear();
  249. }
  250. }
  251. public void setSortOrder(final int sortOrder) {
  252. fCurrentSortOrder = sortOrder;
  253. // final DecoratingLabelProvider lpWrapper = (DecoratingLabelProvider)
  254. // getViewer()
  255. // .getLabelProvider();
  256. // FIXME ((LabelProvider)
  257. // lpWrapper.getLabelProvider()).setOrder(sortOrder);
  258. getViewer().refresh();
  259. getSettings().put(KEY_SORTING, fCurrentSortOrder);
  260. }
  261. @Override
  262. public void restoreState(final IMemento memento) {
  263. super.restoreState(memento);
  264. try {
  265. fCurrentSortOrder = getSettings().getInt(KEY_SORTING);
  266. } catch (final NumberFormatException e) {
  267. fCurrentSortOrder = SearchResultLabelProvider.SHOW_LABEL_PATH;
  268. }
  269. int elementLimit = DEFAULT_ELEMENT_LIMIT;
  270. try {
  271. elementLimit = getSettings().getInt(KEY_LIMIT);
  272. } catch (final NumberFormatException e) {
  273. }
  274. if (memento != null) {
  275. Integer value = memento.getInteger(KEY_SORTING);
  276. if (value != null) {
  277. fCurrentSortOrder = value.intValue();
  278. }
  279. value = memento.getInteger(KEY_LIMIT);
  280. if (value != null) {
  281. elementLimit = value.intValue();
  282. }
  283. }
  284. setElementLimit(Integer.valueOf(elementLimit));
  285. }
  286. @Override
  287. public void saveState(final IMemento memento) {
  288. super.saveState(memento);
  289. memento.putInteger(KEY_SORTING, fCurrentSortOrder);
  290. memento.putInteger(KEY_LIMIT, getElementLimit().intValue());
  291. }
  292. public Object getAdapter(final Class<?> adapter) {
  293. if (IShowInTargetList.class.equals(adapter)) {
  294. return SHOW_IN_TARGET_LIST;
  295. }
  296. return null;
  297. }
  298. @Override
  299. public String getLabel() {
  300. final String label = super.getLabel();
  301. final StructuredViewer viewer = getViewer();
  302. if (viewer instanceof TableViewer) {
  303. final TableViewer tv = (TableViewer) viewer;
  304. final AbstractTextSearchResult result = getInput();
  305. if (result != null) {
  306. final int itemCount = ((IStructuredContentProvider) tv
  307. .getContentProvider()).getElements(getInput()).length;
  308. final int fileCount = getInput().getElements().length;
  309. if (itemCount < fileCount) {
  310. final String format = "{0} (showing {1} of {2} files)";
  311. return MessageFormat.format(format, label,
  312. Integer.valueOf(itemCount),
  313. Integer.valueOf(fileCount));
  314. }
  315. }
  316. }
  317. return label;
  318. }
  319. }