AboutDialog.java
001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002  *
003  * Copyright 2000-2013,  Michael Meyling <mime@qedeq.org>.
004  *
005  * "Hilbert II" is free software; you can redistribute
006  * it and/or modify it under the terms of the GNU General Public
007  * License as published by the Free Software Foundation; either
008  * version 2 of the License, or (at your option) any later version.
009  *
010  * This program is distributed in the hope that it will be useful,
011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013  * GNU General Public License for more details.
014  */
015 
016 package org.qedeq.gui.se.pane;
017 
018 import java.awt.BorderLayout;
019 import java.awt.Cursor;
020 import java.awt.Frame;
021 import java.awt.GridLayout;
022 import java.awt.Toolkit;
023 import java.awt.datatransfer.Clipboard;
024 import java.awt.datatransfer.StringSelection;
025 import java.awt.event.ActionEvent;
026 import java.awt.event.ActionListener;
027 import java.awt.event.MouseAdapter;
028 import java.awt.event.MouseEvent;
029 import java.awt.event.WindowAdapter;
030 import java.awt.event.WindowEvent;
031 
032 import javax.swing.ImageIcon;
033 import javax.swing.JButton;
034 import javax.swing.JComponent;
035 import javax.swing.JDialog;
036 import javax.swing.JLabel;
037 import javax.swing.JPanel;
038 import javax.swing.JScrollPane;
039 import javax.swing.JTabbedPane;
040 import javax.swing.JTable;
041 import javax.swing.JTextArea;
042 import javax.swing.JViewport;
043 import javax.swing.UIManager;
044 import javax.swing.border.CompoundBorder;
045 import javax.swing.border.EmptyBorder;
046 import javax.swing.table.DefaultTableModel;
047 
048 import org.qedeq.base.io.IoUtility;
049 import org.qedeq.base.utility.DateUtility;
050 import org.qedeq.base.utility.StringUtility;
051 import org.qedeq.gui.se.element.CPTextArea;
052 import org.qedeq.gui.se.util.BareBonesBrowserLaunch;
053 import org.qedeq.gui.se.util.GuiHelper;
054 import org.qedeq.kernel.bo.KernelContext;
055 
056 import com.jgoodies.forms.builder.ButtonBarBuilder;
057 
058 /**
059  * Shows the application's "About" dialog box.
060  *
061  @author  Michael Meyling
062  */
063 
064 public class AboutDialog extends JDialog {
065 
066     /**
067      * Constructor.
068      *
069      @param   parent  Parent frame.
070      */
071     public AboutDialog(final Frame parent) {
072         super(parent, "About"true);
073         final JPanel content = new JPanel(new BorderLayout());
074         getContentPane().add(content);
075 
076         final ImageIcon icon = GuiHelper.readImageIcon("qedeq/32x32/qedeq.png");
077         final JLabel logo = new JLabel(icon, JLabel.RIGHT);
078         logo.setText("GUI for Hilbert II ");
079         logo.setHorizontalTextPosition(JLabel.LEFT);
080         logo.setFont(UIManager.getFont("TitledBorder.font"));
081 //        logo.setOpaque(true);
082         logo.setBorder(new CompoundBorder(new EmptyBorder(55010),
083             logo.getBorder()));
084 
085         final String url = "http://www.qedeq.org/";
086 
087         final JPanel logoPanel = new JPanel();
088 //        logoPanel.setLayout(new BoxLayout(logoPanel, BoxLayout.X_AXIS));
089         logoPanel.setLayout(new GridLayout(11));
090         logoPanel.add(logo);
091 
092 //      logoPanel.setOpaque(true);
093         logoPanel.setToolTipText(url);
094         logoPanel.setCursor(new Cursor(Cursor.HAND_CURSOR));
095         logoPanel.addMouseListener(new MouseAdapter() {
096             public void mouseClicked(final MouseEvent e) {
097                 try {
098                     BareBonesBrowserLaunch.openURL(url);
099                 catch (Exception ex) { // ignore, just not open web page
100                 }
101             }
102         });
103 
104 //        logoPanel.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5),
105 //                new EtchedBorder()));
106         content.add(logoPanel, BorderLayout.NORTH);
107 
108         final JTabbedPane tabbedPane = new JTabbedPane();
109         tabbedPane.setOpaque(false);
110 //        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
111 //        tabbedPane.putClientProperty(Options.EMBEDDED_TABS_KEY, Boolean.TRUE);
112         tabbedPane.addTab("About", createAboutTab());
113         tabbedPane.addTab("System Properties", createSystemPropertiesTab());
114 //        tabbedPane.setBorder(GuiHelper.getEmptyBorder());
115         tabbedPane.setBorder(new CompoundBorder(new EmptyBorder(0101010),
116                 tabbedPane.getBorder()));
117         content.add(tabbedPane, BorderLayout.CENTER);
118 
119         content.add(createBottomBar(), BorderLayout.SOUTH);
120 
121 
122         // let the container calculate the ideal size
123         this.pack();
124 
125 //        int width = 540;
126 //        int height = 400;
127 //        this.setSize(width, height);
128 
129         this.addWindowListener(new WindowAdapter() {
130             public void windowClosing(final WindowEvent e) {
131                 AboutDialog.this.dispose();
132             }
133         });
134 
135     }
136 
137     private JComponent createBottomBar() {
138         final ButtonBarBuilder bbuilder = ButtonBarBuilder.createLeftToRightBuilder();
139         final JButton ok = new JButton("Close");
140         ok.addActionListener(new  ActionListener() {
141             public void actionPerformed(final ActionEvent actionEvent) {
142                 String command = actionEvent.getActionCommand();
143 
144                 if (command.compareTo("Close"== 0) {
145                     AboutDialog.this.dispose();
146                 }
147             }
148         });
149 
150         JButton copyButton = new JButton("Copy System Properties");
151         copyButton.addActionListener(new  ActionListener() {
152             public void actionPerformed(final ActionEvent actionEvent) {
153                 final StringBuffer sb = new StringBuffer(1000);
154                 final String[][] prop = IoUtility.getSortedSystemProperties();
155                 sb.append("# Copied Java system properties during run of ");
156                 sb.append(KernelContext.getInstance().getDescriptiveKernelVersion());
157                 sb.append("\n");
158                 sb.append("# GMT: ");
159                 sb.append(DateUtility.getGmtTimestamp());
160                 sb.append("\n#");
161                 sb.append("\n# The following list contains excaped characters as defined for"
162                     " \"properties\" files");
163                 sb.append("\n#\n");
164                 for (int i = 0; i < prop.length; i++) {
165                     sb.append(StringUtility.escapeProperty(prop[i][0]));
166                     sb.append("=");
167                     sb.append(StringUtility.escapeProperty(prop[i][1]));
168                     sb.append("\n");
169                 }
170                 Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
171                 StringSelection sel = new StringSelection(sb.toString());
172                 cb.setContents(sel, null);
173             }
174         });
175         copyButton.setToolTipText("Copy Java system information into "
176             "the clipboard.");
177 
178         bbuilder.addGriddedButtons(new JButton[]{copyButton, ok});
179 
180         return GuiHelper.addSpaceAndAlignRight(bbuilder.getPanel());
181 
182     }
183 
184     private JComponent createSystemPropertiesTab() {
185         final String[][] rowData = IoUtility.getSortedSystemProperties();
186         for (int i = 0; i < rowData.length; i++) {
187             // escape following property also for view
188             if ("line.separator".equals(rowData[i][0])) {
189                 rowData[i][1= StringUtility.escapeProperty(rowData[i][1]);
190                 break;  // no further search
191             }
192         }
193         String[] nvStrings = new String[] {"Property""Value"};
194         final DefaultTableModel model = new DefaultTableModel(rowData, nvStrings) {
195             public boolean isCellEditable(final int row, final int col) {
196                 return false;
197             }
198         };
199         JTable table = new JTable(model);
200         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
201         GuiHelper.calcColumnWidths(table);
202         JScrollPane scroller = new JScrollPane(table);
203 //        scroller.setBorder(new LineBorder(UIManager.getColor("controlHighlight"),1));
204         scroller.setBorder(GuiHelper.getEmptyBorder());
205         scroller.setBackground(UIManager.getColor("controlShadow"));
206 //        scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
207 //        scroller.setBorder(new CompoundBorder(new EmptyBorder(5, 0, 0, 0), scroller.getBorder()));
208         return scroller;
209 //        JPanel propTab = new JPanel(new BorderLayout());
210 //        propTab.add(new JLabel("Current system properties:"),
211 //                BorderLayout.NORTH);
212 //        propTab.add(scroller, BorderLayout.CENTER);
213 //        return propTab;
214     }
215 
216     private JComponent createAboutTab() {
217         final JPanel panel = new JPanel(new BorderLayout());
218 
219         final StringBuffer sb = new StringBuffer();
220         sb.append("This is Hilbert II - a project to create a formal correct (checkable by a proof"
221             " verifier) but readable (like an ordinary LaTeX textbook) mathematical knowledge base.");
222         sb.append("\n\nWritten by Michael Meyling <mime@qedeq.org>");
223         sb.append("\nCopyright \u00a9 2000 - 2013 Michael Meyling. All Rights Reserved.");
224         sb.append("\n\nHilbert II comes with ABSOLUTELY NO WARRANTY. This is free software, and you"
225             " are welcome to redistribute it under certain conditions.");
226         sb.append(" Please take a look at the license argreements section in the online help.");
227         sb.append("\n\nKernel Version: " + KernelContext.getInstance().getKernelVersion());
228         sb.append("\nCode Name: " + KernelContext.getInstance().getKernelCodeName());
229         sb.append("\nBuild: " + KernelContext.getInstance().getBuildId());
230         sb.append("\n\n" + KernelContext.getInstance().getDedication());
231         sb.append("\n\n");
232         sb.append("\nUsed memory: ");
233         sb.append(Runtime.getRuntime().totalMemory()
234             - Runtime.getRuntime().freeMemory());
235         sb.append("\nFree memory: ");
236         sb.append(Runtime.getRuntime().freeMemory());
237         sb.append("\nTotal memory: ");
238         sb.append(Runtime.getRuntime().totalMemory());
239         sb.append("\nMaximum memory: ");
240         sb.append(Runtime.getRuntime().maxMemory());
241         sb.append("\n\nNumber of processors/cores: ");
242         sb.append(Runtime.getRuntime().availableProcessors());
243         final JComponent copy = createTextScroller(sb.toString());
244         copy.setBorder(GuiHelper.getEmptyBorder());
245         // add to panel
246         panel.add(copy, BorderLayout.CENTER);
247         return panel;
248     }
249 
250     public static JScrollPane createTextScroller(final String text) {
251         final JScrollPane scroller = new JScrollPane();
252         final JViewport vp = scroller.getViewport();
253         vp.add(createTextArea(text));
254         scroller.setBackground(UIManager.getColor("controlShadow"));
255         return scroller;
256     }
257 
258     public static JTextArea createTextArea(final String text) {
259         JTextArea textArea = new CPTextArea(text, false);
260         textArea.setLineWrap(true);
261         textArea.setWrapStyleWord(true);
262         textArea.setCaretPosition(0);
263         textArea.setBackground(UIManager.getColor("controlHighlight"));
264         return textArea;
265     }
266 
267 }