/**
* KKMulticopterFlashTool, a avrdude GUI for flashing KK boards and other
* equipment.
* Copyright (C) 2011 Christian Moll
*
* 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.lazyzero.kkMulticopterFlashTool.gui;
import static lu.tudor.santec.i18n.Translatrix._;
import java.awt.BorderLayout;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Iterator;
import java.util.Locale;
import java.util.Scanner;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import lu.tudor.santec.i18n.Translatrix;
import de.lazyzero.kkMulticopterFlashTool.KKMulticopterFlashTool;
import de.lazyzero.kkMulticopterFlashTool.gui.widgets.JNamedIntMenuItem;
import de.lazyzero.kkMulticopterFlashTool.utils.Icons;
import de.lazyzero.kkMulticopterFlashTool.utils.SendLogFile;
import de.lazyzero.kkMulticopterFlashTool.utils.XmlReaderFirmwares;
public class kkMenu extends JMenuBar {
/**
*
*/
private static final long serialVersionUID = 1L;
private JMenu setup;
private JMenu info;
private JMenu help;
private JMenu contribute;
private JMenu tools;
private JMenuBar bar;
private KKMulticopterFlashTool parent;
protected XmlReaderFirmwares firmwareReader;
private JNamedIntMenuItem countdown;
private ArduinoUSBLinkerUploader arduinoUploader;
public kkMenu(KKMulticopterFlashTool parent, XmlReaderFirmwares firmwareReader) {
this.parent = parent;
this.firmwareReader = firmwareReader;
initSetupMenu();
initHelpMenu();
initInfoMenu();
initContributeMenu();
initToolsMenu();
bar = new JMenuBar();
bar.add(setup);
bar.add(contribute);
bar.add(tools);
bar.add(help);
bar.add(info);
}
public JMenuBar getBar() {
return bar;
}
private void initToolsMenu() {
tools = new JMenu(_("tools"));
// tools.setMnemonic(_("contribute.key").charAt(0));
JMenu arduinoUSBLinkerUploadItemMenu = new JMenu(_("tools.arduinoUSBLinkerUpload"));
arduinoUSBLinkerUploadItemMenu.setIcon(Icons.getIcon22(Icons.CONFIG));
tools.add(arduinoUSBLinkerUploadItemMenu);
createArduinoUSBlinkerUploadMenuItems(arduinoUSBLinkerUploadItemMenu);
}
private void createArduinoUSBlinkerUploadMenuItems(JMenu arduinoUSBLinkerUploadItemMenu) {
arduinoUploader = new ArduinoUSBLinkerUploader(parent);
Iterator<String> arduinos = arduinoUploader.getArduinos();
while (arduinos.hasNext()) {
final String name = arduinos.next();
JMenuItem mi = new JMenuItem(name);
mi.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
arduinoUploader.upload(name);
}
}
);
arduinoUSBLinkerUploadItemMenu.add(mi);
}
}
private void initContributeMenu() {
contribute = new JMenu(_("contribute"));
//contribute.setMnemonic(_("contribute.key").charAt(0));
JMenuItem mailItem = new JMenuItem(_("contribute.mail"));
mailItem.setMnemonic(_("contribute.mail.key").charAt(0));
mailItem.setIcon(Icons.getIcon22(Icons.MAIL));
contribute.add(mailItem);
JMenuItem submitFirmwareItem = new JMenuItem(_("contribute.submitFirmware"));
submitFirmwareItem.setMnemonic(_("contribute.submitFirmware.key").charAt(0));
submitFirmwareItem.setIcon(Icons.getIcon22(Icons.MAIL));
contribute.add(submitFirmwareItem);
submitFirmwareItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
FirmwareCommitForm fcf = new FirmwareCommitForm(kkMenu.this.firmwareReader);
fcf.sendMail();
}
}
);
mailItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
SendLogFile slf = new SendLogFile();
slf.sendMail(KKMulticopterFlashTool.VERSION, KKMulticopterFlashTool.LOG_FILE, parent.getText());
}
}
);
}
private void initHelpMenu() {
help = new JMenu(_("help"));
//help.setMnemonic(_("help.key").charAt(0));
JMenuItem escdbItem = new JMenuItem(_("help.ESCDB"));
escdbItem.setMnemonic(_("help.ESCDB.key").charAt(0));
// escdbItem.setIcon(Icons.getIcon22(Icons.app));
help.add(escdbItem);
JMenuItem ardLnkItem = new JMenuItem(_("help.ardLnk"));
ardLnkItem.setMnemonic(_("help.ardLnk.key").charAt(0));
// escdbItem.setIcon(Icons.getIcon22(Icons.app));
help.add(ardLnkItem);
help.add(new JSeparator());
JMenuItem KKhomeItem = new JMenuItem(_("help.kkhome"));
KKhomeItem.setMnemonic(_("help.kkhome.key").charAt(0));
KKhomeItem.setIcon(Icons.getIcon22(Icons.app));
help.add(KKhomeItem);
JMenuItem KRManualItem = new JMenuItem(_("help.krManual"));
KRManualItem.setMnemonic(_("help.krManual.key").charAt(0));
KRManualItem.setIcon(Icons.getIcon22(Icons.KR));
help.add(KRManualItem);
help.addSeparator();
JMenuItem helpItem = new JMenuItem(_("help.help"));
helpItem.setMnemonic(_("help.help.key").charAt(0));
helpItem.setIcon(Icons.getIcon22(Icons.LZ));
help.add(helpItem);
KRManualItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
openURL("http://www.kkmulticopter.kr/index.html?modea=manual");
}
}
);
KKhomeItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
openURL("http://www.kkmulticopter.com/index.php?option=com_content&view=article&id=55&Itemid=57");
}
}
);
helpItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
openURL("http://www.lazyzero.de/en/modellbau/kkmulticopterflashtool");
}
}
);
escdbItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
openURL("http://wiki.openpilot.org/display/Doc/RapidESC+Database");
}
}
);
ardLnkItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
openURL("https://github.com/c---/ArduinoUSBLinker#readme");
}
}
);
}
private void initInfoMenu() {
info = new JMenu(_("info"));
//info.setMnemonic(_("info.key").charAt(1));
JMenuItem licenseItem = new JMenuItem(_("info.license"));
licenseItem.setMnemonic(_("info.license.key").charAt(0));
licenseItem.setIcon(Icons.getIcon22(Icons.LICENSE));
info.add(licenseItem);
JMenuItem aboutItem = new JMenuItem(_("info.about"));
aboutItem.setMnemonic(_("info.about.key").charAt(0));
aboutItem.setIcon(Icons.getIcon22(Icons.ABOUT));
info.add(aboutItem);
licenseItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
JLabel title = new JLabel("<HTML><H2>KKmulticopter Flash Tool " + KKMulticopterFlashTool.VERSION +"</H2></HTML>");
title.setHorizontalAlignment(JLabel.CENTER);
String licenseText = null;
try {
File licenseFile = new File("license.txt");
if (System.getProperty("os.name").toLowerCase().contains("mac")) {
String path = System.getProperty("java.library.path");
path = path.substring(0, path.indexOf(":"));
licenseFile = new File(path,"license.txt");
}
FileInputStream licenseIS = new FileInputStream(licenseFile);
StringBuilder text = new StringBuilder();
String NL = System.getProperty("line.separator");
Scanner scanner = new Scanner(licenseIS);
while (scanner.hasNextLine()) {
text.append(scanner.nextLine() + NL);
}
licenseText = text.toString();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
JTextArea license = new JTextArea(licenseText);
JScrollPane main = new JScrollPane(license);
JDialog about = new JDialog(parent);
about.setIconImage(Icons.getIcon(Icons.app).getImage());
about.add(title, BorderLayout.NORTH);
about.add(main, BorderLayout.CENTER);
about.setSize(new Dimension(540,400));
about.setLocationRelativeTo(parent);
about.setVisible(true);
}
}
);
aboutItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
JLabel icon = new JLabel(Icons.getIcon(Icons.app, 192));
JLabel title = new JLabel("<HTML><H2>KKmulticopter Flash Tool " + KKMulticopterFlashTool.VERSION +"</H2></HTML>");
title.setHorizontalAlignment(JLabel.CENTER);
JLabel main = new JLabel(Translatrix.getTranslationString("about.message"));
main.setHorizontalAlignment(JLabel.CENTER);
JDialog about = new JDialog(parent);
about.setIconImage(Icons.getIcon(Icons.app).getImage());
about.add(title, BorderLayout.NORTH);
about.add(icon, BorderLayout.WEST);
about.add(main, BorderLayout.CENTER);
about.setSize(new Dimension(480,240));
about.setLocationRelativeTo(parent);
about.setVisible(true);
}
}
);
}
private void initSetupMenu() {
setup = new JMenu(_("settings"));
// setup.setMnemonic(_("settings.key").charAt(0));
final JCheckBoxMenuItem offlineMenuItem = new JCheckBoxMenuItem(_("settings.offline"));
offlineMenuItem.setSelected(KKMulticopterFlashTool.isOfflineMode());
setup.add(offlineMenuItem);
final JMenuItem offlineDownloadMenuItem = new JMenuItem(_("settings.downloadoffline"));
setup.add(offlineDownloadMenuItem);
setup.addSeparator();
final JCheckBoxMenuItem enableVerboseOutputMenuItem = new JCheckBoxMenuItem(_("settings.enableverbose"));
enableVerboseOutputMenuItem.setSelected(KKMulticopterFlashTool.isVerboseEnabled());
setup.add(enableVerboseOutputMenuItem);
setup.addSeparator();
final JCheckBoxMenuItem enablePopupMenuItem = new JCheckBoxMenuItem(_("settings.enablepopup"));
enablePopupMenuItem.setSelected(KKMulticopterFlashTool.isPopupsEnabled());
setup.add(enablePopupMenuItem);
final JCheckBoxMenuItem enableHideDepricatedMenuItem = new JCheckBoxMenuItem(_("settings.hidedeprecated"));
enableHideDepricatedMenuItem.setSelected(KKMulticopterFlashTool.isHideDecprecatedEnabled());
setup.add(enableHideDepricatedMenuItem);
final JCheckBoxMenuItem enableShowDailyTGYMenuItem = new JCheckBoxMenuItem(_("settings.showDailyTGY"));
enableShowDailyTGYMenuItem.setSelected(KKMulticopterFlashTool.isShowDailyTGYEnabled());
setup.add(enableShowDailyTGYMenuItem);
countdown = new JNamedIntMenuItem(_("settings.countdown"), new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
KKMulticopterFlashTool.setCountdown(countdown.getValue());
}
@Override
public void focusGained(FocusEvent e) {
KKMulticopterFlashTool.setCountdown(countdown.getValue());
}
});
countdown.setValue(KKMulticopterFlashTool.getCountdown());
setup.add(countdown);
setup.addSeparator();
JMenu langSubMenu = new JMenu(_("settings.language"));
langSubMenu.setMnemonic(_("settings.language.key").charAt(0));
langSubMenu.setIcon(Icons.getIcon22(Icons.LANGUAGE));
setup.add(langSubMenu);
createLanguageMenuItem("settings.language.english", "en", "US", Locale.US, Icons.ENGLISH, langSubMenu);
createLanguageMenuItem("settings.language.french", "fr", "FR", Locale.FRANCE, Icons.FRENCH, langSubMenu);
createLanguageMenuItem("settings.language.german", "de", "DE", Locale.GERMANY, Icons.GERMAN, langSubMenu);
createLanguageMenuItem("settings.language.italian", "it", "IT", Locale.ITALY, Icons.ITALIAN, langSubMenu);
createLanguageMenuItem("settings.language.dutch", "nl", "NL", null, Icons.DUTCH, langSubMenu);
createLanguageMenuItem("settings.language.chinese", "zh", "CN", null, Icons.CHINESE, langSubMenu);
createLanguageMenuItem("settings.language.turkish", "tr", "TR", null, Icons.TURKISH, langSubMenu);
createLanguageMenuItem("settings.language.faroese", "fo", "FO", null, Icons.FAROESE, langSubMenu);
createLanguageMenuItem("settings.language.danish", "da", "DK", null, Icons.DANISH, langSubMenu);
createLanguageMenuItem("settings.language.swedish", "se", "SE", null, Icons.SWEDISH, langSubMenu);
createLanguageMenuItem("settings.language.finnish", "fi", "FI", null, Icons.FINNISH, langSubMenu);
createLanguageMenuItem("settings.language.brazilian", "pt", "BR", null, Icons.BRAZILIAN, langSubMenu);
createLanguageMenuItem("settings.language.polish", "pl", "PL", null, Icons.POLISH, langSubMenu);
createLanguageMenuItem("settings.language.spanish", "es", "ES", null, Icons.SPANISH, langSubMenu);
createLanguageMenuItem("settings.language.russian", "ru", "RU", null, Icons.RUSSIAN, langSubMenu);
createLanguageMenuItem("settings.language.portugese", "pt", "PT", null, Icons.PORTUGESE, langSubMenu);
createLanguageMenuItem("settings.language.korean", "kr", "KR", null, Icons.KOREAN, langSubMenu);
createLanguageMenuItem("settings.language.slovakian", "sk", "SK", null, Icons.SLOVAKIAN, langSubMenu);
createLanguageMenuItem("settings.language.czech", "cz", "CZ", null, Icons.CZECH, langSubMenu);
createLanguageMenuItem("settings.language.hebrew", "iw", "IL", null, Icons.HEBREW, langSubMenu);
createLanguageMenuItem("settings.language.croatian", "hr", "HR", null, Icons.CROATIAN, langSubMenu);
createLanguageMenuItem("settings.language.greek", "gr", "GR", null, Icons.GREEK, langSubMenu);
createLanguageMenuItem("settings.language.romanian", "ro", "RO", null, Icons.ROMANIAN, langSubMenu);
createLanguageMenuItem("settings.language.norwegian", "no", "NO", null, Icons.NORWEGIAN, langSubMenu);
createLanguageMenuItem("settings.language.slovenian", "sl", "SI", null, Icons.SLOVENIAN, langSubMenu);
createLanguageMenuItem("settings.language.japanese", "ja", "JP", null, Icons.JAPANESE, langSubMenu);
createLanguageMenuItem("settings.language.hungarian", "hu", "HU", null, Icons.HUNGARIAN, langSubMenu);
createLanguageMenuItem("settings.language.bosnian", "bs", "BA", null, Icons.BOSNIAN, langSubMenu);
createLanguageMenuItem("settings.language.serbian", "cs", "SR", null, Icons.SERBIAN, langSubMenu);
createLanguageMenuItem("settings.language.bulgarian", "bg", "BG", null, Icons.BULGARIAN, langSubMenu);
offlineMenuItem.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (offlineMenuItem.isSelected()) {
KKMulticopterFlashTool.setOfflineMode(true);
} else {
KKMulticopterFlashTool.setOfflineMode(false);
}
parent.firePropertyChange(KKMulticopterFlashTool.MODE_CHANGED, 0, 1);
}
}
);
enableVerboseOutputMenuItem.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (enableVerboseOutputMenuItem.isSelected()) {
KKMulticopterFlashTool.setVerboseEnabled(true);
} else {
KKMulticopterFlashTool.setVerboseEnabled(false);
}
}
}
);
enablePopupMenuItem.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (enablePopupMenuItem.isSelected()) {
KKMulticopterFlashTool.setPopupEnabled(true);
} else {
KKMulticopterFlashTool.setPopupEnabled(false);
}
}
}
);
enableHideDepricatedMenuItem.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
parent.firePropertyChange(ControllerPanel.CONTROLLER_CHANGED, 0, 1);
if (enableHideDepricatedMenuItem.isSelected()) {
KKMulticopterFlashTool.setHideDeprecatedEnabled(true);
} else {
KKMulticopterFlashTool.setHideDeprecatedEnabled(false);
}
}
}
);
enableShowDailyTGYMenuItem.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
parent.firePropertyChange(ControllerPanel.CONTROLLER_CHANGED, 0, 1);
if (enableShowDailyTGYMenuItem.isSelected()) {
KKMulticopterFlashTool.setShowDailyTGYEnabled(true);
} else {
KKMulticopterFlashTool.setShowDailyTGYEnabled(false);
}
}
}
);
offlineDownloadMenuItem.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FirmwareDownloadFrame fdf = new FirmwareDownloadFrame(parent.getFirmwares());
}
}
);
}
private void createLanguageMenuItem(String menuItemString, final String isoLanguage, final String isoCountry, final Locale locale, String icon, JMenu langSubMenu) {
String localisedString = _(menuItemString);
String defaultString = Translatrix.getDefaultString(menuItemString);
JMenuItem mi = new JMenuItem(localisedString.equals(defaultString)?localisedString:(localisedString + " (" + defaultString + ")"));
mi.setMnemonic(_(menuItemString + ".key").charAt(0));
mi.setIcon(Icons.getIconFlag(icon));
mi.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
if (!parent.getLocale().equals(locale==null?new Locale(isoLanguage, isoCountry):locale)){
parent.setLocale(isoLanguage, isoCountry);
if (parent.restart()){
System.exit(0);
}
}
}
}
);
langSubMenu.add(mi);
}
public static void openURL(String url) {
try {
Desktop.getDesktop().browse(new URI(url));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}