2 * Sudokuki - essential sudoku game
3 * Copyright (C) 2007-2013 Sylvain Vedrenne
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package net.jankenpoi.sudokuki.ui.swing;
20 import static net.jankenpoi.i18n.I18n._;
22 import java.awt.Color;
23 import java.awt.Desktop;
24 import java.awt.Dimension;
25 import java.awt.Frame;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import java.io.BufferedReader;
29 import java.io.IOException;
30 import java.io.InputStream;
31 import java.io.InputStreamReader;
33 import java.net.URISyntaxException;
35 import javax.swing.BoxLayout;
36 import javax.swing.ImageIcon;
37 import javax.swing.JButton;
38 import javax.swing.JComponent;
39 import javax.swing.JDialog;
40 import javax.swing.JEditorPane;
41 import javax.swing.JLabel;
42 import javax.swing.JPanel;
43 import javax.swing.JScrollPane;
44 import javax.swing.JTabbedPane;
45 import javax.swing.SwingConstants;
47 import net.jankenpoi.sudokuki.Version;
48 import net.jankenpoi.sudokuki.resources.UIResources;
50 @SuppressWarnings("serial")
51 public class AboutDialog extends JDialog {
55 private final String ABOUT_SUDOKUKI = _("About Sudokuki...");
56 private final String INFORMATION = _("Information");
57 private final String CONTRIBUTORS = _("Contributors");
58 private final String TRANSFER = _("Transfer");
59 private final String LICENSE = _("License");
61 public AboutDialog(Frame parent) {
65 setTitle(ABOUT_SUDOKUKI);
69 private void initComponents() {
70 URI sudokukiURI = null;
72 sudokukiURI = new URI("http://sudokuki.sourceforge.net");
73 } catch (URISyntaxException e1) {
77 JTabbedPane tabbedPane = new JTabbedPane();
78 tabbedPane.addTab(INFORMATION, null, makeInfoPanel(sudokukiURI),
81 tabbedPane.addTab(CONTRIBUTORS, null, makeTextPanel("<html><body>"
82 + "<table border=\"0\"><tr></tr>"
84 + "<tr><td align=\"right\"><b>"
86 + "</b></td><td></td><td align=\"left\">"
87 + _("Tamil translations")
88 + "<tr><td align=\"right\"><b>"
90 + "</b></td><td></td><td align=\"left\">"
91 + _("Spanish translations (v1.0)")
92 + "</td></tr><tr><td align=\"right\"><b>"
93 + _("Jeroen P. Broks")
94 + "</b></td><td></td><td align=\"left\">"
95 + _("Dutch translations")
96 + "</td></tr><tr><td align=\"right\"><b>"
97 + _("Helene Damianakos")
98 + "</b></td><td></td><td align=\"left\">"
99 + _("Greek translations (v1.0)")
100 + "</td></tr><tr><td align=\"right\"><b>"
102 + "</b></td><td></td><td align=\"left\">"
103 + _("Latvian translations")
104 + "</td></tr><tr><td align=\"right\"><b>"
105 + _("Rafael Ferreira")
106 + "</b></td><td></td><td align=\"left\">"
107 + _("Brazilian Portuguese translations")
108 + "</td></tr><tr><td align=\"right\"><b>"
110 + "</b></td><td></td><td align=\"left\">"
111 + _("Arabic translations")
112 + "</td></tr><tr><td align=\"right\"><b>"
113 + _("Stavros Mavrakis")
114 + "</b></td><td></td><td align=\"left\">"
115 + _("Greek translations")
116 + "</td></tr><tr><td align=\"right\"><b>"
117 + _("Fumiaki Nakanishi")
118 + "</b></td><td></td><td align=\"left\">"
119 + _("Japanese translations")
120 + "</td></tr><tr><td align=\"right\"><b>"
121 + _("Ahmet Kemal Okmen")
122 + "</b></td><td></td><td align=\"left\">"
123 + _("Turkish translations")
124 + "</td></tr><tr><td align=\"right\"><b>"
126 + "</b></td><td></td><td align=\"left\">"
127 + _("Chinese translations")
128 + "</td></tr><tr><td align=\"right\"><b>"
129 + _("Claus Poerschke")
130 + "</b></td><td></td><td align=\"left\">"
131 + _("Patches (v1.0) and German translations")
132 + "</td></tr><tr><td align=\"right\"><b>"
133 + _("Dmitry Salnikov")
134 + "</b></td><td></td><td align=\"left\">"
135 + _("Portuguese and Russian translations")
136 + "</td></tr><tr><td align=\"right\"><b>"
138 + "</b></td><td></td><td align=\"left\">"
139 + _("Hungarian translations")
140 + "</td></tr><tr><td align=\"right\"><b>"
141 + _("Helene Vedrenne")
142 + "</b></td><td></td><td align=\"left\">"
143 + _("Japanese translations")
144 + "</td></tr><tr><td align=\"right\"><b>"
145 + _("Sylvain Vedrenne")
146 + "</b></td><td></td><td align=\"left\">"
147 + _("Esperanto, French, and Japanese translations (v1.0)")
149 + "</td>" + "</tr>" + "</table>"
150 + "</body></html>"), CONTRIBUTORS);
155 makeTextPanel("<html><body>"
157 + _("<b>Sudokuki</b> is released under the terms of the GNU General Public License version 3 or later (GPL v3+).")
161 + _("The full license text is available in the file called COPYING that must be included in every copy of the program.")
165 + _("This program is Free Software (\"Free\" as in \"Freedom\") developped during the author's free-time in the hope that some users will find it useful, but WITHOUT ANY WARRANTY of any kind.")
169 + _("You are welcome to transfer this program to other people as long as you respect the license terms. Read the GNU General Public License for more details.")
170 + "<br/>" + "</p>" + "<p>"
171 + _("Copyright (C) 2007-2013 Sylvain Vedrenne")
172 + "<br/>" + "</p>" + "</body></html>"),
173 TRANSFER); // tooltip text
175 String license_html = "<html> <table border=\"0\"> <tr> <td>Please visit:</td> </tr><tr> <td>http://www.gnu.org/licenses/gpl.html</td> </tr>";
177 license_html = readTextFile("text/COPYING.html");
178 } catch (IOException e) {
180 JEditorPane editPane = new JEditorPane("text/html", license_html);
181 editPane.setEditable(false);
183 Color bgColor = new JPanel().getBackground();
184 editPane.setBackground(new Color(bgColor.getRed(), bgColor
185 .getGreen(), bgColor.getBlue()));
187 editPane.setCaretPosition(0);
188 JScrollPane scrollPane = new JScrollPane(editPane);
189 tabbedPane.addTab(LICENSE, null, scrollPane, LICENSE);
191 Dimension parentDim = parent.getPreferredSize();
192 Dimension dim = new Dimension();
193 double width = parentDim.getHeight() * 1.2;
194 double height = parentDim.getWidth() * 1.3;
195 dim.setSize(width, height);
196 tabbedPane.setPreferredSize(dim);
199 setLocationRelativeTo(parent);
202 protected JComponent makeTextPanel(String text) {
203 JEditorPane editPane = new JEditorPane("text/html", text);
205 Color bgColor = new JPanel().getBackground();
206 editPane.setBackground(new Color(bgColor.getRed(), bgColor
207 .getGreen(), bgColor.getBlue()));
209 editPane.setEditable(false);
210 editPane.setCaretPosition(0);
211 JScrollPane scrollPane = new JScrollPane(editPane);
215 protected JComponent makeInfoPanel(final URI sudokukiURI) {
216 JPanel textPanel = new JPanel();
217 JEditorPane infoPane = new JEditorPane("text/html", "<html>"
218 + "<table border=\"0\">" + "<tr>" + "<td align=\"center\"><b>"
219 + Version.versionString + "</b></td>" + "</tr>" + "<tr>"
220 + "<td align=\"center\">"
221 + _("Copyright (C) 2007-2013 Sylvain Vedrenne") + "</td>"
222 + "</tr>" + "</table>" + "</html>");
224 Color bgColor = new JPanel().getBackground();
225 infoPane.setBackground(new Color(bgColor.getRed(), bgColor
226 .getGreen(), bgColor.getBlue()));
228 infoPane.setEditable(false);
229 infoPane.setCaretPosition(0);
231 JPanel panel = new JPanel(false);
232 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
234 JPanel iconPanel = new JPanel(false);
235 ImageIcon icon = Images.ICON_APPLICATION_LOGO;
236 JLabel iconLabel = new JLabel(icon);
237 iconPanel.add(iconLabel);
238 panel.add(iconPanel);
240 textPanel.add(infoPane);
241 panel.add(textPanel);
243 JPanel linkPanel = new JPanel(false);
244 JButton linkButton = new JButton();
246 linkButton.setText("<HTML><FONT color=\"#000099\"><U>Sudokuki "
247 + _("on the Web") + "</U></FONT></HTML>");
248 linkButton.setHorizontalAlignment(SwingConstants.CENTER);
249 linkButton.setBorderPainted(false);
250 linkButton.setOpaque(false);
251 linkButton.setToolTipText(sudokukiURI.toString());
252 linkButton.addActionListener(new ActionListener() {
254 public void actionPerformed(ActionEvent e) {
255 AboutDialog.this.open(sudokukiURI);
258 linkButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
259 linkPanel.add(linkButton);
260 panel.add(linkPanel);
262 JScrollPane scrollPaneFeedback = new JScrollPane(panel);
263 return scrollPaneFeedback;
266 protected JComponent makeFeedbackPanel(final URI forumURI) {
267 JPanel panel = new JPanel(false);
268 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
270 String feedbackStr = "<html>"
272 + _("Feel free to request features and report bugs<br/>on the Sudokuki Forums hosted by Sourceforge!")
273 + "</p></body>" + "</html>";
274 JEditorPane feedbackPane = new JEditorPane("text/html", feedbackStr);
275 feedbackPane.setEditable(false);
276 feedbackPane.setCaretPosition(0);
277 Color bgColor = panel.getBackground();
278 feedbackPane.setBackground(new Color(bgColor.getRed(), bgColor
279 .getGreen(), bgColor.getBlue()));
281 JPanel feedbackPanel = new JPanel(false);
282 feedbackPanel.add(feedbackPane);
284 panel.add(feedbackPanel);
286 JPanel linkPanel = new JPanel(false);
287 JButton linkButton = new JButton();
289 linkButton.setText("<HTML><FONT color=\"#000099\"><U>"
290 + _("Sudokuki Forums") + "</U></FONT></HTML>");
291 linkButton.setHorizontalAlignment(SwingConstants.CENTER);
292 linkButton.setBorderPainted(false);
293 linkButton.setOpaque(false);
294 linkButton.setToolTipText(forumURI.toString());
295 linkButton.addActionListener(new ActionListener() {
297 public void actionPerformed(ActionEvent e) {
298 AboutDialog.this.open(forumURI);
301 linkButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
302 linkPanel.add(linkButton);
303 panel.add(linkPanel);
305 JScrollPane scrollPaneFeedback = new JScrollPane(panel);
306 return scrollPaneFeedback;
309 private void open(URI uri) {
310 if (Desktop.isDesktopSupported()) {
311 Desktop desktop = Desktop.getDesktop();
314 } catch (IOException e) {
318 System.out.println("Desktop.isDesktopSupported() returned false");
322 private static String readTextFile(String path) throws IOException {
324 InputStream is = UIResources.class.getResourceAsStream(path);
325 InputStreamReader isr = new InputStreamReader(is);
326 BufferedReader br = new BufferedReader(isr);
327 StringBuffer sb = new StringBuffer();
329 while ((line = br.readLine()) != null) {
330 sb.append(line + "\n");
335 return sb.toString();