[Date Prev][Date Next][Thread Prev][Thread Next][Thread Index]

[XaraXtreme-commits] Commit Complete



Commit by  : luke
Repository : xara
Revision   : 1713
Date       : Wed Aug 23 09:12:04 BST 2006

Changed paths:
   M /Trunk/XaraLX/Kernel/Makefile.am
   M /Trunk/XaraLX/Kernel/main3.cpp
   M /Trunk/XaraLX/Kernel/menuops.cpp
   A /Trunk/XaraLX/Kernel/selmedia.cpp
   A /Trunk/XaraLX/Kernel/selmedia.h
   M /Trunk/XaraLX/wxOil/camelot.cpp
   M /Trunk/XaraLX/wxOil/camelot.h
   M /Trunk/XaraLX/wxOil/menucmds.cpp
   A /Trunk/XaraLX/wxOil/xrc/EN/mediaappdlg.xrc

Add suport for re-playing an example movie file using an external app. (will also fix build issues currently being reported)


Diff:
Index: Trunk/XaraLX/Kernel/Makefile.am
===================================================================
--- Trunk/XaraLX/Kernel/Makefile.am	(revision 1712)
+++ Trunk/XaraLX/Kernel/Makefile.am	(revision 1713)
@@ -80,7 +80,7 @@
 	swfexpdc.cpp swftext.cpp pmaskrgn.cpp printctl.cpp prnmkcom.cpp prnmks.cpp \
 	xsepsops.cpp xarprefs.cpp printing.cpp prntview.cpp psrndrgn.cpp opimgset.cpp \
 	optsprin.cpp prnprefs.cpp rulers.cpp biasgdgt.cpp biasdlg.cpp prvwmenu.cpp \
-	ftfilter.cpp cxftree.cpp strlist.cpp
+	ftfilter.cpp cxftree.cpp strlist.cpp selmedia.cpp
 
 
 AM_CXXFLAGS = $(XARAFLAGS)
Index: Trunk/XaraLX/Kernel/selmedia.h
===================================================================
--- Trunk/XaraLX/Kernel/selmedia.h	(revision 0)
+++ Trunk/XaraLX/Kernel/selmedia.h	(revision 1713)
@@ -0,0 +1,170 @@
+// $Id: blobby.h 1282 2006-06-09 09:46:49Z alex $
+/* @@tag:xara-cn@@ DO NOT MODIFY THIS LINE
+================================XARAHEADERSTART===========================
+ 
+               Xara LX, a vector drawing and manipulation program.
+                    Copyright (C) 1993-2006 Xara Group Ltd.
+       Copyright on certain contributions may be held in joint with their
+              respective authors. See AUTHORS file for details.
+
+LICENSE TO USE AND MODIFY SOFTWARE
+----------------------------------
+
+This file is part of Xara LX.
+
+Xara LX is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 as published
+by the Free Software Foundation.
+
+Xara LX and its component source files are distributed in the hope
+that it will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with Xara LX (see the file GPL in the root directory of the
+distribution); if not, write to the Free Software Foundation, Inc., 51
+Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+
+ADDITIONAL RIGHTS
+-----------------
+
+Conditional upon your continuing compliance with the GNU General Public
+License described above, Xara Group Ltd grants to you certain additional
+rights. 
+
+The additional rights are to use, modify, and distribute the software
+together with the wxWidgets library, the wxXtra library, and the "CDraw"
+library and any other such library that any version of Xara LX relased
+by Xara Group Ltd requires in order to compile and execute, including
+the static linking of that library to XaraLX. In the case of the
+"CDraw" library, you may satisfy obligation under the GNU General Public
+License to provide source code by providing a binary copy of the library
+concerned and a copy of the license accompanying it.
+
+Nothing in this section restricts any of the rights you have under
+the GNU General Public License.
+
+
+SCOPE OF LICENSE
+----------------
+
+This license applies to this program (XaraLX) and its constituent source
+files only, and does not necessarily apply to other Xara products which may
+in part share the same code base, and are subject to their own licensing
+terms.
+
+This license does not apply to files in the wxXtra directory, which
+are built into a separate library, and are subject to the wxWindows
+license contained within that directory in the file "WXXTRA-LICENSE".
+
+This license does not apply to the binary libraries (if any) within
+the "libs" directory, which are subject to a separate license contained
+within that directory in the file "LIBS-LICENSE".
+
+
+ARRANGEMENTS FOR CONTRIBUTION OF MODIFICATIONS
+----------------------------------------------
+
+Subject to the terms of the GNU Public License (see above), you are
+free to do whatever you like with your modifications. However, you may
+(at your option) wish contribute them to Xara's source tree. You can
+find details of how to do this at:
+  http://www.xaraxtreme.org/developers/
+
+Prior to contributing your modifications, you will need to complete our
+contributor agreement. This can be found at:
+  http://www.xaraxtreme.org/developers/contribute/
+
+Please note that Xara will not accept modifications which modify any of
+the text between the start and end of this header (marked
+XARAHEADERSTART and XARAHEADEREND).
+
+
+MARKS
+-----
+
+Xara, Xara LX, Xara X, Xara X/Xtreme, Xara Xtreme, the Xtreme and Xara
+designs are registered or unregistered trademarks, design-marks, and/or
+service marks of Xara Group Ltd. All rights in these marks are reserved.
+
+
+      Xara Group Ltd, Gaddesden Place, Hemel Hempstead, HP2 6EX, UK.
+                        http://www.xara.com/
+
+=================================XARAHEADEREND============================
+ */
+
+// Declaration of the following classes
+/*
+	BlobbyOp         : Demonstration temporary operation which changes the colour of a 
+					   documents paper. 
+					   and it's actions
+
+*/	
+
+
+
+/*
+ */        
+
+#ifndef INC_SELMEDIA
+#define INC_SELMEDIA
+    
+//#include "undoop.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "opdesc.h"    - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "doccolor.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "ops.h"  	   	// Operation class   - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "dlgtypes.h"  	// The DialogOp types - in camtypes.h [AUTOMATICALLY REMOVED]
+#include "dlgmgr.h"		// the dialogue box manager 
+//#include "convert.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "dialogop.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+
+// -----------------------------------------------------------------------------------------
+// SelMediaDlg used to test the Dialog system
+
+#define OPTOKEN_SELMEDIADLG _T("SelMediaDlg")    
+
+
+struct SelMediaDlgParam : public OpParam
+{
+CC_DECLARE_DYNAMIC(SelMediaDlgParam)
+
+	typedef std::map<PCTSTR, bool>	CMediaAppList;
+	typedef CMediaAppList::iterator CMediaAppListIter;
+	
+	CMediaAppList*	m_pAppList;
+	String_256		m_strSel;
+	bool			m_fValid;
+
+	SelMediaDlgParam() : m_pAppList( NULL ), m_fValid( false )
+	{}
+};
+
+class SelMediaDlg: public DialogOp
+{         
+	CC_DECLARE_DYNCREATE( SelMediaDlg )  
+
+protected:
+	SelMediaDlgParam*	m_pOptions;
+
+	void InitValues();
+
+public:
+	SelMediaDlg(); 
+	MsgResult Message( Msg* Message );
+
+	void Do(OpDescriptor*);		// "Do" function
+	void DoWithParam(OpDescriptor*, OpParam* pParam);
+
+	static BOOL Init();                        
+	BOOL Create(); 
+	static OpState GetState(String_256*, OpDescriptor*);	
+
+	static const UINT32 IDD;    
+	static const CDlgMode Mode;
+};
+
+#endif
+                   
Index: Trunk/XaraLX/Kernel/selmedia.cpp
===================================================================
--- Trunk/XaraLX/Kernel/selmedia.cpp	(revision 0)
+++ Trunk/XaraLX/Kernel/selmedia.cpp	(revision 1713)
@@ -0,0 +1,295 @@
+// $Id: blobby.cpp 1282 2006-06-09 09:46:49Z alex $
+/* @@tag:xara-cn@@ DO NOT MODIFY THIS LINE
+================================XARAHEADERSTART===========================
+ 
+               Xara LX, a vector drawing and manipulation program.
+                    Copyright (C) 1993-2006 Xara Group Ltd.
+       Copyright on certain contributions may be held in joint with their
+              respective authors. See AUTHORS file for details.
+
+LICENSE TO USE AND MODIFY SOFTWARE
+----------------------------------
+
+This file is part of Xara LX.
+
+Xara LX is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 as published
+by the Free Software Foundation.
+
+Xara LX and its component source files are distributed in the hope
+that it will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with Xara LX (see the file GPL in the root directory of the
+distribution); if not, write to the Free Software Foundation, Inc., 51
+Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+
+ADDITIONAL RIGHTS
+-----------------
+
+Conditional upon your continuing compliance with the GNU General Public
+License described above, Xara Group Ltd grants to you certain additional
+rights. 
+
+The additional rights are to use, modify, and distribute the software
+together with the wxWidgets library, the wxXtra library, and the "CDraw"
+library and any other such library that any version of Xara LX relased
+by Xara Group Ltd requires in order to compile and execute, including
+the static linking of that library to XaraLX. In the case of the
+"CDraw" library, you may satisfy obligation under the GNU General Public
+License to provide source code by providing a binary copy of the library
+concerned and a copy of the license accompanying it.
+
+Nothing in this section restricts any of the rights you have under
+the GNU General Public License.
+
+
+SCOPE OF LICENSE
+----------------
+
+This license applies to this program (XaraLX) and its constituent source
+files only, and does not necessarily apply to other Xara products which may
+in part share the same code base, and are subject to their own licensing
+terms.
+
+This license does not apply to files in the wxXtra directory, which
+are built into a separate library, and are subject to the wxWindows
+license contained within that directory in the file "WXXTRA-LICENSE".
+
+This license does not apply to the binary libraries (if any) within
+the "libs" directory, which are subject to a separate license contained
+within that directory in the file "LIBS-LICENSE".
+
+
+ARRANGEMENTS FOR CONTRIBUTION OF MODIFICATIONS
+----------------------------------------------
+
+Subject to the terms of the GNU Public License (see above), you are
+free to do whatever you like with your modifications. However, you may
+(at your option) wish contribute them to Xara's source tree. You can
+find details of how to do this at:
+  http://www.xaraxtreme.org/developers/
+
+Prior to contributing your modifications, you will need to complete our
+contributor agreement. This can be found at:
+  http://www.xaraxtreme.org/developers/contribute/
+
+Please note that Xara will not accept modifications which modify any of
+the text between the start and end of this header (marked
+XARAHEADERSTART and XARAHEADEREND).
+
+
+MARKS
+-----
+
+Xara, Xara LX, Xara X, Xara X/Xtreme, Xara Xtreme, the Xtreme and Xara
+designs are registered or unregistered trademarks, design-marks, and/or
+service marks of Xara Group Ltd. All rights in these marks are reserved.
+
+
+      Xara Group Ltd, Gaddesden Place, Hemel Hempstead, HP2 6EX, UK.
+                        http://www.xara.com/
+
+=================================XARAHEADEREND============================
+ */
+
+// Implemetation of the following classes
+/*
+	OperationHistory : The operation history used to store undoable operations
+	OpUndo           : The undo operation
+	OpRedo           : The redo operation
+
+	BlobbyOp         : Demonstration temporary operation which changes the colour of a
+					   documents paper.
+
+	UndoColAction    : BlobbyOp undo action
+	RedoColAction    : BlobbyOp redo action
+*/
+
+/*
+*/
+#include "camtypes.h"
+//#include "ops.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+
+DECLARE_SOURCE("$Revision: 1282 $");
+
+#include "selmedia.h"
+#include "ophist.h"
+#include "lineattr.h"
+//#include "resource.h"
+#include "page.h"
+//#include "docview.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "document.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "mario.h"
+//#include "simon.h"
+//#include "docview.h" - in camtypes.h [AUTOMATICALLY REMOVED]
+//#include "blobtab.h"
+#include <stdlib.h>
+
+#include "bfxatom.h"
+#include "tracergn.h"
+#include "bubbleid.h"
+
+CC_IMPLEMENT_DYNCREATE(SelMediaDlg, DialogOp)
+CC_IMPLEMENT_DYNAMIC(SelMediaDlgParam, OpParam)
+
+#define new CAM_DEBUG_NEW
+
+//------------------------------------------------------------------------------------------
+// Demo Dialog
+
+const CDlgMode SelMediaDlg::Mode = MODAL;// Mode of the dialog
+
+const UINT32 SelMediaDlg::IDD = _R(IDD_SEL_MEDIA_APP_DIALOG);
+
+SelMediaDlg::SelMediaDlg(): DialogOp(SelMediaDlg::IDD, SelMediaDlg::Mode), m_pOptions( NULL )
+{
+}
+
+// -----------------------------------------------------------------------------------------
+
+void SelMediaDlg::InitValues()
+{
+	bool				fItemSel = false;
+
+	// Add possible replay apps
+	SelMediaDlgParam::CMediaAppListIter	end( m_pOptions->m_pAppList->end() );
+	SelMediaDlgParam::CMediaAppListIter	iter( m_pOptions->m_pAppList->begin() );
+	for( INT32 ord = 0; iter != end; ++iter, ++ord )
+	{
+		SetStringGadgetValue( _R(IDC_LIST1), String_256(iter->first), FALSE, ord );
+
+		if( m_pOptions->m_strSel != _T("") )
+		{
+			if( m_pOptions->m_strSel == iter->first )
+			{
+				fItemSel = true;
+				SetSelectedValueIndex( _R(IDC_LIST1), ord );
+			}
+		}
+		else
+		if( iter->second )
+		{
+			fItemSel = true;
+			SetSelectedValueIndex( _R(IDC_LIST1), ord );
+		}
+	}
+
+	if( !fItemSel )
+		SetSelectedValueIndex( _R(IDC_LIST1), 0 );
+}
+
+// -----------------------------------------------------------------------------------------
+
+MsgResult SelMediaDlg::Message( Msg* Message)
+{
+	if (IS_OUR_DIALOG_MSG(Message))
+	{
+		DialogMsg* Msg = (DialogMsg*)Message;
+		// Handle ok button
+		if ((Msg->DlgMsg == DIM_COMMIT) || (Msg->DlgMsg == DIM_CANCEL))
+		{
+			m_pOptions->m_strSel = GetStringGadgetValue( _R(IDC_LIST1) );
+			TRACEUSER( "jlh92", _T("Return sel is %s
"), PCTSTR(m_pOptions->m_strSel) );
+
+			m_pOptions->m_fValid = ( DIM_COMMIT == Msg->DlgMsg );
+
+			Close(); // Hide the dialog
+			End();
+		}
+		else
+		if( DIM_SOFT_COMMIT == Msg->DlgMsg ||
+			DIM_CREATE == Msg->DlgMsg )
+			InitValues();
+
+		return (DLG_EAT_IF_HUNGRY(Msg));
+	}
+	return OK;
+}
+
+// -----------------------------------------------------------------------------------------
+
+OpState	SelMediaDlg::GetState(String_256*, OpDescriptor*)
+{
+	OpState OpSt;
+	return(OpSt);
+}
+
+// -----------------------------------------------------------------------------------------
+
+BOOL SelMediaDlg::Init()
+{
+	return (RegisterOpDescriptor(
+ 								0,
+ 								_R(IDS_SELMEDIADLG),
+								CC_RUNTIME_CLASS(SelMediaDlg),
+ 								OPTOKEN_SELMEDIADLG,
+ 								SelMediaDlg::GetState,
+ 								0,	/* help ID */
+ 								_R(IDBBL_SELMEDIADLG),
+ 								0	/* bitmap ID */
+								));
+}
+
+// -----------------------------------------------------------------------------------------
+
+BOOL SelMediaDlg::Create()
+{
+	if (DialogOp::Create())
+	{
+		return TRUE;
+    }
+    else
+		return FALSE;
+}
+
+// -----------------------------------------------------------------------------------------
+
+void SelMediaDlg::Do(OpDescriptor*)
+{
+	Create();
+	Open();
+}
+
+/******************************************************************************************
+
+>	void BmpPrefsDlg::DoWithParam(OpDescriptor*)
+
+	Author:		Luke_hart (Xara Group Ltd) <LukeH@xxxxxxxx>
+	Created:	23/08/94
+	Inputs:		-
+	Outputs:	-
+	Returns:	-
+	Purpose:	Creates then opens the dialog in response to a request from the user and
+				allows values to be passed in and returned to the caller via the
+				SelMediaDlgParam class.
+	Errors:		-
+	SeeAlso:	-
+
+******************************************************************************************/
+
+void SelMediaDlg::DoWithParam(OpDescriptor*, OpParam* pParam)
+{
+	if (pParam == NULL)
+	{
+		ERROR3("SelMediaDlg::DoWithParam - NULL Args");
+		return;
+	}
+
+	// Use the OpParam that has been passed in to us
+	ERROR3IF( !pParam->IS_KIND_OF(SelMediaDlgParam), "pParam isn't" );
+	m_pOptions = (SelMediaDlgParam*) pParam;
+
+	// Force the dialog box to be created, as it is modal it will be opened via a message
+	BOOL				fOk = Create();
+	if( !fOk )
+	{
+		// Could not create the dialog box so call inform error 
+		InformError();
+  		End(); 		   // End the operation 
+	}
+}
+
Index: Trunk/XaraLX/Kernel/menuops.cpp
===================================================================
--- Trunk/XaraLX/Kernel/menuops.cpp	(revision 1712)
+++ Trunk/XaraLX/Kernel/menuops.cpp	(revision 1713)
@@ -1282,14 +1282,6 @@
 		WebsterDemos();
 	#endif //webster
 	}
-	else if (WhichOp->Token == String(OPTOKEN_HELPDEMOS_NATIVE))
-	{
-	#ifndef WEBSTER
-		HelpDemosNativeAction();
-	#else	// webster
-		WebsterDemos();
-	#endif //webster
-	}
 	else if (WhichOp->Token == String(OPTOKEN_HELPTECHSUPPORT))
 		HelpTechSupportAction();
 //Webster_Ranbir_12	\96
@@ -1414,7 +1406,6 @@
 
 	ERRORIF(!IndexOp, _R(IDE_NOMORE_MEMORY), FALSE);
 
-#if defined(ENABLE_MOVIES)
 	// REGOP(HELP, DEMOS, HelpOps);
 	OpDescriptor* DemosOp = new OpDescriptor(
 												0, 
@@ -1428,21 +1419,6 @@
 
 	ERRORIF(!DemosOp, _R(IDE_NOMORE_MEMORY), FALSE);
 
-
-	// REGOP(HELP, DEMOS, HelpOps);
-	OpDescriptor* DemosNativeOp = new OpDescriptor(
-												0, 
-												_R(IDS_HELP_MOVIES_NATIVE),
-												CC_RUNTIME_CLASS(HelpOps), 
-												OPTOKEN_HELPDEMOS_NATIVE,
-												HelpOps::GetState,
-												HID_HELP_DEMOS,
-												_R(IDBBL_HELPDEMOSOP),
-												0 );
-
-	ERRORIF(!DemosNativeOp, _R(IDE_NOMORE_MEMORY), FALSE);
-#endif
-
 	//Webster_Ranbir_12	\96
 #ifdef INC_WEB_MENU_ITEMS
 
Index: Trunk/XaraLX/Kernel/main3.cpp
===================================================================
--- Trunk/XaraLX/Kernel/main3.cpp	(revision 1712)
+++ Trunk/XaraLX/Kernel/main3.cpp	(revision 1713)
@@ -170,6 +170,7 @@
 //#include "xpehost.h"
 #include "editsel.h"
 #include "camview.h"
+#include "selmedia.h"
 
 // Normal exe's and standalones
 BOOL InitPostTools2()
@@ -302,6 +303,7 @@
 			InitRegistry() &&					// register us with the shell etc
 			InitAppState()	&&					// get workspace prefs
 #endif
+			SelMediaDlg::Init() &&
 			TRUE
 			);
 }
Index: Trunk/XaraLX/wxOil/menucmds.cpp
===================================================================
--- Trunk/XaraLX/wxOil/menucmds.cpp	(revision 1712)
+++ Trunk/XaraLX/wxOil/menucmds.cpp	(revision 1713)
@@ -794,126 +794,9 @@
 	HelpUsingGalleries();
 }
 
-#if defined(ENABLE_MOVIES)
-
-#if wxUSE_MEDIACTRL
-enum
-{
-	wxID_MEDIACTRL			= wxID_HIGHEST + 1,
-	wxID_CLOSE_BUTTON
-};
-
-class CReplayWnd : public wxDialog
-{
-private:
-	wxMediaCtrl*	m_pMediaCtrl;
-	wxSizer*		m_pSizer;
-
-public:
-	CReplayWnd( wxWindow *pWnd );
-	virtual ~CReplayWnd()
-	{
-		TRACEUSER( "jlh92", _T("Destruct CRW
") );
-	}
-
-	void Load( const wxString& str )
-	{
-		TRACEUSER( "jlh92", _T("Load Video
") );
-		m_pMediaCtrl->Load( str );
-
-		m_pSizer->Fit( this );
-		m_pSizer->SetSizeHints( this );
-	}
-
-	void OnClose( wxCloseEvent& event );
-	void OnCreate( wxWindowCreateEvent& event );
-	void OnDestroy( wxWindowDestroyEvent& event );
-
-	void OnCloseButton( wxCommandEvent& event );
-
-	void OnLoaded( wxMediaEvent& event );
-
-	DECLARE_CLASS( CReplayWnd )
-	DECLARE_EVENT_TABLE();
-};
-
-IMPLEMENT_CLASS( CReplayWnd, wxDialog )
-BEGIN_EVENT_TABLE( CReplayWnd, wxDialog )
-//	EVT_CLOSE(			CReplayWnd::OnClose )
-//	EVT_WINDOW_DESTROY( CReplayWnd::OnDestroy )
-//	EVT_WINDOW_CREATE(	CReplayWnd::OnCreate )
-
-	EVT_BUTTON(			wxID_CLOSE_BUTTON,	CReplayWnd::OnCloseButton )
-
-	EVT_MEDIA_LOADED(	wxID_MEDIACTRL, CReplayWnd::OnLoaded )
-END_EVENT_TABLE()
-
-CReplayWnd::CReplayWnd( wxWindow *pWnd ) : wxDialog( pWnd, wxID_ANY, _T("Movie Replay"), wxDefaultPosition,
-												wxDefaultSize, wxSYSTEM_MENU | wxCAPTION )
-{
-	m_pSizer	= new wxBoxSizer( wxVERTICAL );
-	
-	m_pMediaCtrl = new wxMediaCtrl;
-	m_pMediaCtrl->Create(this, wxID_MEDIACTRL, wxEmptyString,
-						wxDefaultPosition, wxDefaultSize, 0 );
-	m_pSizer->Add( m_pMediaCtrl, 0, wxALL, 0 );
-
-	{
-		wxSizer*	pHSizer = new wxBoxSizer( wxHORIZONTAL );
-		
-		wxButton*	pButton = new wxButton( this, wxID_CLOSE_BUTTON, _T("Close") );
-		pHSizer->Add( pButton, 0, wxLEFT | wxBOTTOM | wxTOP, 5  );
-
-		wxSlider*	pSlider = new wxSlider( this, wxID_ANY, 127, 0, 255 );
-		pHSizer->Add( pSlider, 1, wxEXPAND | wxALL, 5 );
-
-		m_pSizer->Add( pHSizer );
-	}
-
-	SetSizer( m_pSizer );
-}
-
-void CReplayWnd::OnCreate( wxWindowCreateEvent& )
-{
-	TRACEUSER( "jlh92", _T("Create video
") );
-}
-
-void CReplayWnd::OnDestroy( wxWindowDestroyEvent& )
-{
-	TRACEUSER( "jlh92", _T("Destroy video
") );
-	m_pMediaCtrl->Stop();
-}
-
-void CReplayWnd::OnClose( wxCloseEvent& )
-{
-	TRACEUSER( "jlh92", _T("Close video
") );
-	m_pMediaCtrl->Stop();
-}
-
-void CReplayWnd::OnLoaded( wxMediaEvent& )
-{
-	TRACEUSER( "jlh92", _T("Play Video
") );
-	m_pMediaCtrl->Play();
-}
-
-void CReplayWnd::OnCloseButton( wxCommandEvent& )
-{
-	TRACEUSER( "jlh92", _T("Close button
") );
-	
-	if( NULL != m_pMediaCtrl )
-	{
-		m_pMediaCtrl->Stop();
-		delete m_pMediaCtrl;
-		m_pMediaCtrl = NULL;
-	}
-
-	Close();
-}
-#endif
-
 static void StartMovie( const wxString &strFile )
 {
-	wxString			strDataPath( CCamApp::GetResourceDirectory() );
+	wxString			strDataPath( (wxChar*)CCamApp::GetResourceDirectory() );
 	if( !wxDir::Exists( strDataPath ) )
 	{
 #if defined(_DEBUG)
@@ -924,9 +807,13 @@
 
 	wxString			strVideoPath( strDataPath );
 	strVideoPath += _("/video");
-	
-	wxString			strCommand( _T("mplayer -slave \"") );
+
+	wxString			strCommand; // ( _T("mplayer -slave \"") );
 	strCommand += strVideoPath + _T("/") + strFile + _T("\"");	
+
+#if true
+	CCamApp::LaunchMediaApp( strCommand );
+#else
 	long /*TYPENOTE: CORRECT*/ lResult = wxExecute( strCommand, wxEXEC_SYNC, NULL );
 	if( 255 == lResult )
 	{
@@ -937,33 +824,9 @@
 		if( 255 == lResult )
 			InformWarning( _R(IDS_MPLAYER_MISSING), _R(IDS_OK) );
 	}
-}
-
-static void StartMovieNative( const wxString &strFile )
-{
-#if wxUSE_MEDIACTRL
-	wxString			strDataPath( CCamApp::GetResourceDirectory() );
-	if( !wxDir::Exists( strDataPath ) )
-	{
-#if defined(_DEBUG)
-		// We'll try default location under debug to make life easier
-		strDataPath = _T("/usr/share");
 #endif
-	}
-
-	wxString			strVideoPath( strDataPath );
-	strVideoPath += _("/video");
-	
-	CReplayWnd*		pWnd	= new CReplayWnd( CCamFrame::GetMainFrame() );
-	pWnd->Load( strVideoPath + _T("/") + strFile );
-	
-	pWnd->Show( true );
-#else
-	InformWarning( _R(IDS_NO_MEDIACTRL), _R(IDS_OK) );
-#endif	
 }
 
-
 void HelpDemosAction()
 {
 	StartMovie( _T("Part_1_master_inc_audio_smaller_q35_fr15_hi.ogm") );
@@ -972,26 +835,6 @@
 }
 
 
-void HelpDemosNativeAction()
-{
-	StartMovieNative( _T("Part_1_master_inc_audio_smaller_q35_fr15_hi.ogm") );
-
-//	HelpOnlineDemos();
-}
-
-#else
-
-void HelpDemosAction()
-{
-}
-
-
-void HelpDemosNativeAction()
-{
-}
-
-#endif
-
 void HelpTechSupportAction()
 {
 	HelpTechnicalSupport();
Index: Trunk/XaraLX/wxOil/camelot.h
===================================================================
--- Trunk/XaraLX/wxOil/camelot.h	(revision 1712)
+++ Trunk/XaraLX/wxOil/camelot.h	(revision 1713)
@@ -154,6 +154,8 @@
 
 	static BOOL LaunchWebBrowser(const wxString& strUrl);
 
+	static bool LaunchMediaApp( const wxString& strUrl );
+	
 	// Get the path to the root of the resource directory structure
 	static StringBase& GetResourceDirectory();
 
@@ -174,6 +176,8 @@
 	static String_256	m_strResourceDirPath;	// External resources (i.e. help files)
 	static String_256	m_strResourceDirPathOverride;	// Version in preference file
 
+	static String_256	m_strMediaApplication;	// The media replay application the user chose
+
 	wxTimer				m_Timer;
 
 	wxSingleInstanceChecker * m_pSingleInstanceChecker;
Index: Trunk/XaraLX/wxOil/camelot.cpp
===================================================================
--- Trunk/XaraLX/wxOil/camelot.cpp	(revision 1712)
+++ Trunk/XaraLX/wxOil/camelot.cpp	(revision 1713)
@@ -236,6 +236,7 @@
 wxString				CCamApp::m_strResourcePath;
 String_256				CCamApp::m_strResourceDirPath;
 String_256				CCamApp::m_strResourceDirPathOverride;
+String_256				CCamApp::m_strMediaApplication;
 
 /***************************************************************************************************************************/
 
@@ -301,6 +302,18 @@
 	}
 #endif
 
+	if ( event.GetEventType() == wxEVT_KILL_FOCUS )
+	{
+		wxFocusEvent&	FocusEvent = (wxFocusEvent&)event;
+		TRACEUSER( "jlh92", _T("CCamApp::FilterEvent kill focus to %016x from 0x%016x"), FocusEvent.GetWindow(), 
+				FocusEvent.GetEventObject() );
+
+		// When we're given a null focus window it means the whole app
+		// is losing focus, so we need to result the cursor shape.
+		if( NULL == FocusEvent.GetWindow() )
+			CursorStack::GSetActive();
+	}
+
 	if (( event.GetEventType() == wxEVT_CREATE )
 		&& pEventObject
 		&& (pEventObject->IsKindOf(CLASSINFO(wxTopLevelWindow)))
@@ -830,6 +843,9 @@
 	}
 	TRACEUSER( "luke", _T("ResDir = %s
"), PCTSTR(m_strResourceDirPath) );
 
+	// Get the media replay application setting
+	Camelot.DeclarePref( NULL, TEXT("MediaApplication"), &m_strMediaApplication );
+
 	TRACET(_T("CCamApp::Calling InitKernel"));
 	// then initialise the kernel (and almost everything else)	
 	if( !InitKernel() )
@@ -2711,3 +2727,148 @@
 	}
 	wxCATCH_ALL( wxTheApp->OnUnhandledException(); return -1; )
 }
+
+class CMediaReplayDetect
+{
+private:
+	wxArrayString		m_astrPathElement;
+
+public:
+	CMediaReplayDetect()
+	{
+		wxString		strPath;
+		wxGetEnv( _T("PATH"), &strPath );
+
+		while( strPath != _T("") )
+		{
+			int			ordSep = strPath.Find( _T(':') );
+			if( -1 == ordSep )
+			{
+				if( strPath.Len() > 0 )
+					m_astrPathElement.Add( strPath );
+				break;
+			}
+
+			m_astrPathElement.Add( strPath.Mid( 0, ordSep ) );
+			TRACEUSER( "jlh92", _T("Add ele %s
"), PCTSTR(strPath.Mid( 0, ordSep )) );
+			strPath = strPath.Mid( ordSep + 1 );
+		}
+	}
+
+	bool IsAppPresent( const wxString& strApp )
+	{
+		size_t			cElement = m_astrPathElement.GetCount();
+		for( size_t ord = 0; ord < cElement; ++ord )
+		{
+			wxString	strFullPath = m_astrPathElement.Item( ord );
+			strFullPath += _T("/");
+			strFullPath += strApp;
+
+			if( wxFile::Exists( strFullPath ) )
+				return true;
+		}
+
+		return false;
+	}
+};
+
+bool CCamApp::LaunchMediaApp( const wxString& strUrl )
+{
+	CMediaReplayDetect	Detect;
+	static PCTSTR		apszApps[] = {  _T("mplayer"),
+									    _T("gmplayer"),
+										PCTSTR(1),				// Everyting above this line supports mplayer control protocol
+										_T("xine"),
+										_T("totem"),
+										_T("xfmedia"),
+										_T("codeine"),
+										NULL };
+
+	// Move array into a helpful structure
+	SelMediaDlgParam::CMediaAppList	mapMediaApp;
+	bool				fControlable = true;
+	UINT32				ord = 0;
+	while( NULL != apszApps[ord] )
+	{
+		// Skip controlable marker
+		if( PCTSTR(1) == apszApps[ord] )
+		{
+			++ord;
+			fControlable = false;
+			continue;
+		}
+
+		mapMediaApp.insert( std::make_pair( apszApps[ord], fControlable ) );
+		++ord;
+	}
+
+	// First we see if the replay app. is present
+	if( !Detect.IsAppPresent( m_strMediaApplication ) )
+	{
+		// Remove any non-present apps
+		SelMediaDlgParam::CMediaAppListIter	end( mapMediaApp.end() );
+		SelMediaDlgParam::CMediaAppListIter	iter( mapMediaApp.begin() );
+		for( ; iter != end; ++iter )
+		{
+			if( !Detect.IsAppPresent( iter->first ) )
+			{
+				mapMediaApp.erase( iter->first );
+				TRACEUSER( "jlh92", _T("%s is not present"), iter->first );
+			}
+		}
+
+		// Setup param and open replay app selection dialog
+		SelMediaDlgParam	Param;
+		Param.m_pAppList = &mapMediaApp;
+		OpDescriptor* pOpDesc = OpDescriptor::FindOpDescriptor( CC_RUNTIME_CLASS(SelMediaDlg) ); 
+		if( NULL != pOpDesc )
+		{
+			pOpDesc->Invoke( &Param );
+		
+			if( Param.m_fValid )
+				m_strMediaApplication = Param.m_strSel;
+		}
+
+		// User canceled, bomb out
+		if( !Param.m_fValid )
+			return true;
+	}
+	else
+	{
+		// Pre-selected app, check to see if we can control it
+		SelMediaDlgParam::CMediaAppListIter iter = mapMediaApp.find( apszApps[ord] );
+		if( mapMediaApp.end() == iter )
+			fControlable = false;
+		else
+			fControlable = iter->second;
+	}
+
+	// Build the command line and execute it
+	wxString			strCommand;
+	strCommand = PCTSTR(m_strMediaApplication);
+	strCommand.Append( _T(" \"") );
+	strCommand.Append( strUrl );
+	strCommand.Append( _T("\"") );
+
+	CamLaunchProcess*	plp = new CamLaunchProcess();
+	if (plp==NULL)
+		return false;
+
+	bool				ok = FALSE != plp->Execute( strCommand );
+	if (ok)
+	{
+		// Let this process run free!
+		plp->Disconnect();
+//		delete plp;								// This object will allegedly delete itself when the process dies
+	}
+	else
+	{
+		// Make sure we don't leave any zombie processes lying around
+		wxKillError e = plp->Terminate();		// This should result in a call to OnTerminate
+		TRACEUSER("Phil", _T("Terminating bad process returned %d
"), e);
+//		delete plp;								// This object will allegedly delete itself when the process dies
+	}
+
+	return ok;
+}
+
Index: Trunk/XaraLX/wxOil/xrc/EN/mediaappdlg.xrc
===================================================================
--- Trunk/XaraLX/wxOil/xrc/EN/mediaappdlg.xrc	(revision 0)
+++ Trunk/XaraLX/wxOil/xrc/EN/mediaappdlg.xrc	(revision 1713)
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="ANSI_X3.4-1968"?>
+<resource version="2.3.0.1" xmlns="http://www.wxwidgets.org/wxxrc";>
+    <object class="wxDialog" name="IDD_SEL_MEDIA_APP_DIALOG">
+        <style>wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU</style>
+        <exstyle>wxWS_EX_BLOCK_EVENTS</exstyle>
+        <title>Select Media Replay Application</title>
+        <centered>1</centered>
+        <object class="wxBoxSizer">
+            <orient>wxHORIZONTAL</orient>
+            <object class="sizeritem">
+                <flag>wxGROW|wxALL</flag>
+                <border>5</border>
+                <option>1</option>
+                <object class="wxListBox" name="IDC_LIST1">
+                    <style>wxLB_SINGLE</style>
+                </object>
+            </object>
+            <object class="sizeritem">
+                <flag>wxALIGN_TOP</flag>
+                <border>5</border>
+                <object class="wxBoxSizer">
+                    <orient>wxVERTICAL</orient>
+                    <object class="sizeritem">
+                        <flag>wxALIGN_CENTER_HORIZONTAL|wxALL</flag>
+                        <border>5</border>
+                        <object class="wxButton" name="wxID_OK">
+                            <label>&amp;OK</label>
+                        </object>
+                    </object>
+                    <object class="sizeritem">
+                        <flag>wxALIGN_CENTER_HORIZONTAL|wxALL</flag>
+                        <border>5</border>
+                        <object class="wxButton" name="wxID_CANCEL">
+                            <label>&amp;Cancel</label>
+                        </object>
+                    </object>
+                </object>
+            </object>
+        </object>
+    </object>
+    <object class="wxDialog" name="IDD_REPLAY_DLG" subclass="Dialog">
+        <style>wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxCLOSE_BOX</style>
+        <exstyle>wxWS_EX_BLOCK_EVENTS</exstyle>
+        <size>400,300</size>
+        <title>Dialog</title>
+        <centered>1</centered>
+        <object class="wxBoxSizer">
+            <orient>wxVERTICAL</orient>
+            <object class="sizeritem">
+                <flag>wxGROW|wxALL</flag>
+                <border>5</border>
+                <object class="wxSlider" name="ID_SLIDER1">
+                    <style>wxSL_HORIZONTAL</style>
+                    <value>0</value>
+                    <min>0</min>
+                    <max>100</max>
+                </object>
+            </object>
+            <object class="sizeritem">
+                <flag>wxALIGN_CENTER_HORIZONTAL</flag>
+                <border>5</border>
+                <object class="wxBoxSizer">
+                    <orient>wxHORIZONTAL</orient>
+                    <object class="sizeritem">
+                        <flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
+                        <border>5</border>
+                        <object class="wxButton" name="ID_BUTTON3">
+                            <label>|&lt;&lt;</label>
+                        </object>
+                    </object>
+                    <object class="sizeritem">
+                        <flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
+                        <border>5</border>
+                        <object class="wxButton" name="ID_BUTTON1">
+                            <label>Pause</label>
+                        </object>
+                    </object>
+                    <object class="sizeritem">
+                        <flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
+                        <border>5</border>
+                        <object class="wxButton" name="ID_BUTTON2">
+                            <label>Stop</label>
+                        </object>
+                    </object>
+                </object>
+            </object>
+        </object>
+    </object>
+</resource>


Xara