1 /*******************************************************************************
2 * Copyright (c) 2012, 2013 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.ui
.properties
;
15 import org
.eclipse
.jface
.preference
.IPreferenceStore
;
16 import org
.eclipse
.jface
.preference
.PreferencePage
;
17 import org
.eclipse
.jface
.preference
.RadioGroupFieldEditor
;
18 import org
.eclipse
.jface
.util
.IPropertyChangeListener
;
19 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
20 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimestampFormat
;
21 import org
.eclipse
.swt
.SWT
;
22 import org
.eclipse
.swt
.events
.SelectionEvent
;
23 import org
.eclipse
.swt
.events
.SelectionListener
;
24 import org
.eclipse
.swt
.layout
.GridData
;
25 import org
.eclipse
.swt
.layout
.GridLayout
;
26 import org
.eclipse
.swt
.widgets
.Composite
;
27 import org
.eclipse
.swt
.widgets
.Control
;
28 import org
.eclipse
.swt
.widgets
.Label
;
29 import org
.eclipse
.swt
.widgets
.Text
;
30 import org
.eclipse
.ui
.IWorkbench
;
31 import org
.eclipse
.ui
.IWorkbenchPreferencePage
;
34 * The TMF timestamp format configuration page. This page is used to select
35 * the global timestamp and interval time formats (for display and parsing).
36 * The user can either pick a pre-defined format or enter his/her own.
39 * @author Francois Chouinard
42 public class TmfTimestampFormatPage
extends PreferencePage
implements IWorkbenchPreferencePage
, SelectionListener
, IPropertyChangeListener
{
44 // ------------------------------------------------------------------------
46 // ------------------------------------------------------------------------
48 // Date and Time formats
49 private static final String
[][] fDateTimeFormats
= new String
[][] {
50 { TmfTimePreferences
.DATE_YEAR_FMT
, TmfTimePreferences
.DATE_YEAR_FMT
},
51 { TmfTimePreferences
.DATE_YEAR2_FMT
, TmfTimePreferences
.DATE_YEAR2_FMT
},
52 { TmfTimePreferences
.DATE_MONTH_FMT
, TmfTimePreferences
.DATE_MONTH_FMT
},
53 { TmfTimePreferences
.DATE_DAY_FMT
, TmfTimePreferences
.DATE_DAY_FMT
},
54 { TmfTimePreferences
.DATE_JDAY_FMT
, TmfTimePreferences
.DATE_JDAY_FMT
},
55 { TmfTimePreferences
.TIME_HOUR_FMT
, TmfTimePreferences
.TIME_HOUR_FMT
},
56 { TmfTimePreferences
.TIME_MINUTE_FMT
, TmfTimePreferences
.TIME_MINUTE_FMT
},
57 { TmfTimePreferences
.TIME_SECOND_FMT
, TmfTimePreferences
.TIME_SECOND_FMT
},
58 { TmfTimePreferences
.TIME_ELAPSED_FMT
+ " (secs in epoch)", TmfTimePreferences
.TIME_ELAPSED_FMT
}, //$NON-NLS-1$
59 { "(none)", TmfTimePreferences
.TIME_NO_FMT
}, //$NON-NLS-1$
63 private static final String
[][] fSubSecondFormats
= new String
[][] {
64 { TmfTimePreferences
.SUBSEC_MILLI_FMT
+ " (ms)", TmfTimePreferences
.SUBSEC_MILLI_FMT
}, //$NON-NLS-1$
65 { TmfTimePreferences
.SUBSEC_MICRO_FMT
+ " (µs)", TmfTimePreferences
.SUBSEC_MICRO_FMT
}, //$NON-NLS-1$
66 { TmfTimePreferences
.SUBSEC_NANO_FMT
+ " (ns)", TmfTimePreferences
.SUBSEC_NANO_FMT
}, //$NON-NLS-1$
69 // Date and Time delimiters
70 private static final String
[][] fDateTimeDelimiters
= new String
[][] {
71 { "(none)", TmfTimePreferences
.DELIMITER_NONE
}, //$NON-NLS-1$
72 { " (space)", TmfTimePreferences
.DELIMITER_SPACE
}, //$NON-NLS-1$
73 { ", (comma)", TmfTimePreferences
.DELIMITER_COMMA
}, //$NON-NLS-1$
74 { "- (dash)", TmfTimePreferences
.DELIMITER_DASH
}, //$NON-NLS-1$
75 { "_ (underline)", TmfTimePreferences
.DELIMITER_UNDERLINE
}, //$NON-NLS-1$
76 { ": (colon)", TmfTimePreferences
.DELIMITER_COLON
}, //$NON-NLS-1$
77 { "; (semicolon)", TmfTimePreferences
.DELIMITER_SEMICOLON
}, //$NON-NLS-1$
78 { "/ (slash)", TmfTimePreferences
.DELIMITER_SLASH
}, //$NON-NLS-1$
79 { "\" (dbl-quote)", TmfTimePreferences
.DELIMITER_DQUOT
}, //$NON-NLS-1$
82 // Sub-Second delimiters
83 private static final String
[][] fSubSecondDelimiters
= new String
[][] {
84 { "(none)", TmfTimePreferences
.DELIMITER_NONE
}, //$NON-NLS-1$
85 { " (space)", TmfTimePreferences
.DELIMITER_SPACE
}, //$NON-NLS-1$
86 { ", (comma)", TmfTimePreferences
.DELIMITER_COMMA
}, //$NON-NLS-1$
87 { "- (dash)", TmfTimePreferences
.DELIMITER_DASH
}, //$NON-NLS-1$
88 { "_ (underline)", TmfTimePreferences
.DELIMITER_UNDERLINE
}, //$NON-NLS-1$
89 { ": (colon)", TmfTimePreferences
.DELIMITER_COLON
}, //$NON-NLS-1$
90 { "; (semicolon)", TmfTimePreferences
.DELIMITER_SEMICOLON
}, //$NON-NLS-1$
91 { "/ (slash)", TmfTimePreferences
.DELIMITER_SLASH
}, //$NON-NLS-1$
92 { "\" (dbl-quote)", TmfTimePreferences
.DELIMITER_DQUOT
}, //$NON-NLS-1$
93 { ". (period)", TmfTimePreferences
.DELIMITER_PERIOD
}, //$NON-NLS-1$
96 // ------------------------------------------------------------------------
98 // ------------------------------------------------------------------------
101 private Composite fPage
;
102 private IPreferenceStore fPreferenceStore
;
103 private TmfTimePreferences fTimePreference
;
106 private Composite fExampleSection
;
107 private Text fPatternDisplay
;
108 private Text fExampleDisplay
;
109 private String fTimePattern
;
111 // Date/Time format section
112 private RadioGroupFieldEditor fDateTimeFields
;
113 private RadioGroupFieldEditor fSSecFields
;
115 // Delimiters section
116 private RadioGroupFieldEditor fDateFieldDelim
;
117 private RadioGroupFieldEditor fTimeFieldDelim
;
118 private RadioGroupFieldEditor fSSecFieldDelim
;
120 // IPropertyChangeListener data
121 private String fProperty
;
122 private String fChangedProperty
;
124 // ------------------------------------------------------------------------
126 // ------------------------------------------------------------------------
129 * The default constructor
131 public TmfTimestampFormatPage() {
132 fPreferenceStore
= TmfTimePreferences
.getPreferenceStore();
133 fTimePreference
= TmfTimePreferences
.getInstance();
136 // ------------------------------------------------------------------------
137 // IWorkbenchPreferencePage
138 // ------------------------------------------------------------------------
141 public void init(IWorkbench workbench
) {
144 // ------------------------------------------------------------------------
146 // ------------------------------------------------------------------------
149 protected Control
createContents(Composite parent
) {
151 // Overall preference page layout
152 parent
.setLayout(new GridLayout());
153 fPage
= new Composite(parent
, SWT
.NONE
);
154 fPage
.setLayout(new GridLayout());
155 fPage
.setLayoutData(new GridData(
156 GridData
.GRAB_HORIZONTAL
| GridData
.HORIZONTAL_ALIGN_FILL
| GridData
.GRAB_VERTICAL
| GridData
.VERTICAL_ALIGN_FILL
));
159 fExampleSection
= new Composite(fPage
, SWT
.NONE
);
160 fExampleSection
.setLayout(new GridLayout(2, false));
161 fExampleSection
.setLayoutData(new GridData(GridData
.FILL_BOTH
));
163 Label patternLabel
= new Label(fExampleSection
, SWT
.HORIZONTAL
);
164 patternLabel
.setText("Current Format: "); //$NON-NLS-1$
165 fPatternDisplay
= new Text(fExampleSection
, SWT
.BORDER
| SWT
.READ_ONLY
);
166 fPatternDisplay
.setLayoutData(new GridData(GridData
.FILL_HORIZONTAL
));
168 Label exampleLabel
= new Label(fExampleSection
, SWT
.NONE
);
169 exampleLabel
.setText("Sample Display: "); //$NON-NLS-1$
170 fExampleDisplay
= new Text(fExampleSection
, SWT
.BORDER
| SWT
.READ_ONLY
);
171 fExampleDisplay
.setLayoutData(new GridData(GridData
.FILL_HORIZONTAL
));
173 Label separator
= new Label(fPage
, SWT
.SEPARATOR
| SWT
.HORIZONTAL
| SWT
.SHADOW_NONE
);
174 separator
.setLayoutData(
175 new GridData(GridData
.HORIZONTAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
| GridData
.VERTICAL_ALIGN_FILL
));
177 // Date and Time section
178 fDateTimeFields
= new RadioGroupFieldEditor(
179 TmfTimePreferences
.DATIME
, "Date and Time format", 3, fDateTimeFormats
, fPage
, true); //$NON-NLS-1$
180 fDateTimeFields
.setPreferenceStore(fPreferenceStore
);
181 fDateTimeFields
.load();
182 fDateTimeFields
.setPropertyChangeListener(this);
184 // Sub-second section
185 fSSecFields
= new RadioGroupFieldEditor(
186 TmfTimePreferences
.SUBSEC
, "Sub-second format", 3, fSubSecondFormats
, fPage
, true); //$NON-NLS-1$
187 fSSecFields
.setPreferenceStore(fPreferenceStore
);
189 fSSecFields
.setPropertyChangeListener(this);
191 // Separators section
192 fDateFieldDelim
= new RadioGroupFieldEditor(
193 TmfTimePreferences
.DATE_DELIMITER
, "Date delimiter", 5, fDateTimeDelimiters
, fPage
, true); //$NON-NLS-1$
194 fDateFieldDelim
.setPreferenceStore(fPreferenceStore
);
195 fDateFieldDelim
.load();
196 fDateFieldDelim
.setPropertyChangeListener(this);
198 fTimeFieldDelim
= new RadioGroupFieldEditor(
199 TmfTimePreferences
.TIME_DELIMITER
, "Time delimiter", 5, fDateTimeDelimiters
, fPage
, true); //$NON-NLS-1$
200 fTimeFieldDelim
.setPreferenceStore(fPreferenceStore
);
201 fTimeFieldDelim
.load();
202 fTimeFieldDelim
.setPropertyChangeListener(this);
204 fSSecFieldDelim
= new RadioGroupFieldEditor(
205 TmfTimePreferences
.SSEC_DELIMITER
, "Sub-Second Delimiter", 5, fSubSecondDelimiters
, fPage
, true); //$NON-NLS-1$
206 fSSecFieldDelim
.setPreferenceStore(fPreferenceStore
);
207 fSSecFieldDelim
.load();
208 fSSecFieldDelim
.setPropertyChangeListener(this);
210 fTimePreference
.initPatterns();
216 protected void performDefaults() {
217 fDateTimeFields
.loadDefault();
218 fSSecFields
.loadDefault();
219 fDateFieldDelim
.loadDefault();
220 fTimeFieldDelim
.loadDefault();
221 fSSecFieldDelim
.loadDefault();
223 fTimePreference
.setDefaults();
224 fTimePattern
= TmfTimePreferences
.getTimePattern();
229 protected void performApply() {
230 fDateTimeFields
.store();
232 fDateFieldDelim
.store();
233 fTimeFieldDelim
.store();
234 fSSecFieldDelim
.store();
236 TmfTimePreferences
.setTimePattern(fTimePattern
);
241 public boolean performOk() {
243 return super.performOk();
246 // ------------------------------------------------------------------------
248 // ------------------------------------------------------------------------
251 public void widgetSelected(SelectionEvent e
) {
255 public void widgetDefaultSelected(SelectionEvent e
) {
258 // ------------------------------------------------------------------------
259 // IPropertyChangeListener
260 // ------------------------------------------------------------------------
263 public void propertyChange(PropertyChangeEvent event
) {
264 Object source
= event
.getSource();
265 Object value
= event
.getNewValue();
266 if (source
instanceof RadioGroupFieldEditor
&& value
instanceof String
&&
267 !(value
.equals(fChangedProperty
) && source
== fProperty
))
269 fProperty
= ((RadioGroupFieldEditor
) source
).getPreferenceName();
270 fChangedProperty
= (String
) value
;
275 // ------------------------------------------------------------------------
277 // ------------------------------------------------------------------------
279 private void refresh() {
284 void updatePatterns() {
285 if (TmfTimePreferences
.DATIME
.equals(fProperty
)) {
286 fTimePreference
.setDateTimeFormat(fChangedProperty
);
287 } else if (TmfTimePreferences
.SUBSEC
.equals(fProperty
)) {
288 fTimePreference
.setSSecFormat(fChangedProperty
);
289 } else if (TmfTimePreferences
.DATE_DELIMITER
.equals(fProperty
)) {
290 fTimePreference
.setDateFieldSep(fChangedProperty
);
291 } else if (TmfTimePreferences
.TIME_DELIMITER
.equals(fProperty
)) {
292 fTimePreference
.setTimeFieldSep(fChangedProperty
);
293 } else if (TmfTimePreferences
.SSEC_DELIMITER
.equals(fProperty
)) {
294 fTimePreference
.setSSecFieldSep(fChangedProperty
);
296 fTimePreference
.updatePatterns();
297 fTimePattern
= TmfTimePreferences
.getTimePattern();
300 private void displayExample() {
301 long ts
= 1332170682500677380L;
302 fPatternDisplay
.setText(fTimePattern
);
303 fPatternDisplay
.redraw();
305 fExampleDisplay
.setText(new TmfTimestampFormat(fTimePattern
).format(ts
));
306 fExampleDisplay
.redraw();