summaryrefslogtreecommitdiffstats
path: root/src/ui/edit.h
blob: eccc67e47582c00a83b377d38688e05e62218edc (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
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
249
250
251
252
253
// * 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;



#define EDITSTUDIOMAX	20000		// maximum number of characters in CBOT edit
#define EDITLINEMAX	1000		// maximum total number of lines
#define EDITIMAGEMAX	50		// maximum total number of lines with images
#define EDITLINKMAX	100		// maximum number of links
#define EDITHISTORYMAX	50		// max number of levels preserves

#define EDITUNDOMAX	20		// max number of successive undo

typedef struct
{
	char*		text;			// original text
	int		len;			// length of the text
	int		cursor1;		// offset cursor
	int		cursor2;		// offset cursor
	int		lineFirst;		// the first line displayed.

}
EditUndo;

enum OperUndo
{
	OPERUNDO_SPEC	= 0,	// special operation
	OPERUNDO_INSERT	= 1,	// inserting characters
	OPERUNDO_DELETE	= 2,	// deleting characters
};

typedef struct
{
	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
}
ImageLine;

typedef struct
{
	char	name[40];		// text file name (without help \)
	char	marker[20];		// name of the marker
}
HyperLink;

typedef struct
{
	char	name[20];		// name of the marker
	int	pos;			// position in the text
}
HyperMarker;

typedef struct
{
	char	filename[50];		// full file name text
	int	firstLine;		// rank of the first displayed line
}
HyperHistory;




class CEdit : public CControl
{
public:
	CEdit(CInstanceManager* iMan);
	virtual ~CEdit();

	BOOL		Create(FPOINT pos, FPOINT dim, int icon, EventMsg eventMsg);

	void		SetPos(FPOINT pos);
	void		SetDim(FPOINT 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(FPOINT pos);
	void		MouseDoubleClick(FPOINT mouse);
	void		MouseClick(FPOINT mouse);
	void		MouseMove(FPOINT mouse);
	void		MouseRelease(FPOINT mouse);
	int			MouseDetect(FPOINT mouse);
	void		MoveAdjust();

	void		HyperJump(char *name, char *marker);
	BOOL		HyperAdd(char *filename, int firstLine);

	void		DrawImage(FPOINT pos, char *name, float width, float offset, float height, int nbLine);
	void		DrawBack(FPOINT pos, FPOINT dim);
	void		DrawPart(FPOINT pos, FPOINT 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;
	FPOINT		m_mouseFirstPos;
	FPOINT		m_mouseLastPos;
	float		m_column;

	BOOL		m_bCapture;

	BOOL		m_bUndoForce;
	OperUndo	m_undoOper;
	EditUndo	m_undo[EDITUNDOMAX];
};