no message

This commit is contained in:
2024-10-09 22:21:57 +03:00
parent 54c80c516b
commit 6252af944e
699 changed files with 2634 additions and 1997 deletions

View File

@@ -0,0 +1,33 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import Common.Utils.CommonUtils;
import _VisualDVM.Visual.Editor.CaretInfo;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
import org.fife.ui.autocomplete.BasicCompletion;
//определяет, должна ли отображаться в меню автозаполнения директива данного типа.
public class BaseDirective extends BasicCompletion {
public DirectiveName name;
public boolean visible = false; //должна ли быть в меню.
public BaseDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in.getText(), name_in.getDescription());
name = name_in;
}
//есть ли совпадение с началом директивы в строке
public boolean isMatch() {
return
getCaretInfo().suffix_word.isEmpty() &&
name.getText().startsWith(getCaretInfo().prefix_word)
&& (!name.getText().equals(getCaretInfo().prefix_word))
&& !CommonUtils.isRBracketsBalanced(getCaretInfo().before);
}
//итоговая функция, определяющая наличие директивы в автозаполнении
public boolean Check() {
return visible = isMatch();
}
protected CaretInfo getCaretInfo() {
return getOwner().getEditor().getCaretInfo();
}
protected SapforAutoComplete getOwner() {
return ((BaseProvider) getProvider()).getOwner();
}
}

View File

@@ -0,0 +1,16 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class CheckPointTypeDirective extends BaseDirective {
public CheckPointTypeDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() > 2) &&
getOwner().flags.get(0).equals(DirectiveName.SPF) &&
getOwner().flags.get(1).equals(DirectiveName.CHECKPOINT) &&
getOwner().nearestGroup.equals(DirectiveName.TYPE)
&& !getOwner().flags.contains(DirectiveName.ASYNC)
&& !getOwner().flags.contains(DirectiveName.FLEXIBLE);
}
}

View File

@@ -0,0 +1,143 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
public enum DirectiveName {
UNDEFINED,
//--------------
START,
SPF,
ANALYSIS,
PARALLEL,
TRANSFORM,
PARALLEL_REG,
END_PARALLEL_REG,
REDUCTION,
MAX,
MIN,
SUM,
PROD,
AND,
OR,
EQV,
NEQV,
MAXLOC,
MINLOC,
PRIVATE,
SHADOW,
ACROSS,
REMOTE_ACCESS,
NOINLINE,
FISSION,
EXPAND,
SHRINK,
CHECKPOINT,
INTERVAL,
FILES_COUNT,
TIME,
ITER,
VARLIST,
EXCEPT,
TYPE,
ASYNC,
FLEXIBLE,
PARAMETER,
UNROLL,
PROCESS_PRIVATE,
COVER,
MERGE
;
public String getDescription() {
switch (this) {
case SPF:
return "SPF директива";
case ANALYSIS:
return "Директива анализа";
case PARAMETER:
return "Директива параметра задачи";
case PARALLEL:
return "Директива распараллеливания";
case TRANSFORM:
return "Директива трансформации";
case PARALLEL_REG:
return "Директива начала области распараллеливания";
case END_PARALLEL_REG:
return "Директива конца области распараллеливания";
case REDUCTION:
return "Клауза редукции";
case MAX:
return "Операция MAX";
case MIN:
return "Операция MIN";
case SUM:
return "Операция SUM";
case PROD:
return "Операция PROD";
case AND:
return "Операция AND";
case OR:
return "Операция OR";
case EQV:
return "Операция EQV";
case NEQV:
return "Операция NEQV";
case MAXLOC:
return "Операция MAXLOC";
case MINLOC:
return "Операция MINLOC";
case PRIVATE:
return "Клауза приватных переменных";
case SHADOW:
return "Клауза теневых граней";
case ACROSS:
return "Клауза регулярных зависимостей";
case REMOTE_ACCESS:
return "Клауза удаленных ссылок";
case NOINLINE:
return "Клауза для отмены подстановки процедуры";
case FISSION:
return "Клауза для разделения циклов";
case UNROLL:
return "Клауза для разворачивания цикла";
case EXPAND:
return "Клауза для расширения приватных переменных";
case SHRINK:
return "Клауза для сужения приватных переменных";
case CHECKPOINT:
return "Директива контрольной точки";
case INTERVAL:
return "Клауза интервала";
case FILES_COUNT:
return "Клауза количества файлов";
case VARLIST:
return "Клауза переменных";
case EXCEPT:
return "Клауза исключённых переменных";
case TYPE:
return "Клауза типа";
case ITER:
return "По достижении итерации";
case TIME:
return "По истечении времени (сек)";
case ASYNC:
return "Асинхронная";
case FLEXIBLE:
return "Гибкая";
case PROCESS_PRIVATE:
return "Клауза приватных переменных для процесса";
case COVER:
return "Клауза, ограничивающая действие директивы на N тесно-вложенных циклов";
case MERGE:
return "Клауза для объединения циклов";
default:
return "?";
}
}
public String getText() {
switch (this) {
case SPF:
return "!$SPF ";
case END_PARALLEL_REG:
return "END PARALLEL_REG";
default:
return toString();
}
}
}

View File

@@ -0,0 +1,31 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import Common.Utils.CommonUtils;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class IntervalDirective extends BaseDirective {
protected String prefix;
protected String word;
protected String suffix;
public IntervalDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() > 2) &&
getOwner().flags.get(0).equals(DirectiveName.SPF) &&
getOwner().flags.get(1).equals(DirectiveName.CHECKPOINT) &&
getOwner().nearestGroup.equals(DirectiveName.INTERVAL)
&& !getOwner().flags.contains(DirectiveName.TIME)
&& !getOwner().flags.contains(DirectiveName.ITER);
}
@Override
public String getReplacementText() {
prefix = CommonUtils.removeRedundantSpaces(getCaretInfo().before.substring(0, getCaretInfo().before.length() - getCaretInfo().prefix_word.length()));
word = name.getText();
suffix = CommonUtils.removeRedundantSpaces(getCaretInfo().after.substring(getCaretInfo().suffix_word.length()));
String pp = prefix.replace(" ", "");
String ps = suffix.replace(" ", "");
if ((!ps.isEmpty()) && (ps.charAt(0) != ','))
word = (word + ",");
return word;
}
}

View File

@@ -0,0 +1,14 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class RedListDirective extends SpecDirective {
public RedListDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() > 2) &&
getOwner().flags.get(0).equals(DirectiveName.SPF) &&
getOwner().flags.get(1).equals(DirectiveName.ANALYSIS) &&
getOwner().nearestGroup.equals(DirectiveName.REDUCTION);
}
}

View File

@@ -0,0 +1,11 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class RegionDirective extends BaseDirective {
public RegionDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() == 1) && (getOwner().flags.get(0).equals(DirectiveName.SPF));
}
}

View File

@@ -0,0 +1,14 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class Spec1Directive extends SpecDirective {
public Spec1Directive(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() > 1)
&& getOwner().flags.get(0).equals(DirectiveName.SPF)
&& getOwner().flags.get(1).equals(DirectiveName.ANALYSIS)
&& getOwner().nearestGroup.equals(DirectiveName.ANALYSIS);
}
}

View File

@@ -0,0 +1,14 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class Spec2Directive extends SpecDirective {
public Spec2Directive(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() > 1)
&& getOwner().flags.get(0).equals(DirectiveName.SPF)
&& getOwner().flags.get(1).equals(DirectiveName.PARALLEL)
&& getOwner().nearestGroup.equals(DirectiveName.PARALLEL);
}
}

View File

@@ -0,0 +1,20 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class Spec3Directive extends SpecDirective {
public Spec3Directive(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() > 1)
&& getOwner().flags.get(0).equals(DirectiveName.SPF)
&& getOwner().flags.get(1).equals(DirectiveName.TRANSFORM)
&& getOwner().nearestGroup.equals(DirectiveName.TRANSFORM)
&& !getOwner().flags.contains(DirectiveName.NOINLINE)
&& !getOwner().flags.contains(DirectiveName.MERGE)
&& !getOwner().flags.contains(DirectiveName.FISSION)
&& !getOwner().flags.contains(DirectiveName.SHRINK)
&& !getOwner().flags.contains(DirectiveName.EXPAND)
&& !getOwner().flags.contains(DirectiveName.UNROLL);
}
}

View File

@@ -0,0 +1,14 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class Spec4Directive extends SpecDirective {
public Spec4Directive(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return (getOwner().flags.size() > 1)
&& getOwner().flags.get(0).equals(DirectiveName.SPF)
&& getOwner().flags.get(1).equals(DirectiveName.CHECKPOINT)
&& getOwner().nearestGroup.equals(DirectiveName.CHECKPOINT);
}
}

View File

@@ -0,0 +1,32 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import Common.Utils.CommonUtils;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
//промежуточный тип. относится ко всем директивам со скобками и требующим запятых.
public class SpecDirective extends BaseDirective {
protected String prefix;
protected String word;
protected String suffix;
public SpecDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
public String get_word() {
boolean noBrackets = name.equals(DirectiveName.NOINLINE)||
name.equals(DirectiveName.UNROLL)|| name.equals(DirectiveName.MERGE);
return name.getText() + (noBrackets ? "" : "()");
}
@Override
public String getReplacementText() {
prefix = CommonUtils.removeRedundantSpaces(getCaretInfo().before.substring(0, getCaretInfo().before.length() - getCaretInfo().prefix_word.length()));
word = get_word();
suffix = CommonUtils.removeRedundantSpaces(getCaretInfo().after.substring(getCaretInfo().suffix_word.length()));
String pp = prefix.replace(" ", "");
String ps = suffix.replace(" ", "");
if (!pp.isEmpty() && (pp.charAt(pp.length() - 1) != ',') && (pp.charAt(pp.length() - 1) != '('))
word = ("," + word);
if ((!ps.isEmpty()) && (ps.charAt(0) != ',') && (ps.charAt(0) != ')'))
word = (word + ",");
if ((ps.isEmpty()) || ps.charAt(ps.length() - 1) != ')')
word += ")";
return word;
}
}

View File

@@ -0,0 +1,11 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class StartDirective extends BaseDirective {
public StartDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public boolean Check() {
return getOwner().flags.contains(DirectiveName.START);
}
}

View File

@@ -0,0 +1,11 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.BaseProvider;
public class TypeDirective extends RegionDirective {
public TypeDirective(BaseProvider provider_in, DirectiveName name_in) {
super(provider_in, name_in);
}
@Override
public String getReplacementText() {
return super.getReplacementText() + "()";
}
}

View File

@@ -0,0 +1,28 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.BaseDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
import org.fife.ui.autocomplete.DefaultCompletionProvider;
public class BaseProvider extends DefaultCompletionProvider {
protected static char[] separators = new char[]{'!', '$', '*', ' ', ',', '(', ')'};
protected SapforAutoComplete owner;//владелец.
public BaseProvider(SapforAutoComplete owner_in) {
owner = owner_in;
}
public SapforAutoComplete getOwner() {
return owner;
}
protected boolean isSeparator(char ch) {
for (char s : separators)
if (ch == s) return true;
return false;
}
@Override
protected boolean isValidChar(char ch) {
return super.isValidChar(ch) || isSeparator(ch);
}
//получить текст от каретки и до разделителя
public void addDirective(BaseDirective directive) {
addCompletion(directive);
owner.directives.put(directive.name, directive);
}
}

View File

@@ -0,0 +1,11 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.CheckPointTypeDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class CheckPointTypeProvider extends PrefixWordProvider {
public CheckPointTypeProvider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new CheckPointTypeDirective(this, DirectiveName.ASYNC));
addDirective(new CheckPointTypeDirective(this, DirectiveName.FLEXIBLE));
}
}

View File

@@ -0,0 +1,11 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.IntervalDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class IntervalProvider extends PrefixWordProvider {
public IntervalProvider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new IntervalDirective(this, DirectiveName.TIME));
addDirective(new IntervalDirective(this, DirectiveName.ITER));
}
}

View File

@@ -0,0 +1,20 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
import _VisualDVM.ProjectData.Files.UI.Editor.SPFEditor;
import javax.swing.text.JTextComponent;
//https://github.com/bobbylight/AutoComplete/blob/master/AutoCompleteDemo/src/main/java/org/fife/ui/autocomplete/demo/DemoRootPane.java
//ОБРАЗЕЦ
//отличается тем, что принимает на вход дополнительные символы
// и берет не всю строку перед кареткой а только последнее слово
public class PrefixWordProvider extends BaseProvider {
public PrefixWordProvider(SapforAutoComplete owner_in) {
super(owner_in);
}
@Override
public String getAlreadyEnteredText(JTextComponent comp) {
return ((SPFEditor) comp).getCaretInfo().prefix_word;
}
}

View File

@@ -0,0 +1,19 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.RedListDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class ReductionProvider extends PrefixWordProvider {
public ReductionProvider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new RedListDirective(this, DirectiveName.MAX));
addDirective(new RedListDirective(this, DirectiveName.MIN));
addDirective(new RedListDirective(this, DirectiveName.MAXLOC));
addDirective(new RedListDirective(this, DirectiveName.MINLOC));
addDirective(new RedListDirective(this, DirectiveName.AND));
addDirective(new RedListDirective(this, DirectiveName.OR));
addDirective(new RedListDirective(this, DirectiveName.EQV));
addDirective(new RedListDirective(this, DirectiveName.NEQV));
addDirective(new RedListDirective(this, DirectiveName.SUM));
addDirective(new RedListDirective(this, DirectiveName.PROD));
}
}

View File

@@ -0,0 +1,14 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.Spec1Directive;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class Spec1Provider extends PrefixWordProvider {
public Spec1Provider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new Spec1Directive(this, DirectiveName.REDUCTION));
addDirective(new Spec1Directive(this, DirectiveName.PRIVATE));
addDirective(new Spec1Directive(this, DirectiveName.PROCESS_PRIVATE));
addDirective(new Spec1Directive(this, DirectiveName.PARAMETER));
addDirective(new Spec1Directive(this, DirectiveName.COVER));
}
}

View File

@@ -0,0 +1,12 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.Spec2Directive;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class Spec2Provider extends PrefixWordProvider {
public Spec2Provider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new Spec2Directive(this, DirectiveName.SHADOW));
addDirective(new Spec2Directive(this, DirectiveName.ACROSS));
addDirective(new Spec2Directive(this, DirectiveName.REMOTE_ACCESS));
}
}

View File

@@ -0,0 +1,15 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.Spec3Directive;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class Spec3Provider extends PrefixWordProvider {
public Spec3Provider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new Spec3Directive(this, DirectiveName.NOINLINE));
addDirective(new Spec3Directive(this, DirectiveName.FISSION));
addDirective(new Spec3Directive(this, DirectiveName.SHRINK));
addDirective(new Spec3Directive(this, DirectiveName.EXPAND));
addDirective(new Spec3Directive(this, DirectiveName.UNROLL));
addDirective(new Spec3Directive(this, DirectiveName.MERGE));
}
}

View File

@@ -0,0 +1,14 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.Spec4Directive;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class Spec4Provider extends PrefixWordProvider {
public Spec4Provider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new Spec4Directive(this, DirectiveName.INTERVAL));
addDirective(new Spec4Directive(this, DirectiveName.FILES_COUNT));
addDirective(new Spec4Directive(this, DirectiveName.VARLIST));
addDirective(new Spec4Directive(this, DirectiveName.EXCEPT));
addDirective(new Spec4Directive(this, DirectiveName.TYPE));
}
}

View File

@@ -0,0 +1,10 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.StartDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class StartProvider extends BaseProvider {
public StartProvider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new StartDirective(this, DirectiveName.SPF));
}
}

View File

@@ -0,0 +1,16 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.RegionDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.TypeDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
public class TypeProvider extends PrefixWordProvider {
public TypeProvider(SapforAutoComplete owner_in) {
super(owner_in);
addDirective(new TypeDirective(this, DirectiveName.ANALYSIS));
addDirective(new TypeDirective(this, DirectiveName.PARALLEL));
addDirective(new TypeDirective(this, DirectiveName.TRANSFORM));
addDirective(new TypeDirective(this, DirectiveName.CHECKPOINT));
addDirective(new RegionDirective(this, DirectiveName.PARALLEL_REG));
addDirective(new RegionDirective(this, DirectiveName.END_PARALLEL_REG));
}
}

View File

@@ -0,0 +1,123 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.BaseDirective;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Directives.DirectiveName;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.Providers.*;
import _VisualDVM.ProjectData.Files.UI.Editor.SPFEditor;
import org.fife.ui.autocomplete.AutoCompletion;
import org.fife.ui.autocomplete.DefaultCompletionProvider;
import java.util.LinkedHashMap;
import java.util.Vector;
public class SapforAutoComplete extends AutoCompletion {
//---
public Vector<BaseProvider> providers = new Vector<>();
public LinkedHashMap<DirectiveName, BaseDirective> directives = new LinkedHashMap<>();
public Vector<DirectiveName> flags = new Vector<>();
public DirectiveName nearestGroup;
private SPFEditor editor = null;
public SapforAutoComplete(SPFEditor editor_in) {
//заглушка.
super(new DefaultCompletionProvider());
editor = editor_in;
providers.add(new StartProvider(this));
providers.add(new TypeProvider(this));
providers.add(new Spec1Provider(this));
providers.add(new ReductionProvider(this));
providers.add(new Spec2Provider(this));
providers.add(new Spec3Provider(this));
providers.add(new Spec4Provider(this));
providers.add(new IntervalProvider(this));
providers.add(new CheckPointTypeProvider(this));
install(editor);
setAutoActivationEnabled(false);
setAutoCompleteEnabled(false);
setAutoCompleteSingleChoices(false);
}
public SPFEditor getEditor() {
return editor;
}
//---
public void updateFlags() {
flags.clear();
//определить присутствие директив в строке.
for (DirectiveName name : directives.keySet()) {
if (name.equals(DirectiveName.SPF)) {
String line = editor.getCaretInfo().current_line;
if (line.startsWith("!$")) {
boolean ok = true;
for (int z = 2; z < line.length(); ++z)
if (line.charAt(z) != ' ')
ok = false;
if (ok)
flags.add(DirectiveName.START);
else if (editor.getCaretInfo().current_line.contains(name.getText()))
flags.add(name);
}
} else if (editor.getCaretInfo().current_line.contains(name.getText()))
flags.add(name);
}
}
public void findNearestGroup() {
int indicator = 0;
String word = "";
SearchState s = SearchState.BracketSearch;
nearestGroup = DirectiveName.UNDEFINED;
for (int i = (editor.getCaretInfo().before.length() - 1); i >= 0; i--) {
char c = editor.getCaretInfo().before.charAt(i);
switch (s) {
case BracketSearch:
switch (c) {
case '(':
indicator++;
if (indicator > 0)
s = SearchState.DirectiveSearch;
break;
case ')':
indicator--;
break;
default:
break;
}
break;
case DirectiveSearch:
switch (c) {
case ' ':
break;
default:
s = SearchState.Directive;
word = c + word;
break;
}
break;
case Directive:
word = c + word;
for (DirectiveName directiveName : directives.keySet()) {
if (directiveName.getText().equals(word)) {
nearestGroup = directiveName;
return;
}
}
break;
}
}
}
//вызывается при событиях каретки текстового редактора.
//обновление меню которое вызовется при Ctrl+Space
public void Parse() {
updateFlags();
findNearestGroup();
for (BaseDirective directive : directives.values()) {
//если директива видима, значит ее провайдер нам и нужен.
if (directive.Check()) {
if (!directive.getProvider().equals(this.getCompletionProvider()))
setCompletionProvider(directive.getProvider());
doCompletion();
return;
}
}
//если ничего не нашли, ставим пустого
//TODO - не такой уж он и пустой!
setCompletionProvider(providers.get(0));
}
}

View File

@@ -0,0 +1,6 @@
package _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR;
public enum SearchState {
BracketSearch,
DirectiveSearch,
Directive
}

View File

@@ -0,0 +1,206 @@
package _VisualDVM.ProjectData.Files.UI.Editor;
import Common.Utils.CommonUtils;
import _VisualDVM.Current;
import _VisualDVM.GlobalData.GlobalDatabase;
import _VisualDVM.Global;
import _VisualDVM.Visual.Editor.BaseEditor;
import _VisualDVM.Visual.Editor.CaretInfo;
import Common.Visual.Menus.StyledPopupMenu;
import _VisualDVM.Visual.UI;
import _VisualDVM.Utils;
import _VisualDVM.GlobalData.Settings.SettingName;
import _VisualDVM.ProjectData.Files.DBProjectFile;
import _VisualDVM.ProjectData.Files.FileState;
import _VisualDVM.ProjectData.Files.UI.Editor.AutoComplete.SAPFOR.SapforAutoComplete;
import _VisualDVM.Visual.Menus.MainEditorMenu;
import _VisualDVM.ProjectData.SapforData.Loops.Loop;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import _VisualDVM.Visual.Interface.SPFEditorInterface;
import javafx.util.Pair;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextAreaHighlighter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Vector;
public class SPFEditor extends BaseEditor implements SPFEditorInterface {
public static final Color never = new Color(229, 228, 226, 90);
public DBProjectFile file = null; //файл связанный с редактором
//----
public RSyntaxTextAreaHighlighter highlighter = null;
//----
public SapforAutoComplete autoComplete = null;
public boolean switching_language = false;
Vector<Object> loopsHighlights = new Vector<>();
Vector<Object> gcovHighlights = new Vector<>();
//-включение /отключение событий --
private CaretInfo caretInfo = new CaretInfo();
public SPFEditor(DBProjectFile file_in) {
file = file_in;
highlighter = (RSyntaxTextAreaHighlighter) getHighlighter();
autoComplete = new SapforAutoComplete(this);
//-------------------------
float font_size = (float) ((GlobalDatabase)CommonUtils.db).settings.get(SettingName.EditorFontSize).toInt32();
setFont(getFont().deriveFont(font_size));
//-------------------------
setText(Utils.ReadAllText(file.file).replace("\r", " "));
gotoLine(file.lastLine);
//-------------------------
addCaretListener(сe -> UpdateCaretInfo());
getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent arg0) {
if (!switching_language) {
file.NeedsSave = true;
if (Global.enable_text_changed && file.state != FileState.Excluded) {
Current.getSapfor().ResetAllAnalyses();
//текст изменился, значит M ка более не актуальна.
file.father.dropLastModification();
}
Pass_2021.passes.get(PassCode_2021.Save).Reset();
}
}
});
//----
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.isControlDown()) {
switch (e.getKeyCode()) {
case KeyEvent.VK_F:
UI.ShowSearchForm(false);
break;
case KeyEvent.VK_H:
UI.ShowSearchForm(true);
break;
}
}
}
});
}
//---------------------------------------------------->>
public static String getLastWord(String text, char... separators) {
Vector<Character> separators_ = new Vector<>();
for (char s : separators)
separators_.add(s);
String res = "";
char[] letters = text.toCharArray();
for (int i = letters.length - 1; i >= 0; --i) {
char c = letters[i];
if (separators_.contains(c)) break;
else res = c + res;
}
return res;
}
public static String getFirstWord(String text, char... separators) {
Vector<Character> separators_ = new Vector<>();
for (char s : separators)
separators_.add(s);
String res = "";
char[] letters = text.toCharArray();
for (int i = 0; i < letters.length; ++i) {
char c = letters[i];
if (separators_.contains(c)) break;
else res += c;
}
return res;
}
public CaretInfo getCaretInfo() {
return caretInfo;
}
public void UpdateCaretInfo() {
caretInfo = new CaretInfo(this);
autoComplete.Parse();
}
@Override
public void ClearHighlights() {
highlighter.removeAllHighlights();
}
@Override
public void ClearLoopsHighLights() {
for (Object loop : loopsHighlights)
highlighter.removeHighlight(loop);
}
@Override
public void ClearGOCVHighlights() {
for (Object line : gcovHighlights)
highlighter.removeHighlight(line);
}
@Override
public void HighlightLoops() {
ClearLoopsHighLights();
for (Loop loop : file.AllLoops.values()) {
Highlighter.HighlightPainter painter = loop.loopState.getPainter();
if (painter != null) {
try {
loopsHighlights.add(highlighter.addHighlight(
getLineStartOffset(loop.line - 1),
getLineEndOffset(loop.line - 1),
painter
));
} catch (BadLocationException ex) {
CommonUtils.MainLog.PrintException(ex);
}
}
}
}
//нумерация с нуля!
boolean lineNumberIsValid(int num) {
return (num >= 0) && (num < this.getLineCount());
}
@Override
public void HighlightGCOV() {
ClearGOCVHighlights();
for (int lineNum : file.gcov_info.line_info.keySet()) {
Pair<Long, Integer> p = file.gcov_info.line_info.get(lineNum);
Color color = never;
if (p.getKey() > 0) {
color = (p.getValue() >= ((GlobalDatabase)CommonUtils.db).settings.get(SettingName.GCOVLimit).toInt32()) ?
new Color(255, 255, (100 - p.getValue()), 90) : null;
}
if (color != null) {
Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(color);
try {
gcovHighlights.add(highlighter.addHighlight(
getLineStartOffset(lineNum),
getLineEndOffset(lineNum),
painter
));
} catch (Exception ignored) {
}
}
}
}
@Override
protected void saveFont() {
Pass_2021.passes.get(PassCode_2021.UpdateSetting).Do(
SettingName.EditorFontSize,
getFont().getSize());
}
@Override
protected void saveText() {
Pass_2021.passes.get(PassCode_2021.Save).Do();
}
@Override
protected StyledPopupMenu createMenu() {
return new MainEditorMenu(this);
}
public int getCurrentLine() {
return getCaretLineNumber() + 1;
}
public int getCurrentSymbol() {
return getCaretOffsetFromLineStart() + 1;
}
}

View File

@@ -0,0 +1,40 @@
package _VisualDVM.ProjectData.Files.UI;
import Common.CurrentAnchestor;
import _VisualDVM.Current;
import Common.Visual.Trees.DataTree;
import Common.Visual.Trees.TreeRenderers;
import _VisualDVM.ProjectData.SapforData.FileObject;
import _VisualDVM.ProjectData.SapforData.FileObjectWithMessages;
import javax.swing.tree.DefaultMutableTreeNode;
public class FileGraphTree extends DataTree {
public FileGraphTree(DefaultMutableTreeNode root) {
super(root);
// ExpandAll();
}
@Override
public TreeRenderers getRenderer() {
return TreeRenderers.RendererGraph;
}
@Override
public Current getCurrent() {
return Current.FileGraphElement;
}
@Override
public void ShowCurrentObject() throws Exception {
Current.getFile().form.EventsOff();
Object o = CurrentAnchestor.get(getCurrent());
Current.getFile().form.getEditor().gotoLine((o instanceof FileObjectWithMessages) ? (((FileObjectWithMessages) o).line) : 1);
Current.getFile().form.ShowMessages();
Current.getFile().form.EventsOn();
}
@Override
protected boolean findNode(Object userObject, Object criteria) {
return (userObject instanceof FileObject) && (
((FileObject) (userObject)).line == (Integer) criteria);
}
@Override
protected int getStartLine() {
return 1;
}
}

View File

@@ -0,0 +1,51 @@
package _VisualDVM.ProjectData.Files.UI;
import Common.Visual.CommonUI;
import Common.Visual.Fonts.VisualiserFonts;
import _VisualDVM.Visual.UI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;
//https://javaswing.wordpress.com/2009/10/10/jlist_using/
//https://qarchive.ru/14623936_kak_poluchit__vydelennyi__tekst_elementa_iz_jlist_s_izobrazheniem_
public class FilesHyperlinksPanel extends JPanel {
public Vector<String> links = null;
public JList<String> Hyperlinks = null;
MouseAdapter adapter = null;
public FilesHyperlinksPanel() {
super(new BorderLayout());
//о курсорах https://javaswing.wordpress.com/2010/07/13/cursor/
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
public void UpdateByCell(Vector<String> links_in) {
links = links_in;
removeAll();
Hyperlinks = new JList<>(links);
Hyperlinks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
if (adapter != null) {
removeMouseListener(adapter);
adapter = null;
}
Hyperlinks.addMouseListener(adapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int index = Hyperlinks.locationToIndex(e.getPoint());
if (index >= 0) {
String[] data = links.get(index).split(":");
String file = data[0];
int line = Integer.parseInt(data[1]);
UI.getMainWindow().getProjectWindow().GotoFile(file, line, true);
}
}
});
Hyperlinks.setLayoutOrientation(JList.VERTICAL);
Hyperlinks.setFont(CommonUI.getTheme().Fonts.get(VisualiserFonts.Hyperlink));
add(Hyperlinks, BorderLayout.CENTER);
}
}

View File

@@ -0,0 +1,107 @@
package _VisualDVM.ProjectData.Files.UI;
import Common.CurrentAnchestor;
import _VisualDVM.Current;
import _VisualDVM.Global;
import Common.Visual.DragDrop.FileDrop;
import _VisualDVM.Visual.Menus.GraphMenu;
import _VisualDVM.Visual.Menus.ProjectFilesMenu;
import _VisualDVM.Visual.UI;
import Common.Visual.Trees.StyledTree;
import Common.Visual.Trees.TreeRenderers;
import _VisualDVM.ProjectData.Files.DBProjectFile;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
public class FilesTree extends StyledTree {
public FilesTree() {
super(Current.getProject().filesTreeRoot);
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DELETE:
forkFD(PassCode_2021.DeleteFile, PassCode_2021.DeleteDirectory);
break;
case KeyEvent.VK_ADD: //num lock +
case KeyEvent.VK_EQUALS: //+
Pass_2021.passes.get(PassCode_2021.IncludeFile).Do();
break;
case KeyEvent.VK_SUBTRACT: //num lock -
case KeyEvent.VK_MINUS: //-
Pass_2021.passes.get(PassCode_2021.ExcludeFile).Do();
break;
case KeyEvent.VK_F2:
forkFD(PassCode_2021.RenameFile, PassCode_2021.RenameDirectory);
break;
case KeyEvent.VK_ENTER:
LeftMouseAction2();
break;
}
}
}
);
new FileDrop(System.out, this, files -> {
Pass_2021.passes.get(PassCode_2021.ImportFiles).Do(files);
});
CurrentAnchestor.set(Current.File, null);
}
private static void forkFD(PassCode_2021 file_pass, PassCode_2021 folder_pass) {
DefaultMutableTreeNode node = Current.getProjectNode();
if (node != null)
Pass_2021.passes.get((node.getUserObject() instanceof DBProjectFile) ?
file_pass : folder_pass).Do();
}
@Override
public TreeRenderers getRenderer() {
return TreeRenderers.RendererFile;
}
@Override
protected GraphMenu createMenu() {
return new ProjectFilesMenu(this);
}
@Override
public void SelectionAction(TreePath e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getLastPathComponent();
CurrentAnchestor.set(Current.ProjectNode, node);
Object o = node.getUserObject();
if (o instanceof File) {
CurrentAnchestor.set(Current.SelectedDirectory, o);
CurrentAnchestor.set(Current.SelectedFile, null);
UI.getMainWindow().getProjectWindow().ShowNoSelectedFile();
} else if (o instanceof DBProjectFile) {
CurrentAnchestor.set(Current.SelectedFile, o);
File file = ((DBProjectFile) o).file;
CurrentAnchestor.set(Current.SelectedDirectory, file.getParentFile());
UI.getMainWindow().getProjectWindow().ShowSelectedFile();
}
UI.getMainWindow().getProjectWindow().ShowSelectedDirectory();
}
@Override
public void LeftMouseAction2() {
if (Current.getProjectNode() != null) {
Object o = Current.getProjectNode().getUserObject();
if (o instanceof DBProjectFile) {
//очень важно. иначе по открытии файла дерево остается в фокусе.
//и не происходит прокрутки скролла к строке!!
UI.getMainWindow().getProjectWindow().FocusFileTabs();
Pass_2021.passes.get(PassCode_2021.OpenCurrentFile).Do(o);
}
}
}
@Override
public void LeftMouseAction1() {
if (Global.files_multiselection && Current.getSelectedFile() != null) {
Current.getSelectedFile().SwitchSelection();
updateUI();
}
}
@Override
protected int getStartLine() {
return 1;
}
}

View File

@@ -0,0 +1,46 @@
package _VisualDVM.ProjectData.Files.UI;
import Common.Visual.CommonUI;
import _VisualDVM.Global;
import Common.Visual.Fonts.VisualiserFonts;
import Common.Visual.Trees.StyledTreeCellRenderer;
import _VisualDVM.ProjectData.Files.DBProjectFile;
import _VisualDVM.ProjectData.Files.FileState;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;
import java.awt.font.TextAttribute;
import java.io.File;
import java.util.Map;
//https://kodejava.org/how-do-i-create-jtree-with-different-icons-for-each-node/
//https://ru.coredump.biz/questions/14968005/dynamically-change-icon-of-specific-nodes-in-jtree
public class FilesTreeCellRenderer extends StyledTreeCellRenderer {
public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
Object o = ((DefaultMutableTreeNode) value).getUserObject();
if (o instanceof File) {
//это папка.
File dir = (File) o;
setIcon(new ImageIcon(getClass().getResource("/icons/Folder.png")));
setText(dir.getName());
setFont(CommonUI.getTheme().Fonts.get(VisualiserFonts.TreePlain));
} else if (o instanceof DBProjectFile) {
DBProjectFile file = (DBProjectFile) o;
if (Global.files_multiselection) {
setIcon(file.GetSelectionIcon());
} else {
setIcon(file.GetIcon());
}
setText(file.file.getName());
if (file.IsMain()) setFont(CommonUI.getTheme().Fonts.get(VisualiserFonts.TreeBold));
else setFont(CommonUI.getTheme().Fonts.get(VisualiserFonts.TreePlain));
if (file.state.equals(FileState.Excluded)) {
Map attributes = getFont().getAttributes();
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
setFont(new Font(attributes));
}
}
setForeground(tree.getForeground());
return this;
}
}

View File

@@ -0,0 +1,64 @@
package _VisualDVM.ProjectData.Files.UI;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.Token;
import org.fife.ui.rsyntaxtextarea.TokenTypes;
import org.fife.ui.rsyntaxtextarea.folding.Fold;
import org.fife.ui.rsyntaxtextarea.folding.FoldParser;
import javax.swing.text.BadLocationException;
import java.util.ArrayList;
import java.util.List;
public class FortranFolder implements FoldParser {
protected static final char[] C_MLC_END = "*/".toCharArray();
private static final char[] KEYWORD_IMPORT = "import".toCharArray();
@Override
public List<Fold> getFolds(RSyntaxTextArea textArea) {
List<Fold> folds = new ArrayList();
Fold currentFold = null;
int lineCount = textArea.getLineCount();
int lastRightCurlyLine = -1;
Fold prevFold = null;
try {
for (int line = 0; line < lineCount; ++line) {
for (Token t = textArea.getTokenListForLine(line); t != null && t.isPaintable(); t = t.getNextToken()) {
Fold parentFold;
if (this.isDo(t)) {
if (prevFold != null && line == lastRightCurlyLine) {
currentFold = prevFold;
prevFold = null;
lastRightCurlyLine = -1;
} else if (currentFold == null) {
currentFold = new Fold(0, textArea, t.getOffset());
folds.add(currentFold);
} else {
currentFold = currentFold.createChild(0, t.getOffset());
}
} else if (this.isEndDo(t)) {
if (currentFold != null) {
currentFold.setEndOffset(t.getOffset());
parentFold = currentFold.getParent();
if (currentFold.isOnSingleLine()) {
if (!currentFold.removeFromParent()) {
folds.remove(folds.size() - 1);
}
} else {
lastRightCurlyLine = line;
prevFold = currentFold;
}
currentFold = parentFold;
}
}
}
}
} catch (BadLocationException var16) {
var16.printStackTrace();
}
return folds;
}
public boolean isDo(Token t) {
return t.getType() == TokenTypes.RESERVED_WORD && t.getLexeme().equalsIgnoreCase("DO");
}
public boolean isEndDo(Token t) {
return t.getType() == TokenTypes.RESERVED_WORD && t.getLexeme().equalsIgnoreCase("ENDDO");
}
}