dcdd144598 2011-02-23 kinaba: #ifndef _EDITWING_IP_VIEW_H_ dcdd144598 2011-02-23 kinaba: #define _EDITWING_IP_VIEW_H_ dcdd144598 2011-02-23 kinaba: #include "ewView.h" dcdd144598 2011-02-23 kinaba: #include "ip_doc.h" dcdd144598 2011-02-23 kinaba: using namespace ki; dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: namespace editwing { dcdd144598 2011-02-23 kinaba: namespace view { dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: using doc::DocImpl; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ @pkg editwing.View.Impl //@} dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 描画基本ルーチン dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 利用するには、Canvasオブジェクトから getPainter して使います。 dcdd144598 2011-02-23 kinaba: // 画面用デバイスコンテキストのレイヤです。きちんと書いておけば印刷機能を dcdd144598 2011-02-23 kinaba: // 追加するときに楽なのかもしれませんが、そんなことを考える計画性が dcdd144598 2011-02-23 kinaba: // あるはずもなく極めて適当に…。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class Painter : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ~Painter(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定位置に一文字出力 //@} dcdd144598 2011-02-23 kinaba: void CharOut( unicode ch, int x, int y ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 指定位置に文字列を出力 //@} dcdd144598 2011-02-23 kinaba: void StringOut( const unicode* str, int len, int x, int y ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 文字色切り替え //@} dcdd144598 2011-02-23 kinaba: void SetColor( int i ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 背景色で塗りつぶし //@} dcdd144598 2011-02-23 kinaba: void Fill( const RECT& rc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 反転 //@} dcdd144598 2011-02-23 kinaba: void Invert( const RECT& rc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 線を引く //@} dcdd144598 2011-02-23 kinaba: void DrawLine( int x1, int y1, int x2, int y2 ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ クリップ領域設定 //@} dcdd144598 2011-02-23 kinaba: void SetClip( const RECT& rc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ クリップ領域解除 //@} dcdd144598 2011-02-23 kinaba: void ClearClip(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 半角スペース用記号描画 //@} dcdd144598 2011-02-23 kinaba: void DrawHSP( int x, int y, int times ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 全角スペース用記号描画 //@} dcdd144598 2011-02-23 kinaba: void DrawZSP( int x, int y, int times ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 高さ(pixel) //@} dcdd144598 2011-02-23 kinaba: int H() const { return height_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 数字幅(pixel) //@} dcdd144598 2011-02-23 kinaba: int F() const { return figWidth_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 文字幅(pixel) //@} dcdd144598 2011-02-23 kinaba: int Wc( unicode ch ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( widthTable_[ ch ] == -1 ) dcdd144598 2011-02-23 kinaba: ::GetCharWidthW( dc_, ch, ch, widthTable_+ch ); dcdd144598 2011-02-23 kinaba: return widthTable_[ ch ]; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: int W( const unicode* pch ) const // 1.08 サロゲートペア回避 dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: unicode ch = *pch; dcdd144598 2011-02-23 kinaba: if( widthTable_[ ch ] == -1 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( isHighSurrogate(ch) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SIZE sz; dcdd144598 2011-02-23 kinaba: if( ::GetTextExtentPoint32W( dc_, pch, 2, &sz ) ) dcdd144598 2011-02-23 kinaba: return sz.cx; dcdd144598 2011-02-23 kinaba: int w = 0; dcdd144598 2011-02-23 kinaba: ::GetCharWidthW( dc_, ch, ch, &w ); dcdd144598 2011-02-23 kinaba: return w; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: ::GetCharWidthW( dc_, ch, ch, widthTable_+ch ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return widthTable_[ ch ]; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 標準文字幅(pixel) //@} dcdd144598 2011-02-23 kinaba: int W() const { return widthTable_[ L'x' ]; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 次のタブ揃え位置を計算 //@} dcdd144598 2011-02-23 kinaba: //int nextTab(int x) const { int t=T(); return (x/t+1)*t; } dcdd144598 2011-02-23 kinaba: int nextTab(int x) const { int t=T(); return ((x+4)/t+1)*t; } dcdd144598 2011-02-23 kinaba: private: int T() const { return widthTable_[ L'\t' ]; } public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 現在のフォント情報 //@} dcdd144598 2011-02-23 kinaba: const LOGFONT& LogFont() const { return logfont_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 特別文字を描画するか否か //@} dcdd144598 2011-02-23 kinaba: bool sc( int i ) const { return scDraw_[i]; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: const HDC dc_; dcdd144598 2011-02-23 kinaba: const HFONT font_; dcdd144598 2011-02-23 kinaba: const HPEN pen_; dcdd144598 2011-02-23 kinaba: const HBRUSH brush_; dcdd144598 2011-02-23 kinaba: int height_; dcdd144598 2011-02-23 kinaba: int* widthTable_; dcdd144598 2011-02-23 kinaba: int figWidth_; dcdd144598 2011-02-23 kinaba: LOGFONT logfont_; dcdd144598 2011-02-23 kinaba: COLORREF colorTable_[7]; dcdd144598 2011-02-23 kinaba: bool scDraw_[5]; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Painter( HDC hdc, const VConfig& vc ); dcdd144598 2011-02-23 kinaba: HDC getDC() { return dc_; } dcdd144598 2011-02-23 kinaba: friend class Canvas; dcdd144598 2011-02-23 kinaba: NOCOPY(Painter); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 描画可能領域 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // ウインドウサイズの変更や折り返しの有無やフォントの設定などに dcdd144598 2011-02-23 kinaba: // 対応して、描画領域のサイズを適当に管理します。やることは dcdd144598 2011-02-23 kinaba: // とりあえずそれだけ。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class Canvas : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Canvas( const View& vw ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ Viewの大きさ変更イベント処理 dcdd144598 2011-02-23 kinaba: // @return 折り返し幅が変わったらtrue //@} dcdd144598 2011-02-23 kinaba: bool on_view_resize( int cx, int cy ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 行数変更イベント処理 dcdd144598 2011-02-23 kinaba: // @return テキスト領域の幅が変わったらtrue //@} dcdd144598 2011-02-23 kinaba: bool on_tln_change( ulong tln ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ フォント変更イベント処理 //@} dcdd144598 2011-02-23 kinaba: void on_font_change( const VConfig& vc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 設定変更イベント処理 //@} dcdd144598 2011-02-23 kinaba: void on_config_change( int wrap, bool showln ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ [行番号を表示するか否か] //@} dcdd144598 2011-02-23 kinaba: bool showLN() const { return showLN_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ [-1:折り返し無し 0:窓右端 else:指定文字数] //@} dcdd144598 2011-02-23 kinaba: int wrapType() const { return wrapType_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 折り返し幅(pixel) //@} dcdd144598 2011-02-23 kinaba: ulong wrapWidth() const { return wrapWidth_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 表示領域の位置(pixel) //@} dcdd144598 2011-02-23 kinaba: const RECT& zone() const { return txtZone_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 描画用オブジェクト //@} dcdd144598 2011-02-23 kinaba: Painter& getPainter() const { return *font_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int wrapType_; // [ -1:折り返し無し 0:窓右端 else:指定文字数 ] dcdd144598 2011-02-23 kinaba: bool showLN_; // [ 行番号を表示するか否か ] dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dptr<Painter> font_; // 描画用オブジェクト dcdd144598 2011-02-23 kinaba: ulong wrapWidth_; // 折り返し幅(pixel) dcdd144598 2011-02-23 kinaba: RECT txtZone_; // テキスト表示域の位置(pixel) dcdd144598 2011-02-23 kinaba: int figNum_; // 行番号の桁数 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool CalcLNAreaWidth(); dcdd144598 2011-02-23 kinaba: void CalcWrapWidth(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(Canvas); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 行毎の折り返し情報 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: struct WLine : public storage<ulong> dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // [0] : その行の折り返し無しでの横幅を格納 dcdd144598 2011-02-23 kinaba: // [1-n] : n行目の終端のindexを格納。 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 例えば "aaabbb" という論理行を "aaab" "bb" と折るなら dcdd144598 2011-02-23 kinaba: // {48, 4, 6} などという長さ3の配列となる。 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: WLine() : storage<ulong>(2) {} dcdd144598 2011-02-23 kinaba: ulong& width() { return (*this)[0]; } dcdd144598 2011-02-23 kinaba: ulong width() const { return (*this)[0]; } dcdd144598 2011-02-23 kinaba: ulong rln() const { return size()-1; } dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 再描画範囲を指定するためのフラグ dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: enum ReDrawType dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LNAREA, // 行番号ゾーンのみ dcdd144598 2011-02-23 kinaba: LINE, // 変更のあった一行のみ dcdd144598 2011-02-23 kinaba: AFTER, // 変更のあった行以下全部 dcdd144598 2011-02-23 kinaba: ALL // 全画面 dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 描画処理を細かく指定する構造体 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: struct VDrawInfo dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: const RECT rc; // 再描画範囲 dcdd144598 2011-02-23 kinaba: int XBASE; // 一番左の文字のx座標 dcdd144598 2011-02-23 kinaba: int XMIN; // テキスト再描画範囲左端 dcdd144598 2011-02-23 kinaba: int XMAX; // テキスト再描画範囲右端 dcdd144598 2011-02-23 kinaba: int YMIN; // テキスト再描画範囲上端 dcdd144598 2011-02-23 kinaba: int YMAX; // テキスト再描画範囲下端 dcdd144598 2011-02-23 kinaba: ulong TLMIN; // テキスト再描画範囲上端論理行番号 dcdd144598 2011-02-23 kinaba: int SXB, SXE; // 選択範囲のx座標 dcdd144598 2011-02-23 kinaba: int SYB, SYE; // 選択範囲のy座標 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: explicit VDrawInfo( const RECT& r ) : rc(r) {} dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 折り返しedテキストの管理・表示等 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // Canvasクラスによって計算された領域サイズを参考に、テキストの dcdd144598 2011-02-23 kinaba: // 折り返し処理を実行する。ここで、スクロール制御、描画処理など dcdd144598 2011-02-23 kinaba: // 主要な処理は全て実行することになる。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class ViewImpl : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ViewImpl( View& vw, DocImpl& dc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 折り返し方式切替 //@} dcdd144598 2011-02-23 kinaba: void SetWrapType( int wt ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 行番号表示/非表示切替 //@} dcdd144598 2011-02-23 kinaba: void ShowLineNo( bool show ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 表示色・フォント切替 //@} dcdd144598 2011-02-23 kinaba: void SetFont( const VConfig& vc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト領域のサイズ変更イベント //@} dcdd144598 2011-02-23 kinaba: void on_view_resize( int cx, int cy ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DoResize( bool wrapWidthChanged ); dcdd144598 2011-02-23 kinaba: void DoConfigChange(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキストデータの更新イベント //@} dcdd144598 2011-02-23 kinaba: void on_text_update( const DPos& s, dcdd144598 2011-02-23 kinaba: const DPos& e, const DPos& e2, bool bAft, bool mCur ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 描画処理 //@} dcdd144598 2011-02-23 kinaba: void on_paint( const PAINTSTRUCT& ps ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 全表示行数 //@} dcdd144598 2011-02-23 kinaba: ulong vln() const { return vlNum_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 一行の表示行数 //@} dcdd144598 2011-02-23 kinaba: ulong rln( ulong tl ) const { return wrap_[tl].rln(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 折り返し位置 //@} dcdd144598 2011-02-23 kinaba: ulong rlend( ulong tl, ulong rl ) const { return wrap_[tl][rl+1]; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 一個でも折り返しが存在するか否か //@} dcdd144598 2011-02-23 kinaba: bool wrapexists() const { return doc_.tln() != vln(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ カーソル //@} dcdd144598 2011-02-23 kinaba: Cursor& cur() { return cur_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ フォント //@} dcdd144598 2011-02-23 kinaba: const Painter& fnt() const { return cvs_.getPainter(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void on_hscroll( int code ); dcdd144598 2011-02-23 kinaba: void on_vscroll( int code ); dcdd144598 2011-02-23 kinaba: void on_wheel( short delta ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GetVPos( int x, int y, VPos* vp, bool linemode=false ) const; dcdd144598 2011-02-23 kinaba: void GetOrigin( int* x, int* y ) const; dcdd144598 2011-02-23 kinaba: void ConvDPosToVPos( DPos dp, VPos* vp, const VPos* base=NULL ) const; dcdd144598 2011-02-23 kinaba: void ScrollTo( const VPos& vp ); dcdd144598 2011-02-23 kinaba: int GetLastWidth( ulong tl ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: const RECT& zone() const { return cvs_.zone(); } dcdd144598 2011-02-23 kinaba: int left() const { return cvs_.zone().left; } dcdd144598 2011-02-23 kinaba: int right() const { return cvs_.zone().right; } dcdd144598 2011-02-23 kinaba: int bottom()const { return cvs_.zone().bottom; } dcdd144598 2011-02-23 kinaba: int lna() const { return cvs_.zone().left; } dcdd144598 2011-02-23 kinaba: int cx() const { return cvs_.zone().right - cvs_.zone().left; } dcdd144598 2011-02-23 kinaba: int cxAll() const { return cvs_.zone().right; } dcdd144598 2011-02-23 kinaba: int cy() const { return cvs_.zone().bottom; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: const DocImpl& doc_; dcdd144598 2011-02-23 kinaba: Canvas cvs_; dcdd144598 2011-02-23 kinaba: Cursor cur_; dcdd144598 2011-02-23 kinaba: gapbufobj<WLine> wrap_; dcdd144598 2011-02-23 kinaba: ulong vlNum_; dcdd144598 2011-02-23 kinaba: ulong textCx_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DrawLNA( const VDrawInfo& v, Painter& p ); dcdd144598 2011-02-23 kinaba: void DrawTXT( const VDrawInfo v, Painter& p ); dcdd144598 2011-02-23 kinaba: void Inv( int y, int xb, int xe, Painter& p ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void CalcEveryLineWidth(); dcdd144598 2011-02-23 kinaba: ulong CalcLineWidth( const unicode* txt, ulong len ) const; dcdd144598 2011-02-23 kinaba: void ModifyWrapInfo( const unicode* txt, ulong len, WLine& wl, ulong stt ); dcdd144598 2011-02-23 kinaba: void ReWrapAll(); dcdd144598 2011-02-23 kinaba: int ReWrapSingle( const DPos& s ); dcdd144598 2011-02-23 kinaba: int InsertMulti( ulong ti_s, ulong ti_e ); dcdd144598 2011-02-23 kinaba: int DeleteMulti( ulong ti_s, ulong ti_e ); dcdd144598 2011-02-23 kinaba: void UpdateTextCx(); dcdd144598 2011-02-23 kinaba: void ReDraw( ReDrawType r, const DPos* s=NULL ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: HWND hwnd_; dcdd144598 2011-02-23 kinaba: SCROLLINFO rlScr_; // 横スクロール情報(pixel単位) dcdd144598 2011-02-23 kinaba: SCROLLINFO udScr_; // 縦スクロール情報(行単位) dcdd144598 2011-02-23 kinaba: ulong udScr_tl_; // 一番上に表示される論理行のTLine_Index dcdd144598 2011-02-23 kinaba: ulong udScr_vrl_; // 一番上に表示される表示行のVRLine_Index dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool ReSetScrollInfo(); dcdd144598 2011-02-23 kinaba: void ForceScrollTo( ulong tl ); dcdd144598 2011-02-23 kinaba: void UpdateScrollBar(); dcdd144598 2011-02-23 kinaba: ReDrawType TextUpdate_ScrollBar( const DPos& s, const DPos& e, const DPos& e2 ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong tl2vl( ulong tl ) const; dcdd144598 2011-02-23 kinaba: void GetDrawPosInfo( VDrawInfo& v ) const; dcdd144598 2011-02-23 kinaba: void InvalidateView( const DPos& dp, bool afterall ) const; dcdd144598 2011-02-23 kinaba: void ScrollView( int dx, int dy, bool update ); dcdd144598 2011-02-23 kinaba: void UpDown( int dy, bool thumb ); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void ViewImpl::on_view_resize( int cx, int cy ) dcdd144598 2011-02-23 kinaba: { DoResize( cvs_.on_view_resize( cx, cy ) ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void ViewImpl::SetWrapType( int wt ) dcdd144598 2011-02-23 kinaba: { cvs_.on_config_change( wt, cvs_.showLN() ); dcdd144598 2011-02-23 kinaba: DoConfigChange(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void ViewImpl::ShowLineNo( bool show ) dcdd144598 2011-02-23 kinaba: { cvs_.on_config_change( cvs_.wrapType(), show ); dcdd144598 2011-02-23 kinaba: DoConfigChange(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void ViewImpl::SetFont( const VConfig& vc ) dcdd144598 2011-02-23 kinaba: { cvs_.on_font_change( vc ); dcdd144598 2011-02-23 kinaba: cur_.on_setfocus(); dcdd144598 2011-02-23 kinaba: CalcEveryLineWidth(); // 行幅再計算 dcdd144598 2011-02-23 kinaba: DoConfigChange(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void ViewImpl::GetOrigin( int* x, int* y ) const dcdd144598 2011-02-23 kinaba: { *x = left()-rlScr_.nPos, *y = -udScr_.nPos*cvs_.getPainter().H(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: }} // namespace editwing::view dcdd144598 2011-02-23 kinaba: #endif // _EDITWING_IP_VIEW_H_