Package open.dolphin.client

Source Code of open.dolphin.client.StampBoxPlugin$BoxChangeListener

package open.dolphin.client;

// import を編成しない!
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.prefs.Preferences;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import open.dolphin.delegater.StampDelegater;
import open.dolphin.infomodel.FacilityModel;
import open.dolphin.infomodel.IInfoModel;
import open.dolphin.infomodel.IStampTreeModel;
import open.dolphin.infomodel.ModuleInfoBean;
import open.dolphin.infomodel.ModuleModel;
import open.dolphin.infomodel.PublishedTreeModel;
import open.dolphin.infomodel.RegisteredDiagnosisModel;
import open.dolphin.infomodel.StampTreeModel; // 同名のクラスが client にあり
import open.dolphin.helper.ComponentMemory;
import open.dolphin.project.*;
import open.dolphin.helper.MenuSupport;
import open.dolphin.helper.WindowSupport;
import open.dolphin.order.StampMakerPanel;
import open.dolphin.ui.*;
import org.apache.log4j.Logger;

/**
* StampBox クラス。
* modified by pns
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class StampBoxPlugin extends AbstractMainTool {
   
    private static final String NAME = "スタンプ箱";
   
    // frameのデフォルトの大きさ及びタイトル
    private final int DEFAULT_WIDTH     = 320;
    private final int DEFAULT_HEIGHT    = 690;
    private final int IMPORT_TREE_OFFSET = 1;
   
    // StampBox の JFrame
    private MainFrame frame;   
    // StampBox
    private PNSTabbedPane parentBox;
    //ユーザ個人用の StampBox
    private AbstractStampBox userBox;
    // 現在選択されている StampBox
    private AbstractStampBox curBox;
    // インポートしている StampTree のリスト
    private List<Long> importedTreeList;
    // Stampmaker ボタン
    private JToggleButton toolBtn;   
    // StampMakerPanel
    private StampMakerPanel stampMaker;
    // StampMakerPanel モードのフラグ
    private boolean editing;
    // Editorの編集値リスナ StampMakerPanel をリスンする
    private EditorValueListener editorValueListener;   
    // StampBox 位置
    private Point stampBoxLoc;
    // StampBox 幅
    private int stampBoxWidth;
    // StampBox 高さ
    private int stampBoxHeight;
    // Block Glass Pane
    private BlockGlass glass;
    // このスタンプボックスの StmpTreeModel
    private List<IStampTreeModel> stampTreeModels;   
    // mac でメニューが消えないようにするために使う
    private MenuSupport mediator;
    // mac フラグ
    private boolean isMac;
    // ロックボタン
    private MyJToggleButton lockBtn;
    // ExtraMenu(gear) ボタン
    private JButton extraBtn;
    // ExtraMenu を押すと呼ばれる
    private StampBoxPluginExtraMenu extraMenu;
    // collapseAll ボタン
    private JButton collapseBtn;
    private boolean isLocked = true;
    // Logger
    private Logger logger;
       
    public StampBoxPlugin() {
        setName(NAME);
        logger = ClientContext.getBootLogger();
        isMac = ClientContext.isMac();
    }
   
    /**
     * スタンプ項目の移動がロックされているかどうか
     * @return
     */
    public boolean isLocked() {
        return isLocked;
    }
   
    /**
     * スタンプ項目の移動をロックする
     * @param isLocked
     */
    private void setLocked(boolean isLocked) {
        this.isLocked = isLocked;
    }

    /**
     * StampTreeModel を返す。
     * @return StampTreeModelのリスト
     */
    public List<IStampTreeModel> getStampTreeModels() {
        return stampTreeModels;
    }
   
    /**
     * StampTreeModel を設定する。
     * @param stampTreeModels StampTreeModelのリスト
     */
    public void setStampTreeModels(List<IStampTreeModel> stampTreeModels) {
        this.stampTreeModels = stampTreeModels;
    }
   
    /**
     * 現在のStampBoxを返す。
     * @return 現在選択されているStampBox
     */
    public AbstractStampBox getCurrentBox() {
        return curBox;
    }
   
    /**
     * 現在のStampBoxを設定する。
     * @param curBox 選択されたStampBox
     */
    public void setCurrentBox(AbstractStampBox curBox) {
        this.curBox = curBox;
    }
   
    /**
     * User(個人用)のStampBoxを返す。
     * @return User(個人用)のStampBox
     */
    public AbstractStampBox getUserStampBox() {
        return userBox;
    }
   
    /**
     * User(個人用)のStampBoxを設定する。
     * @param userBox User(個人用)のStampBox
     */
    public void setUserStampBox(AbstractStampBox userBox) {
        this.userBox = userBox;
    }
   
    /**
     * StampBox の JFrame を返す。
     * @return StampBox の JFrame
     */
    public MainFrame getFrame() {
        return frame;
    }
   
    /**
     * インポートしているStampTreeのリストを返す。
     * @return インポートしているStampTreeのリスト
     */
    public List<Long> getImportedTreeList() {
        return importedTreeList;
    }
   
    /**
     * Block用GlassPaneを返す。
     * @return Block用GlassPane
     */
    public BlockGlass getBlockGlass() {
        return glass;
    }
   
    /**
     * StampTree をデータベースまたはリソースから読み込む。
     * アプリケーションの起動時に一括してコールされる。
     */
    @Override
    public Callable<Boolean> getStartingTask() {
       
        Callable<Boolean> task = new Callable<Boolean>() {
           
            @Override
            public Boolean call() {
               
                try {
                    // UserPkを取得する
                    long userPk = Project.getUserModel().getId();
                   
                    // データベース検索を行う
                    StampDelegater stampDel = new StampDelegater();
                    List<IStampTreeModel> treeList = stampDel.getTrees(userPk);
                    if (!stampDel.isNoError()) {
                        logger.fatal("Could't read the stamp tree");
                        return false;
                    }
                    logger.info("Read the user's tree successfully");
                   
                    // User用のStampTreeが存在しない新規ユーザの場合、そのTreeを生成する
                    boolean hasTree = false;
                    if (treeList != null && treeList.size() > 0) {
                        for (IStampTreeModel tree : treeList) {
                            if (tree != null) {
                                long id = tree.getUser().getId();
                                if (id == userPk && tree instanceof StampTreeModel) {
                                    hasTree = true;
                                    break;
                                }
                            }
                        }
                    }
                   
                    // 新規ユーザでデータベースに個人用のStampTreeが存在しなかった場合
                    if (!hasTree) {
                        logger.info("New user, constract user's tree by resource");
                        InputStream in = ClientContext.getResourceAsStream("stamptree-seed.xml");
                        BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
                        String line;
                        StringBuilder sb = new StringBuilder();
                        while( (line = reader.readLine()) != null ) {
                            sb.append(line);
                        }
                        // Tree情報を設定し保存する
                        IStampTreeModel tm = new StampTreeModel();
                        tm.setUser(Project.getUserModel());
                        tm.setName(ClientContext.getString("stampTree.personal.box.name"));
                        tm.setDescription(ClientContext.getString("stampTree.personal.box.tooltip"));
                        FacilityModel facility = Project.getUserModel().getFacilityModel();
                        tm.setPartyName(facility.getFacilityName());
                        String url = facility.getUrl();
                        if (url != null) {
                            tm.setUrl(url);
                        }
                        tm.setTreeXml(sb.toString());
                        in.close();
                        reader.close();
                        // リストの先頭へ追加する
                        treeList.add(0, tm);
                    }
                   
                    setStampTreeModels(treeList);
                   
                    return true;
                   
                } catch (IOException e) {
                    logger.fatal(e.getMessage());
                }
                return false;
            }
        };
       
        return task;
    }

    /**
     * プログラムを開始する。
     */
    public void start() {
       
        if (stampTreeModels == null) {
            logger.fatal("StampTreeModel is null");
            throw new RuntimeException("Fatal error: StampTreeModel is null at start.");
        }
       
        //
        // StampBoxのJFrameを生成する
        //
        String title = NAME;
        Rectangle setBounds = new Rectangle(0, 0, 1000, 690);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int defaultX = (screenSize.width - setBounds.width) / 2;
        int defaultY = (screenSize.height - setBounds.height) / 2;
        int defaultWidth = setBounds.width;
        int defaultHeight = setBounds.height;
        int x = (defaultX + defaultWidth) - DEFAULT_WIDTH;
        int y = defaultY;
        int width = DEFAULT_WIDTH;
        int height = DEFAULT_HEIGHT;

        // mac で StampBox にもメニューバーを出す
        if (isMac) {
            WindowSupport windowSupport = WindowSupport.create(title);
            frame = windowSupport.getFrame();
            javax.swing.JMenuBar myMenuBar = windowSupport.getMenuBar();
            mediator = new MenuSupport(this);
            MenuFactory appMenu = new MenuFactory();

            // mainWindow の menuSupport をセットしておけばメニュー処理は mainWindow がしてくれる
            appMenu.setMenuSupports(getContext().getMenuSupport(), mediator);
            appMenu.build(myMenuBar);
            mediator.registerActions(appMenu.getActionMap());
            mediator.disableAllMenus();
            String[] enables = new String[]{
                GUIConst.ACTION_SHOW_SCHEMABOX,
                GUIConst.ACTION_SET_KARTE_ENVIROMENT
            };
            mediator.enableMenus(enables);
           
        } else {
            frame = new MainFrame(title);
        }
        frame.removeStatusPanel();
       
        glass = new BlockGlass();
        frame.setGlassPane(glass);
        frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                if (editing) {
                    toolBtn.doClick();                   
                    if (!isLocked) lockBtn.doClick();

                } else {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
        });
        ComponentMemory cm = new ComponentMemory(frame, new Point(x, y), new Dimension(width, height), this);
        cm.setToPreferenceBounds();

        //
        // 全体のボックスを生成する
        //
        parentBox = new PNSTabbedPane() {
            private static final long serialVersionUID = 1L;
            // Insets なしのボーダーをつけるためにボーダーを書き直す
            // StampTree での改変も必要
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                paintBorder(g);
            }
        };
        parentBox.setTabPlacement(JTabbedPane.BOTTOM);
        parentBox.getButtonPanel().setPadding(new Dimension(0,4));
        parentBox.getButtonPanel().setBackgroundColor(Color.BLACK, 0.05f, 0.2f);
       
        //
        // 読み込んだStampTreeをTabbedPaneに格納し、さらにそれをparentBoxに追加する
        //
        for (IStampTreeModel model : stampTreeModels) {
           
            if (model != null) {
               
                logger.debug("id = " + model.getId());
                logger.debug("name = " + model.getName());
                logger.debug("publishType = " + model.getPublishType());
                logger.debug("category = " + model.getCategory());
                logger.debug("partyName = " + model.getPartyName());
                logger.debug("url = " + model.getUrl());
                logger.debug("description = " + model.getDescription());
                logger.debug("publishedDate = " + model.getPublishedDate());
                logger.debug("lastUpdated = " + model.getLastUpdated());
                logger.debug("userId = " + model.getUser());
               
                //
                // ユーザ個人用StampTreeの場合
                //
                if (model.getUser().getId() == Project.getUserModel().getId() && model instanceof StampTreeModel) {
                   
                    //
                    // 個人用のスタンプボックス(JTabbedPane)を生成する
                    //
                    userBox = new UserStampBox();
                   
                    userBox.getButtonPanel().setBackgroundColor(Color.BLACK, 0.1f, 0.2f);
                    userBox.getButtonPanel().setPadding(new Dimension(16,4));
                    userBox.getButtonPanel().setBottomLineAlpha(0.4f);
                   
                    userBox.setContext(this);
                    userBox.setStampTreeModel(model);
                    userBox.buildStampBox();
                   
                    //
                    // ParentBox に追加する
                    //
                    parentBox.addTab(ClientContext.getString("stampTree.personal.box.name"), userBox);
                   
                } else if (model instanceof PublishedTreeModel) {
                    //
                    // インポートしているTreeの場合
                    //
                    importPublishedTree(model);
                }
                model.setTreeXml(null);
            }
        }
       
        //
        // StampTreeModel を clear する
        //
        stampTreeModels.clear();
       
        // ParentBox のTab に tooltips を設定する
        for (int i = 0; i < parentBox.getTabCount(); i++) {
            AbstractStampBox box = (AbstractStampBox) parentBox.getComponentAt(i);
            parentBox.setToolTipTextAt(i, box.getInfo());
        }
       
        //
        // ParentBoxにChangeListenerを登録しスタンプメーカの制御を行う
        //
        parentBox.addChangeListener(new BoxChangeListener());
        setCurrentBox(userBox);
       
        //
        // ユーザBox用にChangeListenerを設定する
        //
        userBox.addChangeListener(new TabChangeListener());
       
        //
        // スタンプメーカを起動するためのボタンを生成する
        //
        toolBtn = new JToggleButton(GUIConst.ICON_PENCIL_16);
        toolBtn.setSelectedIcon(GUIConst.ICON_PENCIL_PRESSED_16);
        toolBtn.setPressedIcon(GUIConst.ICON_PENCIL_PRESSED_16);
        toolBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        toolBtn.setToolTipText("スタンプメーカを起動します");
        toolBtn.setFocusable(false);
        toolBtn.putClientProperty("Quaqua.Button.style", "bevel");
        toolBtn.setContentAreaFilled(false);
        toolBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!editing) {
                    startStampMake();
                    editing = true;                   
                    if (isLocked) lockBtn.doClick();

                } else {
                    stopStampMake();
                    editing = false;
                    if (!isLocked) lockBtn.doClick();
                }
            }
        });
                       
        // ロックボタンを生成する
        lockBtn = new MyJToggleButton();
        lockBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        lockBtn.setIcon(GUIConst.ICON_LOCK_16);
        lockBtn.setSelectedIcon(GUIConst.ICON_LOCK_OPEN_16);
        lockBtn.setToolTipText("ダブルクリックでツリー内での入れ替えのロック/解除をします");
        lockBtn.setFocusable(false);
        lockBtn.setPreferredSize(new java.awt.Dimension(16,16));
        lockBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 選択されていたらロック解除
                if (lockBtn.isSelected()) {
                    setLocked(false);
                    // Insets のないボーダー
                    // このままだと paintComponent でボーダーが上書きされてしまうので,
                    // parentBox を作るときに,paint 内でボーダーを書き直すように設定する
                    parentBox.setBorder(new LineBorder(new Color(255,0,0,100),2,true){
                        private static final long serialVersionUID = 1L;
                        @Override
                        public Insets getBorderInsets(Component c) {
                            return new Insets(0,0,0,0);
                }
                    });
                }
                else {
                    setLocked(true);
                    parentBox.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
                }
            }
        });
       
        // 特別メニュー(gear)ボタンを生成する
        extraBtn = new JButton();
        extraBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        extraBtn.setContentAreaFilled(false);
        extraBtn.setIcon(GUIConst.ICON_GEAR_16);
        extraBtn.setToolTipText("特別メニュー");
        extraBtn.setFocusable(false);
        extraBtn.setPreferredSize(new java.awt.Dimension(16,16));
        extraMenu = new StampBoxPluginExtraMenu(this);
        extraBtn.addMouseListener(extraMenu);
       
        // collapseAll ボタン
        collapseBtn = new JButton();
        collapseBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        collapseBtn.setContentAreaFilled(false);
        collapseBtn.setIcon(GUIConst.ICON_TREE_COLLAPSED_16);
        collapseBtn.setToolTipText("フォルダを全て閉じる");
        collapseBtn.setFocusable(false);
        collapseBtn.setPreferredSize(new java.awt.Dimension(16,16));
        collapseBtn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                StampTreePanel p = (StampTreePanel) getUserStampBox().getSelectedComponent();
                StampTree tree = p.getTree();
                tree.collapseAll();
            }           
        });

        //
        // レイアウトする
        //       
        MainFrame.MainPanel mainPanel = frame.getMainPanel();
        mainPanel.setLayout(new BorderLayout(0,0));
        mainPanel.add(parentBox, BorderLayout.CENTER);

        MainFrame.CommandPanel comPanel = frame.getCommandPanel();
        comPanel.setPanelHeight(24);
        comPanel.addGlue();
        comPanel.add(toolBtn);
        comPanel.addSpace(12);
        comPanel.add(collapseBtn);
        comPanel.addSpace(4);
        comPanel.add(extraBtn);
        comPanel.addSpace(4);
        comPanel.add(lockBtn);
        comPanel.setMargin(4);
        comPanel.setBackgroundColor(Color.BLACK, 0f, 0.1f);
       
        //
        // 前回終了時のタブを選択する
        //
        Preferences prefs = Preferences.userNodeForPackage(this.getClass());
        String name = this.getClass().getName();
        int index = prefs.getInt(name + "_parentBox", 0);
        index = ( index >= 0 && index <= (parentBox.getTabCount() -1) ) ? index : 0;
        parentBox.setSelectedIndex(index);
        index = prefs.getInt(name + "_stampBox", 0);
        index = ( index >= 0 && index <= (userBox.getTabCount() -1) ) ? index : 0;
       
        //
        // ORCA タブが選択されていて ORCA に接続がない場合を避ける
        //
        index = index == IInfoModel.TAB_INDEX_ORCA ? 0 : index;
        userBox.setSelectedIndex(index);
       
        //
        // ボタンをコントロールする
        //
        boxChanged();
    }
   
    /**
     * 選択されているIndexでボタンを制御する。
     */
    private void boxChanged() {
       
        int index = parentBox.getSelectedIndex();
        setCurrentBox((AbstractStampBox) parentBox.getComponentAt(index));
        String info = getCurrentBox().getInfo();
        this.getFrame().setTitle(info);
       
        if (getCurrentBox() == userBox) {
            extraMenu.setPublishEnabled(true);
            int index2 = userBox.getSelectedIndex();
            boolean enabled = userBox.isHasEditor(index2);
            toolBtn.setEnabled(enabled);
           
        } else {
            toolBtn.setEnabled(false);
            extraMenu.setPublishEnabled(false);
        }
    }
   
    /**
     * ImportしたStampBoxの選択可能を制御する。
     * @param enabled 選択可能な時 true
     */
    private void enabledImportBox(boolean enabled) {
        int cnt = parentBox.getTabCount();
        for (int i = 0 ; i < cnt; i++) {
            if ((PNSTabbedPane) parentBox.getComponentAt(i) != userBox) {
                parentBox.setEnabledAt(i, enabled);
            }
        }
    }
   
    /**
     * TabChangeListener
     * User用StampBoxのTab切り替えリスナクラス。
     */
    private class TabChangeListener implements ChangeListener {
       
        @Override
        public void stateChanged(ChangeEvent e) {
           
            if (!editing) {
                // スタンプメーカ起動中でない時
                // テキストスタンプタブが選択されたらスタンプメーカボタンを disabledにする
                // ORCA セットタブの場合を処理する
                int index = userBox.getSelectedIndex();
                StampTree tree = userBox.getStampTree(index);
                tree.enter();
                boolean enabled = userBox.isHasEditor(index);
                toolBtn.setEnabled(enabled);
               
            } else {
                // スタンプメーカ起動中の時
                // 選択されたタブに対応するエディタを表示する
                int index = userBox.getSelectedIndex();
                StampTree tree = userBox.getStampTree(index);
                if (stampMaker != null && userBox.isHasEditor(index)) {
                    stampMaker.show(tree.getEntity());
                    fireTreeSelectionListener(tree);
                }
            }
        }
    }

    /**
     * 選択しなおして,treeSelectionListener を fire する(左矢印を出すため)
     * @param tree
     */
    private void fireTreeSelectionListener(StampTree tree) {
        javax.swing.tree.TreePath tp = tree.getSelectionPath();
        if (tp != null) {
            tree.clearSelection();
            tree.getSelectionModel().setSelectionPath(tp);
        }
    }
   
    /**
     * ParentBox の TabChangeListenerクラス。
     */
    private class BoxChangeListener implements ChangeListener {
        @Override
        public void stateChanged(ChangeEvent e) {
            boxChanged();
        }
    }
   
    /**
     * スタンプメーカを起動する。
     */
    public void startStampMake() {
       
        if (editing) {
            return;
        }
        // 現在の位置と大きさを保存する
        stampBoxLoc = frame.getLocation();
        stampBoxWidth = frame.getWidth();
        stampBoxHeight = frame.getHeight();
       
        //
        // ASP ボックスを選択不可にする
        //
        enabledImportBox(false);
       
        // 現在のタブからtreeのEntityを得る
        int index = userBox.getSelectedIndex();
        StampTree tree = userBox.getStampTree(index);
        String entity = tree.getEntity();
       
        userBox.setHasNoEditorEnabled(false);
        List<StampTree> allTrees = userBox.getAllTrees();
       
        // エディタを生成する       
        stampMaker = new StampMakerPanel();
        for (StampTree st : allTrees) {
            st.addTreeSelectionListener(stampMaker);
        }
        // StampMakerPanel で編集が終わると fire されて,ここの EditorValueListener が呼ばれる
        editorValueListener = new EditorValueListener();
        stampMaker.addPropertyChangeListener(StampMakerPanel.EDITOR_VALUE_PROP, editorValueListener);
        stampMaker.show(entity);
//pns
        fireTreeSelectionListener(tree);

        MainFrame.MainPanel mainPanel = frame.getMainPanel();
        mainPanel.add(parentBox, BorderLayout.EAST);
        mainPanel.add(stampMaker, BorderLayout.CENTER);
       
        // parentBox は EAST に入れ直したのでサイズ固定になる。現在のサイズに固定する
        parentBox.setMaximumSize(parentBox.getSize());
        parentBox.setMinimumSize(parentBox.getSize());
        parentBox.setPreferredSize(parentBox.getSize());
        stampMaker.setPreferredSize(new Dimension(724, 690));
        frame.setVisible(false);
       
        // 前回終了時の位置とサイズを取得する
        Preferences prefs = Preferences.userNodeForPackage(this.getClass());
        String name = this.getClass().getName();
        int locX = prefs.getInt(name + ".stampmMaker.x", 0);
        int locY = prefs.getInt(name + ".stampmMaker.y", 0);
        int width = prefs.getInt(name + ".stampmMaker.width", 0);
        int height = prefs.getInt(name + ".stampmMaker.height", 0);
       
        if (width == 0 || height == 0) {
            // センタリングする
            frame.pack();
            Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
            int x = (screen.width - frame.getWidth())/2;
            int y = (screen.height - frame.getHeight())/2;
            frame.setLocation(x, y);
        } else {
            frame.setBounds(locX, locY, width, height);
        }
       
        frame.setVisible(true);
        editing = true;
        toolBtn.setToolTipText("スタンプメーカを終了します");
        extraMenu.setPublishEnabled(false);
        extraMenu.setImportEnabled(false);
    }
   
    /**
     * スタンプメーカを終了する。
     */
    public void stopStampMake() {
       
        if (! editing) {
            return;
        }
       
        // 現在の大きさと位置をPreferenceに保存ずる
        Preferences prefs = Preferences.userNodeForPackage(this.getClass());
        String name = this.getClass().getName();
        prefs.putInt(name + ".stampmMaker.x", frame.getLocation().x);
        prefs.putInt(name + ".stampmMaker.y", frame.getLocation().y);
        prefs.putInt(name + ".stampmMaker.width", frame.getWidth());
        prefs.putInt(name + ".stampmMaker.height", frame.getHeight());
       
        stampMaker.close();
        stampMaker.removePropertyChangeListener(StampMakerPanel.EDITOR_VALUE_PROP, editorValueListener);
        List<StampTree> allTrees = userBox.getAllTrees();
        for (StampTree st : allTrees) {
            //st.removePropertyChangeListener(StampTree.SELECTED_NODE_PROP, stampMaker);
            st.removeTreeSelectionListener(stampMaker);
        }
       
        MainFrame.MainPanel mainPanel = frame.getMainPanel();
        mainPanel.remove(stampMaker);
        mainPanel.add(parentBox, BorderLayout.CENTER);
       
        // サイズ固定解除(不要のようだ)
        parentBox.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
        parentBox.setMinimumSize(new Dimension(0,0));       
       
        stampMaker = null;
        editorValueListener = null;
        userBox.setHasNoEditorEnabled(true);
        //content.revalidate();
        frame.setLocation(stampBoxLoc);
        frame.setSize(new Dimension(stampBoxWidth, stampBoxHeight));
        editing = false;
        toolBtn.setToolTipText("スタンプメーカを起動します");
        extraMenu.setPublishEnabled(true);
        extraMenu.setImportEnabled(true);
       
        //
        // ASP ボックスを選択可にする
        //
        enabledImportBox(true);
    }
   
    /**
     * EditorValueListener
     * エディタで作成したスタンプをStampTreeに加える。
     */
    private class EditorValueListener implements PropertyChangeListener {
       
        @Override
        public void propertyChange(PropertyChangeEvent e) {
            Object obj = e.getNewValue();

            if (obj != null && obj instanceof ModuleModel) {
                // 傷病名以外の場合
                ModuleModel stamp = (ModuleModel) obj;
                String entity = stamp.getModuleInfo().getEntity();
                final StampTree tree = userBox.getStampTree(entity);

                StampTreeNode target = tree.getSelectedNode();
                if (target == null) {
                    // 選択がない場合は,tree の最後に追加
                    tree.addStamp(stamp, null);

                } else {
                    if (target.isLeaf()) {
                        // Leaf の場合,上書きするか確認
                        String targetName = target.getStampInfo().getStampName();
                        String sourceName = stamp.getModuleInfo().getStampName();
                        if (targetName.equals(sourceName)) {
                            // 名前が同じなら置き換えるかどうか確認
                            int confirm = MyJSheet.showConfirmDialog(frame,
                                    "「" + targetName + "」を上書きしますか?", "上書き確認",
                                    JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE );
                            if(confirm == JOptionPane.OK_OPTION) {
                                ((StampTreeTransferHandler)tree.getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.AFTER);
                                tree.replaceStamp(stamp, target);
                            }
                        } else {
                            // 名前が違えば選択された項目の下に入れる
                            ((StampTreeTransferHandler)tree.getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.AFTER);
                            tree.addStamp(stamp, target);
                        }
                    } else {
                        // Folder ならその中に入れる
                        ((StampTreeTransferHandler)tree.getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.INTO_FOLDER);
                        tree.addStamp(stamp, target);
                    }
                }
                // 終わったら tree にフォーカスを取る
                tree.requestFocusInWindow();

            } else if (obj != null && obj instanceof ArrayList) {
                // 傷病名の場合
                StampTree tree = getStampTree(IInfoModel.ENTITY_DIAGNOSIS);
                tree.addDiagnosis((ArrayList<RegisteredDiagnosisModel>) obj);
            }
        }
    }
   
    /**
     * スタンプパブリッシャーを起動する。
     */
    public void publishStamp() {
        StampPublisher publisher = new StampPublisher(this);
        publisher.start();
    }
   
    /**
     * スタンプインポーターを起動する。
     */
    public void importStamp() {
        StampImporter importer = new StampImporter(this);
        importer.start();
    }
   
    /**
     * 公開されているスタンプTreeをインポートする。
     * @param importTree インポートする公開Tree
     */
    public void importPublishedTree(IStampTreeModel importTree) {
        //
        // Asp StampBox を生成し parentBox に加える
        //
        AbstractStampBox aspBox = new AspStampBox();
        aspBox.setContext(this);
        aspBox.setStampTreeModel(importTree);
        aspBox.buildStampBox();
        parentBox.addTab(importTree.getName(), aspBox);
       
        //
        // インポートリストに追加する
        //
        if (importedTreeList == null) {
            importedTreeList = new ArrayList<Long>(5);
        }
        importedTreeList.add(Long.valueOf(importTree.getId()));
    }
   
    /**
     * インポートしている公開Treeを削除する。
     * @param removeId 削除する公開TreeのId
     */
    public void removeImportedTree(long removeId) {
       
        if (importedTreeList != null) {
            for (int i = 0; i < importedTreeList.size(); i++) {
                Long id = importedTreeList.get(i);
                if (id.longValue() == removeId) {
                    parentBox.removeTabAt(i+IMPORT_TREE_OFFSET);
                    importedTreeList.remove(i);
                    break;
                }
            }
        }
    }
   
    /**
     * プログラムを終了する。
     */
    @Override
    public void stop() {
        frame.setVisible(false);
        frame.dispose();
    }
   
    /**
     * フレームを前面に出す。
     */
    @Override
    public void enter() {
        if (frame != null) {
            frame.toFront();
            IMEControl.setImeOff(frame);
        }
    }
   
    @Override
    public Callable<Boolean> getStoppingTask() {
       
        Preferences prefs = Preferences.userNodeForPackage(this.getClass());
        String name = (StampBoxPlugin.this).getClass().getName();
       
        // StampMeker modeで終了した場合、
        // 次回起動時に通常モードの位置と大きさで表示するため
        if (editing) {
            prefs.putInt(name + "_x", stampBoxLoc.x);
            prefs.putInt(name + "_y", stampBoxLoc.y);
            prefs.putInt(name + "_width", stampBoxWidth);
            prefs.putInt(name + "_height", stampBoxHeight);
        }
       
        // 終了時のタブ選択インデックスを保存する
        prefs.putInt(name + "_parentBox", parentBox.getSelectedIndex());
        prefs.putInt(name + "_stampBox", userBox.getSelectedIndex());
       
        //
        // User Tree のみを保存する
        //
        ArrayList<StampTree> list = (ArrayList<StampTree>) userBox.getAllTrees();
        if (list == null || list.isEmpty()) {
            return null;
        }
       
        //
        // ORCA セットは除く
        //
        for (StampTree tree : list) {
            if (tree.getTreeInfo().getEntity().equals(IInfoModel.ENTITY_ORCA)) {
                list.remove(tree);
                logger.debug("ORCAセットを除きました");
                break;
            }
        }
       
        // StampTree を表す XML データを生成する
        DefaultStampTreeXmlBuilder builder = new DefaultStampTreeXmlBuilder();
        StampTreeXmlDirector director = new StampTreeXmlDirector(builder);
        String treeXml = director.build(list);
       
        // 個人用のStampTreeModelにXMLをセットする
        final IStampTreeModel treeM = userBox.getStampTreeModel();
        treeM.setTreeXml(treeXml);
       
        // StampTree を保存する Callable Object を生成する
        Callable<Boolean> longTask = new Callable<Boolean>() {
           
            @Override
            public Boolean call() {               
                StampDelegater stampDel = new StampDelegater();
                stampDel.putTree(treeM);
                boolean result = stampDel.isNoError();
                return result;
            }
        };
       
        return longTask;
    }
   
    /**
     * 引数のカテゴリに対応するTreeを返す。
     * @param category Treeのカテゴリ
     * @return カテゴリにマッチするStampTree
     */
    public StampTree getStampTree(String entity) {
        return getCurrentBox().getStampTree(entity);
    }
   
    public StampTree getStampTreeFromUserBox(String entity) {
        return getUserStampBox().getStampTree(entity);
    }
   
    /**
     * スタンプボックスに含まれる全treeのTreeInfoリストを返す。
     * @return TreeInfoのリスト
     */
    public List<TreeInfo> getAllTress() {
        return getCurrentBox().getAllTreeInfos();
    }
   
    /**
     * スタンプボックスに含まれる全treeを返す。
     * @return StampTreeのリスト
     */
    public List<StampTree> getAllTrees() {
        return getCurrentBox().getAllTrees();
    }
   
    /**
     * スタンプボックスに含まれる全treeを返す。
     * @return StampTreeのリスト
     */
    public List<StampTree> getAllAllPTrees() {
       
        int cnt = parentBox.getTabCount();
        ArrayList<StampTree> ret = new ArrayList<StampTree>();
       
        for (int i = 0; i < cnt; i++) {
            AbstractStampBox stb = (AbstractStampBox) parentBox.getComponentAt(i);
            ret.addAll(stb.getAllPTrees());
        }
       
        return ret;
    }
   
    /**
     * Currentボックスの P 関連Staptreeを返す。
     * @return StampTreeのリスト
     */
    public List<StampTree> getAllPTrees() {

        AbstractStampBox stb = getCurrentBox();
        return stb.getAllPTrees();
    }
   
    /**
     * 引数のエンティティ配下にある全てのスタンプを返す。
     * これはメニュー等で使用する。
     * @param entity Treeのエンティティ
     * @return 全てのスタンプのリスト
     */
    public List<ModuleInfoBean> getAllStamps(String entity) {
        return getCurrentBox().getAllStamps(entity);
    }
}
TOP

Related Classes of open.dolphin.client.StampBoxPlugin$BoxChangeListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.