// Copyright Scott Ellis (mail@scottellis.com.au) 2005
// This software is licenced under the GPL (General Public Licence)
// available at http://www.gnu.org/copyleft/gpl.html
{$IFNDEF FONT_SERVICE_API}
{$DEFINE FONT_SERVICE_API}

const
// style flags
  DBFONTF_BOLD      = 1;
  DBFONTF_ITALIC    = 2;
  DBFONTF_UNDERLINE = 4;
  DBFONTF_STRIKEOUT = 8;
// flags for compatibility
  FIDF_APPENDNAME       = 1;   // append 'Name' to the setting used to store
                               // font face (as CLC settings require)
  FIDF_NOAS             = 2;   // disable the <prefix>As setting to prevent
                               // 'same as' behaviour
  FIDF_SAVEACTUALHEIGHT = 4;   // write the actual height of a test string to the db
  FIDF_SAVEPOINTSIZE    = 8;   // write the font point size to the db
// additional flags
  FIDF_DEFAULTVALID     = 32;  // the default font settings are valid - else,
                               // just use generic default
  FIDF_NEEDRESTART      = 64;  // setting changes will not take effect until
                               // miranda is restarted
  FIDF_ALLOWREREGISTER  = 128; // allow plugins to register this font again
                               // (i.e. override already registered settings
                               // such as flags)
  FIDF_ALLOWEFFECTS     = 256; // allow setting of font effects
                               // (i.e. underline and strikeout)
  FIDF_DISABLESTYLES    = 512; // don't allow to select font attributes (bold/underline/italics)
                               // FIDF_ALLOWEFFECTS has priority and will override this flag!

const
// font class
  FIDF_CLASSMASK    = $70000000;
  FIDF_CLASSHEADER  = $10000000;
  FIDF_CLASSGENERAL = $20000000;
  FIDF_CLASSSMALL   = $30000000;

type
// settings to be used for the value of 'deffontsettings' in the FontID
// structure below - i.e. defaults
  PFontSettings_tag = ^TFontSettings_tag;
  TFontSettings_tag = record
    colour  : TCOLORREF;
    size    : ShortInt;
    style   : byte; // see the DBFONTF_* flags above
    charset : byte;
    szFace  : array[0..(LF_FACESIZE)-1] of AnsiChar;
  end;
  TFontSettings = TFontSettings_tag;
  PFontSettings = ^TFontSettings;

  PFontSettingsW_tag = ^TFontSettingsW_tag;
  TFontSettingsW_tag = record
    colour  : TCOLORREF;
    size    : ShortInt;
    style   : byte; // see the DBFONTF_* flags above
    charset : byte;
    szFace  : array[0..(LF_FACESIZE)-1] of WideChar;
  end;
  TFontSettingsW = TFontSettingsW_tag;
  PFontSettingsW = ^TFontSettingsW;

type
// a font identifier structire - used for registering a font,
// and getting one out again
  PFontID_tag = ^TFontID_tag;
  TFontID_tag = record
    cbSize         : int;
    // [TRANSLATED-BY-CORE] group the font belongs to - this is the 'Font Group' list in the options page
    group          : array[0..63] of AnsiChar;
    // [TRANSLATED-BY-CORE] the name of the font setting e.g. 'contacts' in the 'contact list' group
    name           : array[0..63] of AnsiChar;
    // the 'module' in the database where the font data is stored
    dbSettingsGroup: array[0..31] of AnsiChar;
    // prepended to the settings used to store this font's data in the db
    prefix         : array[0..31] of AnsiChar;
    // bitwise OR of the FIDF_* flags above
    flags          : dword;
    deffontsettings: TFontSettings; // defaults, if flags & FIDF_DEFAULTVALID
    // controls the order in the font group in which the fonts are listed in the
    // UI (if order fields are equal, they will be ordered alphabetically by name)
    order          : int;
    backgroundGroup:array [0..63] of AnsiChar;
    backgroundName: array [0..63] of AnsiChar;
  end;
  TFontID = TFontID_tag;
  pFontID = ^TFontID;

  PFontIDW_tag = ^TFontIDW_tag;
  TFontIDW_tag = record
    cbSize         : int;
    // [TRANSLATED-BY-CORE] group the font belongs to - this is the 'Font Group' list in the options page
    group          : array[0..63] of WideChar;
    // [TRANSLATED-BY-CORE] the name of the font setting e.g. 'contacts' in the 'contact list' group
    name           : array[0..63] of WideChar;
    // the 'module' in the database where the font data is stored
    dbSettingsGroup: array[0..31] of AnsiChar;
    // prepended to the settings used to store this font's data in the db
    prefix         : array[0..31] of AnsiChar;
    // bitwise OR of the FIDF_* flags above
    flags          : dword;
    deffontsettings: TFontSettingsW; // defaults, if flags & FIDF_DEFAULTVALID
    // controls the order in the font group in which the fonts are listed in the
    // UI (if order fields are equal, they will be ordered alphabetically by name)
    order          : int;
    backgroundGroup:array [0..63] of WideChar;
    backgroundName: array [0..63] of WideChar;
  end;
  TFontIDW = TFontIDW_tag;
  PFontIDW = ^TFontIDW;

const
  { fired when a user modifies font settings, so reget your fonts }
  ME_FONT_RELOAD:PAnsiChar = 'Font/Reload';

function Font_Register(pFont:pFontID; hLang:int) : int; stdcall; external AppDll;
function Font_Get(pGroup,pName:pAnsiChar; pFont:pLogFontA) : longint; stdcall; external AppDll;

type
  PColourID_tag = ^TColourID_tag;
  TColourID_tag = record
    cbSize          : int;
    group           : array[0..63] of AnsiChar;
    name            : array[0..63] of AnsiChar;
    dbSettingsGroup : array[0..31] of AnsiChar;
    setting         : array[0..31] of AnsiChar;
    flags           : dword;     // not used
    defcolour       : TCOLORREF; // default value
    order           : int;
  end;
  TColourID = TColourID_tag;
  PColourID = ^TColourID;

  PColourIDW_tag = ^TColourIDW_tag;
  TColourIDW_tag = record
    cbSize          : int;
    group           : array[0..63] of WideChar;
    name            : array[0..63] of WideChar;
    dbSettingsGroup : array[0..31] of AnsiChar;
    setting         : array[0..31] of AnsiChar;
    flags           : dword;     // not used
    defcolour       : TCOLORREF; // default value
    order           : int;
  end;
  TColourIDW = TColourIDW_tag;
  PColourIDW = ^TColourIDW;

const
  { fired when a user modifies font settings, so reget your fonts and colours }
  ME_COLOUR_RELOAD:PAnsiChar = 'Colour/Reload';

function Colour_Register(pColour:pColourID; hLang:int) : int; stdcall; external AppDll;
function Colour_Get(pGroup,pName:pAnsiChar) : longint; stdcall; external AppDll;

//////////////////////////////////////////////////////////////////////////
//
//  EFFECTS
//
type
  FONTEFFECT_tag = record
    effectIndex    :byte;
    baseColour     :dword; // ARGB
    secondaryColour:dword; // ARGB
  end;
  TFONTEFFECT = FONTEFFECT_tag;

type
  EffectID_tag = record
    cbSize         :int;
    group          :array [0..63] of AnsiChar;
    name           :array [0..63] of AnsiChar;
    dbSettingsGroup:array [0..31] of AnsiChar;
    setting        :array [0..31] of AnsiChar;
    flags          :dword;
    defeffect      :TFONTEFFECT;
    order          :int;
    value          :TFONTEFFECT;
  end;
  PEffectID = ^TEffectID;
  TEffectID = EffectID_tag;

type
  EffectIDW_tag = record
    cbSize         :int;
    group          :array [0..63] of WideChar;
    name           :array [0..63] of WideChar;
    dbSettingsGroup:array [0..31] of AnsiChar;
    setting        :array [0..31] of AnsiChar;
    flags          :dword;
    defeffect      :TFONTEFFECT;
    order          :int;
    value          :TFONTEFFECT;
  end;
  PEffectIDW = ^TEffectIDW;
  TEffectIDW = EffectIDW_tag;

const
// fired when a user modifies font settings, so reget your fonts and colours
// wparam = lparam = 0
  ME_EFFECT_RELOAD:PAnsiChar = 'Effect/Reload';

{$ENDIF}