#include "alfonts.h"
#include "darray.h"
#include "al.h"
#include "assert.h"
#include "registry.h"
#include "Mintrins.h"
#include "sysdep.h"
#include <X11/Xlib.h>
#include <X11/Shell.h>
#include <X11/Vendor.h>
#include <Xm/LabelG.h>

static Registry DisplayToFonts=NULL;

static XmFontList alfonts_load PROTOTYPE((Widget,Registry,AlFontsMask));

char* AlFonts_font_names[ALFONTS_MAX_FONTS] = {
  "alfonts_text",
  "alfonts_major_heading" ,
  "alfonts_minor_heading" ,
  "alfonts_buttons"       ,
};


char* AlFonts_widget_names[ALFONTS_MAX_FONTS] = {
  "argus-text",
  "argus-major-heading" ,
  "argus-minor-heading" ,
  "argus-buttons"       ,
};

/*--------------------------------------------------*/
NORET AlFonts_init()
{
  if (DisplayToFonts==NULL)
    DisplayToFonts=Registry_create(Registry_ptrcmp,
				   Registry_ptrhash);
}

/*--------------------------------------------------*/
XFontStruct* AlFonts_get_from_widget(w,name)
Widget w;
char *name;
{
  static Widget shell=NULL;
  Widget testw;
  XmFontList fontList;
  XFontStruct* font;
  
  if (shell==NULL)
    shell=XtCreatePopupShell("alfonts-shell",
			     vendorShellWidgetClass,
			     w,
			     NULL,
			     0);

  testw=XtCreateWidget(name,
		       xmLabelGadgetClass,
		       shell,
		       NULL, 0);
  
  fontList=(XmFontList)Alxt_get_widget_feature(testw,XmNfontList);
  if (fontList==NULL)
    font=NULL;
  else
    font=(fontList[0]).font;
  XtDestroyWidget(testw);
  return(font);
}

/*--------------------------------------------------*/
XmFontList AlFonts_get(w)
     Widget w;
{
  XmFontList Fonts;
  Display *display;
  Registry FontsOfDisplay;
  assert(w);
  display=XtDisplay(w);

  if ((FontsOfDisplay=(Registry)Registry_get(DisplayToFonts,
					     display))==NULL) { 
    FontsOfDisplay=Registry_create(Registry_ptrcmp,Registry_ptrhash);
    Registry_add(DisplayToFonts,(VOIDP)display,(VOIDP)FontsOfDisplay);
  }
  Fonts=alfonts_load(w,
		     FontsOfDisplay, 
		     ALFONTS_MAJOR_HEADING_MASK |
		     ALFONTS_MINOR_HEADING_MASK |
		     ALFONTS_BUTTONS_MASK       |
		     ALFONTS_TEXT_MASK);
  assert(Fonts);
  return(Fonts);
}

/*--------------------------------------------------*/
XmFontList AlFonts_get_specific_fonts(w,FontMask)
     Widget w;
     AlFontsMask FontMask;
{
  XmFontList Fonts;
  Display *display;
  Registry FontsOfDisplay;
  assert(w);
  display=XtDisplay(w);

  if ((FontsOfDisplay=(Registry)Registry_get(DisplayToFonts,
					     display))==NULL) { 
    FontsOfDisplay=Registry_create(Registry_ptrcmp,Registry_ptrhash);
    Registry_add(DisplayToFonts,(VOIDP)display,(VOIDP)FontsOfDisplay);
  }
  Fonts=alfonts_load(w,FontsOfDisplay,FontMask);

  assert(Fonts);
  return(Fonts);
}
  

/*--------------------------------------------------*/
XmFontList alfonts_load(w,FontsOfDisplay,FontMask)
     Widget w;
     Registry FontsOfDisplay;
     AlFontsMask FontMask;
{
  XFontStruct *FS;
  XmFontList Fonts;
  char *name;
  int i,j;
  
  if ((Fonts=(XmFontList)Registry_get(FontsOfDisplay,(VOIDP)FontMask))==NULL) {
    for (j=1,i=0;i<ALFONTS_MAX_FONTS;j<<1,i++) {
      if ((FS=AlFonts_get_from_widget(w,AlFonts_widget_names[i]))==NULL)
	assert(0);
      if (i==0)
	Fonts=XmFontListCreate(FS,AlFonts_font_names[i]);
      else
	Fonts=XmFontListAdd(Fonts,FS,AlFonts_font_names[i]);
    }
    Registry_add(FontsOfDisplay,(VOIDP)FontMask,(VOIDP)Fonts);
  }
  return(Fonts);
}

    
/*--------------------------------------------------*/
NORET AlFonts_cleanup(w)
Widget w;
{
  /* don't do dink yet */
}



