blob: c2955e7b51c0b0a31b0ecdd07d2f3ef6de162c63 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicolas Bros (Mia-Software) - initial API and implementation
*******************************************************************************/
package org.eclipse.modisco.infra.discovery.ui.internal.views;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.modisco.facet.common.ui.internal.controls.PersistableColumn;
import org.eclipse.modisco.infra.discovery.catalog.DiscovererDescription;
import org.eclipse.modisco.infra.discovery.catalog.DiscovererParameter;
import org.eclipse.modisco.infra.discovery.core.IDiscoveryManager;
import org.eclipse.modisco.infra.discovery.ui.Activator;
import org.eclipse.modisco.infra.discovery.ui.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
/** An Eclipse view that displays a list of available discoverers. */
public class DiscoverersView extends ViewPart {
private TableViewer discoverersViewer;
private TableViewer parametersViewer;
private Composite parentComposite;
private Composite mainComposite;
private static final String NAME_COLUMN = "DiscoverersView_NameColumn"; //$NON-NLS-1$
private static final String TYPE_COLUMN = "DiscoverersView_DescriptionColumn"; //$NON-NLS-1$
private static final String INPUT_TYPE_COLUMN = "DiscoverersView_InputTypeColumn"; //$NON-NLS-1$
private static final String DECLARING_BUNDLE_COLUMN = "DiscoverersView_DeclaringBundleColumn"; //$NON-NLS-1$
private static final String PARAM_NAME_COLUMN = "DiscoverersView_ParamName"; //$NON-NLS-1$
private static final String PARAM_TYPE_COLUMN = "DiscoverersView_ParamType"; //$NON-NLS-1$
private static final String PARAM_DIRECTION_COLUMN = "DiscoverersView_ParamDirection"; //$NON-NLS-1$
private static final String PARAM_REQUIRED_COLUMN = "DiscoverersView_ParamRequired"; //$NON-NLS-1$
private static final String PARAM_DESCRIPTION_COLUMN = "DiscoverersView_ParamDescription"; //$NON-NLS-1$
private static final int NAME_COLUMN_WIDTH = 200;
private static final int TYPE_COLUMN_WIDTH = 150;
private static final int DECLARING_BUNDLE_COLUMN_WIDTH = 400;
private static final int INPUT_TYPE_COLUMN_WIDTH = 150;
private static final int PARAM_NAME_COLUMN_WIDTH = 160;
private static final int PARAM_TYPE_COLUMN_WIDTH = 100;
private static final int PARAM_DIRECTION_COLUMN_WIDTH = 60;
private static final int PARAM_REQUIRED_COLUMN_WIDTH = 60;
private static final int PARAM_DESCRIPTION_COLUMN_WIDTH = 400;
private static final String SASH_POSITION1 = "sashPosition1"; //$NON-NLS-1$
private static final String SASH_POSITION2 = "sashPosition2"; //$NON-NLS-1$
private static final String LAYOUT_ORIENTATION = "orientation"; //$NON-NLS-1$
private enum LayoutStyle {
Horizontal, Vertical
}
/** static because we want to save it before closing Eclipse */
private static LayoutStyle layoutStyle = DiscoverersView.LayoutStyle.Vertical;
private PersistableColumn nameColumn;
private PersistableColumn implClassColumn;
private PersistableColumn paramNameColumn;
private PersistableColumn paramTypeColumn;
private PersistableColumn paramDirectionColumn;
private PersistableColumn paramRequiredColumn;
private PersistableColumn paramDescColumn;
private PersistableColumn inputTypeColumn;
private PersistableColumn declaringBundleColumn;
private SashForm sashForm;
private static Integer sashPosition1;
private static Integer sashPosition2;
protected static LayoutStyle getLayoutStyle() {
return DiscoverersView.layoutStyle;
}
protected void changeLayoutStyle(final LayoutStyle newLayoutStyle) {
if (newLayoutStyle == DiscoverersView.layoutStyle) {
return;
}
DiscoverersView.layoutStyle = newLayoutStyle;
createMainComposite();
}
@Override
public void createPartControl(final Composite parent) {
this.parentComposite = parent;
parent.setLayout(gridLayoutWithNoMargins());
createMainComposite();
// automatic layout:
// parent.addControlListener(new ControlAdapter() {
// @Override
// public void controlResized(final ControlEvent e) {
// Point size = parent.getSize();
// if (size.x > size.y) {
// changeLayoutStyle(LayoutStyle.Horizontal);
// } else {
// changeLayoutStyle(LayoutStyle.Vertical);
// }
// }
// });
}
private void createMainComposite() {
if (this.mainComposite != null) {
this.mainComposite.dispose();
}
this.mainComposite = new Composite(this.parentComposite, SWT.NONE);
this.mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
this.mainComposite.setLayout(gridLayoutWithNoMargins());
final int direction;
if (DiscoverersView.layoutStyle == DiscoverersView.LayoutStyle.Horizontal) {
direction = SWT.HORIZONTAL;
} else {
direction = SWT.VERTICAL;
}
this.sashForm = new SashForm(this.mainComposite, SWT.SMOOTH | direction);
this.sashForm.setLayout(new FillLayout());
this.sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Control discoverersGroup = createDiscoverersGroup(this.sashForm);
createParametersGroup(this.sashForm);
discoverersGroup.addControlListener(new ControlAdapter() {
@Override
public void controlResized(final ControlEvent e) {
DiscoverersView.sashPosition1 = new Integer(DiscoverersView.this.sashForm
.getWeights()[0]);
DiscoverersView.sashPosition2 = new Integer(DiscoverersView.this.sashForm
.getWeights()[1]);
}
});
if (DiscoverersView.sashPosition1 != null && DiscoverersView.sashPosition2 != null) {
this.sashForm.setWeights(new int[] { DiscoverersView.sashPosition1.intValue(),
DiscoverersView.sashPosition2.intValue() });
}
this.parentComposite.layout();
}
private Group createDiscoverersGroup(final Composite parent) {
Group contextGroup = new Group(parent, SWT.NONE);
contextGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
contextGroup.setText(Messages.DiscoverersView_title);
GridLayout groupLayout = new GridLayout();
contextGroup.setLayout(groupLayout);
createDiscoverersViewer(contextGroup);
return contextGroup;
}
private void createDiscoverersViewer(final Group contextGroup) {
this.discoverersViewer = new TableViewer(contextGroup, SWT.BORDER | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION);
this.discoverersViewer.getTable().setLinesVisible(true);
this.discoverersViewer.getTable().setHeaderVisible(true);
this.discoverersViewer.getTable().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
this.discoverersViewer.setContentProvider(getDiscoverersContentProvider());
createDiscovererNameColumn(this.discoverersViewer);
createDiscovererInputTypeColumn(this.discoverersViewer);
createDiscovererImplClassColumn(this.discoverersViewer);
createDiscovererDeclaringBundleColumn(this.discoverersViewer);
this.discoverersViewer.setInput(getDiscoverersInput());
this.discoverersViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(final SelectionChangedEvent event) {
discovererSelectionChanged();
}
});
}
private void discovererSelectionChanged() {
IStructuredSelection selection = (IStructuredSelection) this.discoverersViewer
.getSelection();
Object firstElement = selection.getFirstElement();
if (firstElement instanceof DiscovererDescription) {
DiscovererDescription discovererDescription = (DiscovererDescription) firstElement;
this.parametersViewer.setInput(discovererDescription);
}
}
private void createParametersGroup(final Composite parent) {
Group contextGroup = new Group(parent, SWT.NONE);
contextGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
contextGroup.setText(Messages.DiscoverersView_params);
GridLayout groupLayout = new GridLayout();
contextGroup.setLayout(groupLayout);
createParametersViewer(contextGroup);
}
private void createParametersViewer(final Group contextGroup) {
this.parametersViewer = new TableViewer(contextGroup, SWT.BORDER | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION);
this.parametersViewer.getTable().setLinesVisible(true);
this.parametersViewer.getTable().setHeaderVisible(true);
this.parametersViewer.getTable()
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
this.parametersViewer.setContentProvider(getParametersContentProvider());
createParameterNameColumn(this.parametersViewer);
createParameterTypeColumn(this.parametersViewer);
createParameterDirectionColumn(this.parametersViewer);
createParameterRequiredColumn(this.parametersViewer);
createParameterDescriptionColumn(this.parametersViewer);
}
private static IContentProvider getParametersContentProvider() {
return new IStructuredContentProvider() {
public Object[] getElements(final Object inputElement) {
DiscovererDescription discovererDescription = (DiscovererDescription) inputElement;
List<DiscovererParameter> parameterDefinitions = discovererDescription
.getParameterDefinitions();
return parameterDefinitions.toArray();
}
public void inputChanged(final Viewer viewer, final Object oldInput,
final Object newInput) {
// nothing
}
public void dispose() {
// nothing
}
};
}
private static GridLayout gridLayoutWithNoMargins() {
GridLayout gridLayout = new GridLayout();
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
return gridLayout;
}
@Override
public void setFocus() {
//
}
private void createDiscovererNameColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
private Image discovererImage;
@Override
public String getText(final Object element) {
DiscovererDescription discovererDescription = (DiscovererDescription) element;
return discovererDescription.getId();
}
@Override
public Image getImage(final Object element) {
if (this.discovererImage == null) {
this.discovererImage = Activator
.getImageDescriptor("icons/discoverer16x16.png").createImage(); //$NON-NLS-1$
}
return this.discovererImage;
}
@Override
public void dispose() {
super.dispose();
if (this.discovererImage != null) {
this.discovererImage.dispose();
}
}
};
this.nameColumn = new PersistableColumn(Messages.DiscoverersView_name,
DiscoverersView.NAME_COLUMN, DiscoverersView.NAME_COLUMN_WIDTH,
columnLabelProvider, viewer);
}
private void createDiscovererImplClassColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererDescription discovererDescription = (DiscovererDescription) element;
return discovererDescription.getImplementationType().getName();
}
};
this.implClassColumn = new PersistableColumn(Messages.DiscoverersView_implClass,
DiscoverersView.TYPE_COLUMN, DiscoverersView.TYPE_COLUMN_WIDTH,
columnLabelProvider, viewer);
}
private void createDiscovererDeclaringBundleColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererDescription discovererDescription = (DiscovererDescription) element;
return discovererDescription.getImplementationBundle().getSymbolicName();
}
};
this.declaringBundleColumn = new PersistableColumn(
Messages.DiscoverersView_declaringBundle, DiscoverersView.DECLARING_BUNDLE_COLUMN,
DiscoverersView.DECLARING_BUNDLE_COLUMN_WIDTH, columnLabelProvider, viewer);
}
private void createDiscovererInputTypeColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererDescription discovererDescription = (DiscovererDescription) element;
return discovererDescription.getSourceType().getName();
}
};
this.inputTypeColumn = new PersistableColumn(Messages.DiscoverersView_inputType,
DiscoverersView.INPUT_TYPE_COLUMN, DiscoverersView.INPUT_TYPE_COLUMN_WIDTH,
columnLabelProvider, viewer);
}
private void createParameterNameColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererParameter discoveryParameter = (DiscovererParameter) element;
return discoveryParameter.getId();
}
};
this.paramNameColumn = new PersistableColumn(Messages.DiscoverersView_name,
DiscoverersView.PARAM_NAME_COLUMN, DiscoverersView.PARAM_NAME_COLUMN_WIDTH,
columnLabelProvider, viewer);
}
private void createParameterTypeColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererParameter discoveryParameter = (DiscovererParameter) element;
return discoveryParameter.getType().getSimpleName();
}
};
this.paramTypeColumn = new PersistableColumn(Messages.DiscoverersView_type,
DiscoverersView.PARAM_TYPE_COLUMN, DiscoverersView.PARAM_TYPE_COLUMN_WIDTH,
columnLabelProvider, viewer);
}
private void createParameterDirectionColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererParameter discoveryParameter = (DiscovererParameter) element;
return discoveryParameter.getDirection().toString();
}
};
this.paramDirectionColumn = new PersistableColumn(Messages.DiscoverersView_direction,
DiscoverersView.PARAM_DIRECTION_COLUMN,
DiscoverersView.PARAM_DIRECTION_COLUMN_WIDTH, columnLabelProvider, viewer);
}
private void createParameterRequiredColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererParameter discoveryParameter = (DiscovererParameter) element;
return Boolean.toString(discoveryParameter.isRequiredInput());
}
};
this.paramRequiredColumn = new PersistableColumn(Messages.DiscoverersView_required,
DiscoverersView.PARAM_REQUIRED_COLUMN, DiscoverersView.PARAM_REQUIRED_COLUMN_WIDTH,
columnLabelProvider, viewer);
}
private void createParameterDescriptionColumn(final TableViewer viewer) {
ColumnLabelProvider columnLabelProvider = new ColumnLabelProvider() {
@Override
public String getText(final Object element) {
DiscovererParameter discoveryParameter = (DiscovererParameter) element;
return discoveryParameter.getDescription();
}
};
this.paramDescColumn = new PersistableColumn(Messages.DiscoverersView_description,
DiscoverersView.PARAM_DESCRIPTION_COLUMN,
DiscoverersView.PARAM_DESCRIPTION_COLUMN_WIDTH, columnLabelProvider, viewer);
}
protected static IContentProvider getDiscoverersContentProvider() {
return new IStructuredContentProvider() {
public Object[] getElements(final Object inputElement) {
@SuppressWarnings("unchecked")
Collection<DiscovererDescription> discovererDescription = (Collection<DiscovererDescription>) inputElement;
return discovererDescription.toArray();
}
public void inputChanged(final Viewer viewer, final Object oldInput,
final Object newInput) {
// nothing
}
public void dispose() {
// nothing
}
};
}
protected static Object getDiscoverersInput() {
return IDiscoveryManager.INSTANCE.getDiscoverers();
}
private final Action horizontalLayoutAction = new Action(Messages.DiscoverersView_horizontal,
IAction.AS_RADIO_BUTTON) {
@Override
public ImageDescriptor getImageDescriptor() {
return Activator.getImageDescriptor("icons/th_horizontal.gif"); //$NON-NLS-1$
}
@Override
public void run() {
changeLayoutStyle(DiscoverersView.LayoutStyle.Horizontal);
}
};
private final Action verticalLayoutAction = new Action(Messages.DiscoverersView_vertical,
IAction.AS_RADIO_BUTTON) {
@Override
public ImageDescriptor getImageDescriptor() {
return Activator.getImageDescriptor("icons/th_vertical.gif"); //$NON-NLS-1$
}
@Override
public void run() {
changeLayoutStyle(DiscoverersView.LayoutStyle.Vertical);
}
};
@Override
public void init(final IViewSite site, final IMemento memento) throws PartInitException {
super.init(site, memento);
site.getActionBars().getToolBarManager().add(this.horizontalLayoutAction);
site.getActionBars().getToolBarManager().add(this.verticalLayoutAction);
if (memento != null) {
PersistableColumn.loadState(memento, DiscoverersView.NAME_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.TYPE_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.INPUT_TYPE_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.DECLARING_BUNDLE_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.PARAM_NAME_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.PARAM_TYPE_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.PARAM_DIRECTION_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.PARAM_REQUIRED_COLUMN);
PersistableColumn.loadState(memento, DiscoverersView.PARAM_DESCRIPTION_COLUMN);
DiscoverersView.sashPosition1 = memento.getInteger(DiscoverersView.SASH_POSITION1);
DiscoverersView.sashPosition2 = memento.getInteger(DiscoverersView.SASH_POSITION2);
String layout = memento.getString(DiscoverersView.LAYOUT_ORIENTATION);
if (layout != null) {
DiscoverersView.layoutStyle = DiscoverersView.LayoutStyle.valueOf(layout);
}
}
if (DiscoverersView.layoutStyle == DiscoverersView.LayoutStyle.Horizontal) {
this.horizontalLayoutAction.setChecked(true);
} else {
this.verticalLayoutAction.setChecked(true);
}
}
@Override
public void saveState(final IMemento memento) {
super.saveState(memento);
this.nameColumn.saveState(memento);
this.implClassColumn.saveState(memento);
this.inputTypeColumn.saveState(memento);
this.declaringBundleColumn.saveState(memento);
this.paramNameColumn.saveState(memento);
this.paramTypeColumn.saveState(memento);
this.paramDirectionColumn.saveState(memento);
this.paramRequiredColumn.saveState(memento);
this.paramDescColumn.saveState(memento);
memento.putInteger(DiscoverersView.SASH_POSITION1, this.sashForm.getWeights()[0]);
memento.putInteger(DiscoverersView.SASH_POSITION2, this.sashForm.getWeights()[1]);
memento.putString(DiscoverersView.LAYOUT_ORIENTATION, DiscoverersView.layoutStyle.name());
}
}