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

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

better index handling

File size: 9.8 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2 * Version: CDDL 1.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the COMMON DEVELOPMENT AND
5 * DISTRIBUTION LICENSE (CDDL) Version 1.0 (the "License"); you may not use
6 * this file except in compliance with the License. You may obtain a copy of
7 * the License at http://www.sun.com/cddl/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Initial Developer of the Original Code is
15 * Eugene Romanenko, netlabs.org.
16 * Portions created by the Initial Developer are Copyright (C) 2006
17 * the Initial Developer. All Rights Reserved.
18 *
19 * Contributor(s):
20 *
21 * Alternatively, the contents of this file may be used under the terms of
22 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
23 * in which case the provisions of the LGPL are applicable instead of those
24 * above. If you wish to allow use of your version of this file only under the
25 * terms of the LGPL, and not to allow others to use your version of this file
26 * under the terms of the CDDL, indicate your decision by deleting the
27 * provisions above and replace them with the notice and other provisions
28 * required by the LGPL. If you do not delete the provisions above, a recipient
29 * may use your version of this file under the terms of any one of the CDDL
30 * or the LGPL.
31 *
32 * ***** END LICENSE BLOCK ***** */
33
34
35#define INCL_WIN
36#include <os2.h>
37
38#include <stdio.h>
39
40#include <ludoc.xh>
41#include "lucide.h"
42#include "indexWindow.h"
43#include "luutils.h"
44#include "tb_spl.h"
45
46
47#define ID_BAR      1
48#define ID_INDEX    2
49
50
51// IndexWindow constructor
52IndexWindow::IndexWindow( HAB _hab, HWND hWndFrame )
53{
54    hab         = _hab;
55    hMainFrame  = hWndFrame;
56    hWndIndex   = NULLHANDLE;
57    doc         = NULL;
58    totalpages  = 0;
59    ev          = somGetGlobalEnvironment();
60
61    hWndPanel = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
62                                 WS_VISIBLE | SBS_HSPLIT | SBS_SECONDFIXED,
63                                 0, 0, 0, 0, hWndFrame, HWND_TOP, 0, NULL, NULL );
64    WinSetWindowULong( hWndPanel, QWL_USER, (ULONG)this );
65    pOldPanelProc = WinSubclassWindow( hWndPanel, panelProc );
66
67    // index/thumbs switch will be here
68    hWndBar = WinCreateWindow( hWndFrame, WC_STATIC, NULL,
69                               WS_VISIBLE | SS_TEXT | DT_LEFT | DT_VCENTER,
70                               0, 0, 0, 0, hWndPanel, HWND_TOP, ID_BAR, NULL, NULL );
71    WinSetPresParam( hWndBar, PP_FONTNAMESIZE, deffontlen, deffont );
72    ULONG syscmenu = SYSCLR_MENU;
73    WinSetPresParam( hWndBar, PP_BACKGROUNDCOLORINDEX, sizeof( ULONG ), &syscmenu );
74
75    hWndIndex = WinCreateWindow( hWndFrame, WC_CONTAINER, "",
76                        WS_VISIBLE|CCS_MINIRECORDCORE|CCS_READONLY|CCS_MINIICONS,
77                        0, 0, 0, 0, hWndPanel, HWND_TOP, ID_INDEX, NULL, NULL );
78    WinSetPresParam( hWndIndex, PP_FONTNAMESIZE, deffontlen, deffont );
79
80    WinSendMsg( hWndPanel, SBM_SETWINDOWS,
81                MPFROMHWND( hWndIndex ), MPFROMHWND( hWndBar ) );
82    WinSendMsg( hWndPanel, SBM_SETFIXEDSIZE, MPFROMSHORT( 0 ), MPVOID );
83}
84
85// IndexWindow destructor
86IndexWindow::~IndexWindow()
87{
88    clear( NULL );
89}
90
91
92void IndexWindow::setDocument( LuDocument *_doc )
93{
94    clear( NULL );
95
96    doc = _doc;
97
98    if ( doc == NULL ) {
99        totalpages = 0;
100    }
101    else
102    {
103        totalpages = doc->getPageCount( ev );
104
105        if ( doc->isHaveIndex( ev ) ) {
106            loadIndex();
107        }
108        else {
109            loadPagesList();
110        }
111    }
112}
113
114void IndexWindow::loadIndex()
115{
116    CNRINFO ci;
117    ci.cb = sizeof( CNRINFO );
118    WinSendMsg( hWndIndex, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
119    ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
120    ci.flWindowAttr |= ( CV_TREE | CV_TEXT | CV_MINI | CA_TREELINE );
121    WinSendMsg( hWndIndex, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
122
123    LuIndexNode *n = doc->getIndex( ev );
124    LuIndexNode *cn = n->getFirstChild( ev );
125    while ( cn != NULL )
126    {
127        addNodes( NULL, cn );
128        cn = n->getNextChild( ev );
129    }
130    delete n;
131}
132
133void IndexWindow::addNodes( TreeRecord *parent, LuIndexNode *n )
134{
135    if ( n == NULL ) {
136        return;
137    }
138
139    LuLink *link = n->getLink( ev );
140
141    RECORDINSERT ri;
142    TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_ALLOCRECORD,
143       MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
144
145    pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
146    pr->miniRecordCore.flRecordAttr = 0;
147    pr->miniRecordCore.ptlIcon.x = 0;
148    pr->miniRecordCore.ptlIcon.y = 0;
149    pr->miniRecordCore.pszIcon = newstrdup( link->title );
150    pr->miniRecordCore.hptrIcon = NULLHANDLE;
151    pr->page = link->page;
152
153    ri.cb = sizeof( RECORDINSERT );
154    ri.pRecordParent = (PRECORDCORE)parent;
155    ri.pRecordOrder = (PRECORDCORE)CMA_END;
156    ri.zOrder = (USHORT)CMA_TOP;
157    ri.cRecordsInsert = 1;
158    ri.fInvalidateRecord = TRUE;
159    WinSendMsg( hWndIndex, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
160
161    LuIndexNode *cn = n->getFirstChild( ev );
162    while ( cn != NULL )
163    {
164        addNodes( pr, cn );
165        cn = n->getNextChild( ev );
166    }
167}
168
169void IndexWindow::loadPagesList()
170{
171    CNRINFO ci;
172    ci.cb = sizeof( CNRINFO );
173    WinSendMsg( hWndIndex, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
174    ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
175    ci.flWindowAttr |= ( CV_TEXT | CV_MINI );
176    WinSendMsg( hWndIndex, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
177
178    char pgbuf[ 20 ];
179    for ( int i = 0; i < totalpages; i++ )
180    {
181        snprintf( pgbuf, sizeof(pgbuf), "Page %d", i + 1 );
182        RECORDINSERT ri;
183        TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_ALLOCRECORD,
184           MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
185
186        pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
187        pr->miniRecordCore.flRecordAttr = 0;
188        pr->miniRecordCore.ptlIcon.x = 0;
189        pr->miniRecordCore.ptlIcon.y = 0;
190        pr->miniRecordCore.pszIcon = newstrdup( pgbuf );
191        pr->miniRecordCore.hptrIcon = NULLHANDLE;
192        pr->page = i;
193
194        ri.cb = sizeof( RECORDINSERT );
195        ri.pRecordParent = (PRECORDCORE)NULL;
196        ri.pRecordOrder = (PRECORDCORE)CMA_END;
197        ri.zOrder = (USHORT)CMA_TOP;
198        ri.cRecordsInsert = 1;
199        ri.fInvalidateRecord = TRUE;
200        WinSendMsg( hWndIndex, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
201    }
202}
203
204void IndexWindow::clear( TreeRecord *parent )
205{
206    SHORT atr = ( parent == NULL ) ? CMA_FIRST : CMA_FIRSTCHILD;
207    TreeRecord *precs = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
208                            MPFROMP( parent ), MPFROM2SHORT( atr, CMA_ITEMORDER ) );
209    TreeRecord *pr = precs;
210    while ( ( pr != NULL ) && ( (int)pr != -1 ) )
211    {
212        delete pr->miniRecordCore.pszIcon;
213        clear( pr );
214        pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
215                                MPFROMP( pr ), MPFROM2SHORT( CMA_NEXT, CMA_ITEMORDER ) );
216    }
217
218    if ( parent == NULL ) {  // top level call
219        WinSendMsg( hWndIndex, CM_REMOVERECORD, MPFROMP( NULL ),
220                                    MPFROM2SHORT( 0, CMA_INVALIDATE ) );
221    }
222}
223
224bool IndexWindow::goToPage( TreeRecord *parent, long page )
225{
226    if ( Lucide::dontSwitchPage ) {
227        return true;
228    }
229       
230    SHORT atr = ( parent == NULL ) ? CMA_FIRST : CMA_FIRSTCHILD;
231    TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
232                            MPFROMP( parent ), MPFROM2SHORT( atr, CMA_ITEMORDER ) );
233    while ( ( pr != NULL ) && ( (int)pr != -1 ) )
234    {
235        if ( pr->page == page )
236        {
237            if ( parent != NULL ) {
238                WinSendMsg( hWndIndex, CM_EXPANDTREE, MPFROMP( parent ), MPVOID );
239            }
240            WinSendMsg( hWndIndex, CM_SETRECORDEMPHASIS, MPFROMP( pr ),
241                        MPFROM2SHORT( TRUE, CRA_SELECTED | CRA_CURSORED ) );
242            return true;
243        }
244
245        if ( goToPage( pr, page ) ) {
246            return true;
247        }
248
249        pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_QUERYRECORD,
250                                MPFROMP( pr ), MPFROM2SHORT( CMA_NEXT, CMA_ITEMORDER ) );
251    }
252    return false;
253}
254
255
256// static, window procedure
257MRESULT EXPENTRY IndexWindow::panelProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
258{
259    IndexWindow *_this = (IndexWindow *)WinQueryWindowULong( hwnd, QWL_USER );
260
261    switch ( msg )
262    {
263        case WM_CONTROL:
264            switch ( SHORT1FROMMP( mp1 ) )
265            {
266                case ID_INDEX:
267                    switch ( SHORT2FROMMP( mp1 ) )
268                    {
269                        case CN_ENTER:
270                            {
271                                PNOTIFYRECORDENTER re = (PNOTIFYRECORDENTER)mp2;
272                                TreeRecord *tr = (TreeRecord *)re->pRecord;
273                                if ( tr != NULL ) {
274                                    Lucide::dontSwitchPage = true;
275                                    Lucide::goToPage( tr->page );
276                                    Lucide::dontSwitchPage = false;
277                                }
278                            }
279                            break;
280                    }
281                    break;
282            }
283            break;
284    }
285
286    return _this->pOldPanelProc( hwnd, msg, mp1, mp2 );
287}
288
289
Note: See TracBrowser for help on using the repository browser.