package org.docear.plugin.pdfutilities.listener; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.docear.plugin.core.logging.DocearLogger; import org.docear.plugin.core.mindmap.MindmapUpdateController; import org.docear.plugin.pdfutilities.map.AnnotationController; import org.docear.plugin.pdfutilities.map.MindmapFileLinkUpdater; import org.freeplane.core.util.TextUtils; import org.freeplane.plugin.workspace.model.WorkspaceModelEvent; import org.freeplane.plugin.workspace.model.WorkspaceModelEvent.WorkspaceModelEventType; import org.freeplane.plugin.workspace.model.project.AWorkspaceProject; import org.freeplane.plugin.workspace.model.project.IProjectModelListener; import org.freeplane.plugin.workspace.nodes.DefaultFileNode; import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode; public class DocearProjectModelListener implements IProjectModelListener { public static void updateMaps(AWorkspaceProject project, File newFile, File oldFile, boolean renamed) { Map<File, File> fileMap = new HashMap<File, File>(); if(!newFile.isDirectory()) { fileMap.put(oldFile, newFile); } else{ fileMap.put(oldFile, newFile); 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(project, fileMap, renamed); } public static void updateMaps(AWorkspaceProject project, Map<File, File> fileMap, boolean renamed) { ArrayList<AWorkspaceProject> projects = new ArrayList<AWorkspaceProject>(); projects.add(project); MindmapUpdateController mindmapUpdateController = new MindmapUpdateController(false); mindmapUpdateController.addMindmapUpdater(new MindmapFileLinkUpdater(TextUtils.getText("updating_links"), renamed, fileMap)); mindmapUpdateController.updateAllMindmapsInProject(projects); } public void treeNodesChanged(WorkspaceModelEvent event) { if(event.getType() == WorkspaceModelEventType.RENAMED){ if(event.getTreePath().getLastPathComponent() instanceof DefaultFileNode) { try { DefaultFileNode target = (DefaultFileNode) event.getTreePath().getLastPathComponent(); File parent = target.getFile().getParentFile(); File oldFile = new File(parent, (String) event.getOldValue()); File newFile = new File(parent, (String) event.getNewValue()); AnnotationController.getController().updateIndex(newFile, oldFile); updateMaps(event.getProject(), newFile, oldFile, true); } catch (Exception e) { DocearLogger.warn(e); } } } } public void treeNodesInserted(WorkspaceModelEvent event) { } public void treeNodesRemoved(WorkspaceModelEvent event) { } public void treeStructureChanged(WorkspaceModelEvent event) { if(event.getTreePath().getLastPathComponent() instanceof DefaultFileNode || event.getTreePath().getLastPathComponent() instanceof LinkTypeFileNode){ File oldFile = null; File newFile = null; if(event.getType() == WorkspaceModelEventType.RENAMED) { DefaultFileNode target = (DefaultFileNode) event.getTreePath().getLastPathComponent(); File parent = target.getFile().getParentFile(); oldFile = new File(parent, (String) event.getOldValue()); newFile = new File(parent, (String) event.getNewValue()); } else if(event.getType() == WorkspaceModelEventType.MOVED) { newFile = (File) event.getNewValue(); oldFile = (File) event.getOldValue(); } if(newFile != null && oldFile != null) { try { AnnotationController.getController().updateIndex(newFile, oldFile); updateMaps(event.getProject(), newFile, oldFile, (event.getType() == WorkspaceModelEventType.RENAMED)); } catch (Exception e) { DocearLogger.warn(e); } } } } }