Thanks Deepayan ! It worked great ! You can take a look at my commented sloppy code below. It's mostly copy and paste from clickFocus.
If you ever get a chance I suggest you divide clickFocus in in two functions: - trellis.clickFocus: Would behave like the function you have now but would call xyClickFocus() to do most of the work. It would mostly call grid.location() - trellis.clickFocusXY(x,y) (I am not refering to the code below, this function would be different) Would do most of the work, and would be great to embed an R device into any GUI. I don't know if there is any other way to go around who owns the event loop, either the REngine or the GUI where the R device is embedded. Here is my modified sloppy code (I just have been playing with R for a week): xyclickFocus <- function(x, y, clip.off = FALSE, highlight = interactive(), ..., guess = TRUE, verbose = TRUE) { library(lattice) ### New library(grid) ### New trellis.unfocus() ### Modified, from trellis.focus()) layoutMatrix <- trellis.currentLayout() if (guess && sum(layoutMatrix > 0) == 1) { ## there's only one panel, so just select it w <- which(layoutMatrix > 0) focusRow <- row(layoutMatrix)[w] focusCol <- col(layoutMatrix)[w] if (verbose) message(sprintf("Selecting panel at position (%g, %g)", focusRow, focusCol)) } else if (all(layoutMatrix == 0)) { warning("No panels available") return() } else { x <- grconvertX(x, "device", "npc") ### New y <- grconvertY(y, "device", "npc") ### New x <- unit(x, "native") ### New y <- unit(y, "native") ### New clickLoc = list(x=x,y=y) ### Modified, changed from <- grid.locator("npc") glayout <-lattice:::lattice.getStatus("layout.details") ### Modified, added lattice::: rowRange <- range(glayout$pos.heights$panel, glayout$pos.heights$strip) colRange <- range(glayout$pos.widths$panel, glayout$pos.widths$strip.left) layCols <- glayout$page.layout$ncol layRows <- glayout$page.layout$nrow leftPad <- convertX(sum(glayout$page.layout$widths[1:(colRange[1]-1)]), "npc", valueOnly = TRUE) rightPad <- convertX(sum(glayout$page.layout$widths[(colRange[2]+1):layCols]), "npc", valueOnly = TRUE) topPad <- convertY(sum(glayout$page.layout$heights[1:(rowRange[1]-1)]), "npc", valueOnly = TRUE) botPad <- convertY(sum(glayout$page.layout$heights[(rowRange[2]+1):layRows]), "npc", valueOnly = TRUE) message("Click on panel to focus") if (is.null(clickLoc)) return() clickXScaled <- (as.numeric(clickLoc$x) - leftPad) / (1 - leftPad - rightPad) focusCol <- ceiling(clickXScaled * ncol(layoutMatrix)) clickYScaled <- (as.numeric(clickLoc$y) - botPad) / (1 - botPad - topPad) focusRow <- ceiling(clickYScaled * nrow(layoutMatrix)) if (lattice:::lattice.getStatus("as.table")) focusRow <- nrow(layoutMatrix) - focusRow + 1 ### Modified, added lattice::: } if ((focusCol >= 1) && (focusCol <= ncol(layoutMatrix)) && (focusRow >= 1) && (focusRow <= nrow(layoutMatrix)) && layoutMatrix[focusRow, focusCol] > 0) { trellis.focus("panel", column = focusCol, row = focusRow, clip.off = clip.off, highlight = highlight, ...) } else { focusCol <- focusRow <- 0 } invisible(list(col=focusCol, row=focusRow)) } On Thu, Oct 23, 2008 at 2:55 PM, Deepayan Sarkar <[EMAIL PROTECTED]>wrote: > On Thu, Oct 23, 2008 at 12:26 PM, Daniel Kornhauser > <[EMAIL PROTECTED]> wrote: > > Hi: > > > > I would like to find out the panel of a xyplot matrix where a mouse > clicked. > > > > I know this functionality is already bundled in trellis.focus but I can't > > use it because I am coding a stand alone application in Java using with > > GDCanvas as a graphics device. > > > > I tried calling trellis.focus from Java with: > > re.eval("t = trellis.focus()")); > > However it did not work for an embedded GDCanvas. The above call to the > > trellis.focus() returns null no matter where I click. > > > > (Side note: the functionality must be implemented in the GDCanvas because > > trellis.focus does work correctly in JGR) > > > > I wish to handle all the user GUI events in Java to evaluate different > > commands in an Rengine. > > With a GDCanvas, it's straightforward to get the x y position of a mouse > > click with the standard e.getX() and e.getY() > > So my handler would look like: > > public void mouseClicked(MouseEvent e) { > > System.out.println("Clicked" + e.getX() + " " + e.getY()); > > System.out.println(re.eval("t = trellis.focus()")); > > System.out.println(re.eval("t")); > > // I would update the panel here ... > > } > > > > I am only using Java because: > > - I am proficient in Java GUI programmer > > - It is multiplatform > > > > Another way of posing the question is: > > Given the coordinates from grid.location how can I find out the plane of > an > > xyplot matrix where the user clicked. > > > > I have tried to figure out how to do it from code using > trellis.clickFocus, > > but I have have only been playing with R for a week, so I am quite lost > > reading R code. > > The approach in trellis.clickFocus should get you close. One important > point is that > > clickLoc <- grid.locator("npc") > > returns the location in NPC, whereas your e.getX() and e.getY() would > be in device coordinates. help(grconvertX) should tell you how to make > the conversion. > > -Deepayan > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel