package org.docear.plugin.core.listeners;
import java.awt.Component;
import java.io.File;
import java.util.List;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.main.application.ApplicationResourceController;
import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
import org.freeplane.view.swing.map.MapView;
public class WorkspaceTreeModelListener implements TreeModelListener {
@Override
public void treeNodesChanged(TreeModelEvent event) {
// if(event instanceof WorkspaceTreeModelEvent && ((WorkspaceTreeModelEvent) event).getType() == WorkspaceTreeModelEventType.rename) {
// File from = (File) ((WorkspaceTreeModelEvent) event).getFrom();
// File to = (File) ((WorkspaceTreeModelEvent) event).getTo();
//
// if(((WorkspaceTreeModelEvent) event).getFrom() == null || from == null || to == null) {
// return;
// }
// Object obj = event.getTreePath().getLastPathComponent();
// if(obj instanceof DefaultFileNode) {
// if(to.isDirectory()) {
// //go through all subdirs and files
// traversThrough(to, from);
// }
// else {
// updateFileTracking(from, to);
// }
// }
//
// }
}
@Override
public void treeNodesInserted(TreeModelEvent e) {
}
@Override
public void treeNodesRemoved(TreeModelEvent event) {
for(Object obj : event.getChildren()) {
if(obj instanceof IFileSystemRepresentation) {
File file = ((IFileSystemRepresentation) obj).getFile();
if(file != null && file.getName().toLowerCase().endsWith(".mm")) {
try {
String str = Controller.getCurrentController().getMapViewManager().checkIfFileIsAlreadyOpened(file.toURI().toURL());
//if map is open right now, remove url and clean all tracking lists
if(str != null) {
MapModel map = Controller.getCurrentController().getMapViewManager().getMaps().get(str);
removeFileTracking(map);
//reset the url (save path)
map.setURL(null);
//set to unsaved
map.setSaved(false);
//update the application title to show that the map is not saved
Controller.getCurrentController().getMapViewManager().setTitle();
}
} catch (Throwable e) {
LogUtils.warn(e);
}
}
}
}
}
private void removeFileTracking(MapModel map) {
//get all view to access the map view needed to clean the currently opened list
List<Component> views = Controller.getCurrentController().getMapViewManager().getViews(map);
ResourceController resCtrl = Controller.getCurrentController().getResourceController();
if(resCtrl instanceof ApplicationResourceController) {
//retrieve the internal map save name
String name = ((ApplicationResourceController) resCtrl).getLastOpenedList().getRestoreable(map);
//remove from last opened list
((ApplicationResourceController) resCtrl).getLastOpenedList().remove(name);
//go through all view to get to the map view
for(Component comp : views) {
if(comp instanceof MapView) {
//use map view to remove the map from the currently opened list by simulating that it was closed
((ApplicationResourceController) resCtrl).getLastOpenedList().afterViewClose(comp);
}
}
}
}
@Override
public void treeStructureChanged(TreeModelEvent e) {
}
}