| /* |
| * 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.openapi.externalSystem.service.task.ui; |
| |
| import com.intellij.execution.Executor; |
| import com.intellij.execution.ExecutorRegistry; |
| import com.intellij.execution.RunManager; |
| import com.intellij.execution.configurations.ConfigurationType; |
| import com.intellij.execution.configurations.RunConfiguration; |
| import com.intellij.openapi.externalSystem.ExternalSystemManager; |
| import com.intellij.openapi.externalSystem.ExternalSystemUiAware; |
| import com.intellij.openapi.externalSystem.model.ProjectSystemId; |
| import com.intellij.openapi.externalSystem.model.execution.ExternalTaskExecutionInfo; |
| import com.intellij.openapi.externalSystem.service.execution.AbstractExternalSystemTaskConfigurationType; |
| import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfiguration; |
| import com.intellij.openapi.externalSystem.service.ui.DefaultExternalSystemUiAware; |
| import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; |
| import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; |
| import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.ui.components.JBList; |
| import com.intellij.util.Producer; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.awt.event.*; |
| import java.util.List; |
| |
| /** |
| * @author Denis Zhdanov |
| * @since 6/7/13 2:40 PM |
| */ |
| public class ExternalSystemRecentTasksList extends JBList implements Producer<ExternalTaskExecutionInfo> { |
| |
| @NotNull private static final JLabel EMPTY_RENDERER = new JLabel(" "); |
| |
| public ExternalSystemRecentTasksList(@NotNull ExternalSystemRecentTaskListModel model, |
| @NotNull final ProjectSystemId externalSystemId, |
| @NotNull final Project project) |
| { |
| super(model); |
| setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
| ExternalSystemManager<?, ?, ?, ?, ?> manager = ExternalSystemApiUtil.getManager(externalSystemId); |
| Icon icon = null; |
| if (manager instanceof ExternalSystemUiAware) { |
| icon = ((ExternalSystemUiAware)manager).getTaskIcon(); |
| } |
| if (icon == null) { |
| icon = DefaultExternalSystemUiAware.INSTANCE.getTaskIcon(); |
| } |
| setCellRenderer(new MyRenderer(project, icon, ExternalSystemUtil.findConfigurationType(externalSystemId))); |
| setVisibleRowCount(ExternalSystemConstants.RECENT_TASKS_NUMBER); |
| |
| registerKeyboardAction(new ActionListener() { |
| @Override |
| public void actionPerformed(ActionEvent e) { |
| ExternalTaskExecutionInfo task = produce(); |
| if (task == null) { |
| return; |
| } |
| ExternalSystemUtil.runTask(task.getSettings(), task.getExecutorId(), project, externalSystemId); |
| } |
| }, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); |
| |
| addMouseListener(new MouseAdapter() { |
| @Override |
| public void mouseClicked(MouseEvent e) { |
| if (e.getClickCount() < 2) { |
| return; |
| } |
| |
| ExternalTaskExecutionInfo task = produce(); |
| if (task == null) { |
| return; |
| } |
| |
| ExternalSystemUtil.runTask(task.getSettings(), task.getExecutorId(), project, externalSystemId); |
| } |
| }); |
| } |
| |
| @Override |
| public ExternalSystemRecentTaskListModel getModel() { |
| return (ExternalSystemRecentTaskListModel)super.getModel(); |
| } |
| |
| public void setFirst(@NotNull ExternalTaskExecutionInfo task) { |
| ExternalTaskExecutionInfo selected = produce(); |
| ExternalSystemRecentTaskListModel model = getModel(); |
| model.setFirst(task); |
| clearSelection(); |
| if (selected == null) { |
| return; |
| } |
| for (int i = 0; i < model.size(); i++) { |
| //noinspection SuspiciousMethodCalls |
| if (selected.equals(model.getElementAt(i))) { |
| addSelectionInterval(i, i); |
| return; |
| } |
| } |
| } |
| |
| @Nullable |
| @Override |
| public ExternalTaskExecutionInfo produce() { |
| int[] indices = getSelectedIndices(); |
| if (indices == null || indices.length != 1) { |
| return null; |
| } |
| Object e = getModel().getElementAt(indices[0]); |
| return e instanceof ExternalTaskExecutionInfo ? (ExternalTaskExecutionInfo)e : null; |
| } |
| |
| private static class MyRenderer extends DefaultListCellRenderer { |
| |
| @NotNull private final Icon myGenericTaskIcon; |
| @NotNull private final Project myProject; |
| @Nullable private ConfigurationType myConfigurationType; |
| |
| MyRenderer(@NotNull Project project, @NotNull Icon genericTaskIcon, @Nullable ConfigurationType configurationType) { |
| myProject = project; |
| myGenericTaskIcon = genericTaskIcon; |
| myConfigurationType = configurationType; |
| } |
| |
| @Override |
| public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
| Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
| if (value instanceof ExternalSystemRecentTaskListModel.MyEmptyDescriptor) { |
| return EMPTY_RENDERER; |
| } |
| else if (value instanceof ExternalTaskExecutionInfo) { |
| ExternalTaskExecutionInfo taskInfo = (ExternalTaskExecutionInfo)value; |
| String text = null; |
| if (myConfigurationType != null) { |
| List<RunConfiguration> configurations = RunManager.getInstance(myProject).getConfigurationsList(myConfigurationType); |
| for (RunConfiguration configuration : configurations) { |
| if (!(configuration instanceof ExternalSystemRunConfiguration)) { |
| continue; |
| } |
| ExternalSystemRunConfiguration c = (ExternalSystemRunConfiguration)configuration; |
| if (c.getSettings().equals(taskInfo.getSettings())) { |
| text = c.getName(); |
| } |
| } |
| } |
| if (StringUtil.isEmpty(text)) { |
| text = AbstractExternalSystemTaskConfigurationType.generateName(myProject, taskInfo.getSettings()); |
| } |
| |
| setText(text); |
| Icon icon = null; |
| String executorId = taskInfo.getExecutorId(); |
| if (!StringUtil.isEmpty(executorId)) { |
| Executor executor = ExecutorRegistry.getInstance().getExecutorById(executorId); |
| if (executor != null) { |
| icon = executor.getIcon(); |
| } |
| } |
| |
| if (icon == null) { |
| icon = myGenericTaskIcon; |
| } |
| setIcon(icon); |
| } |
| |
| return renderer; |
| } |
| |
| @Override |
| public void setIcon(Icon icon) { |
| if (icon != null) { |
| // Don't allow to reset icon. |
| super.setIcon(icon); |
| } |
| } |
| } |
| } |