blob: 70457eb6bdf3ce60ea88738975fc0fe93f5f7858 [file] [log] [blame]
/*
* Copyright 2000-2013 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.ide.impl;
import com.intellij.facet.*;
import com.intellij.ide.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.libraries.LibraryUtil;
import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator;
import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.WrappingVirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Iterator;
/**
* @author nik
*/
public class ProjectStructureSelectInTarget extends SelectInTargetBase implements SelectInTarget, DumbAware {
@Override
public boolean canSelect(final SelectInContext context) {
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(context.getProject()).getFileIndex();
final VirtualFile file = context.getVirtualFile();
if (file instanceof WrappingVirtualFile) {
final Object o = ((WrappingVirtualFile)file).getWrappedObject(context.getProject());
return o instanceof Facet;
}
return fileIndex.isInContent(file) || fileIndex.isInLibraryClasses(file) || fileIndex.isInLibrarySource(file)
|| StdFileTypes.IDEA_MODULE.equals(file.getFileType()) && findModuleByModuleFile(context.getProject(), file) != null;
}
@Override
public void selectIn(final SelectInContext context, final boolean requestFocus) {
final Project project = context.getProject();
final VirtualFile file = context.getVirtualFile();
final Module module;
final Facet facet;
if (file instanceof WrappingVirtualFile) {
final Object o = ((WrappingVirtualFile)file).getWrappedObject(project);
facet = o instanceof Facet? (Facet)o : null;
module = facet == null? null : facet.getModule();
}
else {
Module moduleByIml = file.getFileType().equals(StdFileTypes.IDEA_MODULE) ? findModuleByModuleFile(project, file) : null;
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
module = moduleByIml != null ? moduleByIml : fileIndex.getModuleForFile(file);
facet = fileIndex.isInSourceContent(file) ? null : findFacet(project, file);
}
if (module != null || facet != null) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
if (facet != null) {
ModulesConfigurator.showFacetSettingsDialog(facet, null);
}
else {
ProjectSettingsService.getInstance(project).openModuleSettings(module);
}
}
});
return;
}
final OrderEntry orderEntry = LibraryUtil.findLibraryEntry(file, project);
if (orderEntry != null) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
ProjectSettingsService.getInstance(project).openLibraryOrSdkSettings(orderEntry);
}
});
}
}
@Nullable
private static Module findModuleByModuleFile(@NotNull Project project, @NotNull VirtualFile file) {
for (Module module : ModuleManager.getInstance(project).getModules()) {
if (file.equals(module.getModuleFile())) {
return module;
}
}
return null;
}
@Nullable
private static Facet findFacet(final @NotNull Project project, final @NotNull VirtualFile file) {
for (FacetTypeId id : FacetTypeRegistry.getInstance().getFacetTypeIds()) {
if (hasFacetWithRoots(project, id)) {
Facet facet = FacetFinder.getInstance(project).findFacet(file, id);
if (facet != null) {
return facet;
}
}
}
return null;
}
private static <F extends Facet> boolean hasFacetWithRoots(final @NotNull Project project, final @NotNull FacetTypeId<F> id) {
for (Module module : ModuleManager.getInstance(project).getModules()) {
Collection<? extends Facet> facets = FacetManager.getInstance(module).getFacetsByType(id);
Iterator<? extends Facet> iterator = facets.iterator();
if (iterator.hasNext()) {
return iterator.next() instanceof FacetRootsProvider;
}
}
return false;
}
public String toString() {
return IdeBundle.message("select.in.project.settings");
}
@Override
public float getWeight() {
return StandardTargetWeights.PROJECT_SETTINGS_WEIGHT;
}
}