/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.tableeditor.settings;
import static com.google.common.collect.Lists.newArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
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.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.robotframework.ide.eclipse.main.plugin.model.RobotElement;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.SelectionLayerAccessor;
import org.robotframework.red.viewers.Selections;
import com.google.common.base.Function;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
public class SettingsEditorPageSelectionProvider implements ISelectionProvider {
private List<ISettingsFormFragment> formFragments;
private ISettingsFormFragment activeFormFragment;
private final List<TranslatingSelectionChangeListener> listeners = newArrayList();
public SettingsEditorPageSelectionProvider(final ISettingsFormFragment... formFragments) {
this.formFragments = newArrayList(Iterables.filter(Arrays.asList(formFragments), Predicates.notNull()));
for (final ISettingsFormFragment formFragment : formFragments) {
addFocusListener(formFragment);
}
}
private void addFocusListener(final ISettingsFormFragment formFragment) {
if (formFragment.getTable() != null) {
formFragment.getTable().addFocusListener(new FocusAdapter() {
@Override
public void focusGained(final FocusEvent e) {
activeFormFragment = formFragment;
}
});
}
}
@Override
public void addSelectionChangedListener(final ISelectionChangedListener listener) {
final TranslatingSelectionChangeListener wrappingListener = new TranslatingSelectionChangeListener(listener);
listeners.add(wrappingListener);
for (final ISettingsFormFragment formFragment : formFragments) {
if (formFragment.getTable() != null && formFragment.getSelectionProvider() != null) {
formFragment.getSelectionProvider().addSelectionChangedListener(wrappingListener);
formFragment.getTable().addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
listeners.remove(wrappingListener);
}
});
}
}
}
@Override
public ISelection getSelection() {
if (activeFormFragment == null || activeFormFragment.getSelectionProvider() == null) {
return StructuredSelection.EMPTY;
}
return translateEntriesToSettings(activeFormFragment.getSelectionProvider().getSelection());
}
@Override
public void removeSelectionChangedListener(final ISelectionChangedListener listener) {
TranslatingSelectionChangeListener foundListener = null;
for (final TranslatingSelectionChangeListener wrappingListener : listeners) {
if (wrappingListener.wrappedListener == listener) {
foundListener = wrappingListener;
break;
}
}
if (foundListener == null) {
return;
}
for (final ISettingsFormFragment formFragment : formFragments) {
if (formFragment.getSelectionProvider() != null) {
formFragment.getSelectionProvider().removeSelectionChangedListener(foundListener);
}
}
}
@Override
public void setSelection(final ISelection selection) {
if (activeFormFragment != null && activeFormFragment.getSelectionProvider() != null) {
activeFormFragment.getSelectionProvider().setSelection(selection);
}
}
public SelectionLayerAccessor getSelectionLayerAccessor() {
return activeFormFragment != null ? activeFormFragment.getSelectionLayerAccessor() : null;
}
@SuppressWarnings("rawtypes")
private ISelection translateEntriesToSettings(final ISelection selection) {
if (selection instanceof IStructuredSelection) {
final IStructuredSelection structuredSelection = (IStructuredSelection) selection;
final int size = structuredSelection.size();
final List<Entry> entries = Selections.getElements(structuredSelection, Entry.class);
if (!entries.isEmpty() && entries.size() == size) {
return new StructuredSelection(
newArrayList(Iterables.filter(Iterables.transform(entries, new Function<Entry, RobotElement>() {
@Override
public RobotElement apply(final Entry entry) {
return (RobotElement) entry.getValue();
}
}), Predicates.notNull())));
}
return selection;
}
return selection;
}
private class TranslatingSelectionChangeListener implements ISelectionChangedListener {
private final ISelectionChangedListener wrappedListener;
private TranslatingSelectionChangeListener(final ISelectionChangedListener listener) {
wrappedListener = listener;
}
@Override
public void selectionChanged(final SelectionChangedEvent event) {
wrappedListener.selectionChanged(new SelectionChangedEvent(event.getSelectionProvider(),
translateEntriesToSettings(event.getSelection())));
}
}
public ISettingsFormFragment getActiveFormFragment() {
return activeFormFragment;
}
}