Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        //
        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;
        }