/* ------------------------------------------------------------------- *
 * Module Version       : 2.00                                         *
 * Author               : Andrea Pietsch                               *
 * Programming Language : Pure-C                                       *
 * Copyright            : (c) 1994, Andrea Pietsch, 56727 Mayen        *
 * ------------------------------------------------------------------- */

#include        <sys_gem2.h>
#include        <string.h>
#include        "rsc_3d.h"

/* ------------------------------------------------------------------- */

OBJECT  *rsc_button;                    /* Baum-Adresse                */
OBJECT  *rsc_reiter;                    /* Baum-Adresse                */
OBJECT  *rsc_rahmen1;                   /* Baum-Adresse                */
OBJECT  *rsc_rahmen2;                   /* Baum-Adresse                */
OBJECT  *rsc_boxchar;                   /* Baum-Adresse                */
OBJECT  *rsc_text;                      /* Baum-Adresse                */
OBJECT  *rsc_frame;                     /* Baum-Adresse                */
OBJECT  *rsc_menu;                      /* Baum-Adresse                */
OBJECT  *rsc_main;                      /* Baum-Adresse                */
OBJECT  *rsc_info;                      /* Baum-Adresse                */
OBJECT  *rsc_icon;                      /* Baum-Adresse                */

/* ------------------------------------------------------------------- */

BYTE    slider_buffer   [20][30];

/* -------------------------------------------------------------------
 * HandleDemo
 *
 * Erledigt die Verwaltung der "Reiter" und zeigt die verschiedenen
 * Erweiterten Typen an, die SysGem so drauf hat...
 * ------------------------------------------------------------------- */

INT HandleObjects ( INT msg, INT button, DIALOG_INFO *inf )

{
  switch ( msg )
    {
      case SG_START    : /* ------------------------------------------
                          * Voreinstellungen
                          * ------------------------------------------ */

                         SetText ( rsc_text, TE_EDTEXT, "Ein kleiner Test" );
                         break;

      case SG_END      : /* ------------------------------------------
                          * Fenster schlieen
                          * ------------------------------------------ */

                         switch ( button )
                           {
                             case -1     : return ( SG_CLOSE );
                             default     : break;
                           }
                         break;

      case SG_HELP     : /* ------------------------------------------
                          * User hat HELP gedrckt oder auf den HILFE-
                          * Button geklickt
                          * ------------------------------------------ */

                         Alert ( ALERT_NORM, 1, "[3][ Noch keine Hilfe verfgbar! ][   [OK   ]" );
                         break;

      case SG_NEWDIAL  : /* ------------------------------------------
                          * Je nachdem, welcher Reiter angewhlt wurde,
                          * wird hier der richtige Dialog dazu einge-
                          * tragen
                          * ------------------------------------------ */

                         switch ( button )
                           {
                             case RE_BUTTON1  : inf->tree = rsc_button;   break;
                             case RE_RAHMEN1  : inf->tree = rsc_rahmen1;  break;
                             case RE_RAHMEN2  : inf->tree = rsc_rahmen2;  break;
                             case RE_BOXCHAR  : inf->tree = rsc_boxchar;  break;
                             case RE_TEXT     : inf->tree = rsc_text;     break;
                             case RE_FRAME    : inf->tree = rsc_frame;    break;
                             default          : return ( SG_CONT );
                           }
                         return ( SG_TAKEDIAL );
      default          : break;
    }
  return ( SG_CONT );
}

/* -------------------------------------------------------------------
 * HandleMenuLine
 *
 * Reagiert auf Clicks in die Menzeile
 * ------------------------------------------------------------------- */

INT HandleMenuLine ( INT item )

{
  switch ( item )
    {
      case -1           : /* -----------------------------------------
                           * User hat die HELP-Taste gedrckt
                           * ----------------------------------------- */
                         Alert ( ALERT_NORM, 1, "[3][ Noch keine Hilfe verfgbar! ][   [OK   ]" );
                         break;

      case ME_INFO      : /* -----------------------------------------
                           * Info darstellen
                           * ----------------------------------------- */
                          DoDialog ( rsc_info, 0, "|Programm-Info" );
                          break;

      case ME_ENDE      : /* -----------------------------------------
                           * Programm beenden
                           * ----------------------------------------- */
                          return ( SG_TERM );

      case ME_WECHSELN  : /* -----------------------------------------
                           * Fenster wechseln ohne Auswahl
                           * ----------------------------------------- */
                          CycleWindow ( FALSE );
                          break;

      case ME_WECHSELN2 : /* -----------------------------------------
                           * Fenster wechseln mit Auswahl
                           * ----------------------------------------- */
                          CycleWindow ( TRUE );
                          break;

      case ME_FONT      : /* -----------------------------------------
                           * Font whlen
                           * ----------------------------------------- */

                          FontSelect ( NULL, NULL, "Zeichensatz", "", FALSE );
                          break;

      default           : break;
    }
  return ( SG_CONT );
}

/* ------------------------------------------------------------------- */

INT HandleWindow ( INT msg, WINDOW_INFO *inf )

{
  LOCAL INT     line    = -1;

  switch ( msg )
    {
      case SG_END       : /* -----------------------------------------
                           * Fenster schlieen
                           * ----------------------------------------- */

                          line = -1;
                          return ( SG_CLOSE );
      case SG_LCLICK1   :
      case SG_LCLICK2   : /* -----------------------------------------
                           * Zeile selektieren - wenn schon eine Zeile
                           * selektiert ist, deselektieren
                           * ----------------------------------------- */

                          if ( line != -1 )
                            {
                              SetLineFlags ( inf->id, line, 0 );
                              RedrawLine   ( inf->id, line );
                              line = -1;
                            }
                          if ( inf->line >= 0L )
                            {
                              line = (UINT) inf->line;
                              SetLineFlags ( inf->id, line, 1 );
                              RedrawLine   ( inf->id, line );
                            }
                          break;
    }
  return ( SG_CONT );
}

/* -------------------------------------------------------------------
 * Normales Textfenster mit 100 Zeilen Text darstellen
 *
 * Das Redraw der Textzeilen wird - wie auch das Scrollen - von SysGem
 * automatisch bernommen
 * ------------------------------------------------------------------- */

VOID MakeWindow1 ( VOID )

{
  INT   i;
  BYTE  str [100];

  /* -----------------------------------------------------------------
   * Fenster ffnen
   * ----------------------------------------------------------------- */

  if ( OpenWindow ( 'norm', "|Textfenster", "", 0xfef, NULL, 8, TRUE, -1, -1, 1L, 1L, 40, 40, 300, 280, NULL, (RPROC) NULL, HandleWindow ) < 0 )
    {
      return;
    }

  /* -----------------------------------------------------------------
   * Die Liste aus Textzeilen erzeugen und ins Fenster 'linken'...
   * ----------------------------------------------------------------- */

  BeginListUpdate ( 'norm' );
  for ( i = 0; i < 100; i++ )
    {
      sprintf ( str, " Eine kleine Testzeile Nr. %3d zur Demonstration ", i + 1 );
      AddToList ( 'norm', str );
    }

  /* -----------------------------------------------------------------
   * Textfenster neu berechnen und wenn ntig, neuzeichnen
   * ----------------------------------------------------------------- */

  EndListUpdate ( 'norm' );
}

/* -------------------------------------------------------------------
 * Textfenster mit 20 Objektbumen als Zeilen darstellen
 * Zum Ausrichten der Zeilen werden zwei Tabulatoren verwendet
 *
 * Das Redraw der Bume wird - wie auch das Scrollen - von SysGem
 * automatisch bernommen
 * ------------------------------------------------------------------- */

VOID MakeWindow2 ( VOID )

{
  INT   i;
  BYTE  str [100];

  /* -----------------------------------------------------------------
   * Fenster ffnen, wie oben auch...
   * ----------------------------------------------------------------- */

  if ( OpenWindow ( 'nor2', "|Textfenster", "", NAME | MOVER | CLOSER | UPARROW | DNARROW | VSLIDE, NULL, 8, FALSE, -1, -1, 1L, 1L, 40, 40, 300, 230, NULL, (RPROC) NULL, HandleWindow ) < 0 )
    {
      return;
    }

  /* -----------------------------------------------------------------
   * Die Liste aus Textzeilen erzeugen und ins Fenster 'linken'...
   * Ebenso werden die beiden Tabulatoren fr das Fenster eingestellt
   * ----------------------------------------------------------------- */

  BeginListUpdate ( 'nor2' );
  SetListTab ( 'nor2',  7, TAB_LEFT );
  SetListTab ( 'nor2', 28, TAB_RIGHT );
  for ( i = 0; i < 20; i++ )
    {
      sprintf     ( str, "\tEine Testzeile Nr.\t%d", i + 1 );
      AddToList   ( 'nor2', str );
      SetLineIcon ( 'nor2', i, rsc_icon, IC_BOX );
    }

  /* -----------------------------------------------------------------
   * Textfenster neu berechnen und wenn ntig, neuzeichnen
   * ----------------------------------------------------------------- */

  EndListUpdate ( 'nor2' );
}

/* ------------------------------------------------------------------- */

INT HandleMain ( INT msg, INT button, DIALOG_INFO *inf )

{
  UINT  i;

  switch ( msg )
    {
      case SG_START    : /* ------------------------------------------
                          * Sliderbox vorbelegen und Textfelder lschen
                          * ------------------------------------------ */

                         for ( i = 0; i < 20; i++ )
                           {
                             sprintf ( slider_buffer [i], "*----+\tTestzeile Nr. %3d", i + 1 );
                             slider_buffer [i][0] = 255;
                             slider_buffer [i][1] = (BYTE)((LONG)( rsc_icon ) >> 24 );
                             slider_buffer [i][2] = (BYTE)((LONG)( rsc_icon ) >> 16 );
                             slider_buffer [i][3] = (BYTE)((LONG)( rsc_icon ) >>  8 );
                             slider_buffer [i][4] = (BYTE)((LONG)( rsc_icon ) >>  0 );
                             slider_buffer [i][5] = (BYTE) IC_BAR;
                           }
                         LinkSlider    ( rsc_main, MA_UP, MA_DN, MA_SHOW, MA_HIDE, 20, MA_BOX, &slider_buffer [0][0], 30, TRUE );
                         SetSliderTab  ( rsc_main, MA_BOX, 5, TAB_LEFT );
                         SelectSldItem ( rsc_main, MA_BOX, 0, FALSE );

                         ClearEditFields ( rsc_main );
                         break;

      case SG_SLIDER   : /* ------------------------------------------
                          * Eintrag in der Sliderbox, die angeklickt
                          * wurde, selektieren
                          * ------------------------------------------ */

                         if ( button >= 0 ) /* War ein 'echter' Eintrag*/
                           {
                             SelectSldItem ( rsc_main, MA_BOX, button, TRUE );
                           }
                         break;

      case SG_END      : /* ------------------------------------------
                          * Button auswerten, der angeklickt wurde
                          * ------------------------------------------ */

                         switch ( button )
                           {
                             case -1        : /* Closer angeklickt     */
                             case MA_EXIT   : /* ---------------------
                                               * Fragen, ob beenden
                                               * --------------------- */
                                              if ( Alert ( ALERT_NORM, 1, "[2][ Wirklich beenden? ][ [Ja | [Nein ]" ) == 1 )
                                                {
                                                  return ( SG_TERM );
                                                }
                                              break;

                             case MA_LIST   : /* ---------------------
                                               * Listbox
                                               * --------------------- */
                                              Listbox ( " Dieses       | ist          | eine         | Listbox      | in           | der          | beliebig     |"
                                                        " viele        | Zeilen       | untergebracht| werden       | knnen       ", -1, -1, rsc_main, MA_LIST );
                                              break;

                             case MA_OBJECT : /* ---------------------
                                               * Erweiterte Objekte
                                               * darstellen
                                               * --------------------- */
                                              MultipleDialog ( 'xobj', -1, -1, "|Objekttypen", "", rsc_reiter, RE_BUTTON1, rsc_button, -2, NULL, HandleObjects );
                                              break;

                             case MA_WINDOW : /* ---------------------
                                               * Textfenster zeigen
                                               * --------------------- */
                                              MakeWindow1 ();
                                              break;

                             case MA_ICONS  : /* ---------------------
                                               * Iconfenster zeigen
                                               * --------------------- */
                                              MakeWindow2 ();
                                              break;

                             default        : break;
                           }
                         break;
      case SG_HELP     : /* ------------------------------------------
                          * User hat HELP gedrckt oder auf den HILFE-
                          * Button geklickt
                          * ------------------------------------------ */

                         Alert ( ALERT_NORM, 1, "[3][ Noch keine Hilfe verfgbar! ][   [OK   ]" );
                         break;

      case SG_DRAGDROP : /* ------------------------------------------
                          * Irgendwas wurde ins Fenster gezogen
                          * laden wir's doch einfach mal...
                          * Wenn Fenster schon offen, Fenster schlieen
                          * ------------------------------------------ */

                         CloseWindowById ( 'file' );

                         i = (UINT) Display ( inf->dd->data, "|Datei", inf->dd->data, 250, 'file', 30, 30, 300, 250, (APROC) NULL );

                         /* ------------------------------------------
                          * Protokollieren, welche Datei geladen wurde
                          *
                          * Wenn Log-Fenster schon offen
                          * ------------------------------------------ */

                         if ( GetHandle ( 'xlog' ) == -1 )
                           {
                             OpenLogWindow ( 'xlog', "|Drag & Drop Aktionen", "", 60, 12, 50, 50, (APROC) NULL );
                           }
                         wprintf ( 'xlog', "\nDatei: %s  [%u Zeilen]", inf->dd->data, i );
                         break;
      default          : break;
    }
  return ( SG_CONT );
}

/* ------------------------------------------------------------------- */

INT main ( VOID )

{
  /* -----------------------------------------------------------------
   * Initialisieren...
   * ----------------------------------------------------------------- */

  if ( InitGem ( "", 'demo', "Demo" ) > 0 )
    {
      UseWindowSlider ();
      UseOwnEditFields ();
      SetKey ( 0L, 0L );

      /* -------------------------------------------------------------
       * Resource laden - eine normale, da keine Farbicons drin sind
       * wenn Farbicons, dann C_ICON.PRG in den Auto-Ordner und FALSE
       * auf TRUE setzen...
       * ------------------------------------------------------------- */

      if ( LoadResource ( "DEMO.RSC", FALSE ) >= 0 )
        {
          /* ---------------------------------------------------------
           * Dialog-Adressen ermitteln
           * --------------------------------------------------------- */

          rsc_button    = RscAdr ( R_TREE, BUTTONS  );
          rsc_reiter    = RscAdr ( R_TREE, REITER   );
          rsc_rahmen1   = RscAdr ( R_TREE, RAHMEN1  );
          rsc_rahmen2   = RscAdr ( R_TREE, RAHMEN2  );
          rsc_boxchar   = RscAdr ( R_TREE, BOXCHARS );
          rsc_text      = RscAdr ( R_TREE, TEXTE    );
          rsc_frame     = RscAdr ( R_TREE, FRAME    );
          rsc_menu      = RscAdr ( R_TREE, MENUE    );
          rsc_main      = RscAdr ( R_TREE, MAIN     );
          rsc_info      = RscAdr ( R_TREE, SGINFO   );
          rsc_icon      = RscAdr ( R_TREE, ICONS    );

          /* ---------------------------------------------------------
           * Dialoge anmelden
           * --------------------------------------------------------- */

          NewDialog ( rsc_button  );
          NewDialog ( rsc_reiter  );
          NewDialog ( rsc_rahmen1 );
          NewDialog ( rsc_rahmen2 );
          NewDialog ( rsc_boxchar );
          NewDialog ( rsc_text    );
          NewDialog ( rsc_frame   );
          NewDialog ( rsc_main    );
          NewDialog ( rsc_info    );
          NewDialog ( rsc_icon    );

          /* ---------------------------------------------------------
           * Menzeile anmelden und darstellen
           * --------------------------------------------------------- */

          InitMenuLine   ( rsc_menu );
          SetDeskTopMenu ( rsc_menu, HandleMenuLine );

          /* ---------------------------------------------------------
           * Logfenster ffnen
           * --------------------------------------------------------- */

          OpenLogWindow ( 'xlog', "|Drag & Drop Aktionen", "", 60, 12, 50, 50, (APROC) NULL );
          wprintf ( 'xlog', "Keine geladenen Dateien..." );

          /* ---------------------------------------------------------
           * Hauptdialog ffnen
           * --------------------------------------------------------- */

          if ( WindowDialog ( 'main', -1, -1, "|SysGem-Demo", "", TRUE, FALSE, rsc_main, NULL, -2, NULL, HandleMain ))
            {
              /* -----------------------------------------------------
               * Die Kontrolle an SysGem abgeben...
               * ----------------------------------------------------- */

              HandleSysGem ();
            }
        }
      else
        {
          /* ---------------------------------------------------------
           * Resource-Laden ist schiefgelaufen
           * --------------------------------------------------------- */

          Alert ( ALERT_NORM, 1, "[3][ Resource-Datei nicht gefunden! ][ [Abbruch ]" );
        }

      /* -------------------------------------------------------------
       * ...und wieder abmelden
       * ------------------------------------------------------------- */

      ExitGem ();
    }
  return ( 0 );
}

/* ------------------------------------------------------------------- */
