package intrace.ecl.ui.launching; import intrace.ecl.Activator; import intrace.ecl.Util; import intrace.ecl.ui.output.InTraceEditor; import java.io.IOException; import java.io.InputStream; import java.util.List; import net.miginfocom.swt.MigLayout; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.ILaunchConfigurationDialog; import org.eclipse.debug.ui.ILaunchConfigurationTab; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.intrace.client.gui.helper.ClientStrings; import org.intrace.client.gui.helper.InTraceUI; import org.intrace.client.gui.helper.InTraceUI.UIMode; import org.intrace.client.gui.helper.InTraceUI.UIModeData; import org.intrace.client.gui.helper.IncludeExcludeWindow; import org.intrace.client.gui.helper.IncludeExcludeWindow.PatternInputCallback; import org.intrace.client.gui.helper.TraceFilterThread; public class InTraceLaunchConfigTab implements ILaunchConfigurationTab { private Image icon16; private Display display; private Composite composite; private Button classesButton; private String classIncludePattern = ""; private String classExcludePattern = ""; private List<String> outputIncludePattern = TraceFilterThread.MATCH_ALL; private List<String> outputExcludePattern = TraceFilterThread.MATCH_NONE; private Button textFilter; public static final String CLASS_INCL_ATTR = "INTRACE_CLASS_INCL_ATTR"; public static final String CLASS_EXCL_ATTR = "INTRACE_CLASS_EXCL_ATTR"; public static final String OUTPUT_INCL_ATTR = "OUTPUT_CLASS_INCL_ATTR"; public static final String OUTPUT_EXCL_ATTR = "OUTPUT_CLASS_EXCL_ATTR"; private ILaunchConfigurationDialog dialog; private ILaunchConfigurationWorkingCopy wc; @Override public void createControl(Composite parent) { display = parent.getDisplay(); MigLayout tabLayout = new MigLayout("fill", "[]", "[][][grow]"); composite = new Composite(parent, SWT.NONE); composite.setLayout(tabLayout); classesButton = new Button(composite, SWT.PUSH); classesButton.setText("Classes To Trace..."); classesButton.setLayoutData("growx,wrap"); final UIModeData modeData = InTraceEditor.getUIModeData(); classesButton .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { IncludeExcludeWindow regexInput = new IncludeExcludeWindow( ClientStrings.CLASS_TITLE, ClientStrings.CLASS_HELP_TEXT, UIMode.ECLIPSE, modeData, new PatternInputCallback() { private List<String> localIncludePattern = null; private List<String> localExcludePattern = null; @Override public void setIncludePattern(List<String> newIncludePattern) { localIncludePattern = newIncludePattern; savePatterns(); } @Override public void setExcludePattern(List<String> newExcludePattern) { localExcludePattern = newExcludePattern; savePatterns(); } private void savePatterns() { if ((localIncludePattern != null) && (localExcludePattern != null)) { setRegex(InTraceUI.getStringFromList(localIncludePattern), InTraceUI.getStringFromList(localExcludePattern)); } } }, InTraceUI.getListFromString(classIncludePattern), InTraceUI.getListFromString(classExcludePattern), InTraceUI.ALLOW_CLASSES); InTraceUI.placeDialogInCenter(display.getBounds(), regexInput.sWindow); } }); textFilter = new Button(composite, SWT.PUSH); textFilter.setText("Trace Filters..."); textFilter.setLayoutData("growx"); final PatternInputCallback patternCallback = new PatternInputCallback() { private List<String> localIncludePattern = TraceFilterThread.MATCH_ALL; private List<String> localExcludePattern = TraceFilterThread.MATCH_NONE; @Override public void setIncludePattern(List<String> newIncludePattern) { localIncludePattern = newIncludePattern; savePatterns(); } @Override public void setExcludePattern(List<String> newExcludePattern) { localExcludePattern = newExcludePattern; savePatterns(); } private void savePatterns() { if ((localIncludePattern != null) && (localExcludePattern != null)) { if (localIncludePattern.equals(TraceFilterThread.MATCH_NONE) && localExcludePattern.equals(TraceFilterThread.MATCH_NONE)) { localIncludePattern = TraceFilterThread.MATCH_ALL; } applyPatterns(localIncludePattern, localExcludePattern); } } }; textFilter .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { IncludeExcludeWindow regexInput; regexInput = new IncludeExcludeWindow("Output Filter", ClientStrings.FILTER_HELP_TEXT, UIMode.ECLIPSE, modeData, patternCallback, outputIncludePattern, outputExcludePattern, InTraceUI.ALLOW_ALL); InTraceUI.placeDialogInCenter(display.getBounds(), regexInput.sWindow); } }); } private void setRegex(String classIncludePattern, String classExcludePattern) { this.classIncludePattern = classIncludePattern; this.classExcludePattern = classExcludePattern; wc.setAttribute(CLASS_INCL_ATTR, classIncludePattern); wc.setAttribute(CLASS_EXCL_ATTR, classExcludePattern); dialog.updateButtons(); } private void applyPatterns(List<String> outputIncludePattern, List<String> outputExcludePattern) { this.outputIncludePattern = outputIncludePattern; this.outputExcludePattern = outputExcludePattern; wc.setAttribute(OUTPUT_INCL_ATTR, outputIncludePattern); wc.setAttribute(OUTPUT_EXCL_ATTR, outputExcludePattern); dialog.updateButtons(); } @Override public Control getControl() { return composite; } @Override public void setLaunchConfigurationDialog(ILaunchConfigurationDialog dialog) { this.dialog = dialog; } @SuppressWarnings("unchecked") @Override public void initializeFrom(ILaunchConfiguration configuration) { try { classIncludePattern = configuration.getAttribute(CLASS_INCL_ATTR, ""); classExcludePattern = configuration.getAttribute(CLASS_EXCL_ATTR, ""); outputIncludePattern = configuration.getAttribute(OUTPUT_INCL_ATTR, TraceFilterThread.MATCH_ALL); outputExcludePattern = configuration.getAttribute(OUTPUT_EXCL_ATTR, TraceFilterThread.MATCH_NONE); } catch (CoreException e) { Activator.getDefault().getLog().log(Util.createErrorStatus("Error", e)); } } @Override public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { try { String mainClass = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, ""); configuration.setAttribute(CLASS_INCL_ATTR, mainClass); } catch (CoreException e) { Activator.getDefault().getLog().log(Util.createErrorStatus("Error", e)); } } @Override public void dispose() { if (icon16 != null) { icon16.dispose(); } } @Override public void performApply(ILaunchConfigurationWorkingCopy configuration) { // ?? } @Override public String getErrorMessage() { return null; } @Override public String getMessage() { return null; } @Override public boolean isValid(ILaunchConfiguration launchConfig) { return true; } @Override public boolean canSave() { return true; } @Override public void launched(ILaunch launch) { // Not called anymore } @Override public String getName() { return "InTrace"; } @Override public Image getImage() { ClassLoader loader = InTraceLaunchConfigTab.class.getClassLoader(); InputStream is16 = loader.getResourceAsStream( "org/intrace/icons/intrace16.gif"); icon16 = new Image(display, is16); try { is16.close(); } catch (IOException e) { // Ignore } return icon16; } @Override public void activated(ILaunchConfigurationWorkingCopy workingCopy) { this.wc = workingCopy; } @Override public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) { // Ignore } }