/*
* Copyright 2005-2016 Sixth and Red River Software, Bas Leijdekkers
*
* 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.sixrr.metrics.ui.metricdisplay;
import com.intellij.analysis.AnalysisScope;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowManager;
import com.sixrr.metrics.MetricCategory;
import com.sixrr.metrics.metricModel.MetricsRun;
import com.sixrr.metrics.profile.MetricDisplaySpecification;
import com.sixrr.metrics.profile.MetricsProfile;
import com.sixrr.metrics.utils.MetricsReloadedBundle;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
@SuppressWarnings({"ThisEscapedInObjectConstruction"})
public final class MetricsToolWindowImpl extends MetricsToolWindow {
private final Project project;
private final JPanel myContentPanel;
private final MetricsDisplay metricsDisplay;
private ToolWindow myToolWindow = null;
private MetricsRun currentResults = null;
private AnalysisScope currentScope = null;
private MetricsProfile currentProfile = null;
private MetricsToolWindowImpl(@NotNull Project project) {
this.project = project;
final DefaultActionGroup toolbarGroup = new DefaultActionGroup();
toolbarGroup.add(new UpdateWithDiffAction(this, project));
toolbarGroup.add(new ToggleAutoscrollAction());
toolbarGroup.add(new ExportAction(this, project));
toolbarGroup.add(new CreateSnapshotAction(this, project));
toolbarGroup.add(new DiffSnapshotAction(this, project));
toolbarGroup.add(new RemoveDiffAction(this));
toolbarGroup.add(new EditThresholdsAction(this));
toolbarGroup.add(new CloseMetricsViewAction(this));
final ActionManager actionManager = ActionManager.getInstance();
final ActionToolbar toolbar = actionManager.createActionToolbar(METRICS_TOOL_WINDOW_ID, toolbarGroup, false);
myContentPanel = new JPanel(new BorderLayout());
metricsDisplay = new MetricsDisplay(project);
myContentPanel.add(toolbar.getComponent(), BorderLayout.WEST);
myContentPanel.add(metricsDisplay.getTabbedPane(), BorderLayout.CENTER);
register();
}
private void register() {
final ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project);
myToolWindow = toolWindowManager.registerToolWindow(METRICS_TOOL_WINDOW_ID, myContentPanel,
ToolWindowAnchor.BOTTOM);
myToolWindow.setTitle(MetricsReloadedBundle.message("metrics.reloaded.toolwindow.title"));
myToolWindow.setIcon(IconLoader.getIcon(TOOL_WINDOW_ICON_PATH));
myToolWindow.setAvailable(false, null);
}
@Override
public void show(@NotNull MetricsRun results, @NotNull MetricsProfile profile, @NotNull AnalysisScope scope,
boolean showOnlyWarnings) {
currentScope = scope;
currentResults = showOnlyWarnings ? results.filterRowsWithoutWarnings(profile) : results;
currentProfile = profile;
final MetricDisplaySpecification displaySpecification = currentProfile.getDisplaySpecification();
metricsDisplay.setMetricsResults(displaySpecification, currentResults);
myToolWindow.setAvailable(true, null);
myToolWindow.setTitle(MetricsReloadedBundle.message("run.description.format",
currentResults.getProfileName(),
currentScope.getDisplayName(), currentResults.getTimestamp()) );
myToolWindow.show(null);
}
@Override
public void update(@NotNull MetricsRun results) {
currentResults = results;
final MetricDisplaySpecification displaySpecification =
currentProfile.getDisplaySpecification();
metricsDisplay.updateMetricsResults(results, displaySpecification);
}
@Override
public void updateWithDiff(@NotNull MetricsRun results) {
final MetricsRun prevResults = currentResults;
currentResults = results;
final MetricDisplaySpecification displaySpecification =
currentProfile.getDisplaySpecification();
metricsDisplay.updateMetricsResultsWithDiff(results, displaySpecification);
myToolWindow.setTitle(MetricsReloadedBundle.message("run.comparison.message",
currentResults.getProfileName(), currentScope.getDisplayName(),
prevResults.getTimestamp(), currentResults.getTimestamp()));
}
@Override
public void reloadAsDiff(@NotNull MetricsRun prevResults) {
final MetricDisplaySpecification displaySpecification =
currentProfile.getDisplaySpecification();
metricsDisplay.overlayWithDiff(prevResults, displaySpecification);
myToolWindow.setTitle(MetricsReloadedBundle.message("run.comparison.message",
currentResults.getProfileName(), currentScope.getDisplayName(),
prevResults.getTimestamp(), currentResults.getTimestamp()));
}
@Override
public void removeDiffOverlay() {
final MetricDisplaySpecification displaySpecification =
currentProfile.getDisplaySpecification();
metricsDisplay.removeDiffOverlay(displaySpecification);
myToolWindow.setTitle(MetricsReloadedBundle.message("run.description.format",
currentResults.getProfileName(), currentScope.getDisplayName(),
currentResults.getTimestamp()));
}
@Override
public boolean hasDiffOverlay() {
return metricsDisplay != null && metricsDisplay.hasDiffOverlay();
}
@Override
public void close() {
myToolWindow.hide(null);
myToolWindow.setAvailable(false, null);
}
@Override
public MetricsRun getCurrentRun() {
return currentResults;
}
@Override
public AnalysisScope getCurrentScope() {
return currentScope;
}
@Override
public void dispose() {
final ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project);
toolWindowManager.unregisterToolWindow(METRICS_TOOL_WINDOW_ID);
}
@Override
public MetricsProfile getCurrentProfile() {
return currentProfile;
}
@Override
public MetricCategory getSelectedCategory() {
return metricsDisplay.getSelectedCategory();
}
}