package org.docear.plugin.core; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.Collection; import java.util.Enumeration; import java.util.Properties; import javax.swing.SwingUtilities; import org.docear.plugin.core.actions.DocearAboutAction; import org.docear.plugin.core.actions.DocearOpenUrlAction; import org.docear.plugin.core.actions.DocearQuitAction; import org.docear.plugin.core.actions.DocearShowDataPrivacyStatementAction; import org.docear.plugin.core.actions.DocearShowDataProcessingTermsAction; import org.docear.plugin.core.actions.DocearShowTermsOfUseAction; import org.docear.plugin.core.actions.SaveAction; import org.docear.plugin.core.actions.SaveAsAction; import org.docear.plugin.core.features.DocearMapModelController; import org.docear.plugin.core.features.DocearMapModelExtension; import org.docear.plugin.core.features.DocearMapWriter; import org.docear.plugin.core.features.DocearNodeModelExtensionController; import org.docear.plugin.core.listeners.MapLifeCycleAndViewListener; import org.docear.plugin.core.listeners.PropertyListener; import org.docear.plugin.core.listeners.PropertyLoadListener; import org.docear.plugin.core.listeners.WorkspaceChangeListener; import org.docear.plugin.core.listeners.WorkspaceOpenDocumentListener; import org.docear.plugin.core.logger.DocearLogEvent; import org.docear.plugin.core.ui.NotificationBar; import org.docear.plugin.core.workspace.actions.DocearChangeLibraryPathAction; import org.docear.plugin.core.workspace.actions.DocearRenameAction; import org.docear.plugin.core.workspace.actions.WorkspaceChangeLocationsAction; import org.docear.plugin.core.workspace.node.config.NodeAttributeObserver; import org.freeplane.core.resources.OptionPanelController; import org.freeplane.core.resources.ResourceBundles; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.resources.components.IPropertyControl; import org.freeplane.core.ui.AFreeplaneAction; import org.freeplane.core.ui.IMenuContributor; import org.freeplane.core.ui.MenuBuilder; import org.freeplane.core.util.ConfigurationUtils; import org.freeplane.core.util.LogUtils; import org.freeplane.features.help.OnlineDocumentationAction; import org.freeplane.features.map.MapModel; import org.freeplane.features.map.NodeModel; import org.freeplane.features.mapio.MapIO; import org.freeplane.features.mapio.mindmapmode.MMapIO; import org.freeplane.features.mode.Controller; import org.freeplane.features.mode.ModeController; import org.freeplane.features.mode.mindmapmode.MModeController; import org.freeplane.features.ui.ViewController; import org.freeplane.features.url.UrlManager; import org.freeplane.features.url.mindmapmode.IMapConverter; import org.freeplane.features.url.mindmapmode.MapConversionException; import org.freeplane.features.url.mindmapmode.MapVersionInterpreter; import org.freeplane.plugin.workspace.WorkspaceController; import org.freeplane.plugin.workspace.WorkspacePreferences; import org.freeplane.plugin.workspace.WorkspaceUtils; import org.freeplane.plugin.workspace.event.WorkspaceActionEvent; import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode; public class CoreConfiguration extends ALanguageController { private static final String DOCEAR = "Docear"; private static final String APPLICATION_NAME = "ApplicationName"; private static final String DOCUMENTATION_ACTION = "DocumentationAction"; private static final String DOCEAR_WEB_DOCU_LOCATION = "docear_webDocuLocation"; private static final String WEB_DOCU_LOCATION = "webDocuLocation"; private static final String REQUEST_FEATURE_ACTION = "RequestFeatureAction"; private static final String DOCEAR_FEATURE_TRACKER_LOCATION = "docear_featureTrackerLocation"; private static final String FEATURE_TRACKER_LOCATION = "featureTrackerLocation"; private static final String ASK_FOR_HELP = "AskForHelp"; private static final String HELP_FORUM_LOCATION = "helpForumLocation"; private static final String REPORT_BUG_ACTION = "ReportBugAction"; private static final String DOCEAR_BUG_TRACKER_LOCATION = "docear_bugTrackerLocation"; private static final String BUG_TRACKER_LOCATION = "bugTrackerLocation"; private static final String OPEN_FREEPLANE_SITE_ACTION = "OpenFreeplaneSiteAction"; private static final String WEB_DOCEAR_LOCATION = "webDocearLocation"; private static final String WEB_FREEPLANE_LOCATION = "webFreeplaneLocation"; public static final String DOCUMENT_REPOSITORY_PATH = "@@literature_repository@@"; public static final String LIBRARY_PATH = "@@library_mindmaps@@"; // public static final String BIBTEX_PATH = DocearController.BIBTEX_PATH_PROPERTY; private static final WorkspaceChangeListener WORKSPACE_CHANGE_LISTENER = new WorkspaceChangeListener(); public static final NodeAttributeObserver projectPathObserver = new NodeAttributeObserver(); public static final NodeAttributeObserver referencePathObserver = new NodeAttributeObserver(); public static final NodeAttributeObserver repositoryPathObserver = new NodeAttributeObserver(); public CoreConfiguration() { LogUtils.info("org.docear.plugin.core.CoreConfiguration() initializing..."); } protected void initController(Controller controller) { loadAndStoreVersion(controller); adjustProperties(controller); // AFreeplaneAction previousAction = controller.getAction("QuitAction"); // if(previousAction != null) { // controller.removeAction("QuitAction"); // } // controller.addAction(new DocearQuitAction()); AFreeplaneAction action = new DocearAboutAction(); replaceAction(action.getKey(), action); action = new DocearQuitAction(); replaceAction("QuitAction", action); } protected void initMode(ModeController modeController) { DocearController.getController().getDocearEventLogger().appendToLog(this, DocearLogEvent.APPLICATION_STARTED); Toolkit.getDefaultToolkit(); DocearController.getController().getDocearEventLogger().appendToLog(this, DocearLogEvent.OS_OPERATING_SYSTEM, System.getProperty("os.name")); DocearController.getController().getDocearEventLogger().appendToLog(this, DocearLogEvent.OS_LANGUAGE_CODE, System.getProperty("user.language")); DocearController.getController().getDocearEventLogger().appendToLog(this, DocearLogEvent.OS_COUNTRY_CODE, System.getProperty("user.country")); DocearController.getController().getDocearEventLogger().appendToLog(this, DocearLogEvent.OS_TIME_ZONE, System.getProperty("user.timezone")); DocearController.getController().getDocearEventLogger().appendToLog(this, DocearLogEvent.OS_SCREEN_RESOLUTION, Toolkit.getDefaultToolkit().getScreenSize().toString()); MapVersionInterpreter.addMapVersionInterpreter(new MapVersionInterpreter("docear", false, false, "Docear", "http://www.docear.org", null, new IMapConverter() { public void convert(NodeModel root) throws MapConversionException { final MapModel mapModel = root.getMap(); DocearMapModelExtension docearMapModel = mapModel.getExtension(DocearMapModelExtension.class); if (docearMapModel == null) { DocearMapModelController.setModelWithCurrentVersion(mapModel); } } })); // set up context menu for workspace WorkspaceController.getController().addWorkspaceListener(WORKSPACE_CHANGE_LISTENER); addPluginDefaults(Controller.getCurrentController()); addMenus(modeController); registerListeners(modeController); //prepareWorkspace(); replaceFreeplaneStringsAndActions(modeController); DocearMapModelController.install(new DocearMapModelController(modeController)); setDocearMapWriter(modeController); registerController(modeController); URI uri = CoreConfiguration.projectPathObserver.getUri(); if (uri != null) { UrlManager.getController().setLastCurrentDir(WorkspaceUtils.resolveURI(CoreConfiguration.projectPathObserver.getUri())); } } private void loadAndStoreVersion(Controller controller) { //FIXME: has to be called before the splash is showing final Properties versionProperties = new Properties(); InputStream in = null; try { in = this.getClass().getResource("/version.properties").openStream(); versionProperties.load(in); } catch (final IOException e) { } final Properties buildProperties = new Properties(); in = null; try { in = this.getClass().getResource("/build.number").openStream(); buildProperties.load(in); } catch (final IOException e) { } final String versionNumber = versionProperties.getProperty("docear_version"); final String versionStatus = versionProperties.getProperty("docear_version_status"); final String versionStatusNumber = versionProperties.getProperty("docear_version_status_number"); final int versionBuild = Integer.parseInt(buildProperties.getProperty("build.number")) -1; controller.getResourceController().setProperty("docear_version", versionNumber); controller.getResourceController().setProperty("docear_status", versionStatus+" "+versionStatusNumber+" build "+versionBuild); } private void adjustProperties(Controller controller) { ResourceController resController = controller.getResourceController(); final URL defaults = this.getClass().getResource(ResourceController.PLUGIN_DEFAULTS_RESOURCE); if (defaults == null) throw new RuntimeException("cannot open " + ResourceController.PLUGIN_DEFAULTS_RESOURCE); resController.addDefaults(defaults); resController.setProperty(WEB_FREEPLANE_LOCATION, resController.getProperty(WEB_DOCEAR_LOCATION)); resController.setProperty(BUG_TRACKER_LOCATION, resController.getProperty(DOCEAR_BUG_TRACKER_LOCATION)); resController.setProperty(HELP_FORUM_LOCATION, resController.getProperty("docear_helpForumLocation")); resController.setProperty(FEATURE_TRACKER_LOCATION, resController.getProperty(DOCEAR_FEATURE_TRACKER_LOCATION)); resController.setProperty(WEB_DOCU_LOCATION, resController.getProperty(DOCEAR_WEB_DOCU_LOCATION)); resController.setProperty("docu-online", "http://www.docear.org/wp-content/uploads/2012/04/docear-welcome.mm"); if (resController.getProperty("ApplicationName").equals("Docear")) { resController.setProperty("first_start_map", "/doc/docear-welcome.mm"); resController.setProperty("tutorial_map", "/doc/docear-welcome.mm"); } if (!resController.getProperty(APPLICATION_NAME, "").equals(DOCEAR)) { return; } //replace if application name is docear replaceResourceBundleStrings(); } private void addMenus(ModeController modeController) { modeController.addMenuContributor(new IMenuContributor() { public void updateMenus(ModeController modeController, MenuBuilder builder) { builder.addAction("/menu_bar/help", new DocearShowTermsOfUseAction(), MenuBuilder.AS_CHILD); builder.addAction("/menu_bar/help", new DocearShowDataPrivacyStatementAction(), MenuBuilder.AS_CHILD); builder.addAction("/menu_bar/help", new DocearShowDataProcessingTermsAction(), MenuBuilder.AS_CHILD); //builder.addAction("/menu_bar/help", new DocearShowNotificationBar(), MenuBuilder.AS_CHILD); } }); modeController.getUserInputListenerFactory().addToolBar(NotificationBar.TOOLBAR_NAME, ViewController.TOP, new NotificationBar()); String propertyName = Controller.getCurrentController().getViewController().completeVisiblePropertyKey(NotificationBar.getNotificationBar()); ResourceController.getResourceController().setProperty(propertyName, false); } private void setDocearMapWriter(ModeController modeController) { DocearMapWriter mapWriter = new DocearMapWriter(modeController.getMapController()); mapWriter.setMapWriteHandler(); } private void registerController(ModeController modeController) { DocearNodeModelExtensionController.install(new DocearNodeModelExtensionController(modeController)); } private void replaceFreeplaneStringsAndActions(ModeController modeController) { disableAutoUpdater(); //replace this actions if docear_core is present modeController.removeAction("SaveAsAction"); modeController.addAction(new SaveAsAction()); modeController.removeAction("SaveAction"); modeController.addAction(new SaveAction()); //remove sidepanel switcher //Controller.getCurrentModeController().removeAction("ShowFormatPanel"); modeController.addMenuContributor(new IMenuContributor() { public void updateMenus(ModeController modeController,final MenuBuilder builder) { SwingUtilities.invokeLater(new Runnable() { public void run() { builder.removeElement("$" + WorkspacePreferences.SHOW_WORKSPACE_MENUITEM + "$0"); } }); } }); ResourceController resourceController = ResourceController.getResourceController(); if (!resourceController.getProperty(APPLICATION_NAME, "").equals(DOCEAR)) { return; } //replace if application name is docear replaceResourceBundleStrings(); replaceActions(); } private void disableAutoUpdater() { final OptionPanelController optionController = Controller.getCurrentController().getOptionPanelController(); optionController.addPropertyLoadListener(new OptionPanelController.PropertyLoadListener() { public void propertiesLoaded(Collection<IPropertyControl> properties) { ((IPropertyControl) optionController.getPropertyControl("check_updates_automatically")).setEnabled(false); } }); } private void replaceActions() { ResourceController resourceController = ResourceController.getResourceController(); replaceAction(REQUEST_FEATURE_ACTION, new DocearOpenUrlAction(REQUEST_FEATURE_ACTION, resourceController.getProperty(FEATURE_TRACKER_LOCATION))); replaceAction(ASK_FOR_HELP, new DocearOpenUrlAction(ASK_FOR_HELP, resourceController.getProperty(HELP_FORUM_LOCATION))); replaceAction(REPORT_BUG_ACTION, new DocearOpenUrlAction(REPORT_BUG_ACTION, resourceController.getProperty(BUG_TRACKER_LOCATION))); replaceAction(OPEN_FREEPLANE_SITE_ACTION, new DocearOpenUrlAction(OPEN_FREEPLANE_SITE_ACTION, resourceController.getProperty(WEB_FREEPLANE_LOCATION))); replaceAction(DOCUMENTATION_ACTION, new DocearOpenUrlAction(DOCUMENTATION_ACTION, resourceController.getProperty(WEB_DOCU_LOCATION))); replaceAction("GettingStartedAction", new GettingStartedAction()); replaceAction("OnlineReference", new OnlineDocumentationAction("OnlineReference", "docu-online")); } private void replaceResourceBundleStrings() { ResourceController resourceController = ResourceController.getResourceController(); ResourceBundles bundles = ((ResourceBundles) resourceController.getResources()); Controller controller = Controller.getCurrentController(); for (Enumeration<?> i = bundles.getKeys(); i.hasMoreElements();) { String key = i.nextElement().toString(); String value = bundles.getResourceString(key); if (value.matches(".*[Ff][Rr][Ee][Ee][Pp][Ll][Aa][Nn][Ee].*")) { value = value.replaceAll("[Ff][Rr][Ee][Ee][Pp][Ll][Aa][Nn][Ee]", DOCEAR); bundles.putResourceString(key, value); if (key.matches(".*[.text]")) { key = key.replace(".text", ""); AFreeplaneAction action = controller.getAction(key); if (action != null) { MenuBuilder.setLabelAndMnemonic(action, value); } } } } } private void replaceAction(String actionKey, AFreeplaneAction action) { Controller controller = Controller.getCurrentController(); AFreeplaneAction previousAction = controller.getAction(actionKey); if(previousAction != null) { controller.removeAction(actionKey); } controller.addAction(action); } private void addPluginDefaults(Controller controller) { ResourceController resController = controller.getResourceController(); if (resController.getProperty("ApplicationName").equals("Docear") && DocearController.getController().isDocearFirstStart()) { resController.setProperty("selection_method", "selection_method_by_click"); resController.setProperty("links", "relative_to_workspace"); resController.setProperty("save_folding", "always_save_folding"); resController.setProperty("leftToolbarVisible", "false"); resController.setProperty("styleScrollPaneVisible", "true"); resController.setProperty(DocearController.DOCEAR_FIRST_RUN_PROPERTY, true); } controller.addAction(new WorkspaceChangeLocationsAction()); controller.addAction(new DocearChangeLibraryPathAction()); controller.addAction(new DocearRenameAction()); } private void registerListeners(ModeController modeController) { Controller.getCurrentController().getOptionPanelController().addPropertyLoadListener(new PropertyLoadListener()); Controller.getCurrentController().getResourceController().addPropertyChangeListener(new PropertyListener()); modeController.getMapController().addMapLifeCycleListener(new MapLifeCycleAndViewListener()); Controller.getCurrentController().getMapViewManager().addMapViewChangeListener(new MapLifeCycleAndViewListener()); WorkspaceController.getIOController().registerNodeActionListener(AWorkspaceTreeNode.class, WorkspaceActionEvent.WSNODE_OPEN_DOCUMENT, new WorkspaceOpenDocumentListener()); } class GettingStartedAction extends AFreeplaneAction { public GettingStartedAction() { super("GettingStartedAction"); } private static final long serialVersionUID = 1L; public void actionPerformed(final ActionEvent e) { final ResourceController resourceController = ResourceController.getResourceController(); final File baseDir = new File(resourceController.getResourceBaseDir()).getAbsoluteFile().getParentFile(); final String languageCode = resourceController.getLanguageCode(); final File file = ConfigurationUtils.getLocalizedFile(new File[]{baseDir}, Controller.getCurrentController().getResourceController().getProperty("tutorial_map"), languageCode); try { final URL endUrl = file.toURI().toURL(); SwingUtilities.invokeLater(new Runnable() { public void run() { try { if (endUrl.getFile().endsWith(".mm")) { Controller.getCurrentController().selectMode(MModeController.MODENAME); MMapIO mapIO = (MMapIO) MModeController.getMModeController().getExtension(MapIO.class); mapIO.newDocumentationMap(endUrl); } else { Controller.getCurrentController().getViewController().openDocument(endUrl); } } catch (final Exception e1) { LogUtils.severe(e1); } } }); } catch (final MalformedURLException e1) { LogUtils.warn(e1); } DocearController.getController().getDocearEventLogger().appendToLog(this, DocearLogEvent.SHOW_HELP); } } }