source: branches/kmk/Lucide/gui/indexWindow.cpp @ 334

Last change on this file since 334 was 334, checked in by dmik, 11 years ago

branches/kmk: Renamed private os2.h to os2all.h to avoid the clash with the toolkit one.

File size: 9.9 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#include "os2all.h"
36
37#include <stdio.h>
38
39#include <ludoc.xh>
40#include "lucide.h"
41#include "indexWindow.h"
42#include "luutils.h"
43#include "tb_spl.h"
44#include "messages.h"
45
46
47#define ID_BAR      1
48#define ID_INDEX    2
49
50
51// IndexWindow constructor
52IndexWindow::IndexWindow( HWND hWndFrame )
53{
54    hMainFrame  = hWndFrame;
55    hWndIndex   = NULLHANDLE;
56    doc         = NULL;
57    totalpages  = 0;
58
59    hWndPanel = WinCreateWindow( hWndFrame, WC_ER_SPLITTER, "",
60                                 WS_VISIBLE | SBS_HSPLIT | SBS_SECONDFIXED,
61                                 0, 0, 0, 0, hWndFrame, HWND_TOP, 0, NULL, NULL );
62    WinSetWindowULong( hWndPanel, QWL_USER, (ULONG)this );
63    pOldPanelProc = WinSubclassWindow( hWndPanel, panelProc );
64
65    // index/thumbs switch will be here
66    hWndBar = WinCreateWindow( hWndFrame, WC_STATIC, NULL,
67                               WS_VISIBLE | SS_TEXT | DT_LEFT | DT_VCENTER,
68                               0, 0, 0, 0, hWndPanel, HWND_TOP, ID_BAR, NULL, NULL );
69    WinSetPresParam( hWndBar, PP_FONTNAMESIZE, deffontlen, deffont );
70    ULONG syscmenu = SYSCLR_MENU;
71    WinSetPresParam( hWndBar, PP_BACKGROUNDCOLORINDEX, sizeof( ULONG ), &syscmenu );
72
73    hWndIndex = WinCreateWindow( hWndFrame, WC_CONTAINER, "",
74                        WS_VISIBLE|CCS_MINIRECORDCORE|CCS_READONLY|CCS_MINIICONS,
75                        0, 0, 0, 0, hWndPanel, HWND_TOP, ID_INDEX, NULL, NULL );
76    WinSetPresParam( hWndIndex, PP_FONTNAMESIZE, deffontlen, deffont );
77
78    WinSendMsg( hWndPanel, SBM_SETWINDOWS,
79                MPFROMHWND( hWndIndex ), MPFROMHWND( hWndBar ) );
80    WinSendMsg( hWndPanel, SBM_SETFIXEDSIZE, MPFROMSHORT( 0 ), MPVOID );
81}
82
83// IndexWindow destructor
84IndexWindow::~IndexWindow()
85{
86    clear( NULL );
87}
88
89
90void IndexWindow::setDocument( LuDocument *_doc )
91{
92    clear( NULL );
93
94    doc = _doc;
95
96    if ( doc == NULL ) {
97        totalpages = 0;
98    }
99    else
100    {
101        totalpages = doc->getPageCount( ev );
102
103        if ( doc->isHaveIndex( ev ) ) {
104            loadIndex();
105        }
106        else {
107            loadPagesList();
108        }
109    }
110}
111
112void IndexWindow::loadIndex()
113{
114    CNRINFO ci;
115    ci.cb = sizeof( CNRINFO );
116    WinSendMsg( hWndIndex, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
117    ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
118    ci.flWindowAttr |= ( CV_TREE | CV_TEXT | CV_MINI | CA_TREELINE );
119    WinSendMsg( hWndIndex, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
120
121    LuIndexNode *n = doc->getIndex( ev );
122    LuIndexNode *cn = n->getFirstChild( ev );
123    while ( cn != NULL )
124    {
125        addNodes( NULL, cn );
126        cn = n->getNextChild( ev );
127    }
128    delete n;
129}
130
131void IndexWindow::addNodes( TreeRecord *parent, LuIndexNode *n )
132{
133    if ( n == NULL ) {
134        return;
135    }
136
137    LuLink *link = n->getLink( ev );
138
139    RECORDINSERT ri;
140    TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_ALLOCRECORD,
141       MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
142
143    pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
144    pr->miniRecordCore.flRecordAttr = 0;
145    pr->miniRecordCore.ptlIcon.x = 0;
146    pr->miniRecordCore.ptlIcon.y = 0;
147    pr->miniRecordCore.pszIcon = newstrdup( link->title );
148    pr->miniRecordCore.hptrIcon = NULLHANDLE;
149    pr->page = link->page;
150
151    ri.cb = sizeof( RECORDINSERT );
152    ri.pRecordParent = (PRECORDCORE)parent;
153    ri.pRecordOrder = (PRECORDCORE)CMA_END;
154    ri.zOrder = (USHORT)CMA_TOP;
155    ri.cRecordsInsert = 1;
156    ri.fInvalidateRecord = TRUE;
157    WinSendMsg( hWndIndex, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
158
159    LuIndexNode *cn = n->getFirstChild( ev );
160    while ( cn != NULL )
161    {
162        addNodes( pr, cn );
163        cn = n->getNextChild( ev );
164    }
165}
166
167void IndexWindow::loadPagesList()
168{
169    char *msgpage = newstrdupL( MSGS_PAGE );
170    CNRINFO ci;
171    ci.cb = sizeof( CNRINFO );
172    WinSendMsg( hWndIndex, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
173    ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CV_TREE );
174    ci.flWindowAttr |= ( CV_TEXT | CV_MINI );
175    WinSendMsg( hWndIndex, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
176
177    char pgbuf[ 64 ];
178    for ( int i = 0; i < totalpages; i++ )
179    {
180        snprintf( pgbuf, sizeof(pgbuf), "%s %d", msgpage, i + 1 );
181        RECORDINSERT ri;
182        TreeRecord *pr = (TreeRecord *)WinSendMsg( hWndIndex, CM_ALLOCRECORD,
183           MPFROMLONG( sizeof( TreeRecord ) - sizeof( MINIRECORDCORE ) ), MPFROMSHORT( 1 ) );
184
185        pr->miniRecordCore.cb = sizeof( MINIRECORDCORE );
186        pr->miniRecordCore.flRecordAttr = 0;
187        pr->miniRecordCore.ptlIcon.x = 0;
188        pr->miniRecordCore.ptlIcon.y = 0;
189        pr->miniRecordCore.pszIcon = newstrdup( pgbuf );
190        pr->miniRecordCore.hptrIcon = NULLHANDLE;
191        pr->page = i;
192
193        ri.cb = sizeof( RECORDINSERT );
194        ri.pRecordParent = (PRECORDCORE)NULL;
195        ri.pRecordOrder = (PRECORDCORE)CMA_END;
196        ri.zOrder = (USHORT)CMA_TOP;
197        ri.cRecordsInsert = 1;
198        ri.fInvalidateRecord = TRUE;
199        WinSendMsg( hWndIndex, CM_INSERTRECORD, MPFROMP( pr ), MPFROMP( &ri ) );
200    }
201    delete msgpage;
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        case WM_FOCUSCHANGE:
286            if ( SHORT1FROMMP( mp2 ) ) {
287                Lucide::activeWindow = AwIndex;
288            }
289            break;
290    }
291
292    return _this->pOldPanelProc( hwnd, msg, mp1, mp2 );
293}
294
295
Note: See TracBrowser for help on using the repository browser.