Une NSView offscreen et impression
SpiderIncognito
Membre
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:@"Pays"] isEqualToString:@"Country"])<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))>0)<br /> nbMaxPage++;<br /> numPage=0;<br /> NSCalendarDate *today = [NSCalendarDate calendarDate];<br /> [plDate setStringValue:[today descriptionWithCalendarFormat:@"%d/%m/%Y";
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];
}
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:@"Pays"] isEqualToString:@"Country"])<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))>0)<br /> nbMaxPage++;<br /> numPage=0;<br /> NSCalendarDate *today = [NSCalendarDate calendarDate];<br /> [plDate setStringValue:[today descriptionWithCalendarFormat:@"%d/%m/%Y";
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];
}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
.
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.
.
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.