On Jan 26, 2010, at 9:09 PM, David Melgar wrote:

In my view controller, I had been assuming that the row the right click occurred would show up as a selected row. But it does not always. It appears to be a separate state.
How should I determine the row that the right click occurred on?

Kyle's already pointed out -clickedRow. The pseudo-code for this is

        if there is a clickedRow and the clickedRow is not selected
                operate on the clickedRow only
        else
                operate on the selected rows

I've found it handy to put this into a separate method that returns the selected items or rows, and then use that method as the basis for what to operate on in action methods that operate on the selection. (If invoked through a regular menu or toolbar item or button, this algorithm is still safe because clickedRow will return -1, so you'll be operating on the selection as normal.)

(BTW this applies equally to regular NSTableViews.)

I recently had to implement this logic once again (for the Chrome bookmark manager); here's what it looks like:

// Returns the selected/right-clicked item(s) for a command to act on.
- (NSArray*)actionItems {
  int row = [outline_ clickedRow];
  if (row >= 0 && ![outline_ isRowSelected:row])
    return [NSArray arrayWithObject:[outline_ itemAtRow:row]];

  return [self selectedItems];
}

In fact thanks to the wonders of open source you can easily look at the entire class:
        
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/cocoa/bookmark_tree_controller.mm?revision=36892&view=markup

—Jens_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to