View Javadoc

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 }