Chat-O-Matic/libs/librunview/Emoticor.cpp
2010-05-07 09:47:10 +00:00

119 lines
2.1 KiB
C++

#include "Emoticor.h"
#include <Resources.h>
#include <Directory.h>
#include <Path.h>
#include "string.h"
static Emoticor* fInstance = NULL;
Emoticor*
Emoticor::Get()
{
if (fInstance == NULL)
fInstance = new Emoticor();
return fInstance;
}
Emoticor::Emoticor()
{
fInstance = NULL;
fConfig = NULL;
}
Emoticor::~Emoticor()
{
if (fConfig)
delete fConfig;
}
Emoconfig*
Emoticor::Config()
{
return fConfig;
}
void
Emoticor::LoadConfig(const char* txt)
{
fConfig = new Emoconfig(txt);
}
void
Emoticor::_findTokens(RunView *fTextView,BString text,int tokenstart, int16 cols ,int16 font ,int16 cols2 ,int16 font2)
{
//******************************************
// "Iteration is human, recursion is divine"
//******************************************
int32 newindex = 0;
BString cur;
int i = tokenstart;
if (fConfig != NULL)
{
while(fConfig->FindString("face",i,&cur)==B_OK)
//for(int i=tokenstart;i<config->numfaces;i++)
{
i++;
//if(config->FindString("face",i,&cur)!=B_OK) return;
newindex=0;
while(true)
{
newindex=text.IFindFirst(cur.String(),0);
//printf("Try %d %s -- match %d\n",i,cur->original.String(),newindex);
if(newindex!=B_ERROR)
{
//take a walk on the left side ;)
//printf("Found at %ld \n",newindex);
if(newindex-1>=0)
{
BString left;
text.CopyInto(left,0,newindex);
//printf("ready to recourse! [%s]\n",left.String());
_findTokens(fTextView,left,tokenstart+1,cols,font,cols2,font2);
}
text.Remove(0,newindex+cur.Length());
//printf("remaning [%s] printed [%s]\n",text.String(),cur->original.String());
fTextView->Append(cur.String(),cols2,cols2,font2);
if(text.Length()==0) return; //useless stack
}
else
break;
}
}
}
fTextView->Append(text.String(),cols,cols,font);
}
void
Emoticor::AddText(RunView *fTextView,const char * txt, int16 cols ,int16 font ,int16 cols2 ,int16 font2 )
{
BString left(txt);
// if(!fConfig)
// fTextView->Append(txt,cols,cols,font);
_findTokens(fTextView,left,0,cols,font,cols2,font2);
return;
}