home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-03-18 | 32.0 KB | 1,042 lines |
- 30.06.96: Holger Burkarth
- 12.09.96: Holger Burkarth
- 17.10.96: Holger Burkarth
-
- Gadgets unter pOS:
- ------------------
- pOS ist ein objekt-orientiertes Betriebsystem und bildet die grafischen
- Eingabeelemente als Objekte ab. In pOS werden diese Objekt als Gadget
- bezeichnet und sind immer vom Grundaufbau pOS_Gadget-kompatibel.
- Das erste Gadget-Objekt, die Root, wird als "gadget.class" bezeichnet und
- stellt alle Grundeigenschaften bereit.
- Ein Gadget kann von pOS autom. nachgeladen werden. Hierbei dient eine Library
- als Grundaufhänger für die dynamische Verwaltung. (siehe p:pCom/_Extern/FindGad.c)
-
-
-
- struct pOS_Gadget:
- ------------------
-
- struct pOS_Gadget
- {
-
- Die Gadget werden in Listen eingereiht verwaltet. Alle direkt im Window
- eingereihten Gadgets befinden sich, nach pOS_AddGadget/pOS_AddGadgets,
- in win_GadList. Jedoch werden die Member-Gadgets von Gruppen in privaten
- Listen verwaltet. Die Liste win_GadList wird durch pOS_LockIntuiGadget()
- geschützt.
-
- pOS_Node gad_Node;
-
- Koordinaten des Gadgets zur Anzeige und zum Event-Handling.
- Wird das zugehörige Bit in gad_Flags (GFLG_RelBottom, GFLG_RelRight,
- GFLG_RelWidth, GFLG_RelHeight) gesetzt, werden die Koordinaten relativ
- zur Window-Größe berechnet. Die Funktion pOS_CalcGadgetBox() berechnet
- die absoluten window-bezogenen Gadget-Koordinaten.
-
- SWORD gad_LeftEdge;
- SWORD gad_TopEdge;
- SWORD gad_Width;
- SWORD gad_Height;
-
-
-
-
- GFLG_NoSelect:
- Bei gesetztem Bit wird das Gadget nie 'GFLG_Selected' selektiert. Die zugehörige
- IDCMP-Message wird dennoch erzeugt.
-
-
- GFLG_RelBottom, GFLG_RelRight,GFLG_RelWidth, GFLG_RelHeight:
- Die Gadget-Koordinaten werden relativ zur Window-Größe berechnet.
-
-
- GFLG_Selected:
- Dieses Bit zeigt an, daß das Gadget selektiert (nicht aktiviert) ist.
- Je nach Gadget-Type wird das Selected-Bit anderst interpretiert.
- Das pOS modifiziert dieses Bit nie, sondern überläßt dies dem Gadget bzw.
- der Root-Class (gadget.class).
-
- GFLG_Disabled:
- Falls das Disabled-Bit gesetzt ist, wird keine IDCMP-Message erzeugt und
- das Gadget erhält durch die Root-Class ein Ghost-Raster. (siehe GFLG_PrivateDisable)
-
- GFLG_PrivateDisable:
- Wünscht das Gadget kein Ghost-Rast durch die Root-Class, so besteht die
- Möglichkeit, daß das Gadget eine eigene Disable-Darstellung verwenden kann.
-
- GFLG_OSLable:
- Befindet sich in gad_Lable ein Lable, das nicht in die Gadget-Reflexbox einbezogen
- werden soll, kann das OSLable-Bit den Layouter anweisen, den Lable nicht zu
- berücksichtigen.
-
- GFLG_Alternate:
- Damit Update nicht auf alle Gadget angewendet wird, prüft pOS_RefreshGadgetsMd mit
- Mode GCLMTHRE_Update das Alternate-Bit und zeichnet nur diese Gadgets.
-
- GFLG_FixSize:
- Der Layouter wird angewiesen, dem Gadget nur seine Nominal-Größe zuzuweisen
- (imth_GetIBox.imgb_MinIBox). Jede dynamische Platzaufteilung wird nicht angewendet.
-
- GFLG_UseMthAddRem:
- Muß das Gadget informiert sein, ob es ein Window besitzt und somit gezeichnet
- werden darf, werden durch Setzen von GFLG_UseMthAddRem zusätzliche
- Nachrichten (GCLMTH_Add/GCLMTH_Rem) erzeugt.
-
- GFLG_UseMthLayout:
- Das Gadget unterstüzt den pOS-Gadget-Layouter.
-
- GFLG_IgnoreIE:
- Wird das IgnoreIE-Bit gesetzt, erzeugt pOS nie eine IDCMP-Message.
-
- GFLG_DropSelected:
- Die Root-Class setzt GFLG_DropSelected, falls ein Drag-Objekt im Gadget
- abgelegt werden kann. (siehe GFLG_HighlightDropBox)
-
- GFLG_HighlightDropBox:
- Weist die Root-Class an, selbständig den GFLG_DropSelected-Mechanismus zu
- handhaben.
-
-
- ULONG gad_Flags; /* enum pOS_GadgetFlags */
-
-
- Immer wenn eine gadget-bezogene IDCMP-Message erzeugt wird, befindet sich
- in im_Code die Gadget-ID (gad_ID).
-
- ULONG gad_ID; /* user-definable ID field */
-
-
- Zur freien Verfügung für den Anwender (nicht für das Gadget).
- ULONG gad_UserData[2];
-
-
- Bei jedem Neuzeichnen wird abhängig vom GFLG_Selected-Flag entschieden,
- welches Grafikobjekt gezeichnet werden soll. Ist gad_Select genullt,
- so wird gad_Render als selektiert gezeichnet.
- Siehe p:pIntui/OClass.h und (enum pOS_IObjectDrawMode),
-
- pOS_IntuiObj *gad_Render;
- pOS_IntuiObj *gad_Select;
-
- Gadget-Lable für Titel oder Überschrieften....
- pOS_IntuiObj *gad_Lable;
-
-
-
- GACT_RelVerify:
- Erzeugt IDCMP_GadgetUp. Zusätzlich wird geprüft, ob die Maustaste über dem
- Gadget lösgelassen wird.
-
- GACT_Immediate:
- Erzeugt IDCMP_GadgetDown. Generiert sofort beim Mausklick eine Message.
-
- GACT_UpdateGadget:
- Erzeugt IDCMP_UpdateGadget.
-
- GACT_RightBorder, GACT_LeftBorder, GACT_TopBorder, GACT_BottomBorder:
- Einbeten des Gadgets in den Window-Rahmen.
-
- GACT_ToggleSelect:
- Toggle schließt GFLG_NoSelect aus.
- Ist GACT_Immediate gesetzt, dann wird beim Mausklick sofort das
- GFLG_Selected-Bit gewechselt.
-
- GACT_ActiveGadget:
- Immer wenn das Gadget den Eingabefokus erhält wird diesen Bit gesetzt.
- Dieser Mechanismus wird von pOS kontrolliert und darf nicht von außen
- verändert werden.
-
- GACT_StandardDrop:
- GACT_StandardDrag:
- Die Root-Class wendet das Standard-Verfahren an.
-
- GACT_FixFocus:
- Bei gesetztem Bit wird pOS angewiesen, den Eingabefokus vom Gadget zu festigen.
- Der Aufruf von pOS_ActivateGadget() auf ein anderes Gadget wird bewirken, daß
- 'wir' den Eingabefokus behalten. Das String-Gadget verwendet dieses Bit, um
- zu verhindern, daß während der Eingabe der Fokus abgezogen wird. Nur der
- User kann mit der Maus den Fokus verändern.
-
-
- ULONG gad_Activation; /* enum pOS_GadgetActivate */
-
-
- ULONG gad_Type; /* enum pOS_GadgetTypes */
-
-
- Gadget-Type bezogener Zeiger auf eine weitere Datenstruktur.
-
- APTR gad_SpecialInfo;
-
- Durch gezieltes Setzen eines Layers, wird das Gadget vom Window-Layer auf den
- neuen Layer verschoben.
-
- pOS_Layer *gad_Layer;
-
- Die folgenden zwei Variablen werden von pOS nach GCLMTH_GoActive bzw. GCLMTH_HandleInput
- als Notify-Mechanismus eingesetzt. Ausgeschaltet wird der Mechanismus mit
- gad_Map=NULL.
-
- APTR gad_Target;
- const pOS_TagItem *gad_Map;
-
-
- Falls das Gadget ein Member-Gadget einer Gruppe ist, befindet sich in
- gad_Parent die Gruppe.
-
- pOS_Gadget *gad_Parent;
-
- const CHAR *gad_HelpID;
-
-
- Einige Gadgets stellen einen Callback bereit, um Events zu filter bzw.
- zu modifizieren. Die Root-Class und pOS lesen gad_Callback nur aus, wenn
- das GFLG_StdCallback gesetzt ist.
-
- pOS_Callback *gad_Callback;
-
- Die Root-Class (gadget.class) stellt einige Border-Typen bereit, die
- beim Neuzeichen autom. angezeigt werden. Der Bordertype darf nie
- direkt gesetzt werden. Immer die Tags verwenden, sonst könnten
- gad_BorXXX-Daten falsch gesetzt sein und das Gadget-Layout ist fehlerhaft.
-
- UBYTE gad_BorderType; /* enum pOS_GadgetBorderTypes */
-
- Keybord-Support für das Gadget.
- UBYTE gad_ShortKey;
-
- Damit der Gadget-Border als solcher verrechnet werden kann, wird
- der Border als Zeichenbereich ausgeblendet.
- pOS_CalcGadgetBox() berechnet die gesamte Gadget-Abmaße, wogegen
- pOS_CalcGadgetInnerBox() den Border (gad_BorTop,gad_BorLeft,gad_BorRight,gad_BorBottom)
- herausrechnet. Alle abgeleiteten Gadgets sollten immer pOS_CalcGadgetInnerBox()
- verwendet, so wird gewährleistet, daß die Root-Class den Border-Type richtig
- einzeichnen kann.
-
- UBYTE gad_BorTop,gad_BorLeft,gad_BorRight,gad_BorBottom;
-
- Der pOS-Gadget-Layouter bzw. 'grpgad.class' unterstützen Gewichte zur
- dynamischen Gadgetanpassung an ein Window. Desto höher das Gewicht, desto
- mehr Raum wird dem Gadget zugewiesen. Ein Null-Gewicht hat zur Folge, daß
- das Gadget nur die Nominalgröße einnimmt.
-
- UBYTE gad_Gwk; /* Layout-Gewicht */
-
- Beschreibt die Ausrichtung der Grafikelemente.
-
- UBYTE gad_LableLay; /* (enum pOS_IObjectClassLayout) */
- UBYTE gad_RenderLay; /* (enum pOS_IObjectClassLayout) */
-
- Vom Root-Class-Gadget werden diese Vars autom. berechnet und als
- Quick-Referenzen verwendet.
-
- UWORD gad_LableWidth; /* wird vom Gadget autom. berechnet */
- UWORD gad_LableHeight;
-
-
- Durch setzen von gad_MutualExclude!=0, wird der Mechanismus eingeschaltet.
- Die 'gadget.class' übernimmt sämtliche Kontrollmaßnahmen. Ist ein Bit
- gesetzt, bedeutet dies, daß das korrospondierende Gadget de-selected wird.
- UBYTE gad_MutualExclude;
-
-
-
-
-
- ----------------------------------------------------------------------------
- pOS tauscht sich mittels der (struct pOS_GadgetMethod) - Datenstruktur mit
- den Gadgets aus. Dazu stehen folge Kommandos (Methoden) zur Verfügung.
- (enum pOS_IntuiClassMethods)
- (enum pOS_GadgetClassMethods)
-
- ICLMTH_New:
- Das Gadget wird erzeugt.
-
- ICLMTH_Dispose:
- Das Gadget wird gelöscht.
-
- ICLMTH_Set:
- Daten ans Gadget übermitteln.
-
- ICLMTH_Get:
- Daten vom Gadget lesen.
-
- ICLMTH_Update:
- Wie ICLMTH_Set, wird jedoch von pOS intern verwendet.
-
- GCLMTH_HitTest:
- Prüfen, ob ein Mauseklick zum Gadget (innerhalb) gehört.
-
- GCLMTH_Render:
- Gadget zeichnen.
-
- GCLMTH_GoActive:
- Gadget erhält den Eingabefokus und alle Inputevents werden an den Dispatcher
- gesendet.
-
- GCLMTH_HandleInput:
- Inputevents auswerten.
-
- GCLMTH_GoInactive:
- Gadget verliert den Eingabefokus.
-
- GCLMTH_Help:
- Help-Path wird gebildet.
-
- GCLMTH_Abort:
- Das Gadget wird abgebrochen (ESC bzw. Right-Mouse).
-
- GCLMTH_Add:
- Das Gadget wird ins Window eingehängt und kann jetzt grafische Funktionen
- aufrufen.
-
- GCLMTH_Rem:
- Dem Gadget wird das Window entzogen. Es dürfen keine grafische Funktionen
- aufgerufen werden.
-
- GCLMTH_Layout:
- Gadget-Layouter.
-
- GCLMTH_GetIBox:
- Berechnung der Gadget-Abmaße.
-
- GCLMTH_Msg:
- Bearbeitung von IDCMP-Messages in der pOS_SysIMessage-Funktion.
-
- GCLMTH_BeginDrag:
- Das Gadget muß ein Drag-Objekt erzeugen.
-
- GCLMTH_EndDrag:
- Der Drag-Vorgang ist beendet und das mittels GCLMTH_BeginDrag erzeugte Objekt
- muß wieder gelöscht werden. Root-Class erledigt dies normalerweise.
-
- GCLMTH_DropTest:
- Es wird geprüft, ob ein Drag-Objekt an dieser Position abgelegt werden kann.
-
- GCLMTH_ActiveDrop
- Das Drop-Gadget bekommt diese Nachricht immer, wenn GCLMTH_DropTest TRUE war.
-
- GCLMTH_HandleDrop:
- Ein Gadget, das bei GCLMTH_DropTest sein Ok gab, bekommt solage InputEvents
- bis das Drag bendet oder herausgefahren wird.
-
- GCLMTH_InactiveDrop:
- Dem Drop-Gadget wird mitgeteilt, daß ab sofort kein Drop mehr möglich ist.
-
- GCLMTH_AbortDrop:
- Drop-Vorgang wurde abgebrochen (rechte Maustaste)
-
- GCLMTH_GetQuickDropObject:
- GCLMTH_GetDropObject:
- GCLMTH_GetQuickDropObject wird im input.task ans Drag-Gadget geschickt,
- um ein DataType-Objekt zu erzeugen. Meldet das Gadget FALSE, so wird
- GCLMTH_GetDropObject aus dem Anwender-Prozeß heraus aufgerufen.
- Dieser Mechanismus erlaugt es schnell Objekte zu erzeugen bzw. komplexe
- Objekte im Umfeld vom Anwender-Prozeß mit DOS oder anderen Komponenten
- zu Verknüpfen.
-
- GCLMTH_SetDropObject:
- Das Drop-Gadget bekommt ein DataType-Objekt übermittelt.
- Wird immer aus dem Anwender-Prozeß aufgerufen.
-
-
-
-
- struct pOS_GadgetMethod
- {
-
- (enum pOS_IntuiClassMethods) bzw. (enum pOS_GadgetClassMethods).
- Je nach Method ist eine andere struct der union imth_U zu verwenden.
-
- ULONG imth_Method;
-
- union {
-
-
-
-
- Bei jedem Mauseklick links prüft pOS für jedes Gadget, ob der Mausklick zu einem
- Gadget gehört. Dabei befindet sich in imht_RMouse die relative Mausposition zur
- linken oberen Gadget-Ecke. imht_AMouse enthält die Koordinaten im Window.
- Liegt der Klick innerhalb des Gadgets und das Gadget darf den Eingabefokus
- erhalten, dann muß der Dispatcher imht_HitGadget setzen und GCLMTHR_GadgetHit
- zurückgeben.
-
- struct { /* GCLMTH_HitTest */
- const pOS_IClassInfo *imht_Info;
- ULONG imht_Pad; // damit Mouse mit GoActive... übereinstimmt
- const pOS_Point *imht_RMouse; // relativ zum Gadget
- const pOS_Point *imht_AMouse; // absolut
- pOS_Gadget *imht_HitGadget;
- } imth_HitTest;
-
-
-
-
- In pOS kann ein Gadget auf mehrere Arten gezeichnet werden. Der imre_Type
- beschreibt, wie gezeichnet werden muß.
-
- GCLMTHRE_Update:
- Nur die Veränderung zeichnen. Z.B. Slider-Balken beim Prop-Gadget oder
- Textstring beim String-Gadget.
-
- GCLMTHRE_Redraw:
- Alle Grafikelemente Zeichen. Die Root-Class zeichnet nur bei GCLMTHRE_Redraw
- den Gadget-Border.
-
- GCLMTHRE_Toggle:
- Gadget wechselt GFLG_Selected - Zustand.
-
- GCLMTHRE_TickFrame:
- Animations-Teil zeichnen.
-
- Ist imre_NewTick==0 und imre_OldTick==0, dann wird das Objekt als Single-Frame
- gezeichnet.
-
-
- struct { /* GCLMTH_Render */
- const pOS_IClassInfo *imre_Info;
- ULONG imre_Type; /* enum pOS_GadgetClassRender */
- ULONG imre_NewTick; /* wird bei GCLMTHRE_TickFrame verwendet */
- ULONG imre_OldTick; /* Anzahl der IntuiTicks*100 => 1/1000 sec. */
- } imth_Render;
-
-
-
- Immer wenn pOS dem Gadget den Eingabefokus zuteilt, wird ein GCLMTH_GoActive
- erzeugt. Dies kann durch Klicken mit der Maus oder durch pOS_ActivateGadget()
- geschehen. Nur wenn der Auslöser ein Inputevent ist, ist imac_IE gesetzt.
- (imac_RMouse und imac_AMouse wie bei GCLMTH_HitTest)
- Will das Gadget den Eingabefokus annehmen, muß GCLMTHR_Activate zurückgegeben
- werden. Hat der User dem Gadget GACT_Immediate gesetzt, so wird imac_ResCode als
- IDCMP-Code interpretiert. Um zu verhindern, daß ein IE mehrere Aktionen auslöst,
- kann mit GCLMTHR_AbortIE explizit der IE als abgeschlossen/bearbeitet
- gekennzeichnet werden.
-
- struct { /* GCLMTH_GoActive */
- const pOS_IClassInfo *imac_Info;
- const pOS_InputEvent *imac_IE; /* NULL => imac_RMouse/imac_AMouse sind nicht gültig */
- const pOS_Point *imac_RMouse;
- const pOS_Point *imac_AMouse;
- ULONG imac_ResCode; /* => im_Code */
- pOS_Gadget *imac_NextActGad; /* zu aktivierendes Gadget */
- } imth_GoActive;
-
-
-
-
- Siehe GCLMTH_GoActive. Dem aktuellen Gadget (Eingabefokus) werden alle InputEvents
- zur Bearbeitung vorgelegt. Gibt das Gad GCLMTHR_InputDone zurück, signalisiert
- dies, daß die Eingabe abgeschlossen ist, das Gadget den Eingabefokus abgibt und
- gegebenenfalls ein IDCMP_GadgetUp erzeugt wird. pOS ruft nachträglich NICHT
- GCLMTH_GoInactive auf. Damit keine Unstimmigkeit in der Bearbeitung entsteht, muß
- GCLMTHR_Activate zurückgegeben werden.
-
- struct { /* GCLMTH_HandleInput */
- const pOS_IClassInfo *imhi_Info;
- const pOS_InputEvent *imhi_IE;
- const pOS_Point *imhi_RMouse;
- const pOS_Point *imhi_AMouse;
- ULONG imhi_ResCode; /* => im_Code */
- pOS_Gadget *imhi_NextActGad;
- } imth_HandleInput;
-
-
-
-
- Von außen wird dem Gadget der Eingabefokus entzogen.
- Dies geschieht durch Deaktivieren des Windows oder durch Anklicken eines
- anderen Gadgets.
-
- struct { /* GCLMTH_GoInactive */
- const pOS_IClassInfo *imia_Info;
- UBYTE imia_Pad[12];
- ULONG imia_ResCode; /* => im_Code */
- } imth_GoInactive;
-
-
-
-
- Wie GCLMTH_GoInactive, jedoch durch explizites Abbruch-Kommando.
- (Right-Mouse)
- struct { /* GCLMTH_Abort */
- const pOS_IClassInfo *imab_Info;
- UBYTE imab_Pad[12];
- ULONG imab_ResCode; /* => im_Code */
- pOS_Gadget *imab_NextActGad;
- } imth_Abort;
-
-
-
- Dem Gadget wird mitgeteilt, auf welchem Window es gezeichnet wird.
- In GCLMTH_Add kann imad_Info->ici_Window ausgelesen werden.
- Wichtig, diese zwei Methoden werden nur verschickt, wenn das
- GFLG_UseMthAddRem-Bit getzt ist. Nach GCLMTH_Rem darf nicht mehr auf das
- Window zugegriffen werden.
-
- struct { /* GCLMTH_Add */
- const pOS_IClassInfo *imad_Info;
- } imth_Add;
-
- struct { /* GCLMTH_Rem */
- const pOS_IClassInfo *imrm_Info;
- } imth_Rem;
-
-
-
- Der Layouter teilt dem Gadget imly_IBox als Gadget-Abmessung zu.
- Über die imly_LD-Daten kann das unschöne Blitzen bzw. doppelte Löschen von
- Grafikbereichen durch Region-Technik verhindert werden.
- Nur wenn das GFLG_UseMthLayout-Bit gesetzt ist, wird GCLMTH_Layout verwendet.
- Die Ausnahme ist, daß alle Member-Gadget (gehören einer Gruppe) immer vom
- Layouter bearbeitet werden.
-
- struct { /* GCLMTH_Layout */
- const pOS_IClassInfo *imly_Info;
- ULONG imly_Flags; /* (enum pOS_GadgetLayoutFlags) */
- const pOS_IBox *imly_IBox;
- pOS_LayoutDamage *imly_LD;
- } imth_Layout;
-
-
-
-
- Ermitteln der Gadget-Größe im Window. Die GCLMTH_GetIBox-Methode kann jedoch
- ohne vorhandensein vom Window aufgerufen werden. Damit dies ermöglicht wird,
- sind imgb_DrawInfo und imgb_RastPort definiert. Das Gadget muß in
- imgb_MinIBox und imgb_MaxIBox, Width und Height setzen.
-
- struct { /* GCLMTH_GetIBox */
- const pOS_DrawInfo *imgb_DrawInfo;
- pOS_RastPort *imgb_RastPort;
- pOS_IBox *imgb_MinIBox;
- pOS_IBox *imgb_MaxIBox;
- } imth_GetIBox;
-
-
-
-
-
- Immer wenn pOS den Help-Mechanismus startet, wird über die aktuelle
- Maus-Koordinate das darunterliegende Gadget ermittelt, das den Help-Path
- (imhp_String) zusammenbauen kann. Mit folgender Sequenz baut die Root-Class
- den Helppath auf:
-
- ret=pOS_AddLinkGadHelpAll(gb_GadgetBase,gad,mth);
- if(ret==0) {
- pOS_AddLinkGadHelpID(gb_GadgetBase,mth,gad->gad_HelpID);
- if((gad->gad_Flags & GFLG_Disabled) && ret!=pOS_CLASSERR)
- pOS_AddLinkGadHelpID(gb_GadgetBase,mth,"DISABLED");
- }
- else ret=pOS_CLASSERR;
-
- pOS_AddLinkGadHelpAll() kreiert den Pfad von Root bis zum äußersten Gadget. War
- der Help-Level==0 (erster Versuch einen Help zu erzeugen), wird an den Help-Path
- noch unsere eigene Help-ID angehängt. Falls das Gadget disabled ist, wird dies
- ebenfalls eingebaut.
- Z.B.
- Window-Help-ID "WIN"
- Gad-Gruppe "Grp"
- PropGadget "PropGad"
- OkGadget "OK"
-
- HelpPath:
-
- "WIN:Grp/PropGad" oder
- "WIN:Grp/OkGad" oder
- "WIN:Grp/PropGad/DISABLED" ...
-
-
- struct { /* GCLMTH_Help */
- const pOS_IClassInfo *imhp_Info;
- CHAR *imhp_String;
- const pOS_Point *imhp_RMouse;
- const pOS_Point *imhp_AMouse;
- UWORD imhp_StringSize;
- UWORD imhp_Level; /* 0,1,2... */
- } imth_Help;
-
-
-
-
- Durch pOS_SysIMessage() kann eine IDCMP-Message vom Gadget selbst bearbeitet werden.
- pOS verwendet diesen Mechanismus für Short-Keys. Der Dispatcher reagiert nicht
- auf Keybord-Events. Das pOS erzeugt somit einen normalen IDCMP_VanillaKey und
- leitet über pOS_SysIMessage() die zweite, nicht eingabefokus-orientierte
- Bearbeitung ein. Wird GCLMTHR_DoneMsg zurückgegeben, dann ist die immg_Msg
- bearbeitet und wird nicht weitergereicht. Hat eine IDCMP-Message ihr Ziel
- erreicht, wurde aber nicht benötigt, so kann mittels GCLMTHR_NoUsed signalisiert
- werden, daß das Anwenderprogramm die Msg auswerten kann
- (=>pOS_SysIMessage liefert NULL).
-
- struct { /* GCLMTH_Msg */
- const pOS_IClassInfo *immg_Info;
- pOS_IntuiMessage *immg_Msg;
- } imth_Msg;
-
- } imth_U;
- };
-
- ------------------------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-
-
-
- Erzeugen einer neuen Gadget-Class:
- ----------------------------------
-
- {
- pOS_NClass *MyClass;
-
-
- /*\
- *** Eine neue Class wird von der "gadget.class" abgeleitet.
- *** Die neue Klasse wird über den Dispatcher 'MyDispatcher_Func'
- *** versorgt und besitzt eigene private Daten (struct MyGadData),
- \*/
- MyClass=pOS_CreateClass("MyGad.class","gadget.class",NULL,
- (APTR)MyDispatcher_Func,
- sizeof(struct MyGadData),0);
- if(MyClass) {
- ...
-
- pOS_DeleteClass(MyClass);
- }
-
- }
-
-
-
- /*----------------------------------
- -----------------------------------*/
- VOID pOSp_SetLayoutIBox(pOS_Gadget *gad,const pOS_IBox* iBox)
- {
- gad->gad_LeftEdge=iBox->Left;
- gad->gad_TopEdge =iBox->Top;
- gad->gad_Width =iBox->Width;
- gad->gad_Height =iBox->Height;
- }
-
-
-
-
- Beispiel eines Button-Gadgets:
- ------------------------------
-
- struct pOS_ButtonGadInfo
- {
- UWORD bgi_Width,bgi_Height;
- SWORD bgi_AddWidth,bgi_AddHeight;
- };
-
-
- VOID ButtonSetTags(pOS_ButtonGadInfo* bgi,const pOS_TagItem* tags)
- {
- pOS_TagItem* Tag;
- pOS_Gadget* Gad;
-
- Gad=(pOS_Gadget*)pOS_GetObjectRootAdr(cl,bgi);
-
- while(Tag=pOS_NextTagItem(&tags)) {
- switch(Tag->ti_Tag) {
- case ICLTAG_AddWidth: bgi->bgi_AddWidth=Tag->ti_Data; break;
- case ICLTAG_AddHeight: bgi->bgi_AddHeight=Tag->ti_Data; break;
-
- default:
- if(Gad->gad_Render) {
- pOS_SetObjectData(Gad->gad_Render,
- Tag->ti_Tag, Tag->ti_Data,
- TAG_DONE);
- }
- break;
- }
- }
-
-
- ULONG ButtonGadDispatcher(_R_LB pOS_ExecBase* exec,_R_A0 const pOS_Class* cl,
- _R_A1 pOS_ButtonGadInfo* bgi,_R_A2 pOS_GadgetMethod* mth)
- {
- pOS_Gadget *Gad;
- pOS_Rectangle Rect;
- pOS_IBox IBox;
- ULONG ret=0;
-
- Gad=(pOS_Gadget*)pOS_GetObjectRootAdr(cl,bgi);
-
- switch(mth->imth_Method) {
- // -----
- case ICLMTH_New:
- {
- const pOS_DrawInfo *DRI=(pOS_DrawInfo*)
- pOS_FindTagData(ICLTAG_DrawInfo,mth->imth_U.imth_New.imnw_Tags,0);
-
- bgi->bgi_AddWidth=8; bgi->bgi_AddHeight=8;
- ret=pOS_DoAbsMethodA(cl,bgi,(pOS_Method*)mth);
- ButtonSetTags(bgi,mth->imth_U.imth_New.imnw_Tags);
- Gad->gad_Type |= GTYP_BoolGadget;
- if(!Gad->gad_Render) {
- Gad->gad_Render=(pOS_IntuiObj*)pOS_NewGObject(NULL,"itext2.class",0,
- TAG_MORE, (ULONG)mth->imth_U.imth_New.imnw_Tags,
- TAG_END);
- }
- if(Gad->gad_Render) { // *** Objekt-Maße gleich berechnen und vermerken
- pOS_IObjectMethod Mth;
- UWORD Ak;
- Gad->gad_Render->iobj_LeftEdge=Gad->gad_Render->iobj_TopEdge=0;
- Mth.imth_Method=IOBMTH_GetIBox;
- Mth.imth_U.imth_GetIBox.imgb_DrawInfo=DRI;
- Mth.imth_U.imth_GetIBox.imgb_RastPort=DRI->dri_Screen->scr_IntuiRP;
- Mth.imth_U.imth_GetIBox.imgb_IBox=&IBox;
- pOS_DoIMethodA(Gad->gad_Render,(pOS_Method*)&Mth);
- Ak=Gad->gad_BorLeft+Gad->gad_BorRight;
- Gad->gad_Width =IBox.Width+Ak+bgi->bgi_AddWidth;
- IBox.Width+=Ak;
- Ak=Gad->gad_BorTop+Gad->gad_BorBottom;
- Gad->gad_Height=IBox.Height+Ak+bgi->bgi_AddHeight;
- IBox.Height+=Ak;
- bgi->bgi_Width=IBox.Width; bgi->bgi_Height=IBox.Height;
- }
- else ret=pOS_CLASSERR;
- }
- break;
-
- // -----
- case ICLMTH_Update:
- case ICLMTH_Set:
- pOS_DoAbsMethodA(cl,bgi,(pOS_Method*)mth);
- ButtonSetTags(bgi,mth->imth_U.imth_New.imnw_Tags);
- ret=1;
- break;
-
- // -----
- case GCLMTH_GetIBox:
- if(Gad->gad_Lable)
- pOS_DoAbsMethodA(cl,bgi,(pOS_Method*)mth); // *** Grunddaten berechnen
- if(Gad->gad_Render) {
- mth->imth_U.imth_GetIBox.imgb_MinIBox->Width =bgi->bgi_Width + bgi->bgi_AddWidth;
- mth->imth_U.imth_GetIBox.imgb_MinIBox->Height=bgi->bgi_Height+ bgi->bgi_AddHeight;
- mth->imth_U.imth_GetIBox.imgb_MaxIBox->Width =32000; // *** maximal
- mth->imth_U.imth_GetIBox.imgb_MaxIBox->Height=mth->imth_U.imth_GetIBox.imgb_MinIBox->Height;
- }
- break;
-
- // -----
- case GCLMTH_Layout:
- if(mth->imth_U.imth_Layout.imly_Flags & GCLMTHLYF_LD) {
- pOS_CalcGadgetBox(mth->imth_U.imth_Layout.imly_Info->ici_Window,Gad,&Rect);
- pOS_OrRectRegion(&mth->imth_U.imth_Layout.imly_LD->lyd_DamLst,&Rect);
- }
- pOSp_SetLayoutIBox(Gad,mth->imth_U.imth_Layout.imly_IBox);
- if(mth->imth_U.imth_Layout.imly_Flags & GCLMTHLYF_LD) {
- pOS_CalcGadgetBox(mth->imth_U.imth_Layout.imly_Info->ici_Window,Gad,&Rect);
- pOS_OrRectRegion(&mth->imth_U.imth_Layout.imly_LD->lyd_NoErase,&Rect);
- }
- break;
-
- default: ret=pOS_DoAbsMethodA(cl,bgi,(pOS_Method*)mth);
- }
- return(ret);
- }
-
-
-
-
-
- Beispiel eines erweiterten Gadgets:
- -------------------------------------
-
-
- ULONG PropGadDispatcher(_R_LB pOS_ExecBase* exec,_R_A0 const pOS_Class* cl,
- _R_A1 pOS_PropGadInfo* pgi,_R_A2 pOS_GadgetMethod* mth)
- {
- static pOS_Point RefPoint;
- static UWORD RefHorizBor,RefVertBor;
-
- pOS_Gadget *Gad;
- pOS_GadgetMethod GMth;
- pOS_Rectangle Rect;
- ULONG ret;
-
- Gad=(pOS_Gadget*)pOS_GetObjectRootAdr(cl,pgi);
-
- switch(mth->imth_Method) {
- // -----
- case ICLMTH_New:
- if(!Gad->gad_HelpID) Gad->gad_HelpID="PropGad";
- Gad->gad_SpecialInfo=(APTR)pgi;
- Gad->gad_Type |= GTYP_PropGadget;
- Gad->gad_Flags |= GFLG_PrivateDisable;
- if(pgi->pg_Total==0) {
- pgi->pg_HorizBody=pgi->pg_VertBody =PRGADCON_MaxBody/2;
- pgi->pg_HPotRes=pgi->pg_VPotRes=PRGADCON_MaxPot/2;
- pgi->pg_Total=0xffff; pgi->pg_Visible=0x8000;
- }
- ret=pOS_DoAbsMethodA(cl,pgi,(pOS_Method*)mth);
- if(ret!=pOS_CLASSERR) {
- ret=pOSp_PropSetTags(pgi,mth->imth_U.imth_New.imnw_Tags,NULL);
- }
- break;
-
- // -----
- case ICLMTH_Update:
- case ICLMTH_Set:
- pOS_DoAbsMethodA(cl,pgi,(pOS_Method*)mth);
- pOSp_PropSetTags(pgi,mth->imth_U.imth_Set.imst_Tags,mth->imth_U.imth_Set.imst_Info);
- ret=1;
- break;
-
- // -----
- case ICLMTH_Get:
- if(!(ret=pOS_DoAbsMethodA(cl,pgi,(pOS_Method*)mth)))
- ret=pOSp_GetPropTags(pgi,mth->imth_U.imth_Get.imgt_ID,
- mth->imth_U.imth_Get.imgt_Variable);
- break;
-
-
- // -----
- case GCLMTH_Render:
- {
- pOS_RastPort *RP;
- const pOS_IClassInfo *const GI=mth->imth_U.imth_Render.imre_Info;
-
- if(RP=pOS_ObtainGRastPort(Gad,GI)) {
- pOS_CalcGadgetBox(GI->ici_Window,Gad,&Rect);
- pOSp_PropDraw(pgi,&Rect,GI,RP);
- if(mth->imth_U.imth_Render.imre_Type==GCLMTHRE_Redraw)
- pOS_DoAbsMethodA(cl,pgi,(pOS_Method*)mth);
- pOS_ReleaseGRastPort(GI,RP);
- }
- ret=1;
- }
- break;
-
-
- // -----
- case GCLMTH_GoActive:
- if(mth->imth_U.imth_HandleInput.imhi_IE) {
- ret=GCLMTHR_Activate | GCLMTHR_AbortIE;
- RefPoint=*mth->imth_U.imth_GoActive.imac_RMouse;
- RefHorizBor=pgi->pg_LeftBorder; RefVertBor=pgi->pg_TopBorder;
- GMth=*mth; GMth.imth_Method=GCLMTH_Render;
- if(RefPoint.X>pgi->pg_LeftBorder && RefPoint.Y>pgi->pg_TopBorder
- && RefPoint.X<=pgi->pg_LeftBorder+pgi->pg_CWidth+
- Gad->gad_BorLeft+Gad->gad_BorRight
- && RefPoint.Y<=pgi->pg_TopBorder+pgi->pg_CHeight+
- Gad->gad_BorTop+Gad->gad_BorBottom) {
- Gad->gad_Flags |= GFLG_Selected;
- pgi->pg_Flags |= PRGADF_KnobHit;
- GMth.imth_U.imth_Render.imre_Type=GCLMTHRE_Toggle;
- }
- else {
- ret |= GCLMTHR_InputDone;
- if(pgi->pg_Flags & PRGADF_FreeHoriz) {
- if(RefPoint.X<=pgi->pg_LeftBorder) {
- if(pgi->pg_HorizPot>pgi->pg_HPotRes) pgi->pg_HorizPot-=pgi->pg_HPotRes;
- else pgi->pg_HorizPot=0;
- }
- else pgi->pg_HorizPot=MIN(PRGADCON_MaxPot,pgi->pg_HorizPot+pgi->pg_HPotRes);
- }
- if(pgi->pg_Flags & PRGADF_FreeVert) {
- if(RefPoint.Y<=pgi->pg_TopBorder) {
- if(pgi->pg_VertPot>pgi->pg_VPotRes) pgi->pg_VertPot-=pgi->pg_VPotRes;
- else pgi->pg_VertPot=0;
- }
- else pgi->pg_VertPot=MIN(PRGADCON_MaxPot,pgi->pg_VertPot+pgi->pg_VPotRes);
- }
- GMth.imth_U.imth_Render.imre_Type=GCLMTHRE_Update;
- }
- pOS_DoVirMethodA(cl,pgi,(pOS_Method*)&GMth);
- }
- break;
-
-
- // -----
- case GCLMTH_HandleInput:
- {
- const pOS_Point *const Pt=mth->imth_U.imth_HandleInput.imhi_RMouse;
- const pOS_InputEvent *const IE=mth->imth_U.imth_HandleInput.imhi_IE;
- GMth=*mth;
-
- ret=GCLMTHR_Activate;
- if(IE->ie_Class == IECLASS_RAWMOUSE) {
- const pOS_IClassInfo *const GI=mth->imth_U.imth_Render.imre_Info;
- UWORD Width,Height;
-
- pOS_CalcGadgetInnerBox(GI->ici_Window,Gad,&Rect);
- Width =Rect.MaxX-Rect.MinX+1 -2;
- Height=Rect.MaxY-Rect.MinY+1 -2;
- if(IE->ie_Code == (IECODE_LBUTTON | IECODE_UP_PREFIX)) {
- Gad->gad_Flags &= ~GFLG_Selected;
- GMth.imth_Method=GCLMTH_Render;
- GMth.imth_U.imth_Render.imre_Type=GCLMTHRE_Toggle;
- pOS_DoVirMethodA(cl,pgi,(pOS_Method*)&GMth);
- ret|=GCLMTHR_InputDone | GCLMTHR_AbortIE;
- }
- else if(IE->ie_Code == IECODE_NOBUTTON) {
- SWORD Dx=Pt->X-RefPoint.X;
- SWORD Dy=Pt->Y-RefPoint.Y;
- ULONG NN=0;
- UWORD Pot,NPot;
-
- if(Dx && (pgi->pg_Flags & PRGADF_FreeHoriz)) {
- Dx=RefHorizBor+Dx; Dx=MAX(0,Dx);
- NN=Dx*PRGADCON_MaxPot/(Width-pgi->pg_CWidth+1);
- NN=FELD(NN,0,PRGADCON_MaxPot);
- Pot=pgi->pg_HorizPot;
- pgi->pg_HorizPot=NN;
- NPot=pgi->pg_HorizPot;
- }
- if(Dy && (pgi->pg_Flags & PRGADF_FreeVert)) {
- Dy=RefVertBor+Dy; Dy=MAX(0,Dy);
- NN=Dy*PRGADCON_MaxPot/(Height-pgi->pg_CHeight+1);
- NN=FELD(NN,0,PRGADCON_MaxPot);
- Pot=pgi->pg_VertPot;
- pgi->pg_VertPot=NN;
- NPot=pgi->pg_VertPot;
- }
- if(Pot!=NPot) {
- GMth.imth_Method=GCLMTH_Render;
- GMth.imth_U.imth_Render.imre_Type=GCLMTHRE_Update;
- pOS_DoVirMethodA(cl,pgi,(pOS_Method*)&GMth);
- ret |= GCLMTHR_UpdateGadget;
- }
- }
- }
- }
- break;
-
- // -----
- case GCLMTH_Abort:
- GMth=*mth;
- Gad->gad_Flags &= ~GFLG_Selected;
- pgi->pg_Flags &= ~PRGADF_KnobHit;
- GMth.imth_Method=GCLMTH_Render;
- GMth.imth_U.imth_Render.imre_Type=GCLMTHRE_Toggle;
- pOS_DoVirMethodA(cl,pgi,(pOS_Method*)&GMth);
- ret=GCLMTHR_AbortIE;
- break;
-
- // -----
- case GCLMTH_GoInactive:
- pgi->pg_Flags &= ~PRGADF_KnobHit;
- ret=0;
- break;
-
- // -----
- case GCLMTH_Layout:
- if(mth->imth_U.imth_Layout.imly_Flags & GCLMTHLYF_LD) {
- pOS_CalcGadgetBox(mth->imth_U.imth_Layout.imly_Info->ici_Window,Gad,&Rect);
- pOS_OrRectRegion(&mth->imth_U.imth_Layout.imly_LD->lyd_DamLst,&Rect);
- }
- pOSp_SetLayoutIBox(Gad,mth->imth_U.imth_Layout.imly_IBox);
- if(mth->imth_U.imth_Layout.imly_Flags & GCLMTHLYF_LD) {
- pOS_CalcGadgetBox(mth->imth_U.imth_Layout.imly_Info->ici_Window,Gad,&Rect);
- pOS_OrRectRegion(&mth->imth_U.imth_Layout.imly_LD->lyd_NoErase,&Rect);
- }
- break;
-
-
- default: ret=pOS_DoAbsMethodA(cl,pgi,(pOS_Method*)mth);
- }
-
- return(ret);
- }
-
-
-
-
-
- Drag & Drop
- ------------
-
- Auszug aus einem String-Gadget-Dispatcher:
-
- ...
- ...
- // ----- Erzeugen vom Drag-Objekt, das als Anzeige-Objekt dient.
- case GCLMTH_BeginDrag:
- {
- const pOS_IClassInfo *const GI=mth->imth_U.imth_BDrag.imbd_Info;
- const UWORD *const Pens=GI->ici_DrawInfo->dri_Pens;
- SWORD Dis=GI->ici_DrawInfo->dri_Font->tf_YSize;
-
- sgi->sg_Buffer[sgi->sg_NumChars]='\0'; // *** sicherstellen
- mth->imth_U.imth_BDrag.imbd_Result=pOS_CreateDrag(
- DRAGTAG_LeftEdge, (ULONG)mth->imth_U.imth_BDrag.imbd_AMouse->X-Dis,
- DRAGTAG_TopEdge, (ULONG)mth->imth_U.imth_BDrag.imbd_AMouse->Y-Dis-6,
- DRAGTAG_GadDrag, (ULONG)Gad->gad_Drag,
- DRAGTAG_DeleteRender, TRUE,
- DRAGTAG_Render, (ULONG)pOS_NewGObject(NULL,"itext2.class",0,
- ICLTAG_DrawInfo, (ULONG)GI->ici_DrawInfo,
- IOBJTAG_DrMd, DRMD_Jam2,
- IOBJTAG_BGPen, Pens[SCRPEN_IsSelected],
- IOBJTAG_BGSelPen, Pens[SCRPEN_SelectAble],
- IOBJTAG_FGPen, Pens[SCRPEN_Text],
- IOBJTAG_FGSelPen, Pens[SCRPEN_Text],
- IOBJTAG_StaticString, (ULONG)sgi->sg_Buffer,
- 0),
- 0);
-
- if(mth->imth_U.imth_BDrag.imbd_Result) {
- }
- }
- ret=1;
- break;
-
-
- // ----- Nach dem erfolgreichen Drop wird ein Datenpacket angefordert.
- case GCLMTH_GetQuickDropObject:
- case GCLMTH_GetDropObject:
- {
- pOS_DtTypeAscii DT;
- pOS_DClassInfo DC={pOS_DTFORM_ASCII,NULL,NULL,&DT};
- DT.dtasc_Buffer =sgi->sg_Buffer;
- DT.dtasc_BufSize=sgi->sg_NumChars;
- mth->imth_U.imth_GetQObj.imgqo_Result=
- pOS_CreateDTObjectA(NULL,pOS_DTNAME_ASCII,0,&DC,DCLMTH_Save,NULL);
- ret=1;
- }
- break;
-
-
- // ----- Diesem Gadget wird ein Datenpacket gesendet.
- case GCLMTH_SetDropObject:
- {
- pOS_DtTypeAscii DT;
- pOS_DClassInfo DC={pOS_DTFORM_ASCII,NULL,NULL,&DT};
- DT.dtasc_Buffer =sgi->sg_Buffer;
- DT.dtasc_BufSize=sgi->sg_MaxChars;
- pOS_LoadDTObjectA(mth->imth_U.imth_SetObj.imso_Object,&DC,NULL);
- sgi->sg_NumChars=DC.dci_Result;
- pOSp_StrUpdateData(sgi);
- pOSp_StrGadRefresh(cl,sgi,mth->imth_U.imth_SetObj.imso_Info);
- ret=GCLMTHR_InputDone;
- }
- break;
- ...
- ...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ©proDAD
-