/*
* Copyright 2012 Anchialas.
*
* 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 com.kenai.redminenb.options;
import com.kenai.redminenb.RedmineConfig;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeSupport;
import javax.swing.JComponent;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
/**
* RedmineOptionsController
*
* @author Anchialas <anchialas@gmail.com>
*/
@NbBundle.Messages({
"MSG_INVALID_VALUE=Invalid value.",
"MSG_MUST_BE_GREATER_THEN_5=Must be a number greater then 5."
})
public final class RedmineOptionsController extends OptionsPanelController implements DocumentListener {
private final RedmineOptionsPanel panel;
private final PropertyChangeSupport support = new PropertyChangeSupport(this);
private boolean valid = false;
public RedmineOptionsController() {
panel = new RedmineOptionsPanel();
panel.errorLabel.setText(null);
}
@Override
public void update() {
panel.issuesTextField.getDocument().removeDocumentListener(this); // #163955 - do not fire change events on load
panel.queriesTextField.getDocument().removeDocumentListener(this);
panel.issuesTextField.setText(RedmineConfig.getInstance().getIssueRefreshInterval() + ""); // NOI18N
panel.queriesTextField.setText(RedmineConfig.getInstance().getQueryRefreshInterval() + ""); // NOI18N
panel.issuesTextField.getDocument().addDocumentListener(this);
panel.queriesTextField.getDocument().addDocumentListener(this);
}
@Override
public void applyChanges() {
String queryRefresh = panel.queriesTextField.getText().trim();
int r = queryRefresh.equals("") ? 0 : Integer.parseInt(queryRefresh); // NOI18N
RedmineConfig.getInstance().setQueryRefreshInterval(r);
String issueRefresh = panel.issuesTextField.getText().trim();
r = issueRefresh.equals("") ? 0 : Integer.parseInt(issueRefresh); // NOI18N
RedmineConfig.getInstance().setIssueRefreshInterval(r);
}
@Override
public void cancel() {
update();
}
@Override
public boolean isValid() {
validate(false);
return valid;
}
private boolean isValidRefreshValue(String s) {
if (!s.equals("")) { // NOI18N
try {
int i = Integer.parseInt(s);
if (i < 5) {
panel.errorLabel.setText(NbBundle.getMessage(RedmineOptionsController.class, "MSG_MUST_BE_GREATER_THEN_5"));
return false;
}
} catch (NumberFormatException e) {
panel.errorLabel.setText(NbBundle.getMessage(RedmineOptionsController.class, "MSG_INVALID_VALUE"));
return false;
}
}
return true;
}
@Override
public boolean isChanged() {
return !panel.issuesTextField.getText().trim().equals(RedmineConfig.getInstance().getIssueRefreshInterval() + "") || // NOI18N
!panel.queriesTextField.getText().trim().equals(RedmineConfig.getInstance().getQueryRefreshInterval() + ""); // NOI18N
}
@Override
public org.openide.util.HelpCtx getHelpCtx() {
return HelpCtx.DEFAULT_HELP;
}
@Override
public JComponent getComponent(org.openide.util.Lookup masterLookup) {
return panel;
}
@Override
public void addPropertyChangeListener(java.beans.PropertyChangeListener l) {
support.addPropertyChangeListener(l);
}
@Override
public void removePropertyChangeListener(java.beans.PropertyChangeListener l) {
support.removePropertyChangeListener(l);
}
@Override
public void insertUpdate(DocumentEvent e) {
validate(true);
}
@Override
public void removeUpdate(DocumentEvent e) {
validate(true);
}
@Override
public void changedUpdate(DocumentEvent e) {
validate(true);
}
private void validate(boolean fireEvents) {
boolean oldValid = valid;
panel.errorLabel.setVisible(false);
panel.errorLabel.setText(""); // NOI18N
String queryRefresh = panel.queriesTextField.getText().trim();
String issueRefresh = panel.issuesTextField.getText().trim();
valid = isValidRefreshValue(queryRefresh)
&& isValidRefreshValue(issueRefresh);
panel.errorLabel.setVisible(!valid);
if (fireEvents && oldValid != valid) {
support.firePropertyChange(new PropertyChangeEvent(this, OptionsPanelController.PROP_VALID, oldValid, valid));
}
}
}