home *** CD-ROM | disk | FTP | other *** search
- /*
- * icon.c V3.0
- *
- * TM Icon object class
- *
- * Copyright (C) 1990-97 Stefan Becker
- *
- * This source code is for educational purposes only. You may study it
- * and copy ideas or algorithms from it for your own projects. It is
- * not allowed to use any of the source codes (in full or in parts)
- * in other programs. Especially it is not allowed to create variants
- * of ToolManager or ToolManager-like programs from this source code.
- *
- */
-
- #include "toolmanager.h"
-
- /* Local data */
- #define PROPCHUNKS 2
- static const ULONG PropChunkTable[2 * PROPCHUNKS] = {
- ID_TMIC, ID_DATA,
- ID_TMIC, ID_NAME,
- };
- static const char *TextTitle;
- static const char *HelpExecObject;
- static const char *HelpImageObject;
- static const char *HelpSoundObject;
- static const char *HelpPosition;
- static const char *TextShowName;
- static const char *HelpShowName;
-
- /* Icon class instance data */
- struct IconClassData {
- ULONG icd_Flags;
- ULONG icd_LeftEdge;
- ULONG icd_TopEdge;
- struct AttachData *icd_ExecObject;
- struct AttachData *icd_ImageObject;
- struct AttachData *icd_SoundObject;
- Object *icd_Active;
- Object *icd_ExecDrop;
- Object *icd_ImageDrop;
- Object *icd_SoundDrop;
- Object *icd_Position;
- Object *icd_ShowName;
- };
- #define TYPED_INST_DATA(cl, o) ((struct IconClassData *) INST_DATA((cl), (o)))
-
- /* Icon class method: OM_NEW */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassNew
- static ULONG IconClassNew(Class *cl, Object *obj, struct opSet *ops)
- {
- ICON_LOG((LOG1(Tags, "0x%08lx", ops->ops_AttrList),
- PrintTagList(ops->ops_AttrList)))
-
- /* Create object */
- if (obj = (Object *) DoSuperNew(cl, obj,
- MUIA_Window_Title, TextTitle,
- MUIA_HelpNode, "IconWindow",
- TMA_Type, TMOBJTYPE_ICON,
- TAG_MORE, ops->ops_AttrList)) {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
-
- /* Initialize instance data */
- icd->icd_Flags = DATA_ICONF_SHOWNAME;
- icd->icd_LeftEdge = 0;
- icd->icd_TopEdge = 0;
- icd->icd_ExecObject = NULL;
- icd->icd_ImageObject = NULL;
- icd->icd_SoundObject = NULL;
- icd->icd_Active = NULL;
- }
-
- ICON_LOG(LOG1(Result, "0x%08lx", obj))
-
- /* Return pointer to created object */
- return((ULONG) obj);
- }
-
- /* Icon class method: OM_DISPOSE */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassDispose
- static ULONG IconClassDispose(Class *cl, Object *obj, Msg msg)
- {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
-
- ICON_LOG(LOG1(Disposing, "0x%08lx", obj))
-
- /* Detach objects */
- if (icd->icd_ExecObject) DoMethod(icd->icd_ExecObject->ad_Object,
- TMM_Detach, icd->icd_ExecObject);
- if (icd->icd_ImageObject) DoMethod(icd->icd_ImageObject->ad_Object,
- TMM_Detach, icd->icd_ImageObject);
- if (icd->icd_SoundObject) DoMethod(icd->icd_SoundObject->ad_Object,
- TMM_Detach, icd->icd_SoundObject);
-
- /* Call SuperClass */
- return(DoSuperMethodA(cl, obj, msg));
- }
-
- /* Icon class method: TMM_Finish */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassFinish
- static ULONG IconClassFinish(Class *cl, Object *obj, struct TMP_Finish *tmpf)
- {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
-
- ICON_LOG(LOG1(Type, "%ld", tmpf->tmpf_Type))
-
- /* MUI objects allocated? */
- if (icd->icd_Active) {
-
- /* Use or Cancel? */
- if (tmpf->tmpf_Type == TMV_Finish_Use) {
-
- /* Get new attach data */
- icd->icd_ExecObject = GetAttachData(icd->icd_ExecDrop, obj,
- icd->icd_ExecObject);
- icd->icd_ImageObject = GetAttachData(icd->icd_ImageDrop, obj,
- icd->icd_ImageObject);
- icd->icd_SoundObject = GetAttachData(icd->icd_SoundDrop, obj,
- icd->icd_SoundObject);
-
- /* Get new position values */
- GetAttr(MUIA_Popposition_XPos, icd->icd_Position, &icd->icd_LeftEdge);
- GetAttr(MUIA_Popposition_YPos, icd->icd_Position, &icd->icd_TopEdge);
-
- /* Get new flag status */
- icd->icd_Flags = GetCheckmarkState(icd->icd_ShowName, DATA_ICONF_SHOWNAME);
- }
-
- /* Reset pointer to file name area */
- icd->icd_Active = NULL;
- }
-
- /* Call SuperClass */
- return(DoSuperMethodA(cl, obj, (Msg) tmpf));
- }
-
- /* Icon class method: TMM_Notify */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassNotify
- static ULONG IconClassNotify(Class *cl, Object *obj, struct TMP_Notify *tmpn)
- {
- ICON_LOG(LOG1(Type, "0x%08lx", tmpn->tmpn_Data->ad_Object))
-
- /* Object deleted? */
- if (tmpn->tmpn_Data->ad_Object == NULL) {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
-
- /* Exec, Image or Sound object? */
- if (icd->icd_ExecObject == tmpn->tmpn_Data)
- icd->icd_ExecObject = NULL;
- else if (icd->icd_ImageObject == tmpn->tmpn_Data)
- icd->icd_ImageObject = NULL;
- else
- icd->icd_SoundObject = NULL;
- }
-
- /* Return 1 to indicate that the method is implemented */
- return(1);
- }
-
- /* Icon class method: TMM_Edit */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassEdit
- static ULONG IconClassEdit(Class *cl, Object *obj, struct TMP_Edit *tmpe)
- {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
-
- /* MUI objects allocated? */
- if (icd->icd_Active) {
-
- ICON_LOG(LOG0(Object already active))
-
- /* Yes, forward method to SuperClass */
- DoSuperMethodA(cl, obj, (Msg) tmpe);
-
- /* No, create object edit area */
- } else if (icd->icd_Active =
- VGroup,
- Child, ColGroup(2),
- Child, Label1(TextGlobalExecObject),
- Child, icd->icd_ExecDrop = NewObject(DropAreaClass->mcc_Class, NULL,
- TMA_Type, TMOBJTYPE_EXEC,
- TMA_Attach, icd->icd_ExecObject,
- MUIA_ShortHelp, HelpExecObject,
- TAG_DONE),
- Child, Label1(TextGlobalImageObject),
- Child, icd->icd_ImageDrop = NewObject(DropAreaClass->mcc_Class, NULL,
- TMA_Type, TMOBJTYPE_IMAGE,
- TMA_Attach, icd->icd_ImageObject,
- MUIA_ShortHelp, HelpImageObject,
- TAG_DONE),
- Child, Label1(TextGlobalSoundObject),
- Child, icd->icd_SoundDrop = NewObject(DropAreaClass->mcc_Class, NULL,
- TMA_Type, TMOBJTYPE_SOUND,
- TMA_Attach, icd->icd_SoundObject,
- MUIA_ShortHelp, HelpSoundObject,
- TAG_DONE),
- Child, Label2(TextGlobalPosition),
- Child, icd->icd_Position = TMPopPosition(icd->icd_LeftEdge,
- icd->icd_TopEdge,
- HelpPosition),
- End,
- End,
- Child, HGroup,
- Child, HSpace(0),
- Child, Label1(TextShowName),
- Child, icd->icd_ShowName =
- MakeCheckmark(icd->icd_Flags & DATA_ICONF_SHOWNAME, HelpShowName),
- Child, HSpace(0),
- End,
- End) {
-
- ICON_LOG(LOG1(Icon Area, "0x%08lx", icd->icd_Active))
-
- /* Forward method to SuperClass */
- if (DoSuperMethod(cl, obj, TMM_Edit, icd->icd_Active)) {
- struct Screen *screen;
-
- /* SuperClass succeeded, get screen */
- GetAttr(MUIA_Window_Screen, obj, (ULONG *) &screen);
-
- /* Set new Y offset for position gadget */
- SetAttrs(icd->icd_Position,
- MUIA_Popposition_YOffset, - screen->BarHeight - 1,
- TAG_DONE);
-
- } else {
-
- /* SuperClass failed, delete file area again */
- MUI_DisposeObject(icd->icd_Active);
- icd->icd_Active = NULL;
- }
- }
-
- ICON_LOG(LOG1(Result, "0x%08lx", icd->icd_Active))
-
- /* Return pointer to file area object to indicate success */
- return((ULONG) icd->icd_Active);
- }
-
- /* Icon class method: TMM_ParseIFF */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassParseIFF
- static ULONG IconClassParseIFF(Class *cl, Object *obj,
- struct TMP_ParseIFF *tmppi)
- {
- BOOL rc = FALSE;
-
- ICON_LOG(LOG1(Handle, "0x%08lx", tmppi->tmppi_IFFHandle))
-
- /* Initialize IFF parser */
- if ((PropChunks(tmppi->tmppi_IFFHandle, PropChunkTable, PROPCHUNKS) == 0) &&
- (StopOnExit(tmppi->tmppi_IFFHandle, ID_TMIC, ID_FORM) == 0) &&
- (ParseIFF(tmppi->tmppi_IFFHandle, IFFPARSE_SCAN) == IFFERR_EOC)) {
- struct StoredProperty *spname;
-
- ICON_LOG(LOG0(FORM TMIC chunk parsed OK))
-
- /* Check for mandatory NAME property */
- if (spname = FindProp(tmppi->tmppi_IFFHandle, ID_TMIC, ID_NAME)) {
- struct StoredProperty *spdata;
-
- ICON_LOG(LOG2(Name, "%s (0x%08lx)", spname->sp_Data, spname->sp_Data))
-
- /* Check for mandatory DATA property */
- if (spdata = FindProp(tmppi->tmppi_IFFHandle, ID_TMIC, ID_DATA)) {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
- struct IconDATAChunk *idc = spdata->sp_Data;
-
- ICON_LOG(LOG4(Data1, "ID 0x%08lx Exec 0x%08lx Image 0x%08lx Sound 0x%08lx",
- idc->idc_Standard.sdc_ID, idc->idc_ExecObject,
- idc->idc_ImageObject, idc->idc_SoundObject))
- ICON_LOG(LOG3(Data2, "Flags 0x%08lx Left %ld Top %ld",
- idc->idc_Standard.sdc_Flags, idc->idc_LeftEdge,
- idc->idc_TopEdge))
-
- /* Set new name and ID */
- SetAttrs(obj, TMA_Name, spname->sp_Data,
- TMA_ID, idc->idc_Standard.sdc_ID,
- TAG_DONE);
-
- /* Copy values from data chunk */
- icd->icd_Flags = idc->idc_Standard.sdc_Flags & DATA_ICONF_MASK;
- icd->icd_LeftEdge = idc->idc_LeftEdge;
- icd->icd_TopEdge = idc->idc_TopEdge;
-
- icd->icd_ExecObject = AttachObject(tmppi->tmppi_Lists[TMOBJTYPE_EXEC],
- obj, idc->idc_ExecObject);
- icd->icd_ImageObject = AttachObject(tmppi->tmppi_Lists[TMOBJTYPE_IMAGE],
- obj, idc->idc_ImageObject);
- icd->icd_SoundObject = AttachObject(tmppi->tmppi_Lists[TMOBJTYPE_SOUND],
- obj, idc->idc_SoundObject);
-
- /* All OK */
- rc = TRUE;
- }
- }
- }
-
- ICON_LOG(LOG1(Result, "%ld", rc))
-
- return(rc);
- }
-
- /* Icon class method: TMM_WriteIFF */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassWriteIFF
- static ULONG IconClassWriteIFF(Class *cl, Object *obj,
- struct TMP_WriteIFF *tmpwi)
- {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
- struct IconDATAChunk idc;
- BOOL rc;
-
- ICON_LOG(LOG1(IFFHandle, "0x%08lx", tmpwi->tmpwi_IFFHandle))
-
- /* Initialize DATA chunk (use object addresses as IDs) */
- idc.idc_Standard.sdc_ID = (ULONG) obj;
- idc.idc_Standard.sdc_Flags = icd->icd_Flags;
- idc.idc_LeftEdge = icd->icd_LeftEdge;
- idc.idc_TopEdge = icd->icd_TopEdge;
- idc.idc_ExecObject = (ULONG) (icd->icd_ExecObject ?
- icd->icd_ExecObject->ad_Object :
- NULL);
- idc.idc_ImageObject = (ULONG) (icd->icd_ImageObject ?
- icd->icd_ImageObject->ad_Object :
- NULL);
- idc.idc_SoundObject = (ULONG) (icd->icd_SoundObject ?
- icd->icd_SoundObject->ad_Object :
- NULL);
-
- /* a) Forward message to SuperClass first */
- /* b) Push DATA chunk */
- rc = DoSuperMethodA(cl, obj, (Msg) tmpwi) &&
- WriteProperty(tmpwi->tmpwi_IFFHandle, ID_DATA, &idc,
- sizeof(struct IconDATAChunk));
-
- ICON_LOG(LOG1(Result, "%ld", rc))
-
- return(rc);
- }
-
- /* Icon class method: TMM_WBArg */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassWBArg
- static ULONG IconClassWBArg(Class *cl, Object *obj, struct TMP_WBArg *tmpwa)
- {
- ULONG rc;
-
- ICON_LOG(LOG1(WBArg, "0x%08lx", tmpwa->tmpwa_Argument))
-
- /* First forward method to SuperClass */
- if (rc = DoSuperMethodA(cl, obj, (Msg) tmpwa)) {
- Object *exec;
-
- ICON_LOG(LOG0(Creating objects))
-
- /* Create exec object from WBArg */
- if (exec = (Object *) DoMethodA(tmpwa->tmpwa_Lists[TMOBJTYPE_EXEC],
- (Msg) tmpwa)) {
- Object *image;
-
- ICON_LOG(LOG1(Exec, "0x%08lx", exec))
-
- /* Create image object from WBArg */
- if (image = (Object *) DoMethodA(tmpwa->tmpwa_Lists[TMOBJTYPE_IMAGE],
- (Msg) tmpwa)) {
- struct IconClassData *icd = TYPED_INST_DATA(cl, obj);
-
- ICON_LOG(LOG1(Image, "0x%08lx", image))
-
- /* Attach new objects */
- SetAttrs(icd->icd_ExecDrop, TMA_Object, exec, TAG_DONE);
- SetAttrs(icd->icd_ImageDrop, TMA_Object, image, TAG_DONE);
- }
- }
- }
-
- ICON_LOG(LOG1(Result, "0x%08lx", rc))
-
- return(rc);
- }
-
- /* Icon class method dispatcher */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION IconClassDispatcher
- __geta4 static ULONG IconClassDispatcher(__a0 Class *cl, __a2 Object *obj,
- __a1 Msg msg)
- {
- ULONG rc;
-
- ICON_LOG(LOG3(Arguments, "Class 0x%08lx Object 0x%08lx Msg 0x%08lx",
- cl, obj, msg))
-
- switch(msg->MethodID) {
- /* BOOPSI methods */
- case OM_NEW:
- rc = IconClassNew(cl, obj, (struct opSet *) msg);
- break;
-
- case OM_DISPOSE:
- rc = IconClassDispose(cl, obj, msg);
- break;
-
- /* TM methods */
- case TMM_Finish:
- rc = IconClassFinish(cl, obj, (struct TMP_Finish *) msg);
- break;
-
- case TMM_Notify:
- rc = IconClassNotify(cl, obj, (struct TMP_Notify *) msg);
- break;
-
- case TMM_Edit:
- rc = IconClassEdit(cl, obj, (struct TMP_Edit *) msg);
- break;
-
- case TMM_ParseIFF:
- rc = IconClassParseIFF(cl, obj, (struct TMP_ParseIFF *) msg);
- break;
-
- case TMM_WriteIFF:
- rc = IconClassWriteIFF(cl, obj, (struct TMP_WriteIFF *) msg);
- break;
-
- case TMM_WBArg:
- rc = IconClassWBArg(cl, obj, (struct TMP_WBArg *) msg);
- break;
-
- /* Unknown method -> delegate to SuperClass */
- default:
- rc = DoSuperMethodA(cl, obj, msg);
- break;
- }
-
- return(rc);
- }
-
- /* Create Icon class */
- #undef DEBUGFUNCTION
- #define DEBUGFUNCTION CreateIconClass
- struct MUI_CustomClass *CreateIconClass(void)
- {
- struct MUI_CustomClass *rc;
-
- /* Create class */
- if (rc = MUI_CreateCustomClass(NULL, NULL, BaseClass,
- sizeof(struct IconClassData),
- IconClassDispatcher)) {
-
- /* Localize strings */
- TextTitle = TranslateString(LOCALE_TEXT_ICON_TITLE_STR,
- LOCALE_TEXT_ICON_TITLE);
- HelpExecObject = TranslateString(LOCALE_HELP_ICON_EXEC_OBJECT_STR,
- LOCALE_HELP_ICON_EXEC_OBJECT);
- HelpImageObject = TranslateString(LOCALE_HELP_ICON_IMAGE_OBJECT_STR,
- LOCALE_HELP_ICON_IMAGE_OBJECT);
- HelpSoundObject = TranslateString(LOCALE_HELP_ICON_SOUND_OBJECT_STR,
- LOCALE_HELP_ICON_SOUND_OBJECT);
- HelpPosition = TranslateString(LOCALE_HELP_ICON_POSITION_STR,
- LOCALE_HELP_ICON_POSITION);
- TextShowName = TranslateString(LOCALE_TEXT_ICON_SHOW_NAME_STR,
- LOCALE_TEXT_ICON_SHOW_NAME);
- HelpShowName = TranslateString(LOCALE_HELP_ICON_SHOW_NAME_STR,
- LOCALE_HELP_ICON_SHOW_NAME);
- }
-
- ICON_LOG(LOG1(Result, "0x%08lx", rc))
-
- return(rc);
- }
-