aboutsummaryrefslogtreecommitdiff
path: root/engines/cge/gettext.cpp
blob: 69350b5fc8ed823957e59c03b60b588932b08772 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include	"gettext.h"
#include	"keybd.h"
#include	"mouse.h"
#include	<string.h>





GET_TEXT *	GET_TEXT::Ptr	= NULL;



GET_TEXT::GET_TEXT (const char * info, char * text, int size, void (*click)(void))
: Text(text), Size(min(size, GTMAX)), Len(min(Size, strlen(text))),
  Cntr(GTBLINK), Click(click), OldKeybClient(KEYBOARD::SetClient(this))
{
  int i = 2 * TEXT_HM + Font.Width(info);
  Ptr = this;
  Mode = RECT;
  TS[0] = Box((i + 3) & ~3, 2 * TEXT_VM + 2 * FONT_HIG + TEXT_LS);
  SetShapeList(TS);
  Flags.BDel = TRUE;
  Flags.Kill = TRUE;
  memcpy(Buff, text, Len);
  Buff[Len] = ' ';
  Buff[Len+1] = '\0';
  PutLine(0, info);
  Tick();
}






GET_TEXT::~GET_TEXT (void)
{
  KEYBOARD::SetClient(OldKeybClient);
  Ptr = NULL;
}






void GET_TEXT::Tick (void)
{
  if (++ Cntr >= GTBLINK)
    {
      Buff[Len] ^= (' ' ^ '_');
      Cntr = 0;
    }
  PutLine(1, Buff);
  Time = GTTIME;
}




void GET_TEXT::Touch (word mask, int x, int y)
{
  static char ogon[] = "���������";
  static char bezo[] = "ACELNOSXZ";
  char * p;

  if (mask & KEYB)
    {
      if (Click) Click();
      switch (x)
	{
	  case Enter : Buff[Len] = '\0'; strcpy(Text, Buff);
		       for (p = Text; *p; p ++)
			 {
			   char * q = strchr(ogon, *p);
			   if (q) *p = bezo[q-ogon];
			 }
	  case Esc   : SNPOST_(SNKILL, -1, 0, this); break;
	  case BSp   : if (Len)
			 {
			   -- Len;
			   Buff[Len] = Buff[Len+1];
			   Buff[Len+1] = Buff[Len+2];
			 }
		       break;
	  default    : if (x < 'A' || x > 'Z')
			 {
			   if (OldKeybClient)
			     OldKeybClient->Touch(mask, x, y);
			 }
		       else
			 {
			   if (KEYBOARD::Key[ALT])
			     {
			       p = strchr(bezo, x);
			       if (p) x = ogon[p-bezo];
			     }
			   if (Len < Size && 2 * TEXT_HM + Font.Width(Buff) + Font.Wid[x] <= W)
			     {
			       Buff[Len+2] = Buff[Len+1];
			       Buff[Len+1] = Buff[Len];
			       Buff[Len ++] = x;
			     }
			 }
		       break;
	}
    }
  else SPRITE::Touch(mask, x, y);
}