kolibrios-fun/programs/develop/libraries/libGUI/SRC/control_text.inc
andrew_programmer 66bf88987d bugfix of last SVN revision
git-svn-id: svn://kolibrios.org@1176 a494cfbc-eb01-0410-851d-a64ba20cac60
2009-09-24 22:01:05 +00:00

183 lines
4.5 KiB
C++

/*
control Text
*/
gui_text_size_t GetStringSize(font_t *font,char *s)
{
long len;
gui_text_size_t size;
len=strlen(s);
if (font->size==FONT_CONSTANT_SIZE)
{
if (font->flags & FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON)
{
size.sizex=len*font->sizex;
size.sizey=font->sizey;
}
}
return(size);
}
void TextBackgroundOn(gui_text_t *Text)
{
Text->txt_flags |=TEXT_BACKGROUND_ON;
}
void TextBackgroundOff(gui_text_t *Text)
{
Text->txt_flags &=TEXT_BACKGROUND_ON;
}
void DisplayText(gui_text_t *Text)
{
int x;
int y;
int sizex;
int sizey;
char v;
font_t *font;
gui_text_size_t size;
struct FINITION *fin;
x=Text->ctrl_x;
y=Text->ctrl_y;
fin=(struct FINITION*)Text->finition;
font=(font_t*)Text->font;
v=Text->txt_flags & TEXT_BACKGROUND_ON;
if (v) font->flags|=FONT_FLAG_DRAW_BACKGROUND_ON;
else font->flags&=FONT_FLAG_DRAW_BACKGROUND_OFF;
v=Text->txt_flags & TEXT_ORIENTATION_FROM_LEFT_TO_RIGHT_ON;
if (v) font->flags|=FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON;
else font->flags&=FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_OFF;
//recalculate size of control text befor draw
size=GetStringSize((font_t*)Text->font,Text->text);
Text->ctrl_sizex=(DWORD)size.sizex;
Text->ctrl_sizey=(DWORD)size.sizey;
DrawFont=(void(*)(finition_t *fin,int fx,int fy,DWORD color,
DWORD background_color,font_t *font,BYTE *s))font->fnt_draw;
DrawFont(fin,x,y,Text->color,Text->background_color,font,Text->text);
}
//---------------------------------------------------------------------------------
// control Text
//---------------------------------------------------------------------------------
void TextProc(gui_text_t *Text,gui_message_t *message)
{
finition_t *fin;
switch(message->type)
{
case MESSAGE_FULL_REDRAW_ALL:
{
//draw Text
if (Text->flags & FLAG_SHOW_CONTROL) DisplayText(Text);
break;
}
case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION:
{
fin=(struct FINITION*)Text->finition;
fin->flags=fin->flags | FINITION_ON;
fin->x=message->arg1;
fin->y=message->arg2;
fin->sizex=message->arg3;
fin->sizey=message->arg4;
DisplayText(Text);
break;
}
case MESSAGE_SPECIALIZED:
{
if (Text->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON)
{
if (Text->flags & FLAG_SHOW_CONTROL) DisplayText(Text);
Text->flags=Text->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF;
}
break;
}
case MESSAGE_CHANGE_POSITION_EVENT:
{
Text->ctrl_x=Text->ctrl_x+message->arg1;
Text->ctrl_y=Text->ctrl_y+message->arg2;
break;
}
case MESSAGE_DESTROY_CONTROL:
{
free(Text->finition);
break;
}
case MESSAGE_SET_MAIN_PARENT:
{
SendMessage((struct HEADER*)Text,message);
Text->main_parent=(DWORD*)message->arg1;
break;
}
default: break;
}
//send message to child controls(if there is)
SendMessage((struct HEADER*)Text,message);
}
//---------------------------------------------------------------------------------
// create control Text
//---------------------------------------------------------------------------------
void* CreateText(gui_text_data_t *info_for_control)
{
gui_text_t *Text;
finition_t *fin;
gui_text_size_t size;
Text=malloc(sizeof(struct ControlText));
Text->finition=malloc(sizeof(struct FINITION));
fin=(struct FINITION*)Text->finition;
fin->flags=0;
if (info_for_control->font==(DWORD*)NULL) Text->font=FontsMeneger.default_font;
else Text->font=info_for_control->font;
size=GetStringSize((font_t*)Text->font,info_for_control->text);
ID++;
#ifdef DEBUG
printf("\ncreated text with ID=%d",(int)ID);
#endif
Text->child_bk=(DWORD*)NULL;
Text->child_fd=(DWORD*)NULL;
Text->active_control_for_keys=(DWORD*)NULL;
Text->active_control_for_mouse=(DWORD*)NULL;
Text->callback=(DWORD*)NULL;
Text->timer=(DWORD*)NULL;
Text->ctrl_proc=(DWORD*)&TextProc;
Text->ctrl_x=(DWORD)info_for_control->x;
Text->ctrl_y=(DWORD)info_for_control->y;
Text->ctrl_sizex=(DWORD)size.sizex;
Text->ctrl_sizey=(DWORD)size.sizey;
Text->ctrl_ID=ID;
Text->color=info_for_control->color;
Text->background_color=info_for_control->background_color;
Text->text=info_for_control->text;
Text->txt_flags=0;
Text->txt_flags|=TEXT_ORIENTATION_FROM_LEFT_TO_RIGHT_ON;
if (info_for_control->background)
{
Text->txt_flags|=TEXT_BACKGROUND_ON;
}
else
{
Text->txt_flags&=TEXT_BACKGROUND_OFF;
}
Text->flags=0;
Text->flags=Text->flags | FLAG_SHOW_CONTROL;
return(Text);
}