package org.nightlabs.jfire.issuetracking.ui.overview;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import javax.jdo.FetchPlan;
import javax.jdo.JDOHelper;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.nightlabs.base.ui.composite.XComboComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.exceptionhandler.ExceptionHandlerRegistry;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.jdo.NLJDOHelper;
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.IssuePriority;
import org.nightlabs.jfire.issue.IssueResolution;
import org.nightlabs.jfire.issue.IssueSeverityType;
import org.nightlabs.jfire.issue.IssueType;
import org.nightlabs.jfire.issue.dao.IssuePriorityDAO;
import org.nightlabs.jfire.issue.dao.IssueResolutionDAO;
import org.nightlabs.jfire.issue.dao.IssueSeverityTypeDAO;
import org.nightlabs.jfire.issue.dao.IssueTypeDAO;
import org.nightlabs.jfire.issue.id.IssuePriorityID;
import org.nightlabs.jfire.issue.id.IssueResolutionID;
import org.nightlabs.jfire.issue.id.IssueSeverityTypeID;
import org.nightlabs.jfire.issue.id.IssueTypeID;
import org.nightlabs.jfire.issue.query.IssueQuery;
import org.nightlabs.jfire.issuetracking.ui.issue.IssueLabelProvider;
import org.nightlabs.jfire.issuetracking.ui.resource.Messages;
import org.nightlabs.jfire.organisation.Organisation;
import org.nightlabs.progress.NullProgressMonitor;
import org.nightlabs.progress.ProgressMonitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Chairat Kongarayawetchakun <!-- chairat [AT] nightlabs [DOT] de -->
*
*/
public class IssueFilterCompositePropertyRelated
extends AbstractQueryFilterComposite<IssueQuery>
{
private static final Logger logger = LoggerFactory.getLogger(IssueFilterCompositePropertyRelated.class);
private Object mutex = new Object();
private XComboComposite<IssueType> issueTypeCombo;
private XComboComposite<IssueSeverityType> issueSeverityCombo;
private XComboComposite<IssuePriority> issuePriorityCombo;
private XComboComposite<IssueResolution> issueResolutionCombo;
private volatile IssueType selectedIssueType;
private volatile IssueSeverityType selectedIssueSeverityType;
private volatile IssuePriority selectedIssuePriority;
private volatile IssueResolution selectedIssueResolution;
/**
* @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 IssueFilterCompositePropertyRelated(Composite parent, int style,
LayoutMode layoutMode, LayoutDataMode layoutDataMode,
QueryProvider<? super IssueQuery> queryProvider)
{
super(parent, style, layoutMode, layoutDataMode, queryProvider);
prepareIssueProperties();
createComposite();
}
/**
* @param parent
* The this 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 IssueFilterCompositePropertyRelated(Composite parent, int style,
QueryProvider<? super IssueQuery> queryProvider)
{
super(parent, style, queryProvider);
prepareIssueProperties();
createComposite();
}
@Override
public Class<IssueQuery> getQueryClass() {
return IssueQuery.class;
}
@Override
protected void createComposite()
{
this.setLayout(new GridLayout(3, false));
XComposite issueTypeComposite = new XComposite(this, SWT.NONE,
LayoutMode.TIGHT_WRAPPER, LayoutDataMode.GRID_DATA);
issueTypeComposite.getGridLayout().numColumns = 4;
new Label(issueTypeComposite, SWT.NONE).setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.label.issueType.text")); //$NON-NLS-1$
issueTypeCombo = new XComboComposite<IssueType>(issueTypeComposite, getBorderStyle() | SWT.READ_ONLY);
issueTypeCombo.setLabelProvider(labelProvider);
issueTypeCombo.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent e)
{
final IssueType selectedIssueType = issueTypeCombo.getSelectedElement();
boolean isSelectAll = selectedIssueType.equals(ISSUE_TYPE_ALL);
if (isSelectAll)
getQuery().setIssueTypeID(null);
else {
getQuery().setIssueTypeID((IssueTypeID)JDOHelper.getObjectId(selectedIssueType));
}
getQuery().setFieldEnabled(IssueQuery.FieldName.issueTypeID, !isSelectAll);
}
});
new Label(issueTypeComposite, SWT.NONE).setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.label.severity.text")); //$NON-NLS-1$
issueSeverityCombo = new XComboComposite<IssueSeverityType>(issueTypeComposite, getBorderStyle() | SWT.READ_ONLY);
issueSeverityCombo.setLabelProvider(labelProvider);
issueSeverityCombo.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent e)
{
final IssueSeverityType selectedIssueSeverityType = issueSeverityCombo.getSelectedElement();
boolean isSelectAll = selectedIssueSeverityType.equals(ISSUE_SEVERITY_TYPE_ALL);
if (isSelectAll) {
getQuery().setIssueSeverityTypeID(null);
}
else {
getQuery().setIssueSeverityTypeID((IssueSeverityTypeID) JDOHelper.getObjectId(selectedIssueSeverityType));
}
getQuery().setFieldEnabled(IssueQuery.FieldName.issueSeverityTypeID, !isSelectAll);
}
});
new Label(issueTypeComposite, SWT.NONE).setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.label.priority.text")); //$NON-NLS-1$
issuePriorityCombo = new XComboComposite<IssuePriority>(issueTypeComposite, getBorderStyle() | SWT.READ_ONLY);
issuePriorityCombo.setLabelProvider(labelProvider);
issuePriorityCombo.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent e)
{
final IssuePriority selectedIssuePriority = issuePriorityCombo.getSelectedElement();
boolean isSelectAll = selectedIssuePriority.equals(ISSUE_PRIORITY_ALL);
if (isSelectAll)
getQuery().setIssuePriorityID(null);
else {
getQuery().setIssuePriorityID((IssuePriorityID) JDOHelper.getObjectId(selectedIssuePriority));
}
getQuery().setFieldEnabled(IssueQuery.FieldName.issuePriorityID, !isSelectAll);
}
});
new Label(issueTypeComposite, SWT.NONE).setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.label.resolution.text")); //$NON-NLS-1$
issueResolutionCombo = new XComboComposite<IssueResolution>(issueTypeComposite, getBorderStyle() | SWT.READ_ONLY);
issueResolutionCombo.setLabelProvider(labelProvider);
issueResolutionCombo.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent e)
{
final IssueResolution selectedIssueResolution = issueResolutionCombo.getSelectedElement();
boolean isSelectAll = ISSUE_RESOLUTION_ALL.equals(selectedIssueResolution);
if (isSelectAll)
getQuery().setIssueResolutionID(null);
else {
getQuery().setIssueResolutionID((IssueResolutionID) JDOHelper.getObjectId(selectedIssueResolution));
}
}
});
loadProperties();
}
@Override
protected void updateUI(QueryEvent event, List<FieldChangeCarrier> changedFields)
{
for (FieldChangeCarrier changedField : event.getChangedFields())
{
if (IssueQuery.FieldName.issuePriorityID.equals(changedField.getPropertyName()))
{
IssuePriorityID newPriorityID = (IssuePriorityID) changedField.getNewValue();
if (newPriorityID == null)
{
issuePriorityCombo.setSelection(ISSUE_PRIORITY_ALL);
}
else
{
final IssuePriority newIssuePriority = IssuePriorityDAO.sharedInstance().getIssuePriority(
newPriorityID, new String[] { IssuePriority.FETCH_GROUP_NAME },
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor()
);
issuePriorityCombo.setSelection(newIssuePriority);
selectedIssuePriority = newIssuePriority;
}
}
else if (getEnableFieldName(IssueQuery.FieldName.issuePriorityID).equals(
changedField.getPropertyName()))
{
boolean isActive = (Boolean) changedField.getNewValue();
setSearchSectionActive(isActive);
if (!isActive) {
getQuery().setIssuePriorityID(null);
issuePriorityCombo.setSelection(ISSUE_PRIORITY_ALL);
}
}
else if (IssueQuery.FieldName.issueResolutionID.equals(changedField.getPropertyName()))
{
final IssueResolutionID newResolutionID = (IssueResolutionID) changedField.getNewValue();
if (newResolutionID == null)
{
issueResolutionCombo.setSelection(ISSUE_RESOLUTION_ALL);
}
else
{
final IssueResolution newIssueResolution = IssueResolutionDAO.sharedInstance().getIssueResolution(
newResolutionID,
new String[] { IssueResolution.FETCH_GROUP_NAME},
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor()
);
issueResolutionCombo.setSelection(newIssueResolution);
selectedIssueResolution = newIssueResolution;
}
}
else if (getEnableFieldName(IssueQuery.FieldName.issueResolutionID).equals(
changedField.getPropertyName()))
{
boolean isActive = (Boolean) changedField.getNewValue();
setSearchSectionActive(isActive);
if (!isActive) {
getQuery().setIssueResolutionID(null);
issueResolutionCombo.setSelection(ISSUE_RESOLUTION_ALL);
}
}
else if (IssueQuery.FieldName.issueSeverityTypeID.equals(changedField.getPropertyName()))
{
IssueSeverityTypeID newSeverityID = (IssueSeverityTypeID) changedField.getNewValue();
if (newSeverityID == null)
{
issueSeverityCombo.setSelection(ISSUE_SEVERITY_TYPE_ALL);
}
else
{
final IssueSeverityType newIssueSeverityType = IssueSeverityTypeDAO.sharedInstance().getIssueSeverityType(
newSeverityID,
new String[] { IssueSeverityType.FETCH_GROUP_NAME },
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor()
);
issueSeverityCombo.setSelection(newIssueSeverityType);
selectedIssueSeverityType = newIssueSeverityType;
}
}
else if (getEnableFieldName(IssueQuery.FieldName.issueSeverityTypeID).equals(
changedField.getPropertyName()))
{
boolean isActive = (Boolean) changedField.getNewValue();
setSearchSectionActive(isActive);
if (!isActive) {
getQuery().setIssueSeverityTypeID(null);
issueSeverityCombo.setSelection(ISSUE_SEVERITY_TYPE_ALL);
}
}
else if (IssueQuery.FieldName.issueTypeID.equals(changedField.getPropertyName()))
{
IssueTypeID newIssueTypeID = (IssueTypeID) changedField.getNewValue();
if (newIssueTypeID == null)
{
issueTypeCombo.setSelection(ISSUE_TYPE_ALL);
}
else
{
final IssueType newIssueType = IssueTypeDAO.sharedInstance().getIssueType(
newIssueTypeID,
new String[] { IssueType.FETCH_GROUP_NAME },
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor()
);
issueTypeCombo.setSelection(newIssueType);
selectedIssueType = newIssueType;
}
}
else if (getEnableFieldName(IssueQuery.FieldName.issueTypeID).equals(
changedField.getPropertyName()))
{
boolean isActive = (Boolean) changedField.getNewValue();
setSearchSectionActive(isActive);
if (!isActive) {
getQuery().setIssueTypeID(null);
issueTypeCombo.setSelection(ISSUE_TYPE_ALL);
}
}
} // for (FieldChangeCarrier changedField : event.getChangedFields())
}
private static IssueType ISSUE_TYPE_ALL = new IssueType(Organisation.DEV_ORGANISATION_ID, "Issue_Type_All"); //$NON-NLS-1$
private static IssueSeverityType ISSUE_SEVERITY_TYPE_ALL = new IssueSeverityType(Organisation.DEV_ORGANISATION_ID, "Issue_Severity_Type_All"); //$NON-NLS-1$
private static IssuePriority ISSUE_PRIORITY_ALL = new IssuePriority(Organisation.DEV_ORGANISATION_ID, "Issue_Priority_All"); //$NON-NLS-1$
private static IssueResolution ISSUE_RESOLUTION_ALL = new IssueResolution(Organisation.DEV_ORGANISATION_ID, "Issue_Resolution_All"); //$NON-NLS-1$
private void prepareIssueProperties(){
ISSUE_TYPE_ALL.getName().setText(Locale.ENGLISH.getLanguage(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.issueType.all.text")); //$NON-NLS-1$
ISSUE_SEVERITY_TYPE_ALL.getIssueSeverityTypeText().setText(Locale.ENGLISH.getLanguage(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.severity.all.text")); //$NON-NLS-1$
ISSUE_PRIORITY_ALL.getIssuePriorityText().setText(Locale.ENGLISH.getLanguage(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.priority.all.text")); //$NON-NLS-1$
ISSUE_RESOLUTION_ALL.getName().setText(Locale.ENGLISH.getLanguage(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.resolution.all.text")); //$NON-NLS-1$
}
private static final String[] FETCH_GROUPS_ISSUE_TYPE = {
IssueType.FETCH_GROUP_NAME,
IssueType.FETCH_GROUP_ISSUE_PRIORITIES,
IssueType.FETCH_GROUP_ISSUE_RESOLUTIONS,
IssueType.FETCH_GROUP_ISSUE_SEVERITY_TYPES,
IssueSeverityType.FETCH_GROUP_NAME,
IssuePriority.FETCH_GROUP_NAME,
IssueResolution.FETCH_GROUP_NAME, FetchPlan.DEFAULT
};
private IssueLabelProvider labelProvider = new IssueLabelProvider();
private void loadProperties(){
Job loadJob = new Job(Messages.getString("org.nightlabs.jfire.issuetracking.ui.overview.IssueFilterCompositePropertyRelated.job.loadingProperties.text")) { //$NON-NLS-1$
@Override
protected IStatus run(final ProgressMonitor monitor) {
synchronized (mutex) {
// loadJobRunning = true;
logger.debug("Load Job running...."); //$NON-NLS-1$
}
try {
try {
final List<IssueType> issueTypeList = new ArrayList<IssueType>(IssueTypeDAO.sharedInstance().getAllIssueTypes(FETCH_GROUPS_ISSUE_TYPE, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor));
final List<IssuePriority> issuePriorityList = new ArrayList<IssuePriority>();
final List<IssueSeverityType> issueSeverityTypeList = new ArrayList<IssueSeverityType>();
final List<IssueResolution> issueResolutionList = new ArrayList<IssueResolution>();
Display.getDefault().syncExec(new Runnable() {
public void run() {
issueTypeCombo.removeAll();
issueTypeCombo.addElement(ISSUE_TYPE_ALL);
for (IssueType issueType : issueTypeList) {
issueTypeCombo.addElement(issueType);
for (IssuePriority p : issueType.getIssuePriorities())
issuePriorityList.add(p);
for (IssueSeverityType s : issueType.getIssueSeverityTypes())
issueSeverityTypeList.add(s);
for (IssueResolution r : issueType.getIssueResolutions())
issueResolutionList.add(r);
}
if (selectedIssueType == null)
selectedIssueType = ISSUE_TYPE_ALL;
issueTypeCombo.setSelection(selectedIssueType);
/**************************************************/
ISSUE_TYPE_ALL.getIssuePriorities().addAll(issuePriorityList);
ISSUE_TYPE_ALL.getIssueSeverityTypes().addAll(issueSeverityTypeList);
ISSUE_TYPE_ALL.getIssueResolutions().addAll(issueResolutionList);
/**************************************************/
issueSeverityCombo.removeAll();
issueSeverityCombo.addElement(ISSUE_SEVERITY_TYPE_ALL);
for (IssueSeverityType is : issueSeverityTypeList) {
if (!issueSeverityCombo.contains(is))
issueSeverityCombo.addElement(is);
}
if (selectedIssueSeverityType != null)
{
issueSeverityCombo.setSelection(selectedIssueSeverityType);
selectedIssueSeverityType = null;
}
else
issueSeverityCombo.setSelection(ISSUE_SEVERITY_TYPE_ALL);
issuePriorityCombo.removeAll();
issuePriorityCombo.addElement(ISSUE_PRIORITY_ALL);
for (IssuePriority ip : issuePriorityList) {
if (!issuePriorityCombo.contains(ip))
issuePriorityCombo.addElement(ip);
}
if (selectedIssuePriority != null)
{
issuePriorityCombo.setSelection(selectedIssuePriority);
selectedIssuePriority = null;
}
else
issuePriorityCombo.setSelection(ISSUE_PRIORITY_ALL);
issueResolutionCombo.removeAll();
issueResolutionCombo.addElement(ISSUE_RESOLUTION_ALL);
for (IssueResolution ir : issueResolutionList) {
if (!issueResolutionCombo.contains(ir))
issueResolutionCombo.addElement(ir);
}
if (selectedIssueResolution != null)
{
issueResolutionCombo.setSelection(selectedIssueResolution);
selectedIssueResolution = null;
}
else
issueResolutionCombo.setSelection(ISSUE_RESOLUTION_ALL);
selectedIssueType = null;
// issueTypeCombo.selectElement(ISSUE_TYPE_ALL);
// issueSeverityCombo.selectElement(ISSUE_SEVERITY_TYPE_ALL);
// issuePriorityCombo.selectElement(ISSUE_PRIORITY_ALL);
// issueResolutionCombo.selectElement(ISSUE_RESOLUTION_ALL);
}
});
}catch (Exception e1) {
ExceptionHandlerRegistry.asyncHandleException(e1);
throw new RuntimeException(e1);
}
return Status.OK_STATUS;
} finally {
synchronized (mutex) {
logger.debug("Load Job finished."); //$NON-NLS-1$
}
}
}
};
loadJob.schedule();
}
private static final Set<String> fieldNames;
static
{
fieldNames = new HashSet<String>(4);
fieldNames.add(IssueQuery.FieldName.issueTypeID);
fieldNames.add(IssueQuery.FieldName.issueSeverityTypeID);
fieldNames.add(IssueQuery.FieldName.issuePriorityID);
fieldNames.add(IssueQuery.FieldName.issueResolutionID);
}
@Override
protected Set<String> getFieldNames()
{
return fieldNames;
}
/**
* Group ID for storing active states in the query.
*/
public static final String FILTER_GROUP_ID = "IssueFilterCompositePropertyRelated"; //$NON-NLS-1$
@Override
protected String getGroupID()
{
return FILTER_GROUP_ID;
}
}