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

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

First import

File size: 38.4 KB
Line 
1#define INCL_WIN
2#define INCL_DOS
3#define INCL_GPI
4#include <os2.h>
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <time.h>
9
10#include "evpixbuf.xh"
11#include "evdoc.xh"
12#include "tb_spl.h"
13#include "evince_res.h"
14
15
16extern "C" LONG APIENTRY GpiDrawBits(HPS hps, PVOID pBits, PBITMAPINFO2 pbmiInfoTable,
17                             LONG lCount, PPOINTL aptlPoints, LONG lRop, ULONG flOptions);
18
19void initClipbrd();
20void textToClipbrd( HAB hab, const char *text );
21
22void DestroyGraphicsBuffer( HPS hpsBuffer, HDC hdcBuffer );
23void BlitGraphicsBuffer( HPS hps, HPS hpsBuffer, PRECTL prclPaint );
24BOOL CreateGraphicsBuffer( HAB hab, PRECTL prectl, HPS hps,
25                           HPS *phpsBuffer, HDC *phdcBuffer );
26
27#define ID_CNTR 10001
28
29
30EvDocument * APIENTRY (*createObject)();
31Environment *ev = NULL;
32EvDocument *doc = NULL;
33EvPixbuf *pixbuf = NULL;
34
35int totalpages = 0;
36int currentpage = 0;
37int currentzoom = 100;
38double coeff = 1.0;
39void render_page( bool dontTouchTree = false );
40double width, height;
41
42HAB   hab;
43HWND  hWndFrame;
44HWND  hWndDoc;
45HWND  hwndHscroll;
46HWND  hwndVscroll;
47HWND  hWndTree;
48SHORT sHscrollMax = 0;
49SHORT sVscrollMax = 0;
50SHORT sHscrollPos = 0;
51SHORT sVscrollPos = 0;
52LONG  cxClient = 0;
53LONG  cyClient = 0;
54LONG  spos_x = 0;
55LONG  spos_y = 0;
56
57HPS hpsBuffer = NULLHANDLE;
58HDC hdcBuffer = NULLHANDLE;
59
60
61bool mousePressed = false;
62short mpos_x = 0;
63short mpos_y = 0;
64EvRectangle r_selection = {0};
65EvDocument_EvRectSequence *selrects = NULL;
66EvDocument_EvRectSequence *srchrects = NULL;
67EvDocument_EvLinkMapSequence *links = NULL;
68HPOINTER handptr = NULLHANDLE;
69
70PFNWP pOldSplProc;
71
72static MRESULT EXPENTRY FInfoProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
73{
74    switch ( msg )
75    {
76        case WM_INITDLG:
77            {
78                char buf[ 200 ];
79                EvDocument_EvFontInfoSequence *fonts = doc->getFontInfo( ev );
80                if ( fonts != NULL )
81                {
82                    for ( int i = 0; i < fonts->_length; i++ )
83                    {
84                        snprintf( buf, sizeof(buf), "%-24s %-16s %s",
85                                  fonts->_buffer[i].name,
86                                  fonts->_buffer[i].type,
87                                  fonts->_buffer[i].embedded );
88
89                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM,
90                                           MPFROMSHORT( LIT_END ),
91                                           MPFROMP( buf ) );
92
93                    }
94
95                    EvDocument::freeFontInfo( ev, fonts );
96                }
97            }
98            return (MRESULT)FALSE;
99    }
100    return WinDefDlgProc( hwnd, msg, mp1, mp2 );
101}
102
103static MRESULT EXPENTRY DInfoProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
104{
105    switch ( msg )
106    {
107        case WM_INITDLG:
108            {
109                char *fmt = "%-20s: %s";
110                char buf[ 500 ];
111                EvDocumentInfo *info = doc->getDocumentInfo( ev );
112                if ( info != NULL )
113                {
114                    if ( info->fields_mask & EV_DOCUMENT_INFO_TITLE ) {
115                        snprintf( buf, sizeof(buf), fmt, "Title", info->title );
116                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
117                    }
118                    if ( info->fields_mask & EV_DOCUMENT_INFO_FORMAT ) {
119                        snprintf( buf, sizeof(buf), fmt, "Format", info->format );
120                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
121                    }
122                    if ( info->fields_mask & EV_DOCUMENT_INFO_AUTHOR ) {
123                        snprintf( buf, sizeof(buf), fmt, "Author", info->author );
124                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
125                    }
126                    if ( info->fields_mask & EV_DOCUMENT_INFO_SUBJECT ) {
127                        snprintf( buf, sizeof(buf), fmt, "Subject", info->subject );
128                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
129                    }
130                    if ( info->fields_mask & EV_DOCUMENT_INFO_KEYWORDS ) {
131                        snprintf( buf, sizeof(buf), fmt, "Keywords", info->keywords );
132                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
133                    }
134                    if ( info->fields_mask & EV_DOCUMENT_INFO_CREATOR ) {
135                        snprintf( buf, sizeof(buf), fmt, "Creator", info->creator );
136                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
137                    }
138                    if ( info->fields_mask & EV_DOCUMENT_INFO_PRODUCER ) {
139                        snprintf( buf, sizeof(buf), fmt, "Producer", info->producer );
140                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
141                    }
142                    if ( info->fields_mask & EV_DOCUMENT_INFO_CREATION_DATE ) {
143                        snprintf( buf, sizeof(buf), fmt, "Creation date", ctime( &info->creation_date ) );
144                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
145                    }
146                    if ( info->fields_mask & EV_DOCUMENT_INFO_MOD_DATE ) {
147                        snprintf( buf, sizeof(buf), fmt, "Modified date", ctime( &info->modified_date ) );
148                        WinSendDlgItemMsg( hwnd, 101, LM_INSERTITEM, MPFROMSHORT( LIT_END ), MPFROMP( buf ) );
149                    }
150
151
152                    EvDocument::freeDocumentInfo( ev, info );
153                }
154            }
155            return (MRESULT)FALSE;
156    }
157    return WinDefDlgProc( hwnd, msg, mp1, mp2 );
158}
159
160void page_redraw( HWND hwnd )
161{
162    //sHscrollPos = 0;
163    sVscrollPos = 0;
164    WinSendMsg( hwnd, WM_SIZE, MPFROM2SHORT( cxClient, cyClient ),
165                MPFROM2SHORT( cxClient, cyClient ) );
166    WinInvalidateRect( hwnd, NULL, FALSE );
167}
168
169
170struct TreeRecord
171{
172    MINIRECORDCORE miniRecordCore;
173    long page;
174};
175
176static MRESULT EXPENTRY splProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
177{
178    switch ( msg )
179    {
180        case WM_CONTROL:
181            switch ( SHORT1FROMMP( mp1 ) )
182            {
183                case ID_CNTR:
184                    switch ( SHORT2FROMMP( mp1 ) )
185                    {
186                        case CN_ENTER:
187                            {
188                                PNOTIFYRECORDENTER re = (PNOTIFYRECORDENTER)mp2;
189                                TreeRecord *tr = (TreeRecord *)re->pRecord;
190                                currentpage = tr->page;
191                                render_page( true );
192                                page_redraw( hWndDoc );
193                            }
194                            break;
195                    }
196                    break;
197            }
198            break;
199
200        case WM_COMMAND:
201        {
202            switch ( SHORT1FROMMP(mp1) )
203            {
204                case 91:
205                    {
206                        FILEDLG fd;
207                        memset( &fd, 0, sizeof( fd ) );
208                        fd.cbSize = sizeof( fd );
209                        fd.fl = FDS_CENTER | FDS_SAVEAS_DIALOG;
210                        HWND hd = WinFileDlg( HWND_DESKTOP, hWndFrame, &fd );
211                        if ( hd && ( fd.lReturn == DID_OK ) )
212                        {
213                            if ( !doc->saveAs( ev, fd.szFullFile ) )
214                            {
215                                WinMessageBox( hWndFrame, hWndFrame,
216                                    "Save error", NULL, 1,
217                                    MB_OK | MB_ERROR | MB_MOVEABLE );
218                            }
219                        }
220                    }
221                    break;
222
223                case 92:
224                    {
225                        FILEDLG fd;
226                        memset( &fd, 0, sizeof( fd ) );
227                        fd.cbSize = sizeof( fd );
228                        fd.fl = FDS_CENTER | FDS_SAVEAS_DIALOG;
229                        HWND hd = WinFileDlg( HWND_DESKTOP, hWndFrame, &fd );
230                        if ( hd && ( fd.lReturn == DID_OK ) )
231                        {
232                            doc->exportToPS( ev, fd.szFullFile, 0, totalpages-1, 576, 792, FALSE );
233                        }
234                    }
235                    break;
236
237                case 93:
238                    {
239                        //WinDlgBox( HWND_DESKTOP, hWndFrame, DInfoProc,
240                        //           NULLHANDLE, ID_DOCINFO, NULL );
241                    }
242                    break;
243
244                case 94:
245                    {
246                        //WinDlgBox( HWND_DESKTOP, hWndFrame, FInfoProc,
247                        //           NULLHANDLE, ID_FONTINFO, NULL );
248                    }
249                    break;
250
251                case 101:
252                    {
253                        if ( currentpage > 0 ) {
254                            currentpage--;
255                            render_page();
256                            page_redraw( hWndDoc );
257                        }
258                    }
259                    break;
260
261                case 102:
262                    {
263                        if ( currentpage < (totalpages-1) ) {
264                            currentpage++;
265                            render_page();
266                            page_redraw( hWndDoc );
267                        }
268                    }
269                    break;
270
271                case 201:
272                    currentzoom = 50;
273                    render_page();
274                    page_redraw( hWndDoc );
275                    break;
276                case 202:
277                    currentzoom = 100;
278                    render_page();
279                    page_redraw( hWndDoc );
280                    break;
281                case 203:
282                    currentzoom = 125;
283                    render_page();
284                    page_redraw( hWndDoc );
285                    break;
286                case 204:
287                    currentzoom = 150;
288                    render_page();
289                    page_redraw( hWndDoc );
290                    break;
291                case 205:
292                    currentzoom = 200;
293                    render_page();
294                    page_redraw( hWndDoc );
295                    break;
296                case 206:
297                    currentzoom = 300;
298                    render_page();
299                    page_redraw( hWndDoc );
300                    break;
301                case 207:
302                    currentzoom = 400;
303                    render_page();
304                    page_redraw( hWndDoc );
305                    break;
306
307                case 103:
308                    {
309                        char *t = doc->getText( ev, currentpage, &r_selection );
310                        textToClipbrd( hab, t );
311                    }
312                    break;
313
314                case 104:
315                    {
316                        srchrects = doc->searchText( ev, currentpage, " «åš¬šï ª«®" );
317
318                        RECTL toRedraw = { 0 };
319                        if ( srchrects != NULL )
320                        {
321                            for ( int i = 0; i < srchrects->_length; i++ )
322                            {
323                                RECTL r = {0};
324
325                                r.xLeft = srchrects->_buffer[i].x1*coeff - sHscrollPos;
326                                r.yBottom = cyClient - srchrects->_buffer[i].y2*coeff + sVscrollPos;
327                                r.xRight = srchrects->_buffer[i].x2*coeff - sHscrollPos;
328                                r.yTop = cyClient - srchrects->_buffer[i].y1*coeff + sVscrollPos;
329
330                                WinUnionRect( hab, &toRedraw, &toRedraw, &r );
331                            }
332
333                            WinInvalidateRect( hWndDoc, &toRedraw, FALSE );
334                        }
335                    }
336                    break;
337            }
338
339        }
340        return (MRESULT)FALSE;
341    }
342    return pOldSplProc( hwnd, msg, mp1, mp2 );
343}
344
345
346static MRESULT VertScroll( HWND hwnd, MPARAM mp2 )
347{
348    LONG sVscrollInc = 0;
349
350    switch ( SHORT2FROMMP( mp2 ) )
351    {
352        case SB_LINEUP:
353            sVscrollInc = -1;
354            break ;
355        case SB_LINEDOWN:
356            sVscrollInc = 1;
357            break;
358        case SB_PAGEUP:
359            sVscrollInc = __min( -1, -cyClient );
360            break;
361        case SB_PAGEDOWN:
362            sVscrollInc = __max( 1, cyClient );
363            break;
364        case SB_SLIDERTRACK:
365            sVscrollInc = SHORT1FROMMP( mp2 ) - sVscrollPos;
366            break;
367    }
368
369    sVscrollInc = __max( -sVscrollPos, __min( sVscrollInc, sVscrollMax - sVscrollPos ) );
370
371    if ( sVscrollInc != 0 )
372    {
373        sVscrollPos += (SHORT)sVscrollInc;
374        WinScrollWindow( hwnd, 0, sVscrollInc,
375                         NULL, NULL, NULLHANDLE, NULL, SW_INVALIDATERGN );
376        WinSendMsg( hwndVscroll, SBM_SETPOS, MPFROMSHORT( sVscrollPos ), MPVOID );
377        WinUpdateWindow( hwnd );
378    }
379
380    //printf( "sVscrollPos: %d\n", sVscrollPos );
381
382    return ( MRFROMLONG( 0 ) );
383}
384
385static MRESULT HorizScroll( HWND hwnd, MPARAM mp2 )
386{
387    LONG sHscrollInc = 0;
388
389    switch ( SHORT2FROMMP( mp2 ) )
390    {
391        case SB_LINELEFT:
392            sHscrollInc = -1;
393            break;
394        case SB_LINERIGHT:
395            sHscrollInc = 1;
396            break;
397        case SB_PAGELEFT:
398            sHscrollInc = __min( -1, -cxClient );
399            break;
400        case SB_PAGERIGHT:
401            sHscrollInc = __max( 1, cxClient );
402            break;
403        case SB_SLIDERTRACK:
404            sHscrollInc = SHORT1FROMMP( mp2 ) - sHscrollPos;
405            break;
406    }
407
408    sHscrollInc = __max( -sHscrollPos, __min( sHscrollInc, sHscrollMax - sHscrollPos ) );
409
410    if ( sHscrollInc != 0 )
411    {
412        sHscrollPos += (SHORT)sHscrollInc;
413        WinScrollWindow( hwnd, -sHscrollInc, 0, NULL, NULL,
414                         NULLHANDLE, NULL, SW_INVALIDATERGN );
415        WinSendMsg( hwndHscroll, SBM_SETPOS, MPFROMSHORT( sHscrollPos ), MPVOID );
416        WinUpdateWindow( hwnd );
417    }
418    //printf( "sHscrollPos: %d\n", sHscrollPos );
419    return ( MRFROMLONG( 0 ) );
420}
421
422void check_menu()
423{
424    HWND hmenu = WinWindowFromID( hWndFrame, FID_MENU );
425    WinEnableMenuItem( hmenu, 91, doc->isSaveable( ev ) );
426    WinEnableMenuItem( hmenu, 92, doc->isPSExportable( ev ) );
427    WinEnableMenuItem( hmenu, 94, doc->isHaveFontInfo( ev ) );
428    WinEnableMenuItem( hmenu, 101, ( currentpage > 0 ) );
429    WinEnableMenuItem( hmenu, 102, ( currentpage < (totalpages-1) ) );
430    WinEnableMenuItem( hmenu, 200, doc->isScalable( ev ) );
431    WinEnableMenuItem( hmenu, 103, ( selrects != NULL ) );
432}
433
434
435static MRESULT EXPENTRY wndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
436{
437    switch ( msg )
438    {
439        case WM_SIZE:
440            {
441                cxClient = SHORT1FROMMP( mp2 );
442                cyClient = SHORT2FROMMP( mp2 );
443
444                if ( ( hpsBuffer != NULLHANDLE ) && ( hdcBuffer != NULLHANDLE ) ) {
445                    DestroyGraphicsBuffer( hpsBuffer, hdcBuffer );
446                    hpsBuffer = hdcBuffer = NULLHANDLE;
447                }
448
449                HPS hps = WinGetPS( hwnd );
450                RECTL rectl = { 0, 0, cxClient, cyClient };
451                CreateGraphicsBuffer( hab, &rectl, hps, &hpsBuffer, &hdcBuffer );
452                WinReleasePS( hps );
453
454                sHscrollMax = (SHORT)__max( 0, width - cxClient );
455                sHscrollPos = __min( sHscrollPos, sHscrollMax );
456
457                WinSendMsg( hwndHscroll, SBM_SETSCROLLBAR,
458                            MPFROMSHORT(sHscrollPos), MPFROM2SHORT(0, sHscrollMax) );
459                WinSendMsg( hwndHscroll, SBM_SETTHUMBSIZE,
460                            MPFROM2SHORT( cxClient, width ), MPVOID );
461                WinEnableWindow( hwndHscroll, (BOOL)( sHscrollMax != 0 ) );
462
463                sVscrollMax = (SHORT)__max( 0, height - cyClient );
464                sVscrollPos = __min( sVscrollPos, sVscrollMax );
465
466                WinSendMsg( hwndVscroll, SBM_SETSCROLLBAR,
467                            MPFROMSHORT(sVscrollPos), MPFROM2SHORT(0, sVscrollMax) );
468                WinSendMsg( hwndVscroll, SBM_SETTHUMBSIZE,
469                            MPFROM2SHORT( cyClient, height ), MPVOID );
470                WinEnableWindow( hwndVscroll, (BOOL)( sVscrollMax != 0 ) );
471            }
472            return (MRESULT)FALSE;
473
474        case WM_HSCROLL:
475            HorizScroll( hwnd, mp2 );
476            break;
477
478        case WM_VSCROLL:
479            VertScroll( hwnd, mp2 );
480            break;
481
482        case WM_ERASEBACKGROUND:
483            return (MRESULT)TRUE;
484
485        case WM_PAINT:
486            {
487                RECTL rcl;
488                HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
489                //WinQueryWindowRect( hwnd, &rcl );
490
491                GpiErase( hpsBuffer );
492
493                BITMAPINFO2 pbmi;
494                pbmi.cbFix = 16L;
495                pbmi.cx = pixbuf->getWidth( ev );
496                pbmi.cy = pixbuf->getHeight( ev );
497                pbmi.cPlanes = 1;
498                pbmi.cBitCount = 24;
499
500                RECTL rclPage = { 0, 0, pbmi.cx, pbmi.cy };
501                if ( pbmi.cy < cyClient )
502                {
503                    rclPage.yBottom = cyClient - pbmi.cy;
504                    rclPage.yTop = cyClient;
505                }
506                RECTL rclDraw = { 0, 0, 0, 0 };
507
508                if ( WinIntersectRect( hab, &rclDraw, &rcl, &rclPage ) )
509                {
510
511                    spos_x = sHscrollPos + rclDraw.xLeft;
512                    spos_y = 0;
513                    if ( pbmi.cy > cyClient ) {
514                        spos_y = ( (pbmi.cy - cyClient) - sVscrollPos ) + rclDraw.yBottom;
515                    } else {
516                        spos_y = rclDraw.yBottom - rclPage.yBottom;
517                    }
518
519                    LONG rclx = rclDraw.xRight - rclDraw.xLeft;
520                    LONG rcly = rclDraw.yTop - rclDraw.yBottom;
521                    //printf( "cyClient %d  sVscrollPos %d\n", cyClient, sVscrollPos );
522                    //printf( "xLeft %d, yBottom %d, xRight %d, yTop %d, spos_x %d, spos_y %d, spos_x+rclx %d, spos_y+rcly %d\n",
523                    //        rclDraw.xLeft, rclDraw.yBottom, rclDraw.xRight, rclDraw.yTop, spos_x, spos_y, spos_x+rclx, spos_y+rcly );
524
525                    POINTL aptlPoints[4]={ rclDraw.xLeft, rclDraw.yBottom,
526                                           rclDraw.xRight, rclDraw.yTop,
527                                           spos_x, spos_y,
528                                           spos_x+rclx+1, spos_y+rcly+1 };
529
530                    LONG lRop = ROP_SRCCOPY;
531
532                    GpiDrawBits( hpsBuffer, pixbuf->getDataPtr( ev ), &pbmi, 4L,
533                                 aptlPoints, lRop, BBO_IGNORE );
534
535
536                    if ( selrects != NULL )
537                    {
538                        for ( int i = 0; i < selrects->_length; i++ )
539                        {
540                            RECTL r = {0};
541
542                            r.xLeft = selrects->_buffer[i].x1 - sHscrollPos;
543                            r.yBottom = cyClient - selrects->_buffer[i].y2 + sVscrollPos;
544                            r.xRight = selrects->_buffer[i].x2 - sHscrollPos;
545                            r.yTop = cyClient - selrects->_buffer[i].y1 + sVscrollPos;
546
547                            WinDrawBorder( hpsBuffer, &r, 1, 1, CLR_RED, CLR_GREEN, 0 );
548                        }
549                    }
550                    if ( srchrects != NULL )
551                    {
552                        for ( int i = 0; i < srchrects->_length; i++ )
553                        {
554                            RECTL r = {0};
555
556                            r.xLeft = srchrects->_buffer[i].x1*coeff - sHscrollPos;
557                            r.yBottom = cyClient - srchrects->_buffer[i].y2*coeff + sVscrollPos;
558                            r.xRight = srchrects->_buffer[i].x2*coeff - sHscrollPos;
559                            r.yTop = cyClient - srchrects->_buffer[i].y1*coeff + sVscrollPos;
560
561                            WinDrawBorder( hpsBuffer, &r, 1, 1, CLR_DARKGREEN, CLR_GREEN, 0 );
562                        }
563                    }
564
565                    if ( links != NULL )
566                    {
567                        for ( int i = 0; i < links->_length; i++ )
568                        {
569                            RECTL r = {0};
570
571                            r.xLeft = (links->_buffer[i].area.x1*coeff) - sHscrollPos;
572                            r.yBottom = cyClient - (links->_buffer[i].area.y2*coeff) + sVscrollPos;
573                            r.xRight = (links->_buffer[i].area.x2*coeff) - sHscrollPos;
574                            r.yTop = cyClient - (links->_buffer[i].area.y1*coeff) + sVscrollPos;
575
576                            WinDrawBorder( hpsBuffer, &r, 1, 1, CLR_BLUE, CLR_GREEN, 0 );
577                        }
578                    }
579
580                    if ( ( rcl.xLeft == 0 ) && ( rcl.yBottom == 0 ) &&
581                         ( rcl.xRight == cxClient ) && ( rcl.yTop == cyClient ) )
582                    {
583                        short w = 0, h = 0;
584                        if ( doc->getThumbnailSize( ev, currentpage, 76, &w, &h ) )
585                        {
586                            EvPixbuf *pb = doc->getThumbnail( ev, currentpage, 76 );
587                            if ( pb != NULL )
588                            {
589                                SHORT px = cxClient - ( w + 3 );
590                                SHORT py = cyClient - ( h + 3 );
591
592                                RECTL rcl = { px, py, px + w + 3, py + h + 3 };
593                                WinDrawBorder( hpsBuffer, &rcl, 1, 1, CLR_RED, CLR_GREEN, 0 );
594
595                                BITMAPINFO2 pbmi;
596                                pbmi.cbFix = 16L;
597                                pbmi.cx = pb->getWidth( ev );
598                                pbmi.cy = pb->getHeight( ev );
599                                pbmi.cPlanes = 1;
600                                pbmi.cBitCount = 24;
601
602                                POINTL aptlPoints[4]={ px+1, py+1, px+w+2, py+h+2,
603                                                       0, 0, w+1, h+1 };
604                                GpiDrawBits( hpsBuffer, pb->getDataPtr( ev ), &pbmi, 4L,
605                                             aptlPoints, ROP_SRCCOPY, BBO_IGNORE );
606
607                                delete pb;
608                            }
609                        }
610                    }
611
612                    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
613                }
614
615                //WinDrawBorder( hps, &rcl, 1,1, CLR_RED, CLR_GREEN, 0 );
616
617
618                WinEndPaint( hps );
619            }
620            break;
621
622        case WM_BUTTON1DOWN:
623            {
624                mousePressed = true;
625                mpos_x = SHORT1FROMMP(mp1);
626                mpos_y = SHORT2FROMMP(mp1);
627            }
628            break;
629
630        case WM_BUTTON1UP:
631            {
632                mousePressed = false;
633                WinEnableMenuItem( WinWindowFromID( hWndFrame, FID_MENU ),
634                                   103, ( selrects != NULL ) );
635            }
636            break;
637
638        case WM_BUTTON1CLICK:
639            {
640                SHORT xcurpos = SHORT1FROMMP(mp1);
641                SHORT ycurpos = SHORT2FROMMP(mp1);
642
643                if ( links != NULL )
644                {
645                    for ( int i = 0; i < links->_length; i++ )
646                    {
647                        RECTL r = {0};
648
649                        r.xLeft = (links->_buffer[i].area.x1*coeff) - sHscrollPos;
650                        r.yBottom = cyClient - (links->_buffer[i].area.y2*coeff) + sVscrollPos;
651                        r.xRight = (links->_buffer[i].area.x2*coeff) - sHscrollPos;
652                        r.yTop = cyClient - (links->_buffer[i].area.y1*coeff) + sVscrollPos;
653
654                        POINTL ptl = { xcurpos, ycurpos };
655                        if ( WinPtInRect( hab, &r, &ptl ) )
656                        {
657                            if ( links->_buffer[i].link.type == EV_LINK_TYPE_EXTERNAL_URI )
658                            {
659                                WinMessageBox( hWndFrame, hWndFrame,
660                                    links->_buffer[i].link.uri, "URI", 1,
661                                    MB_OK | MB_INFORMATION | MB_MOVEABLE );
662                            }
663                            else if ( links->_buffer[i].link.type == EV_LINK_TYPE_TITLE )
664                            {
665                                char *title = links->_buffer[i].link.title;
666                                if ( title == NULL ) {
667                                    title = "???";
668                                }
669                                WinMessageBox( hWndFrame, hWndFrame,
670                                    title, "?", 1,
671                                    MB_OK | MB_INFORMATION | MB_MOVEABLE );
672                            }
673                            else if ( links->_buffer[i].link.type == EV_LINK_TYPE_PAGE )
674                            {
675                                currentpage = links->_buffer[i].link.page;
676                                render_page();
677                                page_redraw( hwnd );
678                            }
679
680                            return (MRESULT)FALSE;
681                        }
682                    }
683                }
684            }
685            break;
686
687        case WM_MOUSEMOVE:
688            {
689                SHORT xcurpos = SHORT1FROMMP(mp1);
690                SHORT ycurpos = SHORT2FROMMP(mp1);
691
692                if ( mousePressed )
693                {
694                    r_selection.x1 = (mpos_x+sHscrollPos)/coeff;
695                    r_selection.y1 = ((cyClient-mpos_y)+sVscrollPos)/coeff;
696                    r_selection.x2 = (xcurpos+sHscrollPos)/coeff;
697                    r_selection.y2 = ((cyClient-ycurpos)+sVscrollPos)/coeff;
698
699                    RECTL toRedraw = { 0 };
700
701                    if ( selrects != NULL )
702                    {
703                        for ( int i = 0; i < selrects->_length; i++ )
704                        {
705                            RECTL r = {0};
706
707                            r.xLeft = selrects->_buffer[i].x1 - sHscrollPos;
708                            r.yBottom = cyClient - selrects->_buffer[i].y2 + sVscrollPos;
709                            r.xRight = selrects->_buffer[i].x2 - sHscrollPos;
710                            r.yTop = cyClient - selrects->_buffer[i].y1 + sVscrollPos;
711
712                            WinUnionRect( hab, &toRedraw, &toRedraw, &r );
713                        }
714                    }
715
716
717                    EvDocument::freeRectangles( ev, selrects );
718                    selrects = doc->getSelectionRectangles( ev, currentpage, coeff, &r_selection );
719
720                    if ( selrects != NULL )
721                    {
722                        for ( int i = 0; i < selrects->_length; i++ )
723                        {
724                            RECTL r = {0};
725
726                            r.xLeft = selrects->_buffer[i].x1 - sHscrollPos;
727                            r.yBottom = cyClient - selrects->_buffer[i].y2 + sVscrollPos;
728                            r.xRight = selrects->_buffer[i].x2 - sHscrollPos;
729                            r.yTop = cyClient - selrects->_buffer[i].y1 + sVscrollPos;
730
731                            WinUnionRect( hab, &toRedraw, &toRedraw, &r );
732                        }
733                    }
734
735                    WinInvalidateRect( hwnd, &toRedraw, FALSE );
736                }
737                else
738                {
739                    if ( links != NULL )
740                    {
741                        for ( int i = 0; i < links->_length; i++ )
742                        {
743                            RECTL r = {0};
744
745                            r.xLeft = (links->_buffer[i].area.x1*coeff) - sHscrollPos;
746                            r.yBottom = cyClient - (links->_buffer[i].area.y2*coeff) + sVscrollPos;
747                            r.xRight = (links->_buffer[i].area.x2*coeff) - sHscrollPos;
748                            r.yTop = cyClient - (links->_buffer[i].area.y1*coeff) + sVscrollPos;
749
750                            POINTL ptl = { xcurpos, ycurpos };
751                            if ( WinPtInRect( hab, &r, &ptl ) )
752                            {
753                                WinSetPointer( HWND_DESKTOP, handptr );
754                                return (MRESULT)FALSE;
755                            }
756                        }
757                    }
758                }
759            }
760            break;
761    }
762    return WinDefWindowProc( hwnd, msg, mp1, mp2 );
763}
764
765bool loadDll( const char *fn )
766{
767    char *dllname = "EVDOC";
768    char ext[ _MAX_EXT ];
769    _splitpath( fn, NULL, NULL, NULL, ext );
770
771    if ( stricmp( ext, ".JPG" ) == 0 ) {
772        dllname = "EVJPEG";
773    } else if ( stricmp( ext, ".PDF" ) == 0 ) {
774        dllname = "EVPPLR";
775    } else if ( stricmp( ext, ".DJVU" ) == 0 ) {
776        dllname = "EVDJVU";
777    }
778
779    HMODULE h = NULLHANDLE;
780    if ( DosLoadModule( NULL, 0, dllname, &h ) == 0 ) {
781        DosQueryProcAddr( h, 0, "createObject", (PFN *)&createObject );
782        return true;
783    }
784
785    printf( "Can't load module '%s'\n", dllname );
786    return false;
787}
788
789bool treeToPage( TreeRecord *parent, long page )
790{
791    SHORT atr = ( parent == NULL ) ? CMA_FIRST : CMA_FIRSTCHILD;
792    TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndTree, CM_QUERYRECORD,
793                            MPFROMP( parent ), MPFROM2SHORT( atr, CMA_ITEMORDER ) );
794    while ( ( pr != NULL ) && ( (int)pr != -1 ) )
795    {
796        if ( pr->page == page )
797        {
798            if ( parent != NULL ) {
799                WinSendMsg( hWndTree, CM_EXPANDTREE, MPFROMP( parent ), MPVOID );
800            }
801            WinSendMsg( hWndTree, CM_SETRECORDEMPHASIS, MPFROMP( pr ),
802                        MPFROM2SHORT( TRUE, CRA_SELECTED | CRA_CURSORED ) );
803            return true;
804        }
805
806        if ( treeToPage( pr, page ) ) {
807            return true;
808        }
809
810        pr = (TreeRecord *)WinSendMsg( hWndTree, CM_QUERYRECORD,
811                            MPFROMP( pr ), MPFROM2SHORT( CMA_NEXT, CMA_ITEMORDER ) );
812    }
813    return false;
814}
815
816void render_page( bool dontTouchTree )
817{
818    check_menu();
819    delete pixbuf;
820
821    EvDocument::freeLinkMapping( ev, links );
822    links = doc->getLinkMapping( ev, currentpage );
823
824    EvDocument::freeRectangles( ev, selrects );
825    EvDocument::freeRectangles( ev, srchrects );
826    selrects = NULL;
827    srchrects = NULL;
828
829    doc->getPageSize( ev, currentpage, &width, &height );
830    coeff = (double)currentzoom / 100.0;
831    width *= coeff;
832    height *= coeff;
833    //printf( "width: %d   height: %d\n", (int)width, (int)height );
834    if ( !dontTouchTree ) {
835        treeToPage( NULL, currentpage );
836    }
837    pixbuf = new EvPixbuf( ev, width, height );
838    doc->renderPageToPixbuf( ev, currentpage, 0, 0, width, height, coeff, 0, pixbuf );
839}
840
841
842static char *newstrdup( const char *s )
843{
844    if ( s == NULL ) {
845        return NULL;
846    }
847    char *temp = new char[ strlen( s ) + 1 ];
848    strcpy( temp, s );
849    return temp;
850}
851
852/*static char *newstrFromUTF8( const char *s )
853{
854    if ( s == NULL ) {
855        return NULL;
856    }
857
858    unsigned blen = strlen( s ) + 1;
859    char *b = new char[ blen ];
860    memset( b, 0, blen );
861    char *bsav = b;
862    const char *from = s;
863    unsigned flen = strlen( s );
864    cnvUTF8ToSys( &from, &flen, &b, &blen );
865    return bsav;
866}*/
867
868/*static void viewTree( int level, EvIndexNode *n )
869{
870    if ( n == NULL ) {
871        return;
872    }
873
874    somLPrintf( level, "title: %s\n", n->getLink(ev)->title );
875
876    EvIndexNode *cn = n->getFirstChild( ev );
877    while ( cn != NULL )
878    {
879        viewTree( level+1, cn );
880        cn = n->getNextChild( ev );
881    }
882}  */
883
884void addNodes( HWND hwnd, TreeRecord *parent, EvIndexNode *n )
885{
886    if ( n == NULL ) {
887        return;
888    }
889
890    EvLink *link = n->getLink(ev);
891
892    RECORDINSERT ri;
893    TreeRecord *pr = (TreeRecord *)WinSendMsg( hwnd, CM_ALLOCRECORD,
894       MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
895
896    pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
897    pr->miniRecordCore.flRecordAttr = 0;
898    pr->miniRecordCore.ptlIcon.x = 0;
899    pr->miniRecordCore.ptlIcon.y = 0;
900    pr->miniRecordCore.pszIcon = newstrdup( link->title );
901    pr->miniRecordCore.hptrIcon = NULLHANDLE;
902    pr->page = link->page;
903
904    ri.cb = sizeof( RECORDINSERT );
905    ri.pRecordParent = (PRECORDCORE)parent;
906    ri.pRecordOrder = (PRECORDCORE)CMA_END;
907    ri.zOrder = (USHORT)CMA_TOP;
908    ri.cRecordsInsert = 1;
909    ri.fInvalidateRecord = TRUE;
910    WinSendMsg( hwnd, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
911
912    EvIndexNode *cn = n->getFirstChild( ev );
913    while ( cn != NULL )
914    {
915        addNodes( hwnd, pr, cn );
916        cn = n->getNextChild( ev );
917    }
918}
919
920void fill_tree( HWND hwnd )
921{
922    if ( doc->isHaveIndex( ev ) )
923    {
924        CNRINFO ci;
925        ci.cb = sizeof( CNRINFO );
926        WinSendMsg( hwnd, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
927        ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
928        ci.flWindowAttr |= ( CV_TREE | CV_TEXT | CV_MINI | CA_TREELINE );
929        WinSendMsg( hwnd, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
930
931        EvIndexNode *n = doc->getIndex( ev );
932        EvIndexNode *cn = n->getFirstChild( ev );
933        while ( cn != NULL )
934        {
935            addNodes( hwnd, NULL, cn );
936            cn = n->getNextChild( ev );
937        }
938        delete n;
939    }
940    else
941    {
942        CNRINFO ci;
943        ci.cb = sizeof( CNRINFO );
944        WinSendMsg( hwnd, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
945        ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
946        ci.flWindowAttr |= ( CV_TEXT | CV_MINI );
947        WinSendMsg( hwnd, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
948
949        char pgbuf[ 20 ];
950        for ( int i = 0; i < totalpages; i++ )
951        {
952            snprintf( pgbuf, sizeof(pgbuf), "Page %d", i + 1 );
953            RECORDINSERT ri;
954            TreeRecord *pr = (TreeRecord *)WinSendMsg( hwnd, CM_ALLOCRECORD,
955               MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
956
957            pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
958            pr->miniRecordCore.flRecordAttr = 0;
959            pr->miniRecordCore.ptlIcon.x = 0;
960            pr->miniRecordCore.ptlIcon.y = 0;
961            pr->miniRecordCore.pszIcon = newstrdup( pgbuf );
962            pr->miniRecordCore.hptrIcon = NULLHANDLE;
963            pr->page = i;
964
965            ri.cb = sizeof( RECORDINSERT );
966            ri.pRecordParent = (PRECORDCORE)NULL;
967            ri.pRecordOrder = (PRECORDCORE)CMA_END;
968            ri.zOrder = (USHORT)CMA_TOP;
969            ri.cRecordsInsert = 1;
970            ri.fInvalidateRecord = TRUE;
971            WinSendMsg( hwnd, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
972        }
973    }
974}
975
976
977char deffont[] = "9.WarpSans";
978
979int main( int argc, char **argv )
980{
981    PPIB pib;
982    PTIB tib;
983    DosGetInfoBlocks(&tib, &pib);
984    pib->pib_ultype = 3;
985
986    if ( argc < 2 )
987    {
988        printf("No file name given!\n");
989        return 1;
990    }
991
992    ev = somGetGlobalEnvironment();
993
994    if ( !loadDll( argv[1] ) ) {
995        return 1;
996    }
997
998    doc = createObject();
999    int res = doc->loadFile( ev, argv[1], NULL, NULL );
1000    if (!res) {
1001        printf("Error loading document!\n");
1002        return 1;
1003    }
1004
1005    totalpages = doc->getPageCount( ev );
1006
1007    HMQ   hmq;
1008    QMSG  qmsg;
1009    hab = WinInitialize( 0 );
1010    hmq = WinCreateMsgQueue( hab, 0 );
1011    //WinSetCp( hmq, 1208 );
1012
1013    initClipbrd();
1014    handptr = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, 500 );
1015
1016    ULONG ulFrameFlags = FCF_TITLEBAR | FCF_SIZEBORDER | FCF_SYSMENU |
1017                         FCF_MINMAX | FCF_TASKLIST | FCF_NOBYTEALIGN | FCF_MENU;
1018    hWndFrame = WinCreateStdWindow( HWND_DESKTOP, 0, &ulFrameFlags, NULL, "test",
1019                                    WS_SYNCPAINT|WS_VISIBLE, NULLHANDLE, 100, NULL );
1020    // ᯫšââ¥à
1021    InitPMSplitterClass( hab );
1022    HWND hSplitter = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
1023                                      WS_VISIBLE | SBS_VSPLIT,
1024                                      0, 0, 0, 0, hWndFrame, HWND_TOP,
1025                                      FID_CLIENT, NULL, NULL );
1026    pOldSplProc = WinSubclassWindow( hSplitter, splProc );
1027
1028    hWndTree = WinCreateWindow( hWndFrame, WC_CONTAINER, "",
1029                                WS_VISIBLE|CCS_MINIRECORDCORE|CCS_READONLY|CCS_MINIICONS, 0, 0, 0, 0, hWndFrame,
1030                                HWND_TOP, ID_CNTR, NULL, NULL );
1031    WinSetPresParam( hWndTree, PP_FONTNAMESIZE, sizeof(deffont), deffont );
1032    fill_tree( hWndTree );
1033
1034    WinRegisterClass( hab, "my.test", wndProc, CS_SIZEREDRAW, sizeof( ULONG ) * 2 );
1035    ULONG dfFlags = FCF_VERTSCROLL | FCF_HORZSCROLL | FCF_NOBYTEALIGN;
1036    HWND hwndDocFrame = WinCreateStdWindow( hWndFrame,
1037                            WS_VISIBLE, &dfFlags, "my.test", NULL,
1038                            WS_VISIBLE, NULLHANDLE, 0, &hWndDoc );
1039    hwndHscroll = WinWindowFromID( hwndDocFrame, FID_HORZSCROLL );
1040    hwndVscroll = WinWindowFromID( hwndDocFrame, FID_VERTSCROLL );
1041
1042    //hWndDoc = WinCreateWindow( hWndFrame, "my.test", "",
1043    //                              WS_SYNCPAINT|WS_VISIBLE, 0, 0, 0, 0, hWndFrame,
1044    //                              HWND_TOP, 2, NULL, NULL );
1045
1046    WinSendMsg( hSplitter, SBM_SETWINDOWS,
1047                MPFROMHWND( hWndTree ), MPFROMHWND( hwndDocFrame ) );
1048    WinSendMsg( hSplitter, SBM_SETSPLITTERPOS, MPFROMSHORT( 80 ), MPVOID );
1049
1050    render_page();
1051
1052    // ®ª § âì ®ª­® ¯à®£à ¬¬ë
1053    WinSetWindowPos( hWndFrame, HWND_TOP, 100, 100, 630, 400,
1054                     SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE );
1055
1056
1057    // Messsage loop
1058    while ( WinGetMsg( hab, &qmsg, 0, 0, 0 ) ) {
1059        WinDispatchMsg( hab, &qmsg );
1060    }
1061
1062    WinDestroyWindow( hWndFrame );
1063    WinDestroyMsgQueue( hmq );
1064    WinTerminate( hab );
1065
1066    delete doc;
1067    return 0;
1068}
1069
Note: See TracBrowser for help on using the repository browser.