package org.arong.egdownloader.ui.window;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.Window;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JWindow;
import javax.swing.border.TitledBorder;
import org.arong.egdownloader.db.DbTemplate;
import org.arong.egdownloader.model.Picture;
import org.arong.egdownloader.model.ScriptParser;
import org.arong.egdownloader.model.Setting;
import org.arong.egdownloader.model.Task;
import org.arong.egdownloader.model.TaskList;
import org.arong.egdownloader.model.TaskStatus;
import org.arong.egdownloader.spider.Proxy;
import org.arong.egdownloader.ui.ComponentConst;
import org.arong.egdownloader.ui.ComponentUtil;
import org.arong.egdownloader.ui.IconManager;
import org.arong.egdownloader.ui.SwingPrintStream;
import org.arong.egdownloader.ui.listener.MenuItemActonListener;
import org.arong.egdownloader.ui.listener.MenuMouseListener;
import org.arong.egdownloader.ui.listener.MouseAction;
import org.arong.egdownloader.ui.listener.OperaBtnMouseListener;
import org.arong.egdownloader.ui.menuitem.AddTaskGroupMenuItem;
import org.arong.egdownloader.ui.menuitem.ClearConsoleMenuItem;
import org.arong.egdownloader.ui.menuitem.OpenRootMenuItem;
import org.arong.egdownloader.ui.menuitem.ReBuildAllTaskMenuItem;
import org.arong.egdownloader.ui.menuitem.ResetMenuItem;
import org.arong.egdownloader.ui.menuitem.SimpleSearchMenuItem;
import org.arong.egdownloader.ui.menuitem.StartAllTaskMenuItem;
import org.arong.egdownloader.ui.menuitem.StopAllTaskMenuItem;
import org.arong.egdownloader.ui.swing.AJButton;
import org.arong.egdownloader.ui.swing.AJLabel;
import org.arong.egdownloader.ui.swing.AJMenu;
import org.arong.egdownloader.ui.swing.AJMenuBar;
import org.arong.egdownloader.ui.swing.AJMenuItem;
import org.arong.egdownloader.ui.swing.AJPanel;
import org.arong.egdownloader.ui.swing.AJPopupMenu;
import org.arong.egdownloader.ui.table.TaskingTable;
import org.arong.egdownloader.ui.window.form.AddFormDialog;
import org.arong.egdownloader.ui.work.ZIPWorker;
import org.arong.egdownloader.ui.work.interfaces.IListenerTask;
import org.arong.egdownloader.ui.work.interfaces.IMenuListenerTask;
import org.arong.egdownloader.ui.work.listenerWork.ChangeReadedWork;
import org.arong.egdownloader.ui.work.listenerWork.CheckResetWork;
import org.arong.egdownloader.ui.work.listenerWork.DeleteTaskWork;
import org.arong.egdownloader.ui.work.listenerWork.DownloadCoverWork;
import org.arong.egdownloader.ui.work.listenerWork.OpenFolderTaskWork;
import org.arong.egdownloader.ui.work.listenerWork.OpenWebPageWork;
import org.arong.egdownloader.ui.work.listenerWork.ResetTaskWork;
import org.arong.egdownloader.ui.work.listenerWork.ShowDetailWork;
import org.arong.egdownloader.ui.work.listenerWork.ShowEditWork;
import org.arong.egdownloader.ui.work.listenerWork.StartTaskWork;
import org.arong.egdownloader.ui.work.listenerWork.StopTaskWork;
import org.arong.egdownloader.version.Version;
import org.arong.util.FileUtil;
import org.arong.util.Tracker;
/**
* 主线程类
*
* @author 阿荣
* @since 2014-05-21
*/
public class EgDownloaderWindow extends JFrame {
private static final long serialVersionUID = 8904976570969033245L;
TrayIcon tray;//系统托盘
JPopupMenu trayMenu;
JWindow minTips;
JMenuBar jMenuBar;// 菜单栏
public JFrame settingWindow;
public JDialog aboutWindow;
public JDialog addFormWindow;
public JDialog creatingWindow;
public JDialog detailWindow;
public JDialog checkingWindow;
public JDialog coverWindow2;//漫画封面,鼠标点击弹出
public SearchCoverWindow coverWindow;//漫画封面,鼠标移动出现
public JDialog editWindow;
public JDialog deletingWindow;
public JDialog zipWindow;
public JDialog resetAllTaskWindow;
public JDialog simpleSearchWindow;
public JDialog countWindow;
public SearchComicWindow searchComicWindow;
public JPopupMenu tablePopupMenu;
public TaskingTable runningTable;
public JScrollPane tablePane;
public JScrollPane consolePane;
public JTextArea consoleArea;
public JPopupMenu consolePopupMenu;
public JPanel emptyPanel;
public Setting setting;
public TaskList<Task> tasks;
public DbTemplate<Task> taskDbTemplate;
public DbTemplate<Picture> pictureDbTemplate;
public DbTemplate<Setting> settingDbTemplate;
public EgDownloaderWindow(Setting setting, TaskList<Task> tasks, DbTemplate<Task> taskDbTemplate, DbTemplate<Picture> pictureDbTemplate, DbTemplate<Setting> settingDbTemplate) {
final EgDownloaderWindow mainWindow = this;
this.taskDbTemplate = taskDbTemplate;
this.pictureDbTemplate = pictureDbTemplate;
this.settingDbTemplate = settingDbTemplate;
//加载配置数据
this.setting = setting;
//设置代理
Proxy.init(setting.isUseProxy(), setting.getProxyType(), setting.getProxyIp(), setting.getProxyPort(), setting.getProxyUsername(), setting.getProxyPwd());
//加载任务列表
this.tasks = tasks == null ? new TaskList<Task>() : tasks;
// 设置主窗口
//this.setExtendedState(JFrame.MAXIMIZED_BOTH);//全屏
final String title = Version.NAME + "v" + Version.VERSION + " / " + ("".equals(ComponentConst.groupName) ? "默认空间" : ComponentConst.groupName);
this.setTitle(title);
//设置下载速度检测定时器
TimerTask timerTask = new TimerTask() {
public void run() {
//当前一秒内的流量
Long length = FileUtil.byteLength - FileUtil.oldByteLength;
//显示到标题栏
mainWindow.setTitle(title + " (" + FileUtil.showSizeStr(length) + "/S)");
if(FileUtil.byteLength > 999900000){
FileUtil.byteLength = 0L;
FileUtil.oldByteLength = 0L;
}else{
FileUtil.oldByteLength = FileUtil.byteLength;
}
}
};
Timer timer = new Timer(true);
//1秒执行一次
timer.schedule(timerTask, 1000, 1000);
this.setIconImage(IconManager.getIcon("download").getImage());
this.getContentPane().setLayout(null);
this.setSize(ComponentConst.CLIENT_WIDTH, ComponentConst.CLIENT_HEIGHT);
this.setMaximumSize(new Dimension(ComponentConst.CLIENT_WIDTH, ComponentConst.CLIENT_HEIGHT));
//this.setResizable(false);
this.setBackground(Color.WHITE);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Color menuItemColor = new Color(0,0,85);
Component newTaskMenu = null;// 菜单:新建
Component startTasksMenu = null;// 菜单:开始
Component stopTasksMenu = null;// 菜单:暂停
Component deleteTasksMenu = null;// 菜单:删除
Component searchComicMenu = null;//菜单:搜索
Component settingMenu = null;// 菜单:设置
Component countMenu = null;// 菜单:统计
Component aboutMenu = null;// 菜单:关于
OperaBtnMouseListener newTaskBtnListener = new OperaBtnMouseListener(this, MouseAction.CLICK,
new IListenerTask() {
public void doWork(Window mainWindow, MouseEvent e) {
EgDownloaderWindow this_ = (EgDownloaderWindow) mainWindow;
this_.setEnabled(false);
if(this_.creatingWindow != null && this_.creatingWindow.isVisible()){
this_.creatingWindow.setVisible(true);
this_.creatingWindow.toFront();
}else{
if (this_.addFormWindow == null) {
this_.addFormWindow = new AddFormDialog(this_);
}
this_.addFormWindow.setVisible(true);
this_.addFormWindow.toFront();
}
}
});
OperaBtnMouseListener countBtnListener = new OperaBtnMouseListener(this, MouseAction.CLICK,new IListenerTask() {
public void doWork(Window window, MouseEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
if (mainWindow.countWindow == null) {
JDialog countWindow = new CountWindow(mainWindow);
mainWindow.countWindow = countWindow;
}
mainWindow.countWindow.setLocationRelativeTo(mainWindow);
// 设置关于窗口置于最顶层
mainWindow.countWindow.toFront();
((CountWindow)mainWindow.countWindow).showCountPanel();
}
});
if(ComponentConst.osname.toLowerCase().contains("linux")){
newTaskMenu = new AJButton(ComponentConst.ADD_MENU_TEXT, IconManager.getIcon("add"), newTaskBtnListener, false);
startTasksMenu = new AJButton(ComponentConst.START_MENU_TEXT,
IconManager.getIcon("start"), new OperaBtnMouseListener(this, MouseAction.CLICK,new StartTaskWork()), false);
stopTasksMenu = new AJButton(ComponentConst.STOP_MENU_TEXT,
IconManager.getIcon("stop"), new OperaBtnMouseListener(this, MouseAction.CLICK,new StopTaskWork()), false);
deleteTasksMenu = new AJButton(ComponentConst.DELETE_MENU_TEXT,
IconManager.getIcon("delete"), new OperaBtnMouseListener(this, MouseAction.CLICK,new DeleteTaskWork()), false);
searchComicMenu = new AJButton(ComponentConst.SEARCH_MENU_TEXT, null
, new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(searchComicWindow == null){
searchComicWindow = new SearchComicWindow(mainWindow);
}
SearchComicWindow scw = mainWindow.searchComicWindow;
scw.toFront();
scw.setVisible(true);
scw.searchBtn.doClick();
}
}, false);
settingMenu = new AJButton(ComponentConst.SETTING_MENU_TEXT, IconManager.getIcon("setting"),
new MenuMouseListener(this), false);
settingMenu.setName(ComponentConst.SETTING_MENU_NAME);
countMenu = new AJButton(ComponentConst.COUNT_MENU_TEXT, IconManager.getIcon("count"), countBtnListener, false);
aboutMenu = new AJButton(ComponentConst.ABOUT_MENU_TEXT, IconManager.getIcon("user"),
new MenuMouseListener(this), false);
aboutMenu.setName(ComponentConst.ABOUT_MENU_NAME);
}else{
newTaskMenu = new AJMenu(ComponentConst.ADD_MENU_TEXT,
"", IconManager.getIcon("add"), newTaskBtnListener);
startTasksMenu = new AJMenu(ComponentConst.START_MENU_TEXT,
"", IconManager.getIcon("start"), new OperaBtnMouseListener(this, MouseAction.CLICK,new StartTaskWork()));
stopTasksMenu = new AJMenu(ComponentConst.STOP_MENU_TEXT,
"", IconManager.getIcon("stop"), new OperaBtnMouseListener(this, MouseAction.CLICK,new StopTaskWork()));
deleteTasksMenu = new AJMenu(ComponentConst.DELETE_MENU_TEXT,
"", IconManager.getIcon("delete"), new OperaBtnMouseListener(this, MouseAction.CLICK,new DeleteTaskWork()));
searchComicMenu = new AJMenu(ComponentConst.SEARCH_MENU_TEXT,
"", new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(searchComicWindow == null){
searchComicWindow = new SearchComicWindow(mainWindow);
}
SearchComicWindow scw = mainWindow.searchComicWindow;
scw.toFront();
scw.setVisible(true);
scw.searchBtn.doClick();
}
});
settingMenu = new AJMenu(ComponentConst.SETTING_MENU_TEXT,
ComponentConst.SETTING_MENU_NAME, IconManager.getIcon("setting"),
new MenuMouseListener(this));
countMenu = new AJMenu(ComponentConst.COUNT_MENU_TEXT,
"", IconManager.getIcon("count"),countBtnListener);
aboutMenu = new AJMenu(ComponentConst.ABOUT_MENU_TEXT,
ComponentConst.ABOUT_MENU_NAME, IconManager.getIcon("user"),
new MenuMouseListener(this));
}
//EHicon
ImageIcon ehIcon = IconManager.getIcon("eh");
ehIcon.setImage(ehIcon.getImage().getScaledInstance(16, 16, Image.SCALE_DEFAULT));
((AbstractButton) searchComicMenu).setIcon(ehIcon);
// 菜单:任务组
JMenu taskGroupMenu = new AJMenu(ComponentConst.TASKGROUP_MENU_TEXT,
ComponentConst.SETTING_MENU_NAME, IconManager.getIcon("group"));
taskGroupMenu.add(new AddTaskGroupMenuItem("新建任务组", this, AddTaskGroupMenuItem.ADDACTION));
taskGroupMenu.add(new AddTaskGroupMenuItem("切换任务组", this, AddTaskGroupMenuItem.CHANGEACTION));
// 菜单:操作
JMenu operaMenu = new AJMenu(ComponentConst.OPERA_MENU_TEXT,
"", IconManager.getIcon("opera"));
JMenu taskMenu = new AJMenu("所有任务",
"", IconManager.getIcon("task"));
taskMenu.setForeground(new Color(0,0,85));
taskMenu.add(new StartAllTaskMenuItem("开始所有任务", this));
taskMenu.add(new StopAllTaskMenuItem("暂停所有任务", this));
taskMenu.add(new ResetMenuItem("重置所有任务", this));
taskMenu.add(new ReBuildAllTaskMenuItem("重建所有任务", this));
operaMenu.add(taskMenu);
operaMenu.add(new SimpleSearchMenuItem(" 本地搜索", this));
operaMenu.add(new OpenRootMenuItem(" 打开根目录", this));
// 菜单:控制台
JMenu consoleMenu = new AJMenu(ComponentConst.CONSOLE_MENU_TEXT,
"", IconManager.getIcon("select"));
JMenuItem clearItem = new ClearConsoleMenuItem("清空控制台", this);
consoleMenu.add(clearItem);
Component[] menus = new Component[]{
newTaskMenu, startTasksMenu, stopTasksMenu, deleteTasksMenu, searchComicMenu, taskGroupMenu, settingMenu, operaMenu, consoleMenu, countMenu, aboutMenu
};
// 构造菜单栏并添加菜单
jMenuBar = new AJMenuBar(0, 0, ComponentConst.CLIENT_WIDTH, 30, menus);
// 正在下载table
runningTable = new TaskingTable(5, 40, ComponentConst.CLIENT_WIDTH - 20,
(tasks == null ? 0 :tasks.size()) * 28, this.tasks, this);
tablePane = new JScrollPane(runningTable);
tablePane.setBounds(new Rectangle(5, 40, ComponentConst.CLIENT_WIDTH - 20, 400));
tablePane.getViewport().setBackground(new Color(254,254,254));
//右键菜单:开始
AJMenuItem startPopupMenuItem = new AJMenuItem(ComponentConst.POPUP_START_MENU_TEXT, menuItemColor,
IconManager.getIcon("start"),
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
//如果正在重建,则不下载
if(table.isRebuild()){
Tracker.println(StartAllTaskMenuItem.class, "正在重建任务");
return;
}
int index = table.getSelectedRow();
table.startTask(table.getTasks().get(index));
}
}));
//右键菜单:暂停
AJMenuItem stopPopupMenuItem = new AJMenuItem(ComponentConst.POPUP_STOP_MENU_TEXT, menuItemColor,
IconManager.getIcon("stop"),
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
//如果正在重建,则不执行
if(table.isRebuild()){
Tracker.println(StartAllTaskMenuItem.class, "正在重建任务");
return;
}
int index = table.getSelectedRow();
table.stopTask(table.getTasks().get(index));
}
}));
//右键菜单:查看详细
AJMenuItem detailPopupMenuItem = new AJMenuItem(ComponentConst.POPUP_DETAIL_MENU_TEXT, menuItemColor,
IconManager.getIcon("detail"),
new MenuItemActonListener(this, new ShowDetailWork()));
//右键菜单:复制网址
AJMenuItem copyUrlPopupMenuItem = new AJMenuItem(ComponentConst.POPUP_COPYURL_MENU_TEXT, menuItemColor,
IconManager.getIcon("copy"),
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
int index = table.getSelectedRow();
Task task = table.getTasks().get(index);
StringSelection ss = new StringSelection(task.getUrl());
table.getToolkit().getSystemClipboard().setContents(ss, ss);
mainWindow.tablePopupMenu.setVisible(false);
}
}));
//右键菜单:打开文件夹
AJMenuItem openFolderPopupMenuItem = new AJMenuItem(ComponentConst.POPUP_OPENFOLDER_MENU_TEXT, menuItemColor,
IconManager.getIcon("folder"),
new MenuItemActonListener(this, new OpenFolderTaskWork()));
//右键菜单:打开网页
AJMenuItem openWebPageMenuItem = new AJMenuItem(ComponentConst.POPUP_OPENWEBPAGE_MENU_TEXT, menuItemColor,
IconManager.getIcon("browse"),
new MenuItemActonListener(this, new OpenWebPageWork()));
//右键菜单:下载封面
AJMenuItem downloadCoverMenuItem = new AJMenuItem(ComponentConst.POPUP_DOWNLOADCOVER_MENU_TEXT, menuItemColor,
IconManager.getIcon("download"),
new MenuItemActonListener(this, new DownloadCoverWork()));
//右键菜单:查漏补缺
AJMenuItem checkResetMenuItem = new AJMenuItem(ComponentConst.POPUP_CHECKRESET_MENU_TEXT, menuItemColor,
IconManager.getIcon("check"),
new MenuItemActonListener(this, new CheckResetWork()));
//右键菜单:更改阅读状态
AJMenuItem changeReadedMenuItem = new AJMenuItem(ComponentConst.POPUP_CHANGEREADED_MENU_TEXT, menuItemColor,
IconManager.getIcon("change"),
new MenuItemActonListener(this, new ChangeReadedWork()));
//右键菜单:打包ZIP
AJMenuItem zipMenuItem = new AJMenuItem(ComponentConst.POPUP_ZIP_MENU_TEXT, menuItemColor,
IconManager.getIcon("zip"),
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
if(zipWindow == null){
zipWindow = new ZiptingWindow(mainWindow);
}
mainWindow.tablePopupMenu.setVisible(false);
ZIPWorker zipWordker = new ZIPWorker(mainWindow, table, (ZiptingWindow)zipWindow);
zipWordker.execute();
}
}));
//右键菜单:搜索作者
AJMenuItem searchAuthorMenuItem = new AJMenuItem(ComponentConst.POPUP_SEARCHAUTHOR_MENU_TEXT, menuItemColor,
"",
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
int index = table.getSelectedRow();
Task task = table.getTasks().get(index);
if(searchComicWindow == null){
searchComicWindow = new SearchComicWindow(mainWindow);
}
SearchComicWindow scw = mainWindow.searchComicWindow;
if(task.getAuthor() != null){
scw.doSearch(task.getAuthor());
scw.setVisible(true);
}
}
}));
//右键菜单:编辑任务信息
AJMenuItem editMenuItem = new AJMenuItem(ComponentConst.POPUP_EDIT_MENU_TEXT, menuItemColor,
IconManager.getIcon("save"),
new MenuItemActonListener(this, new ShowEditWork()));
//右键菜单:重置任务
AJMenuItem resetMenuItem = new AJMenuItem(ComponentConst.POPUP_RESET_MENU_TEXT, menuItemColor,
IconManager.getIcon("reset"),
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
int index = table.getSelectedRow();
Task task = table.getTasks().get(index);
if(task.getStatus() == TaskStatus.STARTED){
JOptionPane.showMessageDialog(mainWindow, "正在下载中的任务不能重置!");
return;
}
List<Task> tasks = new ArrayList<Task>();
tasks.add(task);
new ResetTaskWork(mainWindow, tasks, "重置后将无法还原,确定要重置【"
+ ("".equals(task.getSubname()) ? task.getName() : task.getSubname()) +
"】任务到初始状态吗?");
}
}));
//右键菜单:完成任务
AJMenuItem completedMenuItem = new AJMenuItem(ComponentConst.POPUP_COMPLETED_MENU_TEXT, menuItemColor,
IconManager.getIcon("ok"),
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
int index = table.getSelectedRow();
Task task = table.getTasks().get(index);
if(task.getStatus() == TaskStatus.STARTED){
JOptionPane.showMessageDialog(mainWindow, "正在下载中的任务不能执行此操作!");
return;
}
//询问是否执行此操作
int result = JOptionPane.showConfirmDialog(mainWindow, "此操作后将无法还原,确定要将【"
+ ("".equals(task.getSubname()) ? task.getName() : task.getSubname()) +
"】置为完成状态吗?");
if(result == JOptionPane.OK_OPTION){//确定
task.setCurrent(task.getTotal());
task.setStatus(TaskStatus.COMPLETED);
//保存数据
mainWindow.taskDbTemplate.update(mainWindow.tasks);
JOptionPane.showMessageDialog(mainWindow, "操作完成!");
}
}
}));
//右键菜单:重建任务
AJMenuItem rebuildMenuItem = new AJMenuItem(ComponentConst.POPUP_REBUILD_MENU_TEXT, menuItemColor,
"",
new MenuItemActonListener(this, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow mainWindow = (EgDownloaderWindow)window;
TaskingTable table = (TaskingTable) mainWindow.runningTable;
int index = table.getSelectedRow();
Task task = table.getTasks().get(index);
if(task.getStatus() == TaskStatus.STARTED){
JOptionPane.showMessageDialog(mainWindow, "正在下载中的任务不能执行此操作!");
return;
}
//询问是否执行此操作
int result = JOptionPane.showConfirmDialog(mainWindow, "此操作后将无法还原,确定要重建【"
+ ("".equals(task.getSubname()) ? task.getName() : task.getSubname()) +
"】这个任务吗?");
if(result == JOptionPane.OK_OPTION){//确定
try {
ScriptParser.rebuildTask(task, mainWindow.setting);
//保存数据
mainWindow.taskDbTemplate.update(task);
JOptionPane.showMessageDialog(mainWindow, "操作完成!");
}catch (Exception e1) {
JOptionPane.showMessageDialog(mainWindow, "操作失败!" + e1.getMessage());
}
}
}
}));
AJMenu moreMenu = new AJMenu(ComponentConst.POPUP_MORE_MENU_TEXT, "", editMenuItem, resetMenuItem, completedMenuItem, rebuildMenuItem);
moreMenu.setForeground(menuItemColor);
//表格的右键菜单
tablePopupMenu = new AJPopupMenu(startPopupMenuItem, stopPopupMenuItem, detailPopupMenuItem, openFolderPopupMenuItem,
copyUrlPopupMenuItem, openWebPageMenuItem, downloadCoverMenuItem,
checkResetMenuItem, changeReadedMenuItem, zipMenuItem, searchAuthorMenuItem, moreMenu);
JLabel emptyTableTips = new AJLabel("empty", "", new Color(227,93,81), JLabel.CENTER);
emptyTableTips.setFont(new Font("Comic Sans MS", Font.BOLD, 18));
JButton emptyBtn = new AJButton("当前任务组没有下载任务,请点击搜索漫画");
emptyBtn.setIcon(ehIcon);
emptyBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(searchComicWindow == null){
searchComicWindow = new SearchComicWindow(mainWindow);
}
SearchComicWindow scw = mainWindow.searchComicWindow;
scw.toFront();
scw.setVisible(true);
scw.searchBtn.doClick();
}
});
emptyPanel = new AJPanel(/*emptyTableTips, */emptyBtn);
emptyPanel.setBounds(0, 160, ComponentConst.CLIENT_WIDTH, 100);
emptyPanel.setLayout(new FlowLayout());
/**
* 控制台
*/
consoleArea = new JTextArea();
consoleArea.setEditable(false);
consoleArea.setAutoscrolls(true);
consoleArea.setLineWrap(true);
consoleArea.setBorder(null);
consoleArea.setFont(new Font("宋体", Font.BOLD, 12));
consoleArea.setForeground(new Color(63,127,95));
consolePane = new JScrollPane(consoleArea);
TitledBorder border = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(219,219,219)), "控制台");
consolePane.setBounds(5, ComponentConst.CLIENT_HEIGHT - 240, ComponentConst.CLIENT_WIDTH - 20, 200);
consolePane.setAutoscrolls(true);
consolePane.setBorder(border);
try {
//将syso信息推送到控制台
new SwingPrintStream(System.out, consoleArea);
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(this, "控制台初始化错误!");
}
final JMenuItem clearItemPopup = new ClearConsoleMenuItem("清空控制台", this);
consoleArea.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
//右键
if(e.getButton() == MouseEvent.BUTTON3){
if(consolePopupMenu == null){
consolePopupMenu = new AJPopupMenu(clearItemPopup);
}
consolePopupMenu.show((Component) e.getSource(), e.getPoint().x, e.getPoint().y);
}
}
});
// 添加各个子组件
ComponentUtil.addComponents(getContentPane(), jMenuBar, tablePane, tablePopupMenu, emptyPanel, consolePane);
if(tasks == null || tasks.size() == 0){
tablePane.setVisible(false);
}else{
emptyPanel.setVisible(false);
}
//系统托盘
if (SystemTray.isSupported()) {// 判断系统是否托盘
tray = new TrayIcon(IconManager.getIcon("download").getImage());// 创建一个托盘图标对象
tray.setImageAutoSize(true);
tray.setToolTip(Version.NAME);
trayMenu = new JPopupMenu();// 创建弹出菜单
final JMenuItem item = new JMenuItem("退出");// 创建一个菜单项
trayMenu.add(item);// 将菜单项添加到菜单列表
item.addMouseListener(new MouseAdapter() {
public void mouseExited(MouseEvent e) {
trayMenu.setVisible(false);
}
});
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//保存数据
mainWindow.saveTaskGroupData();
System.exit(0);
}
});
tray.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
//弹出菜单
if(e.isPopupTrigger()){
trayMenu.setLocation(e.getX(), e.getY() - trayMenu.getComponentCount() * 30);
trayMenu.setInvoker(trayMenu);
trayMenu.setVisible(true);
}
}
public void mouseClicked(MouseEvent e) {
if(e.getClickCount()== 2){//鼠标双击图标
mainWindow.setExtendedState(JFrame.NORMAL);//设置状态为正常
mainWindow.setVisible(true);
}
}
});
SystemTray st = SystemTray.getSystemTray();// 获取系统托盘
try {
st.add(tray);// 将托盘图表添加到系统托盘
} catch (AWTException e1) {
// e1.printStackTrace();
}
}
//聚焦监听
this.addWindowFocusListener(new WindowAdapter() {
public void windowGainedFocus(WindowEvent e) {
EgDownloaderWindow window = (EgDownloaderWindow) e.getSource();
if (window.aboutWindow != null) {
window.aboutWindow.dispose();
}
if(window.countWindow != null){
window.countWindow.dispose();
}
if(window.creatingWindow != null && window.creatingWindow.isVisible()){
window.creatingWindow.requestFocus();
}else if(window.addFormWindow != null && window.addFormWindow.isVisible()){
window.addFormWindow.requestFocus();
}else if(window.detailWindow != null && window.detailWindow.isVisible()){
window.detailWindow.requestFocus();
}else if(window.editWindow != null && window.editWindow.isVisible()){
window.editWindow.requestFocus();
}else if(window.deletingWindow != null && window.deletingWindow.isVisible()){
window.deletingWindow.requestFocus();
}else if(window.simpleSearchWindow != null && window.simpleSearchWindow.isVisible()){
window.simpleSearchWindow.requestFocus();
}
}
public void windowLostFocus(WindowEvent e) {
if(trayMenu != null){
trayMenu.setVisible(false);
}
}
});
//窗口大小变化监听
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
EgDownloaderWindow window = (EgDownloaderWindow) e.getSource();
//设置菜单大小
if(jMenuBar != null){
jMenuBar.setSize(window.getWidth(), jMenuBar.getHeight());
}
//设置表格的大小
if(runningTable != null){
int height = window.getHeight() - 280;
tablePane.setSize(window.getWidth() - 20, height);
runningTable.setSize(window.getWidth() - 20, height);
//runningTable.updateUI();
//设置名称列最多显示字数
if(window.getWidth() <= ComponentConst.CLIENT_WIDTH){
TaskingTable.wordNum = 230;
}else{
TaskingTable.wordNum = 230 + (window.getWidth() - ComponentConst.CLIENT_WIDTH) * 7 / (2 * 100);
}
}
//设置空提示label位置
if(emptyPanel != null){
emptyPanel.setBounds(0, ((window.getHeight() - 280) / 2), window.getWidth(), 100);
}
//设置控制台大小
if(consolePane != null){
consolePane.setBounds(5, window.getHeight() - 240, window.getWidth() - 20, 200);
}
}
});
//鼠标动作监听
this.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
EgDownloaderWindow window = (EgDownloaderWindow) e.getSource();
if(window.getWidth() < ComponentConst.CLIENT_WIDTH){
window.setSize(ComponentConst.CLIENT_WIDTH, window.getHeight());
}
if(window.getHeight() < ComponentConst.CLIENT_HEIGHT){
window.setSize(window.getWidth(), ComponentConst.CLIENT_HEIGHT);
}
}
});
}
protected void processWindowEvent(WindowEvent e) {
//关闭,询问
if(e.getID() == WindowEvent.WINDOW_CLOSING){
int r = JOptionPane.showConfirmDialog(this, "您确定要关闭" + Version.NAME + "吗?", "提示", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if(r == JOptionPane.OK_OPTION){
//保存数据
this.saveTaskGroupData();
System.exit(0);
}
}
//最小化,隐藏到托盘
else if(e.getID() == WindowEvent.WINDOW_ICONIFIED){
if(tray != null){
if(minTips == null){
minTips = new JWindow();
minTips.setSize(150, 30);
minTips.setLocation((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() - 200, (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 80);
minTips.setLayout(new FlowLayout());
minTips.getContentPane().setBackground(Color.BLACK);
JLabel tips = new AJLabel(Version.NAME + "已最小化到托盘", Color.WHITE);
tips.setToolTipText("点击完毕");
tips.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
minTips.dispose();
}
});
minTips.getContentPane().add(tips);
minTips.toFront();
minTips.requestFocus();
minTips.setVisible(true);
Timer t = new Timer();
//10秒后关闭
t.schedule(new TimerTask() {
public void run() {
minTips.dispose();
}
}, 10000);
}
ComponentUtil.disposeAll(searchComicWindow, settingWindow,
detailWindow, aboutWindow, addFormWindow,
creatingWindow, detailWindow, checkingWindow,
coverWindow2, coverWindow, editWindow, deletingWindow,
resetAllTaskWindow, countWindow, simpleSearchWindow);
this.setVisible(false);
this.dispose();
}
}else{
super.processWindowEvent(e);
}
}
public void saveTaskGroupData(){
this.taskDbTemplate.update(this.tasks);
this.settingDbTemplate.update(this.setting);
}
public void changeTaskGroup(Setting setting, TaskList<Task> tasks, DbTemplate<Task> taskDbTemplate, DbTemplate<Picture> pictureDbTemplate, DbTemplate<Setting> settingDbTemplate){
this.taskDbTemplate = taskDbTemplate;
this.pictureDbTemplate = pictureDbTemplate;
this.settingDbTemplate = settingDbTemplate;
//加载配置数据
this.setting = setting;
//清空
this.tasks.clear();
//加载任务列表
this.tasks = tasks == null ? new TaskList<Task>() : tasks;
// 设置主窗口
this.setTitle(Version.NAME + "v" + Version.VERSION + " / " + ("".equals(ComponentConst.groupName) ? "默认空间" : ComponentConst.groupName));
if(this.tasks.isEmpty()){
this.tablePane.setVisible(false);
this.emptyPanel.setVisible(true);
}else{
this.tablePane.setVisible(true);
this.emptyPanel.setVisible(false);
this.runningTable.changeModel(this);
}
this.consoleArea.setText("");//清空控制台
}
}