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