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
17void reset_image_cache();
18
19struct 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
25struct 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
74protected:
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 showMenu();
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 *_systemMenu;
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 _menuActive;
145 strlib::String _loadPath;
146 strlib::String _activeFile;
147};
148
149#endif
150
151