Blame SOURCES/0246-gtktiledviewer-initial-column-headers-for-spreadshee.patch

135360
From 7d7a5c94be66cbe7dc571a8bfb56f6e30b869303 Mon Sep 17 00:00:00 2001
135360
From: Miklos Vajna <vmiklos@collabora.co.uk>
135360
Date: Fri, 30 Oct 2015 14:57:16 +0100
135360
Subject: [PATCH 246/398] gtktiledviewer: initial column headers for
135360
 spreadsheet documents
135360
135360
Change-Id: I10e88b4ff4ab0cfb29e97fa608d8acd69ce0f062
135360
(cherry picked from commit 18bf71a2002b979dbf80d85c8863af39783bf87d)
135360
---
135360
 .../qa/gtktiledviewer/gtktiledviewer.cxx           | 131 +++++++++++++--------
135360
 1 file changed, 83 insertions(+), 48 deletions(-)
135360
135360
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
135360
index 9ee6ce8a39fb..08058e8699c9 100644
135360
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
135360
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
135360
@@ -32,8 +32,8 @@ static int help()
135360
     return 1;
135360
 }
135360
 
135360
-/// Represents the row header widget for spreadsheets.
135360
-class TiledRowBar
135360
+/// Represents the row or column header widget for spreadsheets.
135360
+class TiledRowColumnBar
135360
 {
135360
 public:
135360
     /// Stores size and content of a single row header.
135360
@@ -48,17 +48,21 @@ public:
135360
         }
135360
     };
135360
 
135360
-    static const int HEADER_WIDTH = 50;
135360
+    enum TiledBarType { ROW, COLUMN };
135360
+
135360
+    static const int ROW_HEADER_WIDTH = 50;
135360
+    static const int COLUMN_HEADER_HEIGHT = 20;
135360
 
135360
     GtkWidget* m_pDrawingArea;
135360
     std::vector<Header> m_aHeaders;
135360
-    int m_nHeightPixel = 0;
135360
+    /// Height for row bar, width for column bar.
135360
+    int m_nSizePixel;
135360
+    TiledBarType m_eType;
135360
 
135360
-    TiledRowBar(GtkWidget* pDocView);
135360
+    TiledRowColumnBar(TiledBarType eType);
135360
     static gboolean draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData);
135360
     gboolean drawImpl(GtkWidget* pWidget, cairo_t* pCairo);
135360
     static gboolean docConfigureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData);
135360
-    gboolean docConfigureEventImpl(GtkWidget* pWidget, GdkEventConfigure* pEvent);
135360
     /// Draws rText at the center of rRectangle on pCairo.
135360
     static void drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText);
135360
 };
135360
@@ -87,7 +91,8 @@ public:
135360
     GtkWidget* m_pFindbarEntry;
135360
     GtkWidget* m_pFindbarLabel;
135360
     bool m_bFindAll;
135360
-    std::shared_ptr<TiledRowBar> m_pRowBar;
135360
+    std::shared_ptr<TiledRowColumnBar> m_pRowBar;
135360
+    std::shared_ptr<TiledRowColumnBar> m_pColumnBar;
135360
 
135360
     TiledWindow()
135360
         : m_pDocView(0),
135360
@@ -124,21 +129,24 @@ static TiledWindow& lcl_getTiledWindow(GtkWidget* pWidget)
135360
     return g_aWindows[pToplevel];
135360
 }
135360
 
135360
-TiledRowBar::TiledRowBar(GtkWidget* pDocView)
135360
+TiledRowColumnBar::TiledRowColumnBar(TiledBarType eType)
135360
     : m_pDrawingArea(gtk_drawing_area_new()),
135360
-    m_nHeightPixel(0)
135360
+    m_nSizePixel(0),
135360
+    m_eType(eType)
135360
 {
135360
-    gtk_widget_set_size_request(m_pDrawingArea, HEADER_WIDTH, -1);
135360
-    g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(TiledRowBar::draw), this);
135360
-    g_signal_connect(pDocView, "configure-event", G_CALLBACK(TiledRowBar::docConfigureEvent), this);
135360
+    if (m_eType == ROW)
135360
+        gtk_widget_set_size_request(m_pDrawingArea, ROW_HEADER_WIDTH, -1);
135360
+    else
135360
+        gtk_widget_set_size_request(m_pDrawingArea, -1, COLUMN_HEADER_HEIGHT);
135360
+    g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(TiledRowColumnBar::draw), this);
135360
 }
135360
 
135360
-gboolean TiledRowBar::draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData)
135360
+gboolean TiledRowColumnBar::draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData)
135360
 {
135360
-    return static_cast<TiledRowBar*>(pData)->drawImpl(pWidget, pCairo);
135360
+    return static_cast<TiledRowColumnBar*>(pData)->drawImpl(pWidget, pCairo);
135360
 }
135360
 
135360
-void TiledRowBar::drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText)
135360
+void TiledRowColumnBar::drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText)
135360
 {
135360
     cairo_text_extents_t extents;
135360
     cairo_text_extents(pCairo, rText.c_str(), &extents);
135360
@@ -147,7 +155,7 @@ void TiledRowBar::drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, cons
135360
     cairo_show_text(pCairo, rText.c_str());
135360
 }
135360
 
135360
-gboolean TiledRowBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo)
135360
+gboolean TiledRowColumnBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo)
135360
 {
135360
     cairo_set_source_rgb(pCairo, 0, 0, 0);
135360
 
135360
@@ -155,56 +163,76 @@ gboolean TiledRowBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo)
135360
     for (const Header& rHeader : m_aHeaders)
135360
     {
135360
         GdkRectangle aRectangle;
135360
-        aRectangle.x = 0;
135360
-        aRectangle.y = nTotal - 1;
135360
-        aRectangle.width = HEADER_WIDTH - 1;
135360
-        aRectangle.height = rHeader.m_nSize;
135360
-        // Bottom line.
135360
-        cairo_rectangle(pCairo, aRectangle.x, aRectangle.y + aRectangle.height, aRectangle.width, 1);
135360
-        cairo_fill(pCairo);
135360
-        // Left line.
135360
-        cairo_rectangle(pCairo, aRectangle.width, aRectangle.y, 1, aRectangle.height);
135360
-        cairo_fill(pCairo);
135360
+        if (m_eType == ROW)
135360
+        {
135360
+            aRectangle.x = 0;
135360
+            aRectangle.y = nTotal - 1;
135360
+            aRectangle.width = ROW_HEADER_WIDTH - 1;
135360
+            aRectangle.height = rHeader.m_nSize;
135360
+            // Bottom line.
135360
+            cairo_rectangle(pCairo, aRectangle.x, aRectangle.y + aRectangle.height, aRectangle.width, 1);
135360
+            cairo_fill(pCairo);
135360
+            // Right line.
135360
+            cairo_rectangle(pCairo, aRectangle.width, aRectangle.y, 1, aRectangle.height);
135360
+            cairo_fill(pCairo);
135360
+        }
135360
+        else
135360
+        {
135360
+            aRectangle.x = nTotal -1;
135360
+            aRectangle.y = 0;
135360
+            aRectangle.width = rHeader.m_nSize;
135360
+            aRectangle.height = COLUMN_HEADER_HEIGHT - 1;
135360
+            // Right line.
135360
+            cairo_rectangle(pCairo, aRectangle.x + aRectangle.width , aRectangle.y, 1, aRectangle.height);
135360
+            cairo_fill(pCairo);
135360
+            // Bottom line.
135360
+            cairo_rectangle(pCairo, aRectangle.x, aRectangle.height, aRectangle.width, 1);
135360
+            cairo_fill(pCairo);
135360
+        }
135360
         drawText(pCairo, aRectangle, rHeader.m_aText);
135360
         nTotal += rHeader.m_nSize;
135360
-        if (nTotal > m_nHeightPixel)
135360
+        if (nTotal > m_nSizePixel)
135360
             break;
135360
     }
135360
 
135360
     return FALSE;
135360
 }
135360
 
135360
-gboolean TiledRowBar::docConfigureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData)
135360
-{
135360
-    return static_cast<TiledRowBar*>(pData)->docConfigureEventImpl(pWidget, pEvent);
135360
-}
135360
-
135360
-gboolean TiledRowBar::docConfigureEventImpl(GtkWidget* pDocView, GdkEventConfigure* /*pEvent*/)
135360
+gboolean TiledRowColumnBar::docConfigureEvent(GtkWidget* pDocView, GdkEventConfigure* /*pEvent*/, gpointer /*pData*/)
135360
 {
135360
-    if (g_aWindows.find(gtk_widget_get_toplevel(pDocView)) == g_aWindows.end())
135360
-        return TRUE;
135360
-
135360
     TiledWindow& rWindow = lcl_getTiledWindow(pDocView);
135360
     GtkAdjustment* pVAdjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(rWindow.m_pScrolledWindow));
135360
-    m_nHeightPixel = gtk_adjustment_get_page_size(pVAdjustment);
135360
+    rWindow.m_pRowBar->m_nSizePixel = gtk_adjustment_get_page_size(pVAdjustment);
135360
+    GtkAdjustment* pHAdjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(rWindow.m_pScrolledWindow));
135360
+    rWindow.m_pColumnBar->m_nSizePixel = gtk_adjustment_get_page_size(pHAdjustment);
135360
 
135360
     LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(pDocView));
135360
     if (pDocument && pDocument->pClass->getDocumentType(pDocument) == LOK_DOCTYPE_SPREADSHEET)
135360
     {
135360
-        m_aHeaders.clear();
135360
         char* pValues = pDocument->pClass->getCommandValues(pDocument, ".uno:ViewRowColumnHeaders");
135360
         std::stringstream aStream(pValues);
135360
         free(pValues);
135360
         assert(!aStream.str().empty());
135360
         boost::property_tree::ptree aTree;
135360
         boost::property_tree::read_json(aStream, aTree);
135360
+
135360
+        rWindow.m_pRowBar->m_aHeaders.clear();
135360
         for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("rows"))
135360
         {
135360
             Header aHeader(std::atoi(rValue.second.get<std::string>("size").c_str()), rValue.second.get<std::string>("text"));
135360
-            m_aHeaders.push_back(aHeader);
135360
+            rWindow.m_pRowBar->m_aHeaders.push_back(aHeader);
135360
+        }
135360
+        gtk_widget_show(rWindow.m_pRowBar->m_pDrawingArea);
135360
+        gtk_widget_queue_draw(rWindow.m_pRowBar->m_pDrawingArea);
135360
+
135360
+        rWindow.m_pColumnBar->m_aHeaders.clear();
135360
+        for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("columns"))
135360
+        {
135360
+            Header aHeader(std::atoi(rValue.second.get<std::string>("size").c_str()), rValue.second.get<std::string>("text"));
135360
+            rWindow.m_pColumnBar->m_aHeaders.push_back(aHeader);
135360
         }
135360
-        gtk_widget_show(m_pDrawingArea);
135360
-        gtk_widget_queue_draw(m_pDrawingArea);
135360
+        gtk_widget_show(rWindow.m_pColumnBar->m_pDrawingArea);
135360
+        gtk_widget_queue_draw(rWindow.m_pColumnBar->m_pDrawingArea);
135360
     }
135360
 
135360
     return TRUE;
135360
@@ -915,17 +943,22 @@ static GtkWidget* createWindow(TiledWindow& rWindow)
135360
 
135360
     gtk_box_pack_end(GTK_BOX(rWindow.m_pVBox), rWindow.m_pFindbar, FALSE, FALSE, 0);
135360
 
135360
-    // Horizontal box for the row bar + doc view.
135360
-    GtkWidget* pHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
135360
-    gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), pHBox);
135360
-    rWindow.m_pRowBar.reset(new TiledRowBar(rWindow.m_pDocView));
135360
-    gtk_box_pack_start(GTK_BOX(pHBox), rWindow.m_pRowBar->m_pDrawingArea, FALSE, FALSE, 0);
135360
+    // Grid for the row/column bar + doc view.
135360
+    GtkWidget* pGrid = gtk_grid_new();
135360
+    gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), pGrid);
135360
+    rWindow.m_pRowBar.reset(new TiledRowColumnBar(TiledRowColumnBar::ROW));
135360
+    // "A2" cell of the grid.
135360
+    gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pRowBar->m_pDrawingArea, 0, 1, 1, 1);
135360
+    rWindow.m_pColumnBar.reset(new TiledRowColumnBar(TiledRowColumnBar::COLUMN));
135360
+    // "B1" cell of the grid.
135360
+    gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pColumnBar->m_pDrawingArea, 1, 0, 1, 1);
135360
 
135360
     // Scrolled window for DocView
135360
     rWindow.m_pScrolledWindow = gtk_scrolled_window_new(0, 0);
135360
     gtk_widget_set_hexpand(rWindow.m_pScrolledWindow, TRUE);
135360
     gtk_widget_set_vexpand(rWindow.m_pScrolledWindow, TRUE);
135360
-    gtk_container_add(GTK_CONTAINER(pHBox), rWindow.m_pScrolledWindow);
135360
+    // "B2" cell of the grid
135360
+    gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pScrolledWindow, 1, 1, 1, 1);
135360
 
135360
     gtk_container_add(GTK_CONTAINER(rWindow.m_pScrolledWindow), rWindow.m_pDocView);
135360
 
135360
@@ -942,10 +975,12 @@ static GtkWidget* createWindow(TiledWindow& rWindow)
135360
     gtk_widget_show_all(pWindow);
135360
     // Hide the findbar by default.
135360
     gtk_widget_hide(rWindow.m_pFindbar);
135360
-    // Same for the row bar.
135360
+    // Same for the row/column bar.
135360
     gtk_widget_hide(rWindow.m_pRowBar->m_pDrawingArea);
135360
+    gtk_widget_hide(rWindow.m_pColumnBar->m_pDrawingArea);
135360
 
135360
     g_aWindows[pWindow] = rWindow;
135360
+    g_signal_connect(rWindow.m_pDocView, "configure-event", G_CALLBACK(TiledRowColumnBar::docConfigureEvent), 0);
135360
     return pWindow;
135360
 }
135360
 
135360
-- 
135360
2.12.0
135360