blob: 1df5567910e910196dfc4b38347c3098366006e9 [file] [log] [blame]
/*
* Copyright 2000-2012 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.
*/
/*
* Created by IntelliJ IDEA.
* User: Alexander.Kitaev
* Date: 19.07.2006
* Time: 16:51:09
*/
package org.jetbrains.idea.svn.dialogs.browser;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.DocumentAdapter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.SvnBundle;
import org.jetbrains.idea.svn.SvnVcs;
import org.jetbrains.idea.svn.dialogs.RepositoryBrowserComponent;
import org.jetbrains.idea.svn.dialogs.RepositoryTreeNode;
import org.tmatesoft.svn.core.SVNURL;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
public class DiffOptionsDialog extends DialogWrapper implements ActionListener {
private final SVNURL myURL;
private final Project myProject;
private RepositoryBrowserComponent myBrowser;
private final SVNURL myRootURL;
private JRadioButton myUnifiedDiffButton;
private JRadioButton myUIDiffButton;
private TextFieldWithBrowseButton myFileBrowser;
private JCheckBox myReverseDiffButton;
private JLabel mySourceUrlLabel;
private JPanel myMainPanel;
private JLabel myErrorLabel;
@NonNls private static final String DEFAULT_PATCH_NAME = "diff.txt";
public DiffOptionsDialog(Project project, SVNURL rootURL, SVNURL url) {
super(project, true);
myURL = url;
myRootURL = rootURL;
myProject = project;
setTitle(SvnBundle.message("diff.options.title"));
mySourceUrlLabel.setText(myURL.toString());
myBrowser.setRepositoryURL(myRootURL, false);
myBrowser.addChangeListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
update();
}
});
myUIDiffButton.addActionListener(this);
myUnifiedDiffButton.addActionListener(this);
init();
myFileBrowser.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
File f = selectFile("Patch File", "Select file to store unified diff");
if (f != null) {
if (f.exists() && f.isDirectory()) {
f = new File(f, DEFAULT_PATCH_NAME);
}
myFileBrowser.setText(f.getAbsolutePath());
}
}
});
myFileBrowser.getTextField().getDocument().addDocumentListener(new DocumentAdapter() {
protected void textChanged(final DocumentEvent e) {
update();
}
});
final VirtualFile baseDir = myProject.getBaseDir();
if (baseDir != null) {
String projectDir = baseDir.getPath();
projectDir = projectDir.replace('/', File.separatorChar);
myFileBrowser.setText(projectDir + File.separatorChar + DEFAULT_PATCH_NAME);
}
}
@NonNls
protected String getDimensionServiceKey() {
return "svn4idea.diff.options";
}
@Override
protected void dispose() {
super.dispose();
Disposer.dispose(myBrowser);
}
public SVNURL getSourceURL() {
return myURL;
}
public boolean isReverseDiff() {
return myReverseDiffButton.isSelected();
}
public SVNURL getTargetURL() {
if (getOKAction().isEnabled() && myBrowser.getSelectedNode() != null) {
return myBrowser.getSelectedNode().getURL();
}
return null;
}
public File getTargetFile() {
return new File(myFileBrowser.getText());
}
public boolean isUnifiedDiff() {
return myUnifiedDiffButton.isSelected();
}
protected JComponent createCenterPanel() {
update();
return myMainPanel;
}
private void update() {
RepositoryTreeNode baseNode = myBrowser.getSelectedNode();
if (baseNode == null) {
myErrorLabel.setText(SvnBundle.message("diff.options.no.url.error"));
getOKAction().setEnabled(false);
return;
}
if (myURL.equals(getTargetURL())) {
myErrorLabel.setText(SvnBundle.message("diff.options.same.url.error"));
getOKAction().setEnabled(false);
return;
}
if (myUnifiedDiffButton.isSelected() && (myFileBrowser.getText().length() == 0 || getTargetFile().getParentFile() == null)) {
myErrorLabel.setText(SvnBundle.message("diff.options.no.patch.file.error"));
getOKAction().setEnabled(false);
return;
}
myErrorLabel.setText(" ");
getOKAction().setEnabled(true);
}
public JComponent getPreferredFocusedComponent() {
return myBrowser;
}
@Nullable
private File selectFile(String title, String description) {
FileChooserDescriptor fcd = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor();
fcd.setShowFileSystemRoots(true);
fcd.setTitle(title);
fcd.setDescription(description);
fcd.setHideIgnored(false);
VirtualFile file = FileChooser.chooseFile(fcd, myBrowser, myProject, null);
if (file == null) {
return null;
}
return new File(file.getPath());
}
public void actionPerformed(ActionEvent e) {
myFileBrowser.setEnabled(myUnifiedDiffButton.isSelected());
update();
}
private void createUIComponents() {
myBrowser = new RepositoryBrowserComponent(SvnVcs.getInstance(myProject));
}
}