// //------------------------------------------------------------------------- // 再描画したい範囲を 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; } }
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); }
// 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); } } }
// //------------------------------------------------------------------------- // 再描画したい範囲を 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; } }