// public void ModifyWrapInfo(string txt, int len, ref WLine wl, int stt) { // 設定幅での折り返しを実行する。 // 行の途中からの変更の場合、sttが開始addressを指している Painter p = cvs_.getPainter(); int ww = cvs_.wrapWidth(); while (stt < len) { int i, w; for (w = 0, i = stt; i < len; ++i) { if (txt[i] == '\t') { w = p.nextTab(w); } else { w += p.W(txt[i]); } if (w > ww) { break; // 幅が設定値を超えた所でおしまい } } wl.Add(stt = (i == stt?i + 1:i)); } }
// 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; }
/// <summary> /// 指定した分だけ新しく行情報を追加。 /// &折り返し情報もきちんと計算 /// </summary> /// <param name="ti_s"></param> /// <param name="ti_e"></param> /// <returns> /// 1: "折り返しあり" or "この行が横に一番長くなった" /// 0: "この行以外のどこかが最長" /// 詳しくは ReWrapSingle() を見よ。 /// </returns> public int InsertMulti(int ti_s, int ti_e) { int dy = 0, cx = 0; for (int i = ti_s; i <= ti_e; ++i) { WLine pwl = new WLine(); string ss = doc_.tl(i).ToString(); pwl.Add(CalcLineWidth(doc_.tl(i).ToString(), doc_.len(i))); int ww = cvs_.wrapWidth(); if (pwl.width < cvs_.wrapWidth()) { // 設定した折り返し幅より短い場合は一行で済む。 pwl.Add(doc_.len(i)); dy++; if (cx < pwl.width) { cx = pwl.width; } } else { // 複数行になる場合 ModifyWrapInfo(doc_.tl(i).ToString(), doc_.len(i), ref pwl, 0); dy += pwl.rln(); } //wrap_.InsertAt( i, pwl ); wrap_.Insert(i, pwl); } // 表示行の総数を修正 vlNum_ += dy; // 折り返しなしだと総横幅の更新が必要 if (cvs_.wrapType == WrapType.NonWrap) { if (textCx_ <= cx) { textCx_ = cx; return(1); } return(0); } return(1); }