Add context menu for type insertion

This commit is contained in:
Daniel Holle 2023-06-20 12:20:34 +02:00
parent 878bdcd1ba
commit d88cdc599b
5 changed files with 125 additions and 5 deletions
JavaCompilerPlugin/bundles/JavaCompilerPlugin.Plugin

@ -6,7 +6,6 @@ Bundle-Version: 0.1.0.qualifier
Bundle-Vendor: de.dhbwstuttgart
Bundle-Activator: typinferenzplugin.Activator
Require-Bundle: org.eclipse.swt,
javax.inject,
org.eclipse.core.runtime,
org.eclipse.jface.text,
org.eclipse.ui.editors,
@ -27,7 +26,9 @@ Require-Bundle: org.eclipse.swt,
org.eclipse.equinox.p2.repository;bundle-version="2.3.200",
org.eclipse.equinox.p2.metadata;bundle-version="2.3.100",
org.eclipse.ui.ide,
org.eclipse.ui.views
org.eclipse.ui.views,
org.eclipse.ui,
org.eclipse.core.expressions
Bundle-RequiredExecutionEnvironment: JavaSE-19
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .,
@ -55,5 +56,6 @@ Bundle-ClassPath: .,
lib/ST4.jar,
target/classes,
typinferenzplugin
Import-Package: javax.annotation;version="1.2.0"
Import-Package: javax.annotation;version="1.2.0",
javax.inject;version="1.0.0"
Automatic-Module-Name: TypinferenzPlugin

@ -75,4 +75,16 @@
markerType="typinferenzplugin.replacemarker"
class="typinferenzplugin.marker.QuickFixer"/>
</extension>
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="true"
class="typinferenzplugin.editor.RightClickMenu"
locationURI="popup:#TextEditorContext">
<dynamic
class="typinferenzplugin.editor.InsertTypeContribution"
id="typinferenzplugin.typeinsert.menu">
</dynamic>
</menuContribution>
</extension>
</plugin>

@ -0,0 +1,47 @@
package typinferenzplugin.editor;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
public class InsertTypeContribution extends ContributionItem {
JavEditor editorContext;
public InsertTypeContribution(JavEditor editorContext) {
super("typinferenzplugin.typeinsert.menu");
this.editorContext = editorContext;
}
@Override
public void fill(Menu menu, int index) {
new MenuItem(menu, SWT.SEPARATOR, 0);
var parent = new MenuItem(menu, SWT.CASCADE, 0);
parent.setText("Typ einsetzen");
var subMenu = new Menu(parent);
parent.setMenu(subMenu);
for (var marker : editorContext.currentMarkers) {
var item = new MenuItem(subMenu, SWT.PUSH);
item.setText(marker.getInsertPoint().getInsertString());
item.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
editorContext.runReplaceMarker(marker);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
});
}
}
@Override
public boolean isDynamic() {
return true;
}
}

@ -36,16 +36,35 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditorExtension2;
import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
@ -71,7 +90,7 @@ import typinferenzplugin.error.ErrorOutput;
* @author janulrich
*
*/
public class JavEditor extends TextEditor implements UnifyResultListener {
public class JavEditor extends TextEditor implements UnifyResultListener, MouseMoveListener {
private static final ILog LOG = Activator.getDefault().getLog();
@ -111,13 +130,19 @@ public class JavEditor extends TextEditor implements UnifyResultListener {
ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
}
@Override
protected void createActions() {
super.createActions();
getSourceViewer().getTextWidget().addMouseMoveListener(this);
}
@Override
protected void doSetInput(IEditorInput input) throws CoreException {
super.doSetInput(input);
this.removeMarkers();
this.typeReconstruction(); // Marker generieren
}
/*
* (non-Javadoc) Method declared on AbstractTextEditor
*/
@ -126,6 +151,7 @@ public class JavEditor extends TextEditor implements UnifyResultListener {
setSourceViewerConfiguration(new JavViewerConfiguration(this));
// install the document provider
// setDocumentProvider(new JavFileProvider());
}
@Override
@ -527,5 +553,19 @@ public class JavEditor extends TextEditor implements UnifyResultListener {
this.updateOutlinePage();
}
public List<TypeReplaceMarker> currentMarkers = new ArrayList<TypeReplaceMarker>();
@Override
public void mouseMove(MouseEvent e) {
var offset = getSourceViewer().getTextWidget().getOffsetAtPoint(new Point(e.x, e.y));
currentMarkers.clear();
for (var marker : typeReplaceMarkers) {
var position = marker.getPositionInCode();
if (offset == position || offset == position + 1) {
currentMarkers.add(marker);
}
}
}
}

@ -0,0 +1,19 @@
package typinferenzplugin.editor;
import org.eclipse.core.expressions.Expression;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.menus.ExtensionContributionFactory;
import org.eclipse.ui.menus.IContributionRoot;
import org.eclipse.ui.services.IServiceLocator;
public class RightClickMenu extends ExtensionContributionFactory {
@Override
public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions) {
var editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if (editor instanceof JavEditor javEditor) {
if (!javEditor.currentMarkers.isEmpty())
additions.addContributionItem(new InsertTypeContribution(javEditor), Expression.TRUE);
}
}
}