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