blob: a606a9ab899ce19d72e95ae1500d2d652aff24c7 [file] [log] [blame]
/*
* Copyright 2000-2013 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.openapi.vcs.configurable;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vcs.IssueNavigationConfiguration;
import com.intellij.openapi.vcs.IssueNavigationLink;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.ui.AnActionButton;
import com.intellij.ui.AnActionButtonRunnable;
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.table.JBTable;
import com.intellij.util.IconUtil;
import com.intellij.util.ui.ColumnInfo;
import com.intellij.util.ui.ListTableModel;
import com.intellij.xml.util.XmlStringUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author yole
*/
public class IssueNavigationConfigurationPanel extends JPanel implements SearchableConfigurable, Configurable.NoScroll {
private final JBTable myLinkTable;
private final Project myProject;
private List<IssueNavigationLink> myLinks;
private ListTableModel<IssueNavigationLink> myModel;
private final ColumnInfo<IssueNavigationLink, String> ISSUE_COLUMN = new ColumnInfo<IssueNavigationLink, String>(VcsBundle.message("issue.link.issue.column")) {
public String valueOf(IssueNavigationLink issueNavigationLink) {
return issueNavigationLink.getIssueRegexp();
}
};
private final ColumnInfo<IssueNavigationLink, String> LINK_COLUMN = new ColumnInfo<IssueNavigationLink, String>(VcsBundle.message("issue.link.link.column")) {
public String valueOf(IssueNavigationLink issueNavigationLink) {
return issueNavigationLink.getLinkRegexp();
}
};
public IssueNavigationConfigurationPanel(Project project) {
super(new BorderLayout());
myProject = project;
myLinkTable = new JBTable();
myLinkTable.getEmptyText().setText(VcsBundle.message("issue.link.no.patterns"));
reset();
add(new JLabel(
XmlStringUtil.wrapInHtml(ApplicationNamesInfo.getInstance().getFullProductName() + " will search for the specified patterns in " +
"checkin comments and link them to issues in your issue tracker:")), BorderLayout.NORTH);
add(
ToolbarDecorator.createDecorator(myLinkTable)
.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
IssueLinkConfigurationDialog dlg = new IssueLinkConfigurationDialog(myProject);
dlg.setTitle(VcsBundle.message("issue.link.add.title"));
dlg.show();
if (dlg.isOK()) {
myLinks.add(dlg.getLink());
myModel.fireTableDataChanged();
}
}
}).setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
if (Messages.showOkCancelDialog(myProject, VcsBundle.message("issue.link.delete.prompt"),
VcsBundle.message("issue.link.delete.title"), Messages.getQuestionIcon()) == Messages.OK) {
int selRow = myLinkTable.getSelectedRow();
myLinks.remove(selRow);
myModel.fireTableDataChanged();
if (myLinkTable.getRowCount() > 0) {
if (selRow >= myLinkTable.getRowCount()) {
selRow--;
}
myLinkTable.getSelectionModel().setSelectionInterval(selRow, selRow);
}
}
}
}).setEditAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
IssueNavigationLink link = myModel.getItem(myLinkTable.getSelectedRow());
IssueLinkConfigurationDialog dlg = new IssueLinkConfigurationDialog(myProject);
dlg.setTitle(VcsBundle.message("issue.link.edit.title"));
dlg.setLink(link);
dlg.show();
if (dlg.isOK()) {
final IssueNavigationLink editedLink = dlg.getLink();
link.setIssueRegexp(editedLink.getIssueRegexp());
link.setLinkRegexp(editedLink.getLinkRegexp());
myModel.fireTableDataChanged();
}
}
}).addExtraAction(new AnActionButton("Add JIRA Pattern", IconUtil.getAddJiraPatternIcon()) {
@Override
public void actionPerformed(AnActionEvent e) {
String s = Messages.showInputDialog(IssueNavigationConfigurationPanel.this, "Enter JIRA installation URL:",
"Add JIRA Issue Navigation Pattern", Messages.getQuestionIcon());
if (s == null) {
return;
}
if (!s.endsWith("/")) {
s += "/";
}
myLinks.add(new IssueNavigationLink("[A-Z]+\\-\\d+", s + "browse/$0"));
myModel.fireTableDataChanged();
}
}).addExtraAction(new AnActionButton("Add YouTrack Pattern", IconUtil.getAddYouTrackPatternIcon()) {
@Override
public void actionPerformed(AnActionEvent e) {
String s = Messages.showInputDialog(IssueNavigationConfigurationPanel.this, "Enter YouTrack installation URL:",
"Add YouTrack Issue Navigation Pattern", Messages.getQuestionIcon());
if (s == null) {
return;
}
if (!s.endsWith("/")) {
s += "/";
}
myLinks.add(new IssueNavigationLink("[A-Z]+\\-\\d+", s + "issue/$0"));
myModel.fireTableDataChanged();
}
}).setButtonComparator("Add", "Add JIRA Pattern", "Add YouTrack Pattern", "Edit", "Remove")
.disableUpDownActions().createPanel(), BorderLayout.CENTER);
}
public void apply() {
IssueNavigationConfiguration configuration = IssueNavigationConfiguration.getInstance(myProject);
configuration.setLinks(myLinks);
}
public boolean isModified() {
IssueNavigationConfiguration configuration = IssueNavigationConfiguration.getInstance(myProject);
return !myLinks.equals(configuration.getLinks());
}
public void reset() {
IssueNavigationConfiguration configuration = IssueNavigationConfiguration.getInstance(myProject);
myLinks = new ArrayList<IssueNavigationLink>();
for(IssueNavigationLink link: configuration.getLinks()) {
myLinks.add(new IssueNavigationLink(link.getIssueRegexp(), link.getLinkRegexp()));
}
myModel = new ListTableModel<IssueNavigationLink>(
new ColumnInfo[] { ISSUE_COLUMN, LINK_COLUMN },
myLinks,
0);
myLinkTable.setModel(myModel);
}
@Nls
public String getDisplayName() {
return "Issue Navigation";
}
public String getHelpTopic() {
return "project.propVCSSupport.Issue.Navigation";
}
@NotNull
public String getId() {
return getHelpTopic();
}
public Runnable enableSearch(String option) {
return null;
}
public JComponent createComponent() {
return this;
}
public void disposeUIResources() {
}
}