Перенос.

This commit is contained in:
2023-09-17 22:13:42 +03:00
parent dd2e0ca7e0
commit 629d8b8477
1239 changed files with 61161 additions and 1 deletions

View File

@@ -0,0 +1,30 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class AttachementsMenu extends StyledPopupMenu {
JMenuItem mscreenshot;
JMenuItem mExplorer;
public AttachementsMenu() {
add(mscreenshot = Pass_2021.passes.get(PassCode_2021.MakeScreenShot).createMenuItem());
addSeparator();
mExplorer = new VisualiserMenuItem("Открыть вложения в проводнике...", "/icons/Explorer.png");
mExplorer.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Desktop.getDesktop().open(Current.getProject().getAttachmentsDirectory());
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
});
add(mExplorer);
}
}

View File

@@ -0,0 +1,24 @@
package Common.UI.Menus;
import Common.Current;
import ProjectData.Files.LanguageStyle;
import javax.swing.*;
import java.awt.event.ActionEvent;
public class FileStyleMenu extends StyledPopupMenu {
public FileStyleMenu() {
for (LanguageStyle s : LanguageStyle.values()) {
JMenuItem m = new VisualiserMenuItem(s.getDescription());
m.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (Current.getFile().UpdateStyle(s)) {
Current.getSapfor().ResetAllAnalyses();
Current.getFile().form.ShowStyle();
}
}
});
add(m);
}
}
}

View File

@@ -0,0 +1,35 @@
package Common.UI.Menus;
import Common.UI.Trees.StyledTree;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
public class GraphMenu<T extends StyledTree> extends StyledPopupMenu {
public T tree;
public GraphMenu(T tree_in, String branches_name) {
tree = tree_in;
JMenuItem m = null;
m = new VisualiserMenuItem("Свернуть все " + branches_name);
m.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
tree.CollapseAll();
}
});
add(m);
m = new VisualiserMenuItem("Развернуть все " + branches_name);
m.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
tree.ExpandAll();
}
});
add(m);
}
public GraphMenu(T tree) {
this(tree, tree.getBranchesName());
}
public void Show(MouseEvent mouseEvent) {
show(tree, mouseEvent.getX(), mouseEvent.getY());
}
}

View File

@@ -0,0 +1,342 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Common.UI.Editor.CaretInfo;
import Common.Utils.Utils;
import ProjectData.Files.DBProjectFile;
import ProjectData.Files.UI.Editor.SPFEditor;
import ProjectData.SapforData.Functions.FuncCall;
import ProjectData.SapforData.Functions.FuncInfo;
import ProjectData.SapforData.Functions.FunctionType;
import ProjectData.SapforData.Loops.Loop;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainEditorMenu extends TextEditorMenu {
FuncCall call = null;
FuncInfo decl = null;
Loop loop = null;
DBProjectFile header = null;
//------------------
JMenuItem m_comment;
JMenuItem m_uncomment;
JMenuItem m_inline;
JMenuItem m_add_lines_to_region;
JMenuItem m_remove_lines_from_region;
JMenuItem m_loop_union;
JMenuItem m_undo;
JMenuItem m_gotoFunction;
JMenuItem m_gotoHeader;
//-----------------
public MainEditorMenu(RSyntaxTextArea editor_in) {
super(editor_in);
addSeparator();
m_gotoHeader = new VisualiserMenuItem("Перейти к заголовочному файлу", "/icons/Transformations/SPF_InsertIncludesPass.png");
m_gotoHeader.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Pass_2021.passes.get(PassCode_2021.OpenCurrentFile).Do(header);
}
});
add(m_gotoHeader);
addSeparator();
m_gotoFunction = new VisualiserMenuItem("Перейти к объявлению процедуры", "/icons/versions/currentVersion.png");
m_gotoFunction.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
decl.Show(true);
}
});
add(m_gotoFunction);
m_inline = new VisualiserMenuItem("Подставить вызов процедуры", "/icons/Transformations/SPF_InlineProcedures.png");
m_inline.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Pass_2021.passes.get(PassCode_2021.SPF_InlineProcedure).Do(call);
}
});
add(m_inline);
addSeparator();
m_loop_union = new VisualiserMenuItem("Объединить цикл со следующим", "/icons/Transformations/SPF_LoopUnion.png");
m_loop_union.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Pass_2021.passes.get(PassCode_2021.SPF_LoopUnionCurrent).Do();
}
});
add(m_loop_union);
m_add_lines_to_region = new VisualiserMenuItem("Добавить строки в область", "/icons/Menu/AddLines.png");
m_add_lines_to_region.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Pass_2021.passes.get(PassCode_2021.SPF_ChangeSpfIntervals).Do(
((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionStart()) + 1,
((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionEnd()) + 1,
1
);
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
});
add(m_add_lines_to_region);
m_remove_lines_from_region = new VisualiserMenuItem("Удалить строки из области", "/icons/Menu/RemoveLines.png");
m_remove_lines_from_region.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Pass_2021.passes.get(PassCode_2021.SPF_ChangeSpfIntervals).Do(
((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionStart()) + 1,
((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionEnd()) + 1,
0
);
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
});
add(m_remove_lines_from_region);
addSeparator();
m_comment = new VisualiserMenuItem("Закомментировать блок", "/icons/Editor/Comment.png");
m_comment.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
String new_ = "";
String[] data = selectedText.split("\n");
int i = 0;
switch (Current.getFile().languageName) {
case fortran:
for (String line : data) {
if (!line.startsWith("!")) {
new_ += "!" + line;
} else new_ += line;
if (i < data.length - 1) new_ += "\n";
++i;
}
break;
case c:
case cpp:
for (String line : data) {
if (!line.startsWith("//")) {
new_ += "//" + line;
} else new_ += line;
if (i < data.length - 1) new_ += "\n";
++i;
}
break;
default:
new_ = selectedText;
break;
}
editor.replaceSelection(new_);
}
});
add(m_comment);
m_uncomment = new VisualiserMenuItem("Раскомментировать блок", "/icons/Editor/Uncomment.png");
m_uncomment.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
String new_ = "";
String[] data = selectedText.split("\n");
int i = 0;
switch (Current.getFile().languageName) {
case fortran:
for (String line : data) {
if (line.startsWith("!")) {
new_ += line.substring(1);
} else new_ += line;
if (i < data.length - 1) new_ += "\n";
++i;
}
break;
case c:
case cpp:
for (String line : data) {
if (line.startsWith("//")) {
new_ += line.substring(2);
} else new_ += line;
if (i < data.length - 1) new_ += "\n";
++i;
}
break;
default:
new_ = selectedText;
break;
}
//todo. возможно, изменить концепцию на выделенные строки?
editor.replaceSelection(new_);
}
});
add(m_uncomment);
addSeparator();
m_undo = new VisualiserMenuItem("Отменить последнюю модификацию", "/icons/Menu/Undo.png");
m_undo.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Current.getSapfor().UpdateProjectFiles(false);
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
});
add(m_undo);
}
private void checkFunction() {
call = null;
decl = null;
//--
m_inline.setEnabled(false);
m_gotoFunction.setEnabled(false);
//--
m_inline.setToolTipText("");
m_gotoFunction.setToolTipText("");
//--
if (selectedText == null) {
m_inline.setText("Невозможно подставить вызов процедуры. Не выделено имя процедуры.");
m_gotoFunction.setText("Невозможно перейти к объявлению процедуры. Не выделено имя процедуры");
return;
}
if (selectedText.contains("\n")) {
m_inline.setText("Невозможно подставить вызов процедуры. Выделено несколько строк");
m_gotoFunction.setText("Невозможно перейти к объявлению процедуры. Выделено несколько строк.");
return;
}
if (!Utils.isFunctionName(selectedText)) {
String tip = "Имя процедуры может содержать только английские буквы, цифры и подчеркивания, и не может начинаться с цифры.";
//-
m_inline.setText("Невозможно подставить вызов процедуры " + Utils.Brackets(selectedText) +
" . Выделено некорректное имя.");
m_gotoFunction.setText("Невозможно перейти к объявлению процедуры " + Utils.Brackets(selectedText) +
" . Выделено некорректное имя.");
//-
m_inline.setToolTipText(tip);
m_gotoFunction.setToolTipText(tip);
return;
}
if (!Pass_2021.passes.get(PassCode_2021.SPF_GetGraphFunctions).isDone()) {
m_inline.setText("Невозможно подставить вызов процедуры " + Utils.Brackets(selectedText) +
" . Выполните проход \"Граф процедур \".");
m_gotoFunction.setText("Невозможно перейти к объявлению процедуры " + Utils.Brackets(selectedText) +
" . Выполните проход \"Граф процедур \"");
return;
}
if (Current.getSapfor().isIntrinsic(selectedText)) {
m_inline.setText("Невозможно подставить вызов процедуры " + Utils.Brackets(selectedText) +
" . Процедура является стандартной.");
m_gotoFunction.setText("Невозможно перейти к объявлению процедуры " + Utils.Brackets(selectedText) +
" . Процедура является стандартной.");
return;
}
call = Current.getFile().find_func_call(selectedText);
if (call == null) {
m_inline.setText("Невозможно подставить вызов процедуры " + Utils.Brackets(selectedText) +
" . Вызов не найден в текущей строке.");
m_gotoFunction.setText("Невозможно перейти к объявлению процедуры " + Utils.Brackets(selectedText) +
" . Объявление процедуры уже находится в текущей строке.");
return;
}
decl = Current.getProject().allFunctions.get(call.funcName);
if (decl.type.equals(FunctionType.NotFound)) {
m_inline.setText("Невозможно подставить вызов процедуры " + Utils.Brackets(selectedText) +
" . Объявление процедуры не найдено в проекте.");
m_gotoFunction.setText("Невозможно перейти к объявлению процедуры " + Utils.Brackets(selectedText) +
" . Объявление процедуры не найдено в проекте.");
return;
}
//---
m_inline.setEnabled(true);
m_gotoFunction.setEnabled(true);
m_inline.setText("Подставить вызов процедуры " + Utils.Brackets(selectedText));
m_gotoFunction.setText("Перейти к объявлению процедуры " + Utils.Brackets(selectedText));
//--
}
private void checkHeader() {
header = null;
m_gotoHeader.setEnabled(false);
//--
CaretInfo caretInfo = ((SPFEditor) editor).getCaretInfo();
if (caretInfo != null) {
String header_ = Utils.extractHeaderName(caretInfo.current_line);
if (header_ == null) {
m_gotoHeader.setText("Невозможно перейти к заголовочному файлу. В текущей строке не найдено включений.");
return;
}
if (!Pass_2021.passes.get(PassCode_2021.SPF_GetIncludeDependencies).isDone()) {
m_gotoHeader.setText("Невозможно перейти к заголовочному файлу. Выполните проход \"Поиск зависимостей по включению\"");
return;
}
if (!Current.getFile().relativeHeaders.containsKey(header_)) {
m_gotoHeader.setText("Невозможно перейти к заголовочному файлу " + Utils.Brackets(header_) + " . Файл не найден среди включений текущего файла.");
return;
}
header = Current.getFile().relativeHeaders.get(header_);
m_gotoHeader.setText("Переход к заголовочному файлу " + Utils.Brackets(header_));
m_gotoHeader.setEnabled(true);
}
}
private void checkLoop() {
loop = null;
m_loop_union.setEnabled(false);
if (!Pass_2021.passes.get(PassCode_2021.SPF_GetGraphLoops).isDone()) {
m_loop_union.setText("Невозможно объединить цикл в текущей строке со следующим. " +
"Выполните проход \"Граф циклов\"");
return;
}
loop = Current.getFile().find_current_loop();
if (loop == null) {
m_loop_union.setText("Невозможно объединить цикл в текущей строке со следующим. Не найдено циклов в текущей строке.");
return;
}
m_loop_union.setEnabled(true);
m_loop_union.setText("Объединить цикл в строке " + Utils.Brackets(loop.line) + " со следующим");
}
@Override
public void CheckElementsVisibility() {
super.CheckElementsVisibility();
m_strike.setVisible(false);
m_unstrike.setVisible(false);
checkFunction();
checkHeader();
checkLoop();
if (selectedText == null) {
m_comment.setEnabled(false);
m_uncomment.setEnabled(false);
m_add_lines_to_region.setEnabled(false);
m_remove_lines_from_region.setEnabled(false);
m_comment.setText("Невозможно закомментировать блок. Не выделено ни одной строки.");
m_uncomment.setText("Невозможно раскомментировать блок. Не выделено ни одной строки.");
m_add_lines_to_region.setText("Невозможно добавить строки в область. Не выделено ни одной строки.");
m_remove_lines_from_region.setText("Невозможно удалить строки из области. Не выделено ни одной строки.");
} else {
m_comment.setEnabled(true);
m_uncomment.setEnabled(true);
m_add_lines_to_region.setEnabled(true);
m_remove_lines_from_region.setEnabled(true);
m_comment.setText("Закомментировать блок");
m_uncomment.setText("Раскомментировать блок");
m_add_lines_to_region.setText("Добавить строки в область");
m_remove_lines_from_region.setText("Удалить строки из области");
}
if (Current.getSapfor().OldFiles.isEmpty()) {
m_undo.setEnabled(false);
m_undo.setText("Невозможно отменить последнюю модификацию. Модификации отсутствуют.");
} else {
m_undo.setEnabled(true);
m_undo.setText("Отменить последнюю модификацию.");
}
}
}

View File

@@ -0,0 +1,18 @@
package Common.UI.Menus;
import Common.Current;
import Common.UI.Themes.VisualiserFonts;
import Common.Utils.Utils;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.*;
public class PassesSubMenu extends JMenu {
public PassesSubMenu(String title, String icon, PassCode_2021... passes) {
super(title);
setIcon(Utils.getIcon(icon));
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
for (PassCode_2021 code : passes) {
add(Pass_2021.passes.get(code).createMenuItem());
}
}
}

View File

@@ -0,0 +1,135 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Common.UI.Menus_2023.LanguagesSubmenu;
import Common.UI.Menus_2023.StableMenuItem;
import Common.UI.Menus_2023.StylesSubmenu;
import Common.UI.Menus_2023.TypesSubmenu;
import Common.UI.Trees.StyledTree;
import Common.UI.UI;
import Common.Utils.Utils;
import ProjectData.Files.FileType;
import ProjectData.Files.LanguageStyle;
import ProjectData.LanguageName;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class ProjectFilesMenu extends GraphMenu {
VisualiserMenuItem m_select_all;
VisualiserMenuItem m_unselect_all;
VisualiserMenuItem m_multiselection;
JMenu mLanguage;
JMenu mStyle;
JMenu mType;
public ProjectFilesMenu(StyledTree tree) {
super(tree, "подпапки");
addSeparator();
JMenuItem m = new VisualiserMenuItem("Открыть в проводнике...", "/icons/Explorer.png");
m.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Desktop.getDesktop().open(Current.getProject().Home);
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
});
add(m);
addSeparator();
add(new PassesSubMenu("Добавить", "/icons/RedAdd.png",
PassCode_2021.AddFile,
PassCode_2021.CreateEmptyDirectory,
PassCode_2021.ImportFiles));
addSeparator();
add(new PassesSubMenu("Переименовать", "/icons/Menu/Rename.png",
PassCode_2021.RenameFile,
PassCode_2021.RenameDirectory));
add(new VisualiserMenuItem("Удалить текущий проект", "/icons/Delete.png") {
{
addActionListener(e -> {
if (Current.HasProject()) {
UI.getVersionsWindow().getVersionsForm().getTree().SelectNode(Current.getProject().node);
Pass_2021.passes.get(PassCode_2021.DeleteVersion).Do();
}
});
}
});
addSeparator();
m_multiselection = new VisualiserMenuItem("Массовый режим работы с файлами");
m_multiselection.setIcon(Utils.getIcon(Global.files_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
m_multiselection.addActionListener(e -> {
Global.files_multiselection = !Global.files_multiselection;
m_multiselection.setIcon(Utils.getIcon(Global.files_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
Current.getProject().SelectAllFiles(false);
UI.getMainWindow().getProjectWindow().RefreshProjectFiles();
//-
});
add(m_multiselection);
addSeparator();
//-
m_select_all = new StableMenuItem("Выбрать всё", "/icons/SelectAll.png");
m_select_all.addActionListener(e -> {
Current.getProject().SelectAllFiles(true);
tree.updateUI();
});
add(m_select_all);
m_unselect_all = new StableMenuItem("Отменить всё", "/icons/UnselectAll.png");
m_unselect_all.addActionListener(e -> {
Current.getProject().SelectAllFiles(false);
tree.updateUI();
});
add(m_unselect_all);
//--------------------------------------------------
add(mLanguage = new LanguagesSubmenu(PassCode_2021.SetSelectedFilesLanguage.getDescription()) {
@Override
public void action(LanguageName languageName) {
Pass_2021.passes.get(PassCode_2021.SetSelectedFilesLanguage).Do(languageName);
}
});
add(mStyle = new StylesSubmenu(PassCode_2021.SetSelectedFilesStyle.getDescription()) {
@Override
public void action(LanguageStyle languageStyle) {
Pass_2021.passes.get(PassCode_2021.SetSelectedFilesStyle).Do(languageStyle);
}
});
add(mType = new TypesSubmenu(PassCode_2021.SetSelectedFilesType.getDescription()) {
@Override
public void action(FileType fileType) {
Pass_2021.passes.get(PassCode_2021.SetSelectedFilesType).Do(fileType);
}
});
//--------------------------------------------------
add(Pass_2021.passes.get(PassCode_2021.ExcludeSelectedFiles).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.IncludeSelectedFiles).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.ExcludeFile).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.IncludeFile).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteFile).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteDirectory).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteSelectedFiles).createMenuItem());
}
@Override
public void CheckElementsVisibility() {
m_select_all.setVisible(Global.files_multiselection);
m_unselect_all.setVisible(Global.files_multiselection);
mLanguage.setVisible(Global.files_multiselection);
mStyle.setVisible(Global.files_multiselection);
mType.setVisible(Global.files_multiselection);
//-
Pass_2021.passes.get(PassCode_2021.ExcludeFile).setControlsVisible(!Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.IncludeFile).setControlsVisible(!Global.files_multiselection);
//-
Pass_2021.passes.get(PassCode_2021.DeleteFile).setControlsVisible(!Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteDirectory).setControlsVisible(!Global.files_multiselection);
//--
Pass_2021.passes.get(PassCode_2021.ExcludeSelectedFiles).setControlsVisible(Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.IncludeSelectedFiles).setControlsVisible(Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteSelectedFiles).setControlsVisible(Global.files_multiselection);
}
}

View File

@@ -0,0 +1,18 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Common.UI.Themes.VisualiserFonts;
import Common.Utils.Utils;
import javax.swing.*;
public class PropertiesSubmenu extends JMenu {
public PropertiesSubmenu(String title, String icon, String... settings) {
super(title);
if (icon != null)
setIcon(Utils.getIcon(icon));
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
for (String name : settings) {
Global.properties.addFlagMenuItem(this, name);
}
}
}

View File

@@ -0,0 +1,86 @@
package Common.UI.Menus;
import Common.Current;
import Common.UI.Menus_2023.StableMenuItem;
import Common.UI.Selectable;
import Common.UI.Trees.DataTree;
import Common.UI.Trees.SelectableTree;
import Common.Utils.Utils;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public abstract class SelectionTreeMenu extends GraphMenu<DataTree> {
VisualiserMenuItem m_select_for_current;
VisualiserMenuItem m_unselect_for_current;
VisualiserMenuItem m_select_all;
VisualiserMenuItem m_unselect_all;
public SelectionTreeMenu(SelectableTree tree_in) {
super(tree_in, "");
addSeparator();
//-
m_select_all = new StableMenuItem("Выбрать всё", "/icons/SelectAll.png");
m_select_all.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SelectAll(true);
tree.updateUI();
}
});
add(m_select_all);
m_unselect_all = new StableMenuItem("Отменить всё", "/icons/UnselectAll.png");
m_unselect_all.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SelectAll(false);
tree.updateUI();
}
});
add(m_unselect_all);
addSeparator();
m_select_for_current = new VisualiserMenuItem("");
m_select_for_current.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Object o = Current.get(tree.getCurrent());
if (o instanceof Selectable) {
((Selectable) o).SelectAllChildren(true);
}
tree.updateUI();
}
});
add(m_select_for_current);
//--------
m_unselect_for_current = new VisualiserMenuItem("");
m_unselect_for_current.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Object o = Current.get(tree.getCurrent());
if (o instanceof Selectable) {
((Selectable) o).SelectAllChildren(false);
}
tree.updateUI();
}
});
//-------
add(m_unselect_for_current);
}
public abstract Class getTargetClass(); //для кого позволяется выбирать всех потомков.
public abstract void SelectAll(boolean select);
@Override
public void CheckElementsVisibility() {
Object current = Current.get(tree.getCurrent());
if ((current != null) && (current.getClass().equals(getTargetClass()))) {
String name = ((Selectable) current).getSelectionText();
m_select_for_current.setText("Выбрать всё для " +
Utils.Brackets(name));
m_unselect_for_current.setText("Отменить выбор всех для " +
Utils.Brackets(name));
//-
m_select_for_current.setVisible(true);
m_unselect_for_current.setVisible(true);
} else {
m_select_for_current.setVisible(false);
m_unselect_for_current.setVisible(false);
}
}
}

View File

@@ -0,0 +1,38 @@
package Common.UI.Menus;
import Common.Current;
import Common.UI.Themes.ThemeElement;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
public class StyledPopupMenu extends JPopupMenu implements ThemeElement {
public StyledPopupMenu() {
addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
CheckElementsVisibility();
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
}
});
}
private void refreshTheme_r(MenuElement element) {
element.getComponent().setBackground(Current.getTheme().background);
element.getComponent().setForeground(Current.getTheme().foreground);
for (MenuElement se : element.getSubElements())
refreshTheme_r(se);
}
@Override
public void applyTheme() {
setBackground(Current.getTheme().background);
setForeground(Current.getTheme().foreground);
refreshTheme_r(this);
}
public void CheckElementsVisibility() {
applyTheme();
}
}

View File

@@ -0,0 +1,29 @@
package Common.UI.Menus;
import Common.Utils.Utils;
import javax.swing.*;
public class TableMenu extends StyledPopupMenu {
int row = Utils.Nan;
int column = Utils.Nan;
Object target = null;
//-
JTable owner = null;
VisualiserMenuItem mcopy;
public TableMenu(JTable owner_in) {
owner = owner_in;
mcopy = new VisualiserMenuItem("Копировать текст текущей ячейки", "/icons/Editor/Copy.png");
//если удалось нажать значит все условия выполнены
mcopy.addActionListener(e -> Utils.CopyToClipboard(target.toString()));
add(mcopy);
}
@Override
public void CheckElementsVisibility() {
row = owner.getSelectedRow();
column = owner.getSelectedColumn();
if ((row >= 0) && (column >= 0)) {
target = owner.getValueAt(row, column);
mcopy.setVisible(true);
} else mcopy.setVisible(false);
super.CheckElementsVisibility();
}
}

View File

@@ -0,0 +1,28 @@
package Common.UI.Menus;
import GlobalData.Tasks.TaskState;
import javax.swing.*;
import java.awt.event.ActionListener;
public class TestsCompilationFilterMenu extends StyledPopupMenu{
public void CreateStateItem(TaskState state, ActionListener listener){
JMenuItem m = new VisualiserMenuItem(state.getDescription());
m.addActionListener(listener);
add(m);
}
public TestsCompilationFilterMenu(){
for (TaskState taskState: TaskState.values()){
switch (taskState){
case Queued:
case FailedToQueue:
case NoSuchTask:
case AbortingByUser:
break;
case Waiting:
CreateStateItem(taskState, e -> {
});
break;
}
}
}
}

View File

@@ -0,0 +1,42 @@
package Common.UI.Menus;
import Common.UI.UI;
import Common.Utils.Utils;
import javax.swing.*;
import java.awt.event.ActionEvent;
public class TextComboBoxMenu extends StyledPopupMenu {
protected JComboBox<String> box;
protected String selectedText = null;
//-------------------------------------------------
JMenuItem m_copy;
JMenuItem m_paste;
//-------------------------------------------------
public TextComboBoxMenu(JComboBox<String> box_in) {
box = box_in;
m_copy = new VisualiserMenuItem("Копировать", "/icons/Editor/Copy.png");
m_copy.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Utils.CopyToClipboard(box.getSelectedItem().toString());
}
});
add(m_copy);
m_paste = new VisualiserMenuItem("Вставить", "/icons/Editor/Paste.png");
m_paste.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
UI.TrySelect(box, Utils.getFromClipboard());
}
});
add(m_paste);
}
@Override
public void CheckElementsVisibility() {
boolean visible_ = box.getSelectedIndex() >= 0;
m_paste.setVisible(visible_);
m_copy.setVisible(visible_);
super.CheckElementsVisibility();
}
}

View File

@@ -0,0 +1,86 @@
package Common.UI.Menus;
import Common.Utils.Utils;
import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.event.ActionEvent;
import java.util.Vector;
public class TextEditorMenu extends StyledPopupMenu {
protected JTextComponent editor;
protected String selectedText = null;
//-------------------------------------------------
JMenuItem m_cut;
JMenuItem m_copy;
JMenuItem m_paste;
protected JMenuItem m_strike;
protected JMenuItem m_unstrike;
//-------------------------------------------------
public TextEditorMenu(JTextComponent editor_in) {
editor = editor_in;
m_cut = new VisualiserMenuItem("Вырезать", "/icons/Editor/Cut.png");
m_cut.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
editor.cut();
}
});
add(m_cut);
m_copy = new VisualiserMenuItem("Копировать", "/icons/Editor/Copy.png");
m_copy.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
editor.copy();
}
});
add(m_copy);
m_paste = new VisualiserMenuItem("Вставить", "/icons/Editor/Paste.png");
m_paste.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
editor.paste();
}
});
add(m_paste);
//--
m_strike = new VisualiserMenuItem("Вычеркнуть","/icons/Editor/Strikethrough.png");
m_strike.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
String[] data = selectedText.split("\n");
Vector<String> new_data = new Vector<>();
for (String line: data){
new_data.add(Utils.strikeThrough(line));
}
editor.replaceSelection(String.join("\n", new_data));
}
});
add(m_strike);
m_unstrike = new VisualiserMenuItem("Отменить вычёркивание","/icons/Editor/NoStrike.png");
m_unstrike.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
String[] data = selectedText.split("\n");
Vector<String> new_data = new Vector<>();
for (String line: data){
new_data.add(Utils.noStrikeThrough(line));
}
editor.replaceSelection(String.join("\n", new_data));
}
});
add(m_unstrike);
}
@Override
public void CheckElementsVisibility() {
selectedText = editor.getSelectedText();
m_cut.setVisible(editor.isEditable() && (selectedText != null));
m_paste.setVisible(editor.isEditable());
m_copy.setVisible(selectedText != null);
m_strike.setVisible(editor.isEditable() && (selectedText != null));
m_unstrike.setVisible(editor.isEditable() && (selectedText != null));
super.CheckElementsVisibility();
}
}

View File

@@ -0,0 +1,53 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Common.UI.Menus_2023.StableMenuItem;
import Common.UI.Trees.DataTree;
import Common.UI.UI;
import Common.Utils.Utils;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
public class VersionsMenu extends GraphMenu<DataTree> {
VisualiserMenuItem m_select_all;
VisualiserMenuItem m_unselect_all;
VisualiserMenuItem m_multiselection;
public VersionsMenu(DataTree tree) {
super(tree, "подверсии");
add(Pass_2021.passes.get(PassCode_2021.DeleteSubversions).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteLonelyM).createMenuItem());
addSeparator();
m_multiselection = new VisualiserMenuItem("Массовый режим работы с версиями");
m_multiselection.setIcon(Utils.getIcon(Global.versions_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
m_multiselection.addActionListener(e -> {
Global.versions_multiselection = !Global.versions_multiselection;
m_multiselection.setIcon(Utils.getIcon(Global.versions_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
Current.getRoot().SelectAllVersions(false);
UI.getVersionsWindow().getVersionsForm().getTree().updateUI();
});
add(m_multiselection);
addSeparator();
add(Pass_2021.passes.get(PassCode_2021.DeleteVersion).createMenuItem());
//-
m_select_all = new StableMenuItem("Выбрать всё, кроме резервных копий","/icons/SelectAll.png");
m_select_all.addActionListener(e -> {
Current.getRoot().SelectAllVersions(true);
tree.updateUI();
});
add(m_select_all);
m_unselect_all = new StableMenuItem("Отменить всё","/icons/UnselectAll.png");
m_unselect_all.addActionListener(e -> {
Current.getRoot().SelectAllVersions(false);
tree.updateUI();
});
add(m_unselect_all);
add(Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).createMenuItem());
}
@Override
public void CheckElementsVisibility() {
Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).setControlsVisible(!Global.versions_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).setControlsVisible(Global.versions_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteVersion).setControlsVisible(!Global.versions_multiselection);
m_select_all.setVisible(Global.versions_multiselection);
m_unselect_all.setVisible(Global.versions_multiselection);
}
}

View File

@@ -0,0 +1,21 @@
package Common.UI.Menus;
import Common.Current;
import Common.UI.Themes.VisualiserFonts;
import Common.Utils.Utils;
import javax.swing.*;
public class VisualiserMenuItem extends JMenuItem {
public VisualiserMenuItem(String text) {
super(text, null);
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
}
public VisualiserMenuItem(String text, String icon_path) {
super(text);
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
if (icon_path != null)
setIcon(Utils.getIcon(icon_path));
}
public VisualiserMenuItem(){
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
}
}