📄 webcorebridge.cpp
字号:
int x, y; if (r->absolutePosition(x, y)) { QRect rect(x, y, r->contentWidth(), r->contentHeight()); element->imageRect.x = rect.x(); element->imageRect.y = rect.y(); element->imageRect.width = rect.width(); element->imageRect.height = rect.height(); } DOM::ElementImpl *i = static_cast<DOM::ElementImpl*>(node); // FIXME: Code copied from RenderImage::updateFromElement; should share. DOM::DOMString attr; if (idFromNode(i) == ID_OBJECT) { attr = i->getAttribute(ATTR_DATA); } else { attr = i->getAttribute(ATTR_SRC); } if (!attr.isEmpty()) { QString URLString = parseURL(attr).string(); element->imageURL = g_strdup(_part->xmlDocImpl()->completeURL(URLString).utf8()); } // FIXME: Code copied from RenderImage::updateFromElement; should share. DOM::DOMString alt; if (idFromNode(i) == ID_INPUT) alt = static_cast<DOM::HTMLInputElementImpl *>(i)->altText(); else if (idFromNode(i) == ID_IMG) alt = static_cast<DOM::HTMLImageElementImpl *>(i)->altText(); if (!alt.isNull()) { QString altText = alt.string(); altText.replace('\\', _part->backslashAsCurrencySymbol()); element->imageAltText = g_strdup(altText.utf8()); } } }}bool WebCoreBridge::searchFor(const gchar *string, bool forward, bool caseFlag, bool wrapFlag){ return _part->findString(string, forward, caseFlag, wrapFlag);}void WebCoreBridge::jumpToSelection(){ _part->jumpToSelection();}void WebCoreBridge::setTextSizeMultiplier(float multiplier){ int newZoomFactor = (int)(multiplier * 100); if (_part->zoomFactor() == newZoomFactor) { return; } _part->setZoomFactor(newZoomFactor); // setZoomFactor will trigger a timed layout, but we want to do the layout before // we do any drawing. This takes care of that. Without this we redraw twice. setNeedsLayout();}const gchar* WebCoreBridge::textEncoding(){ assignToString(&_encoding, _part->encoding().utf8()); return _encoding;}GtkWidget *WebCoreBridge::nextKeyView(){ DocumentImpl *doc = _part->xmlDocImpl(); if (!doc) { return 0; } return _part->nextKeyView(doc->focusNode(), KWQSelectingNext);}GtkWidget *WebCoreBridge::previousKeyView(){ DocumentImpl *doc = _part->xmlDocImpl(); if (!doc) { return 0; } return _part->nextKeyView(doc->focusNode(), KWQSelectingPrevious);}GtkWidget *WebCoreBridge::nextKeyViewInsideWebFrameViews(){ return _part->nextKeyViewInFrameHierarchy(0, KWQSelectingNext);}GtkWidget *WebCoreBridge::previousKeyViewInsideWebFrameViews(){ return _part->nextKeyViewInFrameHierarchy(0, KWQSelectingPrevious);}const gchar * WebCoreBridge::stringByEvaluatingJavaScriptFromString(const gchar* string){ _part->createEmptyDocument(); assignToString(&_jsEvalString, _part->executeScript(QString::fromUtf8(string), true).asString().utf8()); return _jsEvalString;}#if 0- (id<WebDOMDocument>)DOMDocument{ return [WebCoreDOMDocument documentWithImpl:_part->xmlDocImpl()];}- (void)setSelectionFrom:(id<WebDOMNode>)start startOffset:(int)startOffset to:(id<WebDOMNode>)end endOffset:(int) endOffset{ WebCoreDOMNode *startNode = start; WebCoreDOMNode *endNode = end; _part->xmlDocImpl()->setSelection([startNode impl], startOffset, [endNode impl], endOffset);}- (NSAttributedString *)selectedAttributedString{ return _part->attributedString(_part->selectionStart(), _part->selectionStartOffset(), _part->selectionEnd(), _part->selectionEndOffset());}- (NSAttributedString *)attributedStringFrom:(id<WebDOMNode>)start startOffset:(int)startOffset to:(id<WebDOMNode>)end endOffset:(int)endOffset{ WebCoreDOMNode *startNode = start; WebCoreDOMNode *endNode = end; return _part->attributedString([startNode impl], startOffset, [endNode impl], endOffset);}- (id<WebDOMNode>)selectionStart{ return [WebCoreDOMNode nodeWithImpl:_part->selectionStart()];}- (int)selectionStartOffset{ return _part->selectionStartOffset();}- (id<WebDOMNode>)selectionEnd{ return [WebCoreDOMNode nodeWithImpl:_part->selectionEnd()];}- (int)selectionEndOffset{ return _part->selectionEndOffset();}- (NSRect)selectionRect{ return _part->selectionRect(); }- (NSRect)visibleSelectionRect{ KHTMLView *view = _part->view(); if (!view) { return NSZeroRect; } NSView *documentView = view->getDocumentView(); if (!documentView) { return NSZeroRect; } return NSIntersectionRect(_part->selectionRect(), [documentView visibleRect]); }- (NSImage *)selectionImage{ NSView *view = _part->view()->getDocumentView(); if (!view) { return nil; } NSRect rect = [self visibleSelectionRect]; NSRect bounds = [view bounds]; NSImage *selectionImage = [[[NSImage alloc] initWithSize:rect.size] autorelease]; [selectionImage setFlipped:YES]; [selectionImage lockFocus]; [NSGraphicsContext saveGraphicsState]; CGContextTranslateCTM((CGContext *)[[NSGraphicsContext currentContext] graphicsPort], -(NSMinX(rect) - NSMinX(bounds)), -(NSMinY(rect) - NSMinY(bounds))); _drawSelectionOnly = YES; [view drawRect:rect]; _drawSelectionOnly = NO; [NSGraphicsContext restoreGraphicsState]; [selectionImage unlockFocus]; [selectionImage setFlipped:NO]; return selectionImage;}#endifvoid WebCoreBridge::setName(const gchar* name){ _part->setName(QString::fromUtf8(name));}const gchar* WebCoreBridge::name(){ assignToString(&_name, _part->name().utf8()); return _name;}const gchar* WebCoreBridge::URL(){ assignToString(&_url, _part->url().url().utf8()); return _url;}const gchar* WebCoreBridge::referrer(){ // Do not allow file URLs to be used as referrers as that is potentially a security issue QString referrer = _part->referrer(); bool isFileURL = referrer.lower().find("file:",0,false); assignToString(&_referrer, isFileURL ? 0 : referrer.utf8() ); return _referrer;}#if 0+ (NSString *)stringWithData:(NSData *)data textEncoding:(CFStringEncoding)textEncoding{ if (textEncoding == kCFStringEncodingInvalidId || textEncoding == kCFStringEncodingISOLatin1) { textEncoding = kCFStringEncodingWindowsLatin1; } return QTextCodec(textEncoding).toUnicode((const char*)[data bytes], [data length]).getNSString();}+ (NSString *)stringWithData:(NSData *)data textEncodingName:(NSString *)textEncodingName{ CFStringEncoding textEncoding = KWQCFStringEncodingFromIANACharsetName([textEncodingName lossyCString]); return [WebCoreBridge stringWithData:data textEncoding:textEncoding];}#endifvoid updateAllViews(){ for (QPtrListIterator<KWQKHTMLPart> it(KWQKHTMLPart::instances()); it.current(); ++it) { KWQKHTMLPart *part = it.current(); part->bridge()->setNeedsReapplyStyles(); }}bool WebCoreBridge::needsLayout(){ RenderObject *renderer = _part->renderer(); return renderer ? renderer->needsLayout() : false;}void WebCoreBridge::setNeedsLayout(){ RenderObject *renderer = _part->renderer(); if (renderer) renderer->setNeedsLayout(true);}#if 0- (BOOL)interceptKeyEvent:(NSEvent *)event toView:(NSView *)view{ return _part->keyEvent(event);}#endifconst gchar* WebCoreBridge::renderTreeAsExternalRepresentation(){ assignToString(&_renderTree, externalRepresentation(_part->renderer()).utf8()); return _renderTree;}void WebCoreBridge::setUsesInactiveTextBackgroundColor(bool uses){ _part->setUsesInactiveTextBackgroundColor(uses);}bool WebCoreBridge::usesInactiveTextBackgroundColor(){ return _part->usesInactiveTextBackgroundColor();}bool WebCoreBridge::interceptKeyEvent(GdkEventKey *_event, bool autoRepeat){ QKeyEvent event(_event, autoRepeat); return _part->keyEvent(&event);}void WebCoreBridge::setShouldCreateRenderers(bool f){ _shouldCreateRenderers = f;}bool WebCoreBridge::shouldCreateRenderers(){ return _shouldCreateRenderers;}int WebCoreBridge::numPendingOrLoadingRequests(){ DocumentImpl *doc = _part->xmlDocImpl(); if (doc) return KWQNumberOfPendingOrLoadingRequests (doc->docLoader()); return 0;}void WebCoreBridge::bodyBackgroundColor(GdkColor* outColor){ _part->bodyBackgroundColor().getGdkColor(outColor);}void WebCoreBridge::adjustViewSize(){ KHTMLView *view = _part->view(); if (view) view->adjustViewSize();}bool WebCoreBridge::hasStaticBackground(){ KHTMLView *view = _part->view(); if (view) return view->hasStaticBackground(); return false;}WebCoreElementInfo::WebCoreElementInfo() : isSelected(false), linkTitle(0), linkLabel(0), linkURL(0), linkTarget(0), imageURL(0),imageAltText(0) { imageRect.x = imageRect.y = imageRect.width = imageRect.height = -1;}#if 0// MOUSE EVENT STUFFstatic intget_qt_button_state( GdkModifierType state ){ int qstate = Qt::NoButton; if (state & GDK_BUTTON1_MASK) qstate|=Qt::LeftButton; if (state & GDK_BUTTON2_MASK) qstate|=Qt::MidButton; if (state & GDK_BUTTON3_MASK) qstate|=Qt::RightButton; if (state & GDK_SHIFT_MASK) qstate|=Qt::ShiftButton; if (state & GDK_CONTROL_MASK) qstate|=Qt::ControlButton; if (state & GDK_MOD1_MASK) qstate|=Qt::AltButton; return qstate;}static int get_qt_button_state_num( int button){ if (button == 1) return Qt::LeftButton; if (button == 2) return Qt::MidButton; if (button == 3) return Qt::RightButton; // unknown button return Qt::NoButton;} static GdkEventType last_event = GDK_BUTTON_RELEASE; static int click_count = 1; BridgeImpl *bridge = static_cast<BridgeImpl*>(data); assert(bridge); GdkModifierType state = (GdkModifierType) event->state; int x,y; x = (int) event->x; y = (int) event->y; _map_to_parent_window(widget->window, event->window, x, y);#if DEBUG g_printerr(" sending : (%d;%d)\n", x,y);#endif switch (event->type) { case GDK_3BUTTON_PRESS: ++click_count; /* fall through */ case GDK_2BUTTON_PRESS: ++click_count; /* fall through */ case GDK_BUTTON_PRESS: { bridge->mouseDown(event); break; } case GDK_BUTTON_RELEASE: { bridge->mouseUp(event); click_count = 1; break; } default: break; } last_event = event->type; switch (event->type) { case GDK_3BUTTON_PRESS: ++click_count; /* fall through */ case GDK_2BUTTON_PRESS: ++click_count; /* fall through */ case GDK_BUTTON_PRESS: { QMouseEvent qmm(QEvent::MouseButtonPress, QPoint(x,y), get_qt_button_state(state) | get_qt_button_state_num(event->button), click_count); break; } case GDK_BUTTON_RELEASE: { QMouseEvent qmm(QEvent::MouseButtonRelease, QPoint(x,y), get_qt_button_state(state) | get_qt_button_state_num(event->button), click_count); click_count = 1; break; } default: break; }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -