Add an option during project creation for the desktop targets to select 640 or 320 mode. Major re-write of the C desktop project to be more complete with support for reading and writing to files, managing a set of document windows and printing support.
This commit is contained in:
parent
3c5a978718
commit
9f70c68ddf
|
@ -135,7 +135,25 @@
|
||||||
<key>Description</key>
|
<key>Description</key>
|
||||||
<string>This template creates an Apple IIgs C code project to build desktop application. The project starts with a single C file which you can modify. You can also add more assembly or C files as you may like.</string>
|
<string>This template creates an Apple IIgs C code project to build desktop application. The project starts with a single C file which you can modify. You can also add more assembly or C files as you may like.</string>
|
||||||
<key>Options</key>
|
<key>Options</key>
|
||||||
<array/>
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>Identifier</key>
|
||||||
|
<string>RESOLUTIONMODE</string>
|
||||||
|
<key>Name</key>
|
||||||
|
<string>Desktop Resolution</string>
|
||||||
|
<key>Description</key>
|
||||||
|
<string>Specify 640 or 320 pixel desktop enviroment.</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>popup</string>
|
||||||
|
<key>Default</key>
|
||||||
|
<string>640</string>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>640</string>
|
||||||
|
<string>320</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
<key>Targets</key>
|
<key>Targets</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
|
|
|
@ -14,45 +14,665 @@
|
||||||
#include <Menu.h>
|
#include <Menu.h>
|
||||||
#include <QuickDraw.h>
|
#include <QuickDraw.h>
|
||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
#include <Control.h>
|
||||||
|
#include <TextEdit.h>
|
||||||
#include <Desk.h>
|
#include <Desk.h>
|
||||||
#include <Resources.h>
|
#include <Resources.h>
|
||||||
#include <MiscTool.h>
|
#include <MiscTool.h>
|
||||||
|
#include <STDFile.h>
|
||||||
|
#include <GSOS.h>
|
||||||
|
#include <Print.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "___FILEBASENAME___.h"
|
#include "___FILEBASENAME___.h"
|
||||||
|
|
||||||
|
|
||||||
// Defines and macros
|
/* Defines and macros */
|
||||||
|
|
||||||
#define TOOLFAIL(string) \
|
#define TOOLFAIL(string) \
|
||||||
if (toolerror()) SysFailMgr(toolerror(), "\p" string "\n\r Error Code -> $");
|
if (toolerror()) SysFailMgr(toolerror(), "\p" string "\n\r Error Code -> $");
|
||||||
|
|
||||||
|
#define MAX_DOCUMENT_NAME 80
|
||||||
|
|
||||||
// Globals
|
#define PRINT_RECORD_SIZE 140
|
||||||
|
|
||||||
BOOLEAN done;
|
|
||||||
|
/* Types */
|
||||||
|
|
||||||
|
typedef struct tDocument
|
||||||
|
{
|
||||||
|
struct tDocument * nextDocument;
|
||||||
|
struct tDocument * prevDocument;
|
||||||
|
GrafPortPtr wPtr;
|
||||||
|
char documentName[MAX_DOCUMENT_NAME + 1];
|
||||||
|
BOOLEAN isOnDisk;
|
||||||
|
ResultBuf255Hndl fileName;
|
||||||
|
ResultBuf255Hndl pathName;
|
||||||
|
PrRecHndl printRecordHandle;
|
||||||
|
} tDocument;
|
||||||
|
|
||||||
|
|
||||||
|
/* Globals */
|
||||||
|
|
||||||
|
BOOLEAN shouldQuit;
|
||||||
EventRecord myEvent;
|
EventRecord myEvent;
|
||||||
unsigned int userid;
|
unsigned int userid;
|
||||||
|
tDocument * documentList;
|
||||||
|
|
||||||
|
|
||||||
// Implementation
|
/* Forward declarations */
|
||||||
|
|
||||||
void doAbout(void)
|
void doFileSave(void);
|
||||||
|
|
||||||
|
|
||||||
|
/* Implementation */
|
||||||
|
|
||||||
|
const char * resourceString(int resourceId, const char * defaultValue)
|
||||||
{
|
{
|
||||||
AlertWindow(awCString + awResource, NULL, ABOUT_ALERT_STRING);
|
Handle handle;
|
||||||
|
const char *result = defaultValue;
|
||||||
|
|
||||||
|
handle = LoadResource(rCString, resourceId);
|
||||||
|
if (toolerror() == 0) {
|
||||||
|
HLock(handle);
|
||||||
|
result = (const char *) (*handle);
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GrafPortPtr newDocument(void)
|
void freeResourceString(int resourceId)
|
||||||
{
|
{
|
||||||
return(NewWindow2("\p MyWindow ", 0, NULL, NULL, 0x02, WINDOW_RESID, rWindParam1));
|
ReleaseResource(-3, rCString, resourceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void showErrorAlert(int resourceId, int toolErrorCode)
|
||||||
|
{
|
||||||
|
char buffer[40] = "";
|
||||||
|
const char *substArray[2];
|
||||||
|
const char *toolErrorFormat;
|
||||||
|
|
||||||
|
if (toolErrorCode != 0) {
|
||||||
|
toolErrorFormat = resourceString(TOOL_ERROR_STRING, "\n\nTool error code = $%04x");
|
||||||
|
sprintf(buffer, toolErrorFormat, toolErrorCode);
|
||||||
|
freeResourceString(TOOL_ERROR_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
substArray[0] = resourceString(resourceId, "Unknown error has occurred");
|
||||||
|
substArray[1] = buffer;
|
||||||
|
|
||||||
|
AlertWindow(awCString + awResource, (Pointer) substArray, ERROR_ALERT_STRING);
|
||||||
|
freeResourceString(resourceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tDocument * findDocumentFromWindow(GrafPortPtr wPtr)
|
||||||
|
{
|
||||||
|
tDocument * result = documentList;
|
||||||
|
|
||||||
|
while (result != NULL) {
|
||||||
|
if (result->wPtr == wPtr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
result = result->nextDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma databank 1
|
||||||
|
void drawContents(void)
|
||||||
|
{
|
||||||
|
DrawControls(GetPort());
|
||||||
|
}
|
||||||
|
#pragma databank 0
|
||||||
|
|
||||||
|
|
||||||
|
const char * getUntitledName(void)
|
||||||
|
{
|
||||||
|
static int untitledNum = 1;
|
||||||
|
static char buffer[MAX_DOCUMENT_NAME];
|
||||||
|
const char *untitledFormat = resourceString(UNTITLED_STRING, " Untitled %d ");
|
||||||
|
|
||||||
|
sprintf(buffer, untitledFormat, untitledNum);
|
||||||
|
freeResourceString(UNTITLED_STRING);
|
||||||
|
untitledNum++;
|
||||||
|
|
||||||
|
return(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tDocument * newDocument(const char * windowName)
|
||||||
|
{
|
||||||
|
tDocument * documentPtr;
|
||||||
|
int titleLength;
|
||||||
|
|
||||||
|
documentPtr = malloc(sizeof(tDocument));
|
||||||
|
if (documentPtr == NULL) {
|
||||||
|
showErrorAlert(MALLOC_ERROR_STRING, 0);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
documentPtr->printRecordHandle = (PrRecHndl) NewHandle(PRINT_RECORD_SIZE, userid, 0, NULL);
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(MALLOC_ERROR_STRING, toolerror());
|
||||||
|
free(documentPtr);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
PrDefault(documentPtr->printRecordHandle);
|
||||||
|
|
||||||
|
documentPtr->isOnDisk = FALSE;
|
||||||
|
documentPtr->fileName = NULL;
|
||||||
|
documentPtr->pathName = NULL;
|
||||||
|
|
||||||
|
titleLength = strlen(windowName);
|
||||||
|
if (titleLength > MAX_DOCUMENT_NAME) {
|
||||||
|
titleLength = MAX_DOCUMENT_NAME;
|
||||||
|
}
|
||||||
|
documentPtr->documentName[0] = titleLength;
|
||||||
|
strncpy(&(documentPtr->documentName[1]), windowName, titleLength);
|
||||||
|
|
||||||
|
documentPtr->wPtr = NewWindow2(documentPtr->documentName, 0, drawContents, NULL, refIsResource,
|
||||||
|
WINDOW_RESID, rWindParam1);
|
||||||
|
if (documentPtr->wPtr == NULL) {
|
||||||
|
showErrorAlert(NEW_WINDOW_ERROR_STRING, toolerror());
|
||||||
|
DisposeHandle((Handle)documentPtr->printRecordHandle);
|
||||||
|
free(documentPtr);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
documentPtr->nextDocument = documentList;
|
||||||
|
documentPtr->prevDocument = NULL;
|
||||||
|
if (documentList != NULL)
|
||||||
|
documentList->prevDocument = documentPtr;
|
||||||
|
|
||||||
|
documentList = documentPtr;
|
||||||
|
|
||||||
|
return(documentPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOLEAN isDocumentDirty(tDocument * documentPtr)
|
||||||
|
{
|
||||||
|
BOOLEAN isDirty = FALSE;
|
||||||
|
CtlRecHndl controlHdl;
|
||||||
|
CtlRec * controlPtr;
|
||||||
|
|
||||||
|
controlHdl = GetCtlHandleFromID(documentPtr->wPtr, CONTROL_TEXT_EDIT);
|
||||||
|
if (toolerror() == 0) {
|
||||||
|
HLock((Handle) controlHdl);
|
||||||
|
controlPtr = *controlHdl;
|
||||||
|
isDirty = ((controlPtr->ctlFlag & fRecordDirty) != 0);
|
||||||
|
HUnlock((Handle) controlHdl);
|
||||||
|
}
|
||||||
|
return isDirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void clearDocumentDirty(tDocument * documentPtr)
|
||||||
|
{
|
||||||
|
CtlRecHndl controlHdl;
|
||||||
|
CtlRec * controlPtr;
|
||||||
|
|
||||||
|
controlHdl = GetCtlHandleFromID(documentPtr->wPtr, CONTROL_TEXT_EDIT);
|
||||||
|
if (toolerror() == 0) {
|
||||||
|
HLock((Handle) controlHdl);
|
||||||
|
controlPtr = *controlHdl;
|
||||||
|
controlPtr->ctlFlag &= (~fRecordDirty);
|
||||||
|
HUnlock((Handle) controlHdl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void saveDocument(tDocument * documentPtr)
|
||||||
|
{
|
||||||
|
RefNumRecGS closeRecord;
|
||||||
|
CreateRecGS createRecord;
|
||||||
|
NameRecGS destroyRecord;
|
||||||
|
OpenRecGS openRecord;
|
||||||
|
IORecGS writeRecord;
|
||||||
|
|
||||||
|
GrafPortPtr tmpPort;
|
||||||
|
LongWord dataLength;
|
||||||
|
Handle dataHandle;
|
||||||
|
|
||||||
|
tmpPort = GetPort();
|
||||||
|
SetPort(documentPtr->wPtr);
|
||||||
|
dataLength = TEGetText(teTextIsNewHandle | teDataIsCString, (Ref) &dataHandle, 0,
|
||||||
|
0, (Ref) NULL, NULL);
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror());
|
||||||
|
SetPort(tmpPort);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HLock((Handle) documentPtr->pathName);
|
||||||
|
|
||||||
|
destroyRecord.pCount = 1;
|
||||||
|
destroyRecord.pathname = &((*(documentPtr->pathName))->bufString);
|
||||||
|
DestroyGS(&destroyRecord);
|
||||||
|
|
||||||
|
createRecord.pCount = 5;
|
||||||
|
createRecord.pathname = &((*(documentPtr->pathName))->bufString);
|
||||||
|
createRecord.access = destroyEnable | renameEnable | readWriteEnable;
|
||||||
|
createRecord.fileType = 0x04;
|
||||||
|
createRecord.auxType = 0x0000;
|
||||||
|
createRecord.storageType = 1;
|
||||||
|
CreateGS(&createRecord);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror());
|
||||||
|
} else {
|
||||||
|
openRecord.pCount = 3;
|
||||||
|
openRecord.pathname = &((*(documentPtr->pathName))->bufString);
|
||||||
|
openRecord.requestAccess = writeEnable;
|
||||||
|
OpenGS(&openRecord);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror());
|
||||||
|
} else {
|
||||||
|
HLock(dataHandle);
|
||||||
|
|
||||||
|
writeRecord.pCount = 4;
|
||||||
|
writeRecord.refNum = openRecord.refNum;
|
||||||
|
writeRecord.dataBuffer = *dataHandle;
|
||||||
|
writeRecord.requestCount = dataLength;
|
||||||
|
WriteGS(&writeRecord);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror());
|
||||||
|
} else {
|
||||||
|
documentPtr->isOnDisk = TRUE;
|
||||||
|
clearDocumentDirty(documentPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
HUnlock(dataHandle);
|
||||||
|
|
||||||
|
closeRecord.pCount = 1; /* close the file */
|
||||||
|
closeRecord.refNum = openRecord.refNum;
|
||||||
|
CloseGS(&closeRecord);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DisposeHandle(dataHandle);
|
||||||
|
HUnlock((Handle) documentPtr->pathName);
|
||||||
|
SetPort(tmpPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOLEAN loadDocument(tDocument * documentPtr)
|
||||||
|
{
|
||||||
|
BOOLEAN result = TRUE;
|
||||||
|
|
||||||
|
RefNumRecGS closeRecord;
|
||||||
|
OpenRecGS openRecord;
|
||||||
|
IORecGS readRecord;
|
||||||
|
GrafPortPtr tmpPort;
|
||||||
|
Handle dataHandle;
|
||||||
|
|
||||||
|
openRecord.pCount = 12;
|
||||||
|
HLock((Handle) documentPtr->pathName);
|
||||||
|
openRecord.pathname = &((*(documentPtr->pathName))->bufString);
|
||||||
|
openRecord.requestAccess = readEnable;
|
||||||
|
openRecord.resourceNumber = 0;
|
||||||
|
openRecord.optionList = NULL;
|
||||||
|
OpenGS(&openRecord);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(OPEN_FILE_ERROR_STRING, toolerror());
|
||||||
|
result = FALSE;
|
||||||
|
} else {
|
||||||
|
dataHandle = NewHandle(openRecord.eof, userid, attrLocked, NULL);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(MALLOC_ERROR_STRING, toolerror());
|
||||||
|
result = FALSE;
|
||||||
|
} else {
|
||||||
|
readRecord.pCount = 4;
|
||||||
|
readRecord.refNum = openRecord.refNum;
|
||||||
|
readRecord.dataBuffer = *dataHandle;
|
||||||
|
readRecord.requestCount = openRecord.eof;
|
||||||
|
ReadGS(&readRecord);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(OPEN_FILE_ERROR_STRING, toolerror());
|
||||||
|
result = FALSE;
|
||||||
|
} else {
|
||||||
|
tmpPort = GetPort();
|
||||||
|
SetPort(documentPtr->wPtr);
|
||||||
|
TESetText(teTextIsPtr | teDataIsTextBlock, (Ref)*dataHandle, openRecord.eof,
|
||||||
|
teCtlStyleIsPtr, NULL, NULL);
|
||||||
|
SetPort(tmpPort);
|
||||||
|
}
|
||||||
|
DisposeHandle(dataHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
closeRecord.pCount = 1;
|
||||||
|
closeRecord.refNum = openRecord.refNum;
|
||||||
|
CloseGS(&closeRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
HUnlock((Handle) documentPtr->pathName);
|
||||||
|
clearDocumentDirty(documentPtr);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void closeDocument(GrafPortPtr wPtr)
|
void closeDocument(GrafPortPtr wPtr)
|
||||||
{
|
{
|
||||||
if (wPtr != NULL) {
|
tDocument * documentPtr;
|
||||||
CloseWindow(wPtr);
|
char documentName[MAX_DOCUMENT_NAME];
|
||||||
|
char * alertStrings[] = { documentName };
|
||||||
|
int documentNameLen;
|
||||||
|
char * tmpPtr;
|
||||||
|
int buttonClicked;
|
||||||
|
|
||||||
|
if (wPtr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
documentPtr = findDocumentFromWindow(wPtr);
|
||||||
|
if (documentPtr != NULL) {
|
||||||
|
while (isDocumentDirty(documentPtr)) {
|
||||||
|
/* The documentName in the documentPtr is actually a PString so the
|
||||||
|
first byte is the length of the string. */
|
||||||
|
tmpPtr = documentPtr->documentName;
|
||||||
|
documentNameLen = *tmpPtr;
|
||||||
|
tmpPtr++;
|
||||||
|
|
||||||
|
/* The documentName has spaces before and after the real name to format
|
||||||
|
the string for the window title bar. Strip those spaces out and store
|
||||||
|
the name into the documentName local array. */
|
||||||
|
while ((documentNameLen > 0) &&
|
||||||
|
(tmpPtr[documentNameLen - 1] == ' ')) {
|
||||||
|
documentNameLen--;
|
||||||
|
}
|
||||||
|
while (*tmpPtr == ' ') {
|
||||||
|
tmpPtr++;
|
||||||
|
documentNameLen--;
|
||||||
|
}
|
||||||
|
strncpy(documentName, tmpPtr, documentNameLen);
|
||||||
|
documentName[documentNameLen] = '\0';
|
||||||
|
|
||||||
|
buttonClicked = AlertWindow(awCString+awResource, (Pointer) alertStrings, SAVE_BEFORE_CLOSING);
|
||||||
|
switch (buttonClicked) {
|
||||||
|
case 0:
|
||||||
|
doFileSave();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
clearDocumentDirty(documentPtr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CloseWindow(wPtr);
|
||||||
|
|
||||||
|
if (documentPtr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (documentPtr->fileName != NULL) {
|
||||||
|
DisposeHandle((Handle) documentPtr->fileName);
|
||||||
|
documentPtr->fileName = NULL;
|
||||||
|
}
|
||||||
|
if (documentPtr->pathName != NULL) {
|
||||||
|
DisposeHandle((Handle) documentPtr->pathName);
|
||||||
|
documentPtr->pathName = NULL;
|
||||||
|
}
|
||||||
|
if (documentPtr->printRecordHandle != NULL) {
|
||||||
|
DisposeHandle((Handle)documentPtr->printRecordHandle);
|
||||||
|
documentPtr->printRecordHandle = NULL;
|
||||||
|
}
|
||||||
|
if (documentList == documentPtr) {
|
||||||
|
documentList = documentPtr->nextDocument;
|
||||||
|
} else if (documentPtr->prevDocument != NULL) {
|
||||||
|
documentPtr->prevDocument->nextDocument = documentPtr->nextDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (documentPtr->nextDocument != NULL)
|
||||||
|
documentPtr->nextDocument->prevDocument = documentPtr->prevDocument;
|
||||||
|
|
||||||
|
free(documentPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printDocument(tDocument * documentPtr)
|
||||||
|
{
|
||||||
|
GrafPortPtr printerPort;
|
||||||
|
LongWord lineNumber;
|
||||||
|
PrStatusRec printerStatus;
|
||||||
|
Rect pageRect;
|
||||||
|
|
||||||
|
printerPort = PrOpenDoc(documentPtr->printRecordHandle, NULL);
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(PRINT_ERROR_STRING, toolerror());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HLock((Handle) documentPtr->printRecordHandle);
|
||||||
|
pageRect = (*(documentPtr->printRecordHandle))->prInfo.rPage;
|
||||||
|
HUnlock((Handle) documentPtr->printRecordHandle);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(PRINT_ERROR_STRING, toolerror());
|
||||||
|
} else {
|
||||||
|
lineNumber = 0;
|
||||||
|
while (lineNumber != -1) {
|
||||||
|
PrOpenPage(printerPort, NULL);
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(PRINT_ERROR_STRING, toolerror());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lineNumber = TEPaintText(printerPort, lineNumber, &pageRect, 0,
|
||||||
|
(Handle) GetCtlHandleFromID(documentPtr->wPtr, CONTROL_TEXT_EDIT));
|
||||||
|
PrClosePage(printerPort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PrCloseDoc(printerPort);
|
||||||
|
|
||||||
|
if (PrError() == 0)
|
||||||
|
PrPicFile(documentPtr->printRecordHandle, NULL, &printerStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doAppleAbout(void)
|
||||||
|
{
|
||||||
|
AlertWindow(awCString + awResource, NULL, ABOUT_ALERT_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFileNew(void)
|
||||||
|
{
|
||||||
|
newDocument(getUntitledName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFileOpen(void)
|
||||||
|
{
|
||||||
|
tDocument * documentPtr;
|
||||||
|
SFTypeList2 fileTypes;
|
||||||
|
Handle nameHandle;
|
||||||
|
ResultBuf255Ptr namePtr;
|
||||||
|
int nameLen;
|
||||||
|
char documentName[MAX_DOCUMENT_NAME];
|
||||||
|
SFReplyRec2 reply;
|
||||||
|
|
||||||
|
/* By default, we want to open text files only which is what
|
||||||
|
the following fileTypes request. Customize as necessary. */
|
||||||
|
fileTypes.numEntries = 1;
|
||||||
|
fileTypes.fileTypeEntries[0].flags = 0x0000;
|
||||||
|
fileTypes.fileTypeEntries[0].fileType = 0x04;
|
||||||
|
fileTypes.fileTypeEntries[0].auxType = 0x0000;
|
||||||
|
|
||||||
|
reply.nameRefDesc = refIsNewHandle;
|
||||||
|
reply.pathRefDesc = refIsNewHandle;
|
||||||
|
SFGetFile2(30, 30, refIsResource, OPEN_FILE_STRING, NULL, &fileTypes, &reply);
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(OPEN_FILE_ERROR_STRING, toolerror());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reply.good) {
|
||||||
|
nameHandle = (Handle) reply.nameRef;
|
||||||
|
HLock(nameHandle);
|
||||||
|
namePtr = (ResultBuf255Ptr) (*nameHandle);
|
||||||
|
strcpy(documentName, " ");
|
||||||
|
nameLen = namePtr->bufString.length;
|
||||||
|
if (nameLen > MAX_DOCUMENT_NAME - 5)
|
||||||
|
nameLen = MAX_DOCUMENT_NAME - 5;
|
||||||
|
strncat(documentName, namePtr->bufString.text, nameLen);
|
||||||
|
strcat(documentName, " ");
|
||||||
|
HUnlock(nameHandle);
|
||||||
|
documentPtr = newDocument(documentName);
|
||||||
|
if (documentPtr == NULL) {
|
||||||
|
DisposeHandle((Handle) reply.nameRef);
|
||||||
|
DisposeHandle((Handle) reply.pathRef);
|
||||||
|
} else {
|
||||||
|
documentPtr->fileName = (ResultBuf255Hndl) reply.nameRef;
|
||||||
|
documentPtr->pathName = (ResultBuf255Hndl) reply.pathRef;
|
||||||
|
documentPtr->isOnDisk = loadDocument(documentPtr);
|
||||||
|
|
||||||
|
if (!documentPtr->isOnDisk)
|
||||||
|
closeDocument(documentPtr->wPtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFileSaveAs(void)
|
||||||
|
{
|
||||||
|
Handle nameHandle;
|
||||||
|
ResultBuf255Ptr namePtr;
|
||||||
|
int nameLen;
|
||||||
|
SFReplyRec2 reply;
|
||||||
|
tDocument * documentPtr = findDocumentFromWindow(FrontWindow());
|
||||||
|
|
||||||
|
if (documentPtr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
reply.nameRefDesc = refIsNewHandle;
|
||||||
|
reply.pathRefDesc = refIsNewHandle;
|
||||||
|
|
||||||
|
if (documentPtr->fileName == NULL)
|
||||||
|
SFPutFile2(30, 30, refIsResource, SAVE_FILE_STRING, refIsPointer,
|
||||||
|
(Ref) &(documentPtr->fileName), &reply);
|
||||||
|
else
|
||||||
|
SFPutFile2(30, 30, refIsResource, SAVE_FILE_STRING, refIsPointer,
|
||||||
|
(Ref) &((*(documentPtr->pathName))->bufString), &reply);
|
||||||
|
|
||||||
|
if (toolerror() != 0) {
|
||||||
|
showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reply.good) {
|
||||||
|
nameHandle = (Handle) reply.nameRef;
|
||||||
|
HLock(nameHandle);
|
||||||
|
namePtr = (ResultBuf255Ptr) (*nameHandle);
|
||||||
|
strcpy(documentPtr->documentName, " ");
|
||||||
|
nameLen = namePtr->bufString.length;
|
||||||
|
if (nameLen > MAX_DOCUMENT_NAME - 6)
|
||||||
|
nameLen = MAX_DOCUMENT_NAME - 6;
|
||||||
|
strncat(documentPtr->documentName, namePtr->bufString.text, nameLen);
|
||||||
|
strcat(documentPtr->documentName, " ");
|
||||||
|
documentPtr->documentName[0] = strlen(documentPtr->documentName) - 1;
|
||||||
|
HUnlock(nameHandle);
|
||||||
|
SetWTitle(documentPtr->documentName, documentPtr->wPtr);
|
||||||
|
|
||||||
|
documentPtr->fileName = (ResultBuf255Hndl) reply.nameRef;
|
||||||
|
documentPtr->pathName = (ResultBuf255Hndl) reply.pathRef;
|
||||||
|
documentPtr->isOnDisk = TRUE;
|
||||||
|
saveDocument(documentPtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFileSave(void)
|
||||||
|
{
|
||||||
|
tDocument * documentPtr = findDocumentFromWindow(FrontWindow());
|
||||||
|
|
||||||
|
if (documentPtr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (documentPtr->isOnDisk)
|
||||||
|
saveDocument(documentPtr);
|
||||||
|
else
|
||||||
|
doFileSaveAs();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFileClose(void)
|
||||||
|
{
|
||||||
|
closeDocument(FrontWindow());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFilePageSetup(void)
|
||||||
|
{
|
||||||
|
tDocument * documentPtr = findDocumentFromWindow(FrontWindow());
|
||||||
|
|
||||||
|
if (documentPtr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PrStlDialog(documentPtr->printRecordHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFilePrint(void)
|
||||||
|
{
|
||||||
|
tDocument * documentPtr = findDocumentFromWindow(FrontWindow());
|
||||||
|
|
||||||
|
if (documentPtr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (PrJobDialog(documentPtr->printRecordHandle))
|
||||||
|
printDocument(documentPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doFileQuit(void)
|
||||||
|
{
|
||||||
|
shouldQuit = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doEditUndo(void)
|
||||||
|
{
|
||||||
|
/* Nothing extra to do here. The text edit control handles this for us. */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doEditCut(void)
|
||||||
|
{
|
||||||
|
/* Nothing extra to do here. The text edit control handles this for us. */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doEditCopy(void)
|
||||||
|
{
|
||||||
|
/* Nothing extra to do here. The text edit control handles this for us. */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doEditPaste(void)
|
||||||
|
{
|
||||||
|
/* Nothing extra to do here. The text edit control handles this for us. */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doEditClear(void)
|
||||||
|
{
|
||||||
|
/* Nothing extra to do here. The text edit control handles this for us. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,35 +686,108 @@ void handleMenu(void)
|
||||||
|
|
||||||
switch (menuItemNum) {
|
switch (menuItemNum) {
|
||||||
case APPLE_ABOUT:
|
case APPLE_ABOUT:
|
||||||
doAbout();
|
doAppleAbout();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FILE_NEW:
|
case FILE_NEW:
|
||||||
newDocument();
|
doFileNew();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FILE_OPEN:
|
case FILE_OPEN:
|
||||||
newDocument();
|
doFileOpen();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FILE_SAVE:
|
||||||
|
doFileSave();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FILE_SAVE_AS:
|
||||||
|
doFileSaveAs();
|
||||||
|
break;
|
||||||
|
|
||||||
case FILE_CLOSE:
|
case FILE_CLOSE:
|
||||||
closeDocument(FrontWindow());
|
doFileClose();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FILE_PAGE_SETUP:
|
||||||
|
doFilePageSetup();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FILE_PRINT:
|
||||||
|
doFilePrint();
|
||||||
|
break;
|
||||||
|
|
||||||
case FILE_QUIT:
|
case FILE_QUIT:
|
||||||
done = TRUE;
|
doFileQuit();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDIT_UNDO:
|
case EDIT_UNDO:
|
||||||
|
doEditUndo();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDIT_CUT:
|
case EDIT_CUT:
|
||||||
|
doEditCut();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDIT_COPY:
|
case EDIT_COPY:
|
||||||
|
doEditCopy();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDIT_PASTE:
|
case EDIT_PASTE:
|
||||||
|
doEditPaste();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDIT_CLEAR:
|
case EDIT_CLEAR:
|
||||||
|
doEditClear();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
HiliteMenu(FALSE, menuNum);
|
HiliteMenu(FALSE, menuNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dimMenus(void)
|
||||||
|
{
|
||||||
|
static BOOLEAN windowWasOpen = TRUE;
|
||||||
|
static BOOLEAN applicationWindowWasInFront = TRUE;
|
||||||
|
BOOLEAN windowIsOpen;
|
||||||
|
BOOLEAN applicationWindowIsInFront;
|
||||||
|
|
||||||
|
GrafPortPtr wPtr = FrontWindow();
|
||||||
|
windowIsOpen = (wPtr != NULL);
|
||||||
|
applicationWindowIsInFront = (findDocumentFromWindow(wPtr) != NULL);
|
||||||
|
|
||||||
|
if ((windowIsOpen == windowWasOpen) &&
|
||||||
|
(applicationWindowIsInFront == applicationWindowWasInFront)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
windowWasOpen = windowIsOpen;
|
||||||
|
applicationWindowWasInFront = applicationWindowIsInFront;
|
||||||
|
|
||||||
|
if (windowIsOpen) {
|
||||||
|
EnableMItem(FILE_CLOSE);
|
||||||
|
SetMenuFlag(enableMenu, EDIT_MENU);
|
||||||
|
} else {
|
||||||
|
DisableMItem(FILE_CLOSE);
|
||||||
|
SetMenuFlag(disableMenu, EDIT_MENU);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (applicationWindowIsInFront) {
|
||||||
|
EnableMItem(FILE_SAVE);
|
||||||
|
EnableMItem(FILE_SAVE_AS);
|
||||||
|
EnableMItem(FILE_PAGE_SETUP);
|
||||||
|
EnableMItem(FILE_PRINT);
|
||||||
|
} else {
|
||||||
|
DisableMItem(FILE_SAVE);
|
||||||
|
DisableMItem(FILE_SAVE_AS);
|
||||||
|
DisableMItem(FILE_PAGE_SETUP);
|
||||||
|
DisableMItem(FILE_PRINT);
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawMenuBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void initMenus(void)
|
void initMenus(void)
|
||||||
{
|
{
|
||||||
int height;
|
int height;
|
||||||
|
@ -120,6 +813,14 @@ void initMenus(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void initGlobals(void)
|
||||||
|
{
|
||||||
|
documentList = NULL;
|
||||||
|
shouldQuit = FALSE;
|
||||||
|
myEvent.wmTaskMask = 0x001F7FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
int event;
|
int event;
|
||||||
|
@ -134,12 +835,12 @@ int main(void)
|
||||||
toolStartupRef = StartUpTools(userid, refIsResource, TOOL_STARTUP);
|
toolStartupRef = StartUpTools(userid, refIsResource, TOOL_STARTUP);
|
||||||
TOOLFAIL("Unable to start tools");
|
TOOLFAIL("Unable to start tools");
|
||||||
|
|
||||||
|
initGlobals();
|
||||||
initMenus();
|
initMenus();
|
||||||
InitCursor();
|
InitCursor();
|
||||||
|
|
||||||
done = FALSE;
|
while (!shouldQuit) {
|
||||||
myEvent.wmTaskMask = 0x001F7FFF;
|
dimMenus();
|
||||||
while (!done) {
|
|
||||||
event = TaskMaster(everyEvent, &myEvent);
|
event = TaskMaster(everyEvent, &myEvent);
|
||||||
TOOLFAIL("Unable to handle next event");
|
TOOLFAIL("Unable to handle next event");
|
||||||
|
|
||||||
|
|
|
@ -11,30 +11,72 @@
|
||||||
#define _GUARD_PROJECT___PROJECTNAMEASIDENTIFIER____FILE___FILEBASENAMEASIDENTIFIER____
|
#define _GUARD_PROJECT___PROJECTNAMEASIDENTIFIER____FILE___FILEBASENAMEASIDENTIFIER____
|
||||||
|
|
||||||
|
|
||||||
#define MENU_BAR 1
|
/* Menu bars */
|
||||||
|
#define MENU_BAR 1
|
||||||
|
|
||||||
#define APPLE_MENU 3
|
|
||||||
#define FILE_MENU 4
|
|
||||||
#define EDIT_MENU 5
|
|
||||||
|
|
||||||
#define EDIT_UNDO 250
|
/* Menus */
|
||||||
#define EDIT_CUT 251
|
#define APPLE_MENU 3
|
||||||
#define EDIT_COPY 252
|
#define FILE_MENU 4
|
||||||
#define EDIT_PASTE 253
|
#define EDIT_MENU 5
|
||||||
#define EDIT_CLEAR 254
|
|
||||||
|
|
||||||
#define FILE_NEW 401
|
|
||||||
#define FILE_OPEN 402
|
/* Menu items */
|
||||||
#define FILE_CLOSE 255
|
#define EDIT_UNDO 250
|
||||||
#define FILE_QUIT 256
|
#define EDIT_CUT 251
|
||||||
|
#define EDIT_COPY 252
|
||||||
|
#define EDIT_PASTE 253
|
||||||
|
#define EDIT_CLEAR 254
|
||||||
|
|
||||||
|
#define FILE_NEW 401
|
||||||
|
#define FILE_OPEN 402
|
||||||
|
#define FILE_SAVE 403
|
||||||
|
#define FILE_SAVE_AS 404
|
||||||
|
#define FILE_CLOSE 255
|
||||||
|
#define FILE_PAGE_SETUP 405
|
||||||
|
#define FILE_PRINT 406
|
||||||
|
#define FILE_QUIT 256
|
||||||
|
|
||||||
#define APPLE_ABOUT 301
|
#define APPLE_ABOUT 301
|
||||||
|
|
||||||
#define ABOUT_ALERT_STRING 1
|
|
||||||
|
|
||||||
|
/* Alert strings */
|
||||||
|
#define ABOUT_ALERT_STRING 1
|
||||||
|
#define ERROR_ALERT_STRING 2
|
||||||
|
#define SAVE_BEFORE_CLOSING 3
|
||||||
|
|
||||||
|
|
||||||
|
/* Error strings */
|
||||||
|
#define TOOL_ERROR_STRING 2001
|
||||||
|
#define NEW_WINDOW_ERROR_STRING 2002
|
||||||
|
#define MALLOC_ERROR_STRING 2003
|
||||||
|
#define OPEN_FILE_ERROR_STRING 2004
|
||||||
|
#define SAVE_FILE_ERROR_STRING 2005
|
||||||
|
#define PRINT_ERROR_STRING 2006
|
||||||
|
|
||||||
|
|
||||||
|
/* Other strings */
|
||||||
|
#define UNTITLED_STRING 3001
|
||||||
|
#define OPEN_FILE_STRING 3002
|
||||||
|
#define SAVE_FILE_STRING 3003
|
||||||
|
#define HELLO_WORLD_STRING 3004
|
||||||
|
|
||||||
|
|
||||||
|
/* Windows */
|
||||||
#define WINDOW_RESID 1001
|
#define WINDOW_RESID 1001
|
||||||
|
|
||||||
|
|
||||||
|
/* Controls */
|
||||||
|
#define CONTROL_TEXT_EDIT 1001
|
||||||
|
|
||||||
|
|
||||||
|
/* Tools */
|
||||||
#define TOOL_STARTUP 1
|
#define TOOL_STARTUP 1
|
||||||
|
|
||||||
|
|
||||||
|
/* By default, thie template builds for 640x200 mode. To build for
|
||||||
|
* 320x200 change the following value to 320 */
|
||||||
|
#define RES_MODE ___VARIABLE_RESOLUTIONMODE___
|
||||||
|
|
||||||
|
|
||||||
#endif /* defined(_GUARD_PROJECT___PROJECTNAMEASIDENTIFIER____FILE___FILEBASENAMEASIDENTIFIER____) */
|
#endif /* defined(_GUARD_PROJECT___PROJECTNAMEASIDENTIFIER____FILE___FILEBASENAMEASIDENTIFIER____) */
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "___FILEBASENAME___.h"
|
#include "___FILEBASENAME___.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Version resource */
|
||||||
resource rVersion (1) {
|
resource rVersion (1) {
|
||||||
{
|
{
|
||||||
0, /* Major version number in BCD */
|
0, /* Major version number in BCD */
|
||||||
|
@ -25,6 +26,7 @@ resource rVersion (1) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Menu bars */
|
||||||
resource rMenuBar (MENU_BAR) {
|
resource rMenuBar (MENU_BAR) {
|
||||||
{
|
{
|
||||||
APPLE_MENU,
|
APPLE_MENU,
|
||||||
|
@ -34,6 +36,7 @@ resource rMenuBar (MENU_BAR) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Menus */
|
||||||
resource rMenu (APPLE_MENU) {
|
resource rMenu (APPLE_MENU) {
|
||||||
APPLE_MENU,
|
APPLE_MENU,
|
||||||
refIsResource * menuTitleRefShift
|
refIsResource * menuTitleRefShift
|
||||||
|
@ -44,7 +47,7 @@ resource rMenu (APPLE_MENU) {
|
||||||
APPLE_ABOUT
|
APPLE_ABOUT
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
resource rPString (APPLE_MENU, noCrossBank) {"@"};
|
||||||
|
|
||||||
resource rMenu (FILE_MENU) {
|
resource rMenu (FILE_MENU) {
|
||||||
FILE_MENU,
|
FILE_MENU,
|
||||||
|
@ -55,11 +58,15 @@ resource rMenu (FILE_MENU) {
|
||||||
{
|
{
|
||||||
FILE_NEW,
|
FILE_NEW,
|
||||||
FILE_OPEN,
|
FILE_OPEN,
|
||||||
|
FILE_SAVE,
|
||||||
|
FILE_SAVE_AS,
|
||||||
FILE_CLOSE,
|
FILE_CLOSE,
|
||||||
|
FILE_PAGE_SETUP,
|
||||||
|
FILE_PRINT,
|
||||||
FILE_QUIT
|
FILE_QUIT
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
resource rPString (FILE_MENU, noCrossBank) {" File "};
|
||||||
|
|
||||||
resource rMenu (EDIT_MENU) {
|
resource rMenu (EDIT_MENU) {
|
||||||
EDIT_MENU,
|
EDIT_MENU,
|
||||||
|
@ -75,8 +82,10 @@ resource rMenu (EDIT_MENU) {
|
||||||
EDIT_CLEAR
|
EDIT_CLEAR
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
resource rPString (EDIT_MENU, noCrossBank) {" Edit "};
|
||||||
|
|
||||||
|
|
||||||
|
/* Menu items */
|
||||||
resource rMenuItem (EDIT_UNDO) {
|
resource rMenuItem (EDIT_UNDO) {
|
||||||
EDIT_UNDO,
|
EDIT_UNDO,
|
||||||
"Z", "z",
|
"Z", "z",
|
||||||
|
@ -85,7 +94,7 @@ resource rMenuItem (EDIT_UNDO) {
|
||||||
+ fDivider,
|
+ fDivider,
|
||||||
EDIT_UNDO
|
EDIT_UNDO
|
||||||
};
|
};
|
||||||
|
resource rPString (EDIT_UNDO, noCrossBank) {"Undo"};
|
||||||
|
|
||||||
resource rMenuItem (EDIT_CUT) {
|
resource rMenuItem (EDIT_CUT) {
|
||||||
EDIT_CUT,
|
EDIT_CUT,
|
||||||
|
@ -94,7 +103,7 @@ resource rMenuItem (EDIT_CUT) {
|
||||||
refIsResource * itemTitleRefShift,
|
refIsResource * itemTitleRefShift,
|
||||||
EDIT_CUT
|
EDIT_CUT
|
||||||
};
|
};
|
||||||
|
resource rPString (EDIT_CUT, noCrossBank) {"Cut"};
|
||||||
|
|
||||||
resource rMenuItem (EDIT_COPY) {
|
resource rMenuItem (EDIT_COPY) {
|
||||||
EDIT_COPY,
|
EDIT_COPY,
|
||||||
|
@ -103,7 +112,7 @@ resource rMenuItem (EDIT_COPY) {
|
||||||
refIsResource * itemTitleRefShift,
|
refIsResource * itemTitleRefShift,
|
||||||
EDIT_COPY
|
EDIT_COPY
|
||||||
};
|
};
|
||||||
|
resource rPString (EDIT_COPY, noCrossBank) {"Copy"};
|
||||||
|
|
||||||
resource rMenuItem (EDIT_PASTE) {
|
resource rMenuItem (EDIT_PASTE) {
|
||||||
EDIT_PASTE,
|
EDIT_PASTE,
|
||||||
|
@ -112,7 +121,7 @@ resource rMenuItem (EDIT_PASTE) {
|
||||||
refIsResource * itemTitleRefShift,
|
refIsResource * itemTitleRefShift,
|
||||||
EDIT_PASTE
|
EDIT_PASTE
|
||||||
};
|
};
|
||||||
|
resource rPString (EDIT_PASTE, noCrossBank) {"Paste"};
|
||||||
|
|
||||||
resource rMenuItem (EDIT_CLEAR) {
|
resource rMenuItem (EDIT_CLEAR) {
|
||||||
EDIT_CLEAR,
|
EDIT_CLEAR,
|
||||||
|
@ -121,7 +130,7 @@ resource rMenuItem (EDIT_CLEAR) {
|
||||||
refIsResource * itemTitleRefShift,
|
refIsResource * itemTitleRefShift,
|
||||||
EDIT_CLEAR
|
EDIT_CLEAR
|
||||||
};
|
};
|
||||||
|
resource rPString (EDIT_CLEAR, noCrossBank) {"Clear"};
|
||||||
|
|
||||||
resource rMenuItem (FILE_NEW) {
|
resource rMenuItem (FILE_NEW) {
|
||||||
FILE_NEW,
|
FILE_NEW,
|
||||||
|
@ -130,7 +139,7 @@ resource rMenuItem (FILE_NEW) {
|
||||||
refIsResource * itemTitleRefShift,
|
refIsResource * itemTitleRefShift,
|
||||||
FILE_NEW
|
FILE_NEW
|
||||||
};
|
};
|
||||||
|
resource rPString (FILE_NEW, noCrossBank) {"New"};
|
||||||
|
|
||||||
resource rMenuItem (FILE_OPEN) {
|
resource rMenuItem (FILE_OPEN) {
|
||||||
FILE_OPEN,
|
FILE_OPEN,
|
||||||
|
@ -140,7 +149,25 @@ resource rMenuItem (FILE_OPEN) {
|
||||||
+ fDivider,
|
+ fDivider,
|
||||||
FILE_OPEN
|
FILE_OPEN
|
||||||
};
|
};
|
||||||
|
resource rPString (FILE_OPEN, noCrossBank) {"Open"};
|
||||||
|
|
||||||
|
resource rMenuItem (FILE_SAVE) {
|
||||||
|
FILE_SAVE,
|
||||||
|
"S", "s",
|
||||||
|
0,
|
||||||
|
refIsResource * itemTitleRefShift,
|
||||||
|
FILE_SAVE
|
||||||
|
};
|
||||||
|
resource rPString (FILE_SAVE, noCrossBank) {"Save"};
|
||||||
|
|
||||||
|
resource rMenuItem (FILE_SAVE_AS) {
|
||||||
|
FILE_SAVE_AS,
|
||||||
|
"", "",
|
||||||
|
0,
|
||||||
|
refIsResource * itemTitleRefShift,
|
||||||
|
FILE_SAVE_AS
|
||||||
|
};
|
||||||
|
resource rPString (FILE_SAVE_AS, noCrossBank) {"Save As..."};
|
||||||
|
|
||||||
resource rMenuItem (FILE_CLOSE) {
|
resource rMenuItem (FILE_CLOSE) {
|
||||||
FILE_CLOSE,
|
FILE_CLOSE,
|
||||||
|
@ -150,7 +177,26 @@ resource rMenuItem (FILE_CLOSE) {
|
||||||
+ fDivider,
|
+ fDivider,
|
||||||
FILE_CLOSE
|
FILE_CLOSE
|
||||||
};
|
};
|
||||||
|
resource rPString (FILE_CLOSE, noCrossBank) {"Close"};
|
||||||
|
|
||||||
|
resource rMenuItem (FILE_PAGE_SETUP) {
|
||||||
|
FILE_PAGE_SETUP,
|
||||||
|
"", "",
|
||||||
|
0,
|
||||||
|
refIsResource * itemTitleRefShift,
|
||||||
|
FILE_PAGE_SETUP
|
||||||
|
};
|
||||||
|
resource rPString (FILE_PAGE_SETUP, noCrossBank) {"Page Setup..."};
|
||||||
|
|
||||||
|
resource rMenuItem (FILE_PRINT) {
|
||||||
|
FILE_PRINT,
|
||||||
|
"P", "p",
|
||||||
|
0,
|
||||||
|
refIsResource * itemTitleRefShift
|
||||||
|
+ fDivider,
|
||||||
|
FILE_PRINT
|
||||||
|
};
|
||||||
|
resource rPString (FILE_PRINT, noCrossBank) {"Print..."};
|
||||||
|
|
||||||
resource rMenuItem (FILE_QUIT) {
|
resource rMenuItem (FILE_QUIT) {
|
||||||
FILE_QUIT,
|
FILE_QUIT,
|
||||||
|
@ -159,7 +205,7 @@ resource rMenuItem (FILE_QUIT) {
|
||||||
refIsResource * itemTitleRefShift,
|
refIsResource * itemTitleRefShift,
|
||||||
FILE_QUIT
|
FILE_QUIT
|
||||||
};
|
};
|
||||||
|
resource rPString (FILE_QUIT, noCrossBank) {"Quit"};
|
||||||
|
|
||||||
resource rMenuItem (APPLE_ABOUT) {
|
resource rMenuItem (APPLE_ABOUT) {
|
||||||
APPLE_ABOUT,
|
APPLE_ABOUT,
|
||||||
|
@ -169,84 +215,153 @@ resource rMenuItem (APPLE_ABOUT) {
|
||||||
+ fDivider,
|
+ fDivider,
|
||||||
APPLE_ABOUT
|
APPLE_ABOUT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
resource rPString (APPLE_MENU, noCrossBank) {"@"};
|
|
||||||
resource rPString (FILE_MENU, noCrossBank) {" File "};
|
|
||||||
resource rPString (EDIT_MENU, noCrossBank) {" Edit "};
|
|
||||||
|
|
||||||
resource rPString (EDIT_UNDO, noCrossBank) {"Undo"};
|
|
||||||
resource rPString (EDIT_CUT, noCrossBank) {"Cut"};
|
|
||||||
resource rPString (EDIT_COPY, noCrossBank) {"Copy"};
|
|
||||||
resource rPString (EDIT_PASTE, noCrossBank) {"Paste"};
|
|
||||||
resource rPString (EDIT_CLEAR, noCrossBank) {"Clear"};
|
|
||||||
|
|
||||||
resource rPString (FILE_NEW, noCrossBank) {"New"};
|
|
||||||
resource rPString (FILE_OPEN, noCrossBank) {"Open"};
|
|
||||||
resource rPString (FILE_CLOSE, noCrossBank) {"Close"};
|
|
||||||
resource rPString (FILE_QUIT, noCrossBank) {"Quit"};
|
|
||||||
|
|
||||||
resource rPString (APPLE_ABOUT, noCrossBank) {"About ___PROJECTNAME___..."};
|
resource rPString (APPLE_ABOUT, noCrossBank) {"About ___PROJECTNAME___..."};
|
||||||
|
|
||||||
|
|
||||||
|
/* Error strings */
|
||||||
|
resource rCString (TOOL_ERROR_STRING) {"\n\nTool error code = $%04x"};
|
||||||
|
resource rCString (NEW_WINDOW_ERROR_STRING) {"Error occurred when creating a new window"};
|
||||||
|
resource rCString (MALLOC_ERROR_STRING) {"Out of memory"};
|
||||||
|
resource rCString (OPEN_FILE_ERROR_STRING) {"Error opening file"};
|
||||||
|
resource rCString (SAVE_FILE_ERROR_STRING) {"Error saving file"};
|
||||||
|
resource rCString (PRINT_ERROR_STRING) {"Error printing document"};
|
||||||
|
|
||||||
|
|
||||||
|
/* Other strings */
|
||||||
|
resource rCString (UNTITLED_STRING) {" Untitled %d "};
|
||||||
|
resource rPString (OPEN_FILE_STRING, noCrossBank) {"Choose a file to open..."};
|
||||||
|
resource rPString (SAVE_FILE_STRING, noCrossBank) {"Save file as..."};
|
||||||
|
resource rPString (HELLO_WORLD_STRING, noCrossBank) {"Hello, world!"};
|
||||||
|
|
||||||
|
|
||||||
|
/* Alert strings */
|
||||||
resource rAlertString (ABOUT_ALERT_STRING) {
|
resource rAlertString (ABOUT_ALERT_STRING) {
|
||||||
"0" /* Custom size */
|
"0" /* Custom size */
|
||||||
|
#if RES_MODE == 320
|
||||||
|
"\$38\$00" /* Upper Y coordinate at 56 */
|
||||||
|
"\$10\$00" /* Left X coordinate at 16 */
|
||||||
|
"\$90\$00" /* Lower Y coorinate at 144 */
|
||||||
|
"\$30\$01" /* Right X coordinate at 304 */
|
||||||
|
#else
|
||||||
"\$38\$00" /* Upper Y coordinate at 56 */
|
"\$38\$00" /* Upper Y coordinate at 56 */
|
||||||
"\$90\$00" /* Left X coordinate at 144 */
|
"\$90\$00" /* Left X coordinate at 144 */
|
||||||
"\$90\$00" /* Lower Y coorinate at 144 */
|
"\$90\$00" /* Lower Y coorinate at 144 */
|
||||||
"\$F0\$01" /* Right X coordinate at 496 */
|
"\$F0\$01" /* Right X coordinate at 496 */
|
||||||
|
#endif
|
||||||
"3/"
|
"3/"
|
||||||
"___PROJECTNAME___\n"
|
"___PROJECTNAME___\n"
|
||||||
" by ___FULLUSERNAME___\n"
|
" by ___FULLUSERNAME___\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Copyright \$A9 ___YEAR___ ___FULLUSERNAME___ Rand\n"
|
"Copyright \$A9 ___YEAR___ ___FULLUSERNAME___\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Contains libraries from ORCAC,\n"
|
"Contains libraries from ORCAC,\n"
|
||||||
"Copyright \$A9 1991, Byte Works Inc."
|
"Copyright \$A9 1991, Byte Works Inc."
|
||||||
"/^#0\$00";
|
"/^#0\$00";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
resource rAlertString (ERROR_ALERT_STRING) {
|
||||||
|
"42/"
|
||||||
|
"*0\n"
|
||||||
|
"*1"
|
||||||
|
"/^#0\$00";
|
||||||
|
};
|
||||||
|
|
||||||
|
resource rAlertString (SAVE_BEFORE_CLOSING) {
|
||||||
|
"34/"
|
||||||
|
"Save changes to *0 before closing?"
|
||||||
|
"/^#2/#3/#1\$00";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Windows */
|
||||||
resource rWindParam1 (WINDOW_RESID) {
|
resource rWindParam1 (WINDOW_RESID) {
|
||||||
$DDA5, /* wFrameBits */
|
/* wFrameBits */
|
||||||
|
fTitle + fClose + fZoom + fMove + fVis + fAllocated + fHilited,
|
||||||
nil, /* wTitle */
|
nil, /* wTitle */
|
||||||
0, /* wRefCon */
|
0, /* wRefCon */
|
||||||
{0, 0, 0, 0}, /* ZoomRect */
|
{0, 0, 0, 0}, /* ZoomRect */
|
||||||
$07FF0001, /* wColor ID */
|
$07FF0001, /* wColor ID */
|
||||||
{0, 0}, /* Origin */
|
{0, 0}, /* Origin */
|
||||||
{1, 1}, /* data size */
|
{0, 0}, /* data size */
|
||||||
{0, 0}, /* max height-width */
|
{0, 0}, /* max height-width */
|
||||||
{8, 8}, /* scroll ver hors */
|
{8, 8}, /* scroll ver hors */
|
||||||
{0, 0}, /* page ver horiz */
|
{0, 0}, /* page ver horiz */
|
||||||
0, /* winfoRefCon */
|
0, /* winfoRefCon */
|
||||||
10, /* wInfoHeight */
|
10, /* wInfoHeight */
|
||||||
|
#if RES_MODE == 320
|
||||||
|
{30, 10, 183, 300}, /* wposition */
|
||||||
|
#else
|
||||||
{30, 10, 183, 602}, /* wposition */
|
{30, 10, 183, 602}, /* wposition */
|
||||||
|
#endif
|
||||||
infront, /* wPlane */
|
infront, /* wPlane */
|
||||||
nil, /* wStorage */
|
CONTROL_TEXT_EDIT, /* wStorage */
|
||||||
$0800 /* wInVerb */
|
$0802 /* wInVerb */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
resource rToolStartup (TOOL_STARTUP) {
|
/* Controls */
|
||||||
mode640,
|
resource rControlTemplate (CONTROL_TEXT_EDIT) {
|
||||||
{
|
CONTROL_TEXT_EDIT, /* Application defined ID */
|
||||||
3,$0100, /* Misc Tool */
|
#if RES_MODE == 320
|
||||||
4,$0100, /* Quickdraw */
|
{0,0,165,300}, /* Bounding rectangle */
|
||||||
5,$0100, /* Desk Manager */
|
#else
|
||||||
6,$0100, /* Event Manager */
|
{0,0,165,620}, /* Bounding rectangle */
|
||||||
11,$0100, /* Int Math */
|
#endif
|
||||||
14,$0300, /* Window Manager */
|
editTextControl {
|
||||||
15,$0300, /* Menu Manager */
|
{
|
||||||
16,$0300, /* Control Manager */
|
$0000, /* Flags */
|
||||||
18,$0200, /* QD Aux */
|
/* More flags */
|
||||||
19,$0100, /* Print Manager */
|
FctlCanBeTarget + FctlWantsEvents + FctlProcNotPtr + FctlTellAboutSize + FctlIsMultiPart,
|
||||||
20,$0100, /* LineEdit Tool */
|
0, /* Refcon */
|
||||||
21,$0100, /* Dialog Manager */
|
/* Text flags */
|
||||||
22,$0100, /* Scrap Manager */
|
fSingleFormat + fSmartCutPaste + fGrowRuler + fDrawInactiveSelection,
|
||||||
23,$0100, /* Standard File */
|
{-1,-1,-1,-1}, /* Indent rectangle */
|
||||||
27,$0100, /* Font Manager */
|
$FFFFFFFF, /* Vertical bar */
|
||||||
28,$0100, /* List Manager */
|
0, /* Vertical amount */
|
||||||
30,$0100, /* Resource Manager */
|
nil, /* Horizontal bar */
|
||||||
34,$0100 /* TextEdit */
|
0, /* Horizontal amount */
|
||||||
|
nil, /* Style ref */
|
||||||
|
/* Text descriptor */
|
||||||
|
refIsResource * 8 + dataIsPString,
|
||||||
|
HELLO_WORLD_STRING, /* Text ref */
|
||||||
|
0, /* Text length */
|
||||||
|
nil, /* Maximum chars */
|
||||||
|
nil, /* Maximum lines */
|
||||||
|
nil, /* Maximum chars per line */
|
||||||
|
nil, /* Max height */
|
||||||
|
nil, /* Color ref */
|
||||||
|
4, /* Drawing mode */
|
||||||
|
nil, /* Filter procedure */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Tools */
|
||||||
|
resource rToolStartup (TOOL_STARTUP) {
|
||||||
|
#if RES_MODE == 320
|
||||||
|
mode320,
|
||||||
|
#else
|
||||||
|
mode640,
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
3, $0100, /* Misc Tool */
|
||||||
|
4, $0100, /* Quickdraw */
|
||||||
|
5, $0100, /* Desk Manager */
|
||||||
|
6, $0100, /* Event Manager */
|
||||||
|
11, $0100, /* Int Math */
|
||||||
|
14, $0300, /* Window Manager */
|
||||||
|
15, $0300, /* Menu Manager */
|
||||||
|
16, $0300, /* Control Manager */
|
||||||
|
18, $0200, /* QD Aux */
|
||||||
|
19, $0100, /* Print Manager */
|
||||||
|
20, $0100, /* LineEdit Tool */
|
||||||
|
21, $0100, /* Dialog Manager */
|
||||||
|
22, $0100, /* Scrap Manager */
|
||||||
|
23, $0100, /* Standard File */
|
||||||
|
27, $0100, /* Font Manager */
|
||||||
|
28, $0100, /* List Manager */
|
||||||
|
30, $0100, /* Resource Manager */
|
||||||
|
34, $0100 /* TextEdit */
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -128,8 +128,26 @@
|
||||||
<true/>
|
<true/>
|
||||||
<key>Description</key>
|
<key>Description</key>
|
||||||
<string>This template creates an Apple IIgs ORCA/M code project to build desktop application. The project starts with a single assembly file which you can modify. You can also add more assembly or C files as you may like.</string>
|
<string>This template creates an Apple IIgs ORCA/M code project to build desktop application. The project starts with a single assembly file which you can modify. You can also add more assembly or C files as you may like.</string>
|
||||||
<key>Options</key>
|
<key>Options</key>
|
||||||
<array/>
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>Identifier</key>
|
||||||
|
<string>RESOLUTIONMODE</string>
|
||||||
|
<key>Name</key>
|
||||||
|
<string>Desktop Resolution</string>
|
||||||
|
<key>Description</key>
|
||||||
|
<string>Specify 640 or 320 pixel desktop enviroment.</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>popup</string>
|
||||||
|
<key>Default</key>
|
||||||
|
<string>640</string>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>640</string>
|
||||||
|
<string>320</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
<key>Targets</key>
|
<key>Targets</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
|
|
|
@ -35,6 +35,10 @@
|
||||||
|
|
||||||
#define toolStartup 1
|
#define toolStartup 1
|
||||||
|
|
||||||
|
/* By default, thie template builds for 640x200 mode. To build for
|
||||||
|
* 320x200 change the following value to 320 */
|
||||||
|
#define RES_MODE ___VARIABLE_RESOLUTIONMODE___
|
||||||
|
|
||||||
|
|
||||||
resource rVersion (1) {
|
resource rVersion (1) {
|
||||||
{
|
{
|
||||||
|
@ -216,15 +220,22 @@ resource rPString (appleAbout, noCrossBank) {"About ___PROJECTNAME___..."};
|
||||||
|
|
||||||
resource rAlertString (aboutAlertString) {
|
resource rAlertString (aboutAlertString) {
|
||||||
"0" /* Custom size */
|
"0" /* Custom size */
|
||||||
|
#if RES_MODE == 320
|
||||||
|
"\$38\$00" /* Upper Y coordinate at 56 */
|
||||||
|
"\$10\$00" /* Left X coordinate at 16 */
|
||||||
|
"\$90\$00" /* Lower Y coorinate at 144 */
|
||||||
|
"\$30\$01" /* Right X coordinate at 304 */
|
||||||
|
#else
|
||||||
"\$38\$00" /* Upper Y coordinate at 56 */
|
"\$38\$00" /* Upper Y coordinate at 56 */
|
||||||
"\$90\$00" /* Left X coordinate at 144 */
|
"\$90\$00" /* Left X coordinate at 144 */
|
||||||
"\$90\$00" /* Lower Y coorinate at 144 */
|
"\$90\$00" /* Lower Y coorinate at 144 */
|
||||||
"\$F0\$01" /* Right X coordinate at 496 */
|
"\$F0\$01" /* Right X coordinate at 496 */
|
||||||
|
#endif
|
||||||
"3/"
|
"3/"
|
||||||
"___PROJECTNAME___\n"
|
"___PROJECTNAME___\n"
|
||||||
" by ___FULLUSERNAME___\n"
|
" by ___FULLUSERNAME___\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Copyright \$A9 ___YEAR___ ___FULLUSERNAME___ Rand\n"
|
"Copyright \$A9 ___YEAR___ ___FULLUSERNAME___\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Contains libraries from ORCAC,\n"
|
"Contains libraries from ORCAC,\n"
|
||||||
"Copyright \$A9 1991, Byte Works Inc."
|
"Copyright \$A9 1991, Byte Works Inc."
|
||||||
|
@ -245,7 +256,11 @@ resource rWindParam1 (windowRes) {
|
||||||
{0, 0}, /* page ver horiz */
|
{0, 0}, /* page ver horiz */
|
||||||
0, /* winfoRefCon */
|
0, /* winfoRefCon */
|
||||||
10, /* wInfoHeight */
|
10, /* wInfoHeight */
|
||||||
|
#if RES_MODE == 320
|
||||||
|
{30, 10, 183, 300}, /* wposition */
|
||||||
|
#else
|
||||||
{30, 10, 183, 602}, /* wposition */
|
{30, 10, 183, 602}, /* wposition */
|
||||||
|
#endif
|
||||||
infront, /* wPlane */
|
infront, /* wPlane */
|
||||||
nil, /* wStorage */
|
nil, /* wStorage */
|
||||||
$0800 /* wInVerb */
|
$0800 /* wInVerb */
|
||||||
|
@ -253,7 +268,11 @@ resource rWindParam1 (windowRes) {
|
||||||
|
|
||||||
|
|
||||||
resource rToolStartup (toolStartup) {
|
resource rToolStartup (toolStartup) {
|
||||||
|
#if RES_MODE == 320
|
||||||
|
mode320,
|
||||||
|
#else
|
||||||
mode640,
|
mode640,
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
3,$0100, /* Misc Tool */
|
3,$0100, /* Misc Tool */
|
||||||
4,$0100, /* Quickdraw */
|
4,$0100, /* Quickdraw */
|
||||||
|
|
Loading…
Reference in New Issue