forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 2
/
nsFileControlFrame.h
195 lines (151 loc) · 5.16 KB
/
nsFileControlFrame.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsFileControlFrame_h___
#define nsFileControlFrame_h___
#include "mozilla/Attributes.h"
#include "nsBlockFrame.h"
#include "nsIFormControlFrame.h"
#include "nsIDOMEventListener.h"
#include "nsIAnonymousContentCreator.h"
#include "nsICapturePicker.h"
#include "nsCOMPtr.h"
class nsTextControlFrame;
class nsIDOMDragEvent;
class nsFileControlFrame : public nsBlockFrame,
public nsIFormControlFrame,
public nsIAnonymousContentCreator
{
public:
nsFileControlFrame(nsStyleContext* aContext);
NS_IMETHOD Init(nsIContent* aContent,
nsIFrame* aParent,
nsIFrame* aPrevInFlow);
NS_IMETHOD BuildDisplayList(nsDisplayListBuilder* aBuilder,
const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
NS_DECL_QUERYFRAME
NS_DECL_FRAMEARENA_HELPERS
// nsIFormControlFrame
virtual nsresult SetFormProperty(nsIAtom* aName, const nsAString& aValue);
virtual nsresult GetFormProperty(nsIAtom* aName, nsAString& aValue) const MOZ_OVERRIDE;
virtual void SetFocus(bool aOn, bool aRepaint);
virtual nscoord GetMinWidth(nsRenderingContext *aRenderingContext) MOZ_OVERRIDE;
virtual void DestroyFrom(nsIFrame* aDestructRoot) MOZ_OVERRIDE;
#ifdef DEBUG
NS_IMETHOD GetFrameName(nsAString& aResult) const MOZ_OVERRIDE;
#endif
NS_IMETHOD AttributeChanged(int32_t aNameSpaceID,
nsIAtom* aAttribute,
int32_t aModType) MOZ_OVERRIDE;
virtual void ContentStatesChanged(nsEventStates aStates);
virtual bool IsLeaf() const;
// nsIAnonymousContentCreator
virtual nsresult CreateAnonymousContent(nsTArray<ContentInfo>& aElements) MOZ_OVERRIDE;
virtual void AppendAnonymousContentTo(nsBaseContentList& aElements,
uint32_t aFilter) MOZ_OVERRIDE;
#ifdef ACCESSIBILITY
virtual mozilla::a11y::AccType AccessibleType() MOZ_OVERRIDE;
#endif
typedef bool (*AcceptAttrCallback)(const nsAString&, void*);
protected:
struct CaptureCallbackData {
nsICapturePicker* picker;
uint32_t mode;
};
uint32_t GetCaptureMode(const CaptureCallbackData& aData);
class MouseListener;
friend class MouseListener;
class MouseListener : public nsIDOMEventListener {
public:
NS_DECL_ISUPPORTS
MouseListener(nsFileControlFrame* aFrame)
: mFrame(aFrame)
{}
virtual ~MouseListener() {}
void ForgetFrame() {
mFrame = nullptr;
}
protected:
nsFileControlFrame* mFrame;
};
class SyncDisabledStateEvent;
friend class SyncDisabledStateEvent;
class SyncDisabledStateEvent : public nsRunnable
{
public:
SyncDisabledStateEvent(nsFileControlFrame* aFrame)
: mFrame(aFrame)
{}
NS_IMETHOD Run() {
nsFileControlFrame* frame = static_cast<nsFileControlFrame*>(mFrame.GetFrame());
NS_ENSURE_STATE(frame);
frame->SyncDisabledState();
return NS_OK;
}
private:
nsWeakFrame mFrame;
};
class CaptureMouseListener: public MouseListener {
public:
CaptureMouseListener(nsFileControlFrame* aFrame)
: MouseListener(aFrame)
, mMode(0)
{}
NS_DECL_NSIDOMEVENTLISTENER
uint32_t mMode;
};
class BrowseMouseListener: public MouseListener {
public:
BrowseMouseListener(nsFileControlFrame* aFrame)
: MouseListener(aFrame)
{}
NS_DECL_NSIDOMEVENTLISTENER
static bool IsValidDropData(nsIDOMDragEvent* aEvent);
};
virtual bool IsFrameOfType(uint32_t aFlags) const MOZ_OVERRIDE
{
return nsBlockFrame::IsFrameOfType(aFlags &
~(nsIFrame::eReplaced | nsIFrame::eReplacedContainsBlock));
}
virtual int GetSkipSides() const MOZ_OVERRIDE;
/**
* The text box input.
* @see nsFileControlFrame::CreateAnonymousContent
*/
nsCOMPtr<nsIContent> mTextContent;
/**
* The browse button input.
* @see nsFileControlFrame::CreateAnonymousContent
*/
nsCOMPtr<nsIContent> mBrowse;
/**
* The capture button input.
* @see nsFileControlFrame::CreateAnonymousContent
*/
nsCOMPtr<nsIContent> mCapture;
/**
* Our mouse listener. This makes sure we don't get used after destruction.
*/
nsRefPtr<BrowseMouseListener> mMouseListener;
nsRefPtr<CaptureMouseListener> mCaptureMouseListener;
protected:
/**
* @return the text control frame, or null if not found
*/
nsTextControlFrame* GetTextControlFrame();
/**
* Copy an attribute from file content to text and button content.
* @param aNameSpaceID namespace of attr
* @param aAttribute attribute atom
* @param aWhichControls which controls to apply to (SYNC_TEXT or SYNC_FILE)
*/
void SyncAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
int32_t aWhichControls);
/**
* Sync the disabled state of the content with anonymous children.
*/
void SyncDisabledState();
};
#endif