/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License at <http://www.gnu.org/licenses/>
* for more details.
*
* MainApplication.java
*
* Created on 19. Oktober 2002, 17:58
*
*/
package gui;
import board.TestLevel;
/**
*
* Main application for creating frames with new or existing board designs.
*
* @author Alfons Wirtz
*/
public class MainApplication extends javax.swing.JFrame
{
/**
* Main function of the Application
*/
public static void main(String p_args[])
{
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler());
StartupOptions startupOptions = StartupOptions.parse(p_args);
if (!(OFFLINE_ALLOWED || startupOptions.webstart_option))
{
Runtime.getRuntime().exit(1);
}
if (startupOptions.single_design_option)
{
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("gui.resources.MainApplication", startupOptions.current_locale);
BoardFrame.Option board_option;
if (startupOptions.session_file_option)
{
board_option = BoardFrame.Option.SESSION_FILE;
}
else
{
board_option = BoardFrame.Option.SINGLE_FRAME;
}
DesignFile design_file = DesignFile.get_instance(startupOptions.design_file_name, false);
if (design_file == null)
{
System.out.print(resources.getString("message_6") + " ");
System.out.print(startupOptions.design_file_name);
System.out.println(" " + resources.getString("message_7"));
return;
}
String message = resources.getString("loading_design") + " " + startupOptions.design_file_name;
WindowMessage welcome_window = WindowMessage.show(message);
final BoardFrame new_frame =
create_board_frame(design_file, null, board_option, startupOptions.test_version_option, startupOptions.current_locale);
welcome_window.dispose();
if (new_frame == null)
{
System.exit(1);
return;
}
new_frame.addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowClosed(java.awt.event.WindowEvent evt)
{
Runtime.getRuntime().exit(0);
}
});
}
else
{
new MainApplication(startupOptions).setVisible(true);
}
}
/**
* Creates new form MainApplication
* It takes the directory of the board designs as optional argument.
*/
public MainApplication(StartupOptions startupOptions)
{
this.design_dir_name = startupOptions.getDesignDir();
this.is_test_version = startupOptions.isTestVersion();
this.is_webstart = startupOptions.getWebstartOption();
this.locale = startupOptions.getCurrentLocale();
this.resources =
java.util.ResourceBundle.getBundle("gui.resources.MainApplication", locale);
main_panel = new javax.swing.JPanel();
getContentPane().add(main_panel);
java.awt.GridBagLayout gridbag = new java.awt.GridBagLayout();
main_panel.setLayout(gridbag);
java.awt.GridBagConstraints gridbag_constraints = new java.awt.GridBagConstraints();
gridbag_constraints.insets = new java.awt.Insets(10, 10, 10, 10);
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
demonstration_button = new javax.swing.JButton();
sample_board_button = new javax.swing.JButton();
open_board_button = new javax.swing.JButton();
restore_defaults_button = new javax.swing.JButton();
message_field = new javax.swing.JTextField();
message_field.setText("-de or -di not specified");
this.window_net_demonstrations = new WindowNetDemonstrations(locale);
java.awt.Point location = getLocation();
this.window_net_demonstrations.setLocation((int) location.getX() + 50, (int) location.getY() + 50);
this.window_net_sample_designs = new WindowNetSampleDesigns(locale);
this.window_net_sample_designs.setLocation((int) location.getX() + 90, (int) location.getY() + 90);
setTitle(resources.getString("title") + " " + VERSION_NUMBER_STRING);
boolean add_buttons = true;
if (startupOptions.getWebstartOption())
{
if (add_buttons)
{
demonstration_button.setText(resources.getString("router_demonstrations"));
demonstration_button.setToolTipText(resources.getString("router_demonstrations_tooltip"));
demonstration_button.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
window_net_demonstrations.setVisible(true);
}
});
gridbag.setConstraints(demonstration_button, gridbag_constraints);
main_panel.add(demonstration_button, gridbag_constraints);
sample_board_button.setText(resources.getString("sample_designs"));
sample_board_button.setToolTipText(resources.getString("sample_designs_tooltip"));
sample_board_button.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
window_net_sample_designs.setVisible(true);
}
});
gridbag.setConstraints(sample_board_button, gridbag_constraints);
main_panel.add(sample_board_button, gridbag_constraints);
}
}
open_board_button.setText(resources.getString("open_own_design"));
open_board_button.setToolTipText(resources.getString("open_own_design_tooltip"));
open_board_button.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
open_board_design_action(evt);
}
});
gridbag.setConstraints(open_board_button, gridbag_constraints);
if (add_buttons)
{
main_panel.add(open_board_button, gridbag_constraints);
}
if (startupOptions.getWebstartOption() && add_buttons)
{
restore_defaults_button.setText(resources.getString("restore_defaults"));
restore_defaults_button.setToolTipText(resources.getString("restore_defaults_tooltip"));
restore_defaults_button.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
if (is_webstart)
{
restore_defaults_action(evt);
}
}
});
gridbag.setConstraints(restore_defaults_button, gridbag_constraints);
main_panel.add(restore_defaults_button, gridbag_constraints);
}
message_field.setPreferredSize(new java.awt.Dimension(230, 20));
message_field.setRequestFocusEnabled(false);
gridbag.setConstraints(message_field, gridbag_constraints);
main_panel.add(message_field, gridbag_constraints);
this.addWindowListener(new WindowStateListener());
pack();
}
/** opens a board design from a binary file or a specctra dsn file. */
private void open_board_design_action(java.awt.event.ActionEvent evt)
{
DesignFile design_file = DesignFile.open_dialog(this.is_webstart, this.design_dir_name);
if (design_file == null)
{
message_field.setText(resources.getString("message_3"));
return;
}
BoardFrame.Option option;
if (this.is_webstart)
{
option = BoardFrame.Option.WEBSTART;
}
else
{
option = BoardFrame.Option.FROM_START_MENU;
}
String message = resources.getString("loading_design") + " " + design_file.get_name();
message_field.setText(message);
WindowMessage welcome_window = WindowMessage.show(message);
welcome_window.setTitle(message);
BoardFrame new_frame =
create_board_frame(design_file, message_field, option, this.is_test_version, this.locale);
welcome_window.dispose();
if (new_frame == null)
{
return;
}
message_field.setText(resources.getString("message_4") + " " + design_file.get_name() + " " + resources.getString("message_5"));
board_frames.add(new_frame);
new_frame.addWindowListener(new BoardFrameWindowListener(new_frame));
}
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt)
{
System.exit(0);
}
/** deletes the setting stored by the user if the application is run by Java Web Start */
private void restore_defaults_action(java.awt.event.ActionEvent evt)
{
if (!is_webstart)
{
return;
}
boolean file_deleted = WebStart.delete_files(BoardFrame.GUI_DEFAULTS_FILE_NAME, resources.getString("confirm_delete"));
if (file_deleted)
{
message_field.setText(resources.getString("defaults_restored"));
}
else
{
message_field.setText(resources.getString("nothing_to_restore"));
}
}
/**
* Creates a new board frame containing the data of the input design file.
* Returns null, if an error occured.
*/
static private BoardFrame create_board_frame(DesignFile p_design_file, javax.swing.JTextField p_message_field,
BoardFrame.Option p_option, boolean p_is_test_version, java.util.Locale p_locale)
{
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("gui.resources.MainApplication", p_locale);
java.io.InputStream input_stream = p_design_file.get_input_stream();
if (input_stream == null)
{
if (p_message_field != null)
{
p_message_field.setText(resources.getString("message_8") + " " + p_design_file.get_name());
}
return null;
}
TestLevel test_level;
if (p_is_test_version)
{
test_level = DEBUG_LEVEL;
}
else
{
test_level = TestLevel.RELEASE_VERSION;
}
BoardFrame new_frame = new BoardFrame(p_design_file, p_option, test_level, p_locale, !p_is_test_version);
boolean read_ok = new_frame.read(input_stream, p_design_file.is_created_from_text_file(), p_message_field);
if (!read_ok)
{
return null;
}
new_frame.menubar.add_design_dependent_items();
if (p_design_file.is_created_from_text_file())
{
// Read the file with the saved rules, if it is existing.
String file_name = p_design_file.get_name();
String[] name_parts = file_name.split("\\.");
String confirm_import_rules_message = resources.getString("confirm_import_rules");
DesignFile.read_rules_file(name_parts[0], p_design_file.get_parent(),
new_frame.board_panel.board_handling, p_option == BoardFrame.Option.WEBSTART,
confirm_import_rules_message);
new_frame.refresh_windows();
}
return new_frame;
}
private final java.util.ResourceBundle resources;
private final javax.swing.JButton demonstration_button;
private final javax.swing.JButton sample_board_button;
private final javax.swing.JButton open_board_button;
private final javax.swing.JButton restore_defaults_button;
private javax.swing.JTextField message_field;
private javax.swing.JPanel main_panel;
/**
* A Frame with routing demonstrations in the net.
*/
private final WindowNetSamples window_net_demonstrations;
/**
* A Frame with sample board designs in the net.
*/
private final WindowNetSamples window_net_sample_designs;
/** The list of open board frames */
private java.util.Collection<BoardFrame> board_frames = new java.util.LinkedList<BoardFrame>();
private String design_dir_name = null;
private final boolean is_test_version;
private final boolean is_webstart;
private final java.util.Locale locale;
private static final TestLevel DEBUG_LEVEL = TestLevel.CRITICAL_DEBUGGING_OUTPUT;
private class BoardFrameWindowListener extends java.awt.event.WindowAdapter
{
public BoardFrameWindowListener(BoardFrame p_board_frame)
{
this.board_frame = p_board_frame;
}
public void windowClosed(java.awt.event.WindowEvent evt)
{
if (board_frame != null)
{
// remove this board_frame from the list of board frames
board_frame.dispose();
board_frames.remove(board_frame);
board_frame = null;
}
}
private BoardFrame board_frame;
}
private class WindowStateListener extends java.awt.event.WindowAdapter
{
public void windowClosing(java.awt.event.WindowEvent evt)
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
boolean exit_program = true;
if (!is_test_version && board_frames.size() > 0)
{
int option = javax.swing.JOptionPane.showConfirmDialog(null, resources.getString("confirm_cancel"),
null, javax.swing.JOptionPane.YES_NO_OPTION);
if (option == javax.swing.JOptionPane.NO_OPTION)
{
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
exit_program = false;
}
}
if (exit_program)
{
exitForm(evt);
}
}
public void windowIconified(java.awt.event.WindowEvent evt)
{
window_net_sample_designs.parent_iconified();
}
public void windowDeiconified(java.awt.event.WindowEvent evt)
{
window_net_sample_designs.parent_deiconified();
}
}
static final String WEB_FILE_BASE_NAME = "http://www.freerouting.net/java/";
private static final boolean OFFLINE_ALLOWED = true;
/**
* Change this string when creating a new version
*/
static final String VERSION_NUMBER_STRING = "1.2.43 Extra";
}