blob: cf73dba84a3a701ec8490b8c51a6913bc2e9006b [file] [log] [blame]
/*
* 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 com.intellij.conversion.impl.ui;
import com.intellij.CommonBundle;
import com.intellij.conversion.CannotConvertException;
import com.intellij.conversion.impl.ConversionContextImpl;
import com.intellij.conversion.impl.ConversionRunner;
import com.intellij.conversion.impl.ProjectConversionUtil;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.containers.HashSet;
import com.intellij.xml.util.XmlStringUtil;
import org.jetbrains.annotations.NonNls;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @author nik
*/
public class ConvertProjectDialog extends DialogWrapper {
private static final Logger LOG = Logger.getInstance("#com.intellij.conversion.impl.ui.ConvertProjectDialog");
private JPanel myMainPanel;
private JTextPane myTextPane;
private boolean myConverted;
private final ConversionContextImpl myContext;
private final List<ConversionRunner> myConversionRunners;
private final File myBackupDir;
private final Set<File> myAffectedFiles;
private boolean myNonExistingFilesMessageShown;
public ConvertProjectDialog(ConversionContextImpl context, final List<ConversionRunner> conversionRunners) {
super(true);
setTitle(IdeBundle.message("dialog.title.convert.project"));
setModal(true);
myContext = context;
myConversionRunners = conversionRunners;
myAffectedFiles = new HashSet<File>();
for (ConversionRunner conversionRunner : conversionRunners) {
myAffectedFiles.addAll(conversionRunner.getAffectedFiles());
}
myBackupDir = ProjectConversionUtil.getBackupDir(context.getProjectBaseDir());
myTextPane.setSize(new Dimension(350, Integer.MAX_VALUE));
StringBuilder message = new StringBuilder();
if (myConversionRunners.size() == 1 && myConversionRunners.get(0).getProvider().getConversionDialogText(context) != null) {
message.append(myConversionRunners.get(0).getProvider().getConversionDialogText(context));
}
else {
message.append(IdeBundle.message("conversion.dialog.text.1", context.getProjectFile().getName(),
ApplicationNamesInfo.getInstance().getFullProductName()));
}
message.append(IdeBundle.message("conversion.dialog.text.2", myBackupDir.getAbsolutePath()));
Messages.configureMessagePaneUi(myTextPane, XmlStringUtil.wrapInHtml(message), false);
myTextPane.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
@NonNls StringBuilder descriptions = new StringBuilder("<html>The following conversions will be performed:<br>");
for (ConversionRunner runner : conversionRunners) {
descriptions.append(runner.getProvider().getConversionDescription()).append("<br>");
}
descriptions.append("</html>");
Messages.showInfoMessage(descriptions.toString(), IdeBundle.message("dialog.title.convert.project"));
}
}
});
init();
setOKButtonText("Convert");
}
@Override
protected JComponent createCenterPanel() {
return myMainPanel;
}
@Override
protected void doOKAction() {
final List<File> nonexistentFiles = myContext.getNonExistingModuleFiles();
if (!nonexistentFiles.isEmpty() && !myNonExistingFilesMessageShown) {
final String filesString = getFilesString(nonexistentFiles);
final String message = IdeBundle.message("message.text.files.do.not.exist", filesString);
final int res = Messages.showYesNoDialog(getContentPane(), message, IdeBundle.message("dialog.title.convert.project"), Messages.getQuestionIcon());
if (res != Messages.YES) {
super.doOKAction();
return;
}
myNonExistingFilesMessageShown = false;
}
try {
if (!checkReadOnlyFiles()) {
return;
}
ProjectConversionUtil.backupFiles(myAffectedFiles, myContext.getProjectBaseDir(), myBackupDir);
List<ConversionRunner> usedRunners = new ArrayList<ConversionRunner>();
for (ConversionRunner runner : myConversionRunners) {
if (runner.isConversionNeeded()) {
runner.preProcess();
runner.process();
runner.postProcess();
usedRunners.add(runner);
}
}
myContext.saveFiles(myAffectedFiles, usedRunners);
myConverted = true;
super.doOKAction();
}
catch (CannotConvertException e) {
LOG.info(e);
showErrorMessage(IdeBundle.message("error.cannot.convert.project", e.getMessage()));
}
catch (IOException e) {
LOG.info(e);
showErrorMessage(IdeBundle.message("error.cannot.convert.project", e.getMessage()));
}
}
private static String getFilesString(List<File> files) {
StringBuilder buffer = new StringBuilder();
for (File file : files) {
buffer.append(file.getAbsolutePath()).append("<br>");
}
return buffer.toString();
}
private boolean checkReadOnlyFiles() throws IOException {
List<File> files = getReadOnlyFiles();
if (!files.isEmpty()) {
final String message = IdeBundle.message("message.text.unlock.read.only.files",
ApplicationNamesInfo.getInstance().getFullProductName(),
getFilesString(files));
final String[] options = {CommonBundle.getContinueButtonText(), CommonBundle.getCancelButtonText()};
if (Messages.showOkCancelDialog(myMainPanel, message, IdeBundle.message("dialog.title.convert.project"), options[0], options[1], null) != Messages.OK) {
return false;
}
unlockFiles(files);
files = getReadOnlyFiles();
if (!files.isEmpty()) {
showErrorMessage(IdeBundle.message("error.message.cannot.make.files.writable", getFilesString(files)));
return false;
}
}
return true;
}
private List<File> getReadOnlyFiles() {
return ConversionRunner.getReadOnlyFiles(myAffectedFiles);
}
private static void unlockFiles(final List<File> files) throws IOException {
for (File file : files) {
FileUtil.setReadOnlyAttribute(file.getAbsolutePath(), false);
}
}
private void showErrorMessage(final String message) {
Messages.showErrorDialog(myMainPanel, message, IdeBundle.message("dialog.title.convert.project"));
}
public boolean isConverted() {
return myConverted;
}
}