| Index: ui/base/cocoa/text_services_context_menu.cc
|
| diff --git a/ui/base/cocoa/text_services_context_menu.cc b/ui/base/cocoa/text_services_context_menu.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..788bb0644394a9f76ef2078dd553382cbcd4fe50
|
| --- /dev/null
|
| +++ b/ui/base/cocoa/text_services_context_menu.cc
|
| @@ -0,0 +1,144 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ui/base/cocoa/text_services_context_menu.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include <ApplicationServices/ApplicationServices.h>
|
| +#include <CoreAudio/CoreAudio.h>
|
| +
|
| +#include "base/strings/sys_string_conversions.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +#include "ui/strings/grit/ui_strings.h"
|
| +
|
| +namespace {
|
| +
|
| +// The speech channel used for speaking.
|
| +SpeechChannel g_speech_channel;
|
| +
|
| +// Returns the TextDirection associated associated with the given
|
| +// BiDi |command_id|.
|
| +base::i18n::TextDirection GetTextDirectionFromCommandId(int command_id) {
|
| + switch (command_id) {
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
|
| + return base::i18n::UNKNOWN_DIRECTION;
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
|
| + return base::i18n::LEFT_TO_RIGHT;
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
|
| + return base::i18n::RIGHT_TO_LEFT;
|
| + default:
|
| + NOTREACHED();
|
| + return base::i18n::UNKNOWN_DIRECTION;
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace ui {
|
| +
|
| +TextServicesContextMenu::TextServicesContextMenu(Delegate* delegate)
|
| + : speech_submenu_model_(this),
|
| + bidi_submenu_model_(this),
|
| + delegate_(delegate) {
|
| + DCHECK(delegate);
|
| +
|
| + speech_submenu_model_.AddItemWithStringId(IDS_SPEECH_START_SPEAKING_MAC,
|
| + IDS_SPEECH_START_SPEAKING_MAC);
|
| + speech_submenu_model_.AddItemWithStringId(IDS_SPEECH_STOP_SPEAKING_MAC,
|
| + IDS_SPEECH_STOP_SPEAKING_MAC);
|
| +
|
| + bidi_submenu_model_.AddCheckItemWithStringId(
|
| + IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT,
|
| + IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT);
|
| + bidi_submenu_model_.AddCheckItemWithStringId(
|
| + IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR,
|
| + IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR);
|
| + bidi_submenu_model_.AddCheckItemWithStringId(
|
| + IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL,
|
| + IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL);
|
| +}
|
| +
|
| +void TextServicesContextMenu::SpeakText(const base::string16& text) {
|
| + if (IsSpeaking())
|
| + StopSpeaking();
|
| +
|
| + NewSpeechChannel(nullptr, &g_speech_channel);
|
| + SpeakCFString(g_speech_channel, SysUTF16ToCFStringRef(text), nullptr);
|
| +}
|
| +
|
| +void TextServicesContextMenu::StopSpeaking() {
|
| + StopSpeechAt(g_speech_channel, kImmediate);
|
| + DisposeSpeechChannel(g_speech_channel);
|
| +}
|
| +
|
| +bool TextServicesContextMenu::IsSpeaking() {
|
| + return SpeechBusy();
|
| +}
|
| +
|
| +void TextServicesContextMenu::AppendToContextMenu(SimpleMenuModel* model) {
|
| + model->AddSeparator(NORMAL_SEPARATOR);
|
| + model->AddSubMenuWithStringId(IDS_SPEECH_MAC, IDS_SPEECH_MAC,
|
| + &speech_submenu_model_);
|
| +}
|
| +
|
| +void TextServicesContextMenu::AppendEditableItems(SimpleMenuModel* model) {
|
| + model->AddSubMenuWithStringId(IDS_CONTENT_CONTEXT_WRITING_DIRECTION_MENU,
|
| + IDS_CONTENT_CONTEXT_WRITING_DIRECTION_MENU,
|
| + &bidi_submenu_model_);
|
| +}
|
| +
|
| +bool TextServicesContextMenu::IsCommandIdChecked(int command_id) const {
|
| + switch (command_id) {
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
|
| + return delegate_->IsTextDirectionChecked(
|
| + GetTextDirectionFromCommandId(command_id));
|
| + case IDS_SPEECH_START_SPEAKING_MAC:
|
| + case IDS_SPEECH_STOP_SPEAKING_MAC:
|
| + return false;
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return false;
|
| +}
|
| +
|
| +bool TextServicesContextMenu::IsCommandIdEnabled(int command_id) const {
|
| + switch (command_id) {
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
|
| + return delegate_->IsTextDirectionEnabled(
|
| + GetTextDirectionFromCommandId(command_id));
|
| + case IDS_SPEECH_START_SPEAKING_MAC:
|
| + return true;
|
| + case IDS_SPEECH_STOP_SPEAKING_MAC:
|
| + return IsSpeaking();
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return false;
|
| +}
|
| +
|
| +void TextServicesContextMenu::ExecuteCommand(int command_id, int event_flags) {
|
| + switch (command_id) {
|
| + case IDS_SPEECH_START_SPEAKING_MAC:
|
| + SpeakText(delegate_->GetSelectedText());
|
| + break;
|
| + case IDS_SPEECH_STOP_SPEAKING_MAC:
|
| + StopSpeaking();
|
| + break;
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
|
| + case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
|
| + delegate_->UpdateTextDirection(GetTextDirectionFromCommandId(command_id));
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| +} // namespace ui
|
|
|