com.intellij.tasks.config.BaseRepositoryEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.tasks.config.BaseRepositoryEditor.java

Source

/*
 * Copyright 2000-2010 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 com.intellij.tasks.config;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.annotation.Nullable;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.event.DocumentEvent;

import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.tasks.TaskManager;
import com.intellij.tasks.TaskRepository;
import com.intellij.tasks.impl.BaseRepository;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.EditorTextField;
import com.intellij.ui.PanelWithAnchor;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBTabbedPane;
import com.intellij.util.Consumer;
import com.intellij.util.net.HttpConfigurable;
import com.intellij.util.net.HttpProxyConfigurable;

/**
 * @author Dmitry Avdeev
 */
public class BaseRepositoryEditor<T extends BaseRepository> extends TaskRepositoryEditor
        implements PanelWithAnchor {

    protected JBLabel myUrlLabel;
    protected JTextField myURLText;
    protected JTextField myUserNameText;
    protected JBLabel myUsernameLabel;
    protected JCheckBox myShareUrlCheckBox;
    protected JPasswordField myPasswordText;
    protected JBLabel myPasswordLabel;

    protected JButton myTestButton;
    private JPanel myPanel;
    private JBCheckBox myUseProxy;
    private JButton myProxySettingsButton;
    protected JCheckBox myUseHttpAuthenticationCheckBox;

    protected JPanel myCustomPanel;
    private JBCheckBox myAddCommitMessage;
    private JBLabel myComment;
    private JPanel myEditorPanel;
    protected JBCheckBox myLoginAnonymouslyJBCheckBox;
    protected JBTabbedPane myTabbedPane;
    private JTextPane myAdvertiser;

    private boolean myApplying;
    protected Project myProject;
    protected final T myRepository;
    private final Consumer<T> myChangeListener;
    private final Document myDocument;
    private final Editor myEditor;
    private JComponent myAnchor;

    public BaseRepositoryEditor(final Project project, final T repository, Consumer<T> changeListener) {
        myProject = project;
        myRepository = repository;
        myChangeListener = changeListener;

        myTestButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                afterTestConnection(TaskManager.getManager(project).testConnection(repository));
            }
        });

        myProxySettingsButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ShowSettingsUtil.getInstance().editConfigurable(myProject, new HttpProxyConfigurable())
                        .doWhenRejected(() -> enableButtons());
            }
        });

        myURLText.setText(repository.getUrl());
        myUserNameText.setText(repository.getUsername());
        myPasswordText.setText(repository.getPassword());
        myShareUrlCheckBox.setSelected(repository.isShared());
        myUseProxy.setSelected(repository.isUseProxy());

        myUseHttpAuthenticationCheckBox.setSelected(repository.isUseHttpAuthentication());
        myUseHttpAuthenticationCheckBox.setVisible(repository.isSupported(TaskRepository.BASIC_HTTP_AUTHORIZATION));

        myLoginAnonymouslyJBCheckBox.setVisible(repository.isSupported(TaskRepository.LOGIN_ANONYMOUSLY));
        myLoginAnonymouslyJBCheckBox.setSelected(repository.isLoginAnonymously());
        myLoginAnonymouslyJBCheckBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent e) {
                loginAnonymouslyChanged(!myLoginAnonymouslyJBCheckBox.isSelected());
            }
        });

        myAddCommitMessage.setSelected(repository.isShouldFormatCommitMessage());
        myDocument = EditorFactory.getInstance().createDocument(repository.getCommitMessageFormat());
        myEditor = EditorFactory.getInstance().createEditor(myDocument);
        myEditorPanel.add(myEditor.getComponent(), BorderLayout.CENTER);
        myComment.setText("Available placeholders: " + repository.getComment());
        String advertiser = repository.getRepositoryType().getAdvertiser();
        if (advertiser != null) {
            Messages.installHyperlinkSupport(myAdvertiser);
            myAdvertiser.setText(advertiser);
        } else {
            myAdvertiser.setVisible(false);
        }

        installListener(myAddCommitMessage);
        installListener(myDocument);

        installListener(myURLText);
        installListener(myUserNameText);
        installListener(myPasswordText);

        installListener(myShareUrlCheckBox);
        installListener(myUseProxy);
        installListener(myUseHttpAuthenticationCheckBox);
        installListener(myLoginAnonymouslyJBCheckBox);

        enableButtons();

        JComponent customPanel = createCustomPanel();
        if (customPanel != null) {
            myCustomPanel.add(customPanel, BorderLayout.CENTER);
        }

        setAnchor(myUseProxy);
        loginAnonymouslyChanged(!myLoginAnonymouslyJBCheckBox.isSelected());
    }

    protected final void updateCustomPanel() {
        myCustomPanel.removeAll();
        JComponent customPanel = createCustomPanel();
        if (customPanel != null) {
            myCustomPanel.add(customPanel, BorderLayout.CENTER);
        }
        myCustomPanel.repaint();
    }

    private void loginAnonymouslyChanged(boolean enabled) {
        myUsernameLabel.setEnabled(enabled);
        myUserNameText.setEnabled(enabled);
        myPasswordLabel.setEnabled(enabled);
        myPasswordText.setEnabled(enabled);
        myUseHttpAuthenticationCheckBox.setEnabled(enabled);
    }

    @Nullable
    protected JComponent createCustomPanel() {
        return null;
    }

    protected void afterTestConnection(final boolean connectionSuccessful) {
    }

    protected void enableButtons() {
        myUseProxy.setEnabled(HttpConfigurable.getInstance().USE_HTTP_PROXY);
        if (!HttpConfigurable.getInstance().USE_HTTP_PROXY) {
            myUseProxy.setSelected(false);
        }
    }

    protected void installListener(JCheckBox checkBox) {
        checkBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                doApply();
            }
        });
    }

    protected void installListener(JTextField textField) {
        textField.getDocument().addDocumentListener(new DocumentAdapter() {
            @Override
            protected void textChanged(DocumentEvent e) {
                ApplicationManager.getApplication().invokeLater(new Runnable() {
                    public void run() {
                        doApply();
                    }
                });
            }
        });
    }

    protected void installListener(JComboBox comboBox) {
        comboBox.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(final ItemEvent e) {
                doApply();
            }
        });
    }

    protected void installListener(final Document document) {
        document.addDocumentListener(new com.intellij.openapi.editor.event.DocumentAdapter() {
            @Override
            public void documentChanged(com.intellij.openapi.editor.event.DocumentEvent e) {
                doApply();
            }
        });
    }

    protected void installListener(EditorTextField editor) {
        installListener(editor.getDocument());
    }

    protected void doApply() {
        if (!myApplying) {
            try {
                myApplying = true;
                apply();
            } finally {
                myApplying = false;
            }
        }
    }

    public JComponent createComponent() {
        return myPanel;
    }

    @Override
    public JComponent getPreferredFocusedComponent() {
        return myURLText;
    }

    @Override
    public void dispose() {
        EditorFactory.getInstance().releaseEditor(myEditor);
    }

    public void apply() {

        myRepository.setUrl(myURLText.getText().trim());
        myRepository.setUsername(myUserNameText.getText().trim());
        //noinspection deprecation
        myRepository.setPassword(myPasswordText.getText());
        myRepository.setShared(myShareUrlCheckBox.isSelected());
        myRepository.setUseProxy(myUseProxy.isSelected());
        myRepository.setUseHttpAuthentication(myUseHttpAuthenticationCheckBox.isSelected());
        myRepository.setLoginAnonymously(myLoginAnonymouslyJBCheckBox.isSelected());

        myRepository.setShouldFormatCommitMessage(myAddCommitMessage.isSelected());
        myRepository.setCommitMessageFormat(myDocument.getText());

        myChangeListener.consume(myRepository);
    }

    @Override
    public JComponent getAnchor() {
        return myAnchor;
    }

    @Override
    public void setAnchor(@Nullable final JComponent anchor) {
        myAnchor = anchor;
        myUrlLabel.setAnchor(anchor);
        myUsernameLabel.setAnchor(anchor);
        myPasswordLabel.setAnchor(anchor);
        myUseProxy.setAnchor(anchor);
    }
}