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

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

implemented continuous view (synch/asynch), text search and selection doesn't work yet in continuous view

File size: 18.2 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    // pre-set "Actual size"
150    setZoomChecks( CM_ACTSIZE, 0, 0 );
151
152    if ( doc == NULL )
153    {
154        // "single page" mode by default
155        WinSendMsg( hWndMenu, MM_SETITEMATTR,
156                    MPFROM2SHORT( CM_SINGLEPAGE, TRUE ),
157                    MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
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    WinEnableMenuItem( hWndMenu, CM_SINGLEPAGE, TRUE );
216    WinEnableMenuItem( hWndMenu, CM_CONTINUOUS, TRUE );
217}
218
219void Lucide::goToPage( long page )
220{
221    if ( docViewer != NULL ) {
222        docViewer->goToPage( page );
223    }
224}
225
226void Lucide::setZoom( double zoom )
227{
228    if ( docViewer != NULL ) {
229        docViewer->setZoom( zoom );
230        checkZoomMenus();
231    }
232}
233
234void Lucide::setDocument( LuDocument *_doc )
235{
236    docViewer->setDocument( _doc );
237    indexWin->setDocument( _doc );
238    Lucide::checkMenus();
239}
240
241void Lucide::setViewMode( ViewMode mode )
242{
243    if ( mode == SinglePage )
244    {
245        WinSendMsg( hWndMenu, MM_SETITEMATTR,
246                    MPFROM2SHORT( CM_SINGLEPAGE, TRUE ),
247                    MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
248        WinSendMsg( hWndMenu, MM_SETITEMATTR,
249                    MPFROM2SHORT( CM_CONTINUOUS, TRUE ),
250                    MPFROM2SHORT( MIA_CHECKED, FALSE ) );
251    }
252    else
253    {
254        WinSendMsg( hWndMenu, MM_SETITEMATTR,
255                    MPFROM2SHORT( CM_SINGLEPAGE, TRUE ),
256                    MPFROM2SHORT( MIA_CHECKED, FALSE ) );
257        WinSendMsg( hWndMenu, MM_SETITEMATTR,
258                    MPFROM2SHORT( CM_CONTINUOUS, TRUE ),
259                    MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
260    }
261
262    docViewer->setViewMode( mode );
263}
264
265
266static void loadDocument( const char *fn )
267{
268    char *msg = newstrdupL( MSGS_NO_SUIT_PLUG );
269
270    // find extension
271    char *ext = strrchr( fn, '.' );
272    if ( ext == NULL ) {
273        WinMessageBox( HWND_DESKTOP, hWndFrame, msg,
274                       NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
275    }
276    else
277    {
278        doc = pluginMan->createDocumentForExt( ext + 1 );
279        if ( doc == NULL ) {
280            WinMessageBox( HWND_DESKTOP, hWndFrame, msg,
281                           NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
282        }
283        else
284        {
285            char *error = NULL;
286            if ( doc->loadFile( ev, (char *)fn, NULL, &error ) ) {
287                Lucide::setDocument( doc );
288            }
289            else
290            {
291                if ( error == NULL ) {
292                    char *m = newstrdupL( MSGS_FILE_LOAD_ERROR );
293                    WinMessageBox( HWND_DESKTOP, hWndFrame, m,
294                                   NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
295                    delete m;
296                }
297                else {
298                    WinMessageBox( HWND_DESKTOP, hWndFrame, error,
299                                   NULL, 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE );
300                    SOMFree( error );
301                }
302
303                delete doc;
304                doc = NULL;
305            }
306        }
307    }
308    delete msg;
309}
310
311static void openDocument()
312{
313    PFILEDLG fd = new FILEDLG;
314    memset( fd, 0, sizeof( FILEDLG ) );
315    fd->cbSize = sizeof( FILEDLG );
316    fd->fl = FDS_CENTER | FDS_OPEN_DIALOG;
317    strcpy( fd->szFullFile, pluginMan->getExtsMask().c_str() );
318    WinFileDlg( HWND_DESKTOP, hWndFrame, fd );
319    if ( fd->lReturn == DID_OK ) {
320        loadDocument( fd->szFullFile );
321    }
322    delete fd;
323}
324
325
326static MRESULT EXPENTRY splProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
327{
328    switch ( msg )
329    {
330
331        case WM_COMMAND:
332        {
333            switch ( SHORT1FROMMP(mp1) )
334            {
335                case CM_OPEN:
336                    openDocument();
337                    return (MRESULT)FALSE;
338
339                case CM_EXIT:
340                    WinPostMsg( hWndFrame, WM_CLOSE, NULL, NULL );
341                    return (MRESULT)FALSE;
342
343                case CM_DOCINFO:
344                {
345                    LuDocumentInfo *dinfo = doc->getDocumentInfo( ev );
346                    DocInfoDlg *d = new DocInfoDlg( hWndFrame, dinfo );
347                    d->doDialog();
348                    LuDocument::freeDocumentInfo( ev, dinfo );
349                    return (MRESULT)FALSE;
350                }
351
352                case CM_FONTSINFO:
353                {
354                    FontsInfoDlg *d = new FontsInfoDlg( hWndFrame, doc );
355                    d->doDialog();
356                    return (MRESULT)FALSE;
357                }
358
359                case CM_PLUGINSLIST:
360                {
361                    PluginViewDlg *d = new PluginViewDlg( hWndFrame,
362                                                pluginMan->getPluginsList() );
363                    d->doDialog();
364                    return (MRESULT)FALSE;
365                }
366
367                case CM_COPY:
368                    docViewer->copyToClipbrd();
369                    return (MRESULT)FALSE;
370
371                case CM_FIND:
372                    if ( findDlg->showDialog() == DID_OK ) {
373                        if ( strlen( findDlg->getSearchString() ) > 0 )
374                        {
375                            docViewer->searchDocument( findDlg->getSearchString(),
376                                            findDlg->isCaseSensitive(), false );
377
378                            WinEnableMenuItem( hWndMenu, CM_FINDAGAIN, TRUE );
379                        }
380                    }
381                    return (MRESULT)FALSE;
382
383                case CM_FINDAGAIN:
384                    docViewer->searchDocument( findDlg->getSearchString(),
385                                               findDlg->isCaseSensitive(), true );
386                    return (MRESULT)FALSE;
387
388                case CM_FIRSTPAGE:
389                    Lucide::goToPage( 0 );
390                    return (MRESULT)FALSE;
391
392                case CM_NEXTPAGE:
393                    Lucide::goToPage( docViewer->getCurrentPage() + 1 );
394                    return (MRESULT)FALSE;
395
396                case CM_PREVPAGE:
397                    Lucide::goToPage( docViewer->getCurrentPage() - 1 );
398                    return (MRESULT)FALSE;
399
400                case CM_LASTPAGE:
401                    Lucide::goToPage( doc->getPageCount( ev ) - 1 );
402                    return (MRESULT)FALSE;
403
404                case CM_FITWINDOW:
405                    Lucide::setZoom( -2 );
406                    return (MRESULT)FALSE;
407
408                case CM_ACTSIZE:
409                    Lucide::setZoom( 1 );
410                    return (MRESULT)FALSE;
411
412                case CM_FITWIDTH:
413                    Lucide::setZoom( -1 );
414                    return (MRESULT)FALSE;
415
416                case CM_SINGLEPAGE:
417                    Lucide::setViewMode( SinglePage );
418                    return (MRESULT)FALSE;
419
420                case CM_CONTINUOUS:
421                    Lucide::setViewMode( Continuous );
422                    return (MRESULT)FALSE;
423            }
424        }
425        break;
426    }
427    return pOldSplProc( hwnd, msg, mp1, mp2 );
428}
429
430
431char deffont[] = "9.WarpSans";
432int deffontlen = sizeof( deffont );
433
434int main( int argc, char **argv )
435{
436    PPIB pib;
437    PTIB tib;
438    DosGetInfoBlocks(&tib, &pib);
439    pib->pib_ultype = 3;
440
441    HMQ   hmq;
442    QMSG  qmsg;
443    hab = WinInitialize( 0 );
444    hmq = WinCreateMsgQueue( hab, 0 );
445
446    loadLang();
447
448    pluginMan = new PluginManager;
449
450    InitPMSplitterClass( hab );
451    InitPMToolbarClass( hab );
452
453    ULONG ulFrameFlags = FCF_TITLEBAR | FCF_SIZEBORDER | FCF_SYSMENU |
454                         FCF_MINMAX | FCF_TASKLIST | FCF_NOBYTEALIGN;
455    char *title = newstrdupL( MSGS_MAIN_WIN_TITLE );
456    hWndFrame = WinCreateStdWindow( HWND_DESKTOP, 0, &ulFrameFlags, NULL, title,
457                                    WS_SYNCPAINT|WS_VISIBLE, NULLHANDLE, 100, NULL );
458    delete title;
459    WinSetAccelTable( hab, WinLoadAccelTable( hab, NULLHANDLE, IDA_MAINACCEL ), hWndFrame );
460    hWndMenu = WinLoadMenu( hWndFrame, NULLHANDLE, IDM_MAINMENU );
461    localizeMenu( hWndMenu );
462    WinSetWindowUShort( hWndMenu, QWS_ID, FID_MENU );
463
464    // Vertical splitter and his windows - Index and Document view
465    HWND hVertSplitter = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
466                                          WS_VISIBLE | SBS_VSPLIT,
467                                          0, 0, 0, 0, hWndFrame, HWND_TOP,
468                                          0, NULL, NULL );
469
470    indexWin = new IndexWindow( hab, hWndFrame );
471
472    DocumentViewer::registerClass( hab );
473
474    docViewer = new DocumentViewer( hab, hWndFrame );
475
476    WinSendMsg( hVertSplitter, SBM_SETWINDOWS,
477                MPFROMHWND( indexWin->getHWND() ), MPFROMHWND( docViewer->getHWND() ) );
478    WinSendMsg( hVertSplitter, SBM_SETSPLITTERPOS, MPFROMSHORT( 80 ), MPVOID );
479
480    // Horizontal splitter and its windows - Toolbar and Vertical splitter
481    // Horizontal splitter is client window
482    HWND hHorizSplitter = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
483                                           WS_VISIBLE | SBS_HSPLIT | SBS_SECONDFIXED,
484                                           0, 0, 0, 0, hWndFrame, HWND_TOP,
485                                           FID_CLIENT, NULL, NULL );
486    pOldSplProc = WinSubclassWindow( hHorizSplitter, splProc );
487
488    hToolBar = createToolbar( hWndFrame );
489
490    WinSendMsg( hHorizSplitter, SBM_SETWINDOWS,
491                MPFROMHWND( hVertSplitter ), MPFROMHWND( hToolBar ) );
492    // ãáâ ­®¢šâì 䚪ášà®¢ ­­ë© à §¬¥à €«ï âã«¡ à 
493    WinSendMsg( hHorizSplitter, SBM_SETFIXEDSIZE,
494                MPFROMSHORT( DEFAULT_PICTSIZE + TOOLBAR_HEIGHT_ADD ), MPVOID );
495
496    findDlg = new FindDlg( hWndFrame );
497    Lucide::checkMenus();
498    if ( argc > 1 ) {
499        loadDocument( argv[1] );
500    }
501
502    // ®ª § âì ®ª­® ¯à®£à ¬¬ë
503    if ( !PMRestoreWindowPos( NULL, appName, fwp, hWndFrame,
504                              TRUE, TRUE, FALSE, FALSE, FALSE ) )
505    {
506        WinSetWindowPos( hWndFrame, HWND_TOP, 100, 100, 630, 400,
507                         SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE );
508    }
509
510    // Messsage loop
511    while ( WinGetMsg( hab, &qmsg, 0, 0, 0 ) ) {
512        WinDispatchMsg( hab, &qmsg );
513    }
514
515    if ( WinIsWindow( hab, hWndFrame ) ) {
516        PMStoreWindowPos( NULL, appName, fwp, hWndFrame );
517    }
518
519    WinDestroyWindow( hWndFrame );
520    WinDestroyMsgQueue( hmq );
521    WinTerminate( hab );
522
523    delete docViewer;
524    delete indexWin;
525    // must be freed _before_ plugin manager
526    delete doc;
527    // must be freed _after_ document
528    delete pluginMan;
529
530    delete findDlg;
531
532    return 0;
533}
534
Note: See TracBrowser for help on using the repository browser.