#include "sdk_precomp.h"
#include "editorlexerloader.h"
#include "globals.h"
#include "editorcolorset.h"
#include "manager.h"
#include "messagemanager.h"
#include <wx/dynarray.h>
EditorLexerLoader::EditorLexerLoader(EditorColorSet* target)
: m_pTarget(target)
{
//ctor
}
EditorLexerLoader::~EditorLexerLoader()
{
//dtor
}
void EditorLexerLoader::Load(const wxString& filename)
{
LOGSTREAM << _("Loading ") << wxFileName(filename).GetFullName() << _T('\n');
TiXmlDocument doc(filename.mb_str());
if (!doc.LoadFile())
{
LOGSTREAM << _("Failed loading ") << filename << _T('\n');
return;
}
// LOGSTREAM << "Parsing lexer file...\n";
TiXmlElement* root;
TiXmlElement* lexer;
root = doc.FirstChildElement("CodeBlocks_lexer_properties");
if (!root)
{
// old tag
root = doc.FirstChildElement("Code::Blocks_lexer_properties");
if (!root)
{
LOGSTREAM << _("Not a valid Code::Blocks lexer file...\n");
return;
}
}
lexer = root->FirstChildElement("Lexer");
if (!lexer)
{
LOGSTREAM << _("No 'Lexer' element in file...\n");
return;
}
DoLexer(lexer);
}
void EditorLexerLoader::DoLexer(TiXmlElement* node)
{
if (!node->Attribute("name") || !node->Attribute("index"))
{
LOGSTREAM << _("No name or index...\n");
return;
}
wxString name = wxString( node->Attribute("name"), wxConvUTF8 );
int lexer = atol(node->Attribute("index"));
wxString masks = wxString ( node->Attribute("filemasks"), wxConvUTF8 );
int style = m_pTarget->AddHighlightLanguage(lexer, name);
if (style == HL_NONE)
return; // wasn't added
m_pTarget->SetFileMasks(style, masks);
// LOGSTREAM << "Found lexer: " << name << " (" << style << ")\n";
DoStyles(style, node);
DoKeywords(style, node);
DoSampleCode(style, node);
}
void EditorLexerLoader::DoStyles(int language, TiXmlElement* node)
{
TiXmlElement* style = node->FirstChildElement("Style");
while (style)
{
if (style->Attribute("name") && style->Attribute("index"))
{
wxString name = wxString ( style->Attribute("name"), wxConvUTF8 );
wxString index = wxString ( style->Attribute("index"), wxConvUTF8 ); // comma-separated indices
wxString fg = wxString ( style->Attribute("fg"), wxConvUTF8 );
wxString bg = wxString ( style->Attribute("bg"), wxConvUTF8 );
bool bold = style->Attribute("bold") ? atol(style->Attribute("bold")) != 0 : false;
bool italics = style->Attribute("italics") ? atol(style->Attribute("italics")) != 0 : false;
bool underlined = style->Attribute("underlined") ? atol(style->Attribute("underlined")) != 0 : false;
// break-up arrays
wxArrayString indices = GetArrayFromString(index, _T(","));
wxArrayString fgarray = GetArrayFromString(fg, _T(","));
wxArrayString bgarray = GetArrayFromString(bg, _T(","));
wxColour fgcolor = wxNullColour;
if (fgarray.GetCount() == 3)
{
long R=0, G=0, B=0;
fgarray[0].ToLong(&R);
fgarray[1].ToLong(&G);
fgarray[2].ToLong(&B);
fgcolor.Set((unsigned char)R,(unsigned char)G,(unsigned char)B);
}
wxColour bgcolor = wxNullColour;
if (bgarray.GetCount() == 3)
{
long R=0, G=0, B=0;
bgarray[0].ToLong(&R);
bgarray[1].ToLong(&G);
bgarray[2].ToLong(&B);
bgcolor.Set((unsigned char)R,(unsigned char)G,(unsigned char)B);
}
for (size_t i = 0; i < indices.GetCount(); ++i)
{
if (indices[i].IsEmpty())
continue;
long value = 0;
indices[i].ToLong(&value);
// LOGSTREAM << _("Adding style: ") << name << _T("(") << value << _T(")\n");
m_pTarget->AddOption(language, name, value,
fgcolor,
bgcolor,
bold,
italics,
underlined,
value >= 0);
}
}
style = style->NextSiblingElement("Style");
}
}
void EditorLexerLoader::DoKeywords(int language, TiXmlElement* node)
{
TiXmlElement* keywords = node->FirstChildElement("Keywords");
if (!keywords)
return;
DoSingleKeywordNode(language, keywords, _T("Language"));
DoSingleKeywordNode(language, keywords, _T("Documentation"));
DoSingleKeywordNode(language, keywords, _T("User"));
}
void EditorLexerLoader::DoSingleKeywordNode(int language, TiXmlElement* node, const wxString& nodename)
{
TiXmlElement* keywords = node->FirstChildElement(nodename.mb_str());
if (!keywords)
return;
// LOGSTREAM << "Found " << nodename << '\n';
int keyidx = keywords->Attribute("index") ? atol(keywords->Attribute("index")) : -1;
// LOGSTREAM << "keyidx=" << keyidx << '\n';
if (keyidx != -1)
m_pTarget->SetKeywords(language, keyidx, wxString ( keywords->Attribute("value"), wxConvUTF8 ) );
}
void EditorLexerLoader::DoSampleCode(int language, TiXmlElement* node)
{
TiXmlElement* sample = node->FirstChildElement("SampleCode");
if (!sample)
return;
wxString code = wxString ( sample->Attribute("value"), wxConvUTF8 );
if (code.IsEmpty())
return;
int breakLine = sample->Attribute("breakpoint_line") ? atol(sample->Attribute("breakpoint_line")) : -1;
int debugLine = sample->Attribute("debug_line") ? atol(sample->Attribute("debug_line")) : -1;
int errorLine = sample->Attribute("error_line") ? atol(sample->Attribute("error_line")) : -1;
m_pTarget->SetSampleCode(language, code, breakLine, debugLine, errorLine);
}
syntax highlighted by Code2HTML, v. 0.9.1