rtoss - Blame information for rev 124

Subversion Repositories:
Rev:
Rev Author Line No. Line
89 roytam 1 #ifndef _EDITWING_IP_VIEW_H_
2 #define _EDITWING_IP_VIEW_H_
3 #include "ewView.h"
4 #include "ip_doc.h"
5 using namespace ki;
6 #ifndef __ccdoc__
7 namespace editwing {
8 namespace view {
9 #endif
10  
11  
12  
13 using doc::DocImpl;
14  
15  
16  
17 //=========================================================================
18 //@{ @pkg editwing.View.Impl //@}
19 //@{
20 //      •`‰æŠî–{ƒ‹[ƒ`ƒ“
21 //
22 //      —˜—p‚·‚é‚ɂ́ACanvasƒIƒuƒWƒFƒNƒg‚©‚ç getPainter ‚µ‚ÄŽg‚¢‚Ü‚·B
23 //      ‰æ–Ê—pƒfƒoƒCƒXƒRƒ“ƒeƒLƒXƒg‚̃ŒƒCƒ„‚Å‚·B‚«‚¿‚ñ‚Ə‘‚¢‚Ä‚¨‚¯‚Έóü‹@”\‚ð
24 //      ’ljÁ‚·‚é‚Æ‚«‚ÉŠy‚È‚Ì‚©‚à‚µ‚ê‚Ü‚¹‚ñ‚ªA‚»‚ñ‚È‚±‚Æ‚ðl‚¦‚éŒv‰æ«‚ª
25 //      ‚ ‚é‚Í‚¸‚à‚È‚­‹É‚ß‚Ä“K“–‚ɁcB
26 //@}
27 //=========================================================================
28  
29 class Painter : public Object
30 {
31 public:
32  
33         ~Painter();
34  
35         //@{ Žw’èˆÊ’u‚ɈꕶŽšo—Í //@}
36         void CharOut( unicode ch, int x, int y );
37  
38         //@{ Žw’èˆÊ’u‚É•¶Žš—ñ‚ðo—Í //@}
39         void StringOut( const unicode* str, int len, int x, int y );
40  
41         //@{ •¶ŽšFØ‚è‘Ö‚¦ //@}
42         void SetColor( int i );
43  
44         //@{ ”wŒiF‚Å“h‚è‚‚Ԃµ //@}
45         void Fill( const RECT& rc );
46  
47         //@{ ”½“] //@}
48         void Invert( const RECT& rc );
49  
50         //@{ ü‚ðˆø‚­ //@}
51         void DrawLine( int x1, int y1, int x2, int y2 );
52  
53         //@{ ƒNƒŠƒbƒv—̈æÝ’è //@}
54         void SetClip( const RECT& rc );
55  
56         //@{ ƒNƒŠƒbƒv—̈æ‰ðœ //@}
57         void ClearClip();
58  
59         //@{ ”¼ŠpƒXƒy[ƒX—p‹L†•`‰æ //@}
60         void DrawHSP( int x, int y, int times );
61  
62         //@{ ‘SŠpƒXƒy[ƒX—p‹L†•`‰æ //@}
63         void DrawZSP( int x, int y, int times );
64  
65 public:
66  
67         //@{ ‚‚³(pixel) //@}
68         int H() const { return height_; }
69  
70         //@{ ”Žš•(pixel) //@}
71         int F() const { return figWidth_; }
72  
73         //@{ •¶Žš•(pixel) //@}
74         int Wc( unicode ch ) const
75                 {
76                         if( widthTable_[ ch ] == -1 )
124 roytam 77 #ifdef WIN32S
78                                 ::GetCharWidthA( dc_, ch, ch, widthTable_+ch );
79 #else
89 roytam 80                                 ::GetCharWidthW( dc_, ch, ch, widthTable_+ch );
124 roytam 81 #endif
89 roytam 82                         return widthTable_[ ch ];
83                 }
84         int W( const unicode* pch ) const // 1.08 ƒTƒƒQ[ƒgƒyƒA‰ñ”ð
85                 {
86                         unicode ch = *pch;
87                         if( widthTable_[ ch ] == -1 )
88                         {
89                                 if( isHighSurrogate(ch) )
90                                 {
91                                         SIZE sz;
92                                         if( ::GetTextExtentPoint32W( dc_, pch, 2, &sz ) )
93                                                 return sz.cx;
94                                         int w = 0;
124 roytam 95 #ifdef WIN32S
96                                         ::GetCharWidthA( dc_, ch, ch, &w );
97 #else
89 roytam 98                                         ::GetCharWidthW( dc_, ch, ch, &w );
124 roytam 99 #endif
89 roytam 100                                         return w;
101                                 }
124 roytam 102 #ifdef WIN32S
103                                 ::GetCharWidthA( dc_, ch, ch, widthTable_+ch );
104 #else
89 roytam 105                                 ::GetCharWidthW( dc_, ch, ch, widthTable_+ch );
124 roytam 106 #endif
89 roytam 107                         }
108                         return widthTable_[ ch ];
109                 }
110  
111         //@{ •W€•¶Žš•(pixel) //@}
112         int W() const { return widthTable_[ L'x' ]; }
113  
114         //@{ ŽŸ‚̃^ƒu‘µ‚¦ˆÊ’u‚ðŒvŽZ //@}
115         //int nextTab(int x) const { int t=T(); return (x/t+1)*t; }
116         int nextTab(int x) const { int t=T(); return ((x+4)/t+1)*t; }
117         private: int T() const { return widthTable_[ L'\t' ]; } public:
118  
119         //@{ Œ»Ý‚̃tƒHƒ“ƒgî•ñ //@}
120         const LOGFONT& LogFont() const { return logfont_; }
121  
122         //@{ “Á•Ê•¶Žš‚ð•`‰æ‚·‚é‚©”Û‚© //@}
123         bool sc( int i ) const { return scDraw_[i]; }
124  
125 private:
126  
127         const HDC    dc_;
128         const HFONT  font_;
129         const HPEN   pen_;
130         const HBRUSH brush_;
131         int          height_;
132         int*         widthTable_;
133         int          figWidth_;
134         LOGFONT      logfont_;
135         COLORREF     colorTable_[7];
136         bool         scDraw_[5];
137  
138 private:
139  
140         Painter( HDC hdc, const VConfig& vc );
141         HDC getDC() { return dc_; }
142         friend class Canvas;
143         NOCOPY(Painter);
144 };
145  
146  
147  
148 //=========================================================================
149 //@{
150 //      •`‰æ‰Â”\—̈æ
151 //
152 //      ƒEƒCƒ“ƒhƒEƒTƒCƒY‚̕ύX‚âÜ‚è•Ô‚µ‚Ì—L–³‚âƒtƒHƒ“ƒg‚̐ݒè‚È‚Ç‚É
153 //      ‘Ήž‚µ‚āA•`‰æ—̈æ‚̃TƒCƒY‚ð“K“–‚ÉŠÇ—‚µ‚Ü‚·B‚â‚邱‚Æ‚Í
154 //      ‚Æ‚è‚ ‚¦‚¸‚»‚ꂾ‚¯B
155 //@}
156 //=========================================================================
157  
158 class Canvas : public Object
159 {
160 public:
161  
162         Canvas( const View& vw );
163  
164         //@{ View‚Ì‘å‚«‚³•ÏXƒCƒxƒ“ƒgˆ—
165         //       @return Ü‚è•Ô‚µ•‚ª•Ï‚í‚Á‚½‚çtrue //@}
166         bool on_view_resize( int cx, int cy );
167  
168         //@{ s”•ÏXƒCƒxƒ“ƒgˆ—
169         //       @return ƒeƒLƒXƒg—̈æ‚Ì•‚ª•Ï‚í‚Á‚½‚çtrue //@}
170         bool on_tln_change( ulong tln );
171  
172         //@{ ƒtƒHƒ“ƒg•ÏXƒCƒxƒ“ƒgˆ— //@}
173         void on_font_change( const VConfig& vc );
174  
175         //@{ Ý’è•ÏXƒCƒxƒ“ƒgˆ— //@}
176         void on_config_change( int wrap, bool showln );
177  
178 public:
179  
180         //@{ [s”ԍ†‚ð•\Ž¦‚·‚é‚©”Û‚©] //@}
181         bool showLN() const { return showLN_; }
182  
183         //@{ [-1:Ü‚è•Ô‚µ–³‚µ  0:‘‹‰E’[  else:Žw’蕶Žš”] //@}
184         int wrapType() const { return wrapType_; }
185  
186         //@{ Ü‚è•Ô‚µ•(pixel) //@}
187         ulong wrapWidth() const { return wrapWidth_; }
188  
189         //@{ •\Ž¦—̈æ‚̈ʒu(pixel) //@}
190         const RECT& zone() const { return txtZone_; }
191  
192         //@{ •`‰æ—pƒIƒuƒWƒFƒNƒg //@}
193         Painter& getPainter() const { return *font_; }
194  
195 private:
196  
197         int  wrapType_;  // [ -1:Ü‚è•Ô‚µ–³‚µ  0:‘‹‰E’[  else:Žw’蕶Žš” ]
198         bool showLN_;    // [ s”ԍ†‚ð•\Ž¦‚·‚é‚©”Û‚© ]
199  
200         dptr<Painter> font_; // •`‰æ—pƒIƒuƒWƒFƒNƒg
201         ulong    wrapWidth_; // Ü‚è•Ô‚µ•(pixel)
202         RECT       txtZone_; // ƒeƒLƒXƒg•\Ž¦ˆæ‚̈ʒu(pixel)
203         int         figNum_; // s”ԍ†‚ÌŒ…”
204  
205 private:
206  
207         bool CalcLNAreaWidth();
208         void CalcWrapWidth();
209  
210 private:
211  
212         NOCOPY(Canvas);
213 };
214  
215  
216  
217 //=========================================================================
218 //@{
219 //      s–ˆ‚̐܂è•Ô‚µî•ñ
220 //@}
221 //=========================================================================
222  
223 struct WLine : public storage<ulong>
224 {
225         // [0]   : ‚»‚̍s‚̐܂è•Ô‚µ–³‚µ‚ł̉¡•‚ðŠi”[
226         // [1-n] : ns–ڂ̏I’[‚Ìindex‚ðŠi”[B
227         //
228         //   —Ⴆ‚Î "aaabbb" ‚Æ‚¢‚¤˜_—s‚ð "aaab" "bb" ‚Ɛ܂é‚È‚ç
229         //   {48, 4, 6} ‚È‚Ç‚Æ‚¢‚¤’·‚³‚R‚Ì”z—ñ‚Æ‚È‚éB
230  
231         WLine() : storage<ulong>(2) {}
232         ulong& width()      { return (*this)[0]; }
233         ulong width() const { return (*this)[0]; }
234         ulong rln() const   { return size()-1; }
235 };
236  
237  
238  
239 //=========================================================================
240 //@{
241 //      Ä•`‰æ”͈͂ðŽw’è‚·‚邽‚߂̃tƒ‰ƒO
242 //@}
243 //=========================================================================
244  
245 enum ReDrawType
246 {
247         LNAREA, // s”ԍ†ƒ][ƒ“‚Ì‚Ý
248         LINE,   // •ÏX‚Ì‚ ‚Á‚½ˆês‚Ì‚Ý
249         AFTER,  // •ÏX‚Ì‚ ‚Á‚½sˆÈ‰º‘S•”
250         ALL     // ‘S‰æ–Ê
251 };
252  
253  
254  
255 //=========================================================================
256 //@{
257 //      •`‰æˆ—‚ð×‚©‚­Žw’è‚·‚é\‘¢‘Ì
258 //@}
259 //=========================================================================
260  
261 struct VDrawInfo
262 {
263         const RECT rc;  // Ä•`‰æ”͈Í
264         int XBASE;      // ˆê”ԍ¶‚Ì•¶Žš‚ÌxÀ•W
265         int XMIN;       // ƒeƒLƒXƒgÄ•`‰æ”͈͍¶’[
266         int XMAX;       // ƒeƒLƒXƒgÄ•`‰æ”͈͉E’[
267         int YMIN;       // ƒeƒLƒXƒgÄ•`‰æ”͈͏ã’[
268         int YMAX;       // ƒeƒLƒXƒgÄ•`‰æ”͈͉º’[
269         ulong TLMIN;    // ƒeƒLƒXƒgÄ•`‰æ”͈͏ã’[˜_—s”ԍ†
270         int SXB, SXE;   // ‘I‘ð”͈͂ÌxÀ•W
271         int SYB, SYE;   // ‘I‘ð”͈͂ÌyÀ•W
272  
273         explicit VDrawInfo( const RECT& r ) : rc(r) {}
274 };
275  
276  
277  
278 //=========================================================================
279 //@{
280 //      Ü‚è•Ô‚µedƒeƒLƒXƒg‚ÌŠÇ—E•\Ž¦“™
281 //
282 //      CanvasƒNƒ‰ƒX‚É‚æ‚Á‚ÄŒvŽZ‚³‚ꂽ—̈æƒTƒCƒY‚ðŽQl‚ɁAƒeƒLƒXƒg‚Ì
283 //      Ü‚è•Ô‚µˆ—‚ðŽÀs‚·‚éB‚±‚±‚ŁAƒXƒNƒ[ƒ‹§ŒäA•`‰æˆ—‚È‚Ç
284 //      Žå—v‚ȏˆ—‚Í‘S‚ÄŽÀs‚·‚邱‚Æ‚É‚È‚éB
285 //@}
286 //=========================================================================
287  
288 class ViewImpl : public Object
289 {
290 public:
291  
292         ViewImpl( View& vw, DocImpl& dc );
293  
294         //@{ Ü‚è•Ô‚µ•ûŽ®Ø‘Ö //@}
295         void SetWrapType( int wt );
296  
297         //@{ s”ԍ†•\Ž¦/”ñ•\Ž¦Ø‘Ö //@}
298         void ShowLineNo( bool show );
299  
300         //@{ •\Ž¦FEƒtƒHƒ“ƒgØ‘Ö //@}
301         void SetFont( const VConfig& vc );
302  
303                 //@{ ƒeƒLƒXƒg—̈æ‚̃TƒCƒY•ÏXƒCƒxƒ“ƒg //@}
304                 void on_view_resize( int cx, int cy );
305  
306         void DoResize( bool wrapWidthChanged );
307         void DoConfigChange();
308  
309         //@{ ƒeƒLƒXƒgƒf[ƒ^‚̍XVƒCƒxƒ“ƒg //@}
310         void on_text_update( const DPos& s,
311                 const DPos& e, const DPos& e2, bool bAft, bool mCur );
312  
313         //@{ •`‰æˆ— //@}
314         void on_paint( const PAINTSTRUCT& ps );
315  
316 public:
317  
318         //@{ ‘S•\Ž¦s” //@}
319         ulong vln() const { return vlNum_; }
320  
321         //@{ ˆês‚Ì•\Ž¦s” //@}
322         ulong rln( ulong tl ) const { return wrap_[tl].rln(); }
323  
324         //@{ Ü‚è•Ô‚µˆÊ’u //@}
325         ulong rlend( ulong tl, ulong rl ) const { return wrap_[tl][rl+1]; }
326  
327         //@{ ˆêŒÂ‚Å‚àÜ‚è•Ô‚µ‚ª‘¶Ý‚·‚é‚©”Û‚© //@}
328         bool wrapexists() const { return doc_.tln() != vln(); }
329  
330         //@{ ƒJ[ƒ\ƒ‹ //@}
331         Cursor& cur() { return cur_; }
332  
333         //@{ ƒtƒHƒ“ƒg //@}
334         const Painter& fnt() const { return cvs_.getPainter(); }
335  
336  
114 roytam 337         void on_hscroll( int code, int pos );
338         void on_vscroll( int code, int pos );
89 roytam 339         void on_wheel( short delta );
340  
341         void GetVPos( int x, int y, VPos* vp, bool linemode=false ) const;
342         void GetOrigin( int* x, int* y ) const;
343         void ConvDPosToVPos( DPos dp, VPos* vp, const VPos* base=NULL ) const;
344         void ScrollTo( const VPos& vp );
345         int  GetLastWidth( ulong tl ) const;
346  
347 public:
348  
349         const RECT& zone() const { return cvs_.zone(); }
350         int left()  const { return cvs_.zone().left; }
351         int right() const { return cvs_.zone().right; }
352         int bottom()const { return cvs_.zone().bottom; }
353         int lna()   const { return cvs_.zone().left; }
354         int cx()    const { return cvs_.zone().right - cvs_.zone().left; }
355         int cxAll() const { return cvs_.zone().right; }
356         int cy()    const { return cvs_.zone().bottom; }
357  
358 private:
359  
360         const DocImpl&   doc_;
361         Canvas           cvs_;
362         Cursor           cur_;
363         gapbufobj<WLine> wrap_;
364         ulong            vlNum_;
365         ulong            textCx_;
366  
367 private:
368  
369         void DrawLNA( const VDrawInfo& v, Painter& p );
370         void DrawTXT( const VDrawInfo v, Painter& p );
371         void Inv( int y, int xb, int xe, Painter& p );
372  
373         void CalcEveryLineWidth();
374         ulong CalcLineWidth( const unicode* txt, ulong len ) const;
375         void ModifyWrapInfo( const unicode* txt, ulong len, WLine& wl, ulong stt );
376         void ReWrapAll();
377         int ReWrapSingle( const DPos& s );
378         int InsertMulti( ulong ti_s, ulong ti_e );
379         int DeleteMulti( ulong ti_s, ulong ti_e );
380         void UpdateTextCx();
381         void ReDraw( ReDrawType r, const DPos* s=NULL );
382  
383 private:
384  
385         HWND hwnd_;
386         SCROLLINFO rlScr_; // ‰¡ƒXƒNƒ[ƒ‹î•ñipixel’PˆÊj
387         SCROLLINFO udScr_; // cƒXƒNƒ[ƒ‹î•ñis’PˆÊj
388         ulong udScr_tl_;   // ˆê”ԏã‚É•\Ž¦‚³‚ê‚é˜_—s‚ÌTLine_Index
389         ulong udScr_vrl_;  // ˆê”ԏã‚É•\Ž¦‚³‚ê‚é•\Ž¦s‚ÌVRLine_Index
390  
391 private:
392  
393         bool ReSetScrollInfo();
394         void ForceScrollTo( ulong tl );
395         void UpdateScrollBar();
396         ReDrawType TextUpdate_ScrollBar( const DPos& s, const DPos& e, const DPos& e2 );
397  
398         ulong tl2vl( ulong tl ) const;
399         void GetDrawPosInfo( VDrawInfo& v ) const;
400         void InvalidateView( const DPos& dp, bool afterall ) const;
401         void ScrollView( int dx, int dy, bool update );
402         void UpDown( int dy, bool thumb );
403 };
404  
405  
406  
407 //-------------------------------------------------------------------------
408  
409 inline void ViewImpl::on_view_resize( int cx, int cy )
410         { DoResize( cvs_.on_view_resize( cx, cy ) ); }
411  
412 inline void ViewImpl::SetWrapType( int wt )
413         { cvs_.on_config_change( wt, cvs_.showLN() );
414           DoConfigChange(); }
415  
416 inline void ViewImpl::ShowLineNo( bool show )
417         { cvs_.on_config_change( cvs_.wrapType(), show );
418           DoConfigChange(); }
419  
420 inline void ViewImpl::SetFont( const VConfig& vc )
421         { cvs_.on_font_change( vc );
422           cur_.on_setfocus();
423           CalcEveryLineWidth(); // s•ÄŒvŽZ
424           DoConfigChange(); }
425  
426 inline void ViewImpl::GetOrigin( int* x, int* y ) const
427         { *x = left()-rlScr_.nPos, *y = -udScr_.nPos*cvs_.getPainter().H(); }
428  
429  
430  
431 //=========================================================================
432  
433 }}     // namespace editwing::view
434 #endif // _EDITWING_IP_VIEW_H_