iup-stack/iup/srcscintilla/iupsci_style.c

553 lines
17 KiB
C
Raw Normal View History

2023-02-20 16:44:45 +00:00
/** \file
* \brief Scintilla control: Style Definition
*
* See Copyright Notice in "iup.h"
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <Scintilla.h>
#include "iup.h"
#include "iup_drvfont.h"
#include "iup_object.h"
#include "iup_attrib.h"
#include "iup_str.h"
#include "iupsci.h"
/***** STYLE DEFINITION *****
SCI_STYLERESETDEFAULT
SCI_STYLECLEARALL
SCI_STYLESETFONT(int styleNumber, char *fontName)
SCI_STYLEGETFONT(int styleNumber, char *fontName)
SCI_STYLESETSIZE(int styleNumber, int sizeInPoints)
SCI_STYLEGETSIZE(int styleNumber)
SCI_STYLESETSIZEFRACTIONAL(int styleNumber, int sizeInHundredthPoints)
SCI_STYLEGETSIZEFRACTIONAL(int styleNumber)
SCI_STYLESETBOLD(int styleNumber, bool bold)
SCI_STYLEGETBOLD(int styleNumber)
SCI_STYLESETWEIGHT(int styleNumber, int weight)
SCI_STYLEGETWEIGHT(int styleNumber)
SCI_STYLESETITALIC(int styleNumber, bool italic)
SCI_STYLEGETITALIC(int styleNumber)
SCI_STYLESETUNDERLINE(int styleNumber, bool underline)
SCI_STYLEGETUNDERLINE(int styleNumber)
SCI_STYLESETFORE(int styleNumber, int colour)
SCI_STYLEGETFORE(int styleNumber)
SCI_STYLESETBACK(int styleNumber, int colour)
SCI_STYLEGETBACK(int styleNumber)
SCI_STYLESETEOLFILLED(int styleNumber, bool eolFilled)
SCI_STYLEGETEOLFILLED(int styleNumber)
SCI_STYLESETCHARACTERSET(int styleNumber, int charSet)
SCI_STYLEGETCHARACTERSET(int styleNumber)
SCI_STYLESETCASE(int styleNumber, int caseMode)
SCI_STYLEGETCASE(int styleNumber)
SCI_STYLESETVISIBLE(int styleNumber, bool visible)
SCI_STYLEGETVISIBLE(int styleNumber)
--SCI_STYLESETCHANGEABLE(int styleNumber, bool changeable)
--SCI_STYLEGETCHANGEABLE(int styleNumber)
SCI_STYLESETHOTSPOT(int styleNumber, bool hotspot)
SCI_STYLEGETHOTSPOT(int styleNumber)*/
static char* iScintillaGetCaseStyleAttrib(Ihandle* ih, int style)
{
int caseSty;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
caseSty = (int)IupScintillaSendMessage(ih, SCI_STYLEGETCASE, style, 0);
if(caseSty == SC_CASE_UPPER)
return "UPPERCASE";
else if(caseSty == SC_CASE_LOWER)
return "LOWERCASE";
else
return "SC_CASE_MIXED";
}
static int iScintillaSetCaseStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (iupStrEqualNoCase(value, "UPPERCASE"))
IupScintillaSendMessage(ih, SCI_STYLESETCASE, style, SC_CASE_UPPER);
else if (iupStrEqualNoCase(value, "LOWERCASE"))
IupScintillaSendMessage(ih, SCI_STYLESETCASE, style, SC_CASE_LOWER);
else
IupScintillaSendMessage(ih, SCI_STYLESETCASE, style, SC_CASE_MIXED); /* default */
return 0;
}
static char* iScintillaGetVisibleStyleAttrib(Ihandle* ih, int style)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
return iupStrReturnBoolean((int)IupScintillaSendMessage(ih, SCI_STYLEGETVISIBLE, style, 0));
}
static int iScintillaSetVisibleStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (iupStrBoolean(value))
IupScintillaSendMessage(ih, SCI_STYLESETVISIBLE, style, 1);
else
IupScintillaSendMessage(ih, SCI_STYLESETVISIBLE, style, 0);
return 0;
}
static char* iScintillaGetHotSpotStyleAttrib(Ihandle* ih, int style)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
return iupStrReturnBoolean((int)IupScintillaSendMessage(ih, SCI_STYLEGETHOTSPOT, style, 0));
}
static int iScintillaSetHotSpotStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (iupStrBoolean(value))
IupScintillaSendMessage(ih, SCI_STYLESETHOTSPOT, style, 1);
else
IupScintillaSendMessage(ih, SCI_STYLESETHOTSPOT, style, 0);
return 0;
}
static char* iScintillaGetCharSetStyleAttrib(Ihandle* ih, int style)
{
int charset;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
charset = (int)IupScintillaSendMessage(ih, SCI_STYLEGETCHARACTERSET, style, 0);
if(charset == SC_CHARSET_EASTEUROPE)
return "EASTEUROPE";
else if(charset == SC_CHARSET_RUSSIAN)
return "RUSSIAN";
else if(charset == SC_CHARSET_GB2312)
return "GB2312";
else if(charset == SC_CHARSET_HANGUL)
return "HANGUL";
else if(charset == SC_CHARSET_SHIFTJIS)
return "SHIFTJIS";
else
return "ANSI";
}
static int iScintillaSetCharSetStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
/* These character sets are supported both on Windows as on GTK */
if (iupStrEqualNoCase(value, "EASTEUROPE"))
IupScintillaSendMessage(ih, SCI_STYLESETCHARACTERSET, style, SC_CHARSET_EASTEUROPE);
else if (iupStrEqualNoCase(value, "RUSSIAN"))
IupScintillaSendMessage(ih, SCI_STYLESETCHARACTERSET, style, SC_CHARSET_RUSSIAN);
else if (iupStrEqualNoCase(value, "GB2312")) /* Chinese charset */
IupScintillaSendMessage(ih, SCI_STYLESETCHARACTERSET, style, SC_CHARSET_GB2312);
else if (iupStrEqualNoCase(value, "HANGUL")) /* Korean charset */
IupScintillaSendMessage(ih, SCI_STYLESETCHARACTERSET, style, SC_CHARSET_HANGUL);
else if (iupStrEqualNoCase(value, "SHIFTJIS")) /* Japanese charset */
IupScintillaSendMessage(ih, SCI_STYLESETCHARACTERSET, style, SC_CHARSET_SHIFTJIS);
else
IupScintillaSendMessage(ih, SCI_STYLESETCHARACTERSET, style, SC_CHARSET_ANSI); /* default */
return 0;
}
static char* iScintillaGetEolFilledStyleAttrib(Ihandle* ih, int style)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
return iupStrReturnBoolean((int)IupScintillaSendMessage(ih, SCI_STYLEGETEOLFILLED, style, 0));
}
static int iScintillaSetEolFilledStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (iupStrBoolean(value))
IupScintillaSendMessage(ih, SCI_STYLESETEOLFILLED, style, 1);
else
IupScintillaSendMessage(ih, SCI_STYLESETEOLFILLED, style, 0);
return 0;
}
static char* iScintillaGetFontSizeFracStyleAttrib(Ihandle* ih, int style)
{
int size;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
size = (int)IupScintillaSendMessage(ih, SCI_STYLESETSIZEFRACTIONAL, style, 0);
return iupStrReturnDouble((double)size / (double)SC_FONT_SIZE_MULTIPLIER);
}
static int iScintillaSetFontSizeFracStyleAttrib(Ihandle* ih, int style, const char* value)
{
double size;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
iupStrToDouble(value, &size);
IupScintillaSendMessage(ih, SCI_STYLESETSIZEFRACTIONAL, style, (int)(size*SC_FONT_SIZE_MULTIPLIER));
return 0;
}
static char* iScintillaGetFontSizeStyleAttrib(Ihandle* ih, int style)
{
int size;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
size = (int)IupScintillaSendMessage(ih, SCI_STYLEGETSIZE, style, 0);
return iupStrReturnInt(size);
}
static int iScintillaSetFontSizeStyleAttrib(Ihandle* ih, int style, const char* value)
{
int size;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
iupStrToInt(value, &size);
IupScintillaSendMessage(ih, SCI_STYLESETSIZE, style, size);
return 0;
}
static char* iScintillaGetFontStyleAttrib(Ihandle* ih, int style)
{
char* str = iupStrGetMemory(15);
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
IupScintillaSendMessage(ih, SCI_STYLEGETFONT, style, (sptr_t)str);
return str;
}
static int iScintillaSetFontStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
IupScintillaSendMessage(ih, SCI_STYLESETFONT, style, (sptr_t)value);
return 0;
}
static char* iScintillaGetWeightStyleAttrib(Ihandle* ih, int style)
{
int weight = (int)IupScintillaSendMessage(ih, SCI_STYLEGETWEIGHT, style, 0);
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
weight = (int)IupScintillaSendMessage(ih, SCI_STYLEGETWEIGHT, style, 0);
return iupStrReturnInt(weight);
}
static int iScintillaSetWeightStyleAttrib(Ihandle* ih, int style, const char* value)
{
int weight = 0;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (!value || value[0]==0 || iupStrEqualNoCase(value, "NORMAL"))
weight = 400;
else if (iupStrEqualNoCase(value, "SEMIBOLD"))
weight = 600;
else if (iupStrEqualNoCase(value, "BOLD"))
weight = 700;
else
{
iupStrToInt(value, &weight);
if(weight < 1)
weight = 1;
if(weight > 999)
weight = 999;
}
IupScintillaSendMessage(ih, SCI_STYLESETWEIGHT, style, weight);
return 0;
}
static char* iScintillaGetUnderlineStyleAttrib(Ihandle* ih, int style)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
return iupStrReturnBoolean((int)IupScintillaSendMessage(ih, SCI_STYLEGETUNDERLINE, style, 0));
}
static int iScintillaSetUnderlineStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (iupStrBoolean(value))
IupScintillaSendMessage(ih, SCI_STYLESETUNDERLINE, style, 1);
else
IupScintillaSendMessage(ih, SCI_STYLESETUNDERLINE, style, 0);
return 0;
}
static char* iScintillaGetItalicStyleAttrib(Ihandle* ih, int style)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
return iupStrReturnBoolean((int)IupScintillaSendMessage(ih, SCI_STYLEGETITALIC, style, 0));
}
static int iScintillaSetItalicStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (iupStrBoolean(value))
IupScintillaSendMessage(ih, SCI_STYLESETITALIC, style, 1);
else
IupScintillaSendMessage(ih, SCI_STYLESETITALIC, style, 0);
return 0;
}
static char* iScintillaGetBoldStyleAttrib(Ihandle* ih, int style)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
return iupStrReturnBoolean((int)IupScintillaSendMessage(ih, SCI_STYLEGETBOLD, style, 0));
}
static int iScintillaSetBoldStyleAttrib(Ihandle* ih, int style, const char* value)
{
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
if (iupStrBoolean(value))
IupScintillaSendMessage(ih, SCI_STYLESETBOLD, style, 1);
else
IupScintillaSendMessage(ih, SCI_STYLESETBOLD, style, 0);
return 0;
}
static char* iScintillaGetFgColorStyleAttrib(Ihandle* ih, int style)
{
long color;
unsigned char r, g, b;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
color = (int)IupScintillaSendMessage(ih, SCI_STYLEGETFORE, style, 0);
iupScintillaDecodeColor(color, &r, &g, &b);
return iupStrReturnRGB(r, g, b);
}
static int iScintillaSetFgColorStyleAttrib(Ihandle* ih, int style, const char* value)
{
unsigned char r, g, b;
if (!iupStrToRGB(value, &r, &g, &b))
return 0;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
IupScintillaSendMessage(ih, SCI_STYLESETFORE, style, iupScintillaEncodeColor(r, g, b));
return 0;
}
static char* iScintillaGetBgColorStyleAttrib(Ihandle* ih, int style)
{
long color;
unsigned char r, g, b;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
color = (int)IupScintillaSendMessage(ih, SCI_STYLEGETBACK, style, 0);
iupScintillaDecodeColor(color, &r, &g, &b);
return iupStrReturnRGB(r, g, b);
}
static int iScintillaSetBgColorStyleAttrib(Ihandle* ih, int style, const char* value)
{
unsigned char r, g, b;
if (!iupStrToRGB(value, &r, &g, &b))
return 0;
if(style == IUP_INVALID_ID)
style = 0; /* Lexer style default */
IupScintillaSendMessage(ih, SCI_STYLESETBACK, style, iupScintillaEncodeColor(r, g, b));
return 0;
}
static int iScintillaSetClearAllStyleAttrib(Ihandle* ih, const char* value)
{
(void)value;
IupScintillaSendMessage(ih, SCI_STYLECLEARALL, 0, 0);
return 0;
}
static int iScintillaSetResetDefaultStyleAttrib(Ihandle* ih, const char* value)
{
(void)value;
IupScintillaSendMessage(ih, SCI_STYLERESETDEFAULT, 0, 0);
return 0;
}
static int iScintillaSetStartStylingAttrib(Ihandle *ih, const char *value)
{
int pos;
if (iupStrToInt(value, &pos))
IupScintillaSendMessage(ih, SCI_STARTSTYLING, pos, 0x1f); /* mask=31 */
return 0;
}
static int iScintillaSetStylingAttrib(Ihandle* ih, int style, const char* value)
{
int length;
if (iupStrToInt(value, &length))
IupScintillaSendMessage(ih, SCI_SETSTYLING, length, style);
return 0;
}
static int iScintillaSetFontAttrib(Ihandle* ih, const char* value)
{
if (!ih->handle)
return iupdrvSetFontAttrib(ih, value);
else
{
int i, size = 0,
is_bold = 0,
is_italic = 0,
is_underline = 0,
is_strikeout = 0;
char typeface[1024];
if (!iupdrvSetFontAttrib(ih, value))
return 0;
if (!iupGetFontInfo(value, typeface, &size, &is_bold, &is_italic, &is_underline, &is_strikeout))
return 0;
for (i = 0; i < 256; i++)
{
IupScintillaSendMessage(ih, SCI_STYLESETFONT, i, (sptr_t)typeface);
IupScintillaSendMessage(ih, SCI_STYLESETSIZE, i, size);
IupScintillaSendMessage(ih, SCI_STYLESETBOLD, i, is_bold);
IupScintillaSendMessage(ih, SCI_STYLESETITALIC, i, is_italic);
IupScintillaSendMessage(ih, SCI_STYLESETUNDERLINE, i, is_underline);
}
return 1;
}
}
static int iScintillaSetFgColorAttrib(Ihandle *ih, const char *value)
{
unsigned char r, g, b;
long fgcolor;
int i;
if (!iupStrToRGB(value, &r, &g, &b))
return 0;
fgcolor = iupScintillaEncodeColor(r, g, b);
for (i = 0; i < 256; i++)
IupScintillaSendMessage(ih, SCI_STYLESETFORE, i, fgcolor);
return 1;
}
static int iScintillaSetBgColorAttrib(Ihandle *ih, const char *value)
{
unsigned char r, g, b;
long fgcolor;
int i;
if (!iupStrToRGB(value, &r, &g, &b))
return 0;
fgcolor = iupScintillaEncodeColor(r, g, b);
for (i = 0; i < 256; i++)
IupScintillaSendMessage(ih, SCI_STYLESETBACK, i, fgcolor);
return 1;
}
void iupScintillaRegisterStyle(Iclass* ic)
{
iupClassRegisterAttribute(ic, "FONT", NULL, iScintillaSetFontAttrib, IUPAF_SAMEASSYSTEM, "DEFAULTFONT", IUPAF_NOT_MAPPED); /* inherited */
iupClassRegisterAttribute(ic, "BGCOLOR", NULL, iScintillaSetBgColorAttrib, IUPAF_SAMEASSYSTEM, "TXTBGCOLOR", IUPAF_DEFAULT);
iupClassRegisterAttribute(ic, "FGCOLOR", NULL, iScintillaSetFgColorAttrib, IUPAF_SAMEASSYSTEM, "TXTFGCOLOR", IUPAF_DEFAULT); /* usually black */
iupClassRegisterAttribute(ic, "STYLERESET", NULL, iScintillaSetResetDefaultStyleAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "STYLECLEARALL", NULL, iScintillaSetClearAllStyleAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEFONT", iScintillaGetFontStyleAttrib, iScintillaSetFontStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEFONTSIZE", iScintillaGetFontSizeStyleAttrib, iScintillaSetFontSizeStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEFONTSIZEFRAC", iScintillaGetFontSizeFracStyleAttrib, iScintillaSetFontSizeFracStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEBOLD", iScintillaGetBoldStyleAttrib, iScintillaSetBoldStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEWEIGHT", iScintillaGetWeightStyleAttrib, iScintillaSetWeightStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEITALIC", iScintillaGetItalicStyleAttrib, iScintillaSetItalicStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEUNDERLINE", iScintillaGetUnderlineStyleAttrib, iScintillaSetUnderlineStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEFGCOLOR", iScintillaGetFgColorStyleAttrib, iScintillaSetFgColorStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEBGCOLOR", iScintillaGetBgColorStyleAttrib, iScintillaSetBgColorStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEEOLFILLED", iScintillaGetEolFilledStyleAttrib, iScintillaSetEolFilledStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLECHARSET", iScintillaGetCharSetStyleAttrib, iScintillaSetCharSetStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLECASE", iScintillaGetCaseStyleAttrib, iScintillaSetCaseStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEVISIBLE", iScintillaGetVisibleStyleAttrib, iScintillaSetVisibleStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLEHOTSPOT", iScintillaGetHotSpotStyleAttrib, iScintillaSetHotSpotStyleAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "STARTSTYLING", NULL, iScintillaSetStartStylingAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "STYLING", NULL, iScintillaSetStylingAttrib, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
}