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

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

drawing fixes and improvements, djvu plugin fixes

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