/* ------------------------------------------------------------------- * * Module Version : 1.20 * * Module Date : 21-05-94 * * Last Change : 21-05-94 * * Author : Andrea Pietsch * * Programming Language : Pure-C * * Copyright : (c) 1994, Andrea Pietsch, 56727 Mayen * * ------------------------------------------------------------------- */ #include #include #include #include /* ------------------------------------------------------------------- */ #include "demo.h" #include "demo.rh" #include "demo.rsh" /* ------------------------------------------------------------------- */ #pragma warn -par /* ------------------------------------------------------------------- */ #define PRG_NAME "SysGem-Demo" #define PRG_ID 'DEMO' #define ACC_NAME "" #define USR_NAME "Andreas Pietsch" #define USR_ID 'ANPI' #define USR_KEY 0L /* ------------------------------------------------------------------- */ #define ASK_TERM "[2][ Wollen Sie das Demo | wirklich verlassen? ][ [Nein | [Ja ]" #define NO_DRAG "[1][ Auf dieses Fenster k”nnen | Sie keine Objekte ziehen! ][ [Abbruch ]" /* ------------------------------------------------------------------- */ PARAMETER par; LONG win_id = 'TX00'; INT pop = 1; BYTE slid_txt [20][33]; /* Textbuffer fr die Sliderbox */ /* ------------------------------------------------------------------- */ VOID LoadText ( BYTE *fname ); /* ------------------------------------------------------------------- */ #define rsc_main rs_trindex [MAIN] #define rsc_menu rs_trindex [MENUE1] #define rsc_info rs_trindex [SGINFO] #define rsc_bits rs_trindex [BITS] #define rsc_tool rs_trindex [TOOLS] #define rsc_pop rs_trindex [SPOPUP] #define rsc_edit rs_trindex [SEDIT] /* ------------------------------------------------------------------- * Zeichnet die "Uhr" im Fenster jede Sekunde * ------------------------------------------------------------------- */ VOID draw_bits ( VOID ) { LOCAL LONG zeit = 0L; LOCAL BYTE s [10]; zeit++; sprintf ( s, "%5ld", zeit ); SetText ( rsc_bits, BI_SEC, s ); RedrawObj ( rsc_bits, BI_SEC, 0, NONE, UPD_STATE ); } /* ------------------------------------------------------------------- * Behandelt die Aktivit„ten des "Uhren"-Fensters. Wenn das Fenster * ausgeblendet oder Iconifiziert wird, mssen die Timer-Funktion * ausgeschaltet werden. * ------------------------------------------------------------------- */ INT handle_bits ( INT msg, INT button, DIALOG_INFO *inf ) { switch ( msg ) { case SG_START : SetText ( rsc_bits, BI_SEC, "" ); SetProcTimer ( draw_bits ); SetTimer ( 700, 0 ); break; case SG_INVISIBLE : SetTimer ( 0, 0 ); break; case SG_VISIBLE : SetTimer ( 700, 0 ); break; case SG_QUIT : case SG_END : SetTimer ( 0, 0 ); return ( SG_CLOSE ); } return ( SG_CONT ); } /* ------------------------------------------------------------------- * Wertet Nachrichten von SysInfo aus. * ------------------------------------------------------------------- */ LONG GetMessage ( BYTE msg, BYTE sub, LONG from, LONG parm ) { if ( from == 'SINF' ) { if (( msg == MSG_SYSTEM ) || ( msg == MSG_OPEN )) { if (( sub == 1 ) && ( parm == 'SIAG' )) { LoadText ( "C:\\CLIPBRD\\SCRAP.TXT" ); } if ( sub == 0 ) Alert ( ALERT_NORM, 1, "[1][ Irgendwas ist schiefgegangen! ][ [Aha ]" ); } } return ( 0L ); } /* ------------------------------------------------------------------- * Ruft die Funktionen von SysInfo auf * ------------------------------------------------------------------- */ VOID SysInfo ( LONG todo ) { if ( ProgramExist ( 'SINF' ) == -1 ) { Alert ( ALERT_NORM, 1, "[1][ SysInfo ist (noch) nicht | installiert! ][ [Ok ]" ); return; } if ( todo == 'SIAG' ) SendSgMsg ( MSG_SYSTEM, 4, 'SINF', 0L ); else SendSgMsg ( MSG_OPEN, 0, 'SINF', todo ); } /* ------------------------------------------------------------------- * Soll ein Fensterdialog ge”ffnet werden und steht kein Fenster mehr * zur Verfgung, so kann der Dialog entweder abgebrochen (DIAL_ABORT) * werden, oder als "normale" Dialogbox weitergefhrt werden. * ------------------------------------------------------------------- */ LOCAL INT no_window_left ( VOID ) { if ( Alert ( ALERT_NORM, 1, "[4][ Kein Fenster mehr frei! | M”chten Sie mit einer | Dialogbox weiterarbeiten? ][ [Ja | [Nein ]" ) == 1 ) { return ( SG_CONT ); } return ( SG_ABORT ); } /* ------------------------------------------------------------------- * Mit Hilfe von einer solchen Funktion, k”nnen ohne Probleme bestimmte * Werte oder Zust„nde in einem Dialog geprft werden. * * ed ist dabei die positive Nummer des Editfeldes, wenn der Cursor das * Feld verlassen soll, negativ, wenn der Cursor das Feld betritt. * * Id ist die Id, die bei WindowDialog angegeben wurde. So kann man eine * Routine zum Testen mehrerer Dialoge verwenden. * * * Rckgabe: -1 Der Cursor soll im Feld bleiben * 0 Cursor wurde mittels SetEditField schon gesetzt * 1 ok. Weitermachen! * ------------------------------------------------------------------- */ LOCAL INT check_range ( OBJECT *tree, INT ed, LONG id ) { BYTE s [100]; INT i; if ( tree == rsc_edit ) { if ( ed > 0 ) { GetText ( rsc_edit, ed, s ); i = atoi ( s ); switch ( ed ) { case SE_Z50_100 : if (( i < 50 ) || ( i > 100 )) { Alert ( ALERT_NORM, 1, "[1][ Die Zahl soll zwischen | 50..100 liegen! ][ [Nochmal ]" ); return ( -1 ); } break; case SE_Z90_200 : if (( i < 90 ) || ( i > 200 )) { Alert ( ALERT_NORM, 1, "[1][ Die Zahl soll zwischen | 90..200 liegen! ][ [Nochmal ]" ); return ( -1 ); } break; case SE_Z99_101 : if (( i < 99 ) || ( i > 101 )) { Alert ( ALERT_NORM, 1, "[1][ Die Zahl soll zwischen | 99..101 liegen! ][ [Nochmal ]" ); return ( -1 ); } break; } } } return ( 1 ); } /* ------------------------------------------------------------------- * Behandelt alle Aktionen w„rend einem Dialog. * * SG_NOWIN Kein Fenster mehr da. SG_CONT bedeutet, als Dialog * darstellen --> ist wichtig! * * SG_START Der Dialog wird gleich gezeichnet. Hier ist Zeit fr * eine eventuelle Initialisierung des Dialogs, Buttons, * Editfelder etc... * * SG_END Dialog soll geschlossen werden. button enth„lt das * Objekt, den der Benutzer gew„hlt hat. * * SG_QUIT wird nach dem Schliessen aufgerufen. Evtl. Speicher * sollte hier freigegeben werden. * * SG_DRAGDROP Der User hat Objekte auf das Fenster gezogen. Ob Sie die * Nachricht auswerten oder nicht, liegt allein bei Ihnen. * ------------------------------------------------------------------- */ LOCAL INT handle_edit ( INT msg, INT button, DIALOG_INFO *inf ) { switch ( msg ) { case SG_NOWIN : return (( no_window_left ())); case SG_START : ClearEditFields ( rsc_edit ); SetReturn ( TRUE ); SetFieldProc ( check_range ); SetText ( rsc_edit, SE_Z50_100, "20" ); SetText ( rsc_edit, SE_Z90_200, "100" ); SetText ( rsc_edit, SE_Z99_101, "100" ); break; case SG_END : switch ( button ) { case SE_CLR : ClearEditFields ( rsc_edit ); SetEditField ( rsc_edit, SE_Z50_100 ); SetText ( rsc_edit, SE_Z50_100, "20" ); SetText ( rsc_edit, SE_Z90_200, "100" ); SetText ( rsc_edit, SE_Z99_101, "100" ); return ( SG_REDRAW ); default : return ( SG_CLOSE ); } case SG_QUIT : break; case SG_DRAGDROP : Alert ( ALERT_NORM, 1, "[1][ Drag & Drop Aktionen | in dieses Fenster | sind nicht m”glich! ][ [Abbruch ]" ); break; } return ( SG_CONT ); } /* ------------------------------------------------------------------- * Verwaltet die Textfenster. Beim Klick ins Fenster k”nnen die Stati * der Zeile eingestellt werden (SG_.CLICK), oder beim Klick in die * Toolbar wird sortiert (SG_BUTTON). * ------------------------------------------------------------------- */ INT handle_text ( INT msg, WINDOW_INFO *inf ) { BYTE s [200]; switch ( msg ) { case SG_END : return ( SG_CLOSE ); case SG_BUTTON : if ( inf->obj_id == 'TOOL' ) { switch ( inf->item ) { case TO_SORT : switch ( Alert ( ALERT_NORM, 3, "[2][ Wie soll sortiert werden? ][ [Auf | A[b | [Nix ]" )) { case 1 : do_qsort ( inf->id, cmp_strings_up ); break; case 2 : do_qsort ( inf->id, cmp_strings_dn ); default : break; } break; default : break; } } break; case SG_KEY : switch ( inf->key ) { case 0x4800 : ScrollWindow ( inf->handle, SCROLL_UP ); break; case 0x4b00 : ScrollWindow ( inf->handle, SCROLL_LEFT ); break; case 0x5000 : ScrollWindow ( inf->handle, SCROLL_DOWN ); break; case 0x4d00 : ScrollWindow ( inf->handle, SCROLL_RIGHT ); break; case 0x4838 : ScrollWindow ( inf->handle, SCROLL_PG_UP ); break; case 0x4b34 : ScrollWindow ( inf->handle, SCROLL_PG_LEFT ); break; case 0x5032 : ScrollWindow ( inf->handle, SCROLL_PG_DOWN ); break; case 0x4d36 : ScrollWindow ( inf->handle, SCROLL_PG_RIGHT ); break; } break; case SG_LCLICK1 : case SG_LCLICK2 : case SG_RCLICK1 : case SG_RCLICK2 : if ( inf->line_ptr != NULL ) { sprintf ( s, "[2][ Sie haben Zeile %ld, Spalte %ld angeklickt. | Darstellung „ndern: ][ [Fett | [Kursiv | [Unterst. | [Nix ]", inf->line, inf->column ); switch ( Alert ( ALERT_NORM, 4, s )) { case 1 : inf->line_ptr [0] |= 1; RedrawArea ( inf->handle, &inf->draw_area ); break; case 2 : inf->line_ptr [0] |= 4; RedrawArea ( inf->handle, &inf->draw_area ); break; case 3 : inf->line_ptr [0] |= 8; RedrawArea ( inf->handle, &inf->draw_area ); break; default : break; } } break; case SG_DRAGDROP: LoadText ( inf->dd->data ); default : break; } return ( SG_CONT ); } /* ------------------------------------------------------------------- * L„dt eine Textdatei und stellt sie im Fenster dar. Die Fenster * werden von SysGem verwaltet. Wrde statt 'handle_text' NULL ber- * geben, wrde auf keine Nachricht reagiert, aužer auf das Schliežen * des Fensters. * ------------------------------------------------------------------- */ VOID LoadText ( BYTE *fname ) { UINT i; if ( length ( fname ) > 4 ) { ShowBee (); i = Display ( fname, fname, "", 255, win_id, 8, 90, 300, 200, handle_text ); ShowArrow (); if ( i == 0 ) { Alert ( ALERT_NORM, 1, "[1][ Die Datei konnte nicht | geladen werden! ][ [Abbruch ]" ); } else { i = (UINT) SetWindowParm ( GetHandle ( win_id ), SET_W, -1L ); SetWinMaxSize ( win_id, i, -1 ); LinkTree ( win_id, rsc_tool, 'TOOL', LINK_TOP ); win_id++; } } } /* ------------------------------------------------------------------- */ INT handle_main ( INT msg, INT button, DIALOG_INFO *inf ) { switch ( msg ) { case SG_START : LinkSlider ( rsc_main, MA_UP, MA_DN, MA_SHOW, MA_HIDE, 20, MA_BOX, &slid_txt [0][0], (INT) sizeof ( slid_txt [0] ), 0 ); break; case SG_END : switch ( button ) { case -1 : if ( Alert ( ALERT_NORM, 1, ASK_TERM ) == 2 ) return ( SG_TERM ); break; case MA_POP1 : xPopUp ( rsc_main, MA_POP1, rsc_pop, 0, &pop ); RedrawObj ( rsc_main, MA_POP2, 0, NONE, UPD_STATE ); break; case MA_POP2 : Cycle ( rsc_main, MA_POP1, rsc_pop, SP_1, SP_16, &pop ); RedrawObj ( rsc_main, MA_POP2, 0, NONE, UPD_STATE ); break; case MA_LIST1 : case MA_LIST2 : Listbox ( " Weiž| Schwarz| Rot| Grn| Blau| Cyan| Gelb| Magenta| Hellgrau| Dunkelgrau| Hellrot| Hellgrn| Hellblau| Hellcyan| Hellgelb| Hellmagenta", 0, 0, rsc_main, MA_LIST1 ); break; case MA_SYS : SysInfo ( 'SISI' ); break; case MA_LAUF : SysInfo ( 'SILI' ); break; case MA_MEM : SysInfo ( 'SIMI' ); break; case MA_VEK : SysInfo ( 'SIVI' ); break; case MA_COOK : SysInfo ( 'SICI' ); break; case MA_XBRA : SysInfo ( 'SIXI' ); break; case MA_HD : SysInfo ( 'SIHD' ); break; case MA_GRAF : SysInfo ( 'SIGI' ); break; case MA_SGEM : SysInfo ( 'SISG' ); break; case MA_WRT : SysInfo ( 'SIAG' ); break; default : break; } break; case SG_MENU : switch ( button ) { case M2_INFO : DoDialog ( rsc_info, 0, " Information " ); break; case M2_QUIT : if ( Alert ( ALERT_NORM, 1, ASK_TERM ) == 2 ) return ( SG_TERM ); default : break; } break; case SG_KEY : switch ( button ) { case 0x4800 : ScrollSlider ( rsc_main, MA_BOX, SCROLL_UP ); return ( SG_KEYUSED ); case 0x5000 : ScrollSlider ( rsc_main, MA_BOX, SCROLL_DOWN ); return ( SG_KEYUSED ); default : break; } return ( SG_KEYCONT ); case SG_DRAGDROP : LoadText ( inf->dd->data ); break; case SG_QUIT : break; } return ( SG_CONT ); } /* ------------------------------------------------------------------- * Behandelt die Desktop-Menzeile * ------------------------------------------------------------------- */ INT handle_menu ( INT msg, WINDOW_INFO *inf ) { if ( msg == SG_MENU ) { switch ( inf->mItem ) { case ME_INFO : DoDialog ( rsc_info, 0, "| Information " ); break; case ME_QUIT : if ( Alert ( ALERT_NORM, 1, ASK_TERM ) == 2 ) return ( SG_TERM ); break; case ME_EDIT : WindowDialog ( 'EDIT', -1, -1, " Edit-Felder ", "", TRUE, FALSE, rsc_edit, NULL, SE_Z50_100, NULL, handle_edit ); } } return ( SG_CONT ); } /* ------------------------------------------------------------------- */ VOID first_info ( VOID ) { if ( OpenLogWindow ( 'SGEM', " SysGem-Information ", "", 61, 15, 8, 20, (APROC) NULL )) { wprintf ( 'SGEM', "Willkommen bei \033pSysGem\033q V%x.%x\n\n", (INT)( SYSGEM_VERSION >> 8 ), (INT)((BYTE) SYSGEM_VERSION )); wprintf ( 'SGEM', "Mit \033pSysGem\033q wird das Erstellen von GEM-Programmen zum Kinder-\n" ); wprintf ( 'SGEM', "spiel! (Text-)Fenster und Fensterdialoge werden komplett\n" ); wprintf ( 'SGEM', "von \033pSysGem\033q verwaltet, so daž \033+Sie\033- sich in Ruhe um\n" ); wprintf ( 'SGEM', "die wichtigeren Dinge kmmern k”nnen.\n" ); wprintf ( 'SGEM', "\033pSysGem\033q bernimmt z.B. auch die Verwaltung der \033+Iconifizierung\n" ); wprintf ( 'SGEM', "(ICFS/MTos)\033- und des \033+Drag & Drop (unter Gemini/MTos)\033-. Pro-\n" ); wprintf ( 'SGEM', "bieren Sie es doch einfach mal mit diesem Demo aus!\n\n" ); wprintf ( 'SGEM', "Schauen Sie sich doch danach einfach mal die Quelle an,\n" ); wprintf ( 'SGEM', "Sie werden berrascht sein, wie einfach und schnell es\n" ); wprintf ( 'SGEM', "gehen kann...\n\n" ); wprintf ( 'SGEM', "\033(Schliež mich...\033)" ); } } /* ------------------------------------------------------------------- */ INT main ( VOID ) { INT i; if ( Init_GEM ( &par, ACC_NAME, PRG_ID, PRG_NAME, USR_ID, USR_NAME, USR_KEY ) > 0 ) { /* -------------------------------------------------------------- * Initialisiert die Resource * -------------------------------------------------------------- */ for ( i = 0; i < NUM_OBS; i++ ) rsrc_obfix ( &rs_object [i], 0 ); /* -------------------------------------------------------------- * šberschrift fr die Alertbox * -------------------------------------------------------------- */ SetAlertTitle ( "| SysGem-Demo " ); /* -------------------------------------------------------------- * Dialoge anmelden * -------------------------------------------------------------- */ NewDialog ( rsc_main ); NewDialog ( rsc_info ); NewDialog ( rsc_bits ); NewDialog ( rsc_tool ); NewDialog ( rsc_edit ); /* -------------------------------------------------------------- * Die Texte fr die Sliderbox in Buffer schreiben * -------------------------------------------------------------- */ for ( i = 0; i < 20; i++ ) { sprintf ( slid_txt [i], " Dieses ist die Textzeile Nr %2d ", i + 1 ); } /* -------------------------------------------------------------- * Nachrichten-Funktion anmelden * -------------------------------------------------------------- */ SetMessageProc ( GetMessage ); /* -------------------------------------------------------------- * Menzeile anmelden * -------------------------------------------------------------- */ SetDeskTopMenu ( rsc_menu, handle_menu ); /* -------------------------------------------------------------- * Zeituhr starten * -------------------------------------------------------------- */ WindowDialog ( 'ZEIT', 8, 0, "| Zeit ", "", TRUE, FALSE, rsc_bits, NULL, 0, NULL, handle_bits ); /* -------------------------------------------------------------- * Hauptfenster ”ffnen * -------------------------------------------------------------- */ WindowDialog ( 'MAIN', -1, -1, " SysGem-Demo ", "", TRUE, FALSE, rsc_main, NULL, 0, NULL, handle_main ); /* -------------------------------------------------------------- * Text laden und anzeigen * -------------------------------------------------------------- */ LoadText ( "DEMO.H" ); /* -------------------------------------------------------------- * Tastendrcke an die Dialoge leiten... * -------------------------------------------------------------- */ TellKeyStrokes ( TRUE ); /* -------------------------------------------------------------- * Info vom Demo anzeigen * -------------------------------------------------------------- */ first_info (); /* -------------------------------------------------------------- * Kontrolle an SysGem abgeben * -------------------------------------------------------------- */ HandleSysGem (); /* -------------------------------------------------------------- * Programm abmelden und Speicher freigeben * -------------------------------------------------------------- */ Exit_GEM (); } return ( 0 ); } /* ------------------------------------------------------------------- */