Changeset 341


Ignore:
Timestamp:
Apr 1, 2010, 10:14:13 PM (12 years ago)
Author:
dmik
Message:

branches/kmk: Added support for single line text input fields.

Location:
branches/kmk/Lucide/gui
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/kmk/Lucide/gui/docViewer.cpp

    r334 r341  
    5151#include "lucide_res.h"
    5252#include "messages.h"
     53#include "cpconv.h"
    5354
    5455
     
    7980    cyClient    = 0;
    8081    hWndDoc     = NULLHANDLE;
     82    hWndText    = NULLHANDLE;
     83    textField   = NULL;
     84    textFieldPage = 0;
    8185    doc         = NULL;
    8286    totalpages  = 0;
     
    151155
    152156    hWndDoc = WinCreateWindow( hWndDocFrame, "er.docview", NULL,
    153                                WS_VISIBLE | WS_TABSTOP, 0, 0, 0, 0, hWndDocFrame,
     157                               WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN,
     158                               0, 0, 0, 0, hWndDocFrame,
    154159                               HWND_TOP, FID_CLIENT, this, NULL );
     160
     161    hWndText = WinCreateWindow( hWndDoc, WC_ENTRYFIELD, NULL,
     162                                 ES_AUTOSCROLL | ES_MARGIN,
     163                                 0, 0, 0, 0, hWndDoc,
     164                                 HWND_TOP, 0, NULL, NULL );
    155165
    156166    hWndHscroll = WinWindowFromID( hWndDocFrame, FID_HORZSCROLL );
     
    718728    {
    719729        sVscrollPos += (SHORT)( sVscrollInc / VScrollStep );
    720         WinScrollWindow( hwnd, 0, sVscrollInc, NULL, NULL, NULLHANDLE, NULL, SW_INVALIDATERGN );
     730        WinScrollWindow( hwnd, 0, sVscrollInc, NULL, NULL, NULLHANDLE, NULL,
     731                         SW_INVALIDATERGN | SW_SCROLLCHILDREN );
    721732        WinSendMsg( hWndVscroll, SBM_SETPOS, MPFROMSHORT( sVscrollPos ), MPVOID );
    722733        WinUpdateWindow( hwnd );
     
    763774    {
    764775        sHscrollPos += (SHORT)sHscrollInc;
    765         WinScrollWindow( hwnd, -sHscrollInc, 0, NULL, NULL, NULLHANDLE, NULL, SW_INVALIDATERGN );
     776        WinScrollWindow( hwnd, -sHscrollInc, 0, NULL, NULL, NULLHANDLE, NULL,
     777                         SW_INVALIDATERGN | SW_SCROLLCHILDREN );
    766778        WinSendMsg( hWndHscroll, SBM_SETPOS, MPFROMSHORT( sHscrollPos ), MPVOID );
    767779        WinUpdateWindow( hwnd );
     
    852864        vertScroll( hWndDoc, MPFROM2SHORT( realScrollPos, SB_SLIDERPOSITION ) );
    853865    }
     866
     867    positionTextField();
    854868}
    855869
     
    12571271    }
    12581272    return ( ( ypos * realzoom ) + ( pagenum * VERT_SPACE ) );
     1273}
     1274
     1275void DocumentViewer::showTextField( LuInputText *text, long page, PRECTL r )
     1276{
     1277    // save the previous changes if any
     1278    if ( textField != NULL )
     1279        hideTextField();
     1280
     1281    textField = text;
     1282    textFieldPage = page;
     1283
     1284    positionTextField( r );
     1285    const char *contents = textField->getContents( ev );
     1286    WinSetWindowText( hWndText, contents );
     1287    WinShowWindow( hWndText, TRUE );
     1288    WinSetFocus( HWND_DESKTOP, hWndText );
     1289}
     1290
     1291void DocumentViewer::positionTextField( PRECTL r )
     1292{
     1293    if ( textField == NULL )
     1294        return;
     1295
     1296    RECTL rtmp = {0};
     1297    if ( r == NULL ) {
     1298        LuRectangle *rect = textField->getRectangle( ev );
     1299        docPosToWinPos( textFieldPage, rect, &rtmp );
     1300        r = &rtmp;
     1301    }
     1302
     1303    WinSetWindowPos( hWndText, HWND_TOP,
     1304                     r->xLeft + 3, r->yBottom + 3,
     1305                     r->xRight - r->xLeft - 6,
     1306                     r->yTop - r->yBottom - 6,
     1307                     SWP_MOVE | SWP_SIZE | SWP_ZORDER );
     1308}
     1309
     1310void DocumentViewer::hideTextField( bool apply )
     1311{
     1312    if ( textField != NULL ) {
     1313        if ( apply ) {
     1314            LONG len = WinQueryWindowTextLength( hWndText );
     1315            char *str = new char [ len + 1 ];
     1316            *str = 0;
     1317            WinQueryWindowText( hWndText, len + 1, str );
     1318            str[ len ] = 0;
     1319            char *contents = uniSysToUtf8( str, NULL, NULL );
     1320            textField->setContents( ev, contents );
     1321            delete[] contents;
     1322            delete[] str;
     1323        }
     1324        textField = NULL;
     1325        SWP swp;
     1326        WinQueryWindowPos( hWndText, &swp );
     1327        WinShowWindow( hWndText, FALSE );
     1328        // repaint little bit more (rounding errors)
     1329        RECTL r = { swp.x - 1, swp.y - 1, swp.x + swp.cx + 2, swp.y + swp.cy + 2 };
     1330        WinInvalidateRect( hWndDoc, &r, TRUE );
     1331    }
    12591332}
    12601333
     
    19742047                            {
    19752048                                LuInputText *text = static_cast<LuInputText *>( field );
    1976                                 // @todo enconding
     2049                                showTextField( text, pg, &r );
    19772050                                break;
    19782051                            }
     
    20802153                horizScroll( hwnd, MPFROM2SHORT( sHscrollMax, SB_SLIDERPOSITION ) );
    20812154                return TRUE;
     2155
     2156            case VK_ESC:
     2157                if ( textField != NULL ) {
     2158                    hideTextField( false );
     2159                    return TRUE;
     2160                }
     2161                break;
     2162
     2163            case VK_ENTER:
     2164            case VK_NEWLINE:
     2165                if ( textField != NULL ) {
     2166                    hideTextField();
     2167                    return TRUE;
     2168                }
     2169                break;
    20822170        }
    20832171    }
     
    22692357}
    22702358
     2359// handles WM_CONTROL
     2360void DocumentViewer::wmControl( USHORT idControl, USHORT notifyCode, HWND hwndControl )
     2361{
     2362    // so far this comes only from hWndText
     2363
     2364    if ( notifyCode == EN_KILLFOCUS )
     2365        hideTextField();
     2366}
    22712367
    22722368// static, window procedure
     
    23732469            _this->wmTimer( SHORT1FROMMP( mp1 ) );
    23742470            break;
     2471
     2472        case WM_CONTROL:
     2473            _this->wmControl( SHORT1FROMMP( mp1 ), SHORT2FROMMP( mp1 ), HWNDFROMMP( mp2 ) );
     2474            break;
    23752475    }
    23762476
  • branches/kmk/Lucide/gui/docViewer.h

    r325 r341  
    4242
    4343class ProgressDlg;
     44class LuInputText;
    4445
    4546struct LuSize  { double x, y; };
     
    124125        BOOL wmChar( HWND hwnd, MPARAM mp1, MPARAM mp2 );
    125126        void wmTimer( USHORT idTimer );
     127        void wmControl( USHORT idControl, USHORT notifyCode, HWND hwndControl );
    126128        void winPosToDocPos( PPOINTL startpoint, PPOINTL endpoint, LuRectangle *r );
    127129        void winPosToDocPos( PageDrawArea *pda, LuRectangle *r );
     
    141143        bool isRotated() { return ( (rotation==90) || (rotation==270) ); }
    142144        bool isContinuous() { return ( layout == Continuous ); };
     145        void showTextField( LuInputText *text, long page, PRECTL r = NULL );
     146        void positionTextField( PRECTL r = NULL );
     147        void hideTextField( bool apply = true );
    143148
    144149        static MRESULT EXPENTRY docViewProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
     
    154159        HWND hWndDocFrame;
    155160        HWND hWndDoc;
     161        HWND hWndText;
     162        LuInputText *textField;
     163        long textFieldPage;
    156164        PFNWP oldFrameProc;
    157165        HWND hWndHscroll;
Note: See TracChangeset for help on using the changeset viewer.