From a19b87202ea5ef5b159d0b703b1ca61d5615c7a4 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 21 Oct 2014 13:09:01 +0200 Subject: [PATCH] =?UTF-8?q?ability=20to=20specify=20additionalExportFile?= =?UTF-8?q?=20in=20State=20annotation=20=E2=80=94=20we=20can=20export=20co?= =?UTF-8?q?mponent=20state=20without=20instantiation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/impl/TemplateSettings.java | 7 ++-- .../ide/actions/ExportSettingsAction.java | 32 ++++++++++++----- .../ide/actions/ImportSettingsAction.java | 34 +++++++++---------- .../keymap/impl/KeymapManagerImpl.java | 24 ++++--------- .../src/messages/KeyMapBundle.properties | 1 - .../src/messages/OptionsBundle.properties | 1 + .../intellij/openapi/components/State.java | 2 ++ 7 files changed, 55 insertions(+), 46 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java index abac37752dd3..4f40f4775272 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java @@ -48,7 +48,8 @@ import java.util.*; @Storage(file = StoragePathMacros.APP_CONFIG + "/other.xml"), @Storage(file = StoragePathMacros.APP_CONFIG + "/templates.xml") }, - storageChooser = LastStorageChooserForWrite.class + storageChooser = LastStorageChooserForWrite.class, + additionalExportFile = TemplateSettings.TEMPLATES_DIR_PATH ) public class TemplateSettings implements PersistentStateComponent { private static final Logger LOG = Logger.getInstance(TemplateSettings.class); @@ -90,6 +91,8 @@ public class TemplateSettings implements PersistentStateComponent myTemplates = MultiMap.createLinked(); private final Map myTemplatesById = new LinkedHashMap(); @@ -183,7 +186,7 @@ public class TemplateSettings implements PersistentStateComponent() { + mySchemesManager = schemesManagerFactory.createSchemesManager(TEMPLATES_DIR_PATH, new BaseSchemeProcessor() { @Override @Nullable public TemplateGroup readScheme(@NotNull final Document schemeContent) throws InvalidDataException { diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ExportSettingsAction.java b/platform/platform-impl/src/com/intellij/ide/actions/ExportSettingsAction.java index 294c8271e01b..df1ad8941bf5 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ExportSettingsAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ExportSettingsAction.java @@ -59,8 +59,7 @@ public class ExportSettingsAction extends AnAction implements DumbAware { public void actionPerformed(@Nullable AnActionEvent e) { ApplicationManager.getApplication().saveSettings(); - MultiMap fileToComponents = getExportableComponentsMap(true); - ChooseComponentsToExportDialog dialog = new ChooseComponentsToExportDialog(fileToComponents, true, + ChooseComponentsToExportDialog dialog = new ChooseComponentsToExportDialog(getExportableComponentsMap(true), true, IdeBundle.message("title.select.components.to.export"), IdeBundle.message( "prompt.please.check.all.components.to.export")); @@ -183,8 +182,25 @@ public class ExportSettingsAction extends AnAction implements DumbAware { !StringUtil.isEmpty(storage.file()) && storage.file().startsWith(StoragePathMacros.APP_CONFIG)) { File file = new File(storageManager.expandMacros(storage.file())); - if (!onlyExisting || file.exists()) { - result.putValue(file, new MyExportableComponent(file, getExportableComponentPresentableName(stateAnnotation.name(), aClass, pluginDescriptor))); + + File additionalExportFile = null; + if (!StringUtil.isEmpty(stateAnnotation.additionalExportFile())) { + additionalExportFile = new File(storageManager.expandMacros(stateAnnotation.additionalExportFile())); + if (onlyExisting && !additionalExportFile.exists()) { + additionalExportFile = null; + } + } + + boolean fileExists = !onlyExisting || file.exists(); + if (fileExists || additionalExportFile != null) { + File[] files; + if (additionalExportFile == null) { + files = new File[]{file}; + } + else { + files = fileExists ? new File[]{file, additionalExportFile} : new File[]{additionalExportFile}; + } + result.putValue(file, new MyExportableComponent(files, getExportableComponentPresentableName(stateAnnotation.name(), aClass, pluginDescriptor))); } } } @@ -220,18 +236,18 @@ public class ExportSettingsAction extends AnAction implements DumbAware { } private static final class MyExportableComponent implements ExportableComponent { - private final File file; + private final File[] files; private final String name; - public MyExportableComponent(@NotNull File file, @NotNull String name) { - this.file = file; + public MyExportableComponent(@NotNull File[] files, @NotNull String name) { + this.files = files; this.name = name; } @NotNull @Override public File[] getExportFiles() { - return new File[]{file}; + return files; } @NotNull diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ImportSettingsAction.java b/platform/platform-impl/src/com/intellij/ide/actions/ImportSettingsAction.java index 1ac7dc7b3189..fa57b995cd9c 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ImportSettingsAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ImportSettingsAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,24 +36,22 @@ import com.intellij.openapi.ui.Messages; import com.intellij.openapi.updateSettings.impl.UpdateSettings; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.Consumer; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.intellij.util.io.ZipUtil; +import org.jetbrains.annotations.NotNull; import java.awt.*; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; +import java.util.*; import java.util.List; -import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; public class ImportSettingsAction extends AnAction implements DumbAware { @Override - public void actionPerformed(AnActionEvent e) { + public void actionPerformed(@NotNull AnActionEvent e) { final DataContext dataContext = e.getDataContext(); final Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(dataContext); ChooseComponentsToExportDialog.chooseSettingsFile(PathManager.getConfigPath(), component, IdeBundle.message("title.import.file.location"), IdeBundle.message("prompt.choose.import.file.path")).doWhenDone(new Consumer() { @@ -73,6 +71,7 @@ public class ImportSettingsAction extends AnAction implements DumbAware { return; } + @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") final ZipEntry magicEntry = new ZipFile(saveFile).getEntry(ImportSettingsFilenameFilter.SETTINGS_JAR_MARKER); if (magicEntry == null) { Messages.showErrorDialog( @@ -82,13 +81,15 @@ public class ImportSettingsAction extends AnAction implements DumbAware { } MultiMap filesToComponents = ExportSettingsAction.getExportableComponentsMap(false); - List components = getComponentsStored(saveFile, ContainerUtil.newArrayList(filesToComponents.values())); + List components = getComponentsStored(saveFile, filesToComponents.values()); filesToComponents.values().retainAll(components); final ChooseComponentsToExportDialog dialog = new ChooseComponentsToExportDialog(filesToComponents, false, IdeBundle.message("title.select.components.to.import"), IdeBundle.message("prompt.check.components.to.import")); - dialog.show(); - if (!dialog.isOK()) return; + if (!dialog.showAndGet()) { + return; + } + final Set chosenComponents = dialog.getExportableComponents(); Set relativeNamesToExtract = new HashSet(); for (final ExportableComponent chosenComponent : chosenComponents) { @@ -146,19 +147,19 @@ public class ImportSettingsAction extends AnAction implements DumbAware { return IdeBundle.message("message.please.ensure.correct.settings"); } - private static List getComponentsStored(File zipFile, - ArrayList registeredComponents) - throws IOException { + @NotNull + private static List getComponentsStored(@NotNull File zipFile, + @NotNull Collection registeredComponents) throws IOException { final File configPath = new File(PathManager.getConfigPath()); - final ArrayList components = new ArrayList(); for (ExportableComponent component : registeredComponents) { - final File[] exportFiles = component.getExportFiles(); - for (File exportFile : exportFiles) { + for (File exportFile : component.getExportFiles()) { final String rPath = FileUtil.getRelativePath(configPath, exportFile); assert rPath != null; String relativePath = FileUtil.toSystemIndependentName(rPath); - if (exportFile.isDirectory()) relativePath += "/"; + if (exportFile.isDirectory()) { + relativePath += '/'; + } if (ZipUtil.isZipContainsEntry(zipFile, relativePath)) { components.add(component); break; @@ -167,5 +168,4 @@ public class ImportSettingsAction extends AnAction implements DumbAware { } return components; } - } diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java index cbb7b30dc02e..b64d0b0362e2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapManagerImpl.java @@ -16,9 +16,7 @@ package com.intellij.openapi.keymap.impl; import com.intellij.openapi.actionSystem.IdeActions; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.*; -import com.intellij.openapi.keymap.KeyMapBundle; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapManagerListener; import com.intellij.openapi.keymap.ex.KeymapManagerEx; @@ -35,14 +33,16 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.event.KeyEvent; -import java.io.File; import java.util.*; @State( name = "KeymapManager", - storages = @Storage(file = StoragePathMacros.APP_CONFIG + "/keymap.xml", roamingType = RoamingType.PER_PLATFORM) + storages = @Storage(file = StoragePathMacros.APP_CONFIG + "/keymap.xml", roamingType = RoamingType.PER_PLATFORM), + additionalExportFile = KeymapManagerImpl.KEYMAPS_DIR_PATH ) -public class KeymapManagerImpl extends KeymapManagerEx implements PersistentStateComponent, ExportableApplicationComponent { +public class KeymapManagerImpl extends KeymapManagerEx implements PersistentStateComponent, ApplicationComponent { + static final String KEYMAPS_DIR_PATH = StoragePathMacros.ROOT_CONFIG + "/keymaps"; + private final List myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private String myActiveKeymapName; private final Map myBoundShortcuts = new HashMap(); @@ -55,7 +55,7 @@ public class KeymapManagerImpl extends KeymapManagerEx implements PersistentStat public static boolean ourKeymapManagerInitialized = false; KeymapManagerImpl(DefaultKeymap defaultKeymap, SchemesManagerFactory factory) { - mySchemesManager = factory.createSchemesManager(StoragePathMacros.ROOT_CONFIG + "/keymaps", + mySchemesManager = factory.createSchemesManager(KEYMAPS_DIR_PATH, new BaseSchemeProcessor() { @Override public KeymapImpl readScheme(@NotNull final Document schemeContent) throws InvalidDataException { @@ -95,18 +95,6 @@ public class KeymapManagerImpl extends KeymapManagerEx implements PersistentStat ourKeymapManagerInitialized = true; } - @Override - @NotNull - public File[] getExportFiles() { - return new File[]{new File(PathManager.getOptionsPath() + File.separatorChar + "keymap.xml"), mySchemesManager.getRootDirectory()}; - } - - @Override - @NotNull - public String getPresentableName() { - return KeyMapBundle.message("key.maps.name"); - } - @Override public Keymap[] getAllKeymaps() { List answer = new ArrayList(); diff --git a/platform/platform-resources-en/src/messages/KeyMapBundle.properties b/platform/platform-resources-en/src/messages/KeyMapBundle.properties index c761f2902b33..af1b161b85df 100644 --- a/platform/platform-resources-en/src/messages/KeyMapBundle.properties +++ b/platform/platform-resources-en/src/messages/KeyMapBundle.properties @@ -1,6 +1,5 @@ mouse.shortcut.label=Click here to enter mouse shortcut prefix.key.pressed.message=Prefix Key Pressed. -key.maps.name=Key maps action.column.name=Action shortcuts.column.name=Shortcuts diff --git a/platform/platform-resources-en/src/messages/OptionsBundle.properties b/platform/platform-resources-en/src/messages/OptionsBundle.properties index 7e5f1792120c..aa64f5d80717 100644 --- a/platform/platform-resources-en/src/messages/OptionsBundle.properties +++ b/platform/platform-resources-en/src/messages/OptionsBundle.properties @@ -302,3 +302,4 @@ exportable.libraryTable.presentable.name=Global libraries exportable.NotificationConfiguration.presentable.name=Notifications exportable.CodeInsightSettings.presentable.name=CodeInsight exportable.HttpConfigurable.presentable.name=HTTP Proxy +exportable.KeymapManager.presentable.name=Key maps diff --git a/platform/projectModel-api/src/com/intellij/openapi/components/State.java b/platform/projectModel-api/src/com/intellij/openapi/components/State.java index 38af50e27196..bb1f48724f84 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/components/State.java +++ b/platform/projectModel-api/src/com/intellij/openapi/components/State.java @@ -34,4 +34,6 @@ public @interface State { Class storageChooser() default StateStorageChooser.class; boolean reloadable() default true; + + String additionalExportFile() default ""; }