/** 選択されている行をコピーする。 */
  public void copyRow() {

    StringBuilder sb = new StringBuilder();
    int numRows = view.getTable().getSelectedRowCount();
    int[] rowsSelected = view.getTable().getSelectedRows();
    int numColumns = view.getTable().getColumnCount();

    for (int i = 0; i < numRows; i++) {
      if (tableModel.getObject(rowsSelected[i]) != null) {
        StringBuilder s = new StringBuilder();
        for (int col = 0; col < numColumns; col++) {
          Object o = view.getTable().getValueAt(rowsSelected[i], col);
          if (o != null) {
            s.append(o.toString());
          }
          s.append(",");
        }
        if (s.length() > 0) {
          s.setLength(s.length() - 1);
        }
        sb.append(s.toString()).append("\n");
      }
    }
    if (sb.length() > 0) {
      StringSelection stsel = new StringSelection(sb.toString());
      Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stsel, stsel);
    }
  }
  @Override
  public void enter() {
    controlMenu();
    // pns^ 入ってきたら,キーワードフィールドにフォーカス
    // view.getKeywordFld().requestFocusInWindow();
    SwingUtilities.invokeLater(
        new Runnable() {

          @Override
          public void run() {
            view.getKeywordFld().requestFocusInWindow();
            view.getKeywordFld().selectAll();
          }
        });
    // pns$

    // s.oh^ 2014/08/19 ID権限
    if (Project.isOtherCare()) {
      String text = Project.getString("patient.search.text", "");
      if (text != null && !text.isEmpty()) {
        view.getKeywordFld().setText(text);
        find(view.getKeywordFld().getText());
      } else {
        view.getKeywordFld().setText("設定なし");
      }
      view.getSortItem().setEnabled(false);
      view.getKeywordFld().setEnabled(false);
      view.getTmpKarteButton().setEnabled(false);
    }
    // s.oh$
  }
  /** 年齢表示をオンオフする。 */
  public void switchAgeDisplay() {
    // masuda^
    if (view.getTable() == null) {
      return;
    }

    ageDisplay = !ageDisplay;
    Project.setBoolean(KEY_AGE_DISPLAY, ageDisplay);
    String method = ageDisplay ? AGE_METHOD[0] : AGE_METHOD[1];
    ListTableModel tModel = getTableModel();
    tModel.setProperty(method, ageColumn);

    List<ColumnSpec> columnSpecs = columnHelper.getColumnSpecs();
    for (int i = 0; i < columnSpecs.size(); i++) {
      ColumnSpec cs = columnSpecs.get(i);
      String test = cs.getMethod();
      if (test.toLowerCase().endsWith("birthday")) {
        cs.setMethod(method);
        break;
      }
    }
    // masuda$
  }
 // EVT から
 private void doStartProgress() {
   view.getCountLbl().setText(" 件");
   getContext().getProgressBar().setIndeterminate(true);
   getContext().getGlassPane().block();
   keyBlocker.block();
 }
  /** コンポーンントにリスナを登録し接続する。 */
  private void connect() {

    // ColumnHelperでカラム変更関連イベントを設定する
    columnHelper.connect();

    EventAdapter adp = new EventAdapter(view.getKeywordFld(), view.getTable());

    // 自動IME ボタン
    view.getAutoIme()
        .addActionListener(
            new ActionListener() {

              @Override
              public void actionPerformed(ActionEvent e) {
                JCheckBox check = (JCheckBox) e.getSource();
                boolean selected = check.isSelected();
                Project.setBoolean("autoIme", selected);

                if (selected) {
                  // 選択されたらIME ON
                  view.getKeywordFld().addFocusListener(AutoKanjiListener.getInstance());
                } else {
                  // されなければ OFF
                  view.getKeywordFld().addFocusListener(AutoRomanListener.getInstance());
                }
              }
            });

    // Sort アイテム
    view.getSortItem()
        .addItemListener(
            new ItemListener() {

              @Override
              public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                  JComboBox cb = (JComboBox) e.getSource();
                  sortItem = cb.getSelectedIndex();
                  Project.setInt("sortItem", sortItem);
                }
              }
            });

    // カレンダによる日付検索を設定する
    PopupListener pl = new PopupListener(view.getKeywordFld());

    // コンテキストメニューを設定する
    view.getTable().addMouseListener(new ContextListener());

    keyBlocker = new KeyBlocker(view.getKeywordFld());

    // -----------------------------------------------
    // Copy 機能を実装する
    // -----------------------------------------------
    KeyStroke copy =
        KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
    copyAction =
        new AbstractAction("コピー") {

          @Override
          public void actionPerformed(ActionEvent ae) {
            copyRow();
          }
        };
    view.getTable().getInputMap().put(copy, "Copy");
    view.getTable().getActionMap().put("Copy", copyAction);

    // minagawa^ 仮保存カルテ取得対応
    view.getTmpKarteButton()
        .addActionListener(
            new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                getTmpKarte();
              }
            });
    // minagawa$

    //        //-----------------------------------------------
    //        // 家族カルテ機能 DnD ^
    //        //-----------------------------------------------
    //        view.getTable().setDragEnabled(true);
    //        view.getTable().setTransferHandler(new PatientSearchTransferHandler());
  }
  /** GUI コンポーネントを初期化する。 */
  private void initComponents() {

    // View
    view = new PatientSearchView();
    setUI(view);

    // ColumnSpecHelperにテーブルを設定する
    columnHelper.setTable(view.getTable());

    // ------------------------------------------
    // View のテーブルモデルを置き換える
    // ------------------------------------------
    String[] columnNames = columnHelper.getTableModelColumnNames();
    String[] methods = columnHelper.getTableModelColumnMethods();
    Class[] cls = columnHelper.getTableModelColumnClasses();

    tableModel =
        new ListTableModel<PatientModel>(columnNames, 0, methods, cls) {

          @Override
          public Object getValueAt(int row, int col) {

            Object ret = null;

            if (col == ageColumn && ageDisplay) {

              PatientModel p = getObject(row);

              if (p != null) {
                int showMonth = Project.getInt("ageToNeedMonth", 6);
                ret = AgeCalculater.getAgeAndBirthday(p.getBirthday(), showMonth);
              }
            } else {

              ret = super.getValueAt(row, col);
            }

            return ret;
          }
        };
    view.getTable().setModel(tableModel);

    // masuda^   table sorter 組み込み
    sorter = new ListTableSorter(tableModel);
    view.getTable().setModel(sorter);
    sorter.setTableHeader(view.getTable().getTableHeader());
    // masuda$
    // カラム幅更新
    columnHelper.updateColumnWidth();
    // minagawa^ lsctest
    view.getTable().getColumnModel().getColumn(stateColumn).setIdentifier(COLUMN_IDENTIFIER_STATE);
    // minagawa$

    // masuda^
    // レンダラを設定する
    // view.getTable().setDefaultRenderer(Object.class, new OddEvenRowRenderer());
    // 連ドラ、梅ちゃん先生
    PatientListTableRenderer renderer = new PatientListTableRenderer();
    renderer.setTable(view.getTable());
    renderer.setDefaultRenderer();
    // masuda$

    // ソートアイテム
    sortItem = Project.getInt("sortItem", 0);
    // s.oh^ 2014/08/13 コントロールサイズ調整
    String nimbus = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
    String laf = UIManager.getLookAndFeel().getClass().getName();
    if (!laf.equals(nimbus)) {
      view.getSortItem().setPreferredSize(new Dimension(90, 20));
    }
    // s.oh$
    view.getSortItem().setSelectedIndex(sortItem);

    // Auto IME Windows の時のみ
    if (!ClientContext.isMac()) {
      // デフォルトは true
      boolean autoIme = Project.getBoolean("autoIme", true);
      view.getAutoIme().setSelected(autoIme);
    } else {
      // MAC は disabled
      // view.getAutoIme().setEnabled(false);
      view.getAutoIme().setVisible(false);
    }

    // 行高
    if (ClientContext.isWin()) {
      view.getTable().setRowHeight(ClientContext.getMoreHigherRowHeight());
    } else {
      view.getTable().setRowHeight(ClientContext.getHigherRowHeight());
    }

    String method = ageDisplay ? AGE_METHOD[0] : AGE_METHOD[1];
    ListTableModel tModel = getTableModel();
    tModel.setProperty(method, ageColumn);
    List<ColumnSpec> columnSpecs = columnHelper.getColumnSpecs();
    for (int i = 0; i < columnSpecs.size(); i++) {
      ColumnSpec cs = columnSpecs.get(i);
      String test = cs.getMethod();
      if (test.toLowerCase().endsWith("birthday")) {
        cs.setMethod(method);
        break;
      }
    }

    //// s.oh^ 2014/10/22 Icon表示
    //        view.getSearchLabel().setIcon(ClientContext.getImageIconArias("icon_search_large"));
    //// s.oh$

    // s.oh^ 2014/04/16 メニュー制御
    view.getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    // s.oh$
  }
 // masuda^
 // ステータスラベルに検索件数を表示
 private void updateStatusLabel() {
   int count = tableModel.getObjectCount();
   String msg = String.valueOf(count) + "件";
   // this.getContext().getStatusLabel().setText(msg);
   view.getCountLbl().setText(msg);
 }