/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2013-16 The Processing Foundation
Copyright (c) 2011-12 Ben Fry and Casey Reas
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package processing.app.contrib;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.LayoutStyle;
import javax.swing.SwingConstants;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.html.HTMLDocument;
import processing.app.ui.Toolkit;
import processing.app.Base;
import processing.app.Platform;
class StatusPanel extends JPanel {
static final int BUTTON_WIDTH = Toolkit.zoom(150);
static Icon foundationIcon;
static Icon installIcon;
static Icon updateIcon;
static Icon removeIcon;
static Font buttonFont;
JTextPane label;
JButton installButton;
JPanel progressPanel;
JLabel updateLabel;
JButton updateButton;
JButton removeButton;
GroupLayout layout;
JLabel iconLabel;
ContributionListing contributionListing = ContributionListing.getInstance();
ContributionTab contributionTab;
private String bodyRule;
/** Needed by ContributionListPanel */
public StatusPanel() { }
public StatusPanel(final ContributionTab contributionTab, int width) {
this.contributionTab = contributionTab;
if (foundationIcon == null) {
foundationIcon = Toolkit.getLibIconX("icons/foundation", 32);
installIcon = Toolkit.getLibIconX("manager/install");
updateIcon = Toolkit.getLibIconX("manager/update");
removeIcon = Toolkit.getLibIconX("manager/remove");
buttonFont = ManagerFrame.NORMAL_PLAIN;
}
setBackground(new Color(0xebebeb));
iconLabel = new JLabel();
iconLabel.setHorizontalAlignment(SwingConstants.CENTER);
label = new JTextPane();
label.setEditable(false);
label.setOpaque(false);
label.setContentType("text/html");
bodyRule = "a, body { font-family: " + buttonFont.getFamily() + "; " +
"font-size: " + buttonFont.getSize() + "pt; color: black; text-decoration: none;}";
label.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
if (e.getURL() != null) {
Platform.openURL(e.getURL().toString());
}
}
}
});
installButton = Toolkit.createIconButton("Install", installIcon);
//installButton.setDisabledIcon(installIcon);
installButton.setFont(buttonFont);
installButton.setHorizontalAlignment(SwingConstants.LEFT);
installButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
installButton.setEnabled(false);
DetailPanel currentPanel =
contributionTab.contributionListPanel.getSelectedPanel();
currentPanel.install();
StatusPanel.this.update(currentPanel);
}
});
progressPanel = new JPanel();
progressPanel.setLayout(new BorderLayout());
progressPanel.setOpaque(false);
updateLabel = new JLabel(" ");
updateLabel.setFont(buttonFont);
updateLabel.setHorizontalAlignment(SwingConstants.CENTER);
updateButton = Toolkit.createIconButton("Update", updateIcon);
updateButton.setFont(buttonFont);
updateButton.setHorizontalAlignment(SwingConstants.LEFT);
updateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateButton.setEnabled(false);
DetailPanel currentPanel =
contributionTab.contributionListPanel.getSelectedPanel();
currentPanel.update();
StatusPanel.this.update(currentPanel);
}
});
removeButton = Toolkit.createIconButton("Remove", removeIcon);
removeButton.setFont(buttonFont);
removeButton.setHorizontalAlignment(SwingConstants.LEFT);
removeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeButton.setEnabled(false);
DetailPanel currentPanel =
contributionTab.contributionListPanel.getSelectedPanel();
currentPanel.remove();
StatusPanel.this.update(currentPanel);
}
});
int labelWidth = (width != 0) ?
(3 * width / 4) : GroupLayout.PREFERRED_SIZE;
layout = new GroupLayout(this);
this.setLayout(layout);
layout.setAutoCreateContainerGaps(true);
layout.setAutoCreateGaps(true);
layout.setHorizontalGroup(layout
.createSequentialGroup()
.addGap(0)
.addComponent(iconLabel,
ManagerFrame.STATUS_WIDTH,
ManagerFrame.STATUS_WIDTH,
ManagerFrame.STATUS_WIDTH)
.addGap(0)
.addComponent(label, labelWidth, labelWidth, labelWidth)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(installButton,
BUTTON_WIDTH, BUTTON_WIDTH, BUTTON_WIDTH)
.addComponent(progressPanel)
.addComponent(updateLabel,
BUTTON_WIDTH, BUTTON_WIDTH, BUTTON_WIDTH)
.addComponent(updateButton)
.addComponent(removeButton))
.addGap(12)); // make buttons line up relative to the scrollbar
layout.setVerticalGroup(layout
.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(iconLabel)
.addComponent(label)
.addGroup(layout.createSequentialGroup()
.addComponent(installButton)
.addGroup(layout.createParallelGroup()
.addComponent(progressPanel)
.addComponent(updateLabel))
.addComponent(updateButton).addComponent(removeButton)));
layout.linkSize(SwingConstants.HORIZONTAL,
installButton, progressPanel, updateButton, removeButton);
progressPanel.setVisible(false);
updateLabel.setVisible(false);
installButton.setEnabled(false);
updateButton.setEnabled(false);
removeButton.setEnabled(false);
updateLabel.setVisible(true);
// Makes the label take up space even though not visible
layout.setHonorsVisibility(updateLabel, false);
validate();
}
void setMessage(String message) {
if (label != null) {
label.setText(message);
label.repaint();
}
}
void setErrorMessage(String message) {
if (label != null) {
label.setText(message);
label.repaint();
}
}
void clearMessage() {
if (label != null) {
label.setText(null);
label.repaint();
}
}
public void update(DetailPanel panel) {
progressPanel.removeAll();
iconLabel.setIcon(panel.getContrib().isSpecial() ? foundationIcon : null);
label.setText(panel.description);
((HTMLDocument)label.getDocument()).getStyleSheet().addRule(bodyRule);
updateButton.setEnabled(contributionListing.hasDownloadedLatestList() &&
(contributionListing.hasUpdates(panel.getContrib()) &&
!panel.getContrib().isUpdateFlagged()) &&
!panel.updateInProgress);
String latestVersion =
contributionListing.getLatestPrettyVersion(panel.getContrib());
String currentVersion = panel.getContrib().getPrettyVersion();
installButton.setEnabled(!panel.getContrib().isInstalled() &&
contributionListing.hasDownloadedLatestList() &&
panel.getContrib().isCompatible(Base.getRevision()) &&
!panel.installInProgress);
if (panel.getContrib().isCompatible(Base.getRevision())) {
if (installButton.isEnabled()) {
if (latestVersion != null) {
updateLabel.setText(latestVersion + " available");
} else {
updateLabel.setText("Available");
}
} else {
if (currentVersion != null) {
updateLabel.setText(currentVersion + " installed");
} else {
updateLabel.setText("Installed");
}
}
} else {
if (currentVersion != null) {
updateLabel.setText(currentVersion + " not compatible");
} else {
updateLabel.setText("Not compatible");
}
}
if (latestVersion != null) {
latestVersion = "Update to " + latestVersion;
} else {
latestVersion = "Update";
}
if (updateButton.isEnabled()) {
updateButton.setText(latestVersion);
} else {
updateButton.setText("Update");
}
removeButton.setEnabled(panel.getContrib().isInstalled() && !panel.removeInProgress);
progressPanel.add(panel.installProgressBar);
progressPanel.setVisible(false);
updateLabel.setVisible(true);
if (panel.updateInProgress || panel.installInProgress || panel.removeInProgress) {
progressPanel.setVisible(true);
updateLabel.setVisible(false);
progressPanel.repaint();
}
}
}