Command.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:18k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: Command.cs,v 1.2 2005/04/20 08:45:44 okajima Exp $
  4. */
  5. using System;
  6. using System.IO;
  7. using System.Diagnostics;
  8. using System.Collections;
  9. using System.Text;
  10. using System.Windows.Forms;
  11. using Poderosa.MacroEnv;
  12. using Poderosa.Terminal;
  13. using Poderosa.Toolkit;
  14. using Poderosa.UI;
  15. namespace Poderosa.Config {
  16. internal enum CID {
  17. NOP = 0,
  18. // File
  19. NewConnection,
  20. NewSerialConnection,
  21. NewCygwinConnection,
  22. NewSFUConnection,
  23. OpenShortcut,
  24. ReceiveFile,
  25. SendFile,
  26. Quit,
  27. #if DEBUG
  28. EmulateLog,
  29. #endif
  30. //Edit
  31. Copy,
  32. Paste,
  33. CopyAsLook,
  34. CopyToFile,
  35. PasteFromFile,
  36. ClearScreen,
  37. ClearBuffer,
  38. SelectAll,
  39. ToggleFreeSelectionMode,
  40. ToggleAutoSelectionMode,
  41. // terminal
  42. Close,
  43. Reproduce,
  44. SaveShortcut,
  45. ShowServerInfo,
  46. RenameTab,
  47. ToggleNewLine,
  48. ToggleLocalEcho,
  49. LineFeedRule,
  50. ToggleLogSuspension,
  51. EditRenderProfile,
  52. ChangeLogFile,
  53. CommentLog,
  54. ResetTerminal,
  55. SendBreak,
  56. SerialConfig,
  57. AreYouThere,
  58. #if DEBUG
  59. DumpText,
  60. #endif
  61. // Tools
  62. OptionDialog,
  63. KeyGen,
  64. Portforwarding,
  65. ChangePassphrase,
  66. MacroConfig,
  67. StopMacro,
  68. // Window
  69. CloseAll,
  70. CloseAllDisconnected,
  71. PrevPane,
  72. NextPane,
  73. MoveTabToPrev,
  74. MoveTabToNext,
  75. ExpandPane,
  76. ShrinkPane,
  77. FrameStyleSingle,
  78. FrameStyleDivHorizontal,
  79. FrameStyleDivVertical,
  80. FrameStyleDivHorizontal3,
  81. FrameStyleDivVertical3,
  82. MovePaneUp,
  83. MovePaneDown,
  84. MovePaneLeft,
  85. MovePaneRight,
  86. // Help
  87. AboutBox,
  88. ProductWeb,
  89. // Activation
  90. ActivateConnection0,
  91. ActivateConnection1,
  92. ActivateConnection2,
  93. ActivateConnection3,
  94. ActivateConnection4,
  95. ActivateConnection5,
  96. ActivateConnection6,
  97. ActivateConnection7,
  98. ActivateConnection8,
  99. ActivateConnection9,
  100. ActivateConnectionLast,
  101. //Special
  102. ShowWelcomeDialog,
  103. // Last
  104. COUNT,
  105. // Macro
  106. ExecMacro = 1000,
  107.     }
  108.     
  109.     internal class Commands : ICloneable {
  110. [EnumDesc(typeof(Category))]
  111. public enum Category {
  112. [EnumValue(Description="Enum.KeyMap.Category.File")] File,
  113. [EnumValue(Description="Enum.KeyMap.Category.Edit")] Edit,
  114. [EnumValue(Description="Enum.KeyMap.Category.Console")] Console,
  115. [EnumValue(Description="Enum.KeyMap.Category.Tool")] Tool,
  116. [EnumValue(Description="Enum.KeyMap.Category.Window")] Window,
  117. [EnumValue(Description="Enum.KeyMap.Category.Help")] Help,
  118. //儊僯儏乕偲懳墳偟側偄傕偺
  119. [EnumValue(Description="Enum.KeyMap.Category.Macro")] Macro,
  120. [EnumValue(Description="Enum.KeyMap.Category.Fixed")] Fixed
  121. }
  122. public enum Target {
  123. Global,
  124. Connection
  125. }
  126. // command delegate
  127. public delegate CommandResult CD();
  128. public class Entry {
  129. private Category _category;
  130. private CID _cid;
  131. private string _description;
  132. private Target _target;
  133. private Keys _modifiers;
  134. private Keys _key;
  135. private Keys _defaultModifiers;
  136. private Keys _defaultKey;
  137. public Entry Clone() {
  138. return MemberwiseClone() as Entry;
  139. }
  140. public Category Category {
  141. get {
  142. return _category;
  143. }
  144. }
  145. public CID CID {
  146. get {
  147. return _cid;
  148. }
  149. }
  150. public string Description {
  151. get {
  152. if(_category==Category.Macro)
  153. return _description;
  154. else
  155. return GApp.Strings.GetString(_description);
  156. }
  157. }
  158. public Keys Modifiers {
  159. get {
  160. return _modifiers;
  161. }
  162. set {
  163. _modifiers = value;
  164. }
  165. }
  166. public Keys Key {
  167. get {
  168. return _key;
  169. }
  170. set {
  171. _key = value;
  172. }
  173. }
  174. public Keys DefaultModifiers {
  175. get {
  176. return _defaultModifiers;
  177. }
  178. }
  179. public Keys DefaultKey {
  180. get {
  181. return _defaultKey;
  182. }
  183. }
  184. public Target Target {
  185. get {
  186. return _target;
  187. }
  188. set {
  189. _target = value;
  190. }
  191. }
  192. public string KeyDisplayString {
  193. get {
  194. return UILibUtil.KeyString(_modifiers, _key, '+');
  195. }
  196. }
  197. public bool KeyIsModified {
  198. get {
  199. return _key!=_defaultKey || _modifiers!=_defaultModifiers;
  200. }
  201. }
  202. public Entry(Category cat, Target target, CID cid, string desc, Keys mod, Keys key) {
  203. _category = cat;
  204. _target = target;
  205. _cid = cid;
  206. _description = desc;
  207. _modifiers = mod;
  208. _key = key;
  209. _defaultModifiers = mod;
  210. _defaultKey = key;
  211. }
  212. }
  213. public class MacroEntry : Entry {
  214. private int _index;
  215. public MacroEntry(string desc, Keys mod, Keys key, int index) : base(Category.Macro, Target.Global, CID.ExecMacro, desc, mod, key) {
  216. _index = index;
  217. }
  218. public int Index {
  219. get {
  220. return _index;
  221. }
  222. }
  223. }
  224. protected Entry[] _IDToEntry;
  225. protected Hashtable _keyToEntry;
  226. protected bool _keyMapIsDirty;
  227. protected ArrayList _entries;      //捠忢僐儅儞僪丂偙傟偼婲摦帪偵弶婜壔偝傟傞偺傒偱屻偼僉乕僶僀儞僪偩偗偑曄傢傝偆傞
  228. protected ArrayList _fixedEntries; //屌掕僐儅儞僪丂僉乕僶僀儞僪傕屌掕
  229. protected ArrayList _macroEntries; //壜曄僐儅儞僪丂儅僋儘側偳僐儗僋僔儑儞帺懱傕曄傢傝偆傞
  230. public Commands() {
  231. _keyToEntry = new Hashtable();
  232. _IDToEntry = new Entry[(int)CID.COUNT];
  233. _entries = new ArrayList();
  234. _fixedEntries = new ArrayList();
  235. _macroEntries = new ArrayList();
  236. _keyMapIsDirty = true;
  237. }
  238. public void ClearKeyBinds() {
  239. foreach(Entry e in _entries) {
  240. e.Modifiers = Keys.None;
  241. e.Key = Keys.None;
  242. }
  243. foreach(Entry e in _macroEntries) {
  244. e.Modifiers = Keys.None;
  245. e.Key = Keys.None;
  246. }
  247. _keyToEntry.Clear();
  248. }
  249. //昗弨僉乕儅僢僾偱峔抸
  250. public void Init() {
  251. InitCommands();
  252. InitFixedCommands();
  253. }
  254. public object Clone() {
  255. Commands cm = new Commands();
  256. IEnumerator ie = EnumEntries();
  257. while(ie.MoveNext()) {
  258. Entry  e = (Entry)ie.Current;
  259. Entry ne = e.Clone();
  260. cm.AddEntry(ne);
  261. }
  262. return cm;
  263. }
  264. protected void InitCommands() {
  265. _keyToEntry.Clear();
  266. _entries.Clear();
  267. AddKeyMap(Category.File, Target.Global, CID.NewConnection,       "Command.NewConnection",                   Keys.Alt, Keys.N);
  268. AddKeyMap(Category.File, Target.Global, CID.NewSerialConnection, "Command.NewSerialConnection",             Keys.None, Keys.None);
  269. AddKeyMap(Category.File, Target.Global, CID.NewCygwinConnection, "Command.NewCygwinConnection",             Keys.None, Keys.None);
  270. AddKeyMap(Category.File, Target.Global, CID.NewSFUConnection,    "Command.NewSFUConnection",                Keys.None, Keys.None);
  271. AddKeyMap(Category.File, Target.Global, CID.OpenShortcut,        "Command.OpenShortcut",                    Keys.Alt, Keys.O);
  272. AddKeyMap(Category.File, Target.Global, CID.ReceiveFile,         "Command.ReceiveFile",                     Keys.None, Keys.None);
  273. AddKeyMap(Category.File, Target.Global, CID.SendFile,            "Command.SendFile",                        Keys.None, Keys.None);
  274. AddKeyMap(Category.File, Target.Global, CID.Quit,                "Command.Quit",                            Keys.Alt|Keys.Shift, Keys.X);
  275. #if DEBUG
  276. AddKeyMap(Category.File, Target.Global, CID.EmulateLog,    "Command.EmulateLog",   Keys.Alt|Keys.Shift, Keys.E);
  277. #endif
  278. AddKeyMap(Category.Edit, Target.Global, CID.Copy,                    "Command.Copy",                    Keys.Alt, Keys.C);
  279. AddKeyMap(Category.Edit, Target.Connection, CID.Paste,               "Command.Paste",                   Keys.Alt, Keys.V);
  280. AddKeyMap(Category.Edit, Target.Global, CID.CopyAsLook,              "Command.CopyAsLook",              Keys.None, Keys.None);
  281. AddKeyMap(Category.Edit, Target.Global, CID.CopyToFile,              "Command.CopyToFile",              Keys.None, Keys.None);
  282. AddKeyMap(Category.Edit, Target.Connection, CID.PasteFromFile,       "Command.PasteFromFile",           Keys.None, Keys.None);
  283. AddKeyMap(Category.Edit, Target.Connection, CID.ClearScreen,         "Command.ClearScreen",             Keys.None, Keys.None);
  284. AddKeyMap(Category.Edit, Target.Connection, CID.ClearBuffer,         "Command.ClearBuffer",             Keys.None, Keys.None);
  285. AddKeyMap(Category.Edit, Target.Connection, CID.SelectAll,           "Command.SelectAll",               Keys.Alt, Keys.A);
  286. AddKeyMap(Category.Edit, Target.Global, CID.ToggleFreeSelectionMode, "Command.ToggleFreeSelectionMode", Keys.Alt, Keys.Z);
  287. AddKeyMap(Category.Edit, Target.Global, CID.ToggleAutoSelectionMode, "Command.ToggleAutoSelectionMode", Keys.Alt, Keys.X);
  288. AddKeyMap(Category.Console, Target.Connection, CID.Close,            "Command.Close",                   Keys.Alt, Keys.W);
  289. AddKeyMap(Category.Console, Target.Connection, CID.Reproduce,        "Command.Reproduce",               Keys.Alt, Keys.R);
  290. AddKeyMap(Category.Console, Target.Connection, CID.SaveShortcut,     "Command.SaveShortcut",            Keys.Alt, Keys.S);
  291. AddKeyMap(Category.Console, Target.Connection, CID.ShowServerInfo,   "Command.ShowServerInfo",          Keys.Alt, Keys.I);
  292. AddKeyMap(Category.Console, Target.Connection, CID.RenameTab,        "Command.RenameTab",               Keys.None, Keys.None);
  293. AddKeyMap(Category.Console, Target.Connection, CID.ToggleNewLine,    "Command.ToggleNewLine",           Keys.None, Keys.None);
  294. AddKeyMap(Category.Console, Target.Connection, CID.ToggleLocalEcho,  "Command.ToggleLocalEcho",         Keys.None, Keys.None);
  295. AddKeyMap(Category.Console, Target.Connection, CID.LineFeedRule,     "Command.LineFeedRule",            Keys.None, Keys.None);
  296. AddKeyMap(Category.Console, Target.Connection, CID.ToggleLogSuspension, "Command.ToggleLogSuspension",  Keys.None, Keys.None);
  297. AddKeyMap(Category.Console, Target.Connection, CID.EditRenderProfile, "Command.EditRenderProfile",      Keys.None, Keys.None);
  298. AddKeyMap(Category.Console, Target.Connection, CID.ChangeLogFile,    "Command.ChangeLogFile",           Keys.None, Keys.None);
  299. AddKeyMap(Category.Console, Target.Connection, CID.CommentLog,       "Command.CommentLog",              Keys.None, Keys.None);
  300. AddKeyMap(Category.Console, Target.Connection, CID.ResetTerminal,    "Command.ResetTerminal",           Keys.None, Keys.None);
  301. AddKeyMap(Category.Console, Target.Connection, CID.SendBreak,        "Command.SendBreak",               Keys.None, Keys.None);
  302. AddKeyMap(Category.Console, Target.Connection, CID.SerialConfig,     "Command.SerialConfig",            Keys.None, Keys.None);
  303. AddKeyMap(Category.Console, Target.Connection, CID.AreYouThere,      "Command.AreYouThere",             Keys.None, Keys.None);
  304. #if DEBUG
  305. AddKeyMap(Category.Console, Target.Connection, CID.DumpText  ,       "Command.DumpText",                Keys.Alt|Keys.Shift, Keys.D);
  306. #endif
  307. AddKeyMap(Category.Tool, Target.Global, CID.OptionDialog,          "Command.OptionDialog",      Keys.Alt, Keys.T);
  308. AddKeyMap(Category.Tool, Target.Global, CID.KeyGen,                "Command.KeyGenSSH",         Keys.None, Keys.None);
  309. AddKeyMap(Category.Tool, Target.Global, CID.Portforwarding,        "Command.Portforwarding",    Keys.None, Keys.None);
  310. AddKeyMap(Category.Tool, Target.Global, CID.ChangePassphrase,      "Command.ChangePassphrase",  Keys.None, Keys.None);
  311. AddKeyMap(Category.Tool, Target.Global, CID.MacroConfig,           "Command.MacroConfig",       Keys.Alt, Keys.M);
  312. AddKeyMap(Category.Tool, Target.Global, CID.StopMacro,             "Command.StopMacro",         Keys.None, Keys.None);
  313. AddKeyMap(Category.Window, Target.Global, CID.CloseAll,            "Command.CloseAll",          Keys.None, Keys.None);
  314. AddKeyMap(Category.Window, Target.Global, CID.CloseAllDisconnected,"Command.CloseAllDisconnected",Keys.None, Keys.None);
  315. AddKeyMap(Category.Window, Target.Global, CID.PrevPane,            "Command.PrevPane",          Keys.Control|Keys.Shift, Keys.Tab);
  316. AddKeyMap(Category.Window, Target.Global, CID.NextPane,            "Command.NextPane",          Keys.Control, Keys.Tab);
  317. AddKeyMap(Category.Window, Target.Global, CID.MoveTabToPrev,       "Command.MoveTabToPrev",     Keys.None, Keys.None);
  318. AddKeyMap(Category.Window, Target.Global, CID.MoveTabToNext,       "Command.MoveTabToNext",     Keys.None, Keys.None);
  319. AddKeyMap(Category.Window, Target.Global, CID.ExpandPane,          "Command.ExpandPane",        Keys.Alt, Keys.Add);
  320. AddKeyMap(Category.Window, Target.Global, CID.ShrinkPane,          "Command.ShrinkPane",        Keys.Alt, Keys.Subtract);
  321. AddKeyMap(Category.Window, Target.Global, CID.FrameStyleSingle,    "Command.FrameStyleSingle",  Keys.None, Keys.None);
  322. AddKeyMap(Category.Window, Target.Global, CID.FrameStyleDivHorizontal, "Command.FrameStyleDivHorizontal", Keys.None, Keys.None);
  323. AddKeyMap(Category.Window, Target.Global, CID.FrameStyleDivVertical,   "Command.FrameStyleDivVertical", Keys.None, Keys.None);
  324. AddKeyMap(Category.Window, Target.Global, CID.FrameStyleDivHorizontal3, "Command.FrameStyleDivHorizontal3", Keys.None, Keys.None);
  325. AddKeyMap(Category.Window, Target.Global, CID.FrameStyleDivVertical3,   "Command.FrameStyleDivVertical3", Keys.None, Keys.None);
  326. AddKeyMap(Category.Window, Target.Global, CID.MovePaneUp,          "Command.MovePaneUp",        Keys.Alt|Keys.Shift, Keys.Up);
  327. AddKeyMap(Category.Window, Target.Global, CID.MovePaneDown,        "Command.MovePaneDown",      Keys.Alt|Keys.Shift, Keys.Down);
  328. AddKeyMap(Category.Window, Target.Global, CID.MovePaneLeft,        "Command.MovePaneLeft",      Keys.Alt|Keys.Shift, Keys.Left);
  329. AddKeyMap(Category.Window, Target.Global, CID.MovePaneRight,       "Command.MovePaneRight",     Keys.Alt|Keys.Shift, Keys.Right);
  330. AddKeyMap(Category.Help,   Target.Global, CID.AboutBox,            "Command.AboutBox",          Keys.None, Keys.None);
  331. AddKeyMap(Category.Help,   Target.Global, CID.ProductWeb,          "Command.ProductWeb",        Keys.None, Keys.None);
  332. AddKeyMap(Category.Fixed,  Target.Global, CID.ShowWelcomeDialog,   "",  Keys.None, Keys.None);
  333. }
  334. private void InitFixedCommands() {
  335. _fixedEntries.Clear();
  336. int count = (int)(CID.ActivateConnectionLast - CID.ActivateConnection0);
  337. for(int i=0; i<count; i++) {
  338. AddKeyMap(Category.Fixed, Target.Global, (CID)(CID.ActivateConnection0 + i), "", Keys.Alt, i==9? Keys.D0 : Keys.D1+i);
  339. }
  340. }
  341. public void ClearVariableEntries() {
  342. foreach(Entry e in _macroEntries) {
  343. if(e.Key!=Keys.None) _keyToEntry.Remove(e.Key|e.Modifiers);
  344. }
  345. _keyMapIsDirty = true;
  346. _macroEntries.Clear();
  347. }
  348. public Keys FindKey(CID cid) {
  349. int i = (int)cid;
  350. Debug.Assert(i>=0 && i<(int)CID.COUNT);
  351. Entry e = _IDToEntry[i];
  352. return e==null? Keys.None : e.Key | e.Modifiers;
  353. }
  354. public Entry FindEntry(Keys key) {
  355. if(_keyMapIsDirty) FixKeyMap();
  356. return (Entry)_keyToEntry[key];
  357. }
  358. public Entry FindEntry(CID id) {
  359. if(id >= CID.ExecMacro)
  360. return FindMacroEntry(id - CID.ExecMacro);
  361. else {
  362. int i = (int)id;
  363. Debug.Assert(i>=0 && i<(int)CID.COUNT);
  364. return _IDToEntry[i];
  365. }
  366. }
  367. public MacroEntry FindMacroEntry(int index) {
  368. return (MacroEntry)_macroEntries[index];
  369. }
  370. public IEnumerator EnumEntries() {
  371. return new ConcatEnumerator(_entries.GetEnumerator(), new ConcatEnumerator(_fixedEntries.GetEnumerator(), _macroEntries.GetEnumerator()));
  372. }
  373. public void ModifyKey(Entry e, Keys modifiers, Keys key) {
  374. //婛懚偺僉乕愝掕偑偁傟偽抲偒姺偊
  375. Entry existing = FindEntry(key|modifiers);
  376. if(existing!=null)
  377. _keyToEntry.Remove(key|modifiers);
  378. e.Modifiers = modifiers;
  379. e.Key = key;
  380. _keyToEntry.Add(key|modifiers, e);
  381. }
  382. public void ModifyKey(CID id, Keys modifiers, Keys key) {
  383. Entry e = FindEntry(id);
  384. Debug.Assert(e!=null);
  385. ModifyKey(e, modifiers, key);
  386. }
  387. public void ModifyMacroKey(int index, Keys modifiers, Keys key) {
  388. Entry e = FindMacroEntry(index);
  389. ModifyKey(e, modifiers, key);
  390. }
  391. protected void AddKeyMap(Category cat, Target target, CID id, string desc, Keys mod, Keys key) {
  392. Entry e = new Entry(cat, target, id, desc, mod, key);
  393. AddEntry(e);
  394. }
  395. protected void AddKeyMap(Category cat, Target target, CID id, string desc, Keys mod, Keys key, int param) {
  396. Entry e = new Entry(cat, target, id, desc, mod, key);
  397. AddEntry(e);
  398. }
  399. public void AddEntry(Entry e) {
  400. _keyMapIsDirty = true;
  401. if(e.Category==Category.Macro) {
  402. _macroEntries.Add(e);
  403. }
  404. else {
  405. _IDToEntry[(int)e.CID] = e;
  406. if(e.Category==Category.Fixed)
  407. _fixedEntries.Add(e);
  408. else
  409. _entries.Add(e);
  410. }
  411. }
  412. protected void FixKeyMap() {
  413. _keyToEntry.Clear();
  414. IEnumerator ie = new ConcatEnumerator(_entries.GetEnumerator(), new ConcatEnumerator(_fixedEntries.GetEnumerator(), _macroEntries.GetEnumerator()));
  415. while(ie.MoveNext()) {
  416. Entry e  = (Entry)ie.Current;
  417. if(e.Key!=Keys.None) {
  418. Keys k = e.Key|e.Modifiers;
  419. if(!_keyToEntry.ContainsKey(k)) 
  420. _keyToEntry.Add(k, e);
  421. }
  422. }
  423. _keyMapIsDirty = false;
  424. }
  425. //僔儞僾儖側僥僉僗僩宍幃偱偺Save/Load
  426. public void Save(ConfigNode parent) {
  427. ConfigNode node = new ConfigNode("key-definition");
  428. foreach(Entry e in _entries) {
  429. if(e.KeyIsModified)
  430. node[e.CID.ToString()] = UILibUtil.KeyString(e.Modifiers, e.Key, ',');
  431. }
  432. parent.AddChild(node);
  433. }
  434. public void Load(ConfigNode parent) {
  435. InitCommands();
  436. InitFixedCommands();
  437. ConfigNode node = parent.FindChildConfigNode("key-definition");
  438. if(node!=null) {
  439. IDictionaryEnumerator ie = node.GetPairEnumerator();
  440. while(ie.MoveNext()) {
  441. CID id = (CID)GUtil.ParseEnum(typeof(CID), (string)ie.Key, CID.NOP);
  442. if(id==CID.NOP) continue;
  443. string value = (string)ie.Value;
  444. Entry e = FindEntry(id);
  445. Keys t = GUtil.ParseKey(value.Split(','));
  446. e.Modifiers = t & Keys.Modifiers;
  447. e.Key = t & Keys.KeyCode;
  448. }
  449. }
  450. }
  451. public CommandResult ProcessKey(Keys k, bool macro_running) {
  452. if(_keyMapIsDirty) FixKeyMap();
  453. Entry e = (Entry)_keyToEntry[k];
  454. if(e!=null) {
  455. if(macro_running) {
  456. if(e.CID!=CID.StopMacro)
  457. return CommandResult.Ignored;
  458. else
  459. return Execute(e);
  460. }
  461. else
  462. return Execute(e);
  463. }
  464. else
  465. return CommandResult.NOP;
  466. }
  467. //僐儅儞僪幚峴杮懱
  468. private static CommandResult Execute(Entry e) {
  469. if(e.Target==Target.Global) {
  470. return GApp.GlobalCommandTarget.Exec(e);
  471. }
  472. else {
  473. ContainerConnectionCommandTarget t = GApp.GetConnectionCommandTarget();
  474. if(t==null) return CommandResult.Ignored; //傾僋僥傿僽側僐僱僋僔儑儞偑側偗傟偽柍帇
  475. return t.Exec(e.CID);
  476. }
  477. }
  478. }
  479.     
  480. }