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.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.nightlabs.base.ui.composite.DateTimeEdit;
import org.nightlabs.base.ui.composite.XComposite;
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 IssueFilterCompositeTimeRelated
extends AbstractQueryFilterComposite<IssueQuery>
{
private DateTimeEdit createdTimeEdit;
private DateTimeEdit updatedTimeEdit;
/**
* @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 IssueFilterCompositeTimeRelated(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 IssueFilterCompositeTimeRelated(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));
createdTimeEdit = 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.IssueFilterCompositeTimeRelated.dateTimeEdit.createTime.text"), //$NON-NLS-1$
true);
createdTimeEdit.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));
createdTimeEdit.setDate(cal.getTime());
createdTimeEdit.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
getQuery().setCreateTimestamp(createdTimeEdit.getDate());
}
});
createdTimeEdit.addActiveChangeListener(new ButtonSelectionListener()
{
@Override
protected void handleSelection(boolean active)
{
getQuery().setFieldEnabled(IssueQuery.FieldName.createTimestamp, active);
}
});
updatedTimeEdit = 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.IssueFilterCompositeTimeRelated.dateTimeEdit.updatedAfter.text"), //$NON-NLS-1$
true);
updatedTimeEdit.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));
updatedTimeEdit.setDate(cal.getTime());
updatedTimeEdit.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
getQuery().setUpdateTimestamp(updatedTimeEdit.getDate());
}
});
updatedTimeEdit.addActiveChangeListener(new ButtonSelectionListener()
{
@Override
protected void handleSelection(boolean active)
{
getQuery().setFieldEnabled(IssueQuery.FieldName.updateTimestamp, active);
}
});
}
@Override
protected void updateUI(QueryEvent event, List<FieldChangeCarrier> changedFields)
{
for (FieldChangeCarrier changedField : event.getChangedFields())
{
if (IssueQuery.FieldName.createTimestamp.equals(changedField.getPropertyName()))
{
final Date newCreateDate = (Date) changedField.getNewValue();
if (newCreateDate == null) {
createdTimeEdit.setActive(false);
}
else {
createdTimeEdit.setDate(newCreateDate);
}
}
else if (getEnableFieldName(IssueQuery.FieldName.createTimestamp).equals(changedField.getPropertyName()))
{
final boolean active = (Boolean) changedField.getNewValue();
if (createdTimeEdit.isActive() != active)
{
createdTimeEdit.setActive(active);
}
setSearchSectionActive(active);
}
else if (IssueQuery.FieldName.updateTimestamp.equals(changedField.getPropertyName()))
{
final Date newUpdateDate = (Date) changedField.getNewValue();
if (newUpdateDate == null) {
updatedTimeEdit.setActive(false);
}
else {
updatedTimeEdit.setDate(newUpdateDate);
}
}
else if (getEnableFieldName(IssueQuery.FieldName.updateTimestamp).equals(changedField.getPropertyName()))
{
final boolean active = (Boolean) changedField.getNewValue();
if (updatedTimeEdit.isActive() != active)
{
updatedTimeEdit.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.createTimestamp);
fieldNames.add(IssueQuery.FieldName.updateTimestamp);
}
@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;
}
}