/*
    ####             #    #     # #
    #   #            #    #       #          The FreeWare C library for 
    #   #  ##   ###  #  # #     # ###             RISC OS machines
    #   # #  # #     # #  #     # #  #   ___________________________________
    #   # ####  ###  ##   #     # #  #                                      
    #   # #        # # #  #     # #  #    Please refer to the accompanying
    ####   ### ####  #  # ##### # ###    documentation for conditions of use
    ________________________________________________________________________

    File:    Menu.GetFlags.c
    Author:  Ben Summers
    Version: 1.00 (21 Oct 94)
    Purpose: Makes a Font menu
*/

#include "swis.h"

#include <string.h>
#include <stdio.h>

#include "Desk.Wimp.h"
#include "Desk.Menu.h"
#include "Desk.SWI.h"
#include "Desk.Error2.h"



  /* minimum version to use font manager font menus * 100 */
#define Desk_MIN_NEW_FONT_VERSION 307 

#define NEW     0
#define OLD     1
#define UNKNOWN 2

#define Desk_XFont_CacheAddr 0x40080 + Desk_XOS_Bit
#define Desk_XFont_ListFonts 0x40091 + Desk_XOS_Bit
#define Desk_Font_CacheAddr 0x40080
#define Desk_Font_ListFonts 0x40091

static int version = UNKNOWN;

static Desk_menu_ptr Desk_font_menu = 0;
static int entries;
static int Desk_last_ticked = -1;

static Desk_bool Desk_new_font_manager(void)
{
  if(version == UNKNOWN) {
    int v;
    if(
    	/*Desk_SWI(0, 1, Desk_XFont_CacheAddr, &v) != 0*/
    	_swix( Font_CacheAddr, _OUT(0), &v)
	 || v < Desk_MIN_NEW_FONT_VERSION
    	) {
      version = OLD;
    } else {
      version = NEW;
    }
  }

  return (version == NEW) ? Desk_bool_TRUE : Desk_bool_FALSE;
}

Desk_menu_ptr Desk_Menu_FontMenu(Desk_bool sysfont, const char *tick)
{
  if(Desk_new_font_manager()) {
    return Desk_Menu_FontMenu3(sysfont, tick);
  } else {
    int l;

    if(Desk_font_menu == 0) {    /* make the font menu */
      Desk_bool created = Desk_bool_FALSE;
      int count = 0;
      char name[64];

      entries = 0;

      do {
      Desk_Error2_CheckOS( 
      	_swix( Font_ListFonts, _INR(0,3)|_OUT(2),
      		0, (int)name, count, -1, &count
      		)
      	);
      	/*Desk_SWI2(4, 3, Desk_Font_ListFonts, 0, (int)name, count, -1, 0, 0, &count);*/

        if(created == Desk_bool_FALSE) {
          char text[128];
          if(sysfont) {
            sprintf(text, "System font, %s", name);
            entries++; 
          }

          if((Desk_font_menu = Desk_Menu_New("Fonts", sysfont?text:name)) == 0)
            return 0;

          created = Desk_bool_TRUE;
        } else {
          Desk_font_menu = Desk_Menu_Extend(Desk_font_menu, name);
        }

        entries++;

      } while(count != -1);
    }

    if(Desk_last_ticked != -1) {
      Desk_Menu_SetFlags(Desk_font_menu, Desk_last_ticked, Desk_bool_FALSE, Desk_bool_FALSE);
      Desk_last_ticked = -1;
    }

    if(tick != Desk_Menu_FontMenu_NOTICK) {
      if(tick == Desk_Menu_FontMenu_TICKSYSFONT) {
        Desk_last_ticked = 0;
      } else {
        for(l = 0; l < entries; l++) {
          if(strcmp(Desk_Menu_GetText(Desk_font_menu, l), tick) == 0) {
            Desk_last_ticked = l;
            break;
          }
        }
      }

      if(Desk_last_ticked != -1) {
        Desk_Menu_SetFlags(Desk_font_menu, Desk_last_ticked, Desk_bool_TRUE, Desk_bool_FALSE);
        Desk_last_ticked = -1;
      }
    }

    return Desk_menu_fontmenu = Desk_font_menu;

  }

  return 0;
}

extern char *Desk_Menu_FontMenuDecode(const int *selection)
{
  if(Desk_new_font_manager()) {
    return Desk_Menu_FontMenuDecode3(selection);
  } else {
    return Desk_Menu_GetText(Desk_font_menu, *selection);
  }
}





/* JS 16 Apr 1995*	*/
/* Support for DLL	*/
/*
Desk_menu_fontmenu is actually defined in FontMenu3.s, but we will put the
veneer function here...
*/
#ifdef _DLL
extern Desk_menu_ptr Desk_menu_fontmenu;
Desk_menu_ptr		*Desk_Menu__Ref_fontmenu( void)	{ return &Desk_menu_fontmenu;	}
#endif

