package jp.crwdev.app.gui;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.DropMode;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.JWindow;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import jp.crwdev.app.BufferedImageIO;
import jp.crwdev.app.EventObserver;
import jp.crwdev.app.EventObserver.OnEventListener;
import jp.crwdev.app.constant.Constant;
import jp.crwdev.app.container.ImageFileInfoSplitWrapper;
import jp.crwdev.app.imagefilter.ImageFilterParam;
import jp.crwdev.app.imagefilter.PageCheckFilter;
import jp.crwdev.app.imagefilter.ResizeFilter;
import jp.crwdev.app.imagefilter.SplitFilter;
import jp.crwdev.app.interfaces.IImageFileInfo;
import jp.crwdev.app.interfaces.IImageFileInfoList;
import jp.crwdev.app.interfaces.ISimpleCallback;
import jp.crwdev.app.setting.ImageFilterParamSet;
import jp.crwdev.app.util.ImageCache;
import jp.crwdev.app.util.ImageCache.ImageData;
import jp.crwdev.app.util.ImageFileInfoAsyncTask;
import jp.crwdev.app.util.ImageFileInfoAsyncTask.OnTaskObserver;
import jp.crwdev.app.util.TableRowTransferHandler;
@SuppressWarnings("serial")
public class ImageFileInfoTable extends JTable implements OnEventListener {
private DefaultTableModel mTableModel = null;
private ImagePanel mImagePanel = null;
private FullscreenWindow mFullscreenWindow = null;
private IImageFileInfoList mInfoList = null;
private ImageFilterParamSet mBaseFilterParams = null;
public ImageFileInfoTable(){
initialize();
}
@SuppressWarnings("unused")
private void initialize(){
mTableModel = new DefaultTableModel(Constant.TABLE_HEADER_COLUMNS, 0){
@Override
public boolean isCellEditable(int row, int column) {
return (column != 0); // 0カラム目の編集禁止
}
};
//this.setTransferHandler(new TableRowTransferHandler());
this.setDropMode(DropMode.INSERT_ROWS);
this.setDragEnabled(true);
setModel(mTableModel);
setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for(int i=0; i<Constant.TABLE_HEADER_COLUMNS.length; i++){
TableColumn col = getColumnModel().getColumn( i );
col.setMinWidth(50);
// col.setMaxWidth(200);
}
setEventListener();
//XXX リアルタイムサムネイル
if(false){
ThumbnailMouseMotionAdapter adapter = new ThumbnailMouseMotionAdapter(this);
this.addMouseMotionListener(adapter);
this.addMouseListener(adapter);
}
}
public class ThumbnailMouseMotionAdapter extends MouseMotionAdapter implements MouseListener {
private ImageFileInfoTable table;
private Point currentCell;
private JWindow popupWindow;
public ThumbnailMouseMotionAdapter(ImageFileInfoTable table){
this.table = table;
}
@Override
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
int row = table.rowAtPoint(p);
int col = table.columnAtPoint(p);
IImageFileInfoList infoList = table.getImageFileInfoList();
if (col != 0 || infoList == null){
return;
}
if ((row > -1 && row < table.getRowCount()) && (col > -1 && col < table.getColumnCount())) {
if(currentCell == null || currentCell.x != col || currentCell.y != row){
currentCell = new Point(col, row);
IImageFileInfo info = infoList.get(row);
if(info != null){
Rectangle cellRect = table.getCellRect(row, 0, false);
if(popupWindow == null){
popupWindow = new JWindow();
}else{
popupWindow.setVisible(false);
}
BufferedImage thumbnail;
try {
BufferedImage img = ImageIO.read(info.getInputStream());
Dimension size = ResizeFilter.getResizeDimension(img.getWidth(), img.getHeight(), 128, 128);
thumbnail = new BufferedImage(size.width, size.height, img.getType());
thumbnail.getGraphics().drawImage(img, 0, 0, size.width, size.height, null);
img.flush();
} catch (IOException e1) {
return;
}
JLabel label = new JLabel(new ImageIcon(thumbnail));
Point screenPos = table.getLocationOnScreen();
popupWindow.setSize(thumbnail.getWidth() , thumbnail.getHeight());
popupWindow.setLocation(screenPos.x + cellRect.x+cellRect.width, screenPos.y + cellRect.y);
popupWindow.getContentPane().removeAll();
popupWindow.getContentPane().add(label);
popupWindow.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
popupWindow.setVisible(false);
}
});
popupWindow.setVisible(true);
}
}
}
else{
if(popupWindow != null && popupWindow.isVisible()){
popupWindow.setVisible(false);
}
}
}
@Override
public void mouseExited(MouseEvent e) {
if(popupWindow != null && popupWindow.isVisible()){
popupWindow.setVisible(false);
}
}
@Override
public void mouseClicked(MouseEvent e) {
// NOP
}
@Override
public void mousePressed(MouseEvent e) {
// NOP
}
@Override
public void mouseReleased(MouseEvent e) {
// NOP
}
@Override
public void mouseEntered(MouseEvent e) {
// NOP
}
}
public void finalize(){
finalizeThread();
}
private EventObserver mEventSender = null;
public void setEventObserver(EventObserver observer){
mEventSender = observer;
}
public void setImagePanel(ImagePanel panel){
mImagePanel = panel;
}
public void setFullscreenWindow(FullscreenWindow window){
mFullscreenWindow = window;
}
public void setImageFilterParam(ImageFilterParamSet baseParams){
synchronized(this){
mBaseFilterParams = baseParams;
if(ImageCache.enable){
ImageCache.getInstance().setImageFilterParam(baseParams);
}
}
}
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if(isRowSelected(row)){// == getSelectedRow()){
//c.setBackground(Color.MAGENTA);
}
else{
IImageFileInfo info = mInfoList.get(row);
if(!info.isEnable()){
c.setBackground(Color.GRAY);
}
else{
ImageFilterParam param = mInfoList.get(row).getFilterParam();
int cropWidth = param.getFullPageCropLeft() + param.getFullPageCropRight();
if(cropWidth >= 400){
c.setBackground(Color.RED);
}
else if(param.isEdit()){
c.setBackground(Color.YELLOW);
}
else{
boolean pict = (param.getPageType() == Constant.PAGETYPE_PICT);
c.setBackground(pict ? Color.ORANGE: getBackground());
}
}
}
return c;
}
public void setImageFileInfoList(IImageFileInfoList list){
if(mInfoList != null){
mInfoList.release();
}
mInfoList = null;
clearData();
mInfoList = list;
if(list != null){
for(int i=0; i<list.size(); i++){
addData(list.get(i));
}
}
setTransferHandler(new TableRowTransferHandler(list, new ISimpleCallback(){
@Override
public void onCallback() {
mEventSender.setModified();
}
}));
startLoadFileInfoThread();
ImageCache.getInstance().setImageFileInfoList(list);
// ThumbnailView
mEventSender.sendEvent(EventObserver.EventTarget_Thumbnail,
EventObserver.EventType_UpdateFileInfoList, 0, 0, list);
}
private void startLoadFileInfoThread(){
// FileInfoの読み込まれていない情報をスレッドで順次更新する
ImageFileInfoAsyncTask task = new ImageFileInfoAsyncTask(mInfoList, new OnTaskObserver(){
@Override
public void onStart() {
mEventSender.startProgress();
}
@Override
public void onFinish() {
mEventSender.stopProgress();
mEventSender.setProgressMessage("");
// FileInfo更新通知
mEventSender.sendEvent(EventObserver.EventTarget_Setting, EventObserver.EventType_FileInfoModified, 0);
}
@Override
public void onProcess(int index, int total, IImageFileInfo info) {
mEventSender.setProgressMessage(String.format("%d / %d", (index+1), total));
try {
info.update();
}catch(Exception e){
e.printStackTrace();
}catch(OutOfMemoryError e){
e.printStackTrace();
}
mTableModel.setValueAt(Integer.toString(info.getWidth()), index, Constant.TABLE_COLUMN_WIDTH);
mTableModel.setValueAt(Integer.toString(info.getHeight()), index, Constant.TABLE_COLUMN_HEIGHT);
}
});
task.start();
}
public IImageFileInfoList getImageFileInfoList(){
return mInfoList;
}
private int getPageTypeToFilterIndex(int pageType){
switch(pageType){
case Constant.PAGETYPE_COLOR:
return ImageFilterParamSet.FILTER_INDEX_COLOR;
case Constant.PAGETYPE_PICT:
return ImageFilterParamSet.FILTER_INDEX_PICT;
case Constant.PAGETYPE_TEXT:
return ImageFilterParamSet.FILTER_INDEX_TEXT;
case Constant.PAGETYPE_AUTO:
default:
return ImageFilterParamSet.FILTER_INDEX_BASIC;
}
}
// Table Event
private void onItemSelected(int index){
selectItem(index, true);
}
private void onItemSelectedInternal(int index, boolean updatePanel){
if(mInfoList != null && 0 <= index && index < mInfoList.size()){
IImageFileInfo info = mInfoList.get(index);
if(info != null){
if(ImageCache.enable){
ImageData data = ImageCache.getInstance().getImageData(index);
BufferedImage image = data.getOriginalImage();
if(mFullscreenWindow != null){
mFullscreenWindow.setImage(image, info, index);
}
else if(mImagePanel != null){
mImagePanel.setImage(image, info, index);
}
ImageCache.getInstance().startRenderImage(index);
}
else{
InputStream stream = info.getInputStream();
try {
BufferedImage image = null;
if(stream != null){
image = BufferedImageIO.read(stream, info.isJpeg());
}
else{
boolean preview = true;
if(mBaseFilterParams != null){
preview = mBaseFilterParams.isPreview();
}
image = info.getImage(preview);
}
if(mFullscreenWindow != null){
mFullscreenWindow.setImage(image, info, index);
}
else if(mImagePanel != null){
mImagePanel.setImage(image, info, index);
}
}catch(OutOfMemoryError e){
mEventSender.setProgressMessage(e.getMessage());
e.printStackTrace();
return;
}
}
if(updatePanel){
int pageType = info.getFilterParam().getPageType();
mEventSender.sendEvent(EventObserver.EventTarget_Setting, EventObserver.EventType_SelectTab, getPageTypeToFilterIndex(pageType));
}
}
}
}
private LinkedList<Integer> mQueue = new LinkedList<Integer>();
private Object mThreadLock = new Object();
private Thread mThread = null;
private boolean mIsUpdatePanel = false;
private boolean mThreadFinish = false;
public void selectItem(int index, boolean updatePanel){
if(mThread == null){
mThread = new Thread(){
@Override
public void run(){
while(!mThreadFinish){
Integer index = -1;
synchronized(mThreadLock){
if(mQueue.isEmpty()){
try {
mThreadLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(!mQueue.isEmpty()){
index = mQueue.pop();
}
}
try{
boolean loop = true;
while(loop && !mThreadFinish){
onItemSelectedInternal(index, mIsUpdatePanel);
synchronized(mQueue){
loop = !mQueue.isEmpty();
if(loop){
index = mQueue.pop();
}
}
}
}catch(Exception e){
mEventSender.setProgressMessage(e.getMessage());
}catch(OutOfMemoryError e){
mEventSender.setProgressMessage(e.getMessage());
}
}
mThread = null;
}
};
mThread.setPriority(Thread.MAX_PRIORITY);
mThread.start();
}
synchronized(mThreadLock){
while(mQueue.size() > 0){
mQueue.remove();
}
mIsUpdatePanel = updatePanel;
mQueue.addLast(index);
mThreadLock.notify();
}
}
private void finalizeThread(){
if(mThread != null){
mThreadFinish = true;
synchronized(mThreadLock){
mThreadLock.notify();
}
mThread = null;
}
}
public void selectCurrentItem(boolean updatePanel){
int selected = getSelectedRow();
if(selected < 0){
selected = 0;
}
selectItem(selected, updatePanel);
// onItemSelected(selected);
}
private void onTableCellChanged(int row, int col, String value){
if(mInfoList != null){
IImageFileInfo info = mInfoList.get(row);
if(info != null){
ImageFilterParam param = info.getFilterParam();
if(param == null){
param = new ImageFilterParam();
info.setFilterParam(param);
}
boolean update = false;
if(col == Constant.TABLE_COLUMN_PAGETYPE){
int pageType = Constant.getPageType(value);
if(pageType != param.getPageType()){
// PageType変更有り
param.setPageType(pageType);
// FileInfo更新通知
mEventSender.sendEvent(EventObserver.EventTarget_Setting, EventObserver.EventType_FileInfoModified, 0);
mEventSender.setModified();
selectCurrentItem(true);
update = true;
}
}
else if(col == Constant.TABLE_COLUMN_PAGESPREAD){
if(value != param.getPageSpread()){
// PageSpread変更有り
param.setPageSpread(value);
// FileInfo更新通知
mEventSender.sendEvent(EventObserver.EventTarget_Setting, EventObserver.EventType_FileInfoModified, 0);
mEventSender.setModified();
selectCurrentItem(true);
update = true;
}
}
else if(col == Constant.TABLE_COLUMN_SPLITTYPE){
int splitType = Constant.getSplitType(value);
if(splitType != param.getSplitType()){
int selected = getSelectedRow();
if(param.getSplitIndex() != 0){
selected -= param.getSplitIndex();
if(info instanceof ImageFileInfoSplitWrapper){
ImageFileInfoSplitWrapper wrap = (ImageFileInfoSplitWrapper)info;
param = wrap.getFirstSplitInfo().getFilterParam();
}
}
// SplitType変更有り
param.setSplitType(splitType);
update = true;
renewalList();
selectItem(selected, true);
return;
}
}
else if(col == Constant.TABLE_COLUMN_TOC){
info.setTocText(value);
info.setModify(true);
}
if(update){
//if(mListener != null){
// mListener.onItemSelected(row);
//}
System.out.println("row=" + row + " col=" + col + " value=" + value);
}
}
}
}
// Popup Menu
private void updateSplitTypeAll(int splitType){
int size = mInfoList.size();
//String splitText = Constant.getSplitTypeText(splitType);
for(int row=0; row<size; row++){
IImageFileInfo info = mInfoList.get(row);
info.getFilterParam().setSplitType(splitType);
//mTableModel.setValueAt(splitText, row, Constant.TABLE_COLUMN_SPLITTYPE);
}
renewalList();
}
private void updateUncheckPageAll(){
int size = mInfoList.size();
for(int row=0; row<size; row++){
IImageFileInfo info = mInfoList.get(row);
info.getFilterParam().setPageType(Constant.PAGETYPE_AUTO);
mTableModel.setValueAt(Constant.TEXT_PAGETYPE_AUTO, row, Constant.TABLE_COLUMN_PAGETYPE);
}
}
private void updatePicturePageAll(){
int size = mInfoList.size();
for(int row=0; row<size; row++){
IImageFileInfo info = mInfoList.get(row);
info.getFilterParam().setPageType(Constant.PAGETYPE_PICT);
mTableModel.setValueAt(Constant.TEXT_PAGETYPE_PICT, row, Constant.TABLE_COLUMN_PAGETYPE);
}
}
private void updateTextPageAll(){
int size = mInfoList.size();
for(int row=0; row<size; row++){
IImageFileInfo info = mInfoList.get(row);
info.getFilterParam().setPageType(Constant.PAGETYPE_TEXT);
mTableModel.setValueAt(Constant.TEXT_PAGETYPE_TEXT, row, Constant.TABLE_COLUMN_PAGETYPE);
}
}
private void updateTextPageAuto(){
int size = mInfoList.size();
for(int row=0; row<size; row++){
IImageFileInfo info = mInfoList.get(row);
if(info.getFilterParam().getPageType() == Constant.PAGETYPE_AUTO){
info.getFilterParam().setPageType(Constant.PAGETYPE_TEXT);
mTableModel.setValueAt(Constant.TEXT_PAGETYPE_TEXT, row, Constant.TABLE_COLUMN_PAGETYPE);
}
}
}
private void updatePicturePageCheckAll(){
if(mInfoList == null){
return;
}
ImageFileInfoAsyncTask task = new ImageFileInfoAsyncTask(mInfoList, new OnTaskObserver(){
@Override
public void onStart() {
mEventSender.startProgress();
}
@Override
public void onFinish() {
mEventSender.stopProgress();
// FileInfo更新通知
mEventSender.sendEvent(EventObserver.EventTarget_Setting, EventObserver.EventType_FileInfoModified, 0);
}
@Override
public void onProcess(int index, int total, IImageFileInfo info) {
mEventSender.setProgressMessage(String.format("%d / %d", (index+1), total));
String disableValue = Constant.TEXT_PAGETYPE_PICT;
int pageType = info.getFilterParam().getPageType();
if(pageType != Constant.PAGETYPE_PICT){
InputStream stream = info.getInputStream();
BufferedImage image = null;
if(stream != null){
image = BufferedImageIO.read(stream, info.isJpeg());
}
else{
image = info.getImage(true);
}
PageCheckFilter checker = new PageCheckFilter(true);
ImageFilterParam filterParam = info.getFilterParam();
if(mBaseFilterParams != null){
synchronized(this){
filterParam = mBaseFilterParams.get(ImageFilterParamSet.FILTER_INDEX_TEXT).createMergedFilterParam(filterParam);
}
}
try {
boolean whitePage = checker.isWhiteImage(image, filterParam, true);
if(!whitePage){
info.getFilterParam().setPageType(Constant.PAGETYPE_PICT);
mTableModel.setValueAt(disableValue, index, 1);
}
}catch(Exception e){
mEventSender.setProgressMessage(e.getMessage());
}catch(OutOfMemoryError e){
mEventSender.setProgressMessage(e.getMessage());
}
}
}
});
task.start();
/*
int size = mInfoList.size();
for(int row=0; row<size; row++){
try {
IImageFileInfo info = mInfoList.get(row);
String disableValue = Constant.TEXT_PAGETYPE_PICT;
int pageType = info.getFilterParam().getPageType();
if(pageType != Constant.PAGETYPE_AUTO){
InputStream stream = info.getInputStream();
BufferedImage image = BufferedImageIO.read(stream, info.isJpeg());
PageCheckFilter checker = new PageCheckFilter(true, null);
boolean whitePage = checker.isWhiteImage(image, info.getFilterParam());
if(!whitePage){
info.getFilterParam().setPageType(Constant.PAGETYPE_PICT);
mTableModel.setValueAt(disableValue, row, 1);
}
}
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
row++;
}
*/
}
public void clearData(){
mTableModel.setRowCount(0);
}
public void addData(IImageFileInfo info){
Object[] record = Constant.createRecord(info);
mTableModel.addRow(record);
}
public void updateData(int row, IImageFileInfo info){
Object[] record = Constant.createRecord(info);
for(int col=0; col<record.length; col++){
mTableModel.setValueAt(record[col], row, col);
}
}
private void setEventListener(){
getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting()){
return;
}
int selected = getSelectedRow();
if(selected >= 0){
onItemSelected(selected);
}
}
});
getTableHeader().addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
if(javax.swing.SwingUtilities.isRightMouseButton(e)){
int column = getTableHeader().columnAtPoint(e.getPoint());
if(column == Constant.TABLE_COLUMN_ENTRYNAME){
JPopupMenu popup = new JPopupMenu();
JMenuItem item0 = new JMenuItem("サムネイルビュー表示切替");
item0.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
mEventSender.sendEvent(EventObserver.EventTarget_Thumbnail, EventObserver.EventType_ShowHide_ThumbnailView, 0);
}
});
popup.add(item0);
if(!mInfoList.isEnableSort()){
JMenuItem item1 = new JMenuItem("並び順リセット");
item1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
mInfoList.setEnableSort(true);
renewalList();
mEventSender.setModified();
}
});
popup.add(item1);
}
popup.show(e.getComponent(), e.getX(), e.getY());
}
else if(column == Constant.TABLE_COLUMN_PAGETYPE){
JPopupMenu popup = new JPopupMenu();
JMenuItem item0 = new JMenuItem("一括クリア");
JMenuItem item1 = new JMenuItem("一括挿絵");
JMenuItem item2 = new JMenuItem("一括本文");
JMenuItem item4 = new JMenuItem("未設定を一括本文");
JMenuItem item3 = new JMenuItem("挿絵チェック");
item0.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateUncheckPageAll();
}
});
item1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updatePicturePageAll();
}
});
item2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateTextPageAll();
}
});
item3.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updatePicturePageCheckAll();
}
});
item4.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateTextPageAuto();
}
});
popup.add(item0);
popup.add(item1);
popup.add(item2);
popup.add(item4);
popup.add(item3);
popup.show(e.getComponent(), e.getX(), e.getY());
}
else if(column == Constant.TABLE_COLUMN_SPLITTYPE){
JPopupMenu popup = new JPopupMenu();
JMenuItem item0 = new JMenuItem("一括(分割なし)");
JMenuItem item1 = new JMenuItem("一括(右→左)");
JMenuItem item2 = new JMenuItem("一括(左→右)");
JMenuItem item3 = new JMenuItem("一括(順Z 2x2)");
JMenuItem item4 = new JMenuItem("一括(逆Z 2x2)");
JMenuItem item5 = new JMenuItem("一括(順Z 3x3)");
JMenuItem item6 = new JMenuItem("一括(逆Z 3x3)");
item0.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateSplitTypeAll(SplitFilter.TYPE_NONE);
}
});
item1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateSplitTypeAll(SplitFilter.TYPE_R2L_2);
}
});
item2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateSplitTypeAll(SplitFilter.TYPE_L2R_2);
}
});
item3.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateSplitTypeAll(SplitFilter.TYPE_R2L_2x2);
}
});
item4.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateSplitTypeAll(SplitFilter.TYPE_L2R_2x2);
}
});
item5.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateSplitTypeAll(SplitFilter.TYPE_R2L_3x3);
}
});
item6.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
updateSplitTypeAll(SplitFilter.TYPE_L2R_3x3);
}
});
popup.add(item0);
popup.add(item1);
popup.add(item2);
popup.add(item3);
popup.add(item4);
popup.add(item5);
popup.add(item6);
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
});
final JTable table = this;
this.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
if(javax.swing.SwingUtilities.isRightMouseButton(e)){
int column = getTableHeader().columnAtPoint(e.getPoint());
System.out.println("click col=" + column);
JPopupMenu popup = new JPopupMenu();
JMenuItem item0 = new JMenuItem("選択アイテム削除");
item0.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
//int listIndex = 0;
for(int i=0; i<rowCount; i++){
if(table.isRowSelected(i)){
mInfoList.get(i).setEnable(false);
//mInfoList.remove(listIndex);
//continue;
}
//listIndex++;
}
renewalList();
//int selected = table.getSelectedRow();
//deleteItem(selected);
}
});
JMenuItem item1 = new JMenuItem("選択アイテム削除取り消し");
item1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
//int listIndex = 0;
for(int i=0; i<rowCount; i++){
if(table.isRowSelected(i)){
mInfoList.get(i).setEnable(true);
//mInfoList.remove(listIndex);
//continue;
}
//listIndex++;
}
renewalList();
//int selected = table.getSelectedRow();
//deleteItem(selected);
}
});
JMenuItem item2 = new JMenuItem("選択アイテム種別変更(カラー)");
item2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
//int listIndex = 0;
for(int i=0; i<rowCount; i++){
if(table.isRowSelected(i)){
IImageFileInfo info = mInfoList.get(i);
info.getFilterParam().setPageType(Constant.PAGETYPE_COLOR);
//mInfoList.remove(listIndex);
//continue;
}
//listIndex++;
}
renewalList();
//int selected = table.getSelectedRow();
//deleteItem(selected);
}
});
JMenuItem item3 = new JMenuItem("選択アイテム種別変更(挿絵)");
item3.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
//int listIndex = 0;
for(int i=0; i<rowCount; i++){
if(table.isRowSelected(i)){
IImageFileInfo info = mInfoList.get(i);
info.getFilterParam().setPageType(Constant.PAGETYPE_PICT);
//mInfoList.remove(listIndex);
//continue;
}
//listIndex++;
}
renewalList();
//int selected = table.getSelectedRow();
//deleteItem(selected);
}
});
JMenuItem item4 = new JMenuItem("選択アイテム種別変更(本文)");
item4.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
//int listIndex = 0;
for(int i=0; i<rowCount; i++){
if(table.isRowSelected(i)){
IImageFileInfo info = mInfoList.get(i);
info.getFilterParam().setPageType(Constant.PAGETYPE_TEXT);
//mInfoList.remove(listIndex);
//continue;
}
//listIndex++;
}
renewalList();
//int selected = table.getSelectedRow();
//deleteItem(selected);
}
});
JMenuItem item5 = new JMenuItem("選択アイテム種別変更(未設定)");
item5.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
//int listIndex = 0;
for(int i=0; i<rowCount; i++){
if(table.isRowSelected(i)){
IImageFileInfo info = mInfoList.get(i);
info.getFilterParam().setPageType(Constant.PAGETYPE_AUTO);
//mInfoList.remove(listIndex);
//continue;
}
//listIndex++;
}
renewalList();
//int selected = table.getSelectedRow();
//deleteItem(selected);
}
});
popup.add(item0);
popup.add(item1);
popup.add(item2);
popup.add(item3);
popup.add(item4);
popup.add(item5);
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
mTableModel.addTableModelListener(new TableModelListener(){
@Override
public void tableChanged(TableModelEvent event) {
int row = event.getLastRow();
int col = event.getColumn();
if(row >= 0 && col >= 0){
String value = (String)mTableModel.getValueAt(row, col);
onTableCellChanged(row, col, value);
}
}
});
// PageType Column
JComboBox pageBox = new JComboBox(new String[] {
Constant.TEXT_PAGETYPE_AUTO,
Constant.TEXT_PAGETYPE_TEXT,
Constant.TEXT_PAGETYPE_PICT,
Constant.TEXT_PAGETYPE_COLOR,
});
pageBox.setBorder(BorderFactory.createEmptyBorder());
TableColumn pageTypeColum = getColumnModel().getColumn(Constant.TABLE_COLUMN_PAGETYPE);
pageTypeColum.setCellEditor(new DefaultCellEditor(pageBox));
// SplitType Column
JComboBox splitBox = new JComboBox(new String[]{
Constant.TEXT_SPLITTYPE_NONE,
Constant.TEXT_SPLITTYPE_R2L,
Constant.TEXT_SPLITTYPE_L2R,
Constant.TEXT_SPLITTYPE_R2L_2x2,
Constant.TEXT_SPLITTYPE_L2R_2x2,
Constant.TEXT_SPLITTYPE_R2L_3x3,
Constant.TEXT_SPLITTYPE_L2R_3x3,
});
splitBox.setBorder(BorderFactory.createEmptyBorder());
TableColumn splitTypeColum = getColumnModel().getColumn(Constant.TABLE_COLUMN_SPLITTYPE);
splitTypeColum.setCellEditor(new DefaultCellEditor(splitBox));
// PageSpread Column
JComboBox spreadBox = new JComboBox(new String[]{
Constant.PAGESPREAD_AUTO,
Constant.PAGESPREAD_CENTER,
Constant.PAGESPREAD_LEFT,
Constant.PAGESPREAD_RIGHT,
});
spreadBox.setBorder(BorderFactory.createEmptyBorder());
TableColumn spreadTypeColum = getColumnModel().getColumn(Constant.TABLE_COLUMN_PAGESPREAD);
spreadTypeColum.setCellEditor(new DefaultCellEditor(spreadBox));
}
public void deleteItem(int row){
if(mInfoList != null){
if(row < 0 || mInfoList.size() <= row){
return;
}
IImageFileInfoList list = mInfoList;
list.remove(row);
setImageFileInfoList(list);
}
}
public void renewalList(){
if(mInfoList != null){
setImageFileInfoList(mInfoList.renew());
mEventSender.setModified();
}
}
@Override
public void onEventReceived(int type, int arg1, int arg2, Object obj) {
switch(type){
case EventObserver.EventType_UpdateFileInfo:
IImageFileInfo info = mInfoList.get(arg1);
updateData(arg1, info);
break;
case EventObserver.EventType_MoveInfo:
int nextIndex = getSelectedRow() + arg1;
if(nextIndex >= 0 && getRowCount() > nextIndex){
setRowSelectionInterval(nextIndex, nextIndex);
scrollRectToVisible(new Rectangle(getCellRect(nextIndex, 0, true)));
}
break;
case EventObserver.EventType_RenewalList:
renewalList();
break;
default:
break;
}
}
}