package open.dolphin.client;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseListener;
import java.text.MessageFormat;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.text.BadLocationException;
import open.dolphin.infomodel.IInfoModel;
import open.dolphin.infomodel.ModelUtils;
import open.dolphin.project.Project;
/**
* 2号カルテクラス。
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class KarteViewer2 extends KarteViewer {
/**
* Creates new KarteViewer
*/
public KarteViewer2() {
}
@Override
public int getActualHeight() {
try {
JTextPane pane = soaPane.getTextPane();
int pos = pane.getDocument().getLength();
Rectangle r = pane.modelToView(pos);
int hsoa = r.y;
pane = pPane.getTextPane();
pos = pane.getDocument().getLength();
r = pane.modelToView(pos);
int hp = r.y;
return Math.max(hsoa, hp);
} catch (BadLocationException ex) {
ex.printStackTrace(System.err);
}
return 0;
}
@Override
public void adjustSize() {
int h = getActualHeight();
int soaWidth = soaPane.getTextPane().getPreferredSize().width;
int pWidth = pPane.getTextPane().getPreferredSize().width;
soaPane.getTextPane().setPreferredSize(new Dimension(soaWidth, h));
pPane.getTextPane().setPreferredSize(new Dimension(pWidth, h));
}
/**
* P Pane を返す。
* @return pPane
*/
public KartePane getPPane() {
return pPane;
}
/**
* 2号カルテで初期化する。
*/
private void initialize() {
KartePanel2M kp2 = new KartePanel2M();
panel2 = kp2;
// TimeStampLabel を生成する
timeStampLabel = kp2.getTimeStampLabel();
timeStampLabel.setHorizontalAlignment(SwingConstants.CENTER);
timeStampLabel.setForeground(GUIConst.KARTE_TIME_STAMP_FORE_COLOR);
timeStampLabel.setFont(timeStampFont);
//s.oh^ 2013/01/29 過去カルテの修正操作(選択状態)
//kp2.getTimeStampPanel().setBackground(KarteDocumentViewer.DEFAULT_BGCOLOR);
//timeStampLabel.setBackground(KarteDocumentViewer.DEFAULT_BGCOLOR);
//timeStampLabel.setForeground(KarteDocumentViewer.DEFAULT_FGCOLOR);
//s.oh$
// SOA Pane を生成する
soaPane = new KartePane();
soaPane.setTextPane(kp2.getSoaTextPane());
soaPane.setRole(IInfoModel.ROLE_SOA);
if (model != null) {
// Schema 画像にファイル名を付けるのために必要
String docId = model.getDocInfoModel().getDocId();
soaPane.setDocId(docId);
}
// P Pane を生成する
pPane = new KartePane();
pPane.setTextPane(kp2.getPTextPane());
pPane.setRole(IInfoModel.ROLE_P);
//s.oh^ 2014/01/27 スタンプのテキストコピー機能拡張
if(getContext() != null && getContext().getPatient() != null) {
soaPane.setPatID(getContext().getPatient().getPatientId());
pPane.setPatID(getContext().getPatient().getPatientId());
}
//s.oh$
setUI(kp2);
}
/**
* プログラムを開始する。
*/
@Override
public void start() {
// Creates GUI
this.initialize();
// Model を表示する
if (this.getModel() != null) {
String dateFmt = ClientContext.getBundle().getString("KARTE_DATE_FORMAT");
String selfPrefix = ClientContext.getClaimBundle().getString("INSURANCE_SELF_PREFIX");
// 確定日を分かりやすい表現に変える
String timeStamp = ModelUtils.getDateAsFormatString(
model.getDocInfoModel().getFirstConfirmDate(),
dateFmt);
if (model.getDocInfoModel().getStatus().equals(IInfoModel.STATUS_TMP)) {
// (予定カルテ対応)
Color bkColor = model.getDocInfoModel().isScheduled() ? GUIConst.SCHEDULE_KARTE_BK_COLOR : GUIConst.TEMP_SAVE_KARTE_BK_COLOR;
Color foreColor = model.getDocInfoModel().isScheduled() ? GUIConst.SCHEDULE_KARTE_FORE_COLOR : GUIConst.TEMP_SAVE_KARTE_FORE_COLOR;
String underTemp = ClientContext.getMyBundle(KarteViewer2.class).getString("messageFormat.temporarySave");
MessageFormat msf = new MessageFormat(underTemp);
timeStamp = msf.format(new Object[]{timeStamp});
// 背景が DarkBlue、foreを白にする
KartePanel2M kp2 = (KartePanel2M)panel2;
kp2.getTimeStampPanel().setOpaque(true);
kp2.getTimeStampPanel().setBackground(bkColor);
timeStampLabel.setOpaque(true);
timeStampLabel.setBackground(bkColor);
timeStampLabel.setForeground(foreColor);
}
//s.oh^ 2014/10/07 自費カルテタイトル帯色変更
else if(model.getDocInfoModel().getHealthInsurance().startsWith(selfPrefix)) {
KartePanel2M kp2 = (KartePanel2M)panel2;
kp2.getTimeStampPanel().setOpaque(true);
kp2.getTimeStampPanel().setBackground(Color.YELLOW);
timeStampLabel.setOpaque(true);
timeStampLabel.setBackground(Color.YELLOW);
}
//s.oh$
//s.oh^ 2014/05/19 カルテタイトルのユーザ名非表示
//if (model.getUserModel().getCommonName()!=null) {
if (model.getUserModel().getCommonName()!=null && !Project.getBoolean("karte.title.username.hide")) {
//s.oh$
StringBuilder sb = new StringBuilder();
sb.append(timeStamp).append(" ").append(model.getUserModel().getCommonName());
timeStamp = sb.toString();
}
//s.oh^ 2014/08/26 修正時の保険表示
String ins = model.getDocInfoModel().getHealthInsuranceDesc();
if(ins != null) {
StringBuilder sb = new StringBuilder();
sb.append(timeStamp).append(" (").append(ins).append(")");
timeStamp = sb.toString();
}
//s.oh$
timeStampLabel.setText(timeStamp);
KarteRenderer_2 renderer = new KarteRenderer_2(soaPane, pPane);
renderer.render(model);
}
// モデル表示後にリスナ等を設定する
ChartMediator mediator = getContext().getChartMediator();
soaPane.init(false, mediator);
pPane.init(false, mediator);
// 自分でエンターしている
enter();
}
@Override
public void enter() {
super.enter();
boolean sendOk = true;
sendOk = sendOk && (getContext().isSendClaim());
sendOk = sendOk && (model!=null);
sendOk = sendOk && (model!=null && model.getDocInfoModel().getDocType().equals(IInfoModel.DOCTYPE_KARTE)); // karte のみ
sendOk = sendOk && (model!=null && (!model.getDocInfoModel().getStatus().equals(IInfoModel.STATUS_TMP))); // 仮保存でないこと
ChartMediator mediator = getContext().getChartMediator();
mediator.getAction(GUIConst.ACTION_SEND_CLAIM).setEnabled(sendOk);
}
@Override
public void stop() {
soaPane.clear();
pPane.clear();
}
@Override
public void addMouseListener(MouseListener ml) {
soaPane.getTextPane().addMouseListener(ml);
pPane.getTextPane().addMouseListener(ml);
}
}