/******************************************************************************* * Copyright (c) 2011-2012 Sierra Wireless 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: * Sierra Wireless - initial API and implementation *******************************************************************************/ package org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.attach; import java.io.File; import java.io.IOException; import java.net.URL; import org.apache.commons.io.FileUtils; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.dltk.debug.core.DLTKDebugPlugin; import org.eclipse.dltk.debug.ui.launchConfigurations.ScriptLaunchConfigurationTab; import org.eclipse.dltk.debug.ui.messages.DLTKLaunchConfigurationsMessages; import org.eclipse.dltk.internal.launching.LaunchConfigurationUtils; import org.eclipse.dltk.launching.ScriptLaunchConfigurationConstants; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.koneki.ldt.core.internal.LuaLanguageToolkit; import org.eclipse.koneki.ldt.debug.core.internal.LuaDebugConstants; import org.eclipse.koneki.ldt.debug.ui.internal.Activator; import org.eclipse.koneki.ldt.debug.ui.internal.DocumentationLinksConstants; import org.eclipse.koneki.ldt.debug.ui.internal.Messages; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; public class LuaAttachMainTab extends ScriptLaunchConfigurationTab { private static final String DEFAULT_IDEKEY = "luaidekey"; //$NON-NLS-1$ private static final String DEFAULT_REPLACE_PATH = ""; //$NON-NLS-1$ private static final String DEFAULT_MAPPING_TYPE = LuaDebugConstants.LOCAL_MAPPING_TYPE; private Text txtIdeKey; private Text txtTimeout; private Button btnLocalResolution; private Button btnModuleResolution; private Button btnReplacePathResolution; private Label lblReplacePath; private Text txtReplacePath; private SelectionListener sourceMappingSelectionListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } @Override public void widgetDefaultSelected(SelectionEvent e) { updateSouceMappingUI(); scheduleUpdateJob(); } }; private ModifyListener textModifyListener = new ModifyListener() { public void modifyText(org.eclipse.swt.events.ModifyEvent e) { scheduleUpdateJob(); }; }; public LuaAttachMainTab(String mode) { super(mode); } /* * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ public String getName() { return DLTKLaunchConfigurationsMessages.remoteTab_title; } /* * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage() */ @Override public Image getImage() { return Activator.getDefault().getImageRegistry().get(org.eclipse.koneki.ldt.debug.ui.internal.ImageConstants.LUA_ATTACH_MAINTAB); } private int getDefaultRemoteTimeout() { return DLTKDebugPlugin.getConnectionTimeout() * 3; } /* * @see org.eclipse.dltk.debug.ui.launchConfigurations.ScriptLaunchConfigurationTab #doInitializeForm(org.eclipse.debug.core.ILaunchConfiguration) */ protected void doInitializeForm(ILaunchConfiguration config) { txtIdeKey.setText(LaunchConfigurationUtils.getString(config, ScriptLaunchConfigurationConstants.ATTR_DLTK_DBGP_SESSION_ID, DEFAULT_IDEKEY)); txtTimeout.setText(Integer.toString(LaunchConfigurationUtils.getConnectionTimeout(config, getDefaultRemoteTimeout()) / 1000)); String mappingType = LaunchConfigurationUtils.getString(config, LuaDebugConstants.ATTR_LUA_SOURCE_MAPPING_TYPE, DEFAULT_MAPPING_TYPE); selectSourceMapping(mappingType); txtReplacePath.setText(LaunchConfigurationUtils.getString(config, ScriptLaunchConfigurationConstants.ATTR_DLTK_DBGP_REMOTE_WORKING_DIR, DEFAULT_REPLACE_PATH)); } /** * select the source mapping graphicaly */ private void selectSourceMapping(String mappingType) { if (mappingType.equals(LuaDebugConstants.MODULE_MAPPING_TYPE)) { btnModuleResolution.setSelection(true); } else if (mappingType.equals(LuaDebugConstants.REPLACE_PATH_MAPPING_TYPE)) { btnReplacePathResolution.setSelection(true); } else { // LOCAL MAPPING TYPE AS DEFAULT btnLocalResolution.setSelection(true); } updateSouceMappingUI(); } private void updateSouceMappingUI() { boolean selection = btnReplacePathResolution.getSelection(); txtReplacePath.setEnabled(selection); lblReplacePath.setEnabled(selection); } /* * @see org.eclipse.dltk.debug.ui.launchConfigurations.ScriptLaunchConfigurationTab * #doPerformApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ protected void doPerformApply(ILaunchConfigurationWorkingCopy config) { // set idekey config.setAttribute(ScriptLaunchConfigurationConstants.ATTR_DLTK_DBGP_SESSION_ID, txtIdeKey.getText().trim()); // set time out int timeout; try { timeout = Integer.parseInt(txtTimeout.getText().trim()); } catch (NumberFormatException e) { timeout = getDefaultRemoteTimeout() / 1000; } config.setAttribute(ScriptLaunchConfigurationConstants.ATTR_DLTK_DBGP_WAITING_TIMEOUT, timeout * 1000); // set source mapping type String sourceMapping = getSelectedSourceMapping(); config.setAttribute(LuaDebugConstants.ATTR_LUA_SOURCE_MAPPING_TYPE, sourceMapping); // set replace path config.setAttribute(ScriptLaunchConfigurationConstants.ATTR_DLTK_DBGP_REMOTE_WORKING_DIR, txtReplacePath.getText().trim()); } /** * get the selecte source mapping */ private String getSelectedSourceMapping() { if (btnModuleResolution.getSelection()) { return LuaDebugConstants.MODULE_MAPPING_TYPE; } else if (btnReplacePathResolution.getSelection()) { return LuaDebugConstants.REPLACE_PATH_MAPPING_TYPE; } else { return LuaDebugConstants.LOCAL_MAPPING_TYPE; } } protected boolean validate() { return super.validate() && validateIdeKey(); } /** * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#canSave() */ @Override public boolean canSave() { return validate(); } protected boolean validateIdeKey() { String key = txtIdeKey.getText().trim(); if (key.length() == 0) { setErrorMessage(DLTKLaunchConfigurationsMessages.remoteError_ideKeyEmpty); return false; } return true; } /* * @see ILaunchConfigurationTab#createControl(Composite) */ public void createControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); setControl(comp); GridLayout topLayout = new GridLayout(); topLayout.verticalSpacing = 0; comp.setLayout(topLayout); createClientInfo(comp); createProjectEditor(comp); createVerticalSpacer(comp, 1); doCreateControl(comp); createVerticalSpacer(comp, 1); createDebugOptionsGroup(comp); createCustomSections(comp); Dialog.applyDialogFont(comp); } protected void createClientInfo(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); GridLayoutFactory.swtDefaults().applyTo(comp); GridDataFactory.fillDefaults().grab(true, false).applyTo(comp); Link lnkDocumentation = new Link(comp, SWT.NONE); GridDataFactory.fillDefaults().grab(true, false).applyTo(lnkDocumentation); lnkDocumentation.setText(NLS.bind( org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.attach.Messages.LuaAttachMainTab_client_info_description, LuaDebugConstants.DEBUGGER_FILE_NAME)); lnkDocumentation.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (LuaDebugConstants.DEBUGGER_FILE_NAME.equals(event.text)) { // get debugger file // prompt a directory selection dialog DirectoryDialog directoryDialog = new DirectoryDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell()); String selectedDirPath = directoryDialog.open(); if (selectedDirPath != null) { // if directory is selected : File destDir = new File(selectedDirPath); // get the debugger file try { URL debuggerEntry = org.eclipse.koneki.ldt.debug.core.internal.Activator.getDefault().getBundle() .getEntry(LuaDebugConstants.DEBUGGER_PATH); File debuggerFolder = new File(FileLocator.toFileURL(debuggerEntry).getFile()); File debuggerFile = new File(debuggerFolder, LuaDebugConstants.DEBUGGER_FILE_NAME); // copy debugger file in selected directory FileUtils.copyFileToDirectory(debuggerFile, destDir, true); if (MessageDialog.openQuestion(PlatformUI.getWorkbench().getDisplay().getActiveShell(), org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.attach.Messages.LuaAttachMainTab_copy_done_title, NLS.bind( org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.attach.Messages.LuaAttachMainTab_copy_done_question, LuaDebugConstants.DEBUGGER_FILE_NAME))) { Program.launch(destDir.toString()); } } catch (IOException e) { ErrorDialog.openError( PlatformUI.getWorkbench().getDisplay().getActiveShell(), org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.attach.Messages.LuaAttachMainTab_copy_failed_title, null, new Status(IStatus.WARNING, Activator.PLUGIN_ID, NLS.bind(org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.attach.Messages.LuaAttachMainTab_copy_failed_description, LuaDebugConstants.DEBUGGER_FILE_NAME), e)); } } } else // open documentation PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(DocumentationLinksConstants.ATTACH_DEBUG); } }); } /* * @see org.eclipse.dltk.debug.ui.launchConfigurations.ScriptLaunchConfigurationTab #doCreateControl(org.eclipse.swt.widgets.Composite) */ protected void doCreateControl(Composite composite) { // ======= Connection GROUP ========== Group grpConnectionProperties = new Group(composite, SWT.NONE); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(grpConnectionProperties); grpConnectionProperties.setText(Messages.LuaAttachMainTab_connection_properties_group); GridDataFactory.fillDefaults().grab(true, false).applyTo(grpConnectionProperties); Label lblIdekey = new Label(grpConnectionProperties, SWT.NONE); GridDataFactory.swtDefaults().applyTo(lblIdekey); lblIdekey.setText(Messages.LuaAttachMainTab_idekey_label); txtIdeKey = new Text(grpConnectionProperties, SWT.BORDER); GridDataFactory.fillDefaults().grab(true, false).applyTo(txtIdeKey); txtIdeKey.addModifyListener(textModifyListener); Label lblTimeout = new Label(grpConnectionProperties, SWT.NONE); lblTimeout.setText(Messages.LuaAttachMainTab_timeout_label); GridDataFactory.swtDefaults().applyTo(lblTimeout); txtTimeout = new Text(grpConnectionProperties, SWT.BORDER); GridDataFactory.fillDefaults().grab(true, false).applyTo(txtTimeout); txtTimeout.addModifyListener(textModifyListener); // ======= SOURCE MAPPING GROUP ========== final Group grpSourceMapping = new Group(composite, SWT.NONE); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(grpSourceMapping); GridDataFactory.fillDefaults().grab(true, false).applyTo(grpSourceMapping); grpSourceMapping.setText(Messages.LuaAttachMainTab_sourcemapping_group); int hident = 40; GridDataFactory generalInfoGridDataFactory = GridDataFactory.swtDefaults().grab(true, false).span(2, 1); GridDataFactory radiobuttonGridDataFactory = generalInfoGridDataFactory.copy().indent(10, 0); GridDataFactory infoGridDataFactory = GridDataFactory.fillDefaults().grab(true, false).span(2, 1).indent(hident, 0); // get information font Font italicfont = getInformationFont(); Label lblsourcemappingintro = new Label(grpSourceMapping, SWT.NONE); generalInfoGridDataFactory.applyTo(lblsourcemappingintro); lblsourcemappingintro.setText(Messages.LuaAttachMainTab_documentation_intro); // Local Resolution btnLocalResolution = new Button(grpSourceMapping, SWT.RADIO); radiobuttonGridDataFactory.applyTo(btnLocalResolution); btnLocalResolution.setText(Messages.LuaAttachMainTab_localresolution_radiobutton); btnLocalResolution.addSelectionListener(sourceMappingSelectionListener); Text txtLocalResolution = new Text(grpSourceMapping, SWT.WRAP); infoGridDataFactory.applyTo(txtLocalResolution); txtLocalResolution.setText(Messages.LuaAttachMainTab_localresolution_textinfo); txtLocalResolution.setFont(italicfont); txtLocalResolution.setBackground(lblsourcemappingintro.getBackground()); txtLocalResolution.setEnabled(false); btnModuleResolution = new Button(grpSourceMapping, SWT.RADIO); radiobuttonGridDataFactory.applyTo(btnModuleResolution); btnModuleResolution.setText(Messages.LuaAttachMainTab_moduleresolution_radiobutton); btnModuleResolution.addSelectionListener(sourceMappingSelectionListener); Text txtModuleResolution = new Text(grpSourceMapping, SWT.WRAP); infoGridDataFactory.applyTo(txtModuleResolution); txtModuleResolution.setText(Messages.LuaAttachMainTab_moduleresolution_textinfo); txtModuleResolution.setFont(italicfont); txtModuleResolution.setBackground(lblsourcemappingintro.getBackground()); txtModuleResolution.setEnabled(false); // Replace path Resolution btnReplacePathResolution = new Button(grpSourceMapping, SWT.RADIO); btnReplacePathResolution.setText(Messages.LuaAttachMainTab_replacepathresolution_radiobutton); radiobuttonGridDataFactory.applyTo(btnReplacePathResolution); btnReplacePathResolution.addSelectionListener(sourceMappingSelectionListener); Text txtReplacePathResolution = new Text(grpSourceMapping, SWT.WRAP); infoGridDataFactory.applyTo(txtReplacePathResolution); txtReplacePathResolution.setText(Messages.LuaAttachMainTab_replacepathresolution_textinfo); txtReplacePathResolution.setFont(italicfont); txtReplacePathResolution.setBackground(lblsourcemappingintro.getBackground()); txtReplacePathResolution.setEnabled(false); lblReplacePath = new Label(grpSourceMapping, SWT.NONE); GridDataFactory.swtDefaults().indent(hident, 0).applyTo(lblReplacePath); lblReplacePath.setText(Messages.LuaAttachMainTab_path_label); txtReplacePath = new Text(grpSourceMapping, SWT.BORDER); GridDataFactory.fillDefaults().applyTo(txtReplacePath); txtReplacePath.addModifyListener(textModifyListener); // link documentation Link lnkDocumentation = new Link(grpSourceMapping, SWT.NONE); generalInfoGridDataFactory.applyTo(lnkDocumentation); lnkDocumentation.setText(Messages.LuaAttachMainTab_documentation_link); lnkDocumentation.addListener(SWT.Selection, new Listener() { public void handleEvent(final Event event) { PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(DocumentationLinksConstants.SOURCE_MAPPING); } }); } private Font getInformationFont() { Font textFont = JFaceResources.getTextFont(); if (textFont == null) return JFaceResources.getDefaultFont(); if (textFont.getFontData().length > 0) { Font italic = JFaceResources.getFontRegistry().getItalic(textFont.getFontData()[0].getName()); if (italic != null) return italic; } return textFont; } @Override protected String getNatureID() { return LuaLanguageToolkit.getDefault().getNatureId(); } }