com.intellij.conversion.impl.ui.ConvertProjectDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.conversion.impl.ui.ConvertProjectDialog.java

Source

/*
 * 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.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 int res = Messages.showYesNoDialog(getContentPane(), IdeBundle.message(
                    "message.files.doesn.t.exists.0.so.the.corresponding.modules.won.t.be.converted.do.you.want.to.continue",
                    filesString), IdeBundle.message("dialog.title.convert.project"), Messages.getQuestionIcon());
            if (res != 0) {
                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) != 0) {
                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;
    }
}