| 1 | // This file is part of SmallBASIC | 
|---|
| 2 | // | 
|---|
| 3 | // Copyright(C) 2001-2019 Chris Warren-Smith. | 
|---|
| 4 | // | 
|---|
| 5 | // This program is distributed under the terms of the GPL v2.0 or later | 
|---|
| 6 | // Download the GNU Public License (GPL) from www.gnu.org | 
|---|
| 7 | // | 
|---|
| 8 |  | 
|---|
| 9 | #ifndef SYSTEM_H | 
|---|
| 10 | #define SYSTEM_H | 
|---|
| 11 |  | 
|---|
| 12 | #include "config.h" | 
|---|
| 13 | #include "ui/strlib.h" | 
|---|
| 14 | #include "ui/ansiwidget.h" | 
|---|
| 15 | #include "ui/textedit.h" | 
|---|
| 16 |  | 
|---|
| 17 | void reset_image_cache(); | 
|---|
| 18 |  | 
|---|
| 19 | struct Cache : public strlib::Properties<String *> { | 
|---|
| 20 | Cache(int size) : Properties(size * 2), _index(0) {} | 
|---|
| 21 | void add(const char *key, const char *value); | 
|---|
| 22 | int _index; | 
|---|
| 23 | }; | 
|---|
| 24 |  | 
|---|
| 25 | struct System { | 
|---|
| 26 | System(); | 
|---|
| 27 | virtual ~System(); | 
|---|
| 28 |  | 
|---|
| 29 | int getPen(int code); | 
|---|
| 30 | char *getText(char *dest, int maxSize); | 
|---|
| 31 | bool isActive() const { return _state != kInitState && _state != kDoneState; } | 
|---|
| 32 | bool isBack() const { return _state == kBackState; } | 
|---|
| 33 | bool isBreak() const { return _state >= kBreakState; } | 
|---|
| 34 | bool isClosing() const { return _state >= kClosingState; } | 
|---|
| 35 | bool isEditing() const { return _state == kEditState; } | 
|---|
| 36 | bool isInitial() const { return _state == kInitState; } | 
|---|
| 37 | bool isModal() const { return _state == kModalState; } | 
|---|
| 38 | bool isRestart() const { return _state == kRestartState; } | 
|---|
| 39 | bool isRunning() const { return _state == kRunState || _state == kModalState; } | 
|---|
| 40 | bool isThreadActive() const { return _state == kActiveState; } | 
|---|
| 41 | bool isSystemScreen() const { return _userScreenId != -1; } | 
|---|
| 42 | void logStack(const char *keyword, int type, int line); | 
|---|
| 43 | char *readSource(const char *fileName); | 
|---|
| 44 | void setBack(); | 
|---|
| 45 | void setExit(bool quit); | 
|---|
| 46 | void setLoadBreak(const char *path); | 
|---|
| 47 | void setLoadPath(const char *path); | 
|---|
| 48 | void setRunning(bool running); | 
|---|
| 49 | void systemLog(const char *msg); | 
|---|
| 50 | void systemPrint(const char *msg, ...); | 
|---|
| 51 | AnsiWidget *getOutput() { return _output; } | 
|---|
| 52 |  | 
|---|
| 53 | enum CursorType { | 
|---|
| 54 | kHand, kArrow, kIBeam | 
|---|
| 55 | }; | 
|---|
| 56 |  | 
|---|
| 57 | virtual void enableCursor(bool enabled) = 0; | 
|---|
| 58 | virtual void addShortcut(const char *path) = 0; | 
|---|
| 59 | virtual void alert(const char *title, const char *message) = 0; | 
|---|
| 60 | virtual int ask(const char *title, const char *prompt, bool cancel=true) = 0; | 
|---|
| 61 | virtual void browseFile(const char *url) = 0; | 
|---|
| 62 | virtual MAEvent processEvents(int waitFlag) = 0; | 
|---|
| 63 | virtual char *loadResource(const char *fileName); | 
|---|
| 64 | virtual void optionsBox(StringList *items) = 0; | 
|---|
| 65 | virtual void onRunCompleted() = 0; | 
|---|
| 66 | virtual void saveWindowRect() = 0; | 
|---|
| 67 | virtual void setWindowSize(int width, int height) = 0; | 
|---|
| 68 | virtual void setWindowTitle(const char *title) = 0; | 
|---|
| 69 | virtual void share(const char *path) = 0; | 
|---|
| 70 | virtual void showCursor(CursorType cursorType) = 0; | 
|---|
| 71 | virtual void setClipboardText(const char *text) = 0; | 
|---|
| 72 | virtual char *getClipboardText() = 0; | 
|---|
| 73 |  | 
|---|
| 74 | protected: | 
|---|
| 75 | void editSource(strlib::String loadPath, bool restoreOnExit); | 
|---|
| 76 | bool execute(const char *bas); | 
|---|
| 77 | bool fileExists(strlib::String &path); | 
|---|
| 78 | void formatOptions(StringList *items); | 
|---|
| 79 | MAEvent getNextEvent() { return processEvents(1); } | 
|---|
| 80 | uint32_t getModifiedTime(); | 
|---|
| 81 | void handleEvent(MAEvent &event); | 
|---|
| 82 | void handleMenu(MAEvent &event); | 
|---|
| 83 | bool isEditEnabled() const {return opt_ide == IDE_INTERNAL || isScratchLoad();} | 
|---|
| 84 | bool isEditReady() const {return !isRestart() && isEditEnabled() && !isNetworkLoad();} | 
|---|
| 85 | bool isNetworkLoad() const {return _loadPath.indexOf( "://", 1) != -1;} | 
|---|
| 86 | bool isScratchLoad() const {return _loadPath.indexOf( "scratch", 0) != -1;} | 
|---|
| 87 | bool loadSource(const char *fileName); | 
|---|
| 88 | void resize(); | 
|---|
| 89 | void runEdit(const char *startupBas); | 
|---|
| 90 | void runLive(const char *startupBas); | 
|---|
| 91 | void runMain(const char *mainBasPath); | 
|---|
| 92 | void runOnce(const char *startupBas, bool runWait); | 
|---|
| 93 | void saveFile(TextEditInput *edit, strlib::String &path); | 
|---|
| 94 | void setupPath(String &loadpath); | 
|---|
| 95 | bool setParentPath(); | 
|---|
| 96 | void setDimensions(); | 
|---|
| 97 | void showCompletion(bool success); | 
|---|
| 98 | void printErrorLine(); | 
|---|
| 99 | void printSource(); | 
|---|
| 100 | void printSourceLine(char *text, int line, bool last); | 
|---|
| 101 | void setRestart(); | 
|---|
| 102 | void (); | 
|---|
| 103 | void showSystemScreen(bool showSrc); | 
|---|
| 104 | void waitForBack(); | 
|---|
| 105 | void waitForChange(bool error); | 
|---|
| 106 |  | 
|---|
| 107 | // platform static virtual | 
|---|
| 108 | bool getPen3(); | 
|---|
| 109 | void completeKeyword(int index); | 
|---|
| 110 |  | 
|---|
| 111 | strlib::Stack<String *> _history; | 
|---|
| 112 | StackTrace _stackTrace; | 
|---|
| 113 | Cache _cache; | 
|---|
| 114 | AnsiWidget *_output; | 
|---|
| 115 | TextEditInput *_editor; | 
|---|
| 116 | int *; | 
|---|
| 117 | char *_programSrc; | 
|---|
| 118 |  | 
|---|
| 119 | enum { | 
|---|
| 120 | kInitState = 0,// thread not active | 
|---|
| 121 | kActiveState,  // thread activated | 
|---|
| 122 | kEditState,    // program editor is active | 
|---|
| 123 | kRunState,     // program is running | 
|---|
| 124 | kModalState,   // retrieving user input inside program | 
|---|
| 125 | kConnState,    // retrieving remote program source | 
|---|
| 126 | kBreakState,   // running program should abort | 
|---|
| 127 | kRestartState, // running program should restart | 
|---|
| 128 | kBackState,    // back button detected | 
|---|
| 129 | kClosingState, // thread is terminating | 
|---|
| 130 | kDoneState     // thread has terminated | 
|---|
| 131 | } _state; | 
|---|
| 132 |  | 
|---|
| 133 | int _touchX; | 
|---|
| 134 | int _touchY; | 
|---|
| 135 | int _touchCurX; | 
|---|
| 136 | int _touchCurY; | 
|---|
| 137 | int _initialFontSize; | 
|---|
| 138 | int _fontScale; | 
|---|
| 139 | int _userScreenId; | 
|---|
| 140 | uint32_t _modifiedTime; | 
|---|
| 141 | bool _mainBas; | 
|---|
| 142 | bool _buttonPressed; | 
|---|
| 143 | bool _srcRendered; | 
|---|
| 144 | bool ; | 
|---|
| 145 | strlib::String _loadPath; | 
|---|
| 146 | strlib::String _activeFile; | 
|---|
| 147 | }; | 
|---|
| 148 |  | 
|---|
| 149 | #endif | 
|---|
| 150 |  | 
|---|
| 151 |  | 
|---|