// // PreviewController.m // TikZiT // // Copyright 2010 Aleks Kissinger. All rights reserved. // // // This file is part of TikZiT. // // TikZiT is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // TikZiT is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with TikZiT. If not, see . // #import "PreviewController.h" #import "AppDelegate.h" #import "PreambleController.h" #import @implementation PreviewController static PreviewController *preview = nil; - (id)initWithWindowNibName:(NSString*)nib preambleController:(PreambleController*)pc tempDir:(NSString*)dir { [super initWithWindowNibName:nib]; tempDir = [dir copy]; typesetCount = 0; preambleController = pc; latexLock = [[NSLock alloc] init]; return self; } - (void)runLatex:(id)tikz { // Only build one tex file at a time, so we don't get funky results. //[latexLock lock]; [progressIndicator startAnimation:self]; int fnum = typesetCount++; NSString *tex = [NSString stringWithFormat:@"%@%@%@", [preambleController currentPreamble], tikz, [preambleController currentPostamble]]; NSString *texFile = [NSString stringWithFormat:@"%@/tikzit_%d.tex", tempDir, fnum]; NSString *pdfFile = [NSString stringWithFormat:@"%@/tikzit_%d.pdf", tempDir, fnum]; [tex writeToFile:texFile atomically:NO encoding:NSUTF8StringEncoding error:NULL]; // We run pdflatex in a bash shell to have easy access to the setup from unix-land NSTask *latexTask = [[NSTask alloc] init]; [latexTask setCurrentDirectoryPath:tempDir]; [latexTask setLaunchPath:@"/bin/bash"]; // This assumes the user has $PATH set up to find pdflatex in either .profile // or .bashrc. This should be improved to take other path setups into account // and to be customisable. NSString *latexCmd = [NSString stringWithFormat: @"if [ -e ~/.profile ]; then source ~/.profile; fi\n" @"if [ -e ~/.bashrc ]; then source ~/.bashrc; fi\n" @"pdflatex -interaction=nonstopmode -output-format=pdf -halt-on-error '%@'\n", texFile]; //NSLog(@"Telling bash: %@", latexCmd); NSPipe *pout = [NSPipe pipe]; NSPipe *pin = [NSPipe pipe]; [latexTask setStandardOutput:pout]; [latexTask setStandardInput:pin]; NSFileHandle *latexIn = [pin fileHandleForWriting]; NSFileHandle *latexOut = [pout fileHandleForReading]; [latexTask launch]; [latexIn writeData:[latexCmd dataUsingEncoding:NSUTF8StringEncoding]]; [latexIn closeFile]; NSData *data = [latexOut readDataToEndOfFile]; NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; [latexTask waitUntilExit]; if ([latexTask terminationStatus] != 0) { [errorTextView setHidden:YES]; [errorText setString:[@"\nAN ERROR HAS OCCURRED, PDFLATEX SAID:\n\n" stringByAppendingString:str]]; [errorTextView setHidden:NO]; } else { [errorText setString:@""]; [errorTextView setHidden:YES]; data = [NSData dataWithContentsOfFile:pdfFile]; PDFDocument *doc = [[PDFDocument alloc] initWithData:data]; // pad the PDF by a couple of pixels if ([doc pageCount] >= 1) { PDFPage *page = [doc pageAtIndex:0]; NSRect box = [page boundsForBox:kPDFDisplayBoxCropBox]; box.origin.x -= 2.0f; box.origin.y -= 2.0f; box.size.width += 4.0f; box.size.height += 4.0f; [page setBounds:box forBox:kPDFDisplayBoxCropBox]; [page setBounds:box forBox:kPDFDisplayBoxMediaBox]; } [pdfView setDocument:doc]; } [progressIndicator stopAnimation:self]; //[latexLock unlock]; } - (void)buildTikz:(NSString*)tikz { // Build on a separate thread to keep the interface responsive. [NSThread detachNewThreadSelector:@selector(runLatex:) toTarget:self withObject:tikz]; } + (void)setDefaultPreviewController:(PreviewController*)pc { preview = pc; } + (PreviewController*)defaultPreviewController { return preview; } @end