--- np2/macosx/toolwin.cpp 2003/11/12 19:06:33 1.10 +++ np2/macosx/toolwin.cpp 2004/05/23 04:07:56 1.20 @@ -11,7 +11,12 @@ #include "dialog.h" #include "soundmng.h" #include "fdefine.h" +#include "mackbd.h" +#include "mousemng.h" +#include "pccore.h" +#include "iocore.h" +extern void HandleMenuChoice(long wParam); enum { IDC_TOOLHDDACC = 0, @@ -109,11 +114,13 @@ static const OSType subcommand[11] ={ '- #define BASENUMBER 4 static const ControlID popup[2] = { {'pop1', 1}, {'pop2', 2} }; +static const ControlID imageid = {'back', 0}; static DragReceiveHandlerUPP dr; -static bool isPUMA; +static DragTrackingHandlerUPP tr; +static bool isPUMA, isJaguar; -static void openpopup(HIPoint location); +static void openpopup(Point location); static void skinchange(bool remake); // ---- @@ -124,9 +131,15 @@ static void checkOSVersion(void) { Gestalt(gestaltSystemVersion, &res); if (res<0x1020) { isPUMA = true; + isJaguar = false; } + else if (res<0x1030) { + isPUMA = false; + isJaguar = true; + } else { isPUMA = false; + isJaguar = false; } } } @@ -168,7 +181,7 @@ static PicHandle skinload(const char *pa return(ret); } } - return(getBMPfromResource("np2tool", bounds, CFSTR("bmp"))); + return(getBMPfromResource("np2tool.bmp", bounds)); } // ---- @@ -177,37 +190,47 @@ static void setlist(ControlRef hwnd, con #if 0 Rect rc; int width; -#endif - char basedir[MAX_PATH]; - UINT i; -const char *p; char dir[MAX_PATH]; -const char *q; - char cfname[512]; + char basedir[MAX_PATH]; +#endif MenuHandle menu; + UINT i; + char cfname[512]; +const char *q; +const char *p; + CFStringRef str; + Str255 pname; + bool success = false; GetBevelButtonMenuHandle(hwnd, &menu); - while (MenuHasEnabledItems(menu)) { - DeleteMenuItem(menu, 1); - }; + DeleteMenuItems(menu, 1, fdd->cnt); #if 0 GetControlBounds(hwnd, &rc); width = rc.right - rc.left - 6; // border size? -#endif basedir[0] = '\0'; if (sel < fdd->cnt) { milstr_ncpy(basedir, fdd->name[fdd->pos[sel]], sizeof(basedir)); file_cutname(basedir); } +#endif for (i=0; icnt; i++) { + SInt32 attr = kMenuItemAttrIconDisabled; p = fdd->name[fdd->pos[i]]; - if (getLongFileName(cfname, p)) { - q = cfname; + success = getLongFileName(cfname, p); + str = CFStringCreateWithCString(NULL, cfname, CFStringGetSystemEncoding()); + if (str) { + if (success) { + if (file_attr(p) != FILEATTR_ARCHIVE) { + attr |= kMenuItemAttrDisabled; + } + AppendMenuItemTextWithCFString(menu, str, attr, NULL, NULL); + } + CFRelease(str); } else { +#if 0 milstr_ncpy(dir, p, sizeof(dir)); file_cutname(dir); -#if 0 if (!file_cmpname(basedir, dir)) { q = file_getname((char *)p); } @@ -216,13 +239,16 @@ const char *q; q = dir; } #else - q = file_getname((char *)p); + q = file_getname((char *)p); #endif - } - AppendMenu(menu, "\pNot Available"); - SetMenuItemTextWithCFString(menu, i+1, CFStringCreateWithCString(NULL,q,kCFStringEncodingUTF8)); - if (file_attr(p)==FILEATTR_ARCHIVE) { - EnableMenuItem(menu, i+1); + mkstr255(pname, q); + AppendMenu(menu, pname); + if (file_attr(p)==FILEATTR_ARCHIVE) { + EnableMenuItem(menu, i+1); + } + else { + DisableMenuItem(menu, i+1); + } } p += sizeof(fdd->name[0]); } @@ -230,10 +256,16 @@ const char *q; CFStringRef title; SetBevelButtonMenuValue(hwnd, sel+1); CopyMenuItemTextAsCFString(menu, sel+1, &title); - SetControlTitleWithCFString(hwnd, title); + if (title) { + SetControlTitleWithCFString(hwnd, title); + CFRelease(title); + } } else { SetControlTitleWithCFString(hwnd, CFSTR(" ")); + for (i=0; icnt; i++) { + CheckMenuItem(menu, i+1, 0); + } } } @@ -332,9 +364,21 @@ static pascal OSStatus cfControlproc(Eve } else if (GetEventClass(event)==kEventClassControl && GetEventKind(event)==kEventControlContextualMenuClick) { HIPoint location; + Point point; + soundmng_stop(); GetEventParameter (event, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(HIPoint), NULL, &location); - openpopup(location); + point.h = (short)location.x; + point.v = (short)location.y; + if (!isJaguar && !isPUMA) { + GrafPtr port, dst; + bool portchanged; + dst = GetWindowPort(toolwin.hwnd); + portchanged = QDSwapPort(dst, &port); + LocalToGlobal(&point); + if (portchanged) QDSwapPort(port, NULL); + } + openpopup(point); soundmng_play(); } @@ -343,6 +387,22 @@ static pascal OSStatus cfControlproc(Eve return err; } +static PixPatHandle portpat; + +static void setDragColor(GrafPtr window) { + GrafPtr port; + RGBColor color; + bool portchanged; + + portchanged = QDSwapPort(window, &port); + GetThemeBrushAsColor(kThemeBrushDragHilite, 32, true, &color); + portpat = NewPixPat(); + MakeRGBPat(portpat, &color); + PenPixPat(portpat); + PenSize(3, 3); + if (portchanged) QDSwapPort(port, NULL); +} + static void toolwincreate(WindowRef hWnd) { const SUBITEM *p; @@ -351,6 +411,8 @@ const SUBITEM *p; const char *cls; UInt32 style; + setDragColor(GetWindowPort(hWnd)); + ControlButtonContentInfo info; info.contentType = kControlContentPictHandle; info.u.picture = NULL; @@ -450,6 +512,7 @@ static void toolwindestroy(void) { DisposePixPat(toolwin.access[1]); KillPicture(toolwin.hbmp); toolwin.hbmp = NULL; + DisposePixPat(portpat); } } @@ -467,7 +530,7 @@ static pascal OSStatus cfWinproc(EventHa switch (cmd.commandID) { case 'rset': - recieveCommand(IDM_RESET); + HandleMenuChoice(IDM_RESET); err=noErr; break; @@ -477,12 +540,12 @@ static pascal OSStatus cfWinproc(EventHa break; case 'opn1': - recieveCommand(IDM_FDD1OPEN); + HandleMenuChoice(IDM_FDD1OPEN); err=noErr; break; case 'ejt1': - recieveCommand(IDM_FDD1EJECT); + HandleMenuChoice(IDM_FDD1EJECT); err=noErr; break; @@ -492,17 +555,17 @@ static pascal OSStatus cfWinproc(EventHa break; case 'opn2': - recieveCommand(IDM_FDD2OPEN); + HandleMenuChoice(IDM_FDD2OPEN); err=noErr; break; case 'ejt2': - recieveCommand(IDM_FDD2EJECT); + HandleMenuChoice(IDM_FDD2EJECT); err=noErr; break; case 'exit': - recieveCommand(IDM_EXIT); + HandleMenuChoice(IDM_EXIT); err=noErr; break; @@ -513,6 +576,9 @@ static pascal OSStatus cfWinproc(EventHa else if (GetEventClass(event)==kEventClassWindow) { switch (GetEventKind(event)) { case kEventWindowClose: +#ifdef AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + case kEventWindowDrawerClosed: +#endif toolwin_close(); err=noErr; break; @@ -525,24 +591,44 @@ static pascal OSStatus cfWinproc(EventHa Draw1Control(sub); } } + err=noErr; break; - case kEventWindowFocusAcquired: - SelectWindow(hWndMain); - break; - - default: break; } } - else if (GetEventClass(event)==kEventClassKeyboard && GetEventKind(event)==kEventRawKeyDown) { - UInt32 modif; + else if (GetEventClass(event)==kEventClassKeyboard) { + UInt32 whatHappened = GetEventKind(event); + UInt32 key; + GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key); + UInt32 modif; GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modif); - if (modif & cmdKey) { - EventRecord eve; - ConvertEventRefToEventRecord( event,&eve ); - recieveCommand(MenuEvent(&eve)); + switch (whatHappened) + { + case kEventRawKeyUp: + mackbd_keyup(key); + err = noErr; + break; + case kEventRawKeyRepeat: + mackbd_keydown(key); + err = noErr; + break; + case kEventRawKeyDown: + if (modif & cmdKey) { + EventRecord eve; + ConvertEventRefToEventRecord( event,&eve ); + mousemng_disable(MOUSEPROC_MACUI); + HandleMenuChoice(MenuEvent(&eve)); + mousemng_enable(MOUSEPROC_MACUI); + } + else { + mackbd_keydown(key); + } + err = noErr; + break; + default: + break; } } @@ -550,13 +636,19 @@ static pascal OSStatus cfWinproc(EventHa return err; } -OSErr setDropFile(FSSpec spec, int drv) { - char fname[MAX_PATH]; +static int getTypeFromFSSpec(char* fname, FSSpec* spec) { int ftype; - fsspec2path(&spec, fname, MAX_PATH); + fsspec2path(spec, fname, MAX_PATH); ftype = file_getftype(fname); - switch (ftype) { + + return (ftype); +} + +OSErr setDropFile(FSSpec spec, int drv) { + char fname[MAX_PATH]; + + switch (getTypeFromFSSpec(fname, &spec)) { case FTYPE_D88: case FTYPE_BETA: if (drv == -1) { @@ -566,7 +658,7 @@ OSErr setDropFile(FSSpec spec, int drv) toolwin_setfdd(drv, fname); break; - case FTYPE_TEXT: + case FTYPE_INI: strcpy(np2tool.skin, fname); skinchange(true); break; @@ -582,13 +674,31 @@ OSErr setDropFile(FSSpec spec, int drv) return(noErr); } -static pascal OSErr DragReceiver( WindowRef theWindow, void *handlerRefCon, DragRef theDrag ) -{ +static OSErr getFSSpecFromDragItem(DragRef theDrag, HFSFlavor* aHFSFlavor) { + UInt16 numItems; + DragItemRef ItemRef; + FlavorType Type; + + CountDragItems( theDrag, &numItems ); + if ( numItems != 1 ) { + return( -1 ); + } + GetDragItemReferenceNumber( theDrag, 1, &ItemRef ); + GetFlavorType( theDrag, ItemRef, 1, &Type ); + if ( Type != flavorTypeHFS ) { + return( -1 ); + } + Size dataSize = sizeof(HFSFlavor); + GetFlavorData( theDrag, ItemRef, flavorTypeHFS, aHFSFlavor, &dataSize, 0 ); + return(noErr); +} + +static SInt16 whichControl(DragRef theDrag, WindowRef theWindow) { SInt16 drv = -1; Point pt; + int i; ControlRef popupref[2]; Rect bounds[2]; - int i; GetDragMouse(theDrag, &pt, NULL); GlobalToLocal(&pt); @@ -600,28 +710,92 @@ static pascal OSErr DragReceiver( Window break; } } + return(drv); +} - UInt16 numItems; - CountDragItems( theDrag, &numItems ); - if ( numItems != 1 ) - { - return( -1 ); +static OSErr DragTracker (DragTrackingMessage message, WindowRef theWindow, void * handlerRefCon, DragRef theDrag) { + SInt16 drv = -1; + HFSFlavor aHFSFlavor; + RgnHandle rgn = NULL; + char fname[MAX_PATH]; + ControlRef targetControl; + GrafPtr port; + bool portchanged = false; + static bool hilite = false; + Rect bounds; + ControlRef back; + + if (message == kDragTrackingEnterHandler || message == kDragTrackingLeaveHandler) { + hilite = false; + return (noErr); + } + if (getFSSpecFromDragItem(theDrag, &aHFSFlavor) != noErr) { + if (hilite) { + GetControlByID(theWindow, &imageid, &back); + Draw1Control(back); + hilite = false; + } + return (-1); + } + if (message != kDragTrackingLeaveWindow) { + switch (getTypeFromFSSpec(fname, &aHFSFlavor.fileSpec)) { + case FTYPE_D88: + case FTYPE_BETA: + drv = whichControl(theDrag, theWindow); + if (drv == -1) { + message = kDragTrackingLeaveWindow; + } + else { + GetControlByID(theWindow, &popup[drv], &targetControl); + GetControlBounds(targetControl, &bounds); + } + break; + + case FTYPE_INI: + case FTYPE_THD: + case FTYPE_HDI: + GetWindowBounds(theWindow, kWindowContentRgn, &bounds); + OffsetRect(&bounds, -bounds.left, -bounds.top); + break; + + default: + return(noErr); + } } - - DragItemRef ItemRef; - GetDragItemReferenceNumber( theDrag, 1, &ItemRef ); - FlavorType Type; - GetFlavorType( theDrag, ItemRef, 1, &Type ); - if ( Type != flavorTypeHFS ) - { - return( -1 ); + portchanged = QDSwapPort(GetWindowPort(theWindow), &port); + if (message == kDragTrackingLeaveWindow && hilite) { + GetControlByID(theWindow, &imageid, &back); + Draw1Control(back); + hilite = false; } + else { + rgn = NewRgn(); + if (rgn) { + RectRgn(rgn, &bounds); + FrameRgn(rgn); + DisposeRgn(rgn); + } + hilite = true; + } + if (portchanged) QDSwapPort(port, NULL); + return(noErr); +} + +static pascal OSErr DragReceiver( WindowRef theWindow, void *handlerRefCon, DragRef theDrag ) +{ + SInt16 drv = -1; HFSFlavor aHFSFlavor; - Size dataSize = sizeof(aHFSFlavor); - GetFlavorData( theDrag, ItemRef, flavorTypeHFS, &aHFSFlavor, &dataSize, 0 ); - + ControlRef back; + + GetControlByID(theWindow, &imageid, &back); + Draw1Control(back); + + if (getFSSpecFromDragItem(theDrag, &aHFSFlavor) != noErr) { + return (-1); + } + drv = whichControl(theDrag, theWindow); return( setDropFile(aHFSFlavor.fileSpec, drv) ); } @@ -644,14 +818,20 @@ static WindowRef makeNibWindow (IBNibRef { kEventClassWindow, kEventWindowClose }, { kEventClassWindow, kEventWindowShown }, { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowFocusAcquired }, + { kEventClassKeyboard, kEventRawKeyUp}, { kEventClassKeyboard, kEventRawKeyDown}, + { kEventClassKeyboard, kEventRawKeyRepeat}, +#ifdef AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + { kEventClassWindow, kEventWindowDrawerClosed }, +#endif }; EventHandlerRef ref; InstallWindowEventHandler (win, NewEventHandlerUPP(cfWinproc), GetEventTypeCount(list), list, (void *)win, &ref); dr = NewDragReceiveHandlerUPP((DragReceiveHandlerProcPtr)DragReceiver); + tr = NewDragTrackingHandlerUPP((DragTrackingHandlerProcPtr)DragTracker); InstallReceiveHandler( dr, win, NULL); + InstallTrackingHandler( tr, win, NULL); } return(win); } @@ -735,7 +915,7 @@ const char *p; // ---- -static void openpopup(HIPoint location) { +static void openpopup(Point location) { MenuRef hMenu; short sel; @@ -749,7 +929,7 @@ static void openpopup(HIPoint location) AppendMenuItemTextWithCFString(hMenu, CFCopyLocalizedString(CFSTR("Close"),"ToolWin Close"), kMenuItemAttrIconDisabled, NULL, NULL); DeleteMenu(222); selectclose = CountMenuItems(hMenu); - sel = LoWord(PopUpMenuSelect(hMenu, (short)location.y, (short)location.x, 0)); + sel = LoWord(PopUpMenuSelect(hMenu, location.v, location.h, 0)); DisposeMenu(hMenu); if (sel == selectclose) { toolwin_close(); @@ -757,8 +937,8 @@ static void openpopup(HIPoint location) else { switch (sel) { case 1: - if(dialog_fileselect(fname, sizeof(fname), hWndMain)) { - if (file_getftype(fname)==FTYPE_TEXT) { + if(dialog_fileselect(fname, sizeof(fname), hWndMain, OPEN_INI)) { + if (file_getftype(fname)==FTYPE_INI) { strcpy(np2tool.skin, fname); skinchange(true); } @@ -786,16 +966,33 @@ static void openpopup(HIPoint location) } +static void makeskinimage(WindowRef win,PicHandle bmp, Rect* rect) { + ControlButtonContentInfo info; + ControlRef image; + EventHandlerRef ref; + EventTypeSpec list[]={ + { kEventClassControl, kEventControlContextualMenuClick }, + }; + + info.contentType = kControlContentPictHandle; + info.u.picture = bmp; + CreatePictureControl(win, rect, &info, true, &image); + SetControlID(image, &imageid); + InstallControlEventHandler (image, NewEventHandlerUPP(cfControlproc), GetEventTypeCount(list), list, (void *)win, &ref); +} + +static void opentoolwin_puma(WindowRef win) { + if (np2tool.posy < 35) np2tool.posy = 35; + if (np2tool.posx < 5 ) np2tool.posx = 5; + MoveWindow(win, np2tool.posx, np2tool.posy, true); + ShowWindow(win); +} + void toolwin_open(void) { PicHandle hbmp; WindowRef hWnd = NULL; Rect bounds; - ControlRef image; - EventTypeSpec list[]={ - { kEventClassControl, kEventControlContextualMenuClick }, - }; - EventHandlerRef ref; if (toolwin.hwnd) { toolwin_close(); @@ -816,29 +1013,21 @@ void toolwin_open(void) { goto twope_err2; } - if (isPUMA) { + + SetWindowBounds(hWnd, kWindowContentRgn, &bounds); + if (isPUMA) { toolwincreate(hWnd); + makeskinimage(hWnd, hbmp, &bounds); } - SizeWindow(hWnd, bounds.right-bounds.left, bounds.bottom-bounds.top, true); - ControlButtonContentInfo info; - info.contentType = kControlContentPictHandle; - info.u.picture = hbmp; - CreatePictureControl(hWnd, &bounds, &info, true, &image); - InstallControlEventHandler (image, NewEventHandlerUPP(cfControlproc), GetEventTypeCount(list), list, (void *)hWnd, &ref); - if (!isPUMA) { + else { + makeskinimage(hWnd, hbmp, &bounds); toolwincreate(hWnd); } #ifndef AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER - if (np2tool.posy < 35) np2tool.posy = 35; - if (np2tool.posx < 5 ) np2tool.posx = 5; - MoveWindow(hWnd, np2tool.posx, np2tool.posy, true); - ShowWindow(hWnd); + opentoolwin_puma(hWnd); #else if (isPUMA) { - if (np2tool.posy < 35) np2tool.posy = 35; - if (np2tool.posx < 5 ) np2tool.posx = 5; - MoveWindow(hWnd, np2tool.posx, np2tool.posy, true); - ShowWindow(hWnd); + opentoolwin_puma(hWnd); } else { Rect mainbounds; @@ -852,6 +1041,8 @@ void toolwin_open(void) { } SetDrawerOffsets(hWnd, width/2-11, width/2-11); SetDrawerPreferredEdge(hWnd, kWindowEdgeTop); + const HISize size = {bounds.right-bounds.left, bounds.bottom-bounds.top}; + SetWindowResizeLimits(hWnd, &size, &size); OpenDrawer(hWnd, kWindowEdgeDefault, 1); } #endif @@ -881,6 +1072,7 @@ void toolwin_close(void) { } #endif RemoveReceiveHandler(dr, toolwin.hwnd); + RemoveTrackingHandler(tr, toolwin.hwnd); toolwindestroy(); DisposeWindow(toolwin.hwnd); toolwin.hwnd = NULL; @@ -1001,7 +1193,11 @@ const DISKACC *accterm; // ---- static const char ini_title[] = "NP2 tool"; +#if !defined(SUPPORT_PC9821) static const char inifile[] = "np2.cfg"; // same file name.. +#else +static const char inifile[] = "np21.cfg"; +#endif static const INITBL iniitem[] = { {"WindposX", INITYPE_SINT32, &np2tool.posx, 0},