| /* |
| * Copyright 2000-2014 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 git4idea.util; |
| |
| import com.intellij.notification.Notification; |
| import com.intellij.notification.NotificationListener; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.ui.DialogBuilder; |
| import com.intellij.openapi.ui.ex.MultiLineLabel; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.openapi.vcs.VcsNotifier; |
| import com.intellij.openapi.vcs.changes.Change; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import git4idea.GitUtil; |
| import git4idea.ui.ChangesBrowserWithRollback; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.event.HyperlinkEvent; |
| import java.util.Collection; |
| import java.util.List; |
| |
| public class LocalChangesWouldBeOverwrittenHelper { |
| |
| @NotNull |
| private static String getErrorNotificationDescription() { |
| return getErrorDescription(true); |
| } |
| |
| @NotNull |
| private static String getErrorDialogDescription() { |
| return getErrorDescription(false); |
| } |
| |
| @NotNull |
| private static String getErrorDescription(boolean forNotification) { |
| String line1 = "Your local changes would be overwritten by merge."; |
| String line2 = "Commit, stash or revert them to proceed."; |
| if (forNotification) { |
| return line1 + "<br/>" + line2 + " <a href='view'>View them</a>"; |
| } |
| else { |
| return line1 + "\n" + line2; |
| } |
| } |
| |
| public static void showErrorNotification(@NotNull final Project project, @NotNull final VirtualFile root, @NotNull final String operationName, |
| @NotNull final Collection<String> relativeFilePaths) { |
| final Collection<String> absolutePaths = GitUtil.toAbsolute(root, relativeFilePaths); |
| final List<Change> changes = GitUtil.findLocalChangesForPaths(project, root, absolutePaths, false); |
| String notificationTitle = "Git " + StringUtil.capitalize(operationName) + " Failed"; |
| VcsNotifier.getInstance(project).notifyError(notificationTitle, getErrorNotificationDescription(), |
| new NotificationListener.Adapter() { |
| @Override |
| protected void hyperlinkActivated(@NotNull Notification notification, |
| @NotNull HyperlinkEvent e) { |
| showErrorDialog(project, operationName, changes, absolutePaths); |
| } |
| }); |
| } |
| |
| public static void showErrorDialog(@NotNull Project project, @NotNull VirtualFile root, @NotNull String operationName, |
| @NotNull Collection<String> relativeFilePaths) { |
| Collection<String> absolutePaths = GitUtil.toAbsolute(root, relativeFilePaths); |
| List<Change> changes = GitUtil.findLocalChangesForPaths(project, root, absolutePaths, false); |
| showErrorDialog(project, operationName, changes, absolutePaths); |
| } |
| |
| private static void showErrorDialog(@NotNull Project project, @NotNull String operationName, @NotNull List<Change> changes, |
| @NotNull Collection<String> absolutePaths) { |
| String title = "Local Changes Prevent from " + StringUtil.capitalize(operationName); |
| String description = getErrorDialogDescription(); |
| if (changes.isEmpty()) { |
| GitUtil.showPathsInDialog(project, absolutePaths, title, description); |
| } |
| else { |
| DialogBuilder builder = new DialogBuilder(project); |
| builder.setNorthPanel(new MultiLineLabel(description)); |
| builder.setCenterPanel(new ChangesBrowserWithRollback(project, changes)); |
| builder.addOkAction(); |
| builder.setTitle(title); |
| builder.show(); |
| } |
| } |
| |
| } |