[TRUKéASTUCE] Imprimer une NSTableView (contenu et entête).

BruBru Membre
L'impression d'une NSTableView via la méthode print: n'imprime pas les entêtes de colonnes.

Voici une petite fonction C qui imprimera aussi ces entêtes :
<br />void PrintTableView(NSTableView *tb)<br />{<br />    NSImage *i;<br />    NSImageView *iv;<br /><br />    // création d&#39;une image qui contiendra les entêtes de colonnes et la NSTaleView.<br />    i=[[[NSImage alloc] initWithSize:<br />            NSMakeSize([tb frame].size.width,<br />                [[tb headerView] frame].size.height+[tb frame].size.height)]<br />                autorelease];<br /><br />    // début du dessin de l&#39;image.<br />    [i lockFocus];<br /><br />    // dessin de l&#39;image des entêtes de colonnes.<br />    [[[[NSImage alloc] initWithData:[[tb headerView] dataWithPDFInsideRect:<br />            [[tb headerView] bounds]]] autorelease]<br />            compositeToPoint:NSMakePoint(0, [tb frame].size.height)<br />            operation:NSCompositeCopy];<br /><br />    // dessin de l&#39;image du contenu de la NSTableView.<br />    [[[[NSImage alloc] initWithData:[tb dataWithPDFInsideRect:<br />            [tb bounds]]] autorelease]<br />            compositeToPoint:NSMakePoint(0, 0)<br />            operation:NSCompositeCopy];<br /><br />    // dessin d&#39;un cadre de couleur noir autour.<br />    [[NSColor blackColor] set];<br />    NSFrameRect(NSMakeRect(0, 0, [i size].width, [i size].height));<br />    [i unlockFocus];<br /><br />    // impression de la NSImageView contenant le dessin de la NSTableView.<br />    iv=[[[NSImageView alloc] initWithFrame:[tb bounds]] autorelease];<br />    [iv setImage:i];<br />    [iv print:nil];<br />}


Il suffit d'appeler la fonction comme ceci :
<br />- (IBAction)imprimer:(id)sender<br />{<br />    PrintTableView(tb);<br />}


Le principe utilisé ici est de "dessiner" l'image de la NSTableView (contenu) et de sa NSHeaderView (entête de colonnes) dans une instance de NSImage. Ensuite, cette image est attachée à  une NSImageView qui servira pour l'impression.

Note : le problème de la pagination n'est pas résolue (une ligne de la table peut être à  cheval entre 2 pages). Ce problème fera l'objet d'un TRUKéASTUCE ultérieur.

Réponses

  • VeillardVeillard Membre
    03:36 modifié #2
    Voilà  quelque chose qui m'intéresse énormément  :brule:

    Merci pour l'info

    A+
  • VeillardVeillard Membre
    03:36 modifié #3
    Note : le problème de la pagination n'est pas résolue (une ligne de la table peut être à  cheval entre 2 pages). Ce problème fera l'objet d'un TRUKéASTUCE ultérieur.


    La réponse se trouve dans le thread :
    http://www.objective-cocoa.org/forum/index.php?topic=264.0

    et ça marche ! 
  • GercofisGercofis Membre
    03:36 modifié #4
    j'ai modifié comme suit du coup j'ai 2 impressions la première en mode page et 2ème en mode paysage si celui-ci est séléectionné, mon tableau étant plutot assez large le mode page est un peu obligatoire ou donc ai je faux ?

    NSPrintInfo *printInfo = [self printInfo];
    // NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:tableView printInfo:printInfo];
    NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:iv printInfo:printInfo];
    [printOp setShowPanels:flag];
    [printOp runOperation];
  • BruBru Membre
    03:36 modifié #5
    Je ne comprends pas trop ton post/question...

    Qu'as tu modifié ?

    .
  • Eddy58Eddy58 Membre
    03:36 modifié #6
    dans 1105973524:

    Je ne comprends pas trop ton post/question...

    Qu'as tu modifié ?

    .


    Gercofis se demande à  mon avis, son tableau étant à  première vue très large, comment ça se passe côté programmation, est-ce que ça va se régler tout seul, ou alors faut-il spécifier l'impression en mode paysage pour que le tableau s'imprime entièrement.... :o
  • fouffouf Membre
    03:36 modifié #7
    dans 1105987483:


    Gercofis se demande à  mon avis, son tableau étant à  première vue très large, comment ça se passe côté programmation, est-ce que ça va se régler tout seul, ou alors faut-il spécifier l'impression en mode paysage pour que le tableau s'imprime entièrement.... :o


    Gercofis, tu peux rajouter a ton code :

    <br />[printOp setOrientation:NSLandscapeOrientation];<br />
    
  • VeillardVeillard Membre
    03:36 modifié #8
    Normalement avec "Page setup" on peut facilement passer de l'un à  l'autre sans rajouter
    [printOp setOrientation:NSLandscapeOrientation];
    
  • GercofisGercofis Membre
    03:36 modifié #9
    dans 1105973524:

    Je ne comprends pas trop ton post/question...
    Qu'as tu modifié ?

    je n'avais pas vu vos réponses logiquement je dois recevoir un avertissement ?

    bref pour faire vite j'ai rajouter ça :
    NSPrintInfo *printInfo = [self printInfo];
    NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:iv printInfo:printInfo];
        [printOp setShowPanels:flag];
        [printOp runOperation];

    tres franchement je n'y ai pas réfléchi d'avantage, j'ai vu une autre solution...
    je suis un peu confus de n'avoir vu vos réponses, mais bon....  :o
Connectez-vous ou Inscrivez-vous pour répondre.