1/*
2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef DeleteButtonController_h
27#define DeleteButtonController_h
28
29#if ENABLE(DELETION_UI)
30
31#include "DeleteButton.h"
32#include "Editor.h"
33#include "Frame.h"
34
35namespace WebCore {
36
37class DeleteButton;
38class HTMLElement;
39class RenderObject;
40class VisibleSelection;
41
42class DeleteButtonController {
43    WTF_MAKE_NONCOPYABLE(DeleteButtonController); WTF_MAKE_FAST_ALLOCATED;
44public:
45    explicit DeleteButtonController(Frame&);
46
47    HTMLElement* containerElement() const { return m_containerElement.get(); }
48
49    void respondToChangedSelection(const VisibleSelection& oldSelection);
50
51    void deviceScaleFactorChanged();
52
53    void show(HTMLElement*);
54    void hide();
55
56    void deleteTarget();
57
58private:
59    static const char* const buttonElementIdentifier;
60    static const char* const outlineElementIdentifier;
61    static const char* const containerElementIdentifier;
62
63    void enable();
64    void disable();
65    friend class DeleteButtonControllerDisableScope;
66
67    void createDeletionUI();
68    bool enabled() const { return (!m_disableStack); }
69
70    Frame& m_frame;
71    RefPtr<HTMLElement> m_target;
72    RefPtr<HTMLElement> m_containerElement;
73    RefPtr<HTMLElement> m_outlineElement;
74    RefPtr<DeleteButton> m_buttonElement;
75    bool m_wasStaticPositioned;
76    bool m_wasAutoZIndex;
77    unsigned m_disableStack;
78};
79
80class DeleteButtonControllerDisableScope {
81public:
82    DeleteButtonControllerDisableScope(Frame* frame)
83        : m_frame(frame)
84    {
85        if (frame)
86            frame->editor().deleteButtonController().disable();
87    }
88
89    ~DeleteButtonControllerDisableScope()
90    {
91        if (m_frame)
92            m_frame->editor().deleteButtonController().enable();
93    }
94
95private:
96    RefPtr<Frame> m_frame;
97};
98
99} // namespace WebCore
100
101#endif // ENABLE(DELETION_UI)
102
103#endif // DeleteButtonController_h
104