diff --git a/GpApp/Externs.h b/GpApp/Externs.h
index 79d4ca3..3717c7a 100644
--- a/GpApp/Externs.h
+++ b/GpApp/Externs.h
@@ -230,6 +230,7 @@ void CloseThisWindow (WindowPtr *);
// THREEWORDINLINE(0x4218, 0x10B8, 0x0260);
#endif
+
extern Boolean hasScrap, scrapIsARoom;
#include "GliderDefines.h"
#include "GliderStructs.h"
diff --git a/GpApp/GliderProtos.h b/GpApp/GliderProtos.h
index 78d36ce..12b7df5 100644
--- a/GpApp/GliderProtos.h
+++ b/GpApp/GliderProtos.h
@@ -435,8 +435,8 @@ void QuickBandsRefresh (Boolean);
void QuickFoilRefresh (Boolean);
void HandleScore (void);
-//void PutRoomScrap (void); // --- Scrap.c
-//void PutObjectScrap (void);
+void PutRoomScrap (void); // --- Scrap.c
+void PutObjectScrap (void);
void GetRoomScrap (void);
void GetObjectScrap (void);
//void SeeIfValidScrapAvailable (Boolean);
diff --git a/GpApp/GpApp.vcxproj b/GpApp/GpApp.vcxproj
index 693f8e3..d3eaec9 100644
--- a/GpApp/GpApp.vcxproj
+++ b/GpApp/GpApp.vcxproj
@@ -185,6 +185,7 @@
+
diff --git a/GpApp/GpApp.vcxproj.filters b/GpApp/GpApp.vcxproj.filters
index 161a4c3..c5126ac 100644
--- a/GpApp/GpApp.vcxproj.filters
+++ b/GpApp/GpApp.vcxproj.filters
@@ -213,6 +213,9 @@
Source Files
+
+ Source Files
+
diff --git a/GpApp/InterfaceInit.cpp b/GpApp/InterfaceInit.cpp
index 0ed10d8..fa8b679 100644
--- a/GpApp/InterfaceInit.cpp
+++ b/GpApp/InterfaceInit.cpp
@@ -157,7 +157,7 @@ void VariableInit (void)
paused = false;
hasMirror = false;
demoGoing = false;
-// scrapIsARoom = true;
+ scrapIsARoom = true;
splashDrawn = false;
#ifndef COMPILEDEMO
diff --git a/GpApp/Menu.cpp b/GpApp/Menu.cpp
index a62dafe..c1a7998 100644
--- a/GpApp/Menu.cpp
+++ b/GpApp/Menu.cpp
@@ -198,21 +198,21 @@ void UpdateClipboardMenus (void)
mm->SetItemEnabled(houseMenu, iCut - 1, true);
mm->SetItemEnabled(houseMenu, iCopy - 1, true);
-// if (hasScrap)
-// {
-// EnableMenuItem(houseMenu, iPaste);
-// if (scrapIsARoom)
-// {
-// GetLocalizedString(42, title);
-// SetMenuItemText(houseMenu, iPaste, title);
-// }
-// else
-// {
-// GetLocalizedString(43, title);
-// SetMenuItemText(houseMenu, iPaste, title);
-// }
-// }
-// else
+ if (hasScrap)
+ {
+ EnableMenuItem(houseMenu, iPaste);
+ if (scrapIsARoom)
+ {
+ GetLocalizedString(42, title);
+ SetMenuItemText(houseMenu, iPaste, title);
+ }
+ else
+ {
+ GetLocalizedString(43, title);
+ SetMenuItemText(houseMenu, iPaste, title);
+ }
+ }
+ else
{
mm->SetItemEnabled(houseMenu, iPaste - 1, false);
GetLocalizedString(44, title);
@@ -516,12 +516,12 @@ void DoHouseMenu (short theItem)
{
if (objActive > kNoObjectSelected)
{
-// PutObjectScrap();
+ PutObjectScrap();
DeleteObject();
}
else
{
-// PutRoomScrap();
+ PutRoomScrap();
DeleteRoom(false);
}
UpdateClipboardMenus();
@@ -531,10 +531,10 @@ void DoHouseMenu (short theItem)
case iCopy:
if (houseUnlocked)
{
-// if (objActive > kNoObjectSelected)
-// PutObjectScrap();
-// else
-// PutRoomScrap();
+ if (objActive > kNoObjectSelected)
+ PutObjectScrap();
+ else
+ PutRoomScrap();
UpdateClipboardMenus();
}
break;
@@ -542,12 +542,11 @@ void DoHouseMenu (short theItem)
case iPaste:
if (houseUnlocked)
{
-/* if (scrapIsARoom)
+ if (scrapIsARoom)
GetRoomScrap();
else
GetObjectScrap();
UpdateClipboardMenus();
-*/
}
break;
diff --git a/GpApp/Scrap.c b/GpApp/Scrap.c
deleted file mode 100644
index 2d9fc26..0000000
--- a/GpApp/Scrap.c
+++ /dev/null
@@ -1 +0,0 @@
-
//============================================================================
//----------------------------------------------------------------------------
// Scrap.c
//----------------------------------------------------------------------------
//============================================================================
/*
#include "Externs.h"
#include "Environ.h"
#include
Boolean DropLocationIsTrash (AEDesc *);
Boolean hasScrap, scrapIsARoom;
extern WindowPtr mapWindow;
extern Rect roomObjectRects[];
extern short objActive;
//============================================================== Functions
//-------------------------------------------------------------- PutRoomScrap
#ifndef COMPILEDEMO
void PutRoomScrap (void)
{
// this function copies the current room into the clipboard
Rect largeBounds, smallBounds;
PicHandle smallPict;
long theErr;
theErr = ZeroScrap();
if (theErr == noErr)
{
SetRect(&largeBounds, 0, 0, kRoomWide, kTileHigh);
SetRect(&smallBounds, 0, 0, kRoomWide / 4, kTileHigh / 4);
smallPict = OpenPicture(&smallBounds);
CopyBits(&(((GrafPtr)mainWindow)->portBits), &(((GrafPtr)mainWindow)->portBits),
&largeBounds, &smallBounds, srcCopy, nil);
ClosePicture();
HLock((Handle)smallPict);
theErr = PutScrap(GetHandleSize((Handle)smallPict), 'PICT', (Ptr)(*smallPict));
theErr = PutScrap(sizeof(roomType), 'Room', (Ptr)thisRoom);
if (theErr == noErr)
{
if (!hasScrap)
{
hasScrap = true;
UpdateMenus(false);
}
scrapIsARoom = true;
}
else
YellowAlert(kYellowScrapError, theErr);
KillPicture(smallPict);
}
else
YellowAlert(kYellowScrapError, theErr);
}
#endif
//-------------------------------------------------------------- PutObjectScrap
#ifndef COMPILEDEMO
void PutObjectScrap (void)
{
// this function copies the currently selected object into the clipboard
Str255 kindStr;
objectPtr scrapObjPtr;
long theErr;
theErr = ZeroScrap();
if (theErr == noErr)
{
GetIndString(kindStr, kObjectNameStrings, thisRoom->objects[objActive].what);
theErr = PutScrap(kindStr[0], 'TEXT', (Ptr)(kindStr + 1));
scrapObjPtr = &(thisRoom->objects[objActive]);
theErr = PutScrap(sizeof(objectType), 'Obj.', (Ptr)scrapObjPtr);
if (theErr == noErr)
{
if (!hasScrap)
{
hasScrap = true;
UpdateMenus(false);
}
scrapIsARoom = false;
}
else
YellowAlert(kYellowScrapError, theErr);
}
else
YellowAlert(kYellowScrapError, theErr);
}
#endif
//-------------------------------------------------------------- GetRoomScrap
#ifndef COMPILEDEMO
void GetRoomScrap (void)
{
// this function pastes a room from the clipboard
Handle tempRoom;
long theErr, scrapOffset;
short wasFloor, wasSuite, srcRoomNumber, destRoomNumber, i;
short linkRoomNumber;
tempRoom = NewHandle(0L);
if (tempRoom == nil)
{
YellowAlert(kYellowNoMemory, 0);
return;
}
theErr = GetScrap(tempRoom, 'Room', &scrapOffset);
if (theErr < 0)
YellowAlert(kYellowScrapError, theErr);
else
{
DeselectObject();
wasFloor = thisRoom->floor;
wasSuite = thisRoom->suite;
destRoomNumber = GetRoomNumber(thisRoom->floor, thisRoom->suite);
HLock(tempRoom);
BlockMove(*tempRoom, (Ptr)thisRoom, sizeof(roomType));
HUnlock(tempRoom);
DisposeHandle(tempRoom);
srcRoomNumber = GetRoomNumber(thisRoom->floor, thisRoom->suite);
thisRoom->floor = wasFloor;
thisRoom->suite = wasSuite;
for (i = 0; i < kMaxRoomObs; i++) // fix links
{ // first see if a linkable object
if ((ObjectIsLinkTransport(&thisRoom->objects[i])) ||
(ObjectIsLinkSwitch(&thisRoom->objects[i])))
{
linkRoomNumber = GetRoomLinked (&thisRoom->objects[i]);
if (linkRoomNumber == srcRoomNumber)
{ // if linked to an object in same roomÉ
if (ObjectIsLinkSwitch(&thisRoom->objects[i]))
{ // point to new room location
thisRoom->objects[i].data.d.where =
(wasSuite * 100) + wasFloor + kNumUndergroundFloors;
}
else
{ // point to new room location
thisRoom->objects[i].data.e.where =
(wasSuite * 100) + wasFloor + kNumUndergroundFloors;
}
}
}
}
CopyThisRoomToRoom();
ReflectCurrentRoom(false);
fileDirty = true;
UpdateMenus(false);
}
}
#endif
//-------------------------------------------------------------- GetObjectScrap
#ifndef COMPILEDEMO
void GetObjectScrap (void)
{
// this function pastes an object from the clipboard
objectType tempObject;
Handle tempObjectHand;
Point noPoint;
long theErr, scrapOffset;
short direction, dist;
tempObjectHand = NewHandle(0L);
if (tempObjectHand == nil)
{
YellowAlert(kYellowNoMemory, 0);
return;
}
theErr = GetScrap(tempObjectHand, 'Obj.', &scrapOffset);
if (theErr < 0)
YellowAlert(kYellowScrapError, theErr);
else
{
DeselectObject();
HLock(tempObjectHand);
noPoint.h = 100;
noPoint.v = 100;
BlockMove(*tempObjectHand, (Ptr)(&tempObject), sizeof(objectType));
if (AddNewObject(noPoint, tempObject.what, false))
{
thisRoom->objects[objActive] = tempObject;
ReadyBackground(thisRoom->background, thisRoom->tiles);
GetThisRoomsObjRects();
DrawThisRoomsObjects();
SetPort((GrafPtr)mainWindow);
InvalRect(&mainWindowRect);
if (ObjectHasHandle(&direction, &dist))
{
StartMarqueeHandled(&roomObjectRects[objActive], direction, dist);
HandleBlowerGlider();
}
else
StartMarquee(&roomObjectRects[objActive]);
}
HUnlock(tempObjectHand);
DisposeHandle(tempObjectHand);
}
}
#endif
//-------------------------------------------------------------- SeeIfValidScrapAvailable
#ifndef COMPILEDEMO
void SeeIfValidScrapAvailable (Boolean updateMenus)
{
Handle tempRoom, tempObject;
long theErr, scrapOffset;
hasScrap = false;
tempRoom = NewHandle(0L);
if (tempRoom != nil)
{
theErr = GetScrap(tempRoom, 'Room', &scrapOffset);
if (theErr >= 0)
{
hasScrap = true;
scrapIsARoom = true;
}
DisposeHandle(tempRoom);
}
tempObject = NewHandle(0L);
if (tempObject != nil)
{
theErr = GetScrap(tempObject, 'Obj.', &scrapOffset);
if (theErr >= 0)
{
hasScrap = true;
scrapIsARoom = false;
}
DisposeHandle(tempObject);
}
if (updateMenus)
UpdateClipboardMenus();
}
#endif
//-------------------------------------------------------------- DropLocationIsTrash
Boolean DropLocationIsTrash (AEDesc *dropLocation)
{
AEDesc dropSpec;
FSSpec *theSpec;
CInfoPBRec thePB;
long trashDirID;
OSErr theErr;
short trashVRefNum;
if ((dropLocation->descriptorType != typeNull) &&
(AECoerceDesc(dropLocation, typeFSS, &dropSpec) == noErr))
{
HLock(dropSpec.dataHandle);
theSpec = (FSSpec *) *dropSpec.dataHandle;
thePB.dirInfo.ioCompletion = 0L;
thePB.dirInfo.ioNamePtr = (StringPtr) &theSpec->name;
thePB.dirInfo.ioVRefNum = theSpec->vRefNum;
thePB.dirInfo.ioFDirIndex = 0;
thePB.dirInfo.ioDrDirID = theSpec->parID;
theErr = PBGetCatInfo(&thePB, false);
HUnlock(dropSpec.dataHandle);
AEDisposeDesc(&dropSpec);
if (theErr != noErr)
return(false);
if (!(thePB.dirInfo.ioFlAttrib & (1 << 4)))
return(false);
FindFolder(theSpec->vRefNum, kTrashFolderType, kCreateFolder,
&trashVRefNum, &trashDirID);
if (thePB.dirInfo.ioDrDirID == trashDirID)
return(true);
}
return(false);
}
//-------------------------------------------------------------- DragTrackingFunc
#if 0
pascal OSErr DragTrackingFunc (DragTrackingMessage theMessage, WindowPtr theWindow,
void *theRefCon, DragReference theDrag)
{
DragAttributes attributes;
OSErr theErr;
theErr = noErr;
GetDragAttributes(theDrag, &attributes);
switch (theMessage)
{
case dragTrackingEnterWindow:
xxx;
break;
case dragTrackingInWindow:
xxx;
break;
case dragTrackingLeaveWindow:
xxx;
break;
}
return (theErr);
}
#endif
//-------------------------------------------------------------- DragRoom
Boolean DragRoom (EventRecord *theEvent, Rect *roomSrc, short roomNumber)
{
DragReference theDrag;
DragAttributes attributes;
AEDesc dropLocation;
Rect largeBounds, smallBounds;
PicHandle smallPict;
roomType *theRoom;
RgnHandle boundsRgn, tempRgn;
// Point dragPoint;
OSErr theErr;
short mouseDnMods, mouseUpMods, copyRoom;
char wasState;
if (thisMac.hasDrag)
{
if (!WaitMouseMoved(theEvent->where))
return(false);
SetPort((GrafPtr)mainWindow);
BeginUpdate((GrafPtr)mainWindow);
UpdateMainWindow();
EndUpdate((GrafPtr)mainWindow);
theErr = NewDrag(&theDrag);
if (theErr != noErr)
return (false);
wasState = HGetState((Handle)thisHouse);
HLock((Handle)thisHouse);
theRoom = &((*thisHouse)->rooms[roomNumber]);
theErr = AddDragItemFlavor(theDrag, (ItemReference)roomNumber,
(FlavorType)'Room', (Ptr)theRoom,
sizeof(roomType), (FlavorFlags)0);
if (theErr != noErr)
{
HSetState((Handle)thisHouse, wasState);
DisposeDrag(theDrag);
return (false);
}
SetRect(&largeBounds, 0, 0, kRoomWide, kTileHigh);
SetRect(&smallBounds, 0, 0, kRoomWide / 4, kTileHigh / 4);
smallPict = OpenPicture(&smallBounds);
CopyBits(&(((GrafPtr)mainWindow)->portBits), &(((GrafPtr)mainWindow)->portBits),
&largeBounds, &smallBounds, srcCopy, nil);
ClosePicture();
HLock((Handle)smallPict);
theErr = AddDragItemFlavor(theDrag, (ItemReference)roomNumber,
(FlavorType)'PICT', (Ptr)(*smallPict),
GetHandleSize((Handle)smallPict), (FlavorFlags)0);
HUnlock((Handle)smallPict);
KillPicture(smallPict);
HSetState((Handle)thisHouse, wasState);
if (theErr != noErr)
{
DisposeDrag(theDrag);
return (false);
}
theErr = SetDragItemBounds(theDrag, (ItemReference)roomNumber, roomSrc);
if (theErr != noErr)
{
DisposeDrag(theDrag);
return (false);
}
boundsRgn = NewRgn();
RectRgn(boundsRgn, roomSrc);
tempRgn = NewRgn();
CopyRgn(boundsRgn, tempRgn);
InsetRgn(tempRgn, 1, 1);
DiffRgn(boundsRgn, tempRgn, boundsRgn);
DisposeRgn(tempRgn);
theErr = TrackDrag(theDrag, theEvent, boundsRgn);
if ((theErr != noErr) && (theErr != userCanceledErr))
{
DisposeRgn(boundsRgn);
DisposeDrag(theDrag);
return(true);
}
theErr = GetDragAttributes(theDrag, &attributes);
if (theErr != noErr)
{
DisposeRgn(boundsRgn);
DisposeDrag(theDrag);
return(true);
}
theErr = GetDropLocation(theDrag, &dropLocation);
if (theErr != noErr)
{
DisposeRgn(boundsRgn);
DisposeDrag(theDrag);
return(true);
}
theErr = GetDragModifiers(theDrag, 0L, &mouseDnMods, &mouseUpMods);
if (theErr != noErr)
{
DisposeRgn(boundsRgn);
DisposeDrag(theDrag);
return(true);
}
copyRoom = (mouseDnMods | mouseUpMods) & optionKey;
if (!(attributes & kDragInsideSenderApplication))
{
if ((!copyRoom) && (DropLocationIsTrash(&dropLocation)))
{
DeselectObject();
DeleteRoom(true);
}
}
else if (attributes & kDragInsideSenderWindow)
{
// SetPort(mapWindow);
// GetDragMouse(theDrag, &dragPoint, 0L);
// GlobalToLocal(&dragPoint);
// MoveRoom(dragPoint);
}
DisposeRgn(boundsRgn);
DisposeDrag(theDrag);
}
return (true);
}
//-------------------------------------------------------------- InitDragInfo
#if 0
OSErr InitDragInfo (DragInfoHandle dragInfo)
{
OSErr theErr;
DragTrackingHandlerUPP trackingProc;
DragReceiveHandlerUPP receiveProc;
if (!HasDragManager())
return (noErr);
trackingProc = NewDragTrackingHandlerProc(DragTrackingFunc);
(**dragInfo).dragTrackingProc = trackingProc;
theErr = InstallTrackingHandler(trackingProc, mapWindow, dragInfo);
if (theErr != noErr)
return (theErr);
receiveProc = NewDragReceiveHandlerProc(DragReceiveFunc);
(**dragInfo).dragReceiveProc = receiveProc;
theErr = InstallReceiveHandler(receiveProc, (**dragInfo).window, dragInfo);
return err;
}
#endif
//-------------------------------------------------------------- KillDragInfo
#if 0
void KillDragInfo (DragInfoHandle dragInfo)
{
OSErr theErr;
if (!HasDragManager())
return (noErr);
theErr = RemoveTrackingHandler((**dragInfo).dragTrackingProc,
(**dragInfo).window);
theErr = RemoveReceiveHandler((**dragInfo).dragReceiveProc,
(**dragInfo).window);
}
#endif
*/
\ No newline at end of file
diff --git a/GpApp/Scrap.cpp b/GpApp/Scrap.cpp
new file mode 100644
index 0000000..af25d3e
--- /dev/null
+++ b/GpApp/Scrap.cpp
@@ -0,0 +1,547 @@
+
+//============================================================================
+//----------------------------------------------------------------------------
+// Scrap.c
+//----------------------------------------------------------------------------
+//============================================================================
+
+#include "Externs.h"
+#include "Environ.h"
+#include "MemoryManager.h"
+
+
+
+Boolean hasScrap, scrapIsARoom;
+
+extern WindowPtr mapWindow;
+extern Rect roomObjectRects[];
+extern short objActive;
+
+
+//============================================================== Functions
+
+THandle scrapData;
+int32_t scrapType;
+
+PLError_t ZeroScrap()
+{
+ scrapType = 0;
+ scrapData.Dispose();
+ scrapData = nullptr;
+ return PLErrors::kNone;
+}
+
+PLError_t PutScrap(size_t size, int32_t typeID, const void *data)
+{
+ scrapData.Dispose();
+
+ if (size)
+ {
+ scrapData = THandle(PortabilityLayer::MemoryManager::GetInstance()->AllocHandle(size));
+ if (!scrapData)
+ return PLErrors::kOutOfMemory;
+
+ memcpy(*scrapData, data, size);
+ }
+
+ scrapType = typeID;
+
+ return PLErrors::kNone;
+}
+
+PLError_t GetScrap(THandle destHdl, int32_t typeID, long *outSize)
+{
+ if (scrapType != typeID || !scrapData)
+ return PLErrors::kInvalidParameter;
+
+ size_t scrapSize = scrapData.MMBlock()->m_size;
+
+ if (scrapSize)
+ {
+ PortabilityLayer::MemoryManager::GetInstance()->ResizeHandle(destHdl.MMBlock(), scrapSize);
+ memcpy(*destHdl, *scrapData, scrapSize);
+ }
+
+ return PLErrors::kNone;
+}
+
+//-------------------------------------------------------------- PutRoomScrap
+
+#ifndef COMPILEDEMO
+void PutRoomScrap (void)
+{
+ // this function copies the current room into the clipboard
+ Rect largeBounds, smallBounds;
+ PLError_t theErr;
+
+ theErr = ZeroScrap();
+ if (theErr == PLErrors::kNone)
+ {
+ SetRect(&largeBounds, 0, 0, kRoomWide, kTileHigh);
+ SetRect(&smallBounds, 0, 0, kRoomWide / 4, kTileHigh / 4);
+
+ theErr = PutScrap(sizeof(roomType), 'Room', (Ptr)thisRoom);
+ if (theErr == PLErrors::kNone)
+ {
+ if (!hasScrap)
+ {
+ hasScrap = true;
+ UpdateMenus(false);
+ }
+ scrapIsARoom = true;
+ }
+ else
+ YellowAlert(kYellowScrapError, theErr);
+ }
+ else
+ YellowAlert(kYellowScrapError, theErr);
+}
+#endif
+
+//-------------------------------------------------------------- PutObjectScrap
+
+#ifndef COMPILEDEMO
+void PutObjectScrap (void)
+{
+ // this function copies the currently selected object into the clipboard
+ Str255 kindStr;
+ objectPtr scrapObjPtr;
+ long theErr;
+
+ theErr = ZeroScrap();
+ if (theErr == PLErrors::kNone)
+ {
+ scrapObjPtr = &(thisRoom->objects[objActive]);
+ theErr = PutScrap(sizeof(objectType), 'Obj.', (Ptr)scrapObjPtr);
+ if (theErr == PLErrors::kNone)
+ {
+ if (!hasScrap)
+ {
+ hasScrap = true;
+ UpdateMenus(false);
+ }
+ scrapIsARoom = false;
+ }
+ else
+ YellowAlert(kYellowScrapError, theErr);
+ }
+ else
+ YellowAlert(kYellowScrapError, theErr);
+}
+#endif
+
+//-------------------------------------------------------------- GetRoomScrap
+
+#ifndef COMPILEDEMO
+void GetRoomScrap (void)
+{
+ // this function pastes a room from the clipboard
+ Handle tempRoom;
+ long theErr, scrapOffset;
+ short wasFloor, wasSuite, srcRoomNumber, destRoomNumber, i;
+ short linkRoomNumber;
+
+ tempRoom = NewHandle(0L);
+ if (tempRoom == nil)
+ {
+ YellowAlert(kYellowNoMemory, 0);
+ return;
+ }
+
+ theErr = GetScrap(tempRoom, 'Room', &scrapOffset);
+ if (theErr < 0)
+ YellowAlert(kYellowScrapError, theErr);
+ else
+ {
+ DeselectObject();
+
+ wasFloor = thisRoom->floor;
+ wasSuite = thisRoom->suite;
+ destRoomNumber = GetRoomNumber(thisRoom->floor, thisRoom->suite);
+
+ memcpy(thisRoom, *tempRoom, sizeof(roomType));
+ tempRoom.Dispose();
+
+ srcRoomNumber = GetRoomNumber(thisRoom->floor, thisRoom->suite);
+ thisRoom->floor = wasFloor;
+ thisRoom->suite = wasSuite;
+
+ for (i = 0; i < kMaxRoomObs; i++) // fix links
+ { // first see if a linkable object
+ if ((ObjectIsLinkTransport(&thisRoom->objects[i])) ||
+ (ObjectIsLinkSwitch(&thisRoom->objects[i])))
+ {
+ linkRoomNumber = GetRoomLinked (&thisRoom->objects[i]);
+ if (linkRoomNumber == srcRoomNumber)
+ { // if linked to an object in same roomÉ
+ if (ObjectIsLinkSwitch(&thisRoom->objects[i]))
+ { // point to new room location
+ thisRoom->objects[i].data.d.where =
+ (wasSuite * 100) + wasFloor + kNumUndergroundFloors;
+ }
+ else
+ { // point to new room location
+ thisRoom->objects[i].data.e.where =
+ (wasSuite * 100) + wasFloor + kNumUndergroundFloors;
+ }
+ }
+ }
+ }
+
+ CopyThisRoomToRoom();
+ ReflectCurrentRoom(false);
+ fileDirty = true;
+ UpdateMenus(false);
+ }
+}
+#endif
+
+//-------------------------------------------------------------- GetObjectScrap
+
+#ifndef COMPILEDEMO
+void GetObjectScrap (void)
+{
+ // this function pastes an object from the clipboard
+ objectType tempObject;
+ Handle tempObjectHand;
+ Point noPoint;
+ long theErr, scrapOffset;
+ short direction, dist;
+
+ tempObjectHand = NewHandle(0L);
+ if (tempObjectHand == nil)
+ {
+ YellowAlert(kYellowNoMemory, 0);
+ return;
+ }
+
+ theErr = GetScrap(tempObjectHand, 'Obj.', &scrapOffset);
+ if (theErr < 0)
+ YellowAlert(kYellowScrapError, theErr);
+ else
+ {
+ DeselectObject();
+
+ noPoint.h = 100;
+ noPoint.v = 100;
+ memcpy(&tempObject, *tempObjectHand, sizeof(objectType));
+ if (AddNewObject(noPoint, tempObject.what, false))
+ {
+ thisRoom->objects[objActive] = tempObject;
+ ReadyBackground(thisRoom->background, thisRoom->tiles);
+ GetThisRoomsObjRects();
+ DrawThisRoomsObjects();
+
+ UpdateMainWindow();
+
+ if (ObjectHasHandle(&direction, &dist))
+ {
+ StartMarqueeHandled(&roomObjectRects[objActive], direction, dist);
+ HandleBlowerGlider();
+ }
+ else
+ StartMarquee(&roomObjectRects[objActive]);
+ }
+
+ tempObjectHand.Dispose();
+ }
+}
+#endif
+
+//-------------------------------------------------------------- SeeIfValidScrapAvailable
+
+#ifndef COMPILEDEMO
+void SeeIfValidScrapAvailable (Boolean updateMenus)
+{
+ Handle tempRoom, tempObject;
+ long theErr, scrapOffset;
+
+ hasScrap = false;
+
+ tempRoom = NewHandle(0L);
+ if (tempRoom != nil)
+ {
+ theErr = GetScrap(tempRoom, 'Room', &scrapOffset);
+ if (theErr >= 0)
+ {
+ hasScrap = true;
+ scrapIsARoom = true;
+ }
+ tempRoom.Dispose();
+ }
+
+ tempObject = NewHandle(0L);
+ if (tempObject != nil)
+ {
+ theErr = GetScrap(tempObject, 'Obj.', &scrapOffset);
+ if (theErr >= 0)
+ {
+ hasScrap = true;
+ scrapIsARoom = false;
+ }
+ tempObject.Dispose();
+ }
+
+ if (updateMenus)
+ UpdateClipboardMenus();
+}
+#endif
+
+//-------------------------------------------------------------- DropLocationIsTrash
+#if 0
+Boolean DropLocationIsTrash (AEDesc *dropLocation)
+{
+ AEDesc dropSpec;
+ FSSpec *theSpec;
+ CInfoPBRec thePB;
+ long trashDirID;
+ OSErr theErr;
+ short trashVRefNum;
+
+ if ((dropLocation->descriptorType != typeNull) &&
+ (AECoerceDesc(dropLocation, typeFSS, &dropSpec) == noErr))
+ {
+ HLock(dropSpec.dataHandle);
+ theSpec = (FSSpec *) *dropSpec.dataHandle;
+
+ thePB.dirInfo.ioCompletion = 0L;
+ thePB.dirInfo.ioNamePtr = (StringPtr) &theSpec->name;
+ thePB.dirInfo.ioVRefNum = theSpec->vRefNum;
+ thePB.dirInfo.ioFDirIndex = 0;
+ thePB.dirInfo.ioDrDirID = theSpec->parID;
+
+ theErr = PBGetCatInfo(&thePB, false);
+
+ HUnlock(dropSpec.dataHandle);
+ AEDisposeDesc(&dropSpec);
+
+ if (theErr != noErr)
+ return(false);
+
+ if (!(thePB.dirInfo.ioFlAttrib & (1 << 4)))
+ return(false);
+
+ FindFolder(theSpec->vRefNum, kTrashFolderType, kCreateFolder,
+ &trashVRefNum, &trashDirID);
+
+ if (thePB.dirInfo.ioDrDirID == trashDirID)
+ return(true);
+ }
+
+ return(false);
+}
+#endif
+
+//-------------------------------------------------------------- DragTrackingFunc
+
+#if 0
+pascal OSErr DragTrackingFunc (DragTrackingMessage theMessage, WindowPtr theWindow,
+ void *theRefCon, DragReference theDrag)
+{
+ DragAttributes attributes;
+ OSErr theErr;
+
+ theErr = noErr;
+
+ GetDragAttributes(theDrag, &attributes);
+
+ switch (theMessage)
+ {
+ case dragTrackingEnterWindow:
+ xxx;
+ break;
+
+ case dragTrackingInWindow:
+ xxx;
+ break;
+
+ case dragTrackingLeaveWindow:
+ xxx;
+ break;
+ }
+
+ return (theErr);
+}
+#endif
+
+//-------------------------------------------------------------- DragRoom
+#if 0
+Boolean DragRoom (EventRecord *theEvent, Rect *roomSrc, short roomNumber)
+{
+ DragReference theDrag;
+ DragAttributes attributes;
+ AEDesc dropLocation;
+ Rect largeBounds, smallBounds;
+ PicHandle smallPict;
+ roomType *theRoom;
+ RgnHandle boundsRgn, tempRgn;
+// Point dragPoint;
+ OSErr theErr;
+ short mouseDnMods, mouseUpMods, copyRoom;
+ char wasState;
+
+ if (thisMac.hasDrag)
+ {
+ if (!WaitMouseMoved(theEvent->where))
+ return(false);
+
+ SetPort((GrafPtr)mainWindow);
+ BeginUpdate((GrafPtr)mainWindow);
+ UpdateMainWindow();
+ EndUpdate((GrafPtr)mainWindow);
+
+ theErr = NewDrag(&theDrag);
+ if (theErr != noErr)
+ return (false);
+
+ wasState = HGetState((Handle)thisHouse);
+ HLock((Handle)thisHouse);
+ theRoom = &((*thisHouse)->rooms[roomNumber]);
+
+ theErr = AddDragItemFlavor(theDrag, (ItemReference)roomNumber,
+ (FlavorType)'Room', (Ptr)theRoom,
+ sizeof(roomType), (FlavorFlags)0);
+ if (theErr != noErr)
+ {
+ HSetState((Handle)thisHouse, wasState);
+ DisposeDrag(theDrag);
+ return (false);
+ }
+
+ SetRect(&largeBounds, 0, 0, kRoomWide, kTileHigh);
+ SetRect(&smallBounds, 0, 0, kRoomWide / 4, kTileHigh / 4);
+ smallPict = OpenPicture(&smallBounds);
+ CopyBits(&(((GrafPtr)mainWindow)->portBits), &(((GrafPtr)mainWindow)->portBits),
+ &largeBounds, &smallBounds, srcCopy, nil);
+ ClosePicture();
+ HLock((Handle)smallPict);
+ theErr = AddDragItemFlavor(theDrag, (ItemReference)roomNumber,
+ (FlavorType)'PICT', (Ptr)(*smallPict),
+ GetHandleSize((Handle)smallPict), (FlavorFlags)0);
+ HUnlock((Handle)smallPict);
+ KillPicture(smallPict);
+
+ HSetState((Handle)thisHouse, wasState);
+ if (theErr != noErr)
+ {
+ DisposeDrag(theDrag);
+ return (false);
+ }
+
+ theErr = SetDragItemBounds(theDrag, (ItemReference)roomNumber, roomSrc);
+ if (theErr != noErr)
+ {
+ DisposeDrag(theDrag);
+ return (false);
+ }
+
+ boundsRgn = NewRgn();
+ RectRgn(boundsRgn, roomSrc);
+
+ tempRgn = NewRgn();
+ CopyRgn(boundsRgn, tempRgn);
+ InsetRgn(tempRgn, 1, 1);
+ DiffRgn(boundsRgn, tempRgn, boundsRgn);
+ DisposeRgn(tempRgn);
+
+ theErr = TrackDrag(theDrag, theEvent, boundsRgn);
+
+ if ((theErr != noErr) && (theErr != userCanceledErr))
+ {
+ DisposeRgn(boundsRgn);
+ DisposeDrag(theDrag);
+ return(true);
+ }
+
+ theErr = GetDragAttributes(theDrag, &attributes);
+ if (theErr != noErr)
+ {
+ DisposeRgn(boundsRgn);
+ DisposeDrag(theDrag);
+ return(true);
+ }
+
+ theErr = GetDropLocation(theDrag, &dropLocation);
+ if (theErr != noErr)
+ {
+ DisposeRgn(boundsRgn);
+ DisposeDrag(theDrag);
+ return(true);
+ }
+
+ theErr = GetDragModifiers(theDrag, 0L, &mouseDnMods, &mouseUpMods);
+ if (theErr != noErr)
+ {
+ DisposeRgn(boundsRgn);
+ DisposeDrag(theDrag);
+ return(true);
+ }
+
+ copyRoom = (mouseDnMods | mouseUpMods) & optionKey;
+
+ if (!(attributes & kDragInsideSenderApplication))
+ {
+ if ((!copyRoom) && (DropLocationIsTrash(&dropLocation)))
+ {
+ DeselectObject();
+ DeleteRoom(true);
+ }
+ }
+ else if (attributes & kDragInsideSenderWindow)
+ {
+ // SetPort(mapWindow);
+ // GetDragMouse(theDrag, &dragPoint, 0L);
+ // GlobalToLocal(&dragPoint);
+ // MoveRoom(dragPoint);
+ }
+
+ DisposeRgn(boundsRgn);
+ DisposeDrag(theDrag);
+ }
+
+ return (true);
+}
+#endif
+
+//-------------------------------------------------------------- InitDragInfo
+
+#if 0
+OSErr InitDragInfo (DragInfoHandle dragInfo)
+{
+ OSErr theErr;
+ DragTrackingHandlerUPP trackingProc;
+ DragReceiveHandlerUPP receiveProc;
+
+ if (!HasDragManager())
+ return (noErr);
+
+ trackingProc = NewDragTrackingHandlerProc(DragTrackingFunc);
+ (**dragInfo).dragTrackingProc = trackingProc;
+ theErr = InstallTrackingHandler(trackingProc, mapWindow, dragInfo);
+ if (theErr != noErr)
+ return (theErr);
+
+ receiveProc = NewDragReceiveHandlerProc(DragReceiveFunc);
+ (**dragInfo).dragReceiveProc = receiveProc;
+ theErr = InstallReceiveHandler(receiveProc, (**dragInfo).window, dragInfo);
+
+ return err;
+}
+#endif
+
+//-------------------------------------------------------------- KillDragInfo
+
+#if 0
+void KillDragInfo (DragInfoHandle dragInfo)
+{
+ OSErr theErr;
+
+ if (!HasDragManager())
+ return (noErr);
+
+ theErr = RemoveTrackingHandler((**dragInfo).dragTrackingProc,
+ (**dragInfo).window);
+ theErr = RemoveReceiveHandler((**dragInfo).dragReceiveProc,
+ (**dragInfo).window);
+}
+#endif
diff --git a/PortabilityLayer/MemoryManager.cpp b/PortabilityLayer/MemoryManager.cpp
index 4d9d17e..036f35f 100644
--- a/PortabilityLayer/MemoryManager.cpp
+++ b/PortabilityLayer/MemoryManager.cpp
@@ -122,8 +122,18 @@ namespace PortabilityLayer
bool MemoryManagerImpl::ResizeHandle(MMHandleBlock *hdl, size_t newSize)
{
- if (hdl->m_contents == nullptr)
- return false;
+ if (hdl->m_contents == nullptr)
+ {
+ if (newSize != 0)
+ {
+ void *newBuf = Alloc(newSize);
+ if (!newBuf)
+ return false;
+
+ hdl->m_contents = newBuf;
+ hdl->m_size = newSize;
+ }
+ }
if (newSize != hdl->m_size)
{
diff --git a/PortabilityLayer/PLHandle.cpp b/PortabilityLayer/PLHandle.cpp
index ea75390..3dd79a0 100644
--- a/PortabilityLayer/PLHandle.cpp
+++ b/PortabilityLayer/PLHandle.cpp
@@ -4,6 +4,6 @@
void THandleBase::Dispose() const
{
- if (m_hdl)
+ if (m_hdl)
PortabilityLayer::MemoryManager::GetInstance()->ReleaseHandle(m_hdl);
}
diff --git a/PortabilityLayer/PLMenus.cpp b/PortabilityLayer/PLMenus.cpp
index 5c2e0fa..bfdf087 100644
--- a/PortabilityLayer/PLMenus.cpp
+++ b/PortabilityLayer/PLMenus.cpp
@@ -82,5 +82,6 @@ void AppendMenuItem(MenuHandle menu, int8_t iconResID, uint8_t key, uint8_t subm
void SetMenuItemText(MenuHandle menu, int index, const PLPasStr &text)
{
- PL_NotYetImplemented();
+ PortabilityLayer::MenuManager *mm = PortabilityLayer::MenuManager::GetInstance();
+ mm->SetItemText(menu, index - 1, text);
}