コード例 #1
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
        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);
        }
コード例 #2
0
ファイル: ssEventDecoderV2.cs プロジェクト: collumww/ssV3
 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
                ));
 }
コード例 #3
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
 private void MatchModifiers()
 {
     for (ssEvent e = mods.nxt; e != null; e = e.nxt)
     {
         Match(e.k, e.c, e.t);
     }
 }
コード例 #4
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
 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;
         }
     }
 }
コード例 #5
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
        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;
        }
コード例 #6
0
ファイル: ssEventDecoderV2.cs プロジェクト: collumww/ssV3
 ssEvent LastAlt(ssEvent e)
 {
     while (e.alt != null)
     {
         e = e.alt;
     }
     return(e);
 }
コード例 #7
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
 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());
     }
 }
コード例 #8
0
ファイル: ssEventDecoderV2.cs プロジェクト: collumww/ssV3
        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);
        }
コード例 #9
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
        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();
                    }
                }
            }
        }
コード例 #10
0
ファイル: ssEvent.cs プロジェクト: collumww/ssV3
        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);
        }
コード例 #11
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
        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);
        }
コード例 #12
0
ファイル: ssEventDecoderV2.cs プロジェクト: collumww/ssV3
        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;
                }
            }
        }
コード例 #13
0
ファイル: ssEventDecoderV2.cs プロジェクト: collumww/ssV3
        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;
                    }
                }
            }
        }
コード例 #14
0
ファイル: ssEventDecoderV2.cs プロジェクト: collumww/ssV3
 public eStack(ssEvent ee, eStack st)
 {
     e = ee; nxt = st;
 }
コード例 #15
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
 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)));
 }
コード例 #16
0
ファイル: ssEventDecoderV1.cs プロジェクト: collumww/ssV3
 private void ResetMatch()
 {
     ematch = events;
     prvmod = Keys.None;
 }