package org.nightlabs.jfire.entityuserset.ui;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.nightlabs.base.ui.action.InheritanceAction;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.editor.ToolBarSectionPart;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.language.I18nTextEditor;
import org.nightlabs.base.ui.language.I18nTextEditorMultiLine;
import org.nightlabs.base.ui.language.I18nTextEditor.EditMode;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.base.ui.resource.SharedImages.ImageFormat;
import org.nightlabs.base.ui.wizard.DynamicPathWizardDialog;
import org.nightlabs.jfire.entityuserset.id.EntityUserSetID;
import org.nightlabs.jfire.entityuserset.ui.resource.Messages;
import org.nightlabs.util.Util;
/**
* @author Daniel Mazurek - Daniel.Mazurek [dot] nightlabs [dot] de
*
*/
public class EntityUserSetSection<Entity>
extends ToolBarSectionPart
{
private I18nTextEditor name;
private I18nTextEditor description;
private Label nameLabel;
private Label descriptionLabel;
private EntityUserSetPageControllerHelper<Entity> entityUserSetPageControllerHelper;
public EntityUserSetSection(IFormPage page, Composite parent) {
super(page, parent, ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE,
Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.title")); //$NON-NLS-1$
((GridData)getSection().getLayoutData()).grabExcessVerticalSpace = false;
Composite wrapper = new XComposite(getContainer(), SWT.NONE);
wrapper.setLayout(new GridLayout(2, false));
nameLabel = new Label(wrapper, SWT.NONE);
nameLabel.setText(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.label.name")); //$NON-NLS-1$
name = new I18nTextEditor(wrapper);
name.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
name.addModifyListener(markDirtyModifyListener);
descriptionLabel = new Label(wrapper, SWT.NONE);
descriptionLabel.setText(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.label.description")); //$NON-NLS-1$
GridData gd = new GridData();
gd.verticalAlignment = GridData.BEGINNING;
descriptionLabel.setLayoutData(gd);
description = new I18nTextEditorMultiLine(wrapper, name.getLanguageChooser());
description.setLayoutData(new GridData(GridData.FILL_BOTH));
description.addModifyListener(markDirtyModifyListener);
assignEntityUserSetAction.setEnabled(false);
getToolBarManager().add(assignEntityUserSetAction);
inheritAction.setEnabled(false);
getToolBarManager().add(inheritAction);
updateToolBarManager();
name.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent event) {
setEntityUserSetPageControllerHelper(null);
}
});
setEnabled(false);
}
private ModifyListener markDirtyModifyListener = new ModifyListener() {
@Override
public void modifyText(ModifyEvent arg0) {
markDirty();
}
};
private Action assignEntityUserSetAction = new Action() {
{
setText(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.action.assign.text")); //$NON-NLS-1$
setToolTipText(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.action.assign.tooltip")); //$NON-NLS-1$
setImageDescriptor(SharedImages.getSharedImageDescriptor(Activator.getDefault(),
EntityUserSetSection.class, "Assign", ImageFormat.gif)); //$NON-NLS-1$
}
@Override
public void run() {
if (entityUserSetPageControllerHelper == null)
return;
final AssignEntityUserSetWizard<Entity> assignEntityUserSetWizard = new AssignEntityUserSetWizard<Entity>(
entityUserSetPageControllerHelper.getEntityUserSetID(),
entityUserSetPageControllerHelper
);
DynamicPathWizardDialog dialog = new DynamicPathWizardDialog(getSection().getShell(), assignEntityUserSetWizard);
if (dialog.open() == Dialog.OK) {
Job job = new Job(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.job.loading"), entityUserSetPageControllerHelper.getEntityUserSetName())) { //$NON-NLS-1$
@Override
protected IStatus run(org.nightlabs.progress.ProgressMonitor monitor) throws Exception {
entityUserSetPageControllerHelper.load(
assignEntityUserSetWizard.getEntityUserSetID(),
assignEntityUserSetWizard.getNewEntityUserSet(),
monitor);
getSection().getDisplay().asyncExec(new Runnable() {
public void run() {
inheritAction.setChecked(assignEntityUserSetWizard.isEntityUserSetIDInherited());
entityUserSetChanged();
markDirty();
}
});
return Status.OK_STATUS;
}
};
job.setPriority(Job.SHORT);
job.schedule();
}
}
};
private InheritanceAction inheritAction = new InheritanceAction() {
@Override
public void run() {
final boolean oldEnabled = inheritAction.isEnabled();
inheritAction.setEnabled(false);
Job job = new Job(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.job.loading"), entityUserSetPageControllerHelper.getEntityUserSetName())) { //$NON-NLS-1$
@Override
protected org.eclipse.core.runtime.IStatus run(org.nightlabs.progress.ProgressMonitor monitor) throws Exception {
try {
boolean setInherited = isChecked();
InheritedEntityUserSetResolver<Entity> resolver = entityUserSetPageControllerHelper.getInheritedEntityUserSetResolver();
EntityUserSetID parentEntityUserSetID = resolver.getInheritedEntityUserSetID(monitor);
resolver.setEntityUserSetInherited(setInherited);
EntityUserSetID newEntityUserSetID = setInherited ? parentEntityUserSetID : entityUserSetPageControllerHelper.getEntityUserSetID();
if (!Util.equals(newEntityUserSetID, entityUserSetPageControllerHelper.getEntityUserSetID())) {
entityUserSetPageControllerHelper.load(
newEntityUserSetID,
null, monitor);
}
getSection().getDisplay().asyncExec(new Runnable() {
public void run() {
entityUserSetChanged();
markDirty();
}
});
return Status.OK_STATUS;
} finally {
if (!getSection().isDisposed()) {
getSection().getDisplay().asyncExec(new Runnable() {
public void run() {
inheritAction.setEnabled(oldEnabled);
}
});
}
}
}
};
job.setPriority(Job.SHORT);
job.schedule();
}
};
/**
* Get the object that has been set by {@link #setEntityUserSetPageControllerHelper(EntityUserSetPageControllerHelper)} before or <code>null</code>.
*
* @return an instance of <code>EntityUserSetPageControllerHelper</code> or <code>null</code>.
*/
protected EntityUserSetPageControllerHelper<Entity> getEntityUserSetPageControllerHelper() {
return entityUserSetPageControllerHelper;
}
/**
* Set the {@link EntityUserSetPageControllerHelper} that is used for the current editor page. It is possible to
* pass <code>null</code> in order to indicate that there is nothing to be managed right now (and thus to clear
* the UI).
*
* @param entityUserSetPageControllerHelper an instance of <code>EntityUserSetPageControllerHelper</code> or <code>null</code>.
*/
protected void setEntityUserSetPageControllerHelper(final EntityUserSetPageControllerHelper<Entity> entityUserSetPageControllerHelper) {
this.entityUserSetPageControllerHelper = entityUserSetPageControllerHelper;
getSection().getDisplay().asyncExec(new Runnable() {
public void run() {
assignEntityUserSetAction.setEnabled(entityUserSetPageControllerHelper != null);
entityUserSetChanged();
inheritAction.setEnabled(entityUserSetPageControllerHelper != null);
inheritAction.setChecked(false);
if (entityUserSetPageControllerHelper != null) {
inheritAction.setEnabled(true);
inheritAction.setChecked(entityUserSetPageControllerHelper.isEntityUserSetInitiallyInherited());
String name = entityUserSetPageControllerHelper.getEntityUserSetName();
assignEntityUserSetAction.setText(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.action.assignEntityUserSet.text"), name)); //$NON-NLS-1$
assignEntityUserSetAction.setToolTipText(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.action.assignEntityUserSet.tooltip"), name)); //$NON-NLS-1$
}
}
});
}
private void entityUserSetChanged() {
if (name.isDisposed())
return;
if (entityUserSetPageControllerHelper == null || entityUserSetPageControllerHelper.getEntityUserSet() == null) {
name.setI18nText(null, EditMode.DIRECT);
description.setI18nText(null, EditMode.DIRECT);
if (entityUserSetPageControllerHelper == null) {
setMessage(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.message.nothingSelected")); //$NON-NLS-1$
}
else {
String name = entityUserSetPageControllerHelper.getEntityUserSetName();
setMessage(String.format(Messages.getString("org.nightlabs.jfire.entityuserset.ui.EntityUserSetSection.message.nothingAssigned"), name)); //$NON-NLS-1$
}
setEnabled(false);
}
else {
name.setI18nText(entityUserSetPageControllerHelper.getEntityUserSet().getName(), EditMode.DIRECT);
description.setI18nText(entityUserSetPageControllerHelper.getEntityUserSet().getDescription(), EditMode.DIRECT);
setMessage(null);
setEnabled(true);
}
}
private void setEnabled(boolean enabled) {
name.setEnabled(enabled);
description.setEnabled(enabled);
nameLabel.setEnabled(enabled);
descriptionLabel.setEnabled(enabled);
}
}