Files
VisualSapfor/src/Common_old/UI/Trees/StyledTree.java

168 lines
6.0 KiB
Java
Raw Normal View History

package Common_old.UI.Trees;
import Common_old.Current;
import Common_old.UI.Menus.GraphMenu;
import Common_old.UI.Themes.ThemeElement;
import Common_old.UI.Themes.VisualiserFonts;
import Common_old.UI.UI;
2023-09-17 22:13:42 +03:00
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class StyledTree extends JTree implements ThemeElement {
//---------------------------------
private final GraphMenu menu;
public DefaultMutableTreeNode root = null;
//-включение /отключение событий --
protected boolean events_on = true;
public StyledTree(DefaultMutableTreeNode root_in) {
super(root_in);
root = root_in;
setOpaque(true);
setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain));
setToggleClickCount(0); //отключение сворачивание разворачивания по двойному клику
//--
if (!getRenderer().equals(TreeRenderers.RendererUndefined))
setCellRenderer(UI.TreeRenderers.get(getRenderer()));
//--
getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
addTreeSelectionListener(e -> {
if (events_on && e.isAddedPath())
SelectionAction(e.getPath());
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 1) {
switch ((e.getButton())) {
//левая клавиша.
case MouseEvent.BUTTON1:
if (getSelectionCount() > 0) LeftMouseAction1();
break;
//колесо
case MouseEvent.BUTTON2:
break;
//правая клавиша
case MouseEvent.BUTTON3:
if (menu != null)
menu.Show(e);
break;
}
} else {
if (e.getClickCount() == 2) {
switch ((e.getButton())) {
case MouseEvent.BUTTON1:
if (getSelectionCount() > 0) LeftMouseAction2();
break;
}
}
}
}
});
menu = createMenu();
applyTheme();
ExpandAll();
}
public TreeRenderers getRenderer() {
return TreeRenderers.RendererUndefined;
}
public void EventsOn() {
events_on = true;
}
public void EventsOff() {
events_on = false;
}
public String getBranchesName() {
return "";
}
public void LeftMouseAction1() {
}
public void LeftMouseAction2() {
}
public void SelectionAction(TreePath e) {
}
@Override
public void applyTheme() {
setBackground(Current.getTheme().trees_background);
setForeground(Current.getTheme().foreground);
menu.applyTheme();
}
protected GraphMenu createMenu() {
return new GraphMenu(this);
}
public DefaultMutableTreeNode getNodeByRow(int row) {
DefaultMutableTreeNode res = null;
if (row >= 0) {
TreePath p = getPathForRow(row);
res = (DefaultMutableTreeNode) p.getLastPathComponent();
}
return res;
}
protected int getStartLine() {
return 0;
}
public void ExpandAll() {
for (int i = getStartLine(); i < getRowCount(); ++i)
expandRow(i);
}
public void CollapseAll() {
for (int i = getRowCount() - 1; i >= getStartLine(); --i) {
collapseRow(i);
}
}
protected boolean findNode(Object userObject, Object criteria) {
return true;
}
public DefaultMutableTreeNode FindByCriteria(Object criteria) {
DefaultMutableTreeNode res = root;
for (int i = 0; i < getRowCount(); ++i) {
DefaultMutableTreeNode node = getNodeByRow(i);
if (findNode(node.getUserObject(), criteria)) {
res = node;
break;
}
}
return res;
}
public TreePath ShowNode(DefaultMutableTreeNode node) {
TreePath res = new TreePath(((DefaultTreeModel) getModel()).getPathToRoot(node));
scrollPathToVisible(res);
return res;
}
public TreePath ShowNodeByCriteria(Object criteria) {
return ShowNode(FindByCriteria(criteria));
}
public void SelectNodeByCriteria(Object criteria) {
EventsOff();
TreePath res = ShowNodeByCriteria(criteria);
setSelectionPath(res);
EventsOn();
}
public void SelectNode(DefaultMutableTreeNode node) {
setSelectionPath(new TreePath(((DefaultTreeModel) getModel()).getPathToRoot(node)));
}
//https://stackoverflow.com/questions/7928839/adding-and-removing-nodes-from-a-jtree !!!
public void AddNode(DefaultMutableTreeNode parent, DefaultMutableTreeNode node){
parent.add(node);
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.reload(parent);
//--->>
TreePath path = new TreePath(model.getPathToRoot(node)); //брать путь к узлу так и только так.иначе не работает.!!
setSelectionPath(path);
//scrollPathToVisible(path);
}
public void RemoveNode(DefaultMutableTreeNode node){
if (node.getParent()!=null) {
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.removeNodeFromParent(node);
}
}
public void RefreshNode(DefaultMutableTreeNode node){
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.reload(node);
}
}