dcdd144598 2011-02-23 kinaba: #ifndef _EDITWING_VIEW_H_ dcdd144598 2011-02-23 kinaba: #define _EDITWING_VIEW_H_ dcdd144598 2011-02-23 kinaba: #include "ewCommon.h" dcdd144598 2011-02-23 kinaba: #include "ewDoc.h" 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: class Canvas; dcdd144598 2011-02-23 kinaba: class ViewImpl; dcdd144598 2011-02-23 kinaba: class Cursor; dcdd144598 2011-02-23 kinaba: class Caret; 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 //@} 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: // Canvas/ViewImpl 等で行う。ので、詳しくはそちらを参照のこと。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class View : public ki::WndImpl, public doc::DocEvHandler 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: View( doc::Document& d, HWND wnd ); dcdd144598 2011-02-23 kinaba: ~View(); 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: ViewImpl& impl() { return *impl_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ カーソル //@} dcdd144598 2011-02-23 kinaba: Cursor& cur(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: doc::DocImpl& doc_; dcdd144598 2011-02-23 kinaba: ki::dptr<ViewImpl> impl_; dcdd144598 2011-02-23 kinaba: static ClsName className_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void on_create( CREATESTRUCT* cs ); dcdd144598 2011-02-23 kinaba: void on_destroy(); dcdd144598 2011-02-23 kinaba: LRESULT on_message( UINT msg, WPARAM wp, LPARAM lp ); dcdd144598 2011-02-23 kinaba: void on_text_update( const DPos& s, const DPos& e, const DPos& e2, bool bAft, bool mCur ); dcdd144598 2011-02-23 kinaba: void on_keyword_change(); 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 CurEvHandler dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: friend class Cursor; dcdd144598 2011-02-23 kinaba: virtual void on_move( const DPos& c, const DPos& s ) {} dcdd144598 2011-02-23 kinaba: virtual void on_char( Cursor& cur, unicode wch ); dcdd144598 2011-02-23 kinaba: virtual void on_key( Cursor& cur, int vk, bool sft, bool ctl ); dcdd144598 2011-02-23 kinaba: virtual void on_ime( Cursor& cur, unicode* str, ulong len ); 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: // 表示位置情報まで含めたDPos dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: struct VPos : public DPos dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ulong vl; // VLine-Index dcdd144598 2011-02-23 kinaba: ulong rl; // RLine-Index dcdd144598 2011-02-23 kinaba: int vx; // スクロールを考慮しない仮想スクリーン上のx座標(pixel) dcdd144598 2011-02-23 kinaba: int rx; // 文字の並びに左右されてないx座標(pixel) dcdd144598 2011-02-23 kinaba: // == 長い行のしっぽから短い行に [↑] で移動して dcdd144598 2011-02-23 kinaba: // == その後 [↓] で戻れるようなアレです。 dcdd144598 2011-02-23 kinaba: void operator=( const DPos& dp ) { tl=dp.tl, ad=dp.ad; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: VPos(bool) : DPos(0,0),vl(0),rl(0),vx(0),rx(0) {} dcdd144598 2011-02-23 kinaba: VPos() {} 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 Cursor : public ki::Object 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: Cursor( HWND wnd, ViewImpl& vw, doc::DocImpl& dc ); dcdd144598 2011-02-23 kinaba: ~Cursor(); dcdd144598 2011-02-23 kinaba: void AddHandler( CurEvHandler* ev ); dcdd144598 2011-02-23 kinaba: void DelHandler( CurEvHandler* ev ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // カーソル移動 dcdd144598 2011-02-23 kinaba: void MoveCur( const DPos& dp, bool select ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // キーによるカーソル移動 dcdd144598 2011-02-23 kinaba: void Left( bool wide, bool select ); dcdd144598 2011-02-23 kinaba: void Right( bool wide, bool select ); dcdd144598 2011-02-23 kinaba: void Up( bool wide, bool select ); dcdd144598 2011-02-23 kinaba: void Down( bool wide, bool select ); dcdd144598 2011-02-23 kinaba: void Home( bool wide, bool select ); dcdd144598 2011-02-23 kinaba: void End( bool wide, bool select ); dcdd144598 2011-02-23 kinaba: void PageUp( bool select ); dcdd144598 2011-02-23 kinaba: void PageDown( bool select ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // テキスト書き換え dcdd144598 2011-02-23 kinaba: void Input( const unicode* str, ulong len ); dcdd144598 2011-02-23 kinaba: void Input( const char* str, ulong len ); dcdd144598 2011-02-23 kinaba: void InputChar( unicode ch ); dcdd144598 2011-02-23 kinaba: void Del(); dcdd144598 2011-02-23 kinaba: void DelBack(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // クリップボード dcdd144598 2011-02-23 kinaba: void Cut(); dcdd144598 2011-02-23 kinaba: void Copy(); dcdd144598 2011-02-23 kinaba: void Paste(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 選択テキスト取得 dcdd144598 2011-02-23 kinaba: ki::aarr<unicode> getSelectedStr() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // モード切替 dcdd144598 2011-02-23 kinaba: void SetInsMode( bool bIns ); dcdd144598 2011-02-23 kinaba: void SetROMode( bool bRO ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool isInsMode() const; dcdd144598 2011-02-23 kinaba: bool isROMode() const; dcdd144598 2011-02-23 kinaba: bool isSelected() const; dcdd144598 2011-02-23 kinaba: bool getCurPos( const VPos** start, const VPos** end ) const; dcdd144598 2011-02-23 kinaba: void ResetPos(); dcdd144598 2011-02-23 kinaba: void on_scroll_begin(); dcdd144598 2011-02-23 kinaba: void on_scroll_end(); dcdd144598 2011-02-23 kinaba: void on_text_update( const DPos& s, const DPos& e, const DPos& e2, bool mCur ); dcdd144598 2011-02-23 kinaba: void on_setfocus(); dcdd144598 2011-02-23 kinaba: void on_killfocus(); dcdd144598 2011-02-23 kinaba: void on_keydown( int vk, LPARAM flag ); dcdd144598 2011-02-23 kinaba: void on_char( TCHAR ch ); dcdd144598 2011-02-23 kinaba: void on_ime_composition( LPARAM lp ); dcdd144598 2011-02-23 kinaba: void on_lbutton_down( short x, short y, bool shift ); dcdd144598 2011-02-23 kinaba: void on_mouse_move( short x, short y ); dcdd144598 2011-02-23 kinaba: void on_lbutton_up( short x, short y ); dcdd144598 2011-02-23 kinaba: void on_lbutton_dbl( short x, short y ); dcdd144598 2011-02-23 kinaba: bool on_contextmenu( short x, short y ); dcdd144598 2011-02-23 kinaba: void on_timer(); dcdd144598 2011-02-23 kinaba: int on_ime_reconvertstring( RECONVERTSTRING* rs ); dcdd144598 2011-02-23 kinaba: bool on_ime_confirmreconvertstring( RECONVERTSTRING* rs ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: doc::DocImpl& doc_; dcdd144598 2011-02-23 kinaba: ViewImpl& view_; dcdd144598 2011-02-23 kinaba: CurEvHandler* pEvHan_; dcdd144598 2011-02-23 kinaba: ki::dptr<Caret> caret_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: VPos cur_; // カーソル位置 dcdd144598 2011-02-23 kinaba: VPos sel_; // 選択時の軸足位置 dcdd144598 2011-02-23 kinaba: bool bIns_; // 挿入モード? dcdd144598 2011-02-23 kinaba: bool bRO_; // 読取専用? dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UINT_PTR timerID_;// マウスドラッグ制御用の dcdd144598 2011-02-23 kinaba: int keyRepTime_; // タイマー関係 dcdd144598 2011-02-23 kinaba: int dragX_; // 位置 dcdd144598 2011-02-23 kinaba: int dragY_; // 位置 dcdd144598 2011-02-23 kinaba: bool lineSelectMode_; // 行選択モード? dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: CurEvHandler defaultHandler_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void MoveByMouse( int x, int y ); dcdd144598 2011-02-23 kinaba: void MoveTo( const VPos& vp, bool sel ); dcdd144598 2011-02-23 kinaba: void Ud( int dy, bool select ); dcdd144598 2011-02-23 kinaba: void UpdateCaretPos(); dcdd144598 2011-02-23 kinaba: void Redraw( const VPos& s, const VPos& e ); 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 bool Cursor::isSelected() const dcdd144598 2011-02-23 kinaba: { return cur_!=sel_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Cursor::isInsMode() const dcdd144598 2011-02-23 kinaba: { return bIns_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Cursor::isROMode() const dcdd144598 2011-02-23 kinaba: { return bRO_; } 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_VIEW_H_