teach FrameSelector to be resizable

Change-Id: I0fd91d707b89197d57dc6eaf7dcebfdb055d73c6
diff --git a/svx/inc/svx/frmsel.hxx b/svx/inc/svx/frmsel.hxx
index 4f0a48e..9a8ec15 100644
--- a/svx/inc/svx/frmsel.hxx
+++ b/svx/inc/svx/frmsel.hxx
@@ -84,6 +84,7 @@ class SVX_DLLPUBLIC FrameSelector : public Control
{
public:
    explicit            FrameSelector( Window* pParent, const ResId& rResId );
    FrameSelector(Window* pParent);
    virtual             ~FrameSelector();

    /** Initializes the control, enables/disables frame borders according to flags. */
@@ -186,6 +187,8 @@ protected:
    virtual void        GetFocus();
    virtual void        LoseFocus();
    virtual void        DataChanged( const DataChangedEvent& rDCEvt );
    virtual void        Resize();
    virtual Size        GetOptimalSize() const;

private:
    std::auto_ptr< FrameSelectorImpl > mxImpl;
diff --git a/svx/source/dialog/frmsel.cxx b/svx/source/dialog/frmsel.cxx
index be955c3..5772e13 100644
--- a/svx/source/dialog/frmsel.cxx
+++ b/svx/source/dialog/frmsel.cxx
@@ -18,6 +18,7 @@
 */

#include <svx/frmsel.hxx>
#include <vcl/builder.hxx>

#include <algorithm>
#include <math.h>
@@ -374,6 +375,13 @@ void FrameSelectorImpl::InitBorderGeometry()
    /*  Width for focus rectangles from center of frame borders. */
    mnFocusOffs = FRAMESEL_GEOM_WIDTH / 2 + 1;

    maLeft.ClearFocusArea();
    maVer.ClearFocusArea();
    maRight.ClearFocusArea();
    maTop.ClearFocusArea();
    maHor.ClearFocusArea();
    maBottom.ClearFocusArea();

    maLeft.AddFocusPolygon(   Rectangle( mnLine1 - mnFocusOffs, mnLine1 - mnFocusOffs, mnLine1 + mnFocusOffs, mnLine3 + mnFocusOffs ) );
    maVer.AddFocusPolygon(    Rectangle( mnLine2 - mnFocusOffs, mnLine1 - mnFocusOffs, mnLine2 + mnFocusOffs, mnLine3 + mnFocusOffs ) );
    maRight.AddFocusPolygon(  Rectangle( mnLine3 - mnFocusOffs, mnLine1 - mnFocusOffs, mnLine3 + mnFocusOffs, mnLine3 + mnFocusOffs ) );
@@ -477,6 +485,11 @@ void FrameSelectorImpl::InitVirtualDevice()
    InitColors();
    InitArrowImageList();

    sizeChanged();
}

void FrameSelectorImpl::sizeChanged()
{
    // initialize geometry
    InitGlobalGeometry();
    InitBorderGeometry();
@@ -773,6 +786,19 @@ FrameSelector::FrameSelector( Window* pParent, const ResId& rResId ) :
    EnableRTL( false ); // #107808# don't mirror the mouse handling
}

FrameSelector::FrameSelector(Window* pParent)
    : Control(pParent, WB_BORDER|WB_TABSTOP)
{
    // not in c'tor init list (avoid warning about usage of *this)
    mxImpl.reset( new FrameSelectorImpl( *this ) );
    EnableRTL( false ); // #107808# don't mirror the mouse handling
}

extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeSvxFrameSelector(Window *pParent, VclBuilder::stringmap &)
{
    return new FrameSelector(pParent);
}

FrameSelector::~FrameSelector()
{
}
@@ -1181,6 +1207,17 @@ void FrameSelector::DataChanged( const DataChangedEvent& rDCEvt )
        mxImpl->InitVirtualDevice();
}

void FrameSelector::Resize()
{
    Control::Resize();
    mxImpl->sizeChanged();
}

Size FrameSelector::GetOptimalSize() const
{
    return LogicToPixel(Size(61, 65), MAP_APPFONT);
}

// ============================================================================

template< typename Cont, typename Iter, typename Pred >
diff --git a/svx/source/inc/frmselimpl.hxx b/svx/source/inc/frmselimpl.hxx
index 26ac4d5..1b17756 100644
--- a/svx/source/inc/frmselimpl.hxx
+++ b/svx/source/inc/frmselimpl.hxx
@@ -163,6 +163,9 @@ struct FrameSelectorImpl : public Resource
    void                InitClickAreas();
    /** Draws the entire control into the internal virtual device. */
    void                InitVirtualDevice();
    /** call this to recalculate based on parent size */
    void                sizeChanged();


    // frame border access ----------------------------------------------------