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

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

First import

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