package net.enilink.komma.edit.ui.properties.internal.wizards;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import net.enilink.commons.ui.jface.viewers.CComboViewer;
import net.enilink.vocab.rdfs.Datatype;
import net.enilink.komma.model.ModelUtil;
import net.enilink.komma.core.IEntity;
import net.enilink.komma.core.ILiteral;
import net.enilink.komma.em.concepts.IClass;
import net.enilink.komma.em.util.KommaUtil;
class DatatypePropertyPage extends WizardPage {
public static final String PAGE_NAME = "Dataproperty";
private Text labelText;
private CCombo languageCombo, datatypeCombo;
private Button useRanges;
private CComboViewer languageViewer, datatypeViewer;
private List<Datatype> listOfDatatypes;
private Set<? extends IClass> ranges;
private Context context;
private Collection<String> languages = new LinkedHashSet<String>(
KommaUtil.getDefaultLanguages());
public DatatypePropertyPage(Context context) {
super(PAGE_NAME, "Edit property value", null);
this.context = context;
}
@Override
public boolean canFlipToNextPage() {
return false;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
composite.setLayout(layout);
GridData gd = new GridData(SWT.TOP, SWT.FILL, true, true);
composite.setLayoutData(gd);
Label labelValue = new Label(composite, SWT.NONE);
labelValue.setText("Value");
GridData gridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false,
false);
labelValue.setLayoutData(gridData);
labelText = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL
| SWT.V_SCROLL);
gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
labelText.setLayoutData(gridData);
labelText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (labelText.getText().length() > 0) {
context.objectLabel = labelText.getText();
setPageComplete(true);
}
}
});
labelText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
}
@Override
public void focusGained(FocusEvent e) {
}
});
Label labelLanguage = new Label(composite, SWT.NONE);
labelLanguage.setText("Language");
gridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
labelLanguage.setLayoutData(gridData);
languageCombo = new CCombo(composite, SWT.BORDER);
languageViewer = new CComboViewer(languageCombo);
languageCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
false));
languageCombo.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
context.objectLanguage = languageCombo.getText();
}
});
languageViewer.add(languages.toArray());
Label labelDatatype = new Label(composite, SWT.NONE);
labelDatatype.setText("Type");
gridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
labelDatatype.setLayoutData(gridData);
datatypeCombo = new CCombo(composite, SWT.BORDER);
datatypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
false));
datatypeViewer = new CComboViewer(datatypeCombo);
datatypeViewer.setContentProvider(new ArrayContentProvider());
datatypeViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (!event.getSelection().isEmpty()) {
context.objectType = ((IEntity) ((IStructuredSelection) event
.getSelection()).getFirstElement())
.getURI();
languageCombo.select(-1);
languageCombo.setEditable(false);
languageCombo.setEnabled(false);
}
}
});
Label labelUseRanges = new Label(composite, SWT.NONE);
labelUseRanges.setText("Determine from value range");
gridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
labelUseRanges.setLayoutData(gridData);
useRanges = new Button(composite, SWT.CHECK);
useRanges.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
languageCombo.setEditable(true);
languageCombo.setEnabled(true);
languageCombo.select(-1);
if (useRanges.getSelection()) {
datatypeViewer.setInput(ranges);
} else {
datatypeViewer.setInput(listOfDatatypes);
}
}
});
useRanges.setSelection(true);
setControl(composite);
setPageComplete(false);
labelText.setFocus();
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
ranges = context.predicate.getNamedRanges(context.subject, false)
.toSet();
if (listOfDatatypes == null) {
listOfDatatypes = context.subject.getEntityManager()
.findAll(Datatype.class).toList();
}
super.setDescription("Edit property "
+ ModelUtil.getLabel(context.predicate) + " of "
+ ModelUtil.getLabel(context.subject));
if (useRanges.getSelection()) {
datatypeViewer.setInput(ranges);
} else {
datatypeViewer.setInput(listOfDatatypes);
}
if (context.object != null) {
if (context.object instanceof ILiteral) {
context.objectLabel = ((ILiteral) context.object)
.getLabel();
context.objectType = ((ILiteral) context.object)
.getDatatype();
context.objectLanguage = ((ILiteral) context.object)
.getLanguage();
} else {
context.objectLabel = String.valueOf(context.object);
}
labelText.setText(context.objectLabel);
}
if (context.objectType != null) {
datatypeViewer.setSelection(
new StructuredSelection(context.subject
.getEntityManager().find(context.objectType)),
true);
}
languageCombo.setEditable(context.objectType == null);
languageCombo.setEnabled(context.objectType == null);
if (context.objectLanguage != null) {
if (!languages.contains(context.objectLanguage)) {
languages.add(context.objectLanguage);
languageViewer.insert(context.objectLanguage, 0);
}
languageViewer.setSelection(new StructuredSelection(
context.objectLanguage), true);
} else {
languageViewer.setSelection(StructuredSelection.EMPTY);
}
}
}
}