NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi Curtis, I implemented the feature for a user to click on multiple cells and it is almost functioning correctly for my purposes. I can hold down the "control" button on the keyboard and click on a spreadsheet cell with the mouse for multiple cells. However, I can select multiple cells by not holding down "control" either. I don?t want the user to be able to just click on the cells and have them selected unless they are pressing "control" simultaneously. I implemented the DisplayListener class with my own class called CellDisplayListener. In CellDisplayListener.java, I check if it was a mouse click event and "CONTROL" held down in the code below: e.getId() == DisplayEvent.MOUSE_PRESSED && !e.isRemote()) { .... if (e.getModifiers() == InputEvent.CTRL_MASK) { //is it a .... The first if statement is true in printouts but it can't get past the 2nd if statement. Then, when I commented out the check for a control key, I can't click on control and select the cell obviously. This would mean that my CellDisplayListener *is* being used but it may not be the only class used because somewhere else in the package, it is allowing multiple cell clicking without holding down control. Do you know where else selectCell() would be called that would override my CellDisplayListener class? FROM MY VISADAPI CLASS: CellDisplayListener the_listener = new CellDisplayListener(mySS); //to detect mouse click events mySS.DisplayCells[width][height].addDisplayListener(the_listener); //add it to this cell FROM SPREADSHEET CLASS: public void selectCell(int x, int y) { if (x < 0) x = 0; if (y < 0) y = 0; if (x >= NumVisX) x = NumVisX - 1; if (y >= NumVisY) y = NumVisY - 1; int cell_number = (x + (NumVisX * y)); //used as arg to getMappingForCell() Integer cellNum = new Integer(cell_number); // update borders of all cells //for (int j=0; j<NumVisY; j++) { //for (int i=0; i<NumVisX; i++) { //boolean selected = x == i && y == j; if (!DisplayCells[x][y].isSelectedAlready()) { //cell was not already selected, select cell DisplayCells[x][y].setSelected(true); //highlight cell userChoices.addElement(cellNum); //add cellnum to vector // take off showing auto controls because a box pops up for every single cell. //DisplayCells[x][y].setAutoShowControls(true && AutoShowControls); } else { // cells was already selected, now deselect cell DisplayCells[x][y].setSelected(false); //un-highlight cell userChoices.removeElement(cellNum); //remove this cellnum from vector holding user's choices } //} //} // update spreadsheet info, next 2 lines are questionable, cut out? // if user does not cut, copy, paste, edit...etc the cell, then I don't need to modify curX and curY CurX = x; CurY = y; FormulaText.getCaret().setVisible(true); // BIG HAMMER HACK refreshFormulaBar(); refreshMenuCommands(); refreshDisplayMenuItems(); FROM CELLDISPLAYLISTENER CLASS: package visad; import java.util.EventListener; import java.awt.*; import java.awt.Event; import java.awt.event.MouseEvent; import java.awt.event.InputEvent; import java.rmi.*; import visad.ss.*; /** CellDisplayListener.java implements Visad's interface class: DisplayListener.java */ public class CellDisplayListener implements DisplayListener { public SpreadSheet ss; public CellDisplayListener(SpreadSheet spread_sheet) { System.out.println("in CellDisplayLIstener constructor"); ss = spread_sheet; } /** send a DisplayEvent to this DisplayListener */ public void displayChanged(DisplayEvent e) throws VisADException, RemoteException { try { if (e.getId() == DisplayEvent.MOUSE_PRESSED && !e.isRemote()) { String name = null; Display d = e.getDisplay(); name = d.getName(); if (name.endsWith(".remote")) { // cloned cells need ".remote" stripped from their names name = name.substring(0, name.length() - 7); } if (e.getInputEvent() != null) { //double check if it is a MouseEvent and we checked up above too if (e.getModifiers() == InputEvent.CTRL_MASK) { //is it a mouse click AND control button held down? System.out.println("found it was CONTROL"); FancySSCell fcell = (FancySSCell) BasicSSCell.getSSCellByName(name); int ci = -1; int cj = -1; int height = ss.getHeight(); int width = ss.getWidth(); FancySSCell[][] displayCells = ss.getDisplayCells(); for (int j=0; j< height; j++) { for (int i=0; i< width; i++) { if (fcell == displayCells[i][j]) { ci = i; cj = j; } } } if (BasicSSCell.DEBUG && (ci < 0 || cj < 0)) { System.err.println("Warning: an unknown display change occurred: " + "display (" + name + ") has changed, but there is no " +"corresponding SSCell with that name!"); } ss.selectCell(ci, cj); } } } } catch (VisADException exc) { if (BasicSSCell.DEBUG) exc.printStackTrace(); } catch (RemoteException exc) { if (BasicSSCell.DEBUG) exc.printStackTrace(); } } } -----Original Message----- From: Curtis Rueden [mailto:curtis@xxxxxxxxxxxxx] Sent: Wednesday, June 25, 2003 3:15 PM To: Kam, Michelle C Subject: RE: specifying fields from input file Hi Michelle, Add a DisplayListener to your displays, and in the implementing displayChanged method, check for MOUSE_PRESSED (and possibly other mouse-related) events. See SpreadSheet.displayChanged for a basic example. You can then access more information about these events by calling e.getInputEvent() to obtain the original MouseEvent, then probing the MouseEvent to find out which keyboard modifiers were pressed for that event. -Curtis At 12:32 PM 6/24/2003, you wrote: >Hi Curtis, > >I'm adding the capability for a user to select multiple cells by clicking on >control and the mouse button. Before I can add the vector class variable to >SpreadSheet.java and add the selected cells to the vector in selectCell(), I >need to first allow the user to press "control" and click with the mouse >button to select cells. In KeyboardBehaviorJ3D.java (I'm making the >assumption that all cells will display the image in 3D), would it be logical >to call mapKeyToFunction(func, keycode, modifiers) and extend the >functionKeys and functionMods arrays to store 1 more element, namely this >control and mouse click? Then in execFunction(int function), add a case >statement that will call SpreadSheet.selectCell()? > >I'm not sure if modifying KeyboardBehaviorJ3D.java is the right class to >modify or if adding code to SpreadSheet.java under keyPressed(KeyEvent e){ >.... > else if (keyCode == KeyEvent.VK_CONTROL) { > allow multiple cell selections... >} > >would require fewer changes. >Do you have any recommendations? > >Thanks, >Michelle
visad
archives: