The R Project SVN R

Rev

Rev 44980 | Rev 45927 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 44980 Rev 45017
Line 21... Line 21...
21
   WITHOUT ANY WARRANTY.
21
   WITHOUT ANY WARRANTY.
22
 
22
 
23
   See the file COPYLIB.TXT for details.
23
   See the file COPYLIB.TXT for details.
24
*/
24
*/
25
 
25
 
26
/* Copyright (C) 2004--2008 	The R Foundation
26
/* Copyright (C) 2004--2008	The R Foundation
27
 
27
 
28
   Additions for R, Chris Jackson
28
   Additions for R, Chris Jackson
29
   Find and replace dialog boxes and dialog handlers */
29
   Find and replace dialog boxes and dialog handlers */
30
 
30
 
31
#define _WIN32_WINNT 0x0500
31
#define _WIN32_WINNT 0x0500
Line 44... Line 44...
44
 
44
 
45
static int CALLBACK
45
static int CALLBACK
46
InitBrowseCallbackProc( HWND hwnd, UINT uMsg, LPARAM lp, LPARAM lpData )
46
InitBrowseCallbackProc( HWND hwnd, UINT uMsg, LPARAM lp, LPARAM lpData )
47
{
47
{
48
    char szDir[MAX_PATH], status[MAX_PATH + 40];
48
    char szDir[MAX_PATH], status[MAX_PATH + 40];
49
    
49
 
50
    if (uMsg == BFFM_INITIALIZED) {
50
    if (uMsg == BFFM_INITIALIZED) {
51
	SendMessage(hwnd, BFFM_SETSELECTION, 1,
51
	SendMessage(hwnd, BFFM_SETSELECTION, 1,
52
		    (LPARAM)&((browserInfo*)lpData)->default_str);
52
		    (LPARAM)&((browserInfo*)lpData)->default_str);
53
    } else if (uMsg == BFFM_SELCHANGED) {
53
    } else if (uMsg == BFFM_SELCHANGED) {
54
	if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir)) {
54
	if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir)) {
55
	    snprintf(status, MAX_PATH+40, "%s\n %s", 
55
	    snprintf(status, MAX_PATH+40, "%s\n %s",
56
		     ((browserInfo*)lpData)->question, szDir);
56
		     ((browserInfo*)lpData)->question, szDir);
57
	    SetDlgItemText(hwnd, STATUSTEXT, status);
57
	    SetDlgItemText(hwnd, STATUSTEXT, status);
58
	    SendMessage(hwnd, BFFM_ENABLEOK, 0, TRUE);
58
	    SendMessage(hwnd, BFFM_ENABLEOK, 0, TRUE);
59
	} else
59
	} else
60
	    SendMessage(hwnd, BFFM_ENABLEOK, 0, FALSE);
60
	    SendMessage(hwnd, BFFM_ENABLEOK, 0, FALSE);
Line 64... Line 64...
64
 
64
 
65
#define BUFSIZE _MAX_PATH
65
#define BUFSIZE _MAX_PATH
66
static char strbuf[BUFSIZE];
66
static char strbuf[BUFSIZE];
67
 
67
 
68
static const char *filter[] = {
68
static const char *filter[] = {
69
	"All Files (*.*)",	"*.*",
69
    "All Files (*.*)",	"*.*",
70
	"Text Files (*.TXT)",	"*.txt",
70
    "Text Files (*.TXT)",	"*.txt",
71
	"HTML Files (*.HTM)",	"*.htm",
71
    "HTML Files (*.HTM)",	"*.htm",
72
	"PNG Files (*.PNG)",	"*.png",
72
    "PNG Files (*.PNG)",	"*.png",
73
	"JPEG Files (*.JPG)",	"*.jpg",
73
    "JPEG Files (*.JPG)",	"*.jpg",
74
	"BMP Files (*.BMP)",	"*.bmp",
74
    "BMP Files (*.BMP)",	"*.bmp",
75
	""
75
    ""
76
};
76
};
77
 
77
 
78
unsigned int TopmostDialogs = 0; /* May be MB_TOPMOST */
78
unsigned int TopmostDialogs = 0; /* May be MB_TOPMOST */
79
 
79
 
80
static const char *userfilter;
80
static const char *userfilter;
81
void setuserfilter(const char *uf) {
81
void setuserfilter(const char *uf)
-
 
82
{
82
   userfilter=uf;
83
    userfilter=uf;
83
}
84
}
84
 
85
 
85
static HWND hModelessDlg = NULL;
86
static HWND hModelessDlg = NULL;
86
 
87
 
87
int myMessageBox(HWND h, const char *text, const char *caption, UINT type)
88
int myMessageBox(HWND h, const char *text, const char *caption, UINT type)
Line 98... Line 99...
98
/*
99
/*
99
 *  Error reporting dialog.
100
 *  Error reporting dialog.
100
 */
101
 */
101
void apperror(const char *errstr)
102
void apperror(const char *errstr)
102
{
103
{
103
	if (! errstr)
104
    if (! errstr)
104
		errstr = "Unspecified error";
105
	errstr = "Unspecified error";
105
	myMessageBox(0, errstr, "Graphics Library Error",
106
    myMessageBox(0, errstr, "Graphics Library Error",
106
		MB_TASKMODAL | MB_ICONSTOP | MB_OK | TopmostDialogs);
107
		 MB_TASKMODAL | MB_ICONSTOP | MB_OK | TopmostDialogs);
107
	exitapp();
108
    exitapp();
108
}
109
}
109
 
110
 
110
void askok(const char *info)
111
void askok(const char *info)
111
{
112
{
112
	if (! info)
113
    if (! info)
113
		info = "";
114
	info = "";
114
	myMessageBox(0, info, "Information",
115
    myMessageBox(0, info, "Information",
115
		MB_TASKMODAL | MB_ICONINFORMATION | MB_OK | TopmostDialogs);
116
		 MB_TASKMODAL | MB_ICONINFORMATION | MB_OK | TopmostDialogs);
116
}
117
}
117
 
118
 
118
int askokcancel(const char *question)
119
int askokcancel(const char *question)
119
{
120
{
120
	int result;
121
    int result;
121
 
122
 
122
	if (! question)
123
    if (! question)
123
		question = "";
124
	question = "";
124
	result = myMessageBox(0, question, G_("Question"),
125
    result = myMessageBox(0, question, G_("Question"),
125
		MB_TASKMODAL | MB_ICONQUESTION | MB_OKCANCEL | TopmostDialogs);
126
			  MB_TASKMODAL | MB_ICONQUESTION | MB_OKCANCEL | TopmostDialogs);
126
 
127
 
127
	switch (result) {
128
    switch (result) {
128
		case IDOK: result = YES; break;
129
    case IDOK: result = YES; break;
129
		case IDCANCEL:
130
    case IDCANCEL:
130
		default: result = CANCEL; break;
131
    default: result = CANCEL; break;
131
	}
132
    }
132
	return result;
133
    return result;
133
}
134
}
134
 
135
 
135
int askyesno(const char *question)
136
int askyesno(const char *question)
136
{
137
{
137
	int result;
138
    int result;
138
 
139
 
139
	if (! question)
140
    if (! question)
140
		question = "";
141
	question = "";
141
	result = myMessageBox(0, question, G_("Question"),
142
    result = myMessageBox(0, question, G_("Question"),
142
		MB_TASKMODAL | MB_ICONQUESTION | MB_YESNO | TopmostDialogs);
143
			  MB_TASKMODAL | MB_ICONQUESTION | MB_YESNO | TopmostDialogs);
143
 
144
 
144
	switch (result) {
145
    switch (result) {
145
		case IDYES: result = YES; break;
146
    case IDYES: result = YES; break;
146
		case IDNO:  result = NO; break;
147
    case IDNO:  result = NO; break;
147
		default: result = CANCEL; break;
148
    default: result = CANCEL; break;
148
	}
149
    }
149
	return result;
150
    return result;
150
}
151
}
151
 
152
 
152
int askyesnocancel(const char *question)
153
int askyesnocancel(const char *question)
153
{
154
{
154
	int result;
155
    int result;
155
 
156
 
156
	if (! question)
157
    if (! question)
157
		question = "";
158
	question = "";
158
	result = myMessageBox(0, question, G_("Question"),
159
    result = myMessageBox(0, question, G_("Question"),
159
		MB_TASKMODAL | MB_ICONQUESTION | MB_YESNOCANCEL | MB_SETFOREGROUND | TopmostDialogs);
160
			  MB_TASKMODAL | MB_ICONQUESTION | MB_YESNOCANCEL | MB_SETFOREGROUND | TopmostDialogs);
160
 
161
 
161
	switch (result) {
162
    switch (result) {
162
		case IDYES: result = YES; break;
163
    case IDYES: result = YES; break;
163
		case IDNO:  result = NO; break;
164
    case IDNO:  result = NO; break;
164
		case IDCANCEL:
165
    case IDCANCEL:
165
		default: result = CANCEL; break;
166
    default: result = CANCEL; break;
166
	}
167
    }
167
	return result;
168
    return result;
168
}
169
}
169
 
170
 
170
static char cod[MAX_PATH]=""; /*current open directory*/
171
static char cod[MAX_PATH]=""; /*current open directory*/
171
 
172
 
172
void askchangedir()
173
void askchangedir()
Line 186... Line 187...
186
    GetCurrentDirectory(MAX_PATH, cod);
187
    GetCurrentDirectory(MAX_PATH, cod);
187
}
188
}
188
 
189
 
189
char *askfilename(const char *title, const char *default_name)
190
char *askfilename(const char *title, const char *default_name)
190
{
191
{
191
	if (*askfilenames(title, default_name, 0, userfilter?userfilter:filter[0], 0,
192
    if (*askfilenames(title, default_name, 0, userfilter?userfilter:filter[0], 0,
192
				          strbuf, BUFSIZE, NULL)) return strbuf;
193
		      strbuf, BUFSIZE, NULL)) return strbuf;
193
	else return NULL;
194
    else return NULL;
194
}
195
}
195
 
196
 
196
char *askfilenamewithdir(const char *title, const char *default_name, const char *dir)
197
char *askfilenamewithdir(const char *title, const char *default_name, const char *dir)
197
{
198
{
198
	if (*askfilenames(title, default_name, 0, userfilter?userfilter:filter[0], 0,
199
    if (*askfilenames(title, default_name, 0, userfilter?userfilter:filter[0], 0,
199
				          strbuf, BUFSIZE, dir)) return strbuf;
200
		      strbuf, BUFSIZE, dir)) return strbuf;
200
	else return NULL;
201
    else return NULL;
201
}
202
}
202
 
203
 
203
char *askfilenames(const char *title, const char *default_name, int multi,
204
char *askfilenames(const char *title, const char *default_name, int multi,
204
		   const char *filters, int filterindex,
205
		   const char *filters, int filterindex,
205
		   char *strbuf, int bufsize,
206
		   char *strbuf, int bufsize,
206
		   const char *dir)
207
		   const char *dir)
207
{
208
{
208
	int i;
209
    int i;
209
	OPENFILENAME ofn;
210
    OPENFILENAME ofn;
210
        char cwd[MAX_PATH] = "";
211
    char cwd[MAX_PATH] = "";
211
 
212
 
212
	if (!default_name) default_name = "";
213
    if (!default_name) default_name = "";
213
	strcpy(strbuf, default_name);
214
    strcpy(strbuf, default_name);
214
        GetCurrentDirectory(MAX_PATH, cwd);
215
    GetCurrentDirectory(MAX_PATH, cwd);
215
        if (!strcmp(cod, "")) {
216
    if (!strcmp(cod, "")) {
216
            if (!dir) strcpy(cod, cwd);
217
	if (!dir) strcpy(cod, cwd);
217
            else strcpy(cod, dir);
218
	else strcpy(cod, dir);
218
        }
219
    }
219
 
220
 
220
	ofn.lStructSize     = sizeof(OPENFILENAME);
221
    ofn.lStructSize     = sizeof(OPENFILENAME);
221
	ofn.hwndOwner       = current_window ? current_window->handle : 0;
222
    ofn.hwndOwner       = current_window ? current_window->handle : 0;
222
	ofn.hInstance       = 0;
223
    ofn.hInstance       = 0;
223
	ofn.lpstrFilter     = filters;
224
    ofn.lpstrFilter     = filters;
224
	ofn.lpstrCustomFilter = NULL;
225
    ofn.lpstrCustomFilter = NULL;
225
	ofn.nMaxCustFilter  = 0;
226
    ofn.nMaxCustFilter  = 0;
226
	ofn.nFilterIndex    = filterindex;
227
    ofn.nFilterIndex    = filterindex;
227
	ofn.lpstrFile       = strbuf;
228
    ofn.lpstrFile       = strbuf;
228
	ofn.nMaxFile        = bufsize;
229
    ofn.nMaxFile        = bufsize;
229
	ofn.lpstrFileTitle  = NULL;
230
    ofn.lpstrFileTitle  = NULL;
230
	ofn.nMaxFileTitle   = _MAX_FNAME + _MAX_EXT;
231
    ofn.nMaxFileTitle   = _MAX_FNAME + _MAX_EXT;
231
        ofn.lpstrInitialDir = cod;
232
    ofn.lpstrInitialDir = cod;
232
	ofn.lpstrTitle      = title;
233
    ofn.lpstrTitle      = title;
233
	ofn.Flags           = OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_EXPLORER;
234
    ofn.Flags           = OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_EXPLORER;
234
	if (multi) ofn.Flags |= OFN_ALLOWMULTISELECT;
235
    if (multi) ofn.Flags |= OFN_ALLOWMULTISELECT;
235
	ofn.nFileOffset     = 0;
236
    ofn.nFileOffset     = 0;
236
	ofn.nFileExtension  = 0;
237
    ofn.nFileExtension  = 0;
237
	ofn.lpstrDefExt     = "*";
238
    ofn.lpstrDefExt     = "*";
238
	ofn.lCustData       = 0L;
239
    ofn.lCustData       = 0L;
239
	ofn.lpfnHook        = NULL;
240
    ofn.lpfnHook        = NULL;
240
	ofn.lpTemplateName  = NULL;
241
    ofn.lpTemplateName  = NULL;
241
 
242
 
242
	if (GetOpenFileName(&ofn) == 0) {
243
    if (GetOpenFileName(&ofn) == 0) {
243
		GetCurrentDirectory(MAX_PATH, cod);
244
	GetCurrentDirectory(MAX_PATH, cod);
244
		SetCurrentDirectory(cwd);
245
	SetCurrentDirectory(cwd);
245
		strbuf[0] = 0;
246
	strbuf[0] = 0;
246
		strbuf[1] = 0;
247
	strbuf[1] = 0;
247
		return strbuf;
248
	return strbuf;
248
	} else {
249
    } else {
249
		GetCurrentDirectory(MAX_PATH, cod);
250
	GetCurrentDirectory(MAX_PATH, cod);
250
		SetCurrentDirectory(cwd);
251
	SetCurrentDirectory(cwd);
251
		for (i = 0; i <  10; i++) if (peekevent()) doevent();
252
	for (i = 0; i <  10; i++) if (peekevent()) doevent();
252
		return strbuf;
253
	return strbuf;
253
	}
254
    }
254
}
255
}
255
 
256
 
256
int countFilenames(const char *list)
257
int countFilenames(const char *list)
257
{
258
{
258
	const char *temp;
259
    const char *temp;
259
	int count;
260
    int count;
260
	count = 0;
261
    count = 0;
261
	for (temp = list; *temp; temp += strlen(temp)+1) count++;
262
    for (temp = list; *temp; temp += strlen(temp)+1) count++;
262
	return count;
263
    return count;
263
}
264
}
264
 
265
 
265
char *askfilesave(const char *title, const char *default_name)
266
char *askfilesave(const char *title, const char *default_name)
266
{
267
{
267
    return askfilesavewithdir(title, default_name, NULL);
268
    return askfilesavewithdir(title, default_name, NULL);
268
}
269
}
269
 
270
 
270
char *askfilesavewithdir(const char *title, const char *default_name, const char *dir)
271
char *askfilesavewithdir(const char *title, const char *default_name, const char *dir)
271
{
272
{
272
	int i;
273
    int i;
273
	OPENFILENAME ofn;
274
    OPENFILENAME ofn;
274
        char *p, cwd[MAX_PATH], *defext = NULL;
275
    char *p, cwd[MAX_PATH], *defext = NULL;
275
 
276
 
276
	if (!default_name) default_name = "";
277
    if (!default_name) default_name = "";
277
	else if(default_name[0] == '|') {
278
    else if(default_name[0] == '|') {
278
	    defext = (char *)default_name + 2;
279
	defext = (char *)default_name + 2;
279
	    default_name = "";
280
	default_name = "";
280
	}
281
    }
281
	strcpy(strbuf, default_name);
282
    strcpy(strbuf, default_name);
282
 
283
 
283
	ofn.lStructSize     = sizeof(OPENFILENAME);
284
    ofn.lStructSize     = sizeof(OPENFILENAME);
284
	ofn.hwndOwner       = current_window ? current_window->handle : 0;
285
    ofn.hwndOwner       = current_window ? current_window->handle : 0;
285
	ofn.hInstance       = 0;
286
    ofn.hInstance       = 0;
286
        ofn.lpstrFilter     = userfilter?userfilter:filter[0];
287
    ofn.lpstrFilter     = userfilter?userfilter:filter[0];
287
	ofn.lpstrCustomFilter = NULL;
288
    ofn.lpstrCustomFilter = NULL;
288
	ofn.nMaxCustFilter  = 0;
289
    ofn.nMaxCustFilter  = 0;
289
	ofn.nFilterIndex    = 0;
290
    ofn.nFilterIndex    = 0;
290
	ofn.lpstrFile       = strbuf;
291
    ofn.lpstrFile       = strbuf;
291
	ofn.nMaxFile        = BUFSIZE;
292
    ofn.nMaxFile        = BUFSIZE;
292
	ofn.lpstrFileTitle  = NULL;
293
    ofn.lpstrFileTitle  = NULL;
293
	ofn.nMaxFileTitle   = _MAX_FNAME + _MAX_EXT;
294
    ofn.nMaxFileTitle   = _MAX_FNAME + _MAX_EXT;
294
	if(dir && strlen(dir) > 0) {
295
    if(dir && strlen(dir) > 0) {
295
	    strcpy(cwd, dir);
296
	strcpy(cwd, dir);
296
	    for(p = cwd; *p; p++) if(*p == '/') *p = '\\';
297
	for(p = cwd; *p; p++) if(*p == '/') *p = '\\';
-
 
298
	ofn.lpstrInitialDir = cwd;
-
 
299
    } else {
-
 
300
	if (GetCurrentDirectory(MAX_PATH, cwd))
297
	    ofn.lpstrInitialDir = cwd;
301
	    ofn.lpstrInitialDir = cwd;
298
	} else {
302
	else
299
	    if (GetCurrentDirectory(MAX_PATH, cwd))
-
 
300
		ofn.lpstrInitialDir = cwd;
303
	    ofn.lpstrInitialDir = NULL;
301
	    else
304
    }
302
		ofn.lpstrInitialDir = NULL;
-
 
303
	}
-
 
304
	ofn.lpstrTitle      = title;
305
    ofn.lpstrTitle      = title;
305
	ofn.Flags           = OFN_OVERWRITEPROMPT |
306
    ofn.Flags           = OFN_OVERWRITEPROMPT |
306
                              OFN_NOCHANGEDIR | OFN_HIDEREADONLY;
307
	OFN_NOCHANGEDIR | OFN_HIDEREADONLY;
307
	ofn.nFileOffset     = 0;
308
    ofn.nFileOffset     = 0;
308
	ofn.nFileExtension  = 0;
309
    ofn.nFileExtension  = 0;
309
	ofn.lpstrDefExt     = defext;
310
    ofn.lpstrDefExt     = defext;
310
	ofn.lCustData       = 0L;
311
    ofn.lCustData       = 0L;
311
	ofn.lpfnHook        = NULL;
312
    ofn.lpfnHook        = NULL;
312
	ofn.lpTemplateName  = NULL;
313
    ofn.lpTemplateName  = NULL;
313
 
314
 
314
	if (GetSaveFileName(&ofn) == 0)
315
    if (GetSaveFileName(&ofn) == 0)
315
	    return NULL;
316
	return NULL;
316
	else {
317
    else {
317
	    for (i = 0; i < 10; i++) if (peekevent()) doevent();
318
	for (i = 0; i < 10; i++) if (peekevent()) doevent();
318
	    return strbuf;
319
	return strbuf;
319
	}
320
    }
320
}
321
}
321
 
322
 
322
/*
323
/*
323
 *  Input a string using a dialog box.
324
 *  Input a string using a dialog box.
324
 */
325
 */
325
 
326
 
326
/*
327
/*
327
 *  Dialog information structure:
328
 *  Dialog information structure:
328
 */
329
 */
329
	#define NOT_CHOSEN_YET -2
330
#define NOT_CHOSEN_YET -2
330
 
331
 
331
	typedef struct dialog_data_class {
332
typedef struct dialog_data_class {
332
		int 	hit;
333
    int	hit;
333
		char *	result;
334
    char *	result;
334
		label	question;
335
    label	question;
335
		field	text, pass;
336
    field	text, pass;
336
		button	yes, no, cancel;
337
    button	yes, no, cancel;
337
	} dialog_data;
338
} dialog_data;
338
 
339
 
339
	#define data(w) ((dialog_data *) (getdata(w)))
340
#define data(w) ((dialog_data *) (getdata(w)))
340
 
341
 
341
/*
342
/*
342
 *  Some strings to use:
343
 *  Some strings to use:
343
 */
344
 */
344
/*	static char * OKAY_STRING	= "OK";
345
/*	static char * OKAY_STRING	= "OK";
345
	static char * CANCEL_STRING	= "Cancel";
346
	static char * CANCEL_STRING	= "Cancel";
346
	static char * BROWSE_STRING	= "Browse"; */
347
	static char * BROWSE_STRING	= "Browse"; */
347
 
348
 
348
	static const char * QUESTION_TITLE	= "Question";
349
static const char * QUESTION_TITLE	= "Question";
349
	static const char * PASSWORD_TITLE	= "Password Entry";
350
static const char * PASSWORD_TITLE	= "Password Entry";
350
 
351
 
351
static void add_data(window w)
352
static void add_data(window w)
352
{
353
{
353
	dialog_data *d;
354
    dialog_data *d;
354
 
355
 
355
	d = create (dialog_data);
356
    d = create (dialog_data);
356
	if (! d)
357
    if (! d)
357
		return;
358
	return;
358
	d->hit = NOT_CHOSEN_YET;
359
    d->hit = NOT_CHOSEN_YET;
359
 
360
 
360
	setdata(w, d);
361
    setdata(w, d);
361
}
362
}
362
 
363
 
363
static char * get_dialog_string(window w)
364
static char * get_dialog_string(window w)
364
{
365
{
365
	dialog_data *d = data(w);
366
    dialog_data *d = data(w);
366
 
367
 
367
	if (d->hit < YES) /* cancelled */
368
    if (d->hit < YES) /* cancelled */
368
		return NULL;
369
	return NULL;
369
	del_string(d->result);
370
    del_string(d->result);
370
	if (d->text)	/* question dialog */
371
    if (d->text)	/* question dialog */
371
		d->result = new_string(GA_gettext(d->text));
372
	d->result = new_string(GA_gettext(d->text));
372
 
373
 
373
	return d->result;
374
    return d->result;
374
}
375
}
375
 
376
 
376
static void hit_button(control c)
377
static void hit_button(control c)
377
{
378
{
378
	window w = parentwindow(c);
379
    window w = parentwindow(c);
379
	dialog_data *d = data(w);
380
    dialog_data *d = data(w);
380
	int value = getvalue(c);
381
    int value = getvalue(c);
381
 
382
 
382
	d->hit = value;
383
    d->hit = value;
383
	hide(w);
384
    hide(w);
384
}
385
}
385
 
386
 
386
static void hit_key(window w, int key)
387
static void hit_key(window w, int key)
387
{
388
{
388
	button btn;
389
    button btn;
389
	char *name = NULL;
390
    char *name = NULL;
390
 
391
 
391
	w = parentwindow(w);
392
    w = parentwindow(w);
392
 
393
 
393
	if (data(w) == NULL)
394
    if (data(w) == NULL)
394
		return;
395
	return;
395
 
396
 
396
	if ((btn = data(w)->yes) != NULL) {
397
    if ((btn = data(w)->yes) != NULL) {
397
		name = getname(btn);
398
	name = getname(btn);
398
		if ((key == '\n') || (tolower(name[0]) == tolower(key)))
399
	if ((key == '\n') || (tolower(name[0]) == tolower(key)))
399
		{
400
	{
400
			flashcontrol(btn);
401
	    flashcontrol(btn);
401
			activatecontrol(btn);
402
	    activatecontrol(btn);
402
			return;
403
	    return;
403
		}
-
 
404
	}
404
	}
-
 
405
    }
405
 
406
 
406
	if ((btn = data(w)->cancel) != NULL) {
407
    if ((btn = data(w)->cancel) != NULL) {
407
		name = getname(btn);
408
	name = getname(btn);
408
		if ((key == ESC) || (tolower(name[0]) == tolower(key)))
409
	if ((key == ESC) || (tolower(name[0]) == tolower(key)))
409
		{
410
	{
410
			flashcontrol(btn);
411
	    flashcontrol(btn);
411
			activatecontrol(btn);
412
	    activatecontrol(btn);
412
			return;
413
	    return;
413
		}
-
 
414
	}
414
	}
-
 
415
    }
415
 
416
 
416
	if ((btn = data(w)->no) != NULL) {
417
    if ((btn = data(w)->no) != NULL) {
417
		name = getname(btn);
418
	name = getname(btn);
418
		if ((key == ESC) || (tolower(name[0]) == tolower(key)))
419
	if ((key == ESC) || (tolower(name[0]) == tolower(key)))
419
		{
420
	{
420
			flashcontrol(btn);
421
	    flashcontrol(btn);
421
			activatecontrol(btn);
422
	    activatecontrol(btn);
422
			return;
423
	    return;
423
		}
-
 
424
	}
424
	}
-
 
425
    }
425
 
426
 
426
}
427
}
427
 
428
 
428
/*
429
/*
429
 *  Handle the events from a message dialog, hide the window afterwards.
430
 *  Handle the events from a message dialog, hide the window afterwards.
430
 */
431
 */
431
static int handle_message_dialog(window w)
432
static int handle_message_dialog(window w)
432
{
433
{
433
	window old;
434
    window old;
434
	dialog_data *d = data(w);
435
    dialog_data *d = data(w);
435
 
436
 
436
	old = currentdrawing();
437
    old = currentdrawing();
437
	d->hit = NOT_CHOSEN_YET;
438
    d->hit = NOT_CHOSEN_YET;
438
 
439
 
439
	show(w);
440
    show(w);
440
	while (d->hit == NOT_CHOSEN_YET) {
441
    while (d->hit == NOT_CHOSEN_YET) {
441
		if (!peekevent()) WaitMessage();
442
	if (!peekevent()) WaitMessage();
442
		doevent();
443
	doevent();
443
	}
444
    }
444
	hide(w);
445
    hide(w);
445
 
446
 
446
	if (old) drawto(old);
447
    if (old) drawto(old);
447
 
448
 
448
	return d->hit;
449
    return d->hit;
449
}
450
}
450
 
451
 
451
static window init_askstr_dialog(const char *title, const char *question,
452
static window init_askstr_dialog(const char *title, const char *question,
452
				 const char *default_str)
453
				 const char *default_str)
453
{
454
{
454
	window win;
455
    window win;
455
	dialog_data *d;
456
    dialog_data *d;
456
	int tw, bw, h, middle;
457
    int tw, bw, h, middle;
457
 
-
 
458
	if (! question)
-
 
459
		question= "";
-
 
460
	if (! default_str)
-
 
461
		default_str = "";
-
 
462
 
-
 
463
	tw = strwidth(SystemFont, G_("Cancel")) * 8;
-
 
464
	h = getheight(SystemFont);
-
 
465
 
-
 
466
	if (tw < 150) tw = 150;
-
 
467
 
-
 
468
	win = newwindow(title, rect(0,0,tw+30,h*9+12),
-
 
469
			Titlebar | Centered | Modal);
-
 
470
        setbackground(win, dialog_bg());
-
 
471
	add_data(win);
-
 
472
	d = data(win);
-
 
473
	d->question = newlabel(question, rect(10,h,tw+4,h*2+2),
-
 
474
			AlignLeft);
-
 
475
	if (title == PASSWORD_TITLE)
-
 
476
		d->text = newpassword(default_str, rect(10,h*4,tw+4,h*3/2));
-
 
477
	else
-
 
478
		d->text = newfield(default_str, rect(10,h*4,tw+4,h*3/2));
-
 
479
 
458
 
-
 
459
    if (! question)
-
 
460
	question= "";
-
 
461
    if (! default_str)
-
 
462
	default_str = "";
-
 
463
 
-
 
464
    tw = strwidth(SystemFont, G_("Cancel")) * 8;
-
 
465
    h = getheight(SystemFont);
-
 
466
 
-
 
467
    if (tw < 150) tw = 150;
-
 
468
 
-
 
469
    win = newwindow(title, rect(0,0,tw+30,h*9+12),
-
 
470
		    Titlebar | Centered | Modal);
-
 
471
    setbackground(win, dialog_bg());
-
 
472
    add_data(win);
-
 
473
    d = data(win);
-
 
474
    d->question = newlabel(question, rect(10,h,tw+4,h*2+2),
-
 
475
			   AlignLeft);
-
 
476
    if (title == PASSWORD_TITLE)
-
 
477
	d->text = newpassword(default_str, rect(10,h*4,tw+4,h*3/2));
-
 
478
    else
-
 
479
	d->text = newfield(default_str, rect(10,h*4,tw+4,h*3/2));
-
 
480
 
480
	middle = (tw+30)/2;
481
    middle = (tw+30)/2;
481
	bw = strwidth(SystemFont, G_("Cancel")) * 3/2;
482
    bw = strwidth(SystemFont, G_("Cancel")) * 3/2;
-
 
483
 
-
 
484
    d->yes = newbutton(G_("OK"),
-
 
485
		       rect(middle-bw-10, h*7, bw, h+10), hit_button);
-
 
486
    setvalue(d->yes, YES);
-
 
487
 
-
 
488
    d->cancel = newbutton(G_("Cancel"),
-
 
489
			  rect(middle+10, h*7, bw, h+10), hit_button);
-
 
490
    setvalue(d->cancel, CANCEL);
482
 
491
 
483
	d->yes = newbutton(G_("OK"),
-
 
484
			rect(middle-bw-10, h*7, bw, h+10), hit_button);
-
 
485
	setvalue(d->yes, YES);
492
    setkeydown(win, hit_key);
486
 
493
 
487
	d->cancel = newbutton(G_("Cancel"),
-
 
488
			rect(middle+10, h*7, bw, h+10), hit_button);
-
 
489
	setvalue(d->cancel, CANCEL);
-
 
490
 
-
 
491
	setkeydown(win, hit_key);
-
 
492
 
-
 
493
	return win;
494
    return win;
494
}
495
}
495
 
496
 
496
char *askstring(const char *question, const char *default_str)
497
char *askstring(const char *question, const char *default_str)
497
{
498
{
498
	static window win = NULL;
499
    static window win = NULL;
499
	window prev = current_window;
500
    window prev = current_window;
500
 
501
 
501
	if (! win)
502
    if (! win)
502
		win = init_askstr_dialog(QUESTION_TITLE, question, default_str);
503
	win = init_askstr_dialog(QUESTION_TITLE, question, default_str);
503
	else {
504
    else {
504
		settext(data(win)->question, question);
505
	settext(data(win)->question, question);
505
		settext(data(win)->text, default_str);
506
	settext(data(win)->text, default_str);
506
	}
507
    }
507
	if (TopmostDialogs & MB_TOPMOST)
508
    if (TopmostDialogs & MB_TOPMOST)
508
	    BringToTop(win, 1);
509
	BringToTop(win, 1);
509
	handle_message_dialog(win);
510
    handle_message_dialog(win);
510
	current_window = prev;
511
    current_window = prev;
511
 
512
 
512
	return get_dialog_string(win);
513
    return get_dialog_string(win);
513
}
514
}
514
 
515
 
515
char *askcdstring(const char *question, const char *default_str)
516
char *askcdstring(const char *question, const char *default_str)
516
{
517
{
517
    LPMALLOC g_pMalloc;
518
    LPMALLOC g_pMalloc;
518
    BROWSEINFO bi;
519
    BROWSEINFO bi;
519
    LPITEMIDLIST pidlBrowse;
520
    LPITEMIDLIST pidlBrowse;
520
    browserInfo info;
521
    browserInfo info;
521
    OSVERSIONINFOEX osvi;
522
    OSVERSIONINFOEX osvi;
522
    
523
 
523
    strncpy(info.question, question, 40);
524
    strncpy(info.question, question, 40);
524
    strncpy(info.default_str, default_str, MAX_PATH);
525
    strncpy(info.default_str, default_str, MAX_PATH);
525
 
526
 
526
    /* Get the shell's allocator. */
527
    /* Get the shell's allocator. */
527
    if (!SUCCEEDED(SHGetMalloc(&g_pMalloc))) return NULL;
528
    if (!SUCCEEDED(SHGetMalloc(&g_pMalloc))) return NULL;
Line 530... Line 531...
530
    GetVersionEx((OSVERSIONINFO *)&osvi);
531
    GetVersionEx((OSVERSIONINFO *)&osvi);
531
 
532
 
532
    ZeroMemory(&bi, sizeof(bi));
533
    ZeroMemory(&bi, sizeof(bi));
533
    bi.hwndOwner = 0;
534
    bi.hwndOwner = 0;
534
    if(osvi.dwMajorVersion >= 6) { /* future proof */
535
    if(osvi.dwMajorVersion >= 6) { /* future proof */
535
    /* CSIDL_DESKTOP gets mapped to the User's desktop in Vista
536
	/* CSIDL_DESKTOP gets mapped to the User's desktop in Vista
536
       (a bug).  SHGetFolderLocation is Win2k or later */
537
	   (a bug).  SHGetFolderLocation is Win2k or later */
537
    if (!SUCCEEDED(SHGetFolderLocation(NULL, CSIDL_DRIVES, NULL, 0, 
538
	if (!SUCCEEDED(SHGetFolderLocation(NULL, CSIDL_DRIVES, NULL, 0,
538
				       (LPITEMIDLIST *) &bi.pidlRoot))) 
539
					   (LPITEMIDLIST *) &bi.pidlRoot)))
539
	return NULL;
540
	    return NULL;
540
    }  /* else it is 0, which is CSIDL_DESKTOP */
541
    }  /* else it is 0, which is CSIDL_DESKTOP */
541
    bi.pszDisplayName = strbuf;
542
    bi.pszDisplayName = strbuf;
542
    bi.lpszTitle = question;
543
    bi.lpszTitle = question;
543
    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
544
    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
544
    bi.lpfn = (BFFCALLBACK) InitBrowseCallbackProc;
545
    bi.lpfn = (BFFCALLBACK) InitBrowseCallbackProc;
Line 546... Line 547...
546
 
547
 
547
    /* Browse for a folder and return its PIDL. */
548
    /* Browse for a folder and return its PIDL. */
548
    pidlBrowse = SHBrowseForFolder(&bi);
549
    pidlBrowse = SHBrowseForFolder(&bi);
549
    if (pidlBrowse != NULL) {
550
    if (pidlBrowse != NULL) {
550
	SHGetPathFromIDList(pidlBrowse, strbuf);
551
	SHGetPathFromIDList(pidlBrowse, strbuf);
551
        g_pMalloc->lpVtbl->Free(g_pMalloc, pidlBrowse);
552
	g_pMalloc->lpVtbl->Free(g_pMalloc, pidlBrowse);
552
        if (strbuf[0]) 
553
	if (strbuf[0])
553
            return strbuf;
554
	    return strbuf;
554
    }
555
    }
555
    return NULL;
556
    return NULL;
556
}
557
}
557
 
558
 
558
char *askpassword(const char *question, const char *default_str)
559
char *askpassword(const char *question, const char *default_str)
559
{
560
{
560
	static window win = NULL;
561
    static window win = NULL;
561
	window prev = current_window;
562
    window prev = current_window;
562
 
563
 
563
	if (! win)
564
    if (! win)
564
		win = init_askstr_dialog(PASSWORD_TITLE, question, default_str);
565
	win = init_askstr_dialog(PASSWORD_TITLE, question, default_str);
565
	else {
566
    else {
566
		settext(data(win)->question, question);
567
	settext(data(win)->question, question);
567
		settext(data(win)->text, default_str);
568
	settext(data(win)->text, default_str);
568
	}
569
    }
569
	if (TopmostDialogs & MB_TOPMOST)
570
    if (TopmostDialogs & MB_TOPMOST)
570
	    BringToTop(win, 1);
571
	BringToTop(win, 1);
571
	handle_message_dialog(win);
572
    handle_message_dialog(win);
572
	current_window = prev;
573
    current_window = prev;
573
 
574
 
574
	return get_dialog_string(win);
575
    return get_dialog_string(win);
575
}
576
}
576
 
577
 
577
char *askUserPass(const char *title)
578
char *askUserPass(const char *title)
578
{
579
{
579
    static window win = NULL;
580
    static window win = NULL;
Line 586... Line 587...
586
	tw = strwidth(SystemFont, G_("Cancel")) * 8;
587
	tw = strwidth(SystemFont, G_("Cancel")) * 8;
587
	h = getheight(SystemFont);
588
	h = getheight(SystemFont);
588
	if (tw < 150) tw = 150;
589
	if (tw < 150) tw = 150;
589
	win = newwindow(title, rect(0, 0, tw+30, h*9+12),
590
	win = newwindow(title, rect(0, 0, tw+30, h*9+12),
590
			Titlebar | Centered | Modal);
591
			Titlebar | Centered | Modal);
591
        setbackground(win, dialog_bg());
592
	setbackground(win, dialog_bg());
592
	add_data(win);
593
	add_data(win);
593
	d = data(win);
594
	d = data(win);
594
	d->question = newlabel(G_("User"), rect(10, h, tw+4, h*2+2), AlignLeft);
595
	d->question = newlabel(G_("User"), rect(10, h, tw+4, h*2+2), AlignLeft);
595
	bw = strwidth(SystemFont, G_("Password"));
596
	bw = strwidth(SystemFont, G_("Password"));
596
	d->text = newfield("", rect(20+bw, h, tw-6-bw, h*3/2));
597
	d->text = newfield("", rect(20+bw, h, tw-6-bw, h*3/2));
Line 642... Line 643...
642
HWND get_modeless()
643
HWND get_modeless()
643
{
644
{
644
    return hModelessDlg;
645
    return hModelessDlg;
645
}
646
}
646
 
647
 
647
void finddialog(textbox t){
648
void finddialog(textbox t)
-
 
649
{
648
    static FINDREPLACE fr;
650
    static FINDREPLACE fr;
649
    static char szFindWhat[80];
651
    static char szFindWhat[80];
650
 
652
 
651
    fr.lStructSize = sizeof(fr);
653
    fr.lStructSize = sizeof(fr);
652
    fr.hwndOwner = t->handle;
654
    fr.hwndOwner = t->handle;
Line 658... Line 660...
658
    fr.lpTemplateName   = NULL ;
660
    fr.lpTemplateName   = NULL ;
659
 
661
 
660
    hModelessDlg = FindText(&fr);
662
    hModelessDlg = FindText(&fr);
661
}
663
}
662
 
664
 
663
void replacedialog(textbox t){
665
void replacedialog(textbox t)
-
 
666
{
664
    static FINDREPLACE fr;
667
    static FINDREPLACE fr;
665
    static char szFindWhat[80];
668
    static char szFindWhat[80];
666
    static char szReplaceWith[80];
669
    static char szReplaceWith[80];
667
 
670
 
668
    fr.lStructSize = sizeof(fr);
671
    fr.lStructSize = sizeof(fr);
Line 775... Line 778...
775
    }
778
    }
776
 
779
 
777
    else if (pfr->Flags & FR_DIALOGTERM)
780
    else if (pfr->Flags & FR_DIALOGTERM)
778
	hModelessDlg = NULL;
781
	hModelessDlg = NULL;
779
}
782
}
780
 
-