blob: 2ee0a3dd2c5d99fb834e6da8c2e5e9f1106cfb87 [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.ui;
import com.intellij.CommonBundle;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ui.FilePathSplittingPolicy;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
public class ReplaceFileConfirmationDialog {
private final FileStatusManager myFileStatusManager;
ProgressIndicator myProgressIndicator = ProgressManager.getInstance().getProgressIndicator();
private final String myActionName;
public ReplaceFileConfirmationDialog(Project project, String actionName) {
myFileStatusManager = FileStatusManager.getInstance(project);
myActionName = actionName;
}
public boolean confirmFor(VirtualFile[] files) {
if (ApplicationManager.getApplication().isUnitTestMode()) return true;
if (myProgressIndicator != null) myProgressIndicator.pushState();
try {
Collection modifiedFiles = collectModifiedFiles(files);
if (modifiedFiles.isEmpty()) return true;
return requestConfirmation(modifiedFiles);
}
finally {
if (myProgressIndicator != null) myProgressIndicator.popState();
}
}
public boolean requestConfirmation(final Collection modifiedFiles) {
if (modifiedFiles.isEmpty()) return true;
return Messages.showOkCancelDialog(createMessage(modifiedFiles), myActionName,
createOwerriteButtonName(modifiedFiles), getCancelButtonText(),
Messages.getWarningIcon()) ==
Messages.OK;
}
protected String getCancelButtonText() {
return CommonBundle.getCancelButtonText();
}
private String createOwerriteButtonName(Collection modifiedFiles) {
return modifiedFiles.size() > 1 ? getOkButtonTextForFiles() : getOkButtonTextForOneFile();
}
protected String getOkButtonTextForOneFile() {
return VcsBundle.message("button.text.overwrite.modified.file");
}
protected String getOkButtonTextForFiles() {
return VcsBundle.message("button.text.overwrite.modified.files");
}
protected String createMessage(Collection modifiedFiles) {
if (modifiedFiles.size() == 1) {
VirtualFile virtualFile = ((VirtualFile)modifiedFiles.iterator().next());
return VcsBundle.message("message.text.file.locally.modified",
FilePathSplittingPolicy.SPLIT_BY_LETTER.getPresentableName(new File(virtualFile.getPath()), 40));
}
else {
return VcsBundle.message("message.text.several.files.locally.modified");
}
}
public Collection<VirtualFile> collectModifiedFiles(VirtualFile[] files) {
ArrayList<VirtualFile> result = new ArrayList<VirtualFile>();
if (files == null) return result;
for (int i = 0; i < files.length; i++) {
VirtualFile file = files[i];
if (myProgressIndicator != null) {
myProgressIndicator.setText(VcsBundle.message("progress.text.searching.for.modified.files"));
myProgressIndicator.setText2(file.getPresentableUrl());
}
FileStatus status = myFileStatusManager.getStatus(file);
if (status != FileStatus.NOT_CHANGED) {
result.add(file);
if (result.size() > 1) return result;
}
result.addAll(collectModifiedFiles(file.getChildren()));
}
return result;
}
}