ssEvent pEvent(ssScanner scnr, ssForm f) { ssEvent e = new ssEvent(); try { scnr.GetStrSpDelim(); e.k = (Keys)keyconv.ConvertFromString(scnr.S); scnr.GetStrSpDelim(); e.t = pType(scnr.S); if (e.t == ssEventType.press) { scnr.GetStrSpDelim(); e.c = pChar(scnr.S); } if (scnr.C != '|' && scnr.C != '+' && scnr.C != ';') { scnr.GetStrSpDelim(); e.a = pAction(scnr.S); } if (scnr.C != '|' && scnr.C != '+' && scnr.C != ';') { scnr.GetStrSpDelim(); e.cont = bool.Parse(scnr.S); } } catch (Exception ee) { throw new ssException("error parsing event in events file" + "\r\n?" + ee.Message); } return(e); }
private bool SingleMatch(ssEvent e, Keys k, char c, ssEventType t) { return(t == e.t && ( t == ssEventType.press && e.c == c || t != ssEventType.press && e.k == k )); }
private void MatchModifiers() { for (ssEvent e = mods.nxt; e != null; e = e.nxt) { Match(e.k, e.c, e.t); } }
private void EatModifiers(Keys k, ssEventType t) { if (IsModifier(k)) { if (t == ssEventType.down) { if (k == prvmod) { return; } modstail.nxt = new ssEvent(k, '\0', t, null, false); modstail = modstail.nxt; prvmod = k; } else if (t == ssEventType.up) { ssEvent x = mods; while (x.nxt != null) { if (x.nxt.k == k) { x.nxt = x.nxt.nxt; } else { x = x.nxt; } } modstail = x; } } }
public ssEventDecoderV1(ssForm f) { frm = f; evFile = "ssEvents.ini"; keyconv = new KeysConverter(); methods = Type.GetType("ss.ssForm").GetMethods( BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); actiontyp = Type.GetType("ss.ssAction"); events = LoadEvents(f, evFile); ematch = events; ematchcnt = 0; mods = new ssEvent(); modstail = mods; elog = new ssEvent(); elogtail = elog; elogcnt = 0; logging = false; prvmod = Keys.None; defInsert = pAction("InsertChar"); enabled = true; }
ssEvent LastAlt(ssEvent e) { while (e.alt != null) { e = e.alt; } return(e); }
private void ShowEvents(string msg, ssEvent e) { frm.Ed.MsgLn(msg); for (ssEvent el = e; el != null; el = el.nxt) { frm.Ed.MsgLn(el.ToString()); } }
ssEvent pEvent(ssScanner scnr, ssForm f) { ssEvent e; try { scnr.GetStrSpDelim(); eSet es = FindEventSet(subsets, scnr.S); if (es != null) { e = es.e.nxt.copy(); if (!AtEventBoundry(scnr)) { scnr.GetChar(); } } else { e = new ssEvent(); e.k = (Keys)keyconv.ConvertFromString(scnr.S); scnr.GetStrSpDelim(); e.t = pType(scnr.S); if (e.t == ssEventType.press) { scnr.GetStrSpDelim(); e.c = pChar(scnr.S); } if (!AtEventBoundry(scnr)) { scnr.GetStrSpDelim(); e.a = pAction(scnr.S, ref e.cmdopt); } if (!AtEventBoundry(scnr)) { scnr.GetStrSpDelim(); e.cont = bool.Parse(scnr.S); } if (e.cmdopt != ssEventCmdOption.none) { scnr.SetDelim("\n"); scnr.AllowComment = false; scnr.GetStr(); e.cmd = scnr.S; scnr.AllowComment = true; scnr.SetDelim(""); if (!AtEventBoundry(scnr)) { scnr.GetChar(); } } } } catch (Exception ee) { scnr.SetDelim(""); scnr.AllowComment = true; throw new ssException("error parsing event in events file" + "\r\n?" + ee.Message); } return(e); }
private void Match(Keys k, char c, ssEventType t) { ssEvent e = ematch.nxt; if (ematch.t == t && t == ssEventType.move) { e = ematch; } while (e != null) { if (SingleMatch(e, k, c, t)) { break; } e = e.alt; } if (e == null) { if (t == ssEventType.press) { defInsert.Invoke(frm, null); } ResetMatch(); } else { ematch = e; if (e.a != null) { ematchcnt++; if (enabled) { e.a.Invoke(frm, null); } if (logging) { ShowEvents("--- Modifiers ------------------------", mods.nxt); } if (!e.cont) { enabled = false; ResetMatch(); } } } }
public ssEvent copy() { ssEvent e = new ssEvent(k, c, t, a, cont); e.cmd = cmd; e.cmdopt = cmdopt; if (nxt != null) { e.nxt = nxt.copy(); } if (alt != null) { e.alt = alt.copy(); } return(e); }
private ssEvent LoadEvents(ssForm f, string fnm) { ssEvent es = new ssEvent(); fnm = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + System.IO.Path.DirectorySeparatorChar + fnm; int cnt = 0; ssScanner scnr = null; while (cnt < 2 && scnr == null) { try { cnt++; scnr = new ssScanner(File.ReadAllText(fnm), true); scnr.GetChar(); } catch { try { if (cnt < 2) { f.Ed.MsgLn("creating default events file"); File.WriteAllText(fnm, defEvents); } else { throw new ssException("no events file"); } } catch (Exception ee) { f.Ed.Err("error writing default events file" + "\r\n" + ee.Message); } } } try { es.nxt = pEventTree(scnr, f); } catch (Exception e) { if (f == f.Ed.Log.Frm) { f.Ed.Err(e.Message + ": " + scnr.S); // Guard this so you don't get messages for every form created. } } return(es); }
ssEvent pEventTree(ssScanner scnr, ssForm f) { ssEvent rt = pEvent(scnr, f); ssEvent e = LastAlt(rt); for (;;) { switch (scnr.C) { case '|': scnr.GetChar(); e.alt = pEvent(scnr, f); e = LastAlt(e); break; case '+': scnr.GetChar(); e.nxt = pEventTree(scnr, f); break; case ';': scnr.GetChar(); return(rt); case '\0': return(rt); default: if (char.IsWhiteSpace(scnr.C)) { scnr.GetChar(); } else { throw new ssException("error parsing event tree in events file"); } break; } } }
public void Eat(Keys k, char c, ssEventType t) { if (curset == null) { return; } if (!enabled) { if (MouseModifierDown()) { return; } else { enabled = true; } } if (IsModifier(k) && SingleMatch(ematch.e, k, c, t)) { if (ematch.e.a == null) { return; } } if (ematch.e.nxt == null) { Reset(); return; } ssEvent e = ematch.e.nxt; int lcnt = 0; while (e != null) { if (SingleMatch(e, k, c, t)) { break; } e = e.alt; lcnt++; } if (e == null) { if (t == ssEventType.press) { defInsert.Invoke(frm, null); } Reset(); return; } else { ematch = new eStack(e, ematch); if (e.a != null || e.cmd != "") { if (e.a != null) { e.a.Invoke(frm, null); } else { if (e.cmdopt == ssEventCmdOption.begin) { frm.Ed.Msg(e.cmd); frm.Ed.Log.Activate(); } else { string[] ss = e.cmd.Split(new string[] { "`" }, StringSplitOptions.None); if (e.cmdopt == ssEventCmdOption.execPreserveDot) { frm.SaveCursor(); } foreach (string s in ss) { frm.Ed.Do(s); } if (e.cmdopt == ssEventCmdOption.execPreserveDot) { frm.RestoreCursor(); } } } if (!e.cont) { ematch = ematch.nxt; enabled = false; } } } }
public eStack(ssEvent ee, eStack st) { e = ee; nxt = st; }
private bool SingleMatch(ssEvent e, Keys k, char c, ssEventType t) { return(e.t == t && ((t != ssEventType.press && e.k == k) || (t == ssEventType.press && e.c == c))); }
private void ResetMatch() { ematch = events; prvmod = Keys.None; }