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

Unified Diff: sky/examples/editor/input.dart

Issue 995613002: Implement a basic IME-aware input element (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/examples/editor/index.sky ('k') | sky/services/keyboard/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/examples/editor/input.dart
diff --git a/sky/examples/editor/input.dart b/sky/examples/editor/input.dart
new file mode 100644
index 0000000000000000000000000000000000000000..8508a7ce2fab79d0b54c920ae87e5919c6af58e4
--- /dev/null
+++ b/sky/examples/editor/input.dart
@@ -0,0 +1,111 @@
+// Copyright 2015 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.
+
+import '../../framework/fn.dart';
+import '../../framework/shell.dart' as shell;
+import 'package:sky/services/keyboard/keyboard.mojom.dart';
+import 'dart:math';
+
+class Input extends Component implements KeyboardClient{
+ static Style _style = new Style('''
+ display: paragraph;
+ padding: 10px;
+ height: 200px;
+ background-color: lightblue;'''
+ );
+
+ static Style _composingStyle = new Style('''
+ display: inline;
+ text-decoration: underline;'''
+ );
+
+ KeyboardServiceProxy _service;
+ KeyboardClientStub _stub;
+
+ String _text = "";
+ int _composingStart = -1;
+ int _composingEnd = -1;
+
+ Input({Object key}) : super(key: key, stateful: true) {
+ events.listen('click', _handleClick);
+ _stub = new KeyboardClientStub.unbound()..impl = this;
+ }
+
+ bool get _hasComposingRegion => _composingStart != -1 && _composingEnd != -1;
+
+ void _handleClick(_) {
+ if (_service != null)
+ return;
+ _service = new KeyboardServiceProxy.unbound();
+ shell.requestService(_service);
+ _service.ptr.show(_stub);
+ }
+
+ void _replaceComposing(String text) {
+ if (!_hasComposingRegion) {
+ _composingStart = _text.length;
+ _composingEnd = _composingStart + text.length;
+ _text += text;
+ return;
+ }
+
+ _text = _text.substring(0, _composingStart)
+ + text + _text.substring(_composingEnd);
+ _composingEnd = _composingStart + text.length;
+ }
+
+ void _clearComposingRegion() {
+ _composingStart = -1;
+ _composingEnd = -1;
+ }
+
+ void commitText(String text, int newCursorPosition) {
+ setState(() {
+ _replaceComposing(text);
+ _clearComposingRegion();
+ });
+ }
+
+ void setComposingText(String text, int newCursorPosition) {
+ setState(() {
+ _replaceComposing(text);
+ });
+ }
+
+ void setComposingRegion(int start, int end) {
+ setState(() {
+ _composingStart = start;
+ _composingEnd = end;
+ });
+ }
+
+ Node build() {
+ List<Node> children = new List<Node>();
+
+ if (!_hasComposingRegion) {
+ children.add(new Text(_text));
+ } else {
+ String run = _text.substring(0, _composingStart);
+ if (!run.isEmpty)
+ children.add(new Text(run));
+
+ run = _text.substring(_composingStart, _composingEnd);
+ if (!run.isEmpty) {
+ children.add(new Container(
+ style: _composingStyle,
+ children: [new Text(_text.substring(_composingStart, _composingEnd))]
+ ));
+ }
+
+ run = _text.substring(_composingEnd);
+ if (!run.isEmpty)
+ children.add(new Text(_text.substring(_composingEnd)));
+ }
+
+ return new Container(
+ style: _style,
+ children: children
+ );
+ }
+}
« no previous file with comments | « sky/examples/editor/index.sky ('k') | sky/services/keyboard/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698