summaryrefslogtreecommitdiffstats
path: root/src/ui/edit.h
blob: dbd94d142006cae7208926c5e62053e358999405 (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
// * 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];
};