This commit is contained in:
2024-10-07 14:44:24 +03:00
parent 61fc37b574
commit 4b05d4f4f2
74 changed files with 152 additions and 249 deletions

View File

@@ -300,8 +300,8 @@ public class Global {
//-
UI.CreateComponentsForm();
AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance();
atmf.putMapping("text/FortranSPF", "Common.UI.Themes.FortranSPFTokenMaker");
atmf.putMapping("text/FreeFortranSPF", "Common.UI.Themes.FreeFortranSPFTokenMaker");
atmf.putMapping("text/FortranSPF", "_VisualDVM.Syntax.FortranSPFTokenMaker");
atmf.putMapping("text/FreeFortranSPF", "_VisualDVM.Syntax.FreeFortranSPFTokenMaker");
// FoldParserManager.get().addFoldParserMapping("text/FortranSPF", new FortranFolder()); блоки кода. todo
//-------->>
//-------->>

View File

@@ -0,0 +1,64 @@
package _VisualDVM.Syntax;
import java.awt.*;
public class DarkVisualiserTheme extends VisualiserTheme {
@Override
protected String getEditorThemePath() {
return "/_VisualDVM/Syntax/dark_editor.xml";
}
@Override
protected String getForegroundHex() {
return "#e0e5eb";
}
@Override
protected String getBackgroundHex() {
return "#484a4c";
}
@Override
protected String getSelectionBackgroundHex() {
return "#20355a";
}
@Override
protected String getTreeBackgroundHex() {
return "#293134";
}
@Override
protected String getBarForegroundHex() {
return "#000000";
}
@Override
protected String getBarBackgroundHex() {
return "#484a4c";
}
@Override
protected String getTableBackgroundHex() {
return "#293134";
}
@Override
protected Color getGoodFontColor() {
return Color.decode("#24ff58");
}
@Override
protected Color getReadyFontColor2() {
return Color.decode("#FFFF00");
}
@Override
protected Color getProgressFontColor() {
return Color.orange;
}
@Override
protected Color getBadFontColor() {
return Color.decode("#8B0000");
}
@Override
protected Color getFatalFontColor() {
return Color.red;
}
@Override
protected Color getUnknownFontColor() {
return Color.decode("#c7c7c7");
}
@Override
protected Color getHyperlinkFontColor() {
return Color.decode("#00aee9");
}
}

View File

@@ -0,0 +1,408 @@
package _VisualDVM.Syntax;
import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
import org.fife.ui.rsyntaxtextarea.Token;
import org.fife.ui.rsyntaxtextarea.TokenMap;
import javax.swing.text.Segment;
public class FortranSPFTokenMaker extends ProvidedTokenMaker {
@Override
public TokenMap getWordsToHighlight() {
TokenMap tokenMap = new TokenMap(true);
fillTokenMap(tokenMap, Token.RESERVED_WORD,
"FORALL", "ENDFORALL", "PUBLIC", "PRIVATE", "ADMIT", "ASSIGNMENT", "CALL", "COMMON",
"CYCLE", "DIMENSION", "END", "ENDDO", "ENTRY", "FORMAT", "IMPLICIT", "INTENT", "MAP",
"OPEN", "POINTER", "PROGRAM", "RECURSIVE", "STOP", "THEN", "WHILE", "ALLOCATABLE",
"ATEND", "CASE", "COMPLEX", "DATA", "DO", "ENDFILE", "EQUIVALENCE", "FUNCTION",
"INCLUDE", "INTERFACE", "MODULE", "OPTIONAL", "PRINT", "PURE", "READ", "RETURN",
"STRUCTURE", "TYPE", "WRITE", "ALLOCATE", "BACKSPACE", "CHARACTER", "CONTAINS",
"DEALLOCATE", "DOUBLE", "ENDIF", "EXIT", "GOTO", "INQUIRE", "INTRINSIC", "NAMELIST",
"PARAMETER", "PRECISION", "REAL", "REWIND", "SUBROUTINE", "UNION", "ASSIGN", "BLOCKDATA",
"CLOSE", "CONTINUE", "DEFAULT", "ELSE", "ELSEIF", "ENDSELECT", "EXTERNAL", "IF", "INTEGER",
"LOGICAL", "NONE", "PAUSE", "PROCEDURE", "RECORD", "SAVE", "TARGET", "USE", "SELECT", "BLOCK", "WHERE"
);
fillTokenMap(tokenMap, Token.OPERATOR,
".EQ.",
".NE.", ".LT.", ".LE.",
".GT.", ".GE.",
".NOT.", ".AND.", ".EQV.", ".NEQV.",
".OR.", ".TRUE.", ".FALSE."
);
return tokenMap;
}
@Override
public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
int finalTokenType = tokenType;
switch (tokenType) {
case Token.COMMENT_EOL:
if (segment.count >= 5) {
switch (segment.subSequence(1, 5).toString().toUpperCase()) {
case "$SPF":
finalTokenType = Token.COMMENT_DOCUMENTATION;
break;
case "DVM$":
finalTokenType = Token.COMMENT_MARKUP;
break;
case "$OMP":
finalTokenType = Token.COMMENT_KEYWORD;
break;
default:
break;
}
}
break;
case Token.IDENTIFIER:
int value = wordsToHighlight.get(segment, start, end);
//ключевое слово
if (value != -1) {
finalTokenType = value;
}
break;
default:
break;
}
super.addToken(segment, start, end, finalTokenType, startOffset);
}
@Override
public void Body(TokenProvider provider) {
switch (provider.position) {
//<editor-fold desc="Зона переноса">
case 0:
//тут всегда currentTokenType=NULL. переносимый известеи в startTokenType
provider.start();
switch (provider.c) {
case '!':
case '*':
case 'C':
case 'c':
case 'D':
case 'd':
//комментарий. анализ закончен
provider.setType(Token.COMMENT_EOL);
provider.stop();
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
//метка.
provider.setType(Token.MARKUP_TAG_NAME);
provider.label_flag = true;
break;
case ' ':
case '\r':
//пробелы
provider.setType(Token.WHITESPACE);
break;
case '\t':
provider.SkipWrap();
break;
default:
//все остальное
provider.setType(Token.IDENTIFIER);
break;
}
break;
case 1:
case 2:
case 3:
case 4:
switch (provider.currentTokenType) {
case Token.MARKUP_TAG_NAME:
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '\r':
break;
case '!':
SaveCurrent(provider);
provider.start();
//комментарий. анализ закончен
provider.setType(Token.COMMENT_EOL);
provider.stop();
break;
case ' ':
SaveCurrent(provider);
provider.start();
provider.setType(Token.WHITESPACE);
break;
case '\t':
SaveCurrent(provider);
provider.start();
provider.SkipWrap();
break;
default:
//это не метка. меняем тип.
provider.setType(Token.IDENTIFIER);
break;
}
break;
case Token.WHITESPACE:
switch (provider.c) {
case ' ':
case '\r':
break;
case '\t':
provider.SkipWrap();
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
SaveCurrent(provider);
provider.start();
//если метка уже бывала. значит больше меток нет
if (provider.label_flag) {
provider.setType(Token.IDENTIFIER);
} else {
provider.setType(Token.MARKUP_TAG_NAME);
provider.label_flag = true;
}
break;
case '!':
SaveCurrent(provider);
provider.start();
//комментарий. анализ закончен
provider.setType(Token.COMMENT_EOL);
provider.stop();
break;
default:
SaveCurrent(provider);
provider.start();
provider.setType(Token.IDENTIFIER);
break;
}
break;
case Token.IDENTIFIER:
switch (provider.c) {
case '!':
SaveCurrent(provider);
provider.start();
//комментарий. анализ закончен
provider.setType(Token.COMMENT_EOL);
provider.stop();
break;
case '\t':
SaveCurrent(provider);
provider.start();
provider.SkipWrap();
break;
default:
//уже неважно что это.
break;
}
break;
}
break;
case 5:
switch (provider.c) {
case ' ':
case '\r':
case '\t':
switch (provider.currentTokenType) {
case Token.WHITESPACE:
//это пробел, и нам норм.
break;
default:
SaveCurrent(provider);
provider.start();
provider.setType(Token.WHITESPACE);
break;
}
//это пробелы. переноса нет. убираем сохранение типа
provider.startTokenType = Token.NULL;
break;
default:
//это - позиция переноса. сохраняем все что было до нее.
SaveCurrent(provider);
provider.start();
provider.setType(Token.OPERATOR);
SaveCurrent_(provider); //сохраняем его как одиночный оператор.
provider.setType(provider.startTokenType);
//берем унаследование от предыдущей строки
break;
}
break;
//</editor-fold>
//<editor-fold desc="Основной текст строки">
default:
switch (provider.currentTokenType) {
case Token.NULL:
provider.start();
provider.detectType();
break;
case Token.WHITESPACE:
switch (provider.c) {
case ' ':
case '\t':
case '\r':
break;
default:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
}
break;
case Token.OPERATOR:
provider.checkWrap();
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
case Token.LITERAL_NUMBER_DECIMAL_INT:
provider.checkWrap();
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '\r':
break;
case '.':
case 'e':
case 'E':
case 'd':
case 'D':
provider.setType(Token.LITERAL_NUMBER_FLOAT);
break;
default:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
}
break;
case Token.LITERAL_NUMBER_FLOAT:
provider.checkWrap();
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '\r':
break;
case 'e':
case 'E':
case 'd':
case 'D':
SaveCurrent_(provider);
provider.setType(Token.NULL);
break;
default:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
}
break;
case Token.RESERVED_WORD_2:
provider.checkWrap();
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
//подозрения подтвердились. это дробь.
provider.setType(Token.LITERAL_NUMBER_FLOAT);
break;
case '\r':
break;
default:
provider.setType(Token.IDENTIFIER);
break;
}
break;
case Token.LITERAL_CHAR:
switch (provider.c) {
case '\'':
SaveCurrent_(provider);
provider.setType(Token.NULL);
break;
default:
break;
}
break;
case Token.LITERAL_STRING_DOUBLE_QUOTE:
switch (provider.c) {
case '"':
SaveCurrent_(provider);
provider.setType(Token.NULL);
break;
default:
break;
}
break;
case Token.IDENTIFIER:
provider.checkWrap();
if (!
(RSyntaxUtilities.isLetter(provider.c) ||
RSyntaxUtilities.isDigit(provider.c) ||
(provider.c == '_') ||
(provider.c == '.')
)) {
SaveCurrent(provider);
provider.start();
provider.detectType();
}
break;
}
//</editor-fold>
}
}
@Override
public void performFinish(TokenProvider provider) {
switch (provider.currentTokenType) {
case Token.NULL:
addNullToken();
break;
// case Token.IDENTIFIER:
case Token.LITERAL_NUMBER_DECIMAL_INT:
case Token.LITERAL_NUMBER_FLOAT:
case Token.RESERVED_WORD_2:
SaveCurrent(provider);
break;
default:
SaveCurrent(provider);
addNullToken();
break;
}
}
}

View File

@@ -0,0 +1,297 @@
package _VisualDVM.Syntax;
import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
import org.fife.ui.rsyntaxtextarea.Token;
import org.fife.ui.rsyntaxtextarea.TokenMap;
import javax.swing.text.Segment;
public class FreeFortranSPFTokenMaker extends ProvidedTokenMaker {
@Override
public TokenMap getWordsToHighlight() {
TokenMap tokenMap = new TokenMap(true);
fillTokenMap(tokenMap, Token.RESERVED_WORD,
"FORALL", "ENDFORALL", "PUBLIC", "PRIVATE", "ADMIT", "ASSIGNMENT", "CALL", "COMMON",
"CYCLE", "DIMENSION", "END", "ENDDO", "ENTRY", "FORMAT", "IMPLICIT", "INTENT", "MAP",
"OPEN", "POINTER", "PROGRAM", "RECURSIVE", "STOP", "THEN", "WHILE", "ALLOCATABLE",
"ATEND", "CASE", "COMPLEX", "DATA", "DO", "ENDFILE", "EQUIVALENCE", "FUNCTION",
"INCLUDE", "INTERFACE", "MODULE", "OPTIONAL", "PRINT", "PURE", "READ", "RETURN",
"STRUCTURE", "TYPE", "WRITE", "ALLOCATE", "BACKSPACE", "CHARACTER", "CONTAINS",
"DEALLOCATE", "DOUBLE", "ENDIF", "EXIT", "GOTO", "INQUIRE", "INTRINSIC", "NAMELIST",
"PARAMETER", "PRECISION", "REAL", "REWIND", "SUBROUTINE", "UNION", "ASSIGN", "BLOCKDATA",
"CLOSE", "CONTINUE", "DEFAULT", "ELSE", "ELSEIF", "ENDSELECT", "EXTERNAL", "IF", "INTEGER",
"LOGICAL", "NONE", "PAUSE", "PROCEDURE", "RECORD", "SAVE", "TARGET", "USE", "SELECT", "BLOCK", "WHERE"
);
fillTokenMap(tokenMap, Token.OPERATOR,
".EQ.",
".NE.", ".LT.", ".LE.",
".GT.", ".GE.",
".NOT.", ".AND.", ".EQV.", ".NEQV.",
".OR.", ".TRUE.", ".FALSE."
);
return tokenMap;
}
@Override
public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
int finalTokenType = tokenType;
switch (tokenType) {
case Token.COMMENT_EOL:
if (segment.count >= 5) {
switch (segment.subSequence(1, 5).toString().toUpperCase()) {
case "$SPF":
finalTokenType = Token.COMMENT_DOCUMENTATION;
break;
case "DVM$":
finalTokenType = Token.COMMENT_MARKUP;
break;
case "$OMP":
finalTokenType = Token.COMMENT_KEYWORD;
break;
default:
break;
}
}
break;
case Token.IDENTIFIER:
int value = wordsToHighlight.get(segment, start, end);
//ключевое слово
if (value != -1) {
finalTokenType = value;
}
break;
default:
break;
}
super.addToken(segment, start, end, finalTokenType, startOffset);
}
@Override
public void Body(TokenProvider provider) {
/*
switch (provider.position) {
//<editor-fold desc="Зона переноса">
case 0:
//тут всегда currentTokenType=NULL. переносимый известеи в startTokenType
provider.start();
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
//метка. может появиться только с 0-4 позиций. остальной анализ. аналогичен обычному.
provider.setType(Token.MARKUP_TAG_NAME);
provider.label_flag = true;
break;
default:
//все остальное
provider.detectType();
break;
}
break;
case 1:
case 2:
case 3:
case 4:
switch (provider.currentTokenType) {
case Token.MARKUP_TAG_NAME:
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '\r':
break;
default:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
}
break;
default:
DefaultLineParse(provider);
break;
}
break;
case 5:
switch (provider.c) {
case '&':
//это - позиция переноса. сохраняем все что было до нее.
SaveCurrent(provider);
provider.start();
provider.setType(Token.OPERATOR);
SaveCurrent_(provider); //сохраняем его как одиночный оператор.
provider.setType(provider.startTokenType);
//берем унаследование от предыдущей строки
break;
default:
if (provider.currentTokenType==Token.MARKUP_TAG_NAME){
//метка на этом символе уже обязана закончиться.
SaveCurrent(provider);
provider.start();
provider.detectType();
}else
DefaultLineParse(provider);
break;
}
break;
//</editor-fold>
//<editor-fold desc="Основной текст строки">
default:
DefaultLineParse(provider);
//</editor-fold>
}
*/
DefaultLineParse(provider);
}
public void DefaultLineParse(TokenProvider provider) {
switch (provider.currentTokenType) {
case Token.NULL:
provider.start();
provider.detectType();
break;
case Token.WHITESPACE:
switch (provider.c) {
case ' ':
case '\t':
case '\r':
break;
default:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
}
break;
case Token.OPERATOR:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
case Token.LITERAL_NUMBER_DECIMAL_INT:
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '\r':
break;
case '.':
case 'e':
case 'E':
case 'd':
case 'D':
provider.setType(Token.LITERAL_NUMBER_FLOAT);
break;
default:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
}
break;
case Token.LITERAL_NUMBER_FLOAT:
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '\r':
break;
case 'e':
case 'E':
case 'd':
case 'D':
SaveCurrent_(provider);
provider.setType(Token.NULL);
break;
default:
SaveCurrent(provider);
provider.start();
provider.detectType();
break;
}
break;
case Token.RESERVED_WORD_2:
switch (provider.c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
//подозрения подтвердились. это дробь.
provider.setType(Token.LITERAL_NUMBER_FLOAT);
break;
case '\r':
break;
default:
provider.setType(Token.IDENTIFIER);
break;
}
break;
case Token.LITERAL_CHAR:
switch (provider.c) {
case '\'':
SaveCurrent_(provider);
provider.setType(Token.NULL);
break;
default:
break;
}
break;
case Token.LITERAL_STRING_DOUBLE_QUOTE:
switch (provider.c) {
case '"':
SaveCurrent_(provider);
provider.setType(Token.NULL);
break;
default:
break;
}
break;
case Token.IDENTIFIER:
if (!
(RSyntaxUtilities.isLetter(provider.c) ||
RSyntaxUtilities.isDigit(provider.c) ||
(provider.c == '_') ||
(provider.c == '.')
)) {
SaveCurrent(provider);
provider.start();
provider.detectType();
}
break;
}
}
@Override
public void performFinish(TokenProvider provider) {
SaveCurrent(provider);
addNullToken();
}
}

View File

@@ -0,0 +1,64 @@
package _VisualDVM.Syntax;
import java.awt.*;
public class LightVisualiserTheme extends VisualiserTheme {
@Override
protected String getEditorThemePath() {
return "/_VisualDVM/Syntax/light_editor.xml";
}
@Override
protected String getForegroundHex() {
return "#000000";
}
@Override
protected String getBackgroundHex() {
return "#f7f7f7";
}
@Override
protected String getSelectionBackgroundHex() {
return "#dae3f1";
}
@Override
protected String getTreeBackgroundHex() {
return "#ffffff";
}
@Override
protected String getBarForegroundHex() {
return "#637780";
}
@Override
protected String getBarBackgroundHex() {
return "#ffffff";
}
@Override
protected String getTableBackgroundHex() {
return "#ffffff";
}
@Override
protected Color getGoodFontColor() {
return Color.decode("#009738");
}
@Override
protected Color getReadyFontColor2() {
return Color.decode("#FFD700");
}
@Override
protected Color getProgressFontColor() {
return Color.decode("#f39a28");
}
@Override
protected Color getBadFontColor() {
return Color.decode("#ab0000");
}
@Override
protected Color getFatalFontColor() {
return Color.decode("#FF4500");
}
@Override
protected Color getUnknownFontColor() {
return Color.GRAY;
}
@Override
protected Color getHyperlinkFontColor() {
return Color.blue;
}
}

View File

@@ -0,0 +1,45 @@
package _VisualDVM.Syntax;
import org.fife.ui.rsyntaxtextarea.AbstractTokenMaker;
import org.fife.ui.rsyntaxtextarea.Token;
import org.fife.ui.rsyntaxtextarea.TokenMap;
import javax.swing.text.Segment;
//объект создается 1 раз, при установке стиля редактора.
//НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ ПЕРЕДАВАТЬ ПО ССЫЛКЕ методам ради рефакторинга
//все переменные должны быть сугубо локальными
//иначе возможны непредсказуемые последствия.
//Метод вызывается асинхронно, причем несколькими событиями)
public abstract class ProvidedTokenMaker extends AbstractTokenMaker {
public static void fillTokenMap(TokenMap map, int type, String... words) {
for (String word : words)
map.put(word, type);
}
//сохранить не забирая текущий символ.
public void SaveCurrent(TokenProvider provider) {
addToken(provider.text, provider.currentTokenStart,
provider.i - 1, provider.currentTokenType,
provider.newStartOffset + provider.currentTokenStart);
}
//сохранить забирая текущий символ
public void SaveCurrent_(TokenProvider provider) {
addToken(provider.text, provider.currentTokenStart,
provider.i, provider.currentTokenType,
provider.newStartOffset + provider.currentTokenStart);
}
public abstract void Body(TokenProvider provider);
public abstract void performFinish(TokenProvider provider);
public Token getTokenList(Segment text, int startTokenType, int startOffset) {
resetTokenList();
//структура для хранения индексов смещений, текущего состояния и т д.
TokenProvider provider = new TokenProvider(text, startTokenType, startOffset);
// provider.checkFortranWrap();
while (provider.canRead()) {
provider.readNext();
Body(provider);
provider.gotoNext();
}
performFinish(provider);
// Return the first token in our linked list.
return firstToken;
}
}

View File

@@ -0,0 +1,8 @@
package _VisualDVM.Syntax;
public interface ThemeElement {
default void FontUp() {
}
default void FontDown() {
}
void applyTheme();
}

View File

@@ -0,0 +1,134 @@
package _VisualDVM.Syntax;
import org.fife.ui.rsyntaxtextarea.Token;
import javax.swing.text.Segment;
//сткуртура контейнер для всех текущих переменных.
//для упрощения операций.
public class TokenProvider {
public Segment text;
public char[] array;
public int offset;
public int count;
public int end;
// Token starting offsets are always of the form:
// 'startOffset + (currentTokenStart-offset)', but since startOffset and
// offset are constant, tokens' starting positions become:
// 'newStartOffset+currentTokenStart'.
public int newStartOffset;
public int currentTokenStart;
public int startTokenType; //хранить тип токена который нам передали, ради переносов
public int currentTokenType;
public int i;
public int position;
public char c;
public boolean label_flag;
public TokenProvider(Segment text_in, int startTokenType_in, int startOffset) {
text = text_in;
startTokenType = startTokenType_in; //может указывать на то, что мы продолжаем.
array = text.array;
offset = text.offset;
count = text.count;
end = offset + count;
// Token starting offsets are always of the form:
// 'startOffset + (currentTokenStart-offset)', but since startOffset and
// offset are constant, tokens' starting positions become:
// 'newStartOffset+currentTokenStart'.
newStartOffset = startOffset - offset;
currentTokenStart = offset;
currentTokenType = Token.NULL; //изначально не знаем что будем обрабатывать.
position = 0;
i = offset;
label_flag = false;
}
public void checkWrap() {
if (startTokenType != Token.NULL) {
start();
startTokenType = Token.NULL;
}
}
public void readNext() {
c = array[i];
}
public void gotoNext() {
++i;
++position;
//todo от греха от табов надо избавляться.
// возникает расхожедние между реальным и табским смещением. отсюда галюны.
// лучше бы их не отображать даже если они есть. но это к тексту файла. или как то узнавать их длину..
}
public boolean canRead() {
return i < end;
}
public void setType(int currentTokenType_in) {
currentTokenType = currentTokenType_in;
}
public void stop() {
i = end - 1;
}
public void start() {
currentTokenStart = i;
}
//в зоне основной строки
//по текущему символу определяем тип уже начатого токена.
public void detectType() {
switch (c) {
case ' ':
case '\t':
case '\r':
currentTokenType = Token.WHITESPACE;
break;
case '+':
case '-':
case '*':
case '/':
case '=':
case '(':
case ')':
case '[':
case ']':
case '<':
case '>':
case '{':
case '}':
case ',':
case '&':
currentTokenType = Token.OPERATOR;
break;
case '\'':
currentTokenType = Token.LITERAL_CHAR;
break;
case '"':
currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
break;
case '.':
//возможный кандидат на число с плавающей точкой.
currentTokenType = Token.RESERVED_WORD_2;
break;
case '!':
currentTokenType = Token.COMMENT_EOL;
stop();
break;
default:
currentTokenType = Token.IDENTIFIER;
break;
}
}
//досрочный выход из зоны переноса.
public void SkipWrap() {
startTokenType = Token.NULL; //перенос исключается.
position += 6; //гарантированное непопадание в зону переноса при анализе.
setType(Token.WHITESPACE); //стоит таб, значит переноса не будет. идет набор пробелов.
}
}

View File

@@ -0,0 +1,5 @@
package _VisualDVM.Syntax;
public enum VisualiserColor {
ToolTip_background,
ToolTip_foreground
}

View File

@@ -0,0 +1,21 @@
package _VisualDVM.Syntax;
public enum VisualiserFonts {
GoodState,
ReadyState,
BadState,
Fatal,
ProgressState,
UnknownState,
Hyperlink,
Disabled,
//бесцветные
Distribution,
//---
TreeItalic,
TreePlain,
TreeBold,
TreeBoldItalic,
BlueState,
NewVersion, //---
Menu
}

View File

@@ -0,0 +1,183 @@
package _VisualDVM.Syntax;
import _VisualDVM.Global;
import org.fife.ui.rsyntaxtextarea.Theme;
import java.awt.*;
import java.awt.font.TextAttribute;
import java.util.HashMap;
import java.util.LinkedHashMap;
import static java.awt.Font.MONOSPACED;
public abstract class VisualiserTheme {
public Color foreground;
public Color background;
public Color selection_background;
public Color trees_background;
public Color bar_foreground;
public Color bar_background;
public Color table_background;
public LinkedHashMap<VisualiserFonts, Font> Fonts = new LinkedHashMap<>();
public LinkedHashMap<VisualiserColor, Color> Colors = new LinkedHashMap<>();
public VisualiserTheme() {
try {
//-----------------------------------------------
//-----------------------------------------------
foreground = Color.decode(getForegroundHex());
background = Color.decode(getBackgroundHex());
selection_background = Color.decode(getSelectionBackgroundHex());
trees_background = Color.decode(getTreeBackgroundHex());
bar_foreground = Color.decode(getBarForegroundHex());
bar_background = Color.decode(getBarBackgroundHex());
table_background = Color.decode(getTableBackgroundHex());
//<editor-fold desc="шрифты">
Fonts.put(VisualiserFonts.GoodState,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, getGoodFontColor());
put(TextAttribute.SIZE, 16);
}
}
));
Fonts.put(VisualiserFonts.ReadyState,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, getReadyFontColor2());
put(TextAttribute.SIZE, 16);
}
}
));
Fonts.put(VisualiserFonts.BadState,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, getBadFontColor());
put(TextAttribute.SIZE, 16);
}
}
));
Fonts.put(VisualiserFonts.BlueState,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, getHyperlinkFontColor());
put(TextAttribute.SIZE, 16);
}
}
));
Fonts.put(VisualiserFonts.Fatal,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, getFatalFontColor());
put(TextAttribute.SIZE, 16);
}
}
));
Fonts.put(VisualiserFonts.UnknownState,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, getUnknownFontColor());
put(TextAttribute.SIZE, 16);
}
}
));
Fonts.put(VisualiserFonts.Hyperlink,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, MONOSPACED);
put(TextAttribute.FOREGROUND, getHyperlinkFontColor());
put(TextAttribute.SIZE, 18);
put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
}
}
));
Fonts.put(VisualiserFonts.ProgressState,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, getProgressFontColor());
put(TextAttribute.SIZE, 16);
}
}
));
Fonts.put(VisualiserFonts.Disabled, new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, MONOSPACED);
put(TextAttribute.BACKGROUND, Color.lightGray);
put(TextAttribute.FOREGROUND, Color.lightGray);
put(TextAttribute.SIZE, 18);
put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
}
}
));
Fonts.put(VisualiserFonts.Distribution,
new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, MONOSPACED);
put(TextAttribute.SIZE, 16);
}
}
)
);
Fonts.put(VisualiserFonts.TreePlain, new Font("Times New Roman", Font.PLAIN, 16));
Fonts.put(VisualiserFonts.TreeItalic, new Font("Times New Roman", Font.ITALIC, 16));
Fonts.put(VisualiserFonts.TreeBold, new Font("Times New Roman", Font.BOLD, 16));
Fonts.put(VisualiserFonts.TreeBoldItalic, new Font("Times New Roman", Font.BOLD|Font.ITALIC, 16));
Fonts.put(VisualiserFonts.Menu, new Font("Times New Roman", Font.ITALIC, 16));
Fonts.put(VisualiserFonts.NewVersion, new Font(
new HashMap<TextAttribute, Object>() {
{
put(TextAttribute.FAMILY, "Times New Roman");
put(TextAttribute.FOREGROUND, Color.BLACK);
put(TextAttribute.BACKGROUND, Color.YELLOW);
put(TextAttribute.SIZE, 16);
}
}
));
//</editor-fold>
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
protected abstract String getEditorThemePath();
protected abstract String getForegroundHex();
protected abstract String getBackgroundHex();
protected abstract String getSelectionBackgroundHex();
protected abstract String getTreeBackgroundHex();
protected abstract String getBarForegroundHex();
protected abstract String getBarBackgroundHex();
protected abstract String getTableBackgroundHex();
protected abstract Color getGoodFontColor();
protected abstract Color getReadyFontColor2();
protected abstract Color getProgressFontColor();
protected abstract Color getBadFontColor();
protected abstract Color getFatalFontColor();
protected abstract Color getUnknownFontColor();
protected abstract Color getHyperlinkFontColor(); //-
//если использовать один и тот же объект на все едиторы пявляются странности
//значит при применении выделяем новый экземпляр.
public Theme getEditorTheme() {
Theme res = null;
try {
res = Theme.load(getClass().getResourceAsStream(getEditorThemePath()));
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
return res;
}
}

View File

@@ -0,0 +1,5 @@
package _VisualDVM.Syntax;
public enum VisualiserThemeName {
Light,
Dark
}

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
<!--
Dark theme based off of Notepad++'s Obsidian theme.
See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
-->
<RSyntaxTheme version="1.0">
<!-- Omitting baseFont will use a system-appropriate monospaced. -->
<baseFont family="Courier New" size="16"/>
<!-- General editor colors. -->
<background color="293134"/>
<caret color="c1cbc2"/>
<selection useFG="false" bg="404E51" roundedEdges="false"/>
<currentLineHighlight color="2F393C" fade="false"/>
<marginLine fg="394448"/>
<markAllHighlight color="6b8189"/>
<!-- TODO: Fix me -->
<markOccurrencesHighlight color="5b7179" border="false"/>
<matchedBracket fg="6A8088" bg="6b8189" highlightBoth="false" animate="true"/>
<hyperlinks fg="a082bd"/>
<secondaryLanguages>
<language index="1" bg="333344"/>
<language index="2" bg="223322"/>
<language index="3" bg="332222"/>
</secondaryLanguages>
<!-- Gutter styling. -->
<gutterBorder color="81969A"/>
<lineNumbers fg="81969A"/>
<foldIndicator fg="6A8088" iconBg="2f383c" iconArmedBg="3f484c"/>
<iconRowHeader activeLineRange="3399ff"/>
<!-- Syntax tokens. -->
<tokenStyles>
<style token="IDENTIFIER" fg="e0e5eb"/>
<style token="RESERVED_WORD" fg="66beff" bold="true"/>
<style token="ANNOTATION" fg="E8E2B7"/>
<!-- SPF директивы. -->
<style token="COMMENT_DOCUMENTATION" fg="ff2c08" bold="true"/>
<!-- DVM директивы -->
<style token="COMMENT_MARKUP" fg="8300c2" bold="true"/>
<!-- OMP директивы -->
<style token="COMMENT_KEYWORD" fg="9e0900" bold="true"/>
<!-- простые комментарии -->
<style token="COMMENT_EOL" fg="9e9e9e"/>
<!-- строки в двойных кавычках -->
<style token="LITERAL_STRING_DOUBLE_QUOTE" fg="24ff4b"/>
<!-- строки в одинарных кавычках -->
<style token="LITERAL_CHAR" fg="EC7600"/>
<!-- метки -->
<style token="MARKUP_TAG_NAME" fg="ff2c08"/>
<!-- кандидат на дробную часть(точка) -->
<style token="RESERVED_WORD_2" fg="a9b7c6"/>
<style token="COMMENT_MULTILINE" fg="66747B"/>
<style token="FUNCTION" fg="E0E2E4"/>
<style token="DATA_TYPE" fg="678CB1" bold="true"/>
<style token="LITERAL_BOOLEAN" fg="93C763" bold="true"/>
<style token="LITERAL_NUMBER_DECIMAL_INT" fg="FFCD22"/>
<style token="LITERAL_NUMBER_FLOAT" fg="FFCD22"/>
<style token="LITERAL_NUMBER_HEXADECIMAL" fg="FFCD22"/>
<style token="LITERAL_BACKQUOTE" fg="EC7600"/>
<style token="MARKUP_TAG_DELIMITER" fg="678CB1"/>
<style token="MARKUP_TAG_ATTRIBUTE" fg="B3B689"/>
<style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="e1e2cf"/>
<style token="MARKUP_COMMENT" fg="66747B"/>
<style token="MARKUP_DTD" fg="A082BD"/>
<style token="MARKUP_PROCESSING_INSTRUCTION" fg="A082BD"/>
<style token="MARKUP_CDATA" fg="d5e6f0"/>
<style token="MARKUP_CDATA_DELIMITER" fg="ae9fbf"/>
<style token="MARKUP_ENTITY_REFERENCE" fg="678CB1"/>
<style token="OPERATOR" fg="E8E2B7"/>
<style token="PREPROCESSOR" fg="A082BD"/>
<style token="REGEX" fg="d39745"/>
<style token="SEPARATOR" fg="E8E2B7"/>
<style token="VARIABLE" fg="ae9fbf" bold="true"/>
<style token="WHITESPACE" fg="E0E2E4"/>
<style token="ERROR_IDENTIFIER" fg="E0E2E4" bg="04790e"/>
<style token="ERROR_NUMBER_FORMAT" fg="E0E2E4" bg="04790e"/>
<style token="ERROR_STRING_DOUBLE" fg="E0E2E4" bg="04790e"/>
<style token="ERROR_CHAR" fg="E0E2E4" bg="04790e"/>
</tokenStyles>
</RSyntaxTheme>

View File

@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
<!--
Theme that mimics Visual Studio's defaults.
See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
-->
<RSyntaxTheme version="1.0">
<!-- Omitting baseFont will use a system-appropriate monospaced. -->
<baseFont family="Courier New" size="16"/>
<!-- General editor colors. -->
<background color="ffffff"/>
<caret color="000000"/>
<selection fg="default" bg="default"/>
<currentLineHighlight color="e8f2fe" fade="false"/>
<marginLine fg="b0b4b9"/>
<markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
<markOccurrencesHighlight color="d4d4d4" border="false"/> <!-- TODO: Fix me -->
<matchedBracket fg="DBE0CC" highlightBoth="false" animate="false"/>
<hyperlinks fg="0000ff"/>
<secondaryLanguages>
<language index="1" bg="fff0cc"/>
<language index="2" bg="dafeda"/>
<language index="3" bg="ffe0f0"/>
</secondaryLanguages>
<!-- Gutter styling. -->
<gutterBorder color="808080"/>
<lineNumbers fg="2B91AF"/>
<foldIndicator fg="808080" iconBg="ffffff"/>
<iconRowHeader activeLineRange="3399ff"/>
<!-- Syntax tokens. -->
<tokenStyles>
<style token="IDENTIFIER" fg="000000"/>
<style token="RESERVED_WORD" fg="0000ff" bold="true"/>
<style token="ANNOTATION" fg="808080"/>
<!-- SPF директивы. -->
<style token="COMMENT_DOCUMENTATION" fg="ff2c08" bold="true"/>
<!-- DVM директивы -->
<style token="COMMENT_MARKUP" fg="8300c2" bold="true"/>
<!-- OMP директивы -->
<style token="COMMENT_KEYWORD" fg="9e0900" bold="true"/>
<!-- простые комментарии -->
<style token="COMMENT_EOL" fg="858585"/>
<!-- строки в двойных кавычках -->
<style token="LITERAL_STRING_DOUBLE_QUOTE" fg="008000"/>
<!-- строки в одинарных кавычках -->
<style token="LITERAL_CHAR" fg="A31515"/>
<!-- метки -->
<style token="MARKUP_TAG_NAME" fg="ff2c08"/>
<!-- кандидат на дробную часть(точка) -->
<style token="RESERVED_WORD_2" fg="000000"/>
<style token="COMMENT_MULTILINE" fg="008000"/>
<style token="DATA_TYPE" fg="0000ff" bold="true"/>
<style token="FUNCTION" fg="000000"/>
<style token="LITERAL_BOOLEAN" fg="0000ff" bold="true"/>
<style token="LITERAL_NUMBER_DECIMAL_INT" fg="ffa814"/>
<style token="LITERAL_NUMBER_FLOAT" fg="ffa814"/>
<style token="LITERAL_NUMBER_HEXADECIMAL" fg="000000"/>
<style token="LITERAL_BACKQUOTE" fg="A31515"/>
<style token="MARKUP_TAG_DELIMITER" fg="0000ff"/>
<style token="MARKUP_TAG_ATTRIBUTE" fg="ff0000"/>
<style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="0000ff"/>
<style token="MARKUP_COMMENT" fg="006000" italic="true"/>
<style token="MARKUP_DTD" fg="ad8000"/>
<style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
<style token="MARKUP_CDATA" fg="000000"/>
<style token="MARKUP_CDATA_DELIMITER" fg="0000ff"/>
<style token="OPERATOR" fg="804040" bold="true"/>
<style token="PREPROCESSOR" fg="808080"/>
<style token="REGEX" fg="000000"/>
<style token="SEPARATOR" fg="000000"/>
<style token="VARIABLE" fg="ff9900" bold="true"/>
<style token="WHITESPACE" fg="000000"/>
<style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
<style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
<style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
<style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
</tokenStyles>
</RSyntaxTheme>