Commit bcdb1152 authored by Alexey Kudravtsev's avatar Alexey Kudravtsev
Browse files

a bit of defensive assertions to protect from user invalid input like in...

a bit of defensive assertions to protect from user invalid input like in IDEA-164286 IDE doesn't start after updating 2016.3
parent f652ef04
Branches unavailable Tags unavailable
No related merge requests found
Showing with 24 additions and 19 deletions
+24 -19
...@@ -23,16 +23,14 @@ import com.intellij.openapi.options.SearchableConfigurable; ...@@ -23,16 +23,14 @@ import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.options.ex.ConfigurableWrapper; import com.intellij.openapi.options.ex.ConfigurableWrapper;
import com.intellij.ui.components.JBRadioButton; import com.intellij.ui.components.JBRadioButton;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*; import java.awt.*;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
/** /**
* To provide additional options in General section register implementation of {@link com.intellij.openapi.options.SearchableConfigurable} in the plugin.xml: * To provide additional options in General section register implementation of {@link SearchableConfigurable} in the plugin.xml:
* <p/> * <p/>
* &lt;extensions defaultExtensionNs="com.intellij"&gt;<br> * &lt;extensions defaultExtensionNs="com.intellij"&gt;<br>
* &nbsp;&nbsp;&lt;generalOptionsProvider instance="class-name"/&gt;<br> * &nbsp;&nbsp;&lt;generalOptionsProvider instance="class-name"/&gt;<br>
...@@ -49,6 +47,7 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl ...@@ -49,6 +47,7 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl
myComponent = new MyComponent(); myComponent = new MyComponent();
} }
@Override
public void apply() throws ConfigurationException { public void apply() throws ConfigurationException {
super.apply(); super.apply();
GeneralSettings settings = GeneralSettings.getInstance(); GeneralSettings settings = GeneralSettings.getInstance();
...@@ -63,9 +62,9 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl ...@@ -63,9 +62,9 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl
settings.setAutoSaveIfInactive(myComponent.myChkAutoSaveIfInactive.isSelected()); settings.setAutoSaveIfInactive(myComponent.myChkAutoSaveIfInactive.isSelected());
try { try {
int newInactiveTimeout = Integer.parseInt(myComponent.myTfInactiveTimeout.getText()); int newInactiveTimeoutSeconds = Integer.parseInt(myComponent.myTfInactiveTimeout.getText());
if (newInactiveTimeout > 0) { if (newInactiveTimeoutSeconds > 0 && TimeUnit.SECONDS.toHours(newInactiveTimeoutSeconds) < 24) {
settings.setInactiveTimeout(newInactiveTimeout); settings.setInactiveTimeout(newInactiveTimeoutSeconds);
} }
} }
catch (NumberFormatException ignored) { } catch (NumberFormatException ignored) { }
...@@ -97,11 +96,11 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl ...@@ -97,11 +96,11 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl
} }
} }
@Override
public boolean isModified() { public boolean isModified() {
if (super.isModified()) return true; if (super.isModified()) return true;
boolean isModified = false;
GeneralSettings settings = GeneralSettings.getInstance(); GeneralSettings settings = GeneralSettings.getInstance();
isModified |= settings.isReopenLastProject() != myComponent.myChkReopenLastProject.isSelected(); boolean isModified = settings.isReopenLastProject() != myComponent.myChkReopenLastProject.isSelected();
isModified |= settings.isSupportScreenReaders() != myComponent.myChkSupportScreenReaders.isSelected(); isModified |= settings.isSupportScreenReaders() != myComponent.myChkSupportScreenReaders.isSelected();
isModified |= settings.isSyncOnFrameActivation() != myComponent.myChkSyncOnFrameActivation.isSelected(); isModified |= settings.isSyncOnFrameActivation() != myComponent.myChkSyncOnFrameActivation.isSelected();
isModified |= settings.isSaveOnFrameDeactivation() != myComponent.myChkSaveOnFrameDeactivation.isSelected(); isModified |= settings.isSaveOnFrameDeactivation() != myComponent.myChkSaveOnFrameDeactivation.isSelected();
...@@ -122,16 +121,14 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl ...@@ -122,16 +121,14 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl
return isModified; return isModified;
} }
@Override
public JComponent createComponent() { public JComponent createComponent() {
if (myComponent == null) { if (myComponent == null) {
myComponent = new MyComponent(); myComponent = new MyComponent();
} }
myComponent.myChkAutoSaveIfInactive.addChangeListener(new ChangeListener() { myComponent.myChkAutoSaveIfInactive.addChangeListener(
public void stateChanged(ChangeEvent e) { e -> myComponent.myTfInactiveTimeout.setEditable(myComponent.myChkAutoSaveIfInactive.isSelected()));
myComponent.myTfInactiveTimeout.setEditable(myComponent.myChkAutoSaveIfInactive.isSelected());
}
});
List<SearchableConfigurable> list = getConfigurables(); List<SearchableConfigurable> list = getConfigurables();
if (!list.isEmpty()) { if (!list.isEmpty()) {
...@@ -144,10 +141,12 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl ...@@ -144,10 +141,12 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl
return myComponent.myPanel; return myComponent.myPanel;
} }
@Override
public String getDisplayName() { public String getDisplayName() {
return IdeBundle.message("title.general"); return IdeBundle.message("title.general");
} }
@Override
public void reset() { public void reset() {
super.reset(); super.reset();
GeneralSettings settings = GeneralSettings.getInstance(); GeneralSettings settings = GeneralSettings.getInstance();
...@@ -184,11 +183,13 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl ...@@ -184,11 +183,13 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl
} }
} }
@Override
public void disposeUIResources() { public void disposeUIResources() {
super.disposeUIResources(); super.disposeUIResources();
myComponent = null; myComponent = null;
} }
@Override
@NotNull @NotNull
public String getHelpTopic() { public String getHelpTopic() {
return "preferences.general"; return "preferences.general";
...@@ -215,11 +216,13 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl ...@@ -215,11 +216,13 @@ public class GeneralSettingsConfigurable extends CompositeConfigurable<Searchabl
public MyComponent() { } public MyComponent() { }
} }
@Override
@NotNull @NotNull
public String getId() { public String getId() {
return getHelpTopic(); return getHelpTopic();
} }
@Override
protected List<SearchableConfigurable> createConfigurables() { protected List<SearchableConfigurable> createConfigurables() {
return ConfigurableWrapper.createConfigurables(EP_NAME); return ConfigurableWrapper.createConfigurables(EP_NAME);
} }
......
...@@ -60,6 +60,7 @@ import java.lang.reflect.Field; ...@@ -60,6 +60,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.*; import java.util.*;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
/** /**
...@@ -235,14 +236,15 @@ public class IdeEventQueue extends EventQueue { ...@@ -235,14 +236,15 @@ public class IdeEventQueue extends EventQueue {
} }
} }
public void addIdleListener(@NotNull final Runnable runnable, final int timeoutMillis) {
public void addIdleListener(@NotNull final Runnable runnable, final int timeout) { if(timeoutMillis <= 0 || TimeUnit.MILLISECONDS.toHours(timeoutMillis) >= 24) {
LOG.assertTrue(timeout > 0); throw new IllegalArgumentException("This timeout value is unsupported: " + timeoutMillis);
}
synchronized (myLock) { synchronized (myLock) {
myIdleListeners.add(runnable); myIdleListeners.add(runnable);
final MyFireIdleRequest request = new MyFireIdleRequest(runnable, timeout); final MyFireIdleRequest request = new MyFireIdleRequest(runnable, timeoutMillis);
myListener2Request.put(runnable, request); myListener2Request.put(runnable, request);
UIUtil.invokeLaterIfNeeded(() -> myIdleRequestsAlarm.addRequest(request, timeout)); UIUtil.invokeLaterIfNeeded(() -> myIdleRequestsAlarm.addRequest(request, timeoutMillis));
} }
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment