/**************************************************************************** * Copyright (C) 2012 ecsec GmbH. * All rights reserved. * Contact: ecsec GmbH (info@ecsec.de) * * This file is part of the Open eCard App. * * GNU General Public License Usage * This file may be used under the terms of the GNU General Public * License version 3.0 as published by the Free Software Foundation * and appearing in the file LICENSE.GPL included in the packaging of * this file. Please review the following information to ensure the * GNU General Public License version 3.0 requirements will be met: * http://www.gnu.org/copyleft/gpl.html. * * Other Usage * Alternatively, this file may be used in accordance with the terms * and conditions contained in a signed written agreement between * you and ecsec GmbH. * ***************************************************************************/ package org.openecard.gui.about; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Desktop; import java.awt.Font; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextPane; import javax.swing.SwingConstants; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent.EventType; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.HTMLEditorKit; import org.openecard.common.I18n; import org.openecard.common.Version; import org.openecard.gui.graphics.GraphicsUtil; import org.openecard.gui.graphics.OecLogoBgWhite; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class is used to create a Swing based about dialog. * The dialog is localized with the {@code about} properties from the i18n module and the HTML pages in this modules' * {@code openecard_i18n/about} directory. * * @author Johannes Schmölz <johannes.schmoelz@ecsec.de> */ public class AboutDialog extends JDialog { private static final Logger logger = LoggerFactory.getLogger(AboutDialog.class); private static final long serialVersionUID = 1L; private final transient I18n lang = I18n.getTranslation("about"); /** * Creates a new instance of this class. */ public AboutDialog() { super(); setupUI(); } /** * Convenience method for showing an about dialog. * Since this method is static, there is no need to create an instance of AboutDialog to call it. */ public static void showDialog() { AboutDialog dialog = new AboutDialog(); dialog.setVisible(true); } private void setupUI() { Image logo = GraphicsUtil.createImage(OecLogoBgWhite.class, 147, 147); setSize(730, 480); // use null layout with absolute positioning getContentPane().setLayout(null); getContentPane().setBackground(Color.white); JTextPane txtpnHeading = new JTextPane(); txtpnHeading.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20)); txtpnHeading.setEditable(false); txtpnHeading.setText(lang.translationForKey("about.heading")); txtpnHeading.setBounds(12, 12, 692, 30); getContentPane().add(txtpnHeading); JTextPane txtpnVersion = new JTextPane(); txtpnVersion.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 9)); txtpnVersion.setEditable(false); txtpnVersion.setText(lang.translationForKey("about.version", Version.getVersion())); txtpnVersion.setBounds(12, 54, 692, 18); getContentPane().add(txtpnVersion); JLabel label = new JLabel(); label.setHorizontalAlignment(SwingConstants.CENTER); label.setIcon(new ImageIcon(logo)); label.setBounds(12, 84, 155, 320); getContentPane().add(label); JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); tabbedPane.setBounds(185, 84, 529, 320); tabbedPane.setBackground(Color.white); tabbedPane.addTab(lang.translationForKey("about.tab.about"), createTabContent("about")); tabbedPane.addTab(lang.translationForKey("about.tab.feedback"), createTabContent("feedback")); tabbedPane.addTab(lang.translationForKey("about.tab.join"), createTabContent("join")); tabbedPane.addTab(lang.translationForKey("about.tab.license"), createTabContent("gpl-v3")); getContentPane().add(tabbedPane); JButton btnClose = new JButton(lang.translationForKey("about.button.close")); btnClose.setBounds(587, 416, 117, 25); btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); getContentPane().add(btnClose); setIconImage(logo); setTitle(lang.translationForKey("about.title")); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); } private JPanel createTabContent(String resourceName) { HTMLEditorKit kit = new HTMLEditorKit(); HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument(); JEditorPane editorPane = new JEditorPane(); editorPane.setEditable(false); editorPane.setEditorKit(kit); editorPane.setDocument(doc); try { URL url = lang.translationForFile(resourceName, "html"); editorPane.setPage(url); } catch (IOException ex) { editorPane.setText("Page not found."); } editorPane.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { openUrl(e); } }); JScrollPane scrollPane = new JScrollPane(editorPane); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(scrollPane, BorderLayout.CENTER); return panel; } private void openUrl(HyperlinkEvent event) { EventType type = event.getEventType(); if (type == EventType.ACTIVATED) { String url = event.getURL().toExternalForm(); try { boolean browserOpened = false; URI uri = new URI(url); if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { try { Desktop.getDesktop().browse(uri); browserOpened = true; } catch (IOException ex) { // failed to open browser logger.debug(ex.getMessage(), ex); } } if (! browserOpened) { ProcessBuilder pb = new ProcessBuilder("xdg-open", uri.toString()); try { pb.start(); } catch (IOException ex) { // failed to execute command logger.debug(ex.getMessage(), ex); } } } catch (URISyntaxException ex) { // wrong syntax logger.debug(ex.getMessage(), ex); } } } }