void  myError(const char * , const char * , int  );
// forward refs
class Window;
class Scroller;
class FrameWindow;
class CGMWindow;
class WMetaWindow;
class FileObject;
class IndexObject;
class PageObject;
class cgmObject;
class cgmFile;
class cgmMetafile;
class	cgmPicture;
class clearOutput;
class baseDisplay;

//typedefs
typedef Window * WindowPt;
typedef FrameWindow * FrameWindowPt;
typedef cgmObject   * CgmObjectPt;
typedef CGMWindow   * CgmWindowPt;
typedef WMetaWindow * WMetaWindowPt;
typedef FileObject  * FileObjectPt;
typedef IndexObject * IndexObjectPt;
typedef PageObject  * PageObjectPt;
typedef cgmFile     * CgmFilePt;
typedef cgmPicture  * CgmPicturePt;
typedef cgmMetafile * CgmMetafilePt;
typedef clearOutput * ClearOutputPt;
typedef baseDisplay * BaseDisplayPt;
typedef const LPSTR cStr;

enum Modes { READFILE, CREATEFILE };

 // *** class FileObject
class FileObject
{
	public:
	static FileObjectPt ThisFileObject;
	private:
	char Path[128];
	char Spec[128];
	char Ext[20];
	char *DialogMess;
	int HFile;
	OFSTRUCT OF;
	WORD wAttr;
	enum   {FILE_SELECTED, NO_FILE_SELECTED};
	public:
	~FileObject( void )
	  { if (HFile) _lclose(HFile);
		 if (DialogMess) delete DialogMess;
	  }
	FileObject( void )
	 { HFile = NULL; Spec[0] = '\0'; Path[0] = '\0'; Ext[0] = '\0';
		DialogMess = NULL;
	 }
	void DialogFileSetup(cStr Mess, cStr Path, cStr Spec, cStr Ext, WORD wAttr );
	int GetHandle( void) { return HFile; }
	const char *GetFileName(void){return (const char *)&OF.szPathName[0];}// { return &Spec[0]; }
	void DialogFileInfo( );
	BOOL OpenRead(HWND hWndParent);
	BOOL OpenWrite(  HWND hWndParent);
	static BOOL GetNewChoice(HWND hDlg, enum Modes FileAction);
	static BOOL FAR PASCAL FileOpenDlgProc (HWND hDlg, WORD message,
																WORD wParam, LONG lParam);
	static BOOL FAR PASCAL FileNewDlgProc (HWND hDlg, WORD message,
																WORD wParam, LONG lParam);

};  // End of class FileObject

class cgmObject
{
	private:
	FileObjectPt file;         // note, also held by cgmwindow
	CgmFilePt cgm;
	CgmWindowPt cgmWin;
	CgmMetafilePt cgmMeta;
	CgmPicturePt  curPic;       // current picture to be displayed
	CgmPicturePt  lastPic;      // last picture displayed
	WORD          PicNum;  		 // current picture #
	WORD          Pictures;     // # of pictures
	BOOL          IsIndexed;
	BOOL          DidFullMeta;
	HANDLE        hMeta;        // Windows metafile
	HBITMAP       hCompBit;
	HDC           hMemDC;
	HBITMAP       hOldBit;
	public:
	cgmObject(CgmWindowPt cgmWin, FileObjectPt fobj );
	BOOL IsValidCgm(void)  { if (cgmMeta) return TRUE;  else return FALSE; }
	BOOL IsSamePic(void)  { if ( !lastPic || curPic == lastPic ) return TRUE;
									 else return FALSE; }
	WORD IndexCgm();
	WORD GetPicNum(void) {return PicNum;}
	inline BOOL NextPageExists(void);
	inline BOOL PrevPageExists(void);
	inline void GetPageText( PSTR text)
		  {wsprintf((LPSTR)text,"PAGE %d", PicNum);}
	void SetLastCur(void) { lastPic = curPic; }
	void GetPictureText(PSTR text, void **picture);
	BOOL GetSel( void **picture);
	void SetSel(BOOL , void **picture);
	BOOL PreviousPage(void);
	BOOL NextPage(void);
	BOOL NewPage(WORD page);
	inline void ZapLastPic(void);
	inline void ReadCurPic(void);
	void DisplayCurPic(HWND, RECT *, Scroller *);
	void GPlotInit(void );
	void MakeClearText(FileObjectPt fobj );
	void WriteMetaFile(FileObjectPt fobj);
	void MakeBitmapMeta(HWND hWnd, RECT *rect, Scroller *sbars); //OBSOLETE
	void MakeStar(HDC dev , HDC meta); //FOR TEST ONLY
	~cgmObject(void);
};  // end of CgmObject class

