blob: 7070cdfa64bd92929814d63704b1a21ce27c69a1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Mylyn project committers and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
*******************************************************************************/
package org.eclipse.mylyn.internal.cdt.ui;
import java.util.Iterator;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.IBinary;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.internal.ui.actions.SelectionConverter;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
import org.eclipse.ui.IWorkbenchPart;
/**
* @author Mik Kersten
* @author Jeff Johnston
*/
public class CDTEditorMonitor extends AbstractUserInteractionMonitor {
protected ICElement lastSelectedElement = null;
protected ICElement lastResolvedElement = null;
protected CEditor currentEditor;
protected StructuredSelection currentSelection = null;
public CDTEditorMonitor() {
super();
}
/**
* Only public for testing
*/
@Override
public void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
try {
ICElement selectedElement = null;
if (selection instanceof StructuredSelection) {
StructuredSelection structuredSelection = (StructuredSelection) selection;
if (structuredSelection.equals(currentSelection)) {
return;
}
currentSelection = structuredSelection;
// Object selectedObject =
// structuredSelection.getFirstElement();
for (Iterator<?> iterator = structuredSelection.iterator(); iterator.hasNext();) {
Object selectedObject = iterator.next();
if (selectedObject instanceof ICElement) {
ICElement checkedElement = checkIfAcceptedAndPromoteIfNecessary((ICElement) selectedObject);
if (checkedElement == null) {
return;
} else {
selectedElement = checkedElement;
}
}
if (selectedElement != null) {
super.handleElementSelection(part, selectedElement, contributeToContext);
}
}
} else {
if (part instanceof CEditor) {
currentEditor = (CEditor) part;
selectedElement = SelectionConverter.getElementAtOffset(currentEditor);
if (selectedElement == null) {
return; // nothing selected
}
if (selectedElement != null) {
if (selectedElement.equals(lastSelectedElement)) {
super.handleElementEdit(part, selectedElement, contributeToContext);
} else if (!selectedElement.equals(lastSelectedElement)) {
super.handleElementSelection(part, selectedElement, contributeToContext);
}
}
ICElement checkedElement = checkIfAcceptedAndPromoteIfNecessary(selectedElement);
if (checkedElement == null) {
return;
} else {
selectedElement = checkedElement;
}
}
}
if (selectedElement != null) {
lastSelectedElement = selectedElement;
}
} catch (CModelException e) {
// ignore, fine to fail to resolve an element if the model is not
// up-to-date
}
}
/**
* @return null for elements that aren't modeled
*/
protected ICElement checkIfAcceptedAndPromoteIfNecessary(ICElement element) {
if (!(element instanceof IBinary)) {
return element;
}
return null;
}
}