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