File Annotation

Not logged in
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_