Eclipse実践プラグイン開発 4

STEP3:選択したセルの編集

STEP3:選択したセルの編集

STEP2まででセルの編集はできるようになりましたが、一番左のカラムで行を選択して、その後セルを選択するといった仕様になっているため操作性が悪いです。そこでSTEP3では、セルの選択で直接編集できるようにします。

セル選択による編集の切り替えを行うためには、テーブル上でのマウスイベントからクリックされたセルを特定し、editElement()メソッドで編集モードをオンにするといったマウスアダプタが必要になります。

 

⁄**
 * TableViewerのセル選択時の処理を行うクラス
 *⁄
class TestResultTableMouseAdapter extends MouseAdapter {

   private TableViewer viewer_;

   public TestResultTableMouseAdapter(TableViewer viewer){
      viewer_ = viewer;
   }

   ⁄**
    * マウスクリック時の処理
    *
    * クリックされたセルを特定し、編集モードに切り替える
    *⁄
   public void mouseDown(MouseEvent e) {
     int x = e.x;
     int y = e.y;
     Table messageTable = (Table)e.getSource();

     ⁄⁄ クリックされたポイントからテーブルアイテムを取得
     Point clickPoint = new Point(x, y);

     Table table = viewer_.getTable();
     int startRowNum = table.getTopIndex();
     int endRowNum = table.getItemCount();
     int columnCount = table.getColumnCount();

     TableItem targetItem = null;
     int columnIndex = 0;
     ⁄⁄ 行でループ
     for (int rowCnt = startRowNum; rowCnt endRowNum; rowCnt++) {
         TableItem item = table.getItem( rowCnt);
         ⁄⁄ 列でループ
         for (int j = 0; j = columnCount; j++) {
             Rectangle rect = item.getBounds(j);
             ⁄⁄ クリックされたセルを特定する
             if (rect.contains(clickPoint)) {
                 columnIndex = j;
                 targetItem = item;
                 break;
             }
         }
     }

     ⁄⁄ 編集モードをオンにする
     if (targetItem != null) {
         int rowIndex = messageTable.indexOf(targetItem);
         viewer_.editElement(targetItem.getData(), columnIndex);
     }
  }
}

マウスアダプタが完成したら、テーブルのリスナーとして登録します。
 

⁄⁄ マウスアダプタの設定
testResultTable.addMouseListener(new TestResultTableMouseAdapter(testResultViewer));

以上で、セル選択による編集の切り替えができるようになります。
 

STEP3のソースコード
Text  step3.zip
  (ZIPファイル/5.12KB)

 

 

STEP4:ソート

次に、カラムヘッダの選択によるデータのソート機能を追加します。

テーブルでソート機能を実現するには、ViewerSorterを継承して並び替えのルールを実装します。


 

 

package table_viewer;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;

⁄**
 * MessageTableSorter
 *
 * テーブルのソート処理を行うクラス
 *⁄
public class TestResultSorter extends ViewerSorter {
   ⁄⁄ 並び替えのタイプ
   public static final int SORT_TYPE_UP = 1;
   public static final int SORT_TYPE_DOWN = 2;

   ⁄⁄ 並び替え対象を識別するキー
   public static final int SORT_BY_ID = 0;
   public static final int SORT_BY_NAME = 1;
   public static final int SORT_BY_ENGLISH_SCORE = 2;
   public static final int SORT_BY_MATHEMATICS_SCORE = 3;
   public static final int SORT_BY_JAPANESE_SCORE = 4;
   public static final int SORT_BY_EVALUATION = 5;

   public int sortType_ = SORT_TYPE_UP;

   public int sortKey_ = SORT_BY_ID;

   ⁄**
    * 並び替えタイプ(昇順or降順)の設定
    *⁄
   public void setSortType(int sortType) {
     sortType_ = sortType;
   }

   ⁄**
     * 並び替えタイプの取得
     *⁄
   public int getSortType() {
     return sortType_;
   }

   ⁄**
    * 並び替え対象列の設定
    *⁄
   public void setColumnIndex(int sortKey) {
     sortKey_ = sortKey;
   }

   ⁄**
    * 並び替えルール
    *⁄
   public int compare(Viewer viewer, Object e1, Object e2) {
      TestResult result1 = (TestResult)e1;
      TestResult result2 = (TestResult)e2;

      ⁄⁄ ソートのキーごとに処理を分岐
      if (sortKey_ == SORT_BY_ID) {
          Integer id1 = new Integer(result1.getId());
          Integer id2 = new Integer(result2.getId());

          if (sortType_ == SORT_TYPE_UP) {
              return id1.compareTo(id2);
          } else {
              return id1.compareTo(id2) * -1;
          }
      } else if (sortKey_ == SORT_BY_NAME) {
          if (sortType_ == SORT_TYPE_UP) {
              return result1.getName().compareTo(result2.getName());
          } else {
              return result1.getName().compareTo(result2.getName()) * -1;
          }
      } else if (sortKey_ == SORT_BY_ENGLISH_SCORE) {
          Integer englishScore1 = new Integer(result1.getEnglishScore());
          Integer englishScore2 = new Integer(result2.getEnglishScore());

          if (sortType_ == SORT_TYPE_UP) {

              return englishScore1.compareTo(englishScore2);

          } else {
              return englishScore1.compareTo(englishScore2) * -1;
          }
      } else if (sortKey_ == SORT_BY_MATHEMATICS_SCORE) {
          Integer mathScore1 = new Integer(result1.getMathematicsScore());
          Integer mathScore2 = new Integer(result2.getMathematicsScore());

          if (sortType_ == SORT_TYPE_UP) {
              return mathScore1.compareTo(mathScore2);
          } else {
              return mathScore1.compareTo(mathScore2) * -1;
          }
      } else if (sortKey_ == SORT_BY_JAPANESE_SCORE) {
          Integer japaneseScore1 = new Integer(result1.getJapaneseScore());
          Integer japaneseScore2 = new Integer(result2.getJapaneseScore());

          if (sortType_ == SORT_TYPE_UP) {
              return japaneseScore1.compareTo(japaneseScore2);
          } else {
              return japaneseScore1.compareTo(japaneseScore2) * -1;
          }
      } else if (sortKey_ == SORT_BY_EVALUATION) {
          String evaluation1 = result1.getEvaluation();
          String evaluation2 = result2.getEvaluation();
          if (sortType_ == SORT_TYPE_UP) {
              return evaluation1.compareTo(evaluation2);
          } else {
              return evaluation1.compareTo(evaluation2) * -1;
          }
      }
      return 0;
   }
}

テーブルビューアに対して作成したソータを設定します。
 

⁄⁄ テーブルソータの設定
testResultViewer.setSorter(new TestResultSorter());

以上で、ソータの設定は完了です。

 

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る