/*
* Copyright 2003-2011 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 jetbrains.mps.smodel;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.IdeFrame;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.util.ui.UIUtil;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.project.MPSProject;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.annotations.Singleton;
import java.awt.Component;
import java.awt.Window;
/**
* This class is a sort of hack used to get proper project instance from currently
* active UI component. It's always better getting the proper project instance from the
* context of model command execution.
* <p/>
* In other words: avoid using this class!
*/
@Singleton
final class CurrentProjectAccessUtil {
private CurrentProjectAccessUtil() {
}
private static Project getProjectFromUI() {
// This code is for performance reasons
// The method is called very often, so getting data from DataContext
// seems to be too time-consuming to use here
//
// [AS] Loos like this code is not called so frequently anymore. Leaving it here
// and using dataContext as a fallback solution for getting project because there
// was a number of problems with getting project from currently focused component.
Window window = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow();
Component parent = UIUtil.findUltimateParent(window);
if (parent instanceof IdeFrame) {
Project project = ((IdeFrame) parent).getProject();
if (project != null) {
return project;
}
}
DataContext dataContext = DataManager.getInstance().getDataContext();
return PlatformDataKeys.PROJECT.getData(dataContext);
}
@Nullable
static MPSProject getMPSProjectFromUI() {
Project ideaProject = getProjectFromUI();
return ideaProject != null ? ProjectHelper.fromIdeaProject(ideaProject) : null;
}
}