Example #1
0
        public void MoveCopy(char cmd, ssAddress dst)
        {
            dst.rng.l = dst.rng.r;
            if (txt == dst.txt && txt.dot.Overlaps(dst.rng))
            {
                throw new ssException("addresses overlap");
            }
            string  s    = txt.ToString();
            ssTrans t1   = new ssTrans(ssTrans.Type.insert, 0, dst.rng, s, null);
            ssText  txt1 = dst.txt;
            ssTrans t2   = null;
            ssText  txt2 = null;

            if (cmd == 'm')
            {
                t2         = new ssTrans(ssTrans.Type.delete, 0, txt.dot, null, null);
                txt2       = txt;
                t1.rng.len = s.Length;
                if (t2.rng.l < t1.rng.l)
                {
                    ssTrans x = t1;
                    t1 = t2;
                    t2 = x;
                    ssText txtx = txt1;
                    txt1 = txt2;
                    txt2 = txtx;
                }
            }
            txt1.TLog.PushTrans(t1);
            if (t2 != null)
            {
                txt2.TLog.PushTrans(t2);
            }
        }
Example #2
0
 public void FormLogTrans(ssTrans.Type typ, ssRange r, string s)
 {
     if (log)
     {
         curChangeId++;
         if (canconsolidate &&
             ts != null &&
             ts.typ == ssTrans.Type.delete &&
             typ == ssTrans.Type.delete &&
             ts.rng.r == r.l &&
             r.len == 1 &&
             ts.s != null && rex.IsMatch(ts.s) &&
             s != null && rex.IsMatch(s) &&
             ts.s != txt.Eoln &&
             s != txt.Eoln)
         {
             ed.PrevTransId();
             ts.rng.r = r.r;
             ts.chgid = curChangeId;
         }
         else
         {
             ts             = new ssTrans(typ, ed.CurTransId, r, s, ts);
             canconsolidate = true;
             ts.chgid       = curChangeId;
         }
     }
 }
Example #3
0
        public void Insert(string s)
        {
            ssTrans t = new ssTrans(ssTrans.Type.insert, 0, txt.dot, s, null);

            txt.TLog.PushTrans(t);
            txt.dot.len = s.Length;
        }
Example #4
0
 public ssTrans(Type t, long i, ssRange r, string ss, ssTrans nnxt)
 {
     typ   = t;
     id    = i;
     rng   = r;
     s     = ss;
     chgid = 1;
     nxt   = nnxt;
 }
Example #5
0
 public void EdLogTrans(ssTrans t)
 {
     if (log)
     {
         t.id    = ed.CurTransId;
         t.chgid = curChangeId;
         t.nxt   = ts;
         ts      = t;
         curChangeId++;
     }
 }
Example #6
0
 public ssTransLog(ssEd e, ssText t)
 {
     ts             = null;
     log            = true;
     ed             = e;
     txt            = t;
     seqRoot        = new ssTrans(ssTrans.Type.delete, 0, t.dot, null, null);
     adjEdge        = new ssRange(0, 0);
     getnewtrans    = true;
     canconsolidate = true;
     savepoint      = 0;
     olddot         = new ssRange();
     rex            = new Regex(@"[\w\s]");
 }
Example #7
0
        public void PushTrans(ssTrans t)
        {
            switch (t.typ)
            {
            case ssTrans.Type.insert:
                CheckSeq(ref t.rng, true);
                break;

            case ssTrans.Type.delete:
                CheckSeq(ref t.rng, false);
                break;
            }
            BeginTrans();
            t.nxt       = seqRoot.nxt;
            seqRoot.nxt = t;
        }
Example #8
0
        public void Commit()
        {
            FormLogTrans(ssTrans.Type.dot, OldDot, "");
            ssTrans t = seqRoot.nxt;

            while (t != null)
            {
                txt.dot = t.rng;
                switch (t.typ)
                {
                case ssTrans.Type.rename:
                    string n = txt.Nm;
                    txt.Rename(t.s);
                    t.s = n;
                    break;

                case ssTrans.Type.delete:
                    //CheckSeq(ref t.rng, false);
                    t.s   = txt.ToString();
                    t.rng = txt.Delete();
                    t.typ = ssTrans.Type.insert;
                    break;

                case ssTrans.Type.insert:
                    //CheckSeq(ref t.rng, true);
                    t.rng = txt.Insert(t.s);
                    t.s   = null;
                    t.typ = ssTrans.Type.delete;
                    break;
                }

                ssTrans tt = t.nxt; // Grab t.nxt before LogTrans changes it.
                if (tt == null)
                {
                    if (t.typ != ssTrans.Type.rename)
                    {
                        txt.dot = t.rng;
                    }
                    txt.SyncFormToText();
                }
                EdLogTrans(t);  // Form keeps from logging ed.log transactions. We don't check it here.
                t = tt;
            }
        }
Example #9
0
        public void Delete()
        {
            ssTrans t = new ssTrans(ssTrans.Type.delete, 0, txt.dot, null, null);

            txt.TLog.PushTrans(t);
        }
Example #10
0
        public void Rename(string s)
        {
            ssTrans t = new ssTrans(ssTrans.Type.rename, 0, txt.dot, s, null);

            txt.TLog.PushTrans(t);
        }