debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/ui/RunModeMainTab.java
changeset 0 fb279309251b
child 203 e2002a613358
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/ui/RunModeMainTab.java	Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.cdt.internal.debug.launch.ui;
+
+import java.util.StringTokenizer;
+
+import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.cdt.launch.internal.ui.LaunchMessages;
+import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+import com.freescale.cdt.debug.cw.core.RemoteConnectionsTRKHelper;
+import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
+import com.nokia.carbide.remoteconnections.interfaces.IClientServiceSiteUI;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.carbide.remoteconnections.interfaces.IClientServiceSiteUI.IListener;
+import com.nokia.cdt.internal.debug.launch.LaunchPlugin;
+
+import cwdbg.PreferenceConstants;
+
+public class RunModeMainTab extends CarbideMainTab implements IResourceChangeListener {
+
+	public RunModeMainTab() {
+		super(DONT_CHECK_PROGRAM);
+	}
+
+	public RunModeMainTab(boolean wantsConnectionUI) {
+		super(DONT_CHECK_PROGRAM);
+		this.wantsConnectionUI = wantsConnectionUI;
+	}
+
+	protected Label remoteLabel;
+	protected Text remoteText;
+	protected IConnection connection;
+	protected boolean wantsConnectionUI = true;
+	protected IClientServiceSiteUI clientSiteUI;
+	
+	public void createControl(Composite parent) {
+		Composite comp = new Composite(parent, SWT.NONE);
+		setControl(comp);
+		
+		LaunchUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(getControl(), LaunchTabHelpIds.RUN_MODE_MAIN);
+		
+		GridLayout topLayout = new GridLayout();
+		comp.setLayout(topLayout);
+
+		createVerticalSpacer(comp, 1);
+		createProjectGroup(comp, 1);
+		createRemoteAppGroup(comp, 1);
+		
+		fProjLabel.setToolTipText(Messages.getString("RunModeMainTab.8")); //$NON-NLS-1$
+		fProjText.setToolTipText(Messages.getString("RunModeMainTab.8")); //$NON-NLS-1$
+
+		if (wantsConnectionUI)
+		{
+			createVerticalSpacer(comp, 1);
+			clientSiteUI = RemoteConnectionsActivator.getConnectionsManager().getClientSiteUI(LaunchPlugin.getTRKService());
+			clientSiteUI.createComposite(comp);
+			clientSiteUI.addListener(new IListener() {
+				public void connectionSelected() {
+					connection = clientSiteUI.getSelectedConnection();
+					updateLaunchConfigurationDialog();
+				}
+			});
+		}
+		
+		createVerticalSpacer(comp, 1);
+		if (wantsTerminalOption() /*&& ProcessFactory.supportesTerminal()*/) {
+			createTerminalOption(comp, 1);
+		}
+		LaunchUIPlugin.setDialogShell(parent.getShell());
+
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_BUILD);
+}
+
+	public void dispose() {
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+		super.dispose();
+	}
+
+	protected void createRemoteAppGroup(Composite parent, int colSpan) {
+		Composite projComp = new Composite(parent, SWT.NONE);
+		GridLayout projLayout = new GridLayout();
+		projLayout.numColumns = 2;
+		projLayout.marginHeight = 0;
+		projLayout.marginWidth = 0;
+		projComp.setLayout(projLayout);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = colSpan;
+		projComp.setLayoutData(gd);
+
+		remoteLabel = new Label(projComp, SWT.NONE);
+		remoteLabel.setText(Messages.getString("RunModeMainTab.2")); //$NON-NLS-1$
+		gd = new GridData();
+		gd.horizontalSpan = 2;
+		remoteLabel.setLayoutData(gd);
+		remoteLabel.setToolTipText(Messages.getString("RunModeMainTab.3")); //$NON-NLS-1$
+
+		remoteText = new Text(projComp, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		remoteText.setLayoutData(gd);
+		remoteText.setToolTipText(Messages.getString("RunModeMainTab.3")); //$NON-NLS-1$
+		remoteText.addModifyListener(new ModifyListener() {
+
+			public void modifyText(ModifyEvent evt) {
+				updateLaunchConfigurationDialog();
+			}
+		});
+
+	}
+
+	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
+	}
+
+	public void initializeFrom(ILaunchConfiguration config) {
+		super.initializeFrom(config);
+		try {
+			remoteText.setText(config.getAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch, "")); //$NON-NLS-1$
+		} catch (CoreException e) {
+			setErrorMessage(LaunchMessages.getFormattedString("Launch.common.Exception_occurred_reading_configuration_EXCEPTION", e.getStatus().getMessage())); //$NON-NLS-1$
+			LaunchUIPlugin.log(e);
+		}
+		try {
+	        if (!RemoteConnectionsTRKHelper.configUsesConnectionAttribute(config)) {
+	        	config = RemoteConnectionsTRKHelper.attemptUpdateLaunchConfiguration(config.getWorkingCopy());
+	        }
+			connection = RemoteConnectionsTRKHelper.getConnectionFromConfig(config);
+		} catch (CoreException e) {
+		}
+		if (clientSiteUI != null)
+		{
+			if (connection != null)
+				clientSiteUI.selectConnection(connection);
+			else {
+				connection = clientSiteUI.getSelectedConnection();
+			}
+		}
+	}
+
+	public void performApply(ILaunchConfigurationWorkingCopy config) {
+		super.performApply(config);
+		config.setAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch, remoteText.getText());
+		if (connection != null) {
+			config.setAttribute(RemoteConnectionsTRKHelper.CONNECTION_ATTRIBUTE, connection.getIdentifier());
+		}		
+		// Now check if the process to launch is the main target exe 
+		// for debugging. If not, try to set process to launch as the 
+		// main target if its in the list of target executables
+		if (isRemoteTextValid(remoteText.getText()) == null) {
+			try {
+				Path processToLaunch = new Path(remoteText.getText());				
+				Path mainExePath = new Path(config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, ""));
+				if (!processToLaunch.lastSegment().equalsIgnoreCase(mainExePath.lastSegment())) {
+					// passing null as the monitor should be ok as its not really being used.
+					String executablesToTarget = ExecutablesTab.getExecutablesToTarget(config, null);					
+					if (executablesToTarget != null && executablesToTarget.length() > 0) {
+						StringTokenizer tokenizer = new StringTokenizer(executablesToTarget, ","); //$NON-NLS-1$
+						while (tokenizer.hasMoreTokens()) {
+							String exe = tokenizer.nextToken();
+							String enabled = tokenizer.nextToken();
+			
+							Path exePath = new Path(exe);
+							if (enabled.compareTo("1") == 0 //$NON-NLS-1$
+									&& exePath.lastSegment().equalsIgnoreCase(processToLaunch.lastSegment())) {
+								config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, exePath.toOSString());
+								break;
+							}
+						}
+					}
+				}
+			} catch(CoreException ce) {			
+				ce.printStackTrace();			
+			}
+		}
+	}
+	
+	public static String isRemoteTextValid(String remoteText) {
+		String remoteProcess = remoteText.trim();
+		if (remoteProcess.length() < 1) {
+			return Messages.getString("RunModeMainTab.6"); //$NON-NLS-1$
+		} else {
+			char drive = remoteProcess.charAt(0);
+			char colon = remoteProcess.length() < 2 ? 0x0 : remoteProcess.charAt(1);
+			char root = remoteProcess.length() < 3 ? 0x0 : remoteProcess.charAt(2);
+			char lastChar = remoteProcess.charAt(remoteProcess.length() - 1);
+			if (!Character.isLetter(drive) || colon != ':' || root != '\\' || 
+					lastChar == '\\' || lastChar == '/' || lastChar == ':') { 
+				return Messages.getString("RunModeMainTab.7"); //$NON-NLS-1$
+			}
+		}
+		
+		return null;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	public boolean isValid(ILaunchConfiguration config) {
+		boolean result = super.isValid(config);
+		if (result){
+			String error = isRemoteTextValid(remoteText.getText());
+			if (error != null) {
+				setErrorMessage(error);
+				result = false;
+			}
+			else {
+				if (clientSiteUI != null)
+				{
+					connection = clientSiteUI.getSelectedConnection();
+					if (connection == null) {
+						setErrorMessage(Messages.getString("RunModeMainTab.NoConnectionError")); //$NON-NLS-1$
+						result = false;
+					}
+				}
+			}
+		}
+		
+		return result;
+	}
+
+	public void resourceChanged(IResourceChangeEvent event) {
+		if (event.getType() == IResourceChangeEvent.POST_BUILD) {
+
+			final RunModeMainTab tab = this;
+			Display.getDefault().asyncExec(new Runnable() {
+
+				public void run() {
+					tab.getLaunchConfigurationDialog().updateButtons();
+					tab.getLaunchConfigurationDialog().updateMessage();
+				}
+			});
+		}
+	}
+
+}