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

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

'Go to page' dialog, some play with djvu plugin.

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