package open.dolphin.impl.care; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import javax.swing.*; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; import open.dolphin.client.ImageEntry; import open.dolphin.delegater.DocumentDelegater; import open.dolphin.dto.ImageSearchSpec; import open.dolphin.helper.DBTask; import open.dolphin.infomodel.SchemaModel; /** * ImageHistoryPanel * * @author Kazushi Minagawa */ public class ImageHistoryPanel extends JPanel implements PropertyChangeListener { private String pid; private CareMapDocument myParent; private ImageTableModel tModel; private JTable table; private int columnCount = 5; private int imageWidth = 132; private int imageHeight = 132; private javax.swing.Timer taskTimer; public ImageHistoryPanel() { super(new BorderLayout()); tModel = new ImageTableModel(); table = new JTable(tModel); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setCellSelectionEnabled(true); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); TableColumn column; for (int i = 0; i < columnCount; i++) { column = table.getColumnModel().getColumn(i); column.setPreferredWidth(imageWidth); } table.setRowHeight(imageHeight + 20); ImageRenderer imageRenderer = new ImageRenderer(); imageRenderer.setHorizontalAlignment(SwingConstants.CENTER); table.setDefaultRenderer(java.lang.Object.class, imageRenderer); table.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() != 2) { return; } Point loc = e.getPoint(); int row = table.rowAtPoint(loc); int col = table.columnAtPoint(loc); if (row != -1 && col != -1) { openImage(row, col); } } }); JScrollPane scroller = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); this.add(scroller, BorderLayout.CENTER); } public String getPid() { return pid; } public void setPid(String val) { pid = val; } public void setMyParent(CareMapDocument doc) { myParent = doc; } @SuppressWarnings("unchecked") public void setImageList(List allImages) { if (allImages != null) { int size = allImages.size(); List list = new ArrayList(); for (int i = 0; i < size; i++) { ArrayList l = (ArrayList) allImages.get(i); if (l != null) { for (int j = 0; j < l.size(); j++) { list.add(l.get(j)); } } } tModel.setImageList(list); } else { tModel.setImageList(allImages); } } @Override public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (prop.equals(CareMapDocument.SELECTED_DATE_PROP)) { String date = (String) e.getNewValue(); findDate(date); } } private void findDate(String date) { int index = tModel.findDate(date); if (index != -1) { int row = index / columnCount; int col = index % columnCount; table.setRowSelectionInterval(row, row); table.setColumnSelectionInterval(col, col); } } private void openImage(int row, int col) { ImageEntry entry = (ImageEntry) tModel.getValueAt(row, col); final ImageSearchSpec spec = new ImageSearchSpec(); spec.setCode(ImageSearchSpec.ID_SEARCH); spec.setId(entry.getId()); final DocumentDelegater ddl = new DocumentDelegater(); DBTask task = new DBTask<SchemaModel, Void>(myParent.getContext()) { @Override public SchemaModel doInBackground() throws Exception { return ddl.getImage(spec.getId()); } @Override public void succeeded(SchemaModel result) { openDialog(result); } }; task.execute(); } private void openDialog(SchemaModel schema) { } protected class ImageTableModel extends AbstractTableModel { private static final long serialVersionUID = -2683619747572366737L; private List imageList; @Override public int getColumnCount() { return columnCount; } @Override public int getRowCount() { if (imageList == null) { return 0; } int size = imageList.size(); int rowCount = size / columnCount; return ((size % columnCount) != 0) ? rowCount + 1 : rowCount; } @Override public Object getValueAt(int row, int col) { int index = row * columnCount + col; if (!isValidIndex(index)) { return null; } ImageEntry s = (ImageEntry) imageList.get(index); return (Object) s; } public void setImageList(List list) { if (imageList != null) { int last = getRowCount(); imageList.clear(); fireTableRowsDeleted(0, last); } imageList = list; int last = getRowCount(); fireTableRowsInserted(0, last); } private int findDate(String date) { int ret = -1; if (imageList == null) { return ret; } int size = imageList.size(); for (int i = 0; i < size; i++) { ImageEntry entry = (ImageEntry) imageList.get(i); if (entry.getConfirmDate().startsWith(date)) { ret = i; break; } } return ret; } private boolean isValidIndex(int index) { return (imageList != null && index >= 0 && index < imageList.size()); } } protected class ImageRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = -8136363583689791913L; public ImageRenderer() { setVerticalTextPosition(JLabel.BOTTOM); setHorizontalTextPosition(JLabel.CENTER); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean isFocused, int row, int col) { Component compo = super.getTableCellRendererComponent(table, value, isSelected, isFocused, row, col); JLabel l = (JLabel) compo; if (value != null) { ImageEntry entry = (ImageEntry) value; l.setIcon(entry.getImageIcon()); l.setText(entry.getConfirmDate().substring(0, 10)); } else { l.setIcon(null); } return compo; } } }