summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--changes4
-rw-r--r--macosx/tkMacOSXDialog.c1511
3 files changed, 766 insertions, 752 deletions
diff --git a/ChangeLog b/ChangeLog
index 85e8e21..af16a0d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,9 @@
* changes: added latest aqua bug fixes.
+ * macosx/tkMacOSXDialog.c (Tk_MessageBoxObjCmd): added standard Escape
+ key binding for msgbox cancel buttons [Patch 1193614], whitespace.
+
* macosx/tkMacOSXCarbonEvents.c: handle kEventCommandUpdateStatus
* macosx/tkMacOSXEvent.c: carbon event to dynamically enable
the 'Preferences' app menu item when proc [::tk::mac::ShowPreferences]
diff --git a/changes b/changes
index 990f01c..69fc942 100644
--- a/changes
+++ b/changes
@@ -2,7 +2,7 @@ This file summarizes all changes made to Tk since version 1.0 was
released on March 13, 1991. Changes that aren't backward compatible
are marked specially.
-RCS: @(#) $Id: changes,v 1.95 2006/04/11 10:23:20 das Exp $
+RCS: @(#) $Id: changes,v 1.96 2006/04/11 12:05:48 das Exp $
3/16/91 (bug fix) Modified tkWindow.c to remove Tk's Tcl commands from
the interpreter when the main window is deleted (otherwise there will
@@ -6168,6 +6168,8 @@ accept the color names "Black" and "White" (porter)
2006-04-11 (bug fix)[700316] Aqua: enable 'Preferences' app menu item (steffen)
+2006-04-11 (bug fix)[1193614] Aqua: tk_messageBox escape key binding (steffen)
+
2006-04-11 (enhancement)[1105284] Aqua: call ::tk::mac::* procs for all
registered applevents (steffen)
diff --git a/macosx/tkMacOSXDialog.c b/macosx/tkMacOSXDialog.c
index 4040791..5880b48 100644
--- a/macosx/tkMacOSXDialog.c
+++ b/macosx/tkMacOSXDialog.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXDialog.c,v 1.19 2006/03/24 14:58:01 das Exp $
+ * RCS: @(#) $Id: tkMacOSXDialog.c,v 1.20 2006/04/11 12:05:50 das Exp $
*/
#include "tkMacOSXInt.h"
@@ -63,26 +63,26 @@ typedef struct {
} CallbackUserData;
-static OSStatus AlertHandler _ANSI_ARGS_(( EventHandlerCallRef callRef,
- EventRef eventRef, void *userData ));
-static Boolean MatchOneType _ANSI_ARGS_((StringPtr fileNamePtr, OSType fileType,
- OpenFileData *myofdPtr, FileFilter *filterPtr));
-static pascal Boolean OpenFileFilterProc(AEDesc* theItem, void* info,
- NavCallBackUserData callBackUD,
- NavFilterModes filterMode );
+static OSStatus AlertHandler(EventHandlerCallRef callRef,
+ EventRef eventRef, void *userData);
+static Boolean MatchOneType(StringPtr fileNamePtr, OSType fileType,
+ OpenFileData *myofdPtr, FileFilter *filterPtr);
+static pascal Boolean OpenFileFilterProc(AEDesc* theItem, void* info,
+ NavCallBackUserData callBackUD,
+ NavFilterModes filterMode);
static pascal void OpenEventProc(NavEventCallbackMessage callBackSelector,
- NavCBRecPtr callBackParms,
- NavCallBackUserData callBackUD );
+ NavCBRecPtr callBackParms,
+ NavCallBackUserData callBackUD);
static void InitFileDialogs();
static int NavServicesGetFile(Tcl_Interp *interp, OpenFileData *ofd,
- AEDesc *initialDescPtr,
- char *initialFile, AEDescList *selectDescPtr,
- CFStringRef title, CFStringRef message, int multiple, int isOpen);
+ AEDesc *initialDescPtr,
+ char *initialFile, AEDescList *selectDescPtr,
+ CFStringRef title, CFStringRef message, int multiple, int isOpen);
static int HandleInitialDirectory (Tcl_Interp *interp,
- char *initialFile, char *initialDir,
- FSRef *dirRef,
- AEDescList *selectDescPtr,
- AEDesc *dirDescPtr);
+ char *initialFile, char *initialDir,
+ FSRef *dirRef,
+ AEDescList *selectDescPtr,
+ AEDesc *dirDescPtr);
/*
* Have we initialized the file dialog subsystem
@@ -131,106 +131,106 @@ Tk_ChooseColorObjCmd(
static int inited = 0;
static RGBColor in;
static CONST char *optionStrings[] = {
- "-initialcolor", "-parent", "-title", NULL
+ "-initialcolor", "-parent", "-title", NULL
};
enum options {
- COLOR_INITIAL, COLOR_PARENT, COLOR_TITLE
+ COLOR_INITIAL, COLOR_PARENT, COLOR_TITLE
};
if (inited == 0) {
- /*
- * 'in' stores the last color picked. The next time the color dialog
- * pops up, the last color will remain in the dialog.
- */
-
- in.red = 0xffff;
- in.green = 0xffff;
- in.blue = 0xffff;
- inited = 1;
+ /*
+ * 'in' stores the last color picked. The next time the color dialog
+ * pops up, the last color will remain in the dialog.
+ */
+
+ in.red = 0xffff;
+ in.green = 0xffff;
+ in.blue = 0xffff;
+ inited = 1;
}
-
+
parent = (Tk_Window) clientData;
title = "Choose a color:";
picked = 0;
-
+
for (i = 1; i < objc; i += 2) {
- int index;
- char *option, *value;
-
- if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, "option",
- TCL_EXACT, &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (i + 1 == objc) {
- option = Tcl_GetStringFromObj(objv[i], NULL);
- Tcl_AppendResult(interp, "value for \"", option, "\" missing",
- (char *) NULL);
- return TCL_ERROR;
- }
- value = Tcl_GetStringFromObj(objv[i + 1], NULL);
-
- switch ((enum options) index) {
- case COLOR_INITIAL: {
- XColor *colorPtr;
-
- colorPtr = Tk_GetColor(interp, parent, value);
- if (colorPtr == NULL) {
- return TCL_ERROR;
- }
- in.red = colorPtr->red;
- in.green = colorPtr->green;
- in.blue = colorPtr->blue;
- Tk_FreeColor(colorPtr);
- break;
- }
- case COLOR_PARENT: {
- parent = Tk_NameToWindow(interp, value, parent);
- if (parent == NULL) {
- return TCL_ERROR;
- }
- break;
- }
- case COLOR_TITLE: {
- title = value;
- break;
- }
- }
+ int index;
+ char *option, *value;
+
+ if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, "option",
+ TCL_EXACT, &index) != TCL_OK) {
+ return TCL_ERROR;
+ }
+ if (i + 1 == objc) {
+ option = Tcl_GetStringFromObj(objv[i], NULL);
+ Tcl_AppendResult(interp, "value for \"", option, "\" missing",
+ (char *) NULL);
+ return TCL_ERROR;
+ }
+ value = Tcl_GetStringFromObj(objv[i + 1], NULL);
+
+ switch ((enum options) index) {
+ case COLOR_INITIAL: {
+ XColor *colorPtr;
+
+ colorPtr = Tk_GetColor(interp, parent, value);
+ if (colorPtr == NULL) {
+ return TCL_ERROR;
+ }
+ in.red = colorPtr->red;
+ in.green = colorPtr->green;
+ in.blue = colorPtr->blue;
+ Tk_FreeColor(colorPtr);
+ break;
+ }
+ case COLOR_PARENT: {
+ parent = Tk_NameToWindow(interp, value, parent);
+ if (parent == NULL) {
+ return TCL_ERROR;
+ }
+ break;
+ }
+ case COLOR_TITLE: {
+ title = value;
+ break;
+ }
+ }
}
-
+
cpinfo.theColor.profile = 0L;
cpinfo.theColor.color.rgb.red = in.red;
cpinfo.theColor.color.rgb.green = in.green;
cpinfo.theColor.color.rgb.blue = in.blue;
cpinfo.dstProfile = 0L;
- cpinfo.flags = kColorPickerCanModifyPalette
- | kColorPickerCanAnimatePalette;
+ cpinfo.flags = kColorPickerCanModifyPalette
+ | kColorPickerCanAnimatePalette;
cpinfo.placeWhere = kDeepestColorScreen;
cpinfo.pickerType = 0L;
cpinfo.eventProc = NULL;
cpinfo.colorProc = NULL;
cpinfo.colorProcData = 0;
-
+
/* This doesn't seem to actually set the title! */
- Tcl_UtfToExternal(NULL, NULL, title, -1, 0, NULL,
- StrBody(cpinfo.prompt), 255, &srcRead, &dstWrote, NULL);
+ Tcl_UtfToExternal(NULL, NULL, title, -1, 0, NULL,
+ StrBody(cpinfo.prompt), 255, &srcRead, &dstWrote, NULL);
StrLength(cpinfo.prompt) = (unsigned char) dstWrote;
if ((PickColor(&cpinfo) == noErr) && (cpinfo.newColorChosen != 0)) {
- in.red = cpinfo.theColor.color.rgb.red;
- in.green = cpinfo.theColor.color.rgb.green;
- in.blue = cpinfo.theColor.color.rgb.blue;
- picked = 1;
+ in.red = cpinfo.theColor.color.rgb.red;
+ in.green = cpinfo.theColor.color.rgb.green;
+ in.blue = cpinfo.theColor.color.rgb.blue;
+ picked = 1;
}
-
+
if (picked != 0) {
- char result[32];
+ char result[32];
- sprintf(result, "#%02x%02x%02x", in.red >> 8, in.green >> 8,
- in.blue >> 8);
- Tcl_AppendResult(interp, result, NULL);
+ sprintf(result, "#%02x%02x%02x", in.red >> 8, in.green >> 8,
+ in.blue >> 8);
+ Tcl_AppendResult(interp, result, NULL);
}
-
+
return TCL_OK;
}
@@ -268,22 +268,22 @@ Tk_GetOpenFileObjCmd(
AEDescList selectDesc = {typeNull, NULL};
char *initialFile = NULL, *initialDir = NULL;
static CONST char *openOptionStrings[] = {
- "-defaultextension", "-filetypes",
- "-initialdir", "-initialfile",
- "-message", "-multiple",
- "-parent", "-title", NULL
+ "-defaultextension", "-filetypes",
+ "-initialdir", "-initialfile",
+ "-message", "-multiple",
+ "-parent", "-title", NULL
};
enum openOptions {
- OPEN_DEFAULT, OPEN_FILETYPES,
- OPEN_INITDIR, OPEN_INITFILE,
- OPEN_MESSAGE, OPEN_MULTIPLE,
- OPEN_PARENT, OPEN_TITLE
+ OPEN_DEFAULT, OPEN_FILETYPES,
+ OPEN_INITDIR, OPEN_INITFILE,
+ OPEN_MESSAGE, OPEN_MULTIPLE,
+ OPEN_PARENT, OPEN_TITLE
};
-
+
if (!fileDlgInited) {
- InitFileDialogs();
+ InitFileDialogs();
}
-
+
result = TCL_ERROR;
parent = (Tk_Window) clientData;
multiple = false;
@@ -297,94 +297,94 @@ Tk_GetOpenFileObjCmd(
ofd.usePopup = 1;
for (i = 1; i < objc; i += 2) {
- char *choice;
- int index, choiceLen;
- char *string;
-
- if (Tcl_GetIndexFromObj(interp, objv[i], openOptionStrings, "option",
- TCL_EXACT, &index) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- if (i + 1 == objc) {
- string = Tcl_GetStringFromObj(objv[i], NULL);
- Tcl_AppendResult(interp, "value for \"", string, "\" missing",
- (char *) NULL);
- result = TCL_ERROR;
- goto end;
- }
-
- switch (index) {
- case OPEN_DEFAULT:
- break;
- case OPEN_FILETYPES:
- if (TkGetFileFilters(interp, &ofd.fl, objv[i + 1], 0)
- != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_INITDIR:
- initialDir = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ char *choice;
+ int index, choiceLen;
+ char *string;
+
+ if (Tcl_GetIndexFromObj(interp, objv[i], openOptionStrings, "option",
+ TCL_EXACT, &index) != TCL_OK) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ if (i + 1 == objc) {
+ string = Tcl_GetStringFromObj(objv[i], NULL);
+ Tcl_AppendResult(interp, "value for \"", string, "\" missing",
+ (char *) NULL);
+ result = TCL_ERROR;
+ goto end;
+ }
+
+ switch (index) {
+ case OPEN_DEFAULT:
+ break;
+ case OPEN_FILETYPES:
+ if (TkGetFileFilters(interp, &ofd.fl, objv[i + 1], 0)
+ != TCL_OK) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case OPEN_INITDIR:
+ initialDir = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
/* empty strings should be like no selection given */
if (choiceLen == 0) { initialDir = NULL; }
- break;
- case OPEN_INITFILE:
- initialFile = Tcl_GetStringFromObj(objv[i + 1], NULL);
+ break;
+ case OPEN_INITFILE:
+ initialFile = Tcl_GetStringFromObj(objv[i + 1], NULL);
/* empty strings should be like no selection given */
if (choiceLen == 0) { initialFile = NULL; }
- break;
- case OPEN_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- case OPEN_MULTIPLE:
- if (Tcl_GetBooleanFromObj(interp, objv[i + 1], &multiple)
- != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- }
+ break;
+ case OPEN_MESSAGE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
+ kCFStringEncodingUTF8, false);
+ break;
+ case OPEN_MULTIPLE:
+ if (Tcl_GetBooleanFromObj(interp, objv[i + 1], &multiple)
+ != TCL_OK) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case OPEN_PARENT:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ parent = Tk_NameToWindow(interp, choice, parent);
+ if (parent == NULL) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case OPEN_TITLE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
+ kCFStringEncodingUTF8, false);
+ break;
+ }
}
if (HandleInitialDirectory(interp, initialFile, initialDir, &dirRef,
- &selectDesc, &initialDesc) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
+ &selectDesc, &initialDesc) != TCL_OK) {
+ result = TCL_ERROR;
+ goto end;
}
-
+
if (initialDesc.descriptorType == typeFSRef) {
- initialPtr = &initialDesc;
+ initialPtr = &initialDesc;
}
result = NavServicesGetFile(interp, &ofd, initialPtr,
- NULL, &selectDesc, title, message, multiple, OPEN_FILE);
+ NULL, &selectDesc, title, message, multiple, OPEN_FILE);
end:
TkFreeFileFilters(&ofd.fl);
AEDisposeDesc(&initialDesc);
AEDisposeDesc(&selectDesc);
if (title != NULL) {
- CFRelease(title);
+ CFRelease(title);
}
if (message != NULL) {
- CFRelease(message);
+ CFRelease(message);
}
-
+
return result;
}
@@ -420,16 +420,16 @@ Tk_GetSaveFileObjCmd(
CFStringRef title, message;
OpenFileData ofd;
static CONST char *saveOptionStrings[] = {
- "-defaultextension", "-filetypes", "-initialdir", "-initialfile",
- "-message", "-parent", "-title", NULL
+ "-defaultextension", "-filetypes", "-initialdir", "-initialfile",
+ "-message", "-parent", "-title", NULL
};
enum saveOptions {
- SAVE_DEFAULT, SAVE_FILETYPES, SAVE_INITDIR, SAVE_INITFILE,
- SAVE_MESSAGE, SAVE_PARENT, SAVE_TITLE
+ SAVE_DEFAULT, SAVE_FILETYPES, SAVE_INITDIR, SAVE_INITFILE,
+ SAVE_MESSAGE, SAVE_PARENT, SAVE_TITLE
};
if (!fileDlgInited) {
- InitFileDialogs();
+ InitFileDialogs();
}
result = TCL_ERROR;
@@ -438,79 +438,79 @@ Tk_GetSaveFileObjCmd(
message = NULL;
for (i = 1; i < objc; i += 2) {
- char *choice;
- int index, choiceLen;
- char *string;
-
- if (Tcl_GetIndexFromObj(interp, objv[i], saveOptionStrings, "option",
- TCL_EXACT, &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (i + 1 == objc) {
- string = Tcl_GetStringFromObj(objv[i], NULL);
- Tcl_AppendResult(interp, "value for \"", string, "\" missing",
- (char *) NULL);
- return TCL_ERROR;
- }
- switch (index) {
- case SAVE_DEFAULT:
- break;
- case SAVE_FILETYPES:
- /* Currently unimplemented - what would we do here anyway? */
- break;
- case SAVE_INITDIR:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ char *choice;
+ int index, choiceLen;
+ char *string;
+
+ if (Tcl_GetIndexFromObj(interp, objv[i], saveOptionStrings, "option",
+ TCL_EXACT, &index) != TCL_OK) {
+ return TCL_ERROR;
+ }
+ if (i + 1 == objc) {
+ string = Tcl_GetStringFromObj(objv[i], NULL);
+ Tcl_AppendResult(interp, "value for \"", string, "\" missing",
+ (char *) NULL);
+ return TCL_ERROR;
+ }
+ switch (index) {
+ case SAVE_DEFAULT:
+ break;
+ case SAVE_FILETYPES:
+ /* Currently unimplemented - what would we do here anyway? */
+ break;
+ case SAVE_INITDIR:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
/* empty strings should be like no selection given */
if (choiceLen &&
- HandleInitialDirectory(interp, NULL, choice, &dirRef,
+ HandleInitialDirectory(interp, NULL, choice, &dirRef,
NULL, &initialDesc) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
- break;
- case SAVE_INITFILE:
- initialFile = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ break;
+ case SAVE_INITFILE:
+ initialFile = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
/* empty strings should be like no selection given */
if (choiceLen == 0) { initialFile = NULL; }
- break;
- case SAVE_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- case SAVE_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case SAVE_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- }
+ break;
+ case SAVE_MESSAGE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
+ kCFStringEncodingUTF8, false);
+ break;
+ case SAVE_PARENT:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ parent = Tk_NameToWindow(interp, choice, parent);
+ if (parent == NULL) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case SAVE_TITLE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
+ kCFStringEncodingUTF8, false);
+ break;
+ }
}
TkInitFileFilters(&ofd.fl);
ofd.usePopup = 0;
if (initialDesc.descriptorType == typeFSRef) {
- initialPtr = &initialDesc;
+ initialPtr = &initialDesc;
}
result = NavServicesGetFile(interp, &ofd, initialPtr, initialFile, NULL,
- title, message, false, SAVE_FILE);
+ title, message, false, SAVE_FILE);
end:
AEDisposeDesc(&initialDesc);
if (title != NULL) {
- CFRelease(title);
+ CFRelease(title);
}
if (message != NULL) {
- CFRelease(message);
+ CFRelease(message);
}
return result;
@@ -521,8 +521,8 @@ Tk_GetSaveFileObjCmd(
*
* Tk_ChooseDirectoryObjCmd --
*
- * This procedure implements the "tk_chooseDirectory" dialog box
- * for the Windows platform. See the user documentation for details
+ * This procedure implements the "tk_chooseDirectory" dialog box
+ * for the Windows platform. See the user documentation for details
* on what it does.
*
* Results:
@@ -558,11 +558,11 @@ Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv)
};
if (!NavServicesAvailable()) {
- return TCL_ERROR;
+ return TCL_ERROR;
}
if (!fileDlgInited) {
- InitFileDialogs();
+ InitFileDialogs();
}
result = TCL_ERROR;
parent = (Tk_Window) clientData;
@@ -570,69 +570,69 @@ Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv)
message = NULL;
for (i = 1; i < objc; i += 2) {
- char *choice;
- int index, choiceLen;
- char *string;
-
- if (Tcl_GetIndexFromObj(interp, objv[i], chooseOptionStrings, "option",
- TCL_EXACT, &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (i + 1 == objc) {
- string = Tcl_GetStringFromObj(objv[i], NULL);
- Tcl_AppendResult(interp, "value for \"", string, "\" missing",
- (char *) NULL);
- return TCL_ERROR;
- }
- switch (index) {
- case CHOOSE_INITDIR:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ char *choice;
+ int index, choiceLen;
+ char *string;
+
+ if (Tcl_GetIndexFromObj(interp, objv[i], chooseOptionStrings, "option",
+ TCL_EXACT, &index) != TCL_OK) {
+ return TCL_ERROR;
+ }
+ if (i + 1 == objc) {
+ string = Tcl_GetStringFromObj(objv[i], NULL);
+ Tcl_AppendResult(interp, "value for \"", string, "\" missing",
+ (char *) NULL);
+ return TCL_ERROR;
+ }
+ switch (index) {
+ case CHOOSE_INITDIR:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
if (choiceLen &&
HandleInitialDirectory(interp, NULL, choice, &dirRef,
NULL, &initialDesc) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case CHOOSE_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- case CHOOSE_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case CHOOSE_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- }
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case CHOOSE_MESSAGE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
+ kCFStringEncodingUTF8, false);
+ break;
+ case CHOOSE_PARENT:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ parent = Tk_NameToWindow(interp, choice, parent);
+ if (parent == NULL) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case CHOOSE_TITLE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
+ kCFStringEncodingUTF8, false);
+ break;
+ }
}
TkInitFileFilters(&ofd.fl);
ofd.usePopup = 0;
if (initialDesc.descriptorType == typeFSRef) {
- initialPtr = &initialDesc;
+ initialPtr = &initialDesc;
}
result = NavServicesGetFile(interp, &ofd, initialPtr, NULL, NULL,
- title, message, false, CHOOSE_FOLDER);
+ title, message, false, CHOOSE_FOLDER);
end:
AEDisposeDesc(&initialDesc);
if (title != NULL) {
- CFRelease(title);
+ CFRelease(title);
}
if (message != NULL) {
- CFRelease(message);
+ CFRelease(message);
}
-
+
return result;
}
@@ -641,7 +641,7 @@ HandleInitialDirectory (
Tcl_Interp *interp,
char *initialFile,
char *initialDir,
- FSRef *dirRef,
+ FSRef *dirRef,
AEDescList *selectDescPtr,
AEDesc *dirDescPtr)
{
@@ -652,59 +652,59 @@ HandleInitialDirectory (
int result = TCL_OK;
if (initialDir != NULL) {
- dirName = Tcl_TranslateFileName(interp, initialDir, &ds);
- if (dirName == NULL) {
- return TCL_ERROR;
- }
-
- err = FSPathMakeRef((unsigned char*) dirName,
- dirRef, &isDirectory);
-
- if (err != noErr) {
- Tcl_AppendResult(interp, "bad directory \"",
- initialDir, "\"", NULL);
- result = TCL_ERROR;
- goto end;
- }
- if (!isDirectory) {
- Tcl_AppendResult(interp, "-intialdir \"",
- initialDir, " is a file, not a directory.\"", NULL);
- result = TCL_ERROR;
- goto end;
- }
-
- AECreateDesc(typeFSRef, dirRef, sizeof(*dirRef), dirDescPtr);
+ dirName = Tcl_TranslateFileName(interp, initialDir, &ds);
+ if (dirName == NULL) {
+ return TCL_ERROR;
+ }
+
+ err = FSPathMakeRef((unsigned char*) dirName,
+ dirRef, &isDirectory);
+
+ if (err != noErr) {
+ Tcl_AppendResult(interp, "bad directory \"",
+ initialDir, "\"", NULL);
+ result = TCL_ERROR;
+ goto end;
+ }
+ if (!isDirectory) {
+ Tcl_AppendResult(interp, "-intialdir \"",
+ initialDir, " is a file, not a directory.\"", NULL);
+ result = TCL_ERROR;
+ goto end;
+ }
+
+ AECreateDesc(typeFSRef, dirRef, sizeof(*dirRef), dirDescPtr);
}
if (initialFile != NULL && selectDescPtr != NULL) {
- FSRef fileRef;
- AEDesc fileDesc;
- char *namePtr;
-
- if (initialDir != NULL) {
- Tcl_DStringAppend(&ds, "/", 1);
- Tcl_DStringAppend(&ds, initialFile, -1);
- namePtr = Tcl_DStringValue(&ds);
- } else {
- namePtr = initialFile;
- }
-
- AECreateList(NULL, 0, false, selectDescPtr);
-
- err = FSPathMakeRef((unsigned char*) namePtr, &fileRef, &isDirectory);
- if (err != noErr) {
- Tcl_AppendResult(interp, "bad initialfile \"", initialFile,
- "\" file does not exist.", NULL);
- return TCL_ERROR;
- }
- AECreateDesc(typeFSRef, &fileRef, sizeof(fileRef), &fileDesc);
- AEPutDesc(selectDescPtr, 1, &fileDesc);
- AEDisposeDesc(&fileDesc);
+ FSRef fileRef;
+ AEDesc fileDesc;
+ char *namePtr;
+
+ if (initialDir != NULL) {
+ Tcl_DStringAppend(&ds, "/", 1);
+ Tcl_DStringAppend(&ds, initialFile, -1);
+ namePtr = Tcl_DStringValue(&ds);
+ } else {
+ namePtr = initialFile;
+ }
+
+ AECreateList(NULL, 0, false, selectDescPtr);
+
+ err = FSPathMakeRef((unsigned char*) namePtr, &fileRef, &isDirectory);
+ if (err != noErr) {
+ Tcl_AppendResult(interp, "bad initialfile \"", initialFile,
+ "\" file does not exist.", NULL);
+ return TCL_ERROR;
+ }
+ AECreateDesc(typeFSRef, &fileRef, sizeof(fileRef), &fileDesc);
+ AEPutDesc(selectDescPtr, 1, &fileDesc);
+ AEDisposeDesc(&fileDesc);
}
end:
if (dirName != NULL) {
- Tcl_DStringFree(&ds);
+ Tcl_DStringFree(&ds);
}
return result;
}
@@ -739,126 +739,126 @@ NavServicesGetFile(
err = NavGetDefaultDialogCreationOptions(&diagOptions);
if (err!=noErr) {
- return TCL_ERROR;
+ return TCL_ERROR;
}
diagOptions.location.h = -1;
diagOptions.location.v = -1;
- diagOptions.optionFlags = kNavDontAutoTranslate
- + kNavDontAddTranslateItems;
+ diagOptions.optionFlags = kNavDontAutoTranslate
+ + kNavDontAddTranslateItems;
if (multiple) {
- diagOptions.optionFlags += kNavAllowMultipleFiles;
+ diagOptions.optionFlags += kNavAllowMultipleFiles;
}
diagOptions.modality = kWindowModalityAppModal;
if (ofdPtr != NULL && ofdPtr->usePopup) {
- FileFilter *filterPtr;
+ FileFilter *filterPtr;
- filterPtr = ofdPtr->fl.filters;
- if (filterPtr == NULL) {
- ofdPtr->usePopup = 0;
- }
+ filterPtr = ofdPtr->fl.filters;
+ if (filterPtr == NULL) {
+ ofdPtr->usePopup = 0;
+ }
}
if (ofdPtr != NULL && ofdPtr->usePopup) {
- FileFilter *filterPtr;
- int index = 0;
- ofdPtr->curType = 0;
-
- menuItemNames = (CFStringRef *)ckalloc(ofdPtr->fl.numFilters
- * sizeof(CFStringRef));
-
- for (filterPtr = ofdPtr->fl.filters; filterPtr != NULL;
- filterPtr = filterPtr->next, index++) {
- menuItemNames[index] = CFStringCreateWithCString(NULL,
- filterPtr->name, kCFStringEncodingUTF8);
- }
- diagOptions.popupExtension = CFArrayCreate(NULL,
- (const void **) menuItemNames, ofdPtr->fl.numFilters, NULL);
+ FileFilter *filterPtr;
+ int index = 0;
+ ofdPtr->curType = 0;
+
+ menuItemNames = (CFStringRef *)ckalloc(ofdPtr->fl.numFilters
+ * sizeof(CFStringRef));
+
+ for (filterPtr = ofdPtr->fl.filters; filterPtr != NULL;
+ filterPtr = filterPtr->next, index++) {
+ menuItemNames[index] = CFStringCreateWithCString(NULL,
+ filterPtr->name, kCFStringEncodingUTF8);
+ }
+ diagOptions.popupExtension = CFArrayCreate(NULL,
+ (const void **) menuItemNames, ofdPtr->fl.numFilters, NULL);
} else {
- diagOptions.optionFlags += kNavNoTypePopup;
- diagOptions.popupExtension = NULL;
+ diagOptions.optionFlags += kNavNoTypePopup;
+ diagOptions.popupExtension = NULL;
}
/*
* This is required to allow App packages to be selectable in the
* file dialogs...
*/
-
+
diagOptions.optionFlags += kNavSupportPackages;
-
+
diagOptions.clientName = CFStringCreateWithCString(NULL, "Wish", kCFStringEncodingUTF8);
diagOptions.message = message;
diagOptions.windowTitle = title;
if (initialFile) {
- diagOptions.saveFileName = CFStringCreateWithCString(NULL,
- initialFile, kCFStringEncodingUTF8);
+ diagOptions.saveFileName = CFStringCreateWithCString(NULL,
+ initialFile, kCFStringEncodingUTF8);
} else {
- diagOptions.saveFileName = NULL;
+ diagOptions.saveFileName = NULL;
}
-
+
diagOptions.actionButtonLabel = NULL;
diagOptions.cancelButtonLabel = NULL;
diagOptions.preferenceKey = 0;
-
- /*
+
+ /*
* Now process the selection list. We have to use the popupExtension
* to fill the menu.
*/
-
+
if (isOpen == OPEN_FILE) {
- err = NavCreateGetFileDialog(&diagOptions,
- NULL,
- openFileEventUPP,
- NULL,
- openFileFilterUPP,
- ofdPtr,
- &dialogRef);
- if (err != noErr) {
+ err = NavCreateGetFileDialog(&diagOptions,
+ NULL,
+ openFileEventUPP,
+ NULL,
+ openFileFilterUPP,
+ ofdPtr,
+ &dialogRef);
+ if (err != noErr) {
#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavCreateGetFileDialog failed, %d\n", err );
+ fprintf(stderr,"NavCreateGetFileDialog failed, %d\n", err);
#endif
- dialogRef = NULL;
- }
+ dialogRef = NULL;
+ }
} else if (isOpen == SAVE_FILE) {
- err = NavCreatePutFileDialog(&diagOptions, 'TEXT', 'WIsH',
- openFileEventUPP, NULL, &dialogRef);
- if (err!=noErr){
+ err = NavCreatePutFileDialog(&diagOptions, 'TEXT', 'WIsH',
+ openFileEventUPP, NULL, &dialogRef);
+ if (err!=noErr){
#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavCreatePutFileDialog failed, %d\n", err );
+ fprintf(stderr,"NavCreatePutFileDialog failed, %d\n", err);
#endif
- dialogRef = NULL;
- }
+ dialogRef = NULL;
+ }
} else if (isOpen == CHOOSE_FOLDER) {
- err = NavCreateChooseFolderDialog(&diagOptions, openFileEventUPP,
- openFileFilterUPP, NULL, &dialogRef);
- if (err!=noErr){
+ err = NavCreateChooseFolderDialog(&diagOptions, openFileEventUPP,
+ openFileFilterUPP, NULL, &dialogRef);
+ if (err!=noErr){
#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavCreateChooseFolderDialog failed, %d\n", err );
+ fprintf(stderr,"NavCreateChooseFolderDialog failed, %d\n", err);
#endif
- dialogRef = NULL;
- }
+ dialogRef = NULL;
+ }
}
if (dialogRef) {
- if (initialDescPtr != NULL) {
- NavCustomControl (dialogRef, kNavCtlSetLocation, initialDescPtr);
- }
- if ((selectDescPtr != NULL)
- && (selectDescPtr->descriptorType != typeNull)) {
- NavCustomControl(dialogRef, kNavCtlSetSelection, selectDescPtr);
- }
-
- if ((err = NavDialogRun(dialogRef)) != noErr ){
+ if (initialDescPtr != NULL) {
+ NavCustomControl (dialogRef, kNavCtlSetLocation, initialDescPtr);
+ }
+ if ((selectDescPtr != NULL)
+ && (selectDescPtr->descriptorType != typeNull)) {
+ NavCustomControl(dialogRef, kNavCtlSetSelection, selectDescPtr);
+ }
+
+ if ((err = NavDialogRun(dialogRef)) != noErr){
#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavDialogRun failed, %d\n", err );
+ fprintf(stderr,"NavDialogRun failed, %d\n", err);
#endif
- } else {
- if ((err = NavDialogGetReply(dialogRef, &theReply)) != noErr) {
+ } else {
+ if ((err = NavDialogGetReply(dialogRef, &theReply)) != noErr) {
#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavGetReply failed, %d\n", err );
+ fprintf(stderr,"NavGetReply failed, %d\n", err);
#endif
- }
- }
+ }
+ }
}
/*
@@ -866,246 +866,246 @@ NavServicesGetFile(
* item, not a list. So only build a list if multiple is true...
*/
if (err == noErr) {
- if (multiple) {
- theResult = Tcl_NewListObj(0, NULL);
- } else {
- theResult = Tcl_NewObj();
- }
- if (!theResult) {
- err = memFullErr;
- }
+ if (multiple) {
+ theResult = Tcl_NewListObj(0, NULL);
+ } else {
+ theResult = Tcl_NewObj();
+ }
+ if (!theResult) {
+ err = memFullErr;
+ }
}
if (theReply.validRecord && err == noErr) {
- AEDesc resultDesc;
- long count;
- FSRef fsRef;
- char pathPtr[1024];
- int pathValid = 0;
- err = AECountItems(&theReply.selection, &count);
- if (err == noErr) {
- long i;
- for (i = 1; i <= count; i++ ) {
- err = AEGetNthDesc(&theReply.selection,
- i, typeFSRef, NULL, &resultDesc);
- pathValid = 0;
- if (err == noErr) {
- if ((err = AEGetDescData(&resultDesc, &fsRef, sizeof(fsRef)))
- != noErr ) {
+ AEDesc resultDesc;
+ long count;
+ FSRef fsRef;
+ char pathPtr[1024];
+ int pathValid = 0;
+ err = AECountItems(&theReply.selection, &count);
+ if (err == noErr) {
+ long i;
+ for (i = 1; i <= count; i++) {
+ err = AEGetNthDesc(&theReply.selection,
+ i, typeFSRef, NULL, &resultDesc);
+ pathValid = 0;
+ if (err == noErr) {
+ if ((err = AEGetDescData(&resultDesc, &fsRef, sizeof(fsRef)))
+ != noErr) {
#ifdef TK_MAC_DEBUG
- fprintf(stderr,"AEGetDescData failed %d\n", err );
+ fprintf(stderr,"AEGetDescData failed %d\n", err);
#endif
- } else {
- if ((err = FSRefMakePath(&fsRef, (unsigned char*) pathPtr, 1024))) {
+ } else {
+ if ((err = FSRefMakePath(&fsRef, (unsigned char*) pathPtr, 1024))) {
#ifdef TK_MAC_DEBUG
- fprintf(stderr,"FSRefMakePath failed, %d\n", err );
+ fprintf(stderr,"FSRefMakePath failed, %d\n", err);
#endif
- } else {
- if (isOpen == SAVE_FILE) {
- CFStringRef saveNameRef;
- char saveName [1024];
- if ((saveNameRef = NavDialogGetSaveFileName(dialogRef))) {
- if (CFStringGetCString(saveNameRef, saveName,
- 1024, kCFStringEncodingUTF8)) {
- if (strlen(pathPtr) + strlen(saveName) < 1023) {
- strcat(pathPtr, "/");
- strcat(pathPtr, saveName);
- pathValid = 1;
- } else {
+ } else {
+ if (isOpen == SAVE_FILE) {
+ CFStringRef saveNameRef;
+ char saveName [1024];
+ if ((saveNameRef = NavDialogGetSaveFileName(dialogRef))) {
+ if (CFStringGetCString(saveNameRef, saveName,
+ 1024, kCFStringEncodingUTF8)) {
+ if (strlen(pathPtr) + strlen(saveName) < 1023) {
+ strcat(pathPtr, "/");
+ strcat(pathPtr, saveName);
+ pathValid = 1;
+ } else {
#ifdef TK_MAC_DEBUG
- fprintf(stderr, "Path name too long\n");
+ fprintf(stderr, "Path name too long\n");
#endif
- }
- } else {
+ }
+ } else {
#ifdef TK_MAC_DEBUG
- fprintf(stderr, "CFStringGetCString failed\n");
+ fprintf(stderr, "CFStringGetCString failed\n");
#endif
- }
- } else {
+ }
+ } else {
#ifdef TK_MAC_DEBUG
- fprintf(stderr, "NavDialogGetSaveFileName failed\n");
+ fprintf(stderr, "NavDialogGetSaveFileName failed\n");
#endif
- }
- } else {
- pathValid = 1;
- }
- if (pathValid) {
- if (multiple) {
- Tcl_ListObjAppendElement(interp, theResult,
- Tcl_NewStringObj(pathPtr, -1));
- } else {
- Tcl_SetStringObj(theResult, pathPtr, -1);
- }
- }
- }
- }
- AEDisposeDesc(&resultDesc);
- }
- }
- }
- err = NavDisposeReply(&theReply);
- Tcl_SetObjResult(interp, theResult);
- result = TCL_OK;
+ }
+ } else {
+ pathValid = 1;
+ }
+ if (pathValid) {
+ if (multiple) {
+ Tcl_ListObjAppendElement(interp, theResult,
+ Tcl_NewStringObj(pathPtr, -1));
+ } else {
+ Tcl_SetStringObj(theResult, pathPtr, -1);
+ }
+ }
+ }
+ }
+ AEDisposeDesc(&resultDesc);
+ }
+ }
+ }
+ err = NavDisposeReply(&theReply);
+ Tcl_SetObjResult(interp, theResult);
+ result = TCL_OK;
} else if (err == userCanceledErr) {
- result = TCL_OK;
+ result = TCL_OK;
} else {
- result = TCL_ERROR;
+ result = TCL_ERROR;
}
-
- /*
+
+ /*
* Clean up any allocated strings
- * dispose of things in reverse order of creation
+ * dispose of things in reverse order of creation
*/
-
+
if (diagOptions.windowTitle) {
- CFRelease(diagOptions.windowTitle);
+ CFRelease(diagOptions.windowTitle);
}
if (diagOptions.saveFileName) {
- CFRelease(diagOptions.saveFileName);
+ CFRelease(diagOptions.saveFileName);
}
if (diagOptions.message) {
- CFRelease(diagOptions.message);
+ CFRelease(diagOptions.message);
}
if (diagOptions.clientName) {
- CFRelease(diagOptions.clientName);
+ CFRelease(diagOptions.clientName);
}
- /*
- * dispose of the CFArray diagOptions.popupExtension
+ /*
+ * dispose of the CFArray diagOptions.popupExtension
*/
-
+
if (menuItemNames) {
- int i;
- for (i = 0;i < ofdPtr->fl.numFilters; i++) {
- CFRelease(menuItemNames[i]);
- }
- ckfree((void *)menuItemNames);
+ int i;
+ for (i = 0;i < ofdPtr->fl.numFilters; i++) {
+ CFRelease(menuItemNames[i]);
+ }
+ ckfree((void *)menuItemNames);
}
if (diagOptions.popupExtension != NULL) {
- CFRelease(diagOptions.popupExtension);
+ CFRelease(diagOptions.popupExtension);
}
-
+
return result;
}
-static pascal Boolean
-OpenFileFilterProc(
+static pascal Boolean
+OpenFileFilterProc(
AEDesc* theItem, void* info,
NavCallBackUserData callBackUD,
- NavFilterModes filterMode )
+ NavFilterModes filterMode)
{
OpenFileData *ofdPtr = (OpenFileData *) callBackUD;
-
+
if (!ofdPtr || !ofdPtr->usePopup) {
- return true;
+ return true;
} else {
- if (ofdPtr->fl.numFilters == 0) {
- return true;
- } else {
- if ((theItem->descriptorType == typeFSS)
- || (theItem->descriptorType = typeFSRef)) {
- NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo *) info;
- char fileName[256];
- int result;
-
- if ( !theInfo->isFolder ) {
- OSType fileType;
- StringPtr fileNamePtr;
- Tcl_DString fileNameDString;
- int i;
- FileFilter *filterPtr;
-
- fileType =
- theInfo->fileAndFolder.fileInfo.finderInfo.fdType;
- Tcl_DStringInit (&fileNameDString);
-
- if (theItem->descriptorType == typeFSS) {
- int len;
- fileNamePtr = (((FSSpec *) *theItem->dataHandle)->name);
- len = fileNamePtr[0];
- strncpy(fileName, (char*) fileNamePtr + 1, len);
- fileName[len] = '\0';
- fileNamePtr = (unsigned char*) fileName;
-
- } else if ((theItem->descriptorType = typeFSRef)) {
- OSStatus err;
- FSRef *theRef = (FSRef *) *theItem->dataHandle;
- HFSUniStr255 uniFileName;
- err = FSGetCatalogInfo (theRef, kFSCatInfoNone, NULL,
- &uniFileName, NULL, NULL);
-
- if (err == noErr) {
- Tcl_UniCharToUtfDString (
- (Tcl_UniChar *) uniFileName.unicode,
- uniFileName.length,
- &fileNameDString);
- fileNamePtr = (unsigned char*) Tcl_DStringValue(&fileNameDString);
- } else {
- fileNamePtr = NULL;
- }
- }
- if (ofdPtr->usePopup) {
- i = ofdPtr->curType;
- for (filterPtr = ofdPtr->fl.filters;
- filterPtr && i > 0; i--) {
- filterPtr = filterPtr->next;
- }
- if (filterPtr) {
- result = MatchOneType(fileNamePtr, fileType,
- ofdPtr, filterPtr);
- } else {
- result = false;
- }
- } else {
- /*
- * We are not using the popup menu. In this case, the
- * file is considered matched if it matches any of
- * the file filters.
- */
-
- result = UNMATCHED;
- for (filterPtr = ofdPtr->fl.filters; filterPtr;
- filterPtr = filterPtr->next) {
- if (MatchOneType(fileNamePtr, fileType,
- ofdPtr, filterPtr) == MATCHED) {
- result = MATCHED;
- break;
- }
- }
- }
-
- Tcl_DStringFree (&fileNameDString);
- return (result == MATCHED);
- } else {
- return true;
- }
- }
- }
-
- return true;
+ if (ofdPtr->fl.numFilters == 0) {
+ return true;
+ } else {
+ if ((theItem->descriptorType == typeFSS)
+ || (theItem->descriptorType = typeFSRef)) {
+ NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo *) info;
+ char fileName[256];
+ int result;
+
+ if (!theInfo->isFolder) {
+ OSType fileType;
+ StringPtr fileNamePtr;
+ Tcl_DString fileNameDString;
+ int i;
+ FileFilter *filterPtr;
+
+ fileType =
+ theInfo->fileAndFolder.fileInfo.finderInfo.fdType;
+ Tcl_DStringInit (&fileNameDString);
+
+ if (theItem->descriptorType == typeFSS) {
+ int len;
+ fileNamePtr = (((FSSpec *) *theItem->dataHandle)->name);
+ len = fileNamePtr[0];
+ strncpy(fileName, (char*) fileNamePtr + 1, len);
+ fileName[len] = '\0';
+ fileNamePtr = (unsigned char*) fileName;
+
+ } else if ((theItem->descriptorType = typeFSRef)) {
+ OSStatus err;
+ FSRef *theRef = (FSRef *) *theItem->dataHandle;
+ HFSUniStr255 uniFileName;
+ err = FSGetCatalogInfo (theRef, kFSCatInfoNone, NULL,
+ &uniFileName, NULL, NULL);
+
+ if (err == noErr) {
+ Tcl_UniCharToUtfDString (
+ (Tcl_UniChar *) uniFileName.unicode,
+ uniFileName.length,
+ &fileNameDString);
+ fileNamePtr = (unsigned char*) Tcl_DStringValue(&fileNameDString);
+ } else {
+ fileNamePtr = NULL;
+ }
+ }
+ if (ofdPtr->usePopup) {
+ i = ofdPtr->curType;
+ for (filterPtr = ofdPtr->fl.filters;
+ filterPtr && i > 0; i--) {
+ filterPtr = filterPtr->next;
+ }
+ if (filterPtr) {
+ result = MatchOneType(fileNamePtr, fileType,
+ ofdPtr, filterPtr);
+ } else {
+ result = false;
+ }
+ } else {
+ /*
+ * We are not using the popup menu. In this case, the
+ * file is considered matched if it matches any of
+ * the file filters.
+ */
+
+ result = UNMATCHED;
+ for (filterPtr = ofdPtr->fl.filters; filterPtr;
+ filterPtr = filterPtr->next) {
+ if (MatchOneType(fileNamePtr, fileType,
+ ofdPtr, filterPtr) == MATCHED) {
+ result = MATCHED;
+ break;
+ }
+ }
+ }
+
+ Tcl_DStringFree (&fileNameDString);
+ return (result == MATCHED);
+ } else {
+ return true;
+ }
+ }
+ }
+
+ return true;
}
}
-pascal void
+pascal void
OpenEventProc(
NavEventCallbackMessage callBackSelector,
NavCBRecPtr callBackParams,
- NavCallBackUserData callBackUD )
+ NavCallBackUserData callBackUD)
{
NavMenuItemSpec *chosenItem;
OpenFileData *ofd = (OpenFileData *) callBackUD;
static SInt32 otherEvent = ~(kNavCBCustomize|kNavCBStart|kNavCBTerminate
- |kNavCBNewLocation|kNavCBShowDesktop|kNavCBSelectEntry|kNavCBAccept
- |kNavCBCancel|kNavCBAdjustPreview);
-
+ |kNavCBNewLocation|kNavCBShowDesktop|kNavCBSelectEntry|kNavCBAccept
+ |kNavCBCancel|kNavCBAdjustPreview);
+
if (callBackSelector == kNavCBPopupMenuSelect) {
- chosenItem = (NavMenuItemSpec *) callBackParams->eventData.eventDataParms.param;
- ofd->curType = chosenItem->menuType;
- } else if (callBackSelector == kNavCBAdjustRect
- || (callBackSelector & otherEvent) != 0) {
- while (Tcl_DoOneEvent(TCL_IDLE_EVENTS
- | TCL_DONT_WAIT
- | TCL_WINDOW_EVENTS)) {
- /* Empty Body */
- }
+ chosenItem = (NavMenuItemSpec *) callBackParams->eventData.eventDataParms.param;
+ ofd->curType = chosenItem->menuType;
+ } else if (callBackSelector == kNavCBAdjustRect
+ || (callBackSelector & otherEvent) != 0) {
+ while (Tcl_DoOneEvent(TCL_IDLE_EVENTS
+ | TCL_DONT_WAIT
+ | TCL_WINDOW_EVENTS)) {
+ /* Empty Body */
+ }
}
}
@@ -1129,10 +1129,10 @@ OpenEventProc(
static Boolean
MatchOneType(
StringPtr fileNamePtr, /* Name of the file */
- OSType fileType, /* Type of the file, 0 means there was no specified type. */
+ OSType fileType, /* Type of the file, 0 means there was no specified type. */
OpenFileData * ofdPtr, /* Information about this file dialog */
FileFilter * filterPtr) /* Match the file described by pb against
- * this filter */
+ * this filter */
{
FileFilterClause * clausePtr;
@@ -1153,77 +1153,77 @@ MatchOneType(
* considered an error.
*/
- for (clausePtr = filterPtr->clauses; clausePtr;
- clausePtr = clausePtr->next) {
- int macMatched = 0;
- int globMatched = 0;
- GlobPattern * globPtr;
- MacFileType * mfPtr;
-
- if (clausePtr->patterns == NULL) {
- globMatched = 1;
- }
- if (clausePtr->macTypes == NULL) {
- macMatched = 1;
- }
-
- for (globPtr = clausePtr->patterns; globPtr;
- globPtr = globPtr->next) {
- char *q, *ext;
-
- if (fileNamePtr == NULL) {
- continue;
- }
- ext = globPtr->pattern;
-
- if (ext[0] == '\0') {
- /*
- * We don't want any extensions: OK if the filename doesn't
- * have "." in it
- */
-
- for (q = (char*) fileNamePtr; *q; q++) {
- if (*q == '.') {
- goto glob_unmatched;
- }
- }
- goto glob_matched;
- }
-
- if (Tcl_StringMatch((char*) fileNamePtr, ext)) {
- goto glob_matched;
- } else {
- goto glob_unmatched;
- }
-
- glob_unmatched:
- continue;
-
- glob_matched:
- globMatched = 1;
- break;
- }
-
- for (mfPtr = clausePtr->macTypes; mfPtr; mfPtr = mfPtr->next) {
- if (fileType == mfPtr->type) {
- macMatched = 1;
- break;
- }
- }
-
- /*
- * On Mac OS X, it is not uncommon for files to have NO
+ for (clausePtr = filterPtr->clauses; clausePtr;
+ clausePtr = clausePtr->next) {
+ int macMatched = 0;
+ int globMatched = 0;
+ GlobPattern * globPtr;
+ MacFileType * mfPtr;
+
+ if (clausePtr->patterns == NULL) {
+ globMatched = 1;
+ }
+ if (clausePtr->macTypes == NULL) {
+ macMatched = 1;
+ }
+
+ for (globPtr = clausePtr->patterns; globPtr;
+ globPtr = globPtr->next) {
+ char *q, *ext;
+
+ if (fileNamePtr == NULL) {
+ continue;
+ }
+ ext = globPtr->pattern;
+
+ if (ext[0] == '\0') {
+ /*
+ * We don't want any extensions: OK if the filename doesn't
+ * have "." in it
+ */
+
+ for (q = (char*) fileNamePtr; *q; q++) {
+ if (*q == '.') {
+ goto glob_unmatched;
+ }
+ }
+ goto glob_matched;
+ }
+
+ if (Tcl_StringMatch((char*) fileNamePtr, ext)) {
+ goto glob_matched;
+ } else {
+ goto glob_unmatched;
+ }
+
+ glob_unmatched:
+ continue;
+
+ glob_matched:
+ globMatched = 1;
+ break;
+ }
+
+ for (mfPtr = clausePtr->macTypes; mfPtr; mfPtr = mfPtr->next) {
+ if (fileType == mfPtr->type) {
+ macMatched = 1;
+ break;
+ }
+ }
+
+ /*
+ * On Mac OS X, it is not uncommon for files to have NO
* file type. But folks with Tcl code on Classic MacOS pretty
* much assume that a generic file will have type TEXT. So
* if we were strict about matching types when the source file
* had NO type set, they would have to add another rule always
* with no fileType. To avoid that, we pass the macMatch side
- * of the test if no fileType is set.
- */
+ * of the test if no fileType is set.
+ */
- if (globMatched && (macMatched || (fileType == 0))) {
- return MATCHED;
- }
+ if (globMatched && (macMatched || (fileType == 0))) {
+ return MATCHED;
+ }
}
return UNMATCHED;
@@ -1246,28 +1246,28 @@ MatchOneType(
*----------------------------------------------------------------------
*/
-void
+void
TkAboutDlg()
{
DialogPtr aboutDlog;
WindowRef windowRef;
short itemHit = -9;
-
+
aboutDlog = GetNewDialog(128, NULL, (void *) (-1));
-
+
if (!aboutDlog) {
- return;
+ return;
}
-
+
windowRef = GetDialogWindow(aboutDlog);
SelectWindow(windowRef);
-
+
while (itemHit != 1) {
- ModalDialog( NULL, &itemHit);
+ ModalDialog(NULL, &itemHit);
}
DisposeDialog(aboutDlog);
aboutDlog = NULL;
-
+
SelectWindow(ActiveNonFloatingWindow());
return;
@@ -1314,26 +1314,26 @@ Tk_MessageBoxObjCmd(
int i;
int indexDefaultOption = 0;
int result = TCL_OK;
-
+
static CONST char *movableAlertStrings[] = {
- "-default", "-detail", "-icon",
- "-message", "-parent",
+ "-default", "-detail", "-icon",
+ "-message", "-parent",
"-title", "-type",
(char *)NULL
};
static CONST char *movableTypeStrings[] = {
"abortretryignore", "ok",
- "okcancel", "retrycancel",
- "yesno", "yesnocancel",
+ "okcancel", "retrycancel",
+ "yesno", "yesnocancel",
(char *)NULL
};
static CONST char *movableButtonStrings[] = {
- "abort", "retry", "ignore",
- "ok", "cancel", "yes", "no",
+ "abort", "retry", "ignore",
+ "ok", "cancel", "yes", "no",
(char *)NULL
};
static CONST char *movableIconStrings[] = {
- "error", "info", "question", "warning",
+ "error", "info", "question", "warning",
(char *)NULL
};
enum movableAlertOptions {
@@ -1347,34 +1347,34 @@ Tk_MessageBoxObjCmd(
TYPE_YESNO, TYPE_YESNOCANCEL
};
enum movableButtonOptions {
- TEXT_ABORT, TEXT_RETRY, TEXT_IGNORE,
+ TEXT_ABORT, TEXT_RETRY, TEXT_IGNORE,
TEXT_OK, TEXT_CANCEL, TEXT_YES, TEXT_NO
};
enum movableIconOptions {
ICON_ERROR, ICON_INFO, ICON_QUESTION, ICON_WARNING
};
-
+
/*
* Need to map from 'movableButtonStrings' and its corresponding integer index,
* to the native button index, which is 1, 2, 3, from right to left.
* This is necessary to do for each separate '-type' of button sets.
*/
-
+
short buttonIndexAndTypeToNativeButtonIndex[][7] = {
/* abort retry ignore ok cancel yes no */
- {1, 2, 3, 0, 0, 0, 0}, /* abortretryignore */
+ {1, 2, 3, 0, 0, 0, 0}, /* abortretryignore */
{0, 0, 0, 1, 0, 0, 0}, /* ok */
{0, 0, 0, 1, 2, 0, 0}, /* okcancel */
{0, 1, 0, 0, 2, 0, 0}, /* retrycancel */
{0, 0, 0, 0, 0, 1, 2}, /* yesno */
- {0, 0, 0, 0, 3, 1, 2}, /* yesnocancel */
+ {0, 0, 0, 0, 3, 1, 2}, /* yesnocancel */
};
-
+
/*
* Need also the inverse mapping, from native button (1, 2, 3) to the
* descriptive button text string index.
*/
-
+
short nativeButtonIndexAndTypeToButtonIndex[][4] = {
{-1, 0, 1, 2}, /* abortretryignore */
{-1, 3, 0, 0}, /* ok */
@@ -1383,54 +1383,55 @@ Tk_MessageBoxObjCmd(
{-1, 5, 6, 0}, /* yesno */
{-1, 5, 6, 4}, /* yesnocancel */
};
-
+
alertType = kAlertPlainAlert;
typeIndex = TYPE_OK;
-
- GetStandardAlertDefaultParams( &paramCFStringRec, kStdCFStringAlertVersionOne );
+
+ GetStandardAlertDefaultParams(&paramCFStringRec, kStdCFStringAlertVersionOne);
paramCFStringRec.movable = true;
paramCFStringRec.helpButton = false;
paramCFStringRec.defaultButton = kAlertStdAlertOKButton;
-
+ paramCFStringRec.cancelButton = kAlertStdAlertCancelButton;
+
for (i = 1; i < objc; i += 2) {
int iconIndex;
char *string;
-
- if (Tcl_GetIndexFromObj( interp, objv[i], movableAlertStrings, "option",
- TCL_EXACT, &index ) != TCL_OK) {
+
+ if (Tcl_GetIndexFromObj(interp, objv[i], movableAlertStrings, "option",
+ TCL_EXACT, &index) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
if (i + 1 == objc) {
- string = Tcl_GetStringFromObj( objv[i], NULL );
- Tcl_AppendResult(interp, "value for \"", string, "\" missing",
+ string = Tcl_GetStringFromObj(objv[i], NULL);
+ Tcl_AppendResult(interp, "value for \"", string, "\" missing",
(char *) NULL);
result = TCL_ERROR;
goto end;
}
-
+
switch (index) {
-
+
case ALERT_DEFAULT:
-
- /*
- * Need to postpone processing of this option until we are
+
+ /*
+ * Need to postpone processing of this option until we are
* sure to know the '-type' as well.
*/
-
+
haveDefaultOption = true;
indexDefaultOption = i;
break;
-
- case ALERT_DETAIL:
- str = Tcl_GetStringFromObj( objv[i + 1], NULL );
- finemessageTextCF = CFStringCreateWithCString( NULL, str, kCFStringEncodingUTF8 );
+
+ case ALERT_DETAIL:
+ str = Tcl_GetStringFromObj(objv[i + 1], NULL);
+ finemessageTextCF = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
break;
-
+
case ALERT_ICON:
/* not sure about UTF translation here... */
- if (Tcl_GetIndexFromObj( interp, objv[i + 1], movableIconStrings,
- "value", TCL_EXACT, &iconIndex ) != TCL_OK) {
+ if (Tcl_GetIndexFromObj(interp, objv[i + 1], movableIconStrings,
+ "value", TCL_EXACT, &iconIndex) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
@@ -1449,29 +1450,29 @@ Tk_MessageBoxObjCmd(
break;
}
break;
-
+
case ALERT_MESSAGE:
- str = Tcl_GetStringFromObj( objv[i + 1], NULL );
- messageTextCF = CFStringCreateWithCString( NULL, str, kCFStringEncodingUTF8 );
+ str = Tcl_GetStringFromObj(objv[i + 1], NULL);
+ messageTextCF = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
break;
-
+
case ALERT_PARENT:
- str = Tcl_GetStringFromObj( objv[i + 1], NULL );
- tkwin = Tk_NameToWindow( interp, str, tkwin );
+ str = Tcl_GetStringFromObj(objv[i + 1], NULL);
+ tkwin = Tk_NameToWindow(interp, str, tkwin);
if (tkwin == NULL) {
result = TCL_ERROR;
goto end;
}
haveParentOption = true;
break;
-
+
case ALERT_TITLE:
break;
-
+
case ALERT_TYPE:
/* not sure about UTF translation here... */
- if (Tcl_GetIndexFromObj( interp, objv[i + 1], movableTypeStrings,
- "value", TCL_EXACT, &typeIndex ) != TCL_OK) {
+ if (Tcl_GetIndexFromObj(interp, objv[i + 1], movableTypeStrings,
+ "value", TCL_EXACT, &typeIndex) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
@@ -1480,6 +1481,7 @@ Tk_MessageBoxObjCmd(
paramCFStringRec.defaultText = CFSTR("Abort");
paramCFStringRec.cancelText = CFSTR("Retry");
paramCFStringRec.otherText = CFSTR("Ignore");
+ paramCFStringRec.cancelButton = kAlertStdAlertOtherButton;
break;
case TYPE_OK:
paramCFStringRec.defaultText = CFSTR("OK");
@@ -1500,44 +1502,44 @@ Tk_MessageBoxObjCmd(
paramCFStringRec.defaultText = CFSTR("Yes");
paramCFStringRec.cancelText = CFSTR("No");
paramCFStringRec.otherText = CFSTR("Cancel");
+ paramCFStringRec.cancelButton = kAlertStdAlertOtherButton;
break;
}
break;
}
- }
-
- if (haveDefaultOption) {
-
+ }
+
+ if (haveDefaultOption) {
+
/*
* Any '-default' option needs to know the '-type' option, which is why
* we do this here.
*/
-
- str = Tcl_GetStringFromObj( objv[indexDefaultOption + 1], NULL );
- if (Tcl_GetIndexFromObj( interp, objv[indexDefaultOption + 1],
- movableButtonStrings, "value", TCL_EXACT,
- &defaultButtonIndex ) != TCL_OK) {
+
+ str = Tcl_GetStringFromObj(objv[indexDefaultOption + 1], NULL);
+ if (Tcl_GetIndexFromObj(interp, objv[indexDefaultOption + 1],
+ movableButtonStrings, "value", TCL_EXACT,
+ &defaultButtonIndex) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
-
+
/* Need to map from "ok" etc. to 1, 2, 3, right to left. */
-
- defaultNativeButtonIndex =
+
+ defaultNativeButtonIndex =
buttonIndexAndTypeToNativeButtonIndex[typeIndex][defaultButtonIndex];
if (defaultNativeButtonIndex == 0) {
- Tcl_SetObjResult( interp,
- Tcl_NewStringObj( "Illegel default option", -1 ));
+ Tcl_SetObjResult(interp,
+ Tcl_NewStringObj("Illegal default option", -1));
result = TCL_ERROR;
goto end;
}
- paramCFStringRec.defaultButton = defaultNativeButtonIndex;
+ paramCFStringRec.defaultButton = defaultNativeButtonIndex;
}
- SetThemeCursor( kThemeArrowCursor );
-
+ SetThemeCursor(kThemeArrowCursor);
+
if (haveParentOption) {
TkWindow *winPtr;
- MacDrawable *macWin;
WindowRef windowRef;
EventTargetRef notifyTarget;
EventHandlerUPP handler;
@@ -1545,67 +1547,74 @@ Tk_MessageBoxObjCmd(
const EventTypeSpec kEvents[] = {
{kEventClassCommand, kEventProcessCommand}
};
-
+
winPtr = (TkWindow *) tkwin;
-
+
/*
* Create the underlying Mac window for this Tk window.
*/
-
- macWin = (MacDrawable *) winPtr->window;
- windowRef = GetWindowFromPort( TkMacOSXGetDrawablePort((Drawable) macWin) );
- notifyTarget = GetWindowEventTarget( windowRef );
- osError = CreateStandardSheet( alertType, messageTextCF,
+
+ windowRef = GetWindowFromPort(
+ TkMacOSXGetDrawablePort(Tk_WindowId(tkwin)));
+ notifyTarget = GetWindowEventTarget(windowRef);
+ osError = CreateStandardSheet(alertType, messageTextCF,
finemessageTextCF, &paramCFStringRec,
- notifyTarget, &dialogRef );
+ notifyTarget, &dialogRef);
if(osError != noErr) {
result = TCL_ERROR;
goto end;
}
data.windowRef = windowRef;
data.buttonIndex = 1;
- handler = NewEventHandlerUPP( AlertHandler );
- InstallEventHandler(notifyTarget, handler,
- GetEventTypeCount(kEvents),
- kEvents, &data, NULL );
- osError = ShowSheetWindow( GetDialogWindow(dialogRef), windowRef );
+ handler = NewEventHandlerUPP(AlertHandler);
+ InstallEventHandler(notifyTarget, handler,
+ GetEventTypeCount(kEvents),
+ kEvents, &data, NULL);
+ osError = ShowSheetWindow(GetDialogWindow(dialogRef), windowRef);
if(osError != noErr) {
result = TCL_ERROR;
goto end;
}
- osError = RunAppModalLoopForWindow( windowRef );
-
+ osError = RunAppModalLoopForWindow(windowRef);
+ if (osError != noErr) {
+ result = TCL_ERROR;
+ goto end;
+ }
itemHit = data.buttonIndex;
- DisposeEventHandlerUPP( handler );
+ DisposeEventHandlerUPP(handler);
} else {
- osError = CreateStandardAlert( alertType, messageTextCF,
- finemessageTextCF, &paramCFStringRec, &dialogRef );
+ osError = CreateStandardAlert(alertType, messageTextCF,
+ finemessageTextCF, &paramCFStringRec, &dialogRef);
if(osError != noErr) {
result = TCL_ERROR;
goto end;
}
- osError = RunStandardAlert( dialogRef, NULL, &itemHit );
- }
+ osError = RunStandardAlert(dialogRef, NULL, &itemHit);
+ if (osError != noErr) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ }
if(osError == noErr) {
int ind;
-
+
/*
* Map 'itemHit' (1, 2, 3) to descriptive text string.
*/
-
+
ind = nativeButtonIndexAndTypeToButtonIndex[typeIndex][itemHit];
- Tcl_SetObjResult( interp,
- Tcl_NewStringObj( movableButtonStrings[ind], -1 ));
+ Tcl_SetObjResult(interp,
+ Tcl_NewStringObj(movableButtonStrings[ind], -1));
} else {
result = TCL_ERROR;
}
-
+
end:
if (finemessageTextCF != NULL) {
- CFRelease( finemessageTextCF );
+ CFRelease(finemessageTextCF);
}
if (messageTextCF != NULL) {
- CFRelease( messageTextCF );
+ CFRelease(messageTextCF);
}
return result;
}
@@ -1627,14 +1636,14 @@ Tk_MessageBoxObjCmd(
*/
static OSStatus
-AlertHandler( EventHandlerCallRef callRef, EventRef eventRef, void *userData )
+AlertHandler(EventHandlerCallRef callRef, EventRef eventRef, void *userData)
{
OSStatus result = eventNotHandledErr;
HICommand cmd;
CallbackUserData *dataPtr = (CallbackUserData *) userData;
-
- GetEventParameter( eventRef, kEventParamDirectObject, typeHICommand,
- NULL, sizeof(cmd), NULL, &cmd );
+
+ GetEventParameter(eventRef, kEventParamDirectObject, typeHICommand,
+ NULL, sizeof(cmd), NULL, &cmd);
switch (cmd.commandID) {
case kHICommandOK:
dataPtr->buttonIndex = 1;
@@ -1650,7 +1659,7 @@ AlertHandler( EventHandlerCallRef callRef, EventRef eventRef, void *userData )
break;
}
if (result == noErr) {
- result = QuitAppModalLoopForWindow( dataPtr->windowRef );
+ result = QuitAppModalLoopForWindow(dataPtr->windowRef);
}
return result;
}