OSDN Git Service

Added Turkish language support
[sudokuki/sudokuki.git] / src / classes / net / jankenpoi / sudokuki / ui / swing / AboutDialog.java
1 /*
2  * Sudokuki - essential sudoku game
3  * Copyright (C) 2007-2013 Sylvain Vedrenne
4  *
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.
9  *
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.
14  *
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/>.
17  */
18 package net.jankenpoi.sudokuki.ui.swing;
19
20 import static net.jankenpoi.i18n.I18n._;
21
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;
32 import java.net.URI;
33 import java.net.URISyntaxException;
34
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;
46
47 import net.jankenpoi.sudokuki.Version;
48 import net.jankenpoi.sudokuki.resources.UIResources;
49
50 @SuppressWarnings("serial")
51 public class AboutDialog extends JDialog {
52
53         private Frame parent;
54
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");
60
61         public AboutDialog(Frame parent) {
62                 super(parent, true);
63                 this.parent = parent;
64                 initComponents();
65                 setTitle(ABOUT_SUDOKUKI);
66                 pack();
67         }
68
69         private void initComponents() {
70                 URI sudokukiURI = null;
71                 try {
72                         sudokukiURI = new URI("http://sudokuki.sourceforge.net");
73                 } catch (URISyntaxException e1) {
74                         e1.printStackTrace();
75                 }
76
77                 JTabbedPane tabbedPane = new JTabbedPane();
78                 tabbedPane.addTab(INFORMATION, null, makeInfoPanel(sudokukiURI),
79                                 INFORMATION);
80
81                 tabbedPane.addTab(CONTRIBUTORS, null, makeTextPanel("<html><body>"
82                                 + "<table border=\"0\"><tr></tr>"
83                                 
84                                 + "<tr><td align=\"right\"><b>"
85                                 + _("Sathish Anandh")
86                                 + "</b></td><td></td><td align=\"left\">"
87                                 + _("Tamil translations")
88                                 + "<tr><td align=\"right\"><b>"
89                                 + _("Aritz Beraza")
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>"
101                                 + _("Janis Eisaks")
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>"
109                                 + _("Daneih Ismail")
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>"
125                                 + _("Jeanne Peng")
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>"
137                                 + _("Toni")
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)")
148                                 
149                                 + "</td>" + "</tr>" + "</table>"
150                                 + "</body></html>"), CONTRIBUTORS);
151
152                 tabbedPane
153                                 .addTab(TRANSFER,
154                                                 null,
155                                                 makeTextPanel("<html><body>"
156                                                                 + "<p>"
157                                                                 + _("<b>Sudokuki</b> is released under the terms of the GNU General Public License version 3 or later (GPL v3+).")
158                                                                 + "<br/>"
159                                                                 + "</p>"
160                                                                 + "<p>"
161                                                                 + _("The full license text is available in the file called COPYING that must be included in every copy of the program.")
162                                                                 + "<br/>"
163                                                                 + "</p>"
164                                                                 + "<p>"
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.")
166                                                                 + "<br/>"
167                                                                 + "</p>"
168                                                                 + "<p>"
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
174
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>";
176                 try {
177                         license_html = readTextFile("text/COPYING.html");
178                 } catch (IOException e) {
179                 }
180                 JEditorPane editPane = new JEditorPane("text/html", license_html);
181                 editPane.setEditable(false);
182                 {
183                         Color bgColor = new JPanel().getBackground();
184                         editPane.setBackground(new Color(bgColor.getRed(), bgColor
185                                         .getGreen(), bgColor.getBlue()));
186                 }
187                 editPane.setCaretPosition(0);
188                 JScrollPane scrollPane = new JScrollPane(editPane);
189                 tabbedPane.addTab(LICENSE, null, scrollPane, LICENSE);
190
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);
197                 add(tabbedPane);
198                 pack();
199                 setLocationRelativeTo(parent);
200         }
201
202         protected JComponent makeTextPanel(String text) {
203                 JEditorPane editPane = new JEditorPane("text/html", text);
204                 {
205                         Color bgColor = new JPanel().getBackground();
206                         editPane.setBackground(new Color(bgColor.getRed(), bgColor
207                                         .getGreen(), bgColor.getBlue()));
208                 }
209                 editPane.setEditable(false);
210                 editPane.setCaretPosition(0);
211                 JScrollPane scrollPane = new JScrollPane(editPane);
212                 return scrollPane;
213         }
214
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>");
223                 {
224                         Color bgColor = new JPanel().getBackground();
225                         infoPane.setBackground(new Color(bgColor.getRed(), bgColor
226                                         .getGreen(), bgColor.getBlue()));
227                 }
228                 infoPane.setEditable(false);
229                 infoPane.setCaretPosition(0);
230
231                 JPanel panel = new JPanel(false);
232                 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
233
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);
239
240                 textPanel.add(infoPane);
241                 panel.add(textPanel);
242
243                 JPanel linkPanel = new JPanel(false);
244                 JButton linkButton = new JButton();
245
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() {
253                         @Override
254                         public void actionPerformed(ActionEvent e) {
255                                 AboutDialog.this.open(sudokukiURI);
256                         }
257                 });
258                 linkButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
259                 linkPanel.add(linkButton);
260                 panel.add(linkPanel);
261
262                 JScrollPane scrollPaneFeedback = new JScrollPane(panel);
263                 return scrollPaneFeedback;
264         }
265
266         protected JComponent makeFeedbackPanel(final URI forumURI) {
267                 JPanel panel = new JPanel(false);
268                 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
269
270                 String feedbackStr = "<html>"
271                                 + "<body><p></p><p>"
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()));
280
281                 JPanel feedbackPanel = new JPanel(false);
282                 feedbackPanel.add(feedbackPane);
283
284                 panel.add(feedbackPanel);
285
286                 JPanel linkPanel = new JPanel(false);
287                 JButton linkButton = new JButton();
288
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() {
296                         @Override
297                         public void actionPerformed(ActionEvent e) {
298                                 AboutDialog.this.open(forumURI);
299                         }
300                 });
301                 linkButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
302                 linkPanel.add(linkButton);
303                 panel.add(linkPanel);
304
305                 JScrollPane scrollPaneFeedback = new JScrollPane(panel);
306                 return scrollPaneFeedback;
307         }
308
309         private void open(URI uri) {
310                 if (Desktop.isDesktopSupported()) {
311                         Desktop desktop = Desktop.getDesktop();
312                         try {
313                                 desktop.browse(uri);
314                         } catch (IOException e) {
315                                 e.printStackTrace();
316                         }
317                 } else {
318                         System.out.println("Desktop.isDesktopSupported() returned false");
319                 }
320         }
321
322         private static String readTextFile(String path) throws IOException {
323
324                 InputStream is = UIResources.class.getResourceAsStream(path);
325                 InputStreamReader isr = new InputStreamReader(is);
326                 BufferedReader br = new BufferedReader(isr);
327                 StringBuffer sb = new StringBuffer();
328                 String line;
329                 while ((line = br.readLine()) != null) {
330                         sb.append(line + "\n");
331                 }
332                 br.close();
333                 isr.close();
334                 is.close();
335                 return sb.toString();
336         }
337
338 }