1 // MainFrm.cpp : implementation of the CMainFrame class
2 //
3 
4 #include "stdafx.h"
5 #include "Osmo4.h"
6 
7 #include "MainFrm.h"
8 #include "resource.h"
9 
10 #include <gpac/network.h>
11 
12 #ifdef _DEBUG
13 #define new DEBUG_NEW
14 #undef THIS_FILE
15 static char THIS_FILE[] = __FILE__;
16 #endif
17 
18 /////////////////////////////////////////////////////////////////////////////
19 // CChildView
20 
CChildView()21 CChildView::CChildView()
22 {
23 }
24 
~CChildView()25 CChildView::~CChildView()
26 {
27 	/*since the wndproc is overwritten by the terminal, we detach the handle otherwise we get a nice assertion
28 	failure from windows*/
29 	HWND hWnd = Detach();
30 	::PostMessage(hWnd, WM_QUIT, 0, 0);
31 }
32 
33 
BEGIN_MESSAGE_MAP(CChildView,CWnd)34 BEGIN_MESSAGE_MAP(CChildView,CWnd )
35 	//{{AFX_MSG_MAP(CChildView)
36 	//}}AFX_MSG_MAP
37 END_MESSAGE_MAP()
38 
39 
40 /////////////////////////////////////////////////////////////////////////////
41 // CChildView message handlers
42 
43 BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
44 {
45 	cs.dwExStyle = 0;
46 	cs.style &= ~WS_BORDER;
47 
48 	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
49 	                                   ::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
50 
51 	return TRUE;
52 }
53 
54 
55 
56 /////////////////////////////////////////////////////////////////////////////
57 // CMainFrame
58 
IMPLEMENT_DYNAMIC(CMainFrame,CFrameWnd)59 IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
60 
61 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
62 	//{{AFX_MSG_MAP(CMainFrame)
63 	ON_WM_CREATE()
64 	ON_WM_SETFOCUS()
65 	ON_WM_INITMENUPOPUP()
66 	ON_WM_SIZE()
67 	ON_WM_MOVE()
68 	ON_MESSAGE(WM_SETSIZE,OnSetSize)
69 	ON_MESSAGE(WM_NAVIGATE,OnNavigate)
70 	ON_MESSAGE(WM_OPENURL, Open)
71 	ON_MESSAGE(WM_NEWINSTANCE, NewInstanceOpened)
72 
73 	ON_WM_LBUTTONDOWN()
74 	ON_WM_LBUTTONDBLCLK()
75 	ON_WM_LBUTTONUP()
76 	ON_WM_CHAR()
77 	ON_WM_SYSKEYDOWN()
78 	ON_WM_SYSKEYUP()
79 	ON_WM_KEYDOWN()
80 	ON_WM_KEYUP()
81 	ON_WM_DROPFILES()
82 	ON_MESSAGE(WM_CONSOLEMSG, OnConsoleMessage)
83 	ON_COMMAND(ID_VIEW_ORIGINAL, OnViewOriginal)
84 	ON_COMMAND(ID_VIEW_FULLSCREEN, OnViewFullscreen)
85 	ON_COMMAND(ID_AR_KEEP, OnArKeep)
86 	ON_COMMAND(ID_AR_FILL, OnArFill)
87 	ON_COMMAND(ID_AR_43, OnAr43)
88 	ON_COMMAND(ID_AR_169, OnAr169)
89 	ON_UPDATE_COMMAND_UI(ID_AR_169, OnUpdateAr169)
90 	ON_UPDATE_COMMAND_UI(ID_AR_43, OnUpdateAr43)
91 	ON_UPDATE_COMMAND_UI(ID_AR_FILL, OnUpdateArFill)
92 	ON_UPDATE_COMMAND_UI(ID_AR_KEEP, OnUpdateArKeep)
93 	ON_COMMAND(ID_NAVIGATE_NONE, OnNavigateNone)
94 	ON_COMMAND(ID_NAVIGATE_WALK, OnNavigateWalk)
95 	ON_COMMAND(ID_NAVIGATE_FLY, OnNavigateFly)
96 	ON_COMMAND(ID_NAVIGATE_EXAM, OnNavigateExam)
97 	ON_COMMAND(ID_NAVIGATE_SLIDE, OnNavigateSlide)
98 	ON_COMMAND(ID_NAVIGATE_PAN, OnNavigatePan)
99 	ON_COMMAND(ID_NAVIGATE_ORBIT, OnNavigateOrbit)
100 	ON_COMMAND(ID_NAVIGATE_GAME, OnNavigateGame)
101 	ON_COMMAND(ID_NAVIGATE_VR, OnNavigateVR)
102 	ON_COMMAND(ID_NAV_RESET, OnNavigateReset)
103 	ON_COMMAND(ID_SHORTCUTS, OnShortcuts)
104 	ON_COMMAND(IDD_CONFIGURE, OnConfigure)
105 	ON_COMMAND(ID_FILE_PROP, OnFileProp)
106 	ON_COMMAND(ID_VIEW_PL, OnViewPlaylist)
107 	ON_UPDATE_COMMAND_UI(ID_FILE_PROP, OnUpdateFileProp)
108 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_NONE, OnUpdateNavigate)
109 	ON_COMMAND(ID_REC_ENABLE, OnCacheEnable)
110 	ON_UPDATE_COMMAND_UI(ID_REC_ENABLE, OnUpdateCacheEnable)
111 	ON_COMMAND(ID_REC_STOP, OnCacheStop)
112 	ON_COMMAND(ID_REC_ABORT, OnCacheAbort)
113 	ON_UPDATE_COMMAND_UI(ID_REC_STOP, OnUpdateCacheStop)
114 	ON_COMMAND(ID_COLLIDE_DISP, OnCollideDisp)
115 	ON_UPDATE_COMMAND_UI(ID_COLLIDE_DISP, OnUpdateCollideDisp)
116 	ON_COMMAND(ID_COLLIDE_NONE, OnCollideNone)
117 	ON_UPDATE_COMMAND_UI(ID_COLLIDE_NONE, OnUpdateCollideNone)
118 	ON_COMMAND(ID_COLLIDE_REG, OnCollideReg)
119 	ON_UPDATE_COMMAND_UI(ID_COLLIDE_REG, OnUpdateCollideReg)
120 	ON_COMMAND(ID_HEADLIGHT, OnHeadlight)
121 	ON_UPDATE_COMMAND_UI(ID_HEADLIGHT, OnUpdateHeadlight)
122 	ON_COMMAND(ID_GRAVITY, OnGravity)
123 	ON_UPDATE_COMMAND_UI(ID_GRAVITY, OnUpdateGravity)
124 	ON_COMMAND(ID_NAV_INFO, OnNavInfo)
125 	ON_COMMAND(ID_NAV_NEXT, OnNavNext)
126 	ON_COMMAND(ID_NAV_PREV, OnNavPrev)
127 	ON_UPDATE_COMMAND_UI(ID_NAV_NEXT, OnUpdateNavNext)
128 	ON_UPDATE_COMMAND_UI(ID_NAV_PREV, OnUpdateNavPrev)
129 	ON_COMMAND(ID_CLEAR_NAV, OnClearNav)
130 	ON_UPDATE_COMMAND_UI(ID_VIEW_PL, OnUpdateViewPlaylist)
131 	ON_COMMAND(ID_PLAYLIST_LOOP, OnPlaylistLoop)
132 	ON_UPDATE_COMMAND_UI(ID_PLAYLIST_LOOP, OnUpdatePlaylistLoop)
133 	ON_COMMAND(ID_ADD_SUBTITLE, OnAddSubtitle)
134 	ON_UPDATE_COMMAND_UI(ID_REC_ABORT, OnUpdateCacheStop)
135 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_WALK, OnUpdateNavigate)
136 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_FLY, OnUpdateNavigate)
137 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_EXAM, OnUpdateNavigate)
138 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_PAN, OnUpdateNavigate)
139 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_SLIDE, OnUpdateNavigate)
140 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_ORBIT, OnUpdateNavigate)
141 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_VR, OnUpdateNavigate)
142 	ON_UPDATE_COMMAND_UI(ID_NAVIGATE_GAME, OnUpdateNavigate)
143 	ON_COMMAND(ID_FILE_EXIT, OnFileExit)
144 	ON_COMMAND(ID_VIEW_CPU, OnViewCPU)
145 	ON_UPDATE_COMMAND_UI(ID_VIEW_CPU, OnUpdateViewCPU)
146 
147 	ON_COMMAND(ID_FILE_COPY, OnFileCopy)
148 	ON_UPDATE_COMMAND_UI(ID_FILE_COPY, OnUpdateFileCopy)
149 	ON_COMMAND(ID_FILE_PASTE, OnFilePaste)
150 	ON_UPDATE_COMMAND_UI(ID_FILE_PASTE, OnUpdateFilePaste)
151 
152 	//}}AFX_MSG_MAP
153 END_MESSAGE_MAP()
154 
155 
156 /////////////////////////////////////////////////////////////////////////////
157 // CMainFrame construction/destruction
158 
159 CMainFrame::CMainFrame()
160 {
161 	m_icoerror = AfxGetApp()->LoadIcon(IDI_ERR);
162 	m_icomessage = AfxGetApp()->LoadIcon(IDI_MESSAGE);
163 	m_bFullScreen = GF_FALSE;
164 	m_RestoreFS = 0;
165 	m_aspect_ratio = GF_ASPECT_RATIO_KEEP;
166 	m_pProps = NULL;
167 	m_pOpt = NULL;
168 	m_pPlayList = NULL;
169 	m_pWndView = new CChildView();
170 	m_bInitShow = GF_TRUE;
171 	m_bStartupFile = GF_TRUE;
172 	m_num_chapters = 0;
173 	m_chapters_start = NULL;
174 	m_last_prog = -1;
175 	m_timer_on = 0;
176 	m_show_rti = GF_FALSE;
177 	nb_viewpoints = 0;
178 }
179 
~CMainFrame()180 CMainFrame::~CMainFrame()
181 {
182 	if (m_chapters_start) gf_free(m_chapters_start);
183 	if (m_pProps != NULL) m_pProps->DestroyWindow();
184 	if (m_pOpt != NULL) m_pOpt->DestroyWindow();
185 	if (m_pPlayList != NULL) delete m_pPlayList;
186 	delete m_pWndView;
187 }
188 
189 #define RTI_TIMER	22
190 #define RTI_REFRESH_MS		250
191 
RTInfoTimer(HWND,UINT,UINT_PTR nID,DWORD)192 void CALLBACK EXPORT RTInfoTimer(HWND , UINT , UINT_PTR nID , DWORD )
193 {
194 	char szMsg[100];
195 	GF_SystemRTInfo rti;
196 	if (nID != RTI_TIMER) return;
197 	Osmo4 *app = GetApp();
198 	CMainFrame *pFrame = (CMainFrame *) app->m_pMainWnd;
199 	/*shutdown*/
200 	if (!pFrame) return;
201 
202 	if (pFrame->m_show_rti && !pFrame->m_timer_on) {
203 		if (!gf_sys_get_rti(RTI_REFRESH_MS, &rti, 0)) return;
204 		if (!rti.gpac_memory) rti.gpac_memory = rti.process_memory ? rti.process_memory : rti.physical_memory;
205 
206 		if (pFrame->m_show_rti && !pFrame->m_timer_on) {
207 			sprintf(szMsg, "FPS %02.2f - CPU %02d (%02d) - Mem %d kB",
208 			        gf_term_get_framerate(app->m_term, GF_FALSE), rti.total_cpu_usage, rti.process_cpu_usage, rti.gpac_memory/1024);
209 			pFrame->m_wndStatusBar.SetPaneText(1, szMsg);
210 		}
211 	}
212 
213 	if (! gf_term_get_option(app->m_term, GF_OPT_IS_FINISHED)) {
214 		u32 ms = gf_term_get_time_in_ms(app->m_term);
215 		u32 h = ms / 1000 / 3600;
216 		u32 m = ms / 1000 / 60 - h*60;
217 		u32 s = ms / 1000 - h*3600 - m*60;
218 
219 		sprintf(szMsg, "%02d:%02d.%02d", h, m, s);
220 		pFrame->m_wndStatusBar.SetPaneText(0, szMsg);
221 	}
222 }
223 
224 static UINT status_indics[] =
225 {
226 	ID_TIMER,
227 	ID_SEPARATOR,           // status line indicator
228 };
229 
230 
231 
OnCreate(LPCREATESTRUCT lpCreateStruct)232 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
233 {
234 	UINT buttonArray[50];
235 	TBBUTTONINFO bi;
236 	u32 *ba;
237 	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
238 		return -1;
239 
240 	// create a view to occupy the client area of the frame
241 	if (!m_pWndView->CreateEx(0, NULL, NULL, WS_CHILD, 0, 0, 300, 200, m_hWnd, NULL, NULL))
242 	{
243 		TRACE0("Failed to create view window\n");
244 		return -1;
245 	}
246 	m_pPlayList = new Playlist();
247 	m_pPlayList->Create();
248 	m_pPlayList->ShowWindow(SW_HIDE);
249 
250 
251 	if (!m_wndToolBar.CreateEx(this, WS_CHILD | CBRS_TOP | CBRS_FLYBY) ||
252 	        !m_wndToolBar.LoadBitmap(IDR_MAINTOOLS))
253 	{
254 		TRACE0("Failed to create toolbar\n");
255 		return -1;      // fail to create
256 	}
257 
258 	ba = &buttonArray[0];
259 	*ba = ID_OPEN_FILE;
260 	ba++;
261 	*ba = ID_SEPARATOR;
262 	ba++;
263 	*ba = ID_NAV_PREV;
264 	ba++;
265 	*ba = ID_NAV_NEXT;
266 	ba++;
267 	*ba = ID_SEPARATOR;
268 	ba++;
269 	*ba = ID_FILE_PLAY;
270 	ba++;
271 	*ba = ID_FILE_STEP;
272 	ba++;
273 	*ba = ID_FILE_STOP;
274 	ba++;
275 	*ba = ID_SEPARATOR;
276 	ba++;
277 	*ba = ID_FILE_PROP;
278 	ba++;
279 	*ba = ID_SEPARATOR;
280 	ba++;
281 	*ba = ID_FILE_PROP;
282 	ba++;
283 	*ba = ID_SWITCH_RENDER;
284 	m_wndToolBar.SetButtons(buttonArray, 13);
285 	m_wndToolBar.SetButtonInfo(0, ID_OPEN_FILE, TBBS_BUTTON, 0);
286 	m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR, TBBS_SEPARATOR, 0);
287 	m_wndToolBar.SetButtonInfo(2, ID_NAV_PREV, TBBS_DROPDOWN, 1);
288 	m_wndToolBar.SetButtonInfo(3, ID_NAV_NEXT, TBBS_DROPDOWN, 2);
289 	m_wndToolBar.SetButtonInfo(4, ID_SEPARATOR, TBBS_SEPARATOR, 0);
290 	m_wndToolBar.SetButtonInfo(5, ID_FILE_PLAY, TBBS_BUTTON, 3);
291 	m_wndToolBar.SetButtonInfo(6, ID_FILE_STEP, TBBS_BUTTON, 5);
292 	m_wndToolBar.SetButtonInfo(7, ID_FILE_STOP, TBBS_BUTTON, 6);
293 	m_wndToolBar.SetButtonInfo(8, ID_SEPARATOR, TBBS_SEPARATOR, 0);
294 	m_wndToolBar.SetButtonInfo(9, ID_FILE_PROP, TBBS_BUTTON, 7);
295 	m_wndToolBar.SetButtonInfo(10, ID_SEPARATOR, TBBS_SEPARATOR, 0);
296 	m_wndToolBar.SetButtonInfo(11, IDD_CONFIGURE, TBBS_BUTTON, 8);
297 	m_wndToolBar.SetButtonInfo(12, ID_SWITCH_RENDER, TBBS_BUTTON, 9);
298 
299 	CToolBarCtrl &ctrl = m_wndToolBar.GetToolBarCtrl();
300 	ctrl.SetStyle(TBSTYLE_FLAT | TBSTYLE_DROPDOWN);
301 	ctrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
302 
303 	memset(&bi, 0, sizeof(bi));
304 	bi.cbSize = sizeof(bi);
305 	ctrl.GetButtonInfo(2, &bi);
306 	bi.fsStyle |= TBSTYLE_DROPDOWN;
307 	ctrl.SetButtonInfo(ID_NAV_PREV, &bi);
308 
309 	memset(&bi, 0, sizeof(bi));
310 	bi.cbSize = sizeof(bi);
311 	ctrl.GetButtonInfo(3, &bi);
312 	bi.fsStyle |= TBSTYLE_DROPDOWN;
313 	ctrl.SetButtonInfo(ID_NAV_NEXT, &bi);
314 
315 	if (!m_wndStatusBar.Create(this) ||
316 	        !m_wndStatusBar.SetIndicators(status_indics,
317 	                                      sizeof(status_indics)/sizeof(UINT)))
318 	{
319 		TRACE0("Failed to create status bar\n");
320 		return -1;      // fail to create
321 	}
322 
323 	if (!m_Address.Create(this, IDD_NAVBAR, WS_CHILD | CBRS_TOP | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, IDD_NAVBAR) ) {
324 		return -1;      // fail to create
325 	}
326 
327 	if (!m_Sliders.Create(IDD_SLIDERS, this) ) {
328 		return -1;      // fail to create
329 	}
330 
331 	m_wndStatusBar.SetPaneInfo(0, ID_TIMER, SBPS_NORMAL, 60);
332 	m_wndStatusBar.SetPaneInfo(1, ID_SEPARATOR, SBPS_STRETCH, 0);
333 	SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE);
334 	SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), FALSE);
335 
336 	SetTimer(RTI_TIMER, RTI_REFRESH_MS, RTInfoTimer);
337 	return 0;
338 }
339 
340 
PreCreateWindow(CREATESTRUCT & cs)341 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
342 {
343 	if( !CFrameWnd::PreCreateWindow(cs) )
344 		return FALSE;
345 	// TODO: Modify the Window class or styles here by modifying
346 	//  the CREATESTRUCT cs
347 
348 	cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
349 	cs.lpszClass = AfxRegisterWndClass(0);
350 	return TRUE;
351 }
352 
353 /////////////////////////////////////////////////////////////////////////////
354 // CMainFrame diagnostics
355 
356 #ifdef _DEBUG
AssertValid() const357 void CMainFrame::AssertValid() const
358 {
359 	CFrameWnd::AssertValid();
360 }
361 
Dump(CDumpContext & dc) const362 void CMainFrame::Dump(CDumpContext& dc) const
363 {
364 	CFrameWnd::Dump(dc);
365 }
366 
367 #endif //_DEBUG
368 
369 /////////////////////////////////////////////////////////////////////////////
370 // CMainFrame message handlers
OnSetFocus(CWnd * pOldWnd)371 void CMainFrame::OnSetFocus(CWnd* pOldWnd)
372 {
373 	m_pWndView->SetFocus();
374 	if (m_RestoreFS==1) {
375 		m_RestoreFS=2;
376 	}
377 	else if (m_RestoreFS==2) {
378 		m_RestoreFS = 0;
379 		SetFullscreen();
380 	}
381 }
382 
OnCmdMsg(UINT nID,int nCode,void * pExtra,AFX_CMDHANDLERINFO * pHandlerInfo)383 BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
384 {
385 	// let the view have first crack at the command
386 	if (m_pWndView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
387 		return TRUE;
388 
389 	// otherwise, do default handling
390 	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
391 }
392 
393 
OnSize(UINT nType,int cx,int cy)394 void CMainFrame::OnSize(UINT nType, int cx, int cy)
395 {
396 	RECT rc2;
397 	u32 tool_h, slide_h, add_h, stat_h;
398 
399 	if (m_bInitShow) {
400 		CFrameWnd::OnSize(nType, cx, cy);
401 		return;
402 	}
403 	m_wndToolBar.GetClientRect(&rc2);
404 	tool_h = rc2.bottom - rc2.top;
405 	m_Address.GetClientRect(&rc2);
406 	add_h = rc2.bottom - rc2.top;
407 	m_Sliders.GetClientRect(&rc2);
408 	slide_h = rc2.bottom - rc2.top;
409 	m_wndStatusBar.GetClientRect(&rc2);
410 	stat_h = rc2.bottom - rc2.top;
411 	if ((u32) cy <= tool_h+add_h+slide_h+stat_h) {
412 		OnSetSize(cx, 1);
413 		return;
414 	}
415 
416 	CFrameWnd::OnSize(nType, cx, cy);
417 	cy -= tool_h + add_h + slide_h + stat_h;
418 
419 	m_Address.SetWindowPos(this, 0, 0, cx, add_h, SWP_SHOWWINDOW | SWP_NOMOVE);
420 
421 	m_pWndView->ShowWindow(SW_SHOW);
422 	m_pWndView->SetWindowPos(this, 0, add_h + tool_h, cx, cy, SWP_NOZORDER);
423 
424 	m_Sliders.SetWindowPos(this, 0, add_h + tool_h + cy, cx, slide_h, SWP_NOZORDER|SWP_SHOWWINDOW);
425 	/*and resize term*/
426 	gf_term_set_size(GetApp()->m_term, cx, cy);
427 }
428 
429 
OnSetSize(WPARAM wParam,LPARAM lParam)430 LRESULT CMainFrame::OnSetSize(WPARAM wParam, LPARAM lParam)
431 {
432 	UINT width, height;
433 	width = (UINT) wParam;
434 	height = (UINT) lParam;
435 	if (m_bInitShow) {
436 		m_wndToolBar.UpdateWindow();
437 		m_wndToolBar.ShowWindow(SW_SHOW);
438 		m_Address.UpdateWindow();
439 		m_Address.ShowWindow(SW_SHOW);
440 		m_Sliders.UpdateWindow();
441 		m_Sliders.ShowWindow(SW_SHOW);
442 		m_Sliders.m_PosSlider.EnableWindow(FALSE);
443 		m_pWndView->ShowWindow(SW_SHOW);
444 		ShowWindow(SW_SHOW);
445 		m_bInitShow = GF_FALSE;
446 	}
447 
448 	RECT winRect;
449 	winRect.left = 0;
450 	winRect.right = width;
451 	winRect.top = 0;
452 	winRect.bottom = height;
453 	AdjustWindowRectEx(&winRect, GetStyle(), TRUE, GetExStyle());
454 	winRect.bottom -= winRect.top;
455 	winRect.right -= winRect.left;
456 	winRect.left = winRect.top = 0;
457 
458 	RECT rc2;
459 	m_Address.GetClientRect(&rc2);
460 	winRect.bottom += rc2.bottom;
461 	m_wndToolBar.GetClientRect(&rc2);
462 	winRect.bottom += rc2.bottom;
463 	m_Sliders.GetClientRect(&rc2);
464 	winRect.bottom += rc2.bottom;
465 	m_wndStatusBar.GetClientRect(&rc2);
466 	winRect.bottom += rc2.bottom;
467 
468 	GetWindowRect(&rc2);
469 	rc2.bottom -= rc2.top;
470 	rc2.right -= rc2.left;
471 	if ((rc2.right != winRect.right) || (rc2.bottom != winRect.bottom)) {
472 		SetWindowPos(NULL, 0, 0, winRect.right, winRect.bottom, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW);
473 	} else {
474 		/*just resize term*/
475 		//gf_term_set_size(GetApp()->m_term, width, height);
476 		SetWindowPos(NULL, 0, 0, winRect.right, winRect.bottom, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW);
477 	}
478 	return 0;
479 }
480 
OnMove(int x,int y)481 void CMainFrame::OnMove(int x, int y)
482 {
483 	CFrameWnd::OnMove(x, y);
484 	RECT rc;
485 
486 	m_wndToolBar.GetClientRect(&rc);
487 	m_wndToolBar.SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
488 	y += rc.bottom - rc.top;
489 	m_Address.SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
490 	m_Address.GetClientRect(&rc);
491 	y += rc.bottom - rc.top;
492 	m_pWndView->SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE);
493 	m_pWndView->GetClientRect(&rc);
494 	y += rc.bottom;
495 	m_Sliders.SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
496 }
497 
498 
499 #define PROGRESS_TIMER	20
500 #define PROGRESS_REFRESH_MS		100
501 
ProgressTimer(HWND,UINT,UINT_PTR nID,DWORD)502 void CALLBACK EXPORT ProgressTimer(HWND , UINT , UINT_PTR nID , DWORD )
503 {
504 	u32 now;
505 	if (nID != PROGRESS_TIMER) return;
506 	Osmo4 *app = GetApp();
507 	CMainFrame *pFrame = (CMainFrame *) app->m_pMainWnd;
508 	/*shutdown*/
509 	if (!pFrame) return;
510 
511 	now = gf_term_get_time_in_ms(app->m_term);
512 	if (!now) return;
513 
514 	if (app->can_seek && !pFrame->m_Sliders.m_grabbed) {
515 		if (now >= app->max_duration + 100) {
516 			if (gf_term_get_option(app->m_term, GF_OPT_IS_FINISHED)) {
517 				pFrame->m_pPlayList->PlayNext();
518 			}
519 			/*if no IsOver go on forever*/
520 		} else {
521 			if (!app->m_reset)
522 				pFrame->m_Sliders.m_PosSlider.SetPos(now);
523 		}
524 	}
525 }
526 
SetProgTimer(Bool bOn)527 void CMainFrame::SetProgTimer(Bool bOn)
528 {
529 	if (bOn)
530 		SetTimer(PROGRESS_TIMER, PROGRESS_REFRESH_MS, ProgressTimer);
531 	else
532 		KillTimer(PROGRESS_TIMER);
533 }
534 
535 
Open(WPARAM wParam,LPARAM lParam)536 LRESULT CMainFrame::Open(WPARAM wParam, LPARAM lParam)
537 {
538 	Bool do_pause;
539 	Osmo4 *app = GetApp();
540 	CString txt, url;
541 	m_bStartupFile = GF_FALSE;
542 	txt = "Osmo4 - ";
543 	txt += m_pPlayList->GetDisplayName();
544 
545 	url = m_pPlayList->GetURL();
546 	m_Address.m_Address.SetWindowText(url);
547 	SetWindowText(txt);
548 	if (app->start_mode==1) do_pause = GF_TRUE;
549 	else if (app->start_mode==2) do_pause = GF_FALSE;
550 	else do_pause = /*!app->m_AutoPlay*/GF_FALSE;
551 	gf_term_connect_from_time(app->m_term, (LPCSTR) url, app->m_reconnect_time, do_pause);
552 	app->m_reconnect_time = 0;
553 	app->start_mode = 0;
554 	app->UpdatePlayButton();
555 	nb_viewpoints = 0;
556 	return 1;
557 }
558 
NewInstanceOpened(WPARAM wParam,LPARAM lParam)559 LRESULT CMainFrame::NewInstanceOpened(WPARAM wParam, LPARAM lParam)
560 {
561 	Bool queue_only = GF_FALSE;
562 	char *url = (char *) static_gpac_get_url();
563 	if (!strnicmp(url, "-queue ", 7)) {
564 		queue_only = GF_TRUE;
565 		url += 7;
566 	}
567 	m_pPlayList->QueueURL(url);
568 	m_pPlayList->RefreshList();
569 	if (!queue_only) m_pPlayList->PlayNext();
570 	return 1;
571 }
572 
573 
ForwardMessage()574 void CMainFrame::ForwardMessage()
575 {
576 	const MSG *msg = GetCurrentMessage();
577 	m_pWndView->SendMessage(msg->message, msg->wParam, msg->lParam);
578 }
OnSysKeyUp(UINT,UINT,UINT)579 void CMainFrame::OnSysKeyUp(UINT , UINT , UINT ) {
580 	ForwardMessage();
581 }
OnSysKeyDown(UINT,UINT,UINT)582 void CMainFrame::OnSysKeyDown(UINT , UINT , UINT ) {
583 	ForwardMessage();
584 }
OnChar(UINT,UINT,UINT)585 void CMainFrame::OnChar(UINT , UINT , UINT ) {
586 	ForwardMessage();
587 }
OnKeyDown(UINT,UINT,UINT)588 void CMainFrame::OnKeyDown(UINT , UINT , UINT ) {
589 	ForwardMessage();
590 }
OnKeyUp(UINT,UINT,UINT)591 void CMainFrame::OnKeyUp(UINT , UINT , UINT ) {
592 	ForwardMessage();
593 }
OnLButtonDown(UINT,CPoint)594 void CMainFrame::OnLButtonDown(UINT , CPoint ) {
595 	ForwardMessage();
596 }
OnLButtonDblClk(UINT,CPoint)597 void CMainFrame::OnLButtonDblClk(UINT , CPoint ) {
598 	ForwardMessage();
599 }
OnLButtonUp(UINT,CPoint)600 void CMainFrame::OnLButtonUp(UINT , CPoint ) {
601 	ForwardMessage();
602 }
603 
OnDropFiles(HDROP hDropInfo)604 void CMainFrame::OnDropFiles(HDROP hDropInfo)
605 {
606 	u32 i, count;
607 	Osmo4 *app = GetApp();
608 	char fileName[MAX_PATH];
609 
610 	count = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
611 	if (!count) return;
612 
613 	/*if playing and sub d&d, open sub in current presentation*/
614 	if (app->m_isopen && (count==1)) {
615 		::DragQueryFile(hDropInfo, 0, fileName, MAX_PATH);
616 		char *ext = strrchr(fileName, '.');
617 		if (ext && ( !stricmp(ext, ".srt") || !stricmp(ext, ".sub") || !stricmp(ext, ".ttxt") || !stricmp(ext, ".xml") ) ) {
618 			AddSubtitle(fileName, GF_TRUE);
619 			return;
620 		}
621 	}
622 
623 	/*	if (count==1)
624 			m_pPlayList->Truncate();
625 		else
626 	*/		m_pPlayList->Clear();
627 
628 	for (i=0; i<count; i++) {
629 		::DragQueryFile (hDropInfo, i, fileName, MAX_PATH);
630 		m_pPlayList->QueueURL(fileName);
631 	}
632 	m_pPlayList->RefreshList();
633 	m_pPlayList->PlayNext();
634 }
635 
ConsoleTimer(HWND,UINT,UINT_PTR,DWORD)636 void CALLBACK EXPORT ConsoleTimer(HWND , UINT , UINT_PTR , DWORD )
637 {
638 	CMainFrame *pFrame = (CMainFrame *) GetApp()->m_pMainWnd;
639 
640 	pFrame->m_wndStatusBar.GetStatusBarCtrl().SetIcon(2, NULL);
641 	pFrame->KillTimer(pFrame->m_timer_on);
642 	pFrame->m_timer_on = 0;
643 	pFrame->m_wndStatusBar.SetPaneText(1, "Ready");
644 }
645 
646 #define CONSOLE_DISPLAY_TIME	1000
647 
OnConsoleMessage(WPARAM wParam,LPARAM lParam)648 LRESULT CMainFrame::OnConsoleMessage(WPARAM wParam, LPARAM lParam)
649 {
650 	if (m_timer_on) KillTimer(m_timer_on);
651 
652 	if (console_err>=0) {
653 		m_wndStatusBar.GetStatusBarCtrl().SetIcon(2, m_icomessage);
654 		m_wndStatusBar.SetPaneText(1, console_message);
655 	} else {
656 		char msg[5000];
657 		m_wndStatusBar.GetStatusBarCtrl().SetIcon(2, m_icoerror);
658 		sprintf(msg, "%s (%s)", console_message, console_service);
659 		m_wndStatusBar.SetPaneText(1, msg);
660 	}
661 	m_timer_on = SetTimer(10, wParam ? (UINT) wParam : CONSOLE_DISPLAY_TIME, ConsoleTimer);
662 	return 0;
663 }
664 
DestroyWindow()665 BOOL CMainFrame::DestroyWindow()
666 {
667 	if (GetApp()->m_isopen) KillTimer(PROGRESS_TIMER);
668 	/*signal close to prevent callbacks but don't close, this is done in ExitInstance (otherwise there's a
669 	deadlock happening not sure why yet)*/
670 //	GetApp()->m_open = 0;
671 	return CFrameWnd::DestroyWindow();
672 }
673 
674 
OnViewOriginal()675 void CMainFrame::OnViewOriginal()
676 {
677 	Osmo4 *gpac = GetApp();
678 	gf_term_set_option(gpac->m_term, GF_OPT_ORIGINAL_VIEW, 1);
679 	OnSetSize(gpac->orig_width, gpac->orig_height);
680 }
681 
SetFullscreen()682 void CMainFrame::SetFullscreen()
683 {
684 	Osmo4 *gpac = GetApp();
685 	if (!m_bFullScreen) {
686 		GetWindowRect(&backup_wnd_rc);
687 		if (gf_term_set_option(gpac->m_term, GF_OPT_FULLSCREEN, 1) == GF_OK)
688 			m_bFullScreen = GF_TRUE;
689 	} else {
690 		if (gf_term_set_option(gpac->m_term, GF_OPT_FULLSCREEN, 0) == GF_OK)
691 			m_bFullScreen = GF_FALSE;
692 		SetWindowPos(NULL, backup_wnd_rc.left, backup_wnd_rc.top, backup_wnd_rc.right-backup_wnd_rc.left, backup_wnd_rc.bottom-backup_wnd_rc.top, SWP_NOZORDER);
693 	}
694 }
695 
OnViewFullscreen()696 void CMainFrame::OnViewFullscreen()
697 {
698 	SetFullscreen();
699 }
700 
OnArKeep()701 void CMainFrame::OnArKeep()
702 {
703 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_KEEP);
704 	m_aspect_ratio = GF_ASPECT_RATIO_KEEP;
705 }
706 
OnArFill()707 void CMainFrame::OnArFill()
708 {
709 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_FILL_SCREEN);
710 	m_aspect_ratio = GF_ASPECT_RATIO_FILL_SCREEN;
711 }
712 
OnAr43()713 void CMainFrame::OnAr43()
714 {
715 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_4_3);
716 	m_aspect_ratio = GF_ASPECT_RATIO_4_3;
717 }
718 
OnAr169()719 void CMainFrame::OnAr169()
720 {
721 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_16_9);
722 	m_aspect_ratio = GF_ASPECT_RATIO_16_9;
723 }
724 
OnUpdateAr169(CCmdUI * pCmdUI)725 void CMainFrame::OnUpdateAr169(CCmdUI* pCmdUI)
726 {
727 	pCmdUI->SetCheck(m_aspect_ratio == GF_ASPECT_RATIO_16_9);
728 }
729 
OnUpdateAr43(CCmdUI * pCmdUI)730 void CMainFrame::OnUpdateAr43(CCmdUI* pCmdUI)
731 {
732 	pCmdUI->SetCheck(m_aspect_ratio == GF_ASPECT_RATIO_4_3);
733 }
734 
OnUpdateArFill(CCmdUI * pCmdUI)735 void CMainFrame::OnUpdateArFill(CCmdUI* pCmdUI)
736 {
737 	pCmdUI->SetCheck(m_aspect_ratio == GF_ASPECT_RATIO_FILL_SCREEN);
738 }
739 
OnUpdateArKeep(CCmdUI * pCmdUI)740 void CMainFrame::OnUpdateArKeep(CCmdUI* pCmdUI)
741 {
742 	pCmdUI->SetCheck(m_aspect_ratio == GF_ASPECT_RATIO_KEEP);
743 }
744 
OnUpdateNavigate(CCmdUI * pCmdUI)745 void CMainFrame::OnUpdateNavigate(CCmdUI* pCmdUI)
746 {
747 	BOOL enable;
748 	Osmo4 *app = GetApp();
749 	pCmdUI->Enable(FALSE);
750 	if (!app->m_isopen) return;
751 
752 	u32 type = gf_term_get_option(app->m_term, GF_OPT_NAVIGATION_TYPE);
753 	enable = type ? TRUE : FALSE;
754 
755 	if (pCmdUI->m_nID==ID_NAV_RESET) {
756 		pCmdUI->Enable(TRUE);
757 		return;
758 	}
759 
760 	u32 mode = gf_term_get_option(app->m_term, GF_OPT_NAVIGATION);
761 	/*common 2D/3D modes*/
762 	if (pCmdUI->m_nID==ID_NAVIGATE_NONE) {
763 		pCmdUI->Enable(enable);
764 		pCmdUI->SetCheck(mode ? 0 : 1);
765 	}
766 	else if (pCmdUI->m_nID==ID_NAVIGATE_EXAM) {
767 		pCmdUI->Enable(enable);
768 		pCmdUI->SetCheck((mode==GF_NAVIGATE_EXAMINE) ? 1 : 0);
769 	}
770 	else if (pCmdUI->m_nID==ID_NAVIGATE_SLIDE) {
771 		pCmdUI->Enable(enable);
772 		pCmdUI->SetCheck((mode==GF_NAVIGATE_SLIDE) ? 1 : 0);
773 	}
774 
775 	if (type==GF_NAVIGATE_TYPE_2D) return;
776 	pCmdUI->Enable(enable);
777 	if (pCmdUI->m_nID==ID_NAVIGATE_WALK) pCmdUI->SetCheck((mode==GF_NAVIGATE_WALK) ? 1 : 0);
778 	else if (pCmdUI->m_nID==ID_NAVIGATE_FLY) pCmdUI->SetCheck((mode==GF_NAVIGATE_FLY) ? 1 : 0);
779 	else if (pCmdUI->m_nID==ID_NAVIGATE_PAN) pCmdUI->SetCheck((mode==GF_NAVIGATE_PAN) ? 1 : 0);
780 	else if (pCmdUI->m_nID==ID_NAVIGATE_VR) pCmdUI->SetCheck((mode==GF_NAVIGATE_VR) ? 1 : 0);
781 	else if (pCmdUI->m_nID==ID_NAVIGATE_GAME) pCmdUI->SetCheck((mode==GF_NAVIGATE_GAME) ? 1 : 0);
782 }
783 
784 
SetNavigate(u32 mode)785 void CMainFrame::SetNavigate(u32 mode)
786 {
787 	Osmo4 *app = GetApp();
788 	gf_term_set_option(app->m_term, GF_OPT_NAVIGATION, mode);
789 }
OnNavigateNone()790 void CMainFrame::OnNavigateNone() {
791 	SetNavigate(GF_NAVIGATE_NONE);
792 }
OnNavigateWalk()793 void CMainFrame::OnNavigateWalk() {
794 	SetNavigate(GF_NAVIGATE_WALK);
795 }
OnNavigateFly()796 void CMainFrame::OnNavigateFly() {
797 	SetNavigate(GF_NAVIGATE_FLY);
798 }
OnNavigateExam()799 void CMainFrame::OnNavigateExam() {
800 	SetNavigate(GF_NAVIGATE_EXAMINE);
801 }
OnNavigateSlide()802 void CMainFrame::OnNavigateSlide() {
803 	SetNavigate(GF_NAVIGATE_SLIDE);
804 }
OnNavigatePan()805 void CMainFrame::OnNavigatePan() {
806 	SetNavigate(GF_NAVIGATE_PAN);
807 }
OnNavigateOrbit()808 void CMainFrame::OnNavigateOrbit() {
809 	SetNavigate(GF_NAVIGATE_ORBIT);
810 }
OnNavigateVR()811 void CMainFrame::OnNavigateVR() {
812 	SetNavigate(GF_NAVIGATE_VR);
813 }
OnNavigateGame()814 void CMainFrame::OnNavigateGame() {
815 	SetNavigate(GF_NAVIGATE_GAME);
816 }
817 
OnNavigateReset()818 void CMainFrame::OnNavigateReset()
819 {
820 	Osmo4 *app = GetApp();
821 	gf_term_set_option(app->m_term, GF_OPT_NAVIGATION_TYPE, 0);
822 }
823 
824 
OnNavigate(WPARAM,LPARAM)825 LRESULT CMainFrame::OnNavigate(WPARAM /*wParam*/, LPARAM /*lParam*/)
826 {
827 	Osmo4 *gpac = GetApp();
828 
829 	/*this is a migrate instruction, just disconnect the player*/
830 	if (gpac->m_navigate_url.IsEmpty() ) {
831 		gf_term_disconnect(gpac->m_term);
832 		return 0;
833 	}
834 
835 	if (gf_term_is_supported_url(gpac->m_term, gpac->m_navigate_url, GF_TRUE, gpac->m_NoMimeFetch)) {
836 		char *str = gf_url_concatenate(m_pPlayList->GetURL(), gpac->m_navigate_url);
837 		if (str) {
838 			m_pPlayList->Truncate();
839 			m_pPlayList->QueueURL(str);
840 			gf_free(str);
841 			m_pPlayList->RefreshList();
842 			m_pPlayList->PlayNext();
843 			return 0;
844 		}
845 	}
846 
847 	if (m_bFullScreen) {
848 		SetFullscreen();
849 		m_RestoreFS = 1;
850 	}
851 
852 	console_message = gpac->m_navigate_url;
853 	console_err = GF_OK;
854 	PostMessage(WM_CONSOLEMSG);
855 	ShellExecute(NULL, "open", (LPCSTR) gpac->m_navigate_url, NULL, NULL, SW_SHOWNORMAL);
856 
857 	return 0;
858 }
859 
OnFileProp()860 void CMainFrame::OnFileProp()
861 {
862 	if (!m_pProps) {
863 		m_pProps = new CFileProps(this);
864 		m_pProps->Create(this);
865 	}
866 	m_pProps->ShowWindow(SW_SHOW);
867 }
868 
OnUpdateFileProp(CCmdUI * pCmdUI)869 void CMainFrame::OnUpdateFileProp(CCmdUI* pCmdUI)
870 {
871 	pCmdUI->Enable(GetApp()->m_isopen);
872 }
873 
OnConfigure()874 void CMainFrame::OnConfigure()
875 {
876 	if (!m_pOpt) {
877 		m_pOpt = new COptions(this);
878 		m_pOpt->Create(this);
879 	}
880 	m_pOpt->ShowWindow(SW_SHOW);
881 }
882 
OnShortcuts()883 void CMainFrame::OnShortcuts()
884 {
885 	MessageBox(
886 	    "Open File: Ctrl + O\n"
887 	    "Open URL: Ctrl + U\n"
888 	    "Reload File: F5\n"
889 	    "Pause/Resume File: Ctrl + P\n"
890 	    "Step by Step: Ctrl + S\n"
891 	    "Seek +5%: Alt + left arrow\n"
892 	    "Seek -5%: Alt + right arrow\n"
893 	    "Switch quality up: Ctrl + H\n"
894 	    "Switch quality down: Ctrl + L\n"
895 	    "Fullscreen On/Off: Double-click or Escape\n"
896 	    "\n"
897 	    "Show Properties: Ctrl + I\n"
898 	    "Show Playlist: F3\n"
899 	    "Next Playlist Item: Ctrl + right arrow\n"
900 	    "Previous Playlist Item: Ctrl + left arrow\n"
901 	    "\n"
902 	    "Aspect Ratio Normal: Ctrl + 1\n"
903 	    "Aspect Ratio Fill: Ctrl + 2\n"
904 	    "Aspect Ratio 4/3: Ctrl + 3\n"
905 	    "Aspect Ratio 16/9: Ctrl + 4\n"
906 
907 
908 	    , "Shortcuts Available on Osmo4", MB_OK);
909 }
910 
OnNavInfo()911 void CMainFrame::OnNavInfo()
912 {
913 	MessageBox(
914 	    "* Walk & Fly modes:\n"
915 	    "\tH move: H pan - V move: Z-translate - V move+CTRL or Wheel: V pan - Right Click (Walk only): Jump\n"
916 	    "\tleft/right: H pan - left/right+CTRL: H translate - up/down: Z-translate - up/down+CTRL: V pan\n"
917 	    "* Pan mode:\n"
918 	    "\tH move: H pan - V move: V pan - V move+CTRL or Wheel: Z-translate\n"
919 	    "\tleft/right: H pan - left/right+CTRL: H translate - up/down: V pan - up/down+CTRL: Z-translate\n"
920 	    "* Slide mode:\n"
921 	    "\tH move: H translate - V move: V translate - V move+CTRL or Wheel: Z-translate\n"
922 	    "\tleft/right: H translate - left/right+CTRL: H pan - up/down: V translate - up/down+CTRL: Z-translate\n"
923 	    "* Examine & Orbit mode:\n"
924 	    "\tH move: Y-Axis rotate - H move+CTRL: Z-Axis rotate - V move: X-Axis rotate - V move+CTRL or Wheel: Z-translate\n"
925 	    "\tleft/right: Y-Axis rotate - left/right+CTRL: H translate - up/down: X-Axis rotate - up/down+CTRL: Y-translate\n"
926 	    "* VR mode:\n"
927 	    "\tH move: H pan - V move: V pan - V move+CTRL or Wheel: Camera Zoom\n"
928 	    "\tleft/right: H pan - up/down: V pan - up/down+CTRL: Camera Zoom\n"
929 	    "* Game mode (press END to escape):\n"
930 	    "\tH move: H pan - V move: V pan\n"
931 	    "\tleft/right: H translate - up/down: Z-translate\n"
932 	    "\n"
933 	    "* All 3D modes: CTRL+PGUP/PGDOWN will zoom in/out camera (field of view) \n"
934 
935 	    "\n"
936 	    "*Slide Mode in 2D:\n"
937 	    "\tH move: H translate - V move: V translate - V move+CTRL: zoom\n"
938 	    "\tleft/right: H translate - up/down: V translate - up/down+CTRL: zoom\n"
939 	    "*Examine Mode in 2D (3D renderer only):\n"
940 	    "\tH move: Y-Axis rotate - V move: X-Axis rotate\n"
941 	    "\tleft/right: Y-Axis rotate - up/down: X-Axis rotate\n"
942 
943 	    "\n"
944 	    "HOME: reset navigation to last viewpoint (2D or 3D navigation)\n"
945 	    "SHIFT key in all modes: fast movement\n"
946 
947 	    , "3D navigation keys (\'H\'orizontal and \'V\'ertical) used in GPAC", MB_OK);
948 }
949 
950 
951 
BuildViewList()952 void CMainFrame::BuildViewList()
953 {
954 	Osmo4 *app = GetApp();
955 	if (!app->m_isopen) return;
956 
957 	/*THIS IS HARCODED FROM THE MENU LAYOUT */
958 	CMenu *pMenu = GetMenu()->GetSubMenu(1)->GetSubMenu(0);
959 	while (pMenu->GetMenuItemCount()) pMenu->DeleteMenu(0, MF_BYPOSITION);
960 
961 	s32 id = ID_VP_0;
962 	nb_viewpoints = 0;
963 	while (1) {
964 		const char *szName = NULL;
965 		Bool bound;
966 		GF_Err e = gf_term_get_viewpoint(app->m_term, nb_viewpoints+1, &szName, &bound);
967 		if (e) break;
968 		if (szName) {
969 			pMenu->AppendMenu(MF_ENABLED, id+nb_viewpoints, szName);
970 		} else {
971 			char szLabel[1024];
972 			sprintf(szLabel, "Viewpoint #%d", nb_viewpoints+1);
973 			pMenu->AppendMenu(MF_ENABLED, id+nb_viewpoints, szLabel);
974 		}
975 		nb_viewpoints++;
976 		if (nb_viewpoints==ID_VP_19-ID_VP_0) break;
977 	}
978 }
979 
980 
BuildStreamList(Bool reset_only)981 void CMainFrame::BuildStreamList(Bool reset_only)
982 {
983 	u32 nb_subs;
984 	CMenu *pSelect;
985 	Osmo4 *app = GetApp();
986 
987 	pSelect = GetMenu()->GetSubMenu(2)->GetSubMenu(0);
988 	/*THIS IS HARCODED FROM THE MENU LAYOUT */
989 	CMenu *pMenu = pSelect->GetSubMenu(0);
990 	while (pMenu->GetMenuItemCount()) pMenu->DeleteMenu(0, MF_BYPOSITION);
991 	pMenu = pSelect->GetSubMenu(1);
992 	while (pMenu->GetMenuItemCount()) pMenu->DeleteMenu(0, MF_BYPOSITION);
993 	pMenu = pSelect->GetSubMenu(2);
994 	while (pMenu->GetMenuItemCount()) pMenu->DeleteMenu(0, MF_BYPOSITION);
995 
996 	if (reset_only) {
997 		m_bFirstStreamQuery = GF_TRUE;
998 		return;
999 	}
1000 	if (!app->m_isopen || !gf_term_get_option(app->m_term, GF_OPT_CAN_SELECT_STREAMS)) return;
1001 
1002 	GF_ObjectManager *root_od = gf_term_get_root_object(app->m_term);
1003 	if (!root_od) return;
1004 	u32 count = gf_term_get_object_count(app->m_term, root_od);
1005 	nb_subs = 0;
1006 
1007 	for (u32 i=0; i<count; i++) {
1008 		char szLabel[1024];
1009 		GF_MediaInfo info;
1010 		GF_ObjectManager *odm = gf_term_get_object(app->m_term, root_od, i);
1011 		if (!odm) return;
1012 
1013 		if (gf_term_get_object_info(app->m_term, odm, &info) != GF_OK) break;
1014 		if (info.owns_service) {
1015 			char *szName = (char *)strrchr(info.service_url, '\\');
1016 			if (!szName) szName = (char *)strrchr(info.service_url, '/');
1017 			if (!szName) szName = (char *) info.service_url;
1018 			else szName += 1;
1019 			strcpy(szLabel, szName);
1020 			szName = strrchr(szLabel, '.');
1021 			if (szName) szName[0] = 0;
1022 		}
1023 
1024 		switch (info.od_type) {
1025 		case GF_STREAM_AUDIO:
1026 			pMenu = pSelect->GetSubMenu(0);
1027 			if (!info.owns_service) {
1028 				if (info.lang) {
1029 					sprintf(szLabel, "Language %s (ID %d)", gf_4cc_to_str(info.lang), info.od->objectDescriptorID);
1030 				} else {
1031 					sprintf(szLabel, "ID %d", info.od->objectDescriptorID);
1032 				}
1033 			}
1034 			pMenu->AppendMenu(MF_ENABLED, ID_SELOBJ_0 + i, szLabel);
1035 			break;
1036 		case GF_STREAM_VISUAL:
1037 			pMenu = pSelect->GetSubMenu(1);
1038 			if (!info.owns_service) sprintf(szLabel, "ID %d", info.od->objectDescriptorID);
1039 			pMenu->AppendMenu(MF_ENABLED, ID_SELOBJ_0 + i, szLabel);
1040 			break;
1041 		case GF_STREAM_TEXT:
1042 			nb_subs ++;
1043 			pMenu = pSelect->GetSubMenu(2);
1044 			if (!info.owns_service) {
1045 				if (info.lang) {
1046 					sprintf(szLabel, "Language %s (ID %d)", gf_4cc_to_str(info.lang), info.od->objectDescriptorID);
1047 				} else {
1048 					sprintf(szLabel, "ID %d", info.od->objectDescriptorID);
1049 				}
1050 			}
1051 			pMenu->AppendMenu(MF_ENABLED, ID_SELOBJ_0 + i, szLabel);
1052 			break;
1053 		}
1054 	}
1055 	if (m_bFirstStreamQuery) {
1056 		m_bFirstStreamQuery = GF_FALSE;
1057 		if (!nb_subs && app->m_LookForSubtitles) LookForSubtitles();
1058 	}
1059 
1060 }
1061 
OnCommand(WPARAM wParam,LPARAM lParam)1062 BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
1063 {
1064 	int ID = LOWORD(wParam);
1065 	Osmo4 *app = GetApp();
1066 
1067 	if ( (ID>=ID_VP_0) && (ID<=ID_VP_0+nb_viewpoints)) {
1068 		ID -= ID_VP_0;
1069 		gf_term_set_viewpoint(app->m_term, ID+1, NULL);
1070 		return TRUE;
1071 	}
1072 	if ( (ID>=ID_NAV_PREV_0) && (ID<=ID_NAV_PREV_9)) {
1073 		ID -= ID_NAV_PREV_0;
1074 		s32 prev = m_pPlayList->m_cur_entry - ID;
1075 		if (prev>=0) {
1076 			m_pPlayList->m_cur_entry = prev;
1077 			m_pPlayList->PlayPrev();
1078 		}
1079 		return TRUE;
1080 	}
1081 	if ( (ID>=ID_NAV_NEXT_0) && (ID<=ID_NAV_NEXT_9)) {
1082 		ID -= ID_NAV_NEXT_0;
1083 		u32 next = m_pPlayList->m_cur_entry + ID;
1084 		if (next < gf_list_count(m_pPlayList->m_entries) ) {
1085 			m_pPlayList->m_cur_entry = next;
1086 			m_pPlayList->PlayNext();
1087 		}
1088 		return TRUE;
1089 	}
1090 	if ( (ID>=ID_SELOBJ_0) && (ID<=ID_SELOBJ_29)) {
1091 		ID -= ID_SELOBJ_0;
1092 		GF_ObjectManager *root_od = gf_term_get_root_object(app->m_term);
1093 		if (!root_od) return TRUE;
1094 		GF_ObjectManager *odm = gf_term_get_object(app->m_term, root_od, ID);
1095 		gf_term_select_object(app->m_term, odm);
1096 		return TRUE;
1097 	}
1098 	if ( (ID>=ID_SETCHAP_FIRST) && (ID<=ID_SETCHAP_LAST)) {
1099 		ID -= ID_SETCHAP_FIRST;
1100 		gf_term_play_from_time(app->m_term, (u32) (1000*m_chapters_start[ID]), 0);
1101 		return TRUE;
1102 	}
1103 	return CFrameWnd::OnCommand(wParam, lParam);
1104 }
1105 
OnInitMenuPopup(CMenu * pPopupMenu,UINT ID,BOOL bSys)1106 void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT ID, BOOL bSys)
1107 {
1108 	Osmo4 *app = GetApp();
1109 	/*viewport list*/
1110 	if (pPopupMenu->GetMenuItemID(0)==ID_VP_0) {
1111 		for (int i=0; i<nb_viewpoints; i++) {
1112 			const char *szName;
1113 			Bool bound;
1114 			GF_Err e = gf_term_get_viewpoint(app->m_term, i+1, &szName, &bound);
1115 			pPopupMenu->EnableMenuItem(i, MF_BYPOSITION);
1116 			if (bound) pPopupMenu->CheckMenuItem(i, MF_BYPOSITION | MF_CHECKED);
1117 		}
1118 		return;
1119 	}
1120 	/*navigation*/
1121 	if ((pPopupMenu->GetMenuItemID(0)==ID_NAV_PREV_0) || (pPopupMenu->GetMenuItemID(0)==ID_NAV_NEXT_0)) {
1122 		int count = pPopupMenu->GetMenuItemCount();
1123 		for (int i=0; i<count; i++) {
1124 			pPopupMenu->EnableMenuItem(i, MF_BYPOSITION);
1125 		}
1126 		return;
1127 	}
1128 	/*stream selection*/
1129 	if (pPopupMenu->m_hMenu == GetMenu()->GetSubMenu(2)->m_hMenu) {
1130 		if (!app->m_isopen || !gf_term_get_option(app->m_term, GF_OPT_CAN_SELECT_STREAMS)) {
1131 			pPopupMenu->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
1132 		} else {
1133 			pPopupMenu->EnableMenuItem(0, MF_BYPOSITION | MF_ENABLED);
1134 		}
1135 	}
1136 	if ((pPopupMenu->GetMenuItemID(0)>=ID_SELOBJ_0) && (pPopupMenu->GetMenuItemID(0)<=ID_SELOBJ_29)) {
1137 		GF_ObjectManager *root_od = gf_term_get_root_object(app->m_term);
1138 		if (!root_od) return;
1139 
1140 		int count = pPopupMenu->GetMenuItemCount();
1141 		for (int i=0; i<count; i++) {
1142 			u32 id = pPopupMenu->GetMenuItemID(i) - ID_SELOBJ_0;
1143 			GF_ObjectManager *odm = gf_term_get_object(app->m_term, root_od, id);
1144 			if (!odm) {
1145 				pPopupMenu->EnableMenuItem(i, MF_DISABLED | MF_BYPOSITION);
1146 			} else {
1147 				GF_MediaInfo info;
1148 
1149 				gf_term_get_object_info(app->m_term, odm, &info);
1150 				pPopupMenu->EnableMenuItem(i, MF_BYPOSITION);
1151 				pPopupMenu->CheckMenuItem(i, MF_BYPOSITION | (info.status ? MF_CHECKED : MF_UNCHECKED) );
1152 			}
1153 		}
1154 		return;
1155 	}
1156 	/*chapters*/
1157 	if (pPopupMenu->m_hMenu == GetMenu()->GetSubMenu(2)->m_hMenu) {
1158 		if (!app->m_isopen || !m_num_chapters) {
1159 			pPopupMenu->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
1160 		} else {
1161 			pPopupMenu->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED);
1162 		}
1163 	}
1164 	if ((pPopupMenu->GetMenuItemID(0)>=ID_SETCHAP_FIRST) && (pPopupMenu->GetMenuItemID(0)<=ID_SETCHAP_LAST)) {
1165 		Double now = gf_term_get_time_in_ms(app->m_term);
1166 		now /= 1000;
1167 
1168 		int count = pPopupMenu->GetMenuItemCount();
1169 		for (int i=0; i<count; i++) {
1170 			u32 id = pPopupMenu->GetMenuItemID(i) - ID_SETCHAP_FIRST;
1171 			pPopupMenu->EnableMenuItem(i, MF_BYPOSITION);
1172 
1173 			Bool is_current = GF_FALSE;
1174 			if (m_chapters_start[id]<=now) {
1175 				if (id+1<m_num_chapters) {
1176 					if (m_chapters_start[id+1]>now) is_current = GF_TRUE;
1177 				} else {
1178 					is_current = GF_TRUE;
1179 				}
1180 			}
1181 			pPopupMenu->CheckMenuItem(i, MF_BYPOSITION | (is_current ? MF_CHECKED : MF_UNCHECKED));
1182 		}
1183 		return;
1184 	}
1185 	/*default*/
1186 	CFrameWnd::OnInitMenuPopup(pPopupMenu, ID, bSys);
1187 }
1188 
OnCollideDisp()1189 void CMainFrame::OnCollideDisp()
1190 {
1191 	gf_term_set_option(GetApp()->m_term, GF_OPT_COLLISION, GF_COLLISION_DISPLACEMENT);
1192 }
1193 
OnUpdateCollideDisp(CCmdUI * pCmdUI)1194 void CMainFrame::OnUpdateCollideDisp(CCmdUI* pCmdUI)
1195 {
1196 	Osmo4 *gpac = GetApp();
1197 	pCmdUI->Enable(gpac->m_isopen);
1198 	pCmdUI->SetCheck( (gf_term_get_option(gpac->m_term, GF_OPT_COLLISION) == GF_COLLISION_DISPLACEMENT) ? 1 : 0);
1199 }
1200 
OnCollideNone()1201 void CMainFrame::OnCollideNone()
1202 {
1203 	gf_term_set_option(GetApp()->m_term, GF_OPT_COLLISION, GF_COLLISION_NONE);
1204 }
1205 
OnUpdateCollideNone(CCmdUI * pCmdUI)1206 void CMainFrame::OnUpdateCollideNone(CCmdUI* pCmdUI)
1207 {
1208 	Osmo4 *gpac = GetApp();
1209 	pCmdUI->Enable(gpac->m_isopen);
1210 	pCmdUI->SetCheck( (gf_term_get_option(gpac->m_term, GF_OPT_COLLISION) == GF_COLLISION_NONE) ? 1 : 0);
1211 }
1212 
OnCollideReg()1213 void CMainFrame::OnCollideReg()
1214 {
1215 	gf_term_set_option(GetApp()->m_term, GF_OPT_COLLISION, GF_COLLISION_NORMAL);
1216 }
1217 
OnUpdateCollideReg(CCmdUI * pCmdUI)1218 void CMainFrame::OnUpdateCollideReg(CCmdUI* pCmdUI)
1219 {
1220 	Osmo4 *gpac = GetApp();
1221 	pCmdUI->Enable(gpac->m_isopen);
1222 	pCmdUI->SetCheck( (gf_term_get_option(gpac->m_term, GF_OPT_COLLISION) == GF_COLLISION_NORMAL) ? 1 : 0);
1223 }
1224 
OnHeadlight()1225 void CMainFrame::OnHeadlight()
1226 {
1227 	Osmo4 *app = GetApp();
1228 	Bool val = gf_term_get_option(app->m_term, GF_OPT_HEADLIGHT) ? GF_FALSE : GF_TRUE;
1229 	gf_term_set_option(app->m_term, GF_OPT_HEADLIGHT, val);
1230 }
1231 
OnUpdateHeadlight(CCmdUI * pCmdUI)1232 void CMainFrame::OnUpdateHeadlight(CCmdUI* pCmdUI)
1233 {
1234 	Osmo4 *app = GetApp();
1235 	pCmdUI->Enable(FALSE);
1236 	if (!app->m_isopen) return;
1237 	u32 type = gf_term_get_option(app->m_term, GF_OPT_NAVIGATION_TYPE);
1238 	if (type!=GF_NAVIGATE_TYPE_3D) return;
1239 
1240 	pCmdUI->Enable(TRUE);
1241 	pCmdUI->SetCheck(gf_term_get_option(app->m_term, GF_OPT_HEADLIGHT) ? 1 : 0);
1242 }
1243 
OnGravity()1244 void CMainFrame::OnGravity()
1245 {
1246 	Osmo4 *app = GetApp();
1247 	Bool val = gf_term_get_option(app->m_term, GF_OPT_GRAVITY) ? GF_FALSE : GF_TRUE;
1248 	gf_term_set_option(app->m_term, GF_OPT_GRAVITY, val);
1249 }
1250 
OnUpdateGravity(CCmdUI * pCmdUI)1251 void CMainFrame::OnUpdateGravity(CCmdUI* pCmdUI)
1252 {
1253 	Osmo4 *app = GetApp();
1254 	pCmdUI->Enable(FALSE);
1255 	if (!app->m_isopen) return;
1256 	u32 type = gf_term_get_option(app->m_term, GF_OPT_NAVIGATION_TYPE);
1257 	if (type!=GF_NAVIGATE_TYPE_3D) return;
1258 	type = gf_term_get_option(app->m_term, GF_OPT_NAVIGATION);
1259 	if (type != GF_NAVIGATE_WALK) return;
1260 	pCmdUI->Enable(TRUE);
1261 	pCmdUI->SetCheck(gf_term_get_option(app->m_term, GF_OPT_GRAVITY) ? 1 : 0);
1262 }
1263 
1264 
OnNotify(WPARAM wParam,LPARAM lParam,LRESULT * pResult)1265 BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
1266 {
1267 
1268 	if (((LPNMHDR)lParam)->code == TBN_DROPDOWN) {
1269 		RECT rc;
1270 		s32 i, count, start;
1271 		POINT pt;
1272 		CMenu *pPopup = new CMenu();
1273 		pPopup->CreatePopupMenu();
1274 
1275 		m_wndToolBar.GetWindowRect(&rc);
1276 		pt.y = rc.bottom;
1277 		pt.x = rc.left;
1278 		m_wndToolBar.GetToolBarCtrl().GetItemRect(0, &rc);
1279 		pt.x += (rc.right - rc.left);
1280 		m_wndToolBar.GetToolBarCtrl().GetItemRect(1, &rc);
1281 		pt.x += (rc.right - rc.left);
1282 
1283 		count = gf_list_count(m_pPlayList->m_entries);
1284 		if ( ((LPNMTOOLBAR)lParam)->iItem == ID_NAV_PREV) {
1285 			start = m_pPlayList->m_cur_entry - 1;
1286 			for (i=0; i<10; i++) {
1287 				if (start - i < 0) break;
1288 				if (start - i >= count) break;
1289 				PLEntry *ple = (PLEntry *) gf_list_get(m_pPlayList->m_entries, start - i);
1290 				pPopup->AppendMenu(MF_STRING | MF_ENABLED, ID_NAV_PREV_0 + i, ple->m_disp_name);
1291 			}
1292 		} else {
1293 			start = m_pPlayList->m_cur_entry + 1;
1294 			for (i=0; i<10; i++) {
1295 				if (start + i >= count) break;
1296 				PLEntry *ple = (PLEntry *) gf_list_get(m_pPlayList->m_entries, start + i);
1297 				pPopup->AppendMenu(MF_STRING | MF_ENABLED, ID_NAV_NEXT_0 + i, ple->m_disp_name);
1298 			}
1299 			m_wndToolBar.GetToolBarCtrl().GetItemRect(2, &rc);
1300 			pt.x += (rc.right - rc.left);
1301 		}
1302 		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
1303 		delete pPopup;
1304 
1305 		return FALSE;
1306 	}
1307 	return CFrameWnd::OnNotify(wParam, lParam, pResult);
1308 }
1309 
OnNavNext()1310 void CMainFrame::OnNavNext()
1311 {
1312 	Osmo4 *app = GetApp();
1313 	/*don't play if last could trigger playlist loop*/
1314 	if ((m_pPlayList->m_cur_entry<0) || (gf_list_count(m_pPlayList->m_entries) == 1 + (u32) m_pPlayList->m_cur_entry)) return;
1315 	m_pPlayList->PlayNext();
1316 }
1317 
OnUpdateNavNext(CCmdUI * pCmdUI)1318 void CMainFrame::OnUpdateNavNext(CCmdUI* pCmdUI)
1319 {
1320 	if (m_pPlayList->m_cur_entry<0) pCmdUI->Enable(FALSE);
1321 	else if ((u32) m_pPlayList->m_cur_entry + 1 == gf_list_count(m_pPlayList->m_entries) ) pCmdUI->Enable(FALSE);
1322 	else pCmdUI->Enable(TRUE);
1323 }
1324 
OnNavPrev()1325 void CMainFrame::OnNavPrev()
1326 {
1327 	Osmo4 *app = GetApp();
1328 	if (m_pPlayList->m_cur_entry<=0) return;
1329 	m_pPlayList->PlayPrev();
1330 }
1331 
OnUpdateNavPrev(CCmdUI * pCmdUI)1332 void CMainFrame::OnUpdateNavPrev(CCmdUI* pCmdUI)
1333 {
1334 	if (m_pPlayList->m_cur_entry<=0) pCmdUI->Enable(FALSE);
1335 	else pCmdUI->Enable(TRUE);
1336 }
1337 
1338 
OnClearNav()1339 void CMainFrame::OnClearNav()
1340 {
1341 	m_pPlayList->ClearButPlaying();
1342 }
1343 
OnViewPlaylist()1344 void CMainFrame::OnViewPlaylist()
1345 {
1346 	m_pPlayList->ShowWindow(m_pPlayList->IsWindowVisible() ? SW_HIDE : SW_SHOW);
1347 }
1348 
OnUpdateViewPlaylist(CCmdUI * pCmdUI)1349 void CMainFrame::OnUpdateViewPlaylist(CCmdUI* pCmdUI)
1350 {
1351 	pCmdUI->SetCheck(m_pPlayList->IsWindowVisible() ? 1 : 0);
1352 }
OnPlaylistLoop()1353 void CMainFrame::OnPlaylistLoop()
1354 {
1355 	GetApp()->m_Loop = GetApp()->m_Loop ? GF_FALSE : GF_TRUE;
1356 	gf_cfg_set_key(GetApp()->m_user.config, "General", "PlaylistLoop", GetApp()->m_Loop ? "yes" : "no");
1357 }
1358 
OnUpdatePlaylistLoop(CCmdUI * pCmdUI)1359 void CMainFrame::OnUpdatePlaylistLoop(CCmdUI* pCmdUI)
1360 {
1361 	pCmdUI->SetCheck(GetApp()->m_Loop ? GF_TRUE : GF_FALSE);
1362 }
1363 
OnAddSubtitle()1364 void CMainFrame::OnAddSubtitle()
1365 {
1366 	CFileDialog fd(TRUE,NULL,NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "All Subtitles|*.srt;*.sub;*.ttxt;*.xml|SRT Subtitles|*.srt|SUB Subtitles|*.sub|3GPP TimedText|*.ttxt|QuckTime TeXML|*.xml|");
1367 	if (fd.DoModal() != IDOK) return;
1368 
1369 	AddSubtitle(fd.GetPathName(), GF_TRUE);
1370 }
1371 
AddSubtitle(const char * fileName,Bool auto_play)1372 void CMainFrame::AddSubtitle(const char *fileName, Bool auto_play)
1373 {
1374 	gf_term_add_object(GetApp()->m_term, fileName, auto_play);
1375 }
1376 
subs_enum_dir_item(void * cbck,char * item_name,char * item_path,GF_FileEnumInfo * file_info)1377 static Bool subs_enum_dir_item(void *cbck, char *item_name, char *item_path, GF_FileEnumInfo *file_info)
1378 {
1379 	CMainFrame *_this = (CMainFrame *)cbck;
1380 	_this->AddSubtitle(item_path, GF_FALSE);
1381 	return GF_FALSE;
1382 }
1383 
LookForSubtitles()1384 void CMainFrame::LookForSubtitles()
1385 {
1386 	char dir[GF_MAX_PATH];
1387 	CString url = m_pPlayList->GetURL();
1388 	strcpy(dir, url);
1389 	char *sep = strrchr(dir, '\\');
1390 	if (!sep) ::GetCurrentDirectory(GF_MAX_PATH, dir);
1391 	else sep[0] = 0;
1392 
1393 	gf_enum_directory(dir, GF_FALSE, subs_enum_dir_item, this, "ttxt;srt");
1394 }
1395 
OnCacheEnable()1396 void CMainFrame::OnCacheEnable()
1397 {
1398 	Osmo4 *app = GetApp();
1399 	u32 state = gf_term_get_option(app->m_term, GF_OPT_MEDIA_CACHE);
1400 	if (state==GF_MEDIA_CACHE_DISABLED) {
1401 		gf_term_set_option(app->m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_ENABLED);
1402 	} else if (state==GF_MEDIA_CACHE_DISABLED) {
1403 		gf_term_set_option(app->m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_DISABLED);
1404 	}
1405 }
1406 
OnUpdateCacheEnable(CCmdUI * pCmdUI)1407 void CMainFrame::OnUpdateCacheEnable(CCmdUI* pCmdUI)
1408 {
1409 	Osmo4 *app = GetApp();
1410 	u32 state = gf_term_get_option(app->m_term, GF_OPT_MEDIA_CACHE);
1411 	switch (state) {
1412 	case GF_MEDIA_CACHE_ENABLED:
1413 		pCmdUI->SetText("Enabled");
1414 		pCmdUI->Enable(TRUE);
1415 		break;
1416 	case GF_MEDIA_CACHE_RUNNING:
1417 		pCmdUI->SetText("Running");
1418 		pCmdUI->Enable(FALSE);
1419 		break;
1420 	case GF_MEDIA_CACHE_DISABLED:
1421 		pCmdUI->SetText("Disabled");
1422 		break;
1423 	}
1424 }
1425 
OnUpdateCacheStop(CCmdUI * pCmdUI)1426 void CMainFrame::OnUpdateCacheStop(CCmdUI* pCmdUI)
1427 {
1428 	Osmo4 *app = GetApp();
1429 	u32 state = gf_term_get_option(app->m_term, GF_OPT_MEDIA_CACHE);
1430 	pCmdUI->Enable( (state==GF_MEDIA_CACHE_RUNNING) ? TRUE : FALSE);
1431 }
1432 
OnCacheStop()1433 void CMainFrame::OnCacheStop()
1434 {
1435 	Osmo4 *app = GetApp();
1436 	gf_term_set_option(app->m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_DISABLED);
1437 }
OnCacheAbort()1438 void CMainFrame::OnCacheAbort()
1439 {
1440 	Osmo4 *app = GetApp();
1441 	gf_term_set_option(app->m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_DISCARD);
1442 }
1443 
OnFileExit()1444 void CMainFrame::OnFileExit()
1445 {
1446 	DestroyWindow();
1447 }
1448 
1449 
BuildChapterList(Bool reset_only)1450 void CMainFrame::BuildChapterList(Bool reset_only)
1451 {
1452 	CMenu *pChaps;
1453 	GF_MediaInfo odi;
1454 	NetInfoCommand com;
1455 	Osmo4 *app = GetApp();
1456 
1457 	/*THIS IS HARCODED FROM THE MENU LAYOUT */
1458 	pChaps = GetMenu()->GetSubMenu(2)->GetSubMenu(1);
1459 	while (pChaps->GetMenuItemCount()) pChaps->DeleteMenu(0, MF_BYPOSITION);
1460 
1461 	if (m_chapters_start) gf_free(m_chapters_start);
1462 	m_chapters_start = NULL;
1463 	m_num_chapters = 0;
1464 	if (reset_only) return;
1465 
1466 	GF_ObjectManager *root_od = gf_term_get_root_object(app->m_term);
1467 	if (!root_od) return;
1468 	if (gf_term_get_object_info(app->m_term, root_od, &odi) != GF_OK) return;
1469 
1470 	u32 count = gf_list_count(odi.od->OCIDescriptors);
1471 	m_num_chapters = 0;
1472 	for (u32 i=0; i<count; i++) {
1473 		char szLabel[1024];
1474 		GF_Segment *seg = (GF_Segment *) gf_list_get(odi.od->OCIDescriptors, i);
1475 		if (seg->tag != GF_ODF_SEGMENT_TAG) continue;
1476 
1477 		if (seg->SegmentName && strlen((const char *)seg->SegmentName)) {
1478 			strcpy(szLabel, (const char *) seg->SegmentName);
1479 		} else {
1480 			sprintf(szLabel, "Chapter #%02d", m_num_chapters+1);
1481 		}
1482 		pChaps->AppendMenu(MF_ENABLED, ID_SETCHAP_FIRST + m_num_chapters, szLabel);
1483 
1484 		m_chapters_start = (Double *) gf_realloc(m_chapters_start, sizeof(Double)*(m_num_chapters+1));
1485 		m_chapters_start[m_num_chapters] = seg->startTime;
1486 		m_num_chapters++;
1487 	}
1488 
1489 	/*get any service info*/
1490 	if (!m_bStartupFile && gf_term_get_service_info(app->m_term, root_od, &com) == GF_OK) {
1491 		CString title("");
1492 		if (com.track_info) {
1493 			title.Format("%02d ", (u32) (com.track_info>>16) );
1494 		}
1495 		if (com.artist) {
1496 			title += com.artist;
1497 			title += " ";
1498 		}
1499 		if (com.name) {
1500 			title += com.name;
1501 			title += " ";
1502 		}
1503 		if (com.album) {
1504 			title += "(";
1505 			title += com.album;
1506 			title += ")";
1507 		}
1508 
1509 		if (title.GetLength()) SetWindowText(title);
1510 	}
1511 }
1512 
OnViewCPU()1513 void CMainFrame::OnViewCPU()
1514 {
1515 	m_show_rti = m_show_rti ? GF_FALSE : GF_TRUE;
1516 }
1517 
OnUpdateViewCPU(CCmdUI * pCmdUI)1518 void CMainFrame::OnUpdateViewCPU(CCmdUI* pCmdUI)
1519 {
1520 	pCmdUI->Enable(TRUE);
1521 	pCmdUI->SetCheck(m_show_rti);
1522 }
1523 
1524 
OnFileCopy()1525 void CMainFrame::OnFileCopy()
1526 {
1527 	size_t len;
1528 	const char *text = gf_term_get_text_selection(GetApp()->m_term, GF_FALSE);
1529 	if (!text) return;
1530 
1531 	if (!IsClipboardFormatAvailable(CF_TEXT)) return;
1532 	if (!OpenClipboard()) return;
1533 	EmptyClipboard();
1534 
1535 	len = strlen(text);
1536 	if (!len) return;
1537 
1538 	HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(char));
1539 	LPTSTR lptstrCopy = (char *) GlobalLock(hglbCopy);
1540 	memcpy(lptstrCopy, text, len * sizeof(char));
1541 	lptstrCopy[len] = 0;
1542 	GlobalUnlock(hglbCopy);
1543 	SetClipboardData(CF_TEXT, hglbCopy);
1544 	CloseClipboard();
1545 }
1546 
OnUpdateFileCopy(CCmdUI * pCmdUI)1547 void CMainFrame::OnUpdateFileCopy(CCmdUI* pCmdUI)
1548 {
1549 	Osmo4 *app = GetApp();
1550 	if (IsClipboardFormatAvailable(CF_TEXT)
1551 	        && app->m_term
1552 	        && (gf_term_get_text_selection(app->m_term, GF_TRUE)!=NULL)
1553 	   ) {
1554 		pCmdUI->Enable(TRUE);
1555 	} else {
1556 		pCmdUI->Enable(FALSE);
1557 	}
1558 }
1559 
1560 
OnFilePaste()1561 void CMainFrame::OnFilePaste()
1562 {
1563 	if (!IsClipboardFormatAvailable(CF_TEXT)) return;
1564 	if (!OpenClipboard()) return;
1565 
1566 	HGLOBAL hglbCopy = GetClipboardData(CF_TEXT);
1567 	if (hglbCopy) {
1568 		LPTSTR lptstrCopy = (char *) GlobalLock(hglbCopy);
1569 		gf_term_paste_text(GetApp()->m_term, lptstrCopy, GF_FALSE);
1570 		GlobalUnlock(hglbCopy);
1571 	}
1572 	CloseClipboard();
1573 }
1574 
OnUpdateFilePaste(CCmdUI * pCmdUI)1575 void CMainFrame::OnUpdateFilePaste(CCmdUI* pCmdUI)
1576 {
1577 	Osmo4 *app = GetApp();
1578 	if (IsClipboardFormatAvailable(CF_TEXT)
1579 	        && app->m_term
1580 	        && (gf_term_paste_text(app->m_term, NULL, GF_TRUE)==GF_OK)
1581 	   ) {
1582 		pCmdUI->Enable(TRUE);
1583 	} else {
1584 		pCmdUI->Enable(FALSE);
1585 	}
1586 }
1587 
1588 
1589