Editing an NSOutlineView item

2014-10-27 Thread Luther Baker
I've successfully built an NSOutlineView and configured the items for
editing. Got that working.

Now, in my delegate/datasource, I am implementing

- (BOOL)outlineView:(NSOutlineView *)outlineView
shouldEditTableColumn:(NSTableColumn *)tableColumn
   item:(id)item {
NSLog(@hi);
}

but when I tap on a field a 2nd time to edit it - this never gets invoked.
I am also implementing

- (void)outlineView:(NSOutlineView *)outlineView
 setObjectValue:(id)object
 forTableColumn:(NSTableColumn *)tableColumn
 byItem:(id)item {
NSLog(@hi);
}

but once I replace the text of the field and hit enter, this is not called
either. Is there something else I must to do get complete editing
capability?

Also, 1 final trivial question ... let's say I want to allow editing ONLY
after right clicking and picking a context menu item. Assuming I can get
the row and column from the event, how do I programmatically turn the
editor on for a specific field?

Thanks,
-Luther
___

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

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

Re: Editing an NSOutlineView item

2014-10-27 Thread Ken Thomases
On Oct 27, 2014, at 7:02 PM, Luther Baker lutherba...@gmail.com wrote:

 I've successfully built an NSOutlineView and configured the items for
 editing. Got that working.
 
 Now, in my delegate/datasource, I am implementing
 
 - (BOOL)outlineView:(NSOutlineView *)outlineView
 shouldEditTableColumn:(NSTableColumn *)tableColumn
   item:(id)item {
NSLog(@hi);
 }
 
 but when I tap on a field a 2nd time to edit it - this never gets invoked.

I'm guessing that you're using a view-based outline view (as you should, since 
it's the modern way).  The above method is only used for NSCell-based outline 
views.  This is not as clearly documented as it should be.  The corresponding 
method for NSTableView is clearly documented as only valid for NSCell-based 
table views.

In a view-based outline view, the individual views within the cells of the 
outline view act (almost) just like views elsewhere.  An NSTextField controls 
its own editability.  You can use bindings to control the text field's 
editability or you can set its editable property as conditions warrant.

The outline view is involved in a less direct manner.  Its implementation of 
-validateProposedFirstResponder:forEvent: is called and can control whether the 
text field can become first responder, a.k.a. begin editing.


 I am also implementing
 
 - (void)outlineView:(NSOutlineView *)outlineView
 setObjectValue:(id)object
 forTableColumn:(NSTableColumn *)tableColumn
 byItem:(id)item {
NSLog(@hi);
 }
 
 but once I replace the text of the field and hit enter, this is not called
 either. Is there something else I must to do get complete editing
 capability?

Again, this is not used for view-based outline views and this is most clearly 
documented for the corresponding table view method.  You can use bindings to 
tie the text field's value to a key path of the object associated with the cell 
or you can use target-action to trigger a method when the text field's value 
has changed.


 Also, 1 final trivial question ... let's say I want to allow editing ONLY
 after right clicking and picking a context menu item. Assuming I can get
 the row and column from the event, how do I programmatically turn the
 editor on for a specific field?

The traditional way is to use -editColumn:row:withEvent:select:, but it's more 
complicated with view-based outline views.  That method will attempt to make 
the cell view the first responder.  Not all views accept first responder and 
support a notion of editing when they are first responder.  For example, 
NSTableCellView does not, and that's commonly used as the cell view.

If you use a bare NSTextField as the cell view, then the above method will work 
directly because the text field will accept first responder and begin editing 
(assuming it's editable).

If you're using a compound cell view and you want to initiate editing on a 
particular text field within it, you should make it first responder directly:

NSTableCellView* tableCellView = [outlineView viewAtColumn:column row:row 
makeIfNecessary:NO];
NSTextField* textField = tableCellView.textField;
if ([textField acceptsFirstResponder])
[textField.window makeFirstResponder:textField];

You may also want to select the row and scroll it into view.

Regards,
Ken


___

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

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

Re: Editing an NSOutlineView item

2014-10-27 Thread Luther Baker
Thanks Ken. Just what I needed.

-Luther



On Mon, Oct 27, 2014 at 7:47 PM, Ken Thomases k...@codeweavers.com wrote:

 On Oct 27, 2014, at 7:02 PM, Luther Baker lutherba...@gmail.com wrote:

  I've successfully built an NSOutlineView and configured the items for
  editing. Got that working.
 
  Now, in my delegate/datasource, I am implementing
 
  - (BOOL)outlineView:(NSOutlineView *)outlineView
  shouldEditTableColumn:(NSTableColumn *)tableColumn
item:(id)item {
 NSLog(@hi);
  }
 
  but when I tap on a field a 2nd time to edit it - this never gets
 invoked.

 I'm guessing that you're using a view-based outline view (as you should,
 since it's the modern way).  The above method is only used for NSCell-based
 outline views.  This is not as clearly documented as it should be.  The
 corresponding method for NSTableView is clearly documented as only valid
 for NSCell-based table views.

 In a view-based outline view, the individual views within the cells of the
 outline view act (almost) just like views elsewhere.  An NSTextField
 controls its own editability.  You can use bindings to control the text
 field's editability or you can set its editable property as conditions
 warrant.

 The outline view is involved in a less direct manner.  Its implementation
 of -validateProposedFirstResponder:forEvent: is called and can control
 whether the text field can become first responder, a.k.a. begin editing.


  I am also implementing
 
  - (void)outlineView:(NSOutlineView *)outlineView
  setObjectValue:(id)object
  forTableColumn:(NSTableColumn *)tableColumn
  byItem:(id)item {
 NSLog(@hi);
  }
 
  but once I replace the text of the field and hit enter, this is not
 called
  either. Is there something else I must to do get complete editing
  capability?

 Again, this is not used for view-based outline views and this is most
 clearly documented for the corresponding table view method.  You can use
 bindings to tie the text field's value to a key path of the object
 associated with the cell or you can use target-action to trigger a method
 when the text field's value has changed.


  Also, 1 final trivial question ... let's say I want to allow editing ONLY
  after right clicking and picking a context menu item. Assuming I can get
  the row and column from the event, how do I programmatically turn the
  editor on for a specific field?

 The traditional way is to use -editColumn:row:withEvent:select:, but it's
 more complicated with view-based outline views.  That method will attempt
 to make the cell view the first responder.  Not all views accept first
 responder and support a notion of editing when they are first responder.
 For example, NSTableCellView does not, and that's commonly used as the cell
 view.

 If you use a bare NSTextField as the cell view, then the above method will
 work directly because the text field will accept first responder and begin
 editing (assuming it's editable).

 If you're using a compound cell view and you want to initiate editing on a
 particular text field within it, you should make it first responder
 directly:

 NSTableCellView* tableCellView = [outlineView viewAtColumn:column
 row:row makeIfNecessary:NO];
 NSTextField* textField = tableCellView.textField;
 if ([textField acceptsFirstResponder])
 [textField.window makeFirstResponder:textField];

 You may also want to select the row and scroll it into view.

 Regards,
 Ken


___

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

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