-
Notifications
You must be signed in to change notification settings - Fork 96
/
alert.prg
165 lines (130 loc) · 4.21 KB
/
alert.prg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
* Alert(), hb_Alert() functions
*
* Released to Public Domain by Vladimir Kazimirchik <v_kazimirchik@yahoo.com>
* Further modifications 1999-2017 Viktor Szakats (vszakats.net/harbour)
* Changes for higher Clipper compatibility, console mode, extensions, __NoNoAlert()
*
*/
#include "box.ch"
#include "color.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"
/* FIXME: Clipper defines a clipped window for Alert() [vszakats] */
/* NOTE: Clipper will return NIL if the first parameter is not a string, but
this is not documented. [vszakats] */
/* NOTE: Clipper handles these buttons { "Ok", "", "Cancel" } in a buggy way.
This is fixed. [vszakats] */
#ifdef HB_CLP_UNDOC
STATIC s_lNoAlert
#endif
FUNCTION Alert( cMessage, aOptions, xColorNorm )
LOCAL xColorHigh
LOCAL aOptionsOK
LOCAL cOption
LOCAL nPos
#ifdef HB_CLP_UNDOC
IF s_lNoAlert == NIL
s_lNoAlert := hb_argCheck( "NOALERT" )
ENDIF
IF s_lNoAlert
RETURN NIL
ENDIF
#endif
IF ! HB_ISSTRING( cMessage )
RETURN NIL
ENDIF
cMessage := StrTran( cMessage, ";", Chr( 10 ) )
IF HB_ISSTRING( xColorNorm ) .AND. ! Empty( xColorNorm )
xColorNorm := hb_ColorIndex( xColorNorm, CLR_STANDARD )
xColorHigh := hb_StrReplace( ;
iif( ( nPos := hb_BAt( "/", xColorNorm ) ) > 0, ;
hb_BSubStr( xColorNorm, nPos + 1 ) + "/" + hb_BLeft( xColorNorm, nPos - 1 ), ;
"N/" + xColorNorm ), "+*" )
ELSE
xColorNorm := 0x4f // first pair color (Box line and Text)
xColorHigh := 0x1f // second pair color (Options buttons)
ENDIF
aOptionsOK := {}
FOR EACH cOption IN hb_defaultValue( aOptions, {} )
IF HB_ISSTRING( cOption ) .AND. ! Empty( cOption )
AAdd( aOptionsOK, cOption )
ENDIF
NEXT
DO CASE
CASE Len( aOptionsOK ) == 0
aOptionsOK := { "Ok" }
#ifdef HB_CLP_STRICT
CASE Len( aOptionsOK ) > 4 /* NOTE: Clipper allows only four options [vszakats] */
ASize( aOptionsOK, 4 )
#endif
ENDCASE
RETURN hb_gtAlert( cMessage, aOptionsOK, xColorNorm, xColorHigh )
/* NOTE: xMessage can be of any type, xColorNorm can be numeric.
These are Harbour extensions over Alert(). */
/* NOTE: nDelay parameter is a Harbour extension over Alert(). */
FUNCTION hb_Alert( xMessage, aOptions, xColorNorm, nDelay )
LOCAL cMessage
LOCAL xColorHigh
LOCAL aOptionsOK
LOCAL cString
LOCAL nPos
#ifdef HB_CLP_UNDOC
IF s_lNoAlert == NIL
s_lNoAlert := hb_argCheck( "NOALERT" )
ENDIF
IF s_lNoAlert
RETURN NIL
ENDIF
#endif
IF PCount() == 0
RETURN NIL
ENDIF
DO CASE
CASE HB_ISARRAY( xMessage )
cMessage := ""
FOR EACH cString IN xMessage
cMessage += iif( cString:__enumIsFirst(), "", Chr( 10 ) ) + hb_CStr( cString )
NEXT
CASE HB_ISSTRING( xMessage )
cMessage := StrTran( xMessage, ";", Chr( 10 ) )
OTHERWISE
cMessage := hb_CStr( xMessage )
ENDCASE
IF HB_ISSTRING( xColorNorm ) .AND. ! Empty( xColorNorm )
xColorNorm := hb_ColorIndex( xColorNorm, CLR_STANDARD )
xColorHigh := hb_StrReplace( ;
iif( ( nPos := hb_BAt( "/", xColorNorm ) ) > 0, ;
hb_BSubStr( xColorNorm, nPos + 1 ) + "/" + hb_BLeft( xColorNorm, nPos - 1 ), ;
"N/" + xColorNorm ), "+*" )
ELSEIF HB_ISNUMERIC( xColorNorm )
xColorNorm := hb_bitAnd( xColorNorm, 0xff )
xColorHigh := hb_bitAnd( ;
hb_bitOr( ;
hb_bitShift( xColorNorm, -4 ), ;
hb_bitShift( xColorNorm, 4 ) ), 0x77 )
ELSE
xColorNorm := 0x4f // first pair color (Box line and Text)
xColorHigh := 0x1f // second pair color (Options buttons)
ENDIF
aOptionsOK := {}
FOR EACH cString IN hb_defaultValue( aOptions, {} )
IF HB_ISSTRING( cString ) .AND. ! cString == ""
AAdd( aOptionsOK, cString )
ENDIF
NEXT
DO CASE
CASE Len( aOptionsOK ) == 0
aOptionsOK := { "Ok" }
#ifdef HB_CLP_STRICT
CASE Len( aOptionsOK ) > 4 /* NOTE: Clipper allows only four options [vszakats] */
ASize( aOptionsOK, 4 )
#endif
ENDCASE
RETURN hb_gtAlert( cMessage, aOptionsOK, xColorNorm, xColorHigh, nDelay )
#ifdef HB_CLP_UNDOC
PROCEDURE __NoNoAlert()
s_lNoAlert := .F.
RETURN
#endif