Skip to content

Commit

Permalink
Fix 178 (#182)
Browse files Browse the repository at this point in the history
fix #178 and reduce total code at the same time.
  • Loading branch information
i-make-robots authored Nov 22, 2023
2 parents 7689bb9 + c896e96 commit c577217
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 194 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public Project() {
}

public Project(String path) {
this();
super();
setPath(path);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ public class Entity {
protected transient ArrayList<Entity> children = new ArrayList<>();
private final List<Component> components = new ArrayList<>();

private boolean isExpanded = false;

/**
* The unique ID of this Entity.
*/
Expand Down Expand Up @@ -232,8 +230,7 @@ public String toString() {
return "name=" + name + ", " +
"uniqueID=" + uniqueID + ", " +
"entities=" + Arrays.toString(children.toArray()) + ", " +
"components=" + Arrays.toString(components.toArray()) +
"expanded=" + isExpanded;
"components=" + Arrays.toString(components.toArray());
}

public int getComponentCount() {
Expand Down Expand Up @@ -314,7 +311,6 @@ public JSONObject toJSON(SerializationContext context) {
jo.put("type",this.getClass().getName());
jo.put("uniqueID",this.uniqueID);
jo.put("name",this.name);
jo.put("expanded",this.isExpanded);
if(!children.isEmpty()) jo.put("entities", getEntitiesAsJSON(context));
if(!components.isEmpty()) jo.put("components",getComponentsAsJSON(context));
return jo;
Expand All @@ -341,7 +337,6 @@ public void parseJSON(JSONObject jo,SerializationContext context) throws JSONExc
if(jo.has("uniqueID")) this.uniqueID = jo.getString("uniqueID");
if(jo.has("entities")) readEntities(jo.getJSONArray("entities"),context);
if(jo.has("components")) readComponents(jo.getJSONArray("components"),context);
if(jo.has("expanded")) this.isExpanded = jo.getBoolean("expanded");
}

private void readEntities(JSONArray jo,SerializationContext context) throws JSONException {
Expand Down Expand Up @@ -421,14 +416,6 @@ public List<Entity> getEntireTree() {
return list;
}

public boolean getExpanded() {
return isExpanded;
}

public void setExpanded(boolean arg0) {
isExpanded = arg0;
}

private void addComponentDependencies(Class<?> myClass) {
while(myClass!=null) {
ComponentDependency[] annotations = myClass.getAnnotationsByType(ComponentDependency.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public class EntityManagerEvent {
public final Entity parent;
public final Entity child;

public EntityManagerEvent(int type,Entity parent,Entity child) {
public EntityManagerEvent(int type,Entity child,Entity parent) {
this.type = type;
this.parent = parent;
this.child = child;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public void redo() throws CannotRedoException {

protected void doIt() {
entity.setName(newName);
entityManager.fireEntityManagerEvent(new EntityManagerEvent(EntityManagerEvent.ENTITY_RENAMED,null,entity));
entityManager.fireEntityManagerEvent(new EntityManagerEvent(EntityManagerEvent.ENTITY_RENAMED,entity,null));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import com.marginallyclever.robotoverlord.entity.Entity;
import com.marginallyclever.robotoverlord.entity.EntityManager;
import com.marginallyclever.robotoverlord.entity.EntityManagerEvent;
import com.marginallyclever.robotoverlord.entity.EntityManagerListener;
import com.marginallyclever.robotoverlord.clipboard.Clipboard;
import com.marginallyclever.robotoverlord.swing.EditorAction;
import com.marginallyclever.robotoverlord.swing.UndoSystem;
import com.marginallyclever.robotoverlord.swing.actions.*;
import com.marginallyclever.robotoverlord.swing.edits.SelectEdit;
import com.marginallyclever.robotoverlord.swing.componentmanagerpanel.ComponentManagerPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.swing.*;
import javax.swing.event.*;
Expand All @@ -20,14 +20,13 @@
import java.util.List;

/**
* Uses an Observer Pattern to tell subscribers about changes using EntityTreePanelEvent.
* {@link EntityTreePanel} provides a UI to view/edit the contents of an {@link EntityManager}.
* @author Dan Royer
*
*/
public class EntityTreePanel extends JPanel {
private static final Logger logger = LoggerFactory.getLogger(EntityTreePanel.class);
private final JTree tree = new JTree();
private final DefaultTreeModel treeModel = new EntityTreeModel(null);
private final DefaultTreeCellRenderer treeCellRenderer = new FullNameTreeCellRenderer();
private final List<AbstractAction> actions = new ArrayList<>();
private final EntityManager entityManager;

Expand All @@ -37,6 +36,7 @@ public EntityTreePanel(EntityManager entityManager) {
this.entityManager = entityManager;

tree.setShowsRootHandles(true);
DefaultTreeCellRenderer treeCellRenderer = new FullNameTreeCellRenderer();
tree.setCellRenderer(treeCellRenderer);
tree.setCellEditor(new EntityTreeCellEditor(tree, treeCellRenderer));
tree.setEditable(true);
Expand All @@ -51,85 +51,22 @@ public EntityTreePanel(EntityManager entityManager) {
this.add(createMenu(), BorderLayout.NORTH);

addTreeSelectionListener();
addExpansionListener();
addTreeModelListener();
addEntityManagerListener();

addEntity(entityManager.getRoot());
populateTree();
}

private void addEntityManagerListener() {
entityManager.addListener(new EntityManagerListener() {
@Override
public void entityManagerEvent(EntityManagerEvent event) {
if(event.type == EntityManagerEvent.ENTITY_ADDED) {
addEntityToParent(event.child,event.parent);
} else if(event.type == EntityManagerEvent.ENTITY_REMOVED) {
removeEntityFromParent(event.child,event.parent);
} else if(event.type == EntityManagerEvent.ENTITY_RENAMED) {
EntityTreeNode node = findTreeNode(event.child);
treeModel.reload(node);
}
}
});
}

private void addTreeModelListener() {
treeModel.addTreeModelListener(new TreeModelListener() {
@Override
public void treeNodesChanged(TreeModelEvent e) {
// find the Entity associated with this node and rename the entity.
TreeNode node = (TreeNode) e.getTreePath().getLastPathComponent();
if (node instanceof EntityTreeNode) {
EntityTreeNode etn = (EntityTreeNode) node;
etn.getEntity().setName(etn.toString());
}
}

/**
* Find the Entity associated with this node, add it to the parent.
* @param e a {@code TreeModelEvent} describing changes to a tree model
*/
@Override
public void treeNodesInserted(TreeModelEvent e) {
for(Object obj : e.getPath()) {
TreeNode parentNode = (TreeNode) obj;
if(parentNode instanceof EntityTreeNode) {
TreeNode node = (TreeNode) e.getTreePath().getLastPathComponent();
if (node instanceof EntityTreeNode) {
Entity child = ((EntityTreeNode) node).getEntity();
Entity parent = child.getParent();
entityManager.addEntityToParent(child,parent);
}
}
}
}

/**
* Find the Entity associated with this node, remove it.
* @param e a {@code TreeModelEvent} describing changes to a tree model
*/
@Override
public void treeNodesRemoved(TreeModelEvent e) {
TreeNode node = (TreeNode) e.getTreePath().getLastPathComponent();
if (node instanceof EntityTreeNode) {
Entity child = ((EntityTreeNode) node).getEntity();
Entity parent = child.getParent();
entityManager.removeEntityFromParent(child,parent);
}
}

@Override
public void treeStructureChanged(TreeModelEvent e) {
Object [] list = e.getPath();
if(list.length==1) {
if(treeModel.getRoot() != list[0]) {
Entity parent = ((EntityTreeNode) list[0]).getEntity();
Entity child = ((EntityTreeNode) e.getTreePath().getLastPathComponent()).getEntity();
entityManager.addEntityToParent(child,parent);
}
}
entityManager.addListener((event)-> {
if(event.type == EntityManagerEvent.ENTITY_ADDED) {
addEntityToParent(event.child,event.parent);
} else if(event.type == EntityManagerEvent.ENTITY_REMOVED) {
removeEntityFromParent(event.child,event.parent);
} else if(event.type == EntityManagerEvent.ENTITY_RENAMED) {
EntityTreeNode node = findTreeNode(event.child);
treeModel.nodeChanged(node);
}
repaint();
});
}

Expand Down Expand Up @@ -182,13 +119,13 @@ public void setSelection(List<Entity> newSelectionList) {
}
}

if(pathList.size()>0) {
if(pathList.isEmpty()) {
tree.clearSelection();
} else {
TreePath[] paths = new TreePath[pathList.size()];
pathList.toArray(paths);

tree.setSelectionPaths(paths);
} else {
tree.clearSelection();
}
}

Expand All @@ -213,127 +150,64 @@ private EntityTreeNode findTreeNode(Entity e) {
return null;
}

/**
* Recursively expand or collapse this node and all child nodes.
*/
private void setNodeExpandedState(EntityTreeNode node) {
List<TreeNode> list = new ArrayList<>();
list.add(node);
public void populateTree() {
//logger.debug("populateTree");
Entity root = entityManager.getRoot();

treeModel.setRoot(new EntityTreeNode(root));
List<Entity> list = new ArrayList<>(root.getChildren());
while(!list.isEmpty()) {
EntityTreeNode n = (EntityTreeNode)list.remove(0);

Entity e = (Entity)n.getUserObject();
if(!n.isLeaf()) {
TreePath path = new TreePath(n.getPath());
if (e.getExpanded()) {
tree.expandPath(path);
// only expand children if the parent is also expanded.
list.addAll(Collections.list(n.children()));
} else {
tree.collapsePath(path);
}
}
}
}

/**
* List all objects in scene. Click an item to load its {@link ComponentManagerPanel}.
* See <a href="https://docs.oracle.com/javase/7/docs/api/javax/swing/JTree.html">JTree</a>
*/

public void addEntity(Entity me) {
Entity parentEntity = me.getParent();
if(parentEntity!=null) {
EntityTreeNode parentNode = findTreeNode(parentEntity);
if(parentNode!=null) {
EntityTreeNode newNode = new EntityTreeNode(me);
parentNode.add(newNode);
setNodeExpandedState(parentNode);
}
} else {
EntityTreeNode newNode = new EntityTreeNode(me);
treeModel.setRoot(newNode);
setNodeExpandedState((EntityTreeNode) treeModel.getRoot());
}

for(Entity child : me.getChildren()) {
addEntity(child);
Entity child = list.remove(0);
addEntityToParent(child,child.getParent());
list.addAll(child.getChildren());
}
}

public void removeEntity(Entity entity) {
EntityTreeNode node = findTreeNode(entity);
if(node!=null) {
EntityTreeNode parent = (EntityTreeNode)node.getParent();
if(parent!=null) {
parent.remove(node);
} else {
treeModel.setRoot(null);
}
}
}

private void addExpansionListener() {
tree.addTreeWillExpandListener(new TreeWillExpandListener() {
@Override
public void treeWillExpand(TreeExpansionEvent event) {
EntityTreeNode node = (EntityTreeNode)event.getPath().getLastPathComponent();
Entity e = (Entity)node.getUserObject();
e.setExpanded(true);
}

@Override
public void treeWillCollapse(TreeExpansionEvent event) {
EntityTreeNode node = (EntityTreeNode)event.getPath().getLastPathComponent();
Entity e = (Entity)node.getUserObject();
e.setExpanded(false);
}
});
}

private void addTreeSelectionListener() {
tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent arg0) {
List<Entity> selected = new ArrayList<>();
TreePath[] selectedPaths = tree.getSelectionPaths();
if(selectedPaths!=null) {
for (TreePath selectedPath : selectedPaths) {
EntityTreeNode selectedNode = (EntityTreeNode) selectedPath.getLastPathComponent();
Entity entity = (Entity)selectedNode.getUserObject();
selected.add(entity);
}
tree.addTreeSelectionListener((arg0) -> {
List<Entity> selected = new ArrayList<>();
TreePath[] selectedPaths = tree.getSelectionPaths();
if(selectedPaths!=null) {
for (TreePath selectedPath : selectedPaths) {
EntityTreeNode selectedNode = (EntityTreeNode) selectedPath.getLastPathComponent();
Entity entity = (Entity)selectedNode.getUserObject();
selected.add(entity);
}
UndoSystem.addEvent(new SelectEdit(Clipboard.getSelectedEntities(), selected));
}
UndoSystem.addEvent(new SelectEdit(Clipboard.getSelectedEntities(), selected));
});
}

private void recursivelyAddChildren(EntityTreeNode parentNode, Entity child) {
//logger.debug("recursivelyAddChildren "+child.getName()+" to "+parentNode.getEntity().getName());
EntityTreeNode newNode = new EntityTreeNode(child);
parentNode.add(newNode);
int [] index = new int[]{parentNode.getIndex(findTreeNode(child))};
treeModel.nodesWereInserted(parentNode, index);
for(Entity child2 : child.getChildren()) {
recursivelyAddChildren(newNode,child2);
}
}

private void addEntityToParent(Entity parent, Entity child) {
/**
* Add a child to a parent.
* @param child the child to add
* @param parent the parent to add the child to
*/
private void addEntityToParent(Entity child, Entity parent) {
EntityTreeNode parentNode = findTreeNode(parent);
if(parentNode!=null) {
recursivelyAddChildren(parentNode,child);
treeModel.reload(parentNode);
setNodeExpandedState((EntityTreeNode)treeModel.getRoot());
}
}

private void removeEntityFromParent(Entity parent, Entity child) {
private void removeEntityFromParent(Entity child, Entity parent) {
EntityTreeNode parentNode = findTreeNode(parent);
EntityTreeNode childNode = findTreeNode(child);
if(parentNode!=null && childNode!=null) {
int [] list = new int[]{parentNode.getIndex(childNode)};
parentNode.remove(childNode);
treeModel.reload(parentNode);
setNodeExpandedState((EntityTreeNode)treeModel.getRoot());
treeModel.nodesWereRemoved(parentNode, list, new Object[]{childNode});
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/languages/english.xml
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@
<string><key>EntityCopyAction.shortDescription</key><value>Copy</value></string>
<string><key>EntityCutAction.shortDescription</key><value>Cut</value></string>
<string><key>EntityPasteAction.shortDescription</key><value>Paste</value></string>
<string><key>EntityRenameAction.shortDescription</key><value>Paste</value></string>
<string><key>EntityRenameAction.shortDescription</key><value>Rename</value></string>
<string><key>EntityReorganizeEdit.name</key><value>Reorganize</value></string>

<string><key>RobotOverlord.Menu.File</key><value>File</value></string>
Expand Down
Loading

0 comments on commit c577217

Please sign in to comment.