From 34e6b6a7c1d3f6f7eaabe168e993b05049e7f0a4 Mon Sep 17 00:00:00 2001 From: Irgaliev Amin Date: Wed, 13 Aug 2025 20:22:21 +0400 Subject: [PATCH] tdf#79356 - Adding connector support for Calc. Currently, the connector functionality in Calc is only available after copying such lines from Draw. This patch adds connector functionality directly to Calc. This functionality is available in: 1. "Insert" -> "Shape" -> "Connectors" in Standart Toolbar (UI variants) 2. "Insert" -> "Connectors" in Tabbed (UI variants) Change-Id: Icae023bf123e867dbef152789d1a015ea0dfe52d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189266 Reviewed-by: Mike Kaganski Tested-by: Jenkins --- .../openoffice/Office/UI/CalcWindowState.xcu | 14 +++ sc/UIConfig_scalc.mk | 1 + sc/sdi/drawsh.sdi | 1 + sc/sdi/tabvwsh.sdi | 30 +++++ sc/source/ui/drawfunc/fuconrec.cxx | 107 ++++++++++++++++++ sc/source/ui/drawfunc/fudraw.cxx | 1 + sc/source/ui/view/tabvwsh2.cxx | 56 +++++++++ sc/uiconfig/scalc/menubar/menubar.xml | 1 + sc/uiconfig/scalc/toolbar/connectorsbar.xml | 55 +++++++++ sc/uiconfig/scalc/toolbar/drawbar.xml | 1 + sc/uiconfig/scalc/ui/notebookbar.ui | 14 +-- sc/uiconfig/scalc/ui/notebookbar_compact.ui | 10 ++ .../ui/notebookbar_groupedbar_compact.ui | 10 ++ .../scalc/ui/notebookbar_groupedbar_full.ui | 10 ++ static/CustomTarget_emscripten_fs_image.mk | 1 + 15 files changed, 300 insertions(+), 12 deletions(-) create mode 100644 sc/uiconfig/scalc/toolbar/connectorsbar.xml diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcWindowState.xcu b/officecfg/registry/data/org/openoffice/Office/UI/CalcWindowState.xcu index 7644f820ffb9..e65410a844fd 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/CalcWindowState.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcWindowState.xcu @@ -708,6 +708,20 @@ false + + + false + + + Connectors + + + false + + + true + + false diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk index 2be15a1a6618..84ff69d9bc3e 100644 --- a/sc/UIConfig_scalc.mk +++ b/sc/UIConfig_scalc.mk @@ -56,6 +56,7 @@ $(eval $(call gb_UIConfig_add_toolbarfiles,modules/scalc,\ sc/uiconfig/scalc/toolbar/calloutshapes \ sc/uiconfig/scalc/toolbar/classificationbar \ sc/uiconfig/scalc/toolbar/colorbar \ + sc/uiconfig/scalc/toolbar/connectorsbar \ sc/uiconfig/scalc/toolbar/datastreams \ sc/uiconfig/scalc/toolbar/drawbar \ sc/uiconfig/scalc/toolbar/drawobjectbar \ diff --git a/sc/sdi/drawsh.sdi b/sc/sdi/drawsh.sdi index 03c12d686240..35e8093ba3b7 100644 --- a/sc/sdi/drawsh.sdi +++ b/sc/sdi/drawsh.sdi @@ -90,6 +90,7 @@ interface TableDraw SID_ATTRIBUTES_AREA [ ExecMethod = ExecDrawAttr; StateMethod = GetAttrFuncState; ] SID_ATTRIBUTES_LINE [ ExecMethod = ExecDrawAttr; StateMethod = GetAttrFuncState; ] SID_MEASURE_DLG [ ExecMethod = ExecDrawAttr; StateMethod = GetAttrFuncState; ] + SID_CONNECTION_DLG [ ExecMethod = ExecDrawAttr; StateMethod = GetAttrFuncState; ] SID_ATTR_TRANSFORM [ ExecMethod = ExecDrawAttr; StateMethod = GetDrawFuncState; ] // For the sidebar diff --git a/sc/sdi/tabvwsh.sdi b/sc/sdi/tabvwsh.sdi index af9f3458b0d1..6caab24fd665 100644 --- a/sc/sdi/tabvwsh.sdi +++ b/sc/sdi/tabvwsh.sdi @@ -125,6 +125,36 @@ interface BaseSelection SID_DRAWTBX_CS_STAR [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] SID_DRAW_CS_ID [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_DRAWTBX_CONNECTORS [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_TOOL_CONNECTOR [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_ARROW_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_ARROW_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_ARROWS [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CIRCLE_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CIRCLE_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CIRCLES [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINE [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINE_ARROW_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINE_ARROW_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINE_ARROWS [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINE_CIRCLE_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINE_CIRCLE_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINE_CIRCLES [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CURVE [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CURVE_ARROW_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CURVE_ARROW_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CURVE_ARROWS [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CURVE_CIRCLE_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CURVE_CIRCLE_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_CURVE_CIRCLES [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINES [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINES_ARROW_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINES_ARROW_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINES_ARROWS [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINES_CIRCLE_START [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINES_CIRCLE_END [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_CONNECTOR_LINES_CIRCLES [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] + SID_FM_CREATE_CONTROL [ ExecMethod = ExecDraw ; ] SID_LINKS [ ExecMethod = ExecDrawIns; StateMethod = GetDrawInsState; ] SID_DRAW_CHART [ ExecMethod = ExecDraw; StateMethod = GetDrawState; ] diff --git a/sc/source/ui/drawfunc/fuconrec.cxx b/sc/source/ui/drawfunc/fuconrec.cxx index 1829bccfc969..1b5ab78496ce 100644 --- a/sc/source/ui/drawfunc/fuconrec.cxx +++ b/sc/source/ui/drawfunc/fuconrec.cxx @@ -151,6 +151,39 @@ void FuConstRectangle::Activate() aObjKind = SdrObjKind::Caption; break; + case SID_TOOL_CONNECTOR: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: + aNewPointer = PointerStyle::DrawConnect; + aObjKind = SdrObjKind::Edge; + pView->SetEditMode(SdrViewEditMode::Create); + break; + default: aNewPointer = PointerStyle::Cross; aObjKind = SdrObjKind::Rectangle; @@ -172,6 +205,38 @@ void FuConstRectangle::SetLineEnds(SfxItemSet& rAttr, const SdrObject& rObj, sal void FuConstRectangle::Deactivate() { + sal_uInt16 nSlotId = aSfxRequest.GetSlot(); + if( nSlotId == SID_TOOL_CONNECTOR || + nSlotId == SID_CONNECTOR_ARROW_START || + nSlotId == SID_CONNECTOR_ARROW_END || + nSlotId == SID_CONNECTOR_ARROWS || + nSlotId == SID_CONNECTOR_CIRCLE_START || + nSlotId == SID_CONNECTOR_CIRCLE_END || + nSlotId == SID_CONNECTOR_CIRCLES || + nSlotId == SID_CONNECTOR_LINE || + nSlotId == SID_CONNECTOR_LINE_ARROW_START || + nSlotId == SID_CONNECTOR_LINE_ARROW_END || + nSlotId == SID_CONNECTOR_LINE_ARROWS || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINE_CIRCLES || + nSlotId == SID_CONNECTOR_CURVE || + nSlotId == SID_CONNECTOR_CURVE_ARROW_START || + nSlotId == SID_CONNECTOR_CURVE_ARROW_END || + nSlotId == SID_CONNECTOR_CURVE_ARROWS || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END || + nSlotId == SID_CONNECTOR_CURVE_CIRCLES || + nSlotId == SID_CONNECTOR_LINES || + nSlotId == SID_CONNECTOR_LINES_ARROW_START || + nSlotId == SID_CONNECTOR_LINES_ARROW_END || + nSlotId == SID_CONNECTOR_LINES_ARROWS || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINES_CIRCLES ) + { + pView->SetEditMode(SdrViewEditMode::Edit); + } FuConstruct::Deactivate(); rViewShell.SetActivePointer( aOldPointer ); } @@ -263,6 +328,48 @@ rtl::Reference FuConstRectangle::CreateDefaultObject(const sal_uInt16 break; } + case SID_TOOL_CONNECTOR: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: + { + if( auto pEdgeObj = dynamic_cast< SdrEdgeObj *>( pObj.get() ) ) + { + pEdgeObj->SetTailPoint(false, aStart); + pEdgeObj->SetTailPoint(true, aEnd); + } + else + { + OSL_FAIL("Object is NO connector object"); + } + + break; + } + default: { pObj->SetLogicRect(aRect); diff --git a/sc/source/ui/drawfunc/fudraw.cxx b/sc/source/ui/drawfunc/fudraw.cxx index e352fce10c89..4ca3c2dcf3e4 100644 --- a/sc/source/ui/drawfunc/fudraw.cxx +++ b/sc/source/ui/drawfunc/fudraw.cxx @@ -136,6 +136,7 @@ bool FuDraw::MouseButtonDown(const MouseEvent& rMEvt) bool FuDraw::MouseMove(const MouseEvent& rMEvt) { + pView->GetSfxViewShell()->GetDrawView()->MouseMove(rMEvt, pWindow->GetOutDev()); // evaluate modifiers only if in a drawing layer action // (don't interfere with keyboard shortcut handling) if (pView->IsAction()) diff --git a/sc/source/ui/view/tabvwsh2.cxx b/sc/source/ui/view/tabvwsh2.cxx index 3aa9ff0a101d..fab217cf4fc3 100644 --- a/sc/source/ui/view/tabvwsh2.cxx +++ b/sc/source/ui/view/tabvwsh2.cxx @@ -232,6 +232,34 @@ void ScTabViewShell::ExecDraw(SfxRequest& rReq) case SID_DRAW_RECT: case SID_DRAW_ELLIPSE: case SID_DRAW_MEASURELINE: + case SID_TOOL_CONNECTOR: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: pTabView->SetDrawFuncPtr(new FuConstRectangle(*this, pWin, pView, rModel, aNewReq)); bCreateDirectly = comphelper::LibreOfficeKit::isActive(); break; @@ -431,6 +459,34 @@ void ScTabViewShell::GetDrawState(SfxItemSet &rSet) case SID_DRAW_TEXT: case SID_DRAW_TEXT_MARQUEE: case SID_DRAW_CAPTION: + case SID_TOOL_CONNECTOR: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: rSet.Put( SfxBoolItem( nWhich, nDrawSfxId == nWhich ) ); break; diff --git a/sc/uiconfig/scalc/menubar/menubar.xml b/sc/uiconfig/scalc/menubar/menubar.xml index 9f29e6b0cbe7..423215858319 100644 --- a/sc/uiconfig/scalc/menubar/menubar.xml +++ b/sc/uiconfig/scalc/menubar/menubar.xml @@ -243,6 +243,7 @@ + diff --git a/sc/uiconfig/scalc/toolbar/connectorsbar.xml b/sc/uiconfig/scalc/toolbar/connectorsbar.xml new file mode 100644 index 000000000000..8355775e2a9c --- /dev/null +++ b/sc/uiconfig/scalc/toolbar/connectorsbar.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sc/uiconfig/scalc/toolbar/drawbar.xml b/sc/uiconfig/scalc/toolbar/drawbar.xml index 2e20e0c98915..310d4ee36844 100644 --- a/sc/uiconfig/scalc/toolbar/drawbar.xml +++ b/sc/uiconfig/scalc/toolbar/drawbar.xml @@ -21,6 +21,7 @@ + diff --git a/sc/uiconfig/scalc/ui/notebookbar.ui b/sc/uiconfig/scalc/ui/notebookbar.ui index ffe980ce2baa..1f0d3782298e 100644 --- a/sc/uiconfig/scalc/ui/notebookbar.ui +++ b/sc/uiconfig/scalc/ui/notebookbar.ui @@ -5402,19 +5402,9 @@ - + True - .uno:Polygon_Unfilled - - - False - True - - - - - True - .uno:Bezier_Unfilled + .uno:ConnectorToolbox False diff --git a/sc/uiconfig/scalc/ui/notebookbar_compact.ui b/sc/uiconfig/scalc/ui/notebookbar_compact.ui index 0ed02fc4c71e..242aa8009fda 100644 --- a/sc/uiconfig/scalc/ui/notebookbar_compact.ui +++ b/sc/uiconfig/scalc/ui/notebookbar_compact.ui @@ -5404,6 +5404,16 @@ True + + + True + .uno:ConnectorToolbox + + + False + True + + True diff --git a/sc/uiconfig/scalc/ui/notebookbar_groupedbar_compact.ui b/sc/uiconfig/scalc/ui/notebookbar_groupedbar_compact.ui index 831699851d6a..7c35db8f341f 100644 --- a/sc/uiconfig/scalc/ui/notebookbar_groupedbar_compact.ui +++ b/sc/uiconfig/scalc/ui/notebookbar_groupedbar_compact.ui @@ -6403,6 +6403,16 @@ False + + + True + .uno:ConnectorToolbox + + + False + True + + True diff --git a/sc/uiconfig/scalc/ui/notebookbar_groupedbar_full.ui b/sc/uiconfig/scalc/ui/notebookbar_groupedbar_full.ui index 9caf60e83aaf..082c0c7fc7b0 100644 --- a/sc/uiconfig/scalc/ui/notebookbar_groupedbar_full.ui +++ b/sc/uiconfig/scalc/ui/notebookbar_groupedbar_full.ui @@ -7503,6 +7503,16 @@ True + + + True + .uno:ConnectorToolbox + + + False + True + + True diff --git a/static/CustomTarget_emscripten_fs_image.mk b/static/CustomTarget_emscripten_fs_image.mk index 196065d7eaf2..018f8333be22 100644 --- a/static/CustomTarget_emscripten_fs_image.mk +++ b/static/CustomTarget_emscripten_fs_image.mk @@ -1174,6 +1174,7 @@ gb_emscripten_fs_image_files += \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/modules/scalc/popupmenu/sparkline.xml \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/modules/scalc/statusbar/statusbar.xml \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/modules/scalc/toolbar/alignmentbar.xml \ + $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/modules/scalc/toolbar/connectorsbar.xml \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/modules/scalc/toolbar/arrowsbar.xml \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/modules/scalc/toolbar/arrowshapes.xml \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/modules/scalc/toolbar/basicshapes.xml \