/** * This file is part of Archiv-Editor. * * The software Archiv-Editor serves as a client user interface for working with * the Person Data Repository. See: pdr.bbaw.de * * The software Archiv-Editor was developed at the Berlin-Brandenburg Academy * of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin. * www.bbaw.de * * Copyright (C) 2010-2013 Berlin-Brandenburg Academy * of Sciences and Humanities * * The software Archiv-Editor was developed by @author: Christoph Plutte. * * Archiv-Editor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Archiv-Editor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Archiv-Editor. * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>. */ package org.bbaw.pdr.ae.view.control.customSWTWidges; import java.util.ArrayList; import org.bbaw.pdr.ae.common.AEConstants; import org.bbaw.pdr.ae.common.AEVIEWConstants; import org.bbaw.pdr.ae.common.CommonActivator; import org.bbaw.pdr.ae.common.NLMessages; import org.bbaw.pdr.ae.metamodel.PdrDate; import org.bbaw.pdr.ae.model.Time; import org.bbaw.pdr.ae.model.TimeStm; import org.bbaw.pdr.ae.view.control.interfaces.IAEBasicEditor; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; public class TimeStmEditorLine extends Composite implements IAEBasicEditor { private TimeStm _timeStm; private Time _timeFrom; private Time _timeTo; private Composite _composite; private Button _dateFromLabel; private Button _dateToButton; private Combo _comboDayFrom; private Combo _comboMonthFrom; private YearSpinner _spinnerYearFrom; private Combo _comboDayTo; private Combo _comboMonthTo; private YearSpinner _spinnerYearTo; private ControlDecoration _decoTimeFrom; private ControlDecoration _decoTimeTo; private boolean _pointOfTime; private boolean _customSetTime = false; private boolean _isDirty = false; private boolean _isValid = true; private IAEBasicEditor _parentEditor; /** The _selection listener. */ private ArrayList<SelectionListener> _selectionListener = new ArrayList<SelectionListener>(); private boolean _editable = true; private boolean _selected; /** The PRESELECTE d_ year. */ private static final int PRESELECTED_YEAR = Platform.getPreferencesService().getInt(CommonActivator.PLUGIN_ID, "ASPECT_PRESELECTED_DATE_YEAR", AEConstants.ASPECT_PRESELECTED_DATE_YEAR, null); public TimeStmEditorLine(IAEBasicEditor parentEditor, TimeStm timeStm, Composite parent, int style) { super(parent, style); _parentEditor = parentEditor; setTimesInternal(timeStm); createEditor(); loadTimeStm(); _composite.pack(); _composite.layout(); // this.setSize(SWT.DEFAULT, 18); // this.pack(); this.layout(); } public final void addSelectionListener(final SelectionListener listener) { if (listener != null) { _selectionListener.add(listener); } } private void createEditor() { this.setLayout(new GridLayout(1, false)); ((GridLayout) this.getLayout()).marginHeight = 0; ((GridLayout) this.getLayout()).verticalSpacing = 0; FocusListener focusListener = new FocusListener() { @Override public void focusGained(final FocusEvent e) { Event ee = new Event(); ee.widget = TimeStmEditorLine.this; SelectionEvent se = new SelectionEvent(ee); for (SelectionListener s : _selectionListener) { s.widgetSelected(se); } } @Override public void focusLost(final FocusEvent e) { } }; _composite = new Composite(this, SWT.NONE); _composite.setLayoutData(new GridData()); ((GridData) _composite.getLayoutData()).horizontalAlignment = SWT.FILL; ((GridData) _composite.getLayoutData()).grabExcessHorizontalSpace = true; _composite.setLayout(new GridLayout(12, false)); ((GridLayout) _composite.getLayout()).marginHeight = 0; ((GridLayout) _composite.getLayout()).verticalSpacing = 0; _dateFromLabel = new Button(_composite, SWT.CHECK); _dateFromLabel.setText(NLMessages.getString("Editor_timeStm_date_from")); _dateFromLabel.setLayoutData(new GridData()); ((GridData) _dateFromLabel.getLayoutData()).horizontalSpan = 1; ((GridData) _dateFromLabel.getLayoutData()).horizontalAlignment = SWT.RIGHT; _dateFromLabel.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { _customSetTime = !_customSetTime; setActivateTime(_customSetTime); contentChanged(); } }); _comboDayFrom = new Combo(_composite, SWT.READ_ONLY); _comboDayFrom.setLayoutData(new GridData()); _comboDayFrom.setItems(AEConstants.DAYS); _comboDayFrom.addFocusListener(focusListener); _comboDayFrom.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent se) { _timeFrom.getTimeStamp().setDay(_comboDayFrom.getSelectionIndex()); contentChanged(); } }); _comboMonthFrom = new Combo(_composite, SWT.READ_ONLY); _comboMonthFrom.setLayoutData(new GridData()); ((GridData) _comboMonthFrom.getLayoutData()).horizontalAlignment = GridData.FILL; ((GridData) _comboMonthFrom.getLayoutData()).grabExcessHorizontalSpace = true; _comboMonthFrom.setItems(AEConstants.MONTHS); _comboMonthFrom.addFocusListener(focusListener); _comboMonthFrom.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent se) { _timeFrom.getTimeStamp().setMonth(_comboMonthFrom.getSelectionIndex()); contentChanged(); } }); _spinnerYearFrom = new YearSpinner(_composite, SWT.BORDER); _spinnerYearFrom.addFocusListener(focusListener); _decoTimeFrom = new ControlDecoration(_spinnerYearFrom, SWT.LEFT | SWT.TOP); _spinnerYearFrom.pack(); _spinnerYearFrom.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent se) { _timeFrom.getTimeStamp().setYear(_spinnerYearFrom.getSelection()); if (_timeFrom.isValid()) { _decoTimeFrom.setImage(null); } else { _decoTimeFrom.setImage(FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage()); } contentChanged(); } }); _dateToButton = new Button(_composite, SWT.CHECK); _dateToButton.setText(NLMessages.getString("Editor_timeStm_date_to")); _dateToButton.setLayoutData(new GridData()); ((GridData) _dateToButton.getLayoutData()).horizontalSpan = 1; ((GridData) _dateToButton.getLayoutData()).horizontalAlignment = SWT.RIGHT; _dateToButton.addFocusListener(focusListener); _dateToButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { _pointOfTime = !_pointOfTime; setPointOfTiem(_pointOfTime); contentChanged(); } }); _comboDayTo = new Combo(_composite, SWT.READ_ONLY); _comboDayTo.setLayoutData(new GridData()); ((GridData) _comboDayTo.getLayoutData()).horizontalAlignment = GridData.FILL; ((GridData) _comboDayTo.getLayoutData()).grabExcessHorizontalSpace = true; _comboDayTo.setItems(AEConstants.DAYS); _comboDayTo.addFocusListener(focusListener); _comboDayTo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent se) { _timeTo.getTimeStamp().setDay(_comboDayTo.getSelectionIndex()); contentChanged(); } }); _comboMonthTo = new Combo(_composite, SWT.READ_ONLY); _comboMonthTo.setLayoutData(new GridData()); ((GridData) _comboMonthTo.getLayoutData()).horizontalAlignment = GridData.FILL; ((GridData) _comboMonthTo.getLayoutData()).grabExcessHorizontalSpace = true; _comboMonthTo.setItems(AEConstants.MONTHS); _comboMonthTo.addFocusListener(focusListener); _comboMonthTo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent se) { _timeTo.getTimeStamp().setMonth(_comboMonthTo.getSelectionIndex()); contentChanged(); } }); _spinnerYearTo = new YearSpinner(_composite, SWT.BORDER); _spinnerYearTo.addFocusListener(focusListener); _decoTimeTo = new ControlDecoration(_spinnerYearTo, SWT.LEFT | SWT.TOP); if (_timeTo.getTimeStamp() != null) { _spinnerYearTo.setSelection(_timeTo.getTimeStamp().getYear()); } else { _decoTimeTo.setImage(FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_REQUIRED).getImage()); } _spinnerYearTo.pack(); _spinnerYearTo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent se) { _timeTo.getTimeStamp().setYear(_spinnerYearTo.getSelection()); if (_timeTo.isValid()) { _decoTimeTo.setImage(null); } else { _decoTimeTo.setImage(FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage()); } contentChanged(); } }); } public TimeStm getTimeStm() { return _timeStm; } @Override public boolean isDirty() { return _isDirty; } @Override public boolean isValid() { return _isValid; } private void loadTimeStm() { if (_timeFrom != null && _timeFrom.getTimeStamp() != null) { _comboDayFrom.select(_timeFrom.getTimeStamp().getDay()); _comboMonthFrom.select(_timeFrom.getTimeStamp().getMonth()); _spinnerYearFrom.setSelection(_timeFrom.getTimeStamp().getYear()); } else { // decoTime.setImage(FieldDecorationRegistry.getDefault() // .getFieldDecoration(FieldDecorationRegistry.DEC_REQUIRED).getImage()); } if (_timeTo != null && _timeTo.getTimeStamp() != null) { _comboDayTo.select(_timeTo.getTimeStamp().getDay()); _comboMonthTo.select(_timeTo.getTimeStamp().getMonth()); _spinnerYearTo.setSelection(_timeTo.getTimeStamp().getYear()); } setActivateTime(_customSetTime); } private void setActivateTime(boolean customSetTime) { if (customSetTime) { if (!_timeStm.getTimes().contains(_timeFrom)) { _timeStm.getTimes().add(_timeFrom); } _timeStm.getTimes().remove(_timeTo); } else { _timeStm.getTimes().remove(_timeFrom); _timeStm.getTimes().remove(_timeTo); _decoTimeFrom.setImage(null); _decoTimeTo.setImage(null); } _comboDayFrom.setEnabled(customSetTime && _editable); _comboMonthFrom.setEnabled(customSetTime && _editable); _spinnerYearFrom.setEnabled(customSetTime && _editable); _dateFromLabel.setSelection(customSetTime && _editable); _dateToButton.setEnabled(customSetTime && _editable); _dateToButton.setSelection(customSetTime && !_pointOfTime && _editable); _comboDayTo.setEnabled(customSetTime && !_pointOfTime && _editable); _comboMonthTo.setEnabled(customSetTime && !_pointOfTime && _editable); _spinnerYearTo.setEnabled(customSetTime && !_pointOfTime && _editable); } @Override public void setBackground(Color color) { super.setBackground(color); _composite.setBackground(color); _dateFromLabel.setBackground(color); } @Override public void setDirty(boolean isDirty) { this._isDirty = isDirty; if (_parentEditor != null && _isDirty) { _parentEditor.setDirty(true); } } @Override public void setForeground(Color color) { super.setForeground(color); _dateFromLabel.setForeground(color); } @Override public void setLayoutData(Object layoutData) { super.setLayoutData(layoutData); // if (_composite != null) { // _composite.setLayoutData(layoutData); // } } private void setPointOfTiem(boolean pointOfTime) { if (!pointOfTime) { if (!_timeStm.getTimes().contains(_timeTo)) { _timeStm.getTimes().add(_timeTo); } _timeFrom.setType("from"); } else { _timeStm.getTimes().remove(_timeTo); _timeFrom.setType("when"); _decoTimeTo.setImage(null); } _comboDayTo.setEnabled(!pointOfTime && _editable); _comboMonthTo.setEnabled(!pointOfTime && _editable); _spinnerYearTo.setEnabled(!pointOfTime && _editable); } @Override public void setSelected(boolean isSelected, boolean contextIsValid) { this._selected = isSelected; _comboDayFrom.setEnabled(_selected && _customSetTime && _editable); _comboMonthFrom.setEnabled(_selected && _customSetTime && _editable); _spinnerYearFrom.setEnabled(_selected && _customSetTime && _editable); _dateToButton.setEnabled(_selected && _customSetTime && _editable); _comboDayTo.setEnabled(_selected && _customSetTime && !_pointOfTime && _editable); _comboMonthTo.setEnabled(_selected && _customSetTime && !_pointOfTime && _editable); _spinnerYearTo.setEnabled(_selected && _customSetTime && !_pointOfTime && _editable); if (isSelected && contextIsValid) { setBackground(AEVIEWConstants.VIEW_BACKGROUND_SELECTED_COLOR); setForeground(AEVIEWConstants.VIEW_FOREGROUND_SELECTED_COLOR); } else if (contextIsValid) { setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR); setForeground(AEVIEWConstants.VIEW_FOREGROUND_DESELECTED_COLOR); } else if (isSelected) { setBackground(AEVIEWConstants.VIEW_BACKGROUND_INVALID_COLOR); setForeground(AEVIEWConstants.VIEW_FOREGROUND_SELECTED_COLOR); } else { setForeground(AEVIEWConstants.VIEW_FOREGROUND_DESELECTED_COLOR); setBackground(AEVIEWConstants.VIEW_BACKGROUND_INVALID_COLOR); } } private void contentChanged() { setDirty(true); saveInput(); validateInternal(); validate(); } private void validateInternal() { setValid(_timeStm.isValid()); } private void setTimesInternal(TimeStm timeStm) { this._timeStm = timeStm; if (_timeStm != null && _timeStm.getTimes() != null) { for (Time t : _timeStm.getTimes()) { if (t.getType() != null) { if (t.getType().equals("when")) { _timeFrom = t; _pointOfTime = true; _customSetTime = true; } else if (t.getType().equals("from")) { _timeFrom = t; _pointOfTime = false; _customSetTime = true; } else if (t.getType().equals("to")) { _timeTo = t; _pointOfTime = false; _customSetTime = true; } } } } if (!_customSetTime) { if (_timeStm == null) { _timeStm = new TimeStm(); _timeStm.setType("defined"); } _timeFrom = new Time(); _timeFrom.setTimeStamp(new PdrDate(PRESELECTED_YEAR, 0, 0)); _timeFrom.setType("when"); _timeFrom.setAccuracy("exact"); _pointOfTime = true; } else { setDirty(true); } if (_timeTo == null) { _timeTo = new Time(); _timeTo.setTimeStamp(new PdrDate(PRESELECTED_YEAR, 0, 0)); _timeTo.setType("to"); _timeTo.setAccuracy("exact"); } } public void setInput(Object input) { if (input instanceof TimeStm) { _timeStm = (TimeStm) input; setTimesInternal((TimeStm)input); loadTimeStm(); } } private void setValid(boolean isValid) { this._isValid = isValid; } @Override public void validate() { if (_parentEditor != null) { _parentEditor.validate(); } } @Override public void saveInput() { // TODO Auto-generated method stub } @Override public void setEditable(boolean editable) { this._editable = editable; _comboDayFrom.setEnabled(_selected && _customSetTime && _editable); _comboMonthFrom.setEnabled(_selected && _customSetTime && _editable); _spinnerYearFrom.setEnabled(_selected && _customSetTime && _editable); _dateToButton.setEnabled(_selected && _customSetTime && _editable); _comboDayTo.setEnabled(_selected && _customSetTime && !_pointOfTime && _editable); _comboMonthTo.setEnabled(_selected && _customSetTime && !_pointOfTime && _editable); _spinnerYearTo.setEnabled(_selected && _customSetTime && !_pointOfTime && _editable); } }