Merge branch 'release/5.19.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / mvc / element / DateElement.java
1 /**
2 * Copyright (C) 2014 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 package eu.etaxonomy.taxeditor.ui.mvc.element;
10
11 import org.eclipse.swt.SWT;
12 import org.eclipse.swt.events.DisposeEvent;
13 import org.eclipse.swt.events.DisposeListener;
14 import org.eclipse.swt.events.SelectionAdapter;
15 import org.eclipse.swt.events.SelectionEvent;
16 import org.eclipse.swt.graphics.Image;
17 import org.eclipse.swt.layout.GridData;
18 import org.eclipse.swt.layout.GridLayout;
19 import org.eclipse.swt.widgets.Button;
20 import org.eclipse.swt.widgets.Composite;
21 import org.eclipse.swt.widgets.DateTime;
22 import org.eclipse.swt.widgets.Display;
23 import org.eclipse.swt.widgets.Shell;
24 import org.eclipse.swt.widgets.Text;
25 import org.eclipse.ui.forms.widgets.FormToolkit;
26 import org.eclipse.ui.forms.widgets.TableWrapLayout;
27 import org.joda.time.DateTimeZone;
28
29 import eu.etaxonomy.taxeditor.model.ImageResources;
30 import eu.etaxonomy.taxeditor.ui.element.CacheRelevance;
31 import eu.etaxonomy.taxeditor.ui.element.CacheRelevanceHelper;
32 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
33 import eu.etaxonomy.taxeditor.ui.element.ICacheRelevantFormElement;
34 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
35 import eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement;
36 import eu.etaxonomy.taxeditor.ui.mvc.AbstractCdmComposite;
37
38 /**
39 * @author pplitzner
40 * @date 16.06.2014
41 */
42 public class DateElement
43 extends AbstractCdmComposite<DateElementController>
44 implements ICacheRelevantFormElement {
45
46 private static final String pattern = "yyyy-MM-dd HH:mm";
47
48 private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
49 private org.joda.time.DateTime initialDateTime;
50 private final Text textDate;
51 private final Button openDateDialog;
52
53 protected CacheRelevanceHelper cacheRelevanceHelper = new CacheRelevanceHelper();
54
55 /**
56 * Create the composite.
57 */
58 public DateElement(Composite parent, org.joda.time.DateTime initDateTime, String label, int style, boolean editableText) {
59 super(parent, style);
60 if (initDateTime != null){
61 this.initialDateTime = initDateTime.toDateTime(DateTimeZone.UTC);
62 }
63
64 addDisposeListener(new DisposeListener() {
65 @Override
66 public void widgetDisposed(DisposeEvent e) {
67 toolkit.dispose();
68 }
69 });
70 toolkit.adapt(this);
71 toolkit.paintBordersFor(this);
72 {
73 TableWrapLayout tableWrapLayout = new TableWrapLayout();
74 tableWrapLayout.verticalSpacing = 0;
75 tableWrapLayout.topMargin = 0;
76 tableWrapLayout.rightMargin = 0;
77 tableWrapLayout.leftMargin = 0;
78 tableWrapLayout.horizontalSpacing = 0;
79 tableWrapLayout.bottomMargin = 0;
80 setLayout(tableWrapLayout);
81 }
82
83 Composite composite = new Composite (this, SWT.NONE);
84 GridLayout layout = new GridLayout ();
85
86 layout.numColumns = 2;
87 layout.marginWidth = 0;
88
89 composite.setLayout(layout);
90
91
92 textDate = toolkit.createText(composite, null, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
93
94 textDate.setEditable(editableText);
95
96 GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
97 gridData.minimumWidth = 100;
98
99 textDate.setLayoutData(gridData);
100 openDateDialog = new Button (composite, SWT.PUSH);
101 Image image = ImageResources.getImage(ImageResources.DATE);
102 // openDateDialog.setText ("Open Date Dialog");
103 openDateDialog.setImage(image);
104
105 openDateDialog.addSelectionListener (new SelectionAdapter() {
106 @Override
107 public void widgetSelected(SelectionEvent e){
108 final Shell dialog = new Shell (parent.getShell(), SWT.DIALOG_TRIM);
109
110 dialog.setLayout (new GridLayout (3, false));
111 dialog.setText(label);
112
113 final DateTime calendar = new DateTime (dialog, SWT.CALENDAR | SWT.BORDER);
114
115 final DateTime time = new DateTime (dialog, SWT.TIME | SWT.SHORT);
116 if (initialDateTime != null){
117 calendar.setDate(initialDateTime.getYear(), initialDateTime.getMonthOfYear()-1, initialDateTime.getDayOfMonth());
118 time.setHours(initialDateTime.getHourOfDay());
119 time.setMinutes(initialDateTime.getMinuteOfHour());
120 // time.setSeconds(initialDateTime.getSecondOfMinute());
121 }
122
123 // new Label (dialog, SWT.NONE);
124 // new Label (dialog, SWT.NONE);
125 Button ok = new Button (dialog, SWT.PUSH);
126 ok.setText ("OK");
127 ok.setLayoutData(new GridData (SWT.FILL, SWT.CENTER, false, false));
128 ok.addSelectionListener (new SelectionAdapter() {
129 @Override
130 public void widgetSelected(SelectionEvent e){
131 setData(makeZonedTimeFromSWT(calendar, time));
132 dialog.close ();
133 }
134 });
135 dialog.setDefaultButton (ok);
136 dialog.pack ();
137 dialog.open ();
138 }
139 });
140
141 toolkit.adapt(textDate, true, true);
142 }
143
144 @Override
145 protected void initInternalController(CdmFormFactory formFactory, ICdmFormElement parentElement) {
146 controller = new DateElementController(this, formFactory, parentElement, initialDateTime);
147 formFactory.adapt(controller);
148 }
149 public Text getTextDate() {
150 return textDate;
151 }
152
153 public static org.joda.time.DateTime makeZonedTimeFromSWT(
154 org.eclipse.swt.widgets.DateTime widget,
155 org.eclipse.swt.widgets.DateTime dateTime) {
156 //the first month of the year is 0
157 return new org.joda.time.DateTime(widget.getYear(),
158 widget.getMonth()+1,
159 widget.getDay(),
160 dateTime.getHours(),
161 dateTime.getMinutes(),
162 0,
163 0,
164 DateTimeZone.UTC);
165 }
166
167 public static void updateSWTwithJoda(
168 org.eclipse.swt.widgets.DateTime widget,
169 DateTime dateTime) {
170 widget.setYear(dateTime.getYear());
171 widget.setMonth(dateTime.getMonth() -1);
172 widget.setDay(dateTime.getDay());
173 widget.setHours(dateTime.getHours());
174 widget.setMinutes(dateTime.getMinutes());
175 }
176
177 public void setData (org.joda.time.DateTime data) {
178 this.initialDateTime = data;
179 this.controller.setDateTime(data);
180 this.textDate.setText(initialDateTime.toString(pattern));
181 }
182
183 @Override
184 public void updateCacheRelevance() {
185 textDate.setBackground(cacheRelevance().getColor());
186 }
187
188 @Override
189 public void addDependsOnCache(ToggleableTextElement cacheElement) {
190 cacheRelevanceHelper.addDependsOnCache(cacheElement);
191 }
192
193 @Override
194 public CacheRelevance cacheRelevance() {
195 return cacheRelevanceHelper.cacheRelevance();
196 }
197 }