Une NSView offscreen et impression

02:06 modifié dans API AppKit #1
Probleme :
Je crée une NSView offscreen pour imprimer le contenu d'une NSTableView sur plusieurs pages. Je calculele nombre de pages necessaires et crée la NSView à  la taille voulu, puis je remplie une seconde NSView qui est le modèle d'impression; une fois fait je l'ajoute à  la bonne position à  la NSCiew prélablement crée. Seule la dernière view est visible, les précédentes semble être effacé au fur et  mesure que j ajouite des sous vue?  queqlqu'un connait-il se probleme et sa solution?
voici mon code :

- (IBAction)printList:(id)sender
{
int nbLine;
[self applyPrintList:nil];
if ([plCBGrid state]==NSOnState)
{
[plTableView setGridStyleMask:NSTableViewSolidHorizontalGridLineMask+NSTableViewSolidVerticalGridLineMask ];
}
else
[plTableView setGridStyleMask:NSTableViewGridNone];
int i,j,index,nbMaxPage,numPage;
BOOL displayPanel=YES;
[self buildTableView:plTableView];
[plVersion setStringValue:[self readFromLocalize:@Version]];
NSPrintInfo *printInfo=[NSPrintInfo sharedPrintInfo];
[printInfo setLeftMargin:0];
[printInfo setRightMargin:0];
[printInfo setTopMargin:0];
[printInfo setBottomMargin:0];
[printInfo setJobDisposition:NSPrintSaveJob];
if (self readFromLocalize:@&quot;Pays&quot;] isEqualToString:@&quot;Country&quot;])<br /> nbLine=30;<br /> else<br /> nbLine=31;<br /> [printInfo setOrientation:NSPortraitOrientation];<br /> [plFilmFound setIntValue:[[listTableView dataArray] count;
nbMaxPage=([[listTableView dataArray] count]/nbLine);
if ((listTableView dataArray] count]-(nbMaxPage*nbLine))&gt;0)<br /> nbMaxPage++;<br /> numPage=0;<br /> NSCalendarDate *today = [NSCalendarDate calendarDate];<br /> [plDate setStringValue:[today descriptionWithCalendarFormat:@&quot;%d/%m/%Y&quot;;
if (![searchCriteria isEqualToString:@";"])
[plCriteria setStringValue:searchCriteria];
else
{
NSString *criteria=[NSString stringWithString:listSearchDVDfield cell] placeholderString;
criteria=[criteria stringByAppendingString:@ = ];
criteria=[criteria stringByAppendingString:[listSearchDVDfield stringValue]];
[plCriteria setStringValue:criteria];
}
NSRect aFrame=[plWindow frame];
NSRect drawFrame=aFrame;
aFrame.size.height=aFrame.size.height*nbMaxPage;
NSView *printView=NSView alloc] initWithFrame:aFrame];<br /> [printView setBounds:aFrame];<br /> for (i=0;i!=nbMaxPage;i++)<br /> {<br /> numPage++;<br /> [plPage setStringValue:[[NSNumber numberWithInt:numPage] stringValue;
NSMutableArray *listArray=[NSMutableArray arrayWithCapacity:nbLine];
for (j=0;j<(nbLine+1);j++)
{
index=((numPage-1)*nbLine)+j;
if (index<=listTableView dataArray] count]-1)<br /> [listArray addObject:[[listTableView dataArray] objectAtIndex:index;
}
[plTableViewContent setArray:listArray];
[plTableView reloadData];
drawFrame.origin.y=drawFrame.size.height*(nbMaxPage-i-1);
NSView *tempView=NSView alloc] initWithFrame:[plWindow frame;
[tempView addSubview:plWindow];
[tempView setFrameOrigin:drawFrame.origin];
[tempView setNeedsDisplay:YES];
[printView addSubview:tempView];
[printView setFrameOrigin:drawFrame.origin];
[printView setNeedsDisplay:YES];
[tempView release];
}
NSPrintOperation *printOp=[NSPrintOperation printOperationWithView:printView printInfo:printInfo];
[printOp setShowPanels:displayPanel];
printInfo=[printOp printInfo];
[printOp runOperation];
[printView release];
}

Réponses

  • BruBru Membre
    02:06 modifié #2
    C'est difficile à  décortiquer ton code (il manque l'essentiel des variables d'instance par exemple).

    Tu mélanges pas mal de "frame" dont les système de coordonnées semblent différents. Je pense que tes subviews sont les unes sur les autres ce qui fait que seule la dernière ajoutée est visible.

    En tout cas, la méthode que tu utilises ne me semble pas la plus simple.

    .
  • 02:06 modifié #3
    L important c est le principe.
    En fait je suis sûr que les views ne se sont pas les unes sur les autres, si tu mets la partie impression dans la boucle plutot qu'en fin de boucle, chaques pages est bien à  sa bonne position dans la Offline NSView, mais seule la dernière ajoutée est remplie, les autres sont éffcées au fur et à  mesure.
    Chaque NSView rajoutée, a son frame calculé pour être correctement positionné dans la offiline NSView. Cette partie du code fonctionne bien.
  • BruBru Membre
    02:06 modifié #4
    D'où vient plWindow ? Car la ligne suivante, je la sens pas pour le moment :

    dans 1101193029:

    NSView *tempView=NSView alloc] initWithFrame:[plWindow frame;
    [tempView addSubview:plWindow];


    .
  • 02:06 modifié #5
    plWindow c est la view qui sert de modèle et je te rassure elle est bien existante, et cest avec elle que je remplis les champs à  imprimer
  • Eddy58Eddy58 Membre
    02:06 modifié #6
    Sur www.cocoaprogramming.net, les exemples du bouquin sont téléchargeables, et si ca peut aider, le chapitre 25 comporte des exemples sur l'impression, avec un projet demo sur la pagination. :)
  • 02:06 modifié #7
    Salut,

    j'ai enfin compris le problème (il était temps... :)
    Il est du fait que la NSView qui me sert de modèle d'impression est construite dans IB et quand on fait un addSubview dans une autre NSView (la offline) on ne fait pas une copie du contenu du modèle mais seulement du pointeur sur le modèle.
    La solution est de ne plus passer par IB mais de créer une sous-classe de NSView, de suclassr la methode drawRect dans laquelle il faut recréer le contenu de la nsview par des NSViews *aView=[[NSView alloc] initWithFrame:NSMakeRect(.,.,.,.)] et des [self addSubview:aView] jusqu'à  avoir recrée la page d'impression désirée.
Connectez-vous ou Inscrivez-vous pour répondre.