Tk Source Code

Artifact [8a9232d7]
Login

Artifact 8a9232d75ceac66e0df2f485a455d495be558de4:

Attachment "macosx-initialfile.patch" to ticket [657656ff] added by wolfsuit 2004-03-13 07:20:50.
Index: tkMacOSXDialog.c
===================================================================
RCS file: /cvsroot/tktoolkit/tk/macosx/tkMacOSXDialog.c,v
retrieving revision 1.4.2.2
diff -p -p -r1.4.2.2 tkMacOSXDialog.c
*** tkMacOSXDialog.c    16 Feb 2004 00:42:34 -0000      1.4.2.2
--- tkMacOSXDialog.c    13 Mar 2004 00:04:48 -0000
***************
*** 13,18 ****
--- 13,19 ----
   */
  #include <Carbon/Carbon.h>
  
+ #include "tcl.h"
  #include "tkPort.h"
  #include "tkInt.h"
  #include "tkMacOSXInt.h"
*************** static void             InitFileDialogs(
*** 82,93 ****
  static int              NavServicesGetFile(Tcl_Interp *interp, OpenFileData *ofd,
                              AEDesc *initialDescPtr,
                              unsigned 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);                            
  
  /*
   * Have we initialized the file dialog subsystem
--- 83,97 ----
  static int              NavServicesGetFile(Tcl_Interp *interp, OpenFileData *ofd,
                              AEDesc *initialDescPtr,
                              unsigned char *initialFile, AEDescList *selectDescPtr,
!                             CFStringRef title, CFStringRef message, 
!                             int multiple, int isOpen);
! static int              HandleInitialDirectory (Tcl_Interp *interp, 
!                             Tcl_Obj *initialSelection,
!                             int multiple,
!                             char *initialDir,
!                             FSRef *dirRef,
!                             AEDescList *selectDescPtr,
!                             AEDesc *dirDescPtr);                            
  
  /*
   * Have we initialized the file dialog subsystem
*************** Tk_GetOpenFileObjCmd(
*** 271,277 ****
      FSRef dirRef;
      AEDesc *initialPtr = NULL;
      AEDescList selectDesc = {typeNull, NULL};
!     char *initialFile = NULL, *initialDir = NULL;
      static CONST char *openOptionStrings[] = {
              "-defaultextension", "-filetypes", 
              "-initialdir", "-initialfile", 
--- 275,282 ----
      FSRef dirRef;
      AEDesc *initialPtr = NULL;
      AEDescList selectDesc = {typeNull, NULL};
!     char *initialDir = NULL;
!     Tcl_Obj *initialSelection = NULL;
      static CONST char *openOptionStrings[] = {
              "-defaultextension", "-filetypes", 
              "-initialdir", "-initialfile", 
*************** Tk_GetOpenFileObjCmd(
*** 334,340 ****
                  initialDir = Tcl_GetStringFromObj(objv[i + 1], NULL);
                  break;
              case OPEN_INITFILE:
!                 initialFile = Tcl_GetStringFromObj(objv[i + 1], NULL);
                  break;
              case OPEN_MESSAGE:
                  choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
--- 339,345 ----
                  initialDir = Tcl_GetStringFromObj(objv[i + 1], NULL);
                  break;
              case OPEN_INITFILE:
!                 initialSelection = objv[i + 1];
                  break;
              case OPEN_MESSAGE:
                  choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
*************** Tk_GetOpenFileObjCmd(
*** 364,371 ****
          }
      }
  
!     if (HandleInitialDirectory(interp, initialFile, initialDir, &dirRef,
!                                &selectDesc, &initialDesc) != TCL_OK) {
          result = TCL_ERROR;
          goto end;
      }
--- 369,377 ----
          }
      }
  
!     if (HandleInitialDirectory(interp, initialSelection, multiple, 
!             initialDir, &dirRef,
!             &selectDesc, &initialDesc) != TCL_OK) {
          result = TCL_ERROR;
          goto end;
      }
*************** Tk_GetSaveFileObjCmd(
*** 466,472 ****
                  break;
              case SAVE_INITDIR:
                  choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
!                 if (HandleInitialDirectory(interp, NULL, choice, &dirRef, 
                          NULL, &initialDesc) != TCL_OK) {
                      result = TCL_ERROR;
                      goto end;
--- 472,478 ----
                  break;
              case SAVE_INITDIR:
                  choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
!                 if (HandleInitialDirectory(interp, NULL, 0, choice, &dirRef, 
                          NULL, &initialDesc) != TCL_OK) {
                      result = TCL_ERROR;
                      goto end;
*************** Tk_ChooseDirectoryObjCmd(clientData, int
*** 599,605 ****
          switch (index) {
              case CHOOSE_INITDIR:
                  choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
!                 if (HandleInitialDirectory(interp, NULL, choice, &dirRef,  
                          NULL, &initialDesc) != TCL_OK) {
                      result = TCL_ERROR;
                      goto end;
--- 605,611 ----
          switch (index) {
              case CHOOSE_INITDIR:
                  choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
!                 if (HandleInitialDirectory(interp, NULL, 0, choice, &dirRef,  
                          NULL, &initialDesc) != TCL_OK) {
                      result = TCL_ERROR;
                      goto end;
*************** Tk_ChooseDirectoryObjCmd(clientData, int
*** 648,663 ****
      return result;
  }
  
! int
  HandleInitialDirectory (
      Tcl_Interp *interp,
!     char *initialFile,
      char *initialDir,
      FSRef *dirRef, 
      AEDescList *selectDescPtr,
      AEDesc *dirDescPtr)
  {
      Tcl_DString ds;
      OSErr err;
      Boolean isDirectory;
      char *dirName = NULL;
--- 654,671 ----
      return result;
  }
  
! static int
  HandleInitialDirectory (
      Tcl_Interp *interp,
!     Tcl_Obj *initialSelection,
!     int multiple,
      char *initialDir,
      FSRef *dirRef, 
      AEDescList *selectDescPtr,
      AEDesc *dirDescPtr)
  {
      Tcl_DString ds;
+     int dsLen;
      OSErr err;
      Boolean isDirectory;
      char *dirName = NULL;
*************** HandleInitialDirectory (
*** 665,670 ****
--- 673,679 ----
  
      if (initialDir != NULL) {
          dirName = Tcl_TranslateFileName(interp, initialDir, &ds);
+         dsLen = Tcl_DStringLength(&ds);
          if (dirName == NULL) {
              return TCL_ERROR;
          }
*************** HandleInitialDirectory (
*** 688,719 ****
          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(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);
--- 697,752 ----
          AECreateDesc(typeFSRef, dirRef, sizeof(*dirRef), dirDescPtr);
      }
  
!     if (initialSelection != NULL && selectDescPtr != NULL) {
          FSRef fileRef;
          AEDesc fileDesc;
          char *namePtr;
!         Tcl_Obj **selArray;
!         Tcl_Obj *oneSel[1];
!         int selCount, i, result;
!         
!         if (multiple) {
!             result = Tcl_ListObjGetElements (interp, initialSelection, 
!                     &selCount, &selArray);
!             if (result != TCL_OK) {
!                 Tcl_AppendResult (interp, "initial file list is not a proper list.",
!                     NULL);
!                 return TCL_ERROR;
!             }
          } else {
!             selArray = oneSel;
!             oneSel[0] = initialSelection;
!             selCount = 1;
          }
!         
          AECreateList(NULL, 0, false, selectDescPtr);
  
!         for (i = 0; i < selCount; i++) {
!             char *initialFile;
!             int len;
!             
!             initialFile = Tcl_GetStringFromObj (selArray[i], &len);
!             
!             if (initialDir != NULL) {
!                 Tcl_DStringSetLength (&ds, dsLen);
!                 Tcl_DStringAppend(&ds, "/", 1);
!                 Tcl_DStringAppend(&ds, initialFile, len);
!                 namePtr = Tcl_DStringValue(&ds);
!             } else {
!                 namePtr = initialFile;
!             }
! 
!             err = FSPathMakeRef(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, i + 1, &fileDesc);
!             AEDisposeDesc(&fileDesc);
          }
      }
  end:
      if (dirName != NULL) {
          Tcl_DStringFree(&ds);