|
 |
f325b2 |
From 53bcb37a3c055ba6103a64ca1a29f284b2535b79 Mon Sep 17 00:00:00 2001
|
|
 |
f325b2 |
From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
 |
f325b2 |
Date: Fri, 30 Oct 2015 12:34:38 +0100
|
|
 |
f325b2 |
Subject: [PATCH 244/398] gtktiledviewer: initial row headers for spreadsheet
|
|
 |
f325b2 |
documents
|
|
 |
f325b2 |
|
|
 |
f325b2 |
Change-Id: Iec9080d7017ddcf2b605243bc820f9664110c2e8
|
|
 |
f325b2 |
(cherry picked from commit ecef9cb66c5f6009c7b062b489f93de85b70beeb)
|
|
 |
f325b2 |
---
|
|
 |
f325b2 |
.../qa/gtktiledviewer/gtktiledviewer.cxx | 128 ++++++++++++++++++++-
|
|
 |
f325b2 |
1 file changed, 127 insertions(+), 1 deletion(-)
|
|
 |
f325b2 |
|
|
 |
f325b2 |
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
|
|
 |
f325b2 |
index 72afd52131ad..cdde08db602d 100644
|
|
 |
f325b2 |
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
|
|
 |
f325b2 |
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
|
|
 |
f325b2 |
@@ -32,6 +32,37 @@ static int help()
|
|
 |
f325b2 |
return 1;
|
|
 |
f325b2 |
}
|
|
 |
f325b2 |
|
|
 |
f325b2 |
+/// Represents the row header widget for spreadsheets.
|
|
 |
f325b2 |
+class TiledRowBar
|
|
 |
f325b2 |
+{
|
|
 |
f325b2 |
+public:
|
|
 |
f325b2 |
+ /// Stores size and content of a single row header.
|
|
 |
f325b2 |
+ struct Header
|
|
 |
f325b2 |
+ {
|
|
 |
f325b2 |
+ int m_nSize;
|
|
 |
f325b2 |
+ std::string m_aText;
|
|
 |
f325b2 |
+ Header(int nSize, const std::string& rText)
|
|
 |
f325b2 |
+ : m_nSize(nSize),
|
|
 |
f325b2 |
+ m_aText(rText)
|
|
 |
f325b2 |
+ {
|
|
 |
f325b2 |
+ }
|
|
 |
f325b2 |
+ };
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ static const int HEADER_WIDTH = 50;
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ GtkWidget* m_pDrawingArea;
|
|
 |
f325b2 |
+ std::vector<Header> m_aHeaders;
|
|
 |
f325b2 |
+ int m_nHeightPixel = 0;
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ TiledRowBar(GtkWidget* pDocView);
|
|
 |
f325b2 |
+ static gboolean draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData);
|
|
 |
f325b2 |
+ gboolean drawImpl(GtkWidget* pWidget, cairo_t* pCairo);
|
|
 |
f325b2 |
+ static gboolean docConfigureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData);
|
|
 |
f325b2 |
+ gboolean docConfigureEventImpl(GtkWidget* pWidget, GdkEventConfigure* pEvent);
|
|
 |
f325b2 |
+ /// Draws rText at the center of rRectangle on pCairo.
|
|
 |
f325b2 |
+ void drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText);
|
|
 |
f325b2 |
+};
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
/// Represents all the state that is specific to one GtkWindow of this app.
|
|
 |
f325b2 |
class TiledWindow
|
|
 |
f325b2 |
{
|
|
 |
f325b2 |
@@ -56,6 +87,7 @@ public:
|
|
 |
f325b2 |
GtkWidget* m_pFindbarEntry;
|
|
 |
f325b2 |
GtkWidget* m_pFindbarLabel;
|
|
 |
f325b2 |
bool m_bFindAll;
|
|
 |
f325b2 |
+ std::shared_ptr<TiledRowBar> m_pRowBar;
|
|
 |
f325b2 |
|
|
 |
f325b2 |
TiledWindow()
|
|
 |
f325b2 |
: m_pDocView(0),
|
|
 |
f325b2 |
@@ -92,6 +124,92 @@ static TiledWindow& lcl_getTiledWindow(GtkWidget* pWidget)
|
|
 |
f325b2 |
return g_aWindows[pToplevel];
|
|
 |
f325b2 |
}
|
|
 |
f325b2 |
|
|
 |
f325b2 |
+TiledRowBar::TiledRowBar(GtkWidget* pDocView)
|
|
 |
f325b2 |
+ : m_pDrawingArea(gtk_drawing_area_new()),
|
|
 |
f325b2 |
+ m_nHeightPixel(0)
|
|
 |
f325b2 |
+{
|
|
 |
f325b2 |
+ gtk_widget_set_size_request(m_pDrawingArea, HEADER_WIDTH, -1);
|
|
 |
f325b2 |
+ g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(TiledRowBar::draw), this);
|
|
 |
f325b2 |
+ g_signal_connect(pDocView, "configure-event", G_CALLBACK(TiledRowBar::docConfigureEvent), this);
|
|
 |
f325b2 |
+}
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+gboolean TiledRowBar::draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData)
|
|
 |
f325b2 |
+{
|
|
 |
f325b2 |
+ return static_cast<TiledRowBar*>(pData)->drawImpl(pWidget, pCairo);
|
|
 |
f325b2 |
+}
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+void TiledRowBar::drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText)
|
|
 |
f325b2 |
+{
|
|
 |
f325b2 |
+ cairo_text_extents_t extents;
|
|
 |
f325b2 |
+ cairo_text_extents(pCairo, rText.c_str(), &extents);
|
|
 |
f325b2 |
+ // Cairo reference point for text is the bottom left corner.
|
|
 |
f325b2 |
+ cairo_move_to(pCairo, rRectangle.x + rRectangle.width / 2 - extents.width / 2, rRectangle.y + rRectangle.height / 2 + extents.height / 2);
|
|
 |
f325b2 |
+ cairo_show_text(pCairo, rText.c_str());
|
|
 |
f325b2 |
+}
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+gboolean TiledRowBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo)
|
|
 |
f325b2 |
+{
|
|
 |
f325b2 |
+ cairo_set_source_rgb(pCairo, 0, 0, 0);
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ int nTotal = 0;
|
|
 |
f325b2 |
+ for (const Header& rHeader : m_aHeaders)
|
|
 |
f325b2 |
+ {
|
|
 |
f325b2 |
+ GdkRectangle aRectangle;
|
|
 |
f325b2 |
+ aRectangle.x = 0;
|
|
 |
f325b2 |
+ aRectangle.y = nTotal - 1;
|
|
 |
f325b2 |
+ aRectangle.width = HEADER_WIDTH - 1;
|
|
 |
f325b2 |
+ aRectangle.height = rHeader.m_nSize;
|
|
 |
f325b2 |
+ // Bottom line.
|
|
 |
f325b2 |
+ cairo_rectangle(pCairo, aRectangle.x, aRectangle.y + aRectangle.height, aRectangle.width, 1);
|
|
 |
f325b2 |
+ cairo_fill(pCairo);
|
|
 |
f325b2 |
+ // Left line.
|
|
 |
f325b2 |
+ cairo_rectangle(pCairo, aRectangle.width, aRectangle.y, 1, aRectangle.height);
|
|
 |
f325b2 |
+ cairo_fill(pCairo);
|
|
 |
f325b2 |
+ drawText(pCairo, aRectangle, rHeader.m_aText);
|
|
 |
f325b2 |
+ nTotal += rHeader.m_nSize;
|
|
 |
f325b2 |
+ if (nTotal > m_nHeightPixel)
|
|
 |
f325b2 |
+ break;
|
|
 |
f325b2 |
+ }
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ return FALSE;
|
|
 |
f325b2 |
+}
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+gboolean TiledRowBar::docConfigureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData)
|
|
 |
f325b2 |
+{
|
|
 |
f325b2 |
+ return static_cast<TiledRowBar*>(pData)->docConfigureEventImpl(pWidget, pEvent);
|
|
 |
f325b2 |
+}
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+gboolean TiledRowBar::docConfigureEventImpl(GtkWidget* pDocView, GdkEventConfigure* /*pEvent*/)
|
|
 |
f325b2 |
+{
|
|
 |
f325b2 |
+ if (g_aWindows.find(gtk_widget_get_toplevel(pDocView)) == g_aWindows.end())
|
|
 |
f325b2 |
+ return TRUE;
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ TiledWindow& rWindow = lcl_getTiledWindow(pDocView);
|
|
 |
f325b2 |
+ GtkAdjustment* pVAdjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(rWindow.m_pScrolledWindow));
|
|
 |
f325b2 |
+ m_nHeightPixel = gtk_adjustment_get_page_size(pVAdjustment);
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(pDocView));
|
|
 |
f325b2 |
+ if (pDocument && pDocument->pClass->getDocumentType(pDocument) == LOK_DOCTYPE_SPREADSHEET)
|
|
 |
f325b2 |
+ {
|
|
 |
f325b2 |
+ m_aHeaders.clear();
|
|
 |
f325b2 |
+ char* pValues = pDocument->pClass->getCommandValues(pDocument, ".uno:ViewRowColumnHeaders");
|
|
 |
f325b2 |
+ std::stringstream aStream(pValues);
|
|
 |
f325b2 |
+ free(pValues);
|
|
 |
f325b2 |
+ assert(!aStream.str().empty());
|
|
 |
f325b2 |
+ boost::property_tree::ptree aTree;
|
|
 |
f325b2 |
+ boost::property_tree::read_json(aStream, aTree);
|
|
 |
f325b2 |
+ for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("rows"))
|
|
 |
f325b2 |
+ {
|
|
 |
f325b2 |
+ Header aHeader(std::atoi(rValue.second.get<std::string>("size").c_str()), rValue.second.get<std::string>("text"));
|
|
 |
f325b2 |
+ m_aHeaders.push_back(aHeader);
|
|
 |
f325b2 |
+ }
|
|
 |
f325b2 |
+ gtk_widget_show(m_pDrawingArea);
|
|
 |
f325b2 |
+ gtk_widget_queue_draw(m_pDrawingArea);
|
|
 |
f325b2 |
+ }
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ return TRUE;
|
|
 |
f325b2 |
+}
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
static void lcl_registerToolItem(TiledWindow& rWindow, GtkToolItem* pItem, const std::string& rName)
|
|
 |
f325b2 |
{
|
|
 |
f325b2 |
rWindow.m_aToolItemCommandNames[pItem] = rName;
|
|
 |
f325b2 |
@@ -797,11 +915,17 @@ static GtkWidget* createWindow(TiledWindow& rWindow)
|
|
 |
f325b2 |
|
|
 |
f325b2 |
gtk_box_pack_end(GTK_BOX(rWindow.m_pVBox), rWindow.m_pFindbar, FALSE, FALSE, 0);
|
|
 |
f325b2 |
|
|
 |
f325b2 |
+ // Horizontal box for the row bar + doc view.
|
|
 |
f325b2 |
+ GtkWidget* pHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
|
 |
f325b2 |
+ gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), pHBox);
|
|
 |
f325b2 |
+ rWindow.m_pRowBar.reset(new TiledRowBar(rWindow.m_pDocView));
|
|
 |
f325b2 |
+ gtk_box_pack_start(GTK_BOX(pHBox), rWindow.m_pRowBar->m_pDrawingArea, FALSE, FALSE, 0);
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
// Scrolled window for DocView
|
|
 |
f325b2 |
rWindow.m_pScrolledWindow = gtk_scrolled_window_new(0, 0);
|
|
 |
f325b2 |
gtk_widget_set_hexpand(rWindow.m_pScrolledWindow, TRUE);
|
|
 |
f325b2 |
gtk_widget_set_vexpand(rWindow.m_pScrolledWindow, TRUE);
|
|
 |
f325b2 |
- gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), rWindow.m_pScrolledWindow);
|
|
 |
f325b2 |
+ gtk_container_add(GTK_CONTAINER(pHBox), rWindow.m_pScrolledWindow);
|
|
 |
f325b2 |
|
|
 |
f325b2 |
gtk_container_add(GTK_CONTAINER(rWindow.m_pScrolledWindow), rWindow.m_pDocView);
|
|
 |
f325b2 |
|
|
 |
f325b2 |
@@ -818,6 +942,8 @@ static GtkWidget* createWindow(TiledWindow& rWindow)
|
|
 |
f325b2 |
gtk_widget_show_all(pWindow);
|
|
 |
f325b2 |
// Hide the findbar by default.
|
|
 |
f325b2 |
gtk_widget_hide(rWindow.m_pFindbar);
|
|
 |
f325b2 |
+ // Same for the row bar.
|
|
 |
f325b2 |
+ gtk_widget_hide(rWindow.m_pRowBar->m_pDrawingArea);
|
|
 |
f325b2 |
|
|
 |
f325b2 |
g_aWindows[pWindow] = rWindow;
|
|
 |
f325b2 |
return pWindow;
|
|
 |
f325b2 |
--
|
|
 |
f325b2 |
2.12.0
|
|
 |
f325b2 |
|