📄 kwqaccobject.cpp
字号:
/*
* Copyright (C) 2004 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "KWQAccObject.h"
#if 0 //## NOT IMPLELEMENTED : not sure if this class is needed in 1st version
#include "KWQAccObjectCache.h"
#include "KWQWidget.h"
#include "dom_docimpl.h"
#include "dom_elementimpl.h"
#include "html_inlineimpl.h"
#include "html_imageimpl.h"
#include "dom_string.h"
#include "dom2_range.h"
#include "htmlattrs.h"
#include "htmltags.h"
#include "khtmlview.h"
#include "khtml_part.h"
#include "render_canvas.h"
#include "render_object.h"
#include "render_image.h"
#include "render_list.h"
#include "render_style.h"
#include "render_text.h"
#include "kjs_html.h"
#include "html_miscimpl.h"
#include "qptrstack.h"
using DOM::DocumentImpl;
using DOM::ElementImpl;
using DOM::HTMLAnchorElementImpl;
using DOM::HTMLMapElementImpl;
using DOM::HTMLAreaElementImpl;
using DOM::HTMLCollection;
using DOM::HTMLCollectionImpl;
using DOM::Node;
using DOM::NodeImpl;
using DOM::Range;
using DOM::DOMString;
using khtml::RenderObject;
using khtml::RenderWidget;
using khtml::RenderCanvas;
using khtml::RenderText;
using khtml::RenderBlock;
using khtml::RenderListMarker;
using khtml::RenderImage;
// FIXME: This will eventually need to really localize.
#define UI_STRING(string, comment) ((NSString *)[NSString stringWithUTF8String:(string)])
@implementation KWQAccObject
-(id)initWithRenderer:(RenderObject*)renderer
{
[super init];
m_renderer = renderer;
m_areaElement = 0;
return self;
}
-(BOOL)detached
{
return !m_renderer;
}
-(void)detach
{
[m_data release];
m_data = 0;
m_renderer = 0;
[self clearChildren];
}
-(id)data
{
return m_data;
}
-(void)setData:(id)data
{
if (!m_renderer)
return;
[data retain];
[m_data release];
m_data = data;
}
-(HTMLAnchorElementImpl*)anchorElement
{
if (m_areaElement)
return m_areaElement;
RenderObject* currRenderer;
for (currRenderer = m_renderer; currRenderer && !currRenderer->element(); currRenderer = currRenderer->parent())
if (currRenderer->continuation())
return [currRenderer->document()->getOrCreateAccObjectCache()->accObject(currRenderer->continuation()) anchorElement];
if (!currRenderer || !currRenderer->element())
return 0;
NodeImpl* elt = currRenderer->element();
for ( ; elt; elt = elt->parentNode()) {
if (elt->hasAnchor() && elt->renderer() && !elt->renderer()->isImage())
return static_cast<HTMLAnchorElementImpl*>(elt);
}
return 0;
}
-(KWQAccObject*)firstChild
{
if (!m_renderer || !m_renderer->firstChild())
return nil;
return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer->firstChild());
}
-(KWQAccObject*)lastChild
{
if (!m_renderer || !m_renderer->lastChild())
return nil;
return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer->lastChild());
}
-(KWQAccObject*)previousSibling
{
if (!m_renderer || !m_renderer->previousSibling())
return nil;
return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer->previousSibling());
}
-(KWQAccObject*)nextSibling
{
if (!m_renderer || !m_renderer->nextSibling())
return nil;
return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer->nextSibling());
}
-(KWQAccObject*)parentObject
{
if (m_areaElement)
return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer);
if (!m_renderer || !m_renderer->parent())
return nil;
return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer->parent());
}
-(KWQAccObject*)parentObjectUnignored
{
KWQAccObject* obj = [self parentObject];
if ([obj accessibilityIsIgnored])
return [obj parentObjectUnignored];
else
return obj;
}
-(void)addChildrenToArray:(NSMutableArray*)array
{
if (!m_renderer)
return;
if (m_renderer->isWidget()) {
RenderWidget* renderWidget = static_cast<RenderWidget*>(m_renderer);
QWidget* widget = renderWidget->widget();
if (widget) {
NSArray* childArr = [(widget->getView()) accessibilityAttributeValue: NSAccessibilityChildrenAttribute];
[array addObjectsFromArray: childArr];
return;
}
}
for (KWQAccObject* obj = [self firstChild]; obj; obj = [obj nextSibling]) {
if ([obj accessibilityIsIgnored])
[obj addChildrenToArray: array];
else
[array addObject: obj];
}
if (m_renderer->isImage() && !m_areaElement) {
HTMLMapElementImpl* map = static_cast<RenderImage*>(m_renderer)->imageMap();
if (map) {
// Need to add the <area> elements as individual accessibility objects.
QPtrStack<NodeImpl> nodeStack;
NodeImpl *current = map->firstChild();
while (1) {
if (!current) {
if(nodeStack.isEmpty()) break;
current = nodeStack.pop();
current = current->nextSibling();
continue;
}
if (current->hasAnchor()) {
KWQAccObject* obj = [[[KWQAccObject alloc] initWithRenderer: m_renderer] autorelease];
obj->m_areaElement = static_cast<HTMLAreaElementImpl*>(current);
[array addObject: obj];
}
NodeImpl *child = current->firstChild();
if (child) {
nodeStack.push(current);
current = child;
}
else
current = current->nextSibling();
}
}
}
}
-(NSString*)role
{
if (!m_renderer)
return NSAccessibilityUnknownRole;
if (m_areaElement)
return @"AXLink";
if (m_renderer->element() && m_renderer->element()->hasAnchor()) {
if (m_renderer->isImage())
return @"AXImageMap";
return @"AXLink";
}
if (m_renderer->isListMarker())
return @"AXListMarker";
if (m_renderer->element() && m_renderer->element()->isHTMLElement() &&
Node(m_renderer->element()).elementId() == ID_BUTTON)
return NSAccessibilityButtonRole;
if (m_renderer->isText())
return NSAccessibilityStaticTextRole;
if (m_renderer->isImage())
return NSAccessibilityImageRole;
if (m_renderer->isCanvas())
return @"AXWebArea";
if (m_renderer->isBlockFlow())
return NSAccessibilityGroupRole;
return NSAccessibilityUnknownRole;
}
-(NSString*)roleDescription
{
if (!m_renderer)
return nil;
// FIXME 3517227: These need to be localized (UI_STRING here is a dummy macro)
// FIXME 3447564: It would be better to call some AppKit API to get these strings
// (which would be the best way to localize them)
NSString *role = [self role];
if ([role isEqualToString:NSAccessibilityButtonRole])
return UI_STRING("button", "accessibility role description for button");
if ([role isEqualToString:NSAccessibilityStaticTextRole])
return UI_STRING("text", "accessibility role description for static text");
if ([role isEqualToString:NSAccessibilityImageRole])
return UI_STRING("image", "accessibility role description for image");
if ([role isEqualToString:NSAccessibilityGroupRole])
return UI_STRING("group", "accessibility role description for group");
if ([role isEqualToString:@"AXWebArea"])
return UI_STRING("web area", "accessibility role description for web area");
if ([role isEqualToString:@"AXLink"])
return UI_STRING("link", "accessibility role description for link");
if ([role isEqualToString:@"AXListMarker"])
return UI_STRING("list marker", "accessibility role description for list marker");
if ([role isEqualToString:@"AXImageMap"])
return UI_STRING("image map", "accessibility role description for image map");
return UI_STRING("unknown", "accessibility role description for unknown role");
}
-(NSString*)helpText
{
if (!m_renderer)
return nil;
if (m_areaElement) {
QString summary = static_cast<ElementImpl*>(m_areaElement)->getAttribute(ATTR_SUMMARY).string();
if (!summary.isEmpty())
return summary.getNSString();
QString title = static_cast<ElementImpl*>(m_areaElement)->getAttribute(ATTR_TITLE).string();
if (!title.isEmpty())
return title.getNSString();
}
for (RenderObject* curr = m_renderer; curr; curr = curr->parent()) {
if (curr->element() && curr->element()->isHTMLElement()) {
QString summary = static_cast<ElementImpl*>(curr->element())->getAttribute(ATTR_SUMMARY).string();
if (!summary.isEmpty())
return summary.getNSString();
QString title = static_cast<ElementImpl*>(curr->element())->getAttribute(ATTR_TITLE).string();
if (!title.isEmpty())
return title.getNSString();
}
}
return nil;
}
-(NSString*)textUnderElement
{
if (!m_renderer)
return nil;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -