1 /* viblists.c
2 * ===========================================================================
3 *
4 * PUBLIC DOMAIN NOTICE
5 * National Center for Biotechnology Information (NCBI)
6 *
7 * This software/database is a "United States Government Work" under the
8 * terms of the United States Copyright Act. It was written as part of
9 * the author's official duties as a United States Government employee and
10 * thus cannot be copyrighted. This software/database is freely available
11 * to the public for use. The National Library of Medicine and the U.S.
12 * Government do not place any restriction on its use or reproduction.
13 * We would, however, appreciate having the NCBI and the author cited in
14 * any work or product based on this material
15 *
16 * Although all reasonable efforts have been taken to ensure the accuracy
17 * and reliability of the software and data, the NLM and the U.S.
18 * Government do not and cannot warrant the performance or results that
19 * may be obtained by using this software or data. The NLM and the U.S.
20 * Government disclaim all warranties, express or implied, including
21 * warranties of performance, merchantability or fitness for any particular
22 * purpose.
23 *
24 * ===========================================================================
25 *
26 * File Name: viblists.c
27 *
28 * Author: Jonathan Kans
29 *
30 * Version Creation Date: 7/1/91
31 *
32 * $Revision: 6.12 $
33 *
34 * File Description:
35 * Vibrant list functions
36 *
37 * Modifications:
38 * --------------------------------------------------------------------------
39 * Date Name Description of modification
40 * ------- ---------- -----------------------------------------------------
41 *
42 *
43 * $Log: viblists.c,v $
44 * Revision 6.12 2016/04/01 16:15:08 bazhin
45 * Fixed to satisfy 64-bit Windows.
46 *
47 * Revision 6.11 2009/05/15 13:52:38 bollin
48 * make single list in Motif resize if possible, to allow longer strings to be displayed.
49 *
50 * Revision 6.10 2008/04/29 13:43:50 kans
51 * fixes for warnings caught by mingw cross-compiler
52 *
53 * Revision 6.9 2007/04/11 20:06:33 bollin
54 * When showing and hiding Lists, call XtManageChild and XtUnmanageChild respectivelly
55 * for both the parent of the list control (XtParent(c)) as well as for the control itself.
56 * This resolves a problem that I was seeing with the Linux build of Vibrant.
57 *
58 * Revision 6.8 2006/09/14 19:18:28 ivanov
59 * Rollback last changes. All missed defines added to corelib/ncbiwin.h.
60 *
61 * Revision 6.7 2006/09/14 18:05:45 ivanov
62 * Fixed compilation errors on MS Windows
63 *
64 * Revision 6.6 2006/09/14 14:45:38 kans
65 * changes for 64-bit Windows (GC) plus a few CodeWarrior complaints (JK)
66 *
67 * Revision 6.5 2000/02/07 20:17:35 lewisg
68 * minor bug fixes, use gui font for win32
69 *
70 * Revision 6.4 2000/01/07 00:22:46 thiessen
71 * fixes for LessTif and OpenGL X visual selection
72 *
73 * Revision 6.3 1998/07/22 17:35:24 kans
74 * reset list turns off drawing mode if invisible
75 *
76 * Revision 6.2 1997/12/12 21:08:31 kans
77 * a number of symbols changed in the latest CodeWarrior release, now using headers from Apple
78 *
79 * Revision 6.1 1997/11/26 21:30:23 vakatov
80 * Fixed errors and warnings issued by C and C++ (GNU and Sun) compilers
81 *
82 * Revision 6.0 1997/08/25 18:57:11 madden
83 * Revision changed to 6.0
84 *
85 * Revision 5.10 1997/01/29 17:53:59 kans
86 * minor changes due to StringNCpy_0 change
87 *
88 * Revision 5.9 1997/01/29 16:41:22 kans
89 * using StringNCpy_0
90 *
91 * Revision 5.8 1996/10/24 14:42:32 vakatov
92 * [WIN_MOTIF] Adjusted previous release to avoid some Linux/Moo-tiff quirks
93 *
94 * Revision 5.7 1996/10/02 14:56:19 vakatov
95 * A tiny adjustment of the scrolled list height
96 *
97 * Revision 5.6 1996/09/30 16:22:34 vakatov
98 * [WIN_MOTIF] Made ScrolledList *never* show horizontal scrollbar and
99 * *ever* show the vertical one.
100 *
101 * Revision 5.5 1996/07/31 16:28:17 kans
102 * fix to set list value to always scroll to selected item properly
103 *
104 * Revision 5.4 1996/07/03 14:18:53 vakatov
105 * [WIN_MOTIF] <ScrolledList> /two MOTIF quirks/
106 * 1) Had to eliminate the List sizing arguments from the List creation code
107 * as it prevented(why? -- a MOTIF quirk!) any further List re-sizing
108 * with XtVaSetValues()
109 * 2) Added VSB_MapCB() event handler to always (explicitly) fit the vertical
110 * scrollbar to the given limits. Otherwise, the scrollbar outruns the list
111 * boundaries
112 *
113 * Revision 5.3 1996/06/24 18:13:21 vakatov
114 * [WIN_MOTIF] The bad list sizing behaviour under LINUX has been fixed
115 *
116 * Revision 5.2 1996/06/19 20:29:27 vakatov
117 * Implemented for WIN_MOTIF(and added to externals) function Nlm_GetListItem()
118 * to extract arbitrary list item referenced by position
119 *
120 * Revision 5.1 1996/05/31 20:09:16 vakatov
121 * [WIN_MOTIF, WIN_MSWIN] MultiList selection policy rolled back to the
122 * pre-Revision 4.4 state.
123 * Added Nlm_ExtendedList() function to set the list selection policy
124 * to EXTENDED_SELECTION -- as it was for Nlm_MultiList() since Revision 4.4.
125 * [WIN_MAC] still make no difference between EXTENDED and MULTIPLE sel.policy
126 *
127 * Revision 5.0 1996/05/28 13:45:08 ostell
128 * Set to revision 5.0
129 *
130 * Revision 4.8 1996/05/10 13:48:11 vakatov
131 * [WIN_MOTIF] The scrolled list repositioning error is fixed
132 *
133 * Revision 4.7 1996/03/29 15:16:02 vakatov
134 * MSWIN/Nlm_MultiListCommand(), 1st operator: LBN_SELCHANGE -> LBN_DBLCLK
135 *
136 * Revision 4.6 1996/03/02 22:36:38 kans
137 * reduction of X traffic (DV)
138 *
139 * Revision 4.5 1996/02/13 17:24:07 kans
140 * accelerated set position prior to realization (Denis Vakatov)
141 *
142 * Revision 4.4 1996/01/05 20:11:26 smirnov
143 * change type of callback for multilist
144 *
145 * Revision 4.3 1996/01/04 14:54:28 smirnov
146 * AS: new multilist style for X11 and WIN
147 *
148 * Revision 4.2 1995/11/14 13:42:05 kans
149 * fixes to SetListValue (VL)
150 *
151 * Revision 4.1 1995/10/10 19:51:55 kans
152 * *** empty log message ***
153 *
154 * Revision 4.0 1995/07/26 13:51:04 ostell
155 * force revision to 4.0
156 *
157 * Revision 2.15 1995/05/17 15:15:14 kans
158 * added Log line
159 *
160 *
161 * ==========================================================================
162 */
163
164 #include <vibtypes.h>
165 #include <vibprocs.h>
166 #include <vibincld.h>
167
168 #ifdef WIN_MAC
169 # define Nlm_ListTool ListHandle
170 #endif
171
172 #ifdef WIN_MSWIN
173 # define Nlm_ListTool HWND
174 #endif
175
176 #ifdef WIN_MOTIF
177 #define Nlm_ListTool Widget
178 #endif
179
180 typedef struct Nlm_listdata {
181 Nlm_ListTool handle;
182 Nlm_BaR scrollBar;
183 Nlm_Int2 visLines;
184 Nlm_Int2 numItems;
185 Nlm_Int2 offset;
186 } Nlm_ListData;
187
188 typedef struct Nlm_listrec {
189 Nlm_GraphicRec graphicR;
190 Nlm_ListData list;
191 } Nlm_ListRec, PNTR Nlm_LstPtr;
192
193 static Nlm_GphPrcsPtr gphprcsptr = NULL;
194
195 static Nlm_GphPrcsPtr singleProcs;
196 static Nlm_GphPrcsPtr multiProcs;
197
198 static Nlm_LisT recentList = NULL;
199 static Nlm_ListData recentListData;
200
201 #ifdef WIN_MSWIN
202 static WNDPROC lpfnNewListProc = NULL;
203 static WNDPROC lpfnOldListProc = NULL;
204 static Nlm_Boolean handlechar;
205 #endif
206
Nlm_LoadListData(Nlm_LisT l,Nlm_ListTool hdl,Nlm_BaR bar,Nlm_Int2 vis,Nlm_Int2 nitm,Nlm_Int2 off)207 static void Nlm_LoadListData (Nlm_LisT l, Nlm_ListTool hdl,
208 Nlm_BaR bar, Nlm_Int2 vis,
209 Nlm_Int2 nitm, Nlm_Int2 off)
210
211 {
212 Nlm_LstPtr lp;
213 Nlm_ListData PNTR ldptr;
214
215 if (l != NULL) {
216 lp = (Nlm_LstPtr) Nlm_HandLock (l);
217 ldptr = &(lp->list);
218 ldptr->handle = hdl;
219 ldptr->scrollBar = bar;
220 ldptr->visLines = vis;
221 ldptr->numItems = nitm;
222 ldptr->offset = off;
223 Nlm_HandUnlock (l);
224 recentList = NULL;
225 }
226 }
227
Nlm_SetListData(Nlm_LisT l,Nlm_ListData * ldata)228 static void Nlm_SetListData (Nlm_LisT l, Nlm_ListData * ldata)
229
230 {
231 Nlm_LstPtr lp;
232
233 if (l != NULL && ldata != NULL) {
234 lp = (Nlm_LstPtr) Nlm_HandLock (l);
235 lp->list = *ldata;
236 Nlm_HandUnlock (l);
237 recentList = l;
238 recentListData = *ldata;
239 }
240 }
241
Nlm_GetListData(Nlm_LisT l,Nlm_ListData * ldata)242 static void Nlm_GetListData (Nlm_LisT l, Nlm_ListData * ldata)
243
244 {
245 Nlm_LstPtr lp;
246
247 if (l != NULL && ldata != NULL) {
248 if (l == recentList && NLM_RISKY) {
249 *ldata = recentListData;
250 } else {
251 lp = (Nlm_LstPtr) Nlm_HandLock (l);
252 *ldata = lp->list;
253 Nlm_HandUnlock (l);
254 recentList = l;
255 recentListData = *ldata;
256 }
257 }
258 }
259
Nlm_GetListHandle(Nlm_LisT l)260 static Nlm_ListTool Nlm_GetListHandle (Nlm_LisT l)
261
262 {
263 Nlm_ListData ldata;
264
265 Nlm_GetListData (l, &ldata);
266 return ldata.handle;
267 }
268
Nlm_GetListScrollBar(Nlm_LisT l)269 static Nlm_BaR Nlm_GetListScrollBar (Nlm_LisT l)
270
271 {
272 Nlm_ListData ldata;
273
274 Nlm_GetListData (l, &ldata);
275 return ldata.scrollBar;
276 }
277
278
279 #ifndef WIN_MSWIN
Nlm_GetListVisLines(Nlm_LisT l)280 static Nlm_Int2 Nlm_GetListVisLines (Nlm_LisT l)
281
282 {
283 Nlm_ListData ldata;
284
285 Nlm_GetListData (l, &ldata);
286 return ldata.visLines;
287 }
288 #endif
289
Nlm_SetListNumItems(Nlm_LisT l,Nlm_Int2 num)290 static void Nlm_SetListNumItems (Nlm_LisT l, Nlm_Int2 num)
291
292 {
293 Nlm_ListData ldata;
294
295 Nlm_GetListData (l, &ldata);
296 ldata.numItems = num;
297 Nlm_SetListData (l, &ldata);
298 }
299
Nlm_GetListNumItems(Nlm_LisT l)300 static Nlm_Int2 Nlm_GetListNumItems (Nlm_LisT l)
301
302 {
303 Nlm_ListData ldata;
304
305 Nlm_GetListData (l, &ldata);
306 return ldata.numItems;
307 }
308
309 #ifdef WIN_MAC
Nlm_SetListScrollOffset(Nlm_LisT l,Nlm_Int2 off)310 static void Nlm_SetListScrollOffset (Nlm_LisT l, Nlm_Int2 off)
311 {
312 Nlm_ListData ldata;
313 Nlm_GetListData (l, &ldata);
314 ldata.offset = off;
315 Nlm_SetListData (l, &ldata);
316 }
317
Nlm_GetListScrollOffset(Nlm_LisT l)318 static Nlm_Int2 Nlm_GetListScrollOffset (Nlm_LisT l)
319 {
320 Nlm_ListData ldata;
321 Nlm_GetListData (l, &ldata);
322 return ldata.offset;
323 }
324
Nlm_SingleListClick(Nlm_GraphiC l,Nlm_PoinT pt)325 static Nlm_Boolean Nlm_SingleListClick (Nlm_GraphiC l, Nlm_PoinT pt)
326
327 {
328 Nlm_ListTool c;
329 Nlm_Int2 newval;
330 Nlm_Int2 oldval;
331 Nlm_PoinT point;
332 Nlm_PointTool ptool;
333 Nlm_RecT r;
334 Nlm_Boolean rsult;
335 Nlm_BaR sb;
336
337 rsult = FALSE;
338 Nlm_GetRect (l, &r);
339 r.right += Nlm_vScrollBarWidth;
340 if (Nlm_PtInRect (pt, &r)) {
341 r.right -= Nlm_vScrollBarWidth;
342 Nlm_InsetRect (&r, 2, 2);
343 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
344 if (sb != NULL && Nlm_DoClick ((Nlm_GraphiC) sb, pt)) {
345 } else if (Nlm_PtInRect (pt, &r)) {
346 oldval = Nlm_DoGetValue (l);
347 c = Nlm_GetListHandle ((Nlm_LisT) l);
348 Nlm_PoinTToPointTool (pt, &ptool);
349 Nlm_dblClick = (LClick (ptool, Nlm_currentEvent.modifiers, c) != 0);
350 Nlm_MousePosition (&point);
351 if (Nlm_PtInRect (point, &r)) {
352 newval = Nlm_DoGetValue (l);
353 if (oldval != newval || Nlm_dblClick) {
354 Nlm_DoAction (l);
355 }
356 } else {
357 newval = Nlm_DoGetValue (l);
358 if (oldval != newval || Nlm_dblClick) {
359 Nlm_DoAction (l);
360 }
361 }
362 rsult = TRUE;
363 }
364 }
365 return rsult;
366 }
367
Nlm_MultiListClick(Nlm_GraphiC l,Nlm_PoinT pt)368 static Nlm_Boolean Nlm_MultiListClick (Nlm_GraphiC l, Nlm_PoinT pt)
369
370 {
371 Nlm_ListTool c;
372 Nlm_PoinT point;
373 Nlm_PointTool ptool;
374 Nlm_RecT r;
375 Nlm_Boolean rsult;
376 Nlm_BaR sb;
377
378 rsult = FALSE;
379 Nlm_GetRect (l, &r);
380 r.right += Nlm_vScrollBarWidth;
381 if (Nlm_PtInRect (pt, &r)) {
382 r.right -= Nlm_vScrollBarWidth;
383 Nlm_InsetRect (&r, 2, 2);
384 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
385 if (sb != NULL && Nlm_DoClick ((Nlm_GraphiC) sb, pt)) {
386 } else if (Nlm_PtInRect (pt, &r)) {
387 c = Nlm_GetListHandle ((Nlm_LisT) l);
388 Nlm_PoinTToPointTool (pt, &ptool);
389 Nlm_dblClick = (LClick (ptool, Nlm_currentEvent.modifiers, c) != 0);
390 Nlm_MousePosition (&point);
391 if (Nlm_PtInRect (point, &r)) {
392 Nlm_DoAction (l);
393 } else {
394 Nlm_DoAction (l);
395 }
396 rsult = TRUE;
397 }
398 }
399 return rsult;
400 }
401 #endif
402
403 #ifdef WIN_MSWIN
Nlm_SingleListCommand(Nlm_GraphiC l)404 static Nlm_Boolean Nlm_SingleListCommand (Nlm_GraphiC l)
405
406 {
407 Nlm_dblClick = (Nlm_Boolean) (Nlm_currentCode == LBN_DBLCLK);
408 if (Nlm_currentCode == LBN_SELCHANGE || Nlm_dblClick) {
409 Nlm_DoAction (l);
410 }
411 return TRUE;
412 }
413
Nlm_MultiListCommand(Nlm_GraphiC l)414 static Nlm_Boolean Nlm_MultiListCommand (Nlm_GraphiC l)
415
416 {
417 Nlm_dblClick = (Nlm_Boolean) (Nlm_currentCode == LBN_DBLCLK);
418 if (Nlm_currentCode == LBN_SELCHANGE || Nlm_dblClick) {
419 Nlm_DoAction (l);
420 }
421 return TRUE;
422 }
423 #endif
424
425 #ifdef WIN_MOTIF
Nlm_SingleListCallback(Nlm_GraphiC l)426 static void Nlm_SingleListCallback (Nlm_GraphiC l)
427
428 {
429 Nlm_DoAction (l);
430 }
431
Nlm_MultiListCallback(Nlm_GraphiC l)432 static void Nlm_MultiListCallback (Nlm_GraphiC l)
433
434 {
435 Nlm_DoAction (l);
436 }
437 #endif
438
439 #ifdef WIN_MAC
Nlm_DrawList(Nlm_GraphiC l)440 static void Nlm_DrawList (Nlm_GraphiC l)
441
442 {
443 Nlm_ListTool c;
444 Nlm_RecT r;
445 Nlm_BaR sb;
446
447 if (Nlm_GetVisible (l) && Nlm_GetAllParentsVisible (l)) {
448 Nlm_GetRect (l, &r);
449 r.right += Nlm_vScrollBarWidth;
450 if (Nlm_RectInRgn (&r, Nlm_updateRgn)) {
451 Nlm_FrameRect (&r);
452 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
453 if (sb != NULL) {
454 Nlm_DoDraw ((Nlm_GraphiC) sb);
455 }
456 r.right -= Nlm_vScrollBarWidth;
457 c = Nlm_GetListHandle ((Nlm_LisT) l);
458 if (c != NULL) {
459 Nlm_SelectFont (Nlm_systemFont);
460 LSetDrawingMode (TRUE, c);
461 LUpdate ((Nlm_RgnTool) Nlm_updateRgn, c);
462 }
463 }
464 }
465 }
466 #endif
467
Nlm_ShowList(Nlm_GraphiC l,Nlm_Boolean setFlag,Nlm_Boolean savePort)468 static void Nlm_ShowList (Nlm_GraphiC l, Nlm_Boolean setFlag, Nlm_Boolean savePort)
469
470 {
471 Nlm_ListTool c;
472 Nlm_WindoW tempPort;
473 #ifdef WIN_MAC
474 Nlm_BaR sb;
475 #endif
476 #ifdef WIN_MOTIF
477 Widget parent;
478 #endif
479
480 if (setFlag) {
481 Nlm_SetVisible (l, TRUE);
482 }
483 if (Nlm_GetVisible (l) && Nlm_AllParentsButWindowVisible (l)) {
484 tempPort = Nlm_SavePortIfNeeded (l, savePort);
485 c = Nlm_GetListHandle ((Nlm_LisT) l);
486 #ifdef WIN_MAC
487 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
488 if (sb != NULL) {
489 Nlm_DoShow ((Nlm_GraphiC) sb, TRUE, FALSE);
490 }
491 Nlm_DoDraw (l);
492 #endif
493 #ifdef WIN_MSWIN
494 ShowWindow (c, SW_SHOW);
495 UpdateWindow (c);
496 #endif
497 #ifdef WIN_MOTIF
498 parent = XtParent(c);
499 if (parent) {
500 XtManageChild (parent);
501 }
502 XtManageChild (c);
503 #endif
504 Nlm_RestorePort (tempPort);
505 }
506 }
507
Nlm_HideList(Nlm_GraphiC l,Nlm_Boolean setFlag,Nlm_Boolean savePort)508 static void Nlm_HideList (Nlm_GraphiC l, Nlm_Boolean setFlag, Nlm_Boolean savePort)
509
510 {
511 Nlm_ListTool c;
512 Nlm_BaR sb;
513 Nlm_WindoW tempPort;
514 #ifdef WIN_MAC
515 Nlm_RecT r;
516 #endif
517 #ifdef WIN_MOTIF
518 Widget parent;
519 #endif
520
521 if (setFlag) {
522 Nlm_SetVisible (l, FALSE);
523 }
524 tempPort = Nlm_SavePortIfNeeded (l, savePort);
525 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
526 if (sb != NULL) {
527 Nlm_DoHide ((Nlm_GraphiC) sb, TRUE, FALSE);
528 }
529 c = Nlm_GetListHandle ((Nlm_LisT) l);
530 #ifdef WIN_MAC
531 if (Nlm_GetAllParentsVisible (l)) {
532 Nlm_GetRect (l, &r);
533 if (sb != NULL) {
534 r.right += Nlm_vScrollBarWidth;
535 }
536 Nlm_InsetRect (&r, -1, -1);
537 Nlm_EraseRect (&r);
538 Nlm_ValidRect (&r);
539 }
540 #endif
541 #ifdef WIN_MSWIN
542 ShowWindow (c, SW_HIDE);
543 UpdateWindow (c);
544 #endif
545 #ifdef WIN_MOTIF
546 parent = XtParent (c);
547 if (parent) {
548 XtUnmanageChild (parent);
549 }
550 XtUnmanageChild (c);
551 #endif
552 Nlm_RestorePort (tempPort);
553 }
554
Nlm_EnableList(Nlm_GraphiC l,Nlm_Boolean setFlag,Nlm_Boolean savePort)555 static void Nlm_EnableList (Nlm_GraphiC l, Nlm_Boolean setFlag, Nlm_Boolean savePort)
556
557 {
558 Nlm_ListTool c;
559 Nlm_RecT r;
560 Nlm_BaR sb;
561 Nlm_WindoW tempPort;
562 #ifdef WIN_MAC
563 Nlm_Int2 newval;
564 Nlm_Int2 oldval;
565 #endif
566
567 if (setFlag) {
568 Nlm_SetEnabled (l, TRUE);
569 }
570 if (Nlm_GetEnabled (l) && Nlm_GetAllParentsEnabled (l)) {
571 tempPort = Nlm_SavePortIfNeeded (l, savePort);
572 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
573 c = Nlm_GetListHandle ((Nlm_LisT) l);
574 if (sb != NULL) {
575 Nlm_DoEnable ((Nlm_GraphiC) sb, TRUE, FALSE);
576 #ifdef WIN_MAC
577 oldval = Nlm_GetListScrollOffset ((Nlm_LisT) l);
578 newval = Nlm_DoGetValue ((Nlm_GraphiC) sb);
579 if (oldval != newval) {
580 Nlm_SetListScrollOffset ((Nlm_LisT) l, newval);
581 LScroll (0, newval - oldval, c);
582 }
583 #endif
584 if (Nlm_GetVisible (l) && Nlm_GetAllParentsVisible (l)) {
585 Nlm_GetRect (l, &r);
586 Nlm_InsetRect (&r, 1, 1);
587 Nlm_InvalRect (&r);
588 }
589 }
590 #ifdef WIN_MSWIN
591 EnableWindow (c, TRUE);
592 SetWindowRedraw (c, TRUE);
593 #endif
594 #ifdef WIN_MOTIF
595 XtVaSetValues (c, XmNsensitive, TRUE, NULL);
596 #endif
597 Nlm_RestorePort (tempPort);
598 }
599 }
600
Nlm_DisableList(Nlm_GraphiC l,Nlm_Boolean setFlag,Nlm_Boolean savePort)601 static void Nlm_DisableList (Nlm_GraphiC l, Nlm_Boolean setFlag, Nlm_Boolean savePort)
602
603 {
604 Nlm_ListTool c;
605 Nlm_BaR sb;
606 Nlm_WindoW tempPort;
607
608 if (setFlag) {
609 Nlm_SetEnabled (l, FALSE);
610 }
611 tempPort = Nlm_SavePortIfNeeded (l, savePort);
612 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
613 if (sb != NULL) {
614 Nlm_DoDisable ((Nlm_GraphiC) sb, TRUE, FALSE);
615 }
616 c = Nlm_GetListHandle ((Nlm_LisT) l);
617 #ifdef WIN_MSWIN
618 EnableWindow (c, FALSE);
619 SetWindowRedraw (c, FALSE);
620 #endif
621 #ifdef WIN_MOTIF
622 XtVaSetValues (c, XmNsensitive, FALSE, NULL);
623 #endif
624 Nlm_RestorePort (tempPort);
625 }
626
Nlm_RemoveList(Nlm_GraphiC l,Nlm_Boolean savePort)627 static void Nlm_RemoveList (Nlm_GraphiC l, Nlm_Boolean savePort)
628
629 {
630 Nlm_ListTool c;
631 Nlm_WindoW tempPort;
632 #ifdef WIN_MAC
633 Nlm_BaR sb;
634 #endif
635
636 tempPort = Nlm_SavePortIfNeeded (l, savePort);
637 c = Nlm_GetListHandle ((Nlm_LisT) l);
638 #ifdef WIN_MAC
639 if (c != NULL) {
640 LDispose (c);
641 }
642 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
643 if (sb != NULL) {
644 Nlm_DoRemove ((Nlm_GraphiC) sb, FALSE);
645 }
646 #endif
647 #ifdef WIN_MSWIN
648 RemoveProp (c, (LPSTR) "Nlm_VibrantProp");
649 DestroyWindow (c);
650 #endif
651 #ifdef WIN_MOTIF
652 XtDestroyWidget (c);
653 #endif
654 Nlm_RemoveLink (l);
655 recentList = NULL;
656 Nlm_RestorePort (tempPort);
657 }
658
Nlm_ResetList(Nlm_GraphiC l,Nlm_Boolean savePort)659 static void Nlm_ResetList (Nlm_GraphiC l, Nlm_Boolean savePort)
660
661 {
662 Nlm_ListTool c;
663 Nlm_ListData ldata;
664 Nlm_WindoW tempPort;
665 #ifdef WIN_MAC
666 Nlm_Int2 col;
667 Nlm_Boolean doUpdate;
668 Nlm_Boolean parentWindowVisible;
669 Nlm_BaR sb;
670 #endif
671
672 tempPort = Nlm_SavePortIfNeeded (l, savePort);
673 Nlm_GetListData ((Nlm_LisT) l, &ldata);
674 c = ldata.handle;
675 #ifdef WIN_MAC
676 doUpdate = Nlm_GetEnabled ((Nlm_GraphiC) l);
677 parentWindowVisible = Nlm_GetVisible ((Nlm_GraphiC) l) &&
678 Nlm_GetAllParentsVisible ((Nlm_GraphiC) l);
679 LSetDrawingMode (parentWindowVisible && doUpdate, c);
680 LDelColumn (0, 0, c);
681 LDelRow (0, 0, c);
682 col = LAddColumn (1, 0, c);
683 LSetDrawingMode (doUpdate, c);
684 sb = ldata.scrollBar;
685 if (sb != NULL) {
686 Nlm_DoReset ((Nlm_GraphiC) sb, FALSE);
687 }
688 #endif
689 #ifdef WIN_MSWIN
690 ListBox_ResetContent (c);
691 #endif
692 #ifdef WIN_MOTIF
693 XmListSetPos (c, 1);
694 XmListDeleteAllItems (c);
695 #endif
696 ldata.numItems = 0;
697 ldata.offset = 0;
698 Nlm_SetListData ((Nlm_LisT) l, &ldata);
699 Nlm_RestorePort (tempPort);
700 }
701
Nlm_CountListItems(Nlm_GraphiC l)702 static Nlm_Int2 Nlm_CountListItems (Nlm_GraphiC l)
703
704 {
705 return Nlm_GetListNumItems ((Nlm_LisT) l);
706 }
707
708
Nlm_GetListItem(Nlm_LisT l,Nlm_Int2 item,Nlm_CharPtr title,size_t maxsize)709 extern void Nlm_GetListItem (Nlm_LisT l, Nlm_Int2 item,
710 Nlm_CharPtr title, size_t maxsize)
711
712 {
713 Nlm_ListTool c = Nlm_GetListHandle ( l );
714
715 #ifndef WIN_MOTIF
716 Nlm_Char temp [256];
717 #endif
718 #ifdef WIN_MAC
719 Cell cell;
720 Nlm_Int2 len;
721 #endif
722
723 if (maxsize > 0)
724 title[0] = '\0';
725
726 if (item < 1 || maxsize < 1)
727 return;
728
729 #ifdef WIN_MAC
730 cell.h = 0;
731 cell.v = item - 1;
732 len = sizeof (temp);
733 LGetCell (temp, &len, cell, c);
734 if (len < sizeof (temp)) {
735 temp [len] = '\0';
736 }
737 #endif
738
739 #ifdef WIN_MSWIN
740 if (ListBox_GetTextLen (c, item - 1) < sizeof (temp))
741 ListBox_GetText (c, item - 1, temp);
742 #endif
743
744 #ifdef WIN_MOTIF
745 {{
746 int n_item = 0;
747 XmStringTable items = NULL;
748 char *text;
749 XtVaGetValues(c,
750 XmNitemCount, &n_item,
751 XmNitems, &items, NULL);
752 if (item <= n_item &&
753 XmStringGetLtoR(items[item-1], XmSTRING_DEFAULT_CHARSET, &text))
754 {
755 Nlm_StringNCpy_0 (title, text, maxsize);
756 title[maxsize-1] = '\0';
757 }
758
759 return;
760 }}
761 #endif
762
763 #ifndef WIN_MOTIF
764 Nlm_StringNCpy_0 (title, temp, maxsize);
765 #endif
766 }
767
768
769 #ifdef WIN_MAC
Nlm_ClearCellsInGroup(Nlm_LisT l,Nlm_Int2 excpt)770 static void Nlm_ClearCellsInGroup (Nlm_LisT l, Nlm_Int2 excpt)
771
772 {
773 Nlm_ListTool c;
774 Cell cell;
775 Nlm_Int2 count;
776 Nlm_Int2 i;
777
778 c = Nlm_GetListHandle (l);
779 count = Nlm_GetListNumItems (l);
780 i = 1;
781 cell.h = 0;
782 while (i <= count) {
783 if (i != excpt) {
784 cell.v = i - 1;
785 LSetSelect (FALSE, cell, c);
786 }
787 i++;
788 }
789 }
790 #endif
791
Nlm_SetListValue(Nlm_GraphiC l,Nlm_Int2 value,Nlm_Boolean savePort)792 static void Nlm_SetListValue (Nlm_GraphiC l, Nlm_Int2 value, Nlm_Boolean savePort)
793
794 {
795 Nlm_ListTool c;
796 Nlm_WindoW tempPort;
797 #ifdef WIN_MAC
798 Cell cell;
799 Nlm_Int2 delta;
800 Nlm_Int2 newval;
801 Nlm_Int2 num;
802 Nlm_Int2 oldval;
803 Nlm_BaR sb;
804 Nlm_Int2 vis;
805 #endif
806
807 tempPort = Nlm_SavePortIfNeeded (l, savePort);
808 c = Nlm_GetListHandle ((Nlm_LisT) l);
809 #ifdef WIN_MAC
810 if (value > 0) {
811 Nlm_ClearCellsInGroup ((Nlm_LisT) l, value);
812 cell.h = 0;
813 cell.v = value - 1;
814 LSetSelect (TRUE, cell, c);
815 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
816 if (sb != NULL) {
817 oldval = Nlm_DoGetValue ((Nlm_GraphiC) sb);
818 num = Nlm_GetListNumItems ((Nlm_LisT) l);
819 vis = Nlm_GetListVisLines ((Nlm_LisT) l);
820 value--;
821 if (value < oldval) {
822 newval = value;
823 } else if (value < oldval + vis) {
824 newval = oldval;
825 } else if (value <= num - vis) {
826 newval = value;
827 } else {
828 newval = num - vis;
829 }
830 delta = newval - oldval;
831 if (delta != 0) {
832 Nlm_DoSetValue ((Nlm_GraphiC) sb, newval, FALSE);
833 }
834 }
835 } else {
836 Nlm_ClearCellsInGroup ((Nlm_LisT) l, 0);
837 }
838 #endif
839 #ifdef WIN_MSWIN
840 if (value > 0) {
841 ListBox_SetCurSel (c, value - 1);
842 } else {
843 ListBox_SetCurSel (c, -1);
844 }
845 #endif
846 #ifdef WIN_MOTIF
847 if (value > 0) {
848 /* VL */
849 int top;
850 Nlm_Int2 vis;
851 XtVaGetValues (c, XmNtopItemPosition, &top, NULL);
852 if (value<=top) XmListSetPos (c, value);
853 else {
854 vis = Nlm_GetListVisLines ((Nlm_LisT) l);
855 if (value>=top+vis) XmListSetBottomPos (c, value);
856 }
857 XmListSelectPos (c, (int) value, FALSE);
858 } else {
859 XmListDeselectAllItems (c);
860 }
861 #endif
862 Nlm_RestorePort (tempPort);
863 }
864
Nlm_GetListValue(Nlm_GraphiC l)865 static Nlm_Int2 Nlm_GetListValue (Nlm_GraphiC l)
866
867 {
868 Nlm_ListTool c;
869 Nlm_Int2 value;
870 #ifdef WIN_MAC
871 Cell cell;
872 Nlm_Int2 count;
873 Nlm_Boolean found;
874 Nlm_Int2 i;
875 #endif
876 #ifdef WIN_MOTIF
877 int count;
878 int *position;
879 #endif
880
881 value = 0;
882 c = Nlm_GetListHandle ((Nlm_LisT) l);
883 #ifdef WIN_MAC
884 count = Nlm_GetListNumItems ((Nlm_LisT) l);
885 i = 0;
886 cell.h = 0;
887 found = FALSE;
888 while (i <= count && ! found) {
889 i++;
890 cell.v = i - 1;
891 found = LGetSelect (FALSE, &cell, c);
892 }
893 if (found) {
894 value = i;
895 }
896 #endif
897 #ifdef WIN_MSWIN
898 value = (Nlm_Int2) ListBox_GetCurSel (c) + 1;
899 #endif
900 #ifdef WIN_MOTIF
901 if (XmListGetSelectedPos (c, &position, &count)) {
902 if (position != NULL) {
903 value = *position;
904 XtFree ((char *) position);
905 } else {
906 value = 0;
907 }
908 } else {
909 value = 0;
910 }
911 #endif
912 return value;
913 }
914
Nlm_GetListStatus(Nlm_GraphiC l,Nlm_Int2 item)915 static Nlm_Boolean Nlm_GetListStatus (Nlm_GraphiC l, Nlm_Int2 item)
916
917 {
918 Nlm_ListTool c;
919 Nlm_Boolean value;
920 #ifdef WIN_MAC
921 Cell cell;
922 Nlm_Int2 count;
923 #endif
924 #ifdef WIN_MSWIN
925 Nlm_Int2 count;
926 #endif
927 #ifdef WIN_MOTIF
928 int count;
929 int *position;
930 #endif
931
932 value = FALSE;
933 c = Nlm_GetListHandle ((Nlm_LisT) l);
934 count = Nlm_GetListNumItems ((Nlm_LisT) l);
935 if (item > 0 && item <= count) {
936 #ifdef WIN_MAC
937 cell.h = 0;
938 cell.v = item - 1;
939 value = LGetSelect (FALSE, &cell, c);
940 #endif
941 #ifdef WIN_MSWIN
942 value = (Nlm_Boolean) (ListBox_GetSel (c, item - 1) != 0);
943 #endif
944 #ifdef WIN_MOTIF
945 if (XmListGetSelectedPos (c, &position, &count)) {
946 if (position != NULL) {
947 count--;
948 while (count >= 0 && (! value)) {
949 if (position [count] == item) {
950 value = TRUE;
951 }
952 count--;
953 }
954 XtFree ((char *) position);
955 }
956 }
957 #endif
958 }
959 return value;
960 }
961
Nlm_SetListStatus(Nlm_GraphiC l,Nlm_Int2 item,Nlm_Boolean value,Nlm_Boolean savePort)962 static void Nlm_SetListStatus (Nlm_GraphiC l, Nlm_Int2 item,
963 Nlm_Boolean value, Nlm_Boolean savePort)
964
965 {
966 Nlm_ListTool c;
967 Nlm_WindoW tempPort;
968 #ifdef WIN_MAC
969 Cell cell;
970 #endif
971
972 if (item > 0) {
973 tempPort = Nlm_SavePortIfNeeded (l, savePort);
974 c = Nlm_GetListHandle ((Nlm_LisT) l);
975 #ifdef WIN_MAC
976 cell.h = 0;
977 cell.v = item - 1;
978 LSetSelect (value, cell, c);
979 #endif
980 #ifdef WIN_MSWIN
981 ListBox_SetSel (c, value, item - 1);
982 #endif
983 #ifdef WIN_MOTIF
984 if (value) {
985 if (! Nlm_GetListStatus (l, item)) {
986 XmListSelectPos (c, (int) item, FALSE); /* V.L. */
987 }
988 } else {
989 if (Nlm_GetListStatus (l, item)) {
990 XmListDeselectPos (c, (int) item);
991 }
992 }
993 #endif
994 Nlm_RestorePort (tempPort);
995 }
996 }
997
Nlm_SetListOffset(Nlm_GraphiC l,Nlm_Int2 horiz,Nlm_Int2 vert,Nlm_Boolean savePort)998 static void Nlm_SetListOffset (Nlm_GraphiC l, Nlm_Int2 horiz,
999 Nlm_Int2 vert, Nlm_Boolean savePort)
1000
1001 {
1002 #ifdef WIN_MAC
1003 Nlm_BaR sb;
1004
1005 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
1006 if (sb != NULL) {
1007 Nlm_DoSetValue ((Nlm_GraphiC) sb, vert, savePort);
1008 }
1009 #endif
1010 #ifdef WIN_MSWIN
1011 Nlm_ListTool c;
1012
1013 c = Nlm_GetListHandle ((Nlm_LisT) l);
1014 ListBox_SetTopIndex (c, vert);
1015 #endif
1016 #ifdef WIN_MOTIF
1017 Nlm_ListTool c;
1018
1019 c = Nlm_GetListHandle ((Nlm_LisT) l);
1020 XmListSetPos (c, vert);
1021 #endif
1022 }
1023
Nlm_GetListOffset(Nlm_GraphiC l,Nlm_Int2Ptr horiz,Nlm_Int2Ptr vert)1024 static void Nlm_GetListOffset (Nlm_GraphiC l, Nlm_Int2Ptr horiz, Nlm_Int2Ptr vert)
1025
1026 {
1027 #ifdef WIN_MAC
1028 Nlm_BaR sb;
1029 Nlm_Int2 rsult;
1030
1031 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
1032 rsult = 0;
1033 if (sb != NULL) {
1034 rsult = Nlm_DoGetValue ((Nlm_GraphiC) sb);
1035 }
1036 if (vert != NULL) {
1037 *vert = rsult;
1038 }
1039 #endif
1040 #ifdef WIN_MSWIN
1041 Nlm_ListTool c;
1042
1043 c = Nlm_GetListHandle ((Nlm_LisT) l);
1044 if (vert != NULL) {
1045 *vert = (Nlm_Int2) ListBox_GetTopIndex (c);
1046 }
1047 #endif
1048 #ifdef WIN_MOTIF
1049 Nlm_ListTool c;
1050 int top;
1051
1052 c = Nlm_GetListHandle ((Nlm_LisT) l);
1053 if (vert != NULL) {
1054 XtVaGetValues (c, XmNtopItemPosition, &top, NULL);
1055 *vert = (Nlm_Int2) top;
1056 }
1057 #endif
1058 }
1059
1060 #ifdef WIN_MAC
Nlm_ScrollAction(Nlm_BaR sb,Nlm_GraphiC l,Nlm_Int2 newval,Nlm_Int2 oldval)1061 static void Nlm_ScrollAction (Nlm_BaR sb, Nlm_GraphiC l,
1062 Nlm_Int2 newval, Nlm_Int2 oldval)
1063
1064 {
1065 Nlm_Int2 delta;
1066 Nlm_ListTool h;
1067 Nlm_ListData ldata;
1068 Nlm_RecT r;
1069 Nlm_Int2 vis;
1070 Nlm_WindoW tempPort;
1071
1072 tempPort = Nlm_SavePort (l);
1073 Nlm_GetListData ((Nlm_LisT) l, &ldata);
1074 vis = ldata.visLines;
1075 h = ldata.handle;
1076 ldata.offset = newval;
1077 Nlm_SetListData ((Nlm_LisT) l, &ldata);
1078 delta = oldval - newval;
1079 if (oldval != newval) {
1080 Nlm_SelectFont (Nlm_systemFont);
1081 LScroll (0, -delta, h);
1082 } else if (Nlm_GetVisible (l) && Nlm_GetAllParentsVisible (l)) {
1083 Nlm_GetRect (l, &r);
1084 Nlm_InsetRect (&r, 1, 1);
1085 Nlm_InvalRect (&r);
1086 }
1087 Nlm_RestorePort (tempPort);
1088 }
1089 #endif
1090
1091 #ifdef WIN_MAC
Nlm_InvalList(Nlm_GraphiC l)1092 static void Nlm_InvalList (Nlm_GraphiC l)
1093
1094 {
1095 Nlm_RecT r;
1096
1097 if (Nlm_GetVisible (l) && Nlm_GetAllParentsVisible (l)) {
1098 Nlm_GetRect (l, &r);
1099 r.right += Nlm_vScrollBarWidth;
1100 Nlm_InsetRect (&r, -1, -1);
1101 Nlm_InvalRect (&r);
1102 }
1103 }
1104 #endif
1105
1106
Nlm_SetListPosition(Nlm_GraphiC l,Nlm_RectPtr r,Nlm_Boolean savePort,Nlm_Boolean force)1107 static void Nlm_SetListPosition (Nlm_GraphiC l, Nlm_RectPtr r,
1108 Nlm_Boolean savePort, Nlm_Boolean force)
1109 {
1110 Nlm_ListTool c;
1111 Nlm_RecT oldRect;
1112 Nlm_WindoW tempPort;
1113 #ifndef WIN_MOTIF
1114 Nlm_RecT lr;
1115 #endif
1116 #ifdef WIN_MAC
1117 Nlm_PoinT csize;
1118 ListPtr lp;
1119 Nlm_BaR sb;
1120 #endif
1121 Nlm_Boolean is_realized;
1122
1123 if (r == NULL) return;
1124
1125 Nlm_DoGetPosition (l, &oldRect);
1126 if (!force && Nlm_EqualRect (r, &oldRect)) return;
1127
1128 is_realized = Nlm_GetRealized( l );
1129 tempPort = Nlm_SavePortIfNeeded (l, savePort);
1130 c = Nlm_GetListHandle ((Nlm_LisT) l);
1131
1132 #ifdef WIN_MAC
1133 if ( is_realized )
1134 Nlm_InvalList (l);
1135 lr = *r;
1136 lr.right -= Nlm_vScrollBarWidth;
1137 Nlm_SetRect (l, &lr);
1138 if ( is_realized )
1139 {
1140 Nlm_InsetRect (&lr, 2, 2);
1141 HLock ((Handle) c);
1142 lp = (ListPtr) *((Handle) c);
1143 Nlm_RecTToRectTool (&lr, &(lp->rView));
1144 Nlm_PointToolToPoinT (lp->cellSize, &csize);
1145 csize.x = lr.right - lr.left;
1146 Nlm_PoinTToPointTool (csize, &(lp->cellSize));
1147 HUnlock ((Handle) c);
1148 Nlm_InvalList (l);
1149 }
1150
1151 sb = Nlm_GetListScrollBar ((Nlm_LisT) l);
1152 if (sb != NULL) {
1153 Nlm_GetRect (l, &lr);
1154 lr.left = lr.right;
1155 lr.right += Nlm_vScrollBarWidth;
1156 Nlm_DoSetPosition ((Nlm_GraphiC) sb, &lr, FALSE, force);
1157 }
1158 #endif
1159 #ifdef WIN_MSWIN
1160 lr = *r;
1161
1162 MoveWindow (c, lr.left, lr.top, lr.right - lr.left, lr.bottom - lr.top, TRUE);
1163 lr.right -= Nlm_vScrollBarWidth;
1164 Nlm_SetRect (l, &lr);
1165 UpdateWindow (c);
1166 #endif
1167 #ifdef WIN_MOTIF
1168 XtVaSetValues (XtParent( c ),
1169 XmNx, (Position) r->left,
1170 XmNy, (Position) r->top,
1171 XmNwidth, (Dimension) (r->right - r->left),
1172 NULL);
1173 XtVaSetValues (c,
1174 XmNheight, (Dimension) (r->bottom - r->top - 1),
1175 NULL);
1176 Nlm_SetRect (l, r);
1177 #endif
1178
1179 Nlm_RestorePort (tempPort);
1180 }
1181
1182
Nlm_GetListPosition(Nlm_GraphiC l,Nlm_RectPtr r)1183 static void Nlm_GetListPosition (Nlm_GraphiC l, Nlm_RectPtr r)
1184
1185 {
1186 Nlm_RecT lr;
1187
1188 if (r != NULL) {
1189 Nlm_GetRect (l, &lr);
1190 #ifndef WIN_MOTIF
1191 lr.right += Nlm_vScrollBarWidth;
1192 #endif
1193 *r = lr;
1194 }
1195 }
1196
1197 #ifdef WIN_MSWIN
1198 /* Message cracker functions */
1199
MyCls_OnChar(HWND hwnd,UINT ch,int cRepeat)1200 static void MyCls_OnChar (HWND hwnd, UINT ch, int cRepeat)
1201
1202 {
1203 Nlm_LisT l;
1204
1205 l = (Nlm_LisT) GetProp (hwnd, (LPSTR) "Nlm_VibrantProp");
1206 handlechar = FALSE;
1207 if (ch == '\t') {
1208 Nlm_DoSendFocus ((Nlm_GraphiC) l, (Nlm_Char) ch);
1209 } else if (ch == '\n' || ch == '\r') {
1210 Nlm_DoSendFocus ((Nlm_GraphiC) l, (Nlm_Char) ch);
1211 } else {
1212 handlechar = TRUE;
1213 }
1214 }
1215
ListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)1216 static LRESULT CALLBACK EXPORT ListProc (HWND hwnd, UINT message,
1217 WPARAM wParam, LPARAM lParam)
1218
1219 {
1220 Nlm_LisT l;
1221 LRESULT rsult;
1222 HDC tempHDC;
1223 HWND tempHWnd;
1224
1225 if (Nlm_VibrantDisabled ()) {
1226 return CallWindowProc (lpfnOldListProc, hwnd, message, wParam, lParam);
1227 }
1228
1229 rsult = 0;
1230 tempHWnd = Nlm_currentHWnd;
1231 tempHDC = Nlm_currentHDC;
1232 l = (Nlm_LisT) GetProp (hwnd, (LPSTR) "Nlm_VibrantProp");
1233 Nlm_theWindow = Nlm_GetParentWindow ((Nlm_GraphiC) l);
1234 Nlm_currentHWnd = GetParent (hwnd);
1235 Nlm_currentHDC = Nlm_ParentWindowPort ((Nlm_GraphiC) l);
1236 Nlm_currentWindowTool = hwnd;
1237 Nlm_currentKey = '\0';
1238 Nlm_currentWParam = wParam;
1239 Nlm_currentLParam = lParam;
1240 Nlm_cmmdKey = FALSE;
1241 Nlm_ctrlKey = FALSE;
1242 Nlm_optKey = FALSE;
1243 Nlm_shftKey = FALSE;
1244 Nlm_dblClick = FALSE;
1245
1246 switch (message) {
1247 case WM_CHAR:
1248 HANDLE_WM_CHAR (hwnd, wParam, lParam, MyCls_OnChar);
1249 if (handlechar) {
1250 rsult = CallWindowProc (lpfnOldListProc, hwnd, message, wParam, lParam);
1251 }
1252 break;
1253 default:
1254 rsult = CallWindowProc (lpfnOldListProc, hwnd, message, wParam, lParam);
1255 break;
1256 }
1257 Nlm_currentHWnd = tempHWnd;
1258 Nlm_currentHDC = tempHDC;
1259 Nlm_currentWindowTool = tempHWnd;
1260 return rsult;
1261 }
1262 #endif
1263
1264 #ifdef WIN_MOTIF
Nlm_ListCallback(Widget w,XtPointer client_data,XtPointer call_data)1265 static void Nlm_ListCallback (Widget w, XtPointer client_data, XtPointer call_data)
1266
1267 {
1268 Nlm_GraphiC l;
1269
1270 Nlm_dblClick = FALSE;
1271 l = (Nlm_GraphiC) client_data;
1272 Nlm_DoCallback (l);
1273 }
1274
Nlm_DoubleCallback(Widget w,XtPointer client_data,XtPointer call_data)1275 static void Nlm_DoubleCallback (Widget w, XtPointer client_data, XtPointer call_data)
1276
1277 {
1278 Nlm_GraphiC l;
1279
1280 Nlm_dblClick = TRUE;
1281 l = (Nlm_GraphiC) client_data;
1282 Nlm_DoCallback (l);
1283 }
1284 #endif
1285
1286
1287 typedef enum
1288 {
1289 SINGLE,
1290 MULTIPLE,
1291 EXTENDED
1292 } Nlm_enumListPolicy;
1293
1294
Nlm_NewList(Nlm_LisT l,Nlm_Int2 width,Nlm_Int2 height,Nlm_Int2 vis,Nlm_Char flags,Nlm_Uint4 style,Nlm_enumListPolicy policy,Nlm_LstActnProc actn)1295 static void Nlm_NewList (Nlm_LisT l, Nlm_Int2 width,
1296 Nlm_Int2 height, Nlm_Int2 vis,
1297 Nlm_Char flags, Nlm_Uint4 style,
1298 Nlm_enumListPolicy policy, Nlm_LstActnProc actn)
1299 {
1300 Nlm_ListTool c;
1301 Nlm_RecT r;
1302 Nlm_BaR sb;
1303 Nlm_WindowTool wptr;
1304 #ifdef WIN_MAC
1305 Nlm_PoinT csize;
1306 Nlm_PointTool cstool;
1307 Nlm_RecT db;
1308 Nlm_RectTool dbtool;
1309 ListPtr lp;
1310 Nlm_RectTool rtool;
1311 #endif
1312 #ifdef WIN_MOTIF
1313 Cardinal n;
1314 Arg wargs [15];
1315 #endif
1316 #ifdef WIN_MSWIN
1317 Nlm_FntPtr fntptr;
1318 #endif
1319
1320
1321 Nlm_GetRect ((Nlm_GraphiC) l, &r);
1322 wptr = Nlm_ParentWindowPtr ((Nlm_GraphiC) l);
1323
1324 #ifdef WIN_MAC
1325 r.left = r.right;
1326 r.right += Nlm_vScrollBarWidth;
1327 sb = Nlm_VertScrollBar ((Nlm_GraphiC) l, &r, Nlm_ScrollAction);
1328 Nlm_DoSetRange ((Nlm_GraphiC) sb, vis - 1, vis - 1, 0, FALSE);
1329 Nlm_GetRect ((Nlm_GraphiC) l, &r);
1330 Nlm_InsetRect (&r, 2, 2);
1331 Nlm_LoadRect (&db, 0, 0, 1, 0);
1332 csize.x = width;
1333 csize.y = height;
1334 Nlm_PoinTToPointTool (csize, &cstool);
1335 Nlm_RecTToRectTool (&r, &rtool);
1336 Nlm_RecTToRectTool (&db, &dbtool);
1337 c = LNew (&rtool, &dbtool, cstool, 0, wptr, TRUE, FALSE, FALSE, FALSE);
1338 HLock ((Handle) c);
1339 lp = (ListPtr) *((Handle) c);
1340 lp->selFlags = flags;
1341 HUnlock ((Handle) c);
1342 LSetDrawingMode (TRUE, c);
1343 Nlm_LoadListData (l, c, sb, vis, 0, 0);
1344 #endif
1345 #ifdef WIN_MSWIN
1346 sb = NULL;
1347 r.right += Nlm_vScrollBarWidth;
1348 c = CreateWindow ("Listbox", "", WS_CHILD | style,
1349 r.left, r.top, r.right - r.left,
1350 r.bottom - r.top, wptr, 0,
1351 Nlm_currentHInst, NULL);
1352 if (c != NULL) {
1353 SetProp (c, (LPSTR) "Nlm_VibrantProp", (Nlm_HandleTool) l);
1354 }
1355 Nlm_LoadListData (l, c, sb, vis, 0, 0);
1356 if (lpfnNewListProc == NULL) {
1357 lpfnNewListProc = (WNDPROC) MakeProcInstance ((FARPROC) ListProc, Nlm_currentHInst);
1358 }
1359 if (lpfnOldListProc == NULL) {
1360 lpfnOldListProc = (WNDPROC) GetWindowLongPtr (c, GWLP_WNDPROC);
1361 } else if (lpfnOldListProc != (WNDPROC) GetWindowLongPtr (c, GWLP_WNDPROC)) {
1362 Nlm_Message (MSG_ERROR, "ListProc subclass error");
1363 }
1364 SetWindowLongPtr (c, GWLP_WNDPROC, (LONG_PTR) lpfnNewListProc);
1365 fntptr = (Nlm_FntPtr) Nlm_HandLock (Nlm_systemFont);
1366 SetWindowFont(c, fntptr->handle, FALSE);
1367 Nlm_HandUnlock(Nlm_systemFont);
1368 #endif
1369 #ifdef WIN_MOTIF
1370 sb = NULL;
1371 n = 0;
1372 /*
1373 XtSetArg (wargs [n], XmNx, (Position) r.left); n++;
1374 XtSetArg (wargs [n], XmNy, (Position) r.top); n++;
1375 XtSetArg (wargs [n], XmNwidth, (Dimension) (r.right - r.left)); n++;
1376 XtSetArg (wargs [n], XmNheight, (Dimension) (r.bottom - r.top)); n++;
1377 */
1378 XtSetArg (wargs [n], XmNmarginHeight, 0); n++;
1379 XtSetArg (wargs [n], XmNmarginWidth, 0); n++;
1380 XtSetArg (wargs [n], XmNborderWidth, (Dimension) 0); n++;
1381 XtSetArg (wargs [n], XmNvisibleItemCount, (int) vis); n++;
1382 switch ( policy )
1383 {
1384 case SINGLE:
1385 XtSetArg (wargs [n], XmNselectionPolicy, XmBROWSE_SELECT); n++;
1386 break;
1387 case MULTIPLE:
1388 XtSetArg (wargs [n], XmNselectionPolicy, XmMULTIPLE_SELECT); n++;
1389 break;
1390 case EXTENDED:
1391 XtSetArg (wargs [n], XmNselectionPolicy, XmEXTENDED_SELECT); n++;
1392 break;
1393 }
1394
1395 XtSetArg (wargs [n], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); n++;
1396 XtSetArg (wargs [n], XmNscrollBarDisplayPolicy, XmSTATIC); n++;
1397
1398 c = XmCreateScrolledList (wptr, (String) "", wargs, n);
1399
1400 switch ( policy )
1401 {
1402 case SINGLE:
1403 XtAddCallback(c, XmNbrowseSelectionCallback, Nlm_ListCallback,
1404 (XtPointer) l);
1405 break;
1406 case MULTIPLE:
1407 XtAddCallback(c, XmNmultipleSelectionCallback, Nlm_ListCallback,
1408 (XtPointer) l);
1409 break;
1410 case EXTENDED:
1411 XtAddCallback(c, XmNextendedSelectionCallback, Nlm_ListCallback,
1412 (XtPointer) l);
1413 break;
1414 }
1415 XtAddCallback(c, XmNdefaultActionCallback, Nlm_DoubleCallback,
1416 (XtPointer) l);
1417
1418 XtVaSetValues(XtParent(c), XmNspacing, (Dimension)0, NULL);
1419
1420 {{
1421 Widget hsb;
1422 XtVaGetValues(XtParent(c), XmNhorizontalScrollBar, &hsb, NULL);
1423 XtVaSetValues(hsb, XmNheight, (Dimension)1, NULL);
1424 #ifdef LESSTIF_VERSION
1425 /* widget of width 0 causes LessTif to complain - why do this? */
1426 XtVaSetValues(hsb, XmNwidth, (Dimension)1, NULL);
1427 #else
1428 XtVaSetValues(hsb, XmNwidth, (Dimension)0, NULL);
1429 #endif
1430 XtVaSetValues(hsb, XmNborderWidth, (Dimension)0, NULL);
1431 XtVaSetValues(hsb, XmNmappedWhenManaged, (Boolean)FALSE, NULL);
1432 }}
1433
1434 {{
1435 Dimension _height;
1436 XtVaGetValues(c, XmNheight, &_height, NULL);
1437 r.bottom = r.top + _height + 1;
1438 Nlm_SetRect((Nlm_GraphiC)l, &r);
1439 }}
1440
1441 XtManageChild (c);
1442 Nlm_LoadListData (l, c, sb, vis, 0, 0);
1443 #endif
1444
1445 Nlm_LoadAction ((Nlm_GraphiC) l, (Nlm_ActnProc) actn);
1446 }
1447
1448
Nlm_CommonList(Nlm_GrouP prnt,Nlm_Int2 width,Nlm_Int2 height,Nlm_GphPrcs PNTR classPtr,Nlm_Char flags,Nlm_Uint4 style,Nlm_enumListPolicy policy,Nlm_LstActnProc actn)1449 static Nlm_LisT Nlm_CommonList (Nlm_GrouP prnt, Nlm_Int2 width,
1450 Nlm_Int2 height, Nlm_GphPrcs PNTR classPtr,
1451 Nlm_Char flags, Nlm_Uint4 style,
1452 Nlm_enumListPolicy policy,
1453 Nlm_LstActnProc actn)
1454 {
1455 Nlm_Int2 dwid;
1456 Nlm_LisT l;
1457 Nlm_Int2 lhgt;
1458 Nlm_PoinT npt;
1459 Nlm_RecT r;
1460 Nlm_WindoW tempPort;
1461
1462 l = NULL;
1463 if (prnt != NULL) {
1464 tempPort = Nlm_SavePort ((Nlm_GraphiC) prnt);
1465 Nlm_GetNextPosition ((Nlm_GraphiC) prnt, &npt);
1466 Nlm_SelectFont (Nlm_systemFont);
1467 dwid = width * Nlm_stdCharWidth;
1468 lhgt = height * Nlm_stdLineHeight;
1469 Nlm_LoadRect(&r, npt.x, npt.y,
1470 (Nlm_Int2)(npt.x+dwid+4), (Nlm_Int2)(npt.y+lhgt));
1471 #ifdef WIN_MAC
1472 r.bottom += 4;
1473 #endif
1474 #ifdef WIN_MSWIN
1475 r.bottom += Nlm_stdDescent - 1;
1476 #endif
1477 #ifdef WIN_MOTIF
1478 r.right += Nlm_vScrollBarWidth;
1479 #endif
1480 l = (Nlm_LisT) Nlm_CreateLink ((Nlm_GraphiC) prnt, &r,
1481 sizeof (Nlm_ListRec), classPtr);
1482 if (l != NULL) {
1483 Nlm_NewList (l, dwid, Nlm_stdLineHeight, height, flags, style, policy,
1484 actn);
1485 #ifdef WIN_MOTIF
1486 Nlm_GetRect((Nlm_GraphiC)l, &r);
1487 #else
1488 r.right += Nlm_vScrollBarWidth;
1489 #endif
1490 #ifdef WIN_MSWIN
1491 r.bottom += 4;
1492 #endif
1493 Nlm_DoAdjustPrnt ((Nlm_GraphiC) l, &r, TRUE, FALSE);
1494 Nlm_DoShow ((Nlm_GraphiC) l, TRUE, FALSE);
1495 }
1496 Nlm_RestorePort (tempPort);
1497 }
1498 return l;
1499 }
1500
Nlm_SingleList(Nlm_GrouP prnt,Nlm_Int2 width,Nlm_Int2 height,Nlm_LstActnProc actn)1501 extern Nlm_LisT Nlm_SingleList (Nlm_GrouP prnt, Nlm_Int2 width,
1502 Nlm_Int2 height, Nlm_LstActnProc actn)
1503
1504 {
1505 Nlm_LisT l;
1506
1507 l = NULL;
1508 #ifdef WIN_MAC
1509 l = Nlm_CommonList (prnt, width, height, singleProcs, '\270', 0, SINGLE,
1510 actn);
1511 #endif
1512 #ifdef WIN_MSWIN
1513 l = Nlm_CommonList (prnt, width, height, singleProcs, '\0',
1514 LBS_NOTIFY | WS_VSCROLL | WS_BORDER |
1515 LBS_NOINTEGRALHEIGHT, SINGLE, actn);
1516 #endif
1517 #ifdef WIN_MOTIF
1518 l = Nlm_CommonList (prnt, width, height, singleProcs, '\0', 0, SINGLE, actn);
1519 #endif
1520 return l;
1521 }
1522
Nlm_MultiList(Nlm_GrouP prnt,Nlm_Int2 width,Nlm_Int2 height,Nlm_LstActnProc actn)1523 extern Nlm_LisT Nlm_MultiList (Nlm_GrouP prnt, Nlm_Int2 width,
1524 Nlm_Int2 height, Nlm_LstActnProc actn)
1525
1526 {
1527 Nlm_LisT l;
1528
1529 l = NULL;
1530 #ifdef WIN_MAC
1531 l = Nlm_CommonList (prnt, width, height, multiProcs, '\124', 0, MULTIPLE,
1532 actn);
1533 #endif
1534 #ifdef WIN_MSWIN
1535 l = Nlm_CommonList (prnt, width, height, multiProcs, '\0',
1536 LBS_NOTIFY | WS_VSCROLL | WS_BORDER |
1537 LBS_NOINTEGRALHEIGHT | LBS_MULTIPLESEL, MULTIPLE, actn);
1538 #endif
1539 #ifdef WIN_MOTIF
1540 l = Nlm_CommonList (prnt, width, height, multiProcs, '\0', 0, MULTIPLE,
1541 actn);
1542 #endif
1543 return l;
1544 }
1545
1546
Nlm_ExtendedList(Nlm_GrouP prnt,Nlm_Int2 width,Nlm_Int2 height,Nlm_LstActnProc actn)1547 extern Nlm_LisT Nlm_ExtendedList (Nlm_GrouP prnt, Nlm_Int2 width,
1548 Nlm_Int2 height, Nlm_LstActnProc actn)
1549
1550 {
1551 Nlm_LisT l;
1552
1553 l = NULL;
1554 #ifdef WIN_MAC
1555 l = Nlm_CommonList (prnt, width, height, multiProcs, '\124', 0, EXTENDED,
1556 actn);
1557 #endif
1558 #ifdef WIN_MSWIN
1559 l = Nlm_CommonList (prnt, width, height, multiProcs, '\0',
1560 LBS_NOTIFY | WS_VSCROLL | WS_BORDER |
1561 LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL, EXTENDED, actn);
1562 #endif
1563 #ifdef WIN_MOTIF
1564 l = Nlm_CommonList (prnt, width, height, multiProcs, '\0', 0, EXTENDED,
1565 actn);
1566 #endif
1567 return l;
1568 }
1569
1570
Nlm_ListItem(Nlm_LisT l,Nlm_CharPtr title)1571 extern void Nlm_ListItem (Nlm_LisT l, Nlm_CharPtr title)
1572
1573 {
1574 Nlm_ListTool c;
1575 Nlm_Int2 num;
1576 Nlm_WindoW tempPort;
1577 #ifdef WIN_MAC
1578 Cell cell;
1579 Nlm_Int2 count;
1580 Nlm_Boolean doUpdate;
1581 Nlm_Int2 len;
1582 Nlm_Boolean parentWindowVisible;
1583 Nlm_Int2 row;
1584 Nlm_BaR sb;
1585 Nlm_Int2 vis;
1586 Nlm_Int2 visDelta;
1587 #endif
1588 #ifdef WIN_MOTIF
1589 XmString string;
1590 #endif
1591
1592 if (l != NULL) {
1593 tempPort = Nlm_SavePortIfNeeded ((Nlm_GraphiC) l, TRUE);
1594 c = Nlm_GetListHandle (l);
1595 #ifdef WIN_MAC
1596 doUpdate = Nlm_GetEnabled ((Nlm_GraphiC) l);
1597 parentWindowVisible = Nlm_GetVisible ((Nlm_GraphiC) l) &&
1598 Nlm_GetAllParentsVisible ((Nlm_GraphiC) l);
1599 Nlm_SelectFont (Nlm_systemFont);
1600 LSetDrawingMode (parentWindowVisible && doUpdate, c);
1601 count = Nlm_GetListNumItems (l);
1602 row = LAddRow (1, count, c);
1603 cell.h = 0;
1604 cell.v = row;
1605 num = Nlm_GetListNumItems (l);
1606 num++;
1607 Nlm_SetListNumItems (l, num);
1608 len = (Nlm_Int2) Nlm_StringLen (title);
1609 LSetCell (title, len, cell, c);
1610 LSetDrawingMode (TRUE, c);
1611 vis = Nlm_GetListVisLines (l);
1612 visDelta = num - vis;
1613 if (visDelta > 0) {
1614 sb = Nlm_GetListScrollBar (l);
1615 if (sb != NULL) {
1616 Nlm_DoSetRange ((Nlm_GraphiC) sb, vis - 1, vis - 1, visDelta, FALSE);
1617 }
1618 }
1619 #endif
1620 #ifdef WIN_MSWIN
1621 ListBox_AddString (c, title);
1622 num = Nlm_GetListNumItems (l);
1623 num++;
1624 Nlm_SetListNumItems (l, num);
1625 #endif
1626 #ifdef WIN_MOTIF
1627 string = XmStringCreateSimple (title);
1628 XmListAddItemUnselected (c, string, 0);
1629 XmStringFree (string);
1630 num = Nlm_GetListNumItems (l);
1631 num++;
1632 Nlm_SetListNumItems (l, num);
1633 #endif
1634 Nlm_RestorePort (tempPort);
1635 }
1636 }
1637
Nlm_FreeLists(void)1638 extern void Nlm_FreeLists (void)
1639
1640 {
1641 gphprcsptr = (Nlm_GphPrcsPtr) Nlm_MemFree (gphprcsptr);
1642 }
1643
1644
Nlm_GetListTitle(Nlm_GraphiC l,Nlm_Int2 item,Nlm_CharPtr title,size_t maxsize)1645 static void Nlm_GetListTitle (Nlm_GraphiC l, Nlm_Int2 item,
1646 Nlm_CharPtr title, size_t maxsize)
1647 {
1648 if (maxsize > 0)
1649 title[0] = '\0';
1650 }
1651
1652
Nlm_InitLists(void)1653 extern void Nlm_InitLists (void)
1654
1655 {
1656 gphprcsptr = (Nlm_GphPrcsPtr) Nlm_MemNew (sizeof (Nlm_GphPrcs) * 2);
1657
1658 singleProcs = &(gphprcsptr [0]);
1659 #ifdef WIN_MAC
1660 singleProcs->click = Nlm_SingleListClick;
1661 singleProcs->draw = Nlm_DrawList;
1662 #endif
1663 #ifdef WIN_MSWIN
1664 singleProcs->command = Nlm_SingleListCommand;
1665 #endif
1666 #ifdef WIN_MOTIF
1667 singleProcs->callback = Nlm_SingleListCallback;
1668 #endif
1669 singleProcs->show = Nlm_ShowList;
1670 singleProcs->hide = Nlm_HideList;
1671 singleProcs->enable = Nlm_EnableList;
1672 singleProcs->disable = Nlm_DisableList;
1673 singleProcs->remove = Nlm_RemoveList;
1674 singleProcs->reset = Nlm_ResetList;
1675 singleProcs->countItems = Nlm_CountListItems;
1676 singleProcs->getTitle = Nlm_GetListTitle;
1677 singleProcs->setValue = Nlm_SetListValue;
1678 singleProcs->getValue = Nlm_GetListValue;
1679 singleProcs->setOffset = Nlm_SetListOffset;
1680 singleProcs->getOffset = Nlm_GetListOffset;
1681 singleProcs->setPosition = Nlm_SetListPosition;
1682 singleProcs->getPosition = Nlm_GetListPosition;
1683
1684 multiProcs = &(gphprcsptr [1]);
1685 #ifdef WIN_MAC
1686 multiProcs->click = Nlm_MultiListClick;
1687 multiProcs->draw = Nlm_DrawList;
1688 #endif
1689 #ifdef WIN_MSWIN
1690 multiProcs->command = Nlm_MultiListCommand;
1691 #endif
1692 #ifdef WIN_MOTIF
1693 multiProcs->callback = Nlm_MultiListCallback;
1694 #endif
1695 multiProcs->show = Nlm_ShowList;
1696 multiProcs->hide = Nlm_HideList;
1697 multiProcs->enable = Nlm_EnableList;
1698 multiProcs->disable = Nlm_DisableList;
1699 multiProcs->remove = Nlm_RemoveList;
1700 multiProcs->reset = Nlm_ResetList;
1701 multiProcs->countItems = Nlm_CountListItems;
1702 multiProcs->getTitle = Nlm_GetListTitle;
1703 multiProcs->setStatus = Nlm_SetListStatus;
1704 multiProcs->getStatus = Nlm_GetListStatus;
1705 multiProcs->setOffset = Nlm_SetListOffset;
1706 multiProcs->getOffset = Nlm_GetListOffset;
1707 multiProcs->setPosition = Nlm_SetListPosition;
1708 multiProcs->getPosition = Nlm_GetListPosition;
1709 }
1710