blob: d4a2a101dbaa8e53868381af0abc476ee94f8cf1 [file] [log] [blame]
/*
* 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.cyclicDependencies.actions;
import com.intellij.analysis.AnalysisScope;
import com.intellij.analysis.AnalysisScopeBundle;
import com.intellij.analysis.JavaAnalysisScope;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.IdeBorderFactory;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* User: anna
* Date: Jan 31, 2005
*/
public class CyclicDependenciesAction extends AnAction{
private final String myAnalysisVerb;
private final String myAnalysisNoun;
private final String myTitle;
public CyclicDependenciesAction() {
myAnalysisVerb = AnalysisScopeBundle.message("action.analyze.verb");
myAnalysisNoun = AnalysisScopeBundle.message("action.analysis.noun");
myTitle = AnalysisScopeBundle.message("action.cyclic.dependency.title");
}
public void update(AnActionEvent event) {
Presentation presentation = event.getPresentation();
presentation.setEnabled(
getInspectionScope(event.getDataContext()) != null ||
event.getData(CommonDataKeys.PROJECT) != null);
}
public void actionPerformed(AnActionEvent e) {
DataContext dataContext = e.getDataContext();
final Project project = CommonDataKeys.PROJECT.getData(dataContext);
final Module module = LangDataKeys.MODULE.getData(dataContext);
if (project != null) {
AnalysisScope scope = getInspectionScope(dataContext);
if (scope == null || scope.getScopeType() != AnalysisScope.MODULES){
ProjectModuleOrPackageDialog dlg = null;
if (module != null) {
dlg = new ProjectModuleOrPackageDialog(ModuleManager.getInstance(project).getModules().length == 1 ? null : ModuleUtilCore.getModuleNameInReadAction(module), scope);
dlg.show();
if (!dlg.isOK()) return;
}
if (dlg == null || dlg.isProjectScopeSelected()) {
scope = getProjectScope(dataContext);
}
else {
if (dlg.isModuleScopeSelected()) {
scope = getModuleScope(dataContext);
}
}
if (scope != null) {
scope.setIncludeTestSource(dlg != null && dlg.isIncludeTestSources());
}
}
FileDocumentManager.getInstance().saveAllDocuments();
new CyclicDependenciesHandler(project, scope).analyze();
}
}
@Nullable
private static AnalysisScope getInspectionScope(final DataContext dataContext) {
final Project project = CommonDataKeys.PROJECT.getData(dataContext);
if (project == null) return null;
AnalysisScope scope = getInspectionScopeImpl(dataContext);
return scope != null && scope.getScopeType() != AnalysisScope.INVALID ? scope : null;
}
@Nullable
private static AnalysisScope getInspectionScopeImpl(DataContext dataContext) {
//Possible scopes: package, project, module.
Project projectContext = PlatformDataKeys.PROJECT_CONTEXT.getData(dataContext);
if (projectContext != null) {
return null;
}
Module moduleContext = LangDataKeys.MODULE_CONTEXT.getData(dataContext);
if (moduleContext != null) {
return null;
}
Module [] modulesArray = LangDataKeys.MODULE_CONTEXT_ARRAY.getData(dataContext);
if (modulesArray != null) {
return new AnalysisScope(modulesArray);
}
PsiElement psiTarget = CommonDataKeys.PSI_ELEMENT.getData(dataContext);
if (psiTarget instanceof PsiDirectory) {
PsiDirectory psiDirectory = (PsiDirectory)psiTarget;
if (!psiDirectory.getManager().isInProject(psiDirectory)) return null;
return new AnalysisScope(psiDirectory);
}
else if (psiTarget instanceof PsiPackage) {
PsiPackage pack = (PsiPackage)psiTarget;
PsiDirectory[] dirs = pack.getDirectories(GlobalSearchScope.projectScope(pack.getProject()));
if (dirs.length == 0) return null;
return new JavaAnalysisScope(pack, LangDataKeys.MODULE.getData(dataContext));
}
return null;
}
@Nullable
private static AnalysisScope getProjectScope(DataContext dataContext) {
final Project data = CommonDataKeys.PROJECT.getData(dataContext);
if (data == null) {
return null;
}
return new AnalysisScope(data);
}
@Nullable
private static AnalysisScope getModuleScope(DataContext dataContext) {
final Module data = LangDataKeys.MODULE.getData(dataContext);
if (data == null) {
return null;
}
return new AnalysisScope(data);
}
private class ProjectModuleOrPackageDialog extends DialogWrapper {
private final String myModuleName;
private AnalysisScope mySelectedScope;
private JRadioButton myProjectButton;
private JRadioButton myModuleButton;
private JRadioButton mySelectedScopeButton;
private JPanel myScopePanel;
private JPanel myWholePanel;
private JCheckBox myIncludeTestSourcesCb;
public ProjectModuleOrPackageDialog(String moduleName, AnalysisScope selectedScope) {
super(true);
myModuleName = moduleName;
mySelectedScope = selectedScope;
init();
setTitle(AnalysisScopeBundle.message("cyclic.dependencies.scope.dialog.title", myTitle));
setHorizontalStretch(1.75f);
}
public boolean isIncludeTestSources() {
return myIncludeTestSourcesCb.isSelected();
}
protected JComponent createCenterPanel() {
myScopePanel.setBorder(IdeBorderFactory.createTitledBorder(
AnalysisScopeBundle.message("analysis.scope.title", myAnalysisNoun), true));
myProjectButton.setText(AnalysisScopeBundle.message("cyclic.dependencies.scope.dialog.project.button", myAnalysisVerb));
ButtonGroup group = new ButtonGroup();
group.add(myProjectButton);
if (myModuleName != null) {
myModuleButton.setText(AnalysisScopeBundle.message("cyclic.dependencies.scope.dialog.module.button", myAnalysisVerb, myModuleName));
group.add(myModuleButton);
}
myModuleButton.setVisible(myModuleName != null);
mySelectedScopeButton.setVisible(mySelectedScope != null);
if (mySelectedScope != null) {
mySelectedScopeButton.setText(mySelectedScope.getShortenName());
group.add(mySelectedScopeButton);
}
if (mySelectedScope != null) {
mySelectedScopeButton.setSelected(true);
} else if (myModuleName != null) {
myModuleButton.setSelected(true);
} else {
myProjectButton.setSelected(true);
}
return myWholePanel;
}
public boolean isProjectScopeSelected() {
return myProjectButton.isSelected();
}
public boolean isModuleScopeSelected() {
return myModuleButton != null ? myModuleButton.isSelected() : false;
}
}
}