static IEnumerable <CssLineBox> GetLineWalkDownIter(LineWalkVisitor visitor, CssBox box) { //recursive float y = visitor._globalY; if (box.LineBoxCount > 0) { foreach (CssLineBox linebox in box.GetLineBoxIter()) { visitor._globalY = y + linebox.CachedLineTop; yield return(linebox); } } else { //element based foreach (CssBox childbox in box.GetChildBoxIter()) { visitor._globalY = y + childbox.LocalY; //recursive foreach (var linebox in GetLineWalkDownIter(visitor, childbox)) { yield return(linebox); } } } visitor._globalY = y; }
/// walk down and up /// </summary> /// <param name="startLine"></param> /// <returns></returns> static IEnumerable <CssLineBox> GetLineWalkDownAndUpIter(LineWalkVisitor visitor, CssLineBox startLine) { float sx, sy; startLine.OwnerBox.GetGlobalLocation(out sx, out sy); CssLineBox curLine = startLine; //walk up and down the tree CssLineBox nextline = curLine.NextLine; while (nextline != null) { visitor.globalY = sy + startLine.CachedLineTop; yield return(nextline); nextline = nextline.NextLine; } //-------------------- //no next line //then walk up *** CssBox curBox = startLine.OwnerBox; RETRY: CssBox level1Sibling = BoxHitUtils.GetNextSibling(curBox); while (level1Sibling != null) { level1Sibling.GetGlobalLocation(out sx, out sy); visitor.globalY = sy; //walk down foreach (var line in GetLineWalkDownIter(visitor, level1Sibling)) { yield return(line); } level1Sibling = BoxHitUtils.GetNextSibling(level1Sibling); } //-------------------- //other further sibling //then step to parent of lineOwner if (curBox.ParentBox != null) { //if has parent //walk up*** curBox = curBox.ParentBox; goto RETRY; } }
///// walk down and up ///// </summary> ///// <param name="startLine"></param> ///// <returns></returns> //static IEnumerable<CssLineBox> GetLineWalkDownAndUpIter(LineWalkVisitor visitor, CssLineBox startLine) //{ // float sx, sy; // startLine.OwnerBox.GetGlobalLocation(out sx, out sy); // CssLineBox curLine = startLine; // //walk up and down the tree // CssLineBox nextline = curLine.NextLine; // while (nextline != null) // { // visitor._globalY = sy + startLine.CachedLineTop; // yield return nextline; // nextline = nextline.NextLine; // } // //-------------------- // //no next line // //then walk up *** // CssBox curBox = startLine.OwnerBox; // RETRY://*** // CssBox level1Sibling = BoxHitUtils.GetNextSibling(curBox); // while (level1Sibling != null) // { // level1Sibling.GetGlobalLocation(out sx, out sy); // visitor._globalY = sy; // //walk down // foreach (CssLineBox line in GetLineWalkDownIter(visitor, level1Sibling)) // { // yield return line; // } // level1Sibling = BoxHitUtils.GetNextSibling(level1Sibling); // } // //-------------------- // //other further sibling // //then step to parent of lineOwner // if (curBox.ParentBox != null) // { // //if has parent // //walk up*** // curBox = curBox.ParentBox; // goto RETRY; // } //} /// walk down and up /// </summary> /// <param name="startLine"></param> /// <returns></returns> static IEnumerable <CssLineBox> GetLineWalkDownAndUpIter(LineWalkVisitor visitor, CssLineBox startLine) { PointF p = new PointF(); startLine.OwnerBox.GetGlobalLocationRelativeToRoot(ref p); CssLineBox curLine = startLine; //walk up and down the tree CssLineBox nextline = curLine.NextLine; while (nextline != null) { visitor._globalY = p.Y + startLine.CachedLineTop; yield return(nextline); nextline = nextline.NextLine; } //-------------------- //no next line //then walk up *** CssBox curBox = startLine.OwnerBox; RETRY: //*** CssBox level1Sibling = BoxHitUtils.GetNextSibling(curBox); while (level1Sibling != null) { p = new PointF(); level1Sibling.GetGlobalLocationRelativeToRoot(ref p); visitor._globalY = p.Y; //walk down foreach (CssLineBox line in GetLineWalkDownIter(visitor, level1Sibling)) { yield return(line); } level1Sibling = BoxHitUtils.GetNextSibling(level1Sibling); } //-------------------- //other further sibling //then step to parent of lineOwner if (curBox.ParentBox != null) { //if has parent //walk up*** curBox = curBox.ParentBox; goto RETRY; } }
void SetupEndHitPoint(CssBoxHitChain startChain, CssBoxHitChain endChain, ITextService textService) { //find global location of end point HitInfo endHit = endChain.GetLastHit(); int xposOnEndLine = 0; CssLineBox endline = null; //find endline first _endHitRunCharIndex = 0; _endHitRun = null; switch (endHit.hitObjectKind) { default: { throw new NotSupportedException(); } case HitObjectKind.Run: { CssRun endRun = (CssRun)endHit.hitObject; #if DEBUG //if (endRun.Text != null && endRun.Text.Contains("Jose")) //{ //} if (endHit.localX > 23) { } System.Diagnostics.Debug.WriteLine(endHit.localX); #endif endRun.FindSelectionPoint(textService, endHit.localX, out int run_sel_index, out int run_sel_offset); endline = endRun.HostLine; xposOnEndLine = (int)(endRun.Left + run_sel_offset); _endHitRunCharIndex = run_sel_index; #if DEBUG System.Diagnostics.Debug.WriteLine(_endHitRunCharIndex); #endif _endHitRun = endRun; } break; case HitObjectKind.LineBox: { endline = (CssLineBox)endHit.hitObject; xposOnEndLine = endHit.localX; } break; case HitObjectKind.CssBox: { CssBox hitBox = (CssBox)endHit.hitObject; endline = FindNearestLine(hitBox, endChain.RootGlobalY, 5); xposOnEndLine = endHit.localX; } break; } #if DEBUG if (xposOnEndLine == 0) { } #endif //---------------------------------- _selectedLines = new List <CssLineBox>(); if (_startHitHostLine == endline) { _selectedLines.Add(endline); _startHitHostLine.Select(_startLineBeginSelectionAtPixel, xposOnEndLine, _startHitRun, _startHitRunCharIndex, _endHitRun, _endHitRunCharIndex); return; //early exit here *** } //---------------------------------- //select on different line LineWalkVisitor lineWalkVisitor = null; if (FindCommonGround(startChain, endChain, out int breakAtLevel) && breakAtLevel > 0) { CssBlockRun hitBlockRun = endChain.GetHitInfo(breakAtLevel).hitObject as CssBlockRun; //multiple select //1. first part if (hitBlockRun != null) { _startHitHostLine.Select(_startLineBeginSelectionAtPixel, (int)hitBlockRun.Left, _startHitRun, _startHitRunCharIndex, _endHitRun, _endHitRunCharIndex); _selectedLines.Add(_startHitHostLine); lineWalkVisitor = new LineWalkVisitor(hitBlockRun); } else { _startHitHostLine.SelectPartialToEnd(_startLineBeginSelectionAtPixel, _startHitRun, _startHitRunCharIndex); _selectedLines.Add(_startHitHostLine); lineWalkVisitor = new LineWalkVisitor(_startHitHostLine); } } else { _startHitHostLine.SelectPartialToEnd(_startLineBeginSelectionAtPixel, _startHitRun, _startHitRunCharIndex); _selectedLines.Add(_startHitHostLine); lineWalkVisitor = new LineWalkVisitor(_startHitHostLine); } lineWalkVisitor.SetWalkTargetPosition(endChain.RootGlobalX, endChain.RootGlobalY); #if DEBUG int dbugExpectedId = 1; #endif lineWalkVisitor.Walk(endline, (lineCoverage, linebox, partialLineRun) => { #if DEBUG //System.Diagnostics.Debug.WriteLine("sel:" + linebox.dbugId); if (dbugExpectedId != linebox.dbugId) { } dbugExpectedId++; #endif switch (lineCoverage) { case LineCoverage.EndLine: { //found end line linebox.SelectPartialFromStart(xposOnEndLine, _endHitRun, _endHitRunCharIndex); _selectedLines.Add(linebox); } break; case LineCoverage.PartialLine: { linebox.SelectPartialFromStart((int)partialLineRun.Right, _endHitRun, _endHitRunCharIndex); _selectedLines.Add(linebox); } break; case LineCoverage.FullLine: { //check if hitpoint is in the line area linebox.SelectFull(); _selectedLines.Add(linebox); } break; } }); }
void SetupEndHitPoint(CssBoxHitChain startChain, CssBoxHitChain endChain, ITextService ifonts) { //find global location of end point HitInfo endHit = endChain.GetLastHit(); int xposOnEndLine = 0; CssLineBox endline = null; int run_sel_offset = 0; //find endline first this.endHitRunCharIndex = 0; this.endHitRun = null; switch (endHit.hitObjectKind) { default: { throw new NotSupportedException(); } case HitObjectKind.Run: { CssRun endRun = (CssRun)endHit.hitObject; //if (endRun.Text != null && endRun.Text.Contains("Jose")) //{ //} int run_sel_index; endRun.FindSelectionPoint(ifonts, endHit.localX, out run_sel_index, out run_sel_offset); endline = endRun.HostLine; xposOnEndLine = (int)(endRun.Left + run_sel_offset); this.endHitRunCharIndex = run_sel_index; this.endHitRun = endRun; } break; case HitObjectKind.LineBox: { endline = (CssLineBox)endHit.hitObject; xposOnEndLine = endHit.localX; } break; case HitObjectKind.CssBox: { CssBox hitBox = (CssBox)endHit.hitObject; endline = FindNearestLine(hitBox, endChain.RootGlobalY, 5); xposOnEndLine = endHit.localX; } break; } #if DEBUG if (xposOnEndLine == 0) { } #endif //---------------------------------- this.selectedLines = new List <CssLineBox>(); if (startHitHostLine == endline) { this.selectedLines.Add(endline); startHitHostLine.Select(startLineBeginSelectionAtPixel, xposOnEndLine, this.startHitRun, this.startHitRunCharIndex, this.endHitRun, this.endHitRunCharIndex); return; //early exit here *** } //---------------------------------- //select on different line LineWalkVisitor lineWalkVisitor = null; int breakAtLevel; if (FindCommonGround(startChain, endChain, out breakAtLevel) && breakAtLevel > 0) { var hit1 = endChain.GetHitInfo(breakAtLevel).hitObject; var hitBlockRun = hit1 as CssBlockRun; //multiple select //1. first part if (hitBlockRun != null) { startHitHostLine.Select(startLineBeginSelectionAtPixel, (int)hitBlockRun.Left, this.startHitRun, this.startHitRunCharIndex, this.endHitRun, this.endHitRunCharIndex); selectedLines.Add(this.startHitHostLine); lineWalkVisitor = new LineWalkVisitor(hitBlockRun); } else { startHitHostLine.SelectPartialToEnd(startLineBeginSelectionAtPixel, this.startHitRun, this.startHitRunCharIndex); selectedLines.Add(this.startHitHostLine); lineWalkVisitor = new LineWalkVisitor(startHitHostLine); } } else { startHitHostLine.SelectPartialToEnd(startLineBeginSelectionAtPixel, this.startHitRun, this.startHitRunCharIndex); selectedLines.Add(this.startHitHostLine); lineWalkVisitor = new LineWalkVisitor(startHitHostLine); } lineWalkVisitor.SetWalkTargetPosition(endChain.RootGlobalX, endChain.RootGlobalY); lineWalkVisitor.Walk(endline, (lineCoverage, linebox, partialLineRun) => { switch (lineCoverage) { case LineCoverage.EndLine: { //found end line linebox.SelectPartialFromStart(xposOnEndLine, this.endHitRun, this.endHitRunCharIndex); selectedLines.Add(linebox); } break; case LineCoverage.PartialLine: { linebox.SelectPartialFromStart((int)partialLineRun.Right, this.endHitRun, this.endHitRunCharIndex); selectedLines.Add(linebox); } break; case LineCoverage.FullLine: { //check if hitpoint is in the line area linebox.SelectFull(); selectedLines.Add(linebox); } break; } }); }
static IEnumerable<CssLineBox> GetLineWalkDownIter(LineWalkVisitor visitor, CssBox box) { //recursive float y = visitor.globalY; if (box.LineBoxCount > 0) { foreach (var linebox in box.GetLineBoxIter()) { visitor.globalY = y + linebox.CachedLineTop; yield return linebox; } } else { //element based foreach (var childbox in box.GetChildBoxIter()) { visitor.globalY = y + childbox.LocalY; //recursive foreach (var linebox in GetLineWalkDownIter(visitor, childbox)) { yield return linebox; } } } visitor.globalY = y; }
/// walk down and up /// </summary> /// <param name="startLine"></param> /// <returns></returns> static IEnumerable<CssLineBox> GetLineWalkDownAndUpIter(LineWalkVisitor visitor, CssLineBox startLine) { float sx, sy; startLine.OwnerBox.GetGlobalLocation(out sx, out sy); CssLineBox curLine = startLine; //walk up and down the tree CssLineBox nextline = curLine.NextLine; while (nextline != null) { visitor.globalY = sy + startLine.CachedLineTop; yield return nextline; nextline = nextline.NextLine; } //-------------------- //no next line //then walk up *** CssBox curBox = startLine.OwnerBox; RETRY: CssBox level1Sibling = BoxHitUtils.GetNextSibling(curBox); while (level1Sibling != null) { level1Sibling.GetGlobalLocation(out sx, out sy); visitor.globalY = sy; //walk down foreach (var line in GetLineWalkDownIter(visitor, level1Sibling)) { yield return line; } level1Sibling = BoxHitUtils.GetNextSibling(level1Sibling); } //-------------------- //other further sibling //then step to parent of lineOwner if (curBox.ParentBox != null) { //if has parent //walk up*** curBox = curBox.ParentBox; goto RETRY; } }
void SetupEndHitPoint(CssBoxHitChain startChain, CssBoxHitChain endChain, IFonts ifonts) { //find global location of end point HitInfo endHit = endChain.GetLastHit(); int xposOnEndLine = 0; CssLineBox endline = null; int run_sel_offset = 0; //find endline first this.endHitRunCharIndex = 0; this.endHitRun = null; switch (endHit.hitObjectKind) { default: { throw new NotSupportedException(); } case HitObjectKind.Run: { CssRun endRun = (CssRun)endHit.hitObject; //if (endRun.Text != null && endRun.Text.Contains("Jose")) //{ //} int run_sel_index; endRun.FindSelectionPoint(ifonts, endHit.localX, out run_sel_index, out run_sel_offset); endline = endRun.HostLine; xposOnEndLine = (int)(endRun.Left + run_sel_offset); this.endHitRunCharIndex = run_sel_index; this.endHitRun = endRun; } break; case HitObjectKind.LineBox: { endline = (CssLineBox)endHit.hitObject; xposOnEndLine = endHit.localX; } break; case HitObjectKind.CssBox: { CssBox hitBox = (CssBox)endHit.hitObject; endline = FindNearestLine(hitBox, endChain.RootGlobalY, 5); xposOnEndLine = endHit.localX; } break; } #if DEBUG if (xposOnEndLine == 0) { } #endif //---------------------------------- this.selectedLines = new List<CssLineBox>(); if (startHitHostLine == endline) { this.selectedLines.Add(endline); startHitHostLine.Select(startLineBeginSelectionAtPixel, xposOnEndLine, this.startHitRun, this.startHitRunCharIndex, this.endHitRun, this.endHitRunCharIndex); return; //early exit here *** } //---------------------------------- //select on different line LineWalkVisitor lineWalkVisitor = null; int breakAtLevel; if (FindCommonGround(startChain, endChain, out breakAtLevel) && breakAtLevel > 0) { var hit1 = endChain.GetHitInfo(breakAtLevel).hitObject; var hitBlockRun = hit1 as CssBlockRun; //multiple select //1. first part if (hitBlockRun != null) { startHitHostLine.Select(startLineBeginSelectionAtPixel, (int)hitBlockRun.Left, this.startHitRun, this.startHitRunCharIndex, this.endHitRun, this.endHitRunCharIndex); selectedLines.Add(this.startHitHostLine); lineWalkVisitor = new LineWalkVisitor(hitBlockRun); } else { startHitHostLine.SelectPartialToEnd(startLineBeginSelectionAtPixel, this.startHitRun, this.startHitRunCharIndex); selectedLines.Add(this.startHitHostLine); lineWalkVisitor = new LineWalkVisitor(startHitHostLine); } } else { startHitHostLine.SelectPartialToEnd(startLineBeginSelectionAtPixel, this.startHitRun, this.startHitRunCharIndex); selectedLines.Add(this.startHitHostLine); lineWalkVisitor = new LineWalkVisitor(startHitHostLine); } lineWalkVisitor.SetWalkTargetPosition(endChain.RootGlobalX, endChain.RootGlobalY); lineWalkVisitor.Walk(endline, (lineCoverage, linebox, partialLineRun) => { switch (lineCoverage) { case LineCoverage.EndLine: { //found end line linebox.SelectPartialFromStart(xposOnEndLine, this.endHitRun, this.endHitRunCharIndex); selectedLines.Add(linebox); } break; case LineCoverage.PartialLine: { linebox.SelectPartialFromStart((int)partialLineRun.Right, this.endHitRun, this.endHitRunCharIndex); selectedLines.Add(linebox); } break; case LineCoverage.FullLine: { //check if hitpoint is in the line area linebox.SelectFull(); selectedLines.Add(linebox); } break; } }); }