Skip to content

Commit

Permalink
Merge pull request #4 from nittka/searchPreview
Browse files Browse the repository at this point in the history
  • Loading branch information
nittka committed Aug 29, 2018
2 parents 9417108 + 869e9ea commit 025aa52
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 1 deletion.
3 changes: 2 additions & 1 deletion de.nittka.tooling.jtag.ui/META-INF/MANIFEST.MF
Expand Up @@ -15,7 +15,8 @@ Require-Bundle: de.nittka.tooling.jtag;visibility:=reexport,
org.antlr.runtime,
org.eclipse.xtext.ui.codetemplates.ui,
org.eclipse.compare,
org.eclipse.search;bundle-version="3.10.0"
org.eclipse.search;bundle-version="3.10.0",
org.eclipse.ui.browser;bundle-version="3.4.300"
Import-Package: org.apache.log4j,
org.eclipse.xtext.xbase.lib
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Expand Down
@@ -1,7 +1,11 @@
package de.nittka.tooling.jtag.ui;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.URI;

import de.nittka.tooling.jtag.jtag.File;
import de.nittka.tooling.jtag.jtag.FileName;

public class JtagFileURIs {
Expand All @@ -15,6 +19,17 @@ public static URI getReferencedResourceURI(FileName file){
}
}

public static String getImageLocation(File file){
IResource wsFile = ResourcesPlugin.getWorkspace().getRoot().findMember(file.eResource().getURI().toPlatformString(true));
if(wsFile.exists()){
FileName name = file.getFileName();
IPath folder = wsFile.getLocation().removeLastSegments(1);
IPath fileLocation = folder.append(name.getFileName()).addFileExtension(name.getExtension());
return fileLocation.toString();
}
return null;
}

// public static IFile getJtagFile(IFile file){
// if("jtag".equals(file.getFileExtension())){
// throw new IllegalArgumentException(file+" is already an Jtag file");
Expand Down
Expand Up @@ -7,8 +7,12 @@
import org.eclipse.xtext.resource.ILocationInFileProvider;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler;
import org.eclipse.xtext.ui.editor.hover.html.DefaultEObjectHoverProvider;
import org.eclipse.xtext.ui.editor.hover.html.IEObjectHoverDocumentationProvider;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper;

import de.nittka.tooling.jtag.ui.hover.JTagEObjectHover;
import de.nittka.tooling.jtag.ui.hover.JtagHoverProvider;
import de.nittka.tooling.jtag.ui.linking.JtagFindReferencesHandler;
import de.nittka.tooling.jtag.ui.linking.JtagHyperlinkHelper;
import de.nittka.tooling.jtag.ui.linking.JtagLocationInFileProvider;
Expand Down Expand Up @@ -55,6 +59,14 @@ public Class<? extends FindReferencesHandler> bindXarchiveReferenceFinder(){
return JtagFindReferencesHandler.class;
}

public Class<? extends DefaultEObjectHoverProvider> bindEHoverProvider(){
return JtagHoverProvider.class;
}

public Class<? extends IEObjectHoverDocumentationProvider> bindEObjectHover(){
return JTagEObjectHover.class;
}

// public Class<? extends XtextTemplateContextType> bindTemplateContextType() {
// return XarchiveTemplateContextType.class;
//}
Expand Down
@@ -0,0 +1,25 @@
package de.nittka.tooling.jtag.ui.hover;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.ui.editor.hover.html.DefaultHoverDocumentationProvider;

import de.nittka.tooling.jtag.jtag.File;
import de.nittka.tooling.jtag.jtag.FileName;
import de.nittka.tooling.jtag.ui.JtagFileURIs;

public class JTagEObjectHover extends DefaultHoverDocumentationProvider {

private static String SPACING_POSTFIX="<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>";

@Override
public String getDocumentation(EObject object) {
if(object instanceof FileName){
String location=JtagFileURIs.getImageLocation((File)object.eContainer());
if(location!=null){
String folder=new java.io.File(location).getParent();
return "<img src=\"file://"+location+"\" height=120px><br>"+folder+SPACING_POSTFIX;
}
}
return super.getDocumentation(object);
}
}
@@ -0,0 +1,25 @@
package de.nittka.tooling.jtag.ui.hover;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.ui.editor.hover.html.DefaultEObjectHoverProvider;

import de.nittka.tooling.jtag.jtag.FileName;

public class JtagHoverProvider extends DefaultEObjectHoverProvider {

@Override
protected boolean hasHover(EObject o) {
if(o instanceof FileName){
return true;
}
return super.hasHover(o);
}

@Override
protected String getFirstLine(EObject o) {
if(o instanceof FileName){
return "<b>"+getLabel(o)+"</b>";
}
return super.getFirstLine(o);
}
}
@@ -1,14 +1,18 @@
package de.nittka.tooling.jtag.ui.search;

import java.io.File;
import java.nio.file.Files;
import java.util.Iterator;
import java.util.List;

import javax.inject.Inject;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.PlatformUI;
import org.eclipse.xtext.resource.IContainer;
import org.eclipse.xtext.resource.IContainer.Manager;
import org.eclipse.xtext.resource.IEObjectDescription;
Expand All @@ -35,6 +39,8 @@ public class JtagSearchQuery extends ReferenceQuery {
private ResourceDescriptionsProvider indexProvider;
@Inject
private IResourceServiceProvider serviceProvider;
@Inject
private JtagSearchResultPreview preview;

private JtagSearch search;

Expand All @@ -52,9 +58,22 @@ public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
result.reset();
internalRun(monitor, result);
result.finish();
maybeOpenBrowser(result);
return (monitor.isCanceled()) ? Status.CANCEL_STATUS : Status.OK_STATUS;
}

private void maybeOpenBrowser(ReferenceSearchResult result){
try {
if(!result.getMatchingReferences().isEmpty()){
File tempFile= ResourcesPlugin.getWorkspace().getRoot().getLocation().append(".metadata").append("JtagSearchPreview.html").toFile();
Files.write(tempFile.toPath(), preview.createHtml(result).getBytes());
PlatformUI.getWorkbench().getBrowserSupport().createBrowser("JtagSearchPreview").openURL(tempFile.toURL());
}
} catch (Exception e) {
e.printStackTrace();
}
}

private void internalRun(IProgressMonitor monitor, IAcceptor<IReferenceDescription> acceptor){
//our implementation searches the index, matching each visible IResourceDescription against the actual search logic
IResourceDescriptions index = indexProvider.getResourceDescriptions(search.getResource());
Expand Down
@@ -0,0 +1,59 @@
package de.nittka.tooling.jtag.ui.search

import de.nittka.tooling.jtag.jtag.File
import de.nittka.tooling.jtag.ui.JtagFileURIs
import java.util.List
import javax.inject.Inject
import javax.inject.Provider
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.resource.IReferenceDescription
import org.eclipse.xtext.resource.XtextResourceSet
import org.eclipse.xtext.ui.editor.findrefs.ReferenceSearchResult

class JtagSearchResultPreview {

@Inject
Provider<XtextResourceSet> rsProvider;

def String createHtml(ReferenceSearchResult searchResult){
val List<IReferenceDescription> matches=searchResult.matchingReferences
val rs=rsProvider.get
'''
<html>
<head>
<style>
.pic{
display:inline;
}
img{
padding:5px;
max-width:200px;
max-height:200px;
}
</style>
</head>
<body>
«FOR desc:matches»
«desc.render(rs)»
«ENDFOR»
</bod<>
</html>
'''
}

def String render(IReferenceDescription desc, XtextResourceSet rs){
val EObject e=rs.getEObject(desc.targetEObjectUri,true)
if(e instanceof File){
val file=e as File
val location=JtagFileURIs.getImageLocation(file)
if(location!==null){
val javaFile=new java.io.File(location)
'''
<div class="pic">
<img src="file://«location»" title="«javaFile.name» - «javaFile.parentFile.absolutePath»">
</div>
'''
}
}
}
}

0 comments on commit 025aa52

Please sign in to comment.