package org.nightlabs.jfire.entityuserset.ui; import java.util.Collections; import java.util.Comparator; import java.util.List; 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.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.nightlabs.base.ui.composite.ListComposite; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.language.I18nTextEditor; import org.nightlabs.base.ui.language.I18nTextEditor.EditMode; import org.nightlabs.base.ui.wizard.WizardHopPage; import org.nightlabs.i18n.I18nText; import org.nightlabs.i18n.I18nTextBuffer; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jfire.entityuserset.EntityUserSet; import org.nightlabs.jfire.entityuserset.dao.EntityUserSetDAO; import org.nightlabs.jfire.entityuserset.id.EntityUserSetID; import org.nightlabs.jfire.entityuserset.ui.resource.Messages; import org.nightlabs.jfire.security.SecurityReflector; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.progress.SubProgressMonitor; import org.nightlabs.util.NLLocale; /** * @author Daniel Mazurek - Daniel.Mazurek [dot] nightlabs [dot] de * */ public class SelectEntityUserSetPage<Entity> extends WizardHopPage { public static enum Action { inherit, none, create, select } private EntityUserSetID entityUserSetID; private EntityUserSetPageControllerHelper<Entity> entityUserSetPageControllerHelper; private InheritedEntityUserSetResolver<Entity> inheritedEntityUserSetResolver; private Action action; private Button radioButtonInherit; private Button radioButtonNone; private Button radioButtonCreate; private I18nText newEntityUserSetName = new I18nTextBuffer(); private I18nTextEditor newEntityUserSetNameEditor; private Button radioButtonSelect; private ListComposite<EntityUserSet<Entity>> entityUserSetList; private EntityUserSet<Entity> inheritedEntityUserSet = null; private EntityUserSetID selectedEntityUserSetID; private EntityUserSet<Entity> newEntityUserSet = null; private boolean initializationFinished = false; private String entityUserSetName; /** * @param entityUserSetID * @param inheritedEntityUserSetResolver */ public SelectEntityUserSetPage( EntityUserSetID entityUserSetID, EntityUserSetPageControllerHelper<Entity> entityUserSetPageControllerHelper) { super(SelectEntityUserSetPage.class.getName(), Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.title")+entityUserSetPageControllerHelper.getEntityUserSetName()); //$NON-NLS-1$ this.entityUserSetName = entityUserSetPageControllerHelper.getEntityUserSetName(); this.entityUserSetID = entityUserSetID; this.entityUserSetPageControllerHelper = entityUserSetPageControllerHelper; this.inheritedEntityUserSetResolver = entityUserSetPageControllerHelper.getInheritedEntityUserSetResolver(); } private void setInheritedEntityUserSetName(String entityUserSetName) { radioButtonInherit.setText(String.format((Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.button.inherit.text")), this.entityUserSetName, entityUserSetName)); //$NON-NLS-1$ } @Override public Control createPageContents(Composite parent) { final XComposite page = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER); if (inheritedEntityUserSetResolver != null) { radioButtonInherit = new Button(page, SWT.RADIO); radioButtonInherit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); radioButtonInherit.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setAction(Action.inherit); } }); setInheritedEntityUserSetName(Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.loading")); //$NON-NLS-1$ } radioButtonNone = new Button(page, SWT.RADIO); radioButtonNone.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); radioButtonNone.setText(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.button.none.text"), entityUserSetName)); //$NON-NLS-1$ radioButtonNone.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setAction(Action.none); } }); radioButtonCreate = new Button(page, SWT.RADIO); radioButtonCreate.setEnabled(false); // enabling this when the AuthorityType has been loaded. radioButtonCreate.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); radioButtonCreate.setText(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.button.create.text"), entityUserSetName)); //$NON-NLS-1$ radioButtonCreate.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setAction(Action.create); } }); XComposite nameComp = new XComposite(page, SWT.NONE, LayoutMode.TIGHT_WRAPPER); nameComp.getGridData().grabExcessVerticalSpace = false; nameComp.getGridLayout().numColumns = 2; Label nameSpacer = new Label(nameComp, SWT.NONE); GridData gd = new GridData(); gd.widthHint = 32; gd.heightHint = 1; nameSpacer.setLayoutData(gd); newEntityUserSetNameEditor = new I18nTextEditor(nameComp); newEntityUserSetNameEditor.setI18nText(newEntityUserSetName, EditMode.DIRECT); newEntityUserSetNameEditor.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent arg0) { setAction(Action.create); } }); newEntityUserSetNameEditor.addFocusListener(new FocusAdapter(){ /* (non-Javadoc) * @see org.eclipse.swt.events.FocusAdapter#focusGained(org.eclipse.swt.events.FocusEvent) */ @Override public void focusGained(FocusEvent e) { setAction(Action.create); } }); radioButtonSelect = new Button(page, SWT.RADIO); radioButtonSelect.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); radioButtonSelect.setText(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.button.select.text"), entityUserSetName)); //$NON-NLS-1$ radioButtonSelect.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setAction(Action.select); } }); entityUserSetList = new ListComposite<EntityUserSet<Entity>>(page, SWT.NONE, (String)null, new LabelProvider() { @Override public String getText(Object element) { return ((EntityUserSet<?>)element).getName().getText(); } }); entityUserSetList.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { selectedEntityUserSetID = (EntityUserSetID) JDOHelper.getObjectId(entityUserSetList.getSelectedElement()); setAction(Action.select); } }); EntityUserSet<Entity> dummy = entityUserSetPageControllerHelper.createEntityUserSet(); dummy.getName().setText(NLLocale.getDefault().getLanguage(), Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.dummy.loading.name")); //$NON-NLS-1$ entityUserSetList.addElement(dummy); Job loadJob = new Job(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.job.loadEntityUserSet"), entityUserSetName)) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) throws Exception { monitor.beginTask(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.tas.loadEntityUserSet"), entityUserSetName), 100); //$NON-NLS-1$ if (inheritedEntityUserSetResolver == null) { inheritedEntityUserSet = null; monitor.worked(20); } else { EntityUserSetID inheritedEntityUserSetID = inheritedEntityUserSetResolver.getInheritedEntityUserSetID(new SubProgressMonitor(monitor, 10)); if (inheritedEntityUserSetID == null) { inheritedEntityUserSet = null; monitor.worked(10); } else inheritedEntityUserSet = EntityUserSetDAO.sharedInstance().getEntityUserSet( inheritedEntityUserSetID, new String[] { FetchPlan.DEFAULT, EntityUserSet.FETCH_GROUP_NAME}, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new SubProgressMonitor(monitor, 10)); } final Set<EntityUserSetID> entityUserSetIDs = EntityUserSetDAO.sharedInstance().getEntityUserSetIDs( SecurityReflector.getUserDescriptor().getOrganisationID(), entityUserSetPageControllerHelper.getEntityClass(), new SubProgressMonitor(monitor, 10)); final List<EntityUserSet<Entity>> entityUserSets = EntityUserSetDAO.sharedInstance().getEntityUserSets( entityUserSetIDs, new String[] {FetchPlan.DEFAULT, EntityUserSet.FETCH_GROUP_NAME}, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new SubProgressMonitor(monitor, 50)); Collections.sort(entityUserSets, new Comparator<EntityUserSet<Entity>>() { @Override public int compare(EntityUserSet<Entity> o1, EntityUserSet<Entity> o2) { return o1.getName().getText().compareTo(o2.getName().getText()); } }); monitor.done(); if (page.isDisposed()) return Status.CANCEL_STATUS; page.getDisplay().asyncExec(new Runnable() { public void run() { if (entityUserSetList.isDisposed()) return; if (inheritedEntityUserSetResolver != null) setInheritedEntityUserSetName(inheritedEntityUserSet == null ? Messages.getString("org.nightlabs.jfire.entityuserset.ui.SelectEntityUserSetPage.label.noneAssigned") : inheritedEntityUserSet.getName().getText()); //$NON-NLS-1$ radioButtonCreate.setEnabled(true); // now we have the authorityType and thus can enable this. entityUserSetList.removeAll(); entityUserSetList.addElements(entityUserSets); initializationFinished = true; getContainer().updateButtons(); } }); return Status.OK_STATUS; } }; loadJob.setPriority(Job.SHORT); loadJob.schedule(); // setAction accesses the container and if we do that directly here, it causes a NPE. Hence we do it in the next event cycle. page.getDisplay().asyncExec(new Runnable() { public void run() { // if the inheritance option is available, we make it default - if it's not, we use "select" as default if (radioButtonInherit != null) setAction(Action.inherit); else setAction(Action.select); } }); return page; } @Override public boolean isPageComplete() { if (action == null || !initializationFinished) // not yet initialised return false; switch (action) { case create: return !newEntityUserSetName.isEmpty(); case inherit: case none: return true; case select: return selectedEntityUserSetID != null; default: throw new IllegalStateException("Unknown action: " + action); //$NON-NLS-1$ } } public Action getAction() { return action; } private void setAction(Action action) { this.action = action; if (radioButtonInherit != null) radioButtonInherit.setSelection(Action.inherit == action); radioButtonNone.setSelection(Action.none == action); radioButtonCreate.setSelection(Action.create == action); radioButtonSelect.setSelection(Action.select == action); getContainer().updateButtons(); } public EntityUserSetID getEntityUserSetID() { if (action == null) return null; switch (action) { case inherit: return (EntityUserSetID) JDOHelper.getObjectId(inheritedEntityUserSet); case create: case none: return null; case select: return selectedEntityUserSetID; default: throw new IllegalStateException("Unknown action: " + action); //$NON-NLS-1$ } } public EntityUserSet<Entity> getNewEntityUserSet() { if (action != Action.create) return null; if (newEntityUserSet == null) { newEntityUserSet = entityUserSetPageControllerHelper.createEntityUserSet(); } newEntityUserSet.getName().copyFrom(newEntityUserSetName); return newEntityUserSet; } }