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

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

implemented 'select all', fixes for crash in libc memanager

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