1 /***************************************************************************
3 NList.mcc - New List MUI Custom Class
4 Registered MUI class, Serial Number: 1d51 0x9d510030 to 0x9d5100A0
5 0x9d5100C0 to 0x9d5100FF
7 Copyright (C) 1996-2001 by Gilles Masson
8 Copyright (C) 2001-2014 NList Open Source Team
10 This library is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 2.1 of the License, or (at your option) any later version.
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 NList classes Support Site: http://www.sf.net/projects/nlist-classes
24 ***************************************************************************/
28 #include <clib/alib_protos.h>
29 #include <proto/muimaster.h>
30 #include <proto/intuition.h>
34 #if !defined(__amigaos4__)
38 #include "NList_func.h"
39 #include "NListviews_mcp.h"
41 #define MAX_INTUITICKS_WAIT 3
45 #define _between(a,x,b) ((x)>=(a) && (x)<=(b))
46 #define _isinobject(x,y) (_between(_mleft(obj),(x),_mright(obj)) && _between(_mtop(obj),(y),_mbottom(obj)))
47 #define _isinobject2(x,y) (_between(_left(obj),(x),_right(obj)) && _between(_top(obj),(y),_bottom(obj)))
49 static LONG
NL_TestKey(struct NLData
*data
,LONG KeyTag
,UWORD Code
,UWORD Qualifier
, BOOL force
)
53 Qualifier
&= KBQUAL_MASK
;
55 if (data
->NList_Keys
&& (!(Code
& 0x80) || force
))
57 for (i
= 0 ; data
->NList_Keys
[i
].kb_KeyTag
> 0 ; i
++)
59 if ((data
->NList_Keys
[i
].kb_KeyTag
== (ULONG
)KeyTag
) &&
60 ((Code
== data
->NList_Keys
[i
].kb_Code
) ||
61 ((data
->NList_Keys
[i
].kb_Code
== (UWORD
)~0) && data
->NList_Keys
[i
].kb_Qualifier
)))
63 qual
= data
->NList_Keys
[i
].kb_Qualifier
;
64 if (Qualifier
== qual
)
66 if (!Qualifier
|| !(qual
& KBSYM_MASK
))
69 if ((qual
& KBSYM_SHIFT
) && !(Qualifier
& KBQUALIFIER_SHIFT
))
72 qual
= qual
& ~KBQUALIFIER_SHIFT
;
74 if ((qual
& KBSYM_CAPS
) && !(Qualifier
& KBQUALIFIER_CAPS
))
77 qual
= qual
& ~KBQUALIFIER_CAPS
;
79 if ((qual
& KBSYM_ALT
) && !(Qualifier
& KBQUALIFIER_ALT
))
82 qual
= qual
& ~KBQUALIFIER_ALT
;
84 if ((Qualifier
& qual
) == qual
)
93 static void NL_RequestIDCMP(struct NLData
*data
,LONG IDCMP_val
)
95 if (IDCMP_val
& IDCMP_MOUSEMOVE
)
96 data
->MOUSE_MOVE
= TRUE
;
97 if (!(data
->ehnode
.ehn_Events
& IDCMP_val
))
99 DoMethod(_win(data
->this),MUIM_Window_RemEventHandler
, &data
->ehnode
);
100 data
->ehnode
.ehn_Events
|= IDCMP_val
;
101 DoMethod(_win(data
->this),MUIM_Window_AddEventHandler
, &data
->ehnode
);
106 static void NL_RejectIDCMP(struct NLData
*data
,LONG IDCMP_val
,BOOL really
)
108 if (IDCMP_val
& IDCMP_MOUSEMOVE
)
109 data
->MOUSE_MOVE
= FALSE
;
110 if ((really
|| !(IDCMP_val
& IDCMP_MOUSEMOVE
)) &&
111 (data
->ehnode
.ehn_Events
& IDCMP_val
))
113 DoMethod(_win(data
->this),MUIM_Window_RemEventHandler
, &data
->ehnode
);
114 data
->ehnode
.ehn_Events
&= (~IDCMP_val
);
115 DoMethod(_win(data
->this),MUIM_Window_AddEventHandler
, &data
->ehnode
);
119 static BOOL
GotoPage(struct IClass
*cl
, Object
*obj
, ULONG activePage
)
121 struct NLData
*data
= INST_DATA(cl
, obj
);
126 if(data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
!= NULL
)
127 changed
= NL_List_Active(data
, activePage
, NULL
, data
->NList_List_Select
, FALSE
,0);
129 changed
= NL_List_First(data
, activePage
, NULL
);
135 static BOOL
Scroll(struct IClass
*cl
, Object
*obj
, ULONG direction
)
137 struct NLData
*data
= INST_DATA(cl
, obj
);
142 scrolled
= NL_List_Horiz_First(data
, direction
, NULL
);
148 IPTR
mNL_HandleEvent(struct IClass
*cl
, Object
*obj
, struct MUIP_HandleInput
*msg
)
150 struct NLData
*data
= INST_DATA(cl
,obj
);
152 ULONG NotNotify
= data
->DoNotify
;
156 LONG tempbuttonstate
;
157 LONG tempstorebutton
;
159 *if (msg->imsg && (data->markdrawnum == MUIM_NList_Trigger))
161 *LONG ab = (LONG) data->adjustbar;
162 *LONG co = (LONG) msg->imsg->Code;
163 *LONG qu = (LONG) msg->imsg->Qualifier;
164 *LONG mx = (LONG) msg->imsg->MouseX;
165 *LONG my = (LONG) msg->imsg->MouseY;
166 *kprintf("%lx|1ab %ld stop IntuiMessage :\n",obj,ab);
167 *if (msg->imsg->Class == IDCMP_INACTIVEWINDOW)
168 *D(bug(" Class=INACTIVEWINDOW Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
169 *else if (msg->imsg->Class == IDCMP_ACTIVEWINDOW)
170 *D(bug(" Class=ACTIVEWINDOW Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
171 *else if (msg->imsg->Class == IDCMP_MOUSEMOVE)
172 *D(bug(" Class=MOUSEMOVE Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
173 *else if (msg->imsg->Class == IDCMP_INTUITICKS)
174 *D(bug(" Class=INTUITICKS Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
175 *else if (msg->imsg->Class == IDCMP_MOUSEBUTTONS)
176 *D(bug(" Class=MOUSEBUTTONS Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
178 *D(bug(" Class=%lx Code=%lx Qualifier=%lx mx=%ld my=%ld\n",msg->imsg->Class,co,qu,mx,my));
182 if (!data
->SHOW
|| !data
->DRAW
)
184 if (data
->NList_First_Incr
|| data
->NList_AffFirst_Incr
)
185 return (MUI_EventHandlerRC_Eat
);
186 if (data
->NList_Disabled
)
189 if ((data
->left
!= _left(obj
)) || (data
->top
!= _top(obj
)) ||
190 (data
->width
!= _width(obj
)) || (data
->height
!= _height(obj
)))
191 NL_SetObjInfos(data
,FALSE
);
193 if(msg
->muikey
!= MUIKEY_NONE
&& !data
->NList_Quiet
&& !data
->NList_Disabled
)
195 data
->ScrollBarsTime
= SCROLLBARSTIME
;
197 SHOWVALUE(DBF_ALWAYS
, msg
->muikey
);
202 BOOL changed
= GotoPage(cl
, obj
, MUIV_NList_First_Up
);
204 // if we have an object that we should make the new active object
205 // of the window we do so in case this up key action didn't end up in
207 if(changed
== FALSE
&& data
->NList_KeyUpFocus
!= NULL
)
208 set(_win(obj
), MUIA_Window_ActiveObject
, data
->NList_KeyUpFocus
);
210 retval
= MUI_EventHandlerRC_Eat
;
216 BOOL changed
= GotoPage(cl
, obj
, MUIV_NList_First_Down
);
218 // if we have an object that we should make the new active object
219 // of the window we do so in case this down key action didn't end up in
221 if(changed
== FALSE
&& data
->NList_KeyDownFocus
!= NULL
)
222 set(_win(obj
), MUIA_Window_ActiveObject
, data
->NList_KeyDownFocus
);
224 retval
= MUI_EventHandlerRC_Eat
;
230 GotoPage(cl
, obj
, MUIV_NList_Active_PageUp
);
231 retval
= MUI_EventHandlerRC_Eat
;
235 case MUIKEY_PAGEDOWN
:
237 GotoPage(cl
, obj
, MUIV_NList_Active_PageDown
);
238 retval
= MUI_EventHandlerRC_Eat
;
244 GotoPage(cl
, obj
, MUIV_NList_Active_Top
);
245 retval
= MUI_EventHandlerRC_Eat
;
251 GotoPage(cl
, obj
, MUIV_NList_Active_Bottom
);
252 retval
= MUI_EventHandlerRC_Eat
;
258 if (data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->NList_Active
>= 0)
260 data
->click_x
= data
->hpos
- data
->NList_Horiz_First
;
261 if ((data
->NList_DefClickColumn
> 0) && (data
->NList_DefClickColumn
< data
->numcols
))
262 data
->click_x
+= data
->cols
[data
->NList_DefClickColumn
].c
->minx
;
264 data
->click_x
+= data
->cols
[0].c
->minx
;
265 if (data
->click_x
< data
->hpos
)
266 data
->click_x
= data
->hpos
;
267 if (data
->click_x
>= data
->hpos
+ data
->NList_Horiz_Visible
)
268 data
->click_x
= data
->hpos
+ data
->NList_Horiz_Visible
- 1;
269 data
->click_y
= data
->vpos
+ ((data
->NList_Active
-data
->NList_First
) * data
->vinc
) + (data
->vinc
/2);
270 data
->click_line
= data
->NList_Active
;
272 DO_NOTIFY(NTF_Doubleclick
| NTF_LV_Doubleclick
);
274 if (WANTED_NOTIFY(NTF_EntryClick
) && !WANTED_NOTIFY(NTF_Doubleclick
) && !WANTED_NOTIFY(NTF_LV_Doubleclick
))
276 DO_NOTIFY(NTF_EntryClick
);
279 retval
= MUI_EventHandlerRC_Eat
;
286 if (data
->multiselect
&& data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
289 NL_List_Select(data
,MUIV_NList_Select_Active
,MUIV_NList_Active_Off
,MUIV_NList_Select_Toggle
,NULL
);
290 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->NList_List_Select
,FALSE
,0);
293 retval
= MUI_EventHandlerRC_Eat
;
300 BOOL scrolled
= Scroll(cl
, obj
, MUIV_NList_Horiz_First_Left
);
302 // if we have an object that we should make the new active object
303 // of the window we do so in case this left key action didn't end up in
305 D(DBF_STARTUP
, "KeyLeftFocus: %ld %lx", scrolled
, data
->NList_KeyLeftFocus
);
306 if(scrolled
== FALSE
&& data
->NList_KeyLeftFocus
!= NULL
)
307 set(_win(obj
), MUIA_Window_ActiveObject
, data
->NList_KeyLeftFocus
);
309 retval
= MUI_EventHandlerRC_Eat
;
315 BOOL scrolled
= Scroll(cl
, obj
, MUIV_NList_Horiz_First_Right
);
317 // if we have an object that we should make the new active object
318 // of the window we do so in case this right key action didn't end up in
320 D(DBF_STARTUP
, "KeyRightFocus: %ld %lx", scrolled
, data
->NList_KeyRightFocus
);
321 if(scrolled
== FALSE
&& data
->NList_KeyRightFocus
!= NULL
)
322 set(_win(obj
), MUIA_Window_ActiveObject
, data
->NList_KeyRightFocus
);
324 retval
= MUI_EventHandlerRC_Eat
;
328 case MUIKEY_WORDLEFT
:
330 Scroll(cl
, obj
, MUIV_NList_Horiz_First_PageLeft
);
331 retval
= MUI_EventHandlerRC_Eat
;
335 case MUIKEY_WORDRIGHT
:
337 Scroll(cl
, obj
, MUIV_NList_Horiz_First_PageRight
);
338 retval
= MUI_EventHandlerRC_Eat
;
342 case MUIKEY_LINESTART
:
344 Scroll(cl
, obj
, MUIV_NList_Horiz_First_Start
);
345 retval
= MUI_EventHandlerRC_Eat
;
351 Scroll(cl
, obj
, MUIV_NList_Horiz_First_End
);
352 retval
= MUI_EventHandlerRC_Eat
;
357 // return immediately if a key has been "used"
362 /*D(bug("NL: mNL_HandleEvent() /before \n"));*/
364 if (msg
->imsg
&& !data
->NList_Quiet
&& !data
->NList_Disabled
)
365 { SIPTR tagval
,tagval2
;
366 LONG drag_ok
= FALSE
;
367 WORD hfirst
= data
->NList_Horiz_AffFirst
& ~1;
368 WORD hfirsthpos
= hfirst
- data
->hpos
;
369 WORD do_draw
= FALSE
;
370 LONG WheelFastQual
= NL_TestKey(data
,KEYTAG_QUALIFIER_WHEEL_FAST
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,TRUE
);
371 LONG WheelHorizQual
= NL_TestKey(data
,KEYTAG_QUALIFIER_WHEEL_HORIZ
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,TRUE
);
372 LONG BalanceQual
= NL_TestKey(data
,KEYTAG_QUALIFIER_BALANCE
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,TRUE
);
373 LONG DragQual
= NL_TestKey(data
,KEYTAG_QUALIFIER_DRAG
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,TRUE
);
374 LONG MultQual
= NL_TestKey(data
,KEYTAG_QUALIFIER_MULTISELECT
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,TRUE
);
375 LONG Title2Qual
= NL_TestKey(data
,KEYTAG_QUALIFIER_TITLECLICK2
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,TRUE
);
376 if (data
->multisel_qualifier
&& ((msg
->imsg
->Qualifier
& data
->multisel_qualifier
) == data
->multisel_qualifier
))
378 if (data
->NList_WheelMMB
&& (msg
->imsg
->Qualifier
& IEQUALIFIER_MIDBUTTON
))
379 WheelFastQual
= TRUE
;
382 if ((msg
->imsg
->Class
== IDCMP_INTUITICKS
) ||
383 (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
) ||
384 (msg
->imsg
->Class
== IDCMP_MOUSEBUTTONS
))
385 { if ((data
->multiclickalone
> 0) &&
386 !DoubleClick(data
->secs
,data
->micros
,msg
->imsg
->Seconds
,msg
->imsg
->Micros
))
387 { DO_NOTIFY(NTF_MulticlickAlone
);
390 switch (msg
->imsg
->Class
)
392 case IDCMP_INACTIVEWINDOW
:
393 case IDCMP_ACTIVEWINDOW
:
397 *LONG ab = (LONG) data->adjustbar;
398 *LONG co = (LONG) msg->imsg->Code;
399 *LONG qu = (LONG) msg->imsg->Qualifier;
400 *LONG mx = (LONG) msg->imsg->MouseX;
401 *LONG my = (LONG) msg->imsg->MouseY;
402 *D(bug("%lx|1ab %ld stop IntuiMessage :\n",obj,ab));
403 *if (msg->imsg->Class == IDCMP_INACTIVEWINDOW)
404 *D(bug(" Class=INACTIVEWINDOW Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
405 *else if (msg->imsg->Class == IDCMP_ACTIVEWINDOW)
406 *D(bug(" Class=ACTIVEWINDOW Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
408 *D(bug(" Class=%lx Code=%lx Qualifier=%lx mx=%ld my=%ld\n",msg->imsg->Class,co,qu,mx,my));
411 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
412 data
->selectskiped
= FALSE
;
415 if (data
->adjustbar
!= -1)
416 { data
->adjustbar
= -1;
418 data
->click_line
= -2;
421 ** Reset the ShortHelp to the Default for Not Being Over Button
423 if (data
->affover
>=0)
426 nnset(obj
,MUIA_ShortHelp
,data
->NList_ShortHelp
);
428 if (data
->affbutton
>= 0)
430 NL_Changed(data
,data
->affbuttonline
);
432 data
->affbutton
= -1;
433 data
->affbuttonline
= -1;
434 data
->affbuttoncol
= -1;
435 data
->affbuttonstate
= 0;
436 data
->storebutton
= FALSE
;
439 mNL_Trigger(cl
,obj
,NULL
);
444 data
->ScrollBarsTime
= SCROLLBARSTIME
;
446 if(msg
->imsg
->Code
== RAWKEY_PAGEUP
)
448 GotoPage(cl
, obj
, MUIV_NList_Active_PageUp
);
449 retval
= MUI_EventHandlerRC_Eat
;
451 else if(msg
->imsg
->Code
== RAWKEY_PAGEDOWN
)
453 GotoPage(cl
, obj
, MUIV_NList_Active_PageDown
);
454 retval
= MUI_EventHandlerRC_Eat
;
456 else if(msg
->imsg
->Code
== RAWKEY_HOME
)
458 GotoPage(cl
, obj
, MUIV_NList_Active_Top
);
459 retval
= MUI_EventHandlerRC_Eat
;
461 else if(msg
->imsg
->Code
== RAWKEY_END
)
463 GotoPage(cl
, obj
, MUIV_NList_Active_Bottom
);
464 retval
= MUI_EventHandlerRC_Eat
;
468 #if !defined(__amigaos4__)
469 // check for wheelmouse events first
470 if(_isinobject(msg
->imsg
->MouseX
,msg
->imsg
->MouseY
))
472 if(msg
->imsg
->Code
== NM_WHEEL_UP
) /* MOUSE_WHEEL_UP */
474 if(WheelHorizQual
&& WheelFastQual
)
475 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left4
,NULL
);
476 else if(WheelHorizQual
)
477 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left
,NULL
);
478 else if(WheelFastQual
)
481 for(i
=0; i
< data
->NList_WheelFast
; i
++)
482 NL_List_First(data
,MUIV_NList_First_Up
,NULL
);
487 for(i
=0; i
< data
->NList_WheelStep
; i
++)
488 NL_List_First(data
,MUIV_NList_First_Up
,NULL
);
491 retval
= MUI_EventHandlerRC_Eat
;
493 else if(msg
->imsg
->Code
== NM_WHEEL_DOWN
) /* MOUSE_WHEEL_DOWN */
495 if(WheelHorizQual
&& WheelFastQual
)
496 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right4
,NULL
);
497 else if(WheelHorizQual
)
498 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right
,NULL
);
499 else if(WheelFastQual
)
502 for(i
=0; i
< data
->NList_WheelFast
; i
++)
503 NL_List_First(data
,MUIV_NList_First_Down
,NULL
);
508 for(i
=0; i
< data
->NList_WheelStep
; i
++)
509 NL_List_First(data
,MUIV_NList_First_Down
,NULL
);
512 retval
= MUI_EventHandlerRC_Eat
;
514 else if(msg
->imsg
->Code
== NM_WHEEL_LEFT
) /* MOUSE_WHEEL_LEFT */
516 NL_List_Horiz_First(data
, WheelFastQual
? MUIV_NList_Horiz_First_Left4
: MUIV_NList_Horiz_First_Left
, NULL
);
518 retval
= MUI_EventHandlerRC_Eat
;
520 else if(msg
->imsg
->Code
== NM_WHEEL_RIGHT
) /* MOUSE_WHEEL_RIGHT */
522 NL_List_Horiz_First(data
, WheelFastQual
? MUIV_NList_Horiz_First_Right4
: MUIV_NList_Horiz_First_Right
, NULL
);
524 retval
= MUI_EventHandlerRC_Eat
;
529 if((tagval
= xget(_win(obj
), MUIA_Window_ActiveObject
)) &&
530 ((tagval
== (SIPTR
)data
->nlistviewobj
) ||
531 (tagval
&& (tagval2
= xget((Object
*)tagval
, MUIA_Listview_List
)) && (tagval2
== (SIPTR
)data
->nlistviewobj
)) ||
532 (!tagval
&& (tagval2
= xget(_win(obj
), MUIA_Window_DefaultObject
)) && (tagval2
== (SIPTR
)data
->nlistviewobj
)))
535 if (data
->NList_AutoCopyToClip
)
537 if (NL_TestKey(data
,KEYTAG_COPY_TO_CLIPBOARD
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
539 NL_CopyTo(data
,MUIV_NList_CopyToClip_Selected
,NULL
,0L,NULL
,NULL
);
540 if (data
->NList_TypeSelect
== MUIV_NList_TypeSelect_Char
)
541 SelectFirstPoint(data
,data
->click_x
,data
->click_y
);
542 retval
= MUI_EventHandlerRC_Eat
;
545 if (NL_TestKey(data
,KEYTAG_SELECT_TO_TOP
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
547 if (data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
549 LONG newactsel
= MUIV_NList_Select_On
;
551 if (data
->NList_Active
>= 0 && data
->EntriesArray
[data
->NList_Active
]->Select
== TE_Select_None
)
552 newactsel
= MUIV_NList_Select_Off
;
553 NL_List_Active(data
,MUIV_NList_Active_UntilTop
,NULL
,newactsel
,FALSE
,0);
555 retval
= MUI_EventHandlerRC_Eat
;
557 else if (NL_TestKey(data
,KEYTAG_SELECT_TO_BOTTOM
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
559 if (data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
561 LONG newactsel
= MUIV_NList_Select_On
;
563 if (data
->NList_Active
>= 0 && data
->EntriesArray
[data
->NList_Active
]->Select
== TE_Select_None
)
564 newactsel
= MUIV_NList_Select_Off
;
565 NL_List_Active(data
,MUIV_NList_Active_UntilBottom
,NULL
,newactsel
,FALSE
,0);
567 retval
= MUI_EventHandlerRC_Eat
;
569 else if (NL_TestKey(data
,KEYTAG_SELECT_TO_PAGE_UP
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
571 /* Page up key pressed */
572 if (data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
574 LONG newactsel
= MUIV_NList_Select_On
;
576 if (data
->NList_Active
>= 0 && data
->EntriesArray
[data
->NList_Active
]->Select
== TE_Select_None
)
577 newactsel
= MUIV_NList_Select_Off
;
578 NL_List_Active(data
,MUIV_NList_Active_UntilPageUp
,NULL
,newactsel
,FALSE
,0);
580 retval
= MUI_EventHandlerRC_Eat
;
582 else if (NL_TestKey(data
,KEYTAG_SELECT_TO_PAGE_DOWN
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
584 /* Page down key pressed */
585 if (data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
587 LONG newactsel
= MUIV_NList_Select_On
;
589 if (data
->NList_Active
>= 0 && data
->EntriesArray
[data
->NList_Active
]->Select
== TE_Select_None
)
590 newactsel
= MUIV_NList_Select_Off
;
591 NL_List_Active(data
,MUIV_NList_Active_UntilPageDown
,NULL
,newactsel
,FALSE
,0);
593 retval
= MUI_EventHandlerRC_Eat
;
595 else if (NL_TestKey(data
,KEYTAG_SELECT_UP
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
598 if (data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
600 LONG newactsel
= MUIV_NList_Select_On
;
602 if (data
->NList_Active
>= 0 && data
->EntriesArray
[data
->NList_Active
]->Select
== TE_Select_None
)
603 newactsel
= MUIV_NList_Select_Off
;
604 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,newactsel
,FALSE
,0);
606 retval
= MUI_EventHandlerRC_Eat
;
608 else if (NL_TestKey(data
,KEYTAG_SELECT_DOWN
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
610 /* Down key pressed */
611 if (data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
613 LONG newactsel
= MUIV_NList_Select_On
;
615 if (data
->NList_Active
>= 0 && data
->EntriesArray
[data
->NList_Active
]->Select
== TE_Select_None
)
616 newactsel
= MUIV_NList_Select_Off
;
617 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,newactsel
,FALSE
,0);
619 retval
= MUI_EventHandlerRC_Eat
;
621 else if (NL_TestKey(data
,KEYTAG_TOGGLE_ACTIVE
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
623 if (data
->multiselect
&& data
->NList_Input
&& !data
->NList_TypeSelect
&& data
->EntriesArray
)
624 NL_List_Select(data
,MUIV_NList_Select_Active
,MUIV_NList_Active_Off
,MUIV_NList_Select_Toggle
,NULL
);
625 retval
= MUI_EventHandlerRC_Eat
;
627 else if (NL_TestKey(data
,KEYTAG_DEFAULT_WIDTH_COLUMN
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
629 struct MUI_NList_TestPos_Result res
;
631 res
.char_number
= -2;
632 NL_List_TestPos(data
,MUI_MAXMAX
,0,&res
);
633 if ((res
.column
>= 0) && (res
.column
< data
->numcols
) && !(res
.flags
& MUI_NLPR_BAR
))
635 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
636 data
->selectskiped
= FALSE
;
638 if (data
->adjustbar
!= -1)
639 { data
->adjustbar
= -1;
641 data
->click_line
= -2;
643 NL_ColWidth(data
,NL_ColumnToCol(data
,res
.column
),MUIV_NList_ColWidth_Default
);
646 else if (NL_TestKey(data
,KEYTAG_DEFAULT_WIDTH_ALL_COLUMNS
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
647 NL_ColWidth(data
,MUIV_NList_ColWidth_All
,MUIV_NList_ColWidth_Default
);
648 else if (NL_TestKey(data
,KEYTAG_DEFAULT_ORDER_COLUMN
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
650 struct MUI_NList_TestPos_Result res
;
652 res
.char_number
= -2;
653 NL_List_TestPos(data
,MUI_MAXMAX
,0,&res
);
654 if ((res
.column
>= 0) && (res
.column
< data
->numcols
) && !(res
.flags
& MUI_NLPR_BAR
))
656 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
657 data
->selectskiped
= FALSE
;
659 if (data
->adjustbar
!= -1)
660 { data
->adjustbar
= -1;
662 data
->click_line
= -2;
664 NL_SetCol(data
,res
.column
,MUIV_NList_SetColumnCol_Default
);
667 else if (NL_TestKey(data
,KEYTAG_DEFAULT_ORDER_ALL_COLUMNS
,msg
->imsg
->Code
,msg
->imsg
->Qualifier
,FALSE
))
668 NL_SetCol(data
,MUIV_NList_SetColumnCol_Default
,MUIV_NList_SetColumnCol_Default
);
673 * posraw = DeadKeyConvert(data,msg->imsg,data->rawtext,MAXRAWBUF,0L);
676 * D(bug("RAWKEY BUF=%s \n",data->rawtext));
685 #if defined(__amigaos4__)
686 case IDCMP_EXTENDEDMOUSE
:
688 if(msg
->imsg
->Code
& IMSGCODE_INTUIWHEELDATA
&&
689 _isinobject(msg
->imsg
->MouseX
, msg
->imsg
->MouseY
))
691 struct IntuiWheelData
*iwd
= (struct IntuiWheelData
*)msg
->imsg
->IAddress
;
693 if(iwd
->WheelY
< 0) // WHEEL_UP
695 if(WheelHorizQual
&& WheelFastQual
)
696 NL_List_Horiz_First(data
, MUIV_NList_Horiz_First_Left4
, NULL
);
697 else if(WheelHorizQual
)
698 NL_List_Horiz_First(data
, MUIV_NList_Horiz_First_Left
, NULL
);
699 else if(WheelFastQual
)
702 for(i
=0; i
< data
->NList_WheelFast
; i
++)
703 NL_List_First(data
, MUIV_NList_First_Up
, NULL
);
708 for(i
=0; i
< data
->NList_WheelStep
; i
++)
709 NL_List_First(data
, MUIV_NList_First_Up
, NULL
);
712 retval
= MUI_EventHandlerRC_Eat
;
714 else if(iwd
->WheelY
> 0) // WHEEL_DOWN
716 if(WheelHorizQual
&& WheelFastQual
)
717 NL_List_Horiz_First(data
, MUIV_NList_Horiz_First_Right4
, NULL
);
718 else if(WheelHorizQual
)
719 NL_List_Horiz_First(data
, MUIV_NList_Horiz_First_Right
, NULL
);
720 else if(WheelFastQual
)
723 for(i
=0; i
< data
->NList_WheelFast
; i
++)
724 NL_List_First(data
, MUIV_NList_First_Down
, NULL
);
729 for(i
=0; i
< data
->NList_WheelStep
; i
++)
730 NL_List_First(data
, MUIV_NList_First_Down
, NULL
);
733 retval
= MUI_EventHandlerRC_Eat
;
736 if(iwd
->WheelX
< 0) // WHEEL_LEFT
738 NL_List_Horiz_First(data
, WheelFastQual
? MUIV_NList_Horiz_First_Left4
: MUIV_NList_Horiz_First_Left
, NULL
);
740 retval
= MUI_EventHandlerRC_Eat
;
742 else if(iwd
->WheelX
> 0) // WHEEL_RIGHT
744 NL_List_Horiz_First(data
, WheelFastQual
? MUIV_NList_Horiz_First_Right4
: MUIV_NList_Horiz_First_Right
, NULL
);
746 retval
= MUI_EventHandlerRC_Eat
;
753 case IDCMP_MOUSEBUTTONS
:
754 data
->ScrollBarsTime
= SCROLLBARSTIME
;
757 LONG isdoubleclick
= 0;
758 if ((data
->multiselect
!= MUIV_NList_MultiSelect_None
) &&
759 (MultQual
|| (data
->multiselect
== MUIV_NList_MultiSelect_Always
)))
761 data
->selectskiped
= FALSE
;
763 // Using _isinobject2() here would also recognize clicks on the list's border
764 // as clicks inside the list. But clicking on the border above the list's title
765 // being interpreted like a click the first entry is not very intuitive. Thus
766 // we restrict ourself to clicks really inside the object here.
767 if(msg
->imsg
->Code
== SELECTDOWN
&& _isinobject(msg
->imsg
->MouseX
, msg
->imsg
->MouseY
))
769 WORD ly
= (msg
->imsg
->MouseY
- data
->vpos
);
770 WORD ly2
= (msg
->imsg
->MouseY
- data
->vdtitlepos
);
771 WORD lyl
= ly
/ data
->vinc
;
772 LONG lyl2
= lyl
+ data
->NList_First
;
773 WORD lx
= (msg
->imsg
->MouseX
- data
->hpos
);
774 BOOL do_else
= FALSE
;
779 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left
,NULL
);
780 data
->selectmode
= MUIV_NList_Select_None
;
781 data
->NumIntuiTick
= MAX_INTUITICKS_WAIT
;
783 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
785 else if (lx
>= data
->NList_Horiz_Visible
)
787 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right
,NULL
);
788 data
->selectmode
= MUIV_NList_Select_None
;
789 data
->NumIntuiTick
= MAX_INTUITICKS_WAIT
;
791 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
795 data
->selectmode
= data
->NList_List_Select
;
796 if (data
->NList_Input
&& !data
->NList_TypeSelect
)
797 { if (data
->NList_Active
> data
->NList_First
)
798 NL_List_Active(data
,MUIV_NList_Active_PageUp
,NULL
,data
->selectmode
,FALSE
,0);
800 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
803 NL_List_First(data
,MUIV_NList_First_Up
,NULL
);
804 data
->NumIntuiTick
= MAX_INTUITICKS_WAIT
;
806 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
808 else if ((lyl
>= data
->NList_Visible
) || (lyl2
>= data
->NList_Entries
))
810 data
->selectmode
= data
->NList_List_Select
;
811 if (data
->NList_Input
&& !data
->NList_TypeSelect
)
812 { if (data
->NList_Active
< data
->NList_First
- 1 + data
->NList_Visible
)
813 NL_List_Active(data
,MUIV_NList_Active_PageDown
,NULL
,data
->selectmode
,FALSE
,0);
815 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
818 NL_List_First(data
,MUIV_NList_First_Down
,NULL
);
819 data
->NumIntuiTick
= MAX_INTUITICKS_WAIT
;
821 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
826 if ((lx
< 0) || (lx
>= data
->NList_Horiz_Visible
) || (ly2
< 0) || (lyl
>= data
->NList_Visible
) || (lyl2
>= data
->NList_Entries
))
828 else if ((ly2
>= 0) && (ly
< 0))
830 isdoubleclick
= DoubleClick(data
->secs
,data
->micros
,msg
->imsg
->Seconds
,msg
->imsg
->Micros
);
831 if ((data
->click_line
== lyl2
) && (lyl2
>= -1) &&
832 (abs(data
->click_x
- msg
->imsg
->MouseX
) < 4) && (abs(data
->click_y
- msg
->imsg
->MouseY
) < 4) &&
839 BOOL modifyActiveObject
= FALSE
;
840 BOOL modifyDefaultObject
= FALSE
;
841 Object
*newActiveObject
= (Object
*)MUIV_Window_ActiveObject_None
;
843 data
->secs
= msg
->imsg
->Seconds
;
844 data
->micros
= msg
->imsg
->Micros
;
845 data
->click_line
= lyl2
;
846 data
->click_x
= msg
->imsg
->MouseX
;
847 data
->click_y
= msg
->imsg
->MouseY
;
848 data
->mouse_x
= msg
->imsg
->MouseX
;
849 data
->mouse_y
= msg
->imsg
->MouseY
;
850 data
->multiclick
= 0;
851 data
->multiclickalone
= 1;
852 if (data
->click_line
>= 0)
854 DO_NOTIFY(NTF_EntryClick
);
857 if (data
->NList_Title
&& (lx
>= 0) && (lx
< data
->NList_Horiz_Visible
) && (ly2
>= 0) && (ly
< 0))
859 struct MUI_NList_TestPos_Result res
;
861 res
.char_number
= -2;
862 NL_List_TestPos(data
,MUI_MAXMAX
,MUI_MAXMAX
,&res
);
863 if ((res
.flags
& MUI_NLPR_BAR
) && (res
.flags
& MUI_NLPR_TITLE
) && (res
.flags
& MUI_NLPR_ABOVE
) &&
864 (res
.column
< data
->numcols
) && (res
.column
>= 0))
866 WORD minx
= data
->cols
[res
.column
].c
->minx
- hfirsthpos
867 + ((data
->cols
[res
.column
].c
->delta
-1) / 2) + MinColWidth
;
868 WORD actx
= data
->cols
[res
.column
].c
->maxx
- hfirsthpos
869 + ((data
->cols
[res
.column
].c
->delta
-1) / 2);
870 if ((actx
< data
->mleft
) || (actx
> data
->mright
))
871 actx
= msg
->imsg
->MouseX
;
872 data
->adjustcolumn
= res
.column
;
875 { if (minx
>= data
->mleft
)
876 { data
->adjustbar
= minx
+ hfirsthpos
;
877 data
->adjustbar_last
= data
->cols
[data
->adjustcolumn
].c
->userwidth
;
879 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
882 else if (actx
> minx
)
883 { data
->adjustbar
= actx
+ hfirsthpos
;
884 data
->adjustbar_last
= data
->cols
[data
->adjustcolumn
].c
->userwidth
;
886 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
888 if ((data
->adjustbar
>= 0) && BalanceQual
&&
889 ((res
.column
< data
->numcols
-2) ||
890 ((res
.column
== data
->numcols
-2) && (data
->cols
[res
.column
+1].c
->userwidth
> 0))))
891 { data
->adjustbar_last2
= data
->cols
[res
.column
+1].c
->userwidth
;
892 data
->adjustbar2
= data
->cols
[res
.column
+1].c
->maxx
;
895 data
->adjustbar2
= -1;
897 data
->click_line
= -2;
901 else if ((res
.flags
& MUI_NLPR_ABOVE
) && (res
.flags
& MUI_NLPR_TITLE
) &&
902 (res
.column
< data
->numcols
) && (res
.column
>= 0))
904 data
->adjustcolumn
= res
.column
;
905 if ((WANTED_NOTIFY(NTF_TitleClick
) || WANTED_NOTIFY(NTF_TitleClick2
)) && data
->cols
[res
.column
].c
->titlebutton
)
906 { data
->adjustbar
= -2;
908 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
911 { if (WANTED_NOTIFY(NTF_TitleClick2
) && (Title2Qual
|| !WANTED_NOTIFY(NTF_TitleClick
)))
912 data
->TitleClick2
= (LONG
) data
->cols
[res
.column
].c
->col
;
914 data
->TitleClick
= (LONG
) data
->cols
[res
.column
].c
->col
;
915 if ((data
->adjustcolumn
>= data
->NList_MinColSortable
) &&
916 ((data
->numcols
- data
->NList_MinColSortable
) > 1) &&
917 (NL_OnWindow(data
,msg
->imsg
->MouseX
,msg
->imsg
->MouseY
)))
921 *LONG ab = (LONG) data->adjustbar;
922 *LONG co = (LONG) msg->imsg->Code;
923 *LONG qu = (LONG) msg->imsg->Qualifier;
924 *LONG mx = (LONG) msg->imsg->MouseX;
925 *LONG my = (LONG) msg->imsg->MouseY;
926 *D(bug("%lx|1ab0 %ld start col sort IntuiMessage :\n",obj,ab));
927 *if (msg->imsg->Class == IDCMP_MOUSEMOVE)
928 *D(bug(" Class=MOUSEMOVE Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
929 *else if (msg->imsg->Class == IDCMP_INTUITICKS)
930 *D(bug(" Class=INTUITICKS Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
931 *else if (msg->imsg->Class == IDCMP_MOUSEBUTTONS)
932 *D(bug(" Class=MOUSEBUTTONS Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
934 *D(bug(" Class=%lx Code=%lx Qualifier=%lx mx=%ld my=%ld\n",msg->imsg->Class,co,qu,mx,my));
937 data
->adjustbar
= -10;
939 // set a custom mouse pointer
940 ShowCustomPointer(data
, PT_MOVE
);
947 else if (!data
->NList_Title
&& (lx
>= 0) && (lx
< data
->NList_Horiz_Visible
) && (ly
< data
->vinc
/2) && (ly
>= 0))
948 { struct MUI_NList_TestPos_Result res
;
950 res
.char_number
= -2;
951 NL_List_TestPos(data
,MUI_MAXMAX
,MUI_MAXMAX
,&res
);
952 if ((res
.flags
& MUI_NLPR_BAR
) &&
953 (res
.column
< data
->numcols
) && (res
.column
>= 0))
955 WORD minx
= data
->cols
[res
.column
].c
->minx
- hfirsthpos
956 + ((data
->cols
[res
.column
].c
->delta
-1) / 2) + 10;
957 WORD actx
= data
->cols
[res
.column
].c
->maxx
- hfirsthpos
958 + ((data
->cols
[res
.column
].c
->delta
-1) / 2);
959 if ((actx
< data
->mleft
) || (actx
> data
->mright
))
960 actx
= msg
->imsg
->MouseX
;
961 data
->adjustcolumn
= res
.column
;
964 { if (minx
>= data
->mleft
)
965 { data
->adjustbar
= minx
+ hfirsthpos
;
966 data
->adjustbar_last
= data
->cols
[data
->adjustcolumn
].c
->userwidth
;
968 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
971 else if (actx
> minx
)
972 { data
->adjustbar
= actx
+ hfirsthpos
;
973 data
->adjustbar_last
= data
->cols
[data
->adjustcolumn
].c
->userwidth
;
975 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
977 if ((data
->adjustbar
>= 0) && BalanceQual
&&
978 ((res
.column
< data
->numcols
-2) ||
979 ((res
.column
== data
->numcols
-2) && (data
->cols
[res
.column
+1].c
->userwidth
> 0))))
980 { data
->adjustbar_last2
= data
->cols
[res
.column
+1].c
->userwidth
;
981 data
->adjustbar2
= data
->cols
[res
.column
+1].c
->maxx
;
984 data
->adjustbar2
= -1;
986 data
->click_line
= -2;
992 if(data
->NList_DefaultObjectOnClick
== TRUE
)
994 IPTR tst
= xget(_win(obj
), MUIA_Window_ActiveObject
);
996 if(tst
!= MUIV_Window_ActiveObject_None
&& tst
!= data
->NList_KeepActive
&& tst
!= (IPTR
)data
->nlistviewobj
)
998 if(data
->NList_MakeActive
!= (IPTR
)NULL
)
999 newActiveObject
= (Object
*)data
->NList_MakeActive
;
1001 newActiveObject
= (Object
*)MUIV_Window_ActiveObject_None
;
1003 modifyActiveObject
= TRUE
;
1006 modifyDefaultObject
= TRUE
;
1008 else if(data
->NList_MakeActive
!= (IPTR
)NULL
)
1010 newActiveObject
= (Object
*)data
->NList_MakeActive
;
1011 modifyActiveObject
= TRUE
;
1014 // now we check if the user wants to set this object
1015 // as the active one or not.
1016 if(data
->NList_ActiveObjectOnClick
== TRUE
&& data
->isActiveObject
== FALSE
)
1018 // set our parent NListview object as new active object
1019 newActiveObject
= data
->nlistviewobj
;
1020 modifyActiveObject
= TRUE
;
1023 // change the window's active object if necessary
1024 if(modifyActiveObject
== TRUE
)
1026 set(_win(obj
), MUIA_Window_ActiveObject
, newActiveObject
);
1028 else if(modifyDefaultObject
== TRUE
)
1030 // set our parent NListview object as new default object
1031 set(_win(obj
), MUIA_Window_DefaultObject
, data
->nlistviewobj
);
1034 if(data
->NList_TypeSelect
&& (data
->adjustbar
== -1))
1037 SelectSecondPoint(data
,data
->click_x
,data
->click_y
);
1040 data
->NList_TypeSelect
= MUIV_NList_TypeSelect_Char
;
1041 SelectFirstPoint(data
,data
->click_x
,data
->click_y
);
1046 if (do_else
&& (data
->adjustbar
== -1) && (ly
>= 0) && (lyl
>= 0) && (lyl
< data
->NList_Visible
))
1048 struct MUI_NList_TestPos_Result res
;
1050 data
->affbutton
= -1;
1051 data
->affbuttonline
= -1;
1052 data
->affbuttoncol
= -1;
1053 data
->affbuttonstate
= 0;
1054 data
->storebutton
= TRUE
;
1055 res
.char_number
= 0;
1056 NL_List_TestPos(data
,msg
->imsg
->MouseX
,msg
->imsg
->MouseY
,&res
);
1057 data
->storebutton
= FALSE
;
1058 if ((data
->affbutton
>= 0) && (data
->affbuttonline
>= 0))
1059 { data
->affbuttonstate
= -2;
1060 NL_Changed(data
,data
->affbuttonline
);
1062 data
->moves
= FALSE
;
1066 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
1071 data
->secs
= msg
->imsg
->Seconds
;
1072 data
->micros
= msg
->imsg
->Micros
;
1074 data
->multiclickalone
++;
1076 if (data
->multiclick
== 1)
1078 DO_NOTIFY(NTF_Doubleclick
| NTF_LV_Doubleclick
);
1080 else if (data
->multiclick
> 1)
1082 DO_NOTIFY(NTF_Multiclick
);
1085 if (data
->NList_TypeSelect
&& (data
->adjustbar
== -1))
1088 { SelectSecondPoint(data
,data
->click_x
,data
->click_y
);
1093 if ((data
->multiclick
% 3) == 0)
1094 data
->NList_TypeSelect
= MUIV_NList_TypeSelect_Char
;
1095 else if ((data
->multiclick
% 3) == 1)
1096 data
->NList_TypeSelect
= MUIV_NList_TypeSelect_CWord
;
1097 else if ((data
->multiclick
% 3) == 2)
1098 data
->NList_TypeSelect
= MUIV_NList_TypeSelect_CLine
;
1099 SelectFirstPoint(data
,data
->click_x
,data
->click_y
);
1105 if (do_else
&& (data
->adjustbar
== -1) && (data
->affbutton
< 0) && (ly
>= 0) && (lyl
>= 0) && (lyl
< data
->NList_Visible
))
1107 long lactive
= lyl
+ data
->NList_First
;
1108 if ((lactive
>= 0) && (lactive
< data
->NList_Entries
))
1110 if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1112 if (data
->multiselect
== MUIV_NList_MultiSelect_None
)
1114 data
->selectmode
= MUIV_NList_Select_On
;
1115 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1120 NL_UnSelectAll(data
,lactive
);
1121 data
->selectmode
= MUIV_NList_Select_On
;
1122 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,TRUE
,0);
1124 data
->selectskiped
= TRUE
;
1128 if (data
->EntriesArray
[lactive
]->Select
== TE_Select_None
)
1129 data
->selectmode
= MUIV_NList_Select_On
;
1131 data
->selectmode
= MUIV_NList_Select_Off
;
1132 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,TRUE
,0);
1133 data
->selectskiped
= TRUE
;
1138 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
1140 if (data
->drag_type
!= MUIV_NList_DragType_None
)
1144 else if ((data
->drag_type
== MUIV_NList_DragType_Immediate
) || (data
->drag_type
== MUIV_NList_DragType_Borders
))
1145 data
->drag_border
= TRUE
;
1149 // the click happened inside our realm, so signal MUI that we ate that click
1150 retval
= MUI_EventHandlerRC_Eat
;
1154 if((msg
->imsg
->Code
==SELECTDOWN
) && data
->NList_DefaultObjectOnClick
)
1156 /* click was not in _isinobject2() */
1157 ULONG tst
= xget(_win(obj
), MUIA_Window_DefaultObject
);
1159 if(tst
== (IPTR
)obj
)
1160 set(_win(obj
), MUIA_Window_DefaultObject
, NULL
);
1162 // do not return MUI_EventHandlerRC_Eat, because this click happened outside
1163 // of our realm and most probably needs to be handled by another object.
1166 if (!(((msg->imsg->Code==MIDDLEDOWN) || (msg->imsg->Code==MIDDLEUP)) && (data->drag_qualifier & IEQUALIFIER_MIDBUTTON)) &&
1167 !(((msg->imsg->Code==MENUDOWN) || (msg->imsg->Code==MENUUP)) && (data->drag_qualifier & IEQUALIFIER_RBUTTON)))
1170 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,FALSE
);
1171 data
->selectskiped
= FALSE
;
1172 data
->moves
= FALSE
;
1176 if (msg
->imsg
->Code
==SELECTUP
)
1178 data
->moves
= data
->selectskiped
= FALSE
;
1181 *LONG ab = (LONG) data->adjustbar;
1182 *LONG co = (LONG) msg->imsg->Code;
1183 *LONG qu = (LONG) msg->imsg->Qualifier;
1184 *LONG mx = (LONG) msg->imsg->MouseX;
1185 *LONG my = (LONG) msg->imsg->MouseY;
1186 *D(bug("18a Class=%lx Code=%lx Qualifier=%lx mx=%ld my=%ld %ld.%ld (%ld)\n",msg->imsg->Class,co,qu,mx,my,msg->imsg->Seconds,msg->imsg->Micros,data->moves));
1189 if(data
->NList_Input
== FALSE
&& (data
->NList_TypeSelect
== MUIV_NList_TypeSelect_Char
) &&
1190 data
->NList_AutoClip
== TRUE
&& (data
->sel_pt
[0].ent
>= 0) && (data
->sel_pt
[1].ent
>= 0) && !MultQual
)
1192 NL_CopyTo(data
,MUIV_NList_CopyToClip_Selected
,NULL
,0L,NULL
,NULL
);
1193 SelectFirstPoint(data
,data
->click_x
,data
->click_y
);
1196 if ((msg
->imsg
->Code
==SELECTUP
) && ((data
->adjustbar
>= 0) || (data
->adjustbar_old
>= 0)))
1198 if ((data
->adjustcolumn
< data
->numcols
) && (data
->adjustcolumn
>= 0))
1200 WORD userwidth
= data
->adjustbar
1201 - ((data
->cols
[data
->adjustcolumn
].c
->delta
-1) / 2)
1202 - data
->cols
[data
->adjustcolumn
].c
->minx
;
1204 if (userwidth
< MinColWidth
)
1205 userwidth
= MinColWidth
;
1206 if (data
->cols
[data
->adjustcolumn
].c
->userwidth
!= userwidth
)
1208 data
->cols
[data
->adjustcolumn
].c
->userwidth
= userwidth
;
1209 if (data
->adjustbar2
>= 0)
1211 userwidth
= data
->adjustbar2
- data
->cols
[data
->adjustcolumn
].c
->minx
1212 - userwidth
- data
->cols
[data
->adjustcolumn
].c
->delta
;
1213 if (userwidth
< MinColWidth
)
1214 userwidth
= MinColWidth
;
1215 data
->cols
[data
->adjustcolumn
+1].c
->userwidth
= userwidth
;
1217 data
->do_setcols
= TRUE
;
1218 /*data->ScrollBarsPos = -2;*/
1221 data
->adjustbar
= -1;
1223 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
1224 data
->click_line
= -2;
1225 data
->moves
= FALSE
;
1228 else if (((msg
->imsg
->Code
== MENUDOWN
) || (msg
->imsg
->Code
== MENUUP
)) &&
1229 ((data
->adjustbar
>= 0) || (data
->adjustbar_old
>= 0)))
1231 if (data
->NList_ColWidthDrag
== MUIV_NList_ColWidthDrag_Visual
)
1233 data
->cols
[data
->adjustcolumn
].c
->userwidth
= data
->adjustbar_last
;
1234 if (data
->adjustbar2
> 0)
1235 data
->cols
[data
->adjustcolumn
+1].c
->userwidth
= data
->adjustbar_last2
;
1236 data
->do_setcols
= TRUE
;
1238 data
->adjustbar
= -1;
1239 data
->adjustbar2
= -1;
1240 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,FALSE
);
1242 data
->click_line
= -2;
1243 data
->moves
= FALSE
;
1246 if ((msg
->imsg
->Code
==SELECTUP
) && (data
->adjustbar
>= -4) && (data
->adjustbar
<= -2))
1247 { NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
1248 data
->moves
= FALSE
;
1250 if ((data
->adjustbar
> -4) &&
1251 (data
->adjustcolumn
< data
->numcols
) && (data
->adjustcolumn
>= 0) &&
1252 (msg
->imsg
->MouseX
>= data
->mleft
) &&
1253 (msg
->imsg
->MouseX
<= data
->mright
) &&
1254 (msg
->imsg
->MouseY
>= data
->vdtitlepos
) &&
1255 (msg
->imsg
->MouseY
< data
->mbottom
))
1256 { data
->click_line
= -2;
1257 if (WANTED_NOTIFY(NTF_TitleClick2
) && (Title2Qual
|| !WANTED_NOTIFY(NTF_TitleClick
)))
1258 { data
->TitleClick2
= (LONG
) data
->cols
[data
->adjustcolumn
].c
->col
;
1259 DO_NOTIFY(NTF_TitleClick2
);
1262 { data
->TitleClick
= (LONG
) data
->cols
[data
->adjustcolumn
].c
->col
;
1263 DO_NOTIFY(NTF_TitleClick
);
1266 data
->adjustbar
= -1;
1269 else if ((msg
->imsg
->Code
==SELECTUP
) && (data
->adjustbar
== -10))
1271 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
1272 data
->moves
= FALSE
;
1274 data
->adjustbar
= -1;
1276 HideCustomPointer(data
);
1278 if (((msg
->imsg
->Code
==SELECTUP
) || (msg
->imsg
->Code
==MENUDOWN
)) &&
1279 (data
->affbutton
>= 0))
1281 if ((data
->affbuttonstate
== 2) || (data
->affbuttonstate
== -2))
1283 data
->NList_ButtonClick
= data
->affbutton
;
1284 DO_NOTIFY(NTF_ButtonClick
);
1286 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
1287 NL_Changed(data
,data
->affbuttonline
);
1289 data
->affbutton
= -1;
1290 data
->affbuttonline
= -1;
1291 data
->affbuttoncol
= -1;
1292 data
->affbuttonstate
= 0;
1293 data
->storebutton
= FALSE
;
1296 //retval = MUI_EventHandlerRC_Eat;
1298 case IDCMP_INTUITICKS
:
1300 struct MUI_NList_TestPos_Result res
;
1302 ** Store Current Values to Temp Variables
1304 tempbutton
= data
->affbutton
;
1305 tempbuttonline
= data
->affbuttonline
;
1306 tempbuttoncol
= data
->affbuttoncol
;
1307 tempbuttonstate
= data
->affbuttonstate
;
1308 tempstorebutton
= data
->storebutton
;
1309 data
->affimage
= -1;
1310 data
->affbutton
= -1;
1311 data
->affbuttonline
= -1;
1312 data
->affbuttoncol
= -1;
1313 data
->affbuttonstate
= 0;
1314 data
->storebutton
= TRUE
;
1315 res
.char_number
= 0;
1316 NL_List_TestPos(data
,msg
->imsg
->MouseX
,msg
->imsg
->MouseY
,&res
);
1317 if (data
->affbutton
>=0) {
1318 if (data
->affover
!=data
->affbutton
) {
1320 ** Set the ShortHelp to the Button's for Being Over Button (If ShortHelp Exists)
1322 data
->affover
= data
->affbutton
;
1323 if ((data
->affimage
>= 0) && (data
->affimage
< data
->LastImage
) && data
->NList_UseImages
)
1327 if((shorthelp
= (STRPTR
)xget(data
->NList_UseImages
[data
->affimage
].imgobj
, MUIA_ShortHelp
)))
1328 nnset(obj
,MUIA_ShortHelp
,shorthelp
);
1333 if (data
->affover
!=-1) {
1335 ** Reset the ShortHelp to the Default for Not Being Over Button
1338 nnset(obj
,MUIA_ShortHelp
,data
->NList_ShortHelp
);
1342 ** Restore Values from Temp Variables
1344 data
->affbutton
= tempbutton
;
1345 data
->affbuttonline
= tempbuttonline
;
1346 data
->affbuttoncol
= tempbuttoncol
;
1347 data
->affbuttonstate
= tempbuttonstate
;
1348 data
->storebutton
= tempstorebutton
;
1349 if(data
->NumIntuiTick
> 0)
1351 data
->NumIntuiTick
--;
1356 if(!_isinobject(msg
->imsg
->MouseX
,msg
->imsg
->MouseY
) && data
->moves
== FALSE
)
1357 HideCustomPointer(data
);
1359 // walk through to next case...
1361 case IDCMP_MOUSEMOVE
:
1363 if((msg
->imsg
->Class
== IDCMP_MOUSEMOVE
) && data
->MOUSE_MOVE
)
1364 data
->ScrollBarsTime
= SCROLLBARSTIME
;
1366 if((msg
->imsg
->Class
== IDCMP_MOUSEMOVE
) &&
1367 ((msg
->imsg
->Qualifier
& IEQUALIFIER_LEFTBUTTON
) != IEQUALIFIER_LEFTBUTTON
) &&
1368 ((msg
->imsg
->Qualifier
& (IEQUALIFIER_LALT
|IEQUALIFIER_LCOMMAND
)) != (IEQUALIFIER_LALT
|IEQUALIFIER_LCOMMAND
)))
1372 *LONG ab = (LONG) data->adjustbar;
1373 *LONG co = (LONG) msg->imsg->Code;
1374 *LONG qu = (LONG) msg->imsg->Qualifier;
1375 *LONG mx = (LONG) msg->imsg->MouseX;
1376 *LONG my = (LONG) msg->imsg->MouseY;
1377 *D(bug("%lx|1ab %ld stop IntuiMessage :\n",obj,ab));
1378 *if (msg->imsg->Class == IDCMP_MOUSEMOVE)
1379 *D(bug(" Class=MOUSEMOVE Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
1380 *else if (msg->imsg->Class == IDCMP_INTUITICKS)
1381 *D(bug(" Class=INTUITICKS Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
1383 *D(bug(" Class=%lx Code=%lx Qualifier=%lx mx=%ld my=%ld\n",msg->imsg->Class,co,qu,mx,my));
1386 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
1387 data
->selectskiped
= FALSE
;
1388 data
->moves
= FALSE
;
1390 if (data
->adjustbar
!= -1)
1391 { data
->adjustbar
= -1;
1393 data
->click_line
= -2;
1395 if (data
->affbutton
>= 0)
1397 NL_Changed(data
,data
->affbuttonline
);
1399 data
->affbutton
= -1;
1400 data
->affbuttonline
= -1;
1401 data
->affbuttoncol
= -1;
1402 data
->affbuttonstate
= 0;
1403 data
->storebutton
= FALSE
;
1407 if(!data
->MOUSE_MOVE
&& (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
))
1410 data
->mouse_x
= msg
->imsg
->MouseX
;
1411 data
->mouse_y
= msg
->imsg
->MouseY
;
1413 if ((data
->ContextMenu
== (LONG
)MUIV_NList_ContextMenu_TopOnly
) /*&& (data->numcols > 1)*/) /* sba: Contextmenu problem: Disabled */
1414 { if ((data
->NList_Title
&& (msg
->imsg
->MouseY
>= data
->vpos
)) || (!data
->NList_Title
&& (msg
->imsg
->MouseY
> data
->vpos
+ data
->vinc
/3)))
1415 { if (data
->ContextMenuOn
)
1416 notdoset(obj
,MUIA_ContextMenu
,NULL
);
1419 { if (!data
->ContextMenuOn
)
1420 notdoset(obj
,MUIA_ContextMenu
,MUIV_NList_ContextMenu_TopOnly
);
1423 /* else if (((data->ContextMenu & 0x9d510030) == 0x9d510030) && (data->numcols <= 1) && data->ContextMenuOn)
1424 notdoset(obj,MUIA_ContextMenu,NULL);
1425 */ /* sba: Contextmenu problem: Disabled */
1426 if ((data
->affbutton
>= 0) && (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
))
1428 if ((msg
->imsg
->MouseX
>= data
->affbuttonpos
.Left
) &&
1429 (msg
->imsg
->MouseX
< data
->affbuttonpos
.Left
+data
->affbuttonpos
.Width
) &&
1430 (msg
->imsg
->MouseY
>= data
->affbuttonpos
.Top
) &&
1431 (msg
->imsg
->MouseY
< data
->affbuttonpos
.Top
+data
->affbuttonpos
.Height
))
1432 { if ((data
->affbuttonstate
!= -2) && (data
->affbuttonstate
!= 2))
1434 data
->affbuttonstate
= -2;
1435 NL_Changed(data
,data
->affbuttonline
);
1440 { if ((data
->affbuttonstate
== -2) || (data
->affbuttonstate
== 2))
1442 data
->affbuttonstate
= -1;
1443 NL_Changed(data
,data
->affbuttonline
);
1447 data
->moves
= FALSE
;
1451 if ((data
->adjustbar
>= 0) && (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
))
1452 { WORD ab
= msg
->imsg
->MouseX
;
1453 WORD minx
= data
->cols
[data
->adjustcolumn
].c
->minx
- hfirsthpos
1454 + ((data
->cols
[data
->adjustcolumn
].c
->delta
-1) / 2) + MinColWidth
;
1457 if ((ab
+ hfirsthpos
) != data
->adjustbar
)
1458 { data
->adjustbar
= ab
+ hfirsthpos
;
1460 if (data
->NList_ColWidthDrag
== MUIV_NList_ColWidthDrag_Visual
)
1461 { if ((data
->adjustcolumn
< data
->numcols
) && (data
->adjustcolumn
>= 0))
1462 { WORD userwidth
= data
->adjustbar
1463 - ((data
->cols
[data
->adjustcolumn
].c
->delta
-1) / 2)
1464 - data
->cols
[data
->adjustcolumn
].c
->minx
;
1465 if (userwidth
< MinColWidth
)
1466 userwidth
= MinColWidth
;
1467 if (data
->cols
[data
->adjustcolumn
].c
->userwidth
!= userwidth
)
1468 { data
->cols
[data
->adjustcolumn
].c
->userwidth
= userwidth
;
1469 if (data
->adjustbar2
>= 0)
1470 { userwidth
= data
->adjustbar2
- data
->cols
[data
->adjustcolumn
].c
->minx
1471 - userwidth
- data
->cols
[data
->adjustcolumn
].c
->delta
;
1472 if (userwidth
< MinColWidth
)
1473 userwidth
= MinColWidth
;
1474 data
->cols
[data
->adjustcolumn
+1].c
->userwidth
= userwidth
;
1476 data
->do_setcols
= TRUE
;
1477 /*data->ScrollBarsPos = -2;*/
1482 if (msg
->imsg
->MouseX
< data
->mleft
)
1483 { NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left
,NULL
);
1484 /* NL_RejectIDCMP(data,IDCMP_MOUSEMOVE,FALSE);*/
1486 else if (msg
->imsg
->MouseX
>= data
->mright
)
1487 { NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right
,NULL
);
1488 /* NL_RejectIDCMP(data,IDCMP_MOUSEMOVE,FALSE);*/
1492 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
1495 else if ((data
->adjustbar
>= -4) && (data
->adjustbar
<= -2) && (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
))
1496 { if ((data
->adjustcolumn
< data
->numcols
) &&
1497 (data
->adjustcolumn
>= 0))
1498 { WORD minx
= (data
->cols
[data
->adjustcolumn
].c
->minx
- hfirsthpos
);
1499 WORD maxx
= (data
->cols
[data
->adjustcolumn
].c
->maxx
- hfirsthpos
);
1500 WORD maxy
= data
->vdtitlepos
+ data
->vdtitleheight
;
1501 if (!data
->NList_TitleSeparator
)
1503 if (data
->adjustcolumn
> 0)
1504 minx
-= (data
->cols
[data
->adjustcolumn
-1].c
->delta
- (((data
->cols
[data
->adjustcolumn
-1].c
->delta
-1) / 2) + 1));
1505 maxx
+= ((data
->cols
[data
->adjustcolumn
].c
->delta
-1) / 2);
1506 if ((data
->adjustcolumn
>= data
->NList_MinColSortable
) &&
1507 ((data
->numcols
- data
->NList_MinColSortable
) > 1) &&
1508 ((msg
->imsg
->MouseX
< data
->click_x
- 6) || (msg
->imsg
->MouseX
> data
->click_x
+ 6)) &&
1509 (NL_OnWindow(data
,msg
->imsg
->MouseX
,msg
->imsg
->MouseY
)))
1513 *LONG ab = (LONG) data->adjustbar;
1514 *LONG co = (LONG) msg->imsg->Code;
1515 *LONG qu = (LONG) msg->imsg->Qualifier;
1516 *LONG mx = (LONG) msg->imsg->MouseX;
1517 *LONG my = (LONG) msg->imsg->MouseY;
1518 *D(bug("%lx|2ab0 %ld start col sort IntuiMessage :\n",obj,ab));
1519 *if (msg->imsg->Class == IDCMP_MOUSEMOVE)
1520 *D(bug(" Class=MOUSEMOVE Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
1521 *else if (msg->imsg->Class == IDCMP_INTUITICKS)
1522 *D(bug(" Class=INTUITICKS Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
1524 *D(bug(" Class=%lx Code=%lx Qualifier=%lx mx=%ld my=%ld\n",msg->imsg->Class,co,qu,mx,my));
1527 data
->adjustbar
= -10;
1529 // set a custom mouse pointer
1530 ShowCustomPointer(data
, PT_MOVE
);
1532 data
->moves
= FALSE
;
1536 else if ((msg
->imsg
->MouseX
< data
->mleft
) ||
1537 (msg
->imsg
->MouseX
> data
->mright
) ||
1538 (msg
->imsg
->MouseX
< minx
) ||
1539 (msg
->imsg
->MouseX
> maxx
) ||
1540 (msg
->imsg
->MouseY
< data
->vdtitlepos
) ||
1541 (msg
->imsg
->MouseY
> maxy
))
1542 { data
->adjustbar
= -4;
1544 data
->click_line
= -2;
1546 else if (data
->adjustbar
== -4)
1547 { data
->adjustbar
= -2;
1549 data
->click_line
= -2;
1556 *LONG ab = (LONG) data->adjustbar;
1557 *LONG co = (LONG) msg->imsg->Code;
1558 *LONG qu = (LONG) msg->imsg->Qualifier;
1559 *LONG mx = (LONG) msg->imsg->MouseX;
1560 *LONG my = (LONG) msg->imsg->MouseY;
1561 *D(bug("%lx|3ab %ld stop IntuiMessage :\n",obj,ab));
1562 *if (msg->imsg->Class == IDCMP_MOUSEMOVE)
1563 *D(bug(" Class=MOUSEMOVE Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
1564 *else if (msg->imsg->Class == IDCMP_INTUITICKS)
1565 *D(bug(" Class=INTUITICKS Code=%lx Qualifier=%lx mx=%ld my=%ld\n",co,qu,mx,my));
1567 *D(bug(" Class=%lx Code=%lx Qualifier=%lx mx=%ld my=%ld\n",msg->imsg->Class,co,qu,mx,my));
1570 data
->adjustbar
= -1;
1571 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,FALSE
);
1573 data
->click_line
= -2;
1578 struct MUI_NList_TestPos_Result res
;
1580 res
.char_number
= -2;
1581 NL_List_TestPos(data
,msg
->imsg
->MouseX
,msg
->imsg
->MouseY
,&res
);
1583 if(data
->adjustbar
== -10)
1585 if ((res
.column
>= data
->NList_MinColSortable
) && (data
->adjustcolumn
>= 0) &&
1586 (data
->adjustcolumn
!= res
.column
) && (res
.xoffset
> 0) &&
1587 (res
.xoffset
< data
->cols
[res
.column
].c
->dx
) && (res
.xoffset
< data
->cols
[data
->adjustcolumn
].c
->dx
))
1588 { struct colinfo
*tmpc
= data
->cols
[res
.column
].c
;
1589 data
->cols
[res
.column
].c
= data
->cols
[data
->adjustcolumn
].c
;
1590 data
->cols
[data
->adjustcolumn
].c
= tmpc
;
1591 data
->adjustcolumn
= res
.column
;
1592 data
->do_draw_all
= data
->do_draw_title
= data
->do_draw
= TRUE
;
1593 data
->do_parse
= data
->do_setcols
= data
->do_updatesb
= data
->do_wwrap
= TRUE
;
1595 /*data->ScrollBarsPos = -2;*/
1596 DO_NOTIFY(NTF_Columns
);
1601 BOOL overObject
= _isinobject(msg
->imsg
->MouseX
, msg
->imsg
->MouseY
);
1603 if (((data
->adjustbar
>= 0) ||
1604 ((!data
->moves
) && (data
->adjustbar
>= -1) &&
1605 (res
.flags
& MUI_NLPR_BAR
) && (res
.flags
& MUI_NLPR_ONTOP
) &&
1606 (res
.column
< data
->numcols
) && (res
.column
>= 0))) &&
1607 (overObject
== TRUE
))
1609 // set a custom mouse pointer
1610 ShowCustomPointer(data
, PT_SIZE
);
1612 else if(data
->NList_SelectPointer
== TRUE
&&
1613 data
->NList_TypeSelect
== MUIV_NList_TypeSelect_Char
&&
1616 // in case the NList object is in charwise selection mode and the mouse
1617 // is above the object itself we show a specialized selection pointer
1618 ShowCustomPointer(data
, PT_SELECT
);
1622 HideCustomPointer(data
);
1630 WORD ly
= (msg
->imsg
->MouseY
- data
->vpos
);
1631 WORD lyl
= ly
/ data
->vinc
;
1632 LONG lyl2
= lyl
+ data
->NList_First
;
1633 WORD lx
= (msg
->imsg
->MouseX
- data
->hpos
);
1634 WORD sel_x
= msg
->imsg
->MouseX
;
1635 WORD sel_y
= msg
->imsg
->MouseY
;
1637 data
->NumIntuiTick
= 0;
1638 if ((ly
>= 0) && (lyl
>= 0) && (lyl
< data
->NList_Visible
) &&
1639 ((lx
< 0) || (lx
>= data
->NList_Horiz_Visible
)))
1640 { if (data
->drag_border
)
1643 data
->drag_border
= FALSE
;
1649 { if (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
)
1651 if (msg
->imsg
->MouseX
< data
->mleft
-40)
1653 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left4
,NULL
);
1654 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left4
,NULL
);
1657 else if (msg
->imsg
->MouseX
< data
->mleft
-24)
1658 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left4
,NULL
);
1659 else if (msg
->imsg
->MouseX
< data
->mleft
-8)
1660 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left2
,NULL
);
1662 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Left
,NULL
);
1663 data
->selectskiped
= FALSE
;
1664 if (data
->NList_TypeSelect
&& (data
->sel_pt
[0].ent
>= 0))
1665 { sel_x
= data
->hpos
;
1666 data
->last_sel_click_x
= sel_x
+1;
1669 else if (lx
>= data
->NList_Horiz_Visible
)
1670 { if (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
)
1672 if (msg
->imsg
->MouseX
> data
->mright
+40)
1674 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right4
,NULL
);
1675 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right4
,NULL
);
1678 else if (msg
->imsg
->MouseX
> data
->mright
+24)
1679 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right4
,NULL
);
1680 else if (msg
->imsg
->MouseX
> data
->mright
+8)
1681 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right2
,NULL
);
1683 NL_List_Horiz_First(data
,MUIV_NList_Horiz_First_Right
,NULL
);
1684 data
->selectskiped
= FALSE
;
1685 if (data
->NList_TypeSelect
&& (data
->sel_pt
[0].ent
>= 0))
1686 { sel_x
= data
->hpos
+ data
->NList_Horiz_Visible
- 1;
1687 data
->last_sel_click_x
= sel_x
-1;
1692 long lactive
= data
->NList_First
- 1;
1696 if (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
)
1698 if (msg
->imsg
->MouseY
< data
->vdtpos
-40)
1699 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1701 if (data
->multiselect
&& data
->selectskiped
&& (lactive
>= 0) && (lactive
!= data
->lastactived
))
1702 { NL_List_Select(data
,lactive
,data
->lastactived
,data
->selectmode
,NULL
);
1703 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1706 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1708 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1709 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1710 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1711 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1712 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1713 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1714 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1719 NL_List_First(data
,MUIV_NList_First_Up4
,NULL
);
1720 NL_List_First(data
,MUIV_NList_First_Up4
,NULL
);
1724 else if (msg
->imsg
->MouseY
< data
->vdtpos
-24)
1725 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1727 if (data
->multiselect
&& data
->selectskiped
&& (lactive
>= 0) && (lactive
!= data
->lastactived
))
1728 { NL_List_Select(data
,lactive
,data
->lastactived
,data
->selectmode
,NULL
);
1729 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1732 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1734 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1735 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1736 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1740 NL_List_First(data
,MUIV_NList_First_Up4
,NULL
);
1742 else if (msg
->imsg
->MouseY
< data
->vdtpos
-8)
1743 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1745 if (data
->multiselect
&& data
->selectskiped
&& (lactive
>= 0) && (lactive
!= data
->lastactived
))
1746 { NL_List_Select(data
,lactive
,data
->lastactived
,data
->selectmode
,NULL
);
1747 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1750 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1752 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1756 NL_List_First(data
,MUIV_NList_First_Up2
,NULL
);
1759 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1760 NL_List_Active(data
,MUIV_NList_Active_Up
,NULL
,data
->selectmode
,FALSE
,0);
1762 NL_List_First(data
,MUIV_NList_First_Up
,NULL
);
1764 data
->selectskiped
= FALSE
;
1765 if (data
->NList_TypeSelect
&& (data
->sel_pt
[0].ent
>= 0))
1766 { sel_y
= data
->vpos
;
1767 data
->last_sel_click_y
= sel_y
+1;
1770 else if ((lyl
>= data
->NList_Visible
) || (lyl2
>= data
->NList_Entries
))
1772 long lactive
= data
->NList_First
+ data
->NList_Visible
;
1773 if (lactive
>= data
->NList_Entries
)
1774 lactive
= data
->NList_Entries
- 1;
1776 if (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
)
1779 if (msg
->imsg
->MouseY
> data
->vdbpos
+40)
1780 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1782 if (data
->multiselect
&& data
->selectskiped
&& (lactive
>= 0) && (lactive
!= data
->lastactived
))
1783 { NL_List_Select(data
,lactive
,data
->lastactived
,data
->selectmode
,NULL
);
1784 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1787 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1788 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1789 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1790 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1791 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1792 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1793 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1794 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1799 NL_List_First(data
,MUIV_NList_First_Down4
,NULL
);
1800 NL_List_First(data
,MUIV_NList_First_Down4
,NULL
);
1804 else if (msg
->imsg
->MouseY
> data
->vdbpos
+24)
1805 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1807 if (data
->multiselect
&& data
->selectskiped
&& (lactive
>= 0) && (lactive
!= data
->lastactived
))
1808 { NL_List_Select(data
,lactive
,data
->lastactived
,data
->selectmode
,NULL
);
1809 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1812 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1813 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1814 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1815 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1819 NL_List_First(data
,MUIV_NList_First_Down4
,NULL
);
1821 else if (msg
->imsg
->MouseY
> data
->vdbpos
+8)
1822 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1824 if (data
->multiselect
&& data
->selectskiped
&& (lactive
>= 0) && (lactive
!= data
->lastactived
))
1825 { NL_List_Select(data
,lactive
,data
->lastactived
,data
->selectmode
,NULL
);
1826 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1829 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1830 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1834 NL_List_First(data
,MUIV_NList_First_Down2
,NULL
);
1837 { if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1838 NL_List_Active(data
,MUIV_NList_Active_Down
,NULL
,data
->selectmode
,FALSE
,0);
1840 NL_List_First(data
,MUIV_NList_First_Down
,NULL
);
1842 data
->selectskiped
= FALSE
;
1843 if (data
->NList_TypeSelect
&& (data
->sel_pt
[0].ent
>= 0))
1844 { if (data
->NList_First
+ data
->NList_Visible
< data
->NList_Entries
)
1845 sel_y
= data
->vpos
+ (data
->NList_Visible
* data
->vinc
) - 1;
1847 sel_y
= data
->vpos
+ ((data
->NList_Entries
-data
->NList_First
) * data
->vinc
) - 1;
1848 data
->last_sel_click_y
= sel_y
-1;
1851 else if ((lyl
>= 0) && (lyl
< data
->NList_Visible
))
1853 if (data
->NList_Input
&& !data
->NList_TypeSelect
)
1855 long lactive
= lyl
+ data
->NList_First
;
1856 if ((lactive
!= data
->NList_Active
) && (lactive
>= 0) && (lactive
< data
->NList_Entries
))
1858 if (data
->multiselect
== MUIV_NList_MultiSelect_None
)
1860 NL_List_Select(data
,data
->lastactived
,MUIV_NList_Active_Off
,MUIV_NList_Select_Off
,NULL
);
1861 data
->selectmode
= MUIV_NList_Select_On
;
1863 if (data
->multiselect
&& data
->selectskiped
)
1865 NL_List_Select(data
,lactive
,data
->lastactived
,data
->selectmode
,NULL
);
1866 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1868 else if (data
->multiselect
)
1870 data
->selectskiped
= TRUE
;
1871 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1876 // Is this call really required???
1877 // It causes NList to misbehave if the user clicks in the list while the
1878 // window has MUIA_Window_Sleep set to TRUE. In this case the click seems
1879 // to be "cached" and is applied again as soon as the window is woken up
1880 // again, which is definitely wrong.
1881 // Well's have to see if commenting out this line causes any new misbehaviour.
1882 NL_List_Active(data
,lactive
,NULL
,data
->selectmode
,FALSE
,0);
1887 if (msg
->imsg
->Class
== IDCMP_INTUITICKS
)
1889 NL_RequestIDCMP(data
,IDCMP_MOUSEMOVE
);
1891 if (data
->drag_type
!= MUIV_NList_DragType_None
)
1897 else if ((data
->drag_type
== MUIV_NList_DragType_Immediate
) && !data
->multiselect
&& (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
))
1901 else if ((data
->drag_type
== MUIV_NList_DragType_Immediate
) || (data
->drag_type
== MUIV_NList_DragType_Borders
))
1902 data
->drag_border
= TRUE
;
1905 if (data
->NList_TypeSelect
&& (data
->sel_pt
[0].ent
>= 0) &&
1906 ((sel_x
!= data
->last_sel_click_x
) || (sel_y
!= data
->last_sel_click_y
)))
1907 SelectSecondPoint(data
,sel_x
,sel_y
);
1909 /*retval = MUI_EventHandlerRC_Eat;*/
1917 /* do_notifies(NTF_AllChanges);*/
1921 * if (NEED_NOTIFY(NTF_AllClick))
1922 * { //do_notifies(NTF_AllClick);
1923 * //retval = MUI_EventHandlerRC_Eat;
1926 if (drag_ok
&& (data
->drag_type
!= MUIV_NList_DragType_None
) &&
1927 ((msg
->imsg
->Class
== IDCMP_MOUSEBUTTONS
) || (msg
->imsg
->Class
== IDCMP_MOUSEMOVE
)) &&
1928 (data
->NList_Active
>= data
->NList_First
) &&
1929 (data
->NList_Active
< data
->NList_First
+ data
->NList_Visible
))
1931 LONG first
,last
,ent
,numlines
,lyl
;
1932 /*D(bug("%lx| 17 drag_ok=%ld drag should start\n",obj,drag_ok));*/
1933 if (!data
->NList_TypeSelect
)
1935 while ((first
< data
->NList_Entries
) && (data
->EntriesArray
[first
]->Select
== TE_Select_None
))
1937 last
= data
->NList_Entries
- 1;
1938 while ((last
> 0) && (data
->EntriesArray
[last
]->Select
== TE_Select_None
))
1943 { if (data
->EntriesArray
[ent
]->Select
!= TE_Select_None
)
1950 { first
= data
->sel_pt
[data
->min_sel
].ent
;
1951 last
= data
->sel_pt
[data
->max_sel
].ent
;
1952 if ((data
->sel_pt
[data
->max_sel
].column
== 0) && (data
->sel_pt
[data
->max_sel
].xoffset
== PMIN
))
1954 numlines
= last
- first
+ 1;
1956 if ((first
> 0) && (first
< data
->NList_Entries
) && (data
->EntriesArray
[first
]->Wrap
& TE_Wrap_TmpLine
))
1957 first
-= data
->EntriesArray
[first
]->dnum
;
1958 if ((last
> 0) && (last
< data
->NList_Entries
) && data
->EntriesArray
[last
]->Wrap
)
1959 { if (data
->EntriesArray
[last
]->Wrap
& TE_Wrap_TmpLine
)
1960 last
-= data
->EntriesArray
[last
]->dnum
;
1962 last
+= data
->EntriesArray
[last
]->dnum
- 1;
1964 retval
= MUI_EventHandlerRC_Eat
;
1965 if ((first
>= 0) && (first
<= last
) && (last
< data
->NList_Entries
))
1970 data
->DragRPort
= NULL
;
1972 if ((first
< data
->NList_First
) || (last
>= data
->NList_First
+ data
->NList_Visible
) ||
1973 (numlines
!= (last
- first
+ 1)) || (data
->NList_DragColOnly
>= 0) ||
1974 (numlines
>= data
->NList_DragLines
))
1976 data
->DragEntry
= first
;
1977 if ((data
->NList_Active
>= 0) && (data
->NList_Active
>= data
->NList_First
) && (last
< data
->NList_First
+ data
->NList_Visible
))
1978 first
= data
->NList_Active
;
1980 first
= data
->NList_First
;
1983 dragx
= msg
->imsg
->MouseX
- data
->mleft
;
1984 dragy
= msg
->imsg
->MouseY
- (data
->vpos
+(data
->vinc
* (first
- data
->NList_First
)));
1986 if((data
->DragRPort
= CreateDragRPort(data
,numlines
,first
,last
)))
1990 else if (dragx
>= data
->DragWidth
)
1991 dragx
= data
->DragWidth
-1;
1992 dragy
= data
->DragHeight
;
1996 if (first
>= data
->NList_First
+ data
->NList_Visible
)
1997 first
= data
->NList_First
+ data
->NList_Visible
- 1;
1998 if (first
< data
->NList_First
)
1999 first
= data
->NList_First
;
2000 if (last
>= data
->NList_First
+ data
->NList_Visible
)
2001 last
= data
->NList_First
+ data
->NList_Visible
- 1;
2004 lyl
= last
- first
+ 1;
2005 _left(obj
) = data
->mleft
;
2006 _top(obj
) = data
->vpos
+(data
->vinc
* (first
- data
->NList_First
));
2007 _width(obj
) = data
->mwidth
;
2008 _height(obj
) = data
->vinc
* lyl
;
2009 dragx
= msg
->imsg
->MouseX
- _left(obj
);
2010 dragy
= msg
->imsg
->MouseY
- _top(obj
);
2013 else if (dragx
>= _width(obj
))
2014 dragx
= _width(obj
)-1;
2017 else if (dragy
>= _height(obj
))
2018 dragy
= _height(obj
)-1;
2019 data
->badrport
= TRUE
;
2021 /*D(bug("%lx| 18 drag_ok=%ld drag start now\n",obj,drag_ok));*/
2022 data
->markdrawnum
= MUIM_NList_Trigger
;
2023 NL_RejectIDCMP(data
,IDCMP_INTUITICKS
,TRUE
);
2024 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,TRUE
);
2025 DoMethod(obj
,MUIM_DoDrag
,dragx
,dragy
,0L);
2026 NL_RequestIDCMP(data
,IDCMP_INTUITICKS
);
2027 data
->markdrawnum
= 0;
2028 NL_RejectIDCMP(data
,IDCMP_MOUSEMOVE
,FALSE
);
2029 data
->selectskiped
= FALSE
;
2030 data
->moves
= FALSE
;
2035 /*D(bug("NL: mNL_HandleEvent() /after \n"));*/
2036 { ULONG DoNotify
= ~NotNotify
& data
->DoNotify
& data
->Notify
;
2037 if (data
->SETUP
&& DoNotify
&& !data
->pushtrigger
)
2038 { data
->pushtrigger
= 1;
2039 DoMethod(_app(obj
),MUIM_Application_PushMethod
,obj
,1,MUIM_NList_Trigger
);
2047 IPTR
mNL_CreateDragImage(struct IClass
*cl
,Object
*obj
,struct MUIP_CreateDragImage
*msg
)
2049 struct NLData
*data
= INST_DATA(cl
,obj
);
2051 if (data
->DragRPort
)
2052 { _rp(obj
) = data
->DragRPort
;
2055 _width(obj
) = data
->DragWidth
;
2056 _height(obj
) = data
->DragHeight
;
2057 data
->badrport
= TRUE
;
2059 retval
= DoSuperMethodA(cl
,obj
,(Msg
) msg
);
2061 { _left(obj
) = data
->left
;
2062 _top(obj
) = data
->top
;
2063 _width(obj
) = data
->width
;
2064 _height(obj
) = data
->height
;
2065 _rp(obj
) = data
->rp
;
2066 data
->badrport
= FALSE
;
2072 IPTR
mNL_DeleteDragImage(struct IClass
*cl
,Object
*obj
,struct MUIP_DeleteDragImage
*msg
)
2074 struct NLData
*data
= INST_DATA(cl
,obj
);
2075 IPTR retval
= DoSuperMethodA(cl
,obj
,(Msg
) msg
);
2077 if (data
->DragRPort
)
2078 DisposeDragRPort(data
);
2083 BOOL
NL_Prop_First_Adjust(struct NLData
*data
)
2086 lfirst
= data
->NList_Prop_First
/ data
->vinc
;
2087 if ((data
->NList_Prop_Wait
== 0) && data
->drawall_bits
)
2091 if ((data
->NList_Prop_Wait
== 0) && ((lfirst
* data
->vinc
) != data
->NList_Prop_First
) && (data
->NList_Prop_Add
!= 0))
2093 LONG Notify_VSB
= WANTED_NOTIFY(NTF_VSB
);
2095 if (data
->SHOW
&& (data
->rp
->Layer
->Flags
& LAYERREFRESH
))
2097 NOWANT_NOTIFY(NTF_VSB
);
2098 if (data
->NList_Prop_Add
> 0)
2100 data
->NList_Prop_First
+= data
->NList_Prop_Add
;
2101 lincr
= data
->NList_Prop_First
% data
->vinc
;
2102 if ((data
->NList_Prop_First
/ data
->vinc
) > lfirst
)
2105 data
->NList_Prop_First
= lfirst
* data
->vinc
;
2106 data
->NList_Prop_Add
= 0;
2111 data
->NList_Prop_First
+= data
->NList_Prop_Add
;
2112 lincr
= data
->NList_Prop_First
% data
->vinc
;
2113 if ((data
->NList_Prop_First
/ data
->vinc
) < lfirst
)
2115 data
->NList_Prop_First
= lfirst
* data
->vinc
;
2116 data
->NList_Prop_Add
= 0;
2120 data
->ScrollBarsTime
= SCROLLBARSTIME
;
2122 if ((data
->NList_First
!= lfirst
) || (data
->NList_First_Incr
!= lincr
))
2124 if (data
->NList_First
!= lfirst
)
2126 DO_NOTIFY(NTF_First
);
2129 data
->NList_First
= lfirst
;
2130 data
->NList_First_Incr
= lincr
;
2132 /* do_notifies(NTF_AllChanges|NTF_MinMax);*/
2136 WANT_NOTIFY(NTF_VSB
);
2138 else if (data
->NList_Prop_Wait
> 0)
2140 data
->NList_Prop_Wait
--;
2143 data
->NList_Prop_Add
= 0;
2148 IPTR
mNL_Trigger(struct IClass
*cl
, UNUSED Object
*obj
, UNUSED Msg msg
)
2150 struct NLData
*data
= INST_DATA(cl
,obj
);
2151 /* attention, can be called with msg = NULL */
2152 if (data
->SHOW
&& data
->DRAW
&& !data
->do_draw_all
)
2154 NL_Prop_First_Adjust(data
);
2155 /*do_notifies(NTF_First|NTF_Entries|NTF_MinMax);*/
2156 if (data
->ScrollBarsTime
> 0)
2157 data
->ScrollBarsTime
--;
2160 data
->ScrollBarsTime
= 0;
2161 if (!data
->NList_Quiet
&& !data
->NList_Disabled
)
2162 NL_UpdateScrollers(data
,FALSE
);
2163 data
->ScrollBarsTime
= SCROLLBARSTIME
;
2167 if (data
->SHOW
&& data
->DRAW
&& !data
->NList_Quiet
&& !data
->NList_Disabled
)
2168 { data
->pushtrigger
= 2;
2172 if(data
->do_draw_all
|| data
->do_draw
)
2174 // JL: here it is important that we force do_draw_all = FALSE or otherwise the following
2175 // REDRAW will result in a flickering if we have more than one NList object in a window.
2176 data
->do_draw_all
= FALSE
;
2180 data
->pushtrigger
= 0;
2182 if (data
->SETUP
&& (data
->DoNotify
& data
->Notify
))
2183 do_notifies(NTF_All
|NTF_MinMax
);