summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--macosx/tkMacOSXDialog.c81
2 files changed, 63 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index 4a1c225..073ffde 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2003-10-23 Jim Ingham <jingham@apple.com>
+
+ * macosx/tkMacOSXDialog.c (NavServicesGetFile): Minor cleanups.
+ (OpenFileFilterProc): Handle FSRef's as well as FSSpec's in the input
+ file. Also convert the FSSpec filename to an C-string before passing
+ to MatchOneFile. [bug 517600]
+ (MatchOneFile): Require the input filename to be a C-string, not a
+ pascal string.
+
2003-10-22 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* library/dialog.tcl (tk_dialog): Constrain the dialog to be
diff --git a/macosx/tkMacOSXDialog.c b/macosx/tkMacOSXDialog.c
index e38cabd..eb77843 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.5 2003/07/18 11:04:59 vincentdarley Exp $
+ * RCS: @(#) $Id: tkMacOSXDialog.c,v 1.6 2003/10/23 23:55:17 wolfsuit Exp $
*/
#include <Carbon/Carbon.h>
@@ -755,11 +755,11 @@ NavServicesGetFile(
diagOptions.location.v = -1;
diagOptions.optionFlags = kNavDontAutoTranslate
+ kNavDontAddTranslateItems;
-
if (multiple) {
diagOptions.optionFlags += kNavAllowMultipleFiles;
}
-
+ diagOptions.modality = kWindowModalityAppModal;
+
if (ofdPtr != NULL && ofdPtr->usePopup) {
FileFilter *filterPtr;
@@ -783,7 +783,7 @@ NavServicesGetFile(
filterPtr->name, encoding);
}
diagOptions.popupExtension = CFArrayCreate(NULL,
- (const void **)menuItemNames, ofdPtr->fl.numFilters, NULL);;
+ (const void **) menuItemNames, ofdPtr->fl.numFilters, NULL);
} else {
diagOptions.optionFlags += kNavNoTypePopup;
diagOptions.popupExtension = NULL;
@@ -797,7 +797,7 @@ NavServicesGetFile(
diagOptions.optionFlags += kNavSupportPackages;
diagOptions.clientName = CFStringCreateWithCString(NULL, "Wish", encoding);
- if (message == NULL) {
+ if (message == NULL || message[0] == 0) {
diagOptions.message = NULL;
} else {
diagOptions.message = CFStringCreateWithPascalString(NULL, message, encoding);
@@ -808,7 +808,7 @@ NavServicesGetFile(
} else {
diagOptions.saveFileName = NULL;
}
- if (title == NULL) {
+ if (title == NULL || title[0] == '\0') {
diagOptions.windowTitle = NULL;
} else {
diagOptions.windowTitle = CFStringCreateWithPascalString(NULL, title, encoding);
@@ -831,7 +831,7 @@ NavServicesGetFile(
openFileFilterUPP,
ofdPtr,
&dialogRef);
- if (err!=noErr){
+ if (err != noErr) {
fprintf(stderr,"NavCreateGetFileDialog failed, %d\n", err );
dialogRef = NULL;
}
@@ -997,30 +997,60 @@ OpenFileFilterProc(
NavFilterModes filterMode )
{
OpenFileData *ofdPtr = (OpenFileData *) callBackUD;
+
if (!ofdPtr || !ofdPtr->usePopup) {
return true;
} else {
if (ofdPtr->fl.numFilters == 0) {
return true;
} else {
-
- if ( theItem->descriptorType == typeFSS ) {
- NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*)info;
+ 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;
- HLock((Handle)theItem->dataHandle);
- fileNamePtr = (((FSSpec *) *theItem->dataHandle)->name);
+ 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, fileNamePtr + 1, len);
+ fileName[len] = '\0';
+ fileNamePtr = 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) {
+ int numChars;
+ Tcl_UniCharToUtfDString (
+ (Tcl_UniChar *) uniFileName.unicode,
+ uniFileName.length,
+ &fileNameDString);
+ fileNamePtr = Tcl_DStringValue(&fileNameDString);
+ } else {
+ fileNamePtr = NULL;
+ }
+ }
if (ofdPtr->usePopup) {
i = ofdPtr->curType;
- for (filterPtr = ofdPtr->fl.filters; filterPtr && i > 0; i--) {
+ for (filterPtr = ofdPtr->fl.filters;
+ filterPtr && i > 0; i--) {
filterPtr = filterPtr->next;
}
if (filterPtr) {
@@ -1031,9 +1061,11 @@ OpenFileFilterProc(
}
} else {
/*
- * We are not using the popup menu. In this case, the file is
- * considered matched if it matches any of the file filters.
+ * 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) {
@@ -1045,7 +1077,7 @@ OpenFileFilterProc(
}
}
- HUnlock((Handle)theItem->dataHandle);
+ Tcl_DStringFree (&fileNameDString);
return (result == MATCHED);
} else {
return true;
@@ -1140,17 +1172,11 @@ MatchOneType(
}
for (globPtr=clausePtr->patterns; globPtr; globPtr=globPtr->next) {
- char filename[256];
- int len;
- char * p, *q, *ext;
+ char *q, *ext;
if (fileNamePtr == NULL) {
continue;
}
- p = (char*)(fileNamePtr);
- len = p[0];
- strncpy(filename, p+1, len);
- filename[len] = '\0';
ext = globPtr->pattern;
if (ext[0] == '\0') {
@@ -1158,7 +1184,7 @@ MatchOneType(
* We don't want any extensions: OK if the filename doesn't
* have "." in it
*/
- for (q=filename; *q; q++) {
+ for (q=fileNamePtr; *q; q++) {
if (*q == '.') {
goto glob_unmatched;
}
@@ -1166,7 +1192,7 @@ MatchOneType(
goto glob_matched;
}
- if (Tcl_StringMatch(filename, ext)) {
+ if (Tcl_StringMatch(fileNamePtr, ext)) {
goto glob_matched;
} else {
goto glob_unmatched;
@@ -1531,7 +1557,8 @@ Tk_MessageBoxObjCmd(
data.windowRef = windowRef;
data.buttonIndex = 1;
handler = NewEventHandlerUPP( AlertHandler );
- InstallEventHandler( notifyTarget, handler, GetEventTypeCount(kEvents), &kEvents, &data, NULL );
+ InstallEventHandler( notifyTarget, handler, GetEventTypeCount(kEvents),
+ &kEvents, &data, NULL );
osError = ShowSheetWindow( GetDialogWindow(dialogRef), windowRef );
if(osError != noErr) {
result = TCL_ERROR;