/** * 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.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SpringLayout; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.concord.swing.SpringUtilities; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import de.lazyzero.kkMulticopterFlashTool.utils.Firmware; import de.lazyzero.kkMulticopterFlashTool.utils.download.Download; import de.lazyzero.kkMulticopterFlashTool.utils.download.DownloadsTableModel; import de.lazyzero.kkMulticopterFlashTool.utils.download.ProgressRenderer; public class FirmwareDownloadFrame extends JDialog implements ActionListener, ChangeListener{ private static final long serialVersionUID = 1L; private Vector<Firmware> firmwares; private JPanel panel; private CellConstraints cc; private Dimension preferredSize = new Dimension(450, 550); private DownloadsTableModel downloadTableModel; private JTable table; private JPanel downloadsPanel; private JButton closeButton; private JButton downloadButton; private HashMap<String, Boolean> firmwareTyps; public FirmwareDownloadFrame(Vector<Firmware> firmwares) { this.firmwares = firmwares; initGUI(); this.pack(); this.setModal(true); this.setVisible(true); } private void initGUI() { panel = new JPanel(); // this.setPreferredSize(preferredSize); // create the CellContraints cc = new CellConstraints(); // create the Layout for Panel this String panelColumns = "3dlu,fill:pref:grow,3dlu,pref,3dlu,pref,3dlu"; String panelRows = "3dlu,pref:grow,3dlu,fill:pref,3dlu,pref,3dlu"; FormLayout panelLayout = new FormLayout(panelColumns, panelRows); panel.setLayout(panelLayout); downloadTableModel = new DownloadsTableModel(); table = new JTable(downloadTableModel); // Set up ProgressBar as renderer for progress column. ProgressRenderer renderer = new ProgressRenderer(0, 100); renderer.setStringPainted(true); // show progress text table.setDefaultRenderer(JProgressBar.class, renderer); table.setForeground(Color.WHITE); // Set table's row height large enough to fit JProgressBar. table.setRowHeight((int) renderer.getPreferredSize().getHeight()); // Set up downloads panel. downloadsPanel = new JPanel(); downloadsPanel.setPreferredSize(new Dimension(preferredSize.width, 200)); downloadsPanel.setBorder( BorderFactory.createTitledBorder(_("downloads.downloads"))); downloadsPanel.setLayout(new BorderLayout()); downloadsPanel.add(new JScrollPane(table), BorderLayout.CENTER); closeButton = new JButton(_("close")); closeButton.addActionListener(this); downloadButton = new JButton(_("downloads.download")); downloadButton.addActionListener(this); panel.add(getFirmwareTypePanel(), cc.xyw(2, 2, 5)); panel.add(downloadsPanel, cc.xyw(2, 4, 5)); panel.add(downloadButton, cc.xy(4, 6)); panel.add(closeButton, cc.xy(6, 6)); JScrollPane scrollPane = new JScrollPane(panel); this.add(scrollPane, BorderLayout.CENTER); this.setTitle(_("downloads.title")); } private JPanel getFirmwareTypePanel() { JPanel ftp = new JPanel(); SpringLayout sl = new SpringLayout(); ftp.setLayout(sl); ftp.setBorder(new TitledBorder(_("firmware"))); firmwareTyps = Firmware.getCategoriesBooleanHashMap(firmwares); //sort the entries SortedSet<String> sortedset= new TreeSet<String>(firmwareTyps.keySet()); Iterator<String> it = sortedset.iterator(); while (it.hasNext()) { String type = (String) it.next(); JCheckBox cb = new JCheckBox(type); cb.setSelected(firmwareTyps.get(type)); cb.addChangeListener(this); ftp.add(cb); } SpringUtilities.makeCompactGrid(ftp, (firmwareTyps.size()/4), 4, //rows, cols 2, 2, //initX, initY 2, 2); //xPad, yPad return ftp; } @Override public void actionPerformed(ActionEvent e) { if (e.getSource().equals(closeButton)) { this.dispose(); } if (e.getSource().equals(downloadButton)) { downloadTableModel.clearAllDownloads(); Vector<URL> downloadedURLs = new Vector<URL>(); table.setModel(downloadTableModel); downloadsPanel.repaint(); Iterator<String> it = firmwareTyps.keySet().iterator(); while (it.hasNext()) { String type = it.next(); for (int i = 0; i < firmwares.size(); i++) { if (firmwares.get(i).getName().equals(type) && firmwareTyps.get(type) && !downloadedURLs.contains(firmwares.get(i).getFileURL())){ downloadTableModel.addDownload(new Download((firmwares.get(i).getZipURL()!=null ? firmwares.get(i).getZipURL() : firmwares.get(i).getFileURL()))); downloadedURLs.add(firmwares.get(i).getFileURL()); } } } } } @Override public void stateChanged(ChangeEvent e) { if (firmwareTyps.containsKey(((JCheckBox)e.getSource()).getText())){ firmwareTyps.put(((JCheckBox)e.getSource()).getText(),((JCheckBox)e.getSource()).isSelected()); } } }