1 /* $Id: Editor.java 14 2008-12-07 16:56:26Z mihlon $ */
2
3 //////////////////////////////////////////////////////////////////////////////
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 //////////////////////////////////////////////////////////////////////////////
19
20 package cs.pancava.caltha;
21
22 import cs.pancava.caltha.desktop.EditorDesktop;
23 import cs.pancava.caltha.desktop.EditorDesktopNone;
24 import cs.pancava.caltha.desktop.EditorDesktopTextBasedGames;
25 import java.awt.BorderLayout;
26 import java.awt.Toolkit;
27 import java.util.Locale;
28 import java.util.MissingResourceException;
29 import java.util.ResourceBundle;
30 import javax.swing.JFrame;
31 import javax.swing.JMenuBar;
32 import javax.swing.JOptionPane;
33 import javax.swing.JPanel;
34 import javax.swing.JToolBar;
35
36 /**
37 * <p><b>Vytvori hlavni GUI editoru pro vytvareni RPG sveta.</b></p>
38 *
39 * @author Milan Vaclavik<br />
40 * @version $Revision: 14 $<br />
41 * $LastChangedBy: mihlon $
42 */
43 public class Editor extends JPanel
44 {
45 /**
46 * Identifikace tridy - datum vzniku tridy :).
47 */
48 private static final long serialVersionUID = 20080430225750L;
49
50 /**
51 * Ukazatel na narodni prostredi.
52 */
53 private static Locale czLocale;
54
55 /**
56 * Vnitrni cast editoru.
57 */
58 private static EditorDesktop eDesktop;
59
60 /**
61 * Reference na hlavni obekt - Samotny Editor.
62 */
63 private static Editor calthaEditor;
64
65 /**
66 * Ukazatel na zdroj prostredku.
67 */
68 private static ResourceBundle resourcesBundle;
69
70 /**
71 * Udava verzi programu.
72 */
73 private static String svnVersion = "$Revision: 14 $";
74
75 /**
76 * Jmeno aplikace v titulku hlavniho okna.
77 */
78 private static String editorNameS;
79
80 /**
81 * Odkaz na hlavni okno programu.
82 */
83 private static JFrame mainFrame;
84
85 /**
86 * Horni cast editoru (menu, tlacitka).
87 */
88 private JPanel header;
89
90 /**
91 * Reference na hlavni menu.
92 */
93 private MainMenu menu;
94
95 /**
96 * Konstruktor, ktery vytvari GUI programu.
97 */
98 Editor()
99 {
100 // Povoleni dekorace oken
101 // Pokud se povoli, tak blbne zmena velikosti podle ikon v hlavice panelu !!!
102 // JFrame.setDefaultLookAndFeelDecorated(true);
103
104 Editor.initializeResources();
105
106 // Definuje rozmisteni komponent - layout manager
107 this.createLayout();
108
109 // Vytvori horni cast editoru
110 this.createHeaderDesktop();
111
112 // Vytvori vnitrni cast editoru
113 this.createBodyDesktop();
114 }
115
116 /**
117 * Zobrazi chybovy dialog, ktery informuje o tom, ze programu chybi, nebo
118 * ze je poskozen soubor prostredku - lokalizace.
119 * @param msg String : Chybova zprava vracena JVM.
120 */
121 public static void errorMissingResource(final String msg)
122 {
123 // MUSI ZUSTAT !!!! JAK JINAK BY SE TO ZOBRAZILO :) !!!!
124 Editor.showDialog("Soubor prostředků pro aplikaci Caltha nebyl nalezen nebo je poškozen !\n"
125 + "Program nebude správně fungovat !!!\n"
126 + "\nResources for application Caltha not found !!!"
127 + "\n" + msg,
128 "Error",
129 JOptionPane.ERROR_MESSAGE);
130 }
131
132 /**
133 * Vraci referenci na hlavni program.
134 * @return Editor : Reference na hlavni obekt programu.
135 */
136 public static Editor getCalthaEditor()
137 {
138 return Editor.calthaEditor;
139 }
140
141 /**
142 * Vrati referenci na ceske narodni prostredi.
143 * @return Locale : Reference na ceske narodni prostredi.
144 */
145 public static Locale getCzLocale()
146 {
147 return Editor.czLocale;
148 }
149
150 /**
151 * Vrati referenci na hlavni telo editoru.
152 * @return EditorDesktop : Reference na havni plochu editoru.
153 */
154 public static EditorDesktop getEditorDesktop()
155 {
156 return Editor.eDesktop;
157 }
158
159 /**
160 * Vraci aktual;ni SVN cislo verze projektu.
161 * @return String : Aktualni verze projektu.
162 */
163 public static String getSvnVersion()
164 {
165 return Editor.svnVersion;
166 }
167
168 /**
169 * Vraci lokalizovany text.
170 * @param name String : Klic do souboru prostredku.
171 * @return String : Lokalizovany text urceny klicen do souboru prostredku.
172 */
173 public static String getResourcesBundleString(final String name)
174 {
175 return Editor.resourcesBundle.getString(name);
176 }
177
178 /**
179 * Nastavi referenci na hlavni telo editoru.
180 * @param editor EditorDesktop : Reference na novou plochu editoru.
181 */
182 static void setEditorDesktop(final int editor)
183 {
184 switch (editor)
185 {
186 case EditorDesktop.EDITOR_NONE:
187 Editor.calthaEditor.createBodyDesktopNone();
188 break;
189 case EditorDesktop.EDITOR_TEXT_BASED_GAMES:
190 Editor.calthaEditor.createBodyDesktopTextBasedGames();
191 break;
192 default:
193 Editor.calthaEditor.createBodyDesktopNone();
194 }
195 }
196
197 /**
198 * Inicializace souboru prostredku (lokalizace).
199 */
200 private static void initializeResources()
201 {
202 Editor.czLocale = new Locale("cs", "CZ");
203 try
204 {
205 Editor.resourcesBundle = ResourceBundle.getBundle("Caltha", Editor.czLocale);
206 }
207 catch (MissingResourceException e)
208 {
209 // Soubor prostredku chybi, nebo je poskozen.
210 Editor.errorMissingResource(e.getMessage());
211 }
212 }
213
214 /**
215 * Zobrazi dialog.
216 * @param msg String : Vlastni zprava dialogu.
217 * @param title String : Popisek dialogu.
218 * @param typ int : Typ dialogu.
219 */
220 public static void showDialog(final String msg, final String title, final int typ)
221 {
222 new Thread(new Runnable()
223 {
224 @Override
225 public void run()
226 {
227 // Zobrazeni dialogoveho okna.
228 // Dokud ho neuzavreme stiskem tlacitka, nemuzeme nic jineho delat.
229 // POZOR NA DIAKRITIKY VE TRETIM PARAMETRU !!!!!!
230 // ZAVISI NA NASTAVENI OPERACNIHO SYSTEMU, JAVA TO NEZAJISTUJE !!!!
231 JOptionPane.showMessageDialog(null, msg, title, typ);
232 }
233 }).start();
234 }
235
236 /**
237 * Zobrazi chybovou zpravu, ze nesouhlasi klice pro lokalizaci textu.
238 * TATO METODA NESMI POUZIVAT LOKALIZOVANY TEXT Z *.PROPERTIES, JELIKOZ
239 * LOKALIZACNI ZDROJ MUZE BYT CELY SPATNY !!!
240 * Anglicky popis chyby zajisti prijata zprava z vyhozene vyjimky.
241 * @param error String : Podrobna chybova zprava.
242 */
243 public static void showDialogMissingResources(final String error)
244 {
245 final Object[] options = {"OK"};
246 JOptionPane.showOptionDialog(null,
247 "Spatne klice pro lokalizaci !" + "\n" + error,
248 "Error",
249 JOptionPane.DEFAULT_OPTION,
250 JOptionPane.QUESTION_MESSAGE,
251 null,
252 options,
253 options[0]
254 );
255 // Doslo k zavazne chybe ! Cely program nemusi spravne fungovat !!!
256 System.exit(0);
257 }
258
259 /**
260 * Nastavi referenci na soubor prostredku.
261 * @param resourceB : Odkaz na soubor prostredku.
262 */
263 public static void setResourcesBundle(final ResourceBundle resourceB)
264 {
265 Editor.resourcesBundle = resourceB;
266 }
267
268 /**
269 * Vytvori a zobrazi graficke rozhrani aplikace.
270 */
271 private static void createAndShowGUI()
272 {
273 Editor.calthaEditor = new Editor();
274
275 try
276 {
277 Editor.editorNameS = Editor.resourcesBundle.getString("cs.pancava.caltha.Editor-createAndShowGUI_editorNameS");
278 }
279 catch (MissingResourceException e)
280 {
281 Editor.showDialog("" + e.getMessage(), "", JOptionPane.ERROR_MESSAGE);
282 // Moc nevadi, ze je klic spatny, protoze promenna editorNameS muze mit hodnotu null,
283 // jelikoz lze tuto hodnotu bezproblemu pouzit v metode JFrame !
284 Editor.editorNameS = "(Caltha) RPG editor";
285 }
286
287 // Vytvoreni hlavniho okna editoru
288 Editor.mainFrame = new JFrame(Editor.editorNameS);
289 Editor.mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
290
291 // Pridani komponenty do kontejneru - tim zajistime graficky vystup
292 Editor.mainFrame.getContentPane().add(Editor.calthaEditor);
293
294 // Nastaveni velikosti hlavniho okna programu na velikost rozliseni obrazovky.
295 Editor.mainFrame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
296
297 Editor.mainFrame.setVisible(true);
298 // Nastavi, zda-lze menit rozmery aplikace za behu
299 Editor.mainFrame.setResizable(true);
300 }
301
302 /**
303 * Hlavni spousteci metoda editoru, ktera vytvori GUI editoru.
304 * @param args String[] : Parametry z prikazove radky.
305 */
306 public static void main(final String[] args)
307 {
308 javax.swing.SwingUtilities.invokeLater(new Runnable()
309 {
310 @Override
311 public void run()
312 {
313 Editor.createAndShowGUI();
314 }
315 });
316 }
317
318 /**
319 * Volano pri zmene jazyka - lokalizace.
320 */
321 protected final void updateText()
322 {
323 Editor.editorNameS = Editor.resourcesBundle.getString("cs.pancava.caltha.Editor-createAndShowGUI_editorNameS");
324 Editor.mainFrame.setTitle(Editor.editorNameS);
325 }
326
327 /**
328 * Vytvori hlavni cast plochy editoru - prostor, kde se budou zobrazovat
329 * jednotliva okna.
330 */
331 private void createBodyDesktop()
332 {
333 Editor.eDesktop = new EditorDesktopNone();
334
335 this.add(Editor.eDesktop.getMainDesktop(), BorderLayout.CENTER);
336 }
337
338 /**
339 * Zobrazime praznou plochu - nebyl vybran zadny editor.
340 */
341 private void createBodyDesktopNone()
342 {
343 // Odstranime predchozi komponentu - editor z plochy programu.
344 this.remove(Editor.eDesktop.getMainDesktop());
345
346 // Vytvorime novou plochu editoru.
347 Editor.eDesktop = new EditorDesktopNone();
348
349 // Vlozime plochu editoru do programu.
350 this.add(Editor.eDesktop.getMainDesktop(), BorderLayout.CENTER);
351
352 // Zajistime spravne vykresleni nove plochy editoru.
353 Editor.eDesktop.resizeWin();
354 Editor.calthaEditor.validate();
355 }
356
357 /**
358 * Zobrazime plochy editoru pro tvorbu textovych her.
359 */
360 private void createBodyDesktopTextBasedGames()
361 {
362 // Odstranime predchozi komponentu - editor z plochy programu.
363 this.remove(Editor.eDesktop.getMainDesktop());
364
365 // Vytvorime novou plochu editoru.
366 Editor.eDesktop = new EditorDesktopTextBasedGames();
367
368 // Vlozime plochu editoru do programu.
369 this.add(Editor.eDesktop.getMainDesktop(), BorderLayout.CENTER);
370
371 // Zajistime spravne vykresleni nove plochy editoru.
372 Editor.eDesktop.resizeWin();
373 Editor.calthaEditor.validate();
374 }
375
376 /**
377 * Vytvori horni cast editoru - roletove menu, menu tlacitek.
378 */
379 private void createHeaderDesktop()
380 {
381 this.header = new JPanel();
382
383 this.header.setLayout(new BorderLayout());
384
385 // Vytvori a vlozi menu
386 this.header.add(this.createMenu(), BorderLayout.NORTH);
387
388 // Vytvori oddelitelny panel s tlacitky
389 this.header.add(this.createToolbar(), BorderLayout.SOUTH);
390
391 this.add(this.header, BorderLayout.NORTH);
392 }
393
394 /**
395 * Definuje rozmisteni komponent - layout manager.
396 */
397 private void createLayout()
398 {
399 this.setLayout(new BorderLayout());
400 }
401
402 /**
403 * Vytvori a zobrazi hlavni menu.
404 * @return JMenuBar : Ukazatel na prave vytvorene menu.
405 */
406 private JMenuBar createMenu()
407 {
408 this.menu = new MainMenu();
409
410 return this.menu.getMenuBar();
411 }
412
413 /**
414 * Vytvori oddelitelny panel s tlacitky.
415 * @return JToolBar : Ukazatel na prave vytvoreny panel s tlacitky.
416 */
417 private JToolBar createToolbar()
418 {
419 // TODO: Pridat panel s tlacitky.
420 // return new Buttons().getButtonsToolbar();
421
422 return new JToolBar();
423 }
424 }