/* * This file is part of the Colobot: Gold Edition source code * Copyright (C) 2001-2016, Daniel Roux, EPSITEC SA & TerranovaTeam * http://epsitec.ch; http://colobot.info; http://github.com/colobot * * 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://gnu.org/licenses */ /** * \file ui/controls/edit.h * \brief CEdit class */ #pragma once #include "ui/controls/control.h" #include namespace Ui { class CScroll; //! maximum number of characters in CBOT edit const int EDITSTUDIOMAX = 20000; //! maximum total number of lines const int EDITLINEMAX = 1000; //! max number of levels preserves const int EDITHISTORYMAX = 50; //! max number of successive undo const int EDITUNDOMAX = 20; struct EditUndo { //! original text std::vector text; //! length of the text int len = 0; //! offset cursor int cursor1 = 0; //! offset cursor int cursor2 = 0; //! the first line displayed. int lineFirst = 0; }; enum OperUndo { //! special operation OPERUNDO_SPEC = 0, //! inserting characters OPERUNDO_INSERT = 1, //! deleting characters OPERUNDO_DELETE = 2, }; struct ImageLine { //! name of the image (without icons/) std::string name; //! vertical offset (v texture) float offset = 0.0f; //! height of the part (dv texture) float height = 0.0f; //! width float width = 0.0f; }; struct HyperLink { //! text file name (without help/) std::string name; //! name of the marker std::string marker; }; struct HyperMarker { //! name of the marker std::string name; //! position in the text int pos = 0; }; struct HyperHistory { //! full file name text std::string filename; //! rank of the first displayed line int firstLine = 0; }; class CEdit : public CControl { public: CEdit (); virtual ~CEdit(); bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) override; void SetPos(Math::Point pos) override; void SetDim(Math::Point dim) override; bool EventProcess(const Event &event) override; void Draw() override; void SetText(const char *text, bool bNew=true); void GetText(char *buffer, int max); char* GetText(); int GetTextLength(); bool ReadText(std::string filename, int addSize=0); bool WriteText(std::string filename); void SetMaxChar(int max); int GetMaxChar(); void SetEditCap(bool bMode); bool GetEditCap(); void SetHighlightCap(bool bEnable); bool GetHighlightCap(); void SetInsideScroll(bool bInside); bool GetInsideScroll(); void SetSoluceMode(bool bSoluce); bool GetSoluceMode(); void SetGenericMode(bool bGeneric); bool GetGenericMode(); void SetAutoIndent(bool bMode); bool GetAutoIndent(); void SetCursor(int cursor1, int cursor2); void GetCursor(int &cursor1, int &cursor2); void SetFirstLine(int rank); int GetFirstLine(); void ShowSelect(); void SetDisplaySpec(bool bDisplay); bool GetDisplaySpec(); void SetMultiFont(bool bMulti); bool GetMultiFont(); bool Cut(); bool Copy(bool memorize_cursor = false); bool Paste(); bool Undo(); void HyperFlush(); void HyperHome(std::string filename); bool HyperTest(EventType event); bool HyperGo(EventType event); void SetFontSize(float size) override; 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(std::string name, std::string marker); bool HyperAdd(std::string filename, int firstLine); void DrawImage(Math::Point pos, std::string name, float width, float offset, float height, int nbLine); void DrawBack(Math::Point pos, Math::Point dim); void DrawHorizontalGradient(Math::Point pos, Math::Point dim, Gfx::Color color1, Gfx::Color color2); void DrawColor(Math::Point pos, Math::Point dim, Gfx::Color color); void FreeImage(); 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 GetCursorLine(int cursor); void UndoFlush(); void UndoMemorize(OperUndo oper); bool UndoRecall(); void UpdateScroll(); void SetFocus(CControl* control) override; void UpdateFocus(); // Start/stop text input mode, this toggles the on-screen keyboard void GetIndentedText(std::ostream& stream, unsigned int start, unsigned int end); protected: std::unique_ptr m_scroll; // vertical scrollbar on the right int m_maxChar; // max length of the buffer m_text std::vector m_text; // text (without zero terminator) std::vector 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]; std::vector m_image; std::vector m_link; std::vector m_marker; 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]; }; }