package org.arong.egdownloader.ui.window.form; import java.awt.Color; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import org.arong.egdownloader.model.Setting; import org.arong.egdownloader.model.Task; import org.arong.egdownloader.ui.ComponentUtil; import org.arong.egdownloader.ui.IconManager; import org.arong.egdownloader.ui.listener.MouseAction; import org.arong.egdownloader.ui.listener.OperaBtnMouseListener; import org.arong.egdownloader.ui.swing.AJButton; import org.arong.egdownloader.ui.swing.AJComboBox; import org.arong.egdownloader.ui.swing.AJLabel; import org.arong.egdownloader.ui.swing.AJTextField; import org.arong.egdownloader.ui.window.CreatingWindow; import org.arong.egdownloader.ui.window.EgDownloaderWindow; import org.arong.egdownloader.ui.work.CreateWorker; import org.arong.egdownloader.ui.work.interfaces.IListenerTask; import org.arong.util.ArrayUtil; /** * 新建下载任务窗口 * @author 阿荣 * @since 2014-05-21 * */ public class AddFormDialog extends JDialog { private static final long serialVersionUID = 6680144418171641216L; private JLabel urlLabel; private JTextField urlField; private JLabel saveDirLabel; private JTextField saveDirField; private JButton chooserBtn; private JButton addTaskBtn; private JLabel tipLabel; private JFileChooser saveDirChooser; private JLabel tagLabel; private JTextField tagField; private JComboBox tagComboBox; public JFrame mainWindow; public void initOrUpdateTagComboBox(Setting setting){ if(setting.getTags() != null){ String[] tags = setting.getTags().split("\\$¥"); if(tagComboBox == null){ tagComboBox = new AJComboBox(true, new ActionListener() { public void actionPerformed(ActionEvent ae) { AJComboBox s = (AJComboBox) ae.getSource(); tagField.setText(s.getSelectedItem().toString()); } }, "", 370, 80, 90, 30, 5, tags); tagField.setSize(300, 30); ComponentUtil.addComponents(this.getContentPane(), tagComboBox); }else{ this.getContentPane().remove(tagComboBox); tagComboBox = null; initOrUpdateTagComboBox(setting); } } } public AddFormDialog(final JFrame mainWindow){ this.mainWindow = mainWindow; this.setTitle("新建任务"); this.setIconImage(IconManager.getIcon("add").getImage()); this.setSize(480, 250); this.setResizable(false); this.setLayout(null); this.setLocationRelativeTo(mainWindow); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { //关闭后显示主界面 //mainWindow.setVisible(true); mainWindow.setEnabled(true); AddFormDialog w = (AddFormDialog)e.getSource(); w.dispose(); } //窗体由激活状态变成非激活状态 /*public void windowDeactivated(WindowEvent e) { //关闭后显示主界面 mainWindow.setVisible(true); mainWindow.setEnabled(true); AddFormDialog w = (AddFormDialog)e.getSource(); w.dispose(); }*/ public void windowActivated(WindowEvent e) { mainWindow.setEnabled(false); } }); setDefaultCloseOperation(HIDE_ON_CLOSE); tipLabel = new AJLabel("提示:保存目录不用填写具体文件夹名,下载器会自动生成", Color.LIGHT_GRAY, 80, 5, this.getWidth() - 80, 30); urlLabel = new AJLabel("任务地址", Color.BLUE, 5, 40, 60, 30); urlField = new AJTextField("urlField", 65, 40, 395, 30); saveDirLabel = new AJLabel("保存目录", Color.BLUE, 5, 120, 60, 30); saveDirField = new AJTextField("saveDirField", 65, 120, 320, 30); tagLabel = new AJLabel("标签", Color.BLUE, 5, 80, 60, 30); final Setting setting = ((EgDownloaderWindow)mainWindow).setting; tagField = new AJTextField("tag", 65, 80, setting.getTags() != null ? 300 : 395, 30);//395 initOrUpdateTagComboBox(setting); saveDirField.setText(setting.getDefaultSaveDir() + "\\" + new SimpleDateFormat("yyyy-MM-dd").format(new Date())); chooserBtn = new AJButton("浏览", IconManager.getIcon("select"), new OperaBtnMouseListener(this, MouseAction.CLICK, new IListenerTask() { public void doWork(Window addFormDialog, MouseEvent e) { AddFormDialog this_ = (AddFormDialog)addFormDialog; int result = this_.saveDirChooser.showOpenDialog(this_); File file = null; if(result == JFileChooser.APPROVE_OPTION) { file = this_.saveDirChooser.getSelectedFile(); if(!file.isDirectory()) { JOptionPane.showMessageDialog(this_, "你选择的目录不存在"); return ; } String path = file.getAbsolutePath(); this_.saveDirField.setText(path); } } }) , 400, 120, 60, 30); addTaskBtn = new AJButton("新建", IconManager.getIcon("add"), new OperaBtnMouseListener(this, MouseAction.CLICK, new IListenerTask() { public void doWork(Window addFormDialog, MouseEvent event) { AddFormDialog this_ = (AddFormDialog)addFormDialog; String url = this_.urlField.getText().trim(); String saveDir = this_.saveDirField.getText().trim(); String tag = this_.tagField.getText().trim(); if("".equals(url)){ JOptionPane.showMessageDialog(this_, "请填写下载地址"); }else if("".equals(saveDir)){ JOptionPane.showMessageDialog(this_, "请选择保存路径"); }else{ if("".equals(tag)){ tag = "一般"; } EgDownloaderWindow mainWindow = (EgDownloaderWindow)this_.mainWindow; if(isValidUrl(mainWindow.setting, url)){ //存到数据库中的地址统一不以/结尾,方便验证重复 if("/".equals(url.substring(url.length() - 1, url.length()))){ url = url.substring(0, url.length() - 1); } //重复性验证 if(! mainWindow.taskDbTemplate.exsits("url", url)){ if(addTaskBtn.isEnabled()){ addTaskBtn.setEnabled(false); }else{ return; } if(((EgDownloaderWindow)this_.mainWindow).creatingWindow == null){ ((EgDownloaderWindow)this_.mainWindow).creatingWindow = new CreatingWindow(mainWindow); } //分析tag(如果不存在,则添加到标签记忆中,如果存在,则将此标签置于最前面) String tags = setting.getTags(); if(! "一般".equals(tag)){ if(tags == null){ setting.setTags(tag); //保存配置文件 mainWindow.settingDbTemplate.update(setting); }else{ String[] tagsArr = tags.split("\\" + Setting.TAGSPLIT); if(!ArrayUtil.exists(tagsArr, tag)){ setting.setTags(tag + Setting.TAGSPLIT + setting.getTags()); }else{ //置于最前面 tags = change(tags.split("\\" + Setting.TAGSPLIT), tag, Setting.TAGSPLIT); setting.setTags(tags); } //保存配置文件 mainWindow.settingDbTemplate.update(setting); } initOrUpdateTagComboBox(setting); } //开始采集 Task task = new Task(url, saveDir); task.setTag(tag); task.setCreateWorker(new CreateWorker(task, mainWindow)); task.getCreateWorker().execute(); addTaskBtn.setEnabled(true); }else{ JOptionPane.showMessageDialog(this_, "此下载地址已存在"); } }else{ JOptionPane.showMessageDialog(this_, "下载地址不合法"); } } } }), (this.getWidth() - 100) / 2, 170, 100, 30); saveDirChooser = new JFileChooser("/"); saveDirChooser.setDialogTitle("选择保存目录");//选择框标题 saveDirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//只能选择目录 ComponentUtil.addComponents(this.getContentPane(), addTaskBtn, urlLabel, urlField, tagLabel, tagField, saveDirLabel, saveDirField, chooserBtn, tipLabel); } public void emptyField(){ urlField.setText(""); } public void setUrl(String url){ urlField.setText(url); } private static boolean isValidUrl(Setting setting, String url){ if(url != null){ //假设url合法:http://exhentai.org/g/446779/553f5c4086/ /*if(url.matches("^(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]")){ //获取http://exhentai.org/部分 String host; if(url.lastIndexOf("/") > 8){ String protocal = "http://"; if(url.indexOf("https") != -1){ protocal = "https://"; } String url_ = url.substring(url.indexOf(protocal) + 7, url.length()); host = protocal + url_.substring(0, url_.indexOf("/")); }else{ host = url; } return url.matches(host + setting.getGidPrefix() + "[a-zA-Z0-9]+/[a-zA-Z0-9]+/*"); }*/ return url.matches("^(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"); } return false; } //将存在的标签放到最前前面 private String change(String[] arr, String s, String split){ String str = ""; for(int i = 0; i < arr.length; i ++){ if(!s.equals(arr[i])){ str += split + arr[i]; } } return s + str; } public void dispose() { mainWindow.setEnabled(true); //mainWindow.setVisible(true); super.dispose(); } }