package open.dolphin.client;
import java.awt.Toolkit;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import open.dolphin.infomodel.IInfoModel;
import open.dolphin.infomodel.InfoModelTransferable;
import open.dolphin.infomodel.ModuleInfoBean;
import open.dolphin.infomodel.RegisteredDiagnosisModel;
import open.dolphin.stampbox.StampTreeNode;
import open.dolphin.table.ListTableModel;
/**
* DiagnosisTransferHandler
*
* @author Minagawa,Kazushi
*
*/
public class DiagnosisTransferHandler extends TransferHandler {
private final DiagnosisDocument parent;
public DiagnosisTransferHandler(DiagnosisDocument parent) {
super();
this.parent = parent;
}
@Override
protected Transferable createTransferable(JComponent c) {
JTable sourceTable = (JTable)c;
ListTableModel<RegisteredDiagnosisModel> tableModel = (ListTableModel<RegisteredDiagnosisModel>)sourceTable.getModel();
RegisteredDiagnosisModel dragItem = tableModel.getObject(sourceTable.getSelectedRow());
return dragItem != null ? new InfoModelTransferable(dragItem) : null;
}
@Override
public int getSourceActions(JComponent c) {
return COPY;
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
if (!canImport(support)) {
return false;
}
if (support.isDataFlavorSupported(LocalStampTreeNodeTransferable.localStampTreeNodeFlavor)) {
return importFromStampTree(support);
} else if (support.isDataFlavorSupported(InfoModelTransferable.infoModelFlavor)) {
return importFromInfoModel(support);
}
return false;
}
/**
* StampTreeからの Drop/Paste をインポートする
* @param support TransferHandler.TransferSupport
* @return 成功した時 true
*/
private boolean importFromStampTree(TransferHandler.TransferSupport support) {
try {
int toIndex = 0;
Transferable t = support.getTransferable();
// Dropされたノードを取得する
StampTreeNode importNode = (StampTreeNode)t.getTransferData(LocalStampTreeNodeTransferable.localStampTreeNodeFlavor);
// Import するイストを生成する
ArrayList<ModuleInfoBean> importList = new ArrayList<>(3);
// 葉の場合
if (importNode.isLeaf()) {
ModuleInfoBean stampInfo = (ModuleInfoBean)importNode.getStampInfo();
if (stampInfo.getEntity().equals(IInfoModel.ENTITY_DIAGNOSIS)) {
if (stampInfo.isSerialized()) {
importList.add(stampInfo);
} else {
parent.openEditor2();
return true;
}
} else {
Toolkit.getDefaultToolkit().beep();
return false;
}
} else {
// Dropされたノードの葉を列挙する
Enumeration e = importNode.preorderEnumeration();
while (e.hasMoreElements()) {
StampTreeNode node = (StampTreeNode)e.nextElement();
if (node.isLeaf()) {
ModuleInfoBean stampInfo = (ModuleInfoBean)node.getStampInfo();
if (stampInfo.isSerialized() && (stampInfo.getEntity().equals(IInfoModel.ENTITY_DIAGNOSIS)) ) {
importList.add(stampInfo);
}
}
}
}
// まとめてデータベースからフェッチしインポートする
if (!importList.isEmpty()) {
parent.importStampList(importList, toIndex);
return true;
} else {
return false;
}
} catch (UnsupportedFlavorException | IOException ioe) {
ioe.printStackTrace(System.err);
}
return false;
}
/**
* 傷病名Tableからの Paste をインポートする
* @param support TransferHandler.TransferSupport
* @return 成功した時 true
*/
private boolean importFromInfoModel(TransferHandler.TransferSupport support) {
try {
RegisteredDiagnosisModel rd = (RegisteredDiagnosisModel)support.getTransferable().getTransferData(InfoModelTransferable.infoModelFlavor);
JTable diagTable = (JTable)support.getComponent();
ListTableModel<RegisteredDiagnosisModel> tableModel = (ListTableModel<RegisteredDiagnosisModel>)diagTable.getModel();
int selectIndex = diagTable.getSelectedRow();
if (selectIndex>=0 && selectIndex<tableModel.getObjectCount()) {
tableModel.addObject(selectIndex, rd);
} else {
tableModel.addObject(0,rd);
}
return true;
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace(System.err);
}
return false;
}
/**
* インポート可能かどうかを返す。
* @return
*/
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
boolean ok = support.isDataFlavorSupported(LocalStampTreeNodeTransferable.localStampTreeNodeFlavor);
ok = ok || (!support.isDrop() && support.isDataFlavorSupported(InfoModelTransferable.infoModelFlavor));
return ok;
}
@Override
public boolean importData(JComponent c, Transferable t) {
TransferHandler.TransferSupport support = new TransferHandler.TransferSupport(c,t);
return importData(support);
}
}