package com.blazingfrog.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.Timer;
import javax.swing.border.Border;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;
import com.blazingfrog.backend.MainProcess;
import com.blazingfrog.dummy.Application;
import com.blazingfrog.imported.FileDrop;
import com.blazingfrog.imported.RotatedJLabel;
import com.blazingfrog.misc.ConsoleFile;
import com.blazingfrog.misc.DefaultOptions;
import com.blazingfrog.misc.Resources;
import com.blazingfrog.misc.UserProfile;
//VS4E -- DO NOT REMOVE THIS LINE!
public class Window1 extends JFrame implements WindowListener{
private static final long serialVersionUID = 1L;
private JMenuBar jMenuBar0;
private JLabel mainLabel;
private JButton startBtn;
private static final int TIMER_FREQ = 100;
private JTextField folderName;
private RotatedJLabel imgLabel;
private Thread batch;
private JProgressBar jProgressBar0;
private MainProcess mainProcess;
private JLabel subLabel;
private JButton stopBtn;
private JButton selectFolderBtn;
private Border border;
private boolean stopProcess;
private JLabel consoleLabel;
private JLabel frogLabelImg;
private ArrayList<File> fileList;
public Window1() {
initComponents();
}
private void initComponents() {
setBackground(new Color(251, 251, 251));
setResizable(false);
setLayout(new GroupLayout());
add(getStartBtn(), new Constraints(new Leading(25, 150, 12, 12), new Leading(260, 33, 10, 10)));
add(getStopBtn(), new Constraints(new Leading(187, 150, 12, 12), new Leading(260, 33, 10, 10)));
add(getJProgressBar0(), new Constraints(new Leading(344, 511, 10, 10), new Leading(260, 34, 10, 10)));
add(getImgLabel(), new Constraints(new Leading(30, 10, 10), new Leading(19, 12, 12)));
add(getJTextField0(), new Constraints(new Leading(211, 633, 12, 12), new Leading(184, 32, 12, 12)));
add(getmainLabel(), new Constraints(new Leading(198, 661, 10, 10), new Leading(13, 183, 12, 12)));
add(getConsoleLabel(), new Constraints(new Leading(229, 625, 10, 10), new Leading(226, 28, 12, 12)));
add(getFrogLabelImg(), new Constraints(new Leading(220, 642, 12, 12), new Leading(4, 312, 10, 10)));
add(getSelectFolderBtn(), new Constraints(new Leading(25, 165, 12, 12), new Leading(180, 42, 12, 12)));
add(getsubLabel(), new Constraints(new Leading(75, 70, 12, 12), new Leading(131, 20, 12, 12)));
setJMenuBar(getJMenuBar0());
setSize(869, 351);
}
private JLabel getFrogLabelImg() {
if (frogLabelImg == null) {
frogLabelImg = new JLabel();
frogLabelImg.setIcon(Resources.getBfMainFrog());
}
return frogLabelImg;
}
private JLabel getConsoleLabel() {
if (consoleLabel == null) {
consoleLabel = new JLabel();
consoleLabel.setForeground(Color.DARK_GRAY);
consoleLabel.setFont(new Font("Helvetica Neue", Font.BOLD, 14));
}
return consoleLabel;
}
private JButton getStopBtn() {
if (stopBtn == null) {
stopBtn = new JButton();
stopBtn.setText("Stop");
stopBtn.setFont(new Font("Geneva", Font.BOLD, 11));
stopBtn.setFocusable(true);
stopBtn.setDoubleBuffered(true);
stopBtn.setEnabled(false);
if (Resources.getOSName().equals("windows"))
stopBtn.setBackground(new Color(238,238,238));
stopBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
stopBtnMouseMouseClicked(event);
}
});
}
return stopBtn;
}
private JLabel getmainLabel() {
if (mainLabel == null) {
mainLabel = new JLabel();
mainLabel.setFont(new Font("Helvetica Neue", Font.PLAIN, 184));
mainLabel.setText("LatiPics");
mainLabel.setForeground(Color.GRAY);
mainLabel.setVerticalAlignment(SwingConstants.BOTTOM);
}
return mainLabel;
}
private JLabel getsubLabel() {
if (subLabel == null) {
subLabel = new JLabel();
subLabel.setFont(new Font("Geneva", Font.ITALIC, 13));
subLabel.setText("Drop Zone");
subLabel.setForeground(Color.gray);
}
return subLabel;
}
private JProgressBar getJProgressBar0() {
if (jProgressBar0 == null) {
jProgressBar0 = new JProgressBar();
jProgressBar0.setMaximum(1); // default
// Windows: do not show unless running
if (Resources.getOSName().equals("windows"))
jProgressBar0.setVisible(false);
else{
jProgressBar0.setStringPainted(true);
border = BorderFactory.createTitledBorder(" ");
jProgressBar0.setBorder(border);
}
}
return jProgressBar0;
}
private JLabel getImgLabel() {
if (imgLabel == null) {
imgLabel = new RotatedJLabel(""); //JLabel();
imgLabel.setMinimumSize(new Dimension(160, 106));
imgLabel.setPreferredSize(new Dimension(160, 106)); //106));
imgLabel.setMaximumSize(new Dimension(160, 160)); //106));
imgLabel.setOpaque(true);
imgLabel.setRotation(0);
imgLabel.setHorizontalAlignment(SwingConstants.CENTER);
if (Resources.getOSName().equals("windows"))
imgLabel.setBackground(Resources.getWinThemeColor());
else
imgLabel.setBackground(new Color(251, 251, 251));
imgLabel.setIcon(Resources.getIPhotoCrosshair());
new FileDrop( imgLabel, new FileDrop.Listener()
{
public void filesDropped( java.io.File[] files )
{
if (batch == null || !batch.isAlive()){
resetVariables();
List<File> tmpFileList = Arrays.asList(files);
fileList = new ArrayList<File>(tmpFileList);
processSelection(new ArrayList<File>(fileList));
}
}
});
}
return imgLabel;
}
private JTextField getJTextField0() {
if (folderName == null) {
folderName = new JTextField();
folderName.setEditable(false);
folderName.setBackground(Color.gray);
folderName.setForeground(Color.WHITE);
folderName.setFont(new Font("Monaco", Font.BOLD, 14));
folderName.setHorizontalAlignment(JTextField.CENTER);
}
return folderName;
}
private JButton getStartBtn() {
if (startBtn == null) {
startBtn = new JButton();
startBtn.setEnabled(false);
startBtn.setFont(new Font("Geneva", Font.BOLD, 11));
startBtn.setText("Start");
if (Resources.getOSName().equals("windows"))
startBtn.setBackground(Resources.getWinThemeColor());
startBtn.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
try {
doProcess();
} catch (IOException e) {
e.printStackTrace();
}
}
});
startBtn.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_SPACE || event.getKeyCode() == KeyEvent.VK_ENTER){
try {
doProcess();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
return startBtn;
}
private JMenuBar getJMenuBar0() {
if (jMenuBar0 == null) {
jMenuBar0 = new JMenuBar();
}
return jMenuBar0;
}
private JButton getSelectFolderBtn() {
if (selectFolderBtn == null) {
selectFolderBtn = new JButton("Select a File or a Folder");
selectFolderBtn.setFont(new Font("Geneva", Font.BOLD, 11));
selectFolderBtn.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
selectFolderBtnMouseMouseClicked(event);
}
});
selectFolderBtn.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
selectFolderBtnKeyKeyPressed(event);
}
});
}
return selectFolderBtn;
}
private void selectFolderBtnMouseMouseClicked(MouseEvent event) {
if (selectFolderBtn.isEnabled())
selectFileFolderAction();
}
private void timerActionPerformed(ActionEvent e) {
jProgressBar0.setValue(mainProcess.getNbPicsProcessed());
border = BorderFactory.createTitledBorder("Processing...");
jProgressBar0.setBorder(border);
javax.swing.Timer timer = (Timer) e.getSource();
if (!batch.isAlive()){
timer.stop();
resetVariables();
if (stopProcess){
border = BorderFactory.createTitledBorder("Action interrupted...");
jProgressBar0.setValue(0);
} else{
border = BorderFactory.createTitledBorder("Complete.");
jProgressBar0.setValue(100);
}
jProgressBar0.setBorder(border);
}
}
private void doProcess() throws IOException{
if (!startBtn.isEnabled())
return;
if (ConsoleFile.getLength() > 0)
ConsoleFile.empty();
if (UserProfile.listProfiles().size() == 0){
JOptionPane.showMessageDialog(this,
"<html><font face=\"Lucida Grande\" size=\"3\"><CENTER><b>You have not created any LatiPics profile to link<br> with your Google Latitude account.</b><br><br>Click OK to add a profile and link it to a Google ID.</CENTER></font></html>",
"No Profile Found",
JOptionPane.INFORMATION_MESSAGE,
Resources.getLpIcon());
new PrefPaneCaller();
return;
}
// Get the profile
String profile = DefaultOptions.getDefaultProfileName();
String token = UserProfile.getToken(profile);
String tokenSecret = UserProfile.getTokenSecret(profile);
initVariablesBeforeRunning();
stopProcess = false;
mainProcess = new MainProcess(fileList, imgLabel, consoleLabel, token, tokenSecret);
batch = new Thread(mainProcess);
batch.start();
//jProgressBar0.setVisible(true); // Windows: was invisible
startBtn.setEnabled(false);
stopBtn.setEnabled(true);
selectFolderBtn.setEnabled(false);
// To assure focus
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// stopBtn.requestFocus();
stopBtn.requestFocusInWindow();
new javax.swing.Timer(TIMER_FREQ, new ActionListener() {
public void actionPerformed(ActionEvent e) {
timerActionPerformed(e);
}
}).start();
}
private void stopBtnMouseMouseClicked(ActionEvent event){ //MouseEvent event) {
stopProcess = true;
mainProcess.setStopProcess(stopProcess);
}
private void selectFolderBtnKeyKeyPressed(KeyEvent event) {
if(event.getKeyChar() == ' '){
selectFileFolderAction();
}
}
@SuppressWarnings("static-access")
private void selectFileFolderAction() {
resetVariables();
if (UserProfile.listProfiles().size() == 0){
JOptionPane.showMessageDialog(this,
"<html><font face=\"Lucida Grande\" size=\"3\"><CENTER><b>You have not created any LatiPics profile to link<br> with your Google Latitude account.</b><br><br>Click OK to add a profile and link it to a Google ID.</CENTER></font></html>",
"No Profile Found",
JOptionPane.INFORMATION_MESSAGE,
Resources.getLpIcon());
new PrefPaneCaller();
return;
}
// Do not allow pressing the filechooser if preferences are not enabled (preferences window open)
if (Resources.getOSName().equals("mac") && !Application.getApplication().getEnabledPreferencesMenu())
return;
if (Resources.getOSName().equals("windows") && !this.getJMenuBar().getMenu(0).getMenuComponent(2).isEnabled())
return;
final JFileChooser fc = new JFileChooser(Resources.getUserDirectory());
FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "jpeg", "png", "gif", "tiff", "bmp", "ico", "psd", "xmp");
fc.setFileFilter(filter);
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); //DIRECTORIES_ONLY);
fc.setAcceptAllFileFilterUsed(false);
fc.setMultiSelectionEnabled(false);
final CheckBoxAccessory checkBoxAccessory = new CheckBoxAccessory(fc);
fc.setAccessory(checkBoxAccessory);
fc.addPropertyChangeListener( new PropertyChangeListener(){
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ( evt.getPropertyName().equals("directoryChanged")){
// uncheck checkbox if not on a folder
if (fc.getSelectedFile() != null && !fc.getSelectedFile().isDirectory()){
checkBoxAccessory.setCBState(false);
}
}
}});
int rc = fc.showOpenDialog(jMenuBar0);
if (rc == JFileChooser.APPROVE_OPTION) {
// save user directory
if (fc.getSelectedFile().isDirectory())
Resources.setUserDirectory(fc.getSelectedFile());
else
Resources.setUserDirectory(fc.getCurrentDirectory());
// Get the file/directory and process it
fileList = new ArrayList<File>();
fileList.add(fc.getSelectedFile());
processSelection(fileList);
}
}
private void initVariablesBeforeRunning(){
// Initialize variables before processing
startBtn.setEnabled(true);
startBtn.setFocusable(true);
jProgressBar0.setValue(0);
consoleLabel.setText("");
subLabel.setText("");
if (Resources.getOSName().equals("windows"))
jProgressBar0.setVisible(true);
}
private void resetVariables(){
startBtn.setEnabled(false);
startBtn.setFocusable(false);
jProgressBar0.setValue(0);
if (Resources.getOSName().equals("windows"))
jProgressBar0.setVisible(false);
selectFolderBtn.setEnabled(true);
subLabel.setText("Drop Zone");
folderName.setText("");
consoleLabel.setText("");
stopBtn.setEnabled(false);
}
private void processSelection(ArrayList<File> fileList){
int nbDir=0;
int nbFiles=0;
int totNbrFiles=0;
if (fileList.size() > 1){
for (int idx=0;idx < fileList.size();idx++)
{
if (fileList.get(idx).isDirectory())
{
nbDir++;
// are files within the passed dir actually files or dirs?
for (int idx2=0;idx2 < fileList.get(idx).listFiles().length;idx2++){
if (!fileList.get(idx).listFiles()[idx2].isDirectory()){
totNbrFiles++;
}
}
}
else{
nbFiles++;
}
}
totNbrFiles = totNbrFiles + nbFiles;
if (nbFiles > 0 && nbDir > 0)
folderName.setText(nbFiles + " file(s) and " + nbDir + " folder(s) were selected (total number of files: " + totNbrFiles + ")");
if (nbFiles == 0 && nbDir > 0)
folderName.setText(nbDir + " folder(s) were selected (total number of files: " + totNbrFiles + ")");
if (nbFiles > 0 && nbDir == 0)
folderName.setText(totNbrFiles + " file(s) were selected");
jProgressBar0.setMaximum(totNbrFiles);
}
else
{
totNbrFiles = 1;
if (fileList.get(0).isFile()){
jProgressBar0.setMaximum(1);
folderName.setText(fileList.get(0).getName());
} else {
// are files within the passed dir actually files or dirs?
for (int idx2=0;idx2 < fileList.get(0).listFiles().length;idx2++){
if (!fileList.get(0).listFiles()[idx2].isDirectory()){
totNbrFiles++;
}
}
jProgressBar0.setMaximum(totNbrFiles);
folderName.setText(fileList.get(0).getName() + " (" + totNbrFiles + " files)");
}
}
if (totNbrFiles == 0)
return;
initVariablesBeforeRunning();
// To assure focus
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
startBtn.requestFocus();
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}