/*
* Copyright 2000-2006 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.communicator.idea.config;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.util.containers.HashSet;
import jetbrains.communicator.OptionFlag;
import jetbrains.communicator.commands.ClearHistoryCommand;
import jetbrains.communicator.core.IDEtalkOptions;
import jetbrains.communicator.core.Pico;
import jetbrains.communicator.core.commands.UserCommand;
import jetbrains.communicator.core.users.SettingsChanged;
import jetbrains.communicator.idea.actions.BaseAction;
import jetbrains.communicator.idea.monitor.UserActivityMonitor;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Set;
/**
* @author Kir
*/
public class IDEtalkConfiguration implements Configurable {
private JPanel myPanel;
private JCheckBox myHideOffline;
private JCheckBox myExpand;
private JCheckBox myActivateWindow;
private JCheckBox myHideMyFiles;
private JCheckBox myUserEnterKeyToCheckBox;
private JCheckBox myShowPopup;
private JButton myClearHistory;
private JSpinner myTimeoutAway;
private JSpinner myTimeoutXA;
private JCheckBox myPlaySoundCheckBox;
private final Set<Pair<JCheckBox, OptionFlag>> myFlags = new HashSet<>();
private final Project myProject;
private final IDEtalkOptions myOptions;
public IDEtalkConfiguration(final Project project) {
myProject = project;
myFlags.add(Pair.create(myHideOffline, OptionFlag.OPTION_HIDE_OFFLINE_USERS));
myFlags.add(Pair.create(myPlaySoundCheckBox, IdeaFlags.SOUND_ON_MESSAGE));
myFlags.add(Pair.create(myExpand, IdeaFlags.EXPAND_ON_MESSAGE));
myFlags.add(Pair.create(myActivateWindow, IdeaFlags.ACTIVATE_WINDOW_ON_MESSAGE));
myFlags.add(Pair.create(myHideMyFiles, OptionFlag.HIDE_ALL_KEY));
myFlags.add(Pair.create(myUserEnterKeyToCheckBox, IdeaFlags.USE_ENTER_FOR_MESSAGES));
myFlags.add(Pair.create(myShowPopup, IdeaFlags.POPUP_ON_MESSAGE));
myOptions = Pico.getOptions();
final UserCommand command = Pico.getCommandManager().getCommand(
ClearHistoryCommand.class, BaseAction.getContainer(project));
myClearHistory.setEnabled(command.isEnabled());
myClearHistory.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
command.execute();
myClearHistory.setEnabled(command.isEnabled());
}
});
}
private void setTimoutModel(JSpinner spinner, String option, int defaultValue) {
double value = myOptions.getNumber(option, defaultValue);
spinner.setModel(new SpinnerNumberModel(value, 0.0, 9999, 1.0));
}
public void apply() throws ConfigurationException {
for (Pair<JCheckBox, OptionFlag> option : myFlags) {
option.getSecond().change(option.getFirst().isSelected());
}
update(myTimeoutAway, IDEtalkOptions.TIMEOUT_AWAY_MIN);
update(myTimeoutXA, IDEtalkOptions.TIMEOUT_XA_MIN);
Pico.getEventBroadcaster().fireEvent(new SettingsChanged());
}
private void update(JSpinner spinner, String option) {
Number value = (Number) spinner.getValue();
myOptions.setNumber(option, value.doubleValue());
}
public JComponent createComponent() {
return myPanel;
}
public void disposeUIResources() {
}
public boolean isModified() {
for (Pair<JCheckBox, OptionFlag> option : myFlags) {
if (option.getSecond().isSet() ^ option.getFirst().isSelected()) {
return true;
}
}
return timoutModified(myTimeoutAway, IDEtalkOptions.TIMEOUT_AWAY_MIN, UserActivityMonitor.AWAY_MINS) ||
timoutModified(myTimeoutXA, IDEtalkOptions.TIMEOUT_XA_MIN, UserActivityMonitor.EXTENDED_AWAY_MINS);
}
private boolean timoutModified(JSpinner spinner, String optionName, int defaultValue) {
Number value = (Number) spinner.getValue();
return Math.abs(value.doubleValue() - myOptions.getNumber(optionName, defaultValue)) > 0.01;
}
public void reset() {
for (Pair<JCheckBox, OptionFlag> option : myFlags) {
option.getFirst().setSelected(option.getSecond().isSet());
}
setTimoutModel(myTimeoutAway, IDEtalkOptions.TIMEOUT_AWAY_MIN, UserActivityMonitor.AWAY_MINS);
setTimoutModel(myTimeoutXA, IDEtalkOptions.TIMEOUT_XA_MIN, UserActivityMonitor.EXTENDED_AWAY_MINS);
}
public String getDisplayName() {
//noinspection HardCodedStringLiteral
return "IDEtalk Options";
}
@Nullable
@NonNls
public String getHelpTopic() {
return "reference.dialogs.idetalk";
}
public void edit() {
ShowSettingsUtil.getInstance().editConfigurable(myProject, this);
}
}