Changeset 346 for branches


Ignore:
Timestamp:
Apr 2, 2010, 10:37:04 PM (12 years ago)
Author:
dmik
Message:

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

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

Legend:

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

    r344 r346  
    6767#define SB_PAGEDRAG     100
    6868
     69#define DOC_ID_ENTRY    0
     70#define DOC_ID_MLE      1
     71
    6972// DocumentViewer constructor
    7073DocumentViewer::DocumentViewer( HWND hWndFrame )
     
    8083    cyClient    = 0;
    8184    hWndDoc     = NULLHANDLE;
    82     hWndText    = NULLHANDLE;
     85    hWndEntry   = NULLHANDLE;
     86    hWndMLE     = NULLHANDLE;
    8387    textField   = NULL;
    8488    textFieldPage = 0;
     
    159163                               HWND_TOP, FID_CLIENT, this, NULL );
    160164
    161     hWndText = WinCreateWindow( hWndDoc, WC_ENTRYFIELD, NULL,
     165    hWndEntry = WinCreateWindow( hWndDoc, WC_ENTRYFIELD, NULL,
    162166                                 ES_AUTOSCROLL | ES_MARGIN,
    163167                                 0, 0, 0, 0, hWndDoc,
    164                                  HWND_TOP, 0, NULL, NULL );
     168                                 HWND_TOP, DOC_ID_ENTRY, NULL, NULL );
     169
     170    hWndMLE = WinCreateWindow( hWndDoc, WC_MLE, NULL,
     171                               MLS_BORDER,
     172                               0, 0, 0, 0, hWndDoc,
     173                               HWND_TOP, DOC_ID_MLE, NULL, NULL );
     174
     175    char *mleFont = "10.Helvetica Bold";
     176    WinSetPresParam( hWndMLE, PP_FONTNAMESIZE, strlen( mleFont ) + 1, mleFont );
    165177
    166178    hWndHscroll = WinWindowFromID( hWndDocFrame, FID_HORZSCROLL );
     
    12841296    positionTextField( r );
    12851297
    1286     // @todo uncomment this once it returns anything useful
    1287     // int maxLen = textField->getMaximumLength( ev );
    1288     WinSendMsg( hWndText, EM_SETTEXTLIMIT, MPFROMLONG( 65520 ), NULL );
     1298    HWND hwnd;
     1299    if ( textField->isMultiLine( ev ) ) {
     1300        hwnd = hWndMLE;
     1301        WinSendMsg( hwnd, MLM_SETTEXTLIMIT, MPFROMLONG( 65520 ), NULL );
     1302    } else {
     1303        hwnd = hWndEntry;
     1304        // @todo uncomment this once it returns anything useful
     1305        // int maxLen = textField->getMaximumLength( ev );
     1306        WinSendMsg( hwnd, EM_SETTEXTLIMIT, MPFROMLONG( 65520 ), NULL );
     1307    }
    12891308
    12901309    const char *contents = textField->getContents( ev );
    12911310    char *str = uniUtf8ToSys( contents, NULL, NULL );
    1292     WinSetWindowText( hWndText, str );
     1311    WinSetWindowText( hwnd, str );
    12931312    delete[] str;
    12941313
    1295     WinShowWindow( hWndText, TRUE );
    1296     WinSetFocus( HWND_DESKTOP, hWndText );
     1314    WinShowWindow( hwnd, TRUE );
     1315    WinSetFocus( HWND_DESKTOP, hwnd );
    12971316}
    12981317
     
    13021321        return;
    13031322
    1304     RECTL rtmp = {0};
     1323    RECTL r2;
    13051324    if ( r == NULL ) {
    13061325        LuRectangle *rect = textField->getRectangle( ev );
    1307         docPosToWinPos( textFieldPage, rect, &rtmp );
    1308         r = &rtmp;
    1309     }
    1310 
    1311     WinSetWindowPos( hWndText, HWND_TOP,
    1312                      r->xLeft + 3, r->yBottom + 3,
    1313                      r->xRight - r->xLeft - 6,
    1314                      r->yTop - r->yBottom - 6,
    1315                      SWP_MOVE | SWP_SIZE | SWP_ZORDER );
     1326        docPosToWinPos( textFieldPage, rect, &r2 );
     1327    } else {
     1328        r2 = *r;
     1329    }
    13161330
    13171331    static LONG ulDpi = 0;
     
    13241338    }
    13251339
    1326     LONG points = ( r->yTop - r->yBottom - 6 ) * 72 / 120 - 2;
    1327     if ( points < 2 )
    1328         points = 2;
    1329 
    1330     char font[ 32 ];
    1331     sprintf( font, "%d.Helvetica Bold", points );
    1332     WinSetPresParam( hWndText, PP_FONTNAMESIZE, strlen( font ) + 1, font );
     1340    LONG points = -1;
     1341    HWND hwnd;
     1342    if ( textField->isMultiLine( ev ) ) {
     1343        hwnd = hWndMLE;
     1344        // the font size for multi-line text does not change
     1345    } else {
     1346        hwnd = hWndEntry;
     1347        // reduce the rectangle to compensate for the border
     1348        r2.xLeft += 3;
     1349        r2.yBottom += 3;
     1350        r2.xRight -= 3;
     1351        r2.yTop -= 3;
     1352        // set the font size to match the field height
     1353        points = ( r2.yTop - r2.yBottom ) * 72 / 120 - 2;
     1354        if ( points < 1 )
     1355            points = 1;
     1356    }
     1357
     1358    if (points >= 0 ) {
     1359        char font[ 32 ];
     1360        sprintf( font, "%d.Helvetica Bold", points );
     1361        WinSetPresParam( hWndEntry, PP_FONTNAMESIZE, strlen( font ) + 1, font );
     1362    }
     1363
     1364    WinSetWindowPos( hwnd, HWND_TOP,
     1365                     r2.xLeft, r2.yBottom,
     1366                     r2.xRight - r2.xLeft,
     1367                     r2.yTop - r2.yBottom,
     1368                     SWP_MOVE | SWP_SIZE | SWP_ZORDER );
    13331369}
    13341370
     
    13361372{
    13371373    if ( textField != NULL ) {
     1374        HWND hwnd = textField->isMultiLine( ev ) ? hWndMLE : hWndEntry;
    13381375        if ( apply ) {
    1339             LONG len = WinQueryWindowTextLength( hWndText );
     1376            LONG len = WinQueryWindowTextLength( hwnd );
    13401377            char *str = new char [ len + 1 ];
    13411378            *str = 0;
    1342             WinQueryWindowText( hWndText, len + 1, str );
     1379            WinQueryWindowText( hwnd, len + 1, str );
    13431380            str[ len ] = 0;
    13441381            char *contents = uniSysToUtf8( str, NULL, NULL );
     
    13491386        textField = NULL;
    13501387        SWP swp;
    1351         WinQueryWindowPos( hWndText, &swp );
    1352         WinShowWindow( hWndText, FALSE );
     1388        WinQueryWindowPos( hwnd, &swp );
     1389        WinShowWindow( hwnd, FALSE );
    13531390        // repaint little bit more (rounding errors)
    13541391        RECTL r = { swp.x - 1, swp.y - 1, swp.x + swp.cx + 2, swp.y + swp.cy + 2 };
     
    23852422void DocumentViewer::wmControl( USHORT idControl, USHORT notifyCode, HWND hwndControl )
    23862423{
    2387     // so far this comes only from hWndText
    2388 
    2389     if ( notifyCode == EN_KILLFOCUS )
     2424    if ( ( idControl == DOC_ID_ENTRY && notifyCode == EN_KILLFOCUS &&
     2425           textField != NULL && !textField->isMultiLine( ev ) ) ||
     2426         ( idControl == DOC_ID_MLE && notifyCode == MLN_KILLFOCUS &&
     2427           textField != NULL && textField->isMultiLine( ev ) ) )
    23902428        hideTextField();
    23912429}
  • branches/kmk/Lucide/gui/docViewer.h

    r341 r346  
    159159        HWND hWndDocFrame;
    160160        HWND hWndDoc;
    161         HWND hWndText;
     161        HWND hWndEntry;
     162        HWND hWndMLE;
    162163        LuInputText *textField;
    163164        long textFieldPage;
Note: See TracChangeset for help on using the changeset viewer.