[TRUKéASTUCE] Imprimer une NSTableView (contenu et entête).
Bru
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 :
Il suffit d'appeler la fonction comme ceci :
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.
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'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'image.<br />Â Â [i lockFocus];<br /><br />Â Â // dessin de l'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'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'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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Merci pour l'info
A+
La réponse se trouve dans le thread :
http://www.objective-cocoa.org/forum/index.php?topic=264.0
et ça marche !
NSPrintInfo *printInfo = [self printInfo];
// NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:tableView printInfo:printInfo];
NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:iv printInfo:printInfo];
[printOp setShowPanels:flag];
[printOp runOperation];
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....
Gercofis, tu peux rajouter a ton code :
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....Â