Initial release of Maemo 5 port of gnuplot
[gnuplot] / src / NeXT / GnuView.m
diff --git a/src/NeXT/GnuView.m b/src/NeXT/GnuView.m
new file mode 100644 (file)
index 0000000..c6621f0
--- /dev/null
@@ -0,0 +1,128 @@
+#import "GnuView.h"
+
+
+@implementation GnuView
+
+static NXCoord xsize= NEXT_XMAX;
+static NXCoord ysize= NEXT_YMAX;
+
+static int printing;
+static void setprintsize();
+
+- initFrame: (NXRect *)rects
+{
+    [super initFrame:rects];
+
+       PSstring = NULL;
+       [self display];
+
+       return self;
+}
+
+
+       /* This is here to fix NeXT bug # 21973:  failure to free D.O. memory */
+       /* Note:  personally I don't think this fixes it. */
+- free
+{
+       if (PSstring) free(PSstring);
+       [super free];
+
+       return self;
+
+}
+
+- executePS:(char *) PStext
+{
+       if (PSstring) free(PSstring);
+       PSstring = PStext;
+
+       [window makeKeyAndOrderFront:self];
+
+       [self display];
+
+       return self;
+}
+
+
+- drawSelf:(const NXRect *) rects : (int) rectCount
+{
+    DPSContext d;
+
+    d = DPSGetCurrentContext();
+
+       if (!printing) {
+                                                       /* Clear Screen */
+               PSsetgray(NX_WHITE);
+               NXRectFill(&bounds);
+                                                       /* scale to gnuplot coords */
+               [self setDrawSize:xsize:ysize];
+       }
+       else {
+               setprintsize();
+       }
+
+       if (PSstring) DPSWritePostScript(d, PSstring, strlen(PSstring));
+
+    DPSFlushContext(d);
+
+       return self;
+}
+
+
+- printPSCode: sender
+{
+       printing = 1;
+       [super printPSCode:sender];
+       printing = 0;
+
+       return self;
+}
+
+static void setprintsize()
+{
+       DPSContext d;
+       NXRect *paperRect;
+       float width, height;
+       id prInfo;
+       float xscale, yscale;
+
+    d = DPSGetCurrentContext();
+       prInfo = [NXApp printInfo];
+       paperRect = (NXRect *) [prInfo paperRect];
+
+       width = paperRect->size.width;
+       height = paperRect->size.height;
+
+                                                       /* Leave margins on paper */
+
+       DPSPrintf(d, "grestore\ngrestore\ngrestore\n");
+
+
+       if ([prInfo orientation] == NX_LANDSCAPE) {
+               DPSPrintf(d, "-90 rotate\n");
+               DPSPrintf(d, "%g 0 translate\n", -1 * paperRect->size.width);
+               DPSPrintf(d, "0 %g translate\n", paperRect->size.height/100);
+
+               xscale = width/NEXT_XMAX*0.95;
+               yscale = height/NEXT_YMAX*0.9;
+               DPSPrintf(d, "%g %g scale\n", xscale, yscale);
+       }
+       else {
+               xscale = width/NEXT_XMAX*0.95;
+               yscale = height/NEXT_YMAX*0.95;
+               DPSPrintf(d, "%g %g scale\n", xscale, yscale);
+               DPSPrintf(d, "0 %g translate\n", paperRect->size.height/100);
+       }
+
+       DPSPrintf(d, "gsave\ngsave\n");
+
+    DPSFlushContext(d);
+
+       return;
+}
+
+
+
+@end
+
+