I was wondering if it is possible to stack multiple values in one NSCell, or stack multiple NSCells in one NSTableColumn without the need to write custom Obj-C code?
What I mean is like when you open the Mail Preferences’ Accounts pane, in the Accounts table you see the account name and type stacked above each other in what appears to be one cell. Both values have a different text formatting applied, that might be a next headache.
As you might have expected, just dragging in a second NSTextFieldCell, or whatever cell type, in the table column is not supported by IB.
As a side note, I’m fairly new to ASOC, did some small stuff in Studio but am not familiar to Obj-C.
I’ve learned a lot about text formatting in this thread but I’m still looking for a possibility to format just a part of the text string in a Text Field Cell.
Assume a Text Field Cell by the identifier “theAccInfo”, containing:
Both strings appear correctly stacked within one Text Field Cell, but I’d like to have the part before the return appear bold, the part after return in a lighter color.
I’m not sure if this is possible at all. It’s not like the interface will break if not, but I like these small details that make an interface shine…
Any ideas?
Thanks Stefan, you pushed me in the right direction.
While the info in the table column isn’t about to be changed while running this app, I’ve opted to apply the formatting before passing the string to the arrayController. I figured it would save some processing in the tableView_willDisplayCell_forTableColumn_row_(aTable, aCell, aColumn, aRow) handler.
I solved it as follows:
-- initialising the first part of the string:
set theAccInfo to NSMutableAttributedString's alloc()'s initWithString_attributes_("My account name", {NSFont:(NSFont's fontWithName_size_("LucidaGrande", 14))})
--adding the second line, in uppercase and a smaller fontsize
tell theAccInfo to appendAttributedString_(NSMutableAttributedString's alloc()'s initWithString_attributes_((NSString's stringWithString_(return & "imap")'s uppercaseString), {NSFont:(NSFont's fontWithName_size_("LucidaGrande", 10))}))
Both strings are stacked in the Text Field Cell and are easily visually distinguished. I opted not to use different colors on both strings to keep the tableView_willDisplayCell…-handler simple.
on tableView_willDisplayCell_forTableColumn_row_(theTableView, theCell, theTableColumn, theRow)
if ((theTableColumn's |identifier|()) as string) is "compoundPublicationNameAndAdSize" then
set theUnformattedString to (theCell's stringValue()) as string
if theUnformattedString contains return then
set theFormattedString to current application's NSMutableAttributedString's alloc()'s initWithString_attributes_((paragraph 1 of theUnformattedString), {NSFont:(current application's NSFont's fontWithName_size_("LucidaGrande-Bold", 11))})
tell theFormattedString to appendAttributedString_(current application's NSMutableAttributedString's alloc()'s initWithString_attributes_((current application's NSString's stringWithString_(return & (paragraph 2 of theUnformattedString))'s uppercaseString), {NSFont:(current application's NSFont's fontWithName_size_("LucidaGrande", 8))}))
else
set theFormattedString to current application's NSMutableAttributedString's alloc()'s initWithString_attributes_((theUnformattedString), {NSFont:(current application's NSFont's fontWithName_size_("LucidaGrande-Bold", 11))})
end if
theCell's setObjectValue_(theFormattedString)
end if
end tableView_willDisplayCell_forTableColumn_row_
Although I do not know the impact this will have when i’ll have a few hundred rows in that table… Maybe I’ll have to resort to ObjC then. But so far there is no perceptible impact on speed, and it looks great. The cell’s string contains a return, and this is how it decides how to format the contents. Obviously it can be adapted to a lot of different patterns…
Enjoy!
Browser: Safari 531.22.7
Operating System: Mac OS X (10.6)
And this one formats the cell based on a specific character or string present in the cell’s contents:
on tableView_willDisplayCell_forTableColumn_row_(theTableView, theCell, theTableColumn, theRow)
if ((theTableColumn's |identifier|()) as string) is "compoundOohNameCompany" then
if ((theCell's stringValue()) as string) contains "|" then
set theUnformattedString to current application's NSString's stringWithString_(theCell's stringValue())
set theUnformattedStringElements to (theUnformattedString's (componentsSeparatedByString_(" | ")) as list)
set theFormattedString to current application's NSMutableAttributedString's alloc()'s initWithString_attributes_(current application's NSString's stringWithString_(item 1 of theUnformattedStringElements)'s uppercaseString, {NSFont:(current application's NSFont's fontWithName_size_("LucidaGrande-Bold", 11))})
tell theFormattedString to appendAttributedString_(current application's NSMutableAttributedString's alloc()'s initWithString_attributes_((current application's NSString's stringWithString_(" " & (item 2 of theUnformattedStringElements))), {NSFont:(current application's NSFont's fontWithName_size_("LucidaGrande", 11))}))
else
set theUnformattedString to (theCell's stringValue()) as string
set theFormattedString to current application's NSMutableAttributedString's alloc()'s initWithString_attributes_((theUnformattedString), {NSFont:(current application's NSFont's fontWithName_size_("LucidaGrande-Bold", 11))})
end if
theCell's setObjectValue_(theFormattedString)
end if
end tableView_willDisplayCell_forTableColumn_row_
Browser: Safari 531.22.7
Operating System: Mac OS X (10.6)