[Libreoffice-commits] core.git: cui/source include/svtools include/svx sc/source svtools/source

Kohei Yoshida kohei.yoshida at collabora.com
Wed Jan 22 16:57:45 PST 2014


 cui/source/inc/border.hxx          |    8 ++-
 cui/source/tabpages/border.cxx     |   88 ++++++++++++++++++++++++-------------
 include/svtools/ctrlbox.hxx        |    9 ++-
 include/svx/svxids.hrc             |    4 +
 sc/source/ui/view/tabvwsha.cxx     |   18 +++++++
 svtools/source/control/ctrlbox.cxx |    9 +--
 6 files changed, 96 insertions(+), 40 deletions(-)

New commits:
commit 3d9545757246c20d261db0723f70dd91f92d3519
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed Jan 22 16:31:49 2014 -0500

    Only allow approved border styles in cell borders.
    
    Line styles such as inset, outset, embossed etc are not supportable in Calc.
    So, don't show them in the UI.
    
    Change-Id: Ie7be74193d01e13a79132a979e2d9a2e4d06de3f

diff --git a/cui/source/inc/border.hxx b/cui/source/inc/border.hxx
index 793d584..f0bb77b 100644
--- a/cui/source/inc/border.hxx
+++ b/cui/source/inc/border.hxx
@@ -26,6 +26,9 @@
 #include <svtools/valueset.hxx>
 #include <sfx2/tabdlg.hxx>
 #include <svx/frmsel.hxx>
+#include <svx/flagsdef.hxx>
+
+#include <set>
 
 // forward ---------------------------------------------------------------
 
@@ -34,7 +37,6 @@ namespace editeng
     class SvxBorderLine;
 }
 
-#include <svx/flagsdef.hxx>
 
 class SvxBorderTabPage : public SfxTabPage
 {
@@ -106,6 +108,8 @@ private:
     bool                mbUseMarginItem;
     bool                mbSync;
 
+    std::set<sal_Int16> maUsedBorderStyles;
+
     // Handler
     DECL_LINK( SelStyleHdl_Impl, ListBox* pLb );
     DECL_LINK( SelColHdl_Impl, ListBox* pLb );
@@ -130,6 +134,8 @@ private:
     void                ResetFrameLine_Impl( svx::FrameBorderType eBorder,
                                              const editeng::SvxBorderLine* pCurLine,
                                              bool bValid );
+
+    bool IsBorderLineStyleAllowed( sal_Int16 nStyle ) const;
 };
 
 
diff --git a/cui/source/tabpages/border.cxx b/cui/source/tabpages/border.cxx
index 87c5e24..e54f266 100644
--- a/cui/source/tabpages/border.cxx
+++ b/cui/source/tabpages/border.cxx
@@ -39,6 +39,7 @@
 #include "svx/flagsdef.hxx"
 #include <sfx2/request.hxx>
 #include <svl/intitem.hxx>
+#include <svl/ilstitem.hxx>
 #include <sfx2/itemconnect.hxx>
 #include <sal/macros.h>
 #include "borderconn.hxx"
@@ -155,6 +156,16 @@ SvxBorderTabPage::SvxBorderTabPage(Window* pParent, const SfxItemSet& rCoreAttrs
             is needed across various functions... */
     mbUseMarginItem = rCoreAttrs.GetItemState(GetWhich(SID_ATTR_ALIGN_MARGIN),sal_True) != SFX_ITEM_UNKNOWN;
 
+    const SfxPoolItem* pItem = NULL;
+    if (rCoreAttrs.HasItem(SID_ATTR_BORDER_STYLES, &pItem))
+    {
+        const SfxIntegerListItem* p = static_cast<const SfxIntegerListItem*>(pItem);
+        std::vector<sal_Int32> aUsedStyles;
+        p->GetList(aUsedStyles);
+        for (size_t i = 0, n = aUsedStyles.size(); i < n; ++i)
+            maUsedBorderStyles.insert(static_cast<sal_Int16>(aUsedStyles[i]));
+    }
+
     // set metric
     FieldUnit eFUnit = GetModuleFieldUnit( rCoreAttrs );
 
@@ -268,7 +279,7 @@ SvxBorderTabPage::SvxBorderTabPage(Window* pParent, const SfxItemSet& rCoreAttrs
 
     if ( pDocSh )
     {
-        const SfxPoolItem* pItem = pDocSh->GetItem( SID_COLOR_TABLE );
+        pItem = pDocSh->GetItem( SID_COLOR_TABLE );
         if ( pItem != NULL )
             pColorTable = ( (SvxColorListItem*)pItem )->GetColorList();
     }
@@ -348,6 +359,15 @@ void SvxBorderTabPage::ResetFrameLine_Impl( svx::FrameBorderType eBorder, const
     }
 }
 
+bool SvxBorderTabPage::IsBorderLineStyleAllowed( sal_Int16 nStyle ) const
+{
+    if (maUsedBorderStyles.empty())
+        // All border styles are allowed.
+        return true;
+
+    return maUsedBorderStyles.count(nStyle) > 0;
+}
+
 // -----------------------------------------------------------------------
 
 void SvxBorderTabPage::Reset( const SfxItemSet& rSet )
@@ -1001,38 +1021,48 @@ void SvxBorderTabPage::FillLineListBox_Impl()
 {
     using namespace ::com::sun::star::table::BorderLineStyle;
 
+    struct {
+        sal_Int16 mnStyle;
+        long mnMinWidth;
+        LineListBox::ColorFunc mpColor1Fn;
+        LineListBox::ColorFunc mpColor2Fn;
+        LineListBox::ColorDistFunc mpColorDistFn;
+    } aLines[] = {
+        // Simple lines
+        { SOLID,       0, &sameColor, &sameColor, &sameDistColor },
+        { DOTTED,      0, &sameColor, &sameColor, &sameDistColor },
+        { DASHED,      0, &sameColor, &sameColor, &sameDistColor },
+        { FINE_DASHED, 0, &sameColor, &sameColor, &sameDistColor },
+
+        // Double lines
+        { DOUBLE,              10, &sameColor, &sameColor, &sameDistColor },
+        { THINTHICK_SMALLGAP,  20, &sameColor, &sameColor, &sameDistColor },
+        { THINTHICK_MEDIUMGAP,  0, &sameColor, &sameColor, &sameDistColor },
+        { THINTHICK_LARGEGAP,   0, &sameColor, &sameColor, &sameDistColor },
+        { THICKTHIN_SMALLGAP,  20, &sameColor, &sameColor, &sameDistColor },
+        { THICKTHIN_MEDIUMGAP,  0, &sameColor, &sameColor, &sameDistColor },
+        { THICKTHIN_LARGEGAP,   0, &sameColor, &sameColor, &sameDistColor },
+
+        { EMBOSSED, 15, &SvxBorderLine::threeDLightColor, &SvxBorderLine::threeDDarkColor, &lcl_mediumColor },
+        { ENGRAVED, 15, &SvxBorderLine::threeDDarkColor, &SvxBorderLine::threeDLightColor, &lcl_mediumColor },
+
+        { OUTSET, 10, &SvxBorderLine::lightColor, &SvxBorderLine::darkColor, &sameDistColor },
+        { INSET,  10, &SvxBorderLine::darkColor, &SvxBorderLine::lightColor, &sameDistColor }
+    };
+
     m_pLbLineStyle->SetSourceUnit( FUNIT_TWIP );
 
     m_pLbLineStyle->SetNone( SVX_RESSTR( RID_SVXSTR_NONE ) );
 
-    // Simple lines
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( SOLID ), SOLID );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( DOTTED ), DOTTED );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( DASHED ), DASHED );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( FINE_DASHED ), FINE_DASHED );
-
-    // Double lines
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( DOUBLE ), DOUBLE );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( THINTHICK_SMALLGAP ), THINTHICK_SMALLGAP, 20 );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( THINTHICK_MEDIUMGAP ), THINTHICK_MEDIUMGAP );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( THINTHICK_LARGEGAP ), THINTHICK_LARGEGAP );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( THICKTHIN_SMALLGAP ), THICKTHIN_SMALLGAP, 20 );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( THICKTHIN_MEDIUMGAP ), THICKTHIN_MEDIUMGAP );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( THICKTHIN_LARGEGAP ), THICKTHIN_LARGEGAP );
-
-    // Engraved / Embossed
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( EMBOSSED ), EMBOSSED, 15,
-            &SvxBorderLine::threeDLightColor, &SvxBorderLine::threeDDarkColor,
-            &lcl_mediumColor );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( ENGRAVED ), ENGRAVED, 15,
-            &SvxBorderLine::threeDDarkColor, &SvxBorderLine::threeDLightColor,
-            &lcl_mediumColor );
-
-    // Inset / Outset
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( OUTSET ), OUTSET, 10,
-           &SvxBorderLine::lightColor, &SvxBorderLine::darkColor );
-    m_pLbLineStyle->InsertEntry( SvxBorderLine::getWidthImpl( INSET ), INSET, 10,
-           &SvxBorderLine::darkColor, &SvxBorderLine::lightColor );
+    for (size_t i = 0, n = SAL_N_ELEMENTS(aLines); i < n; ++i)
+    {
+        if (!IsBorderLineStyleAllowed(aLines[i].mnStyle))
+            continue;
+
+        m_pLbLineStyle->InsertEntry(
+            SvxBorderLine::getWidthImpl(aLines[i].mnStyle), aLines[i].mnStyle,
+            aLines[i].mnMinWidth, aLines[i].mpColor1Fn, aLines[i].mpColor2Fn, aLines[i].mpColorDistFn);
+    }
 
     sal_Int64 nVal = static_cast<sal_Int64>(MetricField::ConvertDoubleValue(
                 m_pLineWidthMF->GetValue( ),
diff --git a/include/svtools/ctrlbox.hxx b/include/svtools/ctrlbox.hxx
index 29fee68..6b8cc8f 100644
--- a/include/svtools/ctrlbox.hxx
+++ b/include/svtools/ctrlbox.hxx
@@ -310,6 +310,9 @@ class SVT_DLLPUBLIC LineListBox : public ListBox
     sal_uInt16           GetStylePos( sal_uInt16 nListPos, long nWidth );
 
 public:
+    typedef Color (*ColorFunc)(Color);
+    typedef Color (*ColorDistFunc)(Color, Color);
+
                     LineListBox( Window* pParent, WinBits nWinStyle = WB_BORDER );
     virtual         ~LineListBox();
 
@@ -323,9 +326,9 @@ public:
     /** Insert a listbox entry with all widths in Twips. */
     void            InsertEntry( BorderWidthImpl aWidthImpl,
                         sal_uInt16 nStyle, long nMinWidth = 0,
-                        Color (*pColor1Fn)(Color) = &sameColor,
-                        Color (*pColor2Fn)( Color ) = &sameColor,
-                        Color (*pColorDistFn)( Color, Color ) = &sameDistColor );
+                        ColorFunc pColor1Fn = &sameColor,
+                        ColorFunc pColor2Fn = &sameColor,
+                        ColorDistFunc pColorDistFn = &sameDistColor );
 
     using ListBox::RemoveEntry;
     virtual void    RemoveEntry( sal_uInt16 nPos );
diff --git a/include/svx/svxids.hrc b/include/svx/svxids.hrc
index 307ce14..1e3f829 100644
--- a/include/svx/svxids.hrc
+++ b/include/svx/svxids.hrc
@@ -957,9 +957,11 @@
 #define SID_SW_ATTR_FILL_STYLE                          ( SID_SVX_START + 1138 )
 #define SID_SW_ATTR_FILL_GRADIENT                       ( SID_SVX_START + 1139 )
 
+#define SID_ATTR_BORDER_STYLES                          ( SID_SVX_START + 1140 )
+
 
 // IMPORTANT NOTE: adjust SID_SVX_FIRSTFREE, when adding new slot id
-#define SID_SVX_FIRSTFREE                               (SID_SW_ATTR_FILL_GRADIENT + 1)
+#define SID_SVX_FIRSTFREE                               (SID_ATTR_BORDER_STYLES + 1)
 
 // --------------------------------------------------------------------------
 // Overflow check for slot IDs
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index 9c064bd..a666a3f 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -24,6 +24,7 @@
 #include <editeng/boxitem.hxx>
 #include <svx/numinf.hxx>
 #include <svl/srchitem.hxx>
+#include <svl/ilstitem.hxx>
 #include <svx/zoomslideritem.hxx>
 #include <sfx2/bindings.hxx>
 #include <sfx2/viewfrm.hxx>
@@ -53,8 +54,12 @@
 #include "cellvalue.hxx"
 #include "tokenarray.hxx"
 
+#include <com/sun/star/table/BorderLineStyle.hpp>
+
 #include <boost/scoped_ptr.hpp>
 
+using namespace com::sun::star;
+
 sal_Bool ScTabViewShell::GetFunction( OUString& rFuncStr, sal_uInt16 nErrCode )
 {
     OUString aStr;
@@ -475,6 +480,19 @@ void ScTabViewShell::ExecuteCellFormatDlg(SfxRequest& rReq, const OString &rName
     boost::scoped_ptr<SfxItemSet> pOldSet(new SfxItemSet(pOldAttrs->GetItemSet()));
     boost::scoped_ptr<SvxNumberInfoItem> pNumberInfoItem;
 
+    // We only allow these border line types.
+    std::vector<sal_Int32> aBorderStyles;
+    aBorderStyles.reserve(5);
+    aBorderStyles.push_back(table::BorderLineStyle::SOLID);
+    aBorderStyles.push_back(table::BorderLineStyle::DOTTED);
+    aBorderStyles.push_back(table::BorderLineStyle::DASHED);
+    aBorderStyles.push_back(table::BorderLineStyle::FINE_DASHED);
+    aBorderStyles.push_back(table::BorderLineStyle::DOUBLE);
+
+    SfxIntegerListItem aBorderStylesItem(SID_ATTR_BORDER_STYLES, aBorderStyles);
+    pOldSet->MergeRange(SID_ATTR_BORDER_STYLES, SID_ATTR_BORDER_STYLES);
+    pOldSet->Put(aBorderStylesItem);
+
     // Get border items and put them in the set:
     GetSelectionFrame( aLineOuter, aLineInner );
     //Fix border incorrect for RTL fdo#62399
diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx
index 47012cd..36fe26d 100644
--- a/svtools/source/control/ctrlbox.cxx
+++ b/svtools/source/control/ctrlbox.cxx
@@ -839,14 +839,11 @@ sal_uInt16 LineListBox::InsertEntry( const OUString& rStr, sal_uInt16 nPos )
 // -----------------------------------------------------------------------
 
 void LineListBox::InsertEntry(
-        BorderWidthImpl aWidthImpl,
-        sal_uInt16 nStyle, long nMinWidth,
-        Color ( *pColor1Fn )( Color ), Color ( *pColor2Fn )( Color ),
-        Color ( *pColorDistFn )( Color, Color ) )
+    BorderWidthImpl aWidthImpl, sal_uInt16 nStyle, long nMinWidth,
+    ColorFunc pColor1Fn, ColorFunc pColor2Fn, ColorDistFunc pColorDistFn )
 {
     ImpLineListData* pData = new ImpLineListData(
-            aWidthImpl, nStyle, nMinWidth,
-           pColor1Fn, pColor2Fn, pColorDistFn );
+        aWidthImpl, nStyle, nMinWidth, pColor1Fn, pColor2Fn, pColorDistFn);
     pLineList->push_back( pData );
 }
 


More information about the Libreoffice-commits mailing list