platform: handling of file-based index initialization errors caused by extensions
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / updateSettings / impl / PluginUpdateInfoDialog.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.updateSettings.impl;
17
18 import com.intellij.ide.IdeBundle;
19 import com.intellij.ide.plugins.PluginManagerMain;
20 import com.intellij.openapi.application.ApplicationManager;
21 import com.intellij.openapi.application.ModalityState;
22 import com.intellij.openapi.progress.ProgressIndicator;
23 import com.intellij.openapi.progress.ProgressManager;
24 import com.intellij.openapi.progress.Task;
25 import com.intellij.openapi.util.Condition;
26 import com.intellij.ui.TableUtil;
27 import com.intellij.util.containers.ContainerUtil;
28 import org.jetbrains.annotations.NotNull;
29
30 import javax.swing.*;
31 import java.awt.*;
32 import java.util.Collection;
33 import java.util.Set;
34
35 /**
36  * @author pti
37  */
38 class PluginUpdateInfoDialog extends AbstractUpdateDialog {
39   private final Collection<PluginDownloader> myUploadedPlugins;
40   private final boolean myPlatformUpdate;
41
42   public PluginUpdateInfoDialog(Collection<PluginDownloader> uploadedPlugins, boolean enableLink) {
43     super(enableLink);
44     myUploadedPlugins = uploadedPlugins;
45     myPlatformUpdate = false;
46     init();
47   }
48
49   /**
50    * Used from {@link UpdateInfoDialog} when both platform and plugin updates are available.
51    */
52   PluginUpdateInfoDialog(Component parent, @NotNull Collection<PluginDownloader> updatePlugins) {
53     super(parent, false);
54     myUploadedPlugins = updatePlugins;
55     myPlatformUpdate = true;
56     init();
57   }
58
59   @Override
60   protected JComponent createCenterPanel() {
61     return new PluginUpdateInfoPanel().myPanel;
62   }
63
64   @Override
65   protected String getOkButtonText() {
66     if (!myPlatformUpdate) {
67       return IdeBundle.message("update.plugins.update.action");
68     }
69     else {
70       boolean canRestart = ApplicationManager.getApplication().isRestartCapable();
71       return IdeBundle.message(canRestart ? "update.restart.plugins.update.action" : "update.shutdown.plugins.update.action");
72     }
73   }
74
75   @Override
76   protected void doOKAction() {
77     super.doOKAction();
78
79     ProgressManager.getInstance().run(new Task.Modal(null, IdeBundle.message("progress.downloading.plugins"), true) {
80       @Override
81       public void run(@NotNull ProgressIndicator indicator) {
82         UpdateChecker.saveDisabledToUpdatePlugins();
83         boolean updated = UpdateChecker.installPluginUpdates(myUploadedPlugins, indicator);
84         if (updated && !myPlatformUpdate) {
85           ApplicationManager.getApplication().invokeLater(new Runnable() {
86             @Override
87             public void run() {
88               PluginManagerMain.notifyPluginsUpdated(null);
89             }
90           }, ModalityState.NON_MODAL);
91         }
92       }
93     });
94   }
95
96   private class PluginUpdateInfoPanel {
97     private JPanel myPanel;
98     private JLabel myPluginsToUpdateLabel;
99     private JPanel myPluginsPanel;
100     private JEditorPane myMessageArea;
101
102     public PluginUpdateInfoPanel() {
103       myPluginsToUpdateLabel.setVisible(true);
104       myPluginsPanel.setVisible(true);
105
106       final DetectedPluginsPanel foundPluginsPanel = new DetectedPluginsPanel();
107       foundPluginsPanel.addAll(myUploadedPlugins);
108       TableUtil.ensureSelectionExists(foundPluginsPanel.getEntryTable());
109       foundPluginsPanel.addStateListener(new DetectedPluginsPanel.Listener() {
110         @Override
111         public void stateChanged() {
112           final Set<String> skipped = foundPluginsPanel.getSkippedPlugins();
113           final PluginDownloader any = ContainerUtil.find(myUploadedPlugins, new Condition<PluginDownloader>() {
114             @Override
115             public boolean value(PluginDownloader plugin) {
116               return !skipped.contains(plugin.getPluginId());
117             }
118           });
119           getOKAction().setEnabled(any != null);
120         }
121       });
122       myPluginsPanel.add(foundPluginsPanel, BorderLayout.CENTER);
123
124       configureMessageArea(myMessageArea);
125     }
126   }
127 }