From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/Library/ml_webdev/commands.cpp | 328 +++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 Src/Plugins/Library/ml_webdev/commands.cpp (limited to 'Src/Plugins/Library/ml_webdev/commands.cpp') diff --git a/Src/Plugins/Library/ml_webdev/commands.cpp b/Src/Plugins/Library/ml_webdev/commands.cpp new file mode 100644 index 00000000..241017c9 --- /dev/null +++ b/Src/Plugins/Library/ml_webdev/commands.cpp @@ -0,0 +1,328 @@ +#include "main.h" +#include "./commands.h" +#include "./wasabi.h" +#include "./resource.h" +#include "./navigation.h" +#include "./import.h" +#include "./serviceHelper.h" +#include "../../General/gen_ml/ml_ipc_0313.h" +#include +#include +#include + +HRESULT Command_NavigateService(ifc_omservice *service, LPCWSTR pszUrl, BOOL fActiveOnly) +{ + if (NULL == service) + return E_INVALIDARG; + + Navigation *navigation; + if (FAILED(Plugin_GetNavigation(&navigation))) + return E_UNEXPECTED; + + ifc_omservice *activeService; + HWND hView = navigation->GetActiveView(&activeService); + if (NULL == hView || activeService->GetId() != service->GetId()) + hView = NULL; + + if (NULL != activeService) + activeService->Release(); + + HRESULT hr = S_OK; + + if (NULL != hView) + { + if (FALSE == BrowserView_Navigate(hView, pszUrl, TRUE)) + hr = E_FAIL; + } + else + { + hr = (FALSE == fActiveOnly) ? + navigation->ShowService(service->GetId(), pszUrl) : E_NOTIMPL; + } + + navigation->Release(); + return hr; +} +static void CALLBACK ThreadCallback_NavigateService(Dispatchable *object, ULONG_PTR param1, ULONG_PTR param2) +{ + ifc_omservice *service = (ifc_omservice*)object; + LPWSTR pszUrl = (LPWSTR)param1; + + Command_NavigateService(service, pszUrl, (BOOL)param2); + + Plugin_FreeResString(pszUrl); +} + +HRESULT Command_PostNavigateSvc(ifc_omservice *service, LPCWSTR pszUrl, BOOL fActiveOnly) +{ + if (NULL == OMUTILITY) + return E_FAIL; + + if (NULL == service) + return E_INVALIDARG; + + LPWSTR pszUrlCopy = Plugin_DuplicateResString(pszUrl); + HRESULT hr = OMUTILITY->PostMainThreadCallback2(ThreadCallback_NavigateService, service, (ULONG_PTR)pszUrlCopy, fActiveOnly); + if (FAILED(hr)) + { + Plugin_FreeResString(pszUrlCopy); + } + + return hr; + +} + +HRESULT Command_EditService(ifc_omservice *service) +{ + if (NULL == service) + return E_INVALIDARG; + + WCHAR szBuffer[2048]; + + HRESULT hr = Plugin_MakeResourcePath(szBuffer, ARRAYSIZE(szBuffer), RT_HTML, MAKEINTRESOURCE(IDR_HTML_EDITOR), RESPATH_TARGETIE | RESPATH_COMPACT); + if (FAILED(hr)) return hr; + + INT cchUrl = lstrlen(szBuffer); + LPWSTR pszParam = szBuffer + cchUrl; + INT cchParamMax = ARRAYSIZE(szBuffer) - cchUrl; + hr = StringCchPrintf(pszParam, cchParamMax, L"?serviceId=%u", service->GetId()); + if (FAILED(hr)) return hr; + + return Command_NavigateService(service, szBuffer, FALSE); +} + +HRESULT Command_ReloadService(ifc_omservice *service) +{ + if (NULL == service) + return E_INVALIDARG; + + HRESULT hr = ServiceHelper_Reload(service); + return hr; +} + +HRESULT Command_ResetPermissions(ifc_omservice *service) +{ + if (NULL == service) + return E_INVALIDARG; + + if (NULL == AGAVE_API_JSAPI2_SECURITY) + return E_UNEXPECTED; + + WCHAR szBuffer[64] = {0}; + if (FAILED(StringCchPrintfW(szBuffer, ARRAYSIZE(szBuffer), L"%u", service->GetId()))) + return E_FAIL; + + AGAVE_API_JSAPI2_SECURITY->ResetAuthorization(szBuffer); + return S_OK; +} + +HRESULT Command_LocateService(ifc_omservice *service) +{ + if (NULL == service) + return E_INVALIDARG; + + WCHAR szPath[512]; + + HRESULT hr = service->GetAddress(szPath, ARRAYSIZE(szPath)); + if (FAILED(hr)) return hr; + + if (L'\0' == szPath[0]) + return E_FAIL; + + Navigation *navigation; + if (FAILED(Plugin_GetNavigation(&navigation))) + return E_UNEXPECTED; + + navigation->Release(); + + if (WASABI_API_EXPLORERFINDFILE) + { + WASABI_API_EXPLORERFINDFILE->AddFile(szPath); + WASABI_API_EXPLORERFINDFILE->ShowFiles(); + } + return E_UNEXPECTED; +} + +HRESULT Command_EditServiceExternal(ifc_omservice *service) +{ + if (NULL == service) + return E_INVALIDARG; + + WCHAR szPath[512] = {0}; + + HRESULT hr = service->GetAddress(szPath, ARRAYSIZE(szPath)); + if (FAILED(hr)) return hr; + + if (L'\0' == szPath[0]) + return E_FAIL; + + Navigation *navigation; + if (FAILED(Plugin_GetNavigation(&navigation))) + return E_UNEXPECTED; + + HWND hOwner = navigation->GetActiveView(NULL); + navigation->Release(); + + if (NULL == hOwner) + hOwner = Plugin_GetLibrary(); + + HINSTANCE hInst = ShellExecute(hOwner, L"open", szPath, NULL, NULL, SW_SHOWNORMAL); + hr = ((INT_PTR)hInst > 32) ? S_OK : E_FAIL; + return hr; +} + +HRESULT Command_DeleteItem(HNAVITEM hItem) +{ + Navigation *navigation; + HRESULT hr = Plugin_GetNavigation(&navigation); + if (SUCCEEDED(hr)) + { + hr = navigation->DeleteItem(hItem); + navigation->Release(); + } + + return hr; +} + +HRESULT Command_DeleteAll() +{ + Navigation *navigation; + HRESULT hr = Plugin_GetNavigation(&navigation); + if (SUCCEEDED(hr)) + { + hr = navigation->DeleteAll(); + navigation->Release(); + } + + return hr; +} + +HRESULT Command_CreateService() +{ + Navigation *navigation; + HRESULT hr = Plugin_GetNavigation(&navigation); + if (FAILED(hr)) return hr; + + HNAVITEM hItem; + hr = navigation->CreateUserService(&hItem); + if (SUCCEEDED(hr)) + { + ifc_omservice *service; + hr= navigation->GetService(hItem, &service); + if (SUCCEEDED(hr)) + { + Command_EditService(service); + service->Release(); + } + } + navigation->Release(); + return hr; +} + +HRESULT Command_NewWindow(HNAVITEM hItem) +{ + Navigation *navigation; + HRESULT hr = Plugin_GetNavigation(&navigation); + if (SUCCEEDED(hr)) + { + HWND hWindow; + HRESULT hr = navigation->CreatePopup(hItem, &hWindow); + if (SUCCEEDED(hr)) + { + ShowWindow(hWindow, SW_SHOWNORMAL); + } + navigation->Release(); + } + return hr; +} + +HRESULT Command_OpenView(HNAVITEM hItem) +{ + Navigation *navigation; + HRESULT hr = Plugin_GetNavigation(&navigation); + if (SUCCEEDED(hr)) + { + hr = navigation->SelectItem(hItem, NULL); + navigation->Release(); + } + + return hr; +} + +void Command_ImportFiles() +{ + HWND hOwner = Plugin_GetDialogOwner(); + ImportService_FromFile(hOwner); +} + +void Command_ImportUrl() +{ + HWND hOwner = Plugin_GetDialogOwner(); + ImportService_FromUrl(hOwner); +} + +static void CALLBACK BrowserOptions_Callback(HWND hOptions, UINT type, ULONG_PTR user) +{ + HWND hLibrary = (HWND)user; + switch(type) + { + case BOCALLBACK_INIT: + { + HWND hView = (HWND)SENDMLIPC(hLibrary, ML_IPC_GETCURRENTVIEW, 0); + if (NULL != hView) + { + RECT viewRect, optionsRect; + if (GetWindowRect(hView, &viewRect) && GetWindowRect(hOptions, &optionsRect)) + { + INT x = viewRect.left + ((viewRect.right - viewRect.left) - (optionsRect.right - optionsRect.left))/2; + INT y = viewRect.top + ((viewRect.bottom - viewRect.top) - (optionsRect.bottom - optionsRect.top))/2; + SetWindowPos(hOptions, NULL, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); + SendMessage(hOptions, DM_REPOSITION, 0, 0L); + } + } + } + break; + } +} + +HRESULT Command_ShowBrowserOptions() +{ + HWND hWinamp = Plugin_GetWinamp(); + if (NULL == hWinamp || NULL == OMBROWSERMNGR) + return E_UNEXPECTED; + + HRESULT hr = OMBROWSERMNGR->Initialize(NULL, hWinamp); + if (SUCCEEDED(hr)) + { + HWND hOwner = Plugin_GetDialogOwner(); + hr = OMBROWSERMNGR->ShowOptions(hOwner, BOSTYLE_NORMAL | BOSTYLE_SHOWDEBUG, + BrowserOptions_Callback, (ULONG_PTR)hOwner); + } + return hr; +} + +BOOL CommandManager_Process(HNAVITEM hItem, ifc_omservice *service, UINT commandId) +{ + switch(commandId) + { + case ID_VIEW_OPEN: Command_OpenView(hItem); return TRUE; + case ID_VIEW_NEWWINDOW: Command_NewWindow(hItem); return TRUE; + case ID_SERVICE_NEW: Command_CreateService(); return TRUE; + case ID_SERVICE_DELETE: Command_DeleteItem(hItem); return TRUE; + case ID_SERVICE_DELETEALL: Command_DeleteAll(); return TRUE; + case ID_SERVICE_EDIT: Command_EditService(service); return TRUE; + case ID_SERVICE_LOCATE: Command_LocateService(service); return TRUE; + case ID_SERVICE_EDITEXTERNAL: Command_EditServiceExternal(service); return TRUE; + case ID_SERVICE_RELOAD: Command_ReloadService(service); return TRUE; + case ID_SERVICE_RESETPERMISSIONS: Command_ResetPermissions(service); return TRUE; + case ID_NAVIGATION_BACK: Command_NavigateService(service, NAVIGATE_BACK, TRUE); return TRUE; + case ID_NAVIGATION_FORWARD: Command_NavigateService(service, NAVIGATE_FORWARD, TRUE); return TRUE; + case ID_NAVIGATION_HOME: Command_NavigateService(service, NAVIGATE_HOME, TRUE); return TRUE; + case ID_NAVIGATION_STOP: Command_NavigateService(service, NAVIGATE_STOP, TRUE); return TRUE; + case ID_NAVIGATION_REFRESH: Command_NavigateService(service, NAVIGATE_REFRESH, TRUE); return TRUE; + case ID_OMBROWSER_OPTIONS: Command_ShowBrowserOptions(); return TRUE; + case ID_SERVICE_IMPORT_FILE: Command_ImportFiles(); return TRUE; + case ID_SERVICE_IMPORT_URL: Command_ImportUrl(); return TRUE; + } + return FALSE; +} \ No newline at end of file -- cgit