blob: a4b7d9844383bc878c1b31b71b207f01dcc10aaf [file] [log] [blame]
/*
* Copyright 2000-2009 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 org.jetbrains.idea.svn.config;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.ui.InsertPathAction;
import org.jetbrains.idea.svn.SvnBundle;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.JTextComponent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ConfigureProxiesOptionsPanel implements RepositoryUrlsListener {
private JPanel myMainPanel;
private JTextField myServerField;
private JTextField myUserField;
private JTextField myPortField;
private JPasswordField myPasswordField;
private JTextArea myUrlPatterns;
private JTextArea myExceptions;
private JTextField myTimeoutField;
private JCheckBox myTrustDefaultCAsCheckBox;
private JPasswordField myClientCertificatePasswordField;
private JButton myTestConnectionButton;
private JTextField myPathToCertificatesField;
private TextFieldWithBrowseButton myClientCertificatePathField;
private JList myRepositoriesList;
private boolean myIsDefault;
private final Runnable myValidator;
// listens for patterns+exceptions changes on lost focus
private PatternsListener myPatternsListener;
private final Map<JComponent, String> myComponent2Key;
private final Map<String, JComponent> myKey2Component;
private final TestConnectionPerformer myTestConnectionPerformer;
/**
* called on after repositories list had been recalculated by {@link org.jetbrains.idea.svn.config.PatternsListener}
*
* @see org.jetbrains.idea.svn.config.RepositoryUrlsListener#onListChanged(java.util.List)
*/
public void onListChanged(final List<String> urls) {
final String value = (String) myRepositoriesList.getSelectedValue();
myRepositoriesList.removeAll();
myRepositoriesList.setListData(urls.toArray());
// for keeping selection
if (value != null) {
final ListModel model = myRepositoriesList.getModel();
for (int i = 0; i < model.getSize(); i++) {
final String element = (String) model.getElementAt(i);
if (value.equals(element)) {
myRepositoriesList.setSelectedIndex(i);
}
}
}
// in order to check for groups ambiguity + maybe highlight another error
myValidator.run();
}
public List<String> getRepositories() {
final ListModel model = myRepositoriesList.getModel();
final List<String> result = new ArrayList<String>(model.getSize());
for (int i = 0; i < model.getSize(); i++) {
result.add((String) model.getElementAt(i));
}
return result;
}
public JPanel getMainPanel() {
return myMainPanel;
}
public void setPatternsListener(final PatternsListener listener) {
myPatternsListener = listener;
}
public ConfigureProxiesOptionsPanel(final Runnable validator, final TestConnectionPerformer testConnectionPerformer) {
myValidator = validator;
myTestConnectionPerformer = testConnectionPerformer;
myComponent2Key = new HashMap<JComponent, String>();
myKey2Component = new HashMap<String, JComponent>();
fillMappings();
initNumericValidation();
initBrowseActions();
initRepositories();
putPatternsListener();
myTestConnectionButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
final String value = (String) myRepositoriesList.getSelectedValue();
if ((value != null) && (myTestConnectionPerformer.enabled())) {
myTestConnectionPerformer.execute(value);
}
}
});
}
private void putPatternsListener() {
final UrlsSetter urlsSetter = new UrlsSetter();
myUrlPatterns.addFocusListener(urlsSetter);
myExceptions.addFocusListener(urlsSetter);
}
private void initBrowseActions() {
InsertPathAction.addTo(myPathToCertificatesField, FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor());
myClientCertificatePathField.addBrowseFolderListener(
SvnBundle.message("dialog.edit.http.proxies.settings.dialog.select.ssl.client.certificate.path.title"),
null, null, new FileChooserDescriptor(true, false, false, false, false, false));
}
private void initNumericValidation() {
final NumericFieldsValidator numericFocusListener = new NumericFieldsValidator();
myPortField.addFocusListener(numericFocusListener);
myTimeoutField.addFocusListener(numericFocusListener);
}
private void initRepositories() {
final ListSelectionModel selectionModel = new DefaultListSelectionModel();
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myRepositoriesList.setSelectionModel(selectionModel);
myRepositoriesList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(final ListSelectionEvent e) {
myTestConnectionButton.setEnabled(myTestConnectionPerformer.enabled() && (myRepositoriesList.getSelectedValue() != null));
}
});
}
private void fillMappings() {
addToKeyMappings(myServerField, SvnServerFileKeys.SERVER);
addToKeyMappings(myUserField, SvnServerFileKeys.USER);
addToKeyMappings(myPortField, SvnServerFileKeys.PORT);
addToKeyMappings(myPasswordField, SvnServerFileKeys.PASSWORD);
addToKeyMappings(myExceptions, SvnServerFileKeys.EXCEPTIONS);
addToKeyMappings(myTimeoutField, SvnServerFileKeys.TIMEOUT);
addToKeyMappings(myTrustDefaultCAsCheckBox, SvnServerFileKeys.SSL_TRUST_DEFAULT_CA);
addToKeyMappings(myClientCertificatePasswordField, SvnServerFileKeys.SSL_CLIENT_CERT_PASSWORD);
addToKeyMappings(myPathToCertificatesField, SvnServerFileKeys.SSL_AUTHORITY_FILES);
addToKeyMappings(myClientCertificatePathField, SvnServerFileKeys.SSL_CLIENT_CERT_FILE);
}
private void addToKeyMappings(final JComponent component, final String key) {
myComponent2Key.put(component, key);
myKey2Component.put(key, component);
}
private class UrlsSetter implements FocusListener {
public void focusGained(final FocusEvent e) {
}
public void focusLost(final FocusEvent e) {
repositoryUrlsRecalculation();
}
}
private void repositoryUrlsRecalculation() {
if (! myIsDefault) {
myPatternsListener.onChange(myUrlPatterns.getText(), myExceptions.getText());
}
}
public void setIsValid(final boolean valid) {
myTestConnectionButton.setEnabled(valid && (myRepositoriesList.getSelectedValue() != null));
}
private class NumericFieldsValidator implements FocusListener {
public void focusGained(final FocusEvent e) {
}
public void focusLost(final FocusEvent e) {
myValidator.run();
}
}
public void setStringProperties(final Map<String, String> properties) {
for (Map.Entry<String, String> entry : properties.entrySet()) {
final JComponent component = myKey2Component.get(entry.getKey());
if (component != null) {
JTextComponent textComponent = null;
if (component instanceof JTextComponent) {
textComponent = (JTextComponent) component;
} else if (component instanceof TextFieldWithBrowseButton) {
textComponent = ((TextFieldWithBrowseButton) component).getTextField();
}
if (textComponent != null) {
textComponent.setText(entry.getValue());
textComponent.selectAll();
}
component.setToolTipText(entry.getKey());
}
}
myTrustDefaultCAsCheckBox.setSelected(booleanPropertySelected(properties.get(myComponent2Key.get(myTrustDefaultCAsCheckBox))));
repositoryUrlsRecalculation();
}
public void copyStringProperties(Map<String, String> map) {
for (Map.Entry<String, JComponent> entry : myKey2Component.entrySet()) {
final JComponent component = entry.getValue();
String value = null;
if (component instanceof JTextComponent) {
value = ((JTextComponent) component).getText();
} else if (component instanceof TextFieldWithBrowseButton) {
value = ((TextFieldWithBrowseButton) component).getTextField().getText();
} else if (component instanceof JCheckBox) {
value = ((JCheckBox) component).isSelected() ? "yes" : "no";
}
if ((value != null) && ((! "".equals(value)) || (map.containsKey(entry.getKey())))) {
map.put(entry.getKey(), value);
}
}
}
private static boolean booleanPropertySelected(final String value) {
return value != null && SvnServerFileKeys.YES_OPTIONS.contains(value.toLowerCase());
}
public boolean isDefault() {
return myIsDefault;
}
public void setIsDefaultGroup(final boolean value) {
myIsDefault = value;
myUrlPatterns.setEditable(! myIsDefault);
}
public String getPatterns() {
return myUrlPatterns.getText();
}
public void setPatterns(final String value) {
myUrlPatterns.setText(value);
repositoryUrlsRecalculation();
}
}