home *** CD-ROM | disk | FTP | other *** search
-
- /*******************************************************************
- $CRT 14 Jan 1997 : hp
-
- $AUT Holger Burkarth
- $DAT >>MultiList.c<< 30 Jan 1997 11:25:29 - (C) ProDAD
- *******************************************************************/
-
- //##ex mcpp:cppc -gs -o pos:pos/Ex/MultiList p:pLib/StartCode.o p:/pOS_RKRM/pIntui/MultiList.c p:pLib/StdIO.o -l pOSStub -l pOS -l CPPList
-
-
- // StormC:StormSys/StormC -g20 -gD -gC -O9 -pp -i p: -i ci: -i cc:include -wEPRTcV p:/pOS_RKRM/pIntui/MultiList.c
- // StormC:StormSys/StormLink p:pLib/StartCode.o p:/pOS_RKRM/pIntui/MultiList.o To pos:pos/Ex/MultiList LIBPATH ram:lib LIB pOSStub pOS CPPList LOG ram:lib/logfile OOP
-
- /***********************************************************
- pOS programing example - Copyright (C) 1995-97 proDAD
-
- This code was written as an easy to understand example,
- how to program pOS features. It is provided 'as-is',
- without any express or implied warranty.
-
- Permission is hereby granted to use, copy and modify
- this source code for any purpose, without fee, subject
- to the following conditions:
-
- (1) This notice may not be removed or altered from any
- source distribution.
-
- (2) Altered source versions must be plainly marked as
- such, and must not be misrepresented as being
- the original source code.
-
- (3) If only executable code is distributed, then the
- accompanying documentation have to state that
- "this software is based in part on examples of
- the pOS developer packet".
-
- (4) Permission for use of this code is granted only
- if the user accepts full responsibility for any
- undesirable consequences. proDAD accept NO LIABILITY
- for damages of any kind.
-
- ©proDAD
- ***********************************************************/
-
- #include <p:pExec/Types.h>
- #include <p:pExec/List.h>
- #include <p:pExec/Memory.h>
- #include <p:Device/Walker.h>
- #include <p:pDOS/ArgTags.h>
- #include <p:pDOS/DosArgs.h>
- #include <p:pDOS/DosBase.h>
- #include <p:pDOS/Files.h>
- #include <p:pDOS/DosSig.h>
- #include <p:pDOS/Lock.h>
- #include <p:pDOS/FIB.h>
- #include <p:pDOS/DosTags.h>
- #include <p:pDOS/Process.h>
- #include <p:pDtType/DtTags.h>
- #include <p:pDtType/Ascii.h>
- #include <p:pDtType/DClass.h>
- #include <p:pDtType/DosObj.h>
- #include <p:pIntui/IObj.h>
- #include <p:pIntui/GClass.h>
- #include <p:pIntui/OClass.h>
- #include <p:pIntui/Tags.h>
- #include <p:pIntui/IntuMsg.h>
- #include <p:pGadget/GadItem.h>
- #include <p:pGadget/Gadget.h>
- #include <p:pScreen/DrawInfo.h>
- #include <p:pScreen/Window.h>
- #include <p:pScreen/Screen.h>
- #include <p:pScreen/ScrTags.h>
- #include <p:proto/pExec2.h>
- #include <p:proto/pIntui2.h>
- #include <p:proto/pDOS2.h>
- #include <p:proto/pList.h>
- #include <p:proto/pLibExt.h>
- #include <p:proto/pDtType2.h>
-
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #include <string.h>
- #include <stdio.h>
-
- #ifdef __cplusplus
- }
- #endif
-
-
- const CHAR *HelpText=
- ""
- ;
-
- const CHAR *PrgHeader=
- "";
-
- const CHAR *PrgVerText=
- "$VER: 1.0 ("__DATE2__") (Copyright 1996-97 by proDAD) (Created by Holger Papajewski)";
-
-
- struct pOS_IntuiDevice *gb_IntuiBase;
- struct pOS_GfxBase *gb_GfxBase;
- struct pOS_DataTypeBase *gb_DtTypeBase;
-
-
-
- /*\
- *** Buffer für das aktuelle Dir
- *** und für die Statusanzeige
- \*/
- #define DIRBUFSIZE (pOS_DosFileName_MAX + pOS_DosPathName_MAX + 16)
- #define STATBUFSIZE 128
- static CHAR DirBuf[DIRBUFSIZE] = "";
- static CHAR StatBuf[STATBUFSIZE] = "Status:";
-
-
- /*\
- *** erweiterte pOS_GadgetItem Struktur
- *** es wird zusätzlich noch der FileName aufgenommen
- \*/
- struct GfxGadItem
- {
- pOS_GadgetItem ggi_GI;
- CHAR ggi_Name[pOS_DosFileName_MAX];
- };
-
-
- /*\
- *** alle wichtigen Pointer & Strukturen
- \*/
- struct DemoData
- {
- pOS_List dd_GfxList; // die Liste des ListViews
- pOS_Window *dd_Win; // Zeiger auf unser Window
- pOS_Gadget *dd_ListGad; // das ListViewGadget
- pOS_Gadget *dd_StatGad; // die TextBox für die Status-Anzeige
-
- pOS_WalkerIO dd_WIO; // der IORequest für den Walker
- };
-
-
-
- /*----------------------------------
- Erzeugt einen neuen Eintrag für das ListView,
- Fügt diesen in die Liste ein und
- Läßt den neuen Eintrag zeichnen
- -----------------------------------*/
- VOID InsertGfx(const pOS_FileLock *dirLk, const pOS_FileInfoBlock *fib,
- pOS_List *list, pOS_Gadget *gad, pOS_Window *win )
- {
- CHAR Buf[64];
-
- const pOS_DrawInfo *Dri = win->win_Screen->scr_DrawInfo;
- pOS_IntuiObj *gfxObj;
- pOS_IntuiObj *nameObj;
- pOS_IntuiObj *sizeObj;
- GfxGadItem *GfxGI;
-
- /*\
- *** IObj für Grafiken erzeugen
- *** Wenn das IGfxObj nicht erzeugt werden kann, dann ist
- *** die Datei kein Bild bzw. keine Animation
- \*/
- gfxObj = (pOS_IntuiObj*)pOS_NewIObject( NULL,"igfx.class",0,
- ICLTAG_DrawInfo, (ULONG)Dri,
- IOGFXTAG_FileName, (ULONG)fib->fib_FileName,
- IOGFXTAG_CurrLock, (ULONG)dirLk,
- TAG_DONE );
-
- if( gfxObj ) {
- /*\
- *** Speicher für neuen Listeneintrag
- \*/
- GfxGI = (GfxGadItem*)pOS_AllocMem(sizeof(GfxGadItem),MEMF_CLEAR);
-
- if( GfxGI ) {
- /*\
- *** FileNamen in unseren GadItem kopieren
- \*/
- strcpy( GfxGI->ggi_Name, fib->fib_FileName );
-
- /*\
- *** IObj für den Namen und die Größe erzeugen
- \*/
- nameObj = (pOS_IntuiObj*)pOS_NewIObject( NULL, "itext.class", 0,
- ICLTAG_DrawInfo, (ULONG)Dri,
- IOBJTAG_StaticString, (ULONG)GfxGI->ggi_Name,
- TAG_DONE );
-
- pOS_SPrintf( Buf, "Size:%ld", fib->fib_Size );
- sizeObj = (pOS_IntuiObj*)pOS_NewIObject( NULL, "itext.class", 0,
- ICLTAG_DrawInfo, (ULONG)Dri,
- IOBJTAG_String, (ULONG)Buf,
- TAG_DONE );
-
- if( nameObj && sizeObj ) {
-
- /*\
- *** Die drei IObj. sollen nebeneinander in der Liste angezeigt werden
- *** dazu müssen wir sie nur miteinander verketten und dann
- *** im GadgetItem->gdt_Render eintragen
- ***
- *** gfxObj -> nameObj -> sizeObj
- \*/
-
- nameObj->iobj_Next = sizeObj;
- gfxObj->iobj_Next = nameObj;
- GfxGI->ggi_GI.gdt_Render = gfxObj;
-
- /*\
- *** GadItem in Liste einfügen &
- *** der Liste anzeigen, daß neue Einträge hinzugekommen sind
- *** (LVGADTAG_HasNewNodes)
- *** neuen Eintrag zeichen lassen (LVGADTAG_RedrawItem)
- \*/
- pOS_LockIntuiGadget(win); // *** WICHTIG
- pOS_ListAddTail( list, &GfxGI->ggi_GI.gdt_Node );
- pOS_SetGadgetAttrs( win, gad,
- LVGADTAG_HasNewNodes, TRUE,
- LVGADTAG_RedrawItem, (ULONG)GfxGI, TAG_DONE );
- pOS_UnlockIntuiGadget(win);
- }
- else {
- pOS_DisposeIObject( gfxObj );
- if( sizeObj ) pOS_DisposeIObject( sizeObj );
- if( nameObj ) pOS_DisposeIObject( nameObj );
- if( GfxGI ) pOS_FreeMem( GfxGI, sizeof(GfxGadItem));
- }
- }
- else pOS_DisposeIObject( gfxObj );
- }
- }
-
-
-
- /*----------------------------------
- Löschen der Liste des ListView-Gadgets
- -----------------------------------*/
- VOID DeleteGfxList( pOS_List *list, pOS_Gadget *gad, pOS_Window *win )
- {
- GfxGadItem *Succ,*GfxGI;
-
- /*\
- *** gesamte Liste durchlaufen
- *** ACHTUNG der Nachfolger muß ermittelt werden, bevor
- *** der aktuelle Eintrag gelöscht wird
- \*/
- GfxGI = (GfxGadItem*)list->lh_Head;
- while( Succ = (GfxGadItem*)GfxGI->ggi_GI.gdt_Node.ln_Succ ) {
-
- /*\
- *** Falls das Fenster geöffnet ist - aktuelle Eintrag als ungültig
- *** markieren
- \*/
- if( gad && win )
- pOS_SetGadgetAttrs( win, gad, LVGADTAG_InvalidItem, (ULONG)GfxGI, TAG_DONE );
-
- /*\
- *** aktuellen Eintrag aus der Liste entfernen
- *** verkettete Liste mit IObjekten löschen
- *** Speicher des GadItem freigeben
- *** und zum Nächsten
- \*/
- pOS_ListRemove( &GfxGI->ggi_GI.gdt_Node );
- pOS_IObjDisposeList( GfxGI->ggi_GI.gdt_Render );
- pOS_FreeMem( GfxGI, sizeof(GfxGadItem));
- GfxGI = Succ;
- }
-
- /*\
- *** falls das Fenster geöffnet ist - Liste nun neuzeichnen
- *** sowie die Vorberechnung der Spaltenbreite zurücksetzen
- \*/
- if( gad && win ) {
- pOS_SetGadgetAttrs( win, gad, LVGADTAG_ResetKetArray, TRUE, TAG_DONE );
- pOS_RefreshGadgets( win, gad, 1 );
- }
- }
-
-
-
-
- /*----------------------------------
- Asynchrone ScanRoutine - wird mit Hilfe des Walker.device gestartet
- Fügt das übergebene Bild bzw. alle Bilder des Verzeichnisses ein
- -----------------------------------*/
- VOID WalkerScanGfxDir(_R_A1 pOS_WalkerIO *wio )
- {
- /*\
- *** im UserData[0] des pOS_WalkerIO befindet sich ein Pointer
- *** auf unsere Daten
- \*/
- pOS_List *list = &((DemoData*)wio->wio_UserData[0])->dd_GfxList;
- pOS_Gadget *gad = ((DemoData*)wio->wio_UserData[0])->dd_ListGad;
- pOS_Gadget *stat = ((DemoData*)wio->wio_UserData[0])->dd_StatGad;
- pOS_Window *win = ((DemoData*)wio->wio_UserData[0])->dd_Win;
-
- pOS_FileInfoBlock *FIB;
- pOS_FileLock *DirLk;
- BOOL Abort = FALSE;
-
- /*\
- *** FileInfoBlock erzeugen
- *** ACHTUNG: der FIB muß über pOS_AllocDosObject erzeugt werden
- \*/
- if( FIB = (pOS_FileInfoBlock*)pOS_AllocDosObject( DOSOBJ_FIB, 0 )) {
- if( DirLk = pOS_LockObject( NULL, DirBuf, FILELKACC_Shared )) {
- if( pOS_ExamineObject( DirLk, FIB )) {
- if( FIB->fib_DirEntryType == FINFENTYP_Dir ) {
- while( pOS_ExNextObject( DirLk, FIB )) {
- if( FIB->fib_DirEntryType == FINFENTYP_File ) {
- pOS_SPrintf( StatBuf, "Status: Insert '%s' ",
- FIB->fib_FileName );
- pOS_RefreshGadgetsMd( win, stat, 1, GCLMTHRE_Update );
-
- InsertGfx( DirLk, FIB, list, gad, win );
- }
-
- /*\
- *** DOSSIGF_CTRL_C regelmäßig abfragen
- *** sollte das Hauptprogramm ein AbortIO auslösen - bekommen wir
- *** ein CTRL C
- *** die Arbeit sollte dann so schnell wie nur möglich eingestellt
- *** werden
- \*/
- if( pOS_SetSignal(0,DOSSIGF_CTRL_C) & DOSSIGF_CTRL_C) {
- Abort = TRUE;
- break;
- }
- }
- }
- else {
- pOS_FileLock *Lk = pOS_ParentObjectDir(DirLk);
-
- if( Lk ) {
- pOS_SPrintf( StatBuf, "Status: Insert '%s' ",
- FIB->fib_FileName );
- pOS_RefreshGadgetsMd( win, stat, 1, GCLMTHRE_Update );
-
- InsertGfx( Lk, FIB, list, gad, win );
-
- pOS_UnlockObject( Lk );
- }
- }
- }
- pOS_UnlockObject( DirLk );
- }
- pOS_FreeDosObject(DOSOBJ_FIB,FIB);
- }
-
- strcpy( StatBuf, Abort ? "Status: Break" : "Status: Ready " );
- pOS_RefreshGadgetsMd( win, stat, 1, GCLMTHRE_Update );
- }
-
-
- /*----------------------------------
- Walker.device öffnen und IO vorbereiten
- -----------------------------------*/
- BOOL OpenWalker( DemoData *dData )
- {
- BOOL res=FALSE;
-
- /*\
- *** pOS_WalkerIO initialisieren
- *** Begin_func ist unsere Funktion, die asynch. ausgeführt werden soll
- *** Abort_func wird bei einem AbortIO aufgerufen - nicht benötigt
- *** in UserData[0] kommt der Pointer auf unsere Daten
- *** UserData[1] benutzen wir, um uns zu merken, ob der Walker
- *** gestartet wurde
- \*/
- dData->dd_WIO.wio_StackSize = 8*1024;
- dData->dd_WIO.wio_Begin_func = WalkerScanGfxDir;
- dData->dd_WIO.wio_Abort_func = NULL;
- dData->dd_WIO.wio_UserData[0]= (ULONG)dData;
- dData->dd_WIO.wio_UserData[1]= FALSE;
-
- /*\
- *** Device öffnen und restliche Werte in IO setzen
- *** als ReplyPort können wir unseren ProcessPort benutzen
- *** Command ist CMD_WRITE
- \*/
- if(pOS_OpenDevice("walker.device",0,(pOS_IORequest*)&dData->dd_WIO,0,0)==0) {
- dData->dd_WIO.wio_Message.mn_ReplyPort =
- &((pOS_Process*)pOS_FindTask(NULL))->pr_MsgPort;
- dData->dd_WIO.wio_Command = CMD_WRITE;
- dData->dd_WIO.wio_Flags = 0;
-
- res = TRUE;
- }
- else printf("Cannot Open Walker.device\n");
-
- return(res);
- }
-
-
- /*----------------------------------
- Startet die Walker-Routine
- Diese wird nun asynchron ausgeführt
- -----------------------------------*/
- VOID StartWalker( pOS_WalkerIO *io )
- {
- /*\
- *** der IO kann immer wieder versendet werden, ohne die Daten
- *** neu zu setzen, da ein Device nur den Error-Wert setzen darf
- \*/
- pOS_SendIO((pOS_IORequest*)io );
- if( io->wio_Error == 0 )
- io->wio_UserData[1] = TRUE; // alles Ok - die Routine läuft
- }
-
-
- /*----------------------------------
- Asynchone Walker-Routine abbrechen
- -----------------------------------*/
- VOID StopWalker( pOS_WalkerIO *io )
- {
- /*\
- *** Routine abbrechen und Message vom Port entfernen (pOS_WaitIO)
- *** Sollte die Routine schon beendet sein, so wird nur die
- *** Nachricht vom Port entfernt
- \*/
- if( io->wio_UserData[1] ) {
- pOS_AbortIO((pOS_IORequest*)io);
- pOS_WaitIO((pOS_IORequest*)io);
-
- io->wio_UserData[1] = FALSE; // Walker läuft nicht
- }
- }
-
-
-
-
-
- /*----------------------------------
- Auf Drop reagieren
- Mit Hilfe des ASCII-Datatypes wird der Name des DOSObjs ermittelt
- Die Liste wird dann gelöscht & der Walker wird gestartet
- -----------------------------------*/
- VOID HandleDD( const pOS_IEDragDrop *iedd, DemoData *dData )
- {
- pOS_DtTypeAscii DT;
- pOS_DClassInfo DC={pOS_DTFORM_ASCII,NULL,DCLINFOF_None,&DT};
- pOS_DCLASSINFO(&DC);
-
- /*\
- *** Zuerst alten Walker-Process beenden
- \*/
- StopWalker( &dData->dd_WIO );
-
- /*\
- *** Name des DOSObjs vom Datatype ermitteln
- \*/
- DT.dtasc_Buffer = DirBuf;
- DT.dtasc_BufSize= DIRBUFSIZE;
- if(pOS_LoadDTObjectA(iedd->iedd_Object,&DC,NULL)) {
-
- if( DC.dci_Result > 0 ) {
- DirBuf[DC.dci_Result]='\0';
-
- /*\
- *** aktuelle Liste löschen und neuen WindowTitel setzen
- \*/
- DeleteGfxList(&dData->dd_GfxList,dData->dd_ListGad,dData->dd_Win);
- pOS_SetWindowTitles( dData->dd_Win, DirBuf, (CHAR*)~0 );
-
- /*\
- *** Walker-Routine wieder starten - neu Einscannen
- *** StartWalker & StopWalker können beliebig oft wiederholt werden
- \*/
- StartWalker( &dData->dd_WIO );
- }
- }
- }
-
-
-
- /*----------------------------------
- Auf Drag-Anforderung reagieren
- Es wird ein DosObjekt erzeugt und zurückgegeben
- -----------------------------------*/
- pOS_DataType *MakeDDObject( DemoData *dData )
- {
- pOS_DataType *DtObj=NULL;
- GfxGadItem *GfxGI=NULL;
- pOS_FileLock *DirLk = pOS_LockObject(NULL,DirBuf,FILELKACC_Shared);
-
- pOS_GetGadgetAttr(dData->dd_Win,dData->dd_ListGad,
- LVGADTAG_DragItem, (ULONG*)&GfxGI );
-
- if( GfxGI && DirLk ) {
- pOS_FileInfoBlock *FIB=(pOS_FileInfoBlock*)pOS_AllocDosObject(DOSOBJ_FIB,0);
-
- if( FIB ) {
- if( pOS_ExamineObject(DirLk,FIB)) {
- if( FIB->fib_DirEntryType == FINFENTYP_File ) {
- pOS_FileLock *Parent = pOS_ParentObjectDir( DirLk );
- pOS_UnlockObject( DirLk );
- DirLk = Parent;
- }
- }
- pOS_FreeDosObject(DOSOBJ_FIB,FIB);
- }
-
- DtObj = (pOS_DataType*)pOS_NewIObject(NULL, pOS_DTNAME_DOSOBJ, 0,
- DOSOBJTAG_Name, (ULONG)GfxGI->ggi_Name,
- DOSOBJTAG_Lock, (ULONG)DirLk,
- TAG_DONE );
- }
-
- if( DirLk )
- pOS_UnlockObject( DirLk );
-
- return(DtObj);
- }
-
-
-
-
- /*----------------------------------
- Startet GfxView, um das Bild anzuzeigen
- GfxView wird asynch. mit Hilfe der Funktion pOS_System gestartet
- -----------------------------------*/
- VOID StartViewer( const CHAR *dir, pOS_Gadget *gad, pOS_Window *win )
- {
- /*\
- *** Buffer zum erzeugen des Befehls allokieren &
- *** Lock auf das BildVerzeichnis holen
- \*/
- CHAR *Buf = (UBYTE*)pOS_AllocMem( 1024, MEMF_ANY );
- pOS_FileLock *CurLk = pOS_LockObject( NULL, dir, FILELKACC_Shared );
- GfxGadItem *GfxGI = NULL;
-
- /*\
- *** selektieren Item aus der Liste ermitteln
- \*/
- pOS_GetGadgetAttr( win, gad, LVGADTAG_SelectItem, (ULONG*)&GfxGI );
-
- if( GfxGI && CurLk && Buf) {
- pOS_FileInfoBlock *FIB=(pOS_FileInfoBlock*)pOS_AllocDosObject(DOSOBJ_FIB,0);
-
- if( FIB ) {
- if( pOS_ExamineObject(CurLk,FIB)) {
- if( FIB->fib_DirEntryType == FINFENTYP_File ) {
- pOS_FileLock *Parent = pOS_ParentObjectDir( CurLk );
- pOS_UnlockObject( CurLk );
- CurLk = Parent;
- }
- }
- pOS_FreeDosObject(DOSOBJ_FIB,FIB);
- }
-
- /*\
- *** Befehl im Buffer aufbereiten & mit pOS_System starten
- *** der Lock auf das BildVerzeichnis wird als CurrentDir-Lock
- *** für den neuen Process übergeben. Da der Befehl asynch. ausgeführt
- *** wird dürfen wir den Lock nicht wieder freigeben. Diese Aufgabe
- *** hat pOS, wenn GfxView beendet wird. Dazu muß allerdings von uns
- *** das PROCF_FreeCurrDir Flag gesetzt werden.
- \*/
-
- pOS_SPrintf( Buf, "Sys:Ex/GfxView \"%s\"", GfxGI->ggi_Name );
- pOS_System( Buf,
- DOSTAG_CurrDirLock, (ULONG)CurLk,
- DOSTAG_ProcFlags, PROCF_FreeCurrDir,
- DOSTAG_Synchronous, FALSE,
- DOSTAG_CrtHomeShell, TRUE, // erzeuge Shell-Umgebung
- TAG_DONE);
- }
- else {
- if( CurLk ) pOS_UnlockObject( CurLk );
- }
-
- if( Buf ) pOS_FreeMem( Buf, 1024 );
- }
-
-
-
-
-
- #ifdef __cplusplus
- extern "C"
- #endif
-
- void main( void )
- {
- ULONG Ops[1] = {(ULONG)"Sys:Games/Stones"};
- pOS_DosArgs *Args;
-
- gb_IntuiBase=(struct pOS_IntuiDevice*)pOS_OpenLibrary("pintui.library",0);
- gb_GfxBase=(struct pOS_GfxBase*)pOS_OpenLibrary("pgraphics.library",0);
- gb_DtTypeBase=(struct pOS_DataTypeBase*)pOS_OpenLibrary("pDtType.library",0);
-
- /*\
- *** Argumente lesen
- *** Default-Werte werden vorher im Array abgelegt
- \*/
- Args=pOS_ReadDosArgs( "Dir",Ops,sizeof(Ops)/sizeof(ULONG),
- ARGTAG_PrgHeaderText, (ULONG)PrgHeader, /* kurze Programm-Beschreibung */
- ARGTAG_HelpText, (ULONG)HelpText, /* Help-Texte */
- ARGTAG_PrgVerText, (ULONG)PrgVerText, /* VER-String */
- TAG_END);
-
- if( Args ) {
- pOS_Screen *Scr;
-
- strcpy(DirBuf,(CHAR*)Ops[0]);
-
- /*\
- *** Pointer auf Screen ermitteln
- \*/
- if( Scr = pOS_LockPubScreen("Workbench")) {
- const pOS_DrawInfo *Dri = Scr->scr_DrawInfo;
- pOS_Gadget *GrpGad;
- DemoData DData;
-
- memset( &DData, 0, sizeof(DData));
- /*\
- *** die leere Liste initialisieren &
- *** das ListView Gadget erzeugen
- ***
- *** StandardDrop, AddDropAttName - wir können DOSObj. empfangen
- *** StandardDrag, AddDragAttName - wir können DOSObj. versenden
- *** RelVerify - bei Doppelklick IDCMP_GadgetUp Message
- *** List - das ist unsere noch leere Liste
- *** CursorSelect - Items können mit den Cursortasten angewählt werden
- *** VAutoGad, HAutoGad - Scroller werder von der Liste erzeugt
- *** HAutoKt - die Verkettung der IObj. soll beachtet werden,
- *** muß für eine mehrspaltige Liste gesetzt werden
- ***
- \*/
- pOS_ListInit( &DData.dd_GfxList );
- if( DData.dd_ListGad = (pOS_Gadget*)pOS_NewIObject( NULL,
- Dri->dri_Names[SCRNAM_GLVClass], 0,
- ICLTAG_DrawInfo, (ULONG)Dri,
- ICLTAG_Gwk, 1,
- ICLTAG_StandardDrop, TRUE,
- ICLTAG_AddDropAttName, (ULONG)"#?dosobj/#?",
- ICLTAG_StandardDrag, TRUE,
- ICLTAG_AddDragAttName, (ULONG)"/dosobj/",
- ICLTAG_RelVerify, TRUE,
- LVGADTAG_Space, 3,
- LVGADTAG_List, (ULONG)&DData.dd_GfxList,
- LVGADTAG_CursorSelect, TRUE,
- LVGADTAG_MultiSelect, TRUE,
- LVGADTAG_VAutoGad, TRUE,
- LVGADTAG_HAutoGad, TRUE,
- LVGADTAG_HAutoKt, TRUE,
- LVGADTAG_Key1, TRUE,
- LVGADTAG_CR, TRUE,
- TAG_DONE)) {
-
- /*\
- *** GroupGadget erzeugen
- *** das AutoSizeGadget für das Window MUSS IMMER eine Gruppe sein
- *** ICLTAG_AutoDelete == TRUE - Gadget wird beim Schließen des Fensters
- *** automatisch gelöscht
- *** die Gruppe löscht ebenfalls alle ihre Members
- \*/
- if( GrpGad = (pOS_Gadget*)pOS_NewIObject( NULL,
- Dri->dri_Names[SCRNAM_GGroupClass], 0,
- ICLTAG_DrawInfo, (ULONG)Dri,
- ICLTAG_AutoDelete, TRUE,
- GRPGADTAG_BorLeft, 4,
- GRPGADTAG_BorTop, 4,
- GRPGADTAG_BorRight, 4,
- GRPGADTAG_BorBottom, 4,
- GRPGADTAG_AddGadget, (ULONG)DData.dd_ListGad,
- TAG_DONE )) {
-
- /*\
- *** StatusGadget für den unteren WindowRand erzeugen
- *** zuerst lassem wir uns den Dimensionen des Fensterrandes berechnen
- *** die X-Position und die Breite des Gadget werden relativ zu den
- *** Fensterdimensionen angegeben. Das Gadget wird später alle
- *** Größenänderungen des Fensters mitmachen.
- \*/
- pOS_WBox Box;
- pOS_GetWindowBorder( Scr, &Box,
- WINFLGF_SizeBBottom | WINFLGF_SizeBRight,
- GFLG_RelWidth | GFLG_RelBottom, GACT_BottomBorder);
-
- DData.dd_StatGad = (pOS_Gadget*)pOS_NewIObject( NULL,
- Dri->dri_Names[SCRNAM_GTxtBoxClass], 0,
- ICLTAG_DrawInfo, (ULONG)Dri,
- ICLTAG_GadBorderType, 0,
- ICLTAG_AutoDelete, TRUE,
- ICLTAG_Left, Box.Left+3,
- ICLTAG_RelBottom, Box.Top+2,
- ICLTAG_RelWidth, Box.Width-6,
- ICLTAG_Height, Box.Height-4,
- ICLTAG_BottomBorder, TRUE,
- ICLTAG_RenderLayMode, IOBLAY_Left,
- IOBJTAG_StaticString, (ULONG)StatBuf,
- TAG_DONE);
-
- /*\
- *** Fenster öffnen
- *** die Gruppe mit dem ListView wird per SCRTAG_AutoSizeGadget übergeben
- *** das StatusGadget (im FensterRand) per SCRTAG_Gadget
- \*/
- if( DData.dd_Win = pOS_OpenWindow(
- SCRTAG_Title, (ULONG)DirBuf,
- SCRTAG_Screen, (ULONG)Scr,
- SCRTAG_Flags, WINFLGF_DepthGadget | WINFLGF_SimpleRefresh |
- WINFLGF_Activate | WINFLGF_CloseGadget |
- WINFLGF_Dragbar | WINFLGF_SizeBBottom |
- WINFLGF_SizeGadget,
- SCRTAG_IDCMP, IDCMP_CloseWindow | IDCMP_StdSysMsg,
- SCRTAG_AutoSizeGadget, (ULONG)GrpGad,
- SCRTAG_Gadget, (ULONG)DData.dd_StatGad,
- SCRTAG_Height, 200,
- SCRTAG_UnderMouse, TRUE,
- TAG_DONE )) {
-
-
- pOS_SetWindowTask( DData.dd_Win, pOS_FindTask(NULL),
- 1, 0 );
- /*\
- *** Walker.device öffnen
- \*/
- if( OpenWalker( &DData )) {
-
- pOS_IntuiMessage *Msg;
- BOOL Run=TRUE;
- ULONG WinSig = 1L<<DData.dd_Win->win_UserPort->mp_SigBit;
- ULONG SigMask = DOSSIGF_CTRL_C | WinSig;
- ULONG Sig;
-
- /*\
- *** asynchronen Scanvorgang starten
- \*/
- StartWalker( &DData.dd_WIO );
-
- while( Run ) {
- Sig = pOS_WaitSignal( SigMask );
-
- /*\
- *** CTRL C -- Programm sofort beenden
- \*/
- if( Sig & DOSSIGF_CTRL_C ) Run = FALSE;
-
- /*\
- *** Messages vom Fenster auswerten
- \*/
- if( Sig & WinSig ) {
-
- while( Msg=(pOS_IntuiMessage*)pOS_GetMsg(DData.dd_Win->win_UserPort)) {
- switch( Msg->im_Class ) {
- // -----
- case IDCMP_CloseWindow:
- Run = FALSE;
- break;
- // -----
- case IDCMP_DragDrop:
- {
- pOS_IEDragDrop *DD = &((pOS_ISMDrop*)Msg->im_Data)->ismd_IEDD;
-
- if( Msg->im_Code == IECODE_DROP_WORK &&
- DD->iedd_Dst.iedd_Gadget == DData.dd_ListGad ) {
-
- HandleDD( DD, &DData );
- }
- else if( Msg->im_Code == IECODE_DROP_FIRST ) {
- /*\
- *** Wir werden aufgefordert, ein Drag-Objekt zu erzeugen.
- *** Das erzeugte Objekt ist in die pOS_IEDragDrop Struktur
- *** einzutragen. Der Code IECODE_DROP_REPLAYWORK macht das Objekt
- *** gültig. Danach darf pOS_SysIMessage() NICHT mehr aufgerufen werden.
- ***
- *** Sollte man die Message nicht verarbeiten können, bzw das DtObjekt
- *** nicht erzeugen können, sollte die Message an pOS_SysIMessage()
- *** weitergegeben werden, um dem Gadget die Chance zu geben, selber
- *** ein Objekt zu erzeugen.
- \*/
- if(DD->iedd_Src.iedd_Gadget == DData.dd_ListGad) {
- if( DD->iedd_Object = MakeDDObject(&DData))
- Msg->im_Code = IECODE_DROP_REPLYWORK;
- }
-
- if( Msg->im_Code == IECODE_DROP_FIRST )
- if(pOS_SysIMessage(Msg))
- Msg = NULL;
- }
- }
- break;
- // -----
- case IDCMP_GadgetUp:
- if( Msg->im_IAddress == DData.dd_ListGad )
- StartViewer( DirBuf, DData.dd_ListGad, DData.dd_Win );
- break;
- // -----
- /*\
- *** IDCMP Message an das System weiterleiten
- *** wenn sie dort verarbeitet werden kann, wird sie auch
- *** replyed - wir müssen die Message beantworten, falls
- *** pOS_SysIMessage() FALSE zurückgibt
- \*/
- default:
- if( pOS_SysIMessage(Msg))
- Msg=NULL;
- break;
- }
- if( Msg ) pOS_ReplyMsg((pOS_Message*)Msg);
- }
- }
- }
-
- /*\
- *** Walker anhalten und Device schließen
- *** Fenster schließen - da bei den Gadget das AutoDelete-Tag gesetzt
- *** war, werden diese nun auch automatisch gelöscht
- \*/
- StopWalker( &DData.dd_WIO );
- pOS_CloseDevice((pOS_IORequest*)&DData.dd_WIO);
- }
- pOS_CloseWindow( DData.dd_Win );
-
- DeleteGfxList( &DData.dd_GfxList, NULL, NULL );
- }
- else {
- printf("Cannot Open Window\n");
- pOS_DisposeIObject( GrpGad );
- }
- }
- else {
- printf("Cannot Create Group Object\n");
- pOS_DisposeIObject( DData.dd_ListGad );
- }
- }
- else printf("Cannot Create List Object\n");
-
- pOS_UnlockPubScreen( Scr );
- }
- else printf("Cannot Lock PubScreen\n");
-
- pOS_DeleteDosArgs( Args );
- }
-
- pOS_CloseLibrary((pOS_Library*)gb_GfxBase);
- pOS_CloseLibrary((pOS_Library*)gb_IntuiBase);
- pOS_CloseLibrary((pOS_Library*)gb_DtTypeBase);
- }
-