OSDN Git Service

no message
[passer/Passer2.git] / passer / Macro.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5 using System.Windows.Forms;
6 using System.Drawing;
7 using Lugens.Utils;
8 using System.Diagnostics;
9
10 namespace Lugens.Passer.Macro
11 {
12     public delegate void MacroEventHandler(string result);
13
14     public enum MacroType
15     {
16         InOutText,
17         CutOutText,
18         OutText,
19         InOutPopup,
20         OutPopup
21     }
22
23     public interface IMacro
24     {
25         event MacroEventHandler OnMacroCompleted;
26
27         /// <summary>
28         /// マクロID
29         /// </summary>
30         /// <returns></returns>
31         string Id();
32
33         /// <summary>
34         /// マクロ機能初期化
35         /// </summary>
36         bool Init();
37
38         /// <summary>
39         /// マクロタイプ
40         /// </summary>
41         /// <returns></returns>
42         MacroType Type();
43
44         /// <summary>
45         /// マクロ機能名
46         /// </summary>
47         /// <returns></returns>
48         string Name();
49
50         /// <summary>
51         /// マクロ機能概要
52         /// </summary>
53         /// <returns></returns>
54         string Summary();
55         
56         /// <summary>
57         /// マクロ機能説明
58         /// </summary>
59         /// <returns></returns>
60         string Description();
61
62         /// <summary>
63         /// マクロテスト実行
64         /// </summary>
65         /// <returns></returns>
66         bool Test();
67
68         /// <summary>
69         /// マクロ実行
70         /// </summary>
71         /// <param name="str"></param>
72         /// <param name="args"></param>
73         void ExecuteAsync(string str, params string[] args);
74     }
75
76     public static class MacroExecuter
77     {
78         private delegate void PopupTextDelegate(string text);
79
80         private static int currentCode = -1;
81
82         private static IMacro currentMacro = null;
83
84         private static int keycode;
85         public static void ExecuteAsync(int keycode, IMacro macro, params string[] args)
86         {
87             string str;
88             MacroExecuter.keycode = keycode;
89             MacroExecuter.currentCode = macro.GetHashCode();
90             MacroExecuter.currentMacro = macro;
91
92             switch (macro.Type())
93             {
94                 case MacroType.CutOutText:
95                     Program.SendMessage("${LControl+}${X}${LControl-}", keycode);
96                     str = Clipboard.GetText();
97                     macro.OnMacroCompleted += OnMacroCompleted;
98                     MacroExecuter.currentMacro.ExecuteAsync(str, args);
99                     break;
100
101                 case MacroType.OutText:
102                     macro.OnMacroCompleted += OnMacroCompleted;
103                     MacroExecuter.currentMacro.ExecuteAsync(null, args);
104                     break;
105
106                 case MacroType.InOutPopup:
107                     Program.SendMessage("${LControl+}${C}${LControl-}", keycode);
108                     str = Clipboard.GetText();
109                     if (!String.IsNullOrEmpty(str))
110                     {
111                         Program.PopupForm = new PopupForm();
112                         Point p = Control.MousePosition;
113                         p.X += 2;
114                         p.Y += 16;
115                         Program.PopupForm.Location = p;
116                         Program.PopupForm.DoVisibleChange(true);
117                         macro.OnMacroCompleted += OnMacroCompleted;
118                         MacroExecuter.currentMacro.ExecuteAsync(str, args);
119                     }
120                     else
121                     {
122                         Program.Status = ProgramStatus.Waiting;
123                     }
124                     break;
125             }
126         }
127
128         public static void SetPopupText(string text)
129         {
130             Program.PopupForm.Loading = false;
131             Program.PopupForm.Text = text;
132         }
133
134         public static void OnMacroCompleted(string result)
135         {
136             if (MacroExecuter.currentCode == -1)
137             {
138                 Program.Status = ProgramStatus.Waiting;
139                 return;
140             }
141
142             switch (MacroExecuter.currentMacro.Type())
143             {
144                 case MacroType.InOutText:
145                 case MacroType.CutOutText:
146                 case MacroType.OutText:
147                     Clipboard.SetText(result);
148                     Application.DoEvents();
149                     int keycode = Program.EnabledKeycode(MacroExecuter.keycode);
150                     Program.SendMessage("${LControl+}${V}${LControl-}", keycode);
151                     Program.Status = ProgramStatus.Waiting;
152                     break;
153
154                 case MacroType.InOutPopup:
155                 case MacroType.OutPopup:
156                     if(!Program.PopupForm.IsDisposed)
157                     {
158                         Program.PopupForm.RequestSetText(result);
159                     }
160                     break;
161
162             }
163             currentCode = -1;
164             currentMacro.OnMacroCompleted -= OnMacroCompleted;
165             currentMacro = null;
166         }
167     }
168 }