/* -- ----------------------------------------------------------------- -- *
 * -- Source generated by GenE and BGUIBuilder                          -- *
 * -- ----------------------------------------------------------------- -- */

/* -- ----------------------------------------------------------------- -- *
 * -- Program.....: mul_MainGUI.e                                       -- *
 * -- Author......: Daniel Kasmeroglu <raptor@cs.tu-berlin.de>          -- *
 * -- Description.: Object with an interface.                           -- *
 * -- ----------------------------------------------------------------- -- */

/* -- ---------------------------------------------------------------- -- *
 * --                             Options                              -- *
 * -- ---------------------------------------------------------------- -- */

OPT PREPROCESS       -> enable preprocessor
OPT MODULE           -> generate module


/* -- ---------------------------------------------------------------- -- *
 * --                             Modules                              -- *
 * -- ---------------------------------------------------------------- -- */

->»» LIST OF MODULES
MODULE 'intuition/classusr'    ,
       'intuition/classes'     ,
       'intuition/gadgetclass' ,
       'intuition/intuition'   ,
       'intuition/screens'     ,
       'intuition/icclass'     ,
       'utility/tagitem'       ,
       'utility/hooks'         ,
       'exec/memory'           ,
       'graphics/gfx'          ,
       'graphics/rastport'     ,
       'kasimir/setstack'      ,
       'libraries/iffparse'    ,
       'libraries/bguim'       ,
       'libraries/bgui'        ,
       'tools/inithook'        ,
       'tools/boopsi'

MODULE 'lib/bgui'

MODULE '*mul_Localisation'
->»»>


/* -- ---------------------------------------------------------------- -- *
 * --                            Constants                             -- *
 * -- ---------------------------------------------------------------- -- */

->»» LIST OF CONSTANTS
ENUM GID_UNIT0 = 1   ,
     GID_UNIT1       ,
     GID_ECC         ,
     GID_INFO        ,
     GID_SEEKDELAY0  ,
     GID_SEEKDELAY1  ,
     GID_SHOW0       ,
     GID_SHOW1       ,
     GID_SAVE        ,
     GID_USE         ,
     GID_CANCEL      ,
     GROUP_MAIN      ,
     NUMBER


CONST GID_START = GID_UNIT0,
      GID_END   = GID_CANCEL
->»»>


/* -- ---------------------------------------------------------------- -- *
 * --                            Structures                            -- *
 * -- ---------------------------------------------------------------- -- */

->»» OBJECT maingui
EXPORT OBJECT maingui PRIVATE
  mai_ObjectWindow       : PTR TO object  -> bgui-window
  mai_Window             : PTR TO window  -> intuition-window
  mai_Gadgets [ NUMBER ] : ARRAY OF LONG  -> all objects
  mai_Prefs              : LONG           -> the preferences
ENDOBJECT
->»»>


/* -- ---------------------------------------------------------------- -- *
 * --                             Methods                              -- *
 * -- ---------------------------------------------------------------- -- */

->»» METHOD mai_Constructor
PROC mai_Constructor() OF maingui

  self.mai_Prefs := intern_ReadPrefs()
  self.mai_InitObjects()
  self.mai_ObjectWindow := WindowObject,
                             WINDOW_AutoAspect       , TRUE                             ,
                             WINDOW_CloseOnEsc       , TRUE                             ,
                             WINDOW_AutoKeyLabel     , TRUE                             ,
                             WINDOW_SizeGadget       , FALSE                            ,
                             WINDOW_Title            , loc_GetString( WIN_TITLE       ) ,
                             WINDOW_ScreenTitle      , loc_GetString( WIN_SCREENTITLE ) ,
                             WINDOW_MasterGroup      , self.mai_Gadgets[ GROUP_MAIN ]   ,
                           EndObject

  IF self.mai_ObjectWindow = NIL THEN Raise( "MEM" )

  PutLong( { lab_MapAddress }, { lab_Map } )
  PutLong( { lab_Target     }, self.mai_Gadgets[ GID_SHOW0 ] )

  SetAttrsA( self.mai_Gadgets[ GID_SEEKDELAY0 ] , { lab_Tags } )

  PutLong( { lab_Target }, self.mai_Gadgets[ GID_SHOW1 ] )
  SetAttrsA( self.mai_Gadgets[ GID_SEEKDELAY1 ] , { lab_Tags } )

ENDPROC
->»»>

->»» METHOD mai_InitObjects
PROC mai_InitObjects() OF maingui
DEF ini_run,ini_err

  self.mai_Gadgets [ GID_INFO ] := InfoObject,
                                     ButtonFrame,
                                     INFO_TextFormat   , loc_GetString( WIN_INFO ),
                                     INFO_MinLines     , 3,
                                     INFO_FixTextWidth , TRUE,
                                   EndObject

  self.mai_Gadgets [ GID_UNIT0      ] := intern_PCheck  ( GAD_UNIT0      , TTI_NOCLICK )
  self.mai_Gadgets [ GID_UNIT1      ] := intern_PCheck  ( GAD_UNIT1      , TTI_NOCLICK )
  self.mai_Gadgets [ GID_ECC        ] := intern_PCheck  ( GAD_ECC        , TTI_ECC     )
  self.mai_Gadgets [ GID_SEEKDELAY0 ] := intern_PSlider ( GAD_SEEKDELAY0 , TTI_DELAY   )
  self.mai_Gadgets [ GID_SEEKDELAY1 ] := intern_PSlider ( GAD_SEEKDELAY1 , TTI_DELAY   )
  self.mai_Gadgets [ GID_SAVE       ] := intern_PButton ( GAD_SAVE       )
  self.mai_Gadgets [ GID_USE        ] := intern_PButton ( GAD_USE        )
  self.mai_Gadgets [ GID_CANCEL     ] := intern_PButton ( GAD_CANCEL     )
  self.mai_Gadgets [ GID_SHOW0      ] := intern_PIndic  ()
  self.mai_Gadgets [ GID_SHOW1      ] := intern_PIndic  ()

  ini_err := FALSE
  FOR ini_run := GID_START TO GID_END
    IF self.mai_Gadgets[ ini_run ] <> NIL
      SetAttrsA( self.mai_Gadgets[ ini_run ], [ GA_ID, ini_run, TAG_END ] )
    ELSE
      ini_err := TRUE
    ENDIF
  ENDFOR

  IF ini_err = FALSE

    self.mai_Gadgets[ GROUP_MAIN ] := VGroupObject,
                                        NormalSpacing,
                                        NormalOffset,
                                        NoFrame,
                                        FillRaster,
                                        StartMember,
                                          VGroupObject,
                                            NormalSpacing,
                                            NormalOffset,
                                            NeXTFrame,
                                            ShineRaster,
                                            StartMember,
                                              self.mai_Gadgets[ GID_INFO ],
                                              FixMinHeight,
                                            EndMember,
                                            StartMember,
                                              self.mai_Gadgets[ GID_UNIT0 ],
                                              FixMinSize,
                                            EndMember,
                                            StartMember,
                                              self.mai_Gadgets[ GID_UNIT1 ],
                                              FixMinSize,
                                            EndMember,
                                            StartMember,
                                              self.mai_Gadgets[ GID_ECC ],
                                              FixMinSize,
                                            EndMember,
                                            StartMember,
                                              HGroupObject,
                                                NormalSpacing,
                                                StartMember,
                                                  self.mai_Gadgets[ GID_SEEKDELAY0 ],
                                                EndMember,
                                                StartMember,
                                                  self.mai_Gadgets[ GID_SHOW0 ],
                                                  FixMinWidth,
                                                EndMember,
                                              EndObject,
                                              FixMinHeight,
                                            EndMember,
                                            StartMember,
                                              HGroupObject,
                                                NormalSpacing,
                                                StartMember,
                                                  self.mai_Gadgets[ GID_SEEKDELAY1 ],
                                                EndMember,
                                                StartMember,
                                                  self.mai_Gadgets[ GID_SHOW1 ],
                                                  FixMinWidth,
                                                EndMember,
                                              EndObject,
                                              FixMinHeight,
                                            EndMember,
                                          EndObject,
                                          FixMinSize,
                                        EndMember,
                                        StartMember,
                                          HGroupObject,
                                            EqualWidth,
                                            NormalSpacing,
                                            NormalOffset,
                                            NoFrame,
                                            FillRaster,
                                            StartMember,
                                              self.mai_Gadgets[ GID_SAVE ],
                                              FixMinHeight,
                                            EndMember,
                                            StartMember,
                                              self.mai_Gadgets[ GID_USE ],
                                              FixMinHeight,
                                            EndMember,
                                            StartMember,
                                              self.mai_Gadgets[ GID_CANCEL ],
                                              FixMinHeight,
                                            EndMember,
                                          EndObject,
                                          FixMinHeight,
                                        EndMember,
                                      EndObject

    IF self.mai_Gadgets[ GROUP_MAIN ] = NIL THEN ini_err := TRUE

  ENDIF

  IF ini_err <> FALSE
    FOR ini_run := GID_START TO GID_END
      IF self.mai_Gadgets[ ini_run ] <> NIL
        DisposeObject( self.mai_Gadgets[ ini_run ] )
      ENDIF
    ENDFOR
    self.mai_Gadgets[ GROUP_MAIN ] := NIL
    Raise( "MEM" )
  ENDIF

ENDPROC
->»»>

->»» METHOD mai_StartInterface
PROC mai_StartInterface() OF maingui
DEF sta_rc,sta_signal,sta_wait

  self.mai_SetPrefs()

  self.mai_Window := WindowOpen( self.mai_ObjectWindow )
  IF self.mai_Window <> NIL

    SetDrMd( self.mai_Window.rport, 1 )

    GetAttr( WINDOW_SigMask, self.mai_ObjectWindow, {sta_signal} )
    sta_wait := TRUE
    WHILE sta_wait <> FALSE

      Wait( sta_signal )

      WHILE (sta_rc := HandleEvent( self.mai_ObjectWindow )) <> WMHI_NOMORE

        SELECT sta_rc
        CASE WMHI_CLOSEWINDOW ; sta_wait := FALSE
        CASE GID_CANCEL       ; sta_wait := FALSE
        CASE GID_USE
          sta_wait := FALSE
          self.mai_UpdatePrefs()
          intern_WritePrefs( self.mai_Prefs, FALSE )
        CASE GID_SAVE
          sta_wait := FALSE
          self.mai_UpdatePrefs()
          intern_WritePrefs( self.mai_Prefs, FALSE )
          intern_WritePrefs( self.mai_Prefs, TRUE  )
        ENDSELECT

      ENDWHILE

    ENDWHILE

    WindowClose( self.mai_ObjectWindow )

  ENDIF

ENDPROC
->»»>

->»» METHOD mai_UpdatePrefs
->  $00000180  : seek delay 0 (4=+1)
->  $00000F80  : seek delay 0 (18=+15)
->  $00002080  : seek delay 1 (5=+2)
->  $00000080  : keine ECC
->  $00000000  : ECC
->  $00000001  : noclick 0
->  $00000002  : noclick 2
PROC mai_UpdatePrefs() OF maingui
DEF upd_value,upd_get

  upd_value := 0

  GetAttr( GA_SELECTED, self.mai_Gadgets[ GID_ECC ], {upd_get} )
  IF upd_get = FALSE THEN upd_value := upd_value OR $80

  GetAttr( GA_SELECTED, self.mai_Gadgets[ GID_UNIT0 ], {upd_get} )
  IF upd_get <> FALSE THEN upd_value := upd_value OR $01

  GetAttr( GA_SELECTED, self.mai_Gadgets[ GID_UNIT1 ], {upd_get} )
  IF upd_get <> FALSE THEN upd_value := upd_value OR $02

  GetAttr( SLIDER_Level, self.mai_Gadgets[ GID_SEEKDELAY0 ], {upd_get} )
  upd_value := upd_value OR Shl( upd_get - 3, 8 )

  GetAttr( SLIDER_Level, self.mai_Gadgets[ GID_SEEKDELAY1 ], {upd_get} )
  upd_value := upd_value OR Shl( upd_get - 3, 12 )

  self.mai_Prefs := upd_value

ENDPROC
->»»>

->»» METHOD mai_SetPrefs
PROC mai_SetPrefs() OF maingui

  SetAttrsA( self.mai_Gadgets[ GID_ECC        ], [ GA_SELECTED  , IF (self.mai_Prefs AND $80) <> NIL THEN FALSE ELSE TRUE , TAG_END ] )
  SetAttrsA( self.mai_Gadgets[ GID_UNIT0      ], [ GA_SELECTED  , IF (self.mai_Prefs AND $01) <> NIL THEN TRUE  ELSE FALSE, TAG_END ] )
  SetAttrsA( self.mai_Gadgets[ GID_UNIT1      ], [ GA_SELECTED  , IF (self.mai_Prefs AND $02) <> NIL THEN TRUE  ELSE FALSE, TAG_END ] )
  SetAttrsA( self.mai_Gadgets[ GID_SEEKDELAY0 ], [ SLIDER_Level , Shr( self.mai_Prefs AND $F00  , 8 ) + 3, TAG_END ] )
  SetAttrsA( self.mai_Gadgets[ GID_SEEKDELAY1 ], [ SLIDER_Level , Shr( self.mai_Prefs AND $F000 , 8 ) + 3, TAG_END ] )

ENDPROC
->»»>

->»» METHOD end
PROC end() OF maingui

  IF self.mai_ObjectWindow <> NIL
    DisposeObject( self.mai_ObjectWindow )
  ELSEIF self.mai_Gadgets[ GROUP_MAIN ] <> NIL
    DisposeObject( self.mai_Gadgets[ GROUP_MAIN ] )
  ENDIF

ENDPROC

->»»>


/* -- ----------------------------------------------------------------- -- *
 * --                         Internal Routines                         -- *
 * -- ----------------------------------------------------------------- -- */

->»» PROC intern_ReadPrefs
PROC intern_ReadPrefs()
DEF rea_buffer [ 25 ] : STRING
DEF rea_handle,rea_mem

  StringF( rea_buffer, 'ENV:\s', {lab_Data} )
  IF FileLength( rea_buffer ) <= 0 THEN StringF( rea_buffer, 'ENVARC:\s', {lab_Data} )

  IF FileLength( rea_buffer ) = 4
    rea_handle := Open( rea_buffer, OLDFILE )
    IF rea_handle <> NIL
      IF Read( rea_handle, {rea_mem}, 4 ) <> 4
        rea_mem := 0
      ENDIF
      Close( rea_handle )
    ENDIF
  ENDIF

ENDPROC rea_mem
->»»>

->»» PROC intern_WritePrefs
PROC intern_WritePrefs( wri_value, wri_save = FALSE )
DEF wri_buffer [ 25 ] : STRING
DEF wri_handle

  IF wri_save = FALSE
    StringF( wri_buffer, 'ENV:\s', {lab_Data} )
  ELSE
    StringF( wri_buffer, 'ENVARC:\s', {lab_Data} )
  ENDIF

  wri_handle := Open( wri_buffer, NEWFILE )
  IF wri_handle <> NIL
    IF Write( wri_handle, {wri_value}, 4 ) <> 4
      Close( wri_handle )
      DeleteFile( wri_buffer )
    ELSE
      Close( wri_handle )
    ENDIF
  ENDIF

ENDPROC
->»»>

->»» PROC intern_PCheck
PROC intern_PCheck( pid, ttid )
ENDPROC CheckBoxObject ,
          LAB_Place    , PLACE_RIGHT           ,
          LAB_Label    , loc_GetString( pid  ) ,
          BT_ToolTip   , loc_GetString( ttid ) ,
        EndObject
->»»>

->»» PROC intern_PSlider
PROC intern_PSlider( pid, ttid )
ENDPROC SliderObject ,
          LAB_Label  , loc_GetString( pid  ) ,
          BT_ToolTip , loc_GetString( ttid ) ,
          SLIDER_Min , 3                     ,
          SLIDER_Max , 18                    ,
        EndObject
->»»>

->»» PROC intern_PIndic
PROC intern_PIndic()
ENDPROC IndicatorObject,
          ButtonFrame         ,
          FRM_Flags           , FRF_RECESSED  ,
          INDIC_FormatString  ,  '\r\d[2] ms' ,
          INDIC_Justification , IDJ_CENTER    ,
          INDIC_Min           , 3             ,
          INDIC_Max           , 18            ,
        EndObject
->»»>

->»» PROC intern_PButton
PROC intern_PButton( pid )
ENDPROC ButtonObject ,
          LAB_Label  , loc_GetString( pid ) ,
        EndObject
->»»>


/* -- ----------------------------------------------------------------- -- *
 * --                               Data                                -- *
 * -- ----------------------------------------------------------------- -- */

lab_Data:
CHAR 'multidisk.prefs',0

lab_Map:
LONG SLIDER_Level, INDIC_Level, TAG_END

lab_Tags:
LONG ICA_TARGET

lab_Target:
LONG NIL, ICA_MAP

lab_MapAddress:
LONG NIL, TAG_END

