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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
|
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// *
// * This program is free software: you can redistribute it and/or modify
// * it under the terms of the GNU General Public License as published by
// * the Free Software Foundation, either version 3 of the License, or
// * (at your option) any later version.
// *
// * This program 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 General Public License for more details.
// *
// * You should have received a copy of the GNU General Public License
// * along with this program. If not, see http://www.gnu.org/licenses/.
// edit.h
#pragma once
#include "common/struct.h"
#include "ui/control.h"
class CD3DEngine;
class CScroll;
const int EDITSTUDIOMAX = 20000; // maximum number of characters in CBOT edit
const int EDITLINEMAX = 1000; // maximum total number of lines
const int EDITIMAGEMAX = 50; // maximum total number of lines with images
const int EDITLINKMAX = 100; // maximum number of links
const int EDITHISTORYMAX = 50; // max number of levels preserves
const int EDITUNDOMAX = 20; // max number of successive undo
struct EditUndo
{
char* text; // original text
int len; // length of the text
int cursor1; // offset cursor
int cursor2; // offset cursor
int lineFirst; // the first line displayed.
};
enum OperUndo
{
OPERUNDO_SPEC = 0, // special operation
OPERUNDO_INSERT = 1, // inserting characters
OPERUNDO_DELETE = 2, // deleting characters
};
struct ImageLine
{
char name[40]; // name of the image (without diagram \)
float offset; // vertical offset (v texture)
float height; // height of the part (dv texture)
float width; // width
};
struct HyperLink
{
char name[40]; // text file name (without help \)
char marker[20]; // name of the marker
};
struct HyperMarker
{
char name[20]; // name of the marker
int pos; // position in the text
};
struct HyperHistory
{
char filename[50]; // full file name text
int firstLine; // rank of the first displayed line
};
class CEdit : public CControl
{
public:
CEdit(CInstanceManager* iMan);
virtual ~CEdit();
bool Create(Math::Point pos, Math::Point dim, int icon, EventMsg eventMsg);
void SetPos(Math::Point pos);
void SetDim(Math::Point dim);
bool EventProcess(const Event &event);
void Draw();
void SetText(char *text, bool bNew=true);
void GetText(char *buffer, int max);
char* RetText();
int RetTextLength();
bool ReadText(char *filename, int addSize=0);
bool WriteText(char *filename);
void SetMaxChar(int max);
int RetMaxChar();
void SetEditCap(bool bMode);
bool RetEditCap();
void SetHiliteCap(bool bEnable);
bool RetHiliteCap();
void SetInsideScroll(bool bInside);
bool RetInsideScroll();
void SetSoluceMode(bool bSoluce);
bool RetSoluceMode();
void SetGenericMode(bool bGeneric);
bool RetGenericMode();
void SetAutoIndent(bool bMode);
bool RetAutoIndent();
void SetCursor(int cursor1, int cursor2);
void GetCursor(int &cursor1, int &cursor2);
void SetFirstLine(int rank);
int RetFirstLine();
void ShowSelect();
void SetDisplaySpec(bool bDisplay);
bool RetDisplaySpec();
void SetMultiFont(bool bMulti);
bool RetMultiFont();
bool Cut();
bool Copy();
bool Paste();
bool Undo();
void HyperFlush();
void HyperHome(char *filename);
bool HyperTest(EventMsg event);
bool HyperGo(EventMsg event);
void SetFontSize(float size);
bool ClearFormat();
bool SetFormat(int cursor1, int cursor2, int format);
protected:
void SendModifEvent();
bool IsLinkPos(Math::Point pos);
void MouseDoubleClick(Math::Point mouse);
void MouseClick(Math::Point mouse);
void MouseMove(Math::Point mouse);
void MouseRelease(Math::Point mouse);
int MouseDetect(Math::Point mouse);
void MoveAdjust();
void HyperJump(char *name, char *marker);
bool HyperAdd(char *filename, int firstLine);
void DrawImage(Math::Point pos, char *name, float width, float offset, float height, int nbLine);
void DrawBack(Math::Point pos, Math::Point dim);
void DrawPart(Math::Point pos, Math::Point dim, int icon);
void FreeImage();
void LoadImage(char *name);
void Scroll(int pos, bool bAdjustCursor);
void Scroll();
void MoveChar(int move, bool bWord, bool bSelect);
void MoveLine(int move, bool bWord, bool bSelect);
void MoveHome(bool bWord, bool bSelect);
void MoveEnd(bool bWord, bool bSelect);
void ColumnFix();
void Insert(char character);
void InsertOne(char character);
void Delete(int dir);
void DeleteOne(int dir);
int IndentCompute();
int IndentTabCount();
void IndentTabAdjust(int number);
bool Shift(bool bLeft);
bool MinMaj(bool bMaj);
void Justif();
int RetCursorLine(int cursor);
void UndoFlush();
void UndoMemorize(OperUndo oper);
bool UndoRecall();
protected:
CScroll* m_scroll; // vertical scrollbar on the right
int m_maxChar; // max length of the buffer m_text
char* m_text; // text (without zero terminator)
char* m_format; // format characters
int m_len; // length used in m_text
int m_cursor1; // offset cursor
int m_cursor2; // offset cursor
bool m_bMulti; // true -> multi-line
bool m_bEdit; // true -> editable
bool m_bHilite; // true -> hilitable
bool m_bInsideScroll; // true -> lift as part
bool m_bDisplaySpec; // true -> displays the special characters
bool m_bMultiFont; // true -> more fonts possible
bool m_bSoluce; // true -> shows the links-solution
bool m_bGeneric; // true -> generic that defile
bool m_bAutoIndent; // true -> automatic indentation
float m_lineHeight; // height of a row
float m_lineAscent; // height above the baseline
float m_lineDescent; // height below the baseline
int m_lineVisible; // total number of viewable lines
int m_lineFirst; // the first line displayed
int m_lineTotal; // number lines used (in m_lineOffset)
int m_lineOffset[EDITLINEMAX];
char m_lineIndent[EDITLINEMAX];
int m_imageTotal;
ImageLine m_image[EDITIMAGEMAX];
HyperLink m_link[EDITLINKMAX];
int m_markerTotal;
HyperMarker m_marker[EDITLINKMAX];
int m_historyTotal;
int m_historyCurrent;
HyperHistory m_history[EDITHISTORYMAX];
float m_time; // absolute time
float m_timeBlink;
float m_timeLastClick;
float m_timeLastScroll;
Math::Point m_mouseFirstPos;
Math::Point m_mouseLastPos;
float m_column;
bool m_bCapture;
bool m_bUndoForce;
OperUndo m_undoOper;
EditUndo m_undo[EDITUNDOMAX];
};
|