package runjettyrun.tabs; import java.text.MessageFormat; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jdt.launching.IRuntimeClasspathEntry; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; 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.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import runjettyrun.Plugin; import runjettyrun.tabs.action.AddClassFolderAction; import runjettyrun.tabs.action.AddExternalFileAction; import runjettyrun.tabs.action.AddExternalFolderAction; import runjettyrun.tabs.action.AddFolderAction; import runjettyrun.tabs.action.RemoveAction; import runjettyrun.tabs.action.RestoreDefaultEntriesAction; import runjettyrun.tabs.action.RestoreDefaultSelectionAction; import runjettyrun.tabs.action.RuntimeClasspathAction; import runjettyrun.tabs.classpath.UserClassesClasspathModel; import runjettyrun.utils.RunJettyRunLaunchConfigurationUtil; public class ScanFolderTab extends AbstractClasspathTab { private Button fEnableScannerbox; private Button fEnableIgnoreClassWhenDebugging; private Text fScanText; private UpdateModfiyListener _updatedListener = new UpdateModfiyListener(); public ScanFolderTab() { super("sourceScan", "Source Monitor List"); } public String getCustomAttributeName() { return Plugin.ATTR_CUSTOM_SCAN_FOLDER; } public String getNonCheckedAttributeName() { return Plugin.ATTR_SCAN_FOLDER_NON_CHECKED; } public String getHeader() { return "A collection for resource watch list , will restart server if the resource in watch list changed.(Including all sub-folder and files.)" ; } public void createHeaderControl(Composite parent){ Font font = parent.getFont(); /* * --------------------------------------------------------------------- */ fEnableScannerbox = createCheckButton(parent, "Enable Scanner"); fEnableScannerbox.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { fScanText.setEnabled(fEnableScannerbox.getSelection()); updateLaunchConfigurationDialog(); } public void widgetDefaultSelected(SelectionEvent e) { } }); /* * --------------------------------------------------------------------- */ new Label(parent, SWT.LEFT).setText("Scan Interval"); /* * --------------------------------------------------------------------- */ fScanText = new Text(parent, SWT.SINGLE | SWT.BORDER); fScanText.addModifyListener(_updatedListener); fScanText.setLayoutData(createHFillGridData(1, -1)); fScanText.setFont(font); fScanText.setTextLimit(5); /* * --------------------------------------------------------------------- */ new Label(parent, SWT.LEFT).setText(" seconds"); /* * --------------------------------------------------------------------- */ fEnableIgnoreClassWhenDebugging = createCheckButton(parent, "Ignore .class file changes when run in Debug Mode."); fEnableIgnoreClassWhenDebugging.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { updateLaunchConfigurationDialog(); } public void widgetDefaultSelected(SelectionEvent e) { } }); { GridData data = new GridData(); data.horizontalSpan =4 ; data.horizontalAlignment = SWT.LEFT; fEnableIgnoreClassWhenDebugging.setLayoutData(data); } } public void performApply(ILaunchConfigurationWorkingCopy configuration) { super.performApply(configuration); configuration.setAttribute(Plugin.ATTR_SCANINTERVALSECONDS, fScanText.getText()); configuration.setAttribute(Plugin.ATTR_ENABLE_SCANNER, fEnableScannerbox.getSelection()); configuration.setAttribute(Plugin.ATTR_IGNORE_SCAN_CLASS_WHEN_DEBUG_MODE, fEnableIgnoreClassWhenDebugging.getSelection()); } public boolean isValid(ILaunchConfiguration launchConfig) { boolean valid = super.isValid(launchConfig); if(!valid ) { return false; } if (fEnableScannerbox.getSelection()) { String scan = fScanText.getText().trim(); if (scan.length() == 0) { setErrorMessage("Must specify at least one scan interval seconds"); return false; } if (isInvalidScan(scan)) return false; } return true; } public void initializeFrom(ILaunchConfiguration configuration) { super.initializeFrom(configuration); try{ fEnableIgnoreClassWhenDebugging.setSelection(configuration.getAttribute(Plugin.ATTR_IGNORE_SCAN_CLASS_WHEN_DEBUG_MODE, true)); fScanText.setText(configuration.getAttribute( Plugin.ATTR_SCANINTERVALSECONDS, "")); fEnableScannerbox.setSelection(configuration.getAttribute( Plugin.ATTR_ENABLE_SCANNER, true)); fScanText.setEnabled(fEnableScannerbox.getSelection()); } catch (CoreException e) { Plugin.logError(e); } } public UserClassesClasspathModel createClasspathModel( ILaunchConfiguration configuration) throws Exception { UserClassesClasspathModel theModel = new UserClassesClasspathModel("Project Scan Folders","Custom Scan Folder and Files"); List<IRuntimeClasspathEntry> entries = getClasspathProvider().getDefaultScanList(configuration); for (IRuntimeClasspathEntry entry:entries) { switch (entry.getClasspathProperty()) { case IRuntimeClasspathEntry.USER_CLASSES: theModel.addEntry(UserClassesClasspathModel.USER, entry); break; } } IRuntimeClasspathEntry[] customentries = getClasspathProvider().computeUnresolvedCustomClasspath( configuration, getCustomAttributeName()); for (int i = 0; i < customentries.length; i++) { theModel.addEntry(UserClassesClasspathModel.CUSTOM, customentries[i]); } return theModel; } public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { super.setDefaults(configuration); configuration.setAttribute(Plugin.ATTR_IGNORE_SCAN_CLASS_WHEN_DEBUG_MODE, true); } protected void createPathButtons(Composite pathButtonComp) { createButton(pathButtonComp, new RemoveAction(fClasspathViewer)); createButton(pathButtonComp, new AddFolderAction(fClasspathViewer)); createButton(pathButtonComp, new AddClassFolderAction(fClasspathViewer)); createButton(pathButtonComp, new AddExternalFileAction(fClasspathViewer,DIALOG_SETTINGS_PREFIX)); createButton(pathButtonComp, new AddExternalFolderAction(fClasspathViewer, DIALOG_SETTINGS_PREFIX)); RuntimeClasspathAction restoreSelectionAction = new RestoreDefaultSelectionAction( fClasspathViewer, this, this.getNonCheckedAttributeName()); createButton(pathButtonComp, restoreSelectionAction); restoreSelectionAction.setEnabled(true); RuntimeClasspathAction action = new RestoreDefaultEntriesAction(fClasspathViewer, this,this.getCustomAttributeName()); createButton(pathButtonComp, action); action.setEnabled(true); } /** * If it's modified , just update the configuration directly. * * @author TonyQ * */ private class UpdateModfiyListener implements ModifyListener { public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } } private GridData createHFillGridData() { GridData gd = new GridData(); gd.horizontalAlignment = SWT.FILL; gd.grabExcessHorizontalSpace = true; return gd; } private GridData createHFillGridData(int span, int position) { // gd.horizontalAlignment = SWT.FILL GridData gd = createHFillGridData(); if (position != -1) gd.horizontalAlignment = position; if (span != -1) gd.horizontalSpan = span; return gd; } private boolean isInvalidScan(String s) { boolean res = RunJettyRunLaunchConfigurationUtil.isInvalidPort(s); if (res) setErrorMessage(MessageFormat.format( "Not a valid scan number: {0}", s)); return res; } }