b179036d36ef4e20bafffa8789a6909d7ec200ec
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / updateSettings / impl / UpdateSettingsConfigurable.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.DataManager;
19 import com.intellij.ide.IdeBundle;
20 import com.intellij.openapi.actionSystem.CommonDataKeys;
21 import com.intellij.openapi.application.ApplicationInfo;
22 import com.intellij.openapi.application.ApplicationManager;
23 import com.intellij.openapi.options.BaseConfigurable;
24 import com.intellij.openapi.options.Configurable;
25 import com.intellij.openapi.options.ConfigurationException;
26 import com.intellij.openapi.options.SearchableConfigurable;
27 import com.intellij.openapi.project.Project;
28 import com.intellij.openapi.util.SystemInfo;
29 import com.intellij.ui.CollectionComboBoxModel;
30 import com.intellij.util.net.NetUtils;
31 import com.intellij.util.text.DateFormatUtil;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34
35 import javax.swing.*;
36 import java.awt.event.ActionEvent;
37 import java.awt.event.ActionListener;
38
39 /**
40  * @author pti
41  */
42 public class UpdateSettingsConfigurable extends BaseConfigurable implements SearchableConfigurable, Configurable.NoScroll {
43   private UpdatesSettingsPanel myUpdatesSettingsPanel;
44   private boolean myCheckNowEnabled = true;
45
46   public void setCheckNowEnabled(boolean enabled) {
47     myCheckNowEnabled = enabled;
48   }
49
50   @Override
51   public JComponent createComponent() {
52     myUpdatesSettingsPanel = new UpdatesSettingsPanel();
53     myUpdatesSettingsPanel.myCheckNow.setVisible(myCheckNowEnabled);
54     return myUpdatesSettingsPanel.myPanel;
55   }
56
57   @Override
58   public String getDisplayName() {
59     return IdeBundle.message("updates.settings.title");
60   }
61
62   @NotNull
63   @Override
64   public String getHelpTopic() {
65     return "preferences.updates";
66   }
67
68   @NotNull
69   public String getId() {
70     return getHelpTopic();
71   }
72
73   @Nullable
74   @Override
75   public Runnable enableSearch(String option) {
76     return null;
77   }
78
79   @Override
80   public void apply() throws ConfigurationException {
81     UpdateSettings settings = UpdateSettings.getInstance();
82
83     boolean wasEnabled = settings.CHECK_NEEDED;
84     settings.CHECK_NEEDED = myUpdatesSettingsPanel.myCheckForUpdates.isSelected();
85     if (wasEnabled != settings.CHECK_NEEDED) {
86       UpdateCheckerComponent checker = ApplicationManager.getApplication().getComponent(UpdateCheckerComponent.class);
87       if (checker != null) {
88         if (wasEnabled) {
89           checker.cancelChecks();
90         }
91         else {
92           checker.queueNextCheck();
93         }
94       }
95     }
96
97     settings.UPDATE_CHANNEL_TYPE = myUpdatesSettingsPanel.getSelectedChannelType().getCode();
98     settings.SECURE_CONNECTION = myUpdatesSettingsPanel.myUseSecureConnection.isSelected();
99   }
100
101   @Override
102   public void reset() {
103     UpdateSettings settings = UpdateSettings.getInstance();
104     myUpdatesSettingsPanel.myCheckForUpdates.setSelected(settings.CHECK_NEEDED);
105     myUpdatesSettingsPanel.myUseSecureConnection.setSelected(settings.SECURE_CONNECTION);
106     myUpdatesSettingsPanel.updateLastCheckedLabel();
107     myUpdatesSettingsPanel.setSelectedChannelType(ChannelStatus.fromCode(settings.UPDATE_CHANNEL_TYPE));
108   }
109
110   @Override
111   public boolean isModified() {
112     if (myUpdatesSettingsPanel == null) return false;
113     UpdateSettings settings = UpdateSettings.getInstance();
114     if (settings.CHECK_NEEDED != myUpdatesSettingsPanel.myCheckForUpdates.isSelected()) return true;
115     if (settings.SECURE_CONNECTION != myUpdatesSettingsPanel.myUseSecureConnection.isSelected()) return true;
116     Object channel = myUpdatesSettingsPanel.myUpdateChannels.getSelectedItem();
117     return channel != null && !channel.equals(ChannelStatus.fromCode(settings.UPDATE_CHANNEL_TYPE));
118   }
119
120   @Override
121   public void disposeUIResources() {
122     myUpdatesSettingsPanel = null;
123   }
124
125   private static class UpdatesSettingsPanel {
126     private JPanel myPanel;
127     private JButton myCheckNow;
128     private JCheckBox myCheckForUpdates;
129     private JLabel myBuildNumber;
130     private JLabel myVersionNumber;
131     private JLabel myLastCheckedDate;
132     private JComboBox myUpdateChannels;
133     private JCheckBox myUseSecureConnection;
134
135     public UpdatesSettingsPanel() {
136       ApplicationInfo appInfo = ApplicationInfo.getInstance();
137       String majorVersion = appInfo.getMajorVersion();
138       String versionNumber = "";
139       if (majorVersion != null && majorVersion.trim().length() > 0) {
140         String minorVersion = appInfo.getMinorVersion();
141         if (minorVersion != null && minorVersion.trim().length() > 0) {
142           versionNumber = majorVersion + "." + minorVersion;
143         }
144         else {
145           versionNumber = majorVersion + ".0";
146         }
147       }
148       myVersionNumber.setText(appInfo.getVersionName() + " " + versionNumber);
149       myBuildNumber.setText(appInfo.getBuild().asString());
150
151       myCheckNow.addActionListener(new ActionListener() {
152         public void actionPerformed(ActionEvent e) {
153           Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(myCheckNow));
154           UpdateSettings settings = new UpdateSettings();
155           settings.loadState(UpdateSettings.getInstance().getState());
156           settings.UPDATE_CHANNEL_TYPE = getSelectedChannelType().getCode();
157           settings.SECURE_CONNECTION = myUseSecureConnection.isSelected();
158           UpdateChecker.updateAndShowResult(project, settings);
159           updateLastCheckedLabel();
160         }
161       });
162
163       LabelTextReplacingUtil.replaceText(myPanel);
164
165       UpdateSettings settings = UpdateSettings.getInstance();
166       //noinspection unchecked
167       myUpdateChannels.setModel(new CollectionComboBoxModel(ChannelStatus.all(), ChannelStatus.fromCode(settings.UPDATE_CHANNEL_TYPE)));
168
169       if (!NetUtils.isSniEnabled()) {
170         myUseSecureConnection.setEnabled(false);
171         boolean tooOld = !SystemInfo.isJavaVersionAtLeast("1.7");
172         String message = IdeBundle.message(tooOld ? "update.sni.not.available.notification" : "update.sni.disabled.notification");
173         myUseSecureConnection.setToolTipText(message);
174       }
175     }
176
177     private void updateLastCheckedLabel() {
178       long time = UpdateSettings.getInstance().LAST_TIME_CHECKED;
179       myLastCheckedDate.setText(time == 0 ? IdeBundle.message("updates.last.check.never") : DateFormatUtil.formatPrettyDateTime(time));
180     }
181
182     public ChannelStatus getSelectedChannelType() {
183       return (ChannelStatus) myUpdateChannels.getSelectedItem();
184     }
185
186     public void setSelectedChannelType(ChannelStatus channelType) {
187       myUpdateChannels.setSelectedItem(channelType != null ? channelType : ChannelStatus.RELEASE);
188     }
189   }
190 }