package open.dolphin.client;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import open.dolphin.delegater.DocumentDelegater;
import open.dolphin.helper.DBTask;
import open.dolphin.infomodel.AllergyModel;
import open.dolphin.infomodel.IInfoModel;
import open.dolphin.infomodel.ModelUtils;
import open.dolphin.infomodel.ObservationModel;
import open.dolphin.project.Project;
import open.dolphin.table.ListTableModel;
import open.dolphin.table.StripeTableCellRenderer;
/**
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public final class AllergyInspector {
// TableModel
private ListTableModel<AllergyModel> tableModel;
// コンテナパネル
private AllergyView view;
// Chart
private final ChartImpl context;
/**
* AllergyInspectorオブジェクトを生成する。
* @param context
*/
public AllergyInspector(ChartImpl context) {
this.context = context;
initComponents();
update();
}
public Chart getContext() {
return context;
}
/**
* レイアウトパネルを返す。
* @return
*/
public JPanel getPanel() {
return (JPanel) view;
}
public void clear() {
tableModel.clear();
}
/**
* GUIコンポーネントを初期化する。
*/
private void initComponents() {
view = new AllergyView();
// // アレルギーテーブルを設定する
// String[] columnNames = ClientContext.getStringArray("patientInspector.allergyInspector.columnNames");
// String[] methodNames = ClientContext.getStringArray("patientInspector.allergyInspector.methodNames");
// tableModel = new ListTableModel<AllergyModel>(columnNames, 0, methodNames, null);
// view.getTable().setModel(tableModel);
// view.getTable().setFillsViewportHeight(true);
// //view.getTable().setRowHeight(ClientContext.getHigherRowHeight());
// view.getTable().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
////s.oh^ 2014/04/02 閲覧権限の制御
// //view.getTable().setToolTipText("追加・削除は右クリックで行います。");
// if(!context.isReadOnly()) {
// view.getTable().setToolTipText("追加・削除は右クリックで行います。");
// }
////s.oh$
java.util.ResourceBundle bundle = ClientContext.getMyBundle(AllergyInspector.class);
String[] columnNames = bundle.getString("columnsLine.table").split(",");
String[] methodNames = bundle.getString("methodsLine.table").split(",");
tableModel = new ListTableModel<>(columnNames, 0, methodNames, null);
view.getTable().setModel(tableModel);
view.getTable().setFillsViewportHeight(true);
view.getTable().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
if(!context.isReadOnly()) {
String toolTipText = bundle.getString("toolTipText.table");
view.getTable().setToolTipText(toolTipText);
}
// レンダラを設定する
StripeTableCellRenderer rederer = new StripeTableCellRenderer();
rederer.setTable(view.getTable());
rederer.setDefaultRenderer();
// 選択したアレルギーのメモを表示する
ListSelectionModel slm = view.getTable().getSelectionModel();
slm.addListSelectionListener((ListSelectionEvent lse) -> {
if (!lse.getValueIsAdjusting()) {
int index = view.getTable().getSelectedRow();
AllergyModel allergy = tableModel.getObject(index);
if (allergy!=null && allergy.getMemo()!=null) {
view.getMemoFld().setText(allergy.getMemo());
} else {
view.getMemoFld().setText("");
}
}
});
//-----------------------------------------------
// Copy 機能を実装する
//-----------------------------------------------
KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
String copyText = bundle.getString("actionText.copy");
final AbstractAction copyAction = new AbstractAction(copyText) {
@Override
public void actionPerformed(ActionEvent ae) {
copyRow();
}
};
view.getTable().getInputMap().put(copy, "Copy");
view.getTable().getActionMap().put("Copy", copyAction);
//minagawa^ 排他制御
// 右クリックによる追加削除のメニューを登録する
if (!context.isReadOnly()) {
view.getTable().addMouseListener(new MouseAdapter() {
private void mabeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
JPopupMenu pop = new JPopupMenu();
String addText = ClientContext.getMyBundle(AllergyInspector.class).getString("menuText.add");
JMenuItem item = new JMenuItem(addText);
pop.add(item);
item.addActionListener((ActionEvent e1) -> {
AllergyEditor ae = new AllergyEditor(AllergyInspector.this);
});
final int row = view.getTable().rowAtPoint(e.getPoint());
if (tableModel.getObject(row) != null) {
pop.add(new JSeparator());
JMenuItem item2 = new JMenuItem(copyAction);
pop.add(item2);
String deleteText = ClientContext.getMyBundle(AllergyInspector.class).getString("menuText.delete");
JMenuItem item3 = new JMenuItem(deleteText);
pop.add(item3);
item3.addActionListener((ActionEvent e1) -> {
delete(row);
});
}
pop.show(e.getComponent(), e.getX(), e.getY());
}
}
@Override
public void mousePressed(MouseEvent e) {
mabeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
mabeShowPopup(e);
}
});
}
}
private void scroll(boolean ascending) {
int cnt = tableModel.getObjectCount();
if (cnt > 0) {
int row = 0;
if (ascending) {
row = cnt - 1;
}
Rectangle r = view.getTable().getCellRect(row, row, true);
view.getTable().scrollRectToVisible(r);
}
}
/**
* アレルギー情報を表示する。
*/
public void update() {
List<AllergyModel> list = context.getKarte().getAllergies();
if (list != null && list.size() >0) {
boolean asc = Project.getBoolean(Project.DOC_HISTORY_ASCENDING, false);
if (asc) {
Collections.sort(list);
} else {
Collections.sort(list, Collections.reverseOrder());
}
tableModel.setDataProvider(list);
scroll(asc);
}
}
/**
* アレルギーデータを追加する。
* @param model
*/
public void add(final AllergyModel model) {
// GUI の同定日をTimeStampに変更する
Date date = ModelUtils.getDateTimeAsObject(model.getIdentifiedDate()+"T00:00:00");
final List<ObservationModel> addList = new ArrayList<>(1);
ObservationModel observation = new ObservationModel();
observation.setKarteBean(context.getKarte());
observation.setUserModel(Project.getUserModel());
observation.setObservation(IInfoModel.OBSERVATION_ALLERGY);
observation.setPhenomenon(model.getFactor());
observation.setCategoryValue(model.getSeverity());
observation.setConfirmed(date);
observation.setRecorded(new Date());
observation.setStarted(date);
observation.setStatus(IInfoModel.STATUS_FINAL);
observation.setMemo(model.getMemo());
addList.add(observation);
DBTask task = new DBTask<List<Long>, Void>(context) {
@Override
protected List<Long> doInBackground() throws Exception {
DocumentDelegater ddl = new DocumentDelegater();
List<Long> ids = ddl.addObservations(addList);
return ids;
}
@Override
protected void succeeded(List<Long> result) {
model.setObservationId(result.get(0));
boolean asc = Project.getBoolean(Project.DOC_HISTORY_ASCENDING, false);
if (asc) {
tableModel.addObject(model);
} else {
tableModel.addObject(0, model);
}
scroll(asc);
}
};
task.execute();
}
/**
* 選択されている行をコピーする。
*/
public void copyRow() {
StringBuilder sb = new StringBuilder();
int numRows = view.getTable().getSelectedRowCount();
int[] rowsSelected = view.getTable().getSelectedRows();
for (int i = 0; i < numRows; i++) {
AllergyModel am = tableModel.getObject(rowsSelected[i]);
if (am!=null) {
sb.append(am.toString()).append("\n");
}
// 最後の改行を除く
if (sb.length()>0) {
sb.setLength(sb.length()-1);
}
}
if (sb.length() > 0) {
StringSelection stsel = new StringSelection(sb.toString());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stsel, stsel);
}
}
/**
* テーブルで選択したアレルギーを削除する。
* @param row
*/
public void delete(final int row) {
AllergyModel model = (AllergyModel) tableModel.getObject(row);
if (model == null) {
return;
}
final List<Long> list = new ArrayList<>(1);
list.add(model.getObservationId());
DBTask task = new DBTask<Void, Void>(this.context) {
@Override
protected Void doInBackground() throws Exception {
DocumentDelegater ddl = new DocumentDelegater();
ddl.removeObservations(list);
return null;
}
@Override
protected void succeeded(Void result) {
tableModel.deleteAt(row);
}
};
task.execute();
}
}