blob: 19861b7fad8e7209e40b32b3b41a69af32bb8e67 [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.
*/
/*
* Class ValueLookupManager
* @author Jeka
*/
package com.intellij.xdebugger.impl.evaluate.quick.common;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.event.EditorMouseEvent;
import com.intellij.openapi.editor.event.EditorMouseEventArea;
import com.intellij.openapi.editor.event.EditorMouseMotionListener;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.util.Alarm;
import com.intellij.xdebugger.impl.DebuggerSupport;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
public class ValueLookupManager implements EditorMouseMotionListener {
/**
* @see com.intellij.xdebugger.XDebuggerUtil#disableValueLookup(com.intellij.openapi.editor.Editor)
*/
public static final Key<Boolean> DISABLE_VALUE_LOOKUP = Key.create("DISABLE_VALUE_LOOKUP");
private final Project myProject;
private final Alarm myAlarm;
private AbstractValueHint myRequest = null;
private final DebuggerSupport[] mySupports;
private boolean myListening;
public ValueLookupManager(Project project) {
myProject = project;
mySupports = DebuggerSupport.getDebuggerSupports();
myAlarm = new Alarm(project);
}
public void startListening() {
if (!myListening) {
myListening = true;
EditorFactory.getInstance().getEventMulticaster().addEditorMouseMotionListener(this, myProject);
}
}
@Override
public void mouseDragged(EditorMouseEvent e) {
}
@Override
public void mouseMoved(EditorMouseEvent e) {
if (e.isConsumed()) {
return;
}
Editor editor = e.getEditor();
if (editor.getProject() != null && editor.getProject() != myProject) {
return;
}
if (e.getArea() != EditorMouseEventArea.EDITING_AREA || DISABLE_VALUE_LOOKUP.get(editor) == Boolean.TRUE) {
return;
}
Point point = e.getMouseEvent().getPoint();
if (myRequest != null && !myRequest.isKeepHint(editor, point)) {
hideHint();
}
for (DebuggerSupport support : mySupports) {
QuickEvaluateHandler handler = support.getQuickEvaluateHandler();
if (handler.isEnabled(myProject)) {
requestHint(handler, editor, point, AbstractValueHint.getType(e));
break;
}
}
}
private void requestHint(final QuickEvaluateHandler handler, final Editor editor, final Point point, final ValueHintType type) {
myAlarm.cancelAllRequests();
if (type == ValueHintType.MOUSE_OVER_HINT) {
myAlarm.addRequest(new Runnable() {
@Override
public void run() {
showHint(handler, editor, point, type);
}
}, handler.getValueLookupDelay(myProject));
}
else {
showHint(handler, editor, point, type);
}
}
public void hideHint() {
if (myRequest != null) {
myRequest.hideHint();
myRequest = null;
}
}
public void showHint(@NotNull QuickEvaluateHandler handler, @NotNull Editor editor, @NotNull Point point, @NotNull ValueHintType type) {
myAlarm.cancelAllRequests();
if (editor.isDisposed() || !handler.canShowHint(myProject)) {
return;
}
final AbstractValueHint request = handler.createValueHint(myProject, editor, point, type);
if (request != null) {
if (myRequest != null && myRequest.equals(request)) {
return;
}
if (!request.canShowHint()) {
return;
}
if (myRequest != null && myRequest.isInsideHint(editor, point)) {
return;
}
hideHint();
myRequest = request;
myRequest.invokeHint(new Runnable() {
@Override
public void run() {
if (myRequest != null && myRequest == request) {
myRequest = null;
}
}
});
}
}
public static ValueLookupManager getInstance(Project project) {
return ServiceManager.getService(project, ValueLookupManager.class);
}
}