Files
assaultcube-/source/mesgui/src/ggText.cpp
T
driAn c6e385ea38 This commit was generated by cvs2svn to compensate for changes in r13,
which included commits to RCS files with non-trunk default branches.


git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@14 e016b1c5-ed68-44aa-a2f7-31cac88cffde
2005-06-23 21:57:56 +00:00

142 lines
3.7 KiB
C++
Executable File

/*
* Text control for the MESGUI library
* Copyright (C) 2002 Eric Maxey <[email protected]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "control_common.h"
#include "scancodes.h"
/****************************
ggText
****************************/
ggText::ggText() : ggControl()
{
cursorloc=0;
flags |= GGFLAG_DONT_DRAW_BORDER | GGFLAG_FOCUSABLE | GGFLAG_SIZETOCONTENT;
}
ggText::ggText(const char *s) : ggControl()
{
cursorloc=0;
*stringValP=s;
flags |= GGFLAG_DONT_DRAW_BORDER | GGFLAG_FOCUSABLE | GGFLAG_SIZETOCONTENT;
}
void ggText::Draw()
{
BaseDraw();
glColor4f(1,1,1,a);
bool draw_cursor = (parent && parent->focus==this);
if (flags & GGFLAG_MULTILINE) {
int cursorloc_line = cursorloc;
int a=0,b;
int pos=0;
while ((b = stringValP->find('\n',a)) != string::npos) {
fontprint(x+TO_X,y+TO_Y+pos,stringValP->substr(a,b-a).c_str());
pos += COL_HEIGHT;
a = b+1;
}
fontprint(x+TO_X,y+TO_Y+pos,stringValP->substr(a).c_str());
} else {
fontprint(x+TO_X,y+TO_Y,stringValP->c_str());
if (draw_cursor) {
static char cursor[]="_";
string s = *stringValP;
s += "a"; // make sure there's a place to put a null char
s[cursorloc]=0;
fontprint(x+font->getWidth(s.c_str())+TO_X,y+TO_Y,cursor);
}
}
}
void ggText::Message(int msg,int arg1,int arg2,int arg3,int arg4)
{
BaseMessage(msg,arg1,arg2,arg3,arg4);
switch (msg)
{
case GGMSG_GAINFOCUS:
cursorloc = stringValP->length();
break;
case GGMSG_SKEYDOWN: // special keys. uses scancodes?
switch (arg1)
{
case SC_LEFT:
if (--cursorloc<0) cursorloc=0;
// glutPostRedisplay();
return;
case SC_RIGHT:
int len;
len = stringValP->length();
if (++cursorloc>len) cursorloc=len;
// glutPostRedisplay();
return;
case SC_HOME:
cursorloc=0;
// glutPostRedisplay();
return;
case SC_END:
cursorloc = stringValP->length();
// glutPostRedisplay();
return;
}
return;
case GGMSG_KEYDOWN: // normal keys
if (arg1==13) arg1='\n';
if (printable_key(arg1) || (arg1=='\n' && (flags & GGFLAG_MULTILINE))) {
char s[2]={0,0};
s[0]=(char)arg1;
stringValP->insert(cursorloc++,s);
if (flags & GGFLAG_SIZETOCONTENT) SizeToContent();
// glutPostRedisplay();
return;
} else if (arg1=='\n') { // enter
Message(GGMSG_LOSEFOCUS,0,0,0,0);
} else if (arg1==27) { // escape
Message(GGMSG_LOSEFOCUS,0,0,0,0);
} else if (arg1==127) { // delete
if (cursorloc<stringValP->length()) {
stringValP->erase(cursorloc,1);
if (flags & GGFLAG_SIZETOCONTENT) SizeToContent();
// glutPostRedisplay();
}
} else if (arg1==8) { // backspace
if (cursorloc>0) {
stringValP->erase(--cursorloc,1);
if (flags & GGFLAG_SIZETOCONTENT) SizeToContent();
// glutPostRedisplay();
}
}
}
}
void ggText::SetText(const char *s)
{
*stringValP = s;
if (flags & GGFLAG_SIZETOCONTENT) SizeToContent();
// glutPostRedisplay();
}