/******************************************************************************* * Copyright (c) 2009 the CHISEL group and contributors. * 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: * Del Myers - initial API and implementation *******************************************************************************/ package ca.uvic.chisel.javasketch.launching.ui; import static ca.uvic.chisel.javasketch.FilterSettings.EXCLUSION_FILTERS; import static ca.uvic.chisel.javasketch.FilterSettings.INCLUSION_FILTERS; import static ca.uvic.chisel.javasketch.FilterSettings.USE_PREVIOUS_SKETCH; import static ca.uvic.chisel.javasketch.FilterSettings.USE_PROJECT_CLASSES; import java.util.ArrayList; import java.util.Arrays; 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.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import ca.uvic.chisel.javasketch.IProgramSketch; import ca.uvic.chisel.javasketch.SketchPlugin; import ca.uvic.chisel.javasketch.persistence.ui.internal.FiltersComposite; import ca.uvic.chisel.javasketch.ui.IFilterContext; import ca.uvic.chisel.javasketch.ui.ISketchImageConstants; import ca.uvic.chisel.javasketch.utils.LaunchConfigurationUtilities; /** * @author Del Myers * */ public class FilterTab extends AbstractLaunchConfigurationTab implements IFilterContext{ // public static final String USE_PROJECT_CLASSES = "javasketch.filters.project"; // // public static final String INCLUSION_FILTERS = "javasketch.filters.include"; // // public static final String EXCLUSION_FILTERS = "javasketch.filters.exclude"; // public static final String PAUSE_ON_START = "javasketch.launch.pause"; public static final String APPLY_AT_RUNTIME = "javasketch.launch.apply-filters"; // // public static final String USE_PREVIOUS_SKETCH = "javasketch.filters.previous"; private FiltersComposite filterComposite; private Button pauseOnStart; private Button applyAtRuntime; /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { Composite page = new Composite(parent, SWT.NONE); page.setLayout(new GridLayout()); createTraceOptions(page); this.filterComposite = new FiltersComposite(page); filterComposite.setParentContext(this); filterComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); setControl(page); } private void createTraceOptions(Composite page) { pauseOnStart = new Button(page, SWT.CHECK); pauseOnStart.setText("Pause On Start"); pauseOnStart.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { setDirty(true); getLaunchConfigurationDialog().updateButtons(); } @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); pauseOnStart.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) {} @Override public void focusGained(FocusEvent e) { getShell().setDefaultButton(pauseOnStart); } }); pauseOnStart.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false)); applyAtRuntime = new Button(page, SWT.CHECK); applyAtRuntime.setText("Apply Filters at Runtime"); applyAtRuntime.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { setDirty(true); getLaunchConfigurationDialog().updateButtons(); } @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); applyAtRuntime.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) {} @Override public void focusGained(FocusEvent e) { getShell().setDefaultButton(applyAtRuntime); } }); applyAtRuntime.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false)); } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ @Override public String getName() { return "Java Trace"; } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ @SuppressWarnings("unchecked") @Override public void initializeFrom(ILaunchConfiguration configuration) { try { filterComposite.setLaunchType(configuration.getType().getIdentifier()); IJavaProject[] projects = LaunchConfigurationUtilities.getReferencedJavaProjects(configuration); filterComposite.setJavaContext(projects); List<String> filters = configuration.getAttribute(INCLUSION_FILTERS, new ArrayList<String>()); filterComposite.setInclusionFilters(filters.toArray(new String[filters.size()])); filters = configuration.getAttribute(EXCLUSION_FILTERS, new ArrayList<String>()); filterComposite.setExclusionFilters(filters.toArray(new String[filters.size()])); boolean projectsOnly = configuration.getAttribute(USE_PROJECT_CLASSES, true); String referenceId = configuration.getAttribute(USE_PREVIOUS_SKETCH, (String)null); IProgramSketch referenceSketch = SketchPlugin.getDefault().getSketch(referenceId); if (projectsOnly) { filterComposite.setFilterShortcut(FiltersComposite.SHORTCUT_PROJECT_CLASSES); } else if (referenceSketch != null) { filterComposite.setFilterShortcut(FiltersComposite.SHORTCUT_PREVIOUS_SKETCH); } else { filterComposite.setFilterShortcut(FiltersComposite.SHORTCUT_NONE); } pauseOnStart.setSelection(configuration.getAttribute(PAUSE_ON_START, true)); applyAtRuntime.setSelection(configuration.getAttribute(APPLY_AT_RUNTIME, true)); } catch (CoreException e) { SketchPlugin.getDefault().log(e); } } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ @Override public void performApply(ILaunchConfigurationWorkingCopy configuration) { String[] filters = filterComposite.getInclusionFilters(); configuration.setAttribute(INCLUSION_FILTERS, Arrays.asList(filters)); filters = filterComposite.getExclusionFilters(); configuration.setAttribute(EXCLUSION_FILTERS, Arrays.asList(filters)); configuration.setAttribute(USE_PROJECT_CLASSES, filterComposite.isUsingProjectClassesOnly()); configuration.setAttribute(PAUSE_ON_START, pauseOnStart.getSelection()); configuration.setAttribute(APPLY_AT_RUNTIME, applyAtRuntime.getSelection()); //setDirty(false); } protected Button getApplyAtRuntimeButton() { return applyAtRuntime; } protected Button getPauseOnStartButton() { return pauseOnStart; } protected FiltersComposite getFiltersComposite() { return filterComposite; } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ @Override public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { configuration.setAttribute(USE_PROJECT_CLASSES, true); configuration.setAttribute(INCLUSION_FILTERS, new ArrayList<String>()); configuration.setAttribute(EXCLUSION_FILTERS, new ArrayList<String>()); configuration.setAttribute(PAUSE_ON_START, true); configuration.setAttribute(APPLY_AT_RUNTIME, false); } /* (non-Javadoc) * @see ca.uvic.chisel.javasketch.persistence.ui.internal.IFilterContext#filterChanged(ca.uvic.chisel.javasketch.persistence.ui.internal.FiltersComposite) */ @Override public void filterChanged() { setDirty(true); getLaunchConfigurationDialog().updateButtons(); } /* (non-Javadoc) * @see ca.uvic.chisel.javasketch.persistence.ui.internal.IFilterContext#contextChanged(org.eclipse.jdt.core.IJavaProject[]) */ @Override public void contextChanged(IJavaProject[] newProjects) { filterComposite.setJavaContext(newProjects); } @Override public Image getImage() { return SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_TRACE); } }