package open.dolphin.client;
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JScrollPane;
import open.dolphin.infomodel.DocInfoModel;
import open.dolphin.infomodel.IInfoModel;
/**
* 参照タブ画面を提供する Bridge クラス。このクラスの scroller へ
* カルテ、紹介状等のどきゅめんとが表示される。
*
* @author kazushi Minagawa, Digital Globe, Inc.
*/
public class DocumentBridgeImpl extends AbstractChartDocument
implements PropertyChangeListener, DocumentBridger {
// 文書表示クラスのインターフェイス
private DocumentViewer curViwer;
// Scroller
private JScrollPane scroller;
// Handle Class
private String handleClass;
public DocumentBridgeImpl() {
String TITLE = ClientContext.getMyBundle(DocumentBridgeImpl.class).getString("title.document");
setTitle(TITLE);
}
@Override
public void start() {
scroller = new JScrollPane();
scroller.getVerticalScrollBar().setUnitIncrement(16);
getUI().setLayout(new BorderLayout());
getUI().add(scroller, BorderLayout.CENTER);
//----------------------------------------
// 文書履歴のプロパティ通知をリッスンする
//----------------------------------------
DocumentHistory h = getContext().getDocumentHistory();
// 文書種別
h.addPropertyChangeListener(DocumentHistory.DOCUMENT_TYPE, this);
// 抽出期間
h.addPropertyChangeListener(DocumentHistory.HITORY_UPDATED, this);
// 選択
h.addPropertyChangeListener(DocumentHistory.SELECTED_HISTORIES, this);
curViwer = createKarteDocumentViewer();
curViwer.setContext(getContext());
curViwer.start();
enter();
}
@Override
public void stop() {
if (curViwer != null) {
curViwer.stop();
}
}
@Override
public void enter() {
if (curViwer != null) {
// これによりメニューは viwer で制御される
curViwer.enter();
} else {
super.enter();
}
}
/**
* Bridge 機能を提供する。選択された文書のタイプに応じてビューへブリッジする。
* @param docs 表示する文書の DocInfo 配列
*/
@Override
public void showDocuments(DocInfoModel[] docs) {
if (docs != null && docs.length > 0) {
String hClass = docs[0].getHandleClass();
if (hClass!=null && (!hClass.equals(handleClass))) {
curViwer = null;
handleClass = hClass;
try {
curViwer = createLetterModuleViewer(handleClass);
curViwer.setContext(getContext());
curViwer.start();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace(System.err);
}
}
if (curViwer != null) {
curViwer.showDocuments(docs, scroller);
}
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
ChartMediator med = this.getContext().getChartMediator();
med.setCurKarteTransferHandler(null);
String prop = evt.getPropertyName();
if (prop.equals(DocumentHistory.DOCUMENT_TYPE)) {
// 文書種別が変更された場合
String docType = (String) evt.getNewValue();
// showDocumentsがコールされるまでどのクラスがインスタンス化されるか不明
// 紹介状等の履歴が空の場合 showDocumentがコールされないので
// メニューを制御するためここでenterする
if (docType.equals(IInfoModel.DOCTYPE_LETTER) ||
docType.equals(IInfoModel.DOCTYPE_LETTER_REPLY) ||
docType.equals(IInfoModel.DOCTYPE_LETTER_REPLY2) ||
docType.equals(IInfoModel.DOCTYPE_LETTER_PLUGIN)) {
curViwer = null;
handleClass = null;
this.enter();
} else {
// カルテ文書
curViwer = createKarteDocumentViewer();
}
if (curViwer!=null) {
curViwer.setContext(getContext());
curViwer.start();
}
} else if (prop.equals(DocumentHistory.HITORY_UPDATED)) {
// 文書履歴の抽出期間が変更された場合
if (curViwer != null) {
curViwer.historyPeriodChanged();
}
this.scroller.setViewportView(null);
} else if (prop.equals(DocumentHistory.SELECTED_HISTORIES)) {
// 文書履歴の選択が変更された場合
DocInfoModel[] selectedHistoroes = (DocInfoModel[]) evt.getNewValue();
this.showDocuments(selectedHistoroes);
}
}
public KarteViewer getBaseKarte() {
if (curViwer != null && curViwer instanceof KarteDocumentViewer) {
return ((KarteDocumentViewer) curViwer).getBaseKarte();
}
return null;
}
private KarteDocumentViewer createKarteDocumentViewer() {
if (curViwer != null) {
curViwer = null;
}
return new KarteDocumentViewer();
}
private DocumentViewer createLetterModuleViewer(String handleClass)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
if (curViwer != null) {
curViwer = null;
}
DocumentViewer doc = (DocumentViewer) Class.forName(
handleClass).newInstance();
return doc;
}
}