package org.nightlabs.jfire.issuetracking.ui.overview;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.nightlabs.base.ui.composite.DateTimeEdit;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.timelength.TimeLengthComposite;
import org.nightlabs.base.ui.timelength.TimeUnit;
import org.nightlabs.jdo.query.QueryEvent;
import org.nightlabs.jdo.query.QueryProvider;
import org.nightlabs.jdo.query.AbstractSearchQuery.FieldChangeCarrier;
import org.nightlabs.jfire.base.ui.search.AbstractQueryFilterComposite;
import org.nightlabs.jfire.issue.query.IssueQuery;
import org.nightlabs.jfire.issuetracking.ui.resource.Messages;
import org.nightlabs.l10n.DateFormatter;
/**
* @author Chairat Kongarayawetchakun <!-- chairat [AT] nightlabs [DOT] de -->
*
*/
public class IssueFilterCompositeWorkTimeRelated
extends AbstractQueryFilterComposite<IssueQuery>
{
private DateTimeEdit startTimeEdit;
private DateTimeEdit endTimeEdit;
private TimeLengthComposite withinTimeLengthComposite;
// private DateTimeEdit deadlineDateAfter;
// private DateTimeEdit deadlineDateBefore;
/**
* @param parent
* The parent to instantiate this filter into.
* @param style
* The style to apply.
* @param layoutMode
* The layout mode to use. See {@link XComposite.LayoutMode}.
* @param layoutDataMode
* The layout data mode to use. See {@link XComposite.LayoutDataMode}.
* @param queryProvider
* The queryProvider to use. It may be <code>null</code>, but the caller has to
* ensure, that it is set before {@link #getQuery()} is called!
*/
public IssueFilterCompositeWorkTimeRelated(Composite parent, int style,
LayoutMode layoutMode, LayoutDataMode layoutDataMode,
QueryProvider<? super IssueQuery> queryProvider)
{
super(parent, style, layoutMode, layoutDataMode, queryProvider);
createComposite();
}
/**
* @param parent
* The parent to instantiate this filter into.
* @param style
* The style to apply.
* @param queryProvider
* The queryProvider to use. It may be <code>null</code>, but the caller has to
* ensure, that it is set before {@link #getQuery()} is called!
*/
public IssueFilterCompositeWorkTimeRelated(Composite parent, int style,
QueryProvider<? super IssueQuery> queryProvider)
{
super(parent, style, queryProvider);
createComposite();
}
@Override
public Class<IssueQuery> getQueryClass() {
return IssueQuery.class;
}
@Override
protected void createComposite()
{
GridLayout gridLayout = new GridLayout(2, true);
this.setLayout(gridLayout);
this.setLayoutData(new GridData(GridData.FILL_BOTH));
startTimeEdit = new DateTimeEdit(
this,
DateFormatter.FLAGS_DATE_SHORT_TIME_HMS_WEEKDAY + DateTimeEdit.FLAGS_SHOW_ACTIVE_CHECK_BOX,
new Date(),
Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositeWorkTimeRelated.dateTimeEdit.startTime.text"), //$NON-NLS-1$
true);
startTimeEdit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND));
startTimeEdit.setDate(cal.getTime());
startTimeEdit.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
getQuery().setIssueWorkTimeRangeFrom(startTimeEdit.getDate());
}
});
startTimeEdit.addActiveChangeListener(new ButtonSelectionListener()
{
@Override
protected void handleSelection(boolean active)
{
getQuery().setFieldEnabled(IssueQuery.FieldName.issueWorkTimeRangeFrom, active);
}
});
endTimeEdit = new DateTimeEdit(
this,
DateFormatter.FLAGS_DATE_SHORT_TIME_HMS_WEEKDAY + DateTimeEdit.FLAGS_SHOW_ACTIVE_CHECK_BOX,
new Date(),
Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositeWorkTimeRelated.dateTimeEdit.endTime.text"), //$NON-NLS-1$
true);
endTimeEdit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND));
endTimeEdit.setDate(cal.getTime());
endTimeEdit.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
getQuery().setIssueWorkTimeRangeTo(endTimeEdit.getDate());
}
});
endTimeEdit.addActiveChangeListener(new ButtonSelectionListener()
{
@Override
protected void handleSelection(boolean active)
{
getQuery().setFieldEnabled(IssueQuery.FieldName.issueWorkTimeRangeTo, active);
}
});
Group deadlineGroup = new Group(this, SWT.NONE);
deadlineGroup.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositeWorkTimeRelated.deadlineGroup.text"));
deadlineGroup.setLayout(new GridLayout(2, true));
new Label(deadlineGroup, SWT.NONE).setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositeWorkTimeRelated.withinLabel.text"));
withinTimeLengthComposite = new TimeLengthComposite(deadlineGroup);
withinTimeLengthComposite.setTimeUnits(new TimeUnit[] {TimeUnit.month, TimeUnit.day, TimeUnit.hour});
withinTimeLengthComposite.setTimeLength(0);
withinTimeLengthComposite.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
changeDeadlineDuration(withinTimeLengthComposite.getTimeLength());
}
});
//////////////////
// Group deadlineGroup = new Group(this, SWT.NONE);
// deadlineGroup.setText("Deadline");
// deadlineGroup.setLayout(new GridLayout(2, true));
// long dateTimeEditStyle = DateFormatter.FLAGS_DATE_SHORT_TIME_HMS_WEEKDAY + DateTimeEdit.FLAGS_SHOW_ACTIVE_CHECK_BOX;
// deadlineDateAfter = new DateTimeEdit(deadlineGroup, dateTimeEditStyle, "After");
// deadlineDateAfter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// deadlineDateAfter.setActive(false);
// deadlineDateAfter.addModifyListener(new ModifyListener()
// {
// @Override
// public void modifyText(ModifyEvent e)
// {
// getQuery().setDeadlineAfterTimestamp(deadlineDateAfter.getDate());
// }
// });
// deadlineDateAfter.addActiveChangeListener(new ButtonSelectionListener()
// {
// @Override
// protected void handleSelection(boolean active)
// {
// if (getQuery().getDeadlineAfterTimestamp() == null) {
// getQuery().setDeadlineAfterTimestamp(deadlineDateAfter.getDate());
// }
// getQuery().setFieldEnabled(IssueQuery.FieldName.deadlineAfterTimestamp, active);
// }
// });
//
// deadlineDateBefore = new DateTimeEdit(deadlineGroup, dateTimeEditStyle, "Before");
// deadlineDateBefore.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// deadlineDateBefore.setActive(false);
// deadlineDateBefore.addModifyListener(new ModifyListener()
// {
// @Override
// public void modifyText(ModifyEvent e)
// {
// getQuery().setDeadlineBeforeTimestamp(deadlineDateBefore.getDate());
// }
// });
// deadlineDateBefore.addActiveChangeListener(new ButtonSelectionListener()
// {
// @Override
// protected void handleSelection(boolean active)
// {
// if (getQuery().getDeadlineBeforeTimestamp() == null) {
// getQuery().setDeadlineBeforeTimestamp(deadlineDateBefore.getDate());
// }
// getQuery().setFieldEnabled(IssueQuery.FieldName.deadlineBeforeTimestamp, active);
// }
// });
// GridData gd = new GridData(GridData.FILL_HORIZONTAL);
// gd.horizontalSpan = 2;
// deadlineGroup.setLayoutData(gd);
}
private void changeDeadlineDuration(long duration) {
getQuery().setDeadlineTimePeriod(duration);
getQuery().setFieldEnabled(IssueQuery.FieldName.deadlineTimePeriod, ! (duration == 0));
}
@Override
protected void updateUI(QueryEvent event, List<FieldChangeCarrier> changedFields)
{
for (FieldChangeCarrier changedField : event.getChangedFields())
{
if (IssueQuery.FieldName.issueWorkTimeRangeFrom.equals(changedField.getPropertyName()))
{
final Date tmpCreateDate = (Date) changedField.getNewValue();
startTimeEdit.setDate(tmpCreateDate);
}
else if (getEnableFieldName(IssueQuery.FieldName.issueWorkTimeRangeFrom).equals(changedField.getPropertyName()))
{
final boolean active = (Boolean) changedField.getNewValue();
if (startTimeEdit.isActive() != active)
{
startTimeEdit.setActive(active);
setSearchSectionActive(active);
}
}
else if (IssueQuery.FieldName.issueWorkTimeRangeTo.equals(changedField.getPropertyName()))
{
final Date tmpUpdateDate = (Date) changedField.getNewValue();
endTimeEdit.setDate(tmpUpdateDate);
}
else if (getEnableFieldName(IssueQuery.FieldName.issueWorkTimeRangeTo).equals(changedField.getPropertyName()))
{
final boolean active = (Boolean) changedField.getNewValue();
if (endTimeEdit.isActive() != active)
{
endTimeEdit.setActive(active);
setSearchSectionActive(active);
}
}
else if (IssueQuery.FieldName.deadlineTimePeriod.equals(changedField.getPropertyName()))
{
Long newValue = (Long)changedField.getNewValue();
if (newValue == null)
{
// durationComposite.setTimeLength(0);
}
else
{
withinTimeLengthComposite.setTimeLength(newValue);
}
}
else if (getEnableFieldName(IssueQuery.FieldName.deadlineTimePeriod).equals(
changedField.getPropertyName()))
{
Boolean active = (Boolean) changedField.getNewValue();
setSearchSectionActive(active);
if (!active) {
getQuery().setDeadlineTimePeriod(null);
withinTimeLengthComposite.setTimeLength(0);
}
}
// else if (IssueQuery.FieldName.deadlineAfterTimestamp.equals(changedField.getPropertyName()))
// {
// final Date tmpDeadlineDate = (Date) changedField.getNewValue();
// deadlineDateAfter.setDate(tmpDeadlineDate);
// }
// else if (getEnableFieldName(IssueQuery.FieldName.deadlineAfterTimestamp).equals(changedField.getPropertyName()))
// {
// final boolean active = (Boolean) changedField.getNewValue();
// if (deadlineDateAfter.isActive() != active)
// {
// deadlineDateAfter.setActive(active);
// setSearchSectionActive(active);
// }
// }
// else if (IssueQuery.FieldName.deadlineBeforeTimestamp.equals(changedField.getPropertyName()))
// {
// final Date tmpDeadlineDate = (Date) changedField.getNewValue();
// deadlineDateBefore.setDate(tmpDeadlineDate);
// }
// else if (getEnableFieldName(IssueQuery.FieldName.deadlineBeforeTimestamp).equals(changedField.getPropertyName()))
// {
// final boolean active = (Boolean) changedField.getNewValue();
// if (deadlineDateBefore.isActive() != active)
// {
// deadlineDateBefore.setActive(active);
// setSearchSectionActive(active);
// }
// }
} // for (FieldChangeCarrier changedField : event.getChangedFields())
}
private static final Set<String> fieldNames;
static
{
fieldNames = new HashSet<String>(2);
fieldNames.add(IssueQuery.FieldName.issueWorkTimeRangeFrom);
fieldNames.add(IssueQuery.FieldName.issueWorkTimeRangeTo);
fieldNames.add(IssueQuery.FieldName.deadlineTimePeriod);
// fieldNames.add(IssueQuery.FieldName.deadlineAfterTimestamp);
// fieldNames.add(IssueQuery.FieldName.deadlineBeforeTimestamp);
}
@Override
protected Set<String> getFieldNames()
{
return fieldNames;
}
/**
* Group ID for storing active states in the query.
*/
public static final String FILTER_GROUP_ID = "IssueFilterCompositeTimeRelated"; //$NON-NLS-1$
@Override
protected String getGroupID()
{
return FILTER_GROUP_ID;
}
}