package org.docear.plugin.core.listeners; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.util.Collections; import org.apache.commons.io.FileUtils; import org.docear.plugin.core.CoreConfiguration; import org.docear.plugin.core.DocearController; import org.docear.plugin.core.IDocearLibrary; import org.docear.plugin.core.event.DocearEvent; import org.docear.plugin.core.event.DocearEventType; import org.docear.plugin.core.workspace.creator.FolderTypeLibraryCreator; import org.docear.plugin.core.workspace.creator.FolderTypeLiteratureRepositoryCreator; import org.docear.plugin.core.workspace.creator.FolderTypeProjectsCreator; import org.docear.plugin.core.workspace.creator.LinkTypeIncomingCreator; import org.docear.plugin.core.workspace.creator.LinkTypeLiteratureAnnotationsCreator; import org.docear.plugin.core.workspace.creator.LinkTypeMyPublicationsCreator; import org.docear.plugin.core.workspace.creator.LinkTypeReferencesCreator; import org.docear.plugin.core.workspace.node.FolderTypeLibraryNode; import org.freeplane.core.util.Compat; import org.freeplane.core.util.LogUtils; import org.freeplane.plugin.workspace.WorkspaceConfiguration; import org.freeplane.plugin.workspace.WorkspaceController; import org.freeplane.plugin.workspace.WorkspaceUtils; import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder; import org.freeplane.plugin.workspace.event.IWorkspaceEventListener; import org.freeplane.plugin.workspace.event.WorkspaceEvent; import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode; import org.freeplane.plugin.workspace.nodes.ALinkNode; import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode; import org.freeplane.plugin.workspace.nodes.WorkspaceRoot; public class WorkspaceChangeListener implements IWorkspaceEventListener { private boolean workspacePrepared = false; public void openWorkspace(WorkspaceEvent event) { if (DocearController.getController().isLicenseDialogNecessary()) { DocearController.getController().dispatchDocearEvent(new DocearEvent(DocearController.getController(), DocearEventType.SHOW_LICENSES)); } } public void closeWorkspace(WorkspaceEvent event) {} public void workspaceChanged(WorkspaceEvent event) {} public void toolBarChanged(WorkspaceEvent event) {} public void workspaceReady(WorkspaceEvent event) { setSystemNodes(); } private void setSystemNodes() { try{ File libPath = WorkspaceUtils.resolveURI(DocearController.getController().getLibraryPath()); URI _tempFile = Compat.fileToUrl(new File(libPath, "temp.mm")).toURI(); URI _trashFile = Compat.fileToUrl(new File(libPath, "trash.mm")).toURI(); AWorkspaceTreeNode parent = WorkspaceUtils.getNodeForPath(((WorkspaceRoot) WorkspaceUtils.getModel().getRoot()).getName()+"/Library"); for(AWorkspaceTreeNode node : Collections.list(parent.children())){ if(node.getType().equals(LinkTypeIncomingCreator.LINK_TYPE_INCOMING) || node.getType().equals(LinkTypeLiteratureAnnotationsCreator.LINK_TYPE_LITERATUREANNOTATIONS) || node.getType().equals(LinkTypeMyPublicationsCreator.LINK_TYPE_MYPUBLICATIONS)){ node.setSystem(true); } if(node.getType().equals(ALinkNode.LINK_TYPE_FILE)){ URI linkPath = WorkspaceUtils.absoluteURI(((ALinkNode)node).getLinkPath()); if(linkPath.equals(_trashFile) || linkPath.equals(_tempFile)){ node.setSystem(true); } } } } catch (MalformedURLException e) { LogUtils.warn(e); } catch (URISyntaxException e) { LogUtils.warn(e); } } public void configurationLoaded(WorkspaceEvent event) { linkWelcomeMindmapAfterWorkspaceCreation(); IDocearLibrary lib = DocearController.getController().getLibrary(); if(lib != null && lib instanceof FolderTypeLibraryNode) { WorkspaceController.getController().getExpansionStateHandler().addPathKey(((AWorkspaceTreeNode)lib).getKey()); WorkspaceController.getController().refreshWorkspace(); } } public void configurationBeforeLoading(WorkspaceEvent event) { removeLibraryPaths(); prepareWorkspace(); } private void removeLibraryPaths() { CoreConfiguration.projectPathObserver.reset(); CoreConfiguration.referencePathObserver.reset(); CoreConfiguration.repositoryPathObserver.reset(); } private void prepareWorkspace() { if(!workspacePrepared) { WorkspaceController controller = WorkspaceController.getController(); controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_FOLDER, FolderTypeLibraryCreator.FOLDER_TYPE_LIBRARY, new FolderTypeLibraryCreator()); controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_FOLDER, FolderTypeLiteratureRepositoryCreator.FOLDER_TYPE_LITERATUREREPOSITORY, new FolderTypeLiteratureRepositoryCreator()); controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_FOLDER, FolderTypeProjectsCreator.FOLDER_TYPE_PROJECTS, new FolderTypeProjectsCreator()); controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_LINK, LinkTypeMyPublicationsCreator.LINK_TYPE_MYPUBLICATIONS , new LinkTypeMyPublicationsCreator()); controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_LINK, LinkTypeReferencesCreator.LINK_TYPE_REFERENCES , new LinkTypeReferencesCreator()); controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_LINK, LinkTypeLiteratureAnnotationsCreator.LINK_TYPE_LITERATUREANNOTATIONS , new LinkTypeLiteratureAnnotationsCreator()); controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_LINK, LinkTypeIncomingCreator.LINK_TYPE_INCOMING , new LinkTypeIncomingCreator()); controller.getConfiguration().setDefaultConfigTemplateUrl(getClass().getResource("/conf/workspace_default_docear.xml")); modifyContextMenus(); } workspacePrepared = true; copyInfoIfNeeded(); } private void copyInfoIfNeeded() { File infoFile = new File(WorkspaceUtils.getProfileBaseFile(), "!!!info.txt"); if(!infoFile.exists()) { createAndCopy(infoFile, "/conf/!!!info.txt"); } File _dataInfoFile = new File(WorkspaceUtils.getDataDirectory(), "!!!info.txt"); if(!_dataInfoFile.exists()) { createAndCopy(_dataInfoFile, "/conf/!!!info.txt"); } File _welcomeFile = new File(WorkspaceUtils.getDataDirectory(), "/help/docear-welcome.mm"); if(!_welcomeFile.exists()) { createAndCopy(_welcomeFile, "/conf/docear-welcome.mm"); } File _docearLogo = new File(WorkspaceUtils.getDataDirectory(), "/help/docear-logo.png"); if(!_docearLogo.exists()) { createAndCopy(_docearLogo, "/images/docear_logo.png"); } } /** * @param file * @param resourcePath */ private void createAndCopy(File file, String resourcePath) { try { createFile(file); FileUtils.copyInputStreamToFile(CoreConfiguration.class.getResourceAsStream(resourcePath), file); } catch (IOException e) { LogUtils.warn(e); } } /** * @param file * @throws IOException */ private void createFile(File file) throws IOException { if(!file.getParentFile().exists() && !file.getParentFile().mkdirs()) { return; } file.createNewFile(); } private void linkWelcomeMindmapAfterWorkspaceCreation() { AWorkspaceTreeNode parent = WorkspaceUtils.getNodeForPath(((WorkspaceRoot) WorkspaceUtils.getModel().getRoot()).getName()+"/Miscellaneous"); if (parent == null) { return; } File _welcomeFile = new File(WorkspaceUtils.getDataDirectory(), "/help/docear-welcome.mm"); LinkTypeFileNode node = new LinkTypeFileNode(); node.setName(_welcomeFile.getName()); node.setLinkPath(WorkspaceUtils.getWorkspaceRelativeURI(_welcomeFile)); WorkspaceUtils.getModel().addNodeTo(node, parent, false); parent.refresh(); } private void modifyContextMenus() { AWorkspaceTreeNode root = (AWorkspaceTreeNode) WorkspaceUtils.getModel().getRoot(); WorkspacePopupMenuBuilder.insertAction(root.getContextMenu(), "workspace.action.docear.locations.change", 3); } }