amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Test [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

21.06.2005, 17:40 Uhr

Kaesebroetchen
Posts: 643
Nutzer

#include <intuition/intuition.h>
#include <intuition/classusr.h>
#include <intuition/classes.h>
#include <intuition/gadgetclass.h>
#include <intuition/cghooks.h>
#include <workbench/icon.h>
#include <workbench/workbench.h>
#include <gadgets/layout.h>
#include <libraries/gadtools.h>
#include <clib/intuition_protos.h>
#include <clib/alib_protos.h>
#include <clib/icon_protos.h>
#include <clib/layers_protos.h>
#include <clib/utility_protos.h>
#include <clib/dos_protos.h>

#define REG(reg,arg) register __##reg arg
#define G(x) ((struct Gadget *)x)

//Testkommentar ********************************************************************

extern struct Library
*IconBase,
*DOSBase,
*IntuitionBase,
*UtilityBase,
*LayersBase,
*GfxBase;
struct InstanceData{
ULONG secs; /* nur zur Prüfung ... */
ULONG micro; /* ... auf Doppelklick */
struct Hook *backfill; /* siehe butclass_RENDER */
Object *parent; /* siehe butclass_SET */
};

ULONG butclass_DISPATCH( REG( a0, Class *cl ), REG( a2, Object *o ), REG( a1, Msg msg ) );
ULONG butclass_DOMAIN( Class *cl, Object *o, struct gpDomain *gpd );
ULONG butclass_HANDLEINPUT( Class *cl, Object *o, struct gpInput *gpi );
ULONG butclass_RENDER( Class *cl, Object *o, struct gpRender *gpr );
ULONG butclass_SET( Class *cl, Object *o, struct opSet *ops );
IClass *MakeIconClass(){
IClass *cl;

if( cl = MakeClass( NULL,
"gadgetclass", /* die Basisklasse */
NULL,
sizeof( struct InstanceData ), /* Größe unserer Zusatzdaten */
0L ) )
cl->cl_Dispatcher.h_Entry = (HOOKFUNC) butclass_DISPATCH;
/* Einzige Initialisierung: Einsetzen unseres Dispatchers */
return cl;
}

BOOL RemoveIconClass( IClass *cl ){
if( cl ) return FreeClass(cl);
else return FALSE;
}
ULONG butclass_DISPATCH( REG( a0, Class *cl ), REG( a2, Object *o ), REG( a1, Msg msg ) ){
/* allgemeine Ereignisbehandlungroutine */
ULONG ret = 0L;

switch( msg->MethodID ){
case GM_HANDLEINPUT:
case GM_GOACTIVE: ret = butclass_HANDLEINPUT( cl, o, (struct gpInput *) msg ); break;

case OM_SET:
case OM_UPDATE: ret = butclass_SET( cl, o, (struct opSet *) msg ); break;

case GM_RENDER: ret = butclass_RENDER( cl, o, (struct gpRender *) msg ); break;

case GM_DOMAIN: ret = butclass_DOMAIN( cl, o, (struct gpDomain *) msg ); break;

case OM_NEW:{
if( ret = DoSuperMethodA( cl, o, msg ) ){
/* zusätzlich zum Erzeugen des Objekts müssen Eigenschaften gesetzt werden */
butclass_SET( cl, (Object *) ret, (struct opSet *) msg );
}
break;
}
default: ret = DoSuperMethodA( cl, o, msg );
/* in JEDEM Fall alle anderen Methoden an die Mutterklasse übergeben! */
}
return ret;
}

/*********************************************************** *****************/

void butclass_redraw( Object *o, struct GadgetInfo *gi ){
/* siehe butclass_HANDLEINPUT */
struct RastPort *rp;

if( rp = ObtainGIRPort( gi ) ){
DoMethod( o, GM_RENDER, (ULONG) gi, (ULONG) rp, GREDRAW_REDRAW );
ReleaseGIRPort( rp );
}
}

/*********************************************************** *****************/

ULONG butclass_HANDLEINPUT( Class *cl, Object *o, struct gpInput *gpi ){
/* Reaktion auf Eingaben (Mausklicks) des Benutzers */
InputEvent *ie = gpi->gpi_IEvent;
ULONG retval = GMR_MEACTIVE;

if( ie ){
switch( ie->ie_Class ){
case IECLASS_RAWMOUSE:{
switch( ie->ie_Code ){
case SELECTUP: retval = GMR_NOREUSE; break;

case SELECTDOWN:{
InstanceData *id = (InstanceData*)INST_DATA( cl, o );

#ifdef DOUBLECLICK
/* Falls das Icon eine GADGETUP-Botschaft nur nach einem */
/* Doppelklick liefern soll, müssen wir den Zeitpunkt des */
/* letzten Klicks prüfen: */
if( DoubleClick( id->secs, id->micro, ie->ie_TimeStamp.tv_secs,
ie->ie_TimeStamp.tv_micro ) ){
G(o)->Flags |= GFLG_SELECTED;
butclass_redraw( o, gpi->gpi_GInfo );
retval = GMR_NOREUSE | GMR_VERIFY;

id->secs = id->micro = 0UL;
}else{
id->secs = ie->ie_TimeStamp.tv_secs;
id->micro = ie->ie_TimeStamp.tv_micro;
G(o)->Flags ^= GFLG_SELECTED;
butclass_redraw( o, gpi->gpi_GInfo );
retval = GMR_NOREUSE;
}
#else
/* GADGETUP nach einfachem Klick */
G(o)->Flags |= GFLG_SELECTED;
butclass_redraw( o, gpi->gpi_GInfo );
retval = GMR_NOREUSE | GMR_VERIFY;
#endif
}
break;

case MENUDOWN: retval = GMR_REUSE; break;
}
break;
}
}
}
return retval;
}

/*********************************************************** *****************/

BOOL IsIconFrameless( struct DiskObject *icon ){
/* Prüft, ob das Icon ohne Rahmen dargestellt werden muss */
/* siehe butclass_RENDER*/
ULONG frameless;

IconControl( icon,ICONCTRLA_GetFrameless, (ULONG) &frameless,TAG_DONE );

if( frameless == FALSE ){
ULONG globalfl;
if( IconControl( NULL,ICONCTRLA_GetGlobalFrameless, (ULONG) &globalfl,TAG_DONE ) )
frameless = globalfl;
}

return frameless;
}

/*********************************************************** *****************/

ULONG butclass_RENDER( Class *cl, Object *o, struct gpRender *gpr ){
/* Zeichnen des Icons */
RastPort *rp = gpr->gpr_RPort;
DiskObject *icon = (struct DiskObject *) G(o)->UserData;
Hook *hook;
InstanceData *id = (InstanceData*)INST_DATA( cl, o );
Layer *layer = gpr->gpr_GInfo->gi_Layer;
WORD x = G(o)->LeftEdge, y = G(o)->TopEdge;

/* Unter unserem Icon muss der richtige Hintergrund dargestellt werden: */
hook = InstallLayerHook( layer, id->backfill );

DrawIconState(rp, icon, NULL, x,y,
(G(o)->Flags & GFLG_SELECTED) != 0L,
ICONDRAWA_DrawInfo, (ULONG) gpr->gpr_GInfo->gi_DrInfo,
ICONDRAWA_Frameless, IsIconFrameless( icon ),
TAG_DONE );

InstallLayerHook( layer, hook );

return 0L; }

/*********************************************************** *****************/

ULONG butclass_SET( Class *cl, Object *o, struct opSet *ops ){
/* Setzen der Eigenschaften */
InstanceData *id = (InstanceData*)INST_DATA( cl, o ); TagItem *ti, *tlist = ops->ops_AttrList;
DiskObject *icon = NULL;

while( ti = NextTagItem( &tlist ) ){
switch( ti->ti_Tag ){
case GA_BackFill:
id->backfill = (Hook*) ti->ti_Data;
break;
case LAYOUT_Parent:
id->parent = (Object *) ti->ti_Data;
break;

case GA_UserData:
icon = (struct DiskObject *) ti->ti_Data;
break;
}
}

if( id->parent && icon ){
/* Berechnen der Icongröße und Mitteilung an das Parent-Objekt */
Rectangle rect;
UWORD w,h;

GetIconRectangle( NULL, icon, NULL, &rect,
ICONDRAWA_Borderless, FALSE, TAG_DONE );
/* Wir zählen also den Rand mit */

w = ( rect.MaxX - rect.MinX ) + 1;
h = ( rect.MaxY - rect.MinY ) + 1;

SetAttrs( id->parent,
LAYOUT_ModifyChild, (ULONG) o,
CHILD_MinWidth, w,
CHILD_MinHeight, h,
CHILD_MaxWidth, w,
CHILD_MaxHeight, h,
TAG_DONE );
/* Dies war die einzige Stelle, für die wir id->Parent brauchten. */
/* Da das Icon nachträglich geändert werden kann, müssen wir es */
/* im Objekt speichern. */
}

return (ops->MethodID != OM_NEW) ? DoSuperMethodA( cl, o, (Msg) ops ) : 1L;
/* bei OM_NEW wurde die SuperMethod schon in HANDLEINPUT aufgerufen! */
}

/*********************************************************** *****************/

ULONG butclass_DOMAIN( Class *cl, Object *o, struct gpDomain *gpd ){
/* Berechnen der Gadget-Ausmaße */
InstanceData *id = (InstanceData*)INST_DATA( cl, o );
DiskObject *icon = (struct DiskObject *) G(o)->UserData;

if( icon ){
/* nur wenn das Icon schon geladen wurde, steht die Größe des Buttons fest */
struct Rectangle rect;
UWORD w,h;

GetIconRectangle( NULL, icon, NULL, &rect,
ICONDRAWA_Borderless, FALSE,
TAG_DONE );

w = rect.MaxX - rect.MinX + 1;
h = rect.MaxY - rect.MinY + 1;

switch( gpd->gpd_Which ){
case GDOMAIN_MINIMUM:
gpd->gpd_Domain.Width = w;
gpd->gpd_Domain.Height = h;
break;

case GDOMAIN_NOMINAL:
case GDOMAIN_MAXIMUM:
gpd->gpd_Domain.Width = w;
gpd->gpd_Domain.Height = h;
break;
}
return 1L;
}

return 0L;
}

[ Dieser Beitrag wurde von Kaesebroetchen am 23.06.2005 um 00:12 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Test [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2025 by amiga-news.de - alle Rechte vorbehalten.
.