OSDN Git Service

418ca8ea98ccc6df57b2edc30076c5c7ce78c2e4
[moreemacs/moreemacs.git] / jp.sourceforge.moreemacs / src / jp / sourceforge / moreemacs / handlers / CommandHandler.java
1 package jp.sourceforge.moreemacs.handlers;\r
2 \r
3 import java.util.regex.Pattern;\r
4 \r
5 import jp.sourceforge.moreemacs.MoreEmacs;\r
6 \r
7 import org.eclipse.core.commands.AbstractHandler;\r
8 import org.eclipse.core.commands.Command;\r
9 import org.eclipse.core.commands.ExecutionEvent;\r
10 import org.eclipse.core.commands.ExecutionException;\r
11 import org.eclipse.ui.IWorkbenchWindow;\r
12 import org.eclipse.ui.handlers.HandlerUtil;\r
13 \r
14 public final class CommandHandler extends AbstractHandler {\r
15 \r
16     @Override\r
17     public Object execute(ExecutionEvent event) throws ExecutionException {\r
18         IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);\r
19 \r
20         Execution exe = newExecution(event);\r
21         if(!exe.init(window)) {\r
22             return null;\r
23         }\r
24         try {\r
25             exe.execute();\r
26         } catch (Exception e) {\r
27             throw new ExecutionException(e.getMessage(), e);\r
28         }\r
29 \r
30         return null;\r
31     }\r
32     \r
33     private Execution newExecution(ExecutionEvent event) throws ExecutionException {\r
34         try {\r
35             String className = getExecutionClassName(event);\r
36             Class<?> clazz = Class.forName(className);\r
37             Object obj = clazz.newInstance();\r
38             if(!(obj instanceof Execution)) {\r
39                 throw new ExecutionException("the class "+clazz.getName()+\r
40                         " does not implements Execution.");\r
41             }\r
42             return (Execution)obj;\r
43         } catch (ClassNotFoundException e) {\r
44             throw new ExecutionException(e.getMessage(), e);\r
45         } catch (InstantiationException e) {\r
46             throw new ExecutionException(e.getMessage(), e);\r
47         } catch (IllegalAccessException e) {\r
48             throw new ExecutionException(e.getMessage(), e);\r
49         }\r
50         \r
51     }\r
52     \r
53     // naming strategy will be separated to another class.\r
54     private static final String COMMAND_PREFIX_QUOTED = Pattern.quote(\r
55             MoreEmacs.class.getPackage().getName());\r
56     private static final String HANDLER_PREFIX = CommandHandler.class.getPackage().getName();\r
57     private static final String HANDLER_SUFFIX = "Execution";\r
58     private static String getExecutionClassName(ExecutionEvent event) {\r
59         Command command = event.getCommand();\r
60         String className = command.getId()\r
61         .replaceFirst(COMMAND_PREFIX_QUOTED, HANDLER_PREFIX)\r
62         +HANDLER_SUFFIX;\r
63         \r
64         \r
65         return className;\r
66     }\r
67 \r
68 }\r