#define __NOLIBBASE__

#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/muimaster.h>
#include <proto/utility.h>
#include <proto/asl.h>
#include <proto/dos.h>
#include <libsmall.h>

#include "mp3class.h"
#include "aboutclass.h"

#define VERSION "1.3"

#define reg(a) __asm(#a)

#define OBJ_WINDOW      0x6EDA8A30
#define OBJ_MP3         0x6EDA8A31
#define OBJ_FILE        0x6EDA8A32
#define OBJ_WRITE       0x6EDA8A33

#define MENU_ABOUT      0x6EDA3222
#define MENU_MUIABOUT   0x6EDA3223
#define MENU_MUISET     0x6EDA3224
#define MENU_QUIT       0x6EDA3225

Object *Win, *About, *App;
struct Library *SysBase, *DOSBase, *IntuitionBase, *MUIMasterBase, *UtilityBase;

/* Hook called when user enters (directly or via ASL requester) an MP3 file */

long FilePopClose (Object *string reg(a2))
 {
  DoMethod (FindObj (OBJ_MP3, Win), MP3_ReadTags, xget (string, MUIA_String_Contents));
  xset (Win, MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_Next);
  xset (Win, MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_Next);
  return 0;
 }

struct Hook h_FilePopClose = {NULL, NULL, (HOOKFUNC)FilePopClose, NULL, NULL};

/* Hook called when user hits 'Write tags' button. */

long WriteTagsNow (Object *string reg(a2))
 {
  DoMethod (FindObj (OBJ_MP3, Win), MP3_WriteTags, xget (string, MUIA_String_Contents));
  xset (Win, MUIA_Window_ActiveObject, (long)FindObj (OBJ_FILE, Win));
  return 0;
 }

struct Hook h_WriteTagsNow = {NULL, NULL, (HOOKFUNC)WriteTagsNow, NULL, NULL};

/* useful function */

Object *MakeLabel (char *text)
 {
  return (MUI_NewObject (MUIC_Text,
   MUIA_HorizWeight, 0,
   MUIA_Text_Contents, (long)text,
   MUIA_Frame, MUIV_Frame_String,
   MUIA_FramePhantomHoriz, TRUE,
  TAG_END));
 }

static Object *menu (void)
 {
  return (MUI_NewObject (MUIC_Menustrip,
    MUIA_Family_Child, MUI_NewObject (MUIC_Menu,
      MUIA_Menu_Title, (long)"Project",
      MUIA_Family_Child, MUI_NewObject (MUIC_Menuitem,
        MUIA_Menuitem_Title, (long)"About...",
        MUIA_Menuitem_Shortcut, "?",
        MUIA_UserData, MENU_ABOUT,
      TAG_END),
      MUIA_Family_Child, MUI_NewObject (MUIC_Menuitem,
        MUIA_Menuitem_Title, (long)"About MUI...",
        MUIA_UserData, MENU_MUIABOUT,
      TAG_END),
      MUIA_Family_Child, MUI_NewObject (MUIC_Menuitem,
        MUIA_Menuitem_Title, (long)"MUI settings...",
        MUIA_UserData, MENU_MUISET,
      TAG_END),
      MUIA_Family_Child, MUI_NewObject (MUIC_Menuitem,
        MUIA_Menuitem_Title, (long)"Quit",
        MUIA_Menuitem_Shortcut, "Q",
        MUIA_UserData, MENU_QUIT,
      TAG_END),
    TAG_END),
  TAG_END));
 }

long BuildApplication (void)
 {
  App = MUI_NewObject (MUIC_Application,
    MUIA_Application_Author, (long)"Grzegorz Kraszewski (Krashan/BlaBla)",
    MUIA_Application_Base, (long)"TIGERTAGGER",
    MUIA_Application_Copyright, (long)"© 2000 by BlaBla Corp.",
    MUIA_Application_Description, (long)"MP3 tag editor",
    MUIA_Application_Title, (long)"TigerTagger",
    MUIA_Application_Version, (long)"$VER: tigertagger " VERSION " (19.1.2000) BLABLA PRODUCT",
    MUIA_Application_Menustrip, menu (),
    MUIA_Application_Window, Win = MUI_NewObject (MUIC_Window,
      MUIA_Window_Title, (long)"TigerTagger",
      MUIA_Window_ScreenTitle, (long)"TigerTagger v" VERSION " © 2000 by BlaBla Corp.",
      MUIA_Window_ID, 0x50525A4B,
      MUIA_UserData, OBJ_WINDOW,
      MUIA_Window_RootObject, MUI_NewObject (MUIC_Group,
        MUIA_Group_Child, MUI_NewObject (MUIC_Group,
          MUIA_Group_Horiz, TRUE,
          MUIA_Group_Child, MakeLabel ("MP3 file"),
          MUIA_Group_Child, MUI_NewObject (MUIC_Popasl,
            MUIA_Popasl_Type, ASL_FileRequest,
            ASLFR_TitleText, (long)"Select MP3 file",
            ASLFR_InitialPattern, (long)"#?.mp3",
            ASLFR_DoPatterns, TRUE,
            ASLFR_RejectIcons, TRUE,
            MUIA_Popstring_String, MUI_NewObject (MUIC_String,
              MUIA_Frame, MUIV_Frame_String,
              MUIA_String_MaxLen, 512,
              MUIA_String_Contents, (long)"MP3:",
              MUIA_UserData, OBJ_FILE,
              MUIA_CycleChain, TRUE,
              MUIA_String_AdvanceOnCR, TRUE,
            TAG_END),
            MUIA_Popstring_Button, MUI_NewObject (MUIC_Image,
              MUIA_Frame, MUIV_Frame_ImageButton,
              MUIA_Background, MUII_ButtonBack,
              MUIA_Image_Spec, MUII_PopFile,
              MUIA_InputMode, MUIV_InputMode_RelVerify,
            TAG_END),
          TAG_END),
        TAG_END),
        MUIA_Group_Child, NewObject (MP3Class->mcc_Class, NULL,
          MUIA_UserData, OBJ_MP3,
        TAG_END),
        MUIA_Group_Child, MUI_NewObject (MUIC_Text,
          MUIA_Frame, MUIV_Frame_Button,
          MUIA_Background, MUII_ButtonBack,
          MUIA_Font, MUIV_Font_Button,
          MUIA_InputMode, MUIV_InputMode_RelVerify,
          MUIA_ControlChar, 'w',
          MUIA_Text_HiChar, 'w',
          MUIA_Text_Contents, (long)"\33cWrite tags",
          MUIA_UserData, OBJ_WRITE,
          MUIA_CycleChain, TRUE,
        TAG_END),
      TAG_END),
    TAG_END),
    MUIA_Application_Window, About = NewObject (AboutClass->mcc_Class, NULL,
      MUIA_Window_Title, (long)"About TigerTagger",
      ABT_AboutText, (long)"\33c\33bTigerTagger v" VERSION "\33n\nMP3 tagging tool\ncreated by Krashan"
       "^BlaBla\n\33i<krashan@amiga.org.pl>\33n\n\33bBLABLA PRODUCT",
    TAG_END),

  TAG_END);

  return (long)App;
 }

/* Ustawienie notyfikacji na zamkniëcie okna */

void SetNotifications (void)
 {
  DoMethod (Win, MUIM_Notify, MUIA_Window_CloseRequest, MUIV_EveryTime, App, 2,
   MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);

  DoMethod (FindObj (OBJ_FILE, Win), MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
   MUIV_Notify_Self, 2, MUIM_CallHook, &h_FilePopClose);

  DoMethod (FindObj (OBJ_WRITE, Win), MUIM_Notify, MUIA_Pressed, FALSE,
   FindObj (OBJ_FILE, Win), 2, MUIM_CallHook, &h_WriteTagsNow);

  DoMethod (FindObj (MP3_GENRE, FindObj (OBJ_MP3, Win)), MUIM_Notify, MUIA_Text_Contents,
   MUIV_EveryTime, Win, 3, MUIM_Set, MUIA_Window_ActiveObject, FindObj (OBJ_WRITE, Win));

  DoMethod (App, MUIM_Notify, MUIA_Application_MenuAction, MENU_ABOUT, About, 3, MUIM_Set,
   MUIA_Window_Open, TRUE);

  DoMethod (App, MUIM_Notify, MUIA_Application_MenuAction, MENU_MUIABOUT, App, 2,
   MUIM_Application_AboutMUI, Win);

  DoMethod (App, MUIM_Notify, MUIA_Application_MenuAction, MENU_MUISET, App, 2,
   MUIM_Application_OpenConfigWindow, 0);

  DoMethod (App, MUIM_Notify, MUIA_Application_MenuAction, MENU_QUIT, App, 2,
   MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);

  xset (Win, MUIA_Window_ActiveObject, (long)FindObj (OBJ_FILE, Win));
  xset (About, MUIA_Window_RefWindow, (long)Win);

  return;
 }

/* pëtla gîówna programu */

void MainLoop (void)
 {
  long signals;

  xset (Win, MUIA_Window_Open, TRUE);

  while (DoMethod (App, MUIM_Application_NewInput, &signals) !=
   MUIV_Application_ReturnID_Quit)
   {
    if (signals)
     {
      signals = Wait (signals | SIGBREAKF_CTRL_C);
      if (signals & SIGBREAKF_CTRL_C) break;
     }
   }

  xset (Win, MUIA_Window_Open, FALSE);
  return;
 }

long CreateClasses (void)
 {
  if (!CreateMP3Class ()) return FALSE;
  if (!CreateAboutClass ()) return FALSE;
  return TRUE;
 }

void DeleteClasses (void)
 {
  DeleteMP3Class ();
  DeleteAboutClass ();
  return;
 }

/* gîówna funkcja programu */

int Main (void)
 {
  if (IntuitionBase = OpenLibrary ("intuition.library", 37))
   {
    if (MUIMasterBase = OpenLibrary ("muimaster.library", 19))
     {
      if (UtilityBase = OpenLibrary ("utility.library", 37))
       {
        if (CreateClasses ())
         {
          if (BuildApplication ())
           {
            SetNotifications ();
            MainLoop ();
            MUI_DisposeObject (App);
           }
          DeleteClasses ();
         }
        CloseLibrary (UtilityBase);
       }
      CloseLibrary (MUIMasterBase);
     }
    CloseLibrary (IntuitionBase);
   }
  return 0;
 }
