1313#include " common/device.h"
1414#include " ui/keypad.h"
1515
16- extern Runtime *runtime;
17-
1816void showHelpLineInput (TextEditHelpWidget *helpWidget, int width = 35 ) {
1917 helpWidget->showPopup (width, 1 );
2018}
2119
22- void System ::editSource (strlib::String loadPath, bool restoreOnExit) {
20+ void Runtime ::editSource (strlib::String loadPath, bool restoreOnExit) {
2321 logEntered ();
2422
2523 strlib::String fileName;
@@ -60,19 +58,25 @@ void System::editSource(strlib::String loadPath, bool restoreOnExit) {
6058 _output->clearScreen ();
6159 _output->addInput (editWidget);
6260 _output->addInput (helpWidget);
63- _output->addInput (new KeypadInput (false , false , charWidth, charHeight));
61+
62+ if (_keypad != nullptr ) {
63+ _output->addInput (_keypad);
64+ } else {
65+ _keypad = new KeypadInput (false , false , charWidth, charHeight);
66+ _output->addInput (_keypad);
67+ }
6468
6569 // to layout inputs
6670 _output->resize (w, h);
6771
6872 if (gsb_last_line && isBreak ()) {
6973 String msg = " Break at line: " ;
7074 msg.append (gsb_last_line);
71- runtime-> alert (msg);
75+ alert (msg);
7276 } else if (gsb_last_error && !isBack ()) {
7377 // program stopped with an error
7478 editWidget->setCursorRow (gsb_last_line + editWidget->getSelectionRow () - 1 );
75- runtime-> alert (gsb_last_errmsg);
79+ alert (gsb_last_errmsg);
7680 }
7781
7882 bool showStatus = !editWidget->getScroll ();
@@ -89,11 +93,6 @@ void System::editSource(strlib::String loadPath, bool restoreOnExit) {
8993 _output->setStatus (editWidget->isDirty () ? dirtyFile : cleanFile);
9094 _output->redraw ();
9195 showStatus = true ;
92- } else if (widget == helpWidget && helpWidget->searchMode ()) {
93- // end searching
94- widget = editWidget;
95- helpWidget->hide ();
96- helpWidget->cancelMode ();
9796 }
9897 break ;
9998 case EVENT_TYPE_POINTER_RELEASED:
@@ -149,9 +148,18 @@ void System::editSource(strlib::String loadPath, bool restoreOnExit) {
149148 }
150149 break ;
151150 case SB_KEY_CTRL (' f' ):
152- widget = helpWidget;
153- helpWidget->createSearch (false );
154- showHelpLineInput (helpWidget);
151+ if (widget == helpWidget && helpWidget->searchMode ()) {
152+ // end searching
153+ widget = editWidget;
154+ helpWidget->hide ();
155+ helpWidget->cancelMode ();
156+ showStatus = false ;
157+ } else {
158+ widget = helpWidget;
159+ helpWidget->createSearch (false );
160+ showHelpLineInput (helpWidget);
161+ showStatus = true ;
162+ }
155163 break ;
156164 case SB_KEY_CTRL (' s' ):
157165 saveFile (editWidget, loadPath);
@@ -222,13 +230,17 @@ void System::editSource(strlib::String loadPath, bool restoreOnExit) {
222230 if (!_output->removeInput (editWidget)) {
223231 trace (" Failed to remove editor input" );
224232 }
233+ if (!_output->removeInput (_keypad)) {
234+ trace (" Failed to remove keypad input" );
235+ }
225236 _editor = editWidget;
226237 _editor->setFocus (false );
227238 } else {
228239 _editor = nullptr ;
240+ _keypad = nullptr ;
229241 }
230242
231- // deletes editWidget unless it has been removed
243+ // deletes editWidget and _keypad unless it has been removed
232244 _output->removeInputs ();
233245 if (!isClosing () && restoreOnExit) {
234246 _output->selectScreen (prevScreenId);
0 commit comments