/*
* File : AboutWindow.java
* Created : 07-dec-2001 10:14
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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 (see the LICENSE file).
*/
package edu.xtec.jclic.skins;
import edu.xtec.jclic.Constants;
import edu.xtec.util.*;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.HTMLDocument;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.08
*/
public class AboutWindow extends edu.xtec.util.ExtendedJDialog implements HyperlinkListener{
protected ResourceBridge rb;
protected JTabbedPane tPane;
public AboutWindow(Component parent, ResourceBridge rb, Dimension setSize){
super(parent, rb.getMsg("about_window_caption"), true);
this.rb=rb;
JPanel mainPane=new JPanel();
mainPane.setLayout(new BorderLayout());
mainPane.setPreferredSize(setSize);
tPane=new JTabbedPane();
mainPane.add(tPane, BorderLayout.CENTER);
JPanel btPanel=new JPanel();
btPanel.setLayout(new java.awt.GridLayout(1, 2));
JButton btClose=new JButton(rb.getMsg("about_window_close_button"), ResourceManager.getImageIcon("icons/exit_small.gif"));
btClose.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
setVisible(false);
}
});
btPanel.add(btClose);
mainPane.add(btPanel, BorderLayout.SOUTH);
getContentPane().add(mainPane);
pack();
centerOver(parent);
}
public JTabbedPane getTabbedPane(){
return tPane;
}
public void addUrlDocumentTab(java.net.URL url, String tabTitle, Icon icon){
try{
final JEditorPane ep=new JEditorPane(url);
ep.setEditable(false);
ep.addHyperlinkListener(this);
tPane.addTab(tabTitle, icon, new JScrollPane(ep));
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
ep.scrollRectToVisible(new Rectangle(0, 0));
}
});
} catch(java.io.IOException ex){
System.err.println("Error building about window:\n"+ex);
tPane.addTab(tabTitle, new JLabel("ERROR"));
}
}
public void addStrDocumentTab(String src, String tabTitle, java.net.URL base, Icon icon){
final JEditorPane ep=new JEditorPane();
ep.setEditorKit(ep.getEditorKitForContentType("text/html"));
if(base==null)
base=getAboutUrlBase();
if(base!=null)
((HTMLDocument)ep.getDocument()).setBase(base);
ep.setText(src);
ep.setEditable(false);
ep.addHyperlinkListener(this);
tPane.addTab(tabTitle, icon, new JScrollPane(ep));
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
ep.scrollRectToVisible(new Rectangle(0, 0));
}
});
}
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
final String sUrl=e.getURL().toString();
SwingUtilities.invokeLater(new Runnable(){
public void run(){
rb.displayUrl(sUrl, true);
}
});
}
}
private static java.net.URL urlBase;
public static java.net.URL getAboutUrlBase(){
if(urlBase==null){
try{
java.net.URL rootDocUrl=ResourceManager.getResource("about/about.html");
String s=rootDocUrl.toString();
urlBase=new java.net.URL(s.substring(0, s.lastIndexOf('/')+1));
} catch(Exception ex){
System.err.println("Resource missing: about.html");
}
}
return urlBase;
}
public void buildAboutTab(String appName, String appVersion, String logoIcon, String creditsDoc, String otherCreditsDoc, String licenseDoc, String sponsorsDoc) throws Exception{
String doc=ResourceManager.getResourceText("about/about.html", false);
if(appName==null)
appName="JClic";
if(logoIcon==null)
logoIcon="logo_small.png";
if(creditsDoc==null)
//creditsDoc=rb.getMsg("about_creditsDoc");
creditsDoc="about/credits.html";
String credits=ResourceManager.getResourceText(creditsDoc, false);
String translationCredits=rb.getMsg("html_translation_credits");
if(otherCreditsDoc==null)
otherCreditsDoc=rb.getMsg("about_otherCreditsDoc");
String otherCredits=ResourceManager.getResourceText(otherCreditsDoc, false);
String license=rb.getMsg("html_gpl_license");
if(licenseDoc!=null)
//licenseDoc=rb.getMsg("about_licenseDoc");
license=ResourceManager.getResourceText(licenseDoc, false);
if(sponsorsDoc==null)
sponsorsDoc=rb.getMsg("about_sponsorsDoc");
String sponsors=ResourceManager.getResourceText(sponsorsDoc, false);
java.net.URL iconUrl=ResourceManager.getResource("about/"+logoIcon);
//doc=StrUtils.replace(doc, "%LOGO", logoIcon);
doc=StrUtils.replace(doc, "%LOGO", iconUrl.toExternalForm());
StringBuilder sb=new StringBuilder(appName);
if(appVersion!=null)
sb.append(" ").append(rb.getMsg("VERSION")).append(" ").append(appVersion);
doc=StrUtils.replace(doc, "%APPVERSION", sb.substring(0));
doc=StrUtils.replace(doc, "%CREDITS", credits);
doc=StrUtils.replace(doc, "%TRANSLATION", translationCredits);
sb.setLength(0);
sb.append(rb.getMsg("about_otherCreditsCaption")).append("<BR> <BR>").append(otherCredits);
doc=StrUtils.replace(doc, "%OTHERCREDITS", sb.substring(0));
doc=StrUtils.replace(doc, "%LICENSE", license);
sb.setLength(0);
if(sponsors!=null && sponsors.length()>0)
sb.append(rb.getMsg("about_sponsorsCaption")).append("<BR>").append(sponsors);
doc=StrUtils.replace(doc, "%SPONSORS", sb.substring(0));
addStrDocumentTab(doc, rb.getMsg("ABOUT"), getAboutUrlBase(), ResourceManager.getImageIcon("icons/about_small.gif"));
}
public void buildStandardTab(String htmlContent, String titleKey, String labelKey, String icon){
String htmlBgColor=rb.getMsg("about_window_html_bgcolor");
String htmlStyle=rb.getMsg("about_window_html_style");
String header=rb.getMsg("about_window_html_header");
StringBuilder sb=new StringBuilder(4096);
sb.append(header);
if(titleKey!=null){
sb.append("<br><b>").append(rb.getMsg(titleKey)).append("</b><hr>");
}
sb.append(htmlContent);
String s=Html.table(sb.substring(0), "100%", 0, 5, -1, htmlStyle, true);
addStrDocumentTab(Html.getHtmlDoc(s, htmlBgColor), rb.getMsg(labelKey), getAboutUrlBase(), ResourceManager.getImageIcon(icon));
}
public String getHtmlSystemInfo(){
Messages msg=rb.getOptions().getMessages();
Html html=new Html(3000);
//html.tr(true).td(msg.get("about_window_lb_version"), Html.LEFT, true, "WIDTH=\"40%\"").td(Constants.VERSION_STR, Html.LEFT, false, "WIDTH=\"60%\"").tr(false);
html.doubleCell(msg.get("about_window_lb_os"), true, System.getProperty("os.name")+" "+System.getProperty("os.version")+" - "+System.getProperty("os.arch"), false);
html.doubleCell(msg.get("about_window_lb_java_version"), true, System.getProperty("java.version"), false);
html.doubleCell(msg.get("about_window_lb_java_vm"), true, System.getProperty("java.vm.name")+" "+System.getProperty("java.vm.version")+"\n"+System.getProperty("java.vm.vendor"), false);
html.doubleCell(msg.get("about_window_lb_java_home"), true, System.getProperty("java.home"), false);
html.doubleCell(msg.get("about_window_lb_free_mem"), true, msg.kValue(Runtime.getRuntime().freeMemory()), false);
html.doubleCell(msg.get("about_window_lb_total_mem"), true, msg.kValue(Runtime.getRuntime().totalMemory()), false);
Object o=rb.getOptions().get(Constants.MEDIA_SYSTEM);
String s= Constants.JMF.equals(o) ? "Java Media Framework"
//: Constants.QT.equals(o) ? "QuickTime for Java 6.0-"
: Constants.QT61.equals(o) ? "QuickTime for Java 6.1+"
: "-";
html.doubleCell(msg.get("about_window_lb_mediaSystem"), true, s, false);
if(rb.getOptions().getBoolean(Constants.TRACE)){
java.util.Iterator it=System.getProperties().keySet().iterator();
while(it.hasNext()){
String k=(String)it.next();
html.doubleCell(k, true, System.getProperty(k), false);
}
}
return Html.table(html.toString(), null, 0, 5, -1, null, false);
}
}