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

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

First import

File size: 17.0 KB
Line 
1#define INCL_WIN
2#define INCL_DOS
3#include <os2.h>
4
5#include <string>
6#include <stdio.h>
7//#include <stdlib.h>
8
9#include <ludoc.xh>
10
11#include "Lucide.h"
12#include "pluginman.h"
13#include "pluginViewDlg.h"
14#include "fontsInfoDlg.h"
15#include "docInfoDlg.h"
16#include "findDlg.h"
17#include "docViewer.h"
18#include "indexWindow.h"
19#include "luutils.h"
20#include "tb_spl.h"
21#include "Lucide_res.h"
22#include "messages.h"
23
24
25const char *appName = "Lucide";
26const char *fwp = "FrameWindowPos";
27
28
29HWND createToolbar( HWND hwnd );
30
31HAB   hab;
32HWND  hWndFrame;
33HWND  hWndMenu;
34HWND  hToolBar;
35
36Environment    *ev        = somGetGlobalEnvironment();
37LuDocument     *doc       = NULL;
38PluginManager  *pluginMan = NULL;
39DocumentViewer *docViewer = NULL;
40IndexWindow    *indexWin  = NULL;
41FindDlg        *findDlg   = NULL;
42
43bool Lucide::dontSwitchPage = false;
44
45PFNWP pOldSplProc;
46
47void Lucide::enableCopy( bool enable )
48{
49    WinEnableMenuItem( hWndMenu, CM_COPY, enable );
50}
51
52static void setOfPages( long pages )
53{
54    char *pgfrm = newstrdupL( TB_PAGENUM );
55    char pgnum[ 32 ];
56    snprintf( pgnum, sizeof( pgnum ), pgfrm, pages );
57    delete pgfrm;
58    WinSetDlgItemText( hToolBar, TBID_OFPAGES, pgnum );
59    WinSendDlgItemMsg( hToolBar, TBID_PAGENUM, SPBM_SETLIMITS, (MPARAM)pages, (MPARAM)1 );
60}
61
62void Lucide::checkNavigationMenus()
63{
64    BOOL enfirst = ( docViewer->getCurrentPage() != 0 );
65    BOOL enlast = ( docViewer->getCurrentPage() != ( doc->getPageCount( ev ) - 1 ) );
66    WinEnableMenuItem( hWndMenu, CM_FIRSTPAGE, enfirst );
67    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIRSTPAGE), (MPARAM)enfirst );
68    WinEnableMenuItem( hWndMenu, CM_PREVPAGE, enfirst );
69    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_PREVPAGE), (MPARAM)enfirst );
70    WinEnableMenuItem( hWndMenu, CM_NEXTPAGE, enlast );
71    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_NEXTPAGE), (MPARAM)enlast );
72    WinEnableMenuItem( hWndMenu, CM_LASTPAGE, enlast );
73    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_LASTPAGE), (MPARAM)enlast );
74
75    dontSwitchPage = true;
76    WinSendDlgItemMsg( hToolBar, TBID_PAGENUM, SPBM_SETCURRENTVALUE,
77                       MPFROMLONG( docViewer->getCurrentPage() + 1 ), MPVOID );
78    dontSwitchPage = false;
79    indexWin->goToPage( NULL, docViewer->getCurrentPage() );
80}
81
82void enableZoomMenus()
83{
84    BOOL scalable = doc->isScalable( ev );
85    WinEnableMenuItem( hWndMenu, CM_FITWINDOW, scalable );
86    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWINDOW), (MPARAM)scalable );
87    WinEnableMenuItem( hWndMenu, CM_ACTSIZE, scalable );
88    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_ACTSIZE), (MPARAM)scalable );
89    WinEnableMenuItem( hWndMenu, CM_FITWIDTH, scalable );
90    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWIDTH), (MPARAM)scalable );
91    WinEnableControl( hToolBar, TBID_ZOOM, scalable );
92    BOOL rotable = doc->isRotable( ev );
93    WinEnableMenuItem( hWndMenu, CM_ROTATE90CW, rotable );
94    WinEnableMenuItem( hWndMenu, CM_ROTATE90CCW, rotable );
95}
96
97
98void setZoomChecks( SHORT cmd, SHORT cbind, double zoom )
99{
100    if ( cmd != -1 )
101    {
102        WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( cmd, TRUE ),
103                            MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
104        WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT( cmd ), (MPARAM)TRUE );
105    }
106
107    if ( cbind != -1 )
108    {
109        char buf[ 255 ] = "";
110        WinSendDlgItemMsg( hToolBar, TBID_ZOOM, LM_QUERYITEMTEXT,
111                           MPFROM2SHORT( cbind, sizeof( buf ) ), MPFROMP( buf ) );
112        WinSetDlgItemText( hToolBar, TBID_ZOOM, buf );
113    }
114
115    if ( zoom != 0 )
116    {
117        std::string z = str( zoom * 100.0 ) + "%";
118        WinSetDlgItemText( hToolBar, TBID_ZOOM, z.c_str() );
119    }
120}
121
122void Lucide::checkZoomMenus()
123{
124    double zoom = docViewer->getZoom();
125
126    WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_FITWINDOW, TRUE ),
127                        MPFROM2SHORT( MIA_CHECKED, FALSE ) );
128    WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT(CM_FITWINDOW), (MPARAM)FALSE );
129    WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_ACTSIZE, TRUE ),
130                        MPFROM2SHORT( MIA_CHECKED, FALSE ) );
131    WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT(CM_ACTSIZE), (MPARAM)FALSE );
132    WinSendMsg( hWndMenu, MM_SETITEMATTR, MPFROM2SHORT( CM_FITWIDTH, TRUE ),
133                        MPFROM2SHORT( MIA_CHECKED, FALSE ) );
134    WinSendMsg( hToolBar, TBM_SETCHECK, MPFROMSHORT(CM_FITWIDTH), (MPARAM)FALSE );
135
136    if ( zoom == -2 ) {
137        setZoomChecks( CM_FITWINDOW, 1, 0 );
138    } else if ( zoom == -1 ) {
139        setZoomChecks( CM_FITWIDTH, 2, 0 );
140    } else if ( zoom == 1 ) {
141        setZoomChecks( CM_ACTSIZE, 0, 0 );
142    } else {
143        setZoomChecks( -1, -1, zoom );
144    }
145}
146
147void Lucide::checkMenus()
148{
149    // currently only "single page" mode
150    WinSendMsg( hWndMenu, MM_SETITEMATTR,
151                MPFROM2SHORT( CM_SINGLEPAGE, TRUE ),
152                MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
153
154    // pre-set "Actual size"
155    setZoomChecks( CM_ACTSIZE, 0, 0 );
156
157    if ( doc == NULL )
158    {
159        WinEnableMenuItem( hWndMenu, CM_SAVEAS, FALSE );
160        WinEnableMenuItem( hWndMenu, CM_EXPORTTOPS, FALSE );
161        WinEnableMenuItem( hWndMenu, CM_PAGESETUP, FALSE );
162        WinEnableMenuItem( hWndMenu, CM_PRINT, FALSE );
163        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_PRINT), (MPARAM)FALSE );
164        WinEnableMenuItem( hWndMenu, CM_DOCINFO, FALSE );
165        WinEnableMenuItem( hWndMenu, CM_FONTSINFO, FALSE );
166
167        WinEnableMenuItem( hWndMenu, CM_COPY, FALSE );
168        WinEnableMenuItem( hWndMenu, CM_SELECTALL, FALSE );
169        WinEnableMenuItem( hWndMenu, CM_FIND, FALSE );
170        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIND), (MPARAM)FALSE );
171        WinEnableMenuItem( hWndMenu, CM_FINDAGAIN, FALSE );
172
173        WinEnableMenuItem( hWndMenu, CM_FIRSTPAGE, FALSE );
174        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIRSTPAGE), (MPARAM)FALSE );
175        WinEnableMenuItem( hWndMenu, CM_PREVPAGE, FALSE );
176        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_PREVPAGE), (MPARAM)FALSE );
177        WinEnableMenuItem( hWndMenu, CM_NEXTPAGE, FALSE );
178        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_NEXTPAGE), (MPARAM)FALSE );
179        WinEnableMenuItem( hWndMenu, CM_LASTPAGE, FALSE );
180        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_LASTPAGE), (MPARAM)FALSE );
181        WinEnableMenuItem( hWndMenu, CM_GOTOPAGE, FALSE );
182
183        WinEnableMenuItem( hWndMenu, CM_FITWINDOW, FALSE );
184        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWINDOW), (MPARAM)FALSE );
185        WinEnableMenuItem( hWndMenu, CM_ACTSIZE, FALSE );
186        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_ACTSIZE), (MPARAM)FALSE );
187        WinEnableMenuItem( hWndMenu, CM_FITWIDTH, FALSE );
188        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FITWIDTH), (MPARAM)FALSE );
189        WinEnableControl( hToolBar, TBID_ZOOM, FALSE );
190
191        WinEnableMenuItem( hWndMenu, CM_ROTATE90CW, FALSE );
192        WinEnableMenuItem( hWndMenu, CM_ROTATE90CCW, FALSE );
193        WinEnableMenuItem( hWndMenu, CM_NAVPANE, FALSE );
194        WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_NAVPANE), (MPARAM)FALSE );
195        WinEnableMenuItem( hWndMenu, CM_SINGLEPAGE, FALSE );
196        WinEnableMenuItem( hWndMenu, CM_CONTINUOUS, FALSE );
197
198        setOfPages( 0 );
199        return;
200    }
201
202
203    checkNavigationMenus();
204    enableZoomMenus();
205    checkZoomMenus();
206
207    setOfPages( doc->getPageCount( ev ) );
208    WinEnableMenuItem( hWndMenu, CM_FONTSINFO, doc->isHaveFontInfo( ev ) );
209    WinEnableMenuItem( hWndMenu, CM_DOCINFO, TRUE );
210
211    BOOL haveText = doc->isHaveText( ev );
212    WinEnableMenuItem( hWndMenu, CM_FIND, haveText );
213    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_FIND), (MPARAM)haveText );
214}
215
216void Lucide::goToPage( long page )
217{
218    if ( docViewer != NULL ) {
219        docViewer->goToPage( page );
220    }
221}
222
223void Lucide::setZoom( double zoom )
224{
225    if ( docViewer != NULL ) {
226        docViewer->setZoom( zoom );
227        checkZoomMenus();
228    }
229}
230
231void Lucide::setDocument( LuDocument *_doc )
232{
233    docViewer->setDocument( _doc );
234    indexWin->setDocument( _doc );
235    Lucide::checkMenus();
236}
237
238
239static void loadDocument( const char *fn )
240{
241    char *msg = newstrdupL( MSGS_NO_SUIT_PLUG );
242
243    // find extension
244    char *ext = strrchr( fn, '.' );
245    if ( ext == NULL ) {
246        WinMessageBox( HWND_DESKTOP, hWndFrame, msg,
247                       NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
248    }
249    else
250    {
251        doc = pluginMan->createDocumentForExt( ext + 1 );
252        if ( doc == NULL ) {
253            WinMessageBox( HWND_DESKTOP, hWndFrame, msg,
254                           NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
255        }
256        else
257        {
258            char *error = NULL;
259            if ( doc->loadFile( ev, (char *)fn, NULL, &error ) ) {
260                Lucide::setDocument( doc );
261            }
262            else
263            {
264                if ( error == NULL ) {
265                    char *m = newstrdupL( MSGS_FILE_LOAD_ERROR );
266                    WinMessageBox( HWND_DESKTOP, hWndFrame, m,
267                                   NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
268                    delete m;
269                }
270                else {
271                    WinMessageBox( HWND_DESKTOP, hWndFrame, error,
272                                   NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
273                    SOMFree( error );
274                }
275
276                delete doc;
277                doc = NULL;
278            }
279        }
280    }
281    delete msg;
282}
283
284static void openDocument()
285{
286    PFILEDLG fd = new FILEDLG;
287    memset( fd, 0, sizeof( FILEDLG ) );
288    fd->cbSize = sizeof( FILEDLG );
289    fd->fl = FDS_CENTER | FDS_OPEN_DIALOG;
290    strcpy( fd->szFullFile, pluginMan->getExtsMask().c_str() );
291    WinFileDlg( HWND_DESKTOP, hWndFrame, fd );
292    if ( fd->lReturn == DID_OK ) {
293        loadDocument( fd->szFullFile );
294    }
295    delete fd;
296}
297
298
299static MRESULT EXPENTRY splProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
300{
301    switch ( msg )
302    {
303
304        case WM_COMMAND:
305        {
306            switch ( SHORT1FROMMP(mp1) )
307            {
308                case CM_OPEN:
309                    openDocument();
310                    return (MRESULT)FALSE;
311
312                case CM_EXIT:
313                    WinPostMsg( hWndFrame, WM_CLOSE, NULL, NULL );
314                    return (MRESULT)FALSE;
315
316                case CM_DOCINFO:
317                {
318                    LuDocumentInfo *dinfo = doc->getDocumentInfo( ev );
319                    DocInfoDlg *d = new DocInfoDlg( hWndFrame, dinfo );
320                    d->doDialog();
321                    LuDocument::freeDocumentInfo( ev, dinfo );
322                    return (MRESULT)FALSE;
323                }
324
325                case CM_FONTSINFO:
326                {
327                    FontsInfoDlg *d = new FontsInfoDlg( hWndFrame, doc );
328                    d->doDialog();
329                    return (MRESULT)FALSE;
330                }
331
332                case CM_PLUGINSLIST:
333                {
334                    PluginViewDlg *d = new PluginViewDlg( hWndFrame,
335                                                pluginMan->getPluginsList() );
336                    d->doDialog();
337                    return (MRESULT)FALSE;
338                }
339
340                case CM_COPY:
341                    docViewer->copyToClipbrd();
342                    return (MRESULT)FALSE;
343
344                case CM_FIND:
345                    if ( findDlg->showDialog() == DID_OK ) {
346                        if ( strlen( findDlg->getSearchString() ) > 0 )
347                        {
348                            docViewer->searchDocument( findDlg->getSearchString(),
349                                            findDlg->isCaseSensitive(), false );
350
351                            WinEnableMenuItem( hWndMenu, CM_FINDAGAIN, TRUE );
352                        }
353                    }
354                    return (MRESULT)FALSE;
355
356                case CM_FINDAGAIN:
357                    docViewer->searchDocument( findDlg->getSearchString(),
358                                               findDlg->isCaseSensitive(), true );
359                    return (MRESULT)FALSE;
360
361                case CM_FIRSTPAGE:
362                    Lucide::goToPage( 0 );
363                    return (MRESULT)FALSE;
364
365                case CM_NEXTPAGE:
366                    Lucide::goToPage( docViewer->getCurrentPage() + 1 );
367                    return (MRESULT)FALSE;
368
369                case CM_PREVPAGE:
370                    Lucide::goToPage( docViewer->getCurrentPage() - 1 );
371                    return (MRESULT)FALSE;
372
373                case CM_LASTPAGE:
374                    Lucide::goToPage( doc->getPageCount( ev ) - 1 );
375                    return (MRESULT)FALSE;
376
377                case CM_FITWINDOW:
378                    Lucide::setZoom( -2 );
379                    return (MRESULT)FALSE;
380
381                case CM_ACTSIZE:
382                    Lucide::setZoom( 1 );
383                    return (MRESULT)FALSE;
384
385                case CM_FITWIDTH:
386                    Lucide::setZoom( -1 );
387                    return (MRESULT)FALSE;
388
389            }
390        }
391        break;
392    }
393    return pOldSplProc( hwnd, msg, mp1, mp2 );
394}
395
396
397char deffont[] = "9.WarpSans";
398int deffontlen = sizeof( deffont );
399
400int main( int argc, char **argv )
401{
402    PPIB pib;
403    PTIB tib;
404    DosGetInfoBlocks(&tib, &pib);
405    pib->pib_ultype = 3;
406
407    HMQ   hmq;
408    QMSG  qmsg;
409    hab = WinInitialize( 0 );
410    hmq = WinCreateMsgQueue( hab, 0 );
411
412    loadLang();
413
414    pluginMan = new PluginManager;
415
416    InitPMSplitterClass( hab );
417    InitPMToolbarClass( hab );
418
419    ULONG ulFrameFlags = FCF_TITLEBAR | FCF_SIZEBORDER | FCF_SYSMENU |
420                         FCF_MINMAX | FCF_TASKLIST | FCF_NOBYTEALIGN;
421    char *title = newstrdupL( MSGS_MAIN_WIN_TITLE );
422    hWndFrame = WinCreateStdWindow( HWND_DESKTOP, 0, &ulFrameFlags, NULL, title,
423                                    WS_SYNCPAINT|WS_VISIBLE, NULLHANDLE, 100, NULL );
424    delete title;
425    WinSetAccelTable( hab, WinLoadAccelTable( hab, NULLHANDLE, IDA_MAINACCEL ), hWndFrame );
426    hWndMenu = WinLoadMenu( hWndFrame, NULLHANDLE, IDM_MAINMENU );
427    localizeMenu( hWndMenu );
428    WinSetWindowUShort( hWndMenu, QWS_ID, FID_MENU );
429
430    // Vertical splitter and his windows - Index and Document view
431    HWND hVertSplitter = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
432                                          WS_VISIBLE | SBS_VSPLIT,
433                                          0, 0, 0, 0, hWndFrame, HWND_TOP,
434                                          0, NULL, NULL );
435
436    indexWin = new IndexWindow( hab, hWndFrame );
437
438    DocumentViewer::registerClass( hab );
439
440    docViewer = new DocumentViewer( hab, hWndFrame );
441
442    WinSendMsg( hVertSplitter, SBM_SETWINDOWS,
443                MPFROMHWND( indexWin->getHWND() ), MPFROMHWND( docViewer->getHWND() ) );
444    WinSendMsg( hVertSplitter, SBM_SETSPLITTERPOS, MPFROMSHORT( 80 ), MPVOID );
445
446    // Horizontal splitter and its windows - Toolbar and Vertical splitter
447    // Horizontal splitter is client window
448    HWND hHorizSplitter = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
449                                           WS_VISIBLE | SBS_HSPLIT | SBS_SECONDFIXED,
450                                           0, 0, 0, 0, hWndFrame, HWND_TOP,
451                                           FID_CLIENT, NULL, NULL );
452    pOldSplProc = WinSubclassWindow( hHorizSplitter, splProc );
453
454    hToolBar = createToolbar( hWndFrame );
455
456    WinSendMsg( hHorizSplitter, SBM_SETWINDOWS,
457                MPFROMHWND( hVertSplitter ), MPFROMHWND( hToolBar ) );
458    // ãáâ ­®¢šâì 䚪ášà®¢ ­­ë© à §¬¥à €«ï âã«¡ à 
459    WinSendMsg( hHorizSplitter, SBM_SETFIXEDSIZE,
460                MPFROMSHORT( DEFAULT_PICTSIZE + TOOLBAR_HEIGHT_ADD ), MPVOID );
461
462    findDlg = new FindDlg( hWndFrame );
463    Lucide::checkMenus();
464    if ( argc > 1 ) {
465        loadDocument( argv[1] );
466    }
467
468    // ®ª § âì ®ª­® ¯à®£à ¬¬ë
469    if ( !PMRestoreWindowPos( NULL, appName, fwp, hWndFrame,
470                              TRUE, TRUE, FALSE, FALSE, FALSE ) )
471    {
472        WinSetWindowPos( hWndFrame, HWND_TOP, 100, 100, 630, 400,
473                         SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE );
474    }
475
476    // Messsage loop
477    while ( WinGetMsg( hab, &qmsg, 0, 0, 0 ) ) {
478        WinDispatchMsg( hab, &qmsg );
479    }
480
481    if ( WinIsWindow( hab, hWndFrame ) ) {
482        PMStoreWindowPos( NULL, appName, fwp, hWndFrame );
483    }
484
485    WinDestroyWindow( hWndFrame );
486    WinDestroyMsgQueue( hmq );
487    WinTerminate( hab );
488
489    delete docViewer;
490    delete indexWin;
491    // must be freed _before_ plugin manager
492    delete doc;
493    // must be freed _after_ document
494    delete pluginMan;
495
496    delete findDlg;
497
498    return 0;
499}
500
Note: See TracBrowser for help on using the repository browser.