Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: ui/base/cocoa/text_services_context_menu.cc

Issue 2164483006: [MacViews] Implemented text context menu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/base/cocoa/text_services_context_menu.h"
6
7 #include <utility>
8
9 #include <ApplicationServices/ApplicationServices.h>
10 #include <CoreAudio/CoreAudio.h>
11
12 #include "base/strings/sys_string_conversions.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "ui/base/l10n/l10n_util.h"
15 #include "ui/strings/grit/ui_strings.h"
16
17 namespace {
18
19 // The speech channel used for speaking.
Alexei Svitkine (slow) 2017/02/01 19:12:37 Can you expand comment to mention why it makes sen
spqchan 2017/02/02 20:35:06 Done.
20 SpeechChannel g_speech_channel;
21
22 // Returns the TextDirection associated associated with the given
23 // BiDi |command_id|.
24 base::i18n::TextDirection GetTextDirectionFromCommandId(int command_id) {
25 switch (command_id) {
26 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
27 return base::i18n::UNKNOWN_DIRECTION;
28 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
29 return base::i18n::LEFT_TO_RIGHT;
30 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
31 return base::i18n::RIGHT_TO_LEFT;
32 default:
33 NOTREACHED();
34 return base::i18n::UNKNOWN_DIRECTION;
35 }
36 }
37
38 } // namespace
39
40 namespace ui {
41
42 TextServicesContextMenu::TextServicesContextMenu(Delegate* delegate)
43 : speech_submenu_model_(this),
44 bidi_submenu_model_(this),
45 delegate_(delegate) {
46 DCHECK(delegate);
47
48 speech_submenu_model_.AddItemWithStringId(IDS_SPEECH_START_SPEAKING_MAC,
49 IDS_SPEECH_START_SPEAKING_MAC);
50 speech_submenu_model_.AddItemWithStringId(IDS_SPEECH_STOP_SPEAKING_MAC,
51 IDS_SPEECH_STOP_SPEAKING_MAC);
52
53 bidi_submenu_model_.AddCheckItemWithStringId(
54 IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT,
55 IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT);
56 bidi_submenu_model_.AddCheckItemWithStringId(
57 IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR,
58 IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR);
59 bidi_submenu_model_.AddCheckItemWithStringId(
60 IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL,
61 IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL);
62 }
63
64 void TextServicesContextMenu::SpeakText(const base::string16& text) {
65 if (IsSpeaking())
66 StopSpeaking();
67
68 NewSpeechChannel(nullptr, &g_speech_channel);
Alexei Svitkine (slow) 2017/02/01 19:12:37 What happens if g_speech_channel already exists?
spqchan 2017/02/02 20:35:06 Whoops, that's a good point. I added a check for i
Alexei Svitkine (slow) 2017/02/02 20:50:24 I would prefer it's done in this CL so that it's n
spqchan 2017/02/03 23:32:10 Done.
69 SpeakCFString(g_speech_channel, SysUTF16ToCFStringRef(text), nullptr);
70 }
71
72 void TextServicesContextMenu::StopSpeaking() {
73 StopSpeechAt(g_speech_channel, kImmediate);
74 DisposeSpeechChannel(g_speech_channel);
75 }
76
77 bool TextServicesContextMenu::IsSpeaking() {
78 return SpeechBusy();
79 }
80
81 void TextServicesContextMenu::AppendToContextMenu(SimpleMenuModel* model) {
82 model->AddSeparator(NORMAL_SEPARATOR);
83 model->AddSubMenuWithStringId(IDS_SPEECH_MAC, IDS_SPEECH_MAC,
84 &speech_submenu_model_);
85 }
86
87 void TextServicesContextMenu::AppendEditableItems(SimpleMenuModel* model) {
88 model->AddSubMenuWithStringId(IDS_CONTENT_CONTEXT_WRITING_DIRECTION_MENU,
89 IDS_CONTENT_CONTEXT_WRITING_DIRECTION_MENU,
90 &bidi_submenu_model_);
91 }
92
93 bool TextServicesContextMenu::IsCommandIdChecked(int command_id) const {
94 switch (command_id) {
95 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
96 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
97 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
98 return delegate_->IsTextDirectionChecked(
99 GetTextDirectionFromCommandId(command_id));
100 case IDS_SPEECH_START_SPEAKING_MAC:
101 case IDS_SPEECH_STOP_SPEAKING_MAC:
102 return false;
103 }
104
105 NOTREACHED();
106 return false;
107 }
108
109 bool TextServicesContextMenu::IsCommandIdEnabled(int command_id) const {
110 switch (command_id) {
111 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
112 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
113 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
114 return delegate_->IsTextDirectionEnabled(
115 GetTextDirectionFromCommandId(command_id));
116 case IDS_SPEECH_START_SPEAKING_MAC:
117 return true;
118 case IDS_SPEECH_STOP_SPEAKING_MAC:
119 return IsSpeaking();
120 }
121
122 NOTREACHED();
123 return false;
124 }
125
126 void TextServicesContextMenu::ExecuteCommand(int command_id, int event_flags) {
127 switch (command_id) {
128 case IDS_SPEECH_START_SPEAKING_MAC:
129 SpeakText(delegate_->GetSelectedText());
130 break;
131 case IDS_SPEECH_STOP_SPEAKING_MAC:
132 StopSpeaking();
133 break;
134 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT:
135 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR:
136 case IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL:
137 delegate_->UpdateTextDirection(GetTextDirectionFromCommandId(command_id));
138 break;
139 default:
140 NOTREACHED();
141 }
142 }
143
144 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698