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.lang.reflect.Field;
19  
20  import org.eclipse.jface.viewers.ILabelProvider;
21  import org.eclipse.jface.viewers.ILabelProviderListener;
22  import org.eclipse.swt.graphics.Image;
23  import org.seasar.framework.beans.BeanDesc;
24  import org.seasar.framework.beans.factory.BeanDescFactory;
25  import org.seasar.framework.util.FieldUtil;
26  import org.seasar.uruma.annotation.BindingLabel;
27  
28  /**
29   * 汎用的な {@link ILabelProvider} の実装クラスです。<br />
30   * <p>
31   * {@link GenericLabelProvider#setTargetClass(Class) setTargetClass()}
32   * メソッドで設定されたクラスの中から {@link BindingLabel} アノテーションが付加されたフィールドをテーブルのカラムとして表示します。
33   * </p>
34   * <p>
35   * {@link BindingLabel} アノテーションが付加されたフィールドが存在しない場合、<code>toString()</code>
36   * メソッドの戻り値をラベルに設定します。
37   * </p>
38   * <p>
39   * {@link BindingLabel} アノテーションが付加されたフィールドが複数存在する場合、一番最初のフィールドが有効となります。
40   * </p>
41   * 
42   * @author y-komori
43   */
44  public class GenericLabelProvider implements ILabelProvider,
45          TargetClassHoldingProvider {
46      protected Field labelField;
47  
48      /*
49       * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
50       */
51      public Image getImage(final Object element) {
52          return null;
53      }
54  
55      /*
56       * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
57       */
58      public String getText(final Object element) {
59          if (labelField != null) {
60              Object value = FieldUtil.get(labelField, element);
61              return (value != null) ? value.toString() : "";
62          } else {
63              return element.toString();
64          }
65      }
66  
67      /*
68       * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
69       */
70      public void addListener(final ILabelProviderListener listener) {
71          // Do nothing.
72      }
73  
74      /*
75       * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
76       */
77      public void dispose() {
78          // Do nothing.
79      }
80  
81      /*
82       * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
83       *      java.lang.String)
84       */
85      public boolean isLabelProperty(final Object element, final String property) {
86          // Do nothing.
87          return false;
88      }
89  
90      /*
91       * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
92       */
93      public void removeListener(final ILabelProviderListener listener) {
94          // Do nothing.
95      }
96  
97      /*
98       * @see org.seasar.uruma.viewer.TargetClassHoldingProvider#setTargetClass(java.lang.Class)
99       */
100     public void setTargetClass(final Class<?> clazz) {
101         BeanDesc desc = BeanDescFactory.getBeanDesc(clazz);
102         int fieldSize = desc.getFieldSize();
103         for (int i = 0; i < fieldSize; i++) {
104             Field field = desc.getField(i);
105             BindingLabel annotation = field.getAnnotation(BindingLabel.class);
106             if (annotation != null) {
107                 labelField = field;
108                 break;
109             }
110         }
111     }
112 }