/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.debug.ui.internal.view;
import com.google.dart.tools.internal.corext.refactoring.util.ReflectionUtils;
import com.google.dart.tools.ui.DartToolsPlugin;
import com.google.dart.tools.ui.internal.util.SWTUtil;
import org.eclipse.debug.core.model.DebugElement;
import org.eclipse.debug.internal.ui.elements.adapters.DefaultBreakpointsViewInput;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
import org.eclipse.debug.internal.ui.views.variables.details.DetailPaneProxy;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
/**
* A debugger breakpoints view.
*/
@SuppressWarnings("restriction")
public class BreakpointsView extends
org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView {
public static final String VIEW_ID = "com.google.dart.tools.debug.breakpointsView";
private static final String ACTION_GOTO_MARKER = "GotoMarker";
private RemoveBreakpointAction removeBreakpointAction;
private RemoveAllBreakpointsAction removeAllBreakpointsAction;
private TreeModelViewer treeViewer;
private IPreferenceStore preferences;
private IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
doPropertyChange(event);
}
};
public BreakpointsView() {
}
@Override
public Viewer createViewer(Composite parent) {
Viewer viewer = super.createViewer(parent);
IActionBars actionBars = getViewSite().getActionBars();
actionBars.getMenuManager().removeAll();
return viewer;
}
@Override
public void dispose() {
if (removeBreakpointAction != null) {
removeBreakpointAction.dispose();
}
if (removeAllBreakpointsAction != null) {
removeAllBreakpointsAction.dispose();
}
if (propertyChangeListener != null) {
getPreferences().removePropertyChangeListener(propertyChangeListener);
propertyChangeListener = null;
}
super.dispose();
}
@Override
public void refreshDetailPaneContents() {
super.refreshDetailPaneContents();
SWTUtil.setColors(getDetails(), getPreferences());
}
@Override
protected void configureToolBar(IToolBarManager manager) {
manager.add(removeBreakpointAction);
removeAllBreakpointsAction = new RemoveAllBreakpointsAction();
manager.add(removeAllBreakpointsAction);
manager.update(true);
}
@Override
protected void contextActivated(ISelection selection) {
IPresentationContext presentationContext = getTreeModelViewer().getPresentationContext();
if (selection == null || selection.isEmpty()) {
Object input = new DefaultBreakpointsViewInput(presentationContext);
super.contextActivated(new StructuredSelection(input));
} else {
if (selection instanceof TreeSelection) {
if (((TreeSelection) selection).getFirstElement() instanceof DebugElement) {
super.contextActivated(new StructuredSelection(new DefaultBreakpointsViewInput(
presentationContext)));
} else {
super.contextActivated(selection);
}
} else {
super.contextActivated(selection);
}
}
if (isAvailable() && isVisible()) {
updateAction("ContentAssist");
}
}
@Override
protected void createActions() {
super.createActions();
removeBreakpointAction = new RemoveBreakpointAction(treeViewer);
setAction(REMOVE_ACTION, removeBreakpointAction);
}
@Override
protected TreeModelViewer createTreeViewer(Composite parent) {
preferences = DartToolsPlugin.getDefault().getCombinedPreferenceStore();
final TreeModelViewer treeViewer = super.createTreeViewer(parent);
this.treeViewer = treeViewer;
treeViewer.getTree().setBackgroundMode(SWT.INHERIT_FORCE);
treeViewer.getTree().addListener(SWT.EraseItem, new Listener() {
@Override
public void handleEvent(Event event) {
SWTUtil.eraseSelection(event, treeViewer.getTree(), getPreferences());
}
});
SWTUtil.bindJFaceResourcesFontToControl(treeViewer.getTree());
getPreferences().addPropertyChangeListener(propertyChangeListener);
updateColors();
return treeViewer;
}
@Override
protected void fillContextMenu(IMenuManager menu) {
updateObjects();
menu.add(getAction(ACTION_GOTO_MARKER));
menu.add(new Separator());
menu.add(removeBreakpointAction);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
@Override
protected void setViewerInput(Object context) {
if (context != null && context instanceof DebugElement) {
return;
}
super.setViewerInput(context);
}
protected void updateColors() {
SWTUtil.setColors(treeViewer.getTree(), getPreferences());
}
private void doPropertyChange(PropertyChangeEvent event) {
SWTUtil.runUI(new Runnable() {
@Override
public void run() {
updateColors();
treeViewer.refresh(false);
}
});
}
private Composite getDetails() {
// Warning: fragile code!
DetailPaneProxy detailProxy = ReflectionUtils.getFieldObject(this, "fDetailPane");
Composite text = ReflectionUtils.getFieldObject(detailProxy, "fCurrentControl");
return text;
}
private IPreferenceStore getPreferences() {
return preferences;
}
}