blob: 4d5e95999330aca92cdf8a6095621dd91308248f [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 com.intellij.openapi.vcs.changes.ui;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vcs.changes.*;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.DocumentAdapter;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author yole
*/
public class IgnoreUnversionedDialog extends DialogWrapper {
private JRadioButton myIgnoreSpecifiedFileRadioButton;
private JRadioButton myIgnoreAllFilesUnderRadioButton;
private TextFieldWithBrowseButton myIgnoreDirectoryTextField;
private JRadioButton myIgnoreAllFilesMatchingRadioButton;
private JTextField myIgnoreMaskTextField;
private JPanel myPanel;
private TextFieldWithBrowseButton myIgnoreFileTextField;
private List<VirtualFile> myFilesToIgnore;
private final Project myProject;
private boolean myInternalChange;
private final IgnoredPathPresentation myPresentation;
public IgnoreUnversionedDialog(final Project project) {
super(project, false);
myProject = project;
myPresentation = new IgnoredPathPresentation(myProject);
setTitle(VcsBundle.message("ignored.edit.title"));
init();
myIgnoreFileTextField.addBrowseFolderListener("Select File to Ignore",
"Select the file which will not be tracked for changes",
project,
new FileChooserDescriptor(true, false, false, true, false, false));
myIgnoreFileTextField.getTextField().getDocument().addDocumentListener(new DocumentAdapter() {
protected void textChanged(final DocumentEvent e) {
// on text change, clear remembered files to ignore
if (!myInternalChange) {
myFilesToIgnore = null;
}
}
});
myIgnoreDirectoryTextField.addBrowseFolderListener("Select Directory to Ignore",
"Select the directory which will not be tracked for changes",
project,
FileChooserDescriptorFactory.createSingleFolderDescriptor());
ActionListener listener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
updateControls();
}
};
myIgnoreAllFilesUnderRadioButton.addActionListener(listener);
myIgnoreAllFilesMatchingRadioButton.addActionListener(listener);
myIgnoreSpecifiedFileRadioButton.addActionListener(listener);
updateControls();
}
@NotNull
@Override
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
}
@Override
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp("ignoreUnversionedFilesDialog");
}
private void updateControls() {
myIgnoreDirectoryTextField.setEnabled(myIgnoreAllFilesUnderRadioButton.isSelected() && getDirectoriesToIgnore() <= 1);
myIgnoreMaskTextField.setEnabled(myIgnoreAllFilesMatchingRadioButton.isSelected());
myIgnoreFileTextField.setEnabled(myIgnoreSpecifiedFileRadioButton.isSelected() &&
(myFilesToIgnore == null || (myFilesToIgnore.size() == 1 && !myFilesToIgnore.get(0).isDirectory())));
}
private int getDirectoriesToIgnore() {
int result = 0;
if (myFilesToIgnore != null) {
for(VirtualFile f: myFilesToIgnore) {
if (f.isDirectory()) {
result++;
}
}
}
return result;
}
@Nullable
protected JComponent createCenterPanel() {
return myPanel;
}
private void setFilesToIgnore(List<VirtualFile> virtualFiles) {
assert virtualFiles.size() > 0;
myFilesToIgnore = virtualFiles;
myInternalChange = true;
try {
if (virtualFiles.size() == 1) {
VirtualFile projectDir = myProject.getBaseDir();
String path = FileUtil.getRelativePath(new File(projectDir.getPresentableUrl()), new File(virtualFiles.get(0).getPresentableUrl()));
myIgnoreFileTextField.setText(path);
}
else {
myIgnoreFileTextField.setText(VcsBundle.message("ignored.edit.multiple.files", virtualFiles.size()));
}
}
finally {
myInternalChange = false;
}
int dirCount = 0;
for(VirtualFile file: virtualFiles) {
if (file.isDirectory()) {
myIgnoreAllFilesUnderRadioButton.setSelected(true);
myIgnoreSpecifiedFileRadioButton.setEnabled(false);
myIgnoreFileTextField.setEnabled(false);
dirCount++;
}
}
updateControls();
final VirtualFile[] ancestors = VfsUtil.getCommonAncestors(VfsUtil.toVirtualFileArray(virtualFiles));
if (dirCount > 1) {
myIgnoreDirectoryTextField.setText(VcsBundle.message("ignored.edit.multiple.directories", dirCount));
}
else if (ancestors.length > 0) {
myIgnoreDirectoryTextField.setText(ancestors [0].getPresentableUrl());
}
else {
myIgnoreDirectoryTextField.setText(virtualFiles.get(0).getParent().getPresentableUrl());
}
final Set<String> extensions = new HashSet<String>();
for(VirtualFile vf: virtualFiles) {
final String extension = vf.getExtension();
if (extension != null) {
extensions.add(extension);
}
}
if (extensions.size() > 0) {
final String[] extensionArray = ArrayUtil.toStringArray(extensions);
myIgnoreMaskTextField.setText("*." + extensionArray [0]);
}
else {
myIgnoreMaskTextField.setText(virtualFiles.get(0).getPresentableName());
}
}
public void setIgnoredFile(final IgnoredFileBean bean) {
final String pathFromBean = bean.getPath();
if (pathFromBean != null) {
String path = pathFromBean.replace('/', File.separatorChar);
if (path.endsWith(File.separator)) {
myIgnoreAllFilesUnderRadioButton.setSelected(true);
myIgnoreDirectoryTextField.setText(path);
}
else {
myIgnoreSpecifiedFileRadioButton.setSelected(true);
myIgnoreFileTextField.setText(path);
}
}
else {
myIgnoreAllFilesMatchingRadioButton.setSelected(true);
myIgnoreMaskTextField.setText(bean.getMask());
}
updateControls();
}
public IgnoredFileBean[] getSelectedIgnoredFiles() {
if (myIgnoreSpecifiedFileRadioButton.isSelected()) {
if (myFilesToIgnore == null) {
return new IgnoredFileBean[] { IgnoredBeanFactory.ignoreFile(myPresentation.alwaysRelative(myIgnoreFileTextField.getText()), myProject) };
}
return getBeansFromFilesToIgnore(false);
}
if (myIgnoreAllFilesUnderRadioButton.isSelected()) {
if (getDirectoriesToIgnore() > 1) {
return getBeansFromFilesToIgnore(true);
}
final String path = myIgnoreDirectoryTextField.getText();
return new IgnoredFileBean[] { IgnoredBeanFactory.ignoreUnderDirectory(myPresentation.alwaysRelative(path), myProject) };
}
if (myIgnoreAllFilesMatchingRadioButton.isSelected()) {
return new IgnoredFileBean[] { IgnoredBeanFactory.withMask(myIgnoreMaskTextField.getText()) };
}
return new IgnoredFileBean[0];
}
private IgnoredFileBean[] getBeansFromFilesToIgnore(boolean onlyDirs) {
List<IgnoredFileBean> result = new ArrayList<IgnoredFileBean>();
for (VirtualFile fileToIgnore : myFilesToIgnore) {
String path = ChangesUtil.getProjectRelativePath(myProject, new File(fileToIgnore.getPath()));
if (path != null) {
path = FileUtil.toSystemIndependentName(path);
if (fileToIgnore.isDirectory()) {
result.add(IgnoredBeanFactory.ignoreUnderDirectory(path, myProject));
}
else if (!onlyDirs) {
result.add(IgnoredBeanFactory.ignoreFile(path, myProject));
}
}
}
return result.toArray(new IgnoredFileBean[result.size()]);
}
@Override @NonNls
protected String getDimensionServiceKey() {
return "IgnoreUnversionedDialog";
}
public static void ignoreSelectedFiles(final Project project, final List<VirtualFile> files) {
IgnoreUnversionedDialog dlg = new IgnoreUnversionedDialog(project);
dlg.setFilesToIgnore(files);
dlg.show();
if (!dlg.isOK()) {
return;
}
final IgnoredFileBean[] ignoredFiles = dlg.getSelectedIgnoredFiles();
if (ignoredFiles.length > 0) {
ChangeListManager.getInstance(project).addFilesToIgnore(ignoredFiles);
}
}
}