summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--src/PSEditWidget.H20
-rw-r--r--src/PSEditWidget.cxx254
-rw-r--r--src/PSEditor.H48
-rw-r--r--src/PSEditor.cxx154
-rw-r--r--src/Postscript.cxx60
-rw-r--r--src/flpsed.cxx63
7 files changed, 303 insertions, 298 deletions
diff --git a/Makefile b/Makefile
index 8dff5ce..b61ed76 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
CFLAGS=-I/usr/X11R6/include -g
CC=c++
-OBJECTS=GsWidget.o PSEditWidget.o flpsed.o
+OBJECTS=GsWidget.o PSEditWidget.o PSEditor.o Postscript.o flpsed.o
%.o: %.cxx
$(CC) -c $(CFLAGS) $*.cxx
diff --git a/src/PSEditWidget.H b/src/PSEditWidget.H
index bf2592c..04f72dd 100644
--- a/src/PSEditWidget.H
+++ b/src/PSEditWidget.H
@@ -1,5 +1,5 @@
//
-// "$Id: PSEditWidget.H,v 1.5 2004/06/25 17:25:17 hofmann Exp $"
+// "$Id: PSEditWidget.H,v 1.6 2004/07/09 17:22:55 hofmann Exp $"
//
// X11 header file for the Fast Light Tool Kit (FLTK).
//
@@ -30,12 +30,9 @@ class PSText;
class PSEditWidget : public GsWidget {
private:
- int mark_x, mark_y;
PSText **text;
int max_pages;
- int tmp_fd;
int cur_size;
- int mod, loaded;
protected:
void clear_text();
@@ -56,15 +53,12 @@ public:
int ps_to_display_y(int y1);
int ps_x(int x1);
int ps_y(int y1);
- int load(char *f);
int reload();
- void to_ps(FILE *f, int p);
- int save(const char* savefile);
void set_cur_size(int s);
void set_size(int s);
int get_size();
- int modified();
- int file_loaded();
+ int get_max_pages();
+ PSText * get_text(int p);
};
@@ -85,9 +79,13 @@ public:
void move(int x1, int y1);
void append(PSText *g);
PSText *get_match(int x1, int y1);
+ char *get_text();
+ int get_size();
+ PSText *get_next();
+ Fl_Color get_color();
+ int get_x();
+ int get_y();
void draw(int off_x,int off_y);
- void string_to_ps(FILE *f, char *s);
- void to_ps(FILE *f);
};
#endif
diff --git a/src/PSEditWidget.cxx b/src/PSEditWidget.cxx
index ba7cc54..013a94e 100644
--- a/src/PSEditWidget.cxx
+++ b/src/PSEditWidget.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: PSEditWidget.cxx,v 1.13 2004/07/07 17:17:54 hofmann Exp $"
+// "$Id: PSEditWidget.cxx,v 1.14 2004/07/09 17:22:55 hofmann Exp $"
//
// PSEditWidget routines.
//
@@ -37,53 +37,6 @@
#include "PSEditWidget.H"
-#define PS_POS_FORMAT "newpath %d %d moveto %% PSEditWidget\n"
-#define PS_TEXT_FORMAT "(%s) show %% PSEditWidget\n"
-#define PS_FONT_SIZE_FORMAT "/HelveticaNeue-Roman findfont %d scalefont setfont %% PSEditWidget\n"
-#define PS_GLYPH_FORMAT "/%s glyphshow %% PSEditWidget\n"
-
-static struct {
- const char *glyph;
- const char *c;
-} glyph_char[] = {
- {"adieresis", "ä"},
- {"Adieresis", "Ä"},
- {"odieresis", "ö"},
- {"Odieresis", "Ö"},
- {"udieresis", "ü"},
- {"Udieresis", "Ü"},
- {"germandbls", "ß"},
- {"parenleft", "("},
- {"parenright", ")"},
- {"backslash", "\\"},
- {NULL, NULL}};
-
-static const char * glyph_to_char(char *glyph) {
- int i=0;
-
- while(glyph_char[i].glyph != NULL) {
- if (strcmp(glyph_char[i].glyph, glyph) == 0) {
- return glyph_char[i].c;
- }
- i++;
- }
-
- return NULL;
-}
-
-static const char * char_to_glyph(char *c) {
- int i=0;
-
- while(glyph_char[i].glyph != NULL) {
- if (strncmp(glyph_char[i].c, c, 1) == 0) {
- return glyph_char[i].glyph;
- }
- i++;
- }
-
- return NULL;
-}
-
void PSEditWidget::clear_text() {
cur_text = NULL;
for (int i = 0; i < max_pages; i++) {
@@ -109,8 +62,6 @@ PSEditWidget::PSEditWidget(int X,int Y,int W, int H) : GsWidget(X, Y, W, H) {
}
cur_text = NULL;
cur_size = 12;
- mod = 0;
- loaded = 0;
}
int PSEditWidget::next() {
@@ -133,7 +84,6 @@ void PSEditWidget::new_text(int x1, int y1, const char *s, int p) {
text[p] = cur_text;
}
redraw();
- mod = 1;
}
void PSEditWidget::new_text(int x1, int y1, const char *s) {
@@ -154,7 +104,6 @@ int PSEditWidget::set_cur_text(int x1, int y1) {
void PSEditWidget::append_text(const char *s) {
if (cur_text && s) {
cur_text->append_text(s);
- mod = 1;
redraw();
}
}
@@ -162,7 +111,6 @@ void PSEditWidget::append_text(const char *s) {
void PSEditWidget::move(int x1, int y1) {
if (cur_text) {
cur_text->move(x1, y1);
- mod = 1;
redraw();
}
}
@@ -170,7 +118,6 @@ void PSEditWidget::move(int x1, int y1) {
void PSEditWidget::rm_char() {
if (cur_text) {
cur_text->rm_char();
- mod = 1;
redraw();
}
}
@@ -196,141 +143,6 @@ int PSEditWidget::reload() {
return GsWidget::reload();
}
-int PSEditWidget::load(char *f) {
- FILE *fp = fopen(f, "r");
- char tmpname[256];
- char linebuf[1024];
- int p = 1;
- int x1, y1;
- char *s, *e, glyph[1024];
- int size, ret;
-
- strncpy(tmpname, "/tmp/PSEditWidgetXXXXXX", 256);
- tmp_fd = mkstemp(tmpname);
- if (tmp_fd < 0) {
- fprintf(stderr, "Could not create temporary file (errno %d).\n", errno);
- return 1;
- }
- unlink(tmpname);
-
- clear_text();
-
- while (fgets(linebuf, 1024, fp) != NULL) {
-
- if (strcmp(linebuf, "showpage\n") == 0) {
- p++;
- }
-
- if (strstr(linebuf, "% PSEditWidget")) {
- if (sscanf(linebuf, PS_FONT_SIZE_FORMAT, &size) == 1) {
- set_cur_size(size);
- } else if (sscanf(linebuf, PS_POS_FORMAT, &x1, &y1) == 2) {
- new_text(ps_to_display_x(x1), ps_to_display_y(y1), "", p);
- } else if (sscanf(linebuf, PS_GLYPH_FORMAT, glyph) == 1) {
- fprintf(stderr, "GLYPH %s\n", glyph);
- append_text(glyph_to_char(glyph));
- } else if ((s = strchr(linebuf, '(')) &&
- (e = strrchr(linebuf, ')'))) {
- *e = '\0';
- s++;
- append_text(s);
- }
- } else {
- ret = write(tmp_fd, linebuf, strlen(linebuf));
- if (ret != strlen(linebuf)) {
- fprintf(stderr, "Error while writing to temporary file\n");
- }
- }
- }
- fclose(fp);
- lseek(tmp_fd, 0L, SEEK_SET);
-
- mod = 0;
- loaded = 1;
- return GsWidget::load(tmp_fd);
-}
-
-void PSEditWidget::to_ps(FILE *f, int p) {
- if (!text[p]) {
- return;
- }
- fprintf(f, "dup %d eq {\n", p);
- text[p]->to_ps(f);
- fprintf(f, "} if\n");
-}
-
-#define PS_HEADER_L2 "%% Begin PSEditWidget\n" \
-"/PSEditWidgetPageCount 0 def\n" \
-"<< /EndPage {\n" \
-"pop\n" \
-"PSEditWidgetPageCount 0 eq { %% if PSEditWidgetPageCount is undefined,\n" \
-"1 add %% use showpage counter instead.\n" \
-"} {\n" \
-"PSEditWidgetPageCount\n" \
-"} ifelse\n"
-
-
-#define PS_TRAILER_L2 "true } >> setpagedevice\n" \
-"%% End PSEditWidget\n"
-
-#define PS_HEADER_L1 "%% Begin PSEditWidget\n" \
-"/PSEditWidgetPageCount 0 def\n" \
-"/PSEditWidgetPC 0 def\n" \
-"/PSEditWidgetshowpage /showpage load def\n" \
-"/showpage {\n" \
-"PSEditWidgetPageCount 0 eq { %% if PSEditWidgetPageCount is undefined,\n" \
-"/PSEditWidgetPC PSEditWidgetPC 1 add def PSEditWidgetPC\n" \
-"} {\n" \
-"PSEditWidgetPageCount\n" \
-"} ifelse\n"
-
-#define PS_TRAILER_L1 "PSEditWidgetshowpage} def\n" \
-"%% End PSEditWidget\n"
-
-int PSEditWidget::save(const char* savefile) {
- if (!file_loaded()) {
- return 1;
- }
- FILE *fp = fdopen(tmp_fd, "r");
- rewind(fp);
- FILE *sfp = fopen(savefile, "w");
- char linebuf[1024];
- int done=0, page = 1;
-
- while (fgets(linebuf, 1024, fp) != NULL) {
- if (!done && strncmp(linebuf, "%%EndSetup", 10) == 0) {
- done++;
-
- fprintf(sfp, PS_HEADER_L1);
-
- for (int i=1;i<max_pages;i++) {
- to_ps(sfp, i);
- }
-
- fprintf(sfp, PS_TRAILER_L1);
-
- }
-
- fprintf(sfp, "%s", linebuf);
-
- if (strncmp(linebuf, "%%Page:", 7) == 0) {
- fprintf(sfp, "/PSEditWidgetPageCount %d def %% PSEditWidget\n", page++);
- }
- }
-
- fclose(sfp);
- mod = 0;
- return 0;
-}
-
-int PSEditWidget::modified() {
- return mod;
-}
-
-int PSEditWidget::file_loaded() {
- return loaded;
-}
-
void PSEditWidget::set_cur_size(int s) {
cur_size = s;
}
@@ -352,6 +164,18 @@ int PSEditWidget::get_size() {
}
+int PSEditWidget::get_max_pages() {
+ return max_pages;
+}
+
+PSText *PSEditWidget::get_text(int p) {
+ if (p >= max_pages) {
+ return 0;
+ } else {
+ return text[p];
+ }
+}
+
PSText::PSText(PSEditWidget *g, int x1, int y1, const char *s1, int size1) {
@@ -429,42 +253,26 @@ void PSText::draw(int off_x,int off_y) {
}
}
-void PSText::string_to_ps(FILE *f, char *s) {
- const char *glyph;
-
- if (strlen(s) == 0) {
- return;
- } else if ((glyph = char_to_glyph(s)) != NULL) {
- fprintf(f, PS_GLYPH_FORMAT, glyph);
- string_to_ps(f, &(s[1]));
- return;
- } else {
- for(int i=0; i<strlen(s); i++) {
- if ((glyph = char_to_glyph(&(s[i]))) != NULL) {
- char *s1 = strdup(s);
- s1[i] = '\0';
- fprintf(f, PS_TEXT_FORMAT, s1);
- free(s1);
- string_to_ps(f, &(s[i]));
- return;
- }
- }
- fprintf(f, PS_TEXT_FORMAT, s);
- }
- return;
+char *PSText::get_text() {
+ return s;
}
-
-void PSText::to_ps(FILE *f) {
- if (strcmp(s, "") != 0) {
- fprintf(f, PS_FONT_SIZE_FORMAT, size);
- fprintf(f, PS_POS_FORMAT, gsew->ps_x(x), gsew->ps_y(y));
- string_to_ps(f, s);
- }
-
- if (next) {
- next->to_ps(f);
- }
+
+int PSText::get_size() {
+ return size;
}
+Fl_Color PSText::get_color() {
+ return c;
+}
+PSText* PSText::get_next() {
+ return next;
+}
+int PSText::get_x() {
+ return x;
+}
+
+int PSText::get_y() {
+ return y;
+}
diff --git a/src/PSEditor.H b/src/PSEditor.H
new file mode 100644
index 0000000..3c6c8f5
--- /dev/null
+++ b/src/PSEditor.H
@@ -0,0 +1,48 @@
+//
+// "$Id: PSEditor.H,v 1.1 2004/07/09 17:22:55 hofmann Exp $"
+//
+// X11 header file for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2004 by Johannes Hofmann
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library 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
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+
+#ifndef PSEDITOR_H
+#define PSEDITOR_H
+
+#include "PSEditWidget.H"
+
+class PSEditor : public PSEditWidget {
+ private:
+ int mark_x, mark_y;
+ int loaded;
+ int mod;
+ int tmp_fd;
+
+ int handle(int event);
+
+public:
+ PSEditor(int X,int Y,int W, int H);
+ int load(char *f);
+ int save(const char* savefile);
+ int modified();
+ int file_loaded();
+};
+
+
+
+#endif
diff --git a/src/PSEditor.cxx b/src/PSEditor.cxx
new file mode 100644
index 0000000..db501fd
--- /dev/null
+++ b/src/PSEditor.cxx
@@ -0,0 +1,154 @@
+//
+// "$Id: PSEditor.cxx,v 1.1 2004/07/09 17:22:55 hofmann Exp $"
+//
+// PSEditor routines.
+//
+// Copyright 2004 by Johannes Hofmann
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library 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
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+
+#include <errno.h>
+#include <FL/fl_ask.H>
+#include "PSEditor.H"
+#include "Postscript.H"
+
+PSEditor::PSEditor(int X,int Y,int W, int H) : PSEditWidget(X, Y, W, H) {
+ loaded = 0;
+ mod = 0;
+}
+
+int PSEditor::handle(int event) {
+ switch(event) {
+ case FL_PUSH:
+ if (!file_loaded()) {
+ fl_beep();
+ return 0;
+ }
+
+ mark_x = Fl::event_x()-x();
+ mark_y = Fl::event_y()-y();
+
+ if (!set_cur_text(mark_x, mark_y) == 0) {
+ new_text(mark_x, mark_y, "");
+ mod++;
+ }
+
+ Fl::focus(this);
+ return 1;
+ case FL_DRAG:
+ move(Fl::event_x()-x(), Fl::event_y()-y());
+ mod++;
+ return 1;
+ case FL_KEYBOARD:
+ {
+ int del;
+ int key = Fl::event_key();
+ if (key == FL_BackSpace) {
+ rm_char();
+ mod++;
+ } else if (Fl::compose(del)) {
+ if (del > 0) {
+ for (int i=0; i<del; i++) rm_char();
+ mod++;
+ }
+ if (Fl::event_length()) {
+ append_text(Fl::event_text());
+ mod++;
+ }
+ } else {
+ return 0;
+ }
+
+ return 1;
+ }
+ case FL_FOCUS:
+ return 1;
+ case FL_UNFOCUS:
+ return 0;
+ }
+ return 0;
+}
+
+
+int PSEditor::modified() {
+ return mod;
+}
+
+int PSEditor::file_loaded() {
+ return loaded;
+}
+
+int PSEditor::load(char *f) {
+ FILE *fp = fopen(f, "r");
+ char tmpname[256];
+ char linebuf[1024];
+ int size, ret, ret1, ret2;
+ PSParser *p1 = new PSParser_1(this);
+ PSParser *p2 = new PSParser_2(this);
+
+ strncpy(tmpname, "/tmp/PSEditorXXXXXX", 256);
+ tmp_fd = mkstemp(tmpname);
+ if (tmp_fd < 0) {
+ fprintf(stderr, "Could not create temporary file (errno %d).\n", errno);
+ return 1;
+ }
+ unlink(tmpname);
+
+ clear_text();
+
+ while (fgets(linebuf, 1024, fp) != NULL) {
+
+ ret1 = p1->parse(linebuf);
+ if (ret1 == 0 || ret1 == 2) {
+ ret2 = p2->parse(linebuf);
+ }
+
+ if (!ret1 && !ret2) {
+ ret = write(tmp_fd, linebuf, strlen(linebuf));
+ if (ret != strlen(linebuf)) {
+ fprintf(stderr, "Error while writing to temporary file\n");
+ }
+ }
+ }
+ fclose(fp);
+ lseek(tmp_fd, 0L, SEEK_SET);
+
+ delete(p1);
+ delete(p2);
+
+ mod = 0;
+ loaded = 1;
+ return GsWidget::load(tmp_fd);
+}
+
+int PSEditor::save(const char* savefile) {
+ if (!file_loaded()) {
+ return 1;
+ }
+ FILE *fp = fdopen(tmp_fd, "r");
+ rewind(fp);
+ FILE *sfp = fopen(savefile, "w");
+ PSWriter *pw = new PSLevel1Writer(this);
+
+ pw->write(fp, sfp);
+
+ delete(pw);
+
+ fclose(sfp);
+ mod = 0;
+ return 0;
+}
diff --git a/src/Postscript.cxx b/src/Postscript.cxx
index 90d7b8c..969e71e 100644
--- a/src/Postscript.cxx
+++ b/src/Postscript.cxx
@@ -1,7 +1,7 @@
//
-// "$Id: Postscript.cxx,v 1.1 2004/07/09 16:13:35 hofmann Exp $"
+// "$Id: Postscript.cxx,v 1.2 2004/07/09 17:22:55 hofmann Exp $"
//
-// PSEditWidget routines.
+// Postscript handling routines.
//
// Copyright 2004 by Johannes Hofmann
//
@@ -22,6 +22,7 @@
//
#include "Postscript.H"
+
#define PS_POS_FORMAT "newpath %d %d moveto %% PSEditWidget\n"
#define PS_TEXT_FORMAT "(%s) show %% PSEditWidget\n"
#define PS_FONT_SIZE_FORMAT "/HelveticaNeue-Roman findfont %d scalefont setfont %% PSEditWidget\n"
@@ -79,6 +80,10 @@ PSParser::PSParser(PSEditWidget *p) {
pse = p;
}
+int PSParser::parse(char *line) {
+ return 0;
+}
+
PSParser_1::PSParser_1(PSEditWidget *p) : PSParser(p) {
page = 1;
}
@@ -210,3 +215,54 @@ int PSWriter::write_text(FILE *out, PSText *t) {
return 0;
}
+
+char * PSWriter::ps_header() {
+ return "";
+}
+
+char * PSWriter::ps_trailer() {
+ return "";
+}
+
+PSLevel1Writer::PSLevel1Writer(PSEditWidget *p) : PSWriter(p) {};
+
+char * PSLevel1Writer::ps_header() {
+ return \
+ "%% Begin PSEditWidget\n" \
+ "/PSEditWidgetPageCount 0 def\n" \
+ "/PSEditWidgetPC 0 def\n" \
+ "/PSEditWidgetshowpage /showpage load def\n" \
+ "/showpage {\n" \
+ "PSEditWidgetPageCount 0 eq { \n" \
+ "/PSEditWidgetPC PSEditWidgetPC 1 add def PSEditWidgetPC\n" \
+ "} {\n" \
+ "PSEditWidgetPageCount\n" \
+ "} ifelse\n";
+}
+
+char * PSLevel1Writer::ps_trailer() {
+ return "PSEditWidgetshowpage} def\n" \
+ "%% End PSEditWidget\n";
+}
+
+
+PSLevel2Writer::PSLevel2Writer(PSEditWidget *p) : PSWriter(p) {};
+
+char * PSLevel2Writer::ps_header() {
+ return \
+ "%% Begin PSEditWidget\n" \
+ "/PSEditWidgetPageCount 0 def\n" \
+ "<< /EndPage {\n" \
+ "pop\n" \
+ "PSEditWidgetPageCount 0 eq { \n" \
+ "1 add %% use showpage counter instead.\n" \
+ "} {\n" \
+ "PSEditWidgetPageCount\n" \
+ "} ifelse\n";
+
+}
+
+char * PSLevel2Writer::ps_trailer() {
+ return "true } >> setpagedevice\n" \
+ "%% End PSEditWidget\n";
+}
diff --git a/src/flpsed.cxx b/src/flpsed.cxx
index 6506185..a0575bf 100644
--- a/src/flpsed.cxx
+++ b/src/flpsed.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: flpsed.cxx,v 1.11 2004/06/29 17:26:20 hofmann Exp $"
+// "$Id: flpsed.cxx,v 1.12 2004/07/09 17:22:55 hofmann Exp $"
//
// flpsed program.
//
@@ -40,66 +40,7 @@
#include <FL/Fl_Menu_Bar.H>
#include <FL/Fl_Menu_Item.H>
-#include "PSEditWidget.H"
-
-class PSEditor : public PSEditWidget {
- int mark_x, mark_y;
-
- int handle(int event) {
- switch(event) {
- case FL_PUSH:
- if (!file_loaded()) {
- fl_beep();
- return 0;
- }
-
- mark_x = Fl::event_x()-x();
- mark_y = Fl::event_y()-y();
-
- if (!set_cur_text(mark_x, mark_y) == 0) {
- new_text(mark_x, mark_y, "");
- }
-
- Fl::focus(this);
- return 1;
- case FL_DRAG:
- move(Fl::event_x()-x(), Fl::event_y()-y());
- return 1;
- case FL_KEYBOARD:
- {
- int del;
- int key = Fl::event_key();
- if (key == FL_BackSpace) {
- rm_char();
- } else if (Fl::compose(del)) {
- if (del > 0) {
- for (int i=0; i<del; i++) rm_char();
- }
- if (Fl::event_length()) {
- append_text(Fl::event_text());
- }
- } else {
- return 0;
- }
-
- return 1;
- }
- case FL_FOCUS:
- return 1;
- case FL_UNFOCUS:
- return 0;
- }
- return 0;
- }
-
-public:
- PSEditor(int X,int Y,int W, int H) : PSEditWidget(X, Y, W, H) {}
-};
-
-
-//
-// Main Program
-//
+#include "PSEditor.H"
PSEditor *gsw_p;