diff --git a/images/src/META-INF/ImagesPlugin.xml b/images/src/META-INF/ImagesPlugin.xml index 595089abb504..05e559eb7488 100644 --- a/images/src/META-INF/ImagesPlugin.xml +++ b/images/src/META-INF/ImagesPlugin.xml @@ -19,7 +19,7 @@ - + diff --git a/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.form b/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.form index df6e377eb828..33ec1e76ae5d 100644 --- a/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.form +++ b/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.form @@ -1,17 +1,17 @@
- + - + - + - + @@ -21,7 +21,7 @@ - + @@ -29,14 +29,28 @@ - + + + + + + + + + + + + + + + - + @@ -44,19 +58,19 @@ - + - + - + @@ -166,7 +180,7 @@ - + @@ -174,7 +188,7 @@ - + @@ -196,11 +210,6 @@ - - - - - diff --git a/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.java b/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.java index a18488fcc9c9..767036906789 100644 --- a/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.java +++ b/images/src/org/intellij/images/editor/actions/SetBackgroundImageDialog.java @@ -30,10 +30,12 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.TextComponentAccessor; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.CollectionComboBoxModel; import com.intellij.ui.ComboboxWithBrowseButton; import com.intellij.ui.DocumentAdapter; +import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBRadioButton; import com.intellij.util.containers.ContainerUtil; @@ -59,6 +61,7 @@ import static com.intellij.openapi.wm.impl.IdeBackgroundUtil.*; public class SetBackgroundImageDialog extends DialogWrapper { private final String myPropertyTmp; + private final Project myProject; private JPanel myRoot; private JBRadioButton myEditorRb; private JBRadioButton myScaleRb; @@ -67,6 +70,7 @@ public class SetBackgroundImageDialog extends DialogWrapper { private JSpinner myOpacitySpinner; private JPanel myPreviewPanel; private ComboboxWithBrowseButton myPathField; + private JBCheckBox myThisProjectOnlyCb; boolean myAdjusting; private String mySelectedPath; @@ -77,6 +81,7 @@ public class SetBackgroundImageDialog extends DialogWrapper { public SetBackgroundImageDialog(@NotNull Project project, @Nullable String selectedPath) { super(project, true); + myProject = project; setTitle("Background Image"); mySelectedPath = selectedPath; myEditorPreview = createEditorPreview(); @@ -221,6 +226,8 @@ public class SetBackgroundImageDialog extends DialogWrapper { myScaleRb.setSelected(true); myCenterRb.setSelected(true); myEditorRb.setSelected(true); + boolean perProject = !Comparing.equal(getBackgroundSpec(myProject, getSystemProp()), getBackgroundSpec(null, getSystemProp())); + myThisProjectOnlyCb.setSelected(perProject); myAdjusting = false; } @@ -265,7 +272,7 @@ public class SetBackgroundImageDialog extends DialogWrapper { private void retrieveExistingValue() { myAdjusting = true; String prop = getSystemProp(); - String value = StringUtil.notNullize(myResults.get(prop), getBackgroundSpec(prop)); + String value = StringUtil.notNullize(myResults.get(prop), getBackgroundSpec(myProject, prop)); String[] split = value.split(","); int opacity = split.length > 1 ? StringUtil.parseInt(split[1], 15) : 15; String fill = split.length > 2 ? split[2] : "scale"; @@ -295,7 +302,11 @@ public class SetBackgroundImageDialog extends DialogWrapper { myResults.put(prop, value); if (value.startsWith(",")) value = null; - PropertiesComponent.getInstance().setValue(prop, value); + + PropertiesComponent propertiesComponent = + myThisProjectOnlyCb.isSelected() ? + PropertiesComponent.getInstance(myProject) : PropertiesComponent.getInstance(); + propertiesComponent.setValue(prop, value); repaintAllWindows(); } diff --git a/images/src/org/intellij/images/statistics/BackgroundUsageCollector.java b/images/src/org/intellij/images/statistics/BackgroundImagesUsageCollector.java similarity index 54% rename from images/src/org/intellij/images/statistics/BackgroundUsageCollector.java rename to images/src/org/intellij/images/statistics/BackgroundImagesUsageCollector.java index 4465f9977a05..27e02287320c 100644 --- a/images/src/org/intellij/images/statistics/BackgroundUsageCollector.java +++ b/images/src/org/intellij/images/statistics/BackgroundImagesUsageCollector.java @@ -15,14 +15,16 @@ */ package org.intellij.images.statistics; +import com.intellij.internal.statistic.AbstractApplicationUsagesCollector; import com.intellij.internal.statistic.CollectUsagesException; -import com.intellij.internal.statistic.UsagesCollector; import com.intellij.internal.statistic.beans.GroupDescriptor; import com.intellij.internal.statistic.beans.UsageDescriptor; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import java.util.HashMap; import java.util.Set; import static com.intellij.openapi.wm.impl.IdeBackgroundUtil.*; @@ -30,7 +32,7 @@ import static com.intellij.openapi.wm.impl.IdeBackgroundUtil.*; /** * @author gregsh */ -public class BackgroundUsageCollector extends UsagesCollector { +public class BackgroundImagesUsageCollector extends AbstractApplicationUsagesCollector { @NotNull @Override public GroupDescriptor getGroupId() { @@ -40,9 +42,25 @@ public class BackgroundUsageCollector extends UsagesCollector { @NotNull @Override public Set getUsages() throws CollectUsagesException { - boolean editor = StringUtil.isNotEmpty(getBackgroundSpec(EDITOR_PROP)); - boolean ide = StringUtil.isNotEmpty(getBackgroundSpec(FRAME_PROP)); - return ContainerUtil.newHashSet(new UsageDescriptor("editor", editor ? 1 : 0), new UsageDescriptor("frame", ide ? 1 : 0)); + // join usages from all projects + HashMap map = ContainerUtil.newHashMap(); + for (UsageDescriptor descriptor : super.getUsages()) { + String key = descriptor.getKey(); + int idx = key.indexOf(' '); + key = idx > 0 ? key.substring(0, idx) : key; + UsageDescriptor existing = map.get(key); + if (existing == null || existing.getValue() == 0) { + map.put(key, new UsageDescriptor(key, descriptor.getValue())); + } + } + return ContainerUtil.newHashSet(map.values()); } + @NotNull + @Override + public Set getProjectUsages(@NotNull Project project) throws CollectUsagesException { + boolean editor = StringUtil.isNotEmpty(getBackgroundSpec(project, EDITOR_PROP)); + boolean frame = StringUtil.isNotEmpty(getBackgroundSpec(project, FRAME_PROP)); + return ContainerUtil.newHashSet(new UsageDescriptor("editor", editor ? 1 : 0), new UsageDescriptor("frame", frame ? 1 : 0)); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeBackgroundUtil.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeBackgroundUtil.java index 0d4f015c5b50..35ecb0f78963 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeBackgroundUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeBackgroundUtil.java @@ -27,6 +27,7 @@ import com.intellij.openapi.editor.ex.EditorGutterComponentEx; import com.intellij.openapi.editor.impl.EditorComponentImpl; import com.intellij.openapi.fileEditor.impl.EditorEmptyTextPainter; import com.intellij.openapi.fileEditor.impl.EditorsSplitters; +import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.AbstractPainter; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; @@ -163,8 +164,10 @@ public class IdeBackgroundUtil { } @NotNull - public static String getBackgroundSpec(@NotNull String propertyName) { - return StringUtil.notNullize(PropertiesComponent.getInstance().getValue(propertyName), System.getProperty(propertyName, "")); + public static String getBackgroundSpec(@Nullable Project project, @NotNull String propertyName) { + String spec = project == null ? null : PropertiesComponent.getInstance(project).getValue(propertyName); + if (spec == null) spec = PropertiesComponent.getInstance().getValue(propertyName); + return StringUtil.notNullize(spec, System.getProperty(propertyName, "")); } public static void repaintAllWindows() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/PaintersHelper.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/PaintersHelper.java index 878ead5989b9..ce89e12cc406 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/PaintersHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/PaintersHelper.java @@ -19,12 +19,14 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.AbstractPainter; import com.intellij.openapi.ui.GraphicsConfig; import com.intellij.openapi.ui.Painter; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.wm.IdeFrame; import com.intellij.util.ArrayUtil; import com.intellij.util.ImageLoader; import com.intellij.util.containers.ContainerUtil; @@ -163,12 +165,12 @@ final class PaintersHelper implements Painter.Listener { } public static void initWallpaperPainter(@NotNull String propertyName, @NotNull PaintersHelper painters) { - ModalityState modalityState = ModalityState.stateForComponent(painters.myRootComponent); - ImagePainter painter = (ImagePainter)newWallpaperPainter(propertyName, modalityState); + ImagePainter painter = (ImagePainter)newWallpaperPainter(propertyName, painters.myRootComponent); painters.addPainter(painter, null); } - private static AbstractPainter newWallpaperPainter(@NotNull final String propertyName, @NotNull final ModalityState modalityState) { + private static AbstractPainter newWallpaperPainter(@NotNull final String propertyName, + @NotNull final JComponent rootComponent) { return new ImagePainter() { Image image; float alpha; @@ -190,7 +192,9 @@ final class PaintersHelper implements Painter.Listener { } boolean ensureImageLoaded() { - String value = getBackgroundSpec(propertyName); + IdeFrame frame = UIUtil.getParentOfType(IdeFrame.class, rootComponent); + Project project = frame == null ? null : frame.getProject(); + String value = getBackgroundSpec(project, propertyName); if (!Comparing.equal(value, current)) { current = value; loadImageAsync(value); @@ -210,6 +214,7 @@ final class PaintersHelper implements Painter.Listener { place = newPlace; boolean newOk = newImage != null; if (prevOk || newOk) { + ModalityState modalityState = ModalityState.stateForComponent(rootComponent); if (modalityState.dominates(ModalityState.NON_MODAL)) { UIUtil.getActiveWindow().repaint(); } @@ -236,6 +241,7 @@ final class PaintersHelper implements Painter.Listener { : new File(PathManager.getConfigPath(), filePath)).toURI().toURL(); ApplicationManager.getApplication().executeOnPooledThread(() -> { final Image m = ImageLoader.loadFromUrl(url); + ModalityState modalityState = ModalityState.stateForComponent(rootComponent); ApplicationManager.getApplication().invokeLater(() -> resetImage(propertyValue, m, newAlpha, newFillType, newPlace), modalityState); }); }