diff --git a/bazaar/Controls4U/ActiveX.cpp b/bazaar/Controls4U/ActiveX.cpp new file mode 100644 index 000000000..c10445fa9 --- /dev/null +++ b/bazaar/Controls4U/ActiveX.cpp @@ -0,0 +1,343 @@ +#ifdef _WIN32 + +#include + +using namespace Upp; + +#include "ActiveX.h" + +bool BSTRSet(const String str, BSTR &bstr) { + wchar_t *buffer; + DWORD size = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0); + if (!(buffer = (wchar_t *)GlobalAlloc(GMEM_FIXED, sizeof(wchar_t) * size))) + return false; + + MultiByteToWideChar(CP_UTF8, 0, str, -1, buffer, size); + bstr = SysAllocString(buffer); + GlobalFree(buffer); + if (!bstr) + return false; + return true; +} + +OleStr::OleStr() { + VariantInit(&var); + VariantClear(&var); +} + +OleStr::~OleStr() { + SysFreeString(var.bstrVal); +} + +bool OleStr::Set(const String str) { + var.vt = VT_BSTR; + return BSTRSet(str, var.bstrVal); +} + +CBSTR::~CBSTR() { + SysFreeString(bstr); +} + +bool CBSTR::Set(const String str) { + return BSTRSet(str, bstr); +} + +DHCtrlActiveX::DHCtrlActiveX(CLSID clsid, const String name) : oleObj(0), pClientSite(0), clsid(clsid), name(name) {} + +DHCtrlActiveX::~DHCtrlActiveX(void) { + Detach(); +} + +LRESULT DHCtrlActiveX::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { + switch (message) { + case WM_SIZE: DoResize(); + break; + case WM_CREATE: Attach(GetHWND()); + EnableWindow(GetHWND(), true); + break; + } + return DHCtrl::WindowProc(message, wParam, lParam); +} + +void *DHCtrlActiveX::QueryInterface(const IID iid) { + void *ret; + if (!oleObj) + return NULL; + if (S_OK != oleObj->QueryInterface(iid, &ret)) + return NULL; + return ret; +} + +void DHCtrlActiveX::Detach() { + if(!pClientSite.hwnd) + return; + if (!oleObj) + return; + + oleObj->Close(OLECLOSE_NOSAVE); + oleObj->Release(); +} + +void DHCtrlActiveX::DoResize() { + if(!pClientSite.hwnd) + return; + if (!oleObj) + return; + + RECT rect; + GetClientRect(pClientSite.hwnd, &rect); + + IOleInPlaceObject *inplace = (IOleInPlaceObject *)QueryInterface(IID_IOleInPlaceObject); + if (inplace) { + inplace->SetObjectRects(&rect, &rect); + inplace->Release(); + } +} + +bool DHCtrlActiveX::Attach(HWND hwnd) { + if (hwnd == (HWND)-1 || hwnd == 0) + return false; + if(pClientSite.hwnd && pClientSite.hwnd != hwnd) + Detach(); + if(!hwnd) + return false; + + RECT rect; + AXStorage storage; + pClientSite.hwnd = hwnd; + + if (OleCreate(clsid, IID_IOleObject, OLERENDER_DRAW, 0, (IOleClientSite *)&pClientSite, &storage, (void**)&oleObj)) + return false; + + oleObj->SetHostNames(name.ToWString(), 0); + GetClientRect(hwnd, &rect); + if (!OleSetContainedObject((IUnknown *)oleObj, TRUE)) { + if (!oleObj->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, (IOleClientSite *)&pClientSite, -1, hwnd, &rect)) + return true; + } + Detach(); + return false; +} + +HRESULT STDMETHODCALLTYPE AXStorage::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) { + throw Exc(t_("Function not implemented")); +} + +ULONG STDMETHODCALLTYPE AXStorage::AddRef( void) { + return 1; +} + +ULONG STDMETHODCALLTYPE AXStorage::Release( void) { + return 0; +} + +HRESULT STDMETHODCALLTYPE AXStorage::CreateStream(const OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::OpenStream(const OLECHAR *pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::CreateStorage(const OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::OpenStorage(const OLECHAR *pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::CopyTo(DWORD ciidExclude, const IID *rgiidExclude, SNB snbExclude, IStorage *pstgDest) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::MoveElementTo(const OLECHAR *pwcsName, IStorage *pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::Commit(DWORD grfCommitFlags) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::Revert() { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::EnumElements(DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::DestroyElement(const OLECHAR *pwcsName) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::RenameElement(const OLECHAR *pwcsOldName, const OLECHAR *pwcsNewName) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::SetElementTimes(const OLECHAR *pwcsName, const FILETIME *pctime, const FILETIME *patime, const FILETIME *pmtime) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::SetClass(REFCLSID clsid) { + return(S_OK); +} + +HRESULT STDMETHODCALLTYPE AXStorage::SetStateBits(DWORD grfStateBits, DWORD grfMask) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXStorage::Stat(STATSTG *pstatstg, DWORD grfStatFlag) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) { + if (!memcmp(&riid, &IID_IUnknown, sizeof(GUID))) + *ppvObject = reinterpret_cast (this); + else if (!memcmp(&riid, &IID_IOleClientSite, sizeof(GUID))) + *ppvObject = (IOleClientSite *)this; + else if (!memcmp(&riid, &IID_IOleInPlaceSite, sizeof(GUID))) + *ppvObject = (IOleInPlaceSite *)this; + else { + *ppvObject = 0; + return(E_NOINTERFACE); + } + return S_OK; +} + +ULONG STDMETHODCALLTYPE AXClientSite::AddRef() { + return 1; +} + +ULONG STDMETHODCALLTYPE AXClientSite::Release() { + return 0; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::SaveObject() { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::GetContainer(IOleContainer **ppContainer) { + *ppContainer = 0; + return E_NOINTERFACE; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::ShowObject() { + return NOERROR; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::OnShowWindow(BOOL fShow) { + return NOERROR; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::RequestNewObjectLayout() { + throw Exc(t_("Function not implemented")); +} + + +HRESULT STDMETHODCALLTYPE AXClientSite::GetWindow(HWND *phwnd) { + *phwnd = hwnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::ContextSensitiveHelp(BOOL fEnterMode) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::GetBorder(LPRECT lprectBorder) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::SetActiveObject(IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject) { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::RemoveMenus(HMENU hmenuShared) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::SetStatusText(LPCOLESTR pszStatusText) { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::EnableModeless(BOOL fEnable) { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::TranslateAccelerator(LPMSG lpmsg, WORD wID) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::CanInPlaceActivate() { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::OnInPlaceActivate() { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::OnUIActivate() { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::GetWindowContext(IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) { + *ppFrame = (IOleInPlaceFrame *)this; + + *ppDoc = 0; + + lpFrameInfo->fMDIApp = FALSE; + lpFrameInfo->hwndFrame = hwnd; + lpFrameInfo->haccel = 0; + lpFrameInfo->cAccelEntries = 0; + + GetClientRect(lpFrameInfo->hwndFrame, lprcPosRect); + GetClientRect(lpFrameInfo->hwndFrame, lprcClipRect); + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::Scroll(SIZE scrollExtant) { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::OnUIDeactivate(BOOL fUndoable) { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::OnInPlaceDeactivate() { + return S_OK; +} + +HRESULT STDMETHODCALLTYPE AXClientSite::DiscardUndoState() { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::DeactivateAndUndo() { + throw Exc(t_("Function not implemented")); +} + +HRESULT STDMETHODCALLTYPE AXClientSite::OnPosRectChange(LPCRECT lprcPosRect) { + return S_OK; +} + +#endif diff --git a/bazaar/Controls4U/ActiveX.h b/bazaar/Controls4U/ActiveX.h new file mode 100644 index 000000000..ae7b1c879 --- /dev/null +++ b/bazaar/Controls4U/ActiveX.h @@ -0,0 +1,125 @@ +#ifndef _hdIE_ActiveX_h_ +#define _hdIE_ActiveX_h_ + + +#ifndef OLERENDER_DRAW + #define OLERENDER_DRAW 1 +#endif + +#define CY void * + +#include +#include +#include + +#include "ActiveX_base.h" +#include +#include "plugin/vlc/axvlc_idl.h" + +static const CLSID CLSID_MozillaBrowser = {0x1339B54C, 0x3453, 0x11D2, {0x93, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; //http://www.iol.ie/~locka/mozilla/control.htm + +class FirefoxBrowser : public DHCtrlActiveX { +public: + FirefoxBrowser() : DHCtrlActiveX(CLSID_MozillaBrowser, "Firefox") {}; + + bool Browse(const String &url); + bool ShowHTML(const String &html); + bool GoForward(); + bool GoBack(); + String GetLocation(); + String GetTitle(); + bool GetOffline(bool &offline); + String GetReadyState(); + bool GoHome(); + bool RefreshPage(); + bool Stop(); + +private: + class IIWebBrowser { + public: + IIWebBrowser(FirefoxBrowser *obj) { + web = (IWebBrowser2 *)obj->QueryInterface(IID_IWebBrowser2); + } + ~IIWebBrowser() { + web->Release(); + } + operator IWebBrowser2 *() {return web;} + IWebBrowser2 * operator ->() {return web;} + private: + IWebBrowser2 *web; + }; +}; + +class IExplorerBrowser : public DHCtrlActiveX { +public: + IExplorerBrowser() : DHCtrlActiveX(CLSID_WebBrowser, "IExplorer") {}; + + bool Browse(const String &url); + bool ShowHTML(const String &html); + bool GoForward(); + bool GoBack(); + String GetLocation(); + String GetTitle(); + bool GetOffline(bool &offline); + String GetReadyState(); + bool GoHome(); + bool RefreshPage(); + bool Stop(); + +private: + class IIWebBrowser { + public: + IIWebBrowser(IExplorerBrowser *obj) { + web = (IWebBrowser2 *)obj->QueryInterface(IID_IWebBrowser2); + } + ~IIWebBrowser() { + web->Release(); + } + operator IWebBrowser2 *() {return web;} + IWebBrowser2 * operator ->() {return web;} + private: + IWebBrowser2 *web; + }; +}; + + +static const CLSID CLSID_VLCPLayer = {0x9BE31822, 0xFDAD, 0x461B, {0xAD, 0x51, 0xBE, 0x1D, 0x1C, 0x15, 0x99, 0x21}}; + +class VLCPlayer : public DHCtrlActiveX { +public: + VLCPlayer() : DHCtrlActiveX(CLSID_VLCPLayer, "VLCPlayer") {}; + + bool AddTarget(const String movie); + bool Play(); + bool Pause(); + bool PlayFaster(); + bool PlaySlower(); + bool Stop(); + bool Shuttle(long secs); + bool IsPlaying(); + int GetVolume(); + bool PutVolume(int volume); + int GetTime(); + bool PutTime(int mseconds); + float GetPosition(); + bool PutPosition(float position); + int GetLength(); + +private: + class IIVLC { + public: + IIVLC(VLCPlayer *obj) { + vlc = (IVLCControl *)obj->QueryInterface(IID_IVLCControl); + } + ~IIVLC() { + vlc->Release(); + } + operator IVLCControl *() {return vlc;} + IVLCControl * operator ->() {return vlc;} + private: + IVLCControl *vlc; + }; +}; + + +#endif \ No newline at end of file diff --git a/bazaar/Controls4U/ActiveX_base.h b/bazaar/Controls4U/ActiveX_base.h new file mode 100644 index 000000000..fd32ec7d3 --- /dev/null +++ b/bazaar/Controls4U/ActiveX_base.h @@ -0,0 +1,117 @@ +#ifndef _hdIE_ActiveX_Support_h_ +#define _hdIE_ActiveX_Support_h_ + +bool BSTRSet(const String str, BSTR &bstr); + +class OleStr { +public: + OleStr(); + ~OleStr(); + bool Set(const String str); + operator VARIANT *() {return &var;}; +private: + VARIANT var; +}; + +class CBSTR { +public: + CBSTR() : bstr(0) {} + bool Set(const String str); + ~CBSTR(); + operator BSTR *() {return &bstr;} + operator BSTR () {return bstr;} + String ToString() { + WString ret((wchar *)bstr); + return ret.ToString(); + } +private: + BSTR bstr; +}; + +class AXClientSite : public IOleClientSite, public IOleInPlaceFrame, public IOleInPlaceSite { +public: + AXClientSite() {} + AXClientSite(HWND hwnd):hwnd(hwnd){} + + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject); + virtual ULONG STDMETHODCALLTYPE AddRef(); + virtual ULONG STDMETHODCALLTYPE Release(); + virtual HRESULT STDMETHODCALLTYPE SaveObject(); + virtual HRESULT STDMETHODCALLTYPE GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk); + virtual HRESULT STDMETHODCALLTYPE GetContainer(IOleContainer **ppContainer); + virtual HRESULT STDMETHODCALLTYPE ShowObject(); + virtual HRESULT STDMETHODCALLTYPE OnShowWindow(BOOL fShow); + virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout(); + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + virtual HRESULT STDMETHODCALLTYPE GetBorder(LPRECT lprectBorder); + virtual HRESULT STDMETHODCALLTYPE RequestBorderSpace(LPCBORDERWIDTHS pborderwidths); + virtual HRESULT STDMETHODCALLTYPE SetBorderSpace(LPCBORDERWIDTHS pborderwidths); + virtual HRESULT STDMETHODCALLTYPE SetActiveObject(IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName); + virtual HRESULT STDMETHODCALLTYPE InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); + virtual HRESULT STDMETHODCALLTYPE SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject); + virtual HRESULT STDMETHODCALLTYPE RemoveMenus(HMENU hmenuShared); + virtual HRESULT STDMETHODCALLTYPE SetStatusText(LPCOLESTR pszStatusText); + virtual HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable); + virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpmsg, WORD wID); + virtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate(); + virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate(); + virtual HRESULT STDMETHODCALLTYPE OnUIActivate(); + virtual HRESULT STDMETHODCALLTYPE GetWindowContext(IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo); + virtual HRESULT STDMETHODCALLTYPE Scroll(SIZE scrollExtant); + virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate(BOOL fUndoable); + virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate(); + virtual HRESULT STDMETHODCALLTYPE DiscardUndoState(); + virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo(); + virtual HRESULT STDMETHODCALLTYPE OnPosRectChange(LPCRECT lprcPosRect); + + HWND hwnd; +}; + +class AXStorage : public IStorage { +public: + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject); + virtual ULONG STDMETHODCALLTYPE AddRef(); + virtual ULONG STDMETHODCALLTYPE Release(); + virtual HRESULT STDMETHODCALLTYPE CreateStream(const OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm); + virtual HRESULT STDMETHODCALLTYPE OpenStream(const OLECHAR *pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm); + virtual HRESULT STDMETHODCALLTYPE CreateStorage(const OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg); + virtual HRESULT STDMETHODCALLTYPE OpenStorage(const OLECHAR *pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg); + virtual HRESULT STDMETHODCALLTYPE CopyTo(DWORD ciidExclude, const IID *rgiidExclude, SNB snbExclude, IStorage *pstgDest); + virtual HRESULT STDMETHODCALLTYPE MoveElementTo(const OLECHAR *pwcsName, IStorage *pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags); + virtual HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags); + virtual HRESULT STDMETHODCALLTYPE Revert(); + virtual HRESULT STDMETHODCALLTYPE EnumElements(DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum); + virtual HRESULT STDMETHODCALLTYPE DestroyElement(const OLECHAR *pwcsName); + virtual HRESULT STDMETHODCALLTYPE RenameElement(const OLECHAR *pwcsOldName, const OLECHAR *pwcsNewName); + virtual HRESULT STDMETHODCALLTYPE SetElementTimes(const OLECHAR *pwcsName, const FILETIME *pctime, const FILETIME *patime, const FILETIME *pmtime); + virtual HRESULT STDMETHODCALLTYPE SetClass(REFCLSID clsid); + virtual HRESULT STDMETHODCALLTYPE SetStateBits(DWORD grfStateBits, DWORD grfMask); + virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG *pstatstg, DWORD grfStatFlag); +}; + +class DHCtrlActiveX : public DHCtrl { +public: + DHCtrlActiveX(CLSID, const String); + ~DHCtrlActiveX(void); + + bool Attach(HWND hwnd); + void *QueryInterface(const IID iid); + bool IsLoaded() {return oleObj != NULL;} + +protected: + void Detach(); + +private: + LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); + void DoResize(); + + AXClientSite pClientSite; + + CLSID clsid; + String name; + IOleObject *oleObj; +}; + + +#endif diff --git a/bazaar/Controls4U/Controls4U.cpp b/bazaar/Controls4U/Controls4U.cpp index 8eef9d664..4af492b8e 100644 --- a/bazaar/Controls4U/Controls4U.cpp +++ b/bazaar/Controls4U/Controls4U.cpp @@ -4,22 +4,79 @@ using namespace Upp; #include "Controls4U/Controls4U.h" +#define TFILE +#include + #define IMAGECLASS Controls4UImg #define IMAGEFILE #include void EditFileFolder::Init() { - EditString::AddFrame(ButBrowse); - ButBrowse.SetImage(CtrlImg::right_arrow()); - ButBrowse <<= THISBACK(DoBrowse); - EditString::AddFrame(ButGo); - ButGo.SetImage(CtrlImg::SmallRight()); - ButGo <<= THISBACK(DoGo); + //EditString::AddFrame(butLeft); + //EditString::AddFrame(butRight); + //EditString::AddFrame(butUp); + EditString::AddFrame(butBrowse); + butBrowse.SetImage(CtrlImg::right_arrow()); + butBrowse <<= THISBACK(DoBrowse); + butLeft.SetImage(CtrlImg::SmallLeft()); + butLeft <<= THISBACK(DoLeft); + butRight.SetImage(CtrlImg::SmallRight()); + butRight <<= THISBACK(DoRight); + butUp.SetImage(CtrlImg::SmallUp()); + butUp <<= THISBACK(DoUp); + EditString::AddFrame(butGo); + butGo.SetImage(CtrlImg::SmallRight()); + butGo <<= THISBACK(DoGo); isFile = isLoad = true; fs.Asking(!isLoad); } +EditFileFolder &EditFileFolder::UseHistory(bool use) { + if (use) { + if (EditString::FindFrame(butLeft) == -1) { + EditString::InsertFrame(0, butRight); + EditString::InsertFrame(0, butLeft); + } + } else { + EditString::RemoveFrame(butLeft); + EditString::RemoveFrame(butRight); + } + return *this; +} + +EditFileFolder &EditFileFolder::UseUp(bool use) { + if (use) { + if (EditString::FindFrame(butUp) == -1) { + int pos = EditString::FindFrame(butRight); + EditString::InsertFrame(pos+1, butUp); + } + } else + EditString::RemoveFrame(butUp); + return *this; +} + +EditFileFolder &EditFileFolder::UseBrowse(bool use) { + if (use) { + if (EditString::FindFrame(butBrowse) == -1) { + int pos = EditString::FindFrame(butUp); + if (pos == -1) + pos = EditString::FindFrame(butRight); + EditString::InsertFrame(pos+1, butBrowse); + } + } else + EditString::RemoveFrame(butBrowse); + return *this; +} + void EditFileFolder::DoBrowse() { + String s = GetData(); + //fs.Set(s); + if (DirectoryExists(s)) + fs.dir <<= s; + else { + fs.PreSelect(GetFileName(s)); + fs.dir <<= GetFileDirectory(s); + } if (isFile && isLoad) { if (fs.ExecuteOpen(title)) { SetData(~fs); @@ -38,12 +95,23 @@ void EditFileFolder::DoBrowse() { } } -void EditFileFolder::DoGo() -{ +void EditFileFolder::DoGo() { Set(GetData()); // Write Edit to FileSel WhenChange(); } +void EditFileFolder::DoLeft() { +} +void EditFileFolder::DoRight() { +} +void EditFileFolder::DoUp() { + String folder = GetData(); + folder = GetUpperFolder(folder); + Set(folder); + SetData(folder); + WhenChange(); +} + bool EditFileFolder::Key(dword key, int rep) { if (key == K_ENTER) { // Catch the ENTER DoGo(); @@ -52,6 +120,42 @@ bool EditFileFolder::Key(dword key, int rep) { return EditField::Key(key, rep); } +EditFile::EditFile() { + isFile = true; + title = t_("Select file"); + EditFileFolder(); +}; + +EditFolder::EditFolder() { + isFile = false; + title = t_("Select directory"); + EditFileFolder(); +}; + +bool SetFirstChild(Ctrl *ctrl) { + if (Ctrl *p = ctrl->GetParent()) { + if (p->GetFirstChild() != ctrl) { + p->RemoveChild(ctrl); + p->AddChildBefore(ctrl, p->GetFirstChild()); + } + return true; + } else + return false; +} + + void StaticImage::Layout() { + if (useAsBackground) { + Ctrl *q = GetFirstChild(); + //if (StaticImage *c = dynamic_cast(q)) { + // if (!c->useAsBackground) { + SetFirstChild((Ctrl *)this); + SizePos(); + // } + //} + } + Ctrl::Layout(); +} + void StaticImage::Paint(Draw& w) { Size sz = GetSize(); @@ -81,15 +185,6 @@ void StaticImage::Paint(Draw& w) { case NoScale: w.DrawImage(0, 0, *imageView); break; - case Background: - { - Ctrl *p = GetParent(); - if (p->GetFirstChild() != this) { - p->RemoveChild(this); - p->AddChildBefore(this, p->GetFirstChild()); - } - } - SizePos(); case RepeatToFill: for (int left = 0; left < sz.cx; left += imagesize.cx) for (int top = 0; top < sz.cy; top += imagesize.cy) @@ -142,6 +237,7 @@ StaticImage::StaticImage() { background = Null; angle = Angle_0; fit = BestFit; + useAsBackground = false; } void StaticRectangle::Paint(Draw& w) { @@ -202,7 +298,7 @@ StaticFrame::StaticFrame() { } void StaticLine::FramePaint(Draw& w, const Rect& rr) { - int off = (int)(0.25*max(rr.GetWidth(), rr.GetHeight())); + int off = int(0.25*max(rr.GetWidth(), rr.GetHeight())); ImageBuffer ib(rr.GetWidth()+2*off, rr.GetHeight()+2*off); MyBufferPainter sw(ib); @@ -210,6 +306,8 @@ void StaticLine::FramePaint(Draw& w, const Rect& rr) { r.Offset(off, off); sw.Clear(RGBAZero()); + sw.LineCap(LINECAP_BUTT); + if (orientation == OrVert) sw.DrawLine((r.right+r.left)/2, r.top, (r.right+r.left)/2, r.bottom, width, color); else if (orientation == OrHor) @@ -274,7 +372,7 @@ void PaintArrowEnd(Painter &sw, double x0, double y0, double x1, double y1, int } void StaticArrow::FramePaint(Draw& w, const Rect& rr) { - int off = (int)(0.25*max(rr.GetWidth(), rr.GetHeight())); + int off = int(0.25*max(rr.GetWidth(), rr.GetHeight())); ImageBuffer ib(rr.GetWidth()+2*off, rr.GetHeight()+2*off); MyBufferPainter sw(ib); @@ -928,3 +1026,289 @@ Meter::Meter() { running = 0; kill = 0; } + +struct DisplayNameIcon : Display { + Font fnt; + + virtual Size GetStdSize(const Value& q) const { + ValueArray va = q; + String fileName = GetFileName(String(va[0])); + Size sz = GetTextSize(fileName, fnt); + sz.cx += 20; + sz.cy = max(sz.cy, 16); + return sz; + } + virtual void Paint(Draw& w, const Rect& r, const Value& q, Color ink, Color paper, dword style) const { + ValueArray va = q; + String fileName = GetFileName(String(va[0])); + Image icon = va[1]; + w.DrawRect(r, paper); + w.DrawImage(r.left, r.top + (r.Height() - 16) / 2, IsNull(icon) ? Null : icon); + w.DrawText(r.left + 20, r.top + (r.Height() - Draw::GetStdFontCy()) / 2, fileName, fnt, ink); + if (GetTextSize(fileName, fnt).cx + 5 > (r.GetWidth() - (int)(0.8*EditString::GetStdHeight()))) { + Image rightIcon = CtrlImg::right_arrow(); + w.DrawRect(r.right - 6, r.top, r.right, r.bottom, paper); + w.DrawImage(r.right - 10, r.top + rightIcon.GetHeight()/2, rightIcon); + } + } + DisplayNameIcon() { fnt = StdFont(); } +}; + +void FileBrowser::AddMyFolder(String folder, String &myFolders, TreeCtrl &folders, int id) { + if (!folder.IsEmpty()) + if (myFolders.Find(folder + ";") < 0) { + folders.Add(id, NativePathIconX(folder, true, fileFlags), folder, GetFileName(folder), true); + myFolders << folder << ";"; + } +} + +FileBrowser::FileBrowser() { + pack.Horz(foldersRect, files); + pack.SetPos(3000); + int height = folder.GetStdHeight(); + foldersRect.Add(foldersLabel.HSizePos().TopPos(0, height)); + foldersRect.Add(folders.HSizePos().VSizePos(height + 1)); + + Add(folder.HSizePos().TopPos(0, height)); + Add(pack.HSizePos().VSizePos(height + 1)); +// label.array = &files; +// Add(label); + + Transparent(); + Background(Null); + pack.Transparent(); + foldersRect.Transparent(); + foldersRect.Background(Null); + + folder.UseBrowse(false).UseUp(true).UseHistory(true); + folder.WhenChange = THISBACK(FolderChanged); + foldersLabel.SetText(t_("Folders")); + + folders.NoRoot(); + //folders.MultiSelect(); + folders.WhenOpen = THISBACK(OpenDir); + folders.WhenSel = THISBACK(FileSelectedTree); + //folders.WhenLeftClick = THISBACK(FileSelectedTree); + folders.WhenClose = THISBACK(CloseDir); + //folders.WhenCursor = THISBACK(FileSelectedTree); + //folders.WhenLeftClick = THISBACK(OpenFileTreeFolder); + Array ds = GetDriveList(); + String desktopFolder = GetDesktopFolder(); + if (!desktopFolder.IsEmpty()) + folders.Add(0, NativePathIconX(desktopFolder, true, fileFlags), desktopFolder, + GetFileName(desktopFolder), true); + int id = folders.Add(0, NativePathIconX(desktopFolder, true, fileFlags), + t_("My Folders"), t_("My Folders"), true); + + String myFolders = desktopFolder + ";"; + + AddMyFolder(GetPersonalFolder(), myFolders, folders, id); + AddMyFolder(GetMusicFolder(), myFolders, folders, id); + AddMyFolder(GetPicturesFolder(), myFolders, folders, id); + AddMyFolder(GetVideoFolder(), myFolders, folders, id); + AddMyFolder(GetDownloadFolder(), myFolders, folders, id); + AddMyFolder(GetAppDataFolder(), myFolders, folders, id); + AddMyFolder(GetTemplatesFolder(), myFolders, folders, id); + + for (int i = 0; i < ds.GetCount(); ++i) + folders.Add(0, NativePathIconX(ds[i], true, fileFlags), ds[i], ds[i], true); //+ " " + DriveSystem::Description(drive); + noDoOpen = true; + folders.Open(0); + //folders.SelectOne(0, true); + + files.Reset(); + files.AddColumn(t_("Name")).Add(3).Margin(2).Edit(textFileName)./*SetDisplay(Single()).*/HeaderTab().Min(50).WhenAction = THISBACK1(SortByColumn, 0); + files.AddColumn(t_("Size")).HeaderTab().Min(50).WhenAction = THISBACK1(SortByColumn, 1); + files.AddColumn(t_("Date")).HeaderTab().Min(50).WhenAction = THISBACK1(SortByColumn, 2); + files.MultiSelect().HeaderObject().Absolute().Clipboard(); + files.BackPaintHint(); + files.AddIndex(); + files.VertGrid(false).HorzGrid(false); + files.SetLineCy((int)(0.85*EditString::GetStdHeight())); + files.HeaderTab(0).SetRatio(10); + files.ColumnWidths("200 50 110"); + files.EvenRowColor(Blend(SColorMark, SColorPaper, 240)); +// files.SetLabel(&label); + + //files.WhenCursor = THISBACK(FilesEnterRow); +// files.WhenDropInsert = THISBACK(DropInsertFilelist); +// files.WhenDrag = THISBACK(DragFilelist); +// files.WhenDrop = THISBACK(DropFilelist); + //files.WhenSel = THISBACK(FileSelectedFilesList); + files.WhenLeftDouble = THISBACK(OpenFileFilesList); + files.WhenEnterKey = THISBACK(OpenFileFilesList); + foldersInFileList = true; + fileFlags = 0; +} + +void FileBrowser::OpenDir(int id) { + if (noDoOpen) { + noDoOpen = false; + return; + } + folder.SetData(folders[id]); + forceOpenTree = true; + FolderChanged(); + forceOpenTree = false; +} + +void FileBrowser::CloseDir(int id) { + if (folders[id] != t_("File System") && folders[id] != t_("My Folders")) + folders.RemoveChildren(id); +} + +void FileBrowser::FileSelectedTree() { + folder.SetData(~folders); + FolderChanged(); +} + +void FileBrowser::OpenFileFilesList() { + if (files.GetCursor() < 0) + return; + ValueArray va = files.GetColumn(files.GetCursor(), 0); + String fileName = va[0]; + if (IsSymLink(fileName)) { + String newPath = GetSymLinkPath(fileName); + if (!newPath.IsEmpty()) + fileName = newPath; + } + if (FileExists(fileName)) { + if (!LaunchFile(fileName)) + Exclamation(Format(t_("Sorry. It is not possible to open %s"), DeQtf(fileName))); + } else if (DirectoryExistsX(fileName, fileFlags)) { + folder.SetData(fileName); + FolderChanged(); + } +} + +void FileBrowser::ListFiles(String folderName, bool &thereIsAFolder) { + static DisplayNameIcon pd; + + files.Clear(); + FileDataArray fileData(false, fileFlags); + fileData.Search(folderName, "*.*", false); + if (fileData.GetCount() == 0) { + int cy = files.GetLineCy(); + Image img = Rescale(CtrlImg::information(), cy, cy); + files.Add(t_("No files or access not permitted"), "", "", img); + files.SetDisplay(0, 0, pd); + return; + } + fileData.SortByName(); + + thereIsAFolder = false; + for(int i = 0; i < fileData.GetCount(); i++) { + String fullFilename = fileData.FullFileName(i); + String fileName = fileData[i].fileName; + bool isFolder = fileData[i].isFolder; + + if (isFolder) + thereIsAFolder = true; + files.Add(fullFilename, isFolder ? 0 : fileData[i].length, fileData[i].t, + NativePathIconX(fullFilename, DirectoryExistsX(fullFilename, fileFlags), fileFlags)); + files.SetDisplay(files.GetCount() - 1, 0, pd); + } +} + +bool HasSubfolders(String folder, int flags) { + FindFile ff(AppendFileName(folder, "*.*")); + while(ff) { + if (DirectoryExistsX(AppendFileName(folder, ff.GetName()))) + return true; + ff.Next(); + } + return false; +} + +void FileBrowser::FolderChanged() { + int id; + + if (~folder == "" || ~folder == t_("My Folders")) { + id = folders.Find(~folder); + folders.Open(id, true); + return; + } + String folderName = GetRealName(~folder); + if (folderName.IsEmpty()) { + Exclamation(Format(t_("Folder %s does not exist or is not available"), ~folder)); + return; + } + if (folderName != ~folder) + folder.SetData(folderName); + + String folderNameAux = folderName; + + while ((id = folders.Find(folderNameAux)) == -1) { + String upper = GetUpperFolder(folderNameAux); + if (upper == folderNameAux) + return; + folderNameAux = upper; + } + bool thereIsAFolder; + ListFiles(folderName, thereIsAFolder); + + if (folderNameAux != folderName || !folders.IsOpen(id) || forceOpenTree) { + while (folderNameAux != folderName) { + String newFolderNameAux = GetNextFolder(folderNameAux, folderName); + noDoOpen = true; + folders.Open(id, true); + + FileDataArray fileData; + fileData.Search(folderNameAux, "*.*", false); + fileData.SortByName(); + int newid = -1; + folders.RemoveChildren(id); + for (int i = 0; i < fileData.GetCount(); ++i) { + String fullName = fileData.FullFileName(i); + int auxid = folders.Add(id, NativePathIconX(fullName, true, fileFlags), + fullName, fileData[i].fileName, HasSubfolders(fullName, fileFlags)); + if (fullName == newFolderNameAux) + newid = auxid; + } + if (newid == -1) { + Exclamation(Format(t_("Folder %s not found"), DeQtf(folderNameAux))); + return; + } + id = newid; + folderNameAux = newFolderNameAux; + } + FileDataArray fileData; + fileData.Search(folderName, "*.*", false); + fileData.SortByName(); + folders.RemoveChildren(id); + for (int i = 0; i < fileData.GetCount(); ++i) { + String fullName = fileData.FullFileName(i); + if (DirectoryExistsX(fullName, fileFlags)) + folders.Add(id, NativePathIconX(fullName, true, fileFlags), fullName, + fileData[i].fileName, HasSubfolders(fullName, fileFlags)); + } + //noDoOpen = true; + folders.Open(id, true); + } + folders.SetCursor(id); +} + +void FileBrowser::FilesEnterRow() { + int i = 1; +} + +void FileBrowser::SortByColumn(int col) { + static bool order[] = {true, true, true}; + + if (col < 0 || col > 2) + return; + + if (order[col]) + files.Sort(col, StdValueCompare); + else + files.Sort(col, StdValueCompareDesc); + order[col] = !order[col]; +} + +String FileBrowser::GetFile() { + return ""; +} + +String FileBrowser::GetFolder() { + return ""; +} \ No newline at end of file diff --git a/bazaar/Controls4U/Controls4U.h b/bazaar/Controls4U/Controls4U.h index 856c05e3d..9a7980996 100644 --- a/bazaar/Controls4U/Controls4U.h +++ b/bazaar/Controls4U/Controls4U.h @@ -3,7 +3,11 @@ #include #include "Functions4U/Functions4U.h" +#if defined(PLATFORM_WIN32) +#include "Controls4U/ActiveX.h" +#endif +#ifndef flagNOPAINTER class MyBufferPainter : public BufferPainter { public: MyBufferPainter(ImageBuffer& ib, int mode = MODE_ANTIALIASED) : BufferPainter(ib, mode) {}; @@ -61,12 +65,13 @@ public: } } }; +#endif class EditFileFolder : public EditString { typedef EditFileFolder CLASSNAME; protected: - FrameLeft