package org.docear.plugin.pdfutilities.listener;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import org.apache.commons.io.FileUtils;
import org.docear.plugin.core.mindmap.MindmapUpdateController;
import org.docear.plugin.pdfutilities.map.MindmapFileLinkUpdater;
import org.freeplane.core.util.TextUtils;
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 DocearWorkspaceTreeModelListener 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){
updateMaps(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){
updateMaps(event);
}
}
}
private void updateMaps(WorkspaceTreeModelEvent event) {
Map<File, File> fileMap = new HashMap<File, File>();
if(!((File)event.getTo()).isDirectory()){
File oldFile = (File) event.getFrom();
File newFile = (File) event.getTo();
fileMap.put(oldFile, newFile);
}
else{
File oldFile = (File) event.getFrom();
File newFile = (File) event.getTo();
Collection<File> files = FileUtils.listFiles(newFile, null, true);
for(File file : files){
String oldPath = file.getPath().replace(newFile.getPath(), oldFile.getPath());
fileMap.put(new File(oldPath), file);
}
}
updateMaps(event, fileMap);
}
private void updateMaps(WorkspaceTreeModelEvent event, Map<File, File> fileMap) {
MindmapUpdateController mindmapUpdateController = new MindmapUpdateController(false);
mindmapUpdateController.addMindmapUpdater(new MindmapFileLinkUpdater(TextUtils.getText("updating_links"), event, fileMap));
mindmapUpdateController.updateCurrentMindmap();//updateAllMindmapsInWorkspace();
}
}