/**
* 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.widgets;
import static lu.tudor.santec.i18n.Translatrix._;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.lazyzero.kkMulticopterFlashTool.KKMulticopterFlashTool;
import de.lazyzero.kkMulticopterFlashTool.utils.ButtonsStateListener;
import de.lazyzero.kkMulticopterFlashTool.utils.Firmware;
import de.lazyzero.kkMulticopterFlashTool.utils.Icons;
public class FirmwareFilePanel extends JPanel implements ActionListener, ButtonsStateListener{
private static final long serialVersionUID = 1L;
private KKMulticopterFlashTool parent;
private CellConstraints cc;
private JTextField firmwareFileField;
private JButton flashFile;
private JLabel firmwareFileLabel;
private JButton load;
private JFileChooser fc;
private FileFilter ffilter;
private File firmwareFile;
private Logger logger = KKMulticopterFlashTool.getLogger();
private boolean buttonsEnabled = true;
public FirmwareFilePanel(KKMulticopterFlashTool parent) {
this.parent = parent;
init();
}
private void init() {
fc = new JFileChooser(parent.getSettings().getProperty("last.dir","%HOME%"));
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
ffilter = new FileFilter() {
@Override
public String getDescription() {
return "Hex-File (.hex)";
}
@Override
public boolean accept(File f) {
return f.isDirectory() || f.getAbsoluteFile().toString().toLowerCase().endsWith(".hex");
}
};
fc.setFileFilter(ffilter);
//create the CellContraints
cc = new CellConstraints();
// create the Layout for Panel this
String panelColumns = "pref,3dlu,fill:pref:grow,3dlu,pref,3dlu,pref";
String panelRows = "pref,3dlu,pref,3dlu,pref:grow,3dlu,top:pref:grow";
FormLayout panelLayout = new FormLayout(panelColumns, panelRows);
this.setLayout(panelLayout);
firmwareFileLabel = new JLabel(_("firmware.file"));
firmwareFileLabel.setToolTipText(_("firmware.load.tip"));
firmwareFileField = new JTextField();
firmwareFileField.setToolTipText(_("firmware.load.tip"));
load = new JButton(Icons.getIcon16(Icons.LOAD));
load.setMnemonic(KeyEvent.VK_L);
load.addActionListener(this);
load.setToolTipText(_("firmware.load.tip"));
this.setBorder(new TitledBorder(_("firmware.settings")));
flashFile = new JButton(Icons.getIcon16(Icons.RUN));
flashFile.setMnemonic(KeyEvent.VK_F);
flashFile.addActionListener(this);
flashFile.setEnabled(false);
flashFile.setToolTipText(_("firmware.flashFile.tip"));
this.add(firmwareFileLabel, cc.xy(1, 3));
this.add(firmwareFileField, cc.xy(3, 3));
this.add(load, cc.xy(5,3));
this.add(flashFile, cc.xy(7,3));
}
@Override
public void actionPerformed(ActionEvent action) {
if (action.getSource().equals(load)){
int returnVal = fc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
setHexFile(fc.getSelectedFile(), true);
} else {
resetFile();
}
} else if (action.getSource().equals(flashFile)){
parent.clearText();
parent.println(_("messages.flashFile"));
if (KKMulticopterFlashTool.getCountdown() > 0) {
countdown(KKMulticopterFlashTool.getCountdown());
} else {
parent.flashAVR();
}
}
}
public void setHexFile(File file, boolean clearContent) {
if (file == null) {
resetFile();
return;
}
firmwareFile = file;
firmwareFileField.setText(firmwareFile.getName());
parent.setFirmware(new Firmware(firmwareFile));
if (clearContent) {
parent.clearText();
}
parent.println(_("messages.loadFile"));
flashFile.setEnabled(true);
}
public void resetFile() {
firmwareFileField.setText("");
parent.clearText();
parent.println(_("messages.nothingLoad"));
flashFile.setEnabled(false);
}
private void countdown(final int countdown) {
logger.log(Level.INFO, "start Countdown from " + countdown);
final JPanel glass = (JPanel) parent.getMainframe().getGlassPane();
glass.setLayout(new GridBagLayout());
final JLabel number = new JLabel("countdown");
number.setForeground(Color.RED);
number.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 120));
number.setOpaque(false);
glass.add(number);
glass.setVisible(true);
Timer timer = new Timer();
TimerTask task = new TimerTask() {
int count = countdown;
@Override
public void run() {
if (count == -1) {
this.cancel();
glass.setVisible(false);
parent.flashAVR();
}
glass.removeAll();
number.setText(count+"");
glass.add(number);
number.repaint();
logger.log(Level.INFO, count+"");
count--;
}
};
timer.schedule(task, 0, 1000);
try {
timer.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
parent.getMainframe().repaint();
}
@Override
public void setButtonsEnabled(boolean b) {
this.buttonsEnabled = b;
}
@Override
public void updateButtons() {
load.setEnabled(buttonsEnabled);
flashFile.setEnabled(buttonsEnabled==false?false:(firmwareFileField.getText().length()!=0?true:false));
}
}