blob: 33a4fdb5d666d1a09a7b529d3b2bf76a78b695ae [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
/*
* @author Eugene Zhuravlev
*/
package com.intellij.debugger.ui.impl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.impl.DebuggerStateManager;
import com.intellij.debugger.ui.impl.watch.DebuggerTree;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.keymap.KeymapManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
import com.intellij.ui.PopupHandler;
import com.intellij.util.SingleAlarm;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import com.sun.jdi.VMDisconnectedException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
public abstract class DebuggerTreePanel extends UpdatableDebuggerView implements DataProvider, Disposable {
public static final DataKey<DebuggerTreePanel> DATA_KEY = DataKey.create("DebuggerPanel");
private final SingleAlarm myRebuildAlarm = new SingleAlarm(new Runnable() {
@Override
public void run() {
try {
final DebuggerContextImpl context = getContext();
if(context.getDebuggerSession() != null) {
getTree().rebuild(context);
}
}
catch (VMDisconnectedException ignored) {
}
}
}, 100);
protected DebuggerTree myTree;
public DebuggerTreePanel(Project project, DebuggerStateManager stateManager) {
super(project, stateManager);
myTree = createTreeView();
final PopupHandler popupHandler = new PopupHandler() {
@Override
public void invokePopup(Component comp, int x, int y) {
ActionPopupMenu popupMenu = createPopupMenu();
if (popupMenu != null) {
myTree.myTipManager.registerPopup(popupMenu.getComponent()).show(comp, x, y);
}
}
};
myTree.addMouseListener(popupHandler);
setFocusTraversalPolicy(new IdeFocusTraversalPolicy() {
@Override
public Component getDefaultComponentImpl(Container focusCycleRoot) {
return myTree;
}
});
registerDisposable(new Disposable() {
@Override
public void dispose() {
myTree.removeMouseListener(popupHandler);
}
});
final Shortcut[] shortcuts = KeymapManager.getInstance().getActiveKeymap().getShortcuts("ToggleBookmark");
final CustomShortcutSet shortcutSet = shortcuts.length > 0? new CustomShortcutSet(shortcuts) : new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0));
overrideShortcut(myTree, XDebuggerActions.MARK_OBJECT, shortcutSet);
}
protected abstract DebuggerTree createTreeView();
@Override
protected void rebuild(int event) {
myRebuildAlarm.cancelAndRequest();
}
@Override
public void dispose() {
Disposer.dispose(myRebuildAlarm);
try {
super.dispose();
}
finally {
final DebuggerTree tree = myTree;
if (tree != null) {
Disposer.dispose(tree);
}
// prevent mem leak from inside Swing
myTree = null;
}
}
protected abstract ActionPopupMenu createPopupMenu();
public final DebuggerTree getTree() {
return myTree;
}
public void clear() {
myTree.removeAllChildren();
}
@Override
public Object getData(String dataId) {
if (DATA_KEY.is(dataId)) {
return this;
}
return null;
}
@Override
public void requestFocus() {
getTree().requestFocus();
}
}