/******************************************************************************* * Copyright (c) 2013 Pivotal Software, Inc. * 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: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.springsource.ide.eclipse.commons.livexp.ui; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; 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.springsource.ide.eclipse.commons.livexp.core.LiveExpression; import org.springsource.ide.eclipse.commons.livexp.core.LiveVariable; import org.springsource.ide.eclipse.commons.livexp.core.ValidationResult; import org.springsource.ide.eclipse.commons.livexp.core.ValueListener; public class ChooseOneSection<T extends Ilabelable> extends WizardPageSection { private static final boolean DEBUG = (""+Platform.getLocation()).contains("kdvolder"); private String labelText; private Ilabelable[] validChoices; private LiveVariable<T> chosen; private LiveExpression<ValidationResult> validator; private boolean vertical = false; public ChooseOneSection(IPageWithSections owner, String labelText, T[] validChoices, LiveVariable<T> chosen, LiveExpression<ValidationResult> validator ) { super(owner); this.labelText = labelText; this.validChoices = validChoices; this.chosen = chosen; this.validator = validator; } @Override public LiveExpression<ValidationResult> getValidator() { return validator; } @SuppressWarnings("unchecked") private T getSingleSelection(ListViewer lv) { if (lv!=null) { ISelection sel = lv.getSelection(); if (sel instanceof IStructuredSelection) { return (T) ((IStructuredSelection) sel).getFirstElement(); } } return null; } @Override public void createContents(Composite page) { Composite composite = new Composite(page, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = (labelText==null||vertical)?1:2; layout.marginWidth = 0; composite.setLayout(layout); GridDataFactory grab = GridDataFactory.fillDefaults().grab(true, true);//.hint(SWT.DEFAULT, 150); grab.applyTo(composite); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); if (labelText!=null) { Label label = new Label(composite, SWT.NONE); label.setText(labelText); if (!vertical) { GridDataFactory.fillDefaults() .align(SWT.CENTER, SWT.BEGINNING) .hint(UIConstants.fieldLabelWidthHint(label), SWT.DEFAULT) .applyTo(label); } } final ListViewer tv = new ListViewer(composite, SWT.SINGLE|SWT.BORDER|SWT.V_SCROLL); grab.applyTo(tv.getList()); tv.setContentProvider(new ContentProvider()); tv.setLabelProvider(new SimpleLabelProvider()); tv.setInput(validChoices); chosen.addListener(new ValueListener<T>() { public void gotValue(LiveExpression<T> exp, T value) { if (value==null) { tv.setSelection(StructuredSelection.EMPTY); } else { tv.setSelection(new StructuredSelection(value)); } } }); if (DEBUG) { chosen.addListener(new ValueListener<T>() { public void gotValue(LiveExpression<T> exp, T value) { System.out.println("starter: "+value); } }); } tv.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { chosen.setValue(getSingleSelection(tv)); } }); if (owner instanceof IPageWithOkButton) { tv.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { ((IPageWithOkButton)owner).clickOk(); } }); } } class ContentProvider implements IStructuredContentProvider { public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public Object[] getElements(Object inputElement) { return validChoices; } } public ChooseOneSection<T> vertical() { vertical = true; return this; } }