/*******************************************************************************
* Copyright (c) 2009 Borland Software Corporation and others.
*
* 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:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.runtime.ui.ant;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.ILaunchGroup;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.m2m.internal.qvt.oml.runtime.launch.QvtLaunchConfigurationDelegate;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.ui.model.WorkbenchViewerComparator;
public class ChooseDataSourcePage extends AbstractCompositeWizardPage {
protected ChooseDataSourcePage() {
super("dataSourcePage"); //$NON-NLS-1$
setTitle(Messages.SourcePage_title1);
setDescription(Messages.SourcePage_descr1);
}
@Override
public void setVisible(boolean visible) {
if (visible && getSelectedLaunchConfiguration() == null) {
myViewer.setSelection(new IStructuredSelection() {
public Object getFirstElement() {
Object[] array = toArray();
if (array.length == 0) {
return null;
}
return array[0];
}
public Iterator<Object> iterator() {
return toList().iterator();
}
public int size() {
return toArray().length;
}
public Object[] toArray() {
return ((ITreeContentProvider) myViewer.getContentProvider()).getElements(null);
}
public List<Object> toList() {
Object[] array = toArray();
List<Object> list = new ArrayList<Object>(array.length);
for (Object o : array) {
list.add(o);
}
return list;
}
public boolean isEmpty() {
return toArray().length > 0;
}
});
}
super.setVisible(visible);
}
@Override
protected void doCreateControl(Composite parent) {
myViewer = new TreeViewer(parent);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
myViewer.getControl().setLayoutData(data);
myViewer.setLabelProvider(new TypeNamesWithTaskTypes(DebugUITools.newDebugModelPresentation()));
myViewer.setComparator(new WorkbenchViewerComparator());
myViewer.setContentProvider(new LaunchConfigurationTreeContentProvider(ILaunchManager.RUN_MODE, parent.getShell()));
myViewer.addFilter(new AntFilter());
myViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
myViewer.expandAll();
myViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
getContainer().updateButtons();
myConfigButton.setEnabled(getSelectedConfigType() != null);
}
});
myConfigButton = new Button(parent, SWT.NULL);
myConfigButton.setText(Messages.SourcePage_configBtn);
myConfigButton.setEnabled(false);
myConfigButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ILaunchConfigurationType configType = getSelectedConfigType();
if (configType == null) {
return;
}
try {
if ((myCreatedConfig == null) || (!configType.equals(myCreatedConfig.getType()))) {
ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, "qvto.antTask.newConfiguration"); //$NON-NLS-1$
wc.setAttribute(IDebugUIConstants.ATTR_PRIVATE, true);
myCreatedConfig = wc.doSave();
}
ILaunchGroup launchGroup = DebugUITools.getLaunchGroup(myCreatedConfig, ILaunchManager.RUN_MODE);
if (DebugUITools.openLaunchConfigurationPropertiesDialog(getShell(), myCreatedConfig, launchGroup.getIdentifier()) == Window.OK) {
myConfig = myCreatedConfig;
if (canFlipToNextPage()) {
getContainer().showPage(getNextPage());
myConfig = null;
}
}
getContainer().updateButtons();
} catch (CoreException e1) {
e1.printStackTrace();
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
Composite container = new Composite(parent, SWT.NULL);
container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout layout = new GridLayout();
container.setLayout(layout);
layout.numColumns = 2;
layout.verticalSpacing = 9;
}
@Override
public boolean canFlipToNextPage() {
setErrorMessage(null);
myTaskModel = null;
ILaunchConfiguration conf = getSelectedLaunchConfiguration();
if (conf == null) {
return false;
}
try {
myTaskModel = new TaskModel(conf, QVTO_ANTTASK_NAME);
}
catch (Exception e) {
setErrorMessage(e.getMessage());
return false;
}
return true;
}
public TaskModel getTaskModel() {
return myTaskModel;
}
private ILaunchConfiguration getSelectedLaunchConfiguration() {
if (myConfig != null) {
return myConfig;
}
ISelection selection = myViewer.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection ssel = (IStructuredSelection) selection;
Object firstElement = ssel.getFirstElement();
if (firstElement instanceof ILaunchConfiguration) {
return (ILaunchConfiguration) firstElement;
}
}
return null;
}
private ILaunchConfigurationType getSelectedConfigType() {
ISelection selection = myViewer.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection ssel = (IStructuredSelection) selection;
Object firstElement = ssel.getFirstElement();
if (firstElement instanceof ILaunchConfigurationType) {
return (ILaunchConfigurationType) firstElement;
}
if (firstElement instanceof ILaunchConfiguration) {
try {
return ((ILaunchConfiguration) firstElement).getType();
} catch (CoreException e) {
}
}
}
return null;
}
private class AntFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof ILaunchConfigurationType) {
ILaunchConfigurationType type = (ILaunchConfigurationType) element;
return isTypeSupported(type);
}
if (element instanceof ILaunchConfiguration) {
ILaunchConfiguration config = (ILaunchConfiguration) element;
boolean priv = false;
try {
priv = config.getAttribute(IDebugUIConstants.ATTR_PRIVATE, false);
} catch (CoreException e) {
// Ignored
}
if (priv) {
return false;
}
ILaunchConfigurationType type = null;
try {
type = config.getType();
} catch (CoreException e) {
return false;
}
return isTypeSupported(type);
}
return false;
}
private boolean isTypeSupported(ILaunchConfigurationType type) {
return QvtLaunchConfigurationDelegate.LAUNCH_CONFIGURATION_TYPE_ID.equals(type.getIdentifier());
}
}
private static class TypeNamesWithTaskTypes implements ILabelProvider {
TypeNamesWithTaskTypes(ILabelProvider dmp) {
myWrapped = dmp;
}
public Image getImage(Object element) {
return myWrapped.getImage(element);
}
public String getText(Object element) {
String suffix = ""; //$NON-NLS-1$
if (element instanceof ILaunchConfigurationType) {
ILaunchConfigurationType type = (ILaunchConfigurationType) element;
suffix = " (" + getTaskName(type) + ")"; //$NON-NLS-1$//$NON-NLS-2$
}
return myWrapped.getText(element) + suffix;
}
private String getTaskName(ILaunchConfigurationType type) {
return QVTO_ANTTASK_NAME;
}
public void addListener(ILabelProviderListener listener) {
myWrapped.addListener(listener);
}
public void dispose() {
myWrapped.dispose();
}
public boolean isLabelProperty(Object element, String property) {
return myWrapped.isLabelProperty(element, property);
}
public void removeListener(ILabelProviderListener listener) {
myWrapped.removeListener(listener);
}
private final ILabelProvider myWrapped;
}
private TreeViewer myViewer;
private Button myConfigButton;
private ILaunchConfiguration myConfig;
private ILaunchConfiguration myCreatedConfig;
private TaskModel myTaskModel;
private static final String QVTO_ANTTASK_NAME = "qvto:transformation"; //$NON-NLS-1$
}