package com.netifera.platform.ui.spaces.actions.options;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.widgets.FormToolkit;
import com.netifera.platform.api.model.IEntity;
import com.netifera.platform.api.model.IModelPredicate;
import com.netifera.platform.api.model.IShadowEntity;
import com.netifera.platform.api.model.IWorkspace;
import com.netifera.platform.tools.options.IterableOption;
import com.netifera.platform.ui.internal.spaces.Activator;
public class IterableOptionWidget extends OptionWidget {
private final CCombo combo;
private final List<IEntity> entities;
public IterableOptionWidget(Composite parent, FormToolkit toolkit, IterableOption option) {
super(parent, toolkit, option);
Composite area = toolkit.createComposite(parent);
area.setLayout(new GridLayout(2,false));
area.setToolTipText(option.getDescription());
Label label = toolkit.createLabel(area, option.getLabel());
label.setToolTipText(option.getDescription());
combo = new CCombo(area, SWT.NONE);
combo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
GridData gd = new GridData(SWT.BEGINNING, SWT.FILL, true, false);
gd.widthHint = 200;
combo.setLayoutData(gd);
combo.setEditable(false);
combo.setToolTipText(option.getDescription());
final IWorkspace workspace = Activator.getDefault().getModel().getCurrentWorkspace();
if(workspace == null) {
throw new IllegalStateException("Cannot create IterableOptionWidget because no workspace is open");
}
entities = workspace.findByPredicate(new IModelPredicate<IEntity>() {
public boolean match(IEntity candidate) {
return candidate.getIterableAdapter(getOption().getIterableType()) != null;
}
});
for (IEntity e: entities) {
combo.add(Activator.getDefault().getLabelProvider().getText((IShadowEntity)e));
}
toolkit.paintBordersFor(area);
combo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
modified();
}
});
combo.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
modified();
}
public void widgetSelected(SelectionEvent e) {
setOptionValue();
modified();
}
});
if (option.isFixed())
combo.setEnabled(false);
}
public IterableOption getOption() {
return (IterableOption) super.getOption();
}
public boolean isValid() {
return true;
}
public void setOptionValue() {
int index = combo.getSelectionIndex();
if (index < 0) {
getOption().setToDefault();
} else {
getOption().setValue(entities.get(index).getIterableAdapter(getOption().getIterableType()));
}
}
}