/*
* Copyright 2000-2012 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.compiler.impl;
import com.intellij.compiler.ProblemsView;
import com.intellij.ide.errorTreeView.impl.ErrorTreeViewConfiguration;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.EmptyRunnable;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.pom.Navigatable;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
import com.intellij.ui.content.ContentManager;
import com.intellij.ui.content.MessageView;
import com.intellij.util.concurrency.SequentialTaskExecutor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.UIUtil;
import consulo.annotations.RequiredDispatchThread;
import consulo.compiler.server.rmi.CompilerClientConnector;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
/**
* @author Eugene Zhuravlev
* Date: 9/18/12
*/
public class ProblemsViewImpl extends ProblemsView {
public static final Logger LOGGER = Logger.getInstance(ProblemsViewImpl.class);
private static class TempMessage {
final int type;
@NotNull
final String[] text;
@Nullable
final String groupName;
@Nullable
final Navigatable navigatable;
@Nullable
final String exportTextPrefix;
@Nullable
final String rendererTextPrefix;
private TempMessage(int type,
@NotNull String[] text,
@Nullable String groupName,
@Nullable Navigatable navigatable,
@Nullable String exportTextPrefix,
@Nullable String rendererTextPrefix) {
this.type = type;
this.text = text;
this.groupName = groupName;
this.navigatable = navigatable;
this.exportTextPrefix = exportTextPrefix;
this.rendererTextPrefix = rendererTextPrefix;
}
}
private static final Key<Boolean> ourViewKey = Key.create("ProblemsViewImpl");
private List<TempMessage> myTempMessages = new CopyOnWriteArrayList<TempMessage>();
@Nullable
private ProblemsViewPanel myPanel;
private final ExecutorService myViewUpdater = SequentialTaskExecutor.createSequentialApplicationPoolExecutor("ProblemsView pool");
public ProblemsViewImpl(final Project project) {
super(project);
}
@Override
public void clearOldMessages() {
myTempMessages.clear();
final ProblemsViewPanel panel = myPanel;
if (panel != null) {
myViewUpdater.execute(new Runnable() {
@Override
public void run() {
panel.clearMessages();
}
});
}
}
@Override
public void addMessage(final int type,
@NotNull final String[] text,
@Nullable final String groupName,
@Nullable final Navigatable navigatable,
@Nullable final String exportTextPrefix,
@Nullable final String rendererTextPrefix) {
final TempMessage message = new TempMessage(type, text, groupName, navigatable, exportTextPrefix, rendererTextPrefix);
myTempMessages.add(message);
final ProblemsViewPanel panel = myPanel;
if (panel != null) {
myViewUpdater.execute(new Runnable() {
@Override
public void run() {
addMessage(panel, message);
}
});
}
}
@RequiredDispatchThread
@Override
public void showOrHide(final boolean hide) {
if (ApplicationManager.getApplication().isCompilerServerMode()) {
CompilerClientConnector.getInstance(myProject).showOrHide(hide);
return;
}
ToolWindow toolWindow = MessageView.SERVICE.getInstance(myProject).getToolWindow();
// dont try hide if toolwindow closed
if (hide && !toolWindow.isVisible()) {
return;
}
final ContentManager contentManager = toolWindow.getContentManager();
Content[] contents = contentManager.getContents();
Content content = ContainerUtil.find(contents, new Condition<Content>() {
@Override
public boolean value(Content content) {
return content.getUserData(ourViewKey) != null;
}
});
if (content == null && hide) {
return;
}
if (hide) {
contentManager.removeContent(content, true);
}
else {
if (content == null) {
ProblemsViewPanel problemsViewPanel = new ProblemsViewPanel(myProject);
for (TempMessage tempMessage : myTempMessages) {
addMessage(problemsViewPanel, tempMessage);
}
content = ContentFactory.SERVICE.getInstance().createContent(myPanel = problemsViewPanel, "Compilation", false);
content.putUserData(ourViewKey, Boolean.TRUE);
contentManager.addContent(content);
}
contentManager.setSelectedContent(content, true);
toolWindow.show(EmptyRunnable.getInstance());
}
}
private static void addMessage(ProblemsViewPanel problemsViewPanel, TempMessage tempMessage) {
if (tempMessage.navigatable != null) {
problemsViewPanel.addMessage(tempMessage.type, tempMessage.text, tempMessage.groupName, tempMessage.navigatable, tempMessage.exportTextPrefix,
tempMessage.rendererTextPrefix, null);
}
else {
problemsViewPanel.addMessage(tempMessage.type, tempMessage.text, null, -1, -1, null);
}
}
@Override
public void selectFirstMessage() {
if (ApplicationManager.getApplication().isCompilerServerMode()) {
CompilerClientConnector.getInstance(myProject).selectFirstMessage();
return;
}
final ProblemsViewPanel panel = myPanel;
if (panel != null) {
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
panel.selectFirstMessage();
}
});
}
}
@Override
public boolean isHideWarnings() {
return !ErrorTreeViewConfiguration.getInstance(myProject).SHOW_WARNINGS;
}
@Override
public void setProgress(String text, float fraction) {
ProblemsViewPanel panel = myPanel;
if (panel != null) {
panel.setProgress(text, fraction);
}
}
@Override
public void setProgress(String text) {
ProblemsViewPanel panel = myPanel;
if (panel != null) {
panel.setProgressText(text);
}
}
@Override
public void clearProgress() {
ProblemsViewPanel panel = myPanel;
if (panel != null) {
panel.clearProgressData();
}
}
}