2 * Copyright (C) 2005, 2006, 2008, 2009 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, 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 COMPUTER, 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.
26 #ifndef ApplyStyleCommand_h
27 #define ApplyStyleCommand_h
29 #include "CompositeEditCommand.h"
33 class CSSPrimitiveValue
;
37 class ApplyStyleCommand
: public CompositeEditCommand
{
39 enum EPropertyLevel
{ PropertyDefault
, ForceBlockProperties
};
41 static PassRefPtr
<ApplyStyleCommand
> create(Document
* document
, CSSStyleDeclaration
* style
, EditAction action
= EditActionChangeAttributes
, EPropertyLevel level
= PropertyDefault
)
43 return adoptRef(new ApplyStyleCommand(document
, style
, action
, level
));
45 static PassRefPtr
<ApplyStyleCommand
> create(Document
* document
, CSSStyleDeclaration
* style
, const Position
& start
, const Position
& end
, EditAction action
= EditActionChangeAttributes
, EPropertyLevel level
= PropertyDefault
)
47 return adoptRef(new ApplyStyleCommand(document
, style
, start
, end
, action
, level
));
49 static PassRefPtr
<ApplyStyleCommand
> create(PassRefPtr
<Element
> element
, bool removeOnly
= false, EditAction action
= EditActionChangeAttributes
)
51 return adoptRef(new ApplyStyleCommand(element
, removeOnly
, action
));
55 ApplyStyleCommand(Document
*, CSSStyleDeclaration
*, EditAction
, EPropertyLevel
);
56 ApplyStyleCommand(Document
*, CSSStyleDeclaration
*, const Position
& start
, const Position
& end
, EditAction
, EPropertyLevel
);
57 ApplyStyleCommand(PassRefPtr
<Element
>, bool removeOnly
, EditAction
);
59 virtual void doApply();
60 virtual EditAction
editingAction() const;
62 CSSMutableStyleDeclaration
* style() const { return m_style
.get(); }
64 // style-removal helpers
65 bool isHTMLStyleNode(CSSMutableStyleDeclaration
*, HTMLElement
*);
66 void removeHTMLStyleNode(HTMLElement
*);
67 void removeHTMLFontStyle(CSSMutableStyleDeclaration
*, HTMLElement
*);
68 void removeHTMLBidiEmbeddingStyle(CSSMutableStyleDeclaration
*, HTMLElement
*);
69 void removeCSSStyle(CSSMutableStyleDeclaration
*, HTMLElement
*);
70 void removeInlineStyle(PassRefPtr
<CSSMutableStyleDeclaration
>, const Position
& start
, const Position
& end
);
71 bool nodeFullySelected(Node
*, const Position
& start
, const Position
& end
) const;
72 bool nodeFullyUnselected(Node
*, const Position
& start
, const Position
& end
) const;
73 PassRefPtr
<CSSMutableStyleDeclaration
> extractTextDecorationStyle(Node
*);
74 PassRefPtr
<CSSMutableStyleDeclaration
> extractAndNegateTextDecorationStyle(Node
*);
75 void applyTextDecorationStyle(Node
*, CSSMutableStyleDeclaration
*style
);
76 void pushDownTextDecorationStyleAroundNode(Node
*, bool force
);
77 void pushDownTextDecorationStyleAtBoundaries(const Position
& start
, const Position
& end
);
79 // style-application helpers
80 void applyBlockStyle(CSSMutableStyleDeclaration
*);
81 void applyRelativeFontStyleChange(CSSMutableStyleDeclaration
*);
82 void applyInlineStyle(CSSMutableStyleDeclaration
*);
83 void applyInlineStyleToRange(CSSMutableStyleDeclaration
*, const Position
& start
, const Position
& end
);
84 void addBlockStyle(const StyleChange
&, HTMLElement
*);
85 void addInlineStyleIfNeeded(CSSMutableStyleDeclaration
*, Node
* start
, Node
* end
);
86 bool splitTextAtStartIfNeeded(const Position
& start
, const Position
& end
);
87 bool splitTextAtEndIfNeeded(const Position
& start
, const Position
& end
);
88 bool splitTextElementAtStartIfNeeded(const Position
& start
, const Position
& end
);
89 bool splitTextElementAtEndIfNeeded(const Position
& start
, const Position
& end
);
90 bool mergeStartWithPreviousIfIdentical(const Position
& start
, const Position
& end
);
91 bool mergeEndWithNextIfIdentical(const Position
& start
, const Position
& end
);
92 void cleanupUnstyledAppleStyleSpans(Node
* dummySpanAncestor
);
94 void surroundNodeRangeWithElement(Node
* start
, Node
* end
, PassRefPtr
<Element
>);
95 float computedFontSize(const Node
*);
96 void joinChildTextNodes(Node
*, const Position
& start
, const Position
& end
);
98 HTMLElement
* splitAncestorsWithUnicodeBidi(Node
*, bool before
, RefPtr
<CSSPrimitiveValue
> allowedDirection
);
99 void removeEmbeddingUpToEnclosingBlock(Node
* node
, Node
* unsplitAncestor
);
101 void updateStartEnd(const Position
& newStart
, const Position
& newEnd
);
102 Position
startPosition();
103 Position
endPosition();
105 RefPtr
<CSSMutableStyleDeclaration
> m_style
;
106 EditAction m_editingAction
;
107 EPropertyLevel m_propertyLevel
;
110 bool m_useEndingSelection
;
111 RefPtr
<Element
> m_styledInlineElement
;
115 bool isStyleSpan(const Node
*);
116 PassRefPtr
<HTMLElement
> createStyleSpanElement(Document
*);
118 } // namespace WebCore