merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / DateDetailSection.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.ui.element;
12
13 import org.eclipse.jface.util.PropertyChangeEvent;
14 import org.eclipse.swt.widgets.Text;
15 import org.joda.time.Partial;
16
17 import eu.etaxonomy.cdm.common.CdmUtils;
18 import eu.etaxonomy.cdm.model.common.TimePeriod;
19 import eu.etaxonomy.cdm.strategy.parser.TimePeriodParser;
20 import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
21
22 /**
23 * <p>
24 * DateDetailSection class.
25 * </p>
26 *
27 * @author n.hoffmann
28 * @created Mar 31, 2010
29 * @version 1.0
30 */
31 public class DateDetailSection extends AbstractFormSection<TimePeriod> {
32
33 private final TextWithLabelElement text_freeText;
34 private final PartialElement partialElement_start;
35 private final PartialElement partialElement_end;
36 private final TextWithLabelElement text_parseText;
37 private int cursorPosition;
38
39 /**
40 * <p>
41 * Constructor for DateDetailSection.
42 * </p>
43 *
44 * @param formFactory
45 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
46 * object.
47 * @param parentElement
48 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
49 * object.
50 * @param style
51 * a int.
52 */
53 protected DateDetailSection(CdmFormFactory formFactory,
54 ICdmFormElement parentElement, int style) {
55 super(formFactory, parentElement, style);
56
57 partialElement_start = formFactory.createPartialElement(this,
58 "Start: ", null, style);
59 partialElement_end = formFactory.createPartialElement(this, "End: ",
60 null, style);
61
62 text_parseText = formFactory.createTextWithLabelElement(this, "Parse",
63 null, style);
64 text_parseText.getMainControl().setLayoutData(
65 LayoutConstants.FILL_HORIZONTALLY(6, 1));
66
67 text_freeText = formFactory.createTextWithLabelElement(this,
68 "Freetext", null, style);
69 text_freeText.getMainControl().setLayoutData(
70 LayoutConstants.FILL_HORIZONTALLY(6, 1));
71
72 formFactory.addPropertyChangeListener(this);
73 }
74
75 @Override
76 public TimePeriod getEntity() {
77 if(super.getEntity() == null){
78 setEntity(TimePeriod.NewInstance());
79 }
80 return super.getEntity();
81 }
82
83 /**
84 * <p>
85 * Setter for the field <code>timePeriod</code>.
86 * </p>
87 *
88 * @param timePeriod
89 * a {@link eu.etaxonomy.cdm.model.common.TimePeriod} object.
90 */
91 @Override
92 public void setEntity(TimePeriod timePeriod) {
93 setEntityInternally(timePeriod);
94 updateTitle();
95 text_parseText.setText(timePeriod.toString());
96 }
97
98 /**
99 * When setting the entity through parsing we do not want to alter the parse field
100 * @param timePeriod
101 */
102 private void setEntityInternally(TimePeriod timePeriod){
103 Partial start = timePeriod.getStart();
104 partialElement_start.setPartial(start);
105 Partial end = timePeriod.getEnd();
106 partialElement_end.setPartial(end);
107
108 ((Text) text_parseText.getMainControl()).setSelection(cursorPosition);
109 text_freeText.setText(timePeriod.getFreeText());
110
111 super.setEntity(timePeriod);
112 }
113
114 /** {@inheritDoc} */
115 @Override
116 public void propertyChange(PropertyChangeEvent event) {
117 if (event == null) {
118 return;
119 }
120 Object eventSource = event.getSource();
121
122 if (getElements().contains(eventSource)) {
123 if (event instanceof CdmPropertyChangeEvent) {
124 if (((CdmPropertyChangeEvent) event).hasException()) {
125 handleException((CdmPropertyChangeEvent) event);
126 return;
127 }
128 }
129 handleEvent(eventSource);
130 }
131 }
132
133 /**
134 * @param event
135 */
136 private void handleException(CdmPropertyChangeEvent event) {
137 firePropertyChangeEvent(new CdmPropertyChangeEvent(this,
138 event.getException()));
139 }
140
141 private void handleEvent(Object eventSource) {
142 if (eventSource == partialElement_start) {
143 Partial start = partialElement_start.getPartial();
144 getEntity().setStart(start);
145 } else if (eventSource == partialElement_end) {
146 Partial end = partialElement_end.getPartial();
147 getEntity().setEnd(end);
148 } else if (eventSource == text_parseText) {
149 cursorPosition = ((Text) text_parseText.getMainControl())
150 .getCaretPosition();
151 setEntityInternally(TimePeriodParser.parseString(text_parseText.getText()));
152 } else if (eventSource == text_freeText) {
153 getEntity().setFreeText(text_freeText.getText());
154 }
155 updateTitle();
156 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
157 }
158
159 private void updateTitle(){
160 String title = CdmUtils.Nz(getEntity().toString());
161 this.setText(title);
162 layout();
163 }
164
165 /*
166 * (non-Javadoc)
167 *
168 * @see eu.etaxonomy.taxeditor.forms.AbstractFormSection#dispose()
169 */
170 /** {@inheritDoc} */
171 @Override
172 public void dispose() {
173 formFactory.removePropertyChangeListener(this);
174 super.dispose();
175 }
176
177 }