// -*- C++ -*- // $RCSfile: imageform.h,v $ // $Revision: 1.8 $ // $Author: langer $ // $Date: 2001/04/19 01:39:35 $ /* This software was produced by NIST, an agency of the U.S. government, * and by statute is not subject to copyright in the United States. * Recipients of this software assume all responsibilities associated * with its operation, modification and maintenance. However, to * facilitate maintenance we ask that before distributing modifed * versions of this software, you first contact the authors at * oof_manager@ctcms.nist.gov. */ #ifndef IMAGEFORM_H #define IMAGEFORM_H class ImageForm; class ImageFormGfx; class ImageFormTxt; #include "color.h" #include "forms.h" #include "image.h" #include "image_drawer2.h" #include "menuform.h" #include "mouseclick.h" #include "robomouse.h" class AutomationDashboard; class AdaptiveMesh; class AMTriangle; class CoordDashboard; class Dashboard; class DisplayDashboard; class FileName; class Goof; class Image; class ImageCanvas; class ImageManDashboard; class ImageModDashboard; class PixelInfoDashboard; class MeshInfoDashboard; class NamedImage; class SelectDashboard; class XCursor; //=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=// // The base class ImageForm doesn't actually do any graphics. It has // empty virtual functions for all of the graphics operations. It // does store Images and has all of the dashboards and menus, so that // the rest of the program doesn't have to know if it's dealing with a // functioning ImageForm (ImageFormGfx) or a fake one (ImageFormTxt). class ImageForm { protected: Goof *goof; void inhibit_drawing() { inhibit_ = 1; } void allow_drawing() { inhibit_ = 0; } bool inhibit_; // list of all imageforms ever created static Vec all_imageforms; static int imageformcount; CharString imageform_id; // unique identifier for this form virtual void set_all_colors_() {} public: ImageForm(Goof*, const Image&); virtual ~ImageForm(); Dashboard *current_dashboard() const; Dashboard *get_dashboard(const CharString &) const; virtual void change_goof(Goof*) = 0; void update_gallery_listing(const Vec &gallery); Menu *menu; // menu for simulating mouse clicks Menu *dashboardmenu; // submenu of the main menu RoboMouseCmd robomousecmd; ZoomButtonCmd zoombuttoncmd; ScrollCommand scrollcmd; ResizeCmd resizecmd; SaveCmd savecmd; virtual void robomouse(const MouseClick&) = 0; // simulate a click CharString menucommand() const; virtual void mesh_created() const {} virtual void mesh_destroyed() const {} virtual void triangle_destroyed(const AMTriangle*) const {} virtual void set_picture(const Image&) = 0; const Image ¤t_picture() const; void store_current_picture(const CharString&) const; Image ¤t_picture(); // Some things have to be in the base class even though they're not // used except in the Gfx derived class, so that all kinds of // ImageForms appear to work, as far as the outside world is // concerned. bool beenclicked; // has either info dashboard been clicked on? virtual void draw() {} virtual void draw_ps(FILE*) const {} virtual void center_image() {} virtual void set_undoredo_buttons(int, int) {} virtual void getpixel(Color&, unsigned long) {} // assign pixel to color virtual void setcursor(const XCursor&) {} virtual void unsetcursor() {} virtual FL_FORM *xform() { return 0; } // We need to be able to take the address of this function (to use // it in Goof::apply_all_forms()), so I don't think it can be // virtual. But it can call a virtual function. void set_all_colors() { set_all_colors_(); } int current_dashboard_no; Dashboard *currentdashboard; // We need both current_dashboard_no and current_dashboard because // when changing dashboards, we need to be able to clean up // current_dashboard before switching to the new one. The new // dashboard number is already in current_dashboard_no. static int dflt_dashboard_no; Vec dashboard; // list of all dashboards virtual void adddashboard(Dashboard*) = 0; // install dashboard DisplayDashboard *displaydash; CoordDashboard *coorddash; SelectDashboard *selectdash; PixelInfoDashboard *pixelinfodash; MeshInfoDashboard *meshinfodash; ImageManDashboard *imagemanager; ImageModDashboard *imagemodification; AutomationDashboard *automation; // ImageForm routines called by robomouse have to be virtual and // (mostly) do nothing by default virtual void zoombutton(int) {} virtual void xyscroll(int, int) {} virtual void resize(int, int) {} virtual void save_image(const FileName&) const {} virtual void close() {} virtual void set_dashboard() = 0; // Routines put into the menus by ImageForm::ImageForm have to be // static and in the base class. They call the virtual functions. static CommandFn close_cmd(); static void setdashboard_cmd(const CharString &); // called by menus // Stuff for writing config files static void save_imageforms(ostream&); void save(ostream&) const; virtual void save_extras(ostream&) const {} // called by save(ostream&) // Stuff for reading from config files static void read_imageform(istream&); static ImageForm *incipient_form; // form being loaded, used by read_imageform static Menu *configmenu; static bool done_loading; // indicates end of parsing menu static bool end_imageform() { return done_loading; } static CommandFn set_end_imageform(); static CommandFn load_image(); static istream *configfile; static int currentimage; static void set_currentimage(const CharString&); static CommandFn read_scrollbars(); virtual void readscrollbars() = 0; friend class Goof; friend class Dashboard; friend class PixelInfoDashboard; friend class MeshInfoDashboard; friend class DisplayDashboard; }; //=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=// class ImageFormGfx : public Form, public ImageForm { public: ImageFormGfx(Goof*, const Image&); virtual ~ImageFormGfx(); virtual FL_FORM *xform() { return the_form; } virtual void draw(); // creates image from goof virtual void draw_ps(FILE*) const; // creates postscript file from goof virtual void change_goof(Goof*); virtual void adddashboard(Dashboard*); // install dashboard virtual void mesh_created() const; virtual void mesh_destroyed() const; virtual void triangle_destroyed(const AMTriangle*) const; Colormap colormap() const { return xcolormap; } int reserved_colors() const; // record mouse motion events in log file? [Never used...] // void logmotion(const TrueFalse &flag) { logmotions = flag; } virtual void robomouse(const MouseClick&); // simulate a click virtual void center_image(); // double scalefactor() const; // activate & deactivate undo and redo buttons for pixel selections // and image modifications virtual void set_undoredo_buttons(int, int); virtual void set_picture(const Image&); static ImageFormGfx *objform(FL_OBJECT *obj); static Dashboard *objdash(FL_OBJECT *obj); private: FD_image_drawer *fdui; ImageCanvas *canvas; Image localimage; // stuff for saving and loading configuration files virtual void save_extras(ostream&) const; virtual void readscrollbars(); static MouseClick savedclick; static void setclick_cmd(const CharString&); // Most colors are stored in the dashboards (mainly // displaydashboard) where they are set. The colors which are // stored here are the ones that aren't ever changed. Color rubberband_color; Color white; Color black; Color wallpaper_fg; Color wallpaper_bg; // When a dashboard changes a color, it has to call getpixel to // assign a pixel value (for TrueColor) or to put the color in the // colormap (for PseudoColor). The second argument is the pixel // value defined below for each color. virtual void getpixel(Color&, unsigned long); // assign pixel to color static Color rubberband_color_dflt; static int nreserved_colors; virtual void set_all_colors_(); // These are the "pixel" values of the colors -- ie indices into the // X colormap. They are defined in imageform.[Ch] just to localize // the definitions so that their values are unique. static unsigned long const BLACKPIXEL; static unsigned long const WHITEPIXEL; static unsigned long const SELECTEDPIXEL; static unsigned long const HIGHLIGHTPIXEL; static unsigned long const CLICKEDPIXEL; static unsigned long const FIREWALLPIXEL; static unsigned long const MESHPIXEL; static unsigned long const SELMESHPIXEL; static unsigned long const SELMESHFADEPIXEL; static unsigned long const NOMATERIALPIXEL; static unsigned long const RUBBERBANDPIXEL; static unsigned long const WALLPAPER_FG; static unsigned long const WALLPAPER_BG; // TrueFalse logmotions; virtual void setcursor(const XCursor&); virtual void unsetcursor(); Colormap xcolormap; static int wm_close(FL_FORM*, void*); // handle window manager event static void CB_zoombutton(int, void*); // called by scrollcanvas void zoombutton_callback(int); // called by CB_zoombutton virtual void zoombutton(int); // called by ZoomButtonCmd friend class ZoomButtonCmd; static void CB_xscroll(int, void*); // called by scrollcanvas void xscroll_callback(int); static void CB_yscroll(int, void*); // called by scrollcanvas void yscroll_callback(int); virtual void xyscroll(int, int); // called by ScrollCommand friend class ScrollCommand; static void CB_scrollcallback(const MeshCoord&, const MeshCoord&, void*); void scrollcallback(const MeshCoord&, const MeshCoord&); static void CB_resize(int, int, void*); void resize_callback(); virtual void resize(int, int); friend class ResizeCmd; // routines to switch dashboards static void CB_dashboard(FL_OBJECT*, long); // called by forms void set_dashboard_gui(); // called by CB_dashboard virtual void set_dashboard(); // set dashboard to current pulldown menu choice void set_dashboard(int); // called by CB_dashboard & menu, does real work static void CB_close(FL_OBJECT*, long); void close_gui(); virtual void close(); virtual void save_image(const FileName&) const; static void CB_save(FL_OBJECT*, long); void save_gui() const; static void CB_home(FL_OBJECT*, long); /* bring up home menu */ void home(); friend class ImageCanvas; friend class RoboMouseCmd; friend class SaveCmd; friend class PixelInfoDashboard; friend class MeshInfoDashboard; friend class DisplayDashboard; friend ImageForm *get_imageform(); friend FD_image_drawer *create_form_image_drawer(); friend class Dashboard; }; //=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=//=\\=// class ImageFormTxt : public ImageForm { public: ImageFormTxt(Goof*, const Image&); virtual ~ImageFormTxt(); virtual void change_goof(Goof*); virtual void set_picture(const Image&); virtual void adddashboard(Dashboard*); // install dashboard virtual void robomouse(const MouseClick&); // simulate a click virtual void set_dashboard(); virtual void readscrollbars(); }; #endif