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

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

added changelog

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