#ifndef MYWINDOW_H
#define MYWINDOW_H
/////////////////////////////////////////////////////////////////////////////////////////
// the demo program includs several calsses:
// 1. MyWindow - main window, create thw window properties (tool bar, menu bar)
// 2. Qt_widget_demo_tab - the program give the user an optoin of multiple tabs with  
//    different curve traits (segment_tab, polyline_tab and conic_tab)
// 3. Qt_layer - the screen object attached to every demo_tab that draw on it.
// 4. forms classes - the dailogs windows.
/////////////////////////////////////////////////////////////////////////////////////////
#include <fstream>
#include <iostream>
#include <sstream>
#include <stack>
#include <set>
#include <string>
#include <list>
#include <vector>
#include <math.h>

#include <qaction.h>
#include <qplatinumstyle.h>
#include <qapplication.h>
#include <qmainwindow.h>
#include <qstatusbar.h>
#include <qfiledialog.h>
#include <qmessagebox.h> 
#include <qpopupmenu.h>
#include <qmenubar.h>
#include <qtoolbutton.h>
#include <qtoolbar.h>
#include <qtimer.h>
#include <qtabbar.h>
#include <qtabwidget.h>
#include <qstring.h>
#include <qlabel.h> 
#include <qcolordialog.h> 

#include <qfile.h>
#include <qpainter.h>
#include <qprinter.h>

#include "cgal_types.h"
#include <CGAL/IO/Qt_widget_handtool.h>

//#include <CGAL/IO/Pm_Postscript_file_stream.h>

//////////////////////////////////////////////////////////////////////////////
class Qt_layer;
class Qt_widget_base_tab;

/*! class MyWindow is the main class that controls all the window 
    operations 
 */ 
class MyWindow : public QMainWindow
{
    Q_OBJECT
public:
    /*! constructor */
    MyWindow(int w, int h);
    /*! distructor */
    ~MyWindow();

private:
    /*! something changed in the window*/
    void something_changed();
    /*! skip_comments in input file */
    void skip_comments( std::ifstream& is, char* one_line );
    /*! read conic curve from input file */
    void ReadCurve(std::ifstream & is, Pm_base_conic_2 & cv);
    /*! read from file */
    void load( const QString& filename , bool clear_flag = false);
    /*! find the actual widget tab index of a tab */
    int realIndex(int index);
    /*! initialize widget */
    void init(Qt_widget_base_tab *widget);


private slots:
    /*! get_new_object - connects between the widget and main window */
    void get_new_object(CGAL::Object obj);
    /*! open an information dialog*/
    void about();
    /*! open an information dialog*/
    void aboutQt();
    /*! open an information dialog*/
    void howto();
    /*! add a new tab of segment traits */
    void add_segment_tab();
    /*! add a new tab of polyline traits */
    void add_polyline_tab();
    /*! add a new tab of conic traits */
    void add_conic_tab();
    /*! remove current tab */
    void remove_tab();
    /*! connect the timer to main window */
    void timer_done();
    /*! change the traits type of current tab */
    void updateTraitsType( QAction *action );
    /*! update the window buttons according to change in traits type */
    void setTraits( TraitsType t );
    /*! on/off snap mode */
    void updateSnapMode( bool on );
    /*! on/off grid/point snap mode */
    void updateGridSnapMode( bool on );
    /*! change the mode of current tab */
    void updateMode( QAction *action );
    /*! update the window buttons according to change in mode */
    void setMode( Mode m );
    /*! update all the window buttons */
    void update();
    /*! zoom in the picture */
    void zoomin();
    /*! zoom out the picture */
    void zoomout();
    /*! open a file */
    void fileOpen( bool clear_flag = false);
    /*! open a Pm file */
    void fileOpenPm();
    /*! open a file and add a segment tab */
    void fileOpenSegment();
    /*! open a pm file and add a segment tab */
    void fileOpenSegmentPm();
    /*! open a file and add a polyline tab */
    void fileOpenPolyline();
    /*! open a pm file and add a Polyline tab */
    void fileOpenPolylinePm();
    /*! open a file and add a conic tab */
    void fileOpenConic();
    /*! overlay planar maps */
    void overlay_pm();
    /*! make the overlay */
    void make_overlay( std::list<int> indexes , std::list<int> paint_flags , 
                       TraitsType t , bool new_tab );
    /*! save file */
    void fileSave();
    /*! save file to ps */
    void fileSave_ps();
    /*! open a save file dialog box */
    void fileSaveAs();
    /*! open a print dialog box */
    void print();
    /*! change window properties */
    void properties();
    /*! show grid */
    void showGrid();
    /*! hide grid */
    void hideGrid();
    /*! choose a conic type to insert */
    void conicType();
    /*! set backGround Color */
    void backGroundColor();
    /*! set vertexColor Color */
    void changePmColor();    
    /*! choose the ray shoot diraction */
    void rayShootingDirection();
    /*! choose the point location strategy */
    void pointLocationStrategy();
    /*! change the conic type of current tab */
       void updateConicType( QAction *action );
    /*! update the window buttons according to change in conic type */
    void setConicType( ConicType t );
	/*! open the color dialog */
	void openColorDialog();

private:
    /*! myBar - hold the tab widgets */
    QTabWidget *myBar;
    /*! old state of current tab */
    int old_state;
    /*! the index number of the next tab in the window */
    int tab_number;
    /*! number of tabs in the window */
    int number_of_tabs;
    /*! testlayer attached to all widget tabs and show them when needed */
    Qt_layer *testlayer;
    /*! segment traits action */
    QAction *setSegmentTraits;
    /*! polyline traits action */
    QAction *setPolylineTraits;
    /*! conic traits action */
    QAction *setConicTraits;
    /*! snap mode action */
    QAction *setSnapMode;
    /*! grid snap mode action */
    QAction *setGridSnapMode;
    /*! closest point snap mode action */
    QAction *setPointSnapMode;
    /*! insert mode action */
    QAction *insertMode;
    /*! delete mode action */
    QAction *deleteMode;
    /*! point location mode action */
    QAction *pointLocationMode;
    /*! ray shooting mode action */
    QAction *rayShootingMode;
    /*! drag mode action */
    QAction *dragMode;
    /*! merge mode action */
    QAction *mergeMode;    
    /*! split mode action */
    QAction *splitMode;
    /*! fill face mode action */
    QAction *fillfaceMode;
    /*! zoomin button */
    QAction *zoominBt;
    /*! zoomout button */
    QAction *zoomoutBt;
    ///*! the name of the file to be saved */
    QString m_filename;
    /*! window hight */
    int m_height; 
    /*! window width */
    int m_width;
    /*! hand tool layer for dragging the planar map */
    CGAL::Qt_widget_handtool *handtoollayer;
    /*! status bar label */
    QLabel *insert_label;
    /*! status bar label */
    QLabel *delete_label;
    /*! status bar label */
    QLabel *drag_label;
    /*! status bar label */
    QLabel *ray_shooting_label;
    /*! status bar label */
    QLabel *point_location_label;
    /*! status bar current label */
    QLabel *current_label;
    /*! scailing factor */
    double m_scailing_factor;
    /*! different colors mode */
    bool colors_flag;
    /*! circle conic type action */
    QAction *setCircle;
    /*! segment conic type action */
    QAction *setSegment;
    /*! ellipse conic type action */
    QAction *setEllipse;
    /*! parabola conic type action */
    QAction *setParabola;
    /*! hyperbula conic type action */
    QAction *setHyperbola;
    /*! conic type tool bar */
    QToolBar *conicTypeTool;
	  /*! color dialog action (for filling faces) */
  	QAction *color_dialog_bt;
    /* strategy for point location*/
    Strategy strategy;
};



#endif // MYWINDOW_H


syntax highlighted by Code2HTML, v. 0.9.1