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

Side by Side Diff: chrome/browser/resources/file_manager/js/dialogs.js

Issue 8271025: Moved mobile activation into its own modal dialog (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 cr.define('cr.ui.dialogs', function() {
6
7 function BaseDialog(parentNode) {
8 this.parentNode_ = parentNode;
9 this.document_ = parentNode.ownerDocument;
10
11 // The DOM element from the dialog which should receive focus when the
12 // dialog is first displayed.
13 this.initialFocusElement_ = null;
14
15 // The DOM element from the parent which had focus before we were displayed,
16 // so we can restore it when we're hidden.
17 this.previousActiveElement_ = null;
18
19 this.initDom_();
20 }
21
22 /**
23 * Default text for Ok and Cancel buttons.
24 *
25 * Clients should override these with localized labels.
rginda 2011/10/15 16:53:46 You're going to have to localize these labels from
zel 2011/10/18 23:43:12 Done - fixed file manager as well (wasn't localizi
26 */
27 BaseDialog.OK_LABEL = 'Ok';
28 BaseDialog.CANCEL_LABEL = 'Cancel';
29
30 /**
31 * Number of miliseconds animation is expected to take, plus some margin for
32 * error.
33 */
34 BaseDialog.ANIMATE_STABLE_DURATION = 500;
35
36 BaseDialog.prototype.initDom_ = function() {
37 var doc = this.document_;
38 this.container_ = doc.createElement('div');
39 this.container_.className = 'cr-dialog-container';
40 this.container_.addEventListener('keydown',
41 this.onContainerKeyDown_.bind(this));
42
43 this.frame_ = doc.createElement('div');
44 this.frame_.className = 'cr-dialog-frame';
45 this.container_.appendChild(this.frame_);
46
47 this.text_ = doc.createElement('div');
48 this.text_.className = 'cr-dialog-text';
49 this.frame_.appendChild(this.text_);
50
51 var buttons = doc.createElement('div');
52 buttons.className = 'cr-dialog-buttons';
53 this.frame_.appendChild(buttons);
54
55 this.cancelButton_ = doc.createElement('button');
56 this.cancelButton_.className = 'cr-dialog-cancel';
57 this.cancelButton_.textContent = BaseDialog.CANCEL_LABEL;
58 this.cancelButton_.addEventListener('click',
59 this.onCancelClick_.bind(this));
60 buttons.appendChild(this.cancelButton_);
61
62 this.okButton_ = doc.createElement('button');
63 this.okButton_.className = 'cr-dialog-ok';
64 this.okButton_.textContent = BaseDialog.OK_LABEL;
65 this.okButton_.addEventListener('click', this.onOkClick_.bind(this));
66 buttons.appendChild(this.okButton_);
67
68 this.initialFocusElement_ = this.okButton_;
69 };
70
71 BaseDialog.prototype.onOk_ = null;
72 BaseDialog.prototype.onCancel_ = null;
73
74 BaseDialog.prototype.onContainerKeyDown_ = function(event) {
75 switch (event.keyCode) {
76 case 13: // Enter
77 if (!this.okButton_.disabled) {
78 this.onOkClick_(event);
79 event.preventDefault();
80 }
81 return;
82
83 case 27: // Escape
84 if (!this.cancelButton_.disabled) {
85 this.onCancelClick_(event);
86 event.preventDefault();
87 }
88 return;
89 }
90 };
91
92 BaseDialog.prototype.onOkClick_ = function(event) {
93 this.hide();
94 if (this.onOk_)
95 this.onOk_();
96 };
97
98 BaseDialog.prototype.onCancelClick_ = function(event) {
99 this.hide();
100 if (this.onCancel_)
101 this.onCancel_();
102 };
103
104 BaseDialog.prototype.setOkLabel = function(label) {
105 this.okButton_.textContent = label;
106 };
107
108 BaseDialog.prototype.setCancelLabel = function(label) {
109 this.cancelButton_.textContent = label;
110 };
111
112 BaseDialog.prototype.show = function(message, onOk, onCancel, onShow) {
113 this.previousActiveElement_ = this.document_.activeElement;
114 this.parentNode_.appendChild(this.container_);
115
116 this.onOk_ = onOk;
117 this.onCancel_ = onCancel;
118
119 this.text_.textContent = message;
120
121 var top = (this.document_.body.clientHeight -
122 this.frame_.clientHeight) / 2;
123 var left = (this.document_.body.clientWidth -
124 this.frame_.clientWidth) / 2;
125
126 // Disable transitions so that we can set the initial position of the
127 // dialog right away.
128 this.frame_.style.webkitTransitionProperty = '';
129 this.frame_.style.top = (top - 50) + 'px';
130 this.frame_.style.left = (left + 10) + 'px';
131
132 var self = this;
133 setTimeout(function () {
134 // Note that we control the opacity of the *container*, but the top/left
135 // of the *frame*.
136 self.container_.style.opacity = '1';
137 self.frame_.style.top = top + 'px';
138 self.frame_.style.left = left + 'px';
139 self.frame_.style.webkitTransitionProperty = 'left, top';
140 self.initialFocusElement_.focus();
141 setTimeout(function() {
142 if (onShow)
143 onShow();
144 }, BaseDialog.ANIMATE_STABLE_DURATION);
145 }, 0);
146 };
147
148 BaseDialog.prototype.hide = function(onHide) {
149 // Note that we control the opacity of the *container*, but the top/left
150 // of the *frame*.
151 this.container_.style.opacity = '0';
152 this.frame_.style.top = (parseInt(this.frame_.style.top) + 50) + 'px';
153 this.frame_.style.left = (parseInt(this.frame_.style.left) - 10) + 'px';
154
155 if (this.previousActiveElement_) {
156 this.previousActiveElement_.focus();
157 } else {
158 this.document_.body.focus();
159 }
160
161 var self = this;
162 setTimeout(function() {
163 // Wait until the transition is done before removing the dialog.
164 self.parentNode_.removeChild(self.container_);
165 if (onHide)
166 onHide();
167 }, BaseDialog.ANIMATE_STABLE_DURATION);
168 };
169
170 /**
171 * AlertDialog contains just a message and an ok button.
172 */
173 function AlertDialog(parentNode) {
174 BaseDialog.apply(this, [parentNode]);
175 this.cancelButton_.style.display = 'none';
176 }
177
178 AlertDialog.prototype = {__proto__: BaseDialog.prototype};
179
180 AlertDialog.prototype.show = function(message, onOk, onShow) {
181 return BaseDialog.prototype.show.apply(this, [message, onOk, onOk, onShow]);
182 };
183
184 /**
185 * ConfirmDialog contains a message, an ok button, and a cancel button.
186 */
187 function ConfirmDialog(parentNode) {
188 BaseDialog.apply(this, [parentNode]);
189 }
190
191 ConfirmDialog.prototype = {__proto__: BaseDialog.prototype};
192
193 /**
194 * PromptDialog contains a message, a text input, an ok button, and a
195 * cancel button.
196 */
197 function PromptDialog(parentNode) {
198 BaseDialog.apply(this, [parentNode]);
199 this.input_ = this.document_.createElement('input');
200 this.input_.setAttribute('type', 'text');
201 this.input_.addEventListener('focus', this.onInputFocus.bind(this));
202 this.initialFocusElement_ = this.input_;
203 this.frame_.insertBefore(this.input_, this.text_.nextSibling);
204 }
205
206 PromptDialog.prototype = {__proto__: BaseDialog.prototype};
207
208 PromptDialog.prototype.onInputFocus = function(event) {
209 this.input_.select();
210 };
211
212 PromptDialog.prototype.show = function(message, defaultValue, onOk, onCancel,
213 onShow) {
214 this.input_.value = defaultValue || '';
215 return BaseDialog.prototype.show.apply(this, [message, onOk, onCancel,
216 onShow]);
217 };
218
219 PromptDialog.prototype.getValue = function() {
220 return this.input_.value;
221 };
222
223 PromptDialog.prototype.onOkClick_ = function(event) {
224 this.hide();
225 if (this.onOk_)
226 this.onOk_(this.getValue());
227 };
228
229 return {
230 BaseDialog: BaseDialog,
231 AlertDialog: AlertDialog,
232 ConfirmDialog: ConfirmDialog,
233 PromptDialog: PromptDialog
234 };
235 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698