ginebra2/ChromeDOM.cpp
changeset 6 1c3b8676e58c
parent 5 0f2326c2a325
child 15 73c48011b8c7
--- 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<WebChromeSnippet*> (result))->item());
+                snippet = new WebChromeSnippet(docElementId, m_chrome, element);
+                m_renderer->addRenderItem((static_cast<WebChromeSnippet*> (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)