380 lines
13 KiB
C
380 lines
13 KiB
C
|
/** \file
|
||
|
* \brief Scintilla control: Markers
|
||
|
*
|
||
|
* 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_object.h"
|
||
|
#include "iup_attrib.h"
|
||
|
#include "iup_str.h"
|
||
|
#include "iup_image.h"
|
||
|
|
||
|
#include "iupsci.h"
|
||
|
|
||
|
/***** MARKERS *****
|
||
|
SCI_MARKERDEFINE(int markerNumber, int markerSymbols)
|
||
|
--SCI_MARKERDEFINEPIXMAP(int markerNumber, const char *xpm)
|
||
|
SCI_RGBAIMAGESETWIDTH(int width)
|
||
|
SCI_RGBAIMAGESETHEIGHT(int height)
|
||
|
SCI_RGBAIMAGESETSCALE(int scalePercent)
|
||
|
SCI_MARKERDEFINERGBAIMAGE(int markerNumber, const char *pixels)
|
||
|
SCI_MARKERSYMBOLDEFINED(int markerNumber)
|
||
|
SCI_MARKERSETFORE(int markerNumber, int colour)
|
||
|
SCI_MARKERSETBACK(int markerNumber, int colour)
|
||
|
SCI_MARKERSETBACKSELECTED(int markerNumber, int colour)
|
||
|
SCI_MARKERENABLEHIGHLIGHT(int enabled)
|
||
|
SCI_MARKERSETALPHA(int markerNumber, int alpha)
|
||
|
SCI_MARKERADD(int line, int markerNumber)
|
||
|
--SCI_MARKERADDSET(int line, int markerMask)
|
||
|
SCI_MARKERDELETE(int line, int markerNumber)
|
||
|
SCI_MARKERDELETEALL(int markerNumber)
|
||
|
SCI_MARKERGET(int line)
|
||
|
SCI_MARKERNEXT(int lineStart, int markerMask)
|
||
|
SCI_MARKERPREVIOUS(int lineStart, int markerMask)
|
||
|
SCI_MARKERLINEFROMHANDLE(int handle)
|
||
|
SCI_MARKERDELETEHANDLE(int handle)
|
||
|
*/
|
||
|
|
||
|
static int iScintillaSetMarkerSymbolAttribId(Ihandle* ih, int markerNumber, const char* value)
|
||
|
{
|
||
|
int markerSymbol;
|
||
|
|
||
|
/* Setting marker symbols */
|
||
|
if (iupStrEqualNoCase(value, "CIRCLE"))
|
||
|
markerSymbol = SC_MARK_CIRCLE;
|
||
|
else if (iupStrEqualNoCase(value, "ROUNDRECT"))
|
||
|
markerSymbol = SC_MARK_ROUNDRECT;
|
||
|
else if (iupStrEqualNoCase(value, "ARROW"))
|
||
|
markerSymbol = SC_MARK_ARROW;
|
||
|
else if (iupStrEqualNoCase(value, "SMALLRECT"))
|
||
|
markerSymbol = SC_MARK_SMALLRECT;
|
||
|
else if (iupStrEqualNoCase(value, "SHORTARROW"))
|
||
|
markerSymbol = SC_MARK_SHORTARROW;
|
||
|
else if (iupStrEqualNoCase(value, "EMPTY")) /* invisible */
|
||
|
markerSymbol = SC_MARK_EMPTY;
|
||
|
else if (iupStrEqualNoCase(value, "ARROWDOWN"))
|
||
|
markerSymbol = SC_MARK_ARROWDOWN;
|
||
|
else if (iupStrEqualNoCase(value, "MINUS"))
|
||
|
markerSymbol = SC_MARK_MINUS;
|
||
|
else if (iupStrEqualNoCase(value, "PLUS"))
|
||
|
markerSymbol = SC_MARK_PLUS;
|
||
|
else if (iupStrEqualNoCase(value, "VLINE"))
|
||
|
markerSymbol = SC_MARK_VLINE;
|
||
|
else if (iupStrEqualNoCase(value, "LCORNER"))
|
||
|
markerSymbol = SC_MARK_LCORNER;
|
||
|
else if (iupStrEqualNoCase(value, "TCORNER"))
|
||
|
markerSymbol = SC_MARK_TCORNER;
|
||
|
else if (iupStrEqualNoCase(value, "BOXPLUS"))
|
||
|
markerSymbol = SC_MARK_BOXPLUS;
|
||
|
else if (iupStrEqualNoCase(value, "BOXPLUSCONNECTED"))
|
||
|
markerSymbol = SC_MARK_BOXPLUSCONNECTED;
|
||
|
else if (iupStrEqualNoCase(value, "BOXMINUS"))
|
||
|
markerSymbol = SC_MARK_BOXMINUS;
|
||
|
else if (iupStrEqualNoCase(value, "BOXMINUSCONNECTED"))
|
||
|
markerSymbol = SC_MARK_BOXMINUSCONNECTED;
|
||
|
else if (iupStrEqualNoCase(value, "LCORNERCURVE"))
|
||
|
markerSymbol = SC_MARK_LCORNERCURVE;
|
||
|
else if (iupStrEqualNoCase(value, "TCORNERCURVE"))
|
||
|
markerSymbol = SC_MARK_TCORNERCURVE;
|
||
|
else if (iupStrEqualNoCase(value, "CIRCLEPLUS"))
|
||
|
markerSymbol = SC_MARK_CIRCLEPLUS;
|
||
|
else if (iupStrEqualNoCase(value, "CIRCLEPLUSCONNECTED"))
|
||
|
markerSymbol = SC_MARK_CIRCLEPLUSCONNECTED;
|
||
|
else if (iupStrEqualNoCase(value, "CIRCLEMINUS"))
|
||
|
markerSymbol = SC_MARK_CIRCLEMINUS;
|
||
|
else if (iupStrEqualNoCase(value, "CIRCLEMINUSCONNECTED"))
|
||
|
markerSymbol = SC_MARK_CIRCLEMINUSCONNECTED;
|
||
|
else if (iupStrEqualNoCase(value, "BACKGROUND")) /* line background color */
|
||
|
markerSymbol = SC_MARK_BACKGROUND;
|
||
|
else if (iupStrEqualNoCase(value, "DOTDOTDOT"))
|
||
|
markerSymbol = SC_MARK_DOTDOTDOT;
|
||
|
else if (iupStrEqualNoCase(value, "ARROWS"))
|
||
|
markerSymbol = SC_MARK_ARROWS;
|
||
|
/*else if (iupStrEqualNoCase(value, "PIXMAP")) */ /* for pixmaps, unused - use RGBAIMAGE */
|
||
|
/* markerSymbol = SC_MARK_PIXMAP; */
|
||
|
else if (iupStrEqualNoCase(value, "FULLRECT")) /* margin background color */
|
||
|
markerSymbol = SC_MARK_FULLRECT;
|
||
|
else if (iupStrEqualNoCase(value, "LEFTRECT"))
|
||
|
markerSymbol = SC_MARK_LEFTRECT;
|
||
|
/*else if (iupStrEqualNoCase(value, "AVAILABLE")) */ /* for plugins, unused */
|
||
|
/* markerSymbol = SC_MARK_AVAILABLE; */
|
||
|
else if (iupStrEqualNoCase(value, "UNDERLINE")) /* underline across the line. */
|
||
|
markerSymbol = SC_MARK_UNDERLINE;
|
||
|
else if (iupStrEqualNoCase(value, "RGBAIMAGE"))
|
||
|
markerSymbol = SC_MARK_RGBAIMAGE;
|
||
|
else if (iupStrEqualNoCase(value, "BOOKMARK"))
|
||
|
markerSymbol = SC_MARK_BOOKMARK;
|
||
|
else if (iupStrEqualPartial(value, "CHARACTER"))
|
||
|
{
|
||
|
int c = (int)value[9];
|
||
|
markerSymbol = SC_MARK_CHARACTER+c;
|
||
|
}
|
||
|
else
|
||
|
return 0;
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERDEFINE, markerNumber, markerSymbol);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static char* iScintillaGetMarkerSymbolAttribId(Ihandle* ih, int markerNumber)
|
||
|
{
|
||
|
char* markerSymbolStr[33] = {
|
||
|
"CIRCLE", "ROUNDRECT", "ARROW", "SMALLRECT", "SHORTARROW", "EMPTY", "ARROWDOWN", "MINUS",
|
||
|
"PLUS", "VLINE", "LCORNER", "TCORNER", "BOXPLUS", "BOXPLUSCONNECTED", "BOXMINUS",
|
||
|
"BOXMINUSCONNECTED", "LCORNERCURVE", "TCORNERCURVE", "CIRCLEPLUS", "CIRCLEPLUSCONNECTED",
|
||
|
"CIRCLEMINUS", "CIRCLEMINUSCONNECTED", "BACKGROUND", "DOTDOTDOT", "ARROWS", "PIXMAP",
|
||
|
"FULLRECT", "LEFTRECT", "AVAILABLE", "UNDERLINE", "RGBAIMAGE", "BOOKMARK", "CHARACTER" };
|
||
|
|
||
|
int markerSymbol = (int)IupScintillaSendMessage(ih, SCI_MARKERSYMBOLDEFINED, markerNumber, 0);
|
||
|
|
||
|
if (markerSymbol>SC_MARK_CHARACTER)
|
||
|
{
|
||
|
char c = (char)(markerSymbol-SC_MARK_CHARACTER);
|
||
|
return iupStrReturnStrStr(markerSymbolStr[31], "", c);
|
||
|
}
|
||
|
|
||
|
if (markerSymbol<0 || markerSymbol>31)
|
||
|
return NULL;
|
||
|
|
||
|
return markerSymbolStr[markerSymbol];
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerDefineAttrib(Ihandle* ih, const char* value)
|
||
|
{
|
||
|
char strNumb[25];
|
||
|
char strSymb[25];
|
||
|
int markerNumber;
|
||
|
|
||
|
iupStrToStrStr(value, strNumb, strSymb, '=');
|
||
|
|
||
|
/* Setting marker numbers */
|
||
|
if (iupStrEqualNoCase(strNumb, "FOLDEREND"))
|
||
|
markerNumber = SC_MARKNUM_FOLDEREND;
|
||
|
else if (iupStrEqualNoCase(strNumb, "FOLDEROPENMID"))
|
||
|
markerNumber = SC_MARKNUM_FOLDEROPENMID;
|
||
|
else if (iupStrEqualNoCase(strNumb, "FOLDERMIDTAIL"))
|
||
|
markerNumber = SC_MARKNUM_FOLDERMIDTAIL;
|
||
|
else if (iupStrEqualNoCase(strNumb, "FOLDERTAIL"))
|
||
|
markerNumber = SC_MARKNUM_FOLDERTAIL;
|
||
|
else if (iupStrEqualNoCase(strNumb, "FOLDERSUB"))
|
||
|
markerNumber = SC_MARKNUM_FOLDERSUB;
|
||
|
else if (iupStrEqualNoCase(strNumb, "FOLDER"))
|
||
|
markerNumber = SC_MARKNUM_FOLDER;
|
||
|
else if (iupStrEqualNoCase(strNumb, "FOLDEROPEN"))
|
||
|
markerNumber = SC_MARKNUM_FOLDEROPEN;
|
||
|
else
|
||
|
{
|
||
|
if (!iupStrToInt(strNumb, &markerNumber))
|
||
|
return 0;
|
||
|
|
||
|
if (markerNumber<0 || markerNumber>31)
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
iScintillaSetMarkerSymbolAttribId(ih, markerNumber, strSymb);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerDefineRGBAImageId(Ihandle* ih, int markerNumber, const char* value)
|
||
|
{
|
||
|
Ihandle* ih_image = IupImageGetHandle(value);
|
||
|
if (ih_image)
|
||
|
{
|
||
|
int bpp = IupGetInt(ih_image, "BPP");
|
||
|
if (bpp == 32)
|
||
|
{
|
||
|
unsigned char* imgdata = (unsigned char*)IupGetAttribute(ih, "WID");
|
||
|
if (imgdata)
|
||
|
{
|
||
|
int w = IupGetInt(ih, "WIDTH");
|
||
|
int h = IupGetInt(ih, "HEIGHT");
|
||
|
IupScintillaSendMessage(ih, SCI_RGBAIMAGESETWIDTH, w, 0);
|
||
|
IupScintillaSendMessage(ih, SCI_RGBAIMAGESETHEIGHT, h, 0);
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERDEFINERGBAIMAGE, markerNumber, (sptr_t)imgdata);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetRGBAImageSetScale(Ihandle* ih, const char* value)
|
||
|
{
|
||
|
int scale;
|
||
|
iupStrToInt(value, &scale);
|
||
|
|
||
|
if(scale <= 0) scale = 1;
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_RGBAIMAGESETSCALE, scale, 0);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerFgColorAttribId(Ihandle* ih, int markerNumber, const char* value)
|
||
|
{
|
||
|
unsigned char r, g, b;
|
||
|
|
||
|
if (!iupStrToRGB(value, &r, &g, &b))
|
||
|
return 0;
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERSETFORE, markerNumber, iupScintillaEncodeColor(r, g, b));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerBgColorAttribId(Ihandle* ih, int markerNumber, const char* value)
|
||
|
{
|
||
|
unsigned char r, g, b;
|
||
|
|
||
|
if (!iupStrToRGB(value, &r, &g, &b))
|
||
|
return 0;
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERSETBACK, markerNumber, iupScintillaEncodeColor(r, g, b));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerBgColorSelectedAttribId(Ihandle* ih, int markerNumber, const char* value)
|
||
|
{
|
||
|
unsigned char r, g, b;
|
||
|
|
||
|
if (!iupStrToRGB(value, &r, &g, &b))
|
||
|
return 0;
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERSETBACKSELECTED, markerNumber, iupScintillaEncodeColor(r, g, b));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerAlphaAttribId(Ihandle* ih, int markerNumber, const char* value)
|
||
|
{
|
||
|
int alpha;
|
||
|
iupStrToInt(value, &alpha);
|
||
|
|
||
|
if (alpha < 0 || alpha > 255)
|
||
|
return 0;
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERSETALPHA, markerNumber, alpha);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerEnableHighlightAttrib(Ihandle *ih, const char *value)
|
||
|
{
|
||
|
if (iupStrBoolean(value))
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERENABLEHIGHLIGHT, 1, 0);
|
||
|
else
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERENABLEHIGHLIGHT, 0, 0);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerAddAttribId(Ihandle* ih, int line, const char* value)
|
||
|
{
|
||
|
int markerNumber, markerID;
|
||
|
iupStrToInt(value, &markerNumber);
|
||
|
|
||
|
markerID = (int)IupScintillaSendMessage(ih, SCI_MARKERADD, line, markerNumber);
|
||
|
iupAttribSetInt(ih, "LASTMARKERADDHANDLE", markerID);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static char* iScintillaGetMarkerGetAttribId(Ihandle* ih, int line)
|
||
|
{
|
||
|
unsigned int markerMask = (unsigned int)IupScintillaSendMessage(ih, SCI_MARKERGET, line, 0);
|
||
|
return iupStrReturnUInt(markerMask);
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerDeleteAttribId(Ihandle* ih, int line, const char* value)
|
||
|
{
|
||
|
int markerNumber;
|
||
|
iupStrToInt(value, &markerNumber);
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERDELETE, line, markerNumber);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerDeleteAllAttrib(Ihandle* ih, const char* value)
|
||
|
{
|
||
|
int markerNumber;
|
||
|
iupStrToInt(value, &markerNumber);
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERDELETEALL, markerNumber, 0);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerNextAttribId(Ihandle* ih, int lineStart, const char* value)
|
||
|
{
|
||
|
int last_marker_found;
|
||
|
unsigned int markerMask;
|
||
|
iupStrToUInt(value, &markerMask);
|
||
|
|
||
|
last_marker_found = (int)IupScintillaSendMessage(ih, SCI_MARKERNEXT, lineStart, markerMask);
|
||
|
iupAttribSetInt(ih, "LASTMARKERFOUND", last_marker_found);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerPreviousAttribId(Ihandle* ih, int lineStart, const char* value)
|
||
|
{
|
||
|
int last_marker_found;
|
||
|
unsigned int markerMask;
|
||
|
iupStrToUInt(value, &markerMask);
|
||
|
|
||
|
last_marker_found = (int)IupScintillaSendMessage(ih, SCI_MARKERPREVIOUS, lineStart, markerMask);
|
||
|
iupAttribSetInt(ih, "LASTMARKERFOUND", last_marker_found);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static char* iScintillaGetMarkerLineFromHandleAttribId(Ihandle* ih, int markerHandle)
|
||
|
{
|
||
|
int line = (int)IupScintillaSendMessage(ih, SCI_MARKERLINEFROMHANDLE, markerHandle, 0);
|
||
|
return iupStrReturnInt(line);
|
||
|
}
|
||
|
|
||
|
static int iScintillaSetMarkerDeleteHandleAttrib(Ihandle* ih, const char* value)
|
||
|
{
|
||
|
int markerHandle;
|
||
|
iupStrToInt(value, &markerHandle);
|
||
|
|
||
|
IupScintillaSendMessage(ih, SCI_MARKERDELETEHANDLE, markerHandle, 0);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void iupScintillaRegisterMarker(Iclass* ic)
|
||
|
{
|
||
|
iupClassRegisterAttribute(ic, "MARKERDEFINE", NULL, iScintillaSetMarkerDefineAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERSYMBOL", iScintillaGetMarkerSymbolAttribId, iScintillaSetMarkerSymbolAttribId, IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERFGCOLOR", NULL, iScintillaSetMarkerFgColorAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERBGCOLOR", NULL, iScintillaSetMarkerBgColorAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERBGCOLORSEL", NULL, iScintillaSetMarkerBgColorSelectedAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERALPHA", NULL, iScintillaSetMarkerAlphaAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERRGBAIMAGE", NULL, iScintillaSetMarkerDefineRGBAImageId, IUPAF_IHANDLENAME|IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttribute(ic, "MARKERRGBAIMAGESCALE", NULL, iScintillaSetRGBAImageSetScale, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttribute(ic, "MARKERHIGHLIGHT", NULL, iScintillaSetMarkerEnableHighlightAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERADD", NULL, iScintillaSetMarkerAddAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERDELETE", NULL, iScintillaSetMarkerDeleteAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERGET", iScintillaGetMarkerGetAttribId, NULL, IUPAF_READONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttribute(ic, "MARKERDELETEALL", NULL, iScintillaSetMarkerDeleteAllAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERNEXT", NULL, iScintillaSetMarkerNextAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERPREVIOUS", NULL, iScintillaSetMarkerPreviousAttribId, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttributeId(ic, "MARKERLINEFROMHANDLE", iScintillaGetMarkerLineFromHandleAttribId, NULL, IUPAF_READONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttribute(ic, "MARKERDELETEHANDLE", NULL, iScintillaSetMarkerDeleteHandleAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttribute(ic, "LASTMARKERADDHANDLE", NULL, NULL, NULL, NULL, IUPAF_READONLY|IUPAF_NO_INHERIT);
|
||
|
iupClassRegisterAttribute(ic, "LASTMARKERFOUND", NULL, NULL, NULL, NULL, IUPAF_READONLY|IUPAF_NO_INHERIT);
|
||
|
}
|