aboutsummaryrefslogtreecommitdiffstats
path: root/org.openembedded.bc.ui/src/org/openembedded/bc/ui/editors/bitbake/BBVariableTextHover.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.openembedded.bc.ui/src/org/openembedded/bc/ui/editors/bitbake/BBVariableTextHover.java')
-rw-r--r--org.openembedded.bc.ui/src/org/openembedded/bc/ui/editors/bitbake/BBVariableTextHover.java119
1 files changed, 119 insertions, 0 deletions
diff --git a/org.openembedded.bc.ui/src/org/openembedded/bc/ui/editors/bitbake/BBVariableTextHover.java b/org.openembedded.bc.ui/src/org/openembedded/bc/ui/editors/bitbake/BBVariableTextHover.java
new file mode 100644
index 0000000..d98c305
--- /dev/null
+++ b/org.openembedded.bc.ui/src/org/openembedded/bc/ui/editors/bitbake/BBVariableTextHover.java
@@ -0,0 +1,119 @@
+/**
+ *
+ */
+package org.openembedded.bc.ui.editors.bitbake;
+
+import java.io.File;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.openembedded.bc.bitbake.BBRecipe;
+import org.openembedded.bc.bitbake.BBSession;
+import org.openembedded.bc.ui.Activator;
+
+
+/**
+ * Maps BB Variables in the editor to BBSession
+ * @author kgilmer
+ *
+ */
+class BBVariableTextHover implements ITextHover {
+ private final BBSession session;
+ private volatile Map envMap;
+
+ public BBVariableTextHover(BBSession session, String file) {
+ this.session = session;
+ envMap = session;
+ LoadRecipeJob loadRecipeJob = new LoadRecipeJob(getFilename(file), file);
+ loadRecipeJob.schedule();
+ }
+
+ private String getFilename(String file) {
+
+ String [] elems = file.split(File.separator);
+
+ return elems[elems.length - 1];
+ }
+
+ public IRegion getHoverRegion(ITextViewer tv, int off) {
+ return new Region(off, 0);
+ }
+
+ public String getHoverInfo(ITextViewer tv, IRegion r) {
+ try {
+ IRegion lineRegion = tv.getDocument().getLineInformationOfOffset(r.getOffset());
+
+ return getBBVariable(tv.getDocument().get(lineRegion.getOffset(), lineRegion.getLength()).toCharArray(), r.getOffset() - lineRegion.getOffset());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ private String getBBVariable(char[] line, int offset) {
+ // Find start of word.
+ int i = offset;
+
+ while (line[i] != ' ' && line[i] != '$' && i > 0) {
+ i--;
+ }
+
+ if (i < 0 || line[i] != '$') {
+ return ""; //this is not a BB variable.
+ }
+
+ // find end of word
+ int start = i;
+ i = offset;
+
+ while (line[i] != ' ' && line[i] != '}' && i <= line.length) {
+ i++;
+ }
+
+ if (line[i] != '}') {
+ return ""; //this bb variable didn't terminate as expected
+ }
+
+ String key = new String(line, start + 2, i - start - 2);
+ String val = (String) envMap.get(key);
+
+ if (val == null) {
+ val = "";
+ }
+
+ if (val.length() > 64) {
+ val = val.substring(0, 64) + '\n' + val.substring(65);
+ }
+
+ return val;
+ }
+
+ private class LoadRecipeJob extends Job {
+ private final String filePath;
+
+ public LoadRecipeJob(String name, String filePath) {
+ super("Extracting BitBake environment for " + name);
+ this.filePath = filePath;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor mon) {
+ try {
+ BBRecipe recipe = new BBRecipe(session, filePath);
+ recipe.initialize();
+ envMap = recipe;
+ } catch (Exception e) {
+ return new Status(IStatus.WARNING, Activator.PLUGIN_ID, "Unable to load session for " + filePath, e);
+ }
+
+ return Status.OK_STATUS;
+ }
+ }
+} \ No newline at end of file