2 * Copyright (C) 2005, 2006, 2008 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"
36 class ApplyStyleCommand
: public CompositeEditCommand
{
38 enum EPropertyLevel
{ PropertyDefault
, ForceBlockProperties
};
40 static PassRefPtr
<ApplyStyleCommand
> create(Document
* document
, CSSStyleDeclaration
* style
, EditAction action
= EditActionChangeAttributes
, EPropertyLevel level
= PropertyDefault
)
42 return adoptRef(new ApplyStyleCommand(document
, style
, action
, level
));
44 static PassRefPtr
<ApplyStyleCommand
> create(Document
* document
, CSSStyleDeclaration
* style
, const Position
& start
, const Position
& end
, EditAction action
= EditActionChangeAttributes
, EPropertyLevel level
= PropertyDefault
)
46 return adoptRef(new ApplyStyleCommand(document
, style
, start
, end
, action
, level
));
48 static PassRefPtr
<ApplyStyleCommand
> create(Element
* element
, bool removeOnly
= false, EditAction action
= EditActionChangeAttributes
)
50 return adoptRef(new ApplyStyleCommand(element
, removeOnly
, action
));
54 ApplyStyleCommand(Document
*, CSSStyleDeclaration
*, EditAction
, EPropertyLevel
);
55 ApplyStyleCommand(Document
*, CSSStyleDeclaration
*, const Position
& start
, const Position
& end
, EditAction
, EPropertyLevel
);
56 ApplyStyleCommand(Element
*, bool removeOnly
, EditAction
);
58 virtual void doApply();
59 virtual EditAction
editingAction() const;
61 CSSMutableStyleDeclaration
* style() const { return m_style
.get(); }
63 // style-removal helpers
64 bool isHTMLStyleNode(CSSMutableStyleDeclaration
*, HTMLElement
*);
65 void removeHTMLStyleNode(HTMLElement
*);
66 void removeHTMLFontStyle(CSSMutableStyleDeclaration
*, HTMLElement
*);
67 void removeCSSStyle(CSSMutableStyleDeclaration
*, HTMLElement
*);
68 void removeBlockStyle(CSSMutableStyleDeclaration
*, const Position
& start
, const Position
& end
);
69 void removeInlineStyle(PassRefPtr
<CSSMutableStyleDeclaration
>, const Position
& start
, const Position
& end
);
70 bool nodeFullySelected(Node
*, const Position
& start
, const Position
& end
) const;
71 bool nodeFullyUnselected(Node
*, const Position
& start
, const Position
& end
) const;
72 PassRefPtr
<CSSMutableStyleDeclaration
> extractTextDecorationStyle(Node
*);
73 PassRefPtr
<CSSMutableStyleDeclaration
> extractAndNegateTextDecorationStyle(Node
*);
74 void applyTextDecorationStyle(Node
*, CSSMutableStyleDeclaration
*style
);
75 void pushDownTextDecorationStyleAroundNode(Node
*, const Position
& start
, const Position
& end
, bool force
);
76 void pushDownTextDecorationStyleAtBoundaries(const Position
& start
, const Position
& end
);
78 // style-application helpers
79 void applyBlockStyle(CSSMutableStyleDeclaration
*);
80 void applyRelativeFontStyleChange(CSSMutableStyleDeclaration
*);
81 void applyInlineStyle(CSSMutableStyleDeclaration
*);
82 void addBlockStyle(const StyleChange
&, HTMLElement
*);
83 void addInlineStyleIfNeeded(CSSMutableStyleDeclaration
*, Node
* start
, Node
* end
);
84 bool splitTextAtStartIfNeeded(const Position
& start
, const Position
& end
);
85 bool splitTextAtEndIfNeeded(const Position
& start
, const Position
& end
);
86 bool splitTextElementAtStartIfNeeded(const Position
& start
, const Position
& end
);
87 bool splitTextElementAtEndIfNeeded(const Position
& start
, const Position
& end
);
88 bool mergeStartWithPreviousIfIdentical(const Position
& start
, const Position
& end
);
89 bool mergeEndWithNextIfIdentical(const Position
& start
, const Position
& end
);
90 void cleanupUnstyledAppleStyleSpans(Node
* dummySpanAncestor
);
92 void surroundNodeRangeWithElement(Node
* start
, Node
* end
, Element
* element
);
93 float computedFontSize(const Node
*);
94 void joinChildTextNodes(Node
*, const Position
& start
, const Position
& end
);
96 void updateStartEnd(const Position
& newStart
, const Position
& newEnd
);
97 Position
startPosition();
98 Position
endPosition();
100 RefPtr
<CSSMutableStyleDeclaration
> m_style
;
101 EditAction m_editingAction
;
102 EPropertyLevel m_propertyLevel
;
105 bool m_useEndingSelection
;
106 RefPtr
<Element
> m_styledInlineElement
;
110 bool isStyleSpan(const Node
*);
111 PassRefPtr
<HTMLElement
> createStyleSpanElement(Document
*);
113 } // namespace WebCore