/*
* 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.packaging.impl.run;
import com.intellij.execution.BeforeRunTaskProvider;
import com.intellij.execution.RunManagerEx;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.compiler.CompilerBundle;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogBuilder;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Key;
import com.intellij.packaging.artifacts.*;
import consulo.packaging.artifacts.ArtifactPointerUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @author nik
*/
public abstract class AbstractArtifactsBeforeRunTaskProvider<T extends AbstractArtifactsBeforeRunTask<T>> extends BeforeRunTaskProvider<T> {
protected final Project myProject;
private final Key<T> myId;
public AbstractArtifactsBeforeRunTaskProvider(Project project, Key<T> id) {
myProject = project;
myId = id;
project.getMessageBus().connect().subscribe(ArtifactManager.TOPIC, new ArtifactAdapter() {
@Override
public void artifactRemoved(@NotNull Artifact artifact) {
final RunManagerEx runManager = RunManagerEx.getInstanceEx(myProject);
for (RunConfiguration configuration : runManager.getAllConfigurationsList()) {
final List<T> tasks = runManager.getBeforeRunTasks(configuration, getId());
for (AbstractArtifactsBeforeRunTask task : tasks) {
final String artifactName = artifact.getName();
final List<ArtifactPointer> pointersList = task.getArtifactPointers();
final ArtifactPointer[] pointers = pointersList.toArray(new ArtifactPointer[pointersList.size()]);
for (ArtifactPointer pointer : pointers) {
if (pointer.getName().equals(artifactName) && ArtifactManager.getInstance(myProject).findArtifact(artifactName) == null) {
task.removeArtifact(pointer);
}
}
}
}
}
});
}
@Override
public Key<T> getId() {
return myId;
}
@Override
public Icon getIcon() {
return AllIcons.Nodes.Artifact;
}
@Override
public Icon getTaskIcon(AbstractArtifactsBeforeRunTask task) {
List<ArtifactPointer> pointers = task.getArtifactPointers();
if (pointers == null || pointers.isEmpty())
return getIcon();
Artifact artifact = pointers.get(0).get();
if (artifact == null)
return getIcon();
return artifact.getArtifactType().getIcon();
}
@Override
public boolean isConfigurable() {
return true;
}
@Override
public boolean configureTask(RunConfiguration runConfiguration, T task) {
final Artifact[] artifacts = ArtifactManager.getInstance(myProject).getArtifacts();
Set<ArtifactPointer> pointers = new THashSet<ArtifactPointer>();
for (Artifact artifact : artifacts) {
pointers.add(ArtifactPointerUtil.getPointerManager(myProject).create(artifact));
}
pointers.addAll(task.getArtifactPointers());
ArtifactChooser chooser = new ArtifactChooser(new ArrayList<ArtifactPointer>(pointers));
chooser.markElements(task.getArtifactPointers());
chooser.setPreferredSize(new Dimension(400, 300));
DialogBuilder builder = new DialogBuilder(myProject);
builder.setTitle(CompilerBundle.message("build.artifacts.before.run.selector.title"));
builder.setDimensionServiceKey("#BuildArtifactsBeforeRunChooser");
builder.addOkAction();
builder.addCancelAction();
builder.setCenterPanel(chooser);
builder.setPreferredFocusComponent(chooser);
if (builder.show() == DialogWrapper.OK_EXIT_CODE) {
task.setArtifactPointers(chooser.getMarkedElements());
return true;
}
return false;
}
@Override
public boolean canExecuteTask(RunConfiguration configuration, T task) {
for (ArtifactPointer pointer: task.getArtifactPointers()) {
if (pointer.get() != null)
return true;
}
return false;
}
}