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(5, 5, 0, 10),
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(1, 1));
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(0, 10, 10, 10),
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 }
|