2 * Copyright (C) 2015 Roland Haeder
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.
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.
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/>.
17 package org.mxchange.addressbook.client.gui;
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;
40 * @author Roland Haeder
42 public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame {
47 private static ClientFrame self;
50 * Singelton getter for this frame instance.
52 * @param client Client instance
53 * @return Returns a singelton instance of this frame
55 public static final ClientFrame getSelfInstance (final Client client) {
57 if (!(self instanceof ClientFrame)) {
58 // Create new instance
59 self = new AddressbookFrame(client);
66 * Frame instance for "add own data"
68 private JMenuItem addOwnItem;
71 * Frame instance for "edit own data"
73 private JMenuItem editOwnItem;
78 private final JFrame frame;
81 * Whether this frame has been initialized
83 private boolean isInitialized;
86 * Status label needs to be updated
88 private JLabel statusLabel;
91 * Creates an instance of this frame with a client instance
95 private AddressbookFrame (final Client client) {
97 this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
100 this.frame = new JFrame(AddressbookApplication.printableTitle());
103 this.setClient(client);
107 * Shutdown this frame
110 public void doShutdown () {
111 // First only show shutdown status
112 this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel.shutdown.text"));
116 * Setups the frame, do not set isInitialized here
118 * @param client Client instance
121 public void setupFrame (final Client client) {
123 this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client));
125 // Has the user entered own data?
126 if (this.getClient().getContactManager().isOwnContactAdded()) {
128 this.getLogger().debug("Disabling menus: isOwnContactAdded()=false");
130 // Not entered yet, so disable "add" menu
131 this.addOwnItem.setEnabled(false);
134 this.editOwnItem.setEnabled(false);
137 // Make the frame visible
138 this.frame.setVisible(true);
141 this.updateStatus("done");
145 * Initalizes this frame. Having initComponents() exposed (publicly
146 * accessible) means that any other object can initialize components which
149 * @throws org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException If this method has been called twice
152 public void init () throws FrameAlreadyInitializedException {
154 this.getLogger().trace("CALLED!");
156 // Has this frame been initialized?
157 if (this.isInitialized()) {
159 throw new FrameAlreadyInitializedException();
163 this.initComponents();
166 this.isInitialized = true;
170 * Returns field isInitialized. This flag indicates whether this frame has been initialized or not.
172 * @return Field isInitialized
175 public final boolean isInitialized () {
176 return this.isInitialized;
180 * Shuts down the application.
183 public void shutdownApplication () {
184 // To do this, the frame must be initialized
185 if (!this.isInitialized()) {
186 // Not initalized, so bad call
187 this.getLogger().fatal("Bad call of shutdownApplication(). Please report this.");
190 this.getClient().getApplication().doShutdown();
194 * Initialize components
196 private void initComponents () {
198 this.getLogger().trace("CALLED!");
200 // Set default close operation
201 this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
203 // Register shutdown listener
204 this.frame.addWindowListener(new WindowAdapter() {
206 * Invoked when a window has been closed.
209 public void windowClosed(final WindowEvent e) {
210 // Shutdown application cleanly
211 self.shutdownApplication();
215 * Invoked when a window is in the process of being closed.
216 * The close operation can be overridden at this point.
219 public void windowClosing(final WindowEvent e) {
220 // Also shutdown cleanly here
221 self.shutdownApplication();
225 // Setup layout manager
226 this.frame.setLayout(new BorderLayout(2, 2));
229 this.frame.setSize(700, 400);
231 // Center window in middle of screen, instead of top-left corner
232 this.frame.setLocationRelativeTo(null);
242 * Initializes the menu system
244 private void initMenuSystem () {
245 // Init menu bar, menu and item instances
246 JMenuBar menuBar = new JMenuBar();
252 menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
255 // 1.x) Exit program (should be last)
256 item = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.text"));
257 item.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.exitProgram.toolTipText"));
259 // Add listener to exit menu
260 item.addActionListener(new ActionListener() {
262 * If the user has performed this action
264 * @param e An instance of an ActionEvent class
267 public void actionPerformed (final ActionEvent e) {
268 self.shutdownApplication();
275 // Add menu -> menu bar
279 // 2) Addressbook menu
280 menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
283 this.addOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.text"));
284 this.addOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.addOwnData.toolTipText"));
286 // Add listener to exit menu
287 this.addOwnItem.addActionListener(new ActionListener() {
289 * If the user has performed this action
291 * @param e An instance of an ActionEvent class
294 public void actionPerformed (final ActionEvent e) {
295 self.getClient().getContactManager().doEnterOwnData();
300 menu.add(this.addOwnItem);
302 // 2.2) Edit own data
303 this.editOwnItem = new JMenuItem(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.text"));
304 this.editOwnItem.setToolTipText(this.getBundle().getString("AddressbookFrame.menuItem.editOwnData.toolTipText"));
306 // Add listener to exit menu
307 this.editOwnItem.addActionListener(new ActionListener() {
309 * If the user has performed this action
311 * @param e An instance of an ActionEvent class
314 public void actionPerformed (final ActionEvent e) {
315 self.getClient().getContactManager().doChangeOwnData();
320 menu.add(this.editOwnItem);
322 // Add menu -> menu bar
325 // Add menu bar -> frame
326 this.frame.add(menuBar, BorderLayout.NORTH);
330 * Initializes status panel
332 private void initStatusPanel () {
333 // Init status label (which needs to be updated
334 this.statusLabel = new JLabel();
335 this.updateStatus("initializing");
337 // Init status bar in south
338 JPanel panel = new JPanel();
339 panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
340 panel.add(this.statusLabel);
341 panel.setBorder(BorderFactory.createEtchedBorder());
343 // Add panel to frame
344 this.frame.add(panel, BorderLayout.SOUTH);
348 * Updates status to given type
350 * @param type Status type
352 private void updateStatus (final String type) {
353 // Set status message
354 this.statusLabel.setText(this.getBundle().getString("AddressbookFrame.statusLabel." + type + ".text"));