source: trunk/Lucide/SOURCE/gui/indexWindow.cpp @ 34

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

implemented fullscreen mode

File size: 8.1 KB
Line 
1#define INCL_WIN
2#include <os2.h>
3
4#include <stdio.h>
5
6#include <ludoc.xh>
7#include "lucide.h"
8#include "indexWindow.h"
9#include "luutils.h"
10#include "tb_spl.h"
11
12
13#define ID_BAR      1
14#define ID_INDEX    2
15
16
17// IndexWindow constructor
18IndexWindow::IndexWindow( HAB _hab, HWND hWndFrame )
19{
20    hab         = _hab;
21    hMainFrame  = hWndFrame;
22    hWndIndex   = NULLHANDLE;
23    doc         = NULL;
24    totalpages  = 0;
25    ev          = somGetGlobalEnvironment();
26
27    hWndPanel = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
28                                 WS_VISIBLE | SBS_HSPLIT | SBS_SECONDFIXED,
29                                 0, 0, 0, 0, hWndFrame, HWND_TOP, 0, NULL, NULL );
30    WinSetWindowULong( hWndPanel, QWL_USER, (ULONG)this );
31    pOldPanelProc = WinSubclassWindow( hWndPanel, panelProc );
32
33    // index/thumbs switch will be here
34    hWndBar = WinCreateWindow( hWndFrame, WC_STATIC, NULL,
35                               WS_VISIBLE | SS_TEXT | DT_LEFT | DT_VCENTER,
36                               0, 0, 0, 0, hWndPanel, HWND_TOP, ID_BAR, NULL, NULL );
37    WinSetPresParam( hWndBar, PP_FONTNAMESIZE, deffontlen, deffont );
38    ULONG syscmenu = SYSCLR_MENU;
39    WinSetPresParam( hWndBar, PP_BACKGROUNDCOLORINDEX, sizeof( ULONG ), &syscmenu );
40
41    hWndIndex = WinCreateWindow( hWndFrame, WC_CONTAINER, "",
42                        WS_VISIBLE|CCS_MINIRECORDCORE|CCS_READONLY|CCS_MINIICONS,
43                        0, 0, 0, 0, hWndPanel, HWND_TOP, ID_INDEX, NULL, NULL );
44    WinSetPresParam( hWndIndex, PP_FONTNAMESIZE, deffontlen, deffont );
45
46    WinSendMsg( hWndPanel, SBM_SETWINDOWS,
47                MPFROMHWND( hWndIndex ), MPFROMHWND( hWndBar ) );
48    WinSendMsg( hWndPanel, SBM_SETFIXEDSIZE, MPFROMSHORT( 0 ), MPVOID );
49}
50
51// IndexWindow destructor
52IndexWindow::~IndexWindow()
53{
54    clear( NULL );
55}
56
57
58void IndexWindow::setDocument( LuDocument *_doc )
59{
60    clear( NULL );
61
62    doc = _doc;
63
64    if ( doc == NULL ) {
65        totalpages = 0;
66    }
67    else
68    {
69        totalpages = doc->getPageCount( ev );
70
71        if ( doc->isHaveIndex( ev ) ) {
72            loadIndex();
73        }
74        else {
75            loadPagesList();
76        }
77    }
78}
79
80void IndexWindow::loadIndex()
81{
82    CNRINFO ci;
83    ci.cb = sizeof( CNRINFO );
84    WinSendMsg( hWndIndex, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
85    ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
86    ci.flWindowAttr |= ( CV_TREE | CV_TEXT | CV_MINI | CA_TREELINE );
87    WinSendMsg( hWndIndex, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
88
89    LuIndexNode *n = doc->getIndex( ev );
90    LuIndexNode *cn = n->getFirstChild( ev );
91    while ( cn != NULL )
92    {
93        addNodes( NULL, cn );
94        cn = n->getNextChild( ev );
95    }
96    delete n;
97}
98
99void IndexWindow::addNodes( TreeRecord *parent, LuIndexNode *n )
100{
101    if ( n == NULL ) {
102        return;
103    }
104
105    LuLink *link = n->getLink( ev );
106
107    RECORDINSERT ri;
108    TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_ALLOCRECORD,
109       MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
110
111    pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
112    pr->miniRecordCore.flRecordAttr = 0;
113    pr->miniRecordCore.ptlIcon.x = 0;
114    pr->miniRecordCore.ptlIcon.y = 0;
115    pr->miniRecordCore.pszIcon = newstrdup( link->title );
116    pr->miniRecordCore.hptrIcon = NULLHANDLE;
117    pr->page = link->page;
118
119    ri.cb = sizeof( RECORDINSERT );
120    ri.pRecordParent = (PRECORDCORE)parent;
121    ri.pRecordOrder = (PRECORDCORE)CMA_END;
122    ri.zOrder = (USHORT)CMA_TOP;
123    ri.cRecordsInsert = 1;
124    ri.fInvalidateRecord = TRUE;
125    WinSendMsg( hWndIndex, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
126
127    LuIndexNode *cn = n->getFirstChild( ev );
128    while ( cn != NULL )
129    {
130        addNodes( pr, cn );
131        cn = n->getNextChild( ev );
132    }
133}
134
135void IndexWindow::loadPagesList()
136{
137    CNRINFO ci;
138    ci.cb = sizeof( CNRINFO );
139    WinSendMsg( hWndIndex, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
140    ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
141    ci.flWindowAttr |= ( CV_TEXT | CV_MINI );
142    WinSendMsg( hWndIndex, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
143
144    char pgbuf[ 20 ];
145    for ( int i = 0; i < totalpages; i++ )
146    {
147        snprintf( pgbuf, sizeof(pgbuf), "Page %d", i + 1 );
148        RECORDINSERT ri;
149        TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_ALLOCRECORD,
150           MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
151
152        pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
153        pr->miniRecordCore.flRecordAttr = 0;
154        pr->miniRecordCore.ptlIcon.x = 0;
155        pr->miniRecordCore.ptlIcon.y = 0;
156        pr->miniRecordCore.pszIcon = newstrdup( pgbuf );
157        pr->miniRecordCore.hptrIcon = NULLHANDLE;
158        pr->page = i;
159
160        ri.cb = sizeof( RECORDINSERT );
161        ri.pRecordParent = (PRECORDCORE)NULL;
162        ri.pRecordOrder = (PRECORDCORE)CMA_END;
163        ri.zOrder = (USHORT)CMA_TOP;
164        ri.cRecordsInsert = 1;
165        ri.fInvalidateRecord = TRUE;
166        WinSendMsg( hWndIndex, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
167    }
168}
169
170void IndexWindow::clear( TreeRecord *parent )
171{
172    SHORT atr = ( parent == NULL ) ? CMA_FIRST : CMA_FIRSTCHILD;
173    TreeRecord *precs = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
174                            MPFROMP( parent ), MPFROM2SHORT( atr, CMA_ITEMORDER ) );
175    TreeRecord *pr = precs;
176    while ( ( pr != NULL ) && ( (int)pr != -1 ) )
177    {
178        delete pr->miniRecordCore.pszIcon;
179        clear( pr );
180        pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
181                                MPFROMP( pr ), MPFROM2SHORT( CMA_NEXT, CMA_ITEMORDER ) );
182    }
183
184    if ( parent == NULL ) {  // top level call
185        WinSendMsg( hWndIndex, CM_REMOVERECORD, MPFROMP( NULL ),
186                                    MPFROM2SHORT( 0, CMA_INVALIDATE ) );
187    }
188}
189
190bool IndexWindow::goToPage( TreeRecord *parent, long page )
191{
192    SHORT atr = ( parent == NULL ) ? CMA_FIRST : CMA_FIRSTCHILD;
193    TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
194                            MPFROMP( parent ), MPFROM2SHORT( atr, CMA_ITEMORDER ) );
195    while ( ( pr != NULL ) && ( (int)pr != -1 ) )
196    {
197        if ( pr->page == page )
198        {
199            if ( parent != NULL ) {
200                WinSendMsg( hWndIndex, CM_EXPANDTREE, MPFROMP( parent ), MPVOID );
201            }
202            WinSendMsg( hWndIndex, CM_SETRECORDEMPHASIS, MPFROMP( pr ),
203                        MPFROM2SHORT( TRUE, CRA_SELECTED | CRA_CURSORED ) );
204            return true;
205        }
206
207        if ( goToPage( pr, page ) ) {
208            return true;
209        }
210
211        pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
212                                MPFROMP( pr ), MPFROM2SHORT( CMA_NEXT, CMA_ITEMORDER ) );
213    }
214    return false;
215}
216
217
218// static, window procedure
219MRESULT EXPENTRY IndexWindow::panelProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
220{
221    IndexWindow *_this = (IndexWindow *)WinQueryWindowULong( hwnd, QWL_USER );
222
223    switch ( msg )
224    {
225        case WM_CONTROL:
226            switch ( SHORT1FROMMP( mp1 ) )
227            {
228                case ID_INDEX:
229                    switch ( SHORT2FROMMP( mp1 ) )
230                    {
231                        case CN_ENTER:
232                            {
233                                PNOTIFYRECORDENTER re = (PNOTIFYRECORDENTER)mp2;
234                                TreeRecord *tr = (TreeRecord *)re->pRecord;
235                                Lucide::dontSwitchPage = true;
236                                Lucide::goToPage( tr->page );
237                                Lucide::dontSwitchPage = false;
238                            }
239                            break;
240                    }
241                    break;
242            }
243            break;
244    }
245
246    return _this->pOldPanelProc( hwnd, msg, mp1, mp2 );
247}
248
249
Note: See TracBrowser for help on using the repository browser.