Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 05d75bf

Browse files
committedFeb 6, 2022
Update the example app structure to make it easy to add new language or theme
1 parent 69494d4 commit 05d75bf

File tree

8 files changed

+262
-146
lines changed

8 files changed

+262
-146
lines changed
 

‎app/src/main/java/com/amrdeveloper/codeviewlibrary/MainActivity.java

Lines changed: 36 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,22 @@
1717

1818
import com.amrdeveloper.codeview.Code;
1919
import com.amrdeveloper.codeview.CodeView;
20-
import com.amrdeveloper.codeview.Keyword;
21-
import com.amrdeveloper.codeviewlibrary.syntax.Theme;
22-
import com.amrdeveloper.codeviewlibrary.syntax.Language;
23-
import com.amrdeveloper.codeviewlibrary.syntax.SyntaxManager;
20+
import com.amrdeveloper.codeviewlibrary.syntax.ThemeName;
21+
import com.amrdeveloper.codeviewlibrary.syntax.LanguageName;
22+
import com.amrdeveloper.codeviewlibrary.syntax.LanguageManager;
2423
import com.google.android.material.bottomsheet.BottomSheetDialog;
2524

26-
import java.util.ArrayList;
2725
import java.util.HashMap;
28-
import java.util.HashSet;
2926
import java.util.List;
3027
import java.util.Map;
31-
import java.util.Set;
3228

3329
public class MainActivity extends AppCompatActivity {
3430

3531
private CodeView codeView;
36-
private SyntaxManager syntaxManager;
32+
private LanguageManager languageManager;
3733

38-
private Language currentLanguage = Language.JAVA;
39-
private Theme currentTheme = Theme.MONOKAI;
34+
private LanguageName currentLanguage = LanguageName.JAVA;
35+
private ThemeName currentTheme = ThemeName.MONOKAI;
4036

4137
private final boolean useModernAutoCompleteAdapter = true;
4238

@@ -64,17 +60,9 @@ private void configCodeView() {
6460
codeView.setTabLength(4);
6561
codeView.setEnableAutoIndentation(true);
6662

67-
Set<Character> indentationStart = new HashSet<>();
68-
indentationStart.add('{');
69-
codeView.setIndentationStarts(indentationStart);
70-
71-
Set<Character> indentationEnds = new HashSet<>();
72-
indentationEnds.add('}');
73-
codeView.setIndentationEnds(indentationEnds);
74-
7563
// Setup the language and theme with SyntaxManager helper class
76-
syntaxManager = new SyntaxManager(this, codeView);
77-
syntaxManager.applyTheme(currentLanguage,currentTheme);
64+
languageManager = new LanguageManager(this, codeView);
65+
languageManager.applyTheme(currentLanguage, currentTheme);
7866

7967
// Setup auto pair complete
8068
final Map<Character, Character> pairCompleteMap = new HashMap<>();
@@ -87,45 +75,41 @@ private void configCodeView() {
8775
codeView.setPairCompleteMap(pairCompleteMap);
8876
codeView.enablePairComplete(true);
8977

90-
// Setup the auto complete for the current language
78+
// Setup the auto complete and auto indenting for the current language
9179
configLanguageAutoComplete();
80+
configLanguageAutoIndentation();
9281
}
9382

9483
private void configLanguageAutoComplete() {
95-
final String[] languageKeywords;
96-
switch (currentLanguage) {
97-
case JAVA:
98-
languageKeywords = getResources().getStringArray(R.array.java_keywords);
99-
break;
100-
case PYTHON:
101-
languageKeywords = getResources().getStringArray(R.array.python_keywords);
102-
break;
103-
default:
104-
languageKeywords = getResources().getStringArray(R.array.go_keywords);
105-
break;
106-
}
107-
10884
if (useModernAutoCompleteAdapter) {
109-
final List<Code> codeList = new ArrayList<>();
110-
for (String keyword : languageKeywords) {
111-
codeList.add(new Keyword(keyword, keyword));
112-
}
113-
// Here you can add snippets to the codeList
85+
// Load the code list (keywords and snippets) for the current language
86+
List<Code> codeList = languageManager.getLanguageCodeList(currentLanguage);
87+
88+
// Use CodeViewAdapter or custom one
11489
CustomCodeViewAdapter adapter = new CustomCodeViewAdapter(this, codeList);
90+
91+
// Add the odeViewAdapter to the CodeView
11592
codeView.setAdapter(adapter);
11693
} else {
94+
String[] languageKeywords = languageManager.getLanguageKeywords(currentLanguage);
95+
11796
// Custom list item xml layout
11897
final int layoutId = R.layout.list_item_suggestion;
11998

12099
// TextView id to put suggestion on it
121100
final int viewId = R.id.suggestItemTextView;
122101
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, layoutId, viewId, languageKeywords);
123102

124-
// Add Custom Adapter to the CodeView
103+
// Add the ArrayAdapter to the CodeView
125104
codeView.setAdapter(adapter);
126105
}
127106
}
128107

108+
private void configLanguageAutoIndentation() {
109+
codeView.setIndentationStarts(languageManager.getLanguageIndentationStarts(currentLanguage));
110+
codeView.setIndentationEnds(languageManager.getLanguageIndentationEnds(currentLanguage));
111+
}
112+
129113
@Override
130114
public boolean onCreateOptionsMenu(Menu menu) {
131115
getMenuInflater().inflate(R.menu.menu_main, menu);
@@ -146,26 +130,27 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
146130
}
147131

148132
private void changeTheEditorLanguage(int languageId) {
149-
final Language oldLanguage = currentLanguage;
150-
if (languageId == R.id.language_java) currentLanguage = Language.JAVA;
151-
else if (languageId == R.id.language_python) currentLanguage = Language.PYTHON;
152-
else if(languageId == R.id.language_go) currentLanguage = Language.GO_LANG;
133+
final LanguageName oldLanguage = currentLanguage;
134+
if (languageId == R.id.language_java) currentLanguage = LanguageName.JAVA;
135+
else if (languageId == R.id.language_python) currentLanguage = LanguageName.PYTHON;
136+
else if(languageId == R.id.language_go) currentLanguage = LanguageName.GO_LANG;
153137

154138
if (currentLanguage != oldLanguage) {
155-
syntaxManager.applyTheme(currentLanguage, currentTheme);
139+
languageManager.applyTheme(currentLanguage, currentTheme);
156140
configLanguageAutoComplete();
141+
configLanguageAutoIndentation();
157142
}
158143
}
159144

160145
private void changeTheEditorTheme(int themeId) {
161-
final Theme oldTheme = currentTheme;
162-
if (themeId == R.id.theme_monokia) currentTheme = Theme.MONOKAI;
163-
else if (themeId == R.id.theme_noctics) currentTheme = Theme.NOCTIS_WHITE;
164-
else if(themeId == R.id.theme_five_color) currentTheme = Theme.FIVE_COLOR;
165-
else if(themeId == R.id.theme_orange_box) currentTheme = Theme.ORANGE_BOX;
146+
final ThemeName oldTheme = currentTheme;
147+
if (themeId == R.id.theme_monokia) currentTheme = ThemeName.MONOKAI;
148+
else if (themeId == R.id.theme_noctics) currentTheme = ThemeName.NOCTIS_WHITE;
149+
else if(themeId == R.id.theme_five_color) currentTheme = ThemeName.FIVE_COLOR;
150+
else if(themeId == R.id.theme_orange_box) currentTheme = ThemeName.ORANGE_BOX;
166151

167152
if (currentTheme != oldTheme) {
168-
syntaxManager.applyTheme(currentLanguage, currentTheme);
153+
languageManager.applyTheme(currentLanguage, currentTheme);
169154
}
170155
}
171156

‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/GoSyntaxUtils.java renamed to ‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/GoLanguage.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22

33
import android.content.Context;
44

5+
import com.amrdeveloper.codeview.Code;
56
import com.amrdeveloper.codeview.CodeView;
7+
import com.amrdeveloper.codeview.Keyword;
68
import com.amrdeveloper.codeviewlibrary.R;
79

10+
import java.util.ArrayList;
11+
import java.util.HashSet;
12+
import java.util.List;
13+
import java.util.Set;
814
import java.util.regex.Pattern;
915

10-
public class GoSyntaxUtils {
16+
public class GoLanguage {
1117

1218
//Language Keywords
1319
private static final Pattern PATTERN_KEYWORDS = Pattern.compile("\\b(break|default|func|interface|case|defer|" +
@@ -129,4 +135,28 @@ public static void applyOrangeBoxTheme(Context context, CodeView codeView) {
129135
codeView.reHighlightSyntax();
130136
}
131137

138+
public static String[] getKeywords(Context context) {
139+
return context.getResources().getStringArray(R.array.go_keywords);
140+
}
141+
142+
public static List<Code> getCodeList(Context context) {
143+
List<Code> codeList = new ArrayList<>();
144+
String[] keywords = getKeywords(context);
145+
for (String keyword : keywords) {
146+
codeList.add(new Keyword(keyword));
147+
}
148+
return codeList;
149+
}
150+
151+
public static Set<Character> getIndentationStarts() {
152+
Set<Character> characterSet = new HashSet<>();
153+
characterSet.add('{');
154+
return characterSet;
155+
}
156+
157+
public static Set<Character> getIndentationEnds() {
158+
Set<Character> characterSet = new HashSet<>();
159+
characterSet.add('}');
160+
return characterSet;
161+
}
132162
}

‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/JavaSyntaxUtils.java renamed to ‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/JavaLanguage.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22

33
import android.content.Context;
44

5+
import com.amrdeveloper.codeview.Code;
56
import com.amrdeveloper.codeview.CodeView;
7+
import com.amrdeveloper.codeview.Keyword;
68
import com.amrdeveloper.codeviewlibrary.R;
79

10+
import java.util.ArrayList;
11+
import java.util.HashSet;
12+
import java.util.List;
13+
import java.util.Set;
814
import java.util.regex.Pattern;
915

10-
public class JavaSyntaxUtils {
16+
public class JavaLanguage {
1117

1218
//Language Keywords
1319
private static final Pattern PATTERN_KEYWORDS = Pattern.compile("\\b(abstract|boolean|break|byte|case|catch" +
@@ -139,4 +145,28 @@ public static void applyOrangeBoxTheme(Context context, CodeView codeView) {
139145
codeView.reHighlightSyntax();
140146
}
141147

148+
public static String[] getKeywords(Context context) {
149+
return context.getResources().getStringArray(R.array.java_keywords);
150+
}
151+
152+
public static List<Code> getCodeList(Context context) {
153+
List<Code> codeList = new ArrayList<>();
154+
String[] keywords = getKeywords(context);
155+
for (String keyword : keywords) {
156+
codeList.add(new Keyword(keyword));
157+
}
158+
return codeList;
159+
}
160+
161+
public static Set<Character> getIndentationStarts() {
162+
Set<Character> characterSet = new HashSet<>();
163+
characterSet.add('{');
164+
return characterSet;
165+
}
166+
167+
public static Set<Character> getIndentationEnds() {
168+
Set<Character> characterSet = new HashSet<>();
169+
characterSet.add('}');
170+
return characterSet;
171+
}
142172
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package com.amrdeveloper.codeviewlibrary.syntax;
2+
3+
import android.content.Context;
4+
5+
import com.amrdeveloper.codeview.Code;
6+
import com.amrdeveloper.codeview.CodeView;
7+
8+
import java.util.ArrayList;
9+
import java.util.HashSet;
10+
import java.util.List;
11+
import java.util.Set;
12+
13+
public class LanguageManager {
14+
15+
private final Context context;
16+
private final CodeView codeView;
17+
18+
public LanguageManager(Context context, CodeView codeView) {
19+
this.context = context;
20+
this.codeView = codeView;
21+
}
22+
23+
public void applyTheme(LanguageName language, ThemeName theme) {
24+
switch (theme) {
25+
case MONOKAI:
26+
applyMonokaiTheme(language);
27+
break;
28+
case NOCTIS_WHITE:
29+
applyNoctisWhiteTheme(language);
30+
break;
31+
case FIVE_COLOR:
32+
applyFiveColorsDarkTheme(language);
33+
break;
34+
case ORANGE_BOX:
35+
applyOrangeBoxTheme(language);
36+
break;
37+
}
38+
}
39+
40+
public String[] getLanguageKeywords(LanguageName language) {
41+
switch (language) {
42+
case JAVA: return JavaLanguage.getKeywords(context);
43+
case PYTHON: return PythonLanguage.getKeywords(context);
44+
case GO_LANG: return GoLanguage.getKeywords(context);
45+
default: return new String[]{};
46+
}
47+
}
48+
49+
public List<Code> getLanguageCodeList(LanguageName language) {
50+
switch (language) {
51+
case JAVA: return JavaLanguage.getCodeList(context);
52+
case PYTHON: return PythonLanguage.getCodeList(context);
53+
case GO_LANG: return GoLanguage.getCodeList(context);
54+
default: return new ArrayList<>();
55+
}
56+
}
57+
58+
public Set<Character> getLanguageIndentationStarts(LanguageName language) {
59+
switch (language) {
60+
case JAVA: return JavaLanguage.getIndentationStarts();
61+
case PYTHON: return PythonLanguage.getIndentationStarts();
62+
case GO_LANG: return GoLanguage.getIndentationStarts();
63+
default: return new HashSet<>();
64+
}
65+
}
66+
67+
public Set<Character> getLanguageIndentationEnds(LanguageName language) {
68+
switch (language) {
69+
case JAVA: return JavaLanguage.getIndentationEnds();
70+
case PYTHON: return PythonLanguage.getIndentationEnds();
71+
case GO_LANG: return GoLanguage.getIndentationEnds();
72+
default: return new HashSet<>();
73+
}
74+
}
75+
76+
private void applyMonokaiTheme(LanguageName language) {
77+
switch (language) {
78+
case JAVA:
79+
JavaLanguage.applyMonokaiTheme(context, codeView);
80+
break;
81+
case PYTHON:
82+
PythonLanguage.applyMonokaiTheme(context, codeView);
83+
break;
84+
case GO_LANG:
85+
GoLanguage.applyMonokaiTheme(context, codeView);
86+
break;
87+
}
88+
}
89+
90+
private void applyNoctisWhiteTheme(LanguageName language) {
91+
switch (language) {
92+
case JAVA:
93+
JavaLanguage.applyNoctisWhiteTheme(context, codeView);
94+
break;
95+
case PYTHON:
96+
PythonLanguage.applyNoctisWhiteTheme(context, codeView);
97+
break;
98+
case GO_LANG:
99+
GoLanguage.applyNoctisWhiteTheme(context, codeView);
100+
break;
101+
}
102+
}
103+
104+
private void applyFiveColorsDarkTheme(LanguageName language) {
105+
switch (language) {
106+
case JAVA:
107+
JavaLanguage.applyFiveColorsDarkTheme(context, codeView);
108+
break;
109+
case PYTHON:
110+
PythonLanguage.applyFiveColorsDarkTheme(context, codeView);
111+
break;
112+
case GO_LANG:
113+
GoLanguage.applyFiveColorsDarkTheme(context, codeView);
114+
break;
115+
}
116+
}
117+
118+
private void applyOrangeBoxTheme(LanguageName language) {
119+
switch (language) {
120+
case JAVA:
121+
JavaLanguage.applyOrangeBoxTheme(context, codeView);
122+
break;
123+
case PYTHON:
124+
PythonLanguage.applyOrangeBoxTheme(context, codeView);
125+
break;
126+
case GO_LANG:
127+
GoLanguage.applyOrangeBoxTheme(context, codeView);
128+
break;
129+
}
130+
}
131+
132+
}

‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/Language.java renamed to ‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/LanguageName.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/**
44
* List of examples languages for CodeView
55
*/
6-
public enum Language {
6+
public enum LanguageName {
77
JAVA,
88
PYTHON,
99
GO_LANG

‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/PythonSyntaxUtils.java renamed to ‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/PythonLanguage.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22

33
import android.content.Context;
44

5+
import com.amrdeveloper.codeview.Code;
56
import com.amrdeveloper.codeview.CodeView;
7+
import com.amrdeveloper.codeview.Keyword;
68
import com.amrdeveloper.codeviewlibrary.R;
79

10+
import java.util.ArrayList;
11+
import java.util.HashSet;
12+
import java.util.List;
13+
import java.util.Set;
814
import java.util.regex.Pattern;
915

10-
public class PythonSyntaxUtils {
16+
public class PythonLanguage {
1117

1218
//Language Keywords
1319
private static final Pattern PATTERN_KEYWORDS = Pattern.compile("\\b(False|await|else|import|pass|None|break|except|in|raise" +
@@ -128,4 +134,27 @@ public static void applyOrangeBoxTheme(Context context, CodeView codeView) {
128134

129135
codeView.reHighlightSyntax();
130136
}
137+
138+
public static String[] getKeywords(Context context) {
139+
return context.getResources().getStringArray(R.array.python_keywords);
140+
}
141+
142+
public static List<Code> getCodeList(Context context) {
143+
List<Code> codeList = new ArrayList<>();
144+
String[] keywords = getKeywords(context);
145+
for (String keyword : keywords) {
146+
codeList.add(new Keyword(keyword));
147+
}
148+
return codeList;
149+
}
150+
151+
public static Set<Character> getIndentationStarts() {
152+
Set<Character> characterSet = new HashSet<>();
153+
characterSet.add(':');
154+
return characterSet;
155+
}
156+
157+
public static Set<Character> getIndentationEnds() {
158+
return new HashSet<>();
159+
}
131160
}

‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/SyntaxManager.java

Lines changed: 0 additions & 90 deletions
This file was deleted.

‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/Theme.java renamed to ‎app/src/main/java/com/amrdeveloper/codeviewlibrary/syntax/ThemeName.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.amrdeveloper.codeviewlibrary.syntax;
22

3-
public enum Theme {
3+
public enum ThemeName {
44
MONOKAI,
55
NOCTIS_WHITE,
66
FIVE_COLOR,

0 commit comments

Comments
 (0)
Please sign in to comment.