LineNumberEdit.cpp

00001 /* ==========================================================================
00002         CLineNumberEdit
00003         Author :                Johan Rosengren, Abstrakt Mekanik AB
00004         Date :                  2004-03-09
00005         Purpose :               CLineNumberEdit is a CEdit-derived class that displays 
00006                                         line numbers to the left of the text.
00007         Description :   The class uses the edit rect to make space for the line 
00008                                         numbers. The line numbers are relized through a special 
00009                                         CStatic-derived class, CLineNumberStatic. As soon as the 
00010                                         text is updated, the CLineNumberStatic is updated as 
00011                                         well.
00012         Usage :                 The control can be dynamically created, or created from 
00013                                         a dialog template. The formatting string for the line 
00014                                         numbers can be set by calling SetLineNumberFormat (the 
00015                                         same format string as for CString::Format). By calling 
00016                                         SetMarginForegroundColor or SetMarginBackgroundColor 
00017                                         the fore- and background colors for the line number 
00018                                         display is set.
00019    ========================================================================
00020         Update :        Keith Bowes
00021         Date :          2004-04-13
00022         Purpose :       1. To allow CLineNumberEdit to properly change colour when
00023                        Enabled/Disabled or when system colours change.
00024                        Changing system colours only has a noticable effect when
00025                        a scheme such as Marine or Plum is chosen.
00026                     2. To allow a line number delta to be applied to the first
00027                        line number so the index does not have to start at zero.
00028                     3. To allow a max value to be specified to stop the line
00029                        count and to allow smarter size formatting.
00030         Description :   1. Added OnEnable and OnSysColorChange to detect when
00031                        a colour change is required. This allows the line number
00032                        area and CEdit area to update colours properly.
00033                        Added colour ref variables to hold enabled/disabled states
00034                        of the background/foreground colours.
00035                        In an attempt to allow previous functionality to take
00036                        precedence, if the colours are changed explicitly, the
00037                        system colours are no longer queried.
00038                     2. Added m_LineDelta, applied when line numbers are formatted.
00039                     3. Using m_maxval when > 0 to limit the max values and when
00040                        formatting colomn width.
00041                                                 JRO: Added m_lineDelta as well.
00042     Usage :         1. Default behaviour is to change colours to reflect CEdit.
00043                        manually changing the colour will cause the colours to
00044                        only change to the specified colours.
00045                     2. SetLineNumberRange sets both min and max values.
00046                     3. SetLineNumberRange sets both min and max values.
00047 
00048     Comments :      - Perhaps line values should be stored as UINT's as negative
00049                       values may have unexpected results.
00050                     - CLineNumberEdit::m_format creates a duplicate of
00051                       CLineNumberStatic::m_format, is this needed?
00052                                                   JRO: Even though the the two classes are thightly coupled, 
00053                                                   this duplication of data makes it easier to decouple them. 
00054                                                   A small matter, but code reuse is Politically Correct,
00055                                                   and as such A Desirable Feature.
00056                     - Added options could allow different system colours to be
00057                       chosen and updated as system attributes are changed.
00058                     - if m_maxval is exceeded in the edit box, new lines
00059                       are added without line numbers. This might not be the
00060                       desired behaviour.
00061                                                 JRO: I think this is rather nifty, actually. If I, as a 
00062                                                 developer, sets the max number of lines to be numbered, 
00063                                                 I also expect this to be the case :-)))
00064                     - It's not spelled wrong, just differently. ;0)
00065    ========================================================================
00066         Update :        Johan Rosengren
00067         Date :          2004-04-14
00068         Purpose         :       1. Allow deriving of CLineNumberEdit. 
00069         Description     :       1. Made the message handlers virtual.
00070         Usage :                 1. Declare message handlers as virtual in derived 
00071                                            classes. Note that CLineNumberEdit is not built to 
00072                                            be derived from, however.
00073    ========================================================================
00074         Update :                Keith Bowes
00075         Date :                  2004-04-22
00076         Purpose :               To allow processing of WM_LINESCROLL messages. 
00077         Description :   Added OnLineScroll to handle the message.
00078         Usage :                 Now will call UpdateTopAndBottom if the message is
00079                                         received.
00080    ========================================================================
00081         Update :                Johan Rosengren
00082         Date :                  2004-05-02
00083         Purpose :               Select complete line when a line-number is clicked
00084         Description :   Added registered user message, sent when the line-
00085                                         number static is clicked.
00086         Usage :                 See urm_SELECTLINE in the code.
00087    ========================================================================*/
00088 
00089 #include "stdafx.h"
00090 #include "LineNumberEdit.h"
00091 
00092 #ifdef _DEBUG
00093 #define new DEBUG_NEW
00094 #undef THIS_FILE
00095 static char THIS_FILE[] = __FILE__;
00096 #endif
00097 
00098 // Registered message to allow selection of complete 
00099 // lines by clicking the line number
00100 UINT urm_SELECTLINE = ::RegisterWindowMessage( _T("_LINE_NUMBER_EDIT_SELECTLINE_") );
00101 
00103 // CLineNumberEdit
00104 CLineNumberEdit::CLineNumberEdit()
00105 /* ============================================================
00106         Function :              CLineNumberEdit::CLineNumberEdit
00107         Description :   constructor
00108      
00109         Return :                void
00110         Parameters :    none
00111 
00112         Usage :                 
00113 
00114    ============================================================*/
00115 {
00116 
00117         m_hWnd = NULL;
00118         m_line.m_hWnd = NULL;
00119         m_zero.cx = 0;
00120         m_zero.cy = 0;
00121         m_format = _T( "%03i" );
00122         m_LineDelta = 1;
00123 
00124         // Could default m_maxval to 99,999, but may cause problems 
00125         // if m_format is changed and m_maxval is not...
00126         m_maxval = 998;
00127 
00128         // Setting up so by defult the original hard-coded colour 
00129         // scheme is used when enabled and the system colours are 
00130         // used when disabled.
00131         m_bUseEnabledSystemColours = FALSE;
00132         m_bUseDisabledSystemColours = TRUE;
00133         m_EnabledFgCol = RGB( 0, 0, 0 );
00134         m_EnabledBgCol = RGB( 200, 200, 200 );
00135         m_DisabledFgCol = GetSysColor( COLOR_GRAYTEXT );
00136         m_DisabledBgCol = GetSysColor( COLOR_3DFACE );
00137 
00138         SetWindowColour();
00139 
00140 }
00141 
00142 CLineNumberEdit::~CLineNumberEdit()
00143 /* ============================================================
00144         Function :              CLineNumberEdit::~CLineNumberEdit
00145         Description :   destructor
00146  
00147         Return :                void
00148         Parameters :    none
00149 
00150         Usage :                 
00151 
00152    ============================================================*/
00153 {
00154 }
00155 
00156 BEGIN_MESSAGE_MAP(CLineNumberEdit, CEdit)
00157         ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
00158         ON_WM_VSCROLL()
00159         ON_CONTROL_REFLECT(EN_VSCROLL, OnVscroll)
00160         ON_MESSAGE(WM_SETFONT, OnSetFont)
00161         ON_WM_SIZE()
00162         ON_MESSAGE(WM_SETTEXT, OnSetText)
00163         ON_WM_SYSCOLORCHANGE()
00164         ON_WM_ENABLE()
00165         ON_MESSAGE(EM_LINESCROLL, OnLineScroll)
00166         ON_REGISTERED_MESSAGE(urm_SELECTLINE, OnSelectLine)
00167 END_MESSAGE_MAP()
00168 
00169 void CLineNumberEdit::PreSubclassWindow() 
00170 /* ============================================================
00171         Function :              CLineNumberEdit::PreSubclassWindow
00172         Description :   This function is called before the control 
00173                                         is subclassed for a control on a dialog 
00174                                         template, and during creation for 
00175                                         dynamically created controls.
00176 
00177         Return :                void
00178         Parameters :    none
00179 
00180         Usage :                 Called from MFC
00181 
00182    ============================================================*/
00183 {
00184 
00185         // Unfortunately, we can't change to ES_MULTILINE
00186         // during run-time.
00187         ASSERT( GetStyle() & ES_MULTILINE );
00188 
00189         // Creating the line number control
00190         SetLineNumberFormat( m_format );
00191 
00192 }
00193 
00195 // CLineNumberEdit message handlers
00196 
00197 void CLineNumberEdit::OnSysColorChange() 
00198 /* ============================================================
00199         Function :              CLineNumberEdit::OnSysColorChange
00200         Description :   Handles WM_SYSCOLORCHANGE. User has changed
00201                                         the system colours, want to refresh.
00202  
00203         Return :                void
00204         Parameters :    void
00205 
00206         Usage :                 Called from Windows
00207 
00208    ============================================================*/
00209 {
00210 
00211         CEdit::OnSysColorChange();
00212 
00213     // update the CStatic with the new colours
00214     SetWindowColour( IsWindowEnabled() );
00215 
00216 }
00217 
00218 LRESULT CLineNumberEdit::OnSetText( WPARAM wParam, LPARAM lParam )
00219 /* ============================================================
00220         Function :              CLineNumberEdit::OnSetText
00221         Description :   Handles WM_SETTEXT. We must update the line 
00222                                         numbers in the line number control as well.
00223  
00224         Return :                LRESULT                 - From Def proc
00225         Parameters :    WPARAM wParam   - From Windows
00226                                         LPARAM lParam   - From Windows
00227 
00228         Usage :                 Called from Windows
00229 
00230    ============================================================*/
00231 {
00232 
00233         // Default processing
00234         LRESULT retval = DefWindowProc( WM_SETTEXT, wParam, lParam );
00235         UpdateTopAndBottom();
00236         return retval;
00237 
00238 }
00239 
00240 void CLineNumberEdit::OnChange() 
00241 /* ============================================================
00242         Function :              CLineNumberEdit::OnChange
00243         Description :   Mapped to EN_CHANGE. We must handle 
00244                                         EN_CHANGE to let the line-number control 
00245                                         reflect changes to the edit box content.
00246  
00247         Return :                void
00248         Parameters :    none
00249 
00250         Usage :                 Called from Windows
00251 
00252    ============================================================*/
00253 {
00254 
00255         UpdateTopAndBottom();
00256 
00257 }
00258 
00259 void CLineNumberEdit::OnVscroll() 
00260 /* ============================================================
00261         Function :              CLineNumberEdit::OnVscroll
00262         Description :   Mapped to EN_VSCROLL. We update the line 
00263                                         numbers in the line number control
00264  
00265         Return :                void
00266         Parameters :    none
00267 
00268         Usage :                 Called from Windows
00269 
00270    ============================================================*/
00271 {
00272 
00273         UpdateTopAndBottom();
00274 
00275 }
00276 
00277 void CLineNumberEdit::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar ) 
00278 /* ============================================================
00279         Function :              CLineNumberEdit::OnVScroll
00280         Description :   Handles WM_VSCROLL. We handle WM_VSCROLL 
00281                                         in addition to the notification EN_VSCROLL, 
00282                                         to handle scrollbar dragging as well
00283  
00284         Return :                void
00285         Parameters :    UINT nSBCode                    - From Windows
00286                                         UINT nPos                               - From Windows
00287                                         CScrollBar* pScrollBar  - From Windows
00288 
00289         Usage :                 Called from Windows
00290 
00291    ============================================================*/
00292 {
00293 
00294         CEdit::OnVScroll( nSBCode, nPos, pScrollBar );
00295         UpdateTopAndBottom();
00296 
00297 }
00298 
00299 LRESULT CLineNumberEdit::OnLineScroll( WPARAM wParam, LPARAM lParam ) 
00300 /* ============================================================
00301         Function        :       CLineNumberEdit::OnLineScroll
00302         Description     :       Mapped to EM_LINESCROLL. We update the line 
00303                                         numbers in the line number control.
00304      
00305         Return          :       void
00306         Parameters      :       none
00307         Usage           :       Called from Windows
00308    ============================================================*/
00309 {
00310 
00311         // Default processing
00312         LRESULT retval = DefWindowProc( EM_LINESCROLL, wParam, lParam );
00313         UpdateTopAndBottom();
00314         return retval;
00315 
00316 }
00317 
00318 LRESULT CLineNumberEdit::OnSetFont( WPARAM wParam, LPARAM lParam )
00319 /* ============================================================
00320         Function :              CLineNumberEdit::OnSetFont
00321         Description :   Mapped to WM_SETFONT. We must recalculate 
00322                                         the line number control size as well.
00323  
00324         Return :                LRESULT                 - Always 0
00325         Parameters :    WPARAM wParam   - From Windows
00326                                         LPARAM lParam   - From Windows
00327 
00328         Usage :                 Called from Windows
00329 
00330    ============================================================*/
00331 {
00332 
00333         DefWindowProc( WM_SETFONT, wParam, lParam );
00334         // We resize the line-number
00335         // field
00336         Prepare();
00337         return 0;
00338 
00339 }
00340 
00341 void CLineNumberEdit::OnSize( UINT nType, int cx, int cy ) 
00342 /* ============================================================
00343         Function :              CLineNumberEdit::OnSize
00344         Description :   Handles WM_SIZE. Recalculates the line 
00345                                         number control size as well.
00346  
00347         Return :                void
00348         Parameters :    UINT nType      - From Windows
00349                                         int cx          - From Windows
00350                                         int cy          - From Windows
00351 
00352         Usage :                 Called from Windows
00353 
00354    ============================================================*/
00355 {
00356 
00357         CEdit::OnSize( nType, cx, cy );
00358 
00359         // If we have the line-number
00360         // control, it must be resized 
00361         // as well.
00362         if( m_line.m_hWnd )
00363                 Prepare();
00364  
00365 }
00366 
00367 void CLineNumberEdit::OnEnable( BOOL bEnable ) 
00368 /* ============================================================
00369         Function :              CLineNumberEdit::OnEnable
00370         Description :   Handles WM_ENABLE. Calls to set colours.
00371  
00372         Return :                void
00373         Parameters :    BOOL bEnable - From Windows
00374 
00375         Usage :                 Called from Windows.
00376 
00377    ============================================================*/
00378 {
00379 
00380         CEdit::OnEnable( bEnable );
00381     SetWindowColour( bEnable );
00382 
00383 }
00384 
00385 LRESULT CLineNumberEdit::OnSelectLine(WPARAM wParam, LPARAM /*lParam*/ )
00386 /* ============================================================
00387         Function :              CLineNumberEdit::OnSelectLine
00388         Description :   Handler for the urm_SELECTLINE registered
00389                                         message. Will select the line in wParam.
00390                                         
00391         Return :                LRESULT                 -       Not used
00392         Parameters :    WPARAM wParam   -       The line to select
00393                                         LPARAM lParam   -       Not used
00394                                         
00395         Usage :                 Called from MFC. Use 
00396                                         SendMessage( urm_SELECTLINE, line ) from 
00397                                         code.
00398 
00399    ============================================================*/
00400 {
00401 
00402         // Calc start and end position of the line
00403         int lineno = wParam + GetScrollPos( SB_VERT );
00404         int start = LineIndex( lineno );
00405         int end = LineIndex( lineno + 1 );
00406         SetSel( start, end - 1 );
00407         return 0;
00408 
00409 }
00410 
00411 void CLineNumberEdit::SetWindowColour( BOOL bEnable /*= TRUE*/ )
00412 /* ============================================================
00413         Function :              CLineNumberEdit::SetWindowColour
00414         Description :   Handles changing window colours.
00415  
00416         Return :                void
00417         Parameters :    BOOL bEnable -  flag if set enabled/disabled 
00418                                                                         colours
00419 
00420         Usage :                 Called to change colours in the edit box.
00421 
00422    ============================================================*/
00423 {
00424 
00425     if (m_bUseEnabledSystemColours)
00426     {
00427                 // re-query the system colours in case they have changed.
00428                 m_EnabledFgCol = GetSysColor( COLOR_WINDOWTEXT );
00429                 m_EnabledBgCol = GetSysColor( COLOR_WINDOW );
00430     }
00431 
00432     if (m_bUseDisabledSystemColours)
00433     {
00434                 // re-query the system colours in case they have changed.
00435                 m_DisabledFgCol = GetSysColor( COLOR_GRAYTEXT );
00436                 m_DisabledBgCol = GetSysColor( COLOR_3DFACE );
00437     }
00438 
00439     // change the colour based on bEnable
00440     if (bEnable)
00441     {
00442         m_line.SetFgColor( m_EnabledFgCol, TRUE );
00443         m_line.SetBgColor( m_EnabledBgCol, TRUE );
00444     } else {
00445         m_line.SetFgColor( m_DisabledFgCol, TRUE );
00446         m_line.SetBgColor( m_DisabledBgCol, TRUE );
00447     }
00448 
00449 }
00450 
00451 void CLineNumberEdit::UseSystemColours( BOOL bUseEnabled /*= TRUE*/, BOOL bUseDisabled /*= TRUE*/ )
00452 /* ============================================================
00453         Function :              CLineNumberEdit::UseSystemColours
00454         Description :   Sets the Use*SystemColours flags.
00455  
00456         Return :                void
00457         Parameters :    BOOL bEnabled   -       flag if to use enabled 
00458                                                                                 system colours
00459                                         BOOL bDisabled  -       flag if to use disabled 
00460                                                                                 system colours
00461 
00462         Usage :                 Called to change colours in the edit box
00463 
00464    ============================================================*/
00465 {
00466 
00467     m_bUseEnabledSystemColours = bUseEnabled;
00468     m_bUseDisabledSystemColours = bUseDisabled;
00469     BOOL bEnable = TRUE;
00470     if (::IsWindow(m_hWnd))
00471         bEnable = IsWindowEnabled();
00472 
00473     SetWindowColour( bEnable );
00474 
00475 }
00476 
00478 // CLineNumberEdit private implementation
00479 
00480 void CLineNumberEdit::Prepare()
00481 /* ============================================================
00482         Function :              CLineNumberEdit::Prepare
00483         Description :   Setting the edit rect for the control and 
00484                                         either create or move the line number 
00485                                         control. Also sets the top- and bottom 
00486                                         line numbers.
00487  
00488         Return :                void
00489         Parameters :    none
00490 
00491         Usage :                 Must be called to (re)establish the edit 
00492                                         rect, must also be called as soon as the 
00493                                         control changes size.
00494 
00495    ============================================================*/
00496 {
00497 
00498         // Calc sizes
00499         int width = CalcLineNumberWidth();
00500         CRect rect;
00501         GetClientRect( &rect );
00502         CRect rectEdit( rect );
00503         rect.right = width;
00504         rectEdit.left = rect.right + 3;
00505 
00506         // Setting the edit rect and 
00507         // creating or moving child control
00508         SetRect( &rectEdit );
00509         if( m_line.m_hWnd )
00510                 m_line.MoveWindow( 0, 0, width, rect.Height() );
00511         else
00512                 m_line.Create(NULL,WS_CHILD | WS_VISIBLE | SS_NOTIFY, rect, this, 1 );
00513 
00514         GetRect( &rectEdit );
00515 
00516         // Update line number control data
00517         m_line.SetTopMargin( rectEdit.top );
00518         UpdateTopAndBottom();
00519 
00520 }
00521 
00522 int CLineNumberEdit::CalcLineNumberWidth()
00523 /* ============================================================
00524         Function :              CLineNumberEdit::CalcLineNumberWidth
00525         Description :   Calculates the desired width of the line 
00526                                         number control, using the current format 
00527                                         string and the max number of chars allowed 
00528                                         (pessimistic - assumes one character per 
00529                                         line).
00530  
00531         Return :                int - The width in pixels
00532         Parameters :    none
00533 
00534         Usage :                 Called as soon as the format string is 
00535                                         changed.
00536 
00537    ============================================================*/
00538 {
00539 
00540         CClientDC dc( this );
00541 
00542         // If a new font is set during runtime,
00543         // we must explicitly select the font into
00544         // the CClientDC to measure it.
00545         CFont* font = GetFont();
00546         CFont* oldFont = dc.SelectObject( font );
00547 
00548         m_zero=dc.GetTextExtent( _T( "0" ) );
00549         CString format;
00550 
00551     // GetLimitText returns the number of bytes the edit box may contain,
00552     // not the max number of lines...
00553         //... which is the max number of lines, given one character per d:o :-)
00554         int maxval = GetLimitText();
00555     if (m_maxval > 0)
00556         maxval = m_maxval + m_LineDelta;
00557 
00558         format.Format( m_format, maxval );
00559         CSize fmt = dc.GetTextExtent( format );
00560         dc.SelectObject( oldFont );
00561 
00562         // Calculate the size of the line-
00563         // number field. We add a 5 pixel margin
00564         // to the max size of the format string
00565         return fmt.cx + 5;
00566 
00567 }
00568 
00569 void CLineNumberEdit::UpdateTopAndBottom() 
00570 /* ============================================================
00571         Function :              CLineNumberEdit::UpdateTopAndBottom
00572         Description :   Updates the top- and bottom line number 
00573                                         for the line number control.
00574  
00575         Return :                void
00576         Parameters :    none
00577         Usage :                 Should be called as soon as the contents of 
00578                                         the control is changed.
00579 
00580    ============================================================*/
00581 {
00582 
00583         CRect rect;
00584         GetClientRect( &rect );
00585         int maxline = GetLineCount() + m_LineDelta;
00586 
00587         // Height for individual lines
00588         int lineheight = m_zero.cy;
00589 
00590         // Calculate the number of lines to draw
00591         int topline = GetFirstVisibleLine() + m_LineDelta;
00592         if( ( topline + ( rect.Height() / lineheight ) ) < maxline )
00593                 maxline = topline + ( rect.Height() / lineheight );
00594 
00595     if ( m_maxval > 0 && maxline > m_maxval + m_LineDelta )
00596         maxline = m_maxval + m_LineDelta;
00597 
00598         m_line.SetTopAndBottom( topline, maxline );
00599 
00600 }
00601 
00603 // CLineNumberEdit public implementation
00604 
00605 void CLineNumberEdit::SetMarginForegroundColor( COLORREF col, BOOL redraw, BOOL bEnabled /*= TRUE*/ )
00606 /* ============================================================
00607         Function :              CLineNumberEdit::SetMarginForegroundColor
00608         Description :   Sets the text color for the number 
00609                                         margin.
00610  
00611         Return :                void
00612         Parameters :    COLORREF col    -       The new text color 
00613                                         BOOL redraw             -       TRUE if the control 
00614                                                                                 should be redrawn 
00615                                                                                 (default)
00616 
00617         Usage :                 Call to set a new text color for the line
00618                                         number margin. The control will be redrawn
00619                                         if it exists.
00620 
00621    ============================================================*/
00622 {
00623 
00624         m_line.SetFgColor( col, redraw );
00625     if (bEnabled)
00626     {
00627         m_bUseEnabledSystemColours = FALSE;
00628         m_EnabledFgCol = col;
00629     } else {
00630         m_bUseDisabledSystemColours = FALSE;
00631         m_DisabledFgCol = col;
00632     }
00633 
00634 }
00635 
00636 void CLineNumberEdit::SetMarginBackgroundColor( COLORREF col, BOOL redraw, BOOL bEnabled /*= TRUE*/ )
00637 /* ============================================================
00638         Function :              CLineNumberEdit::SetMarginBackgroundColor
00639         Description :   Sets the background color for the number 
00640                                         margin.
00641  
00642         Return :                void
00643         Parameters :    COLORREF col    -       The new background color 
00644                                         BOOL redraw             -       TRUE if the control 
00645                                                                                 should be redrawn 
00646                                                                                 (default)
00647 
00648         Usage :                 Call to set a new background color for the 
00649                                         line number margin. The control will be 
00650                                         redrawn if it exists.
00651 
00652    ============================================================*/
00653 {
00654 
00655         m_line.SetBgColor( col, redraw );
00656     if (bEnabled)
00657     {
00658         m_bUseEnabledSystemColours = FALSE;
00659         m_EnabledBgCol = col;
00660     } else {
00661         m_bUseDisabledSystemColours = FALSE;
00662         m_DisabledBgCol = col;
00663     }
00664 
00665 }
00666 
00667 void CLineNumberEdit::SetLineNumberFormat( CString format )
00668 /* ============================================================
00669         Function :              CLineNumberEdit::SetLineNumberFormat
00670         Description :   Changes the way line numbers are presented 
00671                                         on screen. 
00672  
00673         Return :                void
00674         Parameters :    CString format - The new format string
00675 
00676         Usage :                 Call with a format string using the same 
00677                                         format as CString::Format. It should contain 
00678                                         one and only one numeric type.
00679 
00680    ============================================================*/
00681 {
00682 
00683         m_format = format;
00684         m_line.SetLineNumberFormat( format );
00685         if( m_hWnd )
00686                 Prepare();
00687 
00688 }
00689 
00690 void CLineNumberEdit::SetLineNumberRange( UINT nMin, UINT nMax /*= 0*/ )
00691 /* ============================================================
00692         Function :              CLineNumberEdit::SetLineNumberRange
00693         Description :   Changes the default min and max line numbers. 
00694  
00695         Return :                void
00696         Parameters :    int nMin - changes the line offset
00697                                         int nMax - changes the max line number
00698 
00699         Usage :                 Call to set up the min and max line numbers.
00700 
00701    ============================================================*/
00702 {
00703 
00704     m_LineDelta = ( int ) nMin;
00705     m_maxval = ( int ) nMax;
00706 
00707 }
00708 
00710 // CLineNumberStatic
00711 
00712 CLineNumberStatic::CLineNumberStatic()
00713 /* ============================================================
00714         Function :              CLineNumberStatic::CLineNumberStatic
00715         Description :   constructor
00716  
00717         Return :                void
00718         Parameters :    none
00719 
00720         Usage :                 
00721 
00722    ============================================================*/
00723 {
00724 
00725         m_bgcol = RGB( 255, 255, 248 );
00726         m_fgcol = RGB( 0, 0, 0 );
00727     m_format = _T( "%05i" );
00728     m_topline = 0;
00729     m_bottomline = 0;
00730 }
00731 
00732 CLineNumberStatic::~CLineNumberStatic()
00733 /* ============================================================
00734         Function :              CLineNumberStatic::~CLineNumberStatic
00735         Description :   destructor
00736  
00737         Return :                void
00738         Parameters :    none
00739 
00740         Usage :                 
00741 
00742    ============================================================*/
00743 {
00744 }
00745 
00746 BEGIN_MESSAGE_MAP(CLineNumberStatic, CStatic)
00747         ON_WM_PAINT()
00748         ON_WM_ERASEBKGND()
00749         ON_WM_LBUTTONDOWN()
00750 END_MESSAGE_MAP()
00751 
00753 // CLineNumberStatic message handlers
00754 
00755 void CLineNumberStatic::OnPaint() 
00756 /* ============================================================
00757         Function :              CLineNumberStatic::OnPaint
00758         Description :   Handler for WM_PAINT. 
00759  
00760         Return :                void
00761         Parameters :    none
00762 
00763         Usage :                 Called from Windows.
00764 
00765    ============================================================*/
00766 {
00767 
00768         CPaintDC dcPaint( this );
00769 
00770         CRect rect;
00771         GetClientRect( &rect );
00772 
00773         // We double buffer the drawing - 
00774         // preparing the memory CDC
00775         CDC dc;
00776         dc.CreateCompatibleDC( &dcPaint );
00777         int saved = dc.SaveDC();
00778 
00779         // Create GDI and select objects
00780         CBitmap bmp;
00781         CPen pen;
00782         bmp.CreateCompatibleBitmap( &dcPaint, rect.Width(), rect.Height() );
00783         pen.CreatePen( PS_SOLID, 1, m_fgcol );
00784         dc.SelectObject( &bmp );
00785         dc.SelectObject( &pen );
00786 
00787         // Painting the background
00788         dc.FillSolidRect( &rect, m_bgcol );
00789         dc.MoveTo( rect.right - 1, 0 );
00790         dc.LineTo( rect.right - 1, rect.bottom );
00791 
00792         // Setting other attributes
00793         dc.SetTextColor( m_fgcol );
00794         dc.SetBkColor( m_bgcol );
00795         dc.SelectObject( GetParent()->GetFont() );
00796 
00797         // Output the line numbers
00798         if( m_bottomline )
00799         {
00800                 int lineheight = dc.GetTextExtent( _T( "0" ) ).cy;
00801                 for( int t = m_topline ; t < m_bottomline ; t++ )
00802                 {
00803                         CString output;
00804                         output.Format( m_format, t );
00805                         int topposition = m_topmargin + lineheight * ( t - m_topline );
00806                         dc.TextOut( 2, topposition, output );
00807                 }
00808         }
00809 
00810         dcPaint.BitBlt( 0, 0, rect. right, rect.bottom, &dc, 0, 0, SRCCOPY );
00811         dc.RestoreDC( saved );
00812 
00813 }
00814 
00815 BOOL CLineNumberStatic::OnEraseBkgnd( CDC* ) 
00816 /* ============================================================
00817         Function :              CLineNumberStatic::OnEraseBkgnd
00818         Description :   Mapped to WM_ERASEBKGND. Handled to avoid
00819                                         flicker, as we redraw the complete control 
00820                                         in OnPaint
00821  
00822         Return :                BOOL  - Always TRUE
00823         Parameters :    CDC*  - From Windows
00824 
00825         Usage :                 Called from Windows.
00826 
00827    ============================================================*/
00828 {
00829 
00830         return TRUE;
00831 
00832 }
00833 
00834 void CLineNumberStatic::OnLButtonDown( UINT nFlags, CPoint point )
00835 /* ============================================================
00836         Function :              CLineNumberStatic::OnLButtonDown
00837         Description :   Called when the control is clicked. Will
00838                                         send the urm_SELECTLINE registered message 
00839                                         to the parent to select the line clicked on.
00840                                         
00841         Return :                void
00842         Parameters :    UINT nFlags             -       Not used
00843                                         CPoint point    -       Position of cursor
00844                                         
00845         Usage :                 Called from Windows.
00846 
00847    ============================================================*/
00848 {
00849 
00850         // Find the line clicked on
00851         CClientDC       dc( this );
00852         dc.SelectObject( GetParent()->GetFont() );
00853         int lineheight = dc.GetTextExtent( _T( "0" ) ).cy;
00854         int lineno = ( int ) ( ( double ) point.y / ( double ) lineheight );
00855 
00856         // Select this line in the edit control
00857         GetParent()->SendMessage( urm_SELECTLINE, lineno );
00858 
00859         CStatic::OnLButtonDown( nFlags, point );
00860 
00861 }
00862 
00864 // CLineNumberStatic public implementation
00865 
00866 void CLineNumberStatic::SetBgColor( COLORREF col, BOOL redraw )
00867 /* ============================================================
00868         Function :              CLineNumberStatic::SetBgColor
00869         Description :   This function sets the panel background 
00870                                         color
00871  
00872         Return :                void
00873         Parameters :    COLORREF col -  New background color
00874                                         BOOL redraw  -  TRUE if the control 
00875                                                                         should be redrawn 
00876                                                                         (default)
00877 
00878         Usage :                 Called from the parent.
00879 
00880    ============================================================*/
00881 {
00882 
00883         m_bgcol = col;
00884         if( m_hWnd && redraw )
00885                 RedrawWindow();
00886 
00887 }
00888 
00889 void CLineNumberStatic::SetFgColor( COLORREF col, BOOL redraw )
00890 /* ============================================================
00891         Function :              CLineNumberStatic::SetFgColor
00892         Description :   This function sets the panel foreground 
00893                                         color
00894  
00895         Return :                void
00896         Parameters :    COLORREF col -  New text color
00897                                         BOOL redraw  -  TRUE if the control 
00898                                                                         should be redrawn 
00899                                                                         (default)
00900  
00901         Usage :                 Called from the parent.
00902 
00903    ============================================================*/
00904 {
00905 
00906         m_fgcol = col;
00907         if( m_hWnd && redraw )
00908                 RedrawWindow();
00909 
00910 }
00911 
00912 void CLineNumberStatic::SetTopAndBottom( int topline, int bottomline )
00913 /* ============================================================
00914         Function :              CLineNumberStatic::SetTopAndBottom
00915         Description :   Sets the top- and bottom line and redraw 
00916                                         the control (if it exists)
00917  
00918         Return :                void
00919         Parameters :    int topline             -       The top line number
00920                                         int bottomline  -       The bottom line number
00921  
00922         Usage :                 Called when the top and bottom line is 
00923                                         changed in the parent.
00924 
00925    ============================================================*/
00926 {
00927 
00928         m_topline = topline;
00929         m_bottomline = bottomline;
00930         if( m_hWnd )
00931                 RedrawWindow();
00932 
00933 }
00934 
00935 void CLineNumberStatic::SetTopMargin( int topmargin )
00936 /* ============================================================
00937         Function :              CLineNumberStatic::SetTopMargin
00938         Description :   Sets the top margin for painting.
00939  
00940         Return :                void
00941         Parameters :    int topmargin - The top margin to set
00942  
00943         Usage :                 Will be called with the value of GetRect 
00944                                         from the parent.
00945 
00946    ============================================================*/
00947 {
00948 
00949         m_topmargin = topmargin;
00950 
00951 }
00952 
00953 void CLineNumberStatic::SetLineNumberFormat( CString format )
00954 /* ============================================================
00955         Function :              CLineNumberStatic::SetLineNumberFormat
00956         Description :   Sets the format string of the control
00957  
00958         Return :                void
00959         Parameters :    CString format -        Format string to use 
00960  
00961         Usage :                 Called from the parent when the format 
00962                                         string is changed.
00963 
00964    ============================================================*/
00965 {
00966 
00967         m_format = format;
00968         if( m_hWnd )
00969                 RedrawWindow();
00970 
00971 }

Generated on Tue Dec 13 14:46:51 2005 for guliverkli by  doxygen 1.4.5