source: trunk/Lucide/SOURCE/gui/lucide.cpp @ 34

Last change on this file since 34 was 34, checked in by Eugene Romanenko, 15 years ago

implemented fullscreen mode

File size: 26.3 KB
Line 
1#define INCL_WIN
2#define INCL_DOS
3#include <os2.h>
4
5#include <string>
6#include <stdio.h>
7#include <process.h>
8
9#include <ludoc.xh>
10
11#include "Lucide.h"
12#include "pluginman.h"
13#include "pluginViewDlg.h"
14#include "fontsInfoDlg.h"
15#include "docInfoDlg.h"
16#include "findDlg.h"
17#include "progressDlg.h"
18#include "docViewer.h"
19#include "indexWindow.h"
20#include "luutils.h"
21#include "tb_spl.h"
22#include "Lucide_res.h"
23#include "messages.h"
24
25
26#define ID_SPLITTER 1
27
28const char *appName    = "Lucide";
29const char *appVersion = VERSION;
30const char *fwp        = "FrameWindowPos";
31const char *lvd        = "LastViewedDir";
32const char *splpos     = "SplitterPos";
33const char *showind    = "ShowIndex";
34
35
36HWND createToolbar( HWND hwnd );
37void AboutBox( HWND hWndFrame );
38
39HAB   hab            = NULLHANDLE;
40HWND  hWndFrame      = NULLHANDLE;
41HWND  hWndMenu       = NULLHANDLE;
42HWND  hToolBar       = NULLHANDLE;
43HWND  hVertSplitter  = NULLHANDLE;
44HWND  hFrameSysmenu  = NULLHANDLE;
45HWND  hFrameTitlebar = NULLHANDLE;
46HWND  hFrameMinMax   = NULLHANDLE;
47
48Environment    *ev        = somGetGlobalEnvironment();
49LuDocument     *doc       = NULL;
50PluginManager  *pluginMan = NULL;
51DocumentViewer *docViewer = NULL;
52IndexWindow    *indexWin  = NULL;
53FindDlg        *findDlg   = NULL;
54char           *title     = NULL;
55
56
57bool  Lucide::dontSwitchPage = false;
58SHORT Lucide::splitterPos    = 100;
59bool  Lucide::showIndex      = true;
60bool  Lucide::isFullscreen   = false;
61LuWindowPos Lucide::winPos   = {0};
62
63
64PFNWP pOldSplProc;
65
66void Lucide::enableCopy( bool enable )
67{
68    WinEnableMenuItem( hWndMenu, CM_COPY, enable );
69}
70
71void Lucide::setOfPages( long pages )
72{
73    char *pgfrm = newstrdupL( TB_PAGENUM );
74    char pgnum[ 32 ];
75    snprintf( pgnum, sizeof( pgnum ), pgfrm, pages );
76    delete pgfrm;
77    WinSetDlgItemText( hToolBar, TBID_OFPAGES, pgnum );
78    WinSendDlgItemMsg( hToolBar, TBID_PAGENUM, SPBM_SETLIMITS, (MPARAM)pages, (MPARAM)1 );
79}
80
81void Lucide::checkNavigationMenus()
82{
83    BOOL enfirst = ( docViewer->getCurrentPage() != 0 );
84    BOOL enlast = ( docViewer->getCurrentPage() != ( doc->getPageCount( ev ) - 1 ) );
85    WinEnableMenuItem( hWndMenu, CM_FIRSTPAGE, enfirst );
86    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIRSTPAGE), (MPARAM)enfirst );
87    WinEnableMenuItem( hWndMenu, CM_PREVPAGE, enfirst );
88    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_PREVPAGE), (MPARAM)enfirst );
89    WinEnableMenuItem( hWndMenu, CM_NEXTPAGE, enlast );
90    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_NEXTPAGE), (MPARAM)enlast );
91    WinEnableMenuItem( hWndMenu, CM_LASTPAGE, enlast );
92    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_LASTPAGE), (MPARAM)enlast );
93
94    dontSwitchPage = true;
95    WinSendDlgItemMsg( hToolBar, TBID_PAGENUM, SPBM_SETCURRENTVALUE,
96                       MPFROMLONG( docViewer->getCurrentPage() + 1 ), MPVOID );
97    dontSwitchPage = false;
98    indexWin->goToPage( NULL, docViewer->getCurrentPage() );
99}
100
101void Lucide::enableZoomMenus()
102{
103    BOOL scalable = doc->isScalable( ev );
104    WinEnableMenuItem( hWndMenu, CM_FITWINDOW, scalable );
105    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWINDOW), (MPARAM)scalable );
106    WinEnableMenuItem( hWndMenu, CM_ACTSIZE, scalable );
107    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_ACTSIZE), (MPARAM)scalable );
108    WinEnableMenuItem( hWndMenu, CM_FITWIDTH, scalable );
109    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWIDTH), (MPARAM)scalable );
110    WinEnableControl( hToolBar, TBID_ZOOM, scalable );
111    BOOL rotable = doc->isRotable( ev );
112    WinEnableMenuItem( hWndMenu, CM_ROTATE90CW, rotable );
113    WinEnableMenuItem( hWndMenu, CM_ROTATE90CCW, rotable );
114}
115
116
117void Lucide::setZoomChecks( SHORT cmd, SHORT cbind, double zoom )
118{
119    if ( cmd != -1 )
120    {
121        WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( cmd, TRUE ),
122                            MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
123        WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT( cmd ), (MPARAM)TRUE );
124    }
125
126    if ( cbind != -1 )
127    {
128        char buf[ 255 ] = "";
129        WinSendDlgItemMsg( hToolBar, TBID_ZOOM, LM_QUERYITEMTEXT,
130                           MPFROM2SHORT( cbind, sizeof( buf ) ), MPFROMP( buf ) );
131        WinSetDlgItemText( hToolBar, TBID_ZOOM, buf );
132    }
133
134    if ( zoom != 0 )
135    {
136        std::string z = str( zoom * 100.0 ) + "%";
137        WinSetDlgItemText( hToolBar, TBID_ZOOM, z.c_str() );
138    }
139}
140
141void Lucide::checkZoomMenus()
142{
143    double zoom = docViewer->getZoom();
144
145    WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_FITWINDOW, TRUE ),
146                        MPFROM2SHORT( MIA_CHECKED, FALSE ) );
147    WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT(CM_FITWINDOW), (MPARAM)FALSE );
148    WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_ACTSIZE, TRUE ),
149                        MPFROM2SHORT( MIA_CHECKED, FALSE ) );
150    WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT(CM_ACTSIZE), (MPARAM)FALSE );
151    WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_FITWIDTH, TRUE ),
152                        MPFROM2SHORT( MIA_CHECKED, FALSE ) );
153    WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT(CM_FITWIDTH), (MPARAM)FALSE );
154
155    if ( zoom == -2 ) {
156        setZoomChecks( CM_FITWINDOW, 1, 0 );
157    } else if ( zoom == -1 ) {
158        setZoomChecks( CM_FITWIDTH, 2, 0 );
159    } else if ( zoom == 1 ) {
160        setZoomChecks( CM_ACTSIZE, 0, 0 );
161    } else {
162        setZoomChecks( -1, -1, zoom );
163    }
164}
165
166void Lucide::checkMenus()
167{
168    // pre-set "Actual size"
169    setZoomChecks( CM_ACTSIZE, 0, 0 );
170
171    if ( doc == NULL )
172    {
173        // "single page" mode by default
174        WinSendMsg( hWndMenu, MM_SETITEMATTR,
175                    MPFROM2SHORT( CM_SINGLEPAGE, TRUE ),
176                    MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
177
178        WinEnableMenuItem( hWndMenu, CM_SAVEAS, FALSE );
179        WinEnableMenuItem( hWndMenu, CM_EXPORTTOPS, FALSE );
180        WinEnableMenuItem( hWndMenu, CM_PAGESETUP, FALSE );
181        WinEnableMenuItem( hWndMenu, CM_PRINT, FALSE );
182        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_PRINT), (MPARAM)FALSE );
183        WinEnableMenuItem( hWndMenu, CM_DOCINFO, FALSE );
184        WinEnableMenuItem( hWndMenu, CM_FONTSINFO, FALSE );
185
186        WinEnableMenuItem( hWndMenu, CM_COPY, FALSE );
187        WinEnableMenuItem( hWndMenu, CM_SELECTALL, FALSE );
188        WinEnableMenuItem( hWndMenu, CM_FIND, FALSE );
189        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIND), (MPARAM)FALSE );
190        WinEnableMenuItem( hWndMenu, CM_FINDAGAIN, FALSE );
191
192        WinEnableMenuItem( hWndMenu, CM_FIRSTPAGE, FALSE );
193        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIRSTPAGE), (MPARAM)FALSE );
194        WinEnableMenuItem( hWndMenu, CM_PREVPAGE, FALSE );
195        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_PREVPAGE), (MPARAM)FALSE );
196        WinEnableMenuItem( hWndMenu, CM_NEXTPAGE, FALSE );
197        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_NEXTPAGE), (MPARAM)FALSE );
198        WinEnableMenuItem( hWndMenu, CM_LASTPAGE, FALSE );
199        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_LASTPAGE), (MPARAM)FALSE );
200        WinEnableMenuItem( hWndMenu, CM_GOTOPAGE, FALSE );
201
202        WinEnableMenuItem( hWndMenu, CM_FITWINDOW, FALSE );
203        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWINDOW), (MPARAM)FALSE );
204        WinEnableMenuItem( hWndMenu, CM_ACTSIZE, FALSE );
205        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_ACTSIZE), (MPARAM)FALSE );
206        WinEnableMenuItem( hWndMenu, CM_FITWIDTH, FALSE );
207        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWIDTH), (MPARAM)FALSE );
208        WinEnableControl( hToolBar, TBID_ZOOM, FALSE );
209
210        WinEnableMenuItem( hWndMenu, CM_ROTATE90CW, FALSE );
211        WinEnableMenuItem( hWndMenu, CM_ROTATE90CCW, FALSE );
212        //WinEnableMenuItem( hWndMenu, CM_NAVPANE, FALSE );
213        //WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_NAVPANE), (MPARAM)FALSE );
214        WinEnableMenuItem( hWndMenu, CM_SINGLEPAGE, FALSE );
215        WinEnableMenuItem( hWndMenu, CM_CONTINUOUS, FALSE );
216
217        setOfPages( 0 );
218        return;
219    }
220
221
222    checkNavigationMenus();
223    enableZoomMenus();
224    checkZoomMenus();
225
226    setOfPages( doc->getPageCount( ev ) );
227    WinEnableMenuItem( hWndMenu, CM_FONTSINFO, doc->isHaveFontInfo( ev ) );
228    WinEnableMenuItem( hWndMenu, CM_DOCINFO, TRUE );
229
230    BOOL haveText = doc->isHaveText( ev );
231    WinEnableMenuItem( hWndMenu, CM_FIND, haveText );
232    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIND), (MPARAM)haveText );
233
234    WinEnableMenuItem( hWndMenu, CM_SINGLEPAGE, TRUE );
235    WinEnableMenuItem( hWndMenu, CM_CONTINUOUS, TRUE );
236}
237
238void Lucide::goToPage( long page )
239{
240    if ( docViewer != NULL ) {
241        docViewer->goToPage( page );
242    }
243}
244
245void Lucide::setZoom( double zoom )
246{
247    if ( docViewer != NULL ) {
248        docViewer->setZoom( zoom );
249        checkZoomMenus();
250    }
251}
252
253void Lucide::setDocument( LuDocument *_doc )
254{
255    docViewer->setDocument( _doc );
256    indexWin->setDocument( _doc );
257    checkMenus();
258}
259
260void Lucide::setViewMode( ViewMode mode )
261{
262    if ( mode == SinglePage )
263    {
264        WinSendMsg( hWndMenu, MM_SETITEMATTR,
265                    MPFROM2SHORT( CM_SINGLEPAGE, TRUE ),
266                    MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
267        WinSendMsg( hWndMenu, MM_SETITEMATTR,
268                    MPFROM2SHORT( CM_CONTINUOUS, TRUE ),
269                    MPFROM2SHORT( MIA_CHECKED, FALSE ) );
270    }
271    else
272    {
273        WinSendMsg( hWndMenu, MM_SETITEMATTR,
274                    MPFROM2SHORT( CM_SINGLEPAGE, TRUE ),
275                    MPFROM2SHORT( MIA_CHECKED, FALSE ) );
276        WinSendMsg( hWndMenu, MM_SETITEMATTR,
277                    MPFROM2SHORT( CM_CONTINUOUS, TRUE ),
278                    MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
279    }
280
281    docViewer->setViewMode( mode );
282}
283
284
285// static data for asynch loading document
286ProgressDlg *Lucide::loadProgressDlg       = NULL;
287char         Lucide::docName[ CCHMAXPATH ] = "";
288bool         Lucide::docLoaded             = false;;
289char        *Lucide::loadError             = NULL;
290
291void Lucide::loadthread( void *p )
292{
293    HAB thab = WinInitialize( 0 );
294    HMQ thmq = WinCreateMsgQueue( thab, 0 );
295
296    docLoaded = doc->loadFile( ev, docName, NULL, &loadError );
297    loadProgressDlg->hide();
298
299    WinDestroyMsgQueue( thmq );
300    WinTerminate( thab );
301    _endthread();
302}
303
304void Lucide::loadDocument( const char *fn )
305{
306    char *msg = newstrdupL( MSGS_NO_SUIT_PLUG );
307
308    // find extension
309    char *ext = strrchr( fn, '.' );
310    if ( ext == NULL ) {
311        WinMessageBox( HWND_DESKTOP, hWndFrame, msg,
312                       NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
313    }
314    else
315    {
316        // test if extension supported and then close previous opened document
317        if ( pluginMan->createDocumentForExt( ext + 1, true ) == NULL )
318        {
319            WinMessageBox( HWND_DESKTOP, hWndFrame, msg,
320                           NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
321        }
322        else
323        {
324            docViewer->close();
325            delete doc;
326            doc = NULL;
327            WinSetWindowText( hWndFrame, title );
328
329            doc = pluginMan->createDocumentForExt( ext + 1, false );
330            if ( doc == NULL ) {
331                WinMessageBox( HWND_DESKTOP, hWndFrame, msg,
332                               NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
333            }
334            else
335            {
336                strcpy( docName, fn );
337                docLoaded = false;;
338                loadError = NULL;
339
340#if 0
341                loadProgressDlg = new ProgressDlg( hWndFrame );
342                loadProgressDlg->setText( "Loading document, please wait..." );
343                loadProgressDlg->show( loadthread, NULL ); // doc will be loaded
344                delete loadProgressDlg;
345#else
346                docLoaded = doc->loadFile( ev, docName, NULL, &loadError );
347#endif
348
349                if ( docLoaded )
350                {
351                    char *t = new char[ 2048 ];
352                    char _fn[ _MAX_NAME ];
353                    char _ex[ _MAX_EXT ];
354                    _splitpath( fn, NULL, NULL, _fn, _ex );
355                    strcpy( t, _fn );
356                    strcat( t, _ex );
357                    strcat( t, " - " );
358                    strcat( t, title );
359                    WinSetWindowText( hWndFrame, t );
360                    delete t;
361                    setDocument( doc );
362                }
363                else
364                {
365                    if ( loadError == NULL )
366                    {
367                        char *m = newstrdupL( MSGS_FILE_LOAD_ERROR );
368                        WinMessageBox( HWND_DESKTOP, hWndFrame, m,
369                                       NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
370                        delete m;
371                    }
372                    else
373                    {
374                        WinMessageBox( HWND_DESKTOP, hWndFrame, loadError,
375                                       NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
376                        SOMFree( loadError );
377                    }
378
379                    delete doc;
380                    doc = NULL;
381                }
382            }
383
384        }
385
386    }
387    delete msg;
388}
389
390void Lucide::openDocument()
391{
392    PFILEDLG fd = new FILEDLG;
393    memset( fd, 0, sizeof( FILEDLG ) );
394    fd->cbSize = sizeof( FILEDLG );
395    fd->fl = FDS_CENTER | FDS_OPEN_DIALOG;
396    PrfQueryProfileString( HINI_USERPROFILE, appName, lvd, "",
397                           fd->szFullFile, sizeof( fd->szFullFile ) );
398    strcat( fd->szFullFile, pluginMan->getExtsMask().c_str() );
399    WinFileDlg( HWND_DESKTOP, hWndFrame, fd );
400    if ( fd->lReturn == DID_OK )
401    {
402        char drv[ _MAX_DRIVE ] = "";
403        char dir[ _MAX_PATH ] = "";
404        char buf[ _MAX_PATH ] = "";
405        _splitpath( fd->szFullFile, drv, dir, NULL, NULL );
406        _makepath( buf, drv, dir, NULL, NULL );
407        PrfWriteProfileString( HINI_USERPROFILE, appName, lvd, buf );
408
409        loadDocument( fd->szFullFile );
410    }
411    delete fd;
412}
413
414void Lucide::checkNavpane()
415{
416    if ( Lucide::showIndex )
417    {
418        WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_NAVPANE, TRUE ),
419                MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
420        WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT( CM_NAVPANE ), (MPARAM)TRUE );
421    }
422    else
423    {
424        WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_NAVPANE, TRUE ),
425                MPFROM2SHORT( MIA_CHECKED, FALSE ) );
426        WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT( CM_NAVPANE ), (MPARAM)FALSE );
427    }
428}
429
430
431void Lucide::toggleFullscreen()
432{
433    ULONG ulFrameStyle = WinQueryWindowULong( hWndFrame, QWL_STYLE );
434
435    if ( isFullscreen )
436    {
437        WinSetParent( hFrameSysmenu,  hWndFrame, FALSE );
438        WinSetParent( hFrameTitlebar, hWndFrame, FALSE );
439        WinSetParent( hFrameMinMax,   hWndFrame, FALSE );
440        ulFrameStyle |= FS_SIZEBORDER;
441    }
442    else
443    {
444        WinQueryWindowPos( hWndFrame, &winPos.Swp );
445        winPos.XRestore  = WinQueryWindowUShort( hWndFrame, QWS_XRESTORE );
446        winPos.YRestore  = WinQueryWindowUShort( hWndFrame, QWS_YRESTORE );
447        winPos.CXRestore = WinQueryWindowUShort( hWndFrame, QWS_CXRESTORE );
448        winPos.CYRestore = WinQueryWindowUShort( hWndFrame, QWS_CYRESTORE );
449        winPos.XMinimize = WinQueryWindowUShort( hWndFrame, QWS_XMINIMIZE );
450        winPos.YMinimize = WinQueryWindowUShort( hWndFrame, QWS_YMINIMIZE );
451
452        WinSetParent( hFrameSysmenu,  HWND_OBJECT, FALSE );
453        WinSetParent( hFrameTitlebar, HWND_OBJECT, FALSE );
454        WinSetParent( hFrameMinMax,   HWND_OBJECT, FALSE );
455        ulFrameStyle &= ~FS_SIZEBORDER;
456    }
457
458    WinSetWindowULong( hWndFrame, QWL_STYLE, ulFrameStyle );
459    WinSendMsg( hWndFrame, WM_UPDATEFRAME,
460                MPFROMLONG( FCF_TITLEBAR | FCF_SIZEBORDER | FCF_SYSMENU | FCF_MINMAX ),
461                MPVOID );
462
463    if ( isFullscreen )
464    {
465        WinSetWindowUShort( hWndFrame, QWS_XRESTORE,  winPos.XRestore );
466        WinSetWindowUShort( hWndFrame, QWS_YRESTORE,  winPos.YRestore );
467        WinSetWindowUShort( hWndFrame, QWS_CXRESTORE, winPos.CXRestore );
468        WinSetWindowUShort( hWndFrame, QWS_CYRESTORE, winPos.CYRestore );
469        WinSetWindowUShort( hWndFrame, QWS_XMINIMIZE, winPos.XMinimize );
470        WinSetWindowUShort( hWndFrame, QWS_YMINIMIZE, winPos.YMinimize );
471        ULONG swpopt = SWP_MOVE | SWP_SIZE | SWP_SHOW;
472        WinSetWindowPos( hWndFrame, NULLHANDLE,
473                         winPos.Swp.x, winPos.Swp.y, winPos.Swp.cx, winPos.Swp.cy,
474                         swpopt );
475    }
476    else
477    {
478        WinSetWindowPos( hWndFrame, HWND_TOP, 0, 0,
479                         WinQuerySysValue( HWND_DESKTOP, SV_CXFULLSCREEN ) - 1,
480                         WinQuerySysValue( HWND_DESKTOP, SV_CYFULLSCREEN ) +
481                            WinQuerySysValue( HWND_DESKTOP, SV_CYTITLEBAR ),
482                         SWP_SIZE | SWP_MOVE | SWP_ZORDER );
483    }
484
485    isFullscreen = !isFullscreen;
486}
487
488static MRESULT EXPENTRY splProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
489{
490    switch ( msg )
491    {
492        case WM_CONTROL:
493        {
494            if ( ( SHORT1FROMMP( mp1 ) == ID_SPLITTER ) &&
495                 ( SHORT2FROMMP( mp1 ) == SBN_POSITIONCHANGED ) )
496            {
497                SHORT pos = SHORT1FROMMP( mp2 );
498                if ( pos > 0 ) {
499                    Lucide::splitterPos = pos;
500                    Lucide::showIndex = true;
501                }
502                else {
503                    Lucide::showIndex = false;
504                }
505                Lucide::checkNavpane();
506            }
507        }
508        break;
509
510        case WM_COMMAND:
511        {
512            switch ( SHORT1FROMMP(mp1) )
513            {
514                case CM_OPEN:
515                    Lucide::openDocument();
516                    return (MRESULT)FALSE;
517
518                case CM_EXIT:
519                    WinPostMsg( hWndFrame, WM_CLOSE, NULL, NULL );
520                    return (MRESULT)FALSE;
521
522                case CM_DOCINFO:
523                {
524                    LuDocumentInfo *dinfo = doc->getDocumentInfo( ev );
525                    DocInfoDlg *d = new DocInfoDlg( hWndFrame, dinfo );
526                    d->doDialog();
527                    LuDocument::freeDocumentInfo( ev, dinfo );
528                    return (MRESULT)FALSE;
529                }
530
531                case CM_FONTSINFO:
532                {
533                    FontsInfoDlg *d = new FontsInfoDlg( hWndFrame, doc );
534                    d->doDialog();
535                    return (MRESULT)FALSE;
536                }
537
538                case CM_PLUGINSLIST:
539                {
540                    PluginViewDlg *d = new PluginViewDlg( hWndFrame,
541                                                pluginMan->getPluginsList() );
542                    d->doDialog();
543                    return (MRESULT)FALSE;
544                }
545
546                case CM_COPY:
547                    docViewer->copyToClipbrd();
548                    return (MRESULT)FALSE;
549
550                case CM_FIND:
551                    if ( findDlg->showDialog() == DID_OK ) {
552                        if ( strlen( findDlg->getSearchString() ) > 0 )
553                        {
554                            docViewer->searchDocument( findDlg->getSearchString(),
555                                            findDlg->isCaseSensitive(), false );
556
557                            WinEnableMenuItem( hWndMenu, CM_FINDAGAIN, TRUE );
558                        }
559                    }
560                    return (MRESULT)FALSE;
561
562                case CM_FINDAGAIN:
563                    docViewer->searchDocument( findDlg->getSearchString(),
564                                               findDlg->isCaseSensitive(), true );
565                    return (MRESULT)FALSE;
566
567                case CM_FIRSTPAGE:
568                    Lucide::goToPage( 0 );
569                    return (MRESULT)FALSE;
570
571                case CM_NEXTPAGE:
572                    Lucide::goToPage( docViewer->getCurrentPage() + 1 );
573                    return (MRESULT)FALSE;
574
575                case CM_PREVPAGE:
576                    Lucide::goToPage( docViewer->getCurrentPage() - 1 );
577                    return (MRESULT)FALSE;
578
579                case CM_LASTPAGE:
580                    Lucide::goToPage( doc->getPageCount( ev ) - 1 );
581                    return (MRESULT)FALSE;
582
583                case CM_FITWINDOW:
584                    Lucide::setZoom( -2 );
585                    return (MRESULT)FALSE;
586
587                case CM_ACTSIZE:
588                    Lucide::setZoom( 1 );
589                    return (MRESULT)FALSE;
590
591                case CM_FITWIDTH:
592                    Lucide::setZoom( -1 );
593                    return (MRESULT)FALSE;
594
595                case CM_SINGLEPAGE:
596                    Lucide::setViewMode( SinglePage );
597                    return (MRESULT)FALSE;
598
599                case CM_CONTINUOUS:
600                    Lucide::setViewMode( Continuous );
601                    return (MRESULT)FALSE;
602
603                case CM_NAVPANE:
604                    {
605                        Lucide::showIndex = !Lucide::showIndex;
606                        Lucide::checkNavpane();
607                        WinSendMsg( hVertSplitter, SBM_SETSPLITTERPOS,
608                            MPFROMSHORT( Lucide::showIndex ? Lucide::splitterPos : 0 ), MPVOID );
609                    }
610                    return (MRESULT)FALSE;
611
612                case CM_FULLSCREEN:
613                    Lucide::toggleFullscreen();
614                    return (MRESULT)FALSE;
615
616                case CM_PRODINFO:
617                    AboutBox( hWndFrame );
618                    return (MRESULT)FALSE;
619
620            }
621        }
622        break;
623    }
624    return pOldSplProc( hwnd, msg, mp1, mp2 );
625}
626
627
628char deffont[] = "9.WarpSans";
629int deffontlen = sizeof( deffont );
630
631int main( int argc, char **argv )
632{
633#ifdef __TEST__
634    PPIB pib;
635    PTIB tib;
636    DosGetInfoBlocks(&tib, &pib);
637    pib->pib_ultype = 3;
638#endif
639
640    HMQ   hmq;
641    QMSG  qmsg;
642    hab = WinInitialize( 0 );
643    hmq = WinCreateMsgQueue( hab, 0 );
644
645    loadLang();
646
647    pluginMan = new PluginManager;
648
649    InitPMSplitterClass( hab );
650    InitPMToolbarClass( hab );
651
652    ULONG ulFrameFlags = FCF_TITLEBAR | FCF_SIZEBORDER | FCF_SYSMENU |
653                         FCF_MINMAX | FCF_TASKLIST | FCF_NOBYTEALIGN;
654    title = newstrdupL( MSGS_MAIN_WIN_TITLE );
655    hWndFrame = WinCreateStdWindow( HWND_DESKTOP, 0, &ulFrameFlags, NULL, title,
656                                    WS_SYNCPAINT|WS_VISIBLE, NULLHANDLE, 100, NULL );
657    hFrameSysmenu  = WinWindowFromID( hWndFrame, FID_SYSMENU );
658    hFrameTitlebar = WinWindowFromID( hWndFrame, FID_TITLEBAR );
659    hFrameMinMax   = WinWindowFromID( hWndFrame, FID_MINMAX );
660    WinSetAccelTable( hab, WinLoadAccelTable( hab, NULLHANDLE, IDA_MAINACCEL ), hWndFrame );
661    hWndMenu = WinLoadMenu( hWndFrame, NULLHANDLE, IDM_MAINMENU );
662    localizeMenu( hWndMenu );
663    WinSetWindowUShort( hWndMenu, QWS_ID, FID_MENU );
664
665    // Vertical splitter and his windows - Index and Document view
666    hVertSplitter = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
667                                     WS_VISIBLE | SBS_VSPLIT,
668                                     0, 0, 0, 0, hWndFrame, HWND_TOP,
669                                     ID_SPLITTER, NULL, NULL );
670
671    indexWin = new IndexWindow( hab, hWndFrame );
672
673    DocumentViewer::registerClass( hab );
674
675    docViewer = new DocumentViewer( hab, hWndFrame );
676
677    WinSendMsg( hVertSplitter, SBM_SETWINDOWS,
678                MPFROMHWND( indexWin->getHWND() ), MPFROMHWND( docViewer->getHWND() ) );
679    Lucide::splitterPos = PrfQueryProfileInt( HINI_USERPROFILE, appName, splpos, Lucide::splitterPos );
680    Lucide::showIndex = PrfQueryProfileInt( HINI_USERPROFILE, appName, showind, Lucide::showIndex );
681    WinSendMsg( hVertSplitter, SBM_SETSPLITTERPOS,
682                MPFROMSHORT( Lucide::showIndex ? Lucide::splitterPos : 0 ), MPVOID );
683
684    // Horizontal splitter and its windows - Toolbar and Vertical splitter
685    // Horizontal splitter is client window
686    HWND hHorizSplitter = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
687                                           WS_VISIBLE | SBS_HSPLIT | SBS_SECONDFIXED,
688                                           0, 0, 0, 0, hWndFrame, HWND_TOP,
689                                           FID_CLIENT, NULL, NULL );
690    pOldSplProc = WinSubclassWindow( hHorizSplitter, splProc );
691
692    hToolBar = createToolbar( hWndFrame );
693
694    WinSendMsg( hHorizSplitter, SBM_SETWINDOWS,
695                MPFROMHWND( hVertSplitter ), MPFROMHWND( hToolBar ) );
696    // ãáâ ­®¢šâì 䚪ášà®¢ ­­ë© à §¬¥à €«ï âã«¡ à 
697    WinSendMsg( hHorizSplitter, SBM_SETFIXEDSIZE,
698                MPFROMSHORT( DEFAULT_PICTSIZE + TOOLBAR_HEIGHT_ADD ), MPVOID );
699
700    findDlg = new FindDlg( hWndFrame );
701    Lucide::checkMenus();
702
703    // ®ª § âì ®ª­® ¯à®£à ¬¬ë
704    if ( !PMRestoreWindowPos( NULL, appName, fwp, hWndFrame,
705                              TRUE, TRUE, FALSE, FALSE, FALSE ) ) {
706        WinSetWindowPos( hWndFrame, HWND_TOP, 100, 100, 630, 400,
707                         SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE );
708    }
709
710    if ( argc > 1 ) {
711        Lucide::loadDocument( argv[1] );
712    }
713
714    Lucide::checkNavpane();
715
716    // Messsage loop
717    while ( WinGetMsg( hab, &qmsg, 0, 0, 0 ) ) {
718        WinDispatchMsg( hab, &qmsg );
719    }
720
721    if ( WinIsWindow( hab, hWndFrame ) )
722    {
723        char valbuf[ 3 ] = "";
724        PrfWriteProfileString( HINI_USERPROFILE, appName, splpos,
725                               itoa( Lucide::splitterPos, valbuf, 10 ) );
726        PrfWriteProfileString( HINI_USERPROFILE, appName, showind,
727                               itoa( Lucide::showIndex, valbuf, 10 ) );
728        PMStoreWindowPos( NULL, appName, fwp, hWndFrame );
729    }
730
731    WinDestroyWindow( hWndFrame );
732    WinDestroyMsgQueue( hmq );
733    WinTerminate( hab );
734
735    delete docViewer;
736    delete indexWin;
737    // must be freed _before_ plugin manager
738    delete doc;
739    // must be freed _after_ document
740    delete pluginMan;
741
742    delete findDlg;
743    delete title;
744
745    return 0;
746}
747
Note: See TracBrowser for help on using the repository browser.