/// <summary> /// 指定した一行のみ折り返しを修正。 /// 昔は再描画範囲の計算のために、表示行数の変化を返していたが、 /// これは上位ルーチン側で vln() を比較すれば済むし、 /// むしろその方が効率的であるため廃止した。 /// </summary> /// <param name="s"></param> /// <returns> /// 2: "折り返しあり" or "この行が横に一番長くなった" /// 1: "この行以外のどこかが最長" /// 0: "さっきまでこの行は最長だったが短くなっちゃった" /// で、上位ルーチンにm_TextCx修正の必要性を伝える。 /// </returns> int ReWrapSingle(DPos s) { // 旧情報保存 WLine wl = wrap_[s.tl]; int oldVRNum = wl.rln(); int oldWidth = wl.width; // 横幅更新 wl.width = CalcLineWidth(doc_.tl(s.tl).ToString(), doc_.len(s.tl)); if (wl.width < cvs_.wrapWidth()) { // 設定した折り返し幅より短い場合は一行で済む。 wl[1] = doc_.len(s.tl); wl.ForceSize(2); } else { // 複数行になる場合 int vr = 1, stt = 0; while (wl[vr] < s.ad) // while( vr行目は変更箇所より手前 ) { stt = wl[vr++]; // stt = 次の行の行頭のアドレス } // 変更箇所以降のみ修正 wl.ForceSize(vr); ModifyWrapInfo(doc_.tl(s.tl).ToString(), doc_.len(s.tl), ref wl, stt); } // 表示行の総数を修正 vlNum_ += (wl.rln() - oldVRNum); // 折り返しなしだと総横幅の更新が必要 //if( cvs_.wrapType() == NOWRAP ) if (cvs_.wrapType == WrapType.NonWrap) { if (textCx_ <= wl.width) { textCx_ = wl.width; return(2); } else if (textCx_ == oldWidth) { return(0); } else { return(1); } } return(2); }
// public void ReWrapAll() { // 折り返し幅に変更があった場合に、全ての行の // 折り返し位置情報を変更する。 int ww = cvs_.wrapWidth(); int vln = 0; for (int i = 0, ie = doc_.tln(); i < ie; ++i) { WLine wl = wrap_[i]; wl.ForceSize(1); //wl.RemoveRange(1, wl.Count - 2); if (wl.width < ww) { // 設定した折り返し幅より短い場合は一行で済む。 wl.Add(doc_.len(i)); ++vln; } else { // 複数行になる場合 ModifyWrapInfo(doc_.tl(i).ToString(), doc_.len(i), ref wl, 0); vln += wl.rln(); } } vlNum_ = vln; }