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);
}
|