/////////////////////////////////////////////////////////////////////////////
// Name:        settings.cpp
// Purpose:
// Author:      Robert Roebling
// Id:          $Id: settings.cpp,v 1.28 2001/02/06 14:23:44 juliansmart Exp $
// Copyright:   (c) 1998 Robert Roebling
// Licence:   	wxWindows licence
/////////////////////////////////////////////////////////////////////////////


#ifdef __GNUG__
#pragma implementation "settings.h"
#endif

#include "wx/settings.h"
#include "wx/debug.h"

#include "wx/cmndata.h"

#include <gdk/gdk.h>
#include <gdk/gdkprivate.h>
#include <gtk/gtk.h>

extern GdkFont *GtkGetDefaultGuiFont();


/*
#define wxSYS_COLOUR_SCROLLBAR         0
#define wxSYS_COLOUR_BACKGROUND        1
#define wxSYS_COLOUR_ACTIVECAPTION     2
#define wxSYS_COLOUR_INACTIVECAPTION   3
#define wxSYS_COLOUR_MENU              4
#define wxSYS_COLOUR_WINDOW            5
#define wxSYS_COLOUR_WINDOWFRAME       6
#define wxSYS_COLOUR_MENUTEXT          7
#define wxSYS_COLOUR_WINDOWTEXT        8
#define wxSYS_COLOUR_CAPTIONTEXT       9
#define wxSYS_COLOUR_ACTIVEBORDER      10
#define wxSYS_COLOUR_INACTIVEBORDER    11
#define wxSYS_COLOUR_APPWORKSPACE      12
#define wxSYS_COLOUR_HIGHLIGHT         13
#define wxSYS_COLOUR_HIGHLIGHTTEXT     14
#define wxSYS_COLOUR_BTNFACE           15
#define wxSYS_COLOUR_BTNSHADOW         16
#define wxSYS_COLOUR_GRAYTEXT          17
#define wxSYS_COLOUR_BTNTEXT           18
#define wxSYS_COLOUR_INACTIVECAPTIONTEXT 19
#define wxSYS_COLOUR_BTNHIGHLIGHT      20

#define wxSYS_COLOUR_3DDKSHADOW        21
#define wxSYS_COLOUR_3DLIGHT           22
#define wxSYS_COLOUR_INFOTEXT          23
#define wxSYS_COLOUR_INFOBK            24

#define wxSYS_COLOUR_DESKTOP           wxSYS_COLOUR_BACKGROUND
#define wxSYS_COLOUR_3DFACE            wxSYS_COLOUR_BTNFACE
#define wxSYS_COLOUR_3DSHADOW          wxSYS_COLOUR_BTNSHADOW
#define wxSYS_COLOUR_3DHIGHLIGHT       wxSYS_COLOUR_BTNHIGHLIGHT
#define wxSYS_COLOUR_3DHILIGHT         wxSYS_COLOUR_BTNHIGHLIGHT
#define wxSYS_COLOUR_BTNHILIGHT        wxSYS_COLOUR_BTNHIGHLIGHT
*/

#define SHIFT (8*(sizeof(short int)-sizeof(char)))

//wxColour *g_systemWinColour          = (wxColour *) NULL;
wxColour *g_systemBtnFaceColour       = (wxColour *) NULL;
wxColour *g_systemBtnShadowColour     = (wxColour *) NULL;
wxColour *g_systemBtnHighlightColour  = (wxColour *) NULL;
wxColour *g_systemHighlightColour     = (wxColour *) NULL;
wxColour *g_systemHighlightTextColour = (wxColour *) NULL;
wxColour *g_systemListBoxColour       = (wxColour *) NULL;
wxColour *g_systemBtnTextColour       = (wxColour *) NULL;

wxFont *g_systemFont = (wxFont *) NULL;

void wxSystemSettings::Done() 
{
//    delete g_systemWinColour;
    delete g_systemBtnFaceColour;
    delete g_systemBtnShadowColour;
    delete g_systemBtnHighlightColour;
    delete g_systemHighlightColour;
    delete g_systemHighlightTextColour;
    delete g_systemListBoxColour;
    delete g_systemFont;
    delete g_systemBtnTextColour;
}

wxColour wxSystemSettings::GetSystemColour( int index )
{
    switch (index)
    {
        case wxSYS_COLOUR_SCROLLBAR:
        case wxSYS_COLOUR_BACKGROUND:
        case wxSYS_COLOUR_ACTIVECAPTION:
        case wxSYS_COLOUR_INACTIVECAPTION:
        case wxSYS_COLOUR_MENU:
        case wxSYS_COLOUR_WINDOWFRAME:
        case wxSYS_COLOUR_ACTIVEBORDER:
        case wxSYS_COLOUR_INACTIVEBORDER:
        case wxSYS_COLOUR_BTNFACE:
        case wxSYS_COLOUR_3DLIGHT:
        {
            if (!g_systemBtnFaceColour)
            {
                GtkWidget *widget = gtk_button_new();
                GtkStyle *def = gtk_rc_get_style( widget );
                if (!def)
                    def = gtk_widget_get_default_style();
                if (def)
                {
                    int red = def->bg[GTK_STATE_NORMAL].red;
                    int green = def->bg[GTK_STATE_NORMAL].green;
                    int blue = def->bg[GTK_STATE_NORMAL].blue;
                    g_systemBtnFaceColour = 
	                    new wxColour( red    >> SHIFT,
	                                  green  >> SHIFT,
			                          blue   >> SHIFT );
                }
                else
                {
                    g_systemBtnFaceColour = 
	                    new wxColour( 0      >> SHIFT,
	                                  0      >> SHIFT,
			                          0x9c40 >> SHIFT );
                }
                gtk_widget_destroy( widget );

            }
            return *g_systemBtnFaceColour;
	    /*
            if (!g_systemBtnFaceColour)
            {
                g_systemBtnFaceColour = 
	                new wxColour( 0xd6d6 >> SHIFT,
	                              0xd6d6 >> SHIFT,
			                      0xd6d6 >> SHIFT );
            }
            return *g_systemBtnFaceColour;
	    */
        }
        case wxSYS_COLOUR_WINDOW:
        {
            return *wxWHITE;
        }
        case wxSYS_COLOUR_3DDKSHADOW:
        {
            return *wxBLACK;
        }
        case wxSYS_COLOUR_GRAYTEXT:
        case wxSYS_COLOUR_BTNSHADOW:
        //case wxSYS_COLOUR_3DSHADOW:
        {
            if (!g_systemBtnShadowColour)
            {
                wxColour faceColour(GetSystemColour(wxSYS_COLOUR_3DFACE));
                g_systemBtnShadowColour =
                   new wxColour((unsigned char) (faceColour.Red() * 0.666),
                                (unsigned char) (faceColour.Green() * 0.666),
                                (unsigned char) (faceColour.Blue() * 0.666));
	    }
  /*
            if (!g_systemBtnShadowColour)
            {
                g_systemBtnShadowColour = 
	                new wxColour( 0x7530 >> SHIFT,
	                              0x7530 >> SHIFT,
			                      0x7530 >> SHIFT );
            }
  */
            return *g_systemBtnShadowColour;
        }
        case wxSYS_COLOUR_3DHIGHLIGHT:
        //case wxSYS_COLOUR_BTNHIGHLIGHT:
        {
            return * wxWHITE;
/* I think this should normally be white (JACS 8/2000)
            if (!g_systemBtnHighlightColour)
            {
                g_systemBtnHighlightColour = 
	                new wxColour( 0xea60 >> SHIFT,
	                              0xea60 >> SHIFT,
			                      0xea60 >> SHIFT );
            }
            return *g_systemBtnHighlightColour;
*/
        }
        case wxSYS_COLOUR_HIGHLIGHT:
        {
            if (!g_systemHighlightColour)
            {
                GtkWidget *widget = gtk_button_new();
                GtkStyle *def = gtk_rc_get_style( widget );
                if (!def)
                    def = gtk_widget_get_default_style();
                if (def)
                {
                    int red = def->bg[GTK_STATE_SELECTED].red;
                    int green = def->bg[GTK_STATE_SELECTED].green;
                    int blue = def->bg[GTK_STATE_SELECTED].blue;
                    g_systemHighlightColour = 
	                    new wxColour( red    >> SHIFT,
	                                  green  >> SHIFT,
			                          blue   >> SHIFT );
                }
                else
                {
                    g_systemHighlightColour = 
	                    new wxColour( 0      >> SHIFT,
	                                  0      >> SHIFT,
			                          0x9c40 >> SHIFT );
                }
                gtk_widget_destroy( widget );

            }
            return *g_systemHighlightColour;
        }
        case wxSYS_COLOUR_LISTBOX:
        {
            if (!g_systemListBoxColour)
            {
                GtkWidget *widget = gtk_list_new();
                GtkStyle *def = gtk_rc_get_style( widget );
                if (!def) 
                    def = gtk_widget_get_default_style();
                if (def)
                {
                    int red = def->base[GTK_STATE_NORMAL].red;
                    int green = def->base[GTK_STATE_NORMAL].green;
                    int blue = def->base[GTK_STATE_NORMAL].blue;
                    g_systemListBoxColour = 
	                    new wxColour( red    >> SHIFT,
	                                  green  >> SHIFT,
			                          blue   >> SHIFT );
                }
                else
                    g_systemListBoxColour = new wxColour(*wxWHITE);
                gtk_widget_destroy( widget );
            }
            return *g_systemListBoxColour;
        }
    case wxSYS_COLOUR_MENUTEXT:
    case wxSYS_COLOUR_WINDOWTEXT:
    case wxSYS_COLOUR_CAPTIONTEXT:
    case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
    case wxSYS_COLOUR_BTNTEXT:
    case wxSYS_COLOUR_INFOTEXT:
    {
            if (!g_systemBtnTextColour)
            {
                GtkWidget *widget = gtk_button_new();
                GtkStyle *def = gtk_rc_get_style( widget );
                if (!def)
                    def = gtk_widget_get_default_style();
                if (def)
                {
                    int red = def->fg[GTK_STATE_NORMAL].red;
                    int green = def->fg[GTK_STATE_NORMAL].green;
                    int blue = def->fg[GTK_STATE_NORMAL].blue;
                    g_systemBtnTextColour = 
	                    new wxColour( red    >> SHIFT,
	                                  green  >> SHIFT,
			                          blue   >> SHIFT );
                }
                else
                {
                    g_systemBtnTextColour = 
		      new wxColour(0, 0, 0);
                }
                gtk_widget_destroy( widget );
            }
            return *g_systemBtnTextColour;
    }
    case wxSYS_COLOUR_HIGHLIGHTTEXT:
    {
        if (!g_systemHighlightTextColour)
		{
		    wxColour hclr = GetSystemColour(wxSYS_COLOUR_HIGHLIGHT);
			if (hclr.Red() > 200 && hclr.Green() > 200 && hclr.Blue() > 200)
			    g_systemHighlightTextColour = new wxColour(*wxBLACK);
			else
			    g_systemHighlightTextColour = new wxColour(*wxWHITE);
        }
        return *g_systemHighlightTextColour;
    }
    case wxSYS_COLOUR_INFOBK:
    case wxSYS_COLOUR_APPWORKSPACE:
    {
      return *wxWHITE;    // ?
    }
  }
  return *wxWHITE;
}

wxFont wxSystemSettings::GetSystemFont( int index ) 
{
    switch (index)
    {
        case wxSYS_OEM_FIXED_FONT:
        case wxSYS_ANSI_FIXED_FONT:
        case wxSYS_SYSTEM_FIXED_FONT:
        {
            return *wxNORMAL_FONT;
        }
        case wxSYS_ANSI_VAR_FONT:
        case wxSYS_SYSTEM_FONT:
        case wxSYS_DEVICE_DEFAULT_FONT:
        case wxSYS_DEFAULT_GUI_FONT:
        {
            if (!g_systemFont)
            {
#if 0
                GdkFont *gdk_font = GtkGetDefaultGuiFont();
                if (gdk_font)
                {
                    GSList *font_list = ((GdkFontPrivate*)gdk_font)->names;
                    char *name = (char*)font_list->data;
                    wxString font_string( name );
                    wxFontData font_data;
                    g_systemFont = new wxFont( font_string, font_data );
                }
                gtk_widget_destroy( widget );
#endif

                g_systemFont = new wxFont( 12, wxSWISS, wxNORMAL, wxNORMAL );
                
            }
            return *g_systemFont;
        }
    }

    return wxNullFont;
}

int wxSystemSettings::GetSystemMetric( int index )
{
    switch (index)
    {
        case wxSYS_SCREEN_X:   return gdk_screen_width();
        case wxSYS_SCREEN_Y:   return gdk_screen_height();
        case wxSYS_HSCROLL_Y:  return 15;
        case wxSYS_VSCROLL_X:  return 15;
    }
    
    wxCHECK_MSG( index, 0, wxT("wxSystemSettings::GetSystemMetric not fully implemented") );
    
    return 0;
}
