/*******************************************************************************
* Copyright (c) 2008, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.runtime.ui.widgets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.eef.runtime.ui.utils.EEFRuntimeUIMessages;
import org.eclipse.emf.eef.runtime.ui.utils.EditingUtils;
import org.eclipse.emf.eef.runtime.ui.widgets.eobjflatcombo.EObjectFlatComboSettings;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
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.Text;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class EObjectFlatComboViewer extends Composite implements ISelectionProvider, IPropertiesFilteredWidget {
private Text selection;
protected Button editer;
protected List<ViewerFilter> filters;
private List<ISelectionChangedListener> listeners;
protected List<ViewerFilter> bpFilters;
protected Object selectedElement;
protected ILabelProvider labelProvider;
protected Object input;
private ButtonsModeEnum button_mode = ButtonsModeEnum.BROWSE;
private boolean isSetComparator;
private ViewerComparator comparator;
public EObjectFlatComboViewer(Composite parent, final boolean nullable) {
super(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
this.setLayout(layout);
selection = new Text(this, SWT.BORDER);
GridData selectionData = new GridData(GridData.FILL_HORIZONTAL);
selection.setLayoutData(selectionData);
selection.setEditable(false);
EditingUtils.setEEFtype(selection, "eef::EObjectFlatComboViewer::field");
editer = new Button(this, SWT.PUSH);
editer.setText(EEFRuntimeUIMessages.EObjectFlatComboViewer_add_button); //$NON-NLS-1$
filters = new ArrayList<ViewerFilter>();
bpFilters = new ArrayList<ViewerFilter>();
listeners = new ArrayList<ISelectionChangedListener>();
editer.addSelectionListener(getSelectionAdapter(nullable));
EditingUtils.setEEFtype(editer, "eef::EObjectFlatComboViewer::editbutton");
isSetComparator = false;
comparator = null;
}
public EObjectFlatComboViewer(Composite parent, final boolean nullable, ViewerComparator comparator) {
this(parent, nullable);
isSetComparator = true;
this.comparator = comparator;
}
/**
* @param nullable
* @return
*/
protected SelectionAdapter getSelectionAdapter(final boolean nullable) {
return new SelectionAdapter() {
/*
* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
* .swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
switch (button_mode) {
case BROWSE:
if (input instanceof EObjectFlatComboSettings) {
EMFModelViewerDialog dialog = new EMFModelViewerDialog(labelProvider, input,
filters.isEmpty() ? null : filters, bpFilters.isEmpty() ? null
: bpFilters, nullable, false) {
public void process(IStructuredSelection selection) {
if (selection == null) {
selectedElement = null;
initComponent();
selectionChanged(new StructuredSelection(Collections.EMPTY_LIST));
} else {
selectedElement = selection.getFirstElement();
initComponent();
if (selectedElement != null)
selectionChanged(new StructuredSelection(selectedElement));
else
selectionChanged(new StructuredSelection(Collections.EMPTY_LIST));
}
}
};
if (isSetComparator) {
dialog.setComparator(comparator);
}
dialog.open();
}
break;
default:
break;
}
}
};
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
listeners.remove(listener);
}
public ISelection getSelection() {
if (selectedElement != null)
return new StructuredSelection(selectedElement);
return new StructuredSelection(Collections.EMPTY_LIST);
}
public void setLabelProvider(ILabelProvider provider) {
this.labelProvider = provider;
}
public void setInput(Object input) {
if (this.input != input) {
this.input = input;
this.selectedElement = null;
this.selection.setText(""); //$NON-NLS-1$
}
}
/**
* Sets the given ID to the EObjectFlatComboViewer
*
* @param id
* the id of the widget
*/
public void setID(Object id) {
EditingUtils.setID(selection, id);
EditingUtils.setID(editer, id);
}
/**
* @return the ID of the EObjectFlatComboViewer
*/
public Object getID() {
return EditingUtils.getID(selection);
}
public void setSelection(ISelection selection) {
if (selection instanceof StructuredSelection) {
this.selectedElement = ((StructuredSelection)selection).getFirstElement();
initComponent();
}
}
public void addFilter(ViewerFilter filter) {
filters.add(filter);
}
public void addBusinessRuleFilter(ViewerFilter filter) {
bpFilters.add(filter);
}
public void resetFilters() {
filters.clear();
}
protected void initComponent() {
if (selectedElement != null && selection != null) {
if (labelProvider != null)
selection.setText(labelProvider.getText(selectedElement));
else
selection.setText(selectedElement.toString());
} else
selection.setText(""); //$NON-NLS-1$
}
protected void selectionChanged(ISelection selection) {
if (listeners != null && !listeners.isEmpty()) {
for (ISelectionChangedListener nextListener : listeners) {
nextListener.selectionChanged(new SelectionChangedEvent(this, selection));
}
}
}
public void removeBusinessRuleFilter(ViewerFilter filter) {
bpFilters.remove(filter);
}
public void removeFilter(ViewerFilter filter) {
filters.remove(filter);
}
public void setButtonMode(ButtonsModeEnum button_mode) {
this.button_mode = button_mode;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
selection.setEnabled(enabled);
editer.setEnabled(enabled);
}
public void setComparator(ViewerComparator comparator) {
this.comparator = comparator;
isSetComparator = true;
}
}