libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx | 181 ++++++++++++++------ sc/source/ui/view/tabview.cxx | 14 + 2 files changed, 146 insertions(+), 49 deletions(-)
New commits: commit f5ab3e84dfd58722dc74c7369c1ad67237ca462e Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Oct 30 16:20:58 2015 +0100 gtktiledviewer: add missing spreadsheet corner button Change-Id: I3a7af693ccdce2012ddbaa6a3ac8321f29b6356c diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index de57dc9..72297aa 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -67,6 +67,16 @@ public: static void drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText); }; +/// Represents the button at the top left corner for spreadsheets. +class TiledCornerButton +{ +public: + GtkWidget* m_pDrawingArea; + TiledCornerButton(); + static gboolean draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData); + gboolean drawImpl(GtkWidget* pWidget, cairo_t* pCairo); +}; + /// Represents all the state that is specific to one GtkWindow of this app. class TiledWindow { @@ -93,6 +103,7 @@ public: bool m_bFindAll; std::shared_ptr<TiledRowColumnBar> m_pRowBar; std::shared_ptr<TiledRowColumnBar> m_pColumnBar; + std::shared_ptr<TiledCornerButton> m_pCornerButton; TiledWindow() : m_pDocView(0), @@ -169,6 +180,9 @@ gboolean TiledRowColumnBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo) aRectangle.y = nTotal - 1; aRectangle.width = ROW_HEADER_WIDTH - 1; aRectangle.height = rHeader.m_nSize; + // Left line. + cairo_rectangle(pCairo, aRectangle.x, aRectangle.y, 1, aRectangle.height); + cairo_fill(pCairo); // Bottom line. cairo_rectangle(pCairo, aRectangle.x, aRectangle.y + aRectangle.height, aRectangle.width, 1); cairo_fill(pCairo); @@ -178,10 +192,13 @@ gboolean TiledRowColumnBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo) } else { - aRectangle.x = nTotal -1; + aRectangle.x = nTotal - 1; aRectangle.y = 0; aRectangle.width = rHeader.m_nSize; aRectangle.height = COLUMN_HEADER_HEIGHT - 1; + // Top line. + cairo_rectangle(pCairo, aRectangle.x, aRectangle.y, aRectangle.width, 1); + cairo_fill(pCairo); // Right line. cairo_rectangle(pCairo, aRectangle.x + aRectangle.width , aRectangle.y, 1, aRectangle.height); cairo_fill(pCairo); @@ -216,6 +233,8 @@ gboolean TiledRowColumnBar::docConfigureEvent(GtkWidget* pDocView, GdkEventConfi boost::property_tree::ptree aTree; boost::property_tree::read_json(aStream, aTree); + gtk_widget_show(rWindow.m_pCornerButton->m_pDrawingArea); + rWindow.m_pRowBar->m_aHeaders.clear(); for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("rows")) { @@ -238,6 +257,33 @@ gboolean TiledRowColumnBar::docConfigureEvent(GtkWidget* pDocView, GdkEventConfi return TRUE; } +TiledCornerButton::TiledCornerButton() + : m_pDrawingArea(gtk_drawing_area_new()) +{ + gtk_widget_set_size_request(m_pDrawingArea, TiledRowColumnBar::ROW_HEADER_WIDTH, TiledRowColumnBar::COLUMN_HEADER_HEIGHT); + g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(TiledCornerButton::draw), this); +} + +gboolean TiledCornerButton::draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData) +{ + return static_cast<TiledCornerButton*>(pData)->drawImpl(pWidget, pCairo); +} + +gboolean TiledCornerButton::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo) +{ + cairo_set_source_rgb(pCairo, 0, 0, 0); + + GdkRectangle aRectangle; + aRectangle.x = 0; + aRectangle.y = 0; + aRectangle.width = TiledRowColumnBar::ROW_HEADER_WIDTH; + aRectangle.height = TiledRowColumnBar::COLUMN_HEADER_HEIGHT; + cairo_rectangle(pCairo, aRectangle.x, aRectangle.y, aRectangle.width, aRectangle.height); + cairo_stroke(pCairo); + + return FALSE; +} + static void lcl_registerToolItem(TiledWindow& rWindow, GtkToolItem* pItem, const std::string& rName) { rWindow.m_aToolItemCommandNames[pItem] = rName; @@ -947,6 +993,9 @@ static GtkWidget* createWindow(TiledWindow& rWindow) // Grid for the row/column bar + doc view. GtkWidget* pGrid = gtk_grid_new(); gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), pGrid); + rWindow.m_pCornerButton.reset(new TiledCornerButton()); + // "A1" cell of the grid. + gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pCornerButton->m_pDrawingArea, 0, 0, 1, 1); rWindow.m_pRowBar.reset(new TiledRowColumnBar(TiledRowColumnBar::ROW)); // "A2" cell of the grid. gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pRowBar->m_pDrawingArea, 0, 1, 1, 1); @@ -977,6 +1026,7 @@ static GtkWidget* createWindow(TiledWindow& rWindow) // Hide the findbar by default. gtk_widget_hide(rWindow.m_pFindbar); // Same for the row/column bar. + gtk_widget_hide(rWindow.m_pCornerButton->m_pDrawingArea); gtk_widget_hide(rWindow.m_pRowBar->m_pDrawingArea); gtk_widget_hide(rWindow.m_pColumnBar->m_pDrawingArea); commit 3bdce53c557a1279e7e40d215e34405626bbc628 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Oct 30 16:00:03 2015 +0100 ScTabView::getRowColumnHeaders: emit info about last formatted row/col Change-Id: I6b4f6eacde84433fa3865e62c692a3f97895b887 diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index f35500c..7254ff9 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -2290,7 +2290,7 @@ OUString ScTabView::getRowColumnHeaders() pDoc->GetTiledRenderingArea(aViewData.GetTabNo(), nEndCol, nEndRow); boost::property_tree::ptree aRows; - for (SCROW nRow = 0; nRow < nEndRow; ++nRow) + for (SCROW nRow = 0; nRow <= nEndRow; ++nRow) { boost::property_tree::ptree aRow; sal_uInt16 nSize = pRowBar[SC_SPLIT_BOTTOM]->GetEntrySize(nRow); @@ -2301,7 +2301,7 @@ OUString ScTabView::getRowColumnHeaders() } boost::property_tree::ptree aCols; - for (SCCOL nCol = 0; nCol < nEndCol; ++nCol) + for (SCCOL nCol = 0; nCol <= nEndCol; ++nCol) { boost::property_tree::ptree aCol; sal_uInt16 nSize = pColBar[SC_SPLIT_LEFT]->GetEntrySize(nCol); commit 18bf71a2002b979dbf80d85c8863af39783bf87d Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Oct 30 14:57:16 2015 +0100 gtktiledviewer: initial column headers for spreadsheet documents Change-Id: I10e88b4ff4ab0cfb29e97fa608d8acd69ce0f062 diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index 2502b50..de57dc9 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -32,8 +32,8 @@ static int help() return 1; } -/// Represents the row header widget for spreadsheets. -class TiledRowBar +/// Represents the row or column header widget for spreadsheets. +class TiledRowColumnBar { public: /// Stores size and content of a single row header. @@ -48,17 +48,21 @@ public: } }; - static const int HEADER_WIDTH = 50; + enum TiledBarType { ROW, COLUMN }; + + static const int ROW_HEADER_WIDTH = 50; + static const int COLUMN_HEADER_HEIGHT = 20; GtkWidget* m_pDrawingArea; std::vector<Header> m_aHeaders; - int m_nHeightPixel = 0; + /// Height for row bar, width for column bar. + int m_nSizePixel; + TiledBarType m_eType; - TiledRowBar(GtkWidget* pDocView); + TiledRowColumnBar(TiledBarType eType); static gboolean draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData); gboolean drawImpl(GtkWidget* pWidget, cairo_t* pCairo); static gboolean docConfigureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData); - gboolean docConfigureEventImpl(GtkWidget* pWidget, GdkEventConfigure* pEvent); /// Draws rText at the center of rRectangle on pCairo. static void drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText); }; @@ -87,7 +91,8 @@ public: GtkWidget* m_pFindbarEntry; GtkWidget* m_pFindbarLabel; bool m_bFindAll; - std::shared_ptr<TiledRowBar> m_pRowBar; + std::shared_ptr<TiledRowColumnBar> m_pRowBar; + std::shared_ptr<TiledRowColumnBar> m_pColumnBar; TiledWindow() : m_pDocView(0), @@ -124,21 +129,24 @@ static TiledWindow& lcl_getTiledWindow(GtkWidget* pWidget) return g_aWindows[pToplevel]; } -TiledRowBar::TiledRowBar(GtkWidget* pDocView) +TiledRowColumnBar::TiledRowColumnBar(TiledBarType eType) : m_pDrawingArea(gtk_drawing_area_new()), - m_nHeightPixel(0) + m_nSizePixel(0), + m_eType(eType) { - gtk_widget_set_size_request(m_pDrawingArea, HEADER_WIDTH, -1); - g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(TiledRowBar::draw), this); - g_signal_connect(pDocView, "configure-event", G_CALLBACK(TiledRowBar::docConfigureEvent), this); + if (m_eType == ROW) + gtk_widget_set_size_request(m_pDrawingArea, ROW_HEADER_WIDTH, -1); + else + gtk_widget_set_size_request(m_pDrawingArea, -1, COLUMN_HEADER_HEIGHT); + g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(TiledRowColumnBar::draw), this); } -gboolean TiledRowBar::draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData) +gboolean TiledRowColumnBar::draw(GtkWidget* pWidget, cairo_t* pCairo, gpointer pData) { - return static_cast<TiledRowBar*>(pData)->drawImpl(pWidget, pCairo); + return static_cast<TiledRowColumnBar*>(pData)->drawImpl(pWidget, pCairo); } -void TiledRowBar::drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText) +void TiledRowColumnBar::drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, const std::string& rText) { cairo_text_extents_t extents; cairo_text_extents(pCairo, rText.c_str(), &extents); @@ -147,7 +155,7 @@ void TiledRowBar::drawText(cairo_t* pCairo, const GdkRectangle& rRectangle, cons cairo_show_text(pCairo, rText.c_str()); } -gboolean TiledRowBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo) +gboolean TiledRowColumnBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo) { cairo_set_source_rgb(pCairo, 0, 0, 0); @@ -155,56 +163,76 @@ gboolean TiledRowBar::drawImpl(GtkWidget* /*pWidget*/, cairo_t* pCairo) for (const Header& rHeader : m_aHeaders) { GdkRectangle aRectangle; - aRectangle.x = 0; - aRectangle.y = nTotal - 1; - aRectangle.width = HEADER_WIDTH - 1; - aRectangle.height = rHeader.m_nSize; - // Bottom line. - cairo_rectangle(pCairo, aRectangle.x, aRectangle.y + aRectangle.height, aRectangle.width, 1); - cairo_fill(pCairo); - // Left line. - cairo_rectangle(pCairo, aRectangle.width, aRectangle.y, 1, aRectangle.height); - cairo_fill(pCairo); + if (m_eType == ROW) + { + aRectangle.x = 0; + aRectangle.y = nTotal - 1; + aRectangle.width = ROW_HEADER_WIDTH - 1; + aRectangle.height = rHeader.m_nSize; + // Bottom line. + cairo_rectangle(pCairo, aRectangle.x, aRectangle.y + aRectangle.height, aRectangle.width, 1); + cairo_fill(pCairo); + // Right line. + cairo_rectangle(pCairo, aRectangle.width, aRectangle.y, 1, aRectangle.height); + cairo_fill(pCairo); + } + else + { + aRectangle.x = nTotal -1; + aRectangle.y = 0; + aRectangle.width = rHeader.m_nSize; + aRectangle.height = COLUMN_HEADER_HEIGHT - 1; + // Right line. + cairo_rectangle(pCairo, aRectangle.x + aRectangle.width , aRectangle.y, 1, aRectangle.height); + cairo_fill(pCairo); + // Bottom line. + cairo_rectangle(pCairo, aRectangle.x, aRectangle.height, aRectangle.width, 1); + cairo_fill(pCairo); + } drawText(pCairo, aRectangle, rHeader.m_aText); nTotal += rHeader.m_nSize; - if (nTotal > m_nHeightPixel) + if (nTotal > m_nSizePixel) break; } return FALSE; } -gboolean TiledRowBar::docConfigureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData) -{ - return static_cast<TiledRowBar*>(pData)->docConfigureEventImpl(pWidget, pEvent); -} - -gboolean TiledRowBar::docConfigureEventImpl(GtkWidget* pDocView, GdkEventConfigure* /*pEvent*/) +gboolean TiledRowColumnBar::docConfigureEvent(GtkWidget* pDocView, GdkEventConfigure* /*pEvent*/, gpointer /*pData*/) { - if (g_aWindows.find(gtk_widget_get_toplevel(pDocView)) == g_aWindows.end()) - return TRUE; - TiledWindow& rWindow = lcl_getTiledWindow(pDocView); GtkAdjustment* pVAdjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(rWindow.m_pScrolledWindow)); - m_nHeightPixel = gtk_adjustment_get_page_size(pVAdjustment); + rWindow.m_pRowBar->m_nSizePixel = gtk_adjustment_get_page_size(pVAdjustment); + GtkAdjustment* pHAdjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(rWindow.m_pScrolledWindow)); + rWindow.m_pColumnBar->m_nSizePixel = gtk_adjustment_get_page_size(pHAdjustment); LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(pDocView)); if (pDocument && pDocument->pClass->getDocumentType(pDocument) == LOK_DOCTYPE_SPREADSHEET) { - m_aHeaders.clear(); char* pValues = pDocument->pClass->getCommandValues(pDocument, ".uno:ViewRowColumnHeaders"); std::stringstream aStream(pValues); free(pValues); assert(!aStream.str().empty()); boost::property_tree::ptree aTree; boost::property_tree::read_json(aStream, aTree); + + rWindow.m_pRowBar->m_aHeaders.clear(); for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("rows")) { Header aHeader(std::atoi(rValue.second.get<std::string>("size").c_str()), rValue.second.get<std::string>("text")); - m_aHeaders.push_back(aHeader); + rWindow.m_pRowBar->m_aHeaders.push_back(aHeader); + } + gtk_widget_show(rWindow.m_pRowBar->m_pDrawingArea); + gtk_widget_queue_draw(rWindow.m_pRowBar->m_pDrawingArea); + + rWindow.m_pColumnBar->m_aHeaders.clear(); + for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("columns")) + { + Header aHeader(std::atoi(rValue.second.get<std::string>("size").c_str()), rValue.second.get<std::string>("text")); + rWindow.m_pColumnBar->m_aHeaders.push_back(aHeader); } - gtk_widget_show(m_pDrawingArea); - gtk_widget_queue_draw(m_pDrawingArea); + gtk_widget_show(rWindow.m_pColumnBar->m_pDrawingArea); + gtk_widget_queue_draw(rWindow.m_pColumnBar->m_pDrawingArea); } return TRUE; @@ -916,17 +944,22 @@ static GtkWidget* createWindow(TiledWindow& rWindow) gtk_box_pack_end(GTK_BOX(rWindow.m_pVBox), rWindow.m_pFindbar, FALSE, FALSE, 0); - // Horizontal box for the row bar + doc view. - GtkWidget* pHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), pHBox); - rWindow.m_pRowBar.reset(new TiledRowBar(rWindow.m_pDocView)); - gtk_box_pack_start(GTK_BOX(pHBox), rWindow.m_pRowBar->m_pDrawingArea, FALSE, FALSE, 0); + // Grid for the row/column bar + doc view. + GtkWidget* pGrid = gtk_grid_new(); + gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), pGrid); + rWindow.m_pRowBar.reset(new TiledRowColumnBar(TiledRowColumnBar::ROW)); + // "A2" cell of the grid. + gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pRowBar->m_pDrawingArea, 0, 1, 1, 1); + rWindow.m_pColumnBar.reset(new TiledRowColumnBar(TiledRowColumnBar::COLUMN)); + // "B1" cell of the grid. + gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pColumnBar->m_pDrawingArea, 1, 0, 1, 1); // Scrolled window for DocView rWindow.m_pScrolledWindow = gtk_scrolled_window_new(0, 0); gtk_widget_set_hexpand(rWindow.m_pScrolledWindow, TRUE); gtk_widget_set_vexpand(rWindow.m_pScrolledWindow, TRUE); - gtk_container_add(GTK_CONTAINER(pHBox), rWindow.m_pScrolledWindow); + // "B2" cell of the grid + gtk_grid_attach(GTK_GRID(pGrid), rWindow.m_pScrolledWindow, 1, 1, 1, 1); gtk_container_add(GTK_CONTAINER(rWindow.m_pScrolledWindow), rWindow.m_pDocView); @@ -943,10 +976,12 @@ static GtkWidget* createWindow(TiledWindow& rWindow) gtk_widget_show_all(pWindow); // Hide the findbar by default. gtk_widget_hide(rWindow.m_pFindbar); - // Same for the row bar. + // Same for the row/column bar. gtk_widget_hide(rWindow.m_pRowBar->m_pDrawingArea); + gtk_widget_hide(rWindow.m_pColumnBar->m_pDrawingArea); g_aWindows[pWindow] = rWindow; + g_signal_connect(rWindow.m_pDocView, "configure-event", G_CALLBACK(TiledRowColumnBar::docConfigureEvent), 0); return pWindow; } commit ac47e5758e56ac30d98c1d6386dfad24ac59b1f6 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Oct 30 13:57:28 2015 +0100 ScTabView::getRowColumnHeaders: include info about columns, too Change-Id: Id7db9fa9b451dcf2423142b38c2c12b369e16fae diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index aa50aaf..f35500c 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -2300,8 +2300,20 @@ OUString ScTabView::getRowColumnHeaders() aRows.push_back(std::make_pair("", aRow)); } + boost::property_tree::ptree aCols; + for (SCCOL nCol = 0; nCol < nEndCol; ++nCol) + { + boost::property_tree::ptree aCol; + sal_uInt16 nSize = pColBar[SC_SPLIT_LEFT]->GetEntrySize(nCol); + aCol.put("size", OString::number(nSize).getStr()); + OUString aText = pColBar[SC_SPLIT_LEFT]->GetEntryText(nCol); + aCol.put("text", aText.toUtf8().getStr()); + aCols.push_back(std::make_pair("", aCol)); + } + boost::property_tree::ptree aTree; aTree.add_child("rows", aRows); + aTree.add_child("columns", aCols); std::stringstream aStream; boost::property_tree::write_json(aStream, aTree); return OUString::fromUtf8(aStream.str().c_str()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits