]> git.mxchange.org Git - addressbook-lib.git/blob - Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
Moved exceptions in own package
[addressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / client / gui / AddressbookFrame.java
1 /*
2  * Copyright (C) 2015 Roland Haeder
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 package org.mxchange.addressbook.client.gui;
18
19 import java.awt.BorderLayout;
20 import java.awt.event.ActionEvent;
21 import java.awt.event.ActionListener;
22 import java.awt.event.WindowAdapter;
23 import java.awt.event.WindowEvent;
24 import java.text.MessageFormat;
25 import javax.swing.BorderFactory;
26 import javax.swing.BoxLayout;
27 import javax.swing.JFrame;
28 import javax.swing.JLabel;
29 import javax.swing.JMenu;
30 import javax.swing.JMenuBar;
31 import javax.swing.JMenuItem;
32 import javax.swing.JPanel;
33 import org.mxchange.addressbook.BaseFrameworkSystem;
34 import org.mxchange.addressbook.application.AddressbookApplication;
35 import org.mxchange.addressbook.client.Client;
36 import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
37
38 /**
39  *
40  * @author Roland Haeder
41  */
42 public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame {
43
44     /**
45      * Own instance
46      */
47     private static ClientFrame self;
48
49     /**
50      * Singelton getter for this frame instance.
51      *
52      * @param client Client instance
53      * @return Returns a singelton instance of this frame
54      */
55     public static final ClientFrame getSelfInstance (final Client client) {
56         // Is it set?
57         if (!(self instanceof ClientFrame)) {
58             // Create new instance
59             self = new AddressbookFrame(client);
60         }
61         
62         // Return instance
63         return self;
64     }
65     /**
66      * Frame instance for "add own data"
67      */
68     private JMenuItem addOwnItem;
69
70     /**
71      * Frame instance for "edit own data"
72      */
73     private JMenuItem editOwnItem;
74
75     /**
76      * Frame instance
77      */
78     private final JFrame frame;
79
80     /**
81      * Whether this frame has been initialized
82      */
83     private boolean isInitialized;
84
85     /**
86      * Status label needs to be updated
87      */
88     private JLabel statusLabel;
89
90     /**
91      * Creates an instance of this frame with a client instance
92      * 
93      * @param client
94      */
95     private AddressbookFrame (final Client client) {
96         // Debug line
97         this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
98
99         // Set frame instance
100         this.frame = new JFrame(AddressbookApplication.printableTitle());
101
102         // Set client here
103         this.setClient(client);
104     }
105
106     /**
107      * Shutdown this frame
108      */
109     @Override
110     public void doShutdown () {
111         // First only show shutdown status
112         this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel.shutdown.text"));
113     }
114
115     /**
116      * Setups the frame, do not set isInitialized here
117      * 
118      * @param client Client instance
119      */
120     @Override
121     public void setupFrame (final Client client) {
122         // Debug line
123         this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
124
125         // Has the user entered own data?
126         if (this.getClient().getContactManager().isOwnContactAdded()) {
127             // Debug message
128             this.getLogger().debug("Disabling menus: isOwnContactAdded()=false");
129
130             // Not entered yet, so disable "add" menu
131             this.addOwnItem.setEnabled(false);
132         } else {
133             // Disable "edit"
134             this.editOwnItem.setEnabled(false);
135         }
136
137         // Make the frame visible
138         this.frame.setVisible(true);
139
140         // All done here
141         this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel.done.text"));
142     }
143
144     /**
145      * Initalizes this frame. Having initComponents() exposed (publicly
146      * accessible) means that any other object can initialize components which
147      * you may not want.
148      * 
149      * @throws org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException If this method has been called twice
150      */
151     @Override
152     public void init () throws FrameAlreadyInitializedException {
153         // Debug line
154         this.getLogger().trace("CALLED!");
155
156         // Has this frame been initialized?
157         if (this.isInitialized()) {
158             // Throw exception
159             throw new FrameAlreadyInitializedException();
160         }
161
162         // Init components
163         this.initComponents();
164
165         // Set flag
166         this.isInitialized = true;
167     }
168
169     /**
170      * Returns field isInitialized. This flag indicates whether this frame has been initialized or not.
171      * 
172      * @return Field isInitialized
173      */
174     @Override
175     public final boolean isInitialized () {
176         return this.isInitialized;
177     }
178
179     /**
180      * Initialize components
181      */
182     private void initComponents () {
183         // Debug line
184         this.getLogger().trace("CALLED!");
185
186         // Set default close operation
187         this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
188
189         // Register shutdown listener
190         this.frame.addWindowListener(new WindowAdapter() {
191             /**
192              * Invoked when a window has been closed.
193              */
194             @Override
195             public void windowClosed(final WindowEvent e) {
196                 // Shutdown application cleanly
197                 self.getClient().getApplication().doShutdown();
198             }
199
200             /**
201              * Invoked when a window is in the process of being closed.
202              * The close operation can be overridden at this point.
203              */
204             @Override
205             public void windowClosing(final WindowEvent e) {
206                 // Also shutdown cleanly here
207                 self.getClient().getApplication().doShutdown();
208             }
209         });
210
211         // Setup layout manager
212         this.frame.setLayout(new BorderLayout(2, 2));
213
214         // Set window size
215         this.frame.setSize(700, 400);
216
217         // Center window in middle of screen, instead of top-left corner
218         this.frame.setLocationRelativeTo(null);
219
220         // Init menu system
221         initMenuSystem();
222
223         // Init status label (which needs to be updated
224         this.statusLabel = new JLabel(this.getBundle().getString("AddressbookFrame.statusLabel.initializing.text"));
225
226         // Init status panel
227         initStatusPanel();
228     }
229
230     /**
231      * Initializes the menu system
232      */
233     private void initMenuSystem () {
234         // Init menu bar, menu and item instances
235         JMenuBar menuBar = new JMenuBar();
236         JMenu menu;
237         JMenuItem item;
238
239         // Init some menus:
240         // 1) File menu
241         menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
242
243         // Add menu items:
244         // 1.x) Exit program (should be last)
245         item = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.text"));
246         item.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.toolTipText"));
247
248         // Add listener to exit menu
249         item.addActionListener(new ActionListener() {
250             /**
251              * If the user has performed this action
252              *
253              * @param e An instance of an ActionEvent class
254              */
255             @Override
256             public void actionPerformed (final ActionEvent e) {
257                 self.getClient().getApplication().doShutdown();
258             }
259         });
260
261         // Add item -> menu
262         menu.add(item);
263
264         // Add menu -> menu bar
265         menuBar.add(menu);
266
267         // Init some menus:
268         // 2) Addressbook menu
269         menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
270
271         // 2.1) Add own data
272         this.addOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.text"));
273         this.addOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.toolTipText"));
274
275         // Add listener to exit menu
276         this.addOwnItem.addActionListener(new ActionListener() {
277             /**
278              * If the user has performed this action
279              *
280              * @param e An instance of an ActionEvent class
281              */
282             @Override
283             public void actionPerformed (final ActionEvent e) {
284                 self.getClient().getContactManager().doEnterOwnData();
285             }
286         });
287
288         // Add item -> menu
289         menu.add(this.addOwnItem);
290
291         // 2.2) Edit own data
292         this.editOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.text"));
293         this.editOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.toolTipText"));
294
295         // Add listener to exit menu
296         this.editOwnItem.addActionListener(new ActionListener() {
297             /**
298              * If the user has performed this action
299              *
300              * @param e An instance of an ActionEvent class
301              */
302             @Override
303             public void actionPerformed (final ActionEvent e) {
304                 self.getClient().getContactManager().doChangeOwnData();
305             }
306         });
307
308         // Add item -> menu
309         menu.add(this.editOwnItem);
310
311         // Add menu -> menu bar
312         menuBar.add(menu);
313
314         // Add menu bar -> frame
315         this.frame.add(menuBar, BorderLayout.NORTH);
316     }
317
318     /**
319      * Initializes status panel
320      */
321     private void initStatusPanel () {
322         // Init status bar in south
323         JPanel panel = new JPanel();
324         panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
325         panel.add(this.statusLabel);
326         panel.setBorder(BorderFactory.createEtchedBorder());
327         
328         // Add panel to frame
329         this.frame.add(panel, BorderLayout.SOUTH);
330     }
331 }