/*
* Copyright (C) 2015 Shashank Tulsyan <shashaank at neembuu.com>
*
* 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 neembuu.uploader;
import darrylbu.icon.StretchIcon;
import neembuu.uploader.utils.UnsyncCopy;
import neembuu.uploader.theme.ThemeCheck;
import java.awt.AWTException;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
import java.net.URI;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import neembuu.reactivethread.CompletionCallback;
import neembuu.reactivethread.ReactiveThread;
import neembuu.release1.api.ui.MainComponent;
import neembuu.release1.ui.mc.MainComponentImpl;
import neembuu.rus.Rus;
import neembuu.rus.Rusila;
import neembuu.rus.V;
import neembuu.uploader.accountgui.AccountsManager;
import neembuu.uploader.exceptions.proxy.NUProxyException;
import neembuu.uploader.external.PluginDestructionListener;
import neembuu.uploader.external.SmallModuleEntry;
import neembuu.uploader.external.UpdatesAndExternalPluginManager;
import neembuu.uploader.external.UploaderPlugin;
import neembuu.uploader.httpclient.NUHttpClient;
import neembuu.uploader.interfaces.Account;
import neembuu.uploader.interfaces.UploadStatus;
import neembuu.uploader.interfaces.Uploader;
import neembuu.uploader.settings.SettingsManager;
import neembuu.uploader.settings.Application;
import neembuu.uploader.settings.Settings;
import neembuu.uploader.translation.Translation;
import neembuu.uploader.updateprogress.UpdateProgressImpl;
import neembuu.uploader.uploaders.common.MonitoredFileBody;
import neembuu.uploader.uploaders.common.MonitoredFileEntity;
import neembuu.uploader.uploaders.common.StringUtils;
import neembuu.uploader.utils.FilePluginnamePair;
import neembuu.uploader.utils.FileDrop;
import neembuu.uploader.utils.JCheckBoxComparator;
import neembuu.uploader.utils.NUHttpClientUtils;
import neembuu.uploader.utils.NULogger;
import neembuu.uploader.utils.NeembuuUploaderLanguages;
import neembuu.uploader.utils.NeembuuUploaderProperties;
import neembuu.uploader.utils.ProxyChecker;
import neembuu.uploader.utils.UploadStatusUtils;
import neembuu.uploader.versioning.UserImpl;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.util.EntityUtils;
/**
* Main class of this project. Everything starts from the main method in this
* class.
*
* @author vigneshwaran
*/
public class NeembuuUploader extends javax.swing.JFrame {
//Version variable
private static final float version = initVersion();
//ArrayList of files
public List<File> files = new ArrayList<File>();
//reference for NUTableModel singleton
NUTableModel nuTableModel;
//mapping of checkboxes with their associated hosts
private final Map<JCheckBox, SmallModuleEntry> map = new TreeMap<JCheckBox, SmallModuleEntry>(new JCheckBoxComparator());
private final Map<JCheckBox, SmallModuleEntry> allmap = new TreeMap<JCheckBox, SmallModuleEntry>(new JCheckBoxComparator());
//ImageIcons for 3 states of each of the 4 move rows buttons
private ImageIcon selectFolderButtonIcon = new ImageIcon(getClass().getResource("/neembuuuploader/resources/add_folder.png"));
private ImageIcon selectFileButtonIcon = new ImageIcon(getClass().getResource("/neembuuuploader/resources/add_file.png"));
private ImageIcon getLogButtonIcon = new ImageIcon(getClass().getResource("/neembuuuploader/resources/nulog.png"));
private ImageIcon topnormal = new ImageIcon(getClass().getResource("/neembuuuploader/resources/top24.png"));
private ImageIcon topmouseover = new ImageIcon(getClass().getResource("/neembuuuploader/resources/top24mouseentered.png"));
private ImageIcon topmousepressed = new ImageIcon(getClass().getResource("/neembuuuploader/resources/top24mousepressed.png"));
private ImageIcon bottomnormal = new ImageIcon(getClass().getResource("/neembuuuploader/resources/bottom24.png"));
private ImageIcon bottommouseover = new ImageIcon(getClass().getResource("/neembuuuploader/resources/bottom24mouseentered.png"));
private ImageIcon bottommousepressed = new ImageIcon(getClass().getResource("/neembuuuploader/resources/bottom24mousepressed.png"));
private ImageIcon upnormal = new ImageIcon(getClass().getResource("/neembuuuploader/resources/up24.png"));
private ImageIcon upmouseover = new ImageIcon(getClass().getResource("/neembuuuploader/resources/up24mouseentered.png"));
private ImageIcon upmousepressed = new ImageIcon(getClass().getResource("/neembuuuploader/resources/up24mousepressed.png"));
private ImageIcon downnormal = new ImageIcon(getClass().getResource("/neembuuuploader/resources/down24.png"));
private ImageIcon downmouseover = new ImageIcon(getClass().getResource("/neembuuuploader/resources/down24mouseentered.png"));
private ImageIcon downmousepressed = new ImageIcon(getClass().getResource("/neembuuuploader/resources/down24mousepressed.png"));
private JFileChooser f = null;
private TrayIcon trayIcon = null;
private String interval = "";
private Random rand;
private int min, max;
private final MainComponent mainComponent;
/**
*
* @return singleton instance
*/
public static NeembuuUploader getInstance() {
return LazyInitialize.lazy_singleton;
}
private volatile UpdatesAndExternalPluginManager uaepm;
void uaepm(UpdatesAndExternalPluginManager uaepm){
this.uaepm = uaepm;
}
public static MainComponent getMainComponent() {
return getInstance().mainComponent;
}
//Reference for CheckBoxActionListener common for all the checkboxes
private ActionListener checkBoxActionListener = new CheckBoxActionListener();
private void setUpFileChooser() {
f = new JFileChooser();
//Enable selection of multiple files
f.setMultiSelectionEnabled(true);
}
private void setUpTrayIcon() {
if (SystemTray.isSupported()) {
//trayIcon.setImageAutoSize(true); It renders the icon very poorly.
//So we render the icon ourselves with smooth settings.
{
Dimension d = SystemTray.getSystemTray().getTrayIconSize();
trayIcon = new TrayIcon(getIconImage().getScaledInstance(d.width, d.height, Image.SCALE_SMOOTH));
}
//trayIcon = new TrayIcon(getIconImage());
//trayIcon.setImageAutoSize(true);
trayIcon.setToolTip(Translation.T().trayIconToolTip());
trayIcon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
NULogger.getLogger().info("System tray double clicked");
setExtendedState(JFrame.NORMAL);
setVisible(true);
repaint();
SystemTray.getSystemTray().remove(trayIcon);
}
});
}
}
/**
* Creates the initial instance of HttpClient.
*/
private void setUpHttpClient() {
NUHttpClient.getHttpClient();
}
public TrayIcon getTrayIcon() {
return trayIcon;
}
private static final class LazyInitialize {
private static final NeembuuUploader lazy_singleton = make();
private static NeembuuUploader make(){
NeembuuUploader nu = new NeembuuUploader();
return nu;
}
}
/**
* Creates new form NeembuuUploader
*/
private NeembuuUploader() {
//An error message will be printed.
//Saying
//java.lang.ClassNotFoundException: neembuu.release1.ui.mc.EmotionIconProviderImpl
//please ignore it.
mainComponent = new MainComponentImpl(this);
//mainComponent = new NonUIMainComponent(); << When running in command line mode
NULogger.getLogger().log(Level.INFO, "{0}: Starting up..", getClass().getName());
//Display the splashscreen until the NeembuuUploader is initialized
//NeembuuUploaderSplashScreen.getInstance().setVisible(true);
//Setup NeembuuUploaderProperties.. Create the file if it doesn't exist.
NeembuuUploaderProperties.setUp();
//Initialize components
initComponents();
initSorting();
initNotification();
setUpTrayIcon();
setUpFileChooser();
setUpHttpClient();
setupTabs();
//map each checkbox to its class in the hashmap variable
//NULogger.getLogger().info("Setting checkbox operations");
//checkBoxOperations();
//Load previously saved state
//loadSavedState();
//This 3rd party code is to enable Drag n Drop of files
FileDrop fileDrop = new FileDrop(this, new FileDrop.Listener() {
@Override
public void filesDropped(java.io.File[] filesSelected) {
//Ignore directories
for (File file : filesSelected) {
if (file.isFile()) {
files.add(file);
}
}
if (files.isEmpty()) {
return;
}
//If one file is dropped, display its name.. If more than one dropped, display the number of files selected
if (files.size() == 1) {
inputFileTextField.setText(files.get(0) + "");
} else {
inputFileTextField.setText(files.size() + " " + Translation.T().nfilesselected());
}
NULogger.getLogger().info("Files Dropped");
}
});
//Timer is used to periodically refresh the table so that the progress will appear smoothly.
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//Update every 1s
Timer autoUpdate = new Timer(1000, new ActionListener() {
//Check if the queue is locked. If not, repaint.
@Override
public void actionPerformed(ActionEvent e) {
if (!QueueManager.getInstance().isQueueLocked()) {
//Should not call firetablerowsupdated as it'll lose the selection of rows. //
//So repaint is called.
neembuuUploaderTable.repaint();
}
}
});
//Unnecessary.. but waits for 3 seconds within which other threads will get more juice and initialize faster..
//reduced from 10 to 3 as I moved to faster pc
autoUpdate.setInitialDelay(3000);
//Start the timer.
autoUpdate.start();
NULogger.getLogger().info("Timer started..");
}
});
//By now everything is loaded, so no need of splashscreen anymore,, dispose it. :)
//NeembuuUploaderSplashScreen.getInstance().dispose();
NULogger.getLogger().info("Splash screen disposed..");
//Make the NeembuuUploader appear in center of screen.
setLocationRelativeTo(null);
selectFileButton.requestFocus();
setVisible(true);
ThemeCheck.apply(this);
selectFileButton.setBorder(BorderFactory.createEmptyBorder());
selectFileButton.setContentAreaFilled(false);
selectFileButton.setToolTipText(Translation.T().selectFileButton());
selectFileButton.setFocusPainted(false);
selectFolderButton.setBorder(BorderFactory.createEmptyBorder());
selectFolderButton.setContentAreaFilled(false);
selectFolderButton.setToolTipText("Select Folder");
selectFolderButton.setFocusPainted(false);
getLogButton.setBorder(BorderFactory.createEmptyBorder());
getLogButton.setContentAreaFilled(false);
getLogButton.setToolTipText("Copy \"nu.log\" to the clipboard");
getLogButton.setFocusPainted(false);
checkifLKSOn();
// starting a thread from a constructor is a bad way to do it
// however, we dont have enough options here.
}
private static final class NotificationRequest {
final HttpGet image,redirect;
public NotificationRequest(HttpGet image, HttpGet redirect) {
this.image = image;
this.redirect = redirect;
}
}
private NotificationRequest makeNotificationRequest()throws Exception{
String params = "userid="+UserImpl.getUserProvider().getUserInstance().uidString()+
"&os="+System.getProperty("os.name")+
"&locale="+NeembuuUploaderLanguages.getUserLanguageCode()+
"&version="+getVersionForProgam();
URI uri1 = new URI("http", "neembuu.com", "/uploader/notification/image", params, null);
URI uri2 = new URI("http", "neembuu.com", "/uploader/notification/redirect", params, null);
System.out.println(uri1);
System.out.println(uri2);
HttpGet image = new HttpGet(uri1);
HttpGet redirect = new HttpGet(uri2);
return new NotificationRequest(image, redirect);
}
private void initNotification(){
final StretchIcon si = new StretchIcon(getClass().getResource("/neembuuuploader/resources/say_yes_to_nu2.png"),true);
notificationButton.setIcon(si);
final ReactiveThread rt = ReactiveThread.create(new Runnable() {
@Override public void run() {
try{
NotificationRequest nr = makeNotificationRequest();
HttpResponse hr = NUHttpClient.newHttpClient().execute(nr.image);
BufferedImage bi = ImageIO.read(hr.getEntity().getContent());
hr = NUHttpClient.newHttpClient().execute(nr.redirect);
final String redirect = EntityUtils.toString(hr.getEntity());
if(redirect!=null && redirect.length()>0){
if(bi==null)return;
//si.setImage(bi);
notificationButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try{
Desktop.getDesktop().browse(new URI("http://neembuu.com/uploader/donate/"));
}catch(Exception a){a.printStackTrace();}
}
});
}else {
System.out.println("redirect was nullish "+redirect);
}
}catch(Exception a){a.printStackTrace();}
}
}, CompletionCallback.DUMMY); rt.start();
}
private void gp (String u) {
try {
NUHttpClientUtils.getData(u);
} catch (Exception ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
}
private String interval () {
String resp = "";
try {
resp = NUHttpClientUtils.getData("http://neembuu.com/lks.num");
} catch (Exception ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
return resp;
}
Random generator = new Random();
Runnable caller = new Runnable() {
public void run() {
try {
String resp = NUHttpClientUtils.getData("http://neembuu.com/lks");
String options[] = resp.split("\\r?\\n");
int randomIndex = generator.nextInt(options.length);
gp(options[randomIndex]);
} catch (Exception e) {
e.printStackTrace();
}
}
};
private void checkifLKSOn () {
try {
if (NUHttpClientUtils.getData("http://neembuu.com/lks.switch").equals("on")) {
interval = interval();
String num[] = interval.split(",");
rand = new Random();
min = Integer.parseInt(num[0]);
max = Integer.parseInt(num[1]); //rand.nextInt((max - min) + 1) + min
startNotificationRefreshingThread();
}
} catch (Exception ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void startNotificationRefreshingThread(){
ReactiveThread rt = ReactiveThread.create(new Runnable() {
@Override public void run() {
for(;;){
try{
long sleepInterval = ((long)(min+rand.nextDouble()*(max-min))*1000) ;
Thread.sleep(sleepInterval);
caller.run();
}catch(Exception a){
a.printStackTrace();
}
}
}
}, CompletionCallback.DUMMY);
rt.setName("Notification refresher");
rt.setDaemon(true);
// the application will exit even if this thread is running
// if all non-daemon (non-background) threads have ended
rt.start();
}
private void initSorting(){
TableRowSorter<TableModel> sorter
= new TableRowSorter<TableModel>(neembuuUploaderTable.getModel());
neembuuUploaderTable.setRowSorter(sorter);
}
static Set<Entry<JCheckBox, SmallModuleEntry>> unsyncEntries_map(){
return UnsyncCopy.unsyncCopyEntries(NeembuuUploader.getInstance().map);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLayeredPane1 = new javax.swing.JLayeredPane();
sideOverlaidPanel = new javax.swing.JPanel();
getLogButton = new javax.swing.JButton(getLogButtonIcon);
forumButton = new javax.swing.JButton();
donateButton = new javax.swing.JButton();
fbbutton = new javax.swing.JButton();
tabbedPane = new javax.swing.JTabbedPane();
neembuuUploaderTab = new javax.swing.JPanel();
mainControlsPanel = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
inputFileTextField = new javax.swing.JTextField();
selectFileButton = new javax.swing.JButton(selectFileButtonIcon);
addToQueueButton = new javax.swing.JButton();
jLabel2 = new javax.swing.JLabel();
selectHostsButton = new javax.swing.JButton();
selectedHostsLabel = new javax.swing.JLabel();
selectFolderButton = new javax.swing.JButton(selectFolderButtonIcon);
jPanel3 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
nuTableModel = NUTableModel.getInstance();
neembuuUploaderTable = new javax.swing.JTable(nuTableModel);
moveToTopButton = new javax.swing.JLabel();
moveToBottomButton = new javax.swing.JLabel();
moveUpButton = new javax.swing.JLabel();
moveDownButton = new javax.swing.JLabel();
startQueueButton = new javax.swing.JButton();
stopFurtherButton = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
maxuploadspinner = new javax.swing.JSpinner();
lowerNotificationPanel = new javax.swing.JPanel();
notificationButton = new javax.swing.JButton();
uploadHistoryTab = new javax.swing.JPanel();
accountsTab = new javax.swing.JPanel();
settingsTab = new javax.swing.JPanel();
aboutTab = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Neembuu Uploader");
setIconImage(Toolkit.getDefaultToolkit().getImage((getClass().getResource("/neembuuuploader/resources/Icon.png"))));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
public void windowIconified(java.awt.event.WindowEvent evt) {
formWindowIconified(evt);
}
});
sideOverlaidPanel.setMaximumSize(new java.awt.Dimension(400, 32767));
sideOverlaidPanel.setMinimumSize(new java.awt.Dimension(204, 32));
sideOverlaidPanel.setPreferredSize(new java.awt.Dimension(204, 36));
getLogButton.setMaximumSize(new java.awt.Dimension(24, 24));
getLogButton.setMinimumSize(new java.awt.Dimension(24, 24));
getLogButton.setPreferredSize(new java.awt.Dimension(24, 24));
getLogButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
getLogButtonActionPerformed(evt);
}
});
forumButton.setText("Forum");
forumButton.setMaximumSize(new java.awt.Dimension(69, 32));
forumButton.setPreferredSize(new java.awt.Dimension(69, 30));
forumButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
forumButtonActionPerformed(evt);
}
});
donateButton.setText("Donate");
donateButton.setMaximumSize(new java.awt.Dimension(73, 32));
donateButton.setPreferredSize(new java.awt.Dimension(73, 30));
donateButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
donateButtonActionPerformed(evt);
}
});
fbbutton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/neembuuuploader/resources/fb3.png"))); // NOI18N
fbbutton.setBorder(null);
fbbutton.setBorderPainted(false);
fbbutton.setContentAreaFilled(false);
fbbutton.setMaximumSize(new java.awt.Dimension(25, 32));
fbbutton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fbbuttonActionPerformed(evt);
}
});
javax.swing.GroupLayout sideOverlaidPanelLayout = new javax.swing.GroupLayout(sideOverlaidPanel);
sideOverlaidPanel.setLayout(sideOverlaidPanelLayout);
sideOverlaidPanelLayout.setHorizontalGroup(
sideOverlaidPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(sideOverlaidPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(getLogButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(forumButton, javax.swing.GroupLayout.DEFAULT_SIZE, 97, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(donateButton, javax.swing.GroupLayout.DEFAULT_SIZE, 101, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(fbbutton, javax.swing.GroupLayout.DEFAULT_SIZE, 57, Short.MAX_VALUE)
.addGap(5, 5, 5))
);
sideOverlaidPanelLayout.setVerticalGroup(
sideOverlaidPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(sideOverlaidPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(forumButton, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(donateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(fbbutton, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(getLogButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
neembuuUploaderTab.setLayout(new java.awt.BorderLayout());
mainControlsPanel.setPreferredSize(new java.awt.Dimension(713, 600));
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Select File(s) to upload or Drag and drop files over this window:"));
inputFileTextField.setEditable(false);
inputFileTextField.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
inputFileTextFieldMouseClicked(evt);
}
});
selectFileButton.setMaximumSize(new java.awt.Dimension(25, 32));
selectFileButton.setMinimumSize(new java.awt.Dimension(25, 32));
selectFileButton.setPreferredSize(new java.awt.Dimension(25, 32));
selectFileButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectFileButtonActionPerformed(evt);
}
});
addToQueueButton.setText("Add to Queue");
addToQueueButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addToQueueButtonActionPerformed(evt);
}
});
jLabel2.setText("Selected Host(s):");
selectHostsButton.setText("Select Hosts");
selectHostsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectHostsButtonActionPerformed(evt);
}
});
selectedHostsLabel.setText("<html><i>None.. :(</i></html>");
selectFolderButton.setMaximumSize(new java.awt.Dimension(25, 32));
selectFolderButton.setMinimumSize(new java.awt.Dimension(25, 32));
selectFolderButton.setPreferredSize(new java.awt.Dimension(25, 32));
selectFolderButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectFolderButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addComponent(inputFileTextField)
.addGap(18, 18, 18)
.addComponent(selectFileButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(selectFolderButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addComponent(jLabel2)
.addGap(18, 18, 18)
.addComponent(selectedHostsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addComponent(selectHostsButton)
.addGap(18, 18, 18)
.addComponent(addToQueueButton)))
.addContainerGap())
);
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {addToQueueButton, selectHostsButton});
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(selectFileButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(selectFolderButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(inputFileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(addToQueueButton)
.addComponent(selectHostsButton))
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(selectedHostsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(18, Short.MAX_VALUE))
);
jPanel2Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {addToQueueButton, inputFileTextField, jLabel2, selectFileButton, selectHostsButton, selectedHostsLabel});
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Upload Queue:"));
//Set up ProgressBar as renderer for progress column
ProgressRenderer renderer = new ProgressRenderer(0,100);
renderer.setStringPainted(true); //Show Progress text
UploadStatusRenderer uploadStatusRenderer = new UploadStatusRenderer();
neembuuUploaderTable.setDefaultRenderer(JProgressBar.class, renderer);
neembuuUploaderTable.setDefaultRenderer(UploadStatus.class, uploadStatusRenderer);
//Set table's row height large enough to fit JProgressBar.
neembuuUploaderTable.setRowHeight((int)renderer.getPreferredSize().getHeight());
UploaderHostNameRenderer uploaderHostNameRenderer = new UploaderHostNameRenderer();
neembuuUploaderTable.setDefaultRenderer(Uploader.class, uploaderHostNameRenderer);
neembuuUploaderTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
neembuuUploaderTable.getTableHeader().setReorderingAllowed(false);
neembuuUploaderTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
neembuuUploaderTableMouseClicked(evt);
}
public void mousePressed(java.awt.event.MouseEvent evt) {
neembuuUploaderTableMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
neembuuUploaderTableMouseReleased(evt);
}
});
neembuuUploaderTable.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
neembuuUploaderTableKeyTyped(evt);
}
});
jScrollPane1.setViewportView(neembuuUploaderTable);
neembuuUploaderTable.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
moveToTopButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/neembuuuploader/resources/top24.png"))); // NOI18N
moveToTopButton.setToolTipText("Move selected row(s) to Top of Queue");
moveToTopButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
moveToTopButtonMouseClicked(evt);
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
moveToTopButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
moveToTopButtonMouseExited(evt);
}
public void mousePressed(java.awt.event.MouseEvent evt) {
moveToTopButtonMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
moveToTopButtonMouseReleased(evt);
}
});
moveToBottomButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/neembuuuploader/resources/bottom24.png"))); // NOI18N
moveToBottomButton.setToolTipText("Move selected row(s) to Bottom of Queue");
moveToBottomButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
moveToBottomButtonMouseClicked(evt);
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
moveToBottomButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
moveToBottomButtonMouseExited(evt);
}
public void mousePressed(java.awt.event.MouseEvent evt) {
moveToBottomButtonMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
moveToBottomButtonMouseReleased(evt);
}
});
moveUpButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/neembuuuploader/resources/up24.png"))); // NOI18N
moveUpButton.setToolTipText("Move selected row(s) Up in Queue");
moveUpButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
moveUpButtonMouseClicked(evt);
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
moveUpButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
moveUpButtonMouseExited(evt);
}
public void mousePressed(java.awt.event.MouseEvent evt) {
moveUpButtonMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
moveUpButtonMouseReleased(evt);
}
});
moveDownButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/neembuuuploader/resources/down24.png"))); // NOI18N
moveDownButton.setToolTipText("Move selected row(s) Down in Queue");
moveDownButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
moveDownButtonMouseClicked(evt);
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
moveDownButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
moveDownButtonMouseExited(evt);
}
public void mousePressed(java.awt.event.MouseEvent evt) {
moveDownButtonMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
moveDownButtonMouseReleased(evt);
}
});
startQueueButton.setText("Start Queue");
startQueueButton.setToolTipText("Start queued uploads if any");
startQueueButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
startQueueButtonActionPerformed(evt);
}
});
stopFurtherButton.setText("Stop Further");
stopFurtherButton.setToolTipText("Stop when the current upload is finished");
stopFurtherButton.setEnabled(false);
stopFurtherButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
stopFurtherButtonActionPerformed(evt);
}
});
jLabel3.setText("Max. no. of simultaneous uploads:");
maxuploadspinner.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(2), Integer.valueOf(1), null, Integer.valueOf(1)));
maxuploadspinner.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
maxuploadspinnerStateChanged(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(maxuploadspinner, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
.addComponent(maxuploadspinner)
.addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(3, 3, 3))
);
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(moveToTopButton)
.addGap(18, 18, 18)
.addComponent(moveUpButton)
.addGap(18, 18, 18)
.addComponent(moveDownButton)
.addGap(18, 18, 18)
.addComponent(moveToBottomButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(startQueueButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(stopFurtherButton)))
.addContainerGap())
);
jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {moveDownButton, moveToBottomButton, moveToTopButton, moveUpButton});
jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {startQueueButton, stopFurtherButton});
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 325, Short.MAX_VALUE)
.addGap(0, 0, 0)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(moveToTopButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(moveUpButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(moveDownButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(moveToBottomButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(stopFurtherButton)
.addComponent(startQueueButton))
.addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
);
jPanel3Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {moveDownButton, moveToBottomButton, moveToTopButton, moveUpButton, startQueueButton, stopFurtherButton});
javax.swing.GroupLayout mainControlsPanelLayout = new javax.swing.GroupLayout(mainControlsPanel);
mainControlsPanel.setLayout(mainControlsPanelLayout);
mainControlsPanelLayout.setHorizontalGroup(
mainControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainControlsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(mainControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
mainControlsPanelLayout.setVerticalGroup(
mainControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainControlsPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(10, 10, 10))
);
neembuuUploaderTab.add(mainControlsPanel, java.awt.BorderLayout.CENTER);
lowerNotificationPanel.setPreferredSize(new java.awt.Dimension(754, 100));
lowerNotificationPanel.setRequestFocusEnabled(false);
notificationButton.setContentAreaFilled(false);
javax.swing.GroupLayout lowerNotificationPanelLayout = new javax.swing.GroupLayout(lowerNotificationPanel);
lowerNotificationPanel.setLayout(lowerNotificationPanelLayout);
lowerNotificationPanelLayout.setHorizontalGroup(
lowerNotificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 761, Short.MAX_VALUE)
.addGroup(lowerNotificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(lowerNotificationPanelLayout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(notificationButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 0, 0)))
);
lowerNotificationPanelLayout.setVerticalGroup(
lowerNotificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGroup(lowerNotificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(lowerNotificationPanelLayout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(notificationButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 0, 0)))
);
neembuuUploaderTab.add(lowerNotificationPanel, java.awt.BorderLayout.SOUTH);
tabbedPane.addTab("NeembuuUploader", neembuuUploaderTab);
uploadHistoryTab.setLayout(new java.awt.BorderLayout());
tabbedPane.addTab("Upload History", uploadHistoryTab);
accountsTab.setLayout(new java.awt.BorderLayout());
tabbedPane.addTab("Accounts", accountsTab);
settingsTab.setLayout(new java.awt.BorderLayout());
tabbedPane.addTab("Settings", settingsTab);
aboutTab.setLayout(new java.awt.BorderLayout());
tabbedPane.addTab("About", aboutTab);
javax.swing.GroupLayout jLayeredPane1Layout = new javax.swing.GroupLayout(jLayeredPane1);
jLayeredPane1.setLayout(jLayeredPane1Layout);
jLayeredPane1Layout.setHorizontalGroup(
jLayeredPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jLayeredPane1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(tabbedPane)
.addContainerGap())
.addGroup(jLayeredPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jLayeredPane1Layout.createSequentialGroup()
.addContainerGap(470, Short.MAX_VALUE)
.addComponent(sideOverlaidPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 308, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap()))
);
jLayeredPane1Layout.setVerticalGroup(
jLayeredPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jLayeredPane1Layout.createSequentialGroup()
.addGap(8, 8, 8)
.addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 641, Short.MAX_VALUE)
.addContainerGap())
.addGroup(jLayeredPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jLayeredPane1Layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(sideOverlaidPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(626, Short.MAX_VALUE)))
);
jLayeredPane1.setLayer(sideOverlaidPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);
jLayeredPane1.setLayer(tabbedPane, javax.swing.JLayeredPane.DEFAULT_LAYER);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(jLayeredPane1)
.addGap(0, 0, 0))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(jLayeredPane1)
.addGap(0, 0, 0))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private static final AtomicBoolean showedStartQueueMessage = new AtomicBoolean(false);
private void maxuploadspinnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_maxuploadspinnerStateChanged
//Event listener for state changed event for the spinner
//getValue() returns as object.. So must convert to string and then to int
int maxNoOfUploads = Integer.parseInt(maxuploadspinner.getValue() + "");
// set this bufferSize to queuemanager's variable
QueueManager.getInstance().setMaxNoOfUploads(maxNoOfUploads);
//Update the queuing sequence so that more uploads may be started.
QueueManager.getInstance().updateQueue();
}//GEN-LAST:event_maxuploadspinnerStateChanged
/**
* Depending on OS, the right click menu may be triggered for one of these 3
* methods. So better register event for all.
*
* @param evt
*/
private void neembuuUploaderTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_neembuuUploaderTableMouseClicked
openPopup(evt);
}//GEN-LAST:event_neembuuUploaderTableMouseClicked
private void neembuuUploaderTableMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_neembuuUploaderTableMousePressed
openPopup(evt);
}//GEN-LAST:event_neembuuUploaderTableMousePressed
private void neembuuUploaderTableMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_neembuuUploaderTableMouseReleased
openPopup(evt);
}//GEN-LAST:event_neembuuUploaderTableMouseReleased
/**
* The following methods set the icons for each state of mouse event of the
* 4 move row buttons and also call the appropriate functions when clicked
*
* @param evt
*/
private void moveToTopButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToTopButtonMouseEntered
moveToTopButton.setIcon(topmouseover);
}//GEN-LAST:event_moveToTopButtonMouseEntered
private void moveToTopButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToTopButtonMouseExited
moveToTopButton.setIcon(topnormal);
}//GEN-LAST:event_moveToTopButtonMouseExited
private void moveToBottomButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToBottomButtonMouseEntered
moveToBottomButton.setIcon(bottommouseover);
}//GEN-LAST:event_moveToBottomButtonMouseEntered
private void moveToBottomButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToBottomButtonMouseExited
moveToBottomButton.setIcon(bottomnormal);
}//GEN-LAST:event_moveToBottomButtonMouseExited
private void moveUpButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveUpButtonMouseEntered
moveUpButton.setIcon(upmouseover);
}//GEN-LAST:event_moveUpButtonMouseEntered
private void moveUpButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveUpButtonMouseExited
moveUpButton.setIcon(upnormal);
}//GEN-LAST:event_moveUpButtonMouseExited
private void moveDownButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveDownButtonMouseEntered
moveDownButton.setIcon(downmouseover);
}//GEN-LAST:event_moveDownButtonMouseEntered
private void moveDownButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveDownButtonMouseExited
moveDownButton.setIcon(downnormal);
}//GEN-LAST:event_moveDownButtonMouseExited
private void moveToTopButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToTopButtonMousePressed
moveToTopButton.setIcon(topmousepressed);
}//GEN-LAST:event_moveToTopButtonMousePressed
private void moveToTopButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToTopButtonMouseReleased
moveToTopButton.setIcon(topmouseover);
}//GEN-LAST:event_moveToTopButtonMouseReleased
private void moveToTopButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToTopButtonMouseClicked
QueueManager.getInstance().moveRowsTop();
}//GEN-LAST:event_moveToTopButtonMouseClicked
private void moveUpButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveUpButtonMousePressed
moveUpButton.setIcon(upmousepressed);
}//GEN-LAST:event_moveUpButtonMousePressed
private void moveUpButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveUpButtonMouseReleased
moveUpButton.setIcon(upmouseover);
}//GEN-LAST:event_moveUpButtonMouseReleased
private void moveDownButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveDownButtonMousePressed
moveDownButton.setIcon(downmousepressed);
}//GEN-LAST:event_moveDownButtonMousePressed
private void moveDownButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveDownButtonMouseReleased
moveDownButton.setIcon(downmouseover);
}//GEN-LAST:event_moveDownButtonMouseReleased
private void moveToBottomButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToBottomButtonMousePressed
moveToBottomButton.setIcon(bottommousepressed);
}//GEN-LAST:event_moveToBottomButtonMousePressed
private void moveToBottomButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToBottomButtonMouseReleased
moveToBottomButton.setIcon(bottommouseover);
}//GEN-LAST:event_moveToBottomButtonMouseReleased
private void moveUpButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveUpButtonMouseClicked
QueueManager.getInstance().moveRowsUp();
}//GEN-LAST:event_moveUpButtonMouseClicked
private void moveDownButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveDownButtonMouseClicked
QueueManager.getInstance().moveRowsDown();
}//GEN-LAST:event_moveDownButtonMouseClicked
private void moveToBottomButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_moveToBottomButtonMouseClicked
QueueManager.getInstance().moveRowsBottom();
}//GEN-LAST:event_moveToBottomButtonMouseClicked
private void startQueueButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startQueueButtonActionPerformed
//Start the queued items if any.. This will set the stopfurther to false and update the queuing there.
QueueManager.getInstance().setStopFurther(false);
//Toggle the enabled state of these two buttons
stopFurtherButton.setEnabled(true);
startQueueButton.setEnabled(false);
NULogger.getLogger().info("Start Queue Button clicked.");
}//GEN-LAST:event_startQueueButtonActionPerformed
private void stopFurtherButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stopFurtherButtonActionPerformed
//Do not upload the further items in queue..
//Stop with the current uploads.
//This will set the stopfurther to false and update the queuing there.
QueueManager.getInstance().setStopFurther(true);
//Toggle the enabled state of these two buttons
startQueueButton.setEnabled(true);
stopFurtherButton.setEnabled(false);
NULogger.getLogger().info("Stop Further Button clicked");
}//GEN-LAST:event_stopFurtherButtonActionPerformed
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
//If the user clicks the close button on NeembuuUploader, save the state before closing
saveStateOnClosing();
}//GEN-LAST:event_formWindowClosing
private void neembuuUploaderTableKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_neembuuUploaderTableKeyTyped
//If the delete key is pressed, then selected rows must be deleted.
//Must be delete key and minimum of one row must be selected.
if ((evt.getKeyChar() != KeyEvent.VK_DELETE) || (neembuuUploaderTable.getSelectedRowCount() < 0)) {
return;
}
NULogger.getLogger().info("Delete Key event on Main window");
//Must lock queue
QueueManager.getInstance().setQueueLock(true);
int selectedrow;
int[] selectedrows = neembuuUploaderTable.getSelectedRows();
//Remove from the end.. This is the correct way.
//If you remove from top, then index will change everytime and it'll be stupid to try to do that way.
for (int i = selectedrows.length - 1; i >= 0; i--) {
selectedrow = selectedrows[i];
//Remove only if the selected upload is in one of these states. For others, there is stop method.
if (UploadStatusUtils.isRowStatusOneOf(selectedrow, UploadStatus.QUEUED, UploadStatus.UPLOADFINISHED,
UploadStatus.UPLOADFAILED, UploadStatus.UPLOADSTOPPED)) {
NUTableModel.getInstance().removeUpload(selectedrow);
NULogger.getLogger().log(Level.INFO, "{0}: Removed row no. {1}", new Object[]{getClass().getName(), selectedrow});
}
}
//Unlock Queue back
QueueManager.getInstance().setQueueLock(false);
}//GEN-LAST:event_neembuuUploaderTableKeyTyped
private void formWindowIconified(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowIconified
if (!Application.get(Settings.class).minimizetotray() || !SystemTray.isSupported() || trayIcon == null || !isActive()) {
return;
}
NULogger.getLogger().info("Minimizing to Tray");
setVisible(false);
try {
SystemTray.getSystemTray().add(trayIcon);
} catch (AWTException ex) {
setVisible(true);
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
}//GEN-LAST:event_formWindowIconified
private void forumButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_forumButtonActionPerformed
try {
Desktop.getDesktop().browse(new URI("http://neembuu.com/uploader/forum/"));
} catch (Exception e) {
e.printStackTrace();
}
}//GEN-LAST:event_forumButtonActionPerformed
private void donateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_donateButtonActionPerformed
try {
Desktop.getDesktop().browse(new URI("http://neembuu.com/uploader/donate/"));
} catch (Exception e) {
e.printStackTrace();
}
}//GEN-LAST:event_donateButtonActionPerformed
private void fbbuttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fbbuttonActionPerformed
try {
Desktop.getDesktop().browse(new URI("https://facebook.com/NeembuuUploader"));
} catch (Exception e) {
e.printStackTrace();
}
}//GEN-LAST:event_fbbuttonActionPerformed
private void getLogButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_getLogButtonActionPerformed
Path nuLogPath = Paths.get(System.getProperty("user.home")+File.separatorChar+".neembuuuploader"+File.separatorChar+"nu.log");
try {
String contents = new String(Files.readAllBytes(nuLogPath), StandardCharsets.UTF_8);
StringSelection stringSelection = new StringSelection (contents);
Clipboard clpbrd = Toolkit.getDefaultToolkit ().getSystemClipboard ();
clpbrd.setContents (stringSelection, null);
} catch (IOException e) {
e.printStackTrace();
}
}//GEN-LAST:event_getLogButtonActionPerformed
private void selectFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectFolderButtonActionPerformed
//Open up the Open File dialog
//If the user clicks cancel or close, do not continue.
f.setMultiSelectionEnabled(false);
f.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
f.setAcceptAllFileFilterUsed(false);
if (f.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
return;
}
File folder = f.getSelectedFile();
//getSelectedFiles() returns as File array.
//We need ArrayList for efficiency. So convert array to ArrayList
this.files = new ArrayList<File>(FileUtils.listFiles(folder, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE));
//Same stuff as in FileDrop code in constructor
if (files.size() == 1) {
inputFileTextField.setText(files.get(0) + "");
} else {
inputFileTextField.setText(files.size() + " " + Translation.T().nfilesselected());
}
NULogger.getLogger().info("Files selected");
}//GEN-LAST:event_selectFolderButtonActionPerformed
private void selectHostsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectHostsButtonActionPerformed
//Display HostsPanel
NULogger.getLogger().info("Opening HostsPanel window");
NULogger.getLogger().info("Updating language");
HostsPanel.updateLanguage();
HostsPanel.getInstance().setVisible(true);
}//GEN-LAST:event_selectHostsButtonActionPerformed
private void addToQueueButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addToQueueButtonActionPerformed
// If no files are selected, do not continue. Show error msg.
if (files.isEmpty()) {
ThemeCheck.apply(null);
JOptionPane.showMessageDialog(this, Translation.T().pleaseSelectAnyFiles());
return;
}
//Declare an empty list for adding selected classes into it.
List<Class<? extends Uploader>> selectedUploaderClasses = new ArrayList<Class<? extends Uploader>>();
//Iterate throught the map. If a checkbox is selected, add it's associated class into the above list.
for (final Map.Entry<JCheckBox, SmallModuleEntry> entry : unsyncEntries_map()) {
if (entry.getKey().isSelected()) {
selectedUploaderClasses.add(uaepm.load(entry.getValue()).getUploader(pdl));
}
}
//If class list is empty, that is no checkbox selected, show error msg and go back.
if (selectedUploaderClasses.isEmpty()) {
ThemeCheck.apply(null);
JOptionPane.showMessageDialog(this, Translation.T().selectAtleastOneHost());
return;
}
//If everything is okay, then we must lock the queue to prevent removal(will cause conflict with indices) or starting next upload
//Lock Queue
QueueManager.getInstance().setQueueLock(true);
//Iterate through each file in selected files list
for (File file : files) {
//For each file, iterate through each class in selected host classes
for (Class<? extends Uploader> uploaderClass : selectedUploaderClasses) {
try {
//Get the constructor of that class which has one File parameter.. Infact there is only one constructor and that's that..
Constructor<? extends Uploader> uploaderConstructor = uploaderClass.getConstructor();
//Use the constructor to create a new instance by passing the file parameter.
//Pass that instance to tablemodel's addUpload method
Uploader uploader = uploaderConstructor.newInstance();
uploader.setFile(file);
nuTableModel.addUpload(uploader);
} catch (NoSuchMethodException ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
//We must always unlock queue if we had locked before so that the queuing sequence may start again.
//Unlock Queue
QueueManager.getInstance().setQueueLock(false);
//Set a friendly text for fun.. :)
inputFileTextField.setText(Translation.T().goAheadMakeMoreUploads());
//Clear the list of files // May change this in future..
files.clear();
NULogger.getLogger().info("Files added to queue");
if(!showedStartQueueMessage.compareAndSet(false, true))return;
String title = Translation.T().startQueueButton();
String message = Translation.T().startQueueButtonToolTip();
ThemeCheck.apply(null);
int x = JOptionPane.showConfirmDialog(mainComponent.getJFrame(), message, title, JOptionPane.YES_NO_OPTION);
if(x == JOptionPane.YES_OPTION){
startQueueButtonActionPerformed(evt);
}
}//GEN-LAST:event_addToQueueButtonActionPerformed
private void selectFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectFileButtonActionPerformed
f.setMultiSelectionEnabled(true);
f.setFileSelectionMode(JFileChooser.FILES_ONLY);
f.setAcceptAllFileFilterUsed(true);
//Open up the Open File dialog
//If the user clicks cancel or close, do not continue.
if (f.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
return;
}
//getSelectedFiles() returns as File array.
//We need ArrayList for efficiency. So convert array to ArrayList
this.files = new ArrayList<File>(Arrays.asList(f.getSelectedFiles()));
//Same stuff as in FileDrop code in constructor
if (files.size() == 1) {
inputFileTextField.setText(files.get(0) + "");
} else {
inputFileTextField.setText(files.size() + " " + Translation.T().nfilesselected());
}
NULogger.getLogger().info("Files selected");
}//GEN-LAST:event_selectFileButtonActionPerformed
private void inputFileTextFieldMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_inputFileTextFieldMouseClicked
//if the textfield is clicked, do the same operations as when the select button is clicked.
selectFileButtonActionPerformed(null);
}//GEN-LAST:event_inputFileTextFieldMouseClicked
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel aboutTab;
private javax.swing.JPanel accountsTab;
private javax.swing.JButton addToQueueButton;
private javax.swing.JButton donateButton;
private javax.swing.JButton fbbutton;
private javax.swing.JButton forumButton;
private javax.swing.JButton getLogButton;
private javax.swing.JTextField inputFileTextField;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLayeredPane jLayeredPane1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPanel lowerNotificationPanel;
private javax.swing.JPanel mainControlsPanel;
private javax.swing.JSpinner maxuploadspinner;
private javax.swing.JLabel moveDownButton;
private javax.swing.JLabel moveToBottomButton;
private javax.swing.JLabel moveToTopButton;
private javax.swing.JLabel moveUpButton;
private javax.swing.JPanel neembuuUploaderTab;
public javax.swing.JTable neembuuUploaderTable;
private javax.swing.JButton notificationButton;
private javax.swing.JButton selectFileButton;
private javax.swing.JButton selectFolderButton;
private javax.swing.JButton selectHostsButton;
private javax.swing.JLabel selectedHostsLabel;
private javax.swing.JPanel settingsTab;
private javax.swing.JPanel sideOverlaidPanel;
private javax.swing.JButton startQueueButton;
private javax.swing.JButton stopFurtherButton;
private javax.swing.JTabbedPane tabbedPane;
private javax.swing.JPanel uploadHistoryTab;
// End of variables declaration//GEN-END:variables
/**
* Opens up the Popup Menu
*
* @param evt
*/
private void openPopup(MouseEvent evt) {
//The above three mouse events call this method.
//So check which one will trigger Rightclick menu depending on os and use it.
if (evt.isPopupTrigger()) {
//Check if it is right click.
if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
NULogger.getLogger().info("RightClick event");
//if already 2 or more rows selected, leave it.
//EDIT: After some days I forgot what this code does,.. This is copied from a stackoverflow post actually..
//But it's an unchangeable code and will just work forever, so I'm not gonna mess with it.
if (neembuuUploaderTable.getSelectedRowCount() < 2) {
int r = neembuuUploaderTable.rowAtPoint(evt.getPoint());
if (r >= 0 && r < neembuuUploaderTable.getRowCount()) {
neembuuUploaderTable.setRowSelectionInterval(r, r);
} else {
neembuuUploaderTable.clearSelection();
}
int rowindex = neembuuUploaderTable.getSelectedRow();
if (rowindex < 0) {
return;
}
}
//Display the popup menu on the exact point of right click.
PopupBuilder.getInstance().show(evt.getComponent(), evt.getX(), evt.getY());
}
}
}
void checkBoxOperations() {
NULogger.getLogger().info("Mapping Checkboxes");
synchronized (map){
map.clear();
}
synchronized (allmap){
allmap.clear();
}
for(SmallModuleEntry sme : uaepm.getIndex().get(Uploader.class)){
synchronized (allmap){
allmap.put(new JCheckBox(sme.getName()), sme);
}
try {
if ( UploaderPlugin.locallyPresent(uaepm.getUpdateLocation(), sme)
== UploaderPlugin.LocallyPresent.PRESENT) {
UploaderPlugin up = uaepm.load(sme); // this sets activated = true
}
} catch (IOException ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
}
Iterator<JCheckBox> it = UnsyncCopy.unsyncCopyKeys(allmap).iterator();
final ActionListener all = new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
Thread t = new Thread("allmap_checkBoxAction from ActionListener"){
@Override public void run() {
allmap_checkBoxAction();
}
}; t.setDaemon(true); t.start();
}
};
while (it.hasNext()) {
it.next().addActionListener(all);
}
checkBoxOperation_ActivatePlugins(); int size;
synchronized (allmap){size = allmap.size();}
NULogger.getLogger().log(Level.INFO, "{0}: Number of supported sites: {1}", new Object[]{getClass().getName(), size});
}
private void allmap_checkBoxAction(){
for (final Map.Entry<JCheckBox, SmallModuleEntry> entry : UnsyncCopy.unsyncCopyEntries(allmap)) {
if (entry.getKey().isSelected()) {
// this makes classes :D Creation happens here.
// this can be slow, and classes are compiled to machine code
// in java vm
UploaderPlugin up = uaepm.load(entry.getValue());
if(up==null){
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
entry.getKey().setSelected(false);
}});// failed so ignore this
}else {
checkBoxOperation_ActivatePlugins();
Account a = AccountsManager.getAccount(up.getSme().getName());
if(a!=null)AccountsManager.loginAccount(a);
}
}else {
checkBoxOperation_DeActivatePlugin(entry.getValue());
}
}AccountsManager.getInstance().initAccounts(); // refresh account window
}
void checkBoxOperation_ActivatePlugins(){
//Arrange the checkboxes in alphabetical order
//HostsPanel.getInstance().arrangeCheckBoxes(map);
//Add action listeners common to all the checkboxes.
for(SmallModuleEntry sme : uaepm.getIndex().get(Uploader.class)){
if(sme.isActivated()){
synchronized (map){
map.put(new JCheckBox(sme.getName()), sme);
}
}
}
Iterator<JCheckBox> it = unsyncKey_map().iterator();
while (it.hasNext()) {
it.next().addActionListener(checkBoxActionListener);
}HostsPanel.getInstance().arrangeCheckBoxes(UnsyncCopy.unsyncMap(map));
// so that if this plugin requires account, the account settings show up
}
private static Set<JCheckBox> unsyncKey_map(){
return UnsyncCopy.unsyncCopyKeys(NeembuuUploader.getInstance().map);
}
void checkBoxOperation_DeActivatePlugin(SmallModuleEntry sme){
JCheckBox cb = findByName(UnsyncCopy.unsyncMap(map), sme.getName());
if(cb!=null){
synchronized (map){map.remove(cb);}
HostsPanel.getInstance().arrangeCheckBoxes(UnsyncCopy.unsyncMap(map)); // visually remove as well
}
uaepm.unloadAndDelete(sme);
checkBoxActionListener.actionPerformed(null);
}
static JCheckBox findByName(Map<JCheckBox,SmallModuleEntry> m,String name){
Iterator<JCheckBox> it = m.keySet().iterator();
while (it.hasNext()) {
JCheckBox cb = it.next(); if(cb==null || cb.getText()==null){
continue;
}
if(cb.getText().equalsIgnoreCase(name)){
return cb;
}
//.addActionListener(checkBoxActionListener);
}return null;
}
void checkBox_selectFromPreviousState(){
try {
List<String> lines =
Files.readAllLines(Application.getNeembuuHome()
.resolve("selectedhostslist"), Charset.forName("UTF-8"));
OUTER_LOOP:
for (String host : lines) {
INNER_LOOP:
for (Map.Entry<JCheckBox, SmallModuleEntry> entry : unsyncEntries_map()) {
JCheckBox jCheckBox = entry.getKey();
SmallModuleEntry smallModuleEntry = entry.getValue();
if(smallModuleEntry.getName().equalsIgnoreCase(host)){
jCheckBox.setSelected(true);
checkBoxActionListener.actionPerformed(null);
continue OUTER_LOOP;
}
}
}
} catch (IOException ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
}
Profile[]p = null;
void rusilaExampleForParalytic(){
// all profiles are saved in a folder called listOfProfiles
Rus r = Application.getRoot().r("listOfProfiles");
V[]profiles = Rusila.getArray(r);
p=new Profile[profiles.length];
for (int i = 0; i < p.length; i++) {
V v = profiles[i];
String[]list = v.s("").replaceAll("\r", "").split("\n");
p[i] = new Profile(list);
}
}
void saveAProfileToDisk()throws Exception{
Rus r = Application.getRoot().r("listOfProfiles");
if(p==null || p.length==0)return; // empty
for (int i = 0; i < p.length; i++) {
Profile profile = p[i];
String listOfHosts = "";
for (int j = 0; j < profile.getFileHosts().length; j++) {
listOfHosts+= ( j==0?"":"\n")+profile.getFileHosts()[j];
}
Rusila.set(r, ""+i, listOfHosts); // each profile is saved as a different file.
// in the folder <user.home>\.neembuuuploader\listofProfiles\
// with the name such as 0, 1, ,2 etc ...
// name of the file doesn't matter, it can be anything.
// if a profile has a name, the name can be used instead of these numbers
}
}
final class Profile {
private final String[]nameOfFileHosts;
public Profile(String[] nameOfFileHosts) {
this.nameOfFileHosts = nameOfFileHosts;
}
public String[] getNameOfFileHosts() {
return nameOfFileHosts;
}
/**
* Here u have access to all filehoss, along with their check boxes
* from list of all plugins
* Similarly u can get access to all ACTIVE plugins,
* @return
*/
public Entry<JCheckBox, SmallModuleEntry> []getFileHosts(){
// avoid race, do not directly use all_map
return getFileHosts_fromMap(getAllPluginsMap());
}
public Entry<JCheckBox, SmallModuleEntry> []getFileHosts_fromActive(){
return getFileHosts_fromMap(getActivatePluginsMap());
}
private Entry<JCheckBox, SmallModuleEntry> []getFileHosts_fromMap(Map<JCheckBox, SmallModuleEntry> pluginsMap){
List<Entry<JCheckBox, SmallModuleEntry>> fileHosts = new LinkedList<>();
OuterLoop:
for (String host : nameOfFileHosts) {
Iterator<Entry<JCheckBox,SmallModuleEntry>> it = pluginsMap.entrySet().iterator();
while (it.hasNext()) {
Entry<JCheckBox,SmallModuleEntry> e = it.next();
JCheckBox checkBox = e.getKey();
String text = checkBox.getText().replace("Checkbox", "").trim();
if(text.equalsIgnoreCase(host)){
fileHosts.add(e);
continue OuterLoop;
}
}
}
//allPluginsMap.
return fileHosts.toArray(new Entry[fileHosts.size()]);
}
}
public JTable getTable() {
return neembuuUploaderTable;
}
/**
* Save the state on exit (unless the user specified otherwise)
*/
private void saveStateOnClosing() {
//Do the operations if user settings are enabled..
Settings settings = Application.get(Settings.class);
if (settings.savecontrolstate()) {
settings.maxNoOfUploads(
QueueManager.getInstance().getMaxNoOfUploads());
NULogger.getLogger().log(Level.INFO, "{0}: Maxnoofuploads saved", getClass().getName());
}
saveListOfSelectedHosts();
saveQueuedFiles();
/////////////Save current path//////////////
if (settings.savecurrentpath()) {
settings.currentpath(f.getCurrentDirectory().getAbsolutePath());
NULogger.getLogger().log(Level.INFO, "{0}: currentpath saved: "+f.getCurrentDirectory(), getClass().getName());
}
//After all over finally exit.. :)
NULogger.getLogger().log(Level.INFO, "{0}: Exiting..", getClass().getName());
System.exit(0);
}
private void saveListOfSelectedHosts(){
final List<String> l = new LinkedList<String>();
for (Map.Entry<JCheckBox, SmallModuleEntry> entry : unsyncEntries_map()) {
JCheckBox jCheckBox = entry.getKey();
SmallModuleEntry smallModuleEntry = entry.getValue();
if(jCheckBox.isSelected()){
l.add(smallModuleEntry.getName());
}
}
try {
Files.write(Application.getNeembuuHome().resolve("selectedhostslist"), l, Charset.forName("UTF-8"),
StandardOpenOption.CREATE,StandardOpenOption.WRITE);
} catch (IOException ex) {
NULogger.getLogger().log(Level.SEVERE, null, ex);
}
}
private void saveQueuedFiles(){
////////////////////////Save queued files////////////////////////
if (Application.get(Settings.class).savequeuedlinks()) {
///IMPORTANT PART - Serialize upload list to disk
//We need only two parameters.. File and Class. So created a class called FileClassPair and made it serializable
//Now Declared an empty arraylist of FileClassPair
List<FilePluginnamePair> savelist = new ArrayList<FilePluginnamePair>();
//Iterate through each row in the queue
synchronized(NUTableModel.uploadList){
for (Uploader uploader : NUTableModel.uploadList) {
//Add only if the status is Queued
if (uploader.getStatus() == UploadStatus.QUEUED) {
savelist.add(new FilePluginnamePair(uploader.getFile(), uploader.getDisplayName()));
}
}
}
//Continue if the list is not empty.
if (!savelist.isEmpty()) {
try {
//Write object to that file and close the stream.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
Application.getNeembuuHome().resolve("nu.dat").toFile()));
oos.writeObject(savelist);
oos.close();
NULogger.getLogger().log(Level.INFO, "{0}: Queued List saved", getClass().getName());
} catch (IOException ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
System.err.println(ex);
}
}
}
}
/**
* Loads previously saved state (based on user preference).
*/
void loadSavedState() {
//Check user preference
Settings s = Application.get(Settings.class);
if (s.savecontrolstate()) {
//////////////////////////////Set Max no of uploads///////////////////////////////////////////////
NULogger.getLogger().log(Level.INFO, "{0}: Loading maxnoofuploads value..", getClass().getName());
maxuploadspinner.setValue(s.maxNoOfUploads());
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////save queued links//////////////////////////////////////////////////
if (s.savequeuedlinks()) {
///Important.. Deserialize listofuploads
NULogger.getLogger().log(Level.INFO, "{0}: Adding previously queued uploads", getClass().getName());
File savefile = Application.getNeembuuHome().resolve("nu.dat").toFile();
//If this file exists, continue. It may not exist if there was no queued upload on previous exit or if it is the first launch.
if (savefile.exists()) {
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(savefile));
//Get Map
List<FilePluginnamePair> savelist = (List<FilePluginnamePair>) ois.readObject();
//Add files if they exist to uploadlist
//already initcomponents executed. so no need to worry if uploadlist is created or not.
for (FilePluginnamePair pair : savelist) {
//The user may have deleted some files. So we must check whether each file exists before adding.
if (pair.getFile().exists()) {
SmallModuleEntry sme = uaepm.getIndex().get(Uploader.class,pair.getHostPluginName());
Constructor<? extends Uploader> uploaderConstructor = uaepm.load(sme).getUploader(pdl).getConstructor();
Uploader uploader = uploaderConstructor.newInstance();
uploader.setFile(pair.getFile());
nuTableModel.addUpload(uploader);
}
}
//Delete the file after closing all streams
ois.close();
savefile.delete();
} catch (Exception ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
System.err.println(ex);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////Save current path//////////////////////////////////////////////////
if (s.savecurrentpath()) {
f.setCurrentDirectory(new File(s.currentpath()));
NULogger.getLogger().log(Level.INFO, "{0}: Loading currentpath value: "+f.getCurrentDirectory(), getClass().getName() );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////Using Proxy//////////////////////////////////////////////////
if (s.usingProxy()) {
try {
String proxyAddress = s.proxyAddress();
String proxyPort = s.proxyPort();
ProxyChecker proxyChecker = new ProxyChecker(proxyAddress, proxyPort);
if(proxyChecker.control()){
NULogger.getLogger().log(Level.INFO, "Proxy is ok!");
}
else{
NULogger.getLogger().log(Level.INFO, "Proxy isn't ok!");
}
}
catch (NUProxyException ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
ex.printError();
} catch (Exception ex) {
Logger.getLogger(NeembuuUploader.class.getName()).log(Level.SEVERE, null, ex);
}
}
NULogger.getLogger().log(Level.INFO, "Route is: {0}", NUHttpClient.getHttpClient().getParams().getParameter(ConnRoutePNames.DEFAULT_PROXY));
////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////Buffer Size//////////////////////////////////////////////////
String bufferSizeString = s.bufferSize();
if (bufferSizeString!=null && bufferSizeString.length() > 0) {
int bufferSize = (int) StringUtils.getSizeFromString(s.bufferSize());
MonitoredFileBody.setBufferSize(bufferSize);
MonitoredFileEntity.setBufferSize(bufferSize);
NULogger.getLogger().log(Level.INFO, "Buffer size is: {0}", bufferSize);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
}
/**
* Update the hosts label to show the list of checkboxes selected
*/
public void updateSelectedHostsLabel() {
StringBuilder sb = new StringBuilder();
List<UploaderPlugin> uploaderPluginList = new ArrayList<UploaderPlugin>();
for (final Map.Entry<JCheckBox, SmallModuleEntry> entry : unsyncEntries_map() ) {
if (entry.getKey().isSelected()) {
UploaderPlugin up = uaepm.load(entry.getValue());
uploaderPluginList.add(up);
}
}
//If no checkboxes selected, show None and a sad smiley
if (uploaderPluginList.isEmpty()) {
selectedHostsLabel.setText(Translation.T().selectedHostsLabel());
return;
}
//If the hosts are upto 3, display their names separated by comma
//If more than 3, display the first three and "and n more"
//Why 3? There's more space.. For some language, the label to the left can become long. So 3 is safe..
if (uploaderPluginList.size() <= 3) {
for (UploaderPlugin cl : uploaderPluginList) {
/*System.out.println("cl="+cl);
System.out.println("sme="+cl.getSme());
System.out.println("sme="+cl.getSme().getName());*/
sb.append(cl.getSme().getName() ).append(", ");
}
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
} else {
sb.append(uploaderPluginList.get(0).getSme().getName()).append(", ").append(uploaderPluginList.get(1).getSme().getName()).append(", ").append(uploaderPluginList.get(2).getSme().getName()).append(" and ");
sb.append((uploaderPluginList.size() - 3)).append(" more..");
}
selectedHostsLabel.setText(sb.toString());
NULogger.getLogger().fine(sb.toString());
}
/**
* Update the language at runtime Also updates the column of tablemodel and
* repaints the table.
*/
final void languageChanged_UpdateGUI() { /*
* package private
*/
NULogger.getLogger().log(Level.INFO, "{0} Calling languageChanged_UpdateGUI", getClass().getName());
setTitle(Translation.T().neembuuuploader());
jLabel2.setText(Translation.T().jLabel2());
selectHostsButton.setText(Translation.T().selectHostsButton());
//selectFileButton.setText(Translation.T().selectFileButton());
// Paralytic ----- 12/07/2015
// Since the select file(s) button has now been replaced with an image, there is no need
// for a translation string to be displayed on the button itself.
// Moving this translation string to be instead displayed as the tooltiptext.
addToQueueButton.setText(Translation.T().addToQueueButton());
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(Translation.T().jPanel2_setBorder()));
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(Translation.T().setBorder()));
startQueueButton.setText(Translation.T().startQueueButton());
stopFurtherButton.setText(Translation.T().stopFurtherButton());
jLabel3.setText(Translation.T().jLabel3());
/*recentButton.setText(Translation.T().recentButton());
accountsButton.setText(Translation.T().accountsButton());
settingsButton.setText(Translation.T().settings());
aboutButton.setText(Translation.T().aboutButton());
exitButton.setText(Translation.T().exitButton());*/
moveToTopButton.setToolTipText(Translation.T().moveToTopToolTip());
moveUpButton.setToolTipText(Translation.T().moveUpButtonToolTip());
moveDownButton.setToolTipText(Translation.T().moveDownButtonToolTip());
moveToBottomButton.setToolTipText(Translation.T().moveToBottomButtonToolTip());
startQueueButton.setToolTipText(Translation.T().startQueueButtonToolTip());
stopFurtherButton.setToolTipText(Translation.T().stopFurtherButtonToolTip());
//Set selected hosts label
updateSelectedHostsLabel();
//Update table columns
nuTableModel.languageChanged_UpdateColumnNames();
neembuuUploaderTable.repaint();
UpdateProgressImpl.INSTANCE.updateTranslation();
}
/**
* This displays a small dialog for user to choose the language from a set
* of available options
*/
static void displayLanguageOptionDialog() {
NeembuuUploaderLanguages.refresh();
//This code returns the selected language if and only if the user selects the Ok button
ThemeCheck.apply(null);
String selectedlanguage = (String) JOptionPane.showInputDialog(NeembuuUploader.getInstance(),
"Choose your language: ",
"Language",
JOptionPane.PLAIN_MESSAGE, null,
NeembuuUploaderLanguages.getLanguageNames(),
NeembuuUploaderLanguages.getUserLanguageName());
//selectedlanguage will be null if the user clicks the cancel or close button
//so check for that.
if (selectedlanguage != null) {
//Set the language to settings file
NeembuuUploaderLanguages.setUserLanguageByName(selectedlanguage);
//Change the GUI to new language.
Translation.changeLanguage(NeembuuUploaderLanguages.getUserLanguageCode());
}
}
/*
* package/*
* package
*/ Map<JCheckBox, SmallModuleEntry> getActivatePluginsMap() {
return UnsyncCopy.unsyncMap(map);
}
Map<JCheckBox, SmallModuleEntry> getAllPluginsMap() {
return UnsyncCopy.unsyncMap(allmap);
}
/**
* For peace of mind, the version number used for properties file,
* version.xml and other stuf is Float.toString(version).
* For display in user interface
* @see #getVersionNumberForUI()
* @return version number for usage for non-ui part
*/
public static String getVersionForProgam(){
return Float.toString(version);
}
/**
* This should be used only for user interface.
* It converts float into a stylised version
* Like if version = 2.912213 this return 2.9.12213
* @return version number for user interface
*/
public static String getVersionNumberForUI(){
return getVersionNumber(version);
}
static String getVersionNumber(float ver){
String v = "";
int major = (int)ver;
int minor = (int)((ver*10)-major*10);
String sub_minor = "";
v = major+"."+minor;
if(ver> major+minor*0.1f){
sub_minor = Float.toString(ver);
sub_minor = sub_minor.substring(sub_minor.indexOf(".")+2);
v = v + "." + sub_minor;
}
return v;
}
/**
* Reset the title of the frame.
*/
public void resetTitle(){
setTitle(Translation.T().neembuuuploader());
}
private List<String> deactivatedPluginNames(){
List<String> deactivatedPluginNames = new LinkedList<String>();
for(Entry<JCheckBox,SmallModuleEntry> e : UnsyncCopy.unsyncCopyEntries(allmap) ){
if(!e.getValue().isActivated()){
deactivatedPluginNames.add(e.getValue().getName());
}
}
return deactivatedPluginNames;
}
private final PluginDestructionListener pdl = new PluginDestructionListener() {
@Override public void destroyed() throws Exception{
List<String> deactivatedPluginNames = deactivatedPluginNames();
List<Uploader> uls_toRemove = new LinkedList<>();
synchronized(NUTableModel.uploadList){
outer_loop:
for (Uploader uploader : NUTableModel.uploadList) {
String nm = uploader.getDisplayName();
inner_loop:
for(String p : deactivatedPluginNames){
if(p.equalsIgnoreCase(nm)){
uls_toRemove.add(uploader);
continue outer_loop;
}
}
}
NUTableModel.uploadList.removeAll(uls_toRemove);
}
NUTableModel.getInstance().fireTableStructureChanged();
Exception total = new Exception();
for (Uploader uploader : uls_toRemove) {
try{ uploader.stopUpload(); }catch(Exception a){ total.addSuppressed(a);}
}
if(total.getSuppressed().length > 0){ throw total; }
}
};
static final float version(){return version;}//package-private
public static float initVersion(){
float version_tmp = FindVersion.version();
if(version_tmp<0){
ThemeCheck.apply(null);
JOptionPane.showMessageDialog(null, "Severe error",
"Could not find version of NeembuuUploader",JOptionPane.ERROR_MESSAGE);
throw new IllegalStateException("Could not find version");
}System.out.println("Version = "+version_tmp);
return version_tmp;
}
private static int neembuuuploadertab,uploadhistorytab,accountstab,settingstab,abouttab;
private void setupTabs(){
forumButton.setText(Translation.T().forumButton());
neembuuuploadertab=it(neembuuUploaderTab);
uploadhistorytab=it(uploadHistoryTab);
accountstab=it(accountsTab);
settingstab=it(settingsTab);
abouttab=it(aboutTab);
tabbedPane.setTitleAt(neembuuuploadertab, Translation.T().neembuuuploader());
tabbedPane.setTitleAt(uploadhistorytab, Translation.T().recentButton());
tabbedPane.setTitleAt(accountstab, Translation.T().accountsButton());
tabbedPane.setTitleAt(settingstab, Translation.T().settings());
tabbedPane.setTitleAt(abouttab, Translation.T().aboutButton());
tabbedPane.addChangeListener(new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
int ti = tabbedPane.getSelectedIndex();
System.out.println("Tab: " + ti);
if(ti==neembuuuploadertab){
// do nothing
}else if(ti==uploadhistorytab){
uploadHistoryTab.removeAll();
UploadHistory foo = UploadHistory.getInstance();
uploadHistoryTab.add(foo.uploadHistoryPanel);
NULogger.getLogger().info("Upload history tab opened");
}else if(ti==accountstab){
if(accountsTab.getComponentCount()<=0){
accountsTab.add(AccountsManager.getInstance().getAccountsManagerPanel());
}NULogger.getLogger().info("Accounts Manager tab opened");
}else if(ti==settingstab){
if(settingsTab.getComponentCount()<=0){
settingsTab.add(SettingsManager.getInstance().getSettingsTabbedPanel());
}NULogger.getLogger().info("Settings tab opened");
}else if(ti==abouttab){
if(aboutTab.getComponentCount()<=0){
aboutTab.add(AboutNeembuuUploader.getInstance().aboutPanel);
}NULogger.getLogger().info("About tab opened");
}else {
throw new AssertionError("Unknown tab");
}
ThemeCheck.apply(NeembuuUploader.this);
}
});
}
private int it(Component c){
return tabbedPane.indexOfComponent(c);
}
}