package org.nightlabs.jfire.department.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.jdo.FetchPlan;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
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.jdo.NLJDOHelper;
import org.nightlabs.jfire.base.ui.edit.IEntryEditor;
import org.nightlabs.jfire.department.Department;
import org.nightlabs.jfire.department.dao.DepartmentDAO;
import org.nightlabs.progress.NullProgressMonitor;
public class DepartmentComboComposite
extends XComposite
implements ISelectionProvider, IEntryEditor
{
public DepartmentComboComposite(Composite parent)
{
super(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER);
createCombo();
loadDepartments();
}
private XCombo departmentCombo;
private Department selectedDepartment;
protected XCombo createCombo() {
departmentCombo = new XCombo(this, SWT.BORDER | SWT.READ_ONLY);
departmentCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
departmentCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
int idx = departmentCombo.getSelectionIndex();
if (idx < 0 || idx > departmentList.size() - 1)
selectedDepartment = null;
else
selectedDepartment = departmentList.get(idx);
fireSelectionChangedEvent();
}
});
return departmentCombo;
}
private static String[] FETCH_GROUP_DEPARTMENT = new String[] {
FetchPlan.DEFAULT,
Department.FETCH_GROUP_NAME};
private List<Department> departmentList = new ArrayList<Department>();
public void loadDepartments()
{
departmentCombo.removeAll();
Job loadJob = new Job("Loading departments") {
@Override
protected IStatus run(IProgressMonitor monitor)
{
try {
final List<Department> departments = DepartmentDAO.sharedInstance().getDepartments(FETCH_GROUP_DEPARTMENT, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor());
Collections.sort(departments);
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
if (isDisposed())
return;
departmentCombo.removeAll();
int selectionIdx = -1;
departmentList = departments;
for (Department department : departments) {
if (department.equals(selectedDepartment))
selectionIdx = departmentCombo.getItemCount();
else
selectionIdx = 0;
departmentCombo.add(null, department.getName().getText());
}
DepartmentComboComposite.this.getParent().layout(true);
departmentCombo.select(selectionIdx);
}
});
} 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 (selectedDepartment == null)
return new StructuredSelection(new Object[0]);
return new StructuredSelection(selectedDepartment);
}
@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 Department)
setSelectedDepartment((Department) selObj);
}
public void setSelectedDepartment(Department selectedDepartment) {
this.selectedDepartment = selectedDepartment;
if (selectedDepartment == null)
departmentCombo.select(-1);
else
departmentCombo.select(departmentList.indexOf(selectedDepartment));
}
public Department getSelectedDepartment() {
return selectedDepartment;
}
public XCombo getDepartmentCombo() {
return departmentCombo;
}
@Override
public boolean setFocus() {
return departmentCombo.setFocus();
}
@Override
public void setEnabledState(boolean enabled, String tooltip) {
departmentCombo.setEnabled(enabled);
if (!enabled) {
setToolTipText(tooltip);
} else {
setToolTipText(null);
}
}
@Override
public void setTitle(String title) {
// TODO Dunno where to set a title here.
}
}