package org.arong.egdownloader.ui.table;
import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Font;
import java.awt.Point;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import org.arong.egdownloader.model.SearchTask;
import org.arong.egdownloader.ui.ComponentConst;
import org.arong.egdownloader.ui.CursorManager;
import org.arong.egdownloader.ui.IconManager;
import org.arong.egdownloader.ui.listener.MenuItemActonListener;
import org.arong.egdownloader.ui.swing.AJLabel;
import org.arong.egdownloader.ui.swing.AJMenuItem;
import org.arong.egdownloader.ui.swing.AJPopupMenu;
import org.arong.egdownloader.ui.window.EgDownloaderWindow;
import org.arong.egdownloader.ui.window.SearchComicWindow;
import org.arong.egdownloader.ui.window.SearchCoverWindow;
import org.arong.egdownloader.ui.window.form.AddFormDialog;
import org.arong.egdownloader.ui.work.interfaces.IMenuListenerTask;
import org.arong.util.FileUtil;
/**
* 搜索结果表格
* @author dipoo
* @since 2015-03-11
*/
public class SearchTasksTable extends JTable {
private static final long serialVersionUID = 8917533573337061263L;
private List<SearchTask> tasks;
public SearchComicWindow comicWindow;
public JPopupMenu popupMenu;//右键菜单
public int currentRowIndex = -1;
public void changeModel(List<SearchTask> tasks){
this.tasks = tasks;
TableModel tableModel = new SearchTaskTableModel(this.tasks);
this.setModel(tableModel);//设置数据模型
}
public SearchTasksTable(int x, int y, int width, int height, final List<SearchTask> tasks_, SearchComicWindow comicWindow_){
this.comicWindow = comicWindow_;
this.tasks = (tasks_ == null ? new ArrayList<SearchTask>() : tasks_);
if(this.tasks.size() > ComponentConst.MAX_TASK_PAGE){
height = ComponentConst.MAX_TASK_PAGE * 25;
}
this.setBounds(x, y, width, height);
// this.setShowGrid(true);//显示单元格边框
// this.setCellSelectionEnabled(false);//选择单元格
this.setCursor(CursorManager.getPointerCursor());//光标变手型
this.getTableHeader().setReorderingAllowed(false);//不可移动列
this.setBackground(Color.WHITE);
// this.setOpaque(false);//设为透明
TableModel tableModel = new SearchTaskTableModel(this.tasks);
this.setModel(tableModel);//设置数据模型
// TaskTableCellRenderer renderer = new TaskTableCellRenderer();
// renderer.setHorizontalAlignment(JLabel.CENTER);
this.setDefaultRenderer(Object.class, new TableCellRenderer() {
private Color c = new Color(47,110,178);
private Color uploaderColor = Color.getHSBColor(122, 255, 122);
private Font font = new Font("微软雅黑", Font.PLAIN, 11);
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if(isSelected){
c = Color.BLUE;
}else{
c = Color.DARK_GRAY;
}
SearchTasksTable tb = (SearchTasksTable) table;
TableColumn tc = tb.getColumnModel().getColumn(column);
if(column == 0){//类型
tc.setPreferredWidth(105);
tc.setMaxWidth(105);
JLabel l = new AJLabel("", c, JLabel.LEFT);
if(tasks.get(row).getType() != null){
ImageIcon icon = IconManager.getIcon(tasks.get(row).getType().toLowerCase());
if(icon != null){
l.setIcon(icon);
}else{
l.setText(tasks.get(row).getType());
}
}
return l;
}else if(column == 1){//名称
tc.setPreferredWidth(700);
tc.setMaxWidth(1800);
JLabel l = new AJLabel(value.toString(), c, font, JLabel.LEFT);
SearchTask task = tasks.get(row);
if(task.getBtUrl() != null){
try{
l.setIcon(IconManager.getIcon("t"));
}catch (Exception e) {
}
}
l.setToolTipText(value.toString());
return l;
}else if(column == 2){//上传者
tc.setPreferredWidth(100);
tc.setMaxWidth(150);
JLabel l = new AJLabel(value.toString(), c, font, JLabel.LEFT);
l.setForeground(uploaderColor);
l.setToolTipText("点击搜索该上传者的上传的漫画");
return l;
}else if(column == 3){//发布时间
tc.setPreferredWidth(100);
tc.setMaxWidth(150);
return new AJLabel(value.toString(), c, font, JLabel.LEFT);
}else{
return null;
}
}
});//设置渲染器
// this.getTableHeader().setDefaultRenderer(new TaskTableHeaderRenderer());
//单元格监听
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e){
final SearchTasksTable table = comicWindow.searchTable;
int rowIndex = table.rowAtPoint(e.getPoint());
int columnIndex = table.columnAtPoint(e.getPoint());
if(columnIndex == 0){
SearchTask task = table.getTasks().get(rowIndex);
//切换行
if(rowIndex != currentRowIndex){
currentRowIndex = rowIndex;
if(comicWindow.coverWindow == null){
comicWindow.coverWindow = new SearchCoverWindow(comicWindow);
}
comicWindow.coverWindow.showCover(task, new Point(e.getXOnScreen() + 50, e.getYOnScreen()));
}
}else{
if(comicWindow.coverWindow != null){
comicWindow.coverWindow.setVisible(false);
currentRowIndex = -1;
}
}
}
});
this.addMouseListener(new MouseAdapter() {
public void mouseExited(MouseEvent e) {
if(comicWindow.coverWindow != null){
comicWindow.coverWindow.setVisible(false);
currentRowIndex = -1;
}
}
public void mouseClicked(MouseEvent e) {
final SearchTasksTable table = (SearchTasksTable)e.getSource();
//获取点击的行数
int rowIndex = table.rowAtPoint(e.getPoint());
int columnIndex = table.columnAtPoint(e.getPoint());
//左键
if(e.getButton() == MouseEvent.BUTTON1){
//点击上传者
if(columnIndex == 2){
comicWindow.doSearch("uploader:" + tasks.get(rowIndex).getUploader());
}
}
//右键
else if(e.getButton() == MouseEvent.BUTTON3){
//使之选中
table.setRowSelectionInterval(rowIndex, rowIndex);
if(table.popupMenu == null){
JMenuItem downItem = new AJMenuItem("创建任务", Color.BLACK,
IconManager.getIcon("add"),
new MenuItemActonListener(comicWindow.mainWindow, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
EgDownloaderWindow this_ = (EgDownloaderWindow) window;
this_.setEnabled(false);
final SearchTask task = table.getTasks().get(table.getSelectedRow());
if(this_.creatingWindow != null && this_.creatingWindow.isVisible()){
this_.creatingWindow.setVisible(true);
this_.creatingWindow.toFront();
}else{
if (this_.addFormWindow == null) {
this_.addFormWindow = new AddFormDialog(this_);
}
((AddFormDialog)this_.addFormWindow).emptyField();
((AddFormDialog)this_.addFormWindow).setUrl(task.getUrl());
this_.addFormWindow.setVisible(true);
this_.addFormWindow.toFront();
}
}
}));
JMenuItem openPageItem = new AJMenuItem("打开网页", Color.BLACK, IconManager.getIcon("browse"),
new MenuItemActonListener(comicWindow.mainWindow, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
final SearchTask task = table.getTasks().get(table.getSelectedRow());
openPage(task.getUrl());
}
}));
JMenuItem openBtPageItem = new AJMenuItem("下载BT", Color.BLACK,
IconManager.getIcon("download"),
new MenuItemActonListener(comicWindow.mainWindow, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
final SearchTask task = table.getTasks().get(table.getSelectedRow());
if(task.getBtUrl() != null){
openPage(task.getBtUrl());
}else{
JOptionPane.showMessageDialog(comicWindow, "该漫画没有可以下载的bt文件");
}
}
}));
JMenuItem searchTitleItem = new AJMenuItem("搜索标题", Color.BLACK, "",
new MenuItemActonListener(comicWindow.mainWindow, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
final SearchTask task = table.getTasks().get(table.getSelectedRow());
comicWindow.doSearch(task.getName());
}
}));
JMenuItem searchAuthorItem = new AJMenuItem("搜索作者", Color.BLACK, "",
new MenuItemActonListener(comicWindow.mainWindow, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
final SearchTask task = table.getTasks().get(table.getSelectedRow());
if(task.getAuthor() != null){
comicWindow.doSearch(task.getAuthor());
}
}
}));
JMenuItem clearCoverItem = new AJMenuItem("清理封面", Color.BLACK, IconManager.getIcon("clear"),
new MenuItemActonListener(comicWindow.mainWindow, new IMenuListenerTask() {
public void doWork(Window window, ActionEvent e) {
final SearchTask task = table.getTasks().get(table.getSelectedRow());
String path = ComponentConst.CACHE_PATH + "/" + FileUtil.filterDir(task.getUrl());
File coverFile = new File(path);
if(coverFile.exists()){
coverFile.delete();
JOptionPane.showMessageDialog(comicWindow, "清理完成");
}
}
}));
table.popupMenu = new AJPopupMenu(downItem, openPageItem, openBtPageItem, searchTitleItem, searchAuthorItem, clearCoverItem);
}
table.popupMenu.show(table, e.getPoint().x, e.getPoint().y);
}
}
});
}
public void openPage(String url){
try {
Desktop.getDesktop().browse(new URI(url));
} catch (IOException e1) {
try {
Runtime.getRuntime().exec("cmd.exe /c start " + url);
} catch (IOException e2) {
JOptionPane.showMessageDialog(comicWindow, "不支持此功能");
}
} catch (URISyntaxException e1) {
try {
Runtime.getRuntime().exec("cmd.exe /c start " + url);
} catch (IOException e2) {
JOptionPane.showMessageDialog(comicWindow, "不支持此功能");
}
}finally{
//隐藏tablePopupMenu
popupMenu.setVisible(false);
}
}
public List<SearchTask> getTasks() {
return tasks;
}
public void setTasks(List<SearchTask> tasks) {
this.tasks = tasks;
}
}