/*
* Copyright 2013 original Randori IntelliJ Plugin authors.
*
* 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 randori.plugin.components;
import com.intellij.compiler.impl.CompilerContentIterator;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleComponent;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.FileIndex;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import randori.plugin.configuration.RandoriModuleConfigurable;
import randori.plugin.configuration.RandoriModuleModel;
import randori.plugin.util.ProjectUtils;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author Frédéric THOMAS
*/
@State(name = RandoriModuleComponent.COMPONENT_NAME, storages = { @Storage(id = "RandoriModule", file = "$MODULE_FILE$") })
/**
* @author Michael Schmalle
* @author Frédéric THOMAS
*/
public class RandoriModuleComponent implements ModuleComponent, Configurable,
PersistentStateComponent<RandoriModuleModel>
{
public static final String COMPONENT_NAME = "RandoriModule";
private final Module module;
private final Project project;
private RandoriModuleConfigurable form;
private RandoriModuleModel state;
private List<Module> dependencies;
public RandoriModuleComponent(Module module, Project project)
{
this.module = module;
this.project = project;
}
@Nls
@Override
public String getDisplayName()
{
return "Randori Module";
}
@Override
public void initComponent()
{
state = new RandoriModuleModel();
}
@Override
public String getHelpTopic()
{
return null;
}
@Override
public void moduleAdded()
{
}
@Override
public void projectOpened()
{
}
@Override
public void projectClosed()
{
}
@Override
public void disposeComponent()
{
dependencies = null;
}
@NotNull
@Override
public String getComponentName()
{
return COMPONENT_NAME;
}
@Override
public RandoriModuleModel getState()
{
return state;
}
@Override
public void loadState(RandoriModuleModel state)
{
}
@Override
public JComponent createComponent()
{
if (form == null)
{
form = new RandoriModuleConfigurable();
if (ProjectUtils.isModuleRoot(project, module))
{
final JComponent formComponent = form.getComponent();
for (Component component : formComponent.getComponents())
{
component.setEnabled(false);
}
}
}
return form.getComponent();
}
@Override
public boolean isModified()
{
return form.isModified(getState());
}
@Override
public void apply() throws ConfigurationException
{
if (form != null)
{
form.getData(getState());
}
}
@Override
public void reset()
{
if (form != null)
{
form.setData(getState());
}
}
@Override
public void disposeUIResources()
{
}
public List<Module> getDependencies()
{
dependencies = new ArrayList<Module>();
getUsedDependencies(module);
dependencies.remove(0);
return dependencies;
}
private void getUsedDependencies(Module module)
{
dependencies.add(module);
final Module[] usedDependencies = ModuleRootManager.getInstance(module).getDependencies();
for (Module dependency : usedDependencies)
{
if (!dependencies.contains(dependency))
{
getUsedDependencies(dependency);
}
}
}
protected FileIndex[] getFileIndices(boolean inMainModule, boolean inSubModules)
{
final List<Module> moduleList = new ArrayList<Module>();
if (inMainModule)
moduleList.add(module);
if (inSubModules)
moduleList.addAll(getDependencies());
FileIndex[] indices = null;
if (moduleList.size() != 0)
{
indices = new FileIndex[moduleList.size()];
int idx = 0;
for (final Module module : moduleList)
{
indices[idx++] = ModuleRootManager.getInstance(module).getFileIndex();
}
}
return indices;
}
@SuppressWarnings("unused")
@NotNull
public VirtualFile[] getFiles(final FileType fileType, final boolean inSourceOnly, boolean inMainModule,
boolean inSubModules)
{
final List<VirtualFile> files = new ArrayList<VirtualFile>();
final FileIndex[] fileIndices = getFileIndices(inMainModule, inSubModules);
for (final FileIndex fileIndex : fileIndices)
{
fileIndex.iterateContent(new CompilerContentIterator(fileType, fileIndex, inSourceOnly, files));
}
return VfsUtil.toVirtualFileArray(files);
}
}