Changeset 122


Ignore:
Timestamp:
Sep 10, 2006, 4:36:23 PM (15 years ago)
Author:
Eugene Romanenko
Message:

added 'zoom mode' to zoom in/out with mouse click/ctrl+click (no toolbar button yet)

Location:
trunk/Lucide
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Lucide/BIN/Lucide.lng

    r112 r122  
    2424MENU_ACTUAL_SIZE=~Actual size
    2525MENU_FIT_WIDTH=Fit ~width
     26MENU_ZOOM_IN_OUT=~Zoom in/out
    2627MENU_FIRST_PAGE=~First page
    2728MENU_PREV_PAGE=~Previous page\t-
  • trunk/Lucide/SOURCE/gui/Lucide.rc

    r112 r122  
    1919
    2020POINTER IDP_HAND        "bitmaps\\hand.ptr"
     21POINTER IDP_ZOOM_IN     "bitmaps\\zoom_in.ptr"
     22POINTER IDP_ZOOM_OUT    "bitmaps\\zoom_out.ptr"
    2123
    2224MENU IDM_MAINMENU
     
    5254        MENUITEM "MENU_ACTUAL_SIZE", CM_ACTSIZE
    5355        MENUITEM "MENU_FIT_WIDTH", CM_FITWIDTH
     56        MENUITEM "MENU_ZOOM_IN_OUT", CM_ZOOM_IN_OUT
    5457        MENUITEM SEPARATOR
    5558        MENUITEM "MENU_FIRST_PAGE", CM_FIRSTPAGE
  • trunk/Lucide/SOURCE/gui/Lucide_res.H

    r112 r122  
    4040
    4141#define IDP_HAND        10
     42#define IDP_ZOOM_IN             11
     43#define IDP_ZOOM_OUT    12
    4244
    4345#define IDB_OPEN        20
     
    7880#define CM_ACTSIZE      402
    7981#define CM_FITWIDTH     403
    80 #define CM_ROTATE90CW   404
    81 #define CM_ROTATE90CCW  405
    82 #define CM_SINGLEPAGE   406
    83 #define CM_CONTINUOUS   407
    84 #define CM_DOCINFO      408
    85 #define CM_FONTSINFO    409
     82#define CM_ZOOM_IN_OUT  404
     83#define CM_ROTATE90CW   405
     84#define CM_ROTATE90CCW  406
     85#define CM_SINGLEPAGE   407
     86#define CM_CONTINUOUS   408
     87#define CM_DOCINFO      409
     88#define CM_FONTSINFO    410
    8689
    8790#define CM_NAVPANE      501
  • trunk/Lucide/SOURCE/gui/docViewer.cpp

    r120 r122  
    9292    zoom        = 1.0;
    9393    realzoom    = 1.0;
     94    zoomMode    = false;
    9495    rotation    = 0;
    9596    pixbuf      = NULL;
     
    123124    // links
    124125    links = NULL;
    125     handptr = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, IDP_HAND );
     126    handPtr = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, IDP_HAND );
     127    zoomInPtr = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, IDP_ZOOM_IN );
     128    zoomOutPtr = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, IDP_ZOOM_OUT );
    126129    // search
    127130    foundrects = NULL;
     
    162165    }
    163166
    164     WinDestroyPointer( handptr );
     167    WinDestroyPointer( handPtr );
     168    WinDestroyPointer( zoomInPtr );
     169    WinDestroyPointer( zoomOutPtr );
    165170
    166171    if ( ( hpsBuffer != NULLHANDLE ) && ( hdcBuffer != NULLHANDLE ) ) {
     
    355360void DocumentViewer::setZoom( double _zoom )
    356361{
     362    if ( ( _zoom == 0 ) || ( _zoom < -2 ) || ( ( _zoom > 0 ) && ( _zoom < 0.05 ) ) ) {
     363        return;
     364    }
    357365
    358366    if ( doc != NULL ) {
     
    15261534BOOL DocumentViewer::wmMouseMove( HWND hwnd, SHORT xpos, SHORT ypos )
    15271535{
    1528     if ( mousePressed && ( doc != NULL ) )
    1529     {
    1530         selectionEnd.x = xpos;
    1531         selectionEnd.y = ypos;
    1532 
    1533         if ( continuous )
     1536    if ( zoomMode )
     1537    {
     1538        HPOINTER ptr = zoomInPtr;
     1539        if ( WinGetPhysKeyState( HWND_DESKTOP, 0x1d ) & 0x8000 ) {
     1540            ptr = zoomOutPtr;
     1541        }
     1542        WinSetPointer( HWND_DESKTOP, ptr );
     1543        return TRUE;
     1544    }
     1545    else
     1546    {
     1547        if ( mousePressed && ( doc != NULL ) )
    15341548        {
    1535             scrollToPos( hwnd, NULLHANDLE, xpos, ypos, true );
    1536 
    1537             RECTL selRect = {
    1538                 selectionStart.x < selectionEnd.x ? selectionStart.x : selectionEnd.x,
    1539                 selectionStart.y < selectionEnd.y ? selectionStart.y : selectionEnd.y,
    1540                 selectionStart.x < selectionEnd.x ? selectionEnd.x : selectionStart.x,
    1541                 selectionStart.y < selectionEnd.y ? selectionEnd.y : selectionStart.y
    1542             };
    1543 
    1544             DrawAreas *areas = findDrawAreas( &selRect );
    1545 
    1546             HPS hps = WinGetPS( hwnd );
    1547             GpiSetMix( hps, FM_XOR );
    1548             GpiSetColor( hps, CLR_YELLOW );
    1549 
    1550             for ( int i = 0; i < areas->size(); i++ )
     1549            selectionEnd.x = xpos;
     1550            selectionEnd.y = ypos;
     1551
     1552            if ( continuous )
    15511553            {
    1552                 PageDrawArea *pda = &(*areas)[ i ];
    1553 
    1554                 winPosToDocPos( pda, &(selection[pda->pagenum]) );
    1555 
    1556                 HRGN clearRegion = rectsToRegion( pda->pagenum, hps, selrects[ pda->pagenum ] );
    1557                 LuDocument::freeRectangles( ev, selrects[ pda->pagenum ] );
    1558                 selrects[ pda->pagenum ] = doc->getSelectionRectangles( ev, pda->pagenum, &(selection[pda->pagenum]) );
    1559                 HRGN selectRegion = rectsToRegion( pda->pagenum, hps, selrects[ pda->pagenum ] );
     1554                scrollToPos( hwnd, NULLHANDLE, xpos, ypos, true );
     1555
     1556                RECTL selRect = {
     1557                    selectionStart.x < selectionEnd.x ? selectionStart.x : selectionEnd.x,
     1558                    selectionStart.y < selectionEnd.y ? selectionStart.y : selectionEnd.y,
     1559                    selectionStart.x < selectionEnd.x ? selectionEnd.x : selectionStart.x,
     1560                    selectionStart.y < selectionEnd.y ? selectionEnd.y : selectionStart.y
     1561                };
     1562
     1563                DrawAreas *areas = findDrawAreas( &selRect );
     1564
     1565                HPS hps = WinGetPS( hwnd );
     1566                GpiSetMix( hps, FM_XOR );
     1567                GpiSetColor( hps, CLR_YELLOW );
     1568
     1569                for ( int i = 0; i < areas->size(); i++ )
     1570                {
     1571                    PageDrawArea *pda = &(*areas)[ i ];
     1572
     1573                    winPosToDocPos( pda, &(selection[pda->pagenum]) );
     1574
     1575                    HRGN clearRegion = rectsToRegion( pda->pagenum, hps, selrects[ pda->pagenum ] );
     1576                    LuDocument::freeRectangles( ev, selrects[ pda->pagenum ] );
     1577                    selrects[ pda->pagenum ] = doc->getSelectionRectangles( ev, pda->pagenum, &(selection[pda->pagenum]) );
     1578                    HRGN selectRegion = rectsToRegion( pda->pagenum, hps, selrects[ pda->pagenum ] );
     1579                    GpiCombineRegion( hps, selectRegion, selectRegion, clearRegion, CRGN_XOR );
     1580                    GpiPaintRegion( hps, selectRegion );
     1581                    GpiDestroyRegion( hps, clearRegion );
     1582                    GpiDestroyRegion( hps, selectRegion );
     1583                }
     1584
     1585                WinReleasePS( hps );
     1586                delete areas;
     1587            }
     1588            else
     1589            {
     1590                winPosToDocPos( &selectionStart, &selectionEnd, &(selection[currentpage]) );
     1591
     1592                HPS hps = WinGetPS( hwnd );
     1593                HRGN scrolledRegion = NULLHANDLE; //GpiCreateRegion( hps, 0, NULL );
     1594
     1595                scrollToPos( hwnd, scrolledRegion, xpos, ypos, true );
     1596
     1597                // 127/191/255
     1598                //LONG lclr = ( 127 << 16 ) | ( 191 << 8 ) | 255;
     1599                //LONG lclr = ( 128 << 16 ) | ( 64 << 8 );
     1600                //LONG ltabl[ 1 ] = { lclr };
     1601                //GpiCreateLogColorTable( hps, 0, LCOLF_CONSECRGB, 100, 1, ltabl );
     1602
     1603                GpiSetMix( hps, FM_XOR );
     1604                GpiSetColor( hps, CLR_YELLOW );
     1605                //GpiSetColor( hps, 100 );
     1606
     1607                HRGN clearRegion = rectsToRegion( currentpage, hps, selrects[ currentpage ] );
     1608                LuDocument::freeRectangles( ev, selrects[ currentpage ] );
     1609                if ( ( selectionStart.x == selectionEnd.x ) &&
     1610                     ( selectionStart.y == selectionEnd.y ) ) {
     1611                    selrects[ currentpage ] = NULL;
     1612                    memset( &(selection[ currentpage ]), 0, sizeof( LuRectangle ) );
     1613                }
     1614                else {
     1615                    selrects[ currentpage ] = doc->getSelectionRectangles( ev, currentpage, &(selection[currentpage]) );
     1616                }
     1617                HRGN selectRegion = rectsToRegion( currentpage, hps, selrects[ currentpage ] );
    15601618                GpiCombineRegion( hps, selectRegion, selectRegion, clearRegion, CRGN_XOR );
     1619                //GpiCombineRegion( hps, selectRegion, selectRegion, scrolledRegion, CRGN_DIFF );
    15611620                GpiPaintRegion( hps, selectRegion );
    15621621                GpiDestroyRegion( hps, clearRegion );
    15631622                GpiDestroyRegion( hps, selectRegion );
    1564             }
    1565 
    1566             WinReleasePS( hps );
    1567             delete areas;
    1568         }
    1569         else
     1623                //GpiDestroyRegion( hps, scrolledRegion );
     1624
     1625                WinReleasePS( hps );
     1626            }
     1627        }
     1628        else if ( links != NULL )
    15701629        {
    1571             winPosToDocPos( &selectionStart, &selectionEnd, &(selection[currentpage]) );
    1572 
    1573             HPS hps = WinGetPS( hwnd );
    1574             HRGN scrolledRegion = NULLHANDLE; //GpiCreateRegion( hps, 0, NULL );
    1575 
    1576             scrollToPos( hwnd, scrolledRegion, xpos, ypos, true );
    1577 
    1578             // 127/191/255
    1579             //LONG lclr = ( 127 << 16 ) | ( 191 << 8 ) | 255;
    1580             //LONG lclr = ( 128 << 16 ) | ( 64 << 8 );
    1581             //LONG ltabl[ 1 ] = { lclr };
    1582             //GpiCreateLogColorTable( hps, 0, LCOLF_CONSECRGB, 100, 1, ltabl );
    1583 
    1584             GpiSetMix( hps, FM_XOR );
    1585             GpiSetColor( hps, CLR_YELLOW );
    1586             //GpiSetColor( hps, 100 );
    1587 
    1588             HRGN clearRegion = rectsToRegion( currentpage, hps, selrects[ currentpage ] );
    1589             LuDocument::freeRectangles( ev, selrects[ currentpage ] );
    1590             if ( ( selectionStart.x == selectionEnd.x ) &&
    1591                  ( selectionStart.y == selectionEnd.y ) ) {
    1592                 selrects[ currentpage ] = NULL;
    1593                 memset( &(selection[ currentpage ]), 0, sizeof( LuRectangle ) );
    1594             }
    1595             else {
    1596                 selrects[ currentpage ] = doc->getSelectionRectangles( ev, currentpage, &(selection[currentpage]) );
    1597             }
    1598             HRGN selectRegion = rectsToRegion( currentpage, hps, selrects[ currentpage ] );
    1599             GpiCombineRegion( hps, selectRegion, selectRegion, clearRegion, CRGN_XOR );
    1600             //GpiCombineRegion( hps, selectRegion, selectRegion, scrolledRegion, CRGN_DIFF );
    1601             GpiPaintRegion( hps, selectRegion );
    1602             GpiDestroyRegion( hps, clearRegion );
    1603             GpiDestroyRegion( hps, selectRegion );
    1604             //GpiDestroyRegion( hps, scrolledRegion );
    1605 
    1606             WinReleasePS( hps );
    1607         }
    1608     }
    1609     else if ( links != NULL )
    1610     {
     1630            long pg = currentpage;
     1631            if ( continuous ) {
     1632                double tmp;
     1633                pg = posToPagenum( ypos, &tmp );
     1634            }
     1635
     1636            if ( ( pg != -1 ) && ( links[ pg ] != NULL ) )
     1637            {
     1638                for ( int i = 0; i < links[ pg ]->_length; i++ )
     1639                {
     1640                    RECTL r = {0};
     1641                    docPosToWinPos( pg, &(links[ pg ]->_buffer[i].area), &r );
     1642
     1643                    POINTL ptl = { xpos, ypos };
     1644                    if ( WinPtInRect( hab, &r, &ptl ) ) {
     1645                        WinSetPointer( HWND_DESKTOP, handPtr );
     1646                        return TRUE;
     1647                    }
     1648                }
     1649            }
     1650        }
     1651    }
     1652    return FALSE;
     1653}
     1654
     1655// handles WM_BUTTON1CLICK
     1656BOOL DocumentViewer::wmClick( HWND hwnd, SHORT xpos, SHORT ypos )
     1657{
     1658    if ( zoomMode )
     1659    {
     1660        double z = getRealZoom() / 4;
     1661        double zval = 0;
     1662        bool doPlus = false;
     1663        if ( WinGetPhysKeyState( HWND_DESKTOP, 0x1d ) & 0x8000 ) {
     1664            zval = getRealZoom() - z;
     1665        } else {
     1666            zval = getRealZoom() + z;
     1667            doPlus = true;
     1668        }
     1669        zval = (long)( zval * 20.0 ) / 20.0;   // Round to 0.05 (5%)
     1670        if ( zval == getRealZoom() ) {
     1671            zval += ( doPlus ? 0.01 : -0.01 );
     1672        }
     1673        if ( zval > 0.1 ) {
     1674            Lucide::setZoom( zval );
     1675        }
     1676        return TRUE;
     1677    }
     1678    else
     1679    {
     1680        if ( links == NULL ) {
     1681            return FALSE;
     1682        }
     1683
    16111684        long pg = currentpage;
    16121685        if ( continuous ) {
     
    16231696
    16241697                POINTL ptl = { xpos, ypos };
    1625                 if ( WinPtInRect( hab, &r, &ptl ) ) {
    1626                     WinSetPointer( HWND_DESKTOP, handptr );
     1698                if ( WinPtInRect( hab, &r, &ptl ) )
     1699                {
     1700                    if ( links[ pg ]->_buffer[i].link.type == LU_LINK_TYPE_EXTERNAL_URI )
     1701                    {
     1702                        WinMessageBox( HWND_DESKTOP, hMainFrame,
     1703                            links[ pg ]->_buffer[i].link.uri, "URI", 1,
     1704                            MB_OK | MB_INFORMATION | MB_MOVEABLE );
     1705                    }
     1706                    else if ( links[ pg ]->_buffer[i].link.type == LU_LINK_TYPE_TITLE )
     1707                    {
     1708                        char *title = links[ pg ]->_buffer[i].link.title;
     1709                        if ( title == NULL ) {
     1710                            title = "???";
     1711                        }
     1712                        WinMessageBox( HWND_DESKTOP, hMainFrame,
     1713                            title, "?", 1, MB_OK | MB_INFORMATION | MB_MOVEABLE );
     1714                    }
     1715                    else if ( links[ pg ]->_buffer[i].link.type == LU_LINK_TYPE_PAGE )
     1716                    {
     1717                        goToPage( links[ pg ]->_buffer[i].link.page );
     1718                    }
     1719
    16271720                    return TRUE;
    16281721                }
     
    16301723        }
    16311724    }
    1632 
    1633     return FALSE;
    1634 }
    1635 
    1636 // handles WM_BUTTON1CLICK
    1637 BOOL DocumentViewer::wmClick( HWND hwnd, SHORT xpos, SHORT ypos )
    1638 {
    1639     if ( links == NULL ) {
    1640         return FALSE;
    1641     }
    1642 
    1643     long pg = currentpage;
    1644     if ( continuous ) {
    1645         double tmp;
    1646         pg = posToPagenum( ypos, &tmp );
    1647     }
    1648 
    1649     if ( ( pg != -1 ) && ( links[ pg ] != NULL ) )
    1650     {
    1651         for ( int i = 0; i < links[ pg ]->_length; i++ )
    1652         {
    1653             RECTL r = {0};
    1654             docPosToWinPos( pg, &(links[ pg ]->_buffer[i].area), &r );
    1655 
    1656             POINTL ptl = { xpos, ypos };
    1657             if ( WinPtInRect( hab, &r, &ptl ) )
    1658             {
    1659                 if ( links[ pg ]->_buffer[i].link.type == LU_LINK_TYPE_EXTERNAL_URI )
    1660                 {
    1661                     WinMessageBox( HWND_DESKTOP, hMainFrame,
    1662                         links[ pg ]->_buffer[i].link.uri, "URI", 1,
    1663                         MB_OK | MB_INFORMATION | MB_MOVEABLE );
    1664                 }
    1665                 else if ( links[ pg ]->_buffer[i].link.type == LU_LINK_TYPE_TITLE )
    1666                 {
    1667                     char *title = links[ pg ]->_buffer[i].link.title;
    1668                     if ( title == NULL ) {
    1669                         title = "???";
    1670                     }
    1671                     WinMessageBox( HWND_DESKTOP, hMainFrame,
    1672                         title, "?", 1, MB_OK | MB_INFORMATION | MB_MOVEABLE );
    1673                 }
    1674                 else if ( links[ pg ]->_buffer[i].link.type == LU_LINK_TYPE_PAGE )
    1675                 {
    1676                     goToPage( links[ pg ]->_buffer[i].link.page );
    1677                 }
    1678 
    1679                 return TRUE;
    1680             }
    1681         }
    1682     }
    1683 
    16841725    return FALSE;
    16851726}
     
    17841825        goToPage( currentpage - 1 );
    17851826        return TRUE;
     1827    }
     1828
     1829    // Ctrl
     1830    if ( ( fsflags & KC_VIRTUALKEY ) && ( usvk == VK_CTRL ) && zoomMode ) {
     1831        wmMouseMove( hwnd, 0, 0 ); // to switch mouse pointer if in zoomMode
    17861832    }
    17871833
  • trunk/Lucide/SOURCE/gui/docViewer.h

    r91 r122  
    7373        double getZoom() { return zoom; }
    7474        double getRealZoom() { return realzoom; }
     75        void setZoomMode( bool _zoomMode ) { zoomMode = _zoomMode; }
     76        bool isZoomMode() { return zoomMode; }
    7577        void setRotation( long _rotation );
    7678        long getRotation() { return rotation; }
     
    151153        short bpp;
    152154        double width, height, zoom, realzoom, fullwidth, fullheight;
     155        boolean zoomMode;
    153156        long rotation;
    154157        long totalpages, currentpage;
     
    187190        // links
    188191        LuDocument_LuLinkMapSequence **links;
    189         HPOINTER handptr;
    190192
    191193        // search
     
    195197        bool continueSearch;
    196198        bool abortSearch;
     199       
     200        // pointers
     201        HPOINTER handPtr;
     202        HPOINTER zoomInPtr;
     203        HPOINTER zoomOutPtr;
    197204};
    198205
  • trunk/Lucide/SOURCE/gui/lucide.cpp

    r112 r122  
    158158    WinEnableMenuItem( hWndMenu, CM_FITWIDTH, scalable );
    159159    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWIDTH), (MPARAM)scalable );
     160    WinEnableMenuItem( hWndMenu, CM_ZOOM_IN_OUT, scalable );
    160161    WinEnableControl( hToolBar, TBID_ZOOM, scalable );
    161162    BOOL rotable = doc->isRotable( ev );
     
    255256        WinEnableMenuItem( hWndMenu, CM_FITWIDTH, FALSE );
    256257        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWIDTH), (MPARAM)FALSE );
     258        WinEnableMenuItem( hWndMenu, CM_ZOOM_IN_OUT, FALSE );
    257259        WinEnableControl( hToolBar, TBID_ZOOM, FALSE );
    258260
     
    605607}
    606608
     609void Lucide::toggleZoom()
     610{
     611    if ( ( doc != NULL ) && doc->isScalable( ev ) )
     612    {
     613        bool isZoom = !docViewer->isZoomMode();
     614
     615        WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_ZOOM_IN_OUT, TRUE ),
     616                MPFROM2SHORT( MIA_CHECKED, isZoom ? MIA_CHECKED : FALSE ) );
     617        docViewer->setZoomMode( isZoom );
     618    }
     619}
     620
    607621static MRESULT EXPENTRY splProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
    608622{
     
    757771                    return (MRESULT)FALSE;
    758772
     773                case CM_ZOOM_IN_OUT:
     774                    Lucide::toggleZoom();
     775                    return (MRESULT)FALSE;
     776
    759777                case CM_SINGLEPAGE:
    760778                    Lucide::setPageLayout( SinglePage );
  • trunk/Lucide/SOURCE/gui/lucide.h

    r91 r122  
    8888        static void goToPage( long page );
    8989        static void setZoom( double zoom );
     90        static void toggleZoom();
    9091        static void enableCopy( bool enable );
    9192        static void setPageLayout( PgLayout layout );
Note: See TracChangeset for help on using the changeset viewer.