package org.nightlabs.jfire.issuetracking.ui.project; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import javax.jdo.FetchPlan; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.custom.XCombo; import org.nightlabs.base.ui.job.Job; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jfire.base.login.ui.Login; import org.nightlabs.jfire.issue.project.ProjectType; import org.nightlabs.jfire.issue.project.ProjectTypeDAO; import org.nightlabs.jfire.issue.project.id.ProjectTypeID; import org.nightlabs.jfire.issuetracking.ui.resource.Messages; import org.nightlabs.progress.NullProgressMonitor; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.util.CollectionUtil; import org.nightlabs.util.NLLocale; public class ProjectTypeComboComposite extends XComposite implements ISelectionProvider { public ProjectTypeComboComposite(Composite parent, int style) { this(parent, style, getLocalOrganisationID(), false); } private static String getLocalOrganisationID() { try { return Login.getLogin().getOrganisationID(); } catch (Exception x) { throw new RuntimeException(x); } } private XCombo projectTypeCombo; private ProjectType selectedProjectType; public ProjectTypeComboComposite(Composite parent, int style,String filterOrganisationID, boolean filterOrganisationIDInverse) { super(parent, style, LayoutMode.TIGHT_WRAPPER); projectTypeCombo = new XCombo(this, SWT.BORDER | SWT.READ_ONLY); projectTypeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); projectTypeCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { int idx = projectTypeCombo.getSelectionIndex(); if (idx < 0 || idx > projectTypeList.size() - 1) selectedProjectType = null; else selectedProjectType = projectTypeList.get(idx); fireSelectionChangedEvent(); } }); loadProjectTypes(); } private static String[] FETCH_GROUP_PROJECT_TYPE = new String[] { FetchPlan.DEFAULT, ProjectType.FETCH_GROUP_NAME}; private List<ProjectType> projectTypeList = new ArrayList<ProjectType>(); public void loadProjectTypes() { projectTypeCombo.removeAll(); Job loadJob = new Job(Messages.getString("org.nightlabs.jfire.issuetracking.ui.project.ProjectTypeComboComposite.job.loadingProjectTypes.text")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) { try { final Collection<ProjectType> _projectTypes = ProjectTypeDAO.sharedInstance().getProjectTypes(FETCH_GROUP_PROJECT_TYPE, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor()); CollectionUtil.addAllToCollection(_projectTypes.toArray(new ProjectType[0]), projectTypeList); Collections.sort(projectTypeList); Display.getDefault().asyncExec(new Runnable() { public void run() { if (isDisposed()) return; projectTypeCombo.removeAll(); for (ProjectType pt : projectTypeList) { projectTypeCombo.add(null, (pt.getName().getText(NLLocale.getDefault().getLanguage()))); } setSelectedProjectType(ProjectType.PROJECT_TYPE_ID_DEFAULT); ProjectTypeComboComposite.this.getParent().layout(true); } }); } catch (Exception x) { throw new RuntimeException(x); } return Status.OK_STATUS; } }; loadJob.setPriority(Job.SHORT); loadJob.schedule(); } private ListenerList selectionChangedListeners = new ListenerList(); private void fireSelectionChangedEvent() { if (selectionChangedListeners.isEmpty()) return; SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection()); for (Object l : selectionChangedListeners.getListeners()) { ISelectionChangedListener listener = (ISelectionChangedListener) l; listener.selectionChanged(event); } } @Override public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.add(listener); } @Override public ISelection getSelection() { if (selectedProjectType == null) return new StructuredSelection(new Object[0]); return new StructuredSelection(selectedProjectType); } @Override public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.remove(listener); } @Override public void setSelection(ISelection selection) { if (!(selection instanceof IStructuredSelection)) throw new IllegalArgumentException("selection is not an instance of " + IStructuredSelection.class.getName() + " but " + (selection == null ? null : selection.getClass().getName())); //$NON-NLS-1$ //$NON-NLS-2$ IStructuredSelection sel = (IStructuredSelection) selection; Object selObj = sel.getFirstElement(); if (selObj instanceof ProjectType) setSelectedProjectType((ProjectType) selObj); else throw new IllegalArgumentException("selection.getFirstElement() is neither null, nor an instanceof " + ProjectType.class.getName()+ " or " + ProjectTypeID.class.getName()+ "! It is an instance of " + (selObj == null ? null : selObj.getClass().getName())); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } public void setSelectedProjectType(ProjectType projectType) { setSelectedProjectTypeID(projectType == null ? "" : projectType.getProjectTypeID()); //$NON-NLS-1$ } public void setSelectedProjectType(ProjectTypeID projectTypeID) { setSelectedProjectTypeID(projectTypeID == null ? "" : projectTypeID.projectTypeID); //$NON-NLS-1$ } private void setSelectedProjectTypeID(String projectTypeID) { int idx = -1; int i = 0; for (ProjectType projectType : projectTypeList) { if (projectType.getProjectTypeID().equals(projectTypeID)) { idx = i; break; } ++i; } if (idx < 0) { projectTypeCombo.deselectAll(); selectedProjectType = null; } else { projectTypeCombo.select(idx); selectedProjectType = projectTypeList.get(idx); } } public ProjectType getSelectedProjectType() { return selectedProjectType; } public void addProjectType(ProjectType projectType, int index) { projectTypeList.add(index, projectType); projectTypeCombo.add(null, projectType.getName().getText(), index); } }