OSDN Git Service

rename
[moreemacs/moreemacs.git] / jp.sourceforge.moreemacs.exp / src / jp / sourceforge / moreemacs / exp / NextErrorHandler.java
1 package jp.sourceforge.moreemacs.exp;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\r
5 \r
6 import org.eclipse.core.commands.AbstractHandler;\r
7 import org.eclipse.core.commands.ExecutionEvent;\r
8 import org.eclipse.core.commands.ExecutionException;\r
9 import org.eclipse.core.commands.NotEnabledException;\r
10 import org.eclipse.core.commands.NotHandledException;\r
11 import org.eclipse.core.commands.common.NotDefinedException;\r
12 import org.eclipse.core.resources.IMarker;\r
13 import org.eclipse.core.resources.IResource;\r
14 import org.eclipse.core.runtime.CoreException;\r
15 import org.eclipse.jface.util.OpenStrategy;\r
16 import org.eclipse.ui.IViewPart;\r
17 import org.eclipse.ui.IWorkbenchPage;\r
18 import org.eclipse.ui.IWorkbenchSite;\r
19 import org.eclipse.ui.PartInitException;\r
20 import org.eclipse.ui.handlers.HandlerUtil;\r
21 import org.eclipse.ui.handlers.IHandlerService;\r
22 import org.eclipse.ui.ide.IDE;\r
23 import org.eclipse.ui.views.markers.MarkerSupportView;\r
24 \r
25 public class NextErrorHandler extends AbstractHandler {\r
26 \r
27     @Override\r
28     public Object execute(ExecutionEvent event) throws ExecutionException {\r
29         IWorkbenchSite site = HandlerUtil.getActiveSite(event);\r
30         IWorkbenchPage page = site.getPage();\r
31 \r
32         MarkerSupportView problemView = (MarkerSupportView) page.findView("org.eclipse.ui.views.ProblemView");\r
33         @SuppressWarnings("restriction")\r
34         IMarker[] currentMarkers = problemView.getSelectedMarkers();\r
35         IMarker startPoint = (currentMarkers.length != 0)?currentMarkers[currentMarkers.length-1]:null;\r
36 \r
37         selectAll(problemView);\r
38         \r
39         @SuppressWarnings("restriction")\r
40         IMarker[] allMarkers = problemView.getSelectedMarkers();\r
41         goNextError(allMarkers, startPoint, page);\r
42 \r
43         return null;\r
44     }\r
45     \r
46     void selectAll(IViewPart view) throws ExecutionException {\r
47         view.getSite().getPage().activate(view);\r
48         IHandlerService handlerService = (IHandlerService)view.getSite().getService(IHandlerService.class);\r
49         try {\r
50             handlerService.executeCommand("org.eclipse.ui.edit.selectAll", null);\r
51         } catch (NotDefinedException e) {\r
52             throw new ExecutionException(e.getMessage(), e);\r
53         } catch (NotEnabledException e) {\r
54             throw new ExecutionException(e.getMessage(), e);\r
55         } catch (NotHandledException e) {\r
56             throw new ExecutionException(e.getMessage(), e);\r
57         }\r
58     }\r
59 \r
60     void goNextError(IMarker[] allMarkers, IMarker startPoint, IWorkbenchPage page) throws ExecutionException {\r
61         boolean found = false;\r
62         List<IMarker> skipped = new ArrayList<IMarker>();\r
63         for(IMarker marker: allMarkers) {\r
64             if(!marker.exists()) {\r
65                 continue;\r
66             }\r
67             if(startPoint != null && startPoint.exists()) {\r
68                 if(startPoint.equals(marker)) {\r
69                     found = true;\r
70                     continue;\r
71                 }\r
72                 \r
73                 if(hasSameLineNumber(startPoint, marker)) {\r
74                     continue;\r
75                 }\r
76                 \r
77                 if(!found) {\r
78                     skipped.add(marker);\r
79                     continue;\r
80                 }\r
81             }\r
82             \r
83             if(marker.getResource().getType() != IResource.FILE) {\r
84                 continue;\r
85             }\r
86 \r
87             try {\r
88                 IDE.openEditor(page, marker, OpenStrategy.activateOnOpen());\r
89             } catch (PartInitException e) {\r
90                 throw new ExecutionException(e.getMessage(), e);\r
91             }\r
92             return;\r
93         }\r
94         if(startPoint != null && startPoint.exists()) {\r
95             skipped.add(startPoint);\r
96         }\r
97         \r
98         for(IMarker marker: skipped) {\r
99             if(marker.getResource().getType() != IResource.FILE) {\r
100                 continue;\r
101             }\r
102 \r
103             try {\r
104                 IDE.openEditor(page, marker, OpenStrategy.activateOnOpen());\r
105             } catch (PartInitException e) {\r
106                 throw new ExecutionException(e.getMessage(), e);\r
107             }\r
108             return;\r
109         }\r
110         \r
111     }\r
112 \r
113     boolean hasSameLineNumber(IMarker marker1, IMarker marker2) throws ExecutionException {\r
114         if(!marker1.getResource().equals(marker2.getResource())) {\r
115             return false;\r
116         }\r
117         try {\r
118             Integer line1 = (Integer)marker1.getAttribute(IMarker.LINE_NUMBER);\r
119             Integer line2 = (Integer)marker2.getAttribute(IMarker.LINE_NUMBER);\r
120             if(line1 == null) {\r
121                 return (line2 == null);\r
122             }\r
123             return line1.equals(line2);\r
124         } catch (CoreException e) {\r
125             throw new ExecutionException(e.getMessage(), e);\r
126         }\r
127     }\r
128 }\r