/*****************************************************************************
* Copyright (c) 2011 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.views.properties.widgets;
import java.util.Set;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.papyrus.views.properties.contexts.View;
import org.eclipse.papyrus.views.properties.runtime.ConfigurationManager;
import org.eclipse.papyrus.views.properties.runtime.EmbeddedDisplayEngine;
import org.eclipse.papyrus.infra.widgets.creation.ReferenceValueFactory;
import org.eclipse.papyrus.infra.widgets.editors.AbstractListEditor;
import org.eclipse.papyrus.infra.widgets.editors.ICommitListener;
import org.eclipse.papyrus.infra.widgets.editors.MultipleReferenceEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
public class MultiReferenceEditorWithPropertyView extends AbstractListEditor
implements ISelectionChangedListener {
protected MultipleReferenceEditor multiReferenceEditor;
protected Composite propertiesComposite;
protected EmbeddedDisplayEngine displayEngine = new EmbeddedDisplayEngine();
public MultiReferenceEditorWithPropertyView(Composite parent, int style) {
super(parent, style);
// parent.setBackground(getDisplay().getSystemColor(SWT.COLOR_RED));
((GridLayout) getLayout()).numColumns++;
multiReferenceEditor = createMultipleReferenceEditor(style);
multiReferenceEditor.addSelectionChangedListener(this);
multiReferenceEditor.setLayoutData(new GridData(SWT.BEGINNING,
SWT.FILL, false, true));
propertiesComposite = new Composite(this, style);
propertiesComposite.setLayout(new FillLayout());
propertiesComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
true, true));
}
/**
* Creates the multi reference editor.
*
* @param parent
* The composite in which the widget will be displayed
* @param style
* The style for the widget
* @return the multi reference editor.
*/
protected MultipleReferenceEditor createMultipleReferenceEditor(int style) {
return new MultipleReferenceEditor(this, style);
}
@Override
public GridData getDefaultLayoutData() {
GridData data = super.getDefaultLayoutData();
data.grabExcessVerticalSpace = true;
data.grabExcessHorizontalSpace = true;
data.verticalAlignment = SWT.FILL;
return data;
}
@Override
public Object getEditableType() {
return Object.class;
}
@Override
public void setReadOnly(boolean readOnly) {
multiReferenceEditor.setReadOnly(readOnly);
propertiesComposite.setEnabled(!readOnly);
}
@Override
public boolean isReadOnly() {
return multiReferenceEditor.isReadOnly();
}
@Override
public void setToolTipText(String text) {
multiReferenceEditor.setToolTipText(text);
}
@Override
public void setLabel(String label) {
multiReferenceEditor.setLabel(label);
}
public void setOrdered(boolean ordered) {
multiReferenceEditor.setOrdered(ordered);
}
public void setUnique(boolean unique) {
multiReferenceEditor.setUnique(unique);
}
@Override
public void setModelObservable(IObservableList modelObservable) {
multiReferenceEditor.setModelObservable(modelObservable);
if (!modelObservable.isEmpty()) {
multiReferenceEditor.getViewer().setSelection(new StructuredSelection(modelObservable.get(0)));
}
}
@Override
public void dispose() {
super.dispose();
multiReferenceEditor.removeSelectionChangedListener(this);
}
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
Set<View> views = ConfigurationManager.instance.constraintEngine
.getViews(selection);
displayEngine.display(views, propertiesComposite, selection, SWT.NONE);
this.layout();
propertiesComposite.layout();
// TODO : How can we force the property view layout ?
// In the tabbed property view, we need to go up to the 4th parent
getParent().layout(); // This one works in the embedded editor
// In the Eclipse Tabbed Property View, we need to go this far...
getParent().getParent().getParent().getParent().layout();
}
public void setFactory(ReferenceValueFactory valueFactory) {
multiReferenceEditor.setFactory(valueFactory);
}
public void setDirectCreation(boolean directCreation) {
multiReferenceEditor.setDirectCreation(directCreation);
}
public void setLabelProvider(ILabelProvider labelProvider) {
multiReferenceEditor.setLabelProvider(labelProvider);
}
@Override
public void addCommitListener(ICommitListener commitListener) {
multiReferenceEditor.addCommitListener(commitListener);
}
}