/*******************************************************************************
* Copyright (c) 2012 Google, 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:
* Google, Inc. - initial API and implementation
*******************************************************************************/
package com.windowtester.swt.codegen.wizards;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import com.windowtester.codegen.ExecutionProfile;
import com.windowtester.codegen.generator.SetupHandlerProvider;
import com.windowtester.codegen.generator.SetupHandlers;
import com.windowtester.codegen.generator.setup.ISetupHandler;
import com.windowtester.codegen.generator.setup.SetupHandlerSet;
import com.windowtester.runtime.swt.internal.display.DisplayExec;
import com.windowtester.runtime.swt.internal.display.RunnableWithResult;
/**
* A Table for presenting setup handlers.
*/
public class SetupHandlerTable {
private class HandlerLabelProvider extends LabelProvider implements ITableLabelProvider {
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
*/
public Image getColumnImage (Object element, int columnIndex) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
*/
public String getColumnText(Object obj, int index) {
if (obj instanceof ISetupHandler)
return getHandlerLabel((ISetupHandler)obj);
return getText(obj);
}
private String getHandlerLabel(ISetupHandler handler) {
return handler.getDescription();
}
}
private CheckboxTableViewer viewer;
private SetupHandlerTableStore store = SetupHandlerTableStore.forDefaultPreferences();
private SetupHandlerProvider handlers = SetupHandlers.NONE;
private final Composite parent;
private SetupHandlerTable(Composite parent) {
this.parent = parent;
}
public SetupHandlerTable build() {
createViewer();
setState();
return this;
}
private void setState() {
if (!store.isActivated())
setDefaults();
else
restoreState();
}
private void restoreState() {
SetupHandlerSet selected = store.findMatches(getAllHandlers());
viewer.setCheckedElements(selected.toArray());
}
private void createViewer() {
viewer = CheckboxTableViewer.newCheckList(parent, SWT.MULTI | SWT.BORDER | SWT.CHECK);
Table table = viewer.getTable();
//TODO: visible or not visible?
//table.setLinesVisible(true);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true,2,1));
viewer.setContentProvider (new ArrayContentProvider());
viewer.setLabelProvider (new HandlerLabelProvider());
viewer.setInput(getHandlerInput());
}
//the handlers for setting up the viewer
private Object[] getHandlerInput() {
return handlers.getHandlers();
}
public static SetupHandlerTable forParent(Composite parent) {
return new SetupHandlerTable(parent);
}
public SetupHandlerTable inContext(ExecutionProfile profile) {
handlers = SetupHandlers.forContext(profile);
return this;
}
public SetupHandlerTable withStore(SetupHandlerTableStore store) {
this.store = store;
return this;
}
private ISetupHandler[] getSelection() {
return (ISetupHandler[]) DisplayExec.sync(new RunnableWithResult() {
public Object runWithResult() {
Object[] elements = viewer.getCheckedElements();
ISetupHandler[] handlers = new ISetupHandler[elements.length];
for (int i = 0; i < handlers.length; i++) {
handlers[i] = (ISetupHandler)elements[i];
}
return handlers;
}
});
}
public SetupHandlerSet getSelectedHandlers() {
return SetupHandlerSet.forHandlers(getSelection());
}
public void setDefaults() {
viewer.setCheckedElements(handlers.getDefaults());
}
public void persistSelections() {
store.setSelectedHandlers(getSelection());
}
public ISetupHandler[] getAllHandlers() {
return (ISetupHandler[]) DisplayExec.sync(new RunnableWithResult() {
/* (non-Javadoc)
* @see com.windowtester.runtime.swt.internal.display.RunnableWithResult#runWithResult()
*/
public Object runWithResult() {
TableItem[] items = getTable().getItems();
ISetupHandler[] handlers = new ISetupHandler[items.length];
for (int i = 0; i < items.length; i++) {
handlers[i] = (ISetupHandler) items[i].getData();
}
return handlers;
}
});
}
private Table getTable() {
return viewer.getTable();
}
}