package de.danielsenff.dropps; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.Vector; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.Timer; import jogl.DDSImage; import org.jdesktop.application.Action; import org.jdesktop.application.Application; import org.jdesktop.application.ApplicationContext; import org.jdesktop.application.FrameView; import org.jdesktop.application.ResourceMap; import org.jdesktop.application.Task; import org.jdesktop.application.TaskMonitor; import org.jdesktop.application.TaskService; import org.jdesktop.application.Task.BlockingScope; import de.danielsenff.dropps.models.ExportOptions; import de.danielsenff.dropps.models.ProgressStatus; import de.danielsenff.dropps.tasks.ConvertFilesTask; import de.danielsenff.dropps.util.FileDrop; /** * View and Mainframe * @author Daniel Senff * */ public class DroppsView extends FrameView { private javax.swing.JPanel mainPanel; private javax.swing.JProgressBar progressBar; private javax.swing.JLabel statusAnimationLabel; private javax.swing.JLabel statusMessageLabel; private javax.swing.JPanel statusPanel; private final Timer messageTimer; private final Timer busyIconTimer; private final Icon idleIcon; private final Icon[] busyIcons = new Icon[15]; private int busyIconIndex = 0; private static final Logger logger = Logger.getLogger(DroppsView.class.getName()); private final ExportOptions options; private SettingsPanel settingsPanel; private JList dropPanel; /** * @param app */ public DroppsView(final Application app) { super(app); this.options = new ExportOptions(2048, 2048, DDSImage.D3DFMT_DXT5, true); // generated GUI builder code initComponents(); // status bar initialization - message timeout, idle icon and busy animation, etc // final ResourceMap resourceMap = getResourceMap(); final Dropps instance = Application.getInstance(Dropps.class); final ApplicationContext context = instance.getContext(); final org.jdesktop.application.ResourceMap resourceMap = context.getResourceMap(DroppsView.class); final int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout"); messageTimer = new Timer(messageTimeout, new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { // statusMessageLabel.setText(""); } }); messageTimer.setRepeats(false); final int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate"); for (int i = 0; i < busyIcons.length; i++) { busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]"); } busyIconTimer = new Timer(busyAnimationRate, new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { busyIconIndex = (busyIconIndex + 1) % busyIcons.length; statusAnimationLabel.setIcon(busyIcons[busyIconIndex]); } }); idleIcon = resourceMap.getIcon("StatusBar.idleIcon"); statusAnimationLabel.setIcon(idleIcon); progressBar.setVisible(true); // connect action tasks to status bar via TaskMonitor final TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext()); taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() { @Override public void propertyChange(final java.beans.PropertyChangeEvent evt) { final String propertyName = evt.getPropertyName(); System.out.println("PropertyName: "+propertyName); if ("started".equals(propertyName)) { if (!busyIconTimer.isRunning()) { statusAnimationLabel.setIcon(busyIcons[0]); busyIconIndex = 0; busyIconTimer.start(); } progressBar.setVisible(true); progressBar.setIndeterminate(true); } else if ("done".equals(propertyName)) { busyIconTimer.stop(); statusAnimationLabel.setIcon(idleIcon); progressBar.setVisible(false); progressBar.setValue(0); // statusMessageLabel.setText(resourceMap.getString("statusMessageLabel.text")); statusMessageLabel.setText(resourceMap.getString("StatusBar.conversion_finished")); } else if ("message".equals(propertyName)) { final String text = (String)(evt.getNewValue()); if(text != null) statusMessageLabel.setText(text); // this way we don't overwrite if message is empty messageTimer.restart(); } else if ("progress".equals(propertyName)) { final int value = (Integer)(evt.getNewValue()); progressBar.setVisible(true); progressBar.setIndeterminate(false); progressBar.setValue(value); // statusMessageLabel.setText(evt.get) } } }); } /** * GUI definiton * */ private void initComponents() { this.getFrame().setResizable(false); mainPanel = new javax.swing.JPanel(); mainPanel.setName("mainPanel"); // NOI18N mainPanel.setLayout(new BorderLayout()); statusPanel = new javax.swing.JPanel(); statusPanel.setName("statusPanel"); // NOI18N statusMessageLabel = new javax.swing.JLabel(); statusMessageLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); statusMessageLabel.setName("statusMessageLabel"); statusAnimationLabel = new javax.swing.JLabel(); statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N progressBar = new javax.swing.JProgressBar(); progressBar.setName("progressBar"); // NOI18N statusPanel.setLayout(new BorderLayout()); statusPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); statusPanel.add(statusAnimationLabel, BorderLayout.LINE_START); statusPanel.add(statusMessageLabel, BorderLayout.CENTER); statusPanel.add(progressBar, BorderLayout.LINE_END); final ResourceMap resourceMap = getResourceMap(); resourceMap.injectComponents(mainPanel); resourceMap.injectComponents(statusPanel); this.settingsPanel = new SettingsPanel(this.options); this.settingsPanel.setName("settingsPanel"); settingsPanel.setBorder( BorderFactory.createTitledBorder(resourceMap.getString("SettingsPanel.title"))); resourceMap.injectComponents(settingsPanel); mainPanel.add(settingsPanel, BorderLayout.LINE_START); final DefaultListModel dlm = new DefaultListModel(); dropPanel = new JList(dlm) { @Override public void paintComponent(Graphics g) { super.paintComponent(g); if(this.getModel().getSize() == 0) { final int fontsize = 24; final Font font = g.getFont(); final Font newFont = new Font(font.getFamily(), Font.BOLD, fontsize); g.setFont(newFont); g.setColor(new Color(128, 128, 128)); // and if even now to small, then cut g.drawString(resourceMap.getString("DropsPanel.title"), 15, 25); g.setFont(font); g.drawString(resourceMap.getString("DropsPanel.text"), 15, 45); } } }; JScrollPane scrollpane = new JScrollPane(dropPanel); scrollpane.setPreferredSize(new Dimension(350, 190)); mainPanel.add(scrollpane, BorderLayout.CENTER); new FileDrop( null, dropPanel, /*dragBorder,*/ new FileDrop.Listener() { @Override public void filesDropped( final java.io.File[] files ) { ArrayList<File> filesArrayList = new ArrayList<File>(); for( int i = 0; i < files.length; i++ ) { File file = files[i]; dlm.addElement(file); filesArrayList.add(file); } // end for: through each dropped file // System.out.println("Width: " + options.getNewWidth() + " Height: " + options.getNewHeight()); // System.out.println("Pixelformat: " + DDSFile.verbosePixelformat(options.getNewPixelformat()) + " with MipMaps " + options.hasGeneratedMipMaps()); Task convertTask = new ConvertFilesTask(getApplication(), filesArrayList, options); TaskService ts = Dropps.getApplication().getContext().getTaskService(); ts.execute(convertTask); } // end filesDropped }); // end FileDrop.Listener setComponent(mainPanel); setStatusBar(statusPanel); } /** * @return the dropPanel */ public JList getDropPanel() { return dropPanel; } /* * Action definitions * */ /** * @return */ @Action(block = BlockingScope.APPLICATION) public Task<ProgressStatus, Void> convertFiles() { final Vector<File> filesAwaitingProgression = null; return new ConvertFilesTask(getApplication(), filesAwaitingProgression, options); } }