/*
* AppointTablePanel.java
* Copyright (C) 2002 Dolphin Project. All rights reserved.
* Copyright (C) 2004 Digital Globe, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package open.dolphin.impl.care;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
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.Collections;
import java.util.List;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import open.dolphin.client.AutoKanjiListener;
import open.dolphin.client.ClientContext;
import open.dolphin.infomodel.AppointmentModel;
import open.dolphin.infomodel.ModelUtils;
import open.dolphin.project.Project;
import open.dolphin.table.ListTableModel;
import open.dolphin.table.StripeTableCellRenderer;
import open.dolphin.util.MMLDate;
/**
* AppointTablePanel
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class AppointTablePanel extends JPanel implements PropertyChangeListener {
// private final String[] COLUMN_NAMES = ClientContext.getStringArray("appoint.table.columnNames");
private final int[] COLUMN_WIDTH = {90, 90,300};
private final int NUM_ROWS = 0;
private final int MEMO_COLUMN = 2;
private CareTableModel tableModel;
private JTable careTable;
private TodayRowRenderer todayRenderer;
private String today; // = "2003-02-21";
private CareMapDocument parent;
//private boolean dirty;
/** Creates new AppointTablePanel
* @param updateBtn */
public AppointTablePanel(JButton updateBtn) {
super(new BorderLayout(0, 5));
todayRenderer = new TodayRowRenderer();
String columnLine = ClientContext.getMyBundle(AppointTablePanel.class).getString("columnNames");
String [] columnNames = columnLine.split(",");
tableModel = new CareTableModel(columnNames, NUM_ROWS);
careTable = new JTable(tableModel) {
@Override
public TableCellRenderer getCellRenderer(int row, int col) {
AppointmentModel e = (AppointmentModel)tableModel.getObject(row);
if (e != null && e.getDate() != null) {
String test = ModelUtils.getDateAsString(e.getDate());
if (test.equals(today)) {
Color c = parent.getAppointColor(e.getName());
todayRenderer.setBackground(c);
return todayRenderer;
} else {
return super.getCellRenderer(row, col);
}
} else {
return super.getCellRenderer(row, col);
}
}
};
careTable.setSurrendersFocusOnKeystroke(true);
careTable.setRowSelectionAllowed(true);
//careTable.setDefaultRenderer(Object.class, new OddEvenRowRenderer());
StripeTableCellRenderer rederer = new StripeTableCellRenderer();
rederer.setTable(careTable);
rederer.setDefaultRenderer();
careTable.setRowHeight(ClientContext.getMoreHigherRowHeight());
// CellEditor を設定する
// NAME_COL clickCountToStart=1, IME=ON
TableColumn column = careTable.getColumnModel().getColumn(MEMO_COLUMN);
JTextField tf = new JTextField();
tf.addFocusListener(AutoKanjiListener.getInstance());
DefaultCellEditor de = new DefaultCellEditor(tf);
int ccts = Project.getInt("order.table.clickCountToStart", 1);
de.setClickCountToStart(ccts);
column.setCellEditor(de);
// Set the column width
if (COLUMN_WIDTH != null) {
int len = COLUMN_WIDTH.length;
for (int i = 0; i < len; i++) {
column = careTable.getColumnModel().getColumn(i);
column.setPreferredWidth(COLUMN_WIDTH[i]);
}
}
//careTable.setPreferredSize(new Dimension(500, 200));
//-----------------------------------------------
// Copy 機能を実装する
//-----------------------------------------------
KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
String actionText = ClientContext.getMyBundle(AppointTablePanel.class).getString("actionText.copy");
final AbstractAction copyAction = new AbstractAction(actionText) {
@Override
public void actionPerformed(ActionEvent ae) {
copyRow();
}
};
careTable.getInputMap().put(copy, "Copy");
careTable.getActionMap().put("Copy", copyAction);
// 右クリックコピー
careTable.addMouseListener(new MouseAdapter() {
private void mabeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
int row = careTable.rowAtPoint(e.getPoint());
if (row < 0) {
return;
}
JPopupMenu pop = new JPopupMenu();
JMenuItem item2 = new JMenuItem(copyAction);
pop.add(item2);
pop.show(e.getComponent(), e.getX(), e.getY());
}
}
@Override
public void mousePressed(MouseEvent e) {
mabeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
mabeShowPopup(e);
}
});
JScrollPane scroller = new JScrollPane(careTable,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JPanel cmd = new JPanel(new FlowLayout());
cmd.add(updateBtn);
updateBtn.setMargin(new Insets(0,0,0,0)); //2,2,2,2
this.add(cmd, BorderLayout.EAST);
this.add(scroller, BorderLayout.CENTER);
today = MMLDate.getDate();
}
public void setParent(CareMapDocument doc) {
parent = doc;
}
/**
* 選択されている行をコピーする。
*/
public void copyRow() {
StringBuilder sb = new StringBuilder();
int numRows = careTable.getSelectedRowCount();
int[] rowsSelected = careTable.getSelectedRows();
int numColumns = careTable.getColumnCount();
for (int i = 0; i < numRows; i++) {
StringBuilder s = new StringBuilder();
for (int col = 0; col < numColumns; col++) {
Object o = careTable.getValueAt(rowsSelected[i], col);
if (o!=null) {
s.append(o.toString());
}
s.append(",");
}
if (s.length()>0) {
s.setLength(s.length()-1);
}
sb.append(s.toString()).append("\n");
}
if (sb.length() > 0) {
StringSelection stsel = new StringSelection(sb.toString());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stsel, stsel);
}
}
@Override
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (prop.equals(CareMapDocument.CALENDAR_PROP)) {
SimpleCalendarPanel[] calendars = (SimpleCalendarPanel[])e.getNewValue();
int len = calendars.length;
ArrayList<AppointmentModel> list = new ArrayList<>();
for (int i = 0; i < len; i++) {
ArrayList<AppointmentModel> results = calendars[i].getAppointDays();
int size = results.size();
for (int k = 0; k < size; k++) {
list.add(results.get(k));
}
}
tableModel.setDataProvider(list);
} else if (prop.equals(CareMapDocument.APPOINT_PROP)) {
AppointmentModel appoint = (AppointmentModel)e.getNewValue();
tableModel.updateAppoint(appoint);
} else if (prop.equals(CareMapDocument.SELECTED_APPOINT_DATE_PROP)) {
findAppoint((String)e.getNewValue());
}
}
private void findAppoint(String date) {
int size = tableModel.getObjectCount();
String val;
for (int i = 0; i < size; i++) {
val = (String)tableModel.getValueAt(i, 0);
if (val.equals(date)) {
careTable.setRowSelectionInterval(i, i);
break;
}
}
}
/**
* AppointmentModel table model
*/
protected class CareTableModel extends ListTableModel<AppointmentModel> {
public CareTableModel(String[] columnNames, int numRows) {
super(columnNames, numRows);
}
@Override
public boolean isCellEditable(int row, int col) {
return (isValidRow(row) && col == MEMO_COLUMN);
}
@Override
public Object getValueAt(int row, int col) {
AppointmentModel entry = getObject(row);
if (entry == null) {
return null;
}
String ret = null;
switch (col) {
case 0:
ret = ModelUtils.getDateAsString(entry.getDate());
break;
case 1:
ret = entry.getName();
break;
case 2:
ret = entry.getMemo();
break;
}
return (Object)ret;
}
@Override
public void setValueAt(Object val, int row, int col) {
String str = (String)val;
if (col != MEMO_COLUMN || str == null || str.trim().equals("")) {
return;
}
AppointmentModel entry = getObject(row);
if (entry != null) {
entry.setMemo(str);
if (entry.getState() == AppointmentModel.TT_HAS) {
entry.setState(AppointmentModel.TT_REPLACE);
}
fireTableCellUpdated(row, col);
//minagawa^ lsctest 保存後の変更
// if (! dirty) {
// dirty = true;
// parent.setDirty(dirty);
// }
parent.setDirty(true);
//minagawa^
}
}
public void updateAppoint(AppointmentModel appoint) {
int row = findAppointEntry(appoint);
int state = appoint.getState();
if (row == -1 && state == AppointmentModel.TT_NEW) {
addAppointEntry(appoint);
} else if (row >= 0) {
if (appoint.getName() != null) {
fireTableRowsUpdated(row, row);
} else {
deleteAt(row);
}
}
}
public void addAppointEntry(AppointmentModel entry) {
addObject(entry);
Collections.sort(getDataProvider());
int index = getObjectCount() -1;
fireTableRowsUpdated(0, index);
}
private int findAppointEntry(AppointmentModel appoint) {
if (getDataProvider() == null) {
return -1;
}
int len = getDataProvider().size();
int row = -1;
for (int i = 0; i < len; i++) {
if (appoint == getObject(i)) {
row = i;
break;
}
}
return row;
}
public Object[] getAppointEntries() {
List list = getDataProvider();
return list != null ? list.toArray() : null;
}
}
protected class TodayRowRenderer extends StripeTableCellRenderer {
public TodayRowRenderer() {
}
}
}