io.flutter.inspections.WrongModuleTypeNotificationProvider.java Source code

Java tutorial

Introduction

Here is the source code for io.flutter.inspections.WrongModuleTypeNotificationProvider.java

Source

/*
 * Copyright 2016 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
package io.flutter.inspections;

import com.intellij.CommonBundle;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.EditorNotificationPanel;
import com.intellij.ui.EditorNotifications;
import com.intellij.util.containers.ContainerUtil;
import icons.FlutterIcons;
import io.flutter.FlutterBundle;
import io.flutter.FlutterUtils;
import io.flutter.utils.FlutterModuleUtils;
import org.jetbrains.annotations.NotNull;

import java.util.Set;

public class WrongModuleTypeNotificationProvider extends EditorNotifications.Provider<EditorNotificationPanel>
        implements DumbAware {
    private static final Key<EditorNotificationPanel> KEY = Key.create("Wrong module type");
    private static final String DONT_ASK_TO_CHANGE_MODULE_TYPE_KEY = "do.not.ask.to.change.module.type"; //NON-NLS

    private final Project myProject;

    public WrongModuleTypeNotificationProvider(@NotNull Project project) {
        myProject = project;
    }

    @NotNull
    private static EditorNotificationPanel createPanel(@NotNull Project project, @NotNull Module module) {
        final EditorNotificationPanel panel = new EditorNotificationPanel().icon(FlutterIcons.Flutter);
        panel.setText(FlutterBundle.message("flutter.support.is.not.enabled.for.module.0", module.getName()));
        panel.createActionLabel(FlutterBundle.message("change.module.type.to.flutter.and.reload.project"), () -> {
            final int message = Messages.showOkCancelDialog(project,
                    FlutterBundle.message("updating.module.type.requires.project.reload.proceed"),
                    FlutterBundle.message("update.module.type"), FlutterBundle.message("reload.project"),
                    CommonBundle.getCancelButtonText(), null);
            if (message == Messages.YES) {
                FlutterModuleUtils.setFlutterModuleAndReload(module, project);
            }
        });
        panel.createActionLabel(FlutterBundle.message("don.t.show.again.for.this.module"), () -> {
            final Set<String> ignoredModules = getIgnoredModules(project);
            ignoredModules.add(module.getName());
            PropertiesComponent.getInstance(project).setValue(DONT_ASK_TO_CHANGE_MODULE_TYPE_KEY,
                    StringUtil.join(ignoredModules, ","));
            EditorNotifications.getInstance(project).updateAllNotifications();
        });
        return panel;
    }

    @NotNull
    private static Set<String> getIgnoredModules(@NotNull Project project) {
        final String value = PropertiesComponent.getInstance(project).getValue(DONT_ASK_TO_CHANGE_MODULE_TYPE_KEY,
                "");
        return ContainerUtil.newLinkedHashSet(StringUtil.split(value, ","));
    }

    @NotNull
    @Override
    public Key<EditorNotificationPanel> getKey() {
        return KEY;
    }

    @Override
    public EditorNotificationPanel createNotificationPanel(@NotNull VirtualFile file,
            @NotNull FileEditor fileEditor) {
        if (!FlutterUtils.isFlutteryFile(file))
            return null;
        final Module module = ModuleUtilCore.findModuleForFile(file, myProject);
        if (module == null || FlutterModuleUtils.isFlutterModule(module)
                || getIgnoredModules(myProject).contains(module.getName()))
            return null;
        return FlutterModuleUtils.usesFlutter(module) ? createPanel(myProject, module) : null;
    }
}