package open.dolphin.stampbox; import java.awt.Component; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import open.dolphin.client.ClientContext; import open.dolphin.delegater.OrcaDelegater; import open.dolphin.delegater.OrcaDelegaterFactory; import open.dolphin.helper.SimpleWorker; import open.dolphin.infomodel.ModuleInfoBean; import open.dolphin.infomodel.OrcaInputCd; import open.dolphin.project.Project; /** * ORCA StampTree クラス。 * * @author Kazushi Minagawa */ public class OrcaTree extends StampTree { // private static final String MONITOR_TITLE = "ORCAセット検索"; /** ORCA 入力セットをフェッチしたかどうかのフラグ */ private boolean fetched; private ProgressMonitor monitor; private Timer taskTimer; private int delayCount; /** * Creates a new instance of OrcaTree * @param model */ public OrcaTree(TreeModel model) { super(model); } /** * ORCA 入力セットをフェッチしたかどうかを返す。 * @return 取得済みのとき true */ public boolean isFetched() { return fetched; } /** * ORCA 入力セットをフェッチしたかどうかを設定する。 * @param fetched 取得済みのとき true */ public void setFetched(boolean fetched) { this.fetched = fetched; } /** * StampBox のタブでこのTreeが選択された時コールされる。 */ @Override public void enter() { // ORCAへアクセスできないケース及び取得済みを追加^ if ((!Project.canAccessToOrca()) || fetched) { return; } // ORCAへアクセスできないケースを追加$ if (SwingUtilities.isEventDispatchThread()) { fetchOrcaSet(); } else { fetchOrcaSet2(); } } /** * ORCA の入力セットを取得しTreeに加える。 */ private void fetchOrcaSet2() { try { //SqlOrcaSetDao dao = new SqlOrcaSetDao(); OrcaDelegater dao = OrcaDelegaterFactory.create(); ArrayList<OrcaInputCd> inputSet = dao.getOrcaInputSet(); StampTreeNode root = (StampTreeNode) this.getModel().getRoot(); for (OrcaInputCd set : inputSet) { ModuleInfoBean stampInfo = set.getStampInfo(); StampTreeNode node = new StampTreeNode(stampInfo); root.add(node); } DefaultTreeModel model = (DefaultTreeModel) this.getModel(); model.reload(root); setFetched(true); } catch (Exception e) { e.printStackTrace(System.err); } } /** * ORCA の入力セットを取得しTreeに加える。 */ private void fetchOrcaSet() { java.util.ResourceBundle bundle = ClientContext.getMyBundle(OrcaTree.class); String message = bundle.getString("title.progress.orcaSetSearch"); String note = bundle.getString("note.orcaset.searching"); final Component c = SwingUtilities.getWindowAncestor(this); int maxEstimation = 60 * 1000; int delay = 300; final SimpleWorker worker = new SimpleWorker<List<OrcaInputCd>, Void>() { @Override protected List<OrcaInputCd> doInBackground() throws Exception { //SqlOrcaSetDao dao = new SqlOrcaSetDao(); OrcaDelegater dao = OrcaDelegaterFactory.create(); List<OrcaInputCd> result = dao.getOrcaInputSet(); return result; // if (dao.isNoError()) { // return result; // } else { // throw new Exception(dao.getErrorMessage()); // } } @Override protected void succeeded(List<OrcaInputCd> result) { processResult(result); } @Override protected void failed(Throwable e) { String title = ClientContext.getMyBundle(OrcaTree.class).getString("title.optionPane.orcaSetSearch"); title = ClientContext.getFrameTitle(title); JOptionPane.showMessageDialog(c, e.getMessage(), title, JOptionPane.WARNING_MESSAGE); } @Override protected void startProgress() { delayCount = 0; taskTimer.start(); } @Override protected void stopProgress() { taskTimer.stop(); monitor.close(); taskTimer = null; monitor = null; } }; monitor = new ProgressMonitor(c, message, note, 0, maxEstimation / delay); taskTimer = new Timer(delay, (ActionEvent e) -> { delayCount++; if (monitor.isCanceled() && (!worker.isCancelled())) { worker.cancel(true); } else { monitor.setProgress(delayCount); } }); worker.execute(); } /** * ORCAセットのStampTreeを構築する。 */ private void processResult(List<OrcaInputCd> inputSet) { if (inputSet==null || inputSet.isEmpty()) { return; } StampTreeNode root = (StampTreeNode) this.getModel().getRoot(); for (OrcaInputCd set : inputSet) { ModuleInfoBean stampInfo = set.getStampInfo(); StampTreeNode node = new StampTreeNode(stampInfo); root.add(node); } DefaultTreeModel model = (DefaultTreeModel) this.getModel(); model.reload(root); setFetched(true); } }