15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "stdafx.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "settings_handler.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This include allows to send WM_SYSCOMMANDs to chrome. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_app_view.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "winrt_utils.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef winfoundtn::ITypedEventHandler< 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) winui::ApplicationSettings::SettingsPane*, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) winui::ApplicationSettings::SettingsPaneCommandsRequestedEventArgs*> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandsRequestedHandler; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// String identifiers for the settings pane commands. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* kSettingsId = L"settings"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* kHelpId = L"help"; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* kAboutId = L"about"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SettingsHandler::SettingsHandler() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << __FUNCTION__; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SettingsHandler::~SettingsHandler() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << __FUNCTION__; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT SettingsHandler::Initialize() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winui::ApplicationSettings::ISettingsPaneStatics> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_pane_statics; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = winrt_utils::CreateActivationFactory( 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuntimeClass_Windows_UI_ApplicationSettings_SettingsPane, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_pane_statics.GetAddressOf()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to activate ISettingsPaneStatics"); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winui::ApplicationSettings::ISettingsPane> settings_pane; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = settings_pane_statics->GetForCurrentView(&settings_pane); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to get ISettingsPane"); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = settings_pane->add_CommandsRequested( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::Callback<CommandsRequestedHandler>( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SettingsHandler::OnSettingsCommandsRequested).Get(), 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &settings_token_); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to add CommandsRequested"); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT SettingsHandler::OnSettingsCommandsRequested( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) winui::ApplicationSettings::ISettingsPane* settings_pane, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) winui::ApplicationSettings::ISettingsPaneCommandsRequestedEventArgs* args) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winui::ApplicationSettings::ISettingsCommandFactory> 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_command_factory; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = winrt_utils::CreateActivationFactory( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuntimeClass_Windows_UI_ApplicationSettings_SettingsCommand, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_command_factory.GetAddressOf()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to activate ISettingsCommandFactory"); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winui::ApplicationSettings::ISettingsPaneCommandsRequest> 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_command_request; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = args->get_Request(&settings_command_request); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to get_Request"); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<SettingsHandler::ISettingsCommandVector> application_commands; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = settings_command_request->get_ApplicationCommands(&application_commands); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to get_ApplicationCommands"); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mad): Internationalize the hard coded user visible strings. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = AppendNewSettingsCommand( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSettingsId, L"Settings", settings_command_factory.Get(), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) application_commands.Get()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to append new settings command"); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = AppendNewSettingsCommand( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHelpId, L"Help", settings_command_factory.Get(), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) application_commands.Get()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to append new help command"); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = AppendNewSettingsCommand( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAboutId, L"About", settings_command_factory.Get(), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) application_commands.Get()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to append new about command"); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT SettingsHandler::AppendNewSettingsCommand( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t* id, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t* name, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) winui::ApplicationSettings::ISettingsCommandFactory* 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_command_factory, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SettingsHandler::ISettingsCommandVector* settings_command_vector) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winfoundtn::IPropertyValue> settings_id; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = GetSettingsId(id, &settings_id); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Can't get settings id"); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswrw::HString settings_name; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_name.Attach(MakeHString(name)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winui::Popups::IUICommand> command; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = settings_command_factory->CreateSettingsCommand( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_id.Get(), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_name.Get(), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::Callback<winui::Popups::IUICommandInvokedHandler>( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SettingsHandler::OnSettings).Get(), 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command.GetAddressOf()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Can't create settings command"); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = settings_command_vector->Append(command.Get()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to append settings command"); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT SettingsHandler::OnSettings(winui::Popups::IUICommand* command) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winfoundtn::IPropertyValue> settings_id; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = GetSettingsId(kSettingsId, &settings_id); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to get settings id"); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winfoundtn::IPropertyValue> help_id; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = GetSettingsId(kHelpId, &help_id); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to get settings id"); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winfoundtn::IPropertyValue> about_id; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = GetSettingsId(kAboutId, &about_id); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to get settings id"); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswr::ComPtr<winfoundtn::IPropertyValue> command_id; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = command->get_Id(&command_id); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to get command id"); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INT32 result = -1; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = winrt_utils::CompareProperties( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_id.Get(), settings_id.Get(), &result); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to compare ids"); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND chrome_window = globals.host_windows.front().first; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == 0) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::PostMessageW(chrome_window, WM_SYSCOMMAND, IDC_OPTIONS, 0); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = winrt_utils::CompareProperties(command_id.Get(), help_id.Get(), &result); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to compare ids"); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == 0) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::PostMessageW(chrome_window, WM_SYSCOMMAND, IDC_HELP_PAGE_VIA_MENU, 0); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = winrt_utils::CompareProperties( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_id.Get(), about_id.Get(), &result); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckHR(hr, "Failed to compare ids"); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == 0) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::PostMessageW(chrome_window, WM_SYSCOMMAND, IDC_ABOUT, 0); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT SettingsHandler::GetSettingsId( 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t* value, winfoundtn::IPropertyValue** settings_id) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mswrw::HString property_value_string; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) property_value_string.Attach(MakeHString(value)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return winrt_utils::CreateStringProperty(property_value_string.Get(), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_id); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 176