package org.freeplane.plugin.workspace.controller;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Collection;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import org.apache.commons.io.FileUtils;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.map.MapChangeEvent;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.url.UrlManager;
import org.freeplane.plugin.workspace.model.WorkspaceTreeModelEvent;
import org.freeplane.plugin.workspace.model.WorkspaceTreeModelEvent.WorkspaceTreeModelEventType;
import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
public class DefaultWorkspaceTreeModelListener implements TreeModelListener {
public void treeNodesChanged(TreeModelEvent e) {
if(e instanceof WorkspaceTreeModelEvent && ((WorkspaceTreeModelEvent) e).getType() == WorkspaceTreeModelEventType.rename){
WorkspaceTreeModelEvent event = (WorkspaceTreeModelEvent) e;
if(event.getTreePath().getLastPathComponent() instanceof DefaultFileNode){
updateOpenedMaps(event);
}
}
}
public void treeNodesInserted(TreeModelEvent e) {
// TODO Auto-generated method stub
}
public void treeNodesRemoved(TreeModelEvent e) {
// TODO Auto-generated method stub
}
public void treeStructureChanged(TreeModelEvent e) {
if(e instanceof WorkspaceTreeModelEvent && ((WorkspaceTreeModelEvent) e).getType() == WorkspaceTreeModelEventType.move){
WorkspaceTreeModelEvent event = (WorkspaceTreeModelEvent) e;
if(event.getTreePath().getLastPathComponent() instanceof DefaultFileNode || event.getTreePath().getLastPathComponent() instanceof LinkTypeFileNode){
updateOpenedMaps(event);
}
}
}
private void updateOpenedMaps(WorkspaceTreeModelEvent event) {
if(event.getFrom().toString().toLowerCase().endsWith(".mm")){
File oldFile = (File) event.getFrom();
File newFile = (File) event.getTo();
updateOpenedMaps(event, oldFile, newFile);
}
if(((File)event.getTo()).isDirectory()){
File oldFile = (File) event.getFrom();
File newFile = (File) event.getTo();
Collection<File> mindmaps = FileUtils.listFiles(newFile, new String[]{ "mm" }, true);
for(File mindmap : mindmaps){
String oldPath = mindmap.getPath().replace(newFile.getPath(), oldFile.getPath());
updateOpenedMaps(event, new File(oldPath), mindmap);
}
}
}
private void updateOpenedMaps(WorkspaceTreeModelEvent event, File oldFile, File newFile) {
String mapExtensionKey = null;
try {
mapExtensionKey = Controller.getCurrentController().getMapViewManager().checkIfFileIsAlreadyOpened(oldFile.toURL());
} catch (MalformedURLException ex) {
LogUtils.warn(ex);
}
if(mapExtensionKey != null){
MapModel map = Controller.getCurrentController().getMapViewManager().getMaps().get(mapExtensionKey);
if(map != null){
try {
boolean isSaved = map.isSaved();
map.setURL(newFile.toURL());
MapChangeEvent mapChangeEvent = new MapChangeEvent(this, map, UrlManager.MAP_URL, oldFile.toURL(), newFile.toURL());
Controller.getCurrentModeController().getMapController().fireMapChanged(mapChangeEvent);
if(event.getType() == WorkspaceTreeModelEventType.rename){
Controller.getCurrentController().getMapViewManager().updateMapViewName();
}
map.setSaved(isSaved);
Controller.getCurrentController().getViewController().setTitle();
} catch (MalformedURLException ex) {
LogUtils.warn(ex);
}
}
}
}
}