fix #6433 fix NPE in PartialElement
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / PartialElement.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.ui.element;
11
12 import org.eclipse.jface.util.PropertyChangeEvent;
13 import org.eclipse.swt.graphics.Color;
14 import org.eclipse.swt.widgets.Label;
15 import org.eclipse.ui.forms.widgets.TableWrapLayout;
16 import org.joda.time.Partial;
17
18 import eu.etaxonomy.cdm.model.common.TimePeriod;
19
20 /**
21 * <p>PartialElement class.</p>
22 *
23 * @author n.hoffmann
24 * @created Mar 31, 2010
25 */
26 public class PartialElement extends AbstractCdmFormElement implements ISelectable {
27
28 private Label label;
29 private NumberWithLabelElement number_day;
30 private NumberWithLabelElement number_month;
31 private NumberWithLabelElement number_year;
32 private Partial partial;
33
34 /**
35 * <p>Constructor for PartialElement.</p>
36 *
37 * @param formFactory a {@link eu.eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
38 * @param formElement a {@link eu.etaxonomy.taxeditor.ui.element.forms.ICdmFormElement} object.
39 * @param labelString a {@link java.lang.String} object.
40 * @param style a int.
41 */
42 public PartialElement(CdmFormFactory formFactory,
43 ICdmFormElement formElement, String labelString, int style) {
44 super(formFactory, formElement);
45
46 TableWrapLayout layout = LayoutConstants.LAYOUT(7, false);
47 layout.horizontalSpacing = 5;
48 formElement.getLayoutComposite().setLayout(layout);
49
50 label = formFactory.createLabel(getLayoutComposite(), labelString);
51 addControl(label);
52
53 number_year = formFactory.createNumberTextWithLabelElement(this, "Year", null, style);
54 number_year.setLimits(4, -9999, 9999);
55
56 number_month = formFactory.createNumberTextWithLabelElement(this, "Month", null, style);
57 number_month.setLimits(2, 1, 12);
58
59 number_day = formFactory.createNumberTextWithLabelElement(this, "Day", null, style);
60 number_day.setLimits(2, 1, 31);
61
62
63 formFactory.addPropertyChangeListener(this);
64 }
65
66 /**
67 * <p>Setter for the field <code>partial</code>.</p>
68 *
69 * @param partial a {@link org.joda.time.Partial} object.
70 */
71 public void setPartial(Partial partial){
72 this.partial = partial;
73
74 if(partial != null){
75 number_day.setNumber(TimePeriod.getPartialValue(partial, TimePeriod.DAY_TYPE));
76 number_month.setNumber(TimePeriod.getPartialValue(partial, TimePeriod.MONTH_TYPE));
77 number_year.setNumber(TimePeriod.getPartialValue(partial, TimePeriod.YEAR_TYPE));
78 }
79 }
80
81 /**
82 * <p>Getter for the field <code>partial</code>.</p>
83 *
84 * @return a {@link org.joda.time.Partial} object.
85 */
86 public Partial getPartial(){
87 return partial;
88 }
89
90 /** {@inheritDoc} */
91 @Override
92 public void propertyChange(PropertyChangeEvent event) {
93 if(event == null){
94 return;
95 }
96
97 Object eventSource = event.getSource();
98
99 if(getElements().contains(eventSource)){
100 if(event instanceof CdmPropertyChangeEvent){
101 if(((CdmPropertyChangeEvent) event).hasException()){
102 handleException((CdmPropertyChangeEvent) event);
103 return;
104 }
105 }
106 handleEvent(eventSource);
107 }
108 }
109
110 /**
111 * @param event
112 */
113 private void handleException(CdmPropertyChangeEvent event) {
114 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event.getException()));
115 }
116
117 private void handleEvent(Object eventSource){
118 if(eventSource == number_month){
119 if (number_month.getInteger() == null || number_month.getInteger() == 0){
120 partial = TimePeriod.setPartialField(partial, null, TimePeriod.MONTH_TYPE);
121 } else{
122 partial = TimePeriod.setPartialField(partial, number_month.getInteger(), TimePeriod.MONTH_TYPE);
123 }
124
125 }else if(eventSource == number_day){
126 if (number_day.getInteger() == null || number_day.getInteger() == 0){
127 partial = TimePeriod.setPartialField(partial, null, TimePeriod.DAY_TYPE);
128 } else{
129 partial = TimePeriod.setPartialField(partial, number_day.getInteger(), TimePeriod.DAY_TYPE);
130 }
131
132
133 }else if(eventSource == number_year){
134 if (number_year.getInteger() == null || number_year.getInteger() == 0){
135 partial = TimePeriod.setPartialField(partial, null, TimePeriod.YEAR_TYPE);
136 } else{
137 partial = TimePeriod.setPartialField(partial, number_year.getInteger(), TimePeriod.YEAR_TYPE);
138 }
139
140 }
141 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
142 }
143
144 /** {@inheritDoc} */
145 @Override
146 public void setBackground(Color color) {
147 label.setBackground(color);
148 }
149
150 @Override
151 public void setSelected(boolean selected) {
152 setBackground(selected ? SELECTED : getPersistentBackground());
153 }
154 }