#ifndef INCLUDE_DIALOG #define INCLUDE_DIALOG #include "window.h" // // ABSTRACT BASE CLASS OF THE OBJECTS // ================================== class BaseObject { protected: int w,h; // Size of the object in characters int x,y; // Relative position of the upper left corner enum type {Box,Frame,IntField,CharField,FloatField, StaticText,String,CharArray,Integer, ExitButton,CommandButton, NullObject,UserObject}; public: color fg,bg; // Colors of the object BaseObject(int x,int y,int w,int h,color fg,color bg); virtual void Draw()=0; virtual type TypeOf()=0; virtual int IsRoot()=0; }; // // ABSTRACT CLASS ROOT OBJECT (BASE OF BOX AND FRAME) // ========================== class DataObject; class RootObject:public BaseObject { private: unsigned size; // Size of the datablock unsigned nextoffset;// Next data offset virtual void Draw(); DataObject *GetNext(DataObject *prev); DataObject *GetPrev(DataObject *next); protected: int exit_code; // Exit signal from button object DataObject *first; // Ptr to the first data object DataObject *last; // Ptr to the last data object DataObject *current;// Adr of the current object friend class DataObject; friend class ExitButton; friend class CommandButton; public: Window *window; // Ptr to the window of the root object char *data; // Ptr to the start of the datablock RootObject(int x,int y,int w,int h,color fg,color bg,frame_t frm,unsigned size); ~RootObject(); virtual type TypeOf()=0; int IsRoot() {return 1;} int Exec(void *data=NULL); RootObject& operator+=(DataObject &add); }; // // ABSTRACT CLASS DATA OBJECT (BASE OF THE ALL NON-ROOT OBJECTS) // ========================== #define plotat(x,y,c) root->window->PlotAt(x,y,c) #define plot(c) root->window->Plot(c) #define gotoxy(x,y) root->window->Goto(x,y) #define printat(x,y,s) root->window->PrintAt(x,y,s) #define print(s) root->window->Print(s) #define set_colors(f,b) root->window->Color(f,b) class DataObject:public BaseObject { private: virtual int HandleKey(int clean,int key); protected: RootObject *root; DataObject *next; DataObject *prev; unsigned offset; // Offset of data in source structure char *data; // Data adr int shortcut; // Shortcut key virtual void Draw()=0; void HighLight(); friend class RootObject; friend class CommandButton; public: DataObject(int x,int y,int w,int h,color fg,color bg,unsigned size,int key); virtual type TypeOf()=0; int IsRoot() {return 0;} virtual int IsSelectable()=0; unsigned StringLength(char *str); unsigned StringLines(char *str); virtual char *ReadData(); virtual void SaveData(); }; // // CLASS BOX // ========= class Box:public RootObject { public: Box(int x,int y,int w,int h,color fg,color bg,unsigned size); type TypeOf() {return Box;} }; // // CLASS FRAME // =========== class Frame:public RootObject { public: Frame(int x,int y,int w,int h,color fg,color bg,unsigned size,char *wtitle=NULL); type TypeOf() {return Frame;} }; enum format {Left,Center,Right}; // // CLASS TEXT ABSTRACT (BASE CLASS OF TEXT OBJECTS) // =================== class Text:public DataObject { protected: virtual void Draw(); virtual char *ContentOf()=0; public: Text(int x,int y,int w,format f,color fg,color bg,unsigned size); virtual type TypeOf()=0; int IsSelectable() {return 0;} private: format orientation; }; // // CLASS STATIC TEXT // ================= class StaticText:public Text { private: char *text; protected: char *ContentOf(); public: StaticText(int x,int y,int w,char *txt,format f=Center,color fg=NO_COLOR,color bg=NO_COLOR); type TypeOf() {return StaticText;} }; // // CLASS STRING // ============ class String:public Text { protected: char *ContentOf(); public: String(int x,int y,int w,format f=Center,color fg=NO_COLOR,color bg=NO_COLOR); type TypeOf() {return String;} }; // // CLASS CHAR ARRAY // ================ class CharArray:public Text { protected: char *ContentOf(); public: CharArray(int x,int y,int w,unsigned size,format f=Center,color fg=NO_COLOR,color bg=NO_COLOR); type TypeOf() {return CharArray;} }; // // CLASS INTEGER // ============= class Integer:public Text { protected: char *ContentOf(); public: Integer(int x,int y,int w,format f,color fg=NO_COLOR,color bg=NO_COLOR); type TypeOf() {return Integer;} }; // // CLASS FIELD (ABSTRACT BASE CLASS OF ALL FIELDS) // =========== class Field:public DataObject { private: char *format; // Format of the input string int curx; // Cursor position int ValidKey(int x,int key); protected: int maxlen; // Field length int HandleKey(int clean,int key); void Draw(); public: Field(int x,int y,char *format,color fg,color bg,unsigned size); virtual type TypeOf()=0; int IsSelectable() {return 1;} }; // // CLASS INT FIELD // =============== class IntField:public Field { protected: char *ReadData(); void SaveData(); public: IntField(int x,int y,char *format,color fg=NO_COLOR,color bg=BLUE); type TypeOf() {return IntField;} }; // // CLASS CHAR FIELD // ================ class CharField:public Field { protected: char *ReadData(); void SaveData(); public: CharField(int x,int y,char *format,color fg=NO_COLOR,color bg=BLUE); type TypeOf() {return CharField;} }; // // CLASS FLOAT FIELD // ================= class FloatField:public Field { protected: char *ReadData(); void SaveData(); public: FloatField(int x,int y,char *format,color fg=NO_COLOR,color bg=BLUE); type TypeOf() {return FloatField;} }; // // CLASS BUTTON (ABSTRACT BASE CLASS OF ALL BUTTONS) // ============ class Button:public DataObject { private: char *name; protected: void Draw(); void HighLight(); virtual int HandleKey(int clean,int key)=0; public: Button(int x,int y,char *name,int key,color fg,color bg,unsigned size); virtual type TypeOf()=0; int IsSelectable() {return 1;} }; class ExitButton:public Button { private: int value; protected: int HandleKey(int clean,int key); public: ExitButton(int x,int y,char *name,int ret=1,int key=0,color fg=NO_COLOR,color bg=GREEN); type TypeOf() {return ExitButton;} }; class CommandButton:public Button { protected: int HandleKey(int clean,int key); void (*function)(void*); public: CommandButton(int x,int y,char *name,int key=0,void (*function)(void*)=NULL,unsigned size=0,color fg=NO_COLOR,color bg=GREEN); type TypeOf() {return CommandButton;} }; class NullObject:public DataObject { private: void Draw() {DataObject::Draw();} public: type TypeOf() {return NullObject;} int IsSelectable() {return 0;} NullObject(unsigned size,int x=0,int y=0,int w=0,int h=0,color bg=NO_COLOR); }; class UserObject:public DataObject { private: void (*output)(Window *w); void Draw() ; public: type TypeOf() {return UserObject;} int IsSelectable() {return 0;} UserObject(int x,int y,int w,int h,void (*output)(Window *w),color fg=NO_COLOR,color bg=NO_COLOR); }; #endif