diff -r 0f2326c2a325 -r 1c3b8676e58c ginebra2/ChromeDOM.cpp --- a/ginebra2/ChromeDOM.cpp Wed Jun 23 17:59:43 2010 +0300 +++ b/ginebra2/ChromeDOM.cpp Tue Jul 06 14:03:49 2010 +0300 @@ -16,6 +16,7 @@ * see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/". * * Description: +* * */ @@ -120,121 +121,102 @@ } return handlers; } + +//TODO: Get rid of rectangle argument to snippets. This is redundant with the element argument!! +//TODO: Rewrite using function table + + ChromeSnippet * ChromeDOM::nativeSnippetForClassName(const QString & className, const QString elementId, QWebElement element) + { + QRectF rect = element.geometry(); + + if (className == "ContentToolbar") { + return ContentToolbarSnippet::instance(elementId, m_chrome, element); + } + else if (className == "WindowToolbar") { + return WindowToolbarSnippet::instance(elementId, m_chrome, element); + } + else if (className == "RecentUrlToolbar") { + return RecentUrlToolbarSnippet::instance(elementId, m_chrome, element); + } + else if (className == "BookmarksToolbar") { + return BookmarksToolbarSnippet::instance(elementId, m_chrome, element); + } + else if (className == "SettingsToolbar") { + return SettingsToolbarSnippet::instance(elementId, m_chrome, element); + } + else if (className == "MostVisitedPagesWidget") { + return MostVisitedSnippet::instance(elementId, m_chrome, element); + } + else if (className == "ActionButton") { + return ActionButtonSnippet::instance(elementId, m_chrome, element); + } + else if (className == "PageSnippet") { + return PageSnippet::instance(elementId, m_chrome, element); + } + else if (className == "UrlSearchSnippet") { + return GUrlSearchSnippet::instance(elementId, m_chrome, element); + } + else if (className == "TextEditSnippet") { + return EditorSnippet::instance(elementId, m_chrome, element); + } + else { + ChromeSnippet* result = new ChromeSnippet(elementId, m_chrome, 0, element); + result->setChromeWidget(new QGraphicsWidget()); + return result; + } + } + ChromeSnippet *ChromeDOM::getSnippet(const QString &docElementId, QGraphicsItem* parent) { Q_UNUSED(parent) - ChromeSnippet * result = 0; + ChromeSnippet * snippet = 0; QWebElement doc = m_page->mainFrame()->documentElement(); QWebElement element = doc.findFirst("#" + docElementId); - QRect rect = element.geometry();//getElementRect(docElementId); + QRect rect = element.geometry(); + //TODO: This may not be accurate since final heights may not have been computed at this point!! m_height += rect.height(); - //m_bytes += rect.width() * rect.height() * 3; //Calculate total rendered area at 24 bit depth - //qDebug() << "Chrome total rects at 24 bits: " << m_bytes; + // qDebug() << "Snippet: ID: " << docElementId << " Owner Area: " << rect << " Element Rect: " << element.geometry(); + if (!rect.isNull()) { QString className = element.attribute("data-GinebraNativeClass", "__NO_CLASS__"); if (className == "__NO_CLASS__") { if (element.attribute("data-GinebraContainer", "false") == "true") { - ChromeItem * widget = new ChromeItem(NULL); - result = new WebChromeContainerSnippet(docElementId, m_chrome, rect, element, - widget); - widget->setSnippet(result); + snippet = new WebChromeContainerSnippet(docElementId, m_chrome, element); + snippet->setChromeWidget(new ChromeItem(snippet)); } else { - result = new WebChromeSnippet(docElementId, m_chrome, rect, element); - m_renderer->addRenderItem((static_cast (result))->item()); + snippet = new WebChromeSnippet(docElementId, m_chrome, element); + m_renderer->addRenderItem((static_cast (snippet))->item()); } } else { - - if (className == "ContentToolbar" ) { - ContentToolbarChromeItem * widget = new ContentToolbarChromeItem(); - result = new ContentToolbarSnippet(docElementId, m_chrome, rect, element, widget); - widget->setSnippet(result); - } - else if (className == "WindowToolbar" ) { - ToolbarChromeItem * widget = new ToolbarChromeItem(); - result = new WindowToolbarSnippet(docElementId, m_chrome, rect, element, widget); - widget->setSnippet(result); - } - else if (className == "RecentUrlToolbar" ) { - ToolbarChromeItem * widget = new ToolbarChromeItem(); - result = new RecentUrlToolbarSnippet(docElementId, m_chrome, rect, element, widget); - widget->setSnippet(result); - } - else if (className == "BookmarksToolbar" ) { - ToolbarChromeItem * widget = new ToolbarChromeItem(); - result = new BookmarksToolbarSnippet(docElementId, m_chrome, rect, element, widget); - widget->setSnippet(result); - } - else if (className == "SettingsToolbar" ) { - ToolbarChromeItem * widget = new ToolbarChromeItem(); - result = new SettingsToolbarSnippet(docElementId, m_chrome, rect, element, widget); - widget->setSnippet(result); - } - else if (className == "ToolBar" ) { - ToolbarChromeItem * widget = new ToolbarChromeItem(); - result = new WebChromeContainerSnippet(docElementId, m_chrome, rect, element, - widget); - widget->setSnippet(result); - } - else { - QGraphicsWidget * w = 0; - if (className == "MostVisitedPagesWidget") { - result = new MostVisitedSnippet(docElementId, m_chrome, 0, element); - MostVisitedPagesWidget* mostVisited; - mostVisited = new MostVisitedPagesWidget(result, m_chrome); - mostVisited->hide(); - w = mostVisited; - } - else if (className == "ActionButton") { - result = new ActionButtonSnippet(docElementId, m_chrome, 0, element); - w = new ActionButton(result); - } - else if (className == "PageSnippet") { - result = new PageSnippet(docElementId, m_chrome, 0, element); - w = new PageItem(result, m_chrome); - } - else if (className == "ProgressBar") { - result = new ProgressBarSnippet(docElementId, m_chrome, 0, element); - w = new ProgressBarItem(result); - } - else if (className == "UrlSearchSnippet") { - result = new GUrlSearchSnippet(docElementId, m_chrome, 0, element); - w = new GUrlSearchItem(result, m_chrome); - } - else if (className == "TextEditSnippet") { - result = new EditorSnippet(docElementId, m_chrome, 0, element); - w = new TextEditItem(result, m_chrome); - } - else { - //Chrome snippet takes ownership of w - result = new ChromeSnippet(docElementId, m_chrome, 0, element); - w = new QGraphicsWidget(); - } - result->setWidget(w); - //Have snippet deterimine its own size when in anchor layout - w->resize(rect.width(), rect.height()); - w->setPreferredSize(rect.width(), rect.height()); - w->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); - //Have snippet determine its own location when NOT in anchor layout - w->setPos(rect.x(), rect.y()); - } + snippet = nativeSnippetForClassName(className, docElementId, element); + //TODO: Is the following still needed? + QGraphicsWidget * widget = snippet->widget(); + //Have snippet determine its own size when in anchor layout. Again, these will not + //necessarily be accurate at this point. + widget->resize(rect.width(), rect.height()); + widget->setPreferredSize(rect.width(), rect.height()); + widget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); + //Have snippet determine its own location when NOT in anchor layout + widget->setPos(rect.x(), rect.y()); + } QWebElement parentElem; if (!(parentElem = findChromeParent(element)).isNull()) { - result->setParentId(parentElem.attribute("id")); + snippet->setParentId(parentElem.attribute("id")); } //Set auto-layout attributes - result->setAnchor(element.attribute("data-GinebraAnchor", "AnchorNone"), false); - result->setAnchorOffset(element.attribute("data-GinebraAnchorOffset", "0").toInt()); - result->setInitiallyVisible(element.attribute("data-GinebraVisible", "false") == "true"); - result->setHidesContent(element.attribute("data-GinebraHidesContent", "false") == "true"); + snippet->setAnchor(element.attribute("data-GinebraAnchor", "AnchorNone"), false); + snippet->setAnchorOffset(element.attribute("data-GinebraAnchorOffset", "0").toInt()); + snippet->setInitiallyVisible(element.attribute("data-GinebraVisible", "false") == "true"); + snippet->setHidesContent(element.attribute("data-GinebraHidesContent", "false") == "true"); } - return result; + return snippet; } QWebElement ChromeDOM::findChromeParent(QWebElement element)