blob: 7a919938011abfbfaf33faad99103fda6862f90c [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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.android.tools.idea.npw;
import com.android.tools.idea.stats.Distribution;
import com.android.tools.idea.stats.DistributionService;
import com.android.tools.idea.ui.DistributionChartComponent;
import com.intellij.ide.BrowserUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.ui.JBColor;
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBScrollPane;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.font.TextAttribute;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* An explanation dialog that helps the user select an API level.
*/
public class ChooseApiLevelDialog extends DialogWrapper implements DistributionChartComponent.DistributionSelectionChangedListener {
private JPanel myPanel;
private DistributionChartComponent myDistributionChart;
private JBLabel myDescriptionLeft;
private JBScrollPane myScrollPane;
private JPanel myChartPanel;
private JBLabel myDescriptionRight;
private JBLabel myIntroducedLabel;
private JBLabel myLearnMoreLinkLabel;
private int mySelectedApiLevel = -1;
public ChooseApiLevelDialog(@Nullable Project project, int selectedApiLevel) {
super(project);
mySelectedApiLevel = selectedApiLevel;
Window window = getWindow();
// Allow creation in headless mode for tests
if (window != null) {
window.setMinimumSize(new Dimension(400, 680));
window.setPreferredSize(new Dimension(1100, 750));
window.setMaximumSize(new Dimension(1100, 800));
} else {
assert ApplicationManager.getApplication().isUnitTestMode();
}
setTitle("Android Platform/API Version Distribution");
init();
}
@Nullable
@Override
protected JComponent createCenterPanel() {
myDistributionChart = new DistributionChartComponent();
myDistributionChart.registerDistributionSelectionChangedListener(this);
myChartPanel.setLayout(new BorderLayout());
myChartPanel.add(myDistributionChart, BorderLayout.CENTER);
myDistributionChart.init();
myScrollPane.getViewport().setOpaque(false);
myScrollPane.setOpaque(false);
myScrollPane.setBorder(null);
myDescriptionLeft.setForeground(JBColor.foreground());
myDescriptionLeft.setBackground(JBColor.background());
myDescriptionRight.setForeground(JBColor.foreground());
myDescriptionRight.setBackground(JBColor.background());
myLearnMoreLinkLabel.setForeground(JBColor.blue);
myLearnMoreLinkLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
Font font = myLearnMoreLinkLabel.getFont();
Map attributes = font.getAttributes();
attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
myLearnMoreLinkLabel.setFont(font.deriveFont(attributes));
myLearnMoreLinkLabel.addMouseListener(new MouseInputAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
BrowserUtil.browse(new URL(myLearnMoreLinkLabel.getText()));
}
catch (MalformedURLException e1) {
// Pass
}
}
});
if (mySelectedApiLevel >= 0) {
Distribution d = DistributionService.getInstance().getDistributionForApiLevel(mySelectedApiLevel);
if (d != null) {
myDistributionChart.selectDistribution(d);
}
}
return myPanel;
}
@Override
public void onDistributionSelected(Distribution d) {
int halfwayIndex = d.getDescriptionBlocks().size() / 2;
myDescriptionLeft.setText(getHtmlFromBlocks(d.getDescriptionBlocks().subList(0, halfwayIndex + 1)));
myDescriptionRight.setText(getHtmlFromBlocks(d.getDescriptionBlocks().subList(halfwayIndex + 1, d.getDescriptionBlocks().size())));
mySelectedApiLevel = d.getApiLevel();
myIntroducedLabel.setText(d.getName());
myLearnMoreLinkLabel.setText(d.getUrl());
}
private String getHtmlFromBlocks(List<Distribution.TextBlock> blocks) {
StringBuilder sb = new StringBuilder();
sb.append("<html>");
for (Distribution.TextBlock block : blocks) {
sb.append("<h3>");
sb.append(block.title);
sb.append("</h3>");
sb.append(block.body);
sb.append("<br>");
}
sb.append("</html>");
return sb.toString();
}
/**
* Get the user's choice of API level
* @return -1 if no selection was made.
*/
public int getSelectedApiLevel() {
return mySelectedApiLevel;
}
}