// Copyright 2014 The Flutter 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 'package:flutter/material.dart';

import '../../gallery/demo.dart';

const String _introText =
  'Tooltips are short identifying messages that briefly appear in response to '
  'a long press. Tooltip messages are also used by services that make Flutter '
  'apps accessible, like screen readers.';

class TooltipDemo extends StatelessWidget {

  static const String routeName = '/material/tooltips';

  @override
  Widget build(BuildContext context) {
    final ThemeData theme = Theme.of(context);
    return Scaffold(
      appBar: AppBar(
        title: const Text('Tooltips'),
        actions: <Widget>[MaterialDemoDocumentationButton(routeName)],
      ),
      body: Builder(
        builder: (BuildContext context) {
          return SafeArea(
            top: false,
            bottom: false,
            child: ListView(
              children: <Widget>[
                Text(_introText, style: theme.textTheme.subtitle1),
                Row(
                  children: <Widget>[
                    Text('Long press the ', style: theme.textTheme.subtitle1),
                    Tooltip(
                      message: 'call icon',
                      child: Icon(
                        Icons.call,
                        size: 18.0,
                        color: theme.iconTheme.color,
                      ),
                    ),
                    Text(' icon.', style: theme.textTheme.subtitle1),
                  ],
                ),
                Center(
                  child: IconButton(
                    iconSize: 48.0,
                    icon: const Icon(Icons.call),
                    color: theme.iconTheme.color,
                    tooltip: 'Place a phone call',
                    onPressed: () {
                      Scaffold.of(context).showSnackBar(const SnackBar(
                         content: Text('That was an ordinary tap.'),
                      ));
                    },
                  ),
                ),
              ]
              .map<Widget>((Widget widget) {
                return Padding(
                  padding: const EdgeInsets.only(top: 16.0, left: 16.0, right: 16.0),
                  child: widget,
                );
              })
              .toList(),
            ),
          );
        }
      ),
    );
  }
}
