/******************************************************************************* * Copyright (c) 2012, 2014 Wind River Systems, Inc. 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.tcf.launch.ui.launchcontext; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.widgets.Composite; import org.eclipse.tcf.te.launch.core.bindings.LaunchConfigTypeBindingsManager; import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchContextLaunchAttributes; import org.eclipse.tcf.te.launch.core.persistence.launchcontext.LaunchContextsPersistenceDelegate; import org.eclipse.tcf.te.launch.core.selection.RemoteSelectionContext; import org.eclipse.tcf.te.launch.ui.interfaces.ILaunchConfigurationTabFormPart; import org.eclipse.tcf.te.launch.ui.tabs.launchcontext.AbstractContextSelectorTab; import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; import org.eclipse.tcf.te.tcf.ui.controls.ContextSelectorSectionControl; import org.eclipse.tcf.te.tcf.ui.sections.AbstractContextSelectorSection; import org.eclipse.tcf.te.ui.views.controls.AbstractContextSelectorControl; import org.eclipse.ui.forms.IManagedForm; /** * Launch context selection main launch tab implementation. */ public abstract class AbstractLaunchContextMainTab extends AbstractContextSelectorTab { /* default */ ILaunchConfiguration configuration = null; /** * Context selector control filter filtering remote contexts which are not * enabled for the launch configuration type. */ protected class MainTabContextSelectorViewerFilter extends ViewerFilter { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IPeerNode) { String typeId = null; if (configuration != null) { try { typeId = configuration.getType().getIdentifier(); } catch (CoreException e) { /* ignored on purpose */ } } String mode = getLaunchConfigurationDialog().getMode(); if (typeId != null && mode != null) { return LaunchConfigTypeBindingsManager.getInstance().isValidLaunchConfigType(typeId, mode, new RemoteSelectionContext((IPeerNode)element, true)); } } return true; } } /** * Launch configuration main tab context selector control implementation. */ protected class MainTabContextSelectorControl extends ContextSelectorSectionControl { /** * Constructor. * * @param section The parent context selector section. Must not be <code>null</code>. * @param parentPage The parent target connection page this control is embedded in. Might be * <code>null</code> if the control is not associated with a page. */ public MainTabContextSelectorControl(MainTabContextSelectorSection section, IDialogPage parentPage) { super(section, parentPage); } /* (non-Javadoc) * @see org.eclipse.tcf.te.launch.ui.tabs.launchcontext.AbstractContextSelectorControl#doCreateViewerFilters() */ @Override protected ViewerFilter[] doCreateViewerFilters() { List<ViewerFilter> filters = new ArrayList<ViewerFilter>(Arrays.asList(super.doCreateViewerFilters())); filters.add(new MainTabContextSelectorViewerFilter()); return filters.toArray(new ViewerFilter[filters.size()]); } } protected class MainTabContextSelectorSection extends AbstractContextSelectorSection implements ILaunchConfigurationTabFormPart { /** * Constructor. * @param form The managed form. * @param parent The parent composite. */ public MainTabContextSelectorSection(IManagedForm form, Composite parent) { super(form, parent); } /* (non-Javadoc) * @see org.eclipse.tcf.te.tcf.launch.ui.launchcontext.MainTabContextSelectorSection#doCreateContextSelector() */ @Override protected AbstractContextSelectorControl doCreateContextSelector() { AbstractContextSelectorControl control = new MainTabContextSelectorControl(this, null); return control; } /* (non-Javadoc) * @see org.eclipse.tcf.te.tcf.ui.sections.AbstractContextSelectorSection#getContextListDataKey() */ @Override protected String getContextListDataKey() { return ILaunchContextLaunchAttributes.ATTR_LAUNCH_CONTEXTS; } /* (non-Javadoc) * @see org.eclipse.tcf.te.launch.ui.interfaces.ILaunchConfigurationTabFormPart#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ @Override public void initializeFrom(ILaunchConfiguration configuration) { Assert.isNotNull(configuration); if (selector != null) { IModelNode[] contexts = LaunchContextsPersistenceDelegate.getLaunchContexts(configuration); if (contexts != null && contexts.length > 0) { // Loop the contexts and create a list of nodes List<IModelNode> nodes = new ArrayList<IModelNode>(); for (IModelNode node : contexts) { if (node != null && !nodes.contains(node)) { nodes.add(node); } } if (!nodes.isEmpty()) { selector.setCheckedModelContexts(nodes.toArray(new IModelNode[nodes.size()])); } } } } /* (non-Javadoc) * @see org.eclipse.tcf.te.launch.ui.interfaces.ILaunchConfigurationTabFormPart#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ @Override public void performApply(ILaunchConfigurationWorkingCopy configuration) { Assert.isNotNull(configuration); if (selector != null) { IModelNode[] nodes = selector.getCheckedModelContexts(); // Write the selected contexts to the launch configuration if (nodes != null && nodes.length > 0) { LaunchContextsPersistenceDelegate.setLaunchContexts(configuration, nodes); } else { LaunchContextsPersistenceDelegate.setLaunchContexts(configuration, null); } } else { LaunchContextsPersistenceDelegate.setLaunchContexts(configuration, null); } } /* (non-Javadoc) * @see org.eclipse.tcf.te.launch.ui.interfaces.ILaunchConfigurationTabFormPart#isValid(org.eclipse.debug.core.ILaunchConfiguration) */ @Override public boolean isValid(ILaunchConfiguration configuration) { return isValid(); } /* (non-Javadoc) * @see org.eclipse.tcf.te.tcf.ui.sections.AbstractContextSelectorSection#dataChanged() */ @Override public void dataChanged() { getManagedForm().dirtyStateChanged(); } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.sections.AbstractContextSelectorSection#doConfigureContextSelector(org.eclipse.tcf.te.ui.views.controls.AbstractContextSelectorControl) */ @Override protected void doConfigureContextSelector(AbstractContextSelectorControl contextSelector) { } } /* (non-Javadoc) * @see org.eclipse.tcf.te.launch.ui.tabs.AbstractFormsLaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ @Override public void initializeFrom(ILaunchConfiguration configuration) { super.initializeFrom(configuration); this.configuration = configuration; if (getContextSelectorSection() != null) { AbstractContextSelectorControl control = (AbstractContextSelectorControl)getContextSelectorSection().getAdapter(AbstractContextSelectorControl.class); if (control != null && control.getViewer() != null) { control.getViewer().refresh(); } } } /* (non-Javadoc) * @see org.eclipse.tcf.te.launch.ui.tabs.launchcontext.AbstractContextSelectorTab#doCreateContextSelectorSection(org.eclipse.ui.forms.IManagedForm, org.eclipse.swt.widgets.Composite) */ @Override protected MainTabContextSelectorSection doCreateContextSelectorSection(IManagedForm form, Composite panel) { return new MainTabContextSelectorSection(form, panel); } }