/*
* Copyright 2013-2016 consulo.io
*
* 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 consulo.unity3d.ide.ui;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.intellij.ProjectTopics;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootAdapter;
import com.intellij.openapi.roots.ModuleRootEvent;
import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.ui.EditorNotificationPanel;
import com.intellij.ui.EditorNotifications;
import consulo.annotations.RequiredReadAction;
import consulo.editor.notifications.EditorNotificationProvider;
import consulo.module.extension.ModuleExtension;
import consulo.unity3d.Unity3dBundle;
import consulo.unity3d.module.Unity3dModuleExtensionUtil;
import consulo.unity3d.module.Unity3dRootModuleExtension;
/**
* @author VISTALL
* @since 29.07.2015
*/
public class SetupUnitySDKProvider implements EditorNotificationProvider<EditorNotificationPanel>
{
private static final Key<EditorNotificationPanel> KEY = Key.create("setup.unity.sdk.notifier");
private final Project myProject;
public SetupUnitySDKProvider(Project project, final EditorNotifications notifications)
{
myProject = project;
myProject.getMessageBus().connect().subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootAdapter()
{
@Override
public void rootsChanged(ModuleRootEvent event)
{
notifications.updateAllNotifications();
}
});
myProject.getMessageBus().connect().subscribe(ModuleExtension.CHANGE_TOPIC, (oldExtension, newExtension) -> notifications.updateAllNotifications());
}
@NotNull
@Override
public Key<EditorNotificationPanel> getKey()
{
return KEY;
}
@Override
@RequiredReadAction
public EditorNotificationPanel createNotificationPanel(@NotNull VirtualFile file, @NotNull FileEditor fileEditor)
{
final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file);
if(psiFile == null)
{
return null;
}
Unity3dRootModuleExtension rootModuleExtension = Unity3dModuleExtensionUtil.getRootModuleExtension(myProject);
if(rootModuleExtension == null)
{
return null;
}
if(rootModuleExtension.getSdk() == null)
{
return createPanel(rootModuleExtension.getInheritableSdk().isNull() ? null : rootModuleExtension.getInheritableSdk().getName(), rootModuleExtension.getModule());
}
return null;
}
@NotNull
private static EditorNotificationPanel createPanel(@Nullable String name, @NotNull final Module rootModule)
{
EditorNotificationPanel panel = new EditorNotificationPanel();
if(StringUtil.isEmpty(name))
{
panel.setText(Unity3dBundle.message("unity.sdk.is.not.defiled"));
}
else
{
panel.setText(Unity3dBundle.message("unity.0.sdk.is.not.defined", name));
}
panel.createActionLabel("Open Settings", () -> ProjectSettingsService.getInstance(rootModule.getProject()).openModuleSettings(rootModule));
return panel;
}
}