Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSTextView - using initWithHTML with tables

I'm trying to format some text in NSTextView to be placed in a single line with black background. One piece of text needs to be left aligned, the other piece (but still in the same line) needs to be centered.

NSString *header = [NSString stringWithFormat:
        @""
            "<table style=\"width: 100%; background: black; "
            "color: white; font-family: Arial; "
            "font-size: 16px;\"><tr><td>"
                "1. zadatak"
            "</td><td align=\"center\" width=\"100%\">"
            ""
                "%@"
            ""
            "</td></tr></table>"
        "", [self.problemname.stringValue uppercaseString]];

Unfortunately, no matter what width I specify, NSTextView appears to ignore the table width.

Any workarounds, different approaches, or other suggestions?


More info on the background of the problem.

I've written an app for writing tasks for programming contests. Each task author submits content in different format, so getting them to standardize it in a simple bundle would be of great benefit.

I need this for a printing module. I'm taking several NSTextViews and stitching them together.

These contests have the following document formatting which we're supposed to follow - Example PDF (GoogleDocs) :

Contest header
+------------------------------------------------+
| 1st Task           TITLE             20 points |
+------------------------------------------------+

Introductory text here.


                    Input

Explanation of input data


                   Output

Explanation of output data


                   Sample Data

Input:       | Input:
abcd         | bcde
             |
Output:      | Output:
efgh         | fghi
             |
More info:   |
info text    |
like image 983
Ivan Vučica Avatar asked May 11 '26 20:05

Ivan Vučica


1 Answers

Modification of Apple's sample code for programmatically adding tables to NSAttributedString:

- (NSMutableAttributedString *) printTitleTableAttributedString
{
    NSMutableAttributedString *tableString = [[NSMutableAttributedString alloc] initWithString:@"\n\n"];
    NSTextTable *table = [[NSTextTable alloc] init];
    [table setNumberOfColumns:3];

    [tableString appendAttributedString:[self printTitleTableCellAttributedStringWithString:@"1. zadatak\n"
                                                                                      table:table
                                                                              textAlignment:NSLeftTextAlignment
                                                                                        row:0
                                                                                     column:0]];

    [tableString appendAttributedString:[self printTitleTableCellAttributedStringWithString:[self.problemname.stringValue stringByAppendingString:@"\n"]
                                                                                      table:table
                                                                              textAlignment:NSCenterTextAlignment
                                                                                        row:0
                                                                                     column:1]];

    [tableString appendAttributedString:[self printTitleTableCellAttributedStringWithString:@"20 bodova\n"
                                                                                      table:table
                                                                              textAlignment:NSRightTextAlignment
                                                                                        row:0
                                                                                     column:2]];
    [table release];
    return [tableString autorelease];
}



- (NSMutableAttributedString *) printTitleTableCellAttributedStringWithString:(NSString *)string
                                                                        table:(NSTextTable *)table
                                                                textAlignment:(NSTextAlignment)textAlignment
                                                                          row:(int)row
                                                                       column:(int)column
{
    NSColor *backgroundColor = [NSColor colorWithCalibratedRed:0 
                                                         green:0 
                                                          blue:0x80/255. 
                                                         alpha:0xFF];;
    NSColor *borderColor = [NSColor whiteColor];


    NSTextTableBlock *block = [[NSTextTableBlock alloc]
                               initWithTable:table
                               startingRow:row
                               rowSpan:1
                               startingColumn:column
                               columnSpan:1];
    [block setBackgroundColor:backgroundColor];
    [block setBorderColor:borderColor];
    [block setWidth:0.0 type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder];
    [block setWidth:2.0 type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding];

    NSMutableParagraphStyle *paragraphStyle =
    [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [paragraphStyle setTextBlocks:[NSArray arrayWithObjects:block, nil]];
    [paragraphStyle setAlignment:textAlignment];
    [block release];

    NSMutableAttributedString *cellString =
    [[NSMutableAttributedString alloc] initWithString:string];
    [cellString addAttribute:NSParagraphStyleAttributeName
                       value:paragraphStyle
                       range:NSMakeRange(0, [cellString length])];
    [cellString addAttribute:NSForegroundColorAttributeName
                       value:[NSColor whiteColor]
                       range:NSMakeRange(0, [cellString length])];
    [paragraphStyle release];

    return [cellString autorelease];
}

Then I just append it into the textview:

[printText.textStorage setAttributedString:[self printTitleTableAttributedString]];
like image 57
Ivan Vučica Avatar answered May 13 '26 10:05

Ivan Vučica