/* * 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<>(); 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; } }