View Javadoc

1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.uruma.viewer;
17  
18  import java.util.HashMap;
19  import java.util.Map;
20  
21  import org.eclipse.jface.viewers.IBaseLabelProvider;
22  import org.eclipse.jface.viewers.ITableLabelProvider;
23  import org.eclipse.jface.viewers.TableViewer;
24  import org.eclipse.jface.viewers.Viewer;
25  import org.eclipse.jface.viewers.ViewerComparator;
26  import org.eclipse.swt.SWT;
27  import org.eclipse.swt.events.SelectionEvent;
28  import org.eclipse.swt.events.SelectionListener;
29  import org.eclipse.swt.widgets.Table;
30  import org.eclipse.swt.widgets.TableColumn;
31  
32  /**
33   * {@link TableViewer} 用の汎用ソートクラスです。<br />
34   * 
35   * @author y-komori
36   */
37  public class GenericTableViewerComparator extends ViewerComparator {
38      private Table table;
39  
40      private Map<TableColumn, Integer> columnMap = new HashMap<TableColumn, Integer>();
41  
42      private TableColumn sortKey;
43  
44      private SortingState sortingState = SortingState.NONE;
45  
46      /**
47       * {@link GenericTableViewerComparator} を構築します。<br />
48       */
49      public GenericTableViewerComparator() {
50          super(new StringAndNumberComparator());
51      }
52  
53      protected void setupColumnMap(final TableViewer viewer) {
54          this.table = viewer.getTable();
55          TableColumn[] columns = table.getColumns();
56          if (columns.length == 0) {
57              return;
58          }
59  
60          for (int i = 0; i < columns.length; i++) {
61              columnMap.put(columns[i], i);
62  
63              columns[i].addSelectionListener(new SelectionListener() {
64                  public void widgetDefaultSelected(final SelectionEvent e) {
65                  }
66  
67                  public void widgetSelected(final SelectionEvent e) {
68                      setSortKey((TableColumn) e.widget);
69                      viewer.setInput(viewer.getInput());
70                  }
71              });
72          }
73  
74          sortKey = columns[0];
75      }
76  
77      /*
78       * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
79       *      java.lang.Object, java.lang.Object)
80       */
81      @Override
82      public int compare(final Viewer viewer, final Object e1, final Object e2) {
83          TableViewer tableViewer = (TableViewer) viewer;
84  
85          if (this.table == null) {
86              setupColumnMap(tableViewer);
87          }
88  
89          int cat1 = category(e1);
90          int cat2 = category(e2);
91  
92          if (cat1 != cat2) {
93              return cat1 - cat2;
94          }
95  
96          Integer sortColumn = columnMap.get(sortKey);
97          if (sortColumn != null) {
98              int result = doCompare(tableViewer, e1, e2, sortColumn.intValue());
99  
100             if (sortingState == SortingState.ASCENDING) {
101                 return result;
102             } else if (sortingState == SortingState.DESCENDING) {
103                 return result * (-1);
104             } else {
105                 return 0;
106             }
107         } else {
108             return 0;
109         }
110     }
111 
112     /**
113      * モデルオブジェクトの比較を行います。<br />
114      * 比較方法をカスタマイズする場合、サブクラスで本メソッドをオーバーライドしてください。<br />
115      * 
116      * @param viewer
117      *            {@link TableViewer} オブジェクト
118      * @param e1
119      *            比較対象1
120      * @param e2
121      *            比較対象2
122      * @param sortColumn
123      *            ソート対象のカラム番号
124      * @return 比較結果
125      */
126     protected int doCompare(final TableViewer viewer, final Object e1,
127             final Object e2, final int sortColumn) {
128         IBaseLabelProvider baseLabelProvider = viewer.getLabelProvider();
129 
130         String value1 = "";
131         String value2 = "";
132         if (baseLabelProvider instanceof ITableLabelProvider) {
133             ITableLabelProvider prov = (ITableLabelProvider) baseLabelProvider;
134             value1 = prov.getColumnText(e1, sortColumn);
135             value2 = prov.getColumnText(e2, sortColumn);
136         } else {
137             value1 = e1.toString();
138             value2 = e2.toString();
139         }
140 
141         if (value1 == null) {
142             value1 = "";
143         }
144         if (value2 == null) {
145             value2 = "";
146         }
147 
148         return getComparator().compare(value1, value2);
149     }
150 
151     /**
152      * ソートキーとなるカラムを設定します。<br />
153      * ソート順は呼び出すたびに反転します。
154      * 
155      * @param tableColumn
156      *            ソートキーとなる {@link TableColumn} オブジェクト
157      */
158     public void setSortKey(final TableColumn tableColumn) {
159         if ((tableColumn != null) && !tableColumn.isDisposed()) {
160             sortKey = tableColumn;
161 
162             if (sortingState == SortingState.DESCENDING) {
163                 sortingState = SortingState.ASCENDING;
164                 table.setSortColumn(sortKey);
165                 table.setSortDirection(SWT.UP);
166             } else if (sortingState == SortingState.ASCENDING) {
167                 sortingState = SortingState.NONE;
168                 table.setSortColumn(null);
169                 table.setSortDirection(SWT.NONE);
170             } else if (sortingState == SortingState.NONE) {
171                 sortingState = SortingState.DESCENDING;
172                 table.setSortColumn(sortKey);
173                 table.setSortDirection(SWT.DOWN);
174             }
175         }
176     }
177 }