Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.directory.studio.valueeditors.time; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.SimpleTimeZone; import java.util.TimeZone; import org.apache.directory.api.util.GeneralizedTime; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.valueeditors.ValueEditorsActivator; import org.apache.directory.studio.valueeditors.ValueEditorsConstants; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Text; /** * This class provides a dialog to define a generalized time. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class GeneralizedTimeValueDialog extends Dialog { /** The value */ private GeneralizedTime value; /** The list, containing all time zones, bound to the combo viewer */ private ArrayList<TimeZone> allTimezonesList = new ArrayList<TimeZone>(); /** The UTC times zones map */ private Map<Integer, TimeZone> utcTimezonesMap = new HashMap<Integer, TimeZone>(); // // UI Fields // // Time private Spinner hoursSpinner; private Spinner minutesSpinner; private Spinner secondsSpinner; // Date private DateTime dateCalendar; // Time zone private ComboViewer timezoneComboViewer; // Raw value private Text rawValueText; // Raw validator private Label rawValueValidatorImage; // Discard fraction checkbox private Button discardFractionCheckbox; /** The OK button of the dialog */ private Button okButton; // // Listeners // /** * The modify listener of the hours field. */ private ModifyListener hoursModifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { updateValueFromNonRawFields(); removeListeners(); updateRawFields(); addListeners(); } }; /** * The modify listener of the minutes field. */ private ModifyListener minutesModifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { updateValueFromNonRawFields(); removeListeners(); updateRawFields(); addListeners(); } }; /** * The modify listener of the seconds field. */ private ModifyListener secondsModifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { updateValueFromNonRawFields(); removeListeners(); updateRawFields(); addListeners(); } }; /** * The selection listener of the calendar. */ private SelectionListener dateSelectionListener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { updateValueFromNonRawFields(); removeListeners(); updateRawFields(); addListeners(); } }; /** * The selection changed listener of the time zone combo. */ private ISelectionChangedListener timezoneSelectionChangedListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateValueFromNonRawFields(); removeListeners(); updateRawFields(); addListeners(); } }; /** * The modify listener of the raw field. */ private ModifyListener rawValueModifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { try { value = new GeneralizedTime(rawValueText.getText()); removeListeners(); updateNonRawFields(); addListeners(); validateRawValue(true); } catch (ParseException e1) { validateRawValue(false); return; } } }; private SelectionListener discardFractionCheckboxSelectionListener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeListeners(); updateRawFields(); addListeners(); } }; /** * Creates a new instance of GeneralizedTimeValueDialog. * * @param parentShell * the parent shell * @param value * the initial value */ public GeneralizedTimeValueDialog(Shell parentShell, GeneralizedTime value) { super(parentShell); super.setShellStyle(super.getShellStyle() | SWT.RESIZE); this.value = value; // If the initial value is null, we take the current date/time if (this.value == null) { this.value = new GeneralizedTime(Calendar.getInstance()); } } /** * {@inheritDoc} */ protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(Messages.getString("GeneralizedTimeValueDialog.DateAndTimeEditor")); //$NON-NLS-1$ shell.setImage( ValueEditorsActivator.getDefault().getImage(ValueEditorsConstants.IMG_GENERALIZEDTIMEEDITOR)); } /** * {@inheritDoc} */ protected void createButtonsForButtonBar(Composite parent) { okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * {@inheritDoc} */ protected void okPressed() { // Checking if we need to discard the fraction if (discardFractionCheckbox.getSelection()) { // Removing the fraction from the value Calendar calendar = value.getCalendar(); calendar.set(Calendar.MILLISECOND, 0); value = new GeneralizedTime(calendar); } // Saving the dialog settings ValueEditorsActivator.getDefault().getDialogSettings().put( ValueEditorsConstants.DIALOGSETTING_KEY_DATE_EDITOR_DISCARD_FRACTION, discardFractionCheckbox.getSelection()); super.okPressed(); } /** * {@inheritDoc} */ protected Control createDialogArea(Composite parent) { // Main composites Composite composite = (Composite) super.createDialogArea(parent); Composite dualComposite = BaseWidgetUtils.createColumnContainer(composite, 2, 1); // Creating dialog areas createTimeDialogArea(dualComposite); createDateDialogArea(dualComposite); createTimeZoneDialogArea(dualComposite); createRawValueDialogArea(dualComposite); // Getting the dialog settings discardFractionCheckbox.setSelection(ValueEditorsActivator.getDefault().getDialogSettings() .getBoolean(ValueEditorsConstants.DIALOGSETTING_KEY_DATE_EDITOR_DISCARD_FRACTION)); // Initializing with initial value initWithInitialValue(); // Adding listeners addListeners(); applyDialogFont(composite); return composite; } /** * Creates the "Time" dialog area. * * @param parent * the parent composite */ private void createTimeDialogArea(Composite parent) { // Label Label timeLabel = new Label(parent, SWT.NONE); timeLabel.setText(Messages.getString("GeneralizedTimeValueDialog.Time")); //$NON-NLS-1$ Composite rightComposite = BaseWidgetUtils.createColumnContainer(parent, 5, 1); // Hours hoursSpinner = new Spinner(rightComposite, SWT.BORDER); hoursSpinner.setMinimum(0); hoursSpinner.setMaximum(23); hoursSpinner.setTextLimit(2); hoursSpinner.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); Label label1 = BaseWidgetUtils.createLabel(rightComposite, ":", 1); //$NON-NLS-1$ label1.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); // Minutes minutesSpinner = new Spinner(rightComposite, SWT.BORDER); minutesSpinner.setMinimum(0); minutesSpinner.setMaximum(59); minutesSpinner.setTextLimit(2); minutesSpinner.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); Label label2 = BaseWidgetUtils.createLabel(rightComposite, ":", 1); //$NON-NLS-1$ label2.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); // Seconds secondsSpinner = new Spinner(rightComposite, SWT.BORDER); secondsSpinner.setMinimum(0); secondsSpinner.setMaximum(59); secondsSpinner.setTextLimit(2); secondsSpinner.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); } /** * Creates the "Date" dialog area. * * @param parent * the parent composite */ private void createDateDialogArea(Composite parent) { // Label Label dateLabel = BaseWidgetUtils.createLabel(parent, Messages.getString("GeneralizedTimeValueDialog.Date"), //$NON-NLS-1$ 1); dateLabel.setLayoutData(new GridData(SWT.NONE, SWT.TOP, false, false)); Composite rightComposite = BaseWidgetUtils.createColumnContainer(parent, 1, 1); // Calendar dateCalendar = new DateTime(rightComposite, SWT.CALENDAR | SWT.BORDER); dateCalendar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); } /** * Creates the "Time Zone" dialog area. * * @param parent * the parent composite */ private void createTimeZoneDialogArea(Composite parent) { // Label BaseWidgetUtils.createLabel(parent, Messages.getString("GeneralizedTimeValueDialog.Timezone"), 1); //$NON-NLS-1$ // Combo viewer timezoneComboViewer = new ComboViewer(parent); GridData timezoneGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); timezoneGridData.widthHint = 50; timezoneComboViewer.getCombo().setLayoutData(timezoneGridData); // Adding ContentProvider, LabelProvider timezoneComboViewer.setContentProvider(new ArrayContentProvider()); timezoneComboViewer.setLabelProvider(new LabelProvider() { public String getText(Object element) { return ((TimeZone) element).getID(); } }); // Initializing the time zones list and map initAllTimezones(); timezoneComboViewer.setInput(allTimezonesList); } /** * Initializes all the time zones. */ private void initAllTimezones() { initUtcTimezones(); initContinentsAndCitiesTimezones(); } /** * Initializes all the "UTC+/-xxxx" time zones. */ private void initUtcTimezones() { addUtcTimezone("UTC-12", -1 * (12 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-11", -1 * (11 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-10", -1 * (10 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-9:30", -1 * (((9 * 60) + 30) * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-9", -1 * (9 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-8", -1 * (8 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-7", -1 * (7 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-6", -1 * (6 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-5", -1 * (5 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-4:30", -1 * (((4 * 60) + 30) * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-4", -1 * (4 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-3:30", -1 * (((3 * 60) + 30) * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-3", -1 * (3 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-2", -1 * (2 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC-1", -1 * (1 * 60 * 60 * 1000)); //$NON-NLS-1$ addUtcTimezone("UTC", 0); //$NON-NLS-1$ addUtcTimezone("UTC+1", 1 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+2", 2 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+3", 3 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+3:30", ((3 * 60) + 30) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+4", 4 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+4:30", ((4 * 60) + 30) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+5", 5 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+5:30", ((5 * 60) + 30) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+5:45", ((5 * 60) + 45) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+6", 6 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+6:30", ((6 * 60) + 30) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+7", 7 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+8", 8 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+8:45", ((8 * 60) + 45) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+9", 9 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+9:30", ((9 * 60) + 30) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+10", 10 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+10:30", ((10 * 60) + 30) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+11", 11 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+11:30", ((11 * 60) + 30) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+12", 12 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+12:45", ((12 * 60) + 45) * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+13", 13 * 60 * 60 * 1000); //$NON-NLS-1$ addUtcTimezone("UTC+14", 14 * 60 * 60 * 1000); //$NON-NLS-1$ } /** * Adds an UTC time zone. * * @param tz * a time zone to add */ private void addUtcTimezone(String id, int rawOffset) { TimeZone tz = rawOffset == 0 ? TimeZone.getTimeZone("UTC") : new SimpleTimeZone(rawOffset, id); //$NON-NLS-1$ allTimezonesList.add(tz); utcTimezonesMap.put(rawOffset, tz); } /** * Initializes all the continents and cities time zones. */ private void initContinentsAndCitiesTimezones() { List<TimeZone> continentsAndCitiesTimezonesList = new ArrayList<TimeZone>(); // Getting all e time zones from the following continents : // * Africa // * America // * Asia // * Atlantic // * Australia // * Europe // * Indian // * Pacific for (String timezoneId : TimeZone.getAvailableIDs()) { if (timezoneId.matches("^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*")) //$NON-NLS-1$ { continentsAndCitiesTimezonesList.add(TimeZone.getTimeZone(timezoneId)); } } // Sorting the list by ID Collections.sort(continentsAndCitiesTimezonesList, new Comparator<TimeZone>() { public int compare(final TimeZone a, final TimeZone b) { return a.getID().compareTo(b.getID()); } }); allTimezonesList.addAll(continentsAndCitiesTimezonesList); } /** * Creates the "Raw value" dialog area. * * @param parent * the parent composite */ private void createRawValueDialogArea(Composite parent) { // Separator Label separatorLabel = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); separatorLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); // Label BaseWidgetUtils.createLabel(parent, Messages.getString("GeneralizedTimeValueDialog.RawValue"), 1); //$NON-NLS-1$ // Raw composite Composite rawValueComposite = BaseWidgetUtils.createColumnContainer(parent, 2, 1); // Text rawValueText = BaseWidgetUtils.createText(rawValueComposite, "", 1); //$NON-NLS-1$ // Validator image rawValueValidatorImage = new Label(rawValueComposite, SWT.NONE); // Discard fraction checkbox discardFractionCheckbox = BaseWidgetUtils.createCheckbox(parent, Messages.getString("GeneralizedTimeValueDialog.DiscardFraction"), 2); validateRawValue(true); } /** * Initializes the UI with the value. */ private void initWithInitialValue() { updateNonRawFields(); updateRawFields(); } /** * Update the non-raw UI fields. */ private void updateNonRawFields() { Calendar calendar = value.getCalendar(); // Time hoursSpinner.setSelection(calendar.get(Calendar.HOUR_OF_DAY)); minutesSpinner.setSelection(calendar.get(Calendar.MINUTE)); secondsSpinner.setSelection(calendar.get(Calendar.SECOND)); // Date dateCalendar.setDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); // Time zone TimeZone timezone = utcTimezonesMap.get(new Integer(calendar.getTimeZone().getRawOffset())); if (timezone == null) { timezoneComboViewer.setSelection(null); } else { timezoneComboViewer.setSelection(new StructuredSelection(timezone)); } } /** * Update the raw UI fields. */ private void updateRawFields() { // Raw value if (discardFractionCheckbox.getSelection()) { rawValueText.setText(value.toGeneralizedTimeWithoutFraction()); } else { rawValueText.setText(value.toGeneralizedTime()); } validateRawValue(true); } /** * Validates the raw value. * * @param bool * <code>true</code> to set the raw value as valid * <code>false</code> to set the raw value as invalid */ private void validateRawValue(boolean bool) { if (bool) { rawValueValidatorImage .setImage(ValueEditorsActivator.getDefault().getImage(ValueEditorsConstants.IMG_TEXTFIELD_OK)); } else { rawValueValidatorImage.setImage( ValueEditorsActivator.getDefault().getImage(ValueEditorsConstants.IMG_TEXTFIELD_ERROR)); } if (okButton != null && !okButton.isDisposed()) { okButton.setEnabled(bool); } } /** * Adds the listeners to the UI fields. */ private void addListeners() { // Hours hoursSpinner.addModifyListener(hoursModifyListener); // Minutes minutesSpinner.addModifyListener(minutesModifyListener); // Seconds secondsSpinner.addModifyListener(secondsModifyListener); // Calendar dateCalendar.addSelectionListener(dateSelectionListener); // Time zone timezoneComboViewer.addSelectionChangedListener(timezoneSelectionChangedListener); // Raw value rawValueText.addModifyListener(rawValueModifyListener); // Discard fraction checkbox discardFractionCheckbox.addSelectionListener(discardFractionCheckboxSelectionListener); } /** * Removes the listeners from the UI fields. */ private void removeListeners() { // Hours hoursSpinner.removeModifyListener(hoursModifyListener); // Minutes minutesSpinner.removeModifyListener(minutesModifyListener); // Seconds secondsSpinner.removeModifyListener(secondsModifyListener); // Calendar dateCalendar.removeSelectionListener(dateSelectionListener); // Time zone timezoneComboViewer.removeSelectionChangedListener(timezoneSelectionChangedListener); // Raw value rawValueText.removeModifyListener(rawValueModifyListener); // Discard fraction checkbox discardFractionCheckbox.removeSelectionListener(discardFractionCheckboxSelectionListener); } /** * Updates the value using the non raw fields. */ private void updateValueFromNonRawFields() { // Retain the format of the GeneralizedTime value // by only updating its calendar object. Calendar calendar = value.getCalendar(); // Time calendar.set(Calendar.HOUR_OF_DAY, hoursSpinner.getSelection()); calendar.set(Calendar.MINUTE, minutesSpinner.getSelection()); calendar.set(Calendar.SECOND, secondsSpinner.getSelection()); // Date calendar.set(Calendar.YEAR, dateCalendar.getYear()); calendar.set(Calendar.MONTH, dateCalendar.getMonth()); calendar.set(Calendar.DAY_OF_MONTH, dateCalendar.getDay()); // Time zone StructuredSelection selection = (StructuredSelection) timezoneComboViewer.getSelection(); if ((selection != null) && (!selection.isEmpty())) { calendar.setTimeZone((TimeZone) selection.getFirstElement()); } } /** * Gets the {@link GeneralizedTime} value. * * @return * the {@link GeneralizedTime} value */ public GeneralizedTime getGeneralizedTime() { return value; } }