summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <johannes.hofmann@gmx.de>2004-10-21 17:55:36 +0000
committerJohannes Hofmann <johannes.hofmann@gmx.de>2004-10-21 17:55:36 +0000
commit382846248e84c478f713deabbb05a18c1a0d6951 (patch)
treeb58f10daa02582f2040acb00459f665ec655d9cf
parentaa60a0e14a2f186f1b8d282fdc377889a32fada9 (diff)
separated model out from PSEditWidget
separated model out from PSEditWidget
-rw-r--r--Makefile2
-rw-r--r--src/PSEditModel.H62
-rw-r--r--src/PSEditModel.cxx184
-rw-r--r--src/PSEditText.H56
-rw-r--r--src/PSEditText.cxx137
-rw-r--r--src/PSEditWidget.H43
-rw-r--r--src/PSEditWidget.cxx241
-rw-r--r--src/PSEditor.cxx14
-rw-r--r--src/Postscript.H25
-rw-r--r--src/Postscript.cxx28
-rw-r--r--src/flpsed.cxx59
11 files changed, 553 insertions, 298 deletions
diff --git a/Makefile b/Makefile
index 89c7243..227f855 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
CFLAGS=-I/usr/X11R6/include -g -Wall
CC=c++
-OBJECTS=GsWidget.o PSEditWidget.o PSEditor.o Postscript.o flpsed.o
+OBJECTS=GsWidget.o PSEditWidget.o PSEditor.o PSEditText.o PSEditModel.o Postscript.o flpsed.o
%.o: %.cxx
$(CC) -c $(CFLAGS) $*.cxx
diff --git a/src/PSEditModel.H b/src/PSEditModel.H
new file mode 100644
index 0000000..2d3f780
--- /dev/null
+++ b/src/PSEditModel.H
@@ -0,0 +1,62 @@
+//
+// "$Id: PSEditModel.H,v 1.1 2004/10/21 19:55:36 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 PSEditModel_H
+#define PSEditModel_H
+
+#include "PSEditText.H"
+
+class PSEditModel {
+ PSEditText **text;
+ int max_pages;
+ int page;
+ PSEditText *cur_text;
+ float xdpi, ydpi;
+ int paper_x, paper_y;
+
+
+public:
+ PSEditModel(int x1, int y1, float dx, float dy);
+ ~PSEditModel();
+
+ void clear();
+ void new_text(int x1, int y1, const char *s, int size, int p);
+ void append_text(const char *s);
+ void move(int x1, int y1);
+ void rm_char();
+ void set_size(int s);
+ int get_size();
+ void set_page(int p);
+ int get_page();
+ char *get_tag();
+ int set_tag(const char *t);
+ int get_max_pages();
+ int set_cur_text(int x1, int y1, int p);
+ PSEditText *get_text(int p);
+ int ps_to_display_x(int x1);
+ int ps_to_display_y(int y1);
+ int ps_x(int x1);
+ int ps_y(int y1);
+};
+
+#endif
diff --git a/src/PSEditModel.cxx b/src/PSEditModel.cxx
new file mode 100644
index 0000000..9e12d7a
--- /dev/null
+++ b/src/PSEditModel.cxx
@@ -0,0 +1,184 @@
+//
+// "$Id: PSEditModel.cxx,v 1.1 2004/10/21 19:55:36 hofmann Exp $"
+//
+// PSEditWidget 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 <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "PSEditText.H"
+#include "PSEditModel.H"
+
+
+PSEditModel::PSEditModel(int x1, int y1, float dx, float dy) {
+ paper_x = x1;
+ paper_y = y1;
+ xdpi = dx;
+ ydpi = dy;
+ max_pages = 32;
+ text = (PSEditText**) malloc(sizeof(PSEditText*) * max_pages);
+ if (!text) {
+ perror("malloc");
+ exit(1);
+ }
+ for (int i = 0; i < max_pages; i++) {
+ text[i] = NULL;
+ }
+ cur_text = NULL;
+}
+
+void PSEditModel::set_page(int p) {
+ int old_max_pages;
+
+ old_max_pages = max_pages;
+
+ if (p >= max_pages) {
+ max_pages = p + max_pages;
+ text = (PSEditText**) realloc(text, sizeof(PSEditText*) * max_pages);
+ if (!text) {
+ perror("realloc");
+ exit(1);
+ }
+
+ for (int i = old_max_pages; i < max_pages; i++) {
+ text[i] = NULL;
+ }
+ }
+
+ page = p;
+ cur_text = NULL;
+}
+
+void PSEditModel::clear() {
+ cur_text = NULL;
+ for (int i = 0; i < max_pages; i++) {
+ if (text[i]) {
+ delete(text[i]);
+ text[i] = NULL;
+ }
+ }
+}
+
+void PSEditModel::new_text(int x1, int y1, const char *s, int size, int p) {
+ cur_text = new PSEditText(x1, y1, s, size);
+ if (text[p]) {
+ text[p]->append(cur_text);
+ } else {
+ text[p] = cur_text;
+ }
+}
+
+int PSEditModel::set_cur_text(int x1, int y1, int p) {
+ if (p < 0 || p >= max_pages) {
+ return 1;
+ }
+
+ if (text[p]) {
+ cur_text = text[p]->get_match(x1, y1);
+ if (cur_text) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+void PSEditModel::append_text(const char *s) {
+ if (cur_text && s) {
+ cur_text->append_text(s);
+ }
+}
+
+
+void PSEditModel::move(int x1, int y1) {
+ if (cur_text) {
+ cur_text->move(x1, y1);
+ }
+}
+
+
+void PSEditModel::rm_char() {
+ if (cur_text) {
+ cur_text->rm_char();
+ }
+}
+
+
+void PSEditModel::set_size(int s) {
+ if (cur_text) {
+ cur_text->size = s;
+ }
+}
+
+int PSEditModel::get_size() {
+ if (cur_text) {
+ return cur_text->size;
+ } else {
+ return -1;
+ }
+}
+
+
+int PSEditModel::get_max_pages() {
+ return max_pages;
+}
+
+int PSEditModel::set_tag(const char *t) {
+ if (cur_text) {
+ return cur_text->set_tag(t);
+ } else {
+ return 1;
+ }
+}
+
+char *PSEditModel::get_tag() {
+ if (cur_text) {
+ return cur_text->get_tag();
+ } else {
+ return NULL;
+ }
+}
+
+PSEditText *PSEditModel::get_text(int p) {
+ if (p >= max_pages) {
+ return 0;
+ } else {
+ return text[p];
+ }
+}
+
+int PSEditModel::ps_to_display_x(int x1) {
+ return (int) ((float) x1 * xdpi / 72.0);
+}
+
+int PSEditModel::ps_to_display_y(int y1) {
+ return (int) ((float) (paper_y - y1) * xdpi / 72.0);
+}
+
+int PSEditModel::ps_x(int x1) {
+ return (int) ((float) x1 * 72.0 / xdpi);
+}
+
+int PSEditModel::ps_y(int y1) {
+ return paper_y - (int)((float) y1 * 72.0 / ydpi);
+}
diff --git a/src/PSEditText.H b/src/PSEditText.H
new file mode 100644
index 0000000..a695b5e
--- /dev/null
+++ b/src/PSEditText.H
@@ -0,0 +1,56 @@
+//
+// "$Id: PSEditText.H,v 1.1 2004/10/21 19:55:36 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 PSEditText_H
+#define PSEditText_H
+class PSEditText;
+
+class PSEditText {
+ int x, y;
+ char *s;
+ char *tag;
+ PSEditText *next;
+
+public:
+ int c;
+ int size;
+
+ PSEditText(int x1, int y1, const char *s1, int size1);
+ ~PSEditText();
+ void append_text(const char*s1);
+ void rm_char();
+ void move(int x1, int y1);
+ void append(PSEditText *g);
+ PSEditText *get_match(int x1, int y1);
+ char *get_text();
+ char *get_tag();
+ int set_tag(const char *t);
+ int get_size();
+ PSEditText *get_next();
+ int get_color();
+ int get_x();
+ int get_y();
+ void draw(int off_x,int off_y);
+};
+
+#endif
diff --git a/src/PSEditText.cxx b/src/PSEditText.cxx
new file mode 100644
index 0000000..309fb0c
--- /dev/null
+++ b/src/PSEditText.cxx
@@ -0,0 +1,137 @@
+//
+// "$Id: PSEditText.cxx,v 1.1 2004/10/21 19:55:36 hofmann Exp $"
+//
+// PSEditWidget 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 <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "PSEditText.H"
+
+
+PSEditText::PSEditText(int x1, int y1, const char *s1, int size1) {
+ x = x1;
+ y = y1;
+ s = strdup(s1);
+ tag = NULL;
+ c = 0;
+ size = size1;
+ next = NULL;
+}
+
+PSEditText::~PSEditText() {
+ if (next) {
+ delete(next);
+ }
+ if (s) {
+ free(s);
+ }
+ if (tag) {
+ free(tag);
+ }
+}
+
+void PSEditText::append_text(const char*s1) {
+ int len = (s?strlen(s):0) + strlen(s1) + 1;
+ char *tmp = (char*) malloc(len);
+
+ strncpy(tmp, s?s:"", len);
+ strncat(tmp, s1, len - strlen(tmp));
+
+ if (s) {
+ free(s);
+ }
+
+ s = tmp;
+}
+
+void PSEditText::rm_char() {
+ if (s && strlen(s) > 0) {
+ s[strlen(s) - 1] = '\0';
+ }
+}
+
+void PSEditText::move(int x1, int y1) {
+ x = x1;
+ y = y1;
+}
+
+void PSEditText::append(PSEditText *g) {
+ PSEditText *p = this;
+ while (p->next) {
+ p = p->next;
+ }
+ p->next = g;
+}
+
+PSEditText *PSEditText::get_match(int x1, int y1) {
+ if (abs(x - x1) < 10 && abs(y - y1) < 10) {
+ return this;
+ } else if (next) {
+ return next->get_match(x1, y1);
+ } else {
+ return NULL;
+ }
+}
+
+char *PSEditText::get_text() {
+ return s;
+}
+
+char *PSEditText::get_tag() {
+ return tag;
+}
+
+int PSEditText::set_tag(const char *t) {
+ if (tag) {
+ free(tag);
+ }
+ if (t) {
+ tag = strdup(t);
+ } else {
+ tag = NULL;
+ }
+
+ return 0;
+}
+
+int PSEditText::get_size() {
+ return size;
+}
+
+int PSEditText::get_color() {
+ return c;
+}
+
+PSEditText* PSEditText::get_next() {
+ return next;
+}
+
+int PSEditText::get_x() {
+ return x;
+}
+
+int PSEditText::get_y() {
+ return y;
+}
diff --git a/src/PSEditWidget.H b/src/PSEditWidget.H
index afb3021..5f196cd 100644
--- a/src/PSEditWidget.H
+++ b/src/PSEditWidget.H
@@ -1,5 +1,5 @@
//
-// "$Id: PSEditWidget.H,v 1.7 2004/10/12 20:52:23 hofmann Exp $"
+// "$Id: PSEditWidget.H,v 1.8 2004/10/21 19:55:36 hofmann Exp $"
//
// X11 header file for the Fast Light Tool Kit (FLTK).
//
@@ -25,25 +25,23 @@
#define PSEditWidget_H
#include "GsWidget.H"
+#include "PSEditModel.H"
class PSText;
class PSEditWidget : public GsWidget {
private:
- PSText **text;
- int max_pages;
int cur_size;
int show_tags;
protected:
+ PSEditModel *model;
int loaded;
int mod;
void clear_text();
void draw();
public:
- PSText *cur_text;
-
PSEditWidget(int X,int Y,int W, int H);
int next();
void new_text(int x1, int y1, const char *s, int p);
@@ -52,10 +50,6 @@ public:
void append_text(const char *s);
void move(int x1, int y1);
void rm_char();
- int ps_to_display_x(int x1);
- int ps_to_display_y(int y1);
- int ps_x(int x1);
- int ps_y(int y1);
int reload();
void set_cur_size(int s);
void set_size(int s);
@@ -68,36 +62,7 @@ public:
PSText * get_text(int p);
int modified();
int file_loaded();
-};
-
-
-class PSText {
- int x, y;
- char *s;
- char *tag;
- PSText *next;
- PSEditWidget *gsew;
-
-public:
- Fl_Color c;
- int size;
-
- PSText(PSEditWidget *g, int x1, int y1, const char *s1, int size1);
- ~PSText();
- void append_text(const char*s1);
- void rm_char();
- void move(int x1, int y1);
- void append(PSText *g);
- PSText *get_match(int x1, int y1);
- char *get_text();
- char *get_tag();
- int set_tag(const char *t);
- int get_size();
- PSText *get_next();
- Fl_Color get_color();
- int get_x();
- int get_y();
- void draw(int off_x,int off_y);
+ int replace_tag(char* tag, char* text);
};
#endif
diff --git a/src/PSEditWidget.cxx b/src/PSEditWidget.cxx
index c10d550..ef8431c 100644
--- a/src/PSEditWidget.cxx
+++ b/src/PSEditWidget.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: PSEditWidget.cxx,v 1.17 2004/10/13 18:03:08 hofmann Exp $"
+// "$Id: PSEditWidget.cxx,v 1.18 2004/10/21 19:55:36 hofmann Exp $"
//
// PSEditWidget routines.
//
@@ -38,52 +38,27 @@
#include "PSEditWidget.H"
void PSEditWidget::clear_text() {
- cur_text = NULL;
- for (int i = 0; i < max_pages; i++) {
- if (text[i]) {
- delete(text[i]);
- text[i] = NULL;
- }
- }
+ model->clear();
}
void PSEditWidget::draw() {
GsWidget::draw();
- if (text[page]) {
- text[page]->draw(x() ,y());
- }
+
}
PSEditWidget::PSEditWidget(int X,int Y,int W, int H) : GsWidget(X, Y, W, H) {
- max_pages = 32;
- text = (PSText**) malloc(sizeof(PSText*) * max_pages);
- for (int i = 0; i < max_pages; i++) {
- text[i] = NULL;
- }
- cur_text = NULL;
+ model = new PSEditModel(paper_x, paper_y, xdpi, ydpi);
cur_size = 12;
show_tags = 1;
}
int PSEditWidget::next() {
- if (page >= max_pages) {
- max_pages = max_pages * 2;
- text = (PSText**) realloc(text, sizeof(PSText*) * max_pages);
- for (int i = max_pages / 2; i < max_pages; i++) {
- text[i] = NULL;
- }
- }
- cur_text = NULL;
+ model->set_page(page);
return GsWidget::next();
}
void PSEditWidget::new_text(int x1, int y1, const char *s, int p) {
- cur_text = new PSText(this, x1, y1, s, cur_size);
- if (text[p]) {
- text[p]->append(cur_text);
- } else {
- text[p] = cur_text;
- }
+ model->new_text(x1, y1, s, cur_size, p);
redraw();
}
@@ -92,55 +67,31 @@ void PSEditWidget::new_text(int x1, int y1, const char *s) {
}
int PSEditWidget::set_cur_text(int x1, int y1) {
- if (text[page]) {
- cur_text = text[page]->get_match(x1, y1);
- if (cur_text) {
- redraw();
- return 0;
- }
+ if (model->set_cur_text(x1, y1, page) == 0) {
+ redraw();
+ return 0;
}
return 1;
}
void PSEditWidget::append_text(const char *s) {
- if (cur_text && s) {
- cur_text->append_text(s);
- redraw();
- }
+ model->append_text(s);
+ redraw();
}
void PSEditWidget::move(int x1, int y1) {
- if (cur_text) {
- cur_text->move(x1, y1);
- redraw();
- }
+ model->move(x1, y1);
+ redraw();
}
void PSEditWidget::rm_char() {
- if (cur_text) {
- cur_text->rm_char();
- redraw();
- }
-}
-
-int PSEditWidget::ps_to_display_x(int x1) {
- return (int) ((float) x1 * xdpi / 72.0);
-}
-
-int PSEditWidget::ps_to_display_y(int y1) {
- return (int) ((float) (paper_y - y1) * xdpi / 72.0);
-}
-
-int PSEditWidget::ps_x(int x1) {
- return (int) ((float) x1 * 72.0 / xdpi);
+ model->rm_char();
+ redraw();
}
-int PSEditWidget::ps_y(int y1) {
- return paper_y - (int)((float) y1 * 72.0 / ydpi);
-}
int PSEditWidget::reload() {
- cur_text = NULL;
+ model->set_page(0);
return GsWidget::reload();
}
@@ -150,23 +101,23 @@ void PSEditWidget::set_cur_size(int s) {
void PSEditWidget::set_size(int s) {
set_cur_size(s);
- if (cur_text) {
- cur_text->size = s;
- redraw();
- }
+ model->set_size(s);
+ redraw();
}
int PSEditWidget::get_size() {
- if (cur_text) {
- return cur_text->size;
+ int s;
+
+ s = model->get_size();
+ if (s >= 0) {
+ return s;
} else {
return cur_size;
}
}
-
int PSEditWidget::get_max_pages() {
- return max_pages;
+ return model->get_max_pages();
}
int PSEditWidget::get_show_tags() {
@@ -178,29 +129,17 @@ void PSEditWidget::set_show_tags(int s) {
redraw();
}
-PSText *PSEditWidget::get_text(int p) {
- if (p >= max_pages) {
- return 0;
- } else {
- return text[p];
- }
-}
-
int PSEditWidget::set_tag(const char *t) {
- if (cur_text) {
+ if (model->set_tag(t) == 0) {
mod++;
- return cur_text->set_tag(t);
+ return 0;
} else {
return 1;
}
}
char *PSEditWidget::get_tag() {
- if (cur_text) {
- return cur_text->get_tag();
- } else {
- return NULL;
- }
+ return model->get_tag();
}
int PSEditWidget::modified() {
@@ -211,131 +150,9 @@ int PSEditWidget::file_loaded() {
return loaded;
}
-PSText::PSText(PSEditWidget *g, int x1, int y1, const char *s1, int size1) {
- x = x1;
- y = y1;
- s = strdup(s1);
- tag = NULL;
- c = FL_BLACK;
- size = size1;
- next = NULL;
- gsew = g;
-}
+int PSEditWidget::replace_tag(char *tag, char *text) {
+ fprintf(stderr, "%s => %s\n", tag, text);
-PSText::~PSText() {
- if (next) {
- delete(next);
- }
- if (s) {
- free(s);
- }
- if (tag) {
- free(tag);
- }
-}
-
-void PSText::append_text(const char*s1) {
- int len = (s?strlen(s):0) + strlen(s1) + 1;
- char *tmp = (char*) malloc(len);
-
- strncpy(tmp, s?s:"", len);
- strncat(tmp, s1, len - strlen(tmp));
-
- if (s) {
- free(s);
- }
-
- s = tmp;
-}
-
-void PSText::rm_char() {
- if (s && strlen(s) > 0) {
- s[strlen(s) - 1] = '\0';
- }
-}
-
-void PSText::move(int x1, int y1) {
- x = x1;
- y = y1;
-}
-
-void PSText::append(PSText *g) {
- PSText *p = this;
- while (p->next) {
- p = p->next;
- }
- p->next = g;
-}
-
-PSText *PSText::get_match(int x1, int y1) {
- if (abs(x - x1) < 10 && abs(y - y1) < 10) {
- return this;
- } else if (next) {
- return next->get_match(x1, y1);
- } else {
- return NULL;
- }
-}
-
-void PSText::draw(int off_x,int off_y) {
- PSText *p = this;
- fl_color(c);
- fl_font(FL_HELVETICA, size);
- fl_draw(s, x + off_x, y + off_y);
- if (gsew->cur_text == this) {
- fl_draw_box(FL_BORDER_FRAME, x+off_x-1, y+off_y-fl_height()+fl_descent(),
- (int) fl_width(s)+2, fl_height(), FL_BLACK);
- }
-
- if (tag && gsew->get_show_tags()) {
- int text_height = fl_height() - fl_descent();
- fl_color(FL_BLUE);
- fl_font(FL_COURIER, 10);
- fl_draw(tag, x + off_x, y + off_y - text_height - 1);
- }
-
- if (p->next) {
- p->next->draw(off_x, off_y);
- }
-}
-
-char *PSText::get_text() {
- return s;
-}
-
-char *PSText::get_tag() {
- return tag;
-}
-
-int PSText::set_tag(const char *t) {
- if (tag) {
- free(tag);
- }
- if (t) {
- tag = strdup(t);
- } else {
- tag = NULL;
- }
- gsew->redraw();
return 0;
}
-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.cxx b/src/PSEditor.cxx
index 8e9de8b..64b4a6f 100644
--- a/src/PSEditor.cxx
+++ b/src/PSEditor.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: PSEditor.cxx,v 1.11 2004/10/12 20:52:23 hofmann Exp $"
+// "$Id: PSEditor.cxx,v 1.12 2004/10/21 19:55:36 hofmann Exp $"
//
// PSEditor routines.
//
@@ -110,8 +110,8 @@ int PSEditor::load(char *f) {
char tmpname[256];
char linebuf[1024];
int ret;
- PSParser *p1 = new PSParser_1(this);
- PSParser *p2 = new PSParser_2(this);
+ PSParser *p1 = new PSParser_1(model);
+ PSParser *p2 = new PSParser_2(model);
fp = fopen(f, "r");
if (!fp) {
@@ -161,9 +161,9 @@ int PSEditor::save(const char* savefile) {
PSWriter *pw;
if (ps_level == 2) {
- pw = new PSLevel2Writer(this);
+ pw = new PSLevel2Writer(model);
} else {
- pw = new PSLevel1Writer(this);
+ pw = new PSLevel1Writer(model);
}
pw->write(fp, sfp);
@@ -192,8 +192,8 @@ int PSEditor::import(char *f) {
return 1;
}
- p1 = new PSParser_1(this);
- p2 = new PSParser_2(this);
+ p1 = new PSParser_1(model);
+ p2 = new PSParser_2(model);
while (fgets(linebuf, 1024, fp) != NULL) {
if (!p2->parse(linebuf)) {
p1->parse(linebuf);
diff --git a/src/Postscript.H b/src/Postscript.H
index 72c4492..d9c436f 100644
--- a/src/Postscript.H
+++ b/src/Postscript.H
@@ -1,5 +1,5 @@
//
-// "$Id: Postscript.H,v 1.3 2004/10/13 18:03:08 hofmann Exp $"
+// "$Id: Postscript.H,v 1.4 2004/10/21 19:55:36 hofmann Exp $"
//
// X11 header file for the Fast Light Tool Kit (FLTK).
//
@@ -24,22 +24,23 @@
#ifndef POSTSCRIPT_H
#define POSTSCRIPT_H
-#include "PSEditWidget.H"
-
+#include <stdio.h>
+#include "PSEditModel.H"
class PSParser {
protected:
- PSEditWidget *pse;
+ PSEditModel *pse;
+ int cur_size;
int page;
public:
- PSParser(PSEditWidget *p);
+ PSParser(PSEditModel *p);
virtual int parse(char *line);
};
class PSParser_1 : public PSParser {
public:
- PSParser_1(PSEditWidget *p);
+ PSParser_1(PSEditModel *p);
int parse(char *line);
};
@@ -48,13 +49,13 @@ class PSParser_2 : public PSParser {
int inside;
public:
- PSParser_2(PSEditWidget *p);
+ PSParser_2(PSEditModel *p);
int parse(char *line);
};
class PSWriter {
protected:
- PSEditWidget *pse;
+ PSEditModel *pse;
char * pos_format;
char * size_format;
char * text_format;
@@ -62,12 +63,12 @@ class PSWriter {
char * tag_format;
void write_string(FILE *out, char *s);
void write_internal_format(FILE *out);
- int write_text(FILE *out, PSText *t);
+ int write_text(FILE *out, PSEditText *t);
virtual char *ps_header();
virtual char *ps_trailer();
public:
- PSWriter(PSEditWidget *p);
+ PSWriter(PSEditModel *p);
int write(FILE *in, FILE *out);
};
@@ -76,7 +77,7 @@ class PSLevel1Writer : public PSWriter {
char *ps_header();
char *ps_trailer();
public:
- PSLevel1Writer(PSEditWidget *p);
+ PSLevel1Writer(PSEditModel *p);
};
class PSLevel2Writer : public PSWriter {
@@ -84,7 +85,7 @@ class PSLevel2Writer : public PSWriter {
char *ps_header();
char *ps_trailer();
public:
- PSLevel2Writer(PSEditWidget *p);
+ PSLevel2Writer(PSEditModel *p);
};
diff --git a/src/Postscript.cxx b/src/Postscript.cxx
index 5461483..61021ce 100644
--- a/src/Postscript.cxx
+++ b/src/Postscript.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Postscript.cxx,v 1.9 2004/10/13 18:03:08 hofmann Exp $"
+// "$Id: Postscript.cxx,v 1.10 2004/10/21 19:55:36 hofmann Exp $"
//
// Postscript handling routines.
//
@@ -21,6 +21,8 @@
// USA.
//
+#include <stdlib.h>
+#include <string.h>
#include "Postscript.H"
#define PS_POS_FORMAT "newpath %d %d moveto %% PSEditWidget\n"
@@ -94,8 +96,9 @@ static const char * char_to_glyph(char *c) {
return NULL;
}
-PSParser::PSParser(PSEditWidget *p) {
+PSParser::PSParser(PSEditModel *p) {
pse = p;
+ cur_size = 12;
}
int PSParser::parse(char *line) {
@@ -103,7 +106,7 @@ int PSParser::parse(char *line) {
}
-PSParser_1::PSParser_1(PSEditWidget *p) : PSParser(p) {
+PSParser_1::PSParser_1(PSEditModel *p) : PSParser(p) {
page = 1;
}
@@ -117,11 +120,11 @@ int PSParser_1::parse(char *line) {
if (strstr(line, "% PSEditWidget")) {
if (sscanf(line, PS_SIZE_FORMAT, &size) == 1) {
- pse->set_cur_size(size);
+ cur_size = size;
return 1; // line was recognized
} else if (sscanf(line, PS_POS_FORMAT, &x1, &y1) == 2) {
pse->new_text(pse->ps_to_display_x(x1), pse->ps_to_display_y(y1),
- "", page);
+ "", cur_size, page);
return 1;
} else if (sscanf(line, PS_GLYPH_FORMAT, glyph) == 1) {
pse->append_text(glyph_to_char(glyph));
@@ -139,7 +142,7 @@ int PSParser_1::parse(char *line) {
}
}
-PSParser_2::PSParser_2(PSEditWidget *p) : PSParser(p) {
+PSParser_2::PSParser_2(PSEditModel *p) : PSParser(p) {
page = 1;
inside = 0;
}
@@ -157,10 +160,11 @@ int PSParser_2::parse(char *line) {
} else if (inside && sscanf(line, PSEDIT_PAGE_FORMAT, &page) == 1) {
return 1;
} else if (inside && sscanf(line, PSEDIT_SIZE_FORMAT, &size) == 1) {
- pse->set_cur_size(size);
+ cur_size = size;
return 1;
} else if (inside && sscanf(line, PSEDIT_POS_FORMAT, &x1, &y1) == 2) {
- pse->new_text(pse->ps_to_display_x(x1), pse->ps_to_display_y(y1),"",page);
+ pse->new_text(pse->ps_to_display_x(x1), pse->ps_to_display_y(y1),"",
+ cur_size, page);
return 1;
} else if (inside && sscanf(line, PSEDIT_GLYPH_FORMAT, buf) == 1) {
pse->append_text(glyph_to_char(buf));
@@ -186,7 +190,7 @@ int PSParser_2::parse(char *line) {
//
-PSWriter::PSWriter(PSEditWidget *p) {
+PSWriter::PSWriter(PSEditModel *p) {
pse = p;
}
@@ -278,7 +282,7 @@ void PSWriter::write_string(FILE *out, char *s) {
return;
}
-int PSWriter::write_text(FILE *out, PSText *t) {
+int PSWriter::write_text(FILE *out, PSEditText *t) {
char *s;
if (!t) {
@@ -314,7 +318,7 @@ char * PSWriter::ps_trailer() {
return "";
}
-PSLevel1Writer::PSLevel1Writer(PSEditWidget *p) : PSWriter(p) {};
+PSLevel1Writer::PSLevel1Writer(PSEditModel *p) : PSWriter(p) {};
char * PSLevel1Writer::ps_header() {
return \
@@ -335,7 +339,7 @@ char * PSLevel1Writer::ps_trailer() {
}
-PSLevel2Writer::PSLevel2Writer(PSEditWidget *p) : PSWriter(p) {};
+PSLevel2Writer::PSLevel2Writer(PSEditModel *p) : PSWriter(p) {};
char * PSLevel2Writer::ps_header() {
return \
diff --git a/src/flpsed.cxx b/src/flpsed.cxx
index eb85736..802ad94 100644
--- a/src/flpsed.cxx
+++ b/src/flpsed.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: flpsed.cxx,v 1.16 2004/10/13 18:03:08 hofmann Exp $"
+// "$Id: flpsed.cxx,v 1.17 2004/10/21 19:55:36 hofmann Exp $"
//
// flpsed program.
//
@@ -202,27 +202,56 @@ Fl_Menu_Item menuitems[] = {
};
int main(int argc, char** argv) {
- Fl_Window window(600,700);
- Fl_Menu_Bar* m = new Fl_Menu_Bar(0, 0, 600, 30);
+ char c, *sep, *tmp;
+ int err;
+ Fl_Window *win;
+ Fl_Menu_Bar* m;
+ Fl_Scroll *scroll;
+
+ win = new Fl_Window(600,700);
+ m = new Fl_Menu_Bar(0, 0, 600, 30);
m->menu(menuitems);
-
- Fl_Scroll scroll(0, 30, window.w(), window.h()-30);
+ scroll = new Fl_Scroll(0, 30, win->w(), win->h()-30);
gsw_p = new PSEditor(0, 0, 700, 900);
- scroll.end();
+ scroll->end();
+
fl_open_display();
Fl::add_handler(xev_handler);
- window.resizable(scroll);
-
- window.end();
- window.callback((Fl_Callback *)quit_cb);
- window.show(1, argv);
-
-
+ win->resizable(scroll);
+
+ win->end();
+ win->callback((Fl_Callback *)quit_cb);
+ win->show(1, argv);
+
+ err = 0;
+ while ((c = getopt(argc, argv, "t:")) != EOF) {
+ switch (c) {
+ case 't':
+ tmp = strdup(optarg);
+ if (!tmp) {
+ perror("strdup");
+ exit(1);
+ }
+ sep = strchr(tmp, '=');
+ if (!sep) {
+ fprintf(stderr, "Cannot parse %s\n", optarg);
+ free(tmp);
+ continue;
+ }
+ *sep = '\0';
+ gsw_p->replace_tag(tmp, sep+1);
+ free(tmp);
+ break;
+ default:
+ err++;
+ }
+ }
- if (argc >= 2) {
- gsw_p->load(argv[1]);
+ if (err) {
+ exit(1);
}
+
return Fl::run();
}