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

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

Fullscreen implemented (closes #6). Hotkey is Ctrl+L, like in Acrobat. Mozilla-like fullscreen (F11) renamed to 'Maximized view'. Currently page draws at upper-left corner, centered draw should be implemented.

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