| version 1.1, 2003/10/31 16:55:06 | version 1.2, 2003/11/06 18:27:59 | 
| Line 4 | Line 4 | 
 | #include        "np2.h" | #include        "np2.h" | 
 | #include        "newdisk.h" | #include        "newdisk.h" | 
 | #include        "dialog.h" | #include        "dialog.h" | 
 |  | #include        "dialogutils.h" | 
 | #include        "macnewdisk.h" | #include        "macnewdisk.h" | 
 |  |  | 
| Boolean saveFile(OSType type, char *title, FSSpec *fsc); | const int defaultsize[5] = {20, 41, 65, 80, 128}; | 
|  | static  WindowRef       diskWin; | 
|  | static  SInt32  targetDisk, media, hdsize; | 
|  | static  char    disklabel[256]; | 
|  | enum {kTabMasterSig = 'ScrT',kTabMasterID = 1000,kTabPaneSig= 'ScTb'}; | 
|  | #define kMaxNumTabs 2 | 
|  | static UInt16           lastPaneSelected = 1; | 
|  | #define getControlValue(a,b)            GetControl32BitValue(getControlRefByID(a,b,diskWin)) | 
|  |  | 
|  | static pascal OSStatus cfWinproc(EventHandlerCallRef myHandler, EventRef event, void* userData) { | 
|  | OSStatus    err = eventNotHandledErr; | 
|  | HICommand   cmd; | 
|  | SINT32          data; | 
|  | char                outstr[16]; | 
|  |  | 
|  | if (GetEventClass(event)==kEventClassCommand && GetEventKind(event)==kEventCommandProcess ) { | 
|  | GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &cmd); | 
|  | switch (cmd.commandID) | 
|  | { | 
|  | case 'hdsz': | 
|  | data = getControlValue(cmd.commandID,1)-1; | 
|  | sprintf(outstr, "%d", defaultsize[data]); | 
|  | SetControlData(getControlRefByID(cmd.commandID,0,diskWin),kControlNoPart,kControlStaticTextTextTag,strlen(outstr),outstr); | 
|  | Draw1Control(getControlRefByID(cmd.commandID,0,diskWin)); | 
|  | break; | 
|  |  | 
|  | case kHICommandOK: | 
|  | targetDisk = getControlValue(kTabMasterSig, kTabMasterID); | 
|  | getFieldText(getControlRefByID('fdlb', 0, diskWin), disklabel); | 
|  | media = getControlValue('fdty', 0); | 
|  | data = getFieldValue(getControlRefByID('hdsz', 0, diskWin)); | 
|  | if (data < 0) { | 
|  | data = 0; | 
|  | } | 
|  | else if (data > 512) { | 
|  | data = 512; | 
|  | } | 
|  | hdsize = data; | 
|  | QuitAppModalLoopForWindow(diskWin); | 
|  | err=noErr; | 
|  | break; | 
|  |  | 
|  | case kHICommandCancel: | 
|  | QuitAppModalLoopForWindow(diskWin); | 
|  | err=noErr; | 
|  | break; | 
|  |  | 
|  | default: | 
|  | break; | 
|  | } | 
|  | } | 
 |  |  | 
| #if 0 | (void)myHandler; | 
| static BYTE hdddiskboot[] = { | (void)userData; | 
| 0xb8,0x00,0x10,0xbb,0x00,0x80,0x8e,0xd0,0x8b,0xe3,0x8c,0xc8, | return err; | 
| 0x8e,0xd8,0xb8,0x00,0xa0,0x8e,0xc0,0xb9,0x00,0x10,0xb8,0x20, |  | 
| 0x00,0x33,0xff,0xfc,0xf3,0xab,0xb0,0xe1,0xb9,0xe0,0x1f,0xaa, |  | 
| 0x47,0xe2,0xfc,0xbe,0x44,0x00,0x33,0xff,0xe8,0x08,0x00,0xbf, |  | 
| 0xa0,0x00,0xe8,0x02,0x00,0xeb,0xfe,0x2e,0xad,0x85,0xc0,0x74, |  | 
| 0x06,0xab,0x83,0xc7,0x02,0xeb,0xf4,0xc3,0x04,0x33,0x04,0x4e, |  | 
| 0x05,0x4f,0x01,0x3c,0x05,0x49,0x05,0x47,0x05,0x23,0x05,0x39, |  | 
| 0x05,0x2f,0x05,0x24,0x05,0x61,0x01,0x3c,0x05,0x38,0x04,0x4f, |  | 
| 0x05,0x55,0x05,0x29,0x01,0x3c,0x05,0x5e,0x05,0x43,0x05,0x48, |  | 
| 0x04,0x35,0x04,0x6c,0x04,0x46,0x04,0x24,0x04,0x5e,0x04,0x3b, |  | 
| 0x04,0x73,0x01,0x25,0x00,0x00,0x05,0x47,0x05,0x23,0x05,0x39, |  | 
| 0x05,0x2f,0x05,0x24,0x05,0x61,0x01,0x3c,0x05,0x38,0x04,0x72, |  | 
| 0x21,0x5e,0x26,0x7e,0x18,0x65,0x01,0x24,0x05,0x6a,0x05,0x3b, |  | 
| 0x05,0x43,0x05,0x48,0x04,0x37,0x04,0x46,0x12,0x3c,0x04,0x35, |  | 
| 0x04,0x24,0x01,0x25,0x00,0x00}; |  | 
| #endif |  | 
|  |  | 
| static Handle GetDlgItem(DialogPtr hWnd, short pos) { |  | 
|  |  | 
| Handle  ret; |  | 
| Rect    rct; |  | 
| short   s; |  | 
|  |  | 
| GetDialogItem(hWnd, pos, &s, &ret, &rct); |  | 
| return(ret); |  | 
 | } | } | 
 |  |  | 
| static void macos_setradiobtn(ControlHandle *hRadio, int items, int pos) { | static pascal OSStatus PrefsTabEventHandlerProc( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ) | 
|  | { | 
| int             i; | WindowRef theWindow = (WindowRef)inUserData;  // get the windowRef, passed around as userData | 
|  | short ret; | 
| for (i=0; i<items; i++) { | ret = changeTab(theWindow, lastPaneSelected); | 
| SetControlValue(hRadio[i], ((i==pos)?1:0)); | if (ret) { | 
| } | lastPaneSelected = ret; | 
|  | } | 
|  | return( eventNotHandledErr ); | 
 | } | } | 
 |  |  | 
|  | static void makeNibWindow (IBNibRef nibRef) { | 
| // とりあえずモーダルで | OSStatus    err; | 
| void newdisk(void) { | EventHandlerRef     ref; | 
|  |  | 
| DialogPtr                       hDlg; |  | 
| int                                     done; |  | 
| short                           item; |  | 
| Str255                          disklabel; |  | 
| ControlHandle           hmedia[2]; |  | 
| int                                     media; |  | 
|  |  | 
| OSType      type='.D88'; |  | 
| FSSpec      fss; |  | 
| char        fileName[] = "Newdisk.d88"; |  | 
 |  |  | 
| char    fname[MAX_PATH]; | err = CreateWindowFromNib(nibRef, CFSTR("NewDiskDialog"), &diskWin); | 
| char        label[255]; | if (err == noErr) { | 
|  |  | 
| hDlg = GetNewDialog(IDD_NEWDISK, NULL, (WindowPtr)-1); | SetInitialTabState(diskWin, lastPaneSelected, kMaxNumTabs); | 
| if (!hDlg) { | EventTypeSpec   tabControlEvents[] ={ { kEventClassControl, kEventControlHit }}; | 
| return; | InstallControlEventHandler( getControlRefByID(kTabMasterSig,kTabMasterID,diskWin),  PrefsTabEventHandlerProc , GetEventTypeCount(tabControlEvents), tabControlEvents, diskWin, NULL ); | 
| } | EventTypeSpec   list[]={ { kEventClassCommand, kEventCommandProcess },}; | 
|  | InstallWindowEventHandler (diskWin, NewEventHandlerUPP(cfWinproc), GetEventTypeCount(list), list, (void *)diskWin, &ref); | 
| // テキスト〜 | ShowWindow(diskWin); | 
| SelectDialogItemText(hDlg, IDC_DISKLABEL, 0x0000, 0x7fff); | RunAppModalLoopForWindow(diskWin); | 
|  |  | 
| // チェックボックスのハンドル | } | 
| hmedia[0] = (ControlHandle)GetDlgItem(hDlg, IDC_MAKE2DD); | return; | 
| hmedia[1] = (ControlHandle)GetDlgItem(hDlg, IDC_MAKE2HD); | } | 
| media = 1; |  | 
| macos_setradiobtn(hmedia, 2, 1); | static SInt32 initNewDisk( void ) { | 
| SetDialogDefaultItem(hDlg, IDOK); | OSStatus    err; | 
| SetDialogCancelItem(hDlg, IDCANCEL); | IBNibRef    nibRef; | 
|  |  | 
| done = 0; | err = CreateNibReference(CFSTR("np2"), &nibRef); | 
| while(!done) { | if (err ==noErr ) { | 
| ModalDialog(NULL, &item); | makeNibWindow (nibRef); | 
| switch(item) { | DisposeNibReference ( nibRef); | 
| case IDOK: | } | 
| done = 1; | return(err); | 
| break; |  | 
| case IDCANCEL: |  | 
| done = -1; |  | 
| break; |  | 
| case IDC_DISKLABEL: |  | 
| break; |  | 
| case IDC_MAKE2DD: |  | 
| media = 0; |  | 
| macos_setradiobtn(hmedia, 2, 0); |  | 
| break; |  | 
| case IDC_MAKE2HD: |  | 
| media = 1; |  | 
| macos_setradiobtn(hmedia, 2, 1); |  | 
| break; |  | 
| } |  | 
| } |  | 
| if (done > 0) { |  | 
| GetDialogItemText(GetDlgItem(hDlg, IDC_DISKLABEL), disklabel); |  | 
| } |  | 
| DisposeDialog(hDlg); |  | 
|  |  | 
| if (done > 0) {                                                         // making |  | 
|  |  | 
| if (saveFile(type, fileName, &fss)) { |  | 
| fsspec2path(&fss, fname, sizeof(fname)); |  | 
| mkcstr(label, sizeof(label), disklabel); |  | 
| newdisk_fdd(fname, media, label); |  | 
| } |  | 
| } |  | 
| } |  | 
|  |  | 
| #if 0 |  | 
| static BOOL gethddsize(Str255 str, int *size) { |  | 
|  |  | 
| int             hddsize; |  | 
| BYTE    *p; |  | 
| BYTE    c; |  | 
| UInt32  remain; |  | 
|  |  | 
| p = (BYTE *)str; |  | 
| remain = *p++; |  | 
| while((remain) && (*p == ' ')) { |  | 
| remain--; |  | 
| p++; |  | 
| } |  | 
| hddsize = 0; |  | 
| while(remain--) { |  | 
| c = *p++; |  | 
| if ((c < '0') || (c > '9')) { |  | 
| break; |  | 
| } |  | 
| hddsize *= 10; |  | 
| hddsize += (c - '0'); |  | 
| } |  | 
| if (hddsize < 5) { |  | 
| *size = 5; |  | 
| return(FAILURE); |  | 
| } |  | 
| else if (hddsize > 256) { |  | 
| *size = 256; |  | 
| return(FAILURE); |  | 
| } |  | 
| *size = hddsize; |  | 
| return(SUCCESS); |  | 
 | } | } | 
 |  |  | 
 |  |  | 
 | // とりあえずモーダルで | // とりあえずモーダルで | 
| void newhdddisk(void) { | void newdisk(void) { | 
|  |  | 
| DialogPtr                       hDlg; |  | 
| int                                     done; |  | 
| short                           item; |  | 
| Str255                          sizestr; |  | 
| int                                     size; |  | 
 |  |  | 
 | OSType      type='.THD'; |  | 
 | FSSpec      fss; | FSSpec      fss; | 
 | char        fileName[] = "Newdisk.thd"; |  | 
 | char        fname[MAX_PATH]; | char        fname[MAX_PATH]; | 
 |  |  | 
| hDlg = GetNewDialog(IDD_NEWHDDDISK, NULL, (WindowPtr)-1); | initNewDisk(); | 
| if (!hDlg) { |  | 
| return; | if (targetDisk == 1) { | 
| } | if (saveFile('.D88', "Newdisk.d88", &fss)) { | 
| SelectDialogItemText(hDlg, IDC_HDDSIZE, 0x0000, 0x7fff); |  | 
|  |  | 
| SetDialogDefaultItem(hDlg, IDOK); |  | 
| SetDialogCancelItem(hDlg, IDCANCEL); |  | 
|  |  | 
| done = 0; |  | 
| size = 41; |  | 
| while(!done) { |  | 
| ModalDialog(NULL, &item); |  | 
| switch(item) { |  | 
| case IDOK: |  | 
| GetDialogItemText(GetDlgItem(hDlg, IDC_HDDSIZE), sizestr); |  | 
| if (gethddsize(sizestr, &size)) { |  | 
| ZeroMemory(sizestr, sizeof(sizestr)); |  | 
| sprintf(((char *)sizestr) + 1, "%d", size); |  | 
| sizestr[0] = (BYTE)strlen(((char *)sizestr) + 1); |  | 
| SetDialogItemText(GetDlgItem(hDlg, IDC_HDDSIZE), sizestr); |  | 
| break; |  | 
| } |  | 
| done = 1; |  | 
| break; |  | 
| case IDCANCEL: |  | 
| done = -1; |  | 
| break; |  | 
| } |  | 
| } |  | 
| DisposeDialog(hDlg); |  | 
| if (done > 0) {                                                         // making |  | 
|  |  | 
| if (saveFile(type, fileName, &fss)) { |  | 
 | fsspec2path(&fss, fname, sizeof(fname)); | fsspec2path(&fss, fname, sizeof(fname)); | 
| newdisk_hdd(fname, size); | newdisk_fdd(fname, media, disklabel); | 
 | } | } | 
 | } | } | 
 |  | else if (targetDisk == 2) { | 
 |  | if (saveFile('.THD', "Newdisk.thd", &fss)) { | 
 |  | fsspec2path(&fss, fname, sizeof(fname)); | 
 |  | newdisk_hdd(fname, hdsize); | 
 |  | } | 
 |  | } | 
 |  | HideWindow(diskWin); | 
 |  | DisposeWindow(diskWin); | 
 | } | } | 
 | #endif |  | 
 |  |  | 
 | static pascal void navEventProc( NavEventCallbackMessage sel,NavCBRecPtr parm,NavCallBackUserData ud ) | static pascal void navEventProc( NavEventCallbackMessage sel,NavCBRecPtr parm,NavCallBackUserData ud ) | 
 | { | { |