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); } }
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; } } }
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; }
public ssTrans(Type t, long i, ssRange r, string ss, ssTrans nnxt) { typ = t; id = i; rng = r; s = ss; chgid = 1; nxt = nnxt; }
public void EdLogTrans(ssTrans t) { if (log) { t.id = ed.CurTransId; t.chgid = curChangeId; t.nxt = ts; ts = t; curChangeId++; } }
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]"); }
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; }
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; } }
public void Delete() { ssTrans t = new ssTrans(ssTrans.Type.delete, 0, txt.dot, null, null); txt.TLog.PushTrans(t); }
public void Rename(string s) { ssTrans t = new ssTrans(ssTrans.Type.rename, 0, txt.dot, s, null); txt.TLog.PushTrans(t); }