diff options
Diffstat (limited to 'src/PSEditor.cxx')
| -rw-r--r-- | src/PSEditor.cxx | 154 | 
1 files changed, 154 insertions, 0 deletions
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; +}  | 
