void composite_box_rep::finalize () { int i, n= subnr (); lip= descend (ip, 0); rip= descend (ip, 1); for (i=0; i<n; i++) { path l= bs[i]->find_lip (); path r= bs[i]->find_rip (); /* cout << " i = " << i << "\n"; cout << " l = " << l << "\n"; cout << " r = " << r << "\n"; */ if (is_accessible (l) && is_accessible (r)) { if (is_decoration (lip) || path_less (reverse (l), reverse (lip))) lip= l; if (is_decoration (rip) || path_less (reverse (rip), reverse (r))) rip= r; } } /* cout << ((tree) (*((box_rep*) this))) << " " << ip << "\n"; cout << " lip= " << lip << "\n"; cout << " rip= " << rip << "\n"; */ }
void edit_select_rep::select (path p1, path p2) { //cout << "Select " << p1 << " -- " << p2 << "\n"; if (start_p == p1 && end_p == p2) return; if (!(rp <= p1 && rp <= p2)) return; if (start_p == end_p && p1 == p2) { start_p= copy (p1); end_p = copy (p2); return; } if (p1 != p2) { path cp= common (p1, p2); tree st= subtree (et, cp); if (!is_func (st, TABLE) && !is_func (st, ROW)) (void) semantic_select (cp, p1, p2, 0); } if (path_less (p1, p2)) { start_p= copy (p1); end_p = copy (p2); } else { start_p= copy (p2); end_p = copy (p1); } notify_change (THE_SELECTION); }
path composite_box_rep::find_box_path (path p, bool& found) { // cout << "Find box path " << box (this) << ", " << p // << "; " << reverse (ip) // << ", " << reverse (find_lip ()) // << " -- " << reverse (find_rip ()) << "\n"; int n= subnr(); // cout << "Search cursor " << p << " among " << n // << " at " << box (this) << " " << reverse (ip) << "\n"; if (n == 0) return box_rep::find_box_path (p, found); int start= n>>1, acc= start, step= (start+1)>>1; while (step > 0) { path sr= bs[acc]->find_rip (); while (!is_accessible (sr)) { acc--; if (acc<0) break; sr= bs[acc]->find_rip (); } if (acc<0) { start= 0; break; } if (path_less (reverse (sr), p)) { int old_start= start, old_acc= acc; start= min (n-1, start+ step); acc = start; while ((acc > old_start) && (!is_accessible (bs[acc]->find_rip ()))) acc--; if (acc == old_start) acc= old_acc; } else { start= max (0, start- step); acc = min (acc, start); } if (step <= 1) break; step= (step+1)>>1; } path bp; bool flag= false; int i= start; found= false; while (true) { path sl= bs[i]->find_lip (); path sr= bs[i]->find_rip (); // cout << " " << i << ":\t" << reverse(sl) <<", "<< reverse(sr) << "\n"; if (is_accessible (sl) && is_accessible (sr) && path_less_eq (reverse (sl), p) && path_less_eq (p, reverse (sr))) { flag= true; bp= path (i, bs[i]->find_box_path (p, found)); if (found) return bp; } i++; if (i==n) i=0; if (i==start) break; } if (is_accessible (ip) && (path_up (p) == reverse (ip)) && access_allowed ()) return box_rep::find_box_path (p, found); if (flag) return bp; if (start > 0) { path sl= bs[start-1]->find_rip (); path sr= bs[start ]->find_lip (); if (is_accessible (sl) && is_accessible (sr) && path_less_eq (reverse (sl), p) && path_less_eq (p, reverse (sr))) { int c1= N (common (reverse (sl), p)); int c2= N (common (reverse (sr), p)); int i = (c1 >= c2? start-1: start); return path (i, bs[i]->find_box_path (p, found)); } } return box_rep::find_box_path (p, flag); }
bool operator()(const CopiedString& path, const CopiedString& other) const { return path_less(path.c_str(), other.c_str()); }