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

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

added settings dialog, asynch opening, fixed many crashes and bugs

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