/******************************************************************************* * Copyright (c) 2005, 2012 eBay Inc. * 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 * *******************************************************************************/ package org.eclipse.vjet.eclipse.internal.debug.ui; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.internal.core.StepFilterManager; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.dltk.mod.debug.core.model.IScriptDebugTarget; import org.eclipse.dltk.mod.debug.ui.IDLTKDebugUIPreferenceConstants; import org.eclipse.dltk.mod.internal.debug.ui.ScriptDebugOptionsManager; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.vjet.eclipse.debug.ui.VjetDebugUIPlugin; /** * * * Ouyang * */ public class VjetDebugOptionsManager implements IPropertyChangeListener, IDebugEventSetListener, org.eclipse.core.runtime.Preferences.IPropertyChangeListener { private static VjetDebugOptionsManager instance; private String[] m_activeStepFilters; public static VjetDebugOptionsManager getDefault() { if (instance == null) { instance = new VjetDebugOptionsManager(); } return instance; } private VjetDebugOptionsManager() { } public void propertyChange(PropertyChangeEvent event) { String property = event.getProperty(); if (isFilterListProperty(property)) { refreshActiveStepFilters(); notifyTargetsOfFilters(); } } private boolean isFilterListProperty(String property) { return IDLTKDebugUIPreferenceConstants.PREF_ACTIVE_FILTERS_LIST .equals(property) || IDLTKDebugUIPreferenceConstants.PREF_INACTIVE_FILTERS_LIST .equals(property); } /** * Notifies all targets of current filter specifications. */ protected void notifyTargetsOfFilters() { IDebugTarget[] targets = getAllDebugTargets(); for (int i = 0; i < targets.length; i++) { if (targets[i] instanceof IScriptDebugTarget) { IScriptDebugTarget target = (IScriptDebugTarget) targets[i]; notifyTargetOfFilters(target); } } } private IDebugTarget[] getAllDebugTargets() { return DebugPlugin.getDefault().getLaunchManager().getDebugTargets(); } private void notifyTargetOfFilters(IScriptDebugTarget target) { target.setUseStepFilters(DebugUITools.isUseStepFilters()); target.setFilters(getActiveStepFilters()); } /** * Returns the current list of active step filters. * * @return current list of active step filters */ private String[] getActiveStepFilters() { if (m_activeStepFilters == null) { refreshActiveStepFilters(); registerListener(); } return m_activeStepFilters; } private void registerListener() { getPreferenceStore().addPropertyChangeListener(this); DebugPlugin.getDefault().getPluginPreferences() .addPropertyChangeListener(this); } private void refreshActiveStepFilters() { String[] storedActiveStepFilters = ScriptDebugOptionsManager .parseList(getPreferenceStore() .getString( IDLTKDebugUIPreferenceConstants.PREF_ACTIVE_FILTERS_LIST)); storedActiveStepFilters = convert2RegExp(storedActiveStepFilters); m_activeStepFilters = storedActiveStepFilters; } public static String[] convert2RegExp(String[] filters) { for (int i = 0; i < filters.length; i++) { String filter = filters[i]; filter = filter.replace('\\', '/'); filter = filter.replace(".", "\\."); filters[i] = filter.replace("*", ".*"); } return filters; } private IPreferenceStore getPreferenceStore() { return VjetDebugUIPlugin.getDefault().getPreferenceStore(); } public void start() { DebugPlugin.getDefault().addDebugEventListener(this); } public void stop() { DebugPlugin.getDefault().removeDebugEventListener(this); } @Override public void handleDebugEvents(DebugEvent[] events) { for (DebugEvent event : events) { Object source = event.getSource(); switch (event.getKind()) { case DebugEvent.CREATE: if (source instanceof IScriptDebugTarget) { notifyTargetOfFilters((IScriptDebugTarget) source); } break; default: break; } } } @Override public void propertyChange( org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) { String property = event.getProperty(); if (StepFilterManager.PREF_USE_STEP_FILTERS.equals(property)) { IDebugTarget[] debugTargets = getAllDebugTargets(); for (IDebugTarget target : debugTargets) { if (target instanceof IScriptDebugTarget) { ((IScriptDebugTarget) target) .setUseStepFilters(DebugUITools.isUseStepFilters()); } } } } }