package open.dolphin.client; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Rectangle; import java.awt.event.MouseListener; import java.awt.print.PageFormat; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JTextPane; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.text.BadLocationException; import open.dolphin.infomodel.DocInfoModel; import open.dolphin.infomodel.DocumentModel; import open.dolphin.infomodel.IInfoModel; import open.dolphin.infomodel.ModelUtils; import open.dolphin.letter.KartePDFImpl2; import open.dolphin.project.Project; /** * シングルドキュメントのビュワークラス。 * * @author Kazushi Minagawa, Digital Globe, Inc. */ public class KarteViewer extends AbstractChartDocument implements Comparable { // タイムスタンプのフォントサイズ private static final int TIMESTAMP_FONT_SIZE = 14; // タイムスタンプフォント private static final Font TIMESTAMP_FONT = new Font("Dialog", Font.PLAIN, TIMESTAMP_FONT_SIZE); //s.oh^ 不具合修正 private static final Font TIMESTAMP_MSFONT = new Font(java.util.ResourceBundle.getBundle("open/dolphin/client/resources/KarteViewer").getString("MS UI GOTHIC"), Font.PLAIN, TIMESTAMP_FONT_SIZE); //s.oh$ // タイムスタンプパネル FlowLayout のマージン private static final int TIMESTAMP_SPACING = 7; // 選択されている時のボーダ色、1.3の赤 private static final Color SELECTED_COLOR = Color.GRAY;//Color.ORANGE;//new Color(255, 0, 153); // 選択された状態のボーダ private static final Border SELECTED_BORDER = BorderFactory.createLineBorder(SELECTED_COLOR); // 選択されていない時のボーダ色 private static final Color NOT_SELECTED_COLOR = new Color(0, 0, 0, 0); // 透明 // 選択されていない状態のボーダ protected static final Border NOT_SELECTED_BORDER = BorderFactory.createLineBorder(NOT_SELECTED_COLOR); //------------------------------------------- // インスタンス変数 //------------------------------------------- // この view のモデル protected DocumentModel model; // タイムスタンプラベル protected JLabel timeStampLabel; // SOA Pane protected KartePane soaPane; // P Pane protected KartePane pPane; // 2号カルテパネル protected Panel2 panel2; // タイムスタンプのフォント //s.oh^ 不具合修正 //protected Font timeStampFont = TIMESTAMP_FONT; protected Font timeStampFont = null; //s.oh$ protected int timeStampSpacing = TIMESTAMP_SPACING; protected boolean avoidEnter; // 選択されているかどうかのフラグ protected boolean selected; /** * Creates new KarteViewer */ public KarteViewer() { //s.oh^ 不具合修正 if(ClientContext.isWin()) { timeStampFont = TIMESTAMP_MSFONT; }else{ timeStampFont = TIMESTAMP_FONT; } //s.oh$ } //s.oh^ 2013/02/07 印刷対応 public JLabel getTimeStampLabel() { return timeStampLabel; } //s.oh$ public int getActualHeight() { try { JTextPane pane = soaPane.getTextPane(); int pos = pane.getDocument().getLength(); Rectangle r = pane.modelToView(pos); int hsoa = r.y; return hsoa; } catch (BadLocationException ex) { ex.printStackTrace(System.err); } return 0; } public void adjustSize() { int h = getActualHeight(); int soaWidth = soaPane.getTextPane().getPreferredSize().width; soaPane.getTextPane().setPreferredSize(new Dimension(soaWidth, h)); } public String getDocType() { if (model != null) { String docType = model.getDocInfoModel().getDocType(); return docType; } return null; } public void setAvoidEnter(boolean b) { avoidEnter = b; } // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // Junzo SATO public void printPanel2(final PageFormat format) { String name = getContext().getPatient().getFullName(); boolean printName = true; if (pPane==null) { printName = printName && Project.getBoolean("plain.print.patinet.name"); } panel2.printPanel(format, 1, false, name, getActualHeight()+60, printName); } public void printPanel2(final PageFormat format, final int copies, final boolean useDialog) { String name = getContext().getPatient().getFullName(); boolean printName = true; if (pPane==null) { printName = printName && Project.getBoolean("plain.print.patinet.name"); } panel2.printPanel(format, copies, useDialog, name, getActualHeight()+60, printName); } @Override public void print() { //s.oh^ 2013/02/07 印刷対応 //PageFormat pageFormat = getContext().getContext().getPageFormat(); //this.printPanel2(pageFormat); if(Project.getBoolean(Project.KARTE_PRINT_PDF)) { printPDF(); }else{ PageFormat pageFormat = getContext().getContext().getPageFormat(); this.printPanel2(pageFormat); } } //s.oh^ 2013/02/07 印刷対応 private void printPDF() { StringBuilder sb = new StringBuilder(); sb.append(ClientContext.getTempDirectory()); KartePaneDumper_2 dumper; KartePaneDumper_2 pdumper; dumper = new KartePaneDumper_2(); pdumper = new KartePaneDumper_2(); KarteStyledDocument doc = (KarteStyledDocument)soaPane.getTextPane().getDocument(); dumper.dump(doc); KarteStyledDocument pdoc = (KarteStyledDocument)pPane.getTextPane().getDocument(); pdumper.dump(pdoc); //if(dumper != null && pdumper != null) { //s.oh^ 2013/06/14 自費の場合、印刷時に文言を付加する //KartePDFImpl2 pdf = new KartePDFImpl2(sb.toString(), null, // getContext().getPatient().getPatientId(), getContext().getPatient().getFullName(), // timeStampLabel.getText(), // new Date(), dumper, pdumper); StringBuilder sbTitle = new StringBuilder(); sbTitle.append(timeStampLabel.getText()); String prefix = ClientContext.getClaimBundle().getString("INSURANCE_SELF_PREFIX"); if(getModel().getDocInfoModel().getHealthInsurance().startsWith(prefix)) { //sbTitle.append("(自費)"); String selfInsurance = ClientContext.getMyBundle(KarteViewer.class).getString("text.selfInsurance"); sbTitle.append(selfInsurance); } KartePDFImpl2 pdf = new KartePDFImpl2(sb.toString(), null, getContext().getPatient().getPatientId(), getContext().getPatient().getFullName(), sbTitle.toString(), new Date(), dumper, pdumper, null); //s.oh$ String path = pdf.create(); ArrayList<String> paths = new ArrayList<>(0); paths.add(path); KartePDFImpl2.printPDF(paths); //} } //s.oh$ /** * SOA Pane を返す。 * @return soaPane */ public KartePane getSOAPane() { return soaPane; } /** * コンテナからコールされる enter() メソッドで * メニューを制御する。 */ @Override public void enter() { if (avoidEnter) { return; } super.enter(); // ReadOnly 属性 boolean canEdit = !getContext().isReadOnly(); // 仮保存かどうか boolean tmp = model.getDocInfoModel().getStatus().equals(IInfoModel.STATUS_TMP); // 新規カルテ作成が可能な条件 //s.oh^ 2014/10/24 新規カルテメニューの制御 //boolean newOk = canEdit && (!tmp) ? true : false; boolean newOk = canEdit; //s.oh$ ChartMediator mediator = getContext().getChartMediator(); mediator.getAction(GUIConst.ACTION_NEW_KARTE).setEnabled(newOk); // 新規カルテ //s.oh^ 2014/08/19 ID権限 //mediator.getAction(GUIConst.ACTION_PRINT).setEnabled(true); // 印刷 mediator.getAction(GUIConst.ACTION_PRINT).setEnabled(!Project.isOtherCare()); mediator.getAction(GUIConst.ACTION_PRINTER_SETUP).setEnabled(!Project.isOtherCare()); //s.oh$ mediator.getAction(GUIConst.ACTION_MODIFY_KARTE).setEnabled(canEdit); // 修正 } /** * シングルカルテで初期化する。 */ private void initialize() { KartePanel1 kp1 = new KartePanel1(); panel2 = kp1; // TimeStampLabel を生成する timeStampLabel = kp1.getTimeStampLabel(); timeStampLabel.setHorizontalAlignment(SwingConstants.CENTER); timeStampLabel.setForeground(GUIConst.KARTE_TIME_STAMP_FORE_COLOR); timeStampLabel.setFont(timeStampFont); // SOA Pane を生成する soaPane = new KartePane(); soaPane.setTextPane(kp1.getSoaTextPane()); soaPane.setRole(IInfoModel.ROLE_SOA); if (model != null) { // Schema 画像にファイル名を付けるのために必要 String docId = model.getDocInfoModel().getDocId(); soaPane.setDocId(docId); } setUI(kp1); } /** * プログラムを開始する。 */ @Override public void start() { // Creates GUI this.initialize(); // Model を表示する if (this.getModel() != null) { String dateFmt = ClientContext.getBundle().getString("KARTE_DATE_FORMAT"); // 確定日を分かりやすい表現に変える String timeStamp = ModelUtils.getDateAsFormatString( model.getDocInfoModel().getFirstConfirmDate(), dateFmt); if (model.getDocInfoModel().getStatus().equals(IInfoModel.STATUS_TMP)) { String underTemp = ClientContext.getMyBundle(KarteViewer.class).getString("messageFormat.temporarySave"); MessageFormat msf = new MessageFormat(underTemp); timeStamp = msf.format(new Object[]{timeStamp}); KartePanel1 kp2 = (KartePanel1)panel2; kp2.getTimeStampPanel().setOpaque(true); kp2.getTimeStampPanel().setBackground(GUIConst.TEMP_SAVE_KARTE_BK_COLOR); timeStampLabel.setOpaque(true); timeStampLabel.setBackground(GUIConst.TEMP_SAVE_KARTE_BK_COLOR); timeStampLabel.setForeground(GUIConst.TEMP_SAVE_KARTE_FORE_COLOR); } //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(); } timeStampLabel.setText(timeStamp); KarteRenderer_2 renderer = new KarteRenderer_2(soaPane, null); renderer.render(model); } // モデル表示後にリスナ等を設定する ChartMediator mediator = getContext().getChartMediator(); soaPane.init(false, mediator); enter(); } @Override public void stop() { soaPane.clear(); } /** * 表示するモデルを設定する。 * @param model 表示するDocumentModel */ public void setModel(DocumentModel model) { this.model = model; } /** * 表示するモデルを返す。 * @return 表示するDocumentModel */ public DocumentModel getModel() { return model; } /** * 選択状態を設定する。 * 選択状態によりViewのボーダの色を変える。 * @param selected 選択された時 true */ public void setSelected(boolean selected) { this.selected = selected; if (selected) { getUI().setBorder(SELECTED_BORDER); } else { getUI().setBorder(NOT_SELECTED_BORDER); } } /** * 選択されているかどうかを返す。 * @return 選択されている時 true */ public boolean isSelected() { return selected; } public void addMouseListener(MouseListener ml) { soaPane.getTextPane().addMouseListener(ml); } @Override public int hashCode() { return getModel().getDocInfoModel().getDocId().hashCode() + 72; } @Override public boolean equals(Object other) { if (other != null && other instanceof KarteViewer) { DocInfoModel otheInfo = ((KarteViewer)other).getModel().getDocInfoModel(); return getModel().getDocInfoModel().equals(otheInfo); } return false; } @Override public int compareTo(Object other) { if (other != null && other instanceof KarteViewer) { DocInfoModel otheInfo = ((KarteViewer) other).getModel().getDocInfoModel(); return getModel().getDocInfoModel().compareTo(otheInfo); } return -1; } }