@@ -31,6 +31,15 @@ import 'package:playground/modules/examples/models/example_model.dart';
3131import 'package:playground/modules/sdk/models/sdk.dart' ;
3232import 'package:provider/provider.dart' ;
3333
34+ const kNumberOfStringsToSkip = 16 ;
35+ const kJavaRegExp = r'import\s[A-z.0-9]*\;\n\n[(\/\*\*)|(public)|(class)]' ;
36+ const kPythonRegExp = r'[^\S\r\n](import|as)[^\S\r\n][A-z]*\n\n' ;
37+ const kGoRegExp = r'[^\S\r\n]+\'
38+ r'"'
39+ r'.*'
40+ r'"'
41+ r'\n\)\n\n' ;
42+
3443class EditorTextArea extends StatefulWidget {
3544 final SDK sdk;
3645 final ExampleModel ? example;
@@ -51,6 +60,7 @@ class EditorTextArea extends StatefulWidget {
5160
5261class _EditorTextAreaState extends State <EditorTextArea > {
5362 CodeController ? _codeController;
63+ var focusNode = FocusNode ();
5464
5565 @override
5666 void initState () {
@@ -71,13 +81,17 @@ class _EditorTextAreaState extends State<EditorTextArea> {
7181 },
7282 webSpaceFix: false ,
7383 );
84+
85+ _setTextScrolling ();
86+
7487 super .didChangeDependencies ();
7588 }
7689
7790 @override
7891 void dispose () {
7992 super .dispose ();
8093 _codeController? .dispose ();
94+ focusNode.dispose ();
8195 }
8296
8397 @override
@@ -90,6 +104,7 @@ class _EditorTextAreaState extends State<EditorTextArea> {
90104 readOnly: widget.enabled,
91105 label: AppLocalizations .of (context)! .codeTextArea,
92106 child: CodeField (
107+ focusNode: focusNode,
93108 enabled: widget.enabled,
94109 controller: _codeController! ,
95110 textStyle: getCodeFontStyle (
@@ -105,6 +120,50 @@ class _EditorTextAreaState extends State<EditorTextArea> {
105120 );
106121 }
107122
123+ _setTextScrolling () {
124+ focusNode.requestFocus ();
125+ if (_codeController! .text.isNotEmpty) {
126+ _codeController! .selection = TextSelection .fromPosition (
127+ TextPosition (offset: _findOffset ()),
128+ );
129+ }
130+ }
131+
132+ _findOffset () {
133+ return _codeController! .text.indexOf (
134+ _skipStrings (kNumberOfStringsToSkip),
135+ _getPositionAfterImportsAndLicenses (widget.sdk),
136+ );
137+ }
138+
139+ String _skipStrings (int qntOfStrings) {
140+ List <String > strings = _codeController! .text
141+ .substring (_getPositionAfterImportsAndLicenses (widget.sdk))
142+ .split ('\n ' );
143+ String result =
144+ strings.length > qntOfStrings ? strings[qntOfStrings] : strings.last;
145+ if (result == '' ) {
146+ return _skipStrings (qntOfStrings - 1 );
147+ } else {
148+ return result;
149+ }
150+ }
151+
152+ int _getPositionAfterImportsAndLicenses (SDK sdk) {
153+ switch (sdk) {
154+ case SDK .java:
155+ return _codeController! .text.lastIndexOf (RegExp (kJavaRegExp));
156+ case SDK .python:
157+ return _codeController! .text.lastIndexOf (RegExp (kPythonRegExp));
158+ case SDK .go:
159+ return _codeController! .text.lastIndexOf (RegExp (kGoRegExp));
160+ case SDK .scio:
161+ return _codeController! .text.indexOf (
162+ _codeController! .text.split ('\n ' )[0 ],
163+ );
164+ }
165+ }
166+
108167 _getLanguageFromSdk () {
109168 switch (widget.sdk) {
110169 case SDK .java:
0 commit comments