OSDN Git Service

Fix issue #244 1.1.5: LanguageMenu lost sync with current locale
[sudokuki/sudokuki.git] / src / classes / net / jankenpoi / sudokuki / ui / swing / LanguageMenu.java
1 /*\r
2  * Sudokuki - essential sudoku game\r
3  * Copyright (C) 2007-2012 Sylvain Vedrenne\r
4  *\r
5  * This program is free software: you can redistribute it and/or modify\r
6  * it under the terms of the GNU General Public License as published by\r
7  * the Free Software Foundation, either version 3 of the License, or\r
8  * (at your option) any later version.\r
9  * \r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  * \r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
17  */\r
18 package net.jankenpoi.sudokuki.ui.swing;\r
19 \r
20 import static net.jankenpoi.i18n.I18n._;\r
21 \r
22 import java.awt.event.ActionEvent;\r
23 import java.awt.event.MouseAdapter;\r
24 import java.awt.event.MouseEvent;\r
25 import java.util.HashMap;\r
26 import java.util.Locale;\r
27 \r
28 import javax.swing.AbstractAction;\r
29 import javax.swing.ButtonGroup;\r
30 import javax.swing.Icon;\r
31 import javax.swing.JMenu;\r
32 import javax.swing.JRadioButtonMenuItem;\r
33 import javax.swing.event.MenuEvent;\r
34 import javax.swing.event.MenuListener;\r
35 \r
36 import net.jankenpoi.i18n.I18n;\r
37 import net.jankenpoi.i18n.LocaleListener;\r
38 import net.jankenpoi.sudokuki.ui.L10nComponent;\r
39 \r
40 @SuppressWarnings("serial")\r
41 public class LanguageMenu extends JMenu implements L10nComponent {\r
42 \r
43         private HashMap<String, JRadioButtonMenuItem> itemsMap = new HashMap<String, JRadioButtonMenuItem>();\r
44 \r
45         private String langCode;\r
46         \r
47         public LanguageMenu() {\r
48                 addItems();\r
49                 setIcon(languageIcon(_("DETECTED_LANGUAGE")));\r
50                 \r
51                 addMenuListener(new MenuListener() {\r
52                         \r
53                         @Override\r
54                         public void menuSelected(MenuEvent arg0) {\r
55                                 final String detectedLanguage = _("DETECTED_LANGUAGE");\r
56                                 langCode = detectedLanguage;\r
57                         }\r
58                         \r
59                         @Override\r
60                         public void menuDeselected(MenuEvent arg0) {\r
61                                 I18n.reset(langCode);\r
62                         }\r
63                         \r
64                                                 @Override\r
65                         public void menuCanceled(MenuEvent arg0) {\r
66                                 I18n.reset(langCode);\r
67                         }\r
68                 });\r
69                 \r
70                 final String detectedLanguage = _("DETECTED_LANGUAGE");\r
71                 JRadioButtonMenuItem selectedItem = itemsMap.get(detectedLanguage);\r
72                 setText(_("Language"));\r
73                 if (selectedItem != null) {\r
74                         selectedItem.setSelected(true);\r
75                 }\r
76                 localeListener = new LocaleListenerImpl(this);\r
77                 I18n.addLocaleListener(localeListener);\r
78         }\r
79                         \r
80         private void addItems() {\r
81                 ButtonGroup myGroup = new ButtonGroup();\r
82                 addItem("de", "Deutsch", myGroup);\r
83                 addItem("el", "E\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac", myGroup);\r
84                 addItem("en", "English", myGroup);\r
85                 addItem("eo", "Esperanto", myGroup);\r
86                 addItem("es", "Espa\u00f1ol", myGroup);\r
87                 addItem("fr", "Fran\u00e7ais", myGroup);\r
88                 addItem("ja", "\u65e5\u672c\u8a9e", myGroup);\r
89                 addItem("lv", "Latvie\u0161u", myGroup);\r
90                 addItem("nl", "Nederlands", myGroup);
91                 addItem("pt", "Portugu\u00eas", myGroup);\r
92                 addItem("pt_BR", "Portugu\u00eas (Brasil)", myGroup);\r
93                 addItem("ru", "\u0420\u0443\u0441\u0441\u043a\u0438\u0439", myGroup);\r
94                 addItem("zh", "\u4e2d\u6587", myGroup);\r
95         }\r
96 \r
97         private void addItem(final String code, String language, ButtonGroup group) {\r
98                 JRadioButtonMenuItem radioItem;\r
99 \r
100                 radioItem = new JRadioButtonMenuItem(language);\r
101                 itemsMap.put(code, radioItem);\r
102                 radioItem.setAction(new AbstractAction(language, languageIcon(code)) {\r
103 \r
104                         @Override\r
105                         public void actionPerformed(ActionEvent arg0) {\r
106                                 I18n.reset(code);\r
107                         }\r
108                 });\r
109 \r
110                 radioItem.addMouseListener(new MouseAdapter() {\r
111 \r
112                         @Override\r
113                         public void mouseEntered(MouseEvent e) {\r
114                                 I18n.reset(code);\r
115                         }\r
116                         \r
117                         @Override\r
118                         public void mouseExited(MouseEvent e) {\r
119                                 I18n.reset(langCode);\r
120                         }\r
121 \r
122                 });\r
123                 group.add(radioItem);\r
124                 add(radioItem);\r
125         }\r
126 \r
127         private final LocaleListener localeListener;\r
128                 @Override\r
129                 public void setL10nMessages(Locale locale, String languageCode) {\r
130                         setText(_("Language"));\r
131                         setIcon(languageIcon(languageCode));\r
132 \r
133                 JRadioButtonMenuItem selectedItem = itemsMap.get(languageCode);\r
134                 if (selectedItem != null) {\r
135                         selectedItem.setSelected(true);\r
136                 }                                                               \r
137                         \r
138                         if (this.isSelected()) {\r
139                                 return;\r
140                         }\r
141                 }\r
142 \r
143                 public static Icon languageIcon(final String langCode) {\r
144                         if ("de".equals(langCode)) {\r
145                                 return StockIcons.ICON_FLAG_DE;\r
146                         } else if ("el".equals(langCode)) {\r
147                                 return StockIcons.ICON_FLAG_EL;\r
148                         } else if ("eo".equals(langCode)) {\r
149                                 return StockIcons.ICON_FLAG_EO;\r
150                         } else if ("en".equals(langCode)) {\r
151                                 return StockIcons.ICON_FLAG_EN;\r
152                         } else if ("es".equals(langCode)) {\r
153                                 return StockIcons.ICON_FLAG_ES;\r
154                         } else if ("fr".equals(langCode)) {\r
155                                 return StockIcons.ICON_FLAG_FR;\r
156                         } else if ("ja".equals(langCode)) {\r
157                                 return StockIcons.ICON_FLAG_JA;\r
158                         } else if ("lv".equals(langCode)) {\r
159                                 return StockIcons.ICON_FLAG_LV;\r
160                         } else if ("nl".equals(langCode)) {\r
161                                 return StockIcons.ICON_FLAG_NL;\r
162                         } else if ("pt".equals(langCode)) {\r
163                                 return StockIcons.ICON_FLAG_PT;\r
164                         } else if ("pt_BR".equals(langCode)) {\r
165                                 return StockIcons.ICON_FLAG_BR;\r
166                         } else if ("ru".equals(langCode)) {\r
167                                 return StockIcons.ICON_FLAG_RU;\r
168                         } else if ("zh".equals(langCode)) {\r
169                                 return StockIcons.ICON_FLAG_ZH;\r
170                         }\r
171                         return StockIcons.ICON_GO_HOME;\r
172                 }\r
173                 \r
174 }\r