0028892: BOPAlgo_PaveFiller returns status "error: 11" in draw or raises exception...
[occt.git] / samples / mfc / standard / Common / OCC_App.cpp
1 // OCC_App.cpp: implementation of the OCC_App class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include <stdafx.h>
6
7 #include "OCC_App.h"
8 #include "OCC_BaseDoc.h"
9 #include <res\OCC_Resource.h>
10
11 #include <Standard_Version.hxx>
12 #include <OpenGl_GraphicDriver.hxx>
13 #include <OSD.hxx>
14
15 #include "afxwin.h"
16
17 /////////////////////////////////////////////////////////////////////////////
18 // OCC_App
19
20 BEGIN_MESSAGE_MAP(OCC_App, CWinApp)
21         //{{AFX_MSG_MAP(OCC_App)
22         ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
23                 // NOTE - the ClassWizard will add and remove mapping macros here.
24                 //    DO NOT EDIT what you see in these blocks of generated code!
25         //}}AFX_MSG_MAP
26         // Standard file based document commands
27         ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
28         ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
29   ON_COMMAND(ID_BUTTON_STEREO, &OCC_App::OnStereo)
30   ON_UPDATE_COMMAND_UI(ID_BUTTON_STEREO, &OCC_App::OnUpdateStereo)
31 END_MESSAGE_MAP()
32
33 /////////////////////////////////////////////////////////////////////////////
34 // OCC_App construction
35
36 OCC_App::OCC_App() : CWinApp()
37 {
38   OSD::SetSignal (Standard_True);
39   SampleName = "";
40   SetSamplePath (NULL);
41   try
42   {
43     Handle(Aspect_DisplayConnection) aDisplayConnection;
44     myGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection);
45   }
46   catch(Standard_Failure)
47   {
48     AfxMessageBox (L"Fatal error during graphic initialization", MB_ICONSTOP);
49     ExitProcess (1);
50   }
51 }
52
53 void OCC_App::SetSamplePath(LPCTSTR aPath)
54 {
55   wchar_t anAbsoluteExecutableFileName[MAX_PATH + 1];
56   HMODULE hModule = GetModuleHandleW (NULL);
57   GetModuleFileNameW (hModule, anAbsoluteExecutableFileName, MAX_PATH);
58
59   SamplePath = CString (anAbsoluteExecutableFileName);
60   int index = SamplePath.ReverseFind('\\');
61   SamplePath.Delete(index+1, SamplePath.GetLength() - index - 1);
62   if (aPath == NULL)
63     SamplePath += "..";
64   else{
65     CString aCInitialDir(aPath);
66     //SamplePath += "..\\" + aCInitialDir;
67   }
68 }
69 /////////////////////////////////////////////////////////////////////////////
70 // CAboutDlgStd dialog used for App About
71
72 class CAboutDlgStd : public CDialog
73 {
74 public:
75   CAboutDlgStd();
76   BOOL OnInitDialog();
77
78   // Dialog Data
79   //{{AFX_DATA(CAboutDlgStd)
80   enum { IDD = IDD_OCC_ABOUTBOX };
81   //}}AFX_DATA
82
83   // ClassWizard generated virtual function overrides
84   //{{AFX_VIRTUAL(CAboutDlgStd)
85 protected:
86   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
87   //}}AFX_VIRTUAL
88
89
90 // Implementation
91 protected:
92   //{{AFX_MSG(CAboutDlgStd)
93   // No message handlers
94   //}}AFX_MSG
95   DECLARE_MESSAGE_MAP()
96
97 public:
98   CString ReadmeText;
99 };
100
101 CAboutDlgStd::CAboutDlgStd() : CDialog(CAboutDlgStd::IDD)
102 , ReadmeText(_T(""))
103 {
104   //{{AFX_DATA_INIT(CAboutDlgStd)
105   //}}AFX_DATA_INIT
106 }
107
108 void CAboutDlgStd::DoDataExchange(CDataExchange* pDX)
109 {
110   CDialog::DoDataExchange(pDX);
111   //{{AFX_DATA_MAP(CAboutDlgStd)
112   //}}AFX_DATA_MAP
113   DDX_Text(pDX, IDC_README, ReadmeText);
114 }
115
116 BEGIN_MESSAGE_MAP(CAboutDlgStd, CDialog)
117   //{{AFX_MSG_MAP(CAboutDlgStd)
118   // No message handlers
119   //}}AFX_MSG_MAP
120 END_MESSAGE_MAP()
121
122 BOOL CAboutDlgStd::OnInitDialog(){
123   CWnd* Title = GetDlgItem(IDC_ABOUTBOX_TITLE);
124
125   CString About = "About ";
126   CString Sample = "Sample ";
127   CString SampleName = ((OCC_App*)AfxGetApp())->GetSampleName();
128   CString Cascade = ", Open CASCADE Technology ";
129   CString Version = OCC_VERSION_STRING;
130
131   CString strTitle = Sample + SampleName + Cascade + Version;
132   CString dlgTitle = About + SampleName;
133
134   Title->SetWindowText(strTitle);
135   SetWindowText(dlgTitle);
136
137   CWnd* aReadmeEdit = GetDlgItem(IDC_README);
138   CFile aFile;
139   CString aHelpFilePath = CString (((OCC_App*)AfxGetApp())->GetInitDataDir()) + L"\\README.txt";
140   if(aFile.Open (aHelpFilePath, CFile::modeRead))
141   {
142     aReadmeEdit->ShowWindow(TRUE);
143     UINT aFileLength = (UINT)aFile.GetLength();
144     char* buffer = new char[aFileLength];
145     aFile.Read(buffer,aFileLength);
146     ReadmeText = buffer;
147     delete[] buffer;
148     ReadmeText.Replace (L"\n", L"\r\n");
149     UpdateData (FALSE);
150   }
151   else
152   {
153     aReadmeEdit->ShowWindow(FALSE);
154   }
155
156   CenterWindow();
157   return TRUE;
158 }
159
160 // App command to run the dialog
161 void OCC_App::OnAppAbout()
162 {
163   CAboutDlgStd aboutDlg;
164   aboutDlg.DoModal();
165 }
166
167 const wchar_t* OCC_App::GetSampleName() const
168 {
169   return (const wchar_t* )SampleName;
170 }
171
172 const wchar_t* OCC_App::GetInitDataDir() const
173 {
174   return (const wchar_t* )SamplePath;
175 }
176
177 void OCC_App::SetSampleName (const wchar_t* theName)
178 {
179   SampleName = theName;
180 }
181
182 //=============================================================================
183 // function: OnStereo
184 // purpose:
185 //=============================================================================
186 void OCC_App::OnStereo()
187 {
188   Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myGraphicDriver);
189
190   int anAnswer = MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd,
191     L"It is required to switch OpenGl context to turn on / off hardware stereo support. "
192     L"The document views need to be re-created to change \"GL\" context pixel format. "
193     L"This will close all current views and open new one (the model will be kept).\n"
194     L"Do you want to continue?", L"Enable/disable hardware stereo support", MB_OKCANCEL | MB_ICONQUESTION);
195   if (anAnswer != IDOK)
196   {
197     return;
198   }
199
200   Standard_Boolean& aStereoMode = aDriver->ChangeOptions().contextStereo;
201
202   aStereoMode = !aStereoMode;
203
204   // reset document views
205   POSITION aTemplateIt = GetFirstDocTemplatePosition();
206
207   while (aTemplateIt != NULL)
208   {
209     CDocTemplate* aTemplate = (CDocTemplate*)GetNextDocTemplate (aTemplateIt);
210
211     POSITION aDocumentIt = aTemplate->GetFirstDocPosition();
212
213     while (aDocumentIt != NULL)
214     {
215       OCC_BaseDoc* aDocument = dynamic_cast<OCC_BaseDoc*> (aTemplate->GetNextDoc (aDocumentIt));
216       if (aDocument == NULL)
217         continue;
218
219       aDocument->ResetDocumentViews (aTemplate);
220     }
221   }
222 }
223
224 //=============================================================================
225 // function: OnUpdateStereo
226 // purpose:
227 //=============================================================================
228 void OCC_App::OnUpdateStereo (CCmdUI* theCmdUI)
229 {
230   Handle(OpenGl_GraphicDriver) aDriver =
231     Handle(OpenGl_GraphicDriver)::DownCast (myGraphicDriver);
232
233   theCmdUI->SetCheck (!aDriver.IsNull() && aDriver->Options().contextStereo);
234 }