Exemple #1
0
        //
        //-------------------------------------------------------------------------
        // 再描画したい範囲を Invalidate する。
        //-------------------------------------------------------------------------
        private void ReDraw(ReDrawType r, DPos s)
        {
            // まずスクロールバーを更新
            //UpdateScrollBar();

            switch (r)
            {
            case ReDrawType.ALL:     // 全画面
                //::InvalidateRect( hwnd_, NULL, FALSE );
                this.Invalidate(false);
                break;

            case ReDrawType.LNAREA:     // 行番号表示域のみ
                if (lna() > 0)
                {
                    Rectangle rc = new Rectangle(0, 0, lna(), bottom());
                    //::InvalidateRect( hwnd_, &rc, FALSE );
                    this.Invalidate(rc, false);
                }
                break;

            case ReDrawType.LINE:     // 指定した行の後半
            case ReDrawType.AFTER:    // 指定した行以下全部
                DPos st = (s.ad == 0 ? s : doc_.leftOf(s, true));
                InvalidateView(st, r == ReDrawType.AFTER);
                break;
            }
        }
Exemple #2
0
        internal ReDrawType TextUpdate_ScrollBar( DPos s, DPos e, DPos e2 ){
            int prevUdMax = vScrollBar.Maximum;
	        bool rlScrolled = ReSetScrollInfo();
            int vl_dif = (vScrollBar.Maximum - prevUdMax);
	        ReDrawType ans =
                (vl_dif != 0 || s.tl != e2.tl ? ReDrawType.AFTER : ReDrawType.LINE);

	        if( udScr_tl_ < s.tl ){
		        // パターン1:現在の画面上端より下で更新された場合
		        // スクロールしない
	        }
	        else if( udScr_tl_ == s.tl ){
		        // パターン2:現在の画面上端と同じ行で更新された場合
		        // 出来るだけ同じ位置を表示し続けようと試みる。

		        if( vScrollBar.Value >= vln() ){
			        // パターン2-1:しかしそこはすでにEOFよりも下だ!
			        // しゃーないので一番下の行を表示
                    vScrollBar.Value = vln() - 1;
			        udScr_tl_   = doc_.tln()-1;
			        udScr_vrl_  = rln(udScr_tl_)-1;
			        ans = ReDrawType.ALL;
		        }
		        else{
			        // パターン2-2:
			        // スクロール無し
			        while( udScr_vrl_ >= rln(udScr_tl_) ){
				        udScr_vrl_ -= rln(udScr_tl_);
				        udScr_tl_++;
			        }
		        }
	        }
	        else{
		        // パターン3:現在の画面上端より上で更新された場合
		        // 表示内容を変えないように頑張る

		        if( e.tl < udScr_tl_ ){
			        // パターン3-1:変更範囲の終端も、現在行より上の場合
			        // 行番号は変わるが表示内容は変わらないで済む
                    vScrollBar.Value += vl_dif;
			        udScr_tl_   += (e2.tl - e.tl);
                    ans = ReDrawType.LNAREA;
		        }
		        else{
			        // パターン3-2:
			        // どうしよーもないので適当な位置にスクロール
			        ForceScrollTo( e2.tl );
                    ans = ReDrawType.ALL;
		        }
	        }

	        // どんな再描画をすればよいか返す
            return (rlScrolled ? ReDrawType.ALL : ans);
        }
Exemple #3
0
        //
        public void on_text_update(DPos s, DPos e, DPos e2, bool bAft, bool mCur)
        {
            // まず、折り返し位置再計算

            // 置換範囲の先頭行を調整
            int r3 = 0, r2 = 1, r1 = ReWrapSingle(s);

            // 残りを調整
            if (s.tl != e.tl)
            {
                r2 = DeleteMulti(s.tl + 1, e.tl);
            }
            if (s.tl != e2.tl)
            {
                r3 = InsertMulti(s.tl + 1, e2.tl);
            }

            // この変更で横幅が…
            // if( "長くなったなてはいない" AND "短くなっちゃった可能性あり" )
            //     横幅再計算();
            if (!(r1 == 2 || r3 == 1) && (r1 == 0 || r2 == 0))
            {
                UpdateTextCx();
            }

            // スクロールバー修正
            ReDrawType t        = TextUpdate_ScrollBar(s, e, e2);
            bool       doResize = false;

            // 行数に変化があって、行番号表示域の幅を変えなきゃならん時
            if (e.tl != e2.tl && cvs_.on_tln_change(doc_.tln()))
            {
                doResize = true;
            }
            else if (bAft && t != ReDrawType.ALL)
            {
                t = ReDrawType.AFTER;
            }

            // カーソル移動
            cur_.on_text_update(s, e, e2, mCur);

            // 再描画
            if (doResize)
            {
                DoResize(true);
            }
            else
            {
                if (e.tl != e2.tl)          // 行番号領域再描画の必要があるとき
                {
                    ReDraw(ReDrawType.LNAREA, null);
                }

                //TODO DrawEventHandler
                if (DrawEventHandler != null)
                {
                    //ReDraw(ReDrawType.ALL, s);
                    ReDraw(ReDrawType.AFTER, s);
                }
                else
                {
                    ReDraw(t, s);
                }
            }
        }
Exemple #4
0
        //
        //-------------------------------------------------------------------------
        // 再描画したい範囲を Invalidate する。
        //-------------------------------------------------------------------------
        private void ReDraw( ReDrawType r, DPos s )
        {
            // まずスクロールバーを更新
            //UpdateScrollBar();

            switch( r ){
                case ReDrawType.ALL: // 全画面
                    //::InvalidateRect( hwnd_, NULL, FALSE );
                    this.Invalidate(false);
                break;

                case ReDrawType.LNAREA: // 行番号表示域のみ
                    if( lna() > 0 )
                    {
                        Rectangle rc = new Rectangle(0, 0, lna(), bottom());
                        //::InvalidateRect( hwnd_, &rc, FALSE );
                        this.Invalidate(rc, false);
                    }
                break;

                case ReDrawType.LINE: // 指定した行の後半
                case ReDrawType.AFTER: // 指定した行以下全部
                    DPos st = ( s.ad==0 ? s : doc_.leftOf(s,true) );
                    InvalidateView(st, r == ReDrawType.AFTER);
                break;
            }
        }