package org.radrails.server.internal.ui.launching; import java.util.ArrayList; import java.util.Collection; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.radrails.rails.internal.core.RailsPlugin; import org.radrails.server.core.Server; import org.radrails.server.core.ServerManager; import org.radrails.server.core.launching.IRailsAppLaunchConfigurationConstants; import org.radrails.server.internal.ui.ServerUILog; public class MainSettingsTab extends AbstractLaunchConfigurationTab { private Combo fServerCombo; private Combo fProjectCombo; private Listener fDirtyListener; private Text fBrowserText; private Text fActionText; private Button fNoBrowserRadio; private Button fInternalBrowserRadio; private Button fExternalBrowserRadio; private Button fBrowserTextBrowse; public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); setControl(composite); createSelectProjectArea(composite); createSelectServerArea(composite); createStartActionArea(composite); createBrowserArea(composite); fBrowserTextBrowse.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); fileDialog.setFileName(fBrowserText.getText()); String text = fileDialog.open(); if (text != null) { fBrowserText.setText(text); } } }); fProjectCombo.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { loadServersCombo(); } }); fNoBrowserRadio.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { enableExternalBrowserWidgets(false); enableActionWidgets(false); } }); fExternalBrowserRadio.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { enableExternalBrowserWidgets(true); enableActionWidgets(true); } }); fInternalBrowserRadio.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { enableExternalBrowserWidgets(false); enableActionWidgets(true); } }); fDirtyListener = new Listener(){ public void handleEvent(Event event) { setDirty(true); updateLaunchConfigurationDialog(); } }; hookListeners(true); } private void createSelectProjectArea(Composite parent) { Group projectGroup = new Group(parent, SWT.NONE); projectGroup.setText("Rails Application"); GridData gd = new GridData(SWT.FILL, 20, true, false); projectGroup.setLayoutData(gd); FormLayout form = new FormLayout(); projectGroup.setLayout(form); FormData data; form.marginTop = 10; form.marginBottom = 10; form.marginLeft = 10; form.marginRight = 10; int column1Offset = 0; int column2Offset = 120; Label appLabel = new Label(projectGroup, SWT.NONE); appLabel.setText("Application root:"); data = new FormData(); data.left = new FormAttachment(0, column1Offset); appLabel.setLayoutData(data); fProjectCombo = new Combo(projectGroup, SWT.DROP_DOWN); data = new FormData(); data.top = new FormAttachment(appLabel, 0, SWT.TOP); data.left = new FormAttachment(0, column2Offset); data.width = 200; fProjectCombo.setLayoutData(data); fProjectCombo.setItems(getRailsProjectNames()); } private static String[] getRailsProjectNames() { Set<IProject> projects = RailsPlugin.getRailsProjects(); Collection<String> ret = new ArrayList<String>(); for (IProject project : projects) { if (project.isAccessible()) ret.add(project.getName()); } return (String[]) ret.toArray(new String[ret.size()]); } private void createSelectServerArea(Composite parent) { Group serverGroup = new Group(parent, SWT.NONE); serverGroup.setText("Web Server"); GridData gd = new GridData(SWT.FILL, 20, true, false); serverGroup.setLayoutData(gd); FormLayout form = new FormLayout(); serverGroup.setLayout(form); FormData data; form.marginTop = 10; form.marginBottom = 10; form.marginLeft = 10; form.marginRight = 10; int column1Offset = 0; int column2Offset = 120; Label serverLabel = new Label(serverGroup, SWT.NONE); serverLabel.setText("Server:"); data = new FormData(); data.left = new FormAttachment(0, column1Offset); serverLabel.setLayoutData(data); fServerCombo = new Combo(serverGroup, SWT.DROP_DOWN); data = new FormData(); data.top = new FormAttachment(serverLabel, 0, SWT.TOP); data.left = new FormAttachment(0, column2Offset); data.width = 200; fServerCombo.setLayoutData(data); } private void createStartActionArea(Composite parent) { Group actionGroup = new Group(parent, SWT.NONE); actionGroup.setText("Start Action"); GridData gd = new GridData(SWT.FILL, 20, true, false); actionGroup.setLayoutData(gd); FormLayout form = new FormLayout(); actionGroup.setLayout(form); FormData data; form.marginTop = 10; form.marginBottom = 10; form.marginLeft = 10; form.marginRight = 10; int column1Offset = 0; int column2Offset = 120; Label actionLabel = new Label(actionGroup, SWT.NONE); actionLabel.setText("Action URL:"); data = new FormData(); data.left = new FormAttachment(0, column1Offset); actionLabel.setLayoutData(data); fActionText = new Text(actionGroup, SWT.LEFT | SWT.BORDER); data = new FormData(); data.top = new FormAttachment(actionLabel, 0, SWT.TOP); data.left = new FormAttachment(0, column2Offset); data.width = 200; fActionText.setLayoutData(data); } private void createBrowserArea(Composite parent) { Group browserGroup = new Group(parent, SWT.NONE); browserGroup.setText("Web Browser"); GridData gd = new GridData(SWT.FILL, 20, true, false); browserGroup.setLayoutData(gd); FormLayout form = new FormLayout(); browserGroup.setLayout(form); FormData data; form.marginTop = 10; form.marginBottom = 10; form.marginLeft = 10; form.marginRight = 10; int column1Offset = 0; fNoBrowserRadio = new Button(browserGroup, SWT.RADIO); fNoBrowserRadio.setText("Do not launch browser"); data = new FormData(); data.left = new FormAttachment(0, column1Offset); fNoBrowserRadio.setLayoutData(data); fInternalBrowserRadio = new Button(browserGroup, SWT.RADIO); fInternalBrowserRadio.setText("Use internal browser"); data = new FormData(); data.top = new FormAttachment(fNoBrowserRadio, 10, SWT.BOTTOM); data.left = new FormAttachment(0, column1Offset); fInternalBrowserRadio.setLayoutData(data); fExternalBrowserRadio = new Button(browserGroup, SWT.RADIO); fExternalBrowserRadio.setText("Use external browser"); data = new FormData(); data.top = new FormAttachment(fInternalBrowserRadio, 10, SWT.BOTTOM); data.left = new FormAttachment(0, column1Offset); fExternalBrowserRadio.setLayoutData(data); fBrowserText = new Text(browserGroup, SWT.LEFT | SWT.BORDER); data = new FormData(); data.left = new FormAttachment(fExternalBrowserRadio, 10, SWT.BOTTOM); data.top = new FormAttachment(fInternalBrowserRadio, 5, SWT.BOTTOM); data.width = 250; fBrowserText.setLayoutData(data); fBrowserTextBrowse = new Button(browserGroup, SWT.PUSH); fBrowserTextBrowse.setText("Browse..."); data = new FormData(); data.top = new FormAttachment(fInternalBrowserRadio, 5, SWT.BOTTOM); data.left = new FormAttachment(fBrowserText, 8, SWT.RIGHT); fBrowserTextBrowse.setLayoutData(data); } private void enableExternalBrowserWidgets(boolean enabled) { fBrowserText.setEnabled(enabled); fBrowserTextBrowse.setEnabled(enabled); } private void enableActionWidgets(boolean enabled) { fActionText.setEnabled(enabled); } private void hookListeners(boolean hook) { if ( hook ) { fProjectCombo.addListener(SWT.Modify, fDirtyListener); fServerCombo.addListener(SWT.Modify, fDirtyListener); fNoBrowserRadio.addListener(SWT.Selection, fDirtyListener); fInternalBrowserRadio.addListener(SWT.Selection, fDirtyListener); fExternalBrowserRadio.addListener(SWT.Selection, fDirtyListener); fBrowserText.addListener(SWT.Modify, fDirtyListener); fActionText.addListener(SWT.Modify, fDirtyListener); } else { fProjectCombo.removeListener(SWT.Modify, fDirtyListener); fServerCombo.removeListener(SWT.Modify, fDirtyListener); fNoBrowserRadio.removeListener(SWT.Selection, fDirtyListener); fInternalBrowserRadio.removeListener(SWT.Selection, fDirtyListener); fExternalBrowserRadio.removeListener(SWT.Selection, fDirtyListener); fBrowserText.removeListener(SWT.Modify, fDirtyListener); fActionText.removeListener(SWT.Modify, fDirtyListener); } } private void loadServersCombo() { int index = fProjectCombo.getSelectionIndex(); if (index == -1) return; String projectName = fProjectCombo.getItem(index); String[] serverNames = getServerNamesForProject(projectName); fServerCombo.setItems(serverNames); if(serverNames.length > 0) { fServerCombo.setText(serverNames[0]); } } private String[] getServerNamesForProject(String name) { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name); Collection<Server> servers = ServerManager.getInstance().getServersForProject(project); Collection<String> ret = new ArrayList<String>(); for (Server server : servers) { ret.add(server.getName()); } return (String[]) ret.toArray(new String[ret.size()]); } public String getName() { return "Main"; } public void initializeFrom(ILaunchConfiguration configuration) { hookListeners(false); // initialize radios fNoBrowserRadio.setSelection(false); fInternalBrowserRadio.setSelection(false); fExternalBrowserRadio.setSelection(false); // initialize text fields fActionText.setText(""); fBrowserText.setText(""); try { fProjectCombo.select(fProjectCombo.indexOf(configuration.getAttribute(IRailsAppLaunchConfigurationConstants.PROJECT_NAME, ""))); loadServersCombo(); fServerCombo.select(fServerCombo.indexOf(configuration.getAttribute(IRailsAppLaunchConfigurationConstants.SERVER_NAME, ""))); if(configuration.getAttribute(IRailsAppLaunchConfigurationConstants.LAUNCH_BROWSER, false)) { fActionText.setText(configuration.getAttribute(IRailsAppLaunchConfigurationConstants.ACTION_PATH, "")); if(configuration.getAttribute(IRailsAppLaunchConfigurationConstants.USE_INTERNAL_BROWSER, false)) { fInternalBrowserRadio.setSelection(true); enableExternalBrowserWidgets(false); enableActionWidgets(true); } else if(configuration.getAttribute(IRailsAppLaunchConfigurationConstants.USE_EXTERNAL_BROWSER, false)) { fExternalBrowserRadio.setSelection(true); fBrowserText.setText(configuration.getAttribute(IRailsAppLaunchConfigurationConstants.BROWSER_EXE, "")); enableExternalBrowserWidgets(true); enableActionWidgets(true); } } else { fNoBrowserRadio.setSelection(true); enableExternalBrowserWidgets(false); enableActionWidgets(false); } } catch (CoreException e) { ServerUILog.logError("error accessing default attributes", e); } finally { hookListeners(true); } } public void performApply(ILaunchConfigurationWorkingCopy configuration) { if(fProjectCombo.getSelectionIndex() >= 0) { configuration.setAttribute(IRailsAppLaunchConfigurationConstants.PROJECT_NAME, fProjectCombo.getItem(fProjectCombo.getSelectionIndex())); } if(fServerCombo.getSelectionIndex() >=0) { configuration.setAttribute(IRailsAppLaunchConfigurationConstants.SERVER_NAME, fServerCombo.getItem(fServerCombo.getSelectionIndex())); } if(fNoBrowserRadio.getSelection()) { configuration.setAttribute(IRailsAppLaunchConfigurationConstants.LAUNCH_BROWSER, false); } else { configuration.setAttribute(IRailsAppLaunchConfigurationConstants.LAUNCH_BROWSER, true); configuration.setAttribute(IRailsAppLaunchConfigurationConstants.ACTION_PATH, fActionText.getText()); if(fInternalBrowserRadio.getSelection()) { configuration.setAttribute(IRailsAppLaunchConfigurationConstants.USE_INTERNAL_BROWSER, true); configuration.setAttribute(IRailsAppLaunchConfigurationConstants.USE_EXTERNAL_BROWSER, false); } else if(fExternalBrowserRadio.getSelection()) { configuration.setAttribute(IRailsAppLaunchConfigurationConstants.USE_INTERNAL_BROWSER, false); configuration.setAttribute(IRailsAppLaunchConfigurationConstants.USE_EXTERNAL_BROWSER, true); configuration.setAttribute(IRailsAppLaunchConfigurationConstants.BROWSER_EXE, fBrowserText.getText()); } } } public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { RailsAppLaunchHelper.setDefaults(configuration); } }