weld DataEditor
Change-Id: I8b59140d2e2b0892f17159282a1aeb1a47008ba0
Reviewed-on: https://gerrit.libreoffice.org/79561
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/chart2/UIConfig_chart2.mk b/chart2/UIConfig_chart2.mk
index 59847fe..8f70348 100644
--- a/chart2/UIConfig_chart2.mk
+++ b/chart2/UIConfig_chart2.mk
@@ -40,9 +40,11 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/schart,\
chart2/uiconfig/ui/chardialog \
chart2/uiconfig/ui/chartdatadialog \
chart2/uiconfig/ui/charttypedialog \
chart2/uiconfig/ui/columnfragment \
chart2/uiconfig/ui/datarangedialog \
chart2/uiconfig/ui/dlg_DataLabel \
chart2/uiconfig/ui/dlg_InsertErrorBars \
chart2/uiconfig/ui/imagefragment \
chart2/uiconfig/ui/insertaxisdlg \
chart2/uiconfig/ui/insertgriddlg \
chart2/uiconfig/ui/inserttitledlg \
diff --git a/chart2/source/controller/dialogs/DataBrowser.cxx b/chart2/source/controller/dialogs/DataBrowser.cxx
index a698262..7252684 100644
--- a/chart2/source/controller/dialogs/DataBrowser.cxx
+++ b/chart2/source/controller/dialogs/DataBrowser.cxx
@@ -37,13 +37,14 @@
#include <vcl/layout.hxx>
#include <vcl/weld.hxx>
#include <vcl/settings.hxx>
#include <vcl/virdev.hxx>
#include <rtl/math.hxx>
#include <osl/diagnose.h>
#include <toolkit/helper/vclunohelper.hxx>
#include <com/sun/star/util/XCloneable.hpp>
#include <com/sun/star/chart2/XChartDocument.hpp>
#include <com/sun/star/chart2/XChartType.hpp>
#include <com/sun/star/container/XIndexReplace.hpp>
#include <algorithm>
@@ -90,27 +91,60 @@ namespace chart
namespace impl
{
class SeriesHeaderEdit : public Edit
class SeriesHeaderEdit
{
public:
explicit SeriesHeaderEdit( vcl::Window * pParent );
virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
explicit SeriesHeaderEdit(std::unique_ptr<weld::Entry> xControl);
void setStartColumn( sal_Int32 nStartColumn );
sal_Int32 getStartColumn() const { return m_nStartColumn;}
void SetShowWarningBox( bool bShowWarning );
OUString GetText() const { return m_xControl->get_text(); }
void SetText(const OUString& rText) { m_xControl->set_text(rText); }
bool HasFocus() const { return m_xControl->has_focus(); }
void Hide() { m_xControl->hide(); }
void Show() { m_xControl->show(); }
void set_size_request(int nWidth, int nHeight) { m_xControl->set_size_request(nWidth, nHeight); }
void set_margin_left(int nLeft) { m_xControl->set_margin_left(nLeft); }
void SetModifyHdl(const Link<SeriesHeaderEdit&,void>& rLink) { m_aModifyHdl = rLink; }
void SetGetFocusHdl(const Link<SeriesHeaderEdit&,void>& rLink) { m_aFocusInHdl = rLink; }
private:
DECL_LINK(NameEdited, weld::Entry&, void);
DECL_LINK(NameFocusIn, weld::Widget&, void);
DECL_LINK(MousePressHdl, const MouseEvent&, bool);
std::unique_ptr<weld::Entry> m_xControl;
Link<SeriesHeaderEdit&,void> m_aModifyHdl;
Link<SeriesHeaderEdit&,void> m_aFocusInHdl;
sal_Int32 m_nStartColumn;
bool m_bShowWarningBox;
};
SeriesHeaderEdit::SeriesHeaderEdit( vcl::Window * pParent ) :
Edit( pParent ),
m_nStartColumn( 0 ),
m_bShowWarningBox( false )
SeriesHeaderEdit::SeriesHeaderEdit(std::unique_ptr<weld::Entry> xControl)
: m_xControl(std::move(xControl))
, m_nStartColumn(0)
, m_bShowWarningBox(false)
{
SetHelpId(HID_SCH_DATA_SERIES_LABEL);
m_xControl->set_help_id(HID_SCH_DATA_SERIES_LABEL);
m_xControl->connect_changed(LINK(this, SeriesHeaderEdit, NameEdited));
m_xControl->connect_focus_in(LINK(this, SeriesHeaderEdit, NameFocusIn));
m_xControl->connect_mouse_press(LINK(this, SeriesHeaderEdit, MousePressHdl));
}
IMPL_LINK_NOARG(SeriesHeaderEdit, NameEdited, weld::Entry&, void)
{
m_aModifyHdl.Call(*this);
}
IMPL_LINK_NOARG(SeriesHeaderEdit, NameFocusIn, weld::Widget&, void)
{
m_aFocusInHdl.Call(*this);
}
void SeriesHeaderEdit::setStartColumn( sal_Int32 nStartColumn )
@@ -123,27 +157,27 @@ void SeriesHeaderEdit::SetShowWarningBox( bool bShowWarning )
m_bShowWarningBox = bShowWarning;
}
void SeriesHeaderEdit::MouseButtonDown( const MouseEvent& rMEvt )
IMPL_LINK_NOARG(SeriesHeaderEdit, MousePressHdl, const MouseEvent&, bool)
{
Edit::MouseButtonDown( rMEvt );
if( m_bShowWarningBox )
if (m_bShowWarningBox)
{
std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(GetFrameWeld(),
std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(m_xControl.get(),
VclMessageType::Warning, VclButtonsType::Ok,
SchResId(STR_INVALID_NUMBER)));
xWarn->run();
}
return false;
}
class SeriesHeader
{
public:
explicit SeriesHeader(vcl::Window * pParent, vcl::Window *pColorParent);
explicit SeriesHeader(weld::Container* pParent, weld::Container* pColorParent);
~SeriesHeader();
void SetColor( const Color & rCol );
void SetPos( const Point & rPos );
void SetPos();
void SetWidth( sal_Int32 nWidth );
void SetChartType( const Reference< chart2::XChartType > & xChartType,
bool bSwapXAndYAxis );
@@ -168,61 +202,75 @@ public:
*/
void applyChanges();
void SetGetFocusHdl( const Link<Control&,void>& rLink );
void SetGetFocusHdl(const Link<SeriesHeaderEdit&,void>& rLink);
void SetEditChangedHdl( const Link<SeriesHeaderEdit*,void> & rLink );
void SetEditChangedHdl( const Link<SeriesHeaderEdit&,void> & rLink );
bool HasFocus() const;
private:
VclPtr< FixedImage > m_spSymbol;
VclPtr< SeriesHeaderEdit > m_spSeriesName;
VclPtr< FixedText > m_spColorBar;
VclPtr< OutputDevice> m_pDevice;
Link<SeriesHeaderEdit*,void> m_aChangeLink;
Timer m_aUpdateDataTimer;
std::unique_ptr<weld::Builder> m_xBuilder1;
std::unique_ptr<weld::Builder> m_xBuilder2;
std::unique_ptr<weld::Container> m_xContainer1;
std::unique_ptr<weld::Container> m_xContainer2;
std::unique_ptr<weld::Image> m_spSymbol;
std::unique_ptr<SeriesHeaderEdit> m_spSeriesName;
std::unique_ptr<weld::Image> m_spColorBar;
VclPtr< OutputDevice> m_xDevice;
Link<SeriesHeaderEdit&,void> m_aChangeLink;
Color m_aColor;
void notifyChanges();
DECL_LINK( SeriesNameChanged, Edit&, void );
DECL_LINK( SeriesNameEdited, Edit&, void );
DECL_LINK( ImplUpdateDataHdl, Timer*, void );
DECL_LINK( SeriesNameEdited, SeriesHeaderEdit&, void );
static Image GetChartTypeImage(
static OUString GetChartTypeImage(
const Reference< chart2::XChartType > & xChartType,
bool bSwapXAndYAxis
);
sal_Int32 m_nStartCol, m_nEndCol;
sal_Int32 m_nWidth;
Point m_aPos;
bool m_bSeriesNameChangePending;
};
SeriesHeader::SeriesHeader( vcl::Window * pParent, vcl::Window *pColorParent ) :
m_spSymbol( VclPtr<FixedImage>::Create( pParent, WB_NOBORDER )),
m_spSeriesName( VclPtr<SeriesHeaderEdit>::Create( pParent )),
m_spColorBar( VclPtr<FixedText>::Create( pColorParent, WB_NOBORDER )),
m_pDevice( pParent ),
m_nStartCol( 0 ),
m_nEndCol( 0 ),
m_nWidth( 42 ),
m_aPos( 0, 22 ),
m_bSeriesNameChangePending( false )
SeriesHeader::SeriesHeader(weld::Container* pParent, weld::Container* pColorParent)
: m_aUpdateDataTimer("UpdateDataTimer")
, m_xBuilder1(Application::CreateBuilder(pParent, "modules/schart/ui/columnfragment.ui"))
, m_xBuilder2(Application::CreateBuilder(pColorParent, "modules/schart/ui/imagefragment.ui"))
, m_xContainer1(m_xBuilder1->weld_container("container"))
, m_xContainer2(m_xBuilder2->weld_container("container"))
, m_spSymbol(m_xBuilder1->weld_image("image"))
, m_spSeriesName(new SeriesHeaderEdit(m_xBuilder1->weld_entry("entry")))
, m_spColorBar(m_xBuilder2->weld_image("image"))
, m_xDevice(Application::GetDefaultDevice())
, m_nStartCol( 0 )
, m_nEndCol( 0 )
, m_nWidth( 42 )
, m_bSeriesNameChangePending( false )
{
m_spSeriesName->EnableUpdateData( 4 * EDIT_UPDATEDATA_TIMEOUT ); // define is in vcl/edit.hxx
m_spSeriesName->SetUpdateDataHdl( LINK( this, SeriesHeader, SeriesNameChanged ));
m_spSeriesName->SetModifyHdl( LINK( this, SeriesHeader, SeriesNameEdited ));
m_aUpdateDataTimer.SetInvokeHandler(LINK(this, SeriesHeader, ImplUpdateDataHdl));
m_aUpdateDataTimer.SetDebugName( "SeriesHeader UpdateDataTimer" );
m_aUpdateDataTimer.SetTimeout(4 * EDIT_UPDATEDATA_TIMEOUT);
m_spSeriesName->SetModifyHdl(LINK(this, SeriesHeader, SeriesNameEdited));
Show();
}
SeriesHeader::~SeriesHeader()
{
m_spSymbol.disposeAndClear();
m_spSeriesName.disposeAndClear();
m_spColorBar.disposeAndClear();
m_aUpdateDataTimer.Stop();
m_xDevice.clear();
m_xBuilder2.reset();
m_xBuilder1.reset();
}
void SeriesHeader::notifyChanges()
{
m_aChangeLink.Call( m_spSeriesName.get());
m_aChangeLink.Call(*m_spSeriesName);
m_bSeriesNameChangePending = false;
}
@@ -236,51 +284,53 @@ void SeriesHeader::applyChanges()
void SeriesHeader::SetColor( const Color & rCol )
{
m_spColorBar->SetControlBackground( rCol );
m_aColor = rCol;
}
void SeriesHeader::SetPos( const Point & rPos )
void SeriesHeader::SetPos()
{
m_aPos = rPos;
// chart type symbol
Size aSize( nSymbolHeight, nSymbolHeight );
aSize = m_pDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spSymbol->set_width_request(aSize.Width());
m_spSymbol->set_height_request(aSize.Height());
aSize = m_xDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spSymbol->set_size_request(aSize.Width(), aSize.Height());
// series name edit field
aSize.setWidth(nSymbolDistance);
aSize = m_pDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
aSize = m_xDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spSeriesName->set_margin_left(aSize.Width() + 2);
aSize.setWidth( m_nWidth - nSymbolHeight - nSymbolDistance );
sal_Int32 nHeight = 12;
aSize.setHeight( nHeight );
aSize = m_pDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spSeriesName->set_width_request(aSize.Width());
m_spSeriesName->set_height_request(aSize.Height());
aSize = m_xDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spSeriesName->set_size_request(aSize.Width(), aSize.Height());
// color bar
aSize.setWidth(1);
aSize = m_pDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
aSize = m_xDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spColorBar->set_margin_left(aSize.Width() + 2);
nHeight = 3;
aSize.setWidth( m_nWidth - 1 );
aSize.setHeight( nHeight );
aSize = m_pDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spColorBar->set_width_request(aSize.Width());
m_spColorBar->set_height_request(aSize.Height());
aSize = m_xDevice->LogicToPixel(aSize, MapMode(MapUnit::MapAppFont));
m_spColorBar->set_size_request(aSize.Width(), aSize.Height());
auto xVirDev(m_spColorBar->create_virtual_device());
xVirDev->SetOutputSizePixel(aSize);
xVirDev->SetFillColor(m_aColor);
xVirDev->SetLineColor(m_aColor);
xVirDev->DrawRect(tools::Rectangle(Point(0, 0), aSize));
m_spColorBar->set_image(xVirDev.get());
}
void SeriesHeader::SetWidth( sal_Int32 nWidth )
{
m_nWidth = nWidth;
SetPos( m_aPos );
SetPos();
}
void SeriesHeader::SetPixelWidth( sal_Int32 nWidth )
{
SetWidth( m_pDevice->PixelToLogic(Size(nWidth, 0), MapMode(MapUnit::MapAppFont)).getWidth());
SetWidth( m_xDevice->PixelToLogic(Size(nWidth, 0), MapMode(MapUnit::MapAppFont)).getWidth());
}
void SeriesHeader::SetChartType(
@@ -288,12 +338,12 @@ void SeriesHeader::SetChartType(
bool bSwapXAndYAxis
)
{
m_spSymbol->SetImage( GetChartTypeImage( xChartType, bSwapXAndYAxis ) );
m_spSymbol->set_from_icon_name( GetChartTypeImage( xChartType, bSwapXAndYAxis ) );
}
void SeriesHeader::SetSeriesName( const OUString & rName )
{
m_spSeriesName->SetText( rName );
m_spSeriesName->SetText(rName);
}
void SeriesHeader::SetRange( sal_Int32 nStartCol, sal_Int32 nEndCol )
@@ -305,34 +355,35 @@ void SeriesHeader::SetRange( sal_Int32 nStartCol, sal_Int32 nEndCol )
void SeriesHeader::Show()
{
m_spSymbol->Show();
m_spSymbol->show();
m_spSeriesName->Show();
m_spColorBar->Show();
m_spColorBar->show();
}
void SeriesHeader::Hide()
{
m_spSymbol->Hide();
m_spSymbol->hide();
m_spSeriesName->Hide();
m_spColorBar->Hide();
m_spColorBar->hide();
}
void SeriesHeader::SetEditChangedHdl( const Link<SeriesHeaderEdit*,void> & rLink )
void SeriesHeader::SetEditChangedHdl( const Link<SeriesHeaderEdit&,void> & rLink )
{
m_aChangeLink = rLink;
}
IMPL_LINK_NOARG(SeriesHeader, SeriesNameChanged, Edit&, void)
IMPL_LINK_NOARG(SeriesHeader, ImplUpdateDataHdl, Timer*, void)
{
notifyChanges();
}
IMPL_LINK_NOARG(SeriesHeader, SeriesNameEdited, Edit&, void)
IMPL_LINK_NOARG(SeriesHeader, SeriesNameEdited, SeriesHeaderEdit&, void)
{
m_bSeriesNameChangePending = true;
m_aUpdateDataTimer.Start();
}
void SeriesHeader::SetGetFocusHdl( const Link<Control&,void>& rLink )
void SeriesHeader::SetGetFocusHdl( const Link<SeriesHeaderEdit&,void>& rLink )
{
m_spSeriesName->SetGetFocusHdl( rLink );
}
@@ -342,52 +393,52 @@ bool SeriesHeader::HasFocus() const
return m_spSeriesName->HasFocus();
}
Image SeriesHeader::GetChartTypeImage(
OUString SeriesHeader::GetChartTypeImage(
const Reference< chart2::XChartType > & xChartType,
bool bSwapXAndYAxis
)
{
Image aResult;
OUString aResult;
if( !xChartType.is())
return aResult;
OUString aChartTypeName( xChartType->getChartType());
if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_AREA )
{
aResult = Image(StockImage::Yes, BMP_TYPE_AREA);
aResult = BMP_TYPE_AREA;
}
else if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_COLUMN )
{
if( bSwapXAndYAxis )
aResult = Image(StockImage::Yes, BMP_TYPE_BAR);
aResult = BMP_TYPE_BAR;
else
aResult = Image(StockImage::Yes, BMP_TYPE_COLUMN);
aResult = BMP_TYPE_COLUMN;
}
else if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_LINE )
{
aResult = Image(StockImage::Yes, BMP_TYPE_LINE);
aResult = BMP_TYPE_LINE;
}
else if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_SCATTER )
{
aResult = Image(StockImage::Yes, BMP_TYPE_XY);
aResult = BMP_TYPE_XY;
}
else if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_PIE )
{
aResult = Image(StockImage::Yes, BMP_TYPE_PIE);
aResult = BMP_TYPE_PIE;
}
else if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_NET
|| aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET )
{
aResult = Image(StockImage::Yes, BMP_TYPE_NET);
aResult = BMP_TYPE_NET;
}
else if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK )
{
// @todo: correct image for candle-stick type
aResult = Image(StockImage::Yes, BMP_TYPE_STOCK);
aResult = BMP_TYPE_STOCK;
}
else if( aChartTypeName == CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE )
{
aResult = Image(StockImage::Yes, BMP_TYPE_BUBBLE);
aResult = BMP_TYPE_BUBBLE;
}
return aResult;
@@ -437,14 +488,19 @@ sal_Int32 lcl_getColumnInDataOrHeader(
} // anonymous namespace
DataBrowser::DataBrowser( vcl::Window* pParent, WinBits nStyle, bool bLiveUpdate ) :
::svt::EditBrowseBox( pParent, EditBrowseBoxFlags::SMART_TAB_TRAVEL | EditBrowseBoxFlags::HANDLE_COLUMN_TEXT, nStyle, BrowserStdFlags ),
DataBrowser::DataBrowser(const css::uno::Reference<css::awt::XWindow> &rParent,
weld::Container* pColumns, weld::Container* pColors) :
::svt::EditBrowseBox(VCLUnoHelper::GetWindow(rParent),
EditBrowseBoxFlags::SMART_TAB_TRAVEL | EditBrowseBoxFlags::HANDLE_COLUMN_TEXT,
WB_BORDER | WB_TABSTOP, BrowserStdFlags ),
m_nSeekRow( 0 ),
m_bIsReadOnly( false ),
m_bLiveUpdate( bLiveUpdate ),
m_bLiveUpdate( true ),
m_bDataValid( true ),
m_aNumberEditField( VclPtr<FormattedField>::Create( & EditBrowseBox::GetDataWindow(), WB_NOBORDER ) ),
m_aTextEditField( VclPtr<Edit>::Create( & EditBrowseBox::GetDataWindow(), WB_NOBORDER ) ),
m_pColumnsWin(pColumns),
m_pColorsWin(pColors),
m_rNumberEditController( new ::svt::FormattedFieldCellController( m_aNumberEditField.get() )),
m_rTextEditController( new ::svt::EditCellController( m_aTextEditField.get() ))
{
@@ -580,7 +636,7 @@ void DataBrowser::RenewTable()
OUString aDefaultSeriesName(SchResId(STR_COLUMN_LABEL));
replaceParamterInString( aDefaultSeriesName, "%COLUMNNUMBER", OUString::number( 24 ) );
sal_Int32 nColumnWidth = GetDataWindow().GetTextWidth( aDefaultSeriesName )
+ GetDataWindow().LogicToPixel(Point(4 + impl::SeriesHeader::GetRelativeAppFontXPosForNameField(), 0), MapMode(MapUnit::MapAppFont)).X();
+ GetDataWindow().LogicToPixel(Point(8 + impl::SeriesHeader::GetRelativeAppFontXPosForNameField(), 0), MapMode(MapUnit::MapAppFont)).X();
sal_Int32 nColumnCount = m_apDataBrowserModel->getColumnCount();
// nRowCount is a member of a base class
sal_Int32 nRowCountLocal = m_apDataBrowserModel->getMaxRowCount();
@@ -593,19 +649,15 @@ void DataBrowser::RenewTable()
GoToRow( std::min( nOldRow, GetRowCount() - 1 ));
GoToColumnId( std::min( nOldColId, static_cast< sal_uInt16 >( ColCount() - 1 )));
Dialog* pDialog = GetParentDialog();
vcl::Window* pWin = pDialog->get<VclContainer>("columns");
vcl::Window* pColorWin = pDialog->get<VclContainer>("colorcolumns");
// fill series headers
clearHeaders();
const DataBrowserModel::tDataHeaderVector& aHeaders( m_apDataBrowserModel->getDataHeaders());
Link<Control&,void> aFocusLink( LINK( this, DataBrowser, SeriesHeaderGotFocus ));
Link<impl::SeriesHeaderEdit*,void> aSeriesHeaderChangedLink( LINK( this, DataBrowser, SeriesHeaderChanged ));
Link<impl::SeriesHeaderEdit&,void> aFocusLink( LINK( this, DataBrowser, SeriesHeaderGotFocus ));
Link<impl::SeriesHeaderEdit&,void> aSeriesHeaderChangedLink( LINK( this, DataBrowser, SeriesHeaderChanged ));
for (auto const& elemHeader : aHeaders)
{
std::shared_ptr< impl::SeriesHeader > spHeader( new impl::SeriesHeader( pWin, pColorWin ));
std::shared_ptr< impl::SeriesHeader > spHeader( new impl::SeriesHeader( m_pColumnsWin, m_pColorsWin ));
Reference< beans::XPropertySet > xSeriesProp( elemHeader.m_xDataSeries, uno::UNO_QUERY );
sal_Int32 nColor = 0;
// @todo: Set "DraftColor", i.e. interpolated colors for gradients, bitmaps, etc.
@@ -1242,18 +1294,14 @@ void DataBrowser::EndScroll()
void DataBrowser::RenewSeriesHeaders()
{
Dialog* pDialog = GetParentDialog();
vcl::Window* pWin = pDialog->get<VclContainer>("columns");
vcl::Window* pColorWin = pDialog->get<VclContainer>("colorcolumns");
clearHeaders();
DataBrowserModel::tDataHeaderVector aHeaders( m_apDataBrowserModel->getDataHeaders());
Link<Control&,void> aFocusLink( LINK( this, DataBrowser, SeriesHeaderGotFocus ));
Link<impl::SeriesHeaderEdit*,void> aSeriesHeaderChangedLink( LINK( this, DataBrowser, SeriesHeaderChanged ));
Link<impl::SeriesHeaderEdit&,void> aFocusLink( LINK( this, DataBrowser, SeriesHeaderGotFocus ));
Link<impl::SeriesHeaderEdit&,void> aSeriesHeaderChangedLink( LINK( this, DataBrowser, SeriesHeaderChanged ));
for (auto const& elemHeader : aHeaders)
{
std::shared_ptr< impl::SeriesHeader > spHeader( new impl::SeriesHeader( pWin, pColorWin ));
std::shared_ptr< impl::SeriesHeader > spHeader( new impl::SeriesHeader( m_pColumnsWin, m_pColorsWin ));
Reference< beans::XPropertySet > xSeriesProp(elemHeader.m_xDataSeries, uno::UNO_QUERY);
sal_Int32 nColor = 0;
if( xSeriesProp.is() &&
@@ -1285,9 +1333,8 @@ void DataBrowser::ImplAdjustHeaderControls()
// width of header column
nCurrentPos += GetColumnWidth( 0 );
Dialog* pDialog = GetParentDialog();
vcl::Window* pWin = pDialog->get<VclContainer>("columns");
vcl::Window* pColorWin = pDialog->get<VclContainer>("colorcolumns");
weld::Container* pWin = m_pColumnsWin;
weld::Container* pColorWin = m_pColorsWin;
pWin->set_margin_left(nCurrentPos);
pColorWin->set_margin_left(nCurrentPos);
@@ -1327,43 +1374,39 @@ void DataBrowser::ImplAdjustHeaderControls()
}
}
IMPL_LINK( DataBrowser, SeriesHeaderGotFocus, Control&, rControl, void )
IMPL_LINK( DataBrowser, SeriesHeaderGotFocus, impl::SeriesHeaderEdit&, rEdit, void )
{
impl::SeriesHeaderEdit* pEdit = static_cast<impl::SeriesHeaderEdit*>(&rControl);
pEdit->SetShowWarningBox( !m_bDataValid );
rEdit.SetShowWarningBox( !m_bDataValid );
if( !m_bDataValid )
GoToCell( 0, 0 );
else
{
MakeFieldVisible( GetCurRow(), static_cast< sal_uInt16 >( pEdit->getStartColumn()) );
MakeFieldVisible( GetCurRow(), static_cast< sal_uInt16 >( rEdit.getStartColumn()) );
ActivateCell();
m_aCursorMovedHdlLink.Call( this );
}
}
IMPL_LINK( DataBrowser, SeriesHeaderChanged, impl::SeriesHeaderEdit*, pEdit, void )
IMPL_LINK( DataBrowser, SeriesHeaderChanged, impl::SeriesHeaderEdit&, rEdit, void )
{
if( pEdit )
Reference< chart2::XDataSeries > xSeries(
m_apDataBrowserModel->getDataSeriesByColumn( rEdit.getStartColumn() - 1 ));
Reference< chart2::data::XDataSource > xSource( xSeries, uno::UNO_QUERY );
if( xSource.is())
{
Reference< chart2::XDataSeries > xSeries(
m_apDataBrowserModel->getDataSeriesByColumn( pEdit->getStartColumn() - 1 ));
Reference< chart2::data::XDataSource > xSource( xSeries, uno::UNO_QUERY );
if( xSource.is())
Reference< chart2::XChartType > xChartType(
m_apDataBrowserModel->getHeaderForSeries( xSeries ).m_xChartType );
if( xChartType.is())
{
Reference< chart2::XChartType > xChartType(
m_apDataBrowserModel->getHeaderForSeries( xSeries ).m_xChartType );
if( xChartType.is())
Reference< chart2::data::XLabeledDataSequence > xLabeledSeq(
DataSeriesHelper::getDataSequenceByRole( xSource, xChartType->getRoleOfSequenceForSeriesLabel()));
if( xLabeledSeq.is())
{
Reference< chart2::data::XLabeledDataSequence > xLabeledSeq(
DataSeriesHelper::getDataSequenceByRole( xSource, xChartType->getRoleOfSequenceForSeriesLabel()));
if( xLabeledSeq.is())
{
Reference< container::XIndexReplace > xIndexReplace( xLabeledSeq->getLabel(), uno::UNO_QUERY );
if( xIndexReplace.is())
xIndexReplace->replaceByIndex(
0, uno::Any( pEdit->GetText()));
}
Reference< container::XIndexReplace > xIndexReplace( xLabeledSeq->getLabel(), uno::UNO_QUERY );
if( xIndexReplace.is())
xIndexReplace->replaceByIndex(
0, uno::Any( rEdit.GetText()));
}
}
}
diff --git a/chart2/source/controller/dialogs/DataBrowser.hxx b/chart2/source/controller/dialogs/DataBrowser.hxx
index ad359ce..db41c11 100644
--- a/chart2/source/controller/dialogs/DataBrowser.hxx
+++ b/chart2/source/controller/dialogs/DataBrowser.hxx
@@ -22,11 +22,15 @@
#include <svtools/editbrowsebox.hxx>
#include <vcl/fmtfield.hxx>
#include <vcl/weld.hxx>
#include <memory>
#include <vector>
namespace com { namespace sun { namespace star {
namespace awt {
class XWindow;
}
namespace chart2 {
class XChartDocument;
}
@@ -66,7 +70,9 @@ protected:
virtual void MouseButtonDown( const BrowserMouseEvent& rEvt ) override;
public:
DataBrowser( vcl::Window* pParent, WinBits nStyle, bool bLiveUpdate );
DataBrowser(const css::uno::Reference<css::awt::XWindow> &rParent,
weld::Container* pColumns, weld::Container* pColors);
virtual ~DataBrowser() override;
virtual void dispose() override;
@@ -157,6 +163,8 @@ private:
VclPtr<FormattedField> m_aNumberEditField;
VclPtr<Edit> m_aTextEditField;
weld::Container* m_pColumnsWin;
weld::Container* m_pColorsWin;
/// note: m_aNumberEditField must precede this member!
::svt::CellControllerRef m_rNumberEditController;
@@ -171,8 +179,8 @@ private:
OUString GetColString( sal_Int32 nColumnId ) const;
DECL_LINK( SeriesHeaderGotFocus, Control&, void );
DECL_LINK( SeriesHeaderChanged, impl::SeriesHeaderEdit*, void );
DECL_LINK( SeriesHeaderGotFocus, impl::SeriesHeaderEdit&, void );
DECL_LINK( SeriesHeaderChanged, impl::SeriesHeaderEdit&, void );
DataBrowser( const DataBrowser & ) = delete;
};
diff --git a/chart2/source/controller/dialogs/dlg_DataEditor.cxx b/chart2/source/controller/dialogs/dlg_DataEditor.cxx
index cc65860..03f7820 100644
--- a/chart2/source/controller/dialogs/dlg_DataEditor.cxx
+++ b/chart2/source/controller/dialogs/dlg_DataEditor.cxx
@@ -25,6 +25,7 @@
#include <vcl/taskpanelist.hxx>
#include <svtools/miscopt.hxx>
#include <com/sun/star/awt/XWindow.hpp>
#include <com/sun/star/frame/XStorable.hpp>
using namespace ::com::sun::star;
@@ -33,100 +34,70 @@ using ::com::sun::star::uno::Reference;
namespace chart
{
DataEditor::DataEditor(vcl::Window* pParent,
DataEditor::DataEditor(weld::Window* pParent,
const Reference< chart2::XChartDocument > & xChartDoc,
const Reference< uno::XComponentContext > & xContext)
: ModalDialog(pParent, "ChartDataDialog",
"modules/schart/ui/chartdatadialog.ui")
: GenericDialogController(pParent, "modules/schart/ui/chartdatadialog.ui", "ChartDataDialog")
, m_bReadOnly(false)
, m_xChartDoc(xChartDoc)
, m_xContext(xContext)
, m_xTbxData(m_xBuilder->weld_toolbar("toolbar"))
, m_xCloseBtn(m_xBuilder->weld_button("close"))
, m_xTable(m_xBuilder->weld_container("datawindow"))
, m_xColumns(m_xBuilder->weld_container("columns"))
, m_xColors(m_xBuilder->weld_container("colorcolumns"))
, m_xTableCtrlParent(m_xTable->CreateChildFrame())
, m_xBrwData(VclPtr<DataBrowser>::Create(m_xTableCtrlParent, m_xColumns.get(), m_xColors.get()))
{
m_xBrwData.reset(VclPtr<DataBrowser>::Create(get<vcl::Window>("datawindow"), WB_BORDER | WB_TABSTOP, true /* bLiveUpdate */));
m_xBrwData->set_hexpand(true);
m_xBrwData->set_vexpand(true);
m_xBrwData->set_expand(true);
Size aSize(m_xBrwData->LogicToPixel(Size(232, 121), MapMode(MapUnit::MapAppFont)));
m_xBrwData->set_width_request(aSize.Width());
m_xBrwData->set_height_request(aSize.Height());
m_xCloseBtn->connect_clicked(LINK(this, DataEditor, CloseHdl));
Size aSize(m_xTable->get_approximate_digit_width() * 75, m_xTable->get_text_height() * 15);
m_xTable->set_size_request(aSize.Width(), aSize.Height());
m_xBrwData->Show();
get(m_pTbxData, "toolbar");
TBI_DATA_INSERT_ROW = m_pTbxData->GetItemId("InsertRow");
TBI_DATA_INSERT_COL = m_pTbxData->GetItemId("InsertColumn");
TBI_DATA_INSERT_TEXT_COL = m_pTbxData->GetItemId("InsertTextColumn");
TBI_DATA_DELETE_ROW = m_pTbxData->GetItemId("RemoveRow");
TBI_DATA_DELETE_COL = m_pTbxData->GetItemId("RemoveColumn");
TBI_DATA_MOVE_LEFT_COL = m_pTbxData->GetItemId("MoveLeftColumn");
TBI_DATA_MOVE_RIGHT_COL = m_pTbxData->GetItemId("MoveRightColumn");
TBI_DATA_MOVE_UP_ROW = m_pTbxData->GetItemId("MoveUpRow");
TBI_DATA_MOVE_DOWN_ROW = m_pTbxData->GetItemId("MoveDownRow");
m_pTbxData->SetSelectHdl( LINK( this, DataEditor, ToolboxHdl ));
m_xTbxData->connect_clicked(LINK(this, DataEditor, ToolboxHdl));
m_xBrwData->SetCursorMovedHdl( LINK( this, DataEditor, BrowserCursorMovedHdl ));
m_xBrwData->SetDataFromModel( m_xChartDoc, m_xContext );
GrabFocus();
m_xBrwData->GrabFocus();
// m_xDialog->grab_focus();
// m_xBrwData->GrabFocus();
bool bReadOnly = true;
Reference< frame::XStorable > xStor( m_xChartDoc, uno::UNO_QUERY );
if( xStor.is())
bReadOnly = xStor->isReadonly();
SetReadOnly( bReadOnly );
// change buttons to flat-look if set so by user
SvtMiscOptions aMiscOptions;
const sal_Int16 nStyle( aMiscOptions.GetToolboxStyle() );
// react on changes
aMiscOptions.AddListenerLink( LINK( this, DataEditor, MiscHdl ) );
m_pTbxData->SetOutStyle( nStyle );
// allow travelling to toolbar with F6
notifySystemWindow( this, m_pTbxData, ::comphelper::mem_fun( & TaskPaneList::AddWindow ));
}
DataEditor::~DataEditor()
{
disposeOnce();
}
void DataEditor::dispose()
{
notifySystemWindow( this, m_pTbxData, ::comphelper::mem_fun( & TaskPaneList::RemoveWindow ));
SvtMiscOptions aMiscOptions;
aMiscOptions.RemoveListenerLink( LINK( this, DataEditor, MiscHdl ) );
m_pTbxData.clear();
m_xBrwData.disposeAndClear();
ModalDialog::dispose();
m_xTableCtrlParent->dispose();
m_xTableCtrlParent.clear();
}
// react on click (or keypress) on toolbar icon
IMPL_LINK_NOARG(DataEditor, ToolboxHdl, ToolBox *, void)
IMPL_LINK(DataEditor, ToolboxHdl, const OString&, rId, void)
{
sal_uInt16 nId = m_pTbxData->GetCurItemId();
if (nId == TBI_DATA_INSERT_ROW)
if (rId == "InsertRow")
m_xBrwData->InsertRow();
else if (nId == TBI_DATA_INSERT_COL)
else if (rId == "InsertColumn")
m_xBrwData->InsertColumn();
else if (nId == TBI_DATA_INSERT_TEXT_COL)
else if (rId == "InsertTextColumn")
m_xBrwData->InsertTextColumn();
else if (nId == TBI_DATA_DELETE_ROW)
else if (rId == "RemoveRow")
m_xBrwData->RemoveRow();
else if (nId == TBI_DATA_DELETE_COL)
else if (rId == "RemoveColumn")
m_xBrwData->RemoveColumn();
else if (nId == TBI_DATA_MOVE_LEFT_COL)
else if (rId == "MoveLeftColumn")
m_xBrwData->MoveLeftColumn();
else if (nId == TBI_DATA_MOVE_RIGHT_COL)
else if (rId == "MoveRightColumn")
m_xBrwData->MoveRightColumn();
else if (nId == TBI_DATA_MOVE_UP_ROW)
else if (rId == "MoveUpRow")
m_xBrwData->MoveUpRow();
else if (nId == TBI_DATA_MOVE_DOWN_ROW)
else if (rId == "MoveDownRow")
m_xBrwData->MoveDownRow();
}
@@ -138,16 +109,16 @@ IMPL_LINK_NOARG(DataEditor, BrowserCursorMovedHdl, DataBrowser*, void)
bool bIsDataValid = m_xBrwData->IsEnableItem();
m_pTbxData->EnableItem( TBI_DATA_INSERT_ROW, bIsDataValid && m_xBrwData->MayInsertRow() );
m_pTbxData->EnableItem( TBI_DATA_INSERT_COL, bIsDataValid && m_xBrwData->MayInsertColumn() );
m_pTbxData->EnableItem( TBI_DATA_INSERT_TEXT_COL, bIsDataValid && m_xBrwData->MayInsertColumn() );
m_pTbxData->EnableItem( TBI_DATA_DELETE_ROW, m_xBrwData->MayDeleteRow() );
m_pTbxData->EnableItem( TBI_DATA_DELETE_COL, m_xBrwData->MayDeleteColumn() );
m_xTbxData->set_item_sensitive("InsertRow", bIsDataValid && m_xBrwData->MayInsertRow() );
m_xTbxData->set_item_sensitive("InsertColumn", bIsDataValid && m_xBrwData->MayInsertColumn() );
m_xTbxData->set_item_sensitive("InsertTextColumn", bIsDataValid && m_xBrwData->MayInsertColumn() );
m_xTbxData->set_item_sensitive("RemoveRow", m_xBrwData->MayDeleteRow() );
m_xTbxData->set_item_sensitive("RemoveColumn", m_xBrwData->MayDeleteColumn() );
m_pTbxData->EnableItem( TBI_DATA_MOVE_LEFT_COL, bIsDataValid && m_xBrwData->MayMoveLeftColumns() );
m_pTbxData->EnableItem( TBI_DATA_MOVE_RIGHT_COL, bIsDataValid && m_xBrwData->MayMoveRightColumns() );
m_pTbxData->EnableItem( TBI_DATA_MOVE_DOWN_ROW, bIsDataValid && m_xBrwData->MayMoveDownRows() );
m_pTbxData->EnableItem( TBI_DATA_MOVE_UP_ROW, bIsDataValid && m_xBrwData->MayMoveUpRows() );
m_xTbxData->set_item_sensitive("MoveLeftColumn", bIsDataValid && m_xBrwData->MayMoveLeftColumns() );
m_xTbxData->set_item_sensitive("MoveRightColumn", bIsDataValid && m_xBrwData->MayMoveRightColumns() );
m_xTbxData->set_item_sensitive("MoveUpRow", bIsDataValid && m_xBrwData->MayMoveDownRows() );
m_xTbxData->set_item_sensitive("MoveDownRow", bIsDataValid && m_xBrwData->MayMoveUpRows() );
}
// disable all modifying controls
@@ -156,34 +127,25 @@ void DataEditor::SetReadOnly( bool bReadOnly )
m_bReadOnly = bReadOnly;
if( m_bReadOnly )
{
m_pTbxData->EnableItem( TBI_DATA_INSERT_ROW, false );
m_pTbxData->EnableItem( TBI_DATA_INSERT_COL, false );
m_pTbxData->EnableItem( TBI_DATA_INSERT_TEXT_COL, false );
m_pTbxData->EnableItem( TBI_DATA_DELETE_ROW, false );
m_pTbxData->EnableItem( TBI_DATA_DELETE_COL, false );
m_pTbxData->EnableItem( TBI_DATA_MOVE_LEFT_COL, false );
m_pTbxData->EnableItem( TBI_DATA_MOVE_RIGHT_COL, false );
m_pTbxData->EnableItem( TBI_DATA_MOVE_UP_ROW, false );
m_pTbxData->EnableItem( TBI_DATA_MOVE_DOWN_ROW, false );
m_xTbxData->set_item_sensitive("InsertRow", false);
m_xTbxData->set_item_sensitive("InsertColumn", false);
m_xTbxData->set_item_sensitive("InsertTextColumn", false);
m_xTbxData->set_item_sensitive("RemoveRow", false);
m_xTbxData->set_item_sensitive("RemoveColumn", false);
m_xTbxData->set_item_sensitive("MoveLeftColumn", false);
m_xTbxData->set_item_sensitive("MoveRightColumn", false);
m_xTbxData->set_item_sensitive("MoveUpRow", false);
m_xTbxData->set_item_sensitive("MoveDownRow", false);
}
m_xBrwData->SetReadOnly( m_bReadOnly );
}
IMPL_LINK_NOARG(DataEditor, MiscHdl, LinkParamNone*, void)
IMPL_LINK_NOARG(DataEditor, CloseHdl, weld::Button&, void)
{
SvtMiscOptions aMiscOptions;
sal_Int16 nStyle( aMiscOptions.GetToolboxStyle() );
m_pTbxData->SetOutStyle( nStyle );
}
bool DataEditor::Close()
{
if( ApplyChangesToModel() )
return ModalDialog::Close();
else
return true;
bool bApplied = ApplyChangesToModel();
if (bApplied)
m_xDialog->response(RET_CLOSE);
}
bool DataEditor::ApplyChangesToModel()
@@ -191,28 +153,6 @@ bool DataEditor::ApplyChangesToModel()
return m_xBrwData->EndEditing();
}
// add/remove a window (the toolbar) to/from the global list, so that F6
// travels/no longer travels over this window. _rMemFunc may be
// TaskPaneList::AddWindow or TaskPaneList::RemoveWindow
void DataEditor::notifySystemWindow(
vcl::Window const * pWindow, vcl::Window* pToRegister,
const ::comphelper::mem_fun1_t<TaskPaneList, vcl::Window*>& rMemFunc )
{
OSL_ENSURE( pWindow, "Window must not be null!" );
if( !pWindow )
return;
vcl::Window* pParent = pWindow->GetParent();
while( pParent && ! pParent->IsSystemWindow() )
{
pParent = pParent->GetParent();
}
if ( pParent && pParent->IsSystemWindow())
{
SystemWindow* pSystemWindow = static_cast< SystemWindow* >( pParent );
rMemFunc( pSystemWindow->GetTaskPaneList(), pToRegister );
}
}
} // namespace chart
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/inc/dlg_DataEditor.hxx b/chart2/source/controller/inc/dlg_DataEditor.hxx
index 1801185..f4682ab 100644
--- a/chart2/source/controller/inc/dlg_DataEditor.hxx
+++ b/chart2/source/controller/inc/dlg_DataEditor.hxx
@@ -20,8 +20,7 @@
#ifndef INCLUDED_CHART2_SOURCE_CONTROLLER_INC_DLG_DATAEDITOR_HXX
#define INCLUDED_CHART2_SOURCE_CONTROLLER_INC_DLG_DATAEDITOR_HXX
#include <vcl/toolbox.hxx>
#include <vcl/dialog.hxx>
#include <vcl/weld.hxx>
namespace com { namespace sun { namespace star { namespace uno { class XComponentContext; } } } }
namespace comphelper { template <class Tp, class Arg> class mem_fun1_t; }
@@ -37,62 +36,37 @@ namespace chart
class DataBrowser;
class DataEditor : public ModalDialog
class DataEditor : public weld::GenericDialogController
{
public:
DataEditor( vcl::Window* pParent,
const css::uno::Reference< css::chart2::XChartDocument > & xChartDoc,
const css::uno::Reference< css::uno::XComponentContext > & xContext );
DataEditor(weld::Window* pParent,
const css::uno::Reference<css::chart2::XChartDocument> & xChartDoc,
const css::uno::Reference<css::uno::XComponentContext> & xContext);
virtual ~DataEditor() override;
virtual void dispose() override;
// Dialog
virtual bool Close() override;
DECL_LINK(CloseHdl, weld::Button&, void);
void SetReadOnly( bool bReadOnly );
bool ApplyChangesToModel();
private:
sal_uInt16 TBI_DATA_INSERT_ROW;
sal_uInt16 TBI_DATA_INSERT_COL;
sal_uInt16 TBI_DATA_INSERT_TEXT_COL;
sal_uInt16 TBI_DATA_DELETE_ROW;
sal_uInt16 TBI_DATA_DELETE_COL;
sal_uInt16 TBI_DATA_MOVE_LEFT_COL;
sal_uInt16 TBI_DATA_MOVE_RIGHT_COL;
sal_uInt16 TBI_DATA_MOVE_UP_ROW;
sal_uInt16 TBI_DATA_MOVE_DOWN_ROW;
bool m_bReadOnly;
VclPtr<DataBrowser> m_xBrwData;
VclPtr<ToolBox> m_pTbxData;
css::uno::Reference< css::chart2::XChartDocument > m_xChartDoc;
css::uno::Reference< css::uno::XComponentContext >
m_xContext;
css::uno::Reference<css::chart2::XChartDocument> m_xChartDoc;
css::uno::Reference<css::uno::XComponentContext> m_xContext;
std::unique_ptr<weld::Toolbar> m_xTbxData;
std::unique_ptr<weld::Button> m_xCloseBtn;
std::unique_ptr<weld::Container> m_xTable;
std::unique_ptr<weld::Container> m_xColumns;
std::unique_ptr<weld::Container> m_xColors;
css::uno::Reference<css::awt::XWindow> m_xTableCtrlParent;
VclPtr<DataBrowser> m_xBrwData;
/// handles actions of the toolbox
DECL_LINK( ToolboxHdl, ToolBox*, void );
DECL_LINK( ToolboxHdl, const OString&, void );
/// is called, if the cursor of the table has moved
DECL_LINK( BrowserCursorMovedHdl, DataBrowser*, void);
/// this is called if MiscOptions change, esp. High-Contrast mode
DECL_LINK( MiscHdl, LinkParamNone*, void );
/** notifySystemWindow adds or remove the given window pToRegister at the Systemwindow found when search pWindow.
@param pWindow
The window which is used to search for the SystemWindow.
@param pToRegister
The window which should be added or removed on the TaskPaneList.
@param rMemFunc
The member function which should be called at the SystemWindow when found.
Possible values are:
::comphelper::mem_fun(&TaskPaneList::AddWindow)
::comphelper::mem_fun(&TaskPaneList::RemoveWindow)
@note this code is taken from dbaccess/source/ui/inc/UITools.hxx
*/
static void notifySystemWindow(vcl::Window const * pWindow,
vcl::Window* pToRegister,
const ::comphelper::mem_fun1_t<TaskPaneList, vcl::Window*>& rMemFunc);
};
} // namespace chart
diff --git a/chart2/source/controller/main/ChartController_EditData.cxx b/chart2/source/controller/main/ChartController_EditData.cxx
index fb5a5d1..e9820ca 100644
--- a/chart2/source/controller/main/ChartController_EditData.cxx
+++ b/chart2/source/controller/main/ChartController_EditData.cxx
@@ -38,15 +38,14 @@ namespace chart
void ChartController::executeDispatch_EditData()
{
Reference< chart2::XChartDocument > xChartDoc( getModel(), uno::UNO_QUERY );
if( xChartDoc.is())
if (xChartDoc.is())
{
SolarMutexGuard aSolarGuard;
UndoLiveUpdateGuardWithData aUndoGuard(
SchResId( STR_ACTION_EDIT_CHART_DATA ),
m_xUndoManager );
ScopedVclPtrInstance<DataEditor> aDataEditorDialog( GetChartWindow().get(), xChartDoc, m_xCC );
if (aDataEditorDialog->Execute() == RET_OK)
aDataEditorDialog->ApplyChangesToModel();
DataEditor aDataEditorDialog(GetChartFrame(), xChartDoc, m_xCC);
aDataEditorDialog.run();
aUndoGuard.commit();
}
}
diff --git a/chart2/uiconfig/ui/chartdatadialog.ui b/chart2/uiconfig/ui/chartdatadialog.ui
index d77ad83..c48c8f2 100644
--- a/chart2/uiconfig/ui/chartdatadialog.ui
+++ b/chart2/uiconfig/ui/chartdatadialog.ui
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.22.1 -->
<interface domain="chart">
<requires lib="gtk+" version="3.18"/>
<object class="GtkDialog" id="ChartDataDialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes" context="chartdatadialog|ChartDataDialog">Data Table</property>
<property name="modal">True</property>
<property name="type_hint">dialog</property>
<child>
<placeholder/>
</child>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="can_focus">False</property>
@@ -17,24 +21,8 @@
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="ok">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="cancel">
<property name="label">gtk-cancel</property>
<object class="GtkButton" id="close">
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -84,7 +72,6 @@
<object class="GtkToolButton" id="InsertRow">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">InsertRow</property>
<property name="label" translatable="yes" context="chartdatadialog|InsertRow">Insert Row</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon01.png</property>
@@ -98,7 +85,6 @@
<object class="GtkToolButton" id="InsertColumn">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">InsertColumn</property>
<property name="label" translatable="yes" context="chartdatadialog|InsertColumn">Insert Series</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon02.png</property>
@@ -112,7 +98,6 @@
<object class="GtkToolButton" id="InsertTextColumn">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">InsertTextColumn</property>
<property name="label" translatable="yes" context="chartdatadialog|InsertTextColumn">Insert Text Column</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon07.png</property>
@@ -126,7 +111,6 @@
<object class="GtkToolButton" id="RemoveRow">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">RemoveRow</property>
<property name="label" translatable="yes" context="chartdatadialog|RemoveRow">Delete Row</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon03.png</property>
@@ -140,7 +124,6 @@
<object class="GtkToolButton" id="RemoveColumn">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">RemoveColumn</property>
<property name="label" translatable="yes" context="chartdatadialog|RemoveColumn">Delete Series</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon04.png</property>
@@ -162,9 +145,8 @@
</child>
<child>
<object class="GtkToolButton" id="MoveLeftColumn">
<property name="visible">True</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">MoveLeftColumn</property>
<property name="label" translatable="yes" context="chartdatadialog|MoveLeftColumn">Move Series Left</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon08.png</property>
@@ -178,7 +160,6 @@
<object class="GtkToolButton" id="MoveRightColumn">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">MoveRightColumn</property>
<property name="label" translatable="yes" context="chartdatadialog|MoveRightColumn">Move Series Right</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon05.png</property>
@@ -192,7 +173,6 @@
<object class="GtkToolButton" id="MoveUpRow">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">MoveUpRow</property>
<property name="label" translatable="yes" context="chartdatadialog|MoveUpRow">Move Row Up</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon09.png</property>
@@ -206,7 +186,6 @@
<object class="GtkToolButton" id="MoveDownRow">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="action_name">MoveDownRow</property>
<property name="label" translatable="yes" context="chartdatadialog|MoveDownRow">Move Row Down</property>
<property name="use_underline">True</property>
<property name="icon_name">chart2/res/dataeditor_icon06.png</property>
@@ -216,16 +195,6 @@
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkSeparatorToolItem" id="toolbutton2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">0</property>
@@ -315,8 +284,7 @@
</object>
</child>
<action-widgets>
<action-widget response="-5">ok</action-widget>
<action-widget response="-6">cancel</action-widget>
<action-widget response="-7">close</action-widget>
<action-widget response="-11">help</action-widget>
</action-widgets>
</object>
diff --git a/chart2/uiconfig/ui/columnfragment.ui b/chart2/uiconfig/ui/columnfragment.ui
new file mode 100644
index 0000000..c5cf43f
--- /dev/null
+++ b/chart2/uiconfig/ui/columnfragment.ui
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface domain="chart">
<requires lib="gtk+" version="3.18"/>
<object class="GtkBox" id="container">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry">
<property name="width_request">5</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="width_chars">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</interface>
diff --git a/chart2/uiconfig/ui/imagefragment.ui b/chart2/uiconfig/ui/imagefragment.ui
new file mode 100644
index 0000000..a8e89f2
--- /dev/null
+++ b/chart2/uiconfig/ui/imagefragment.ui
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface domain="chart">
<requires lib="gtk+" version="3.18"/>
<object class="GtkBox" id="container">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkImage" id="image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</interface>
diff --git a/solenv/sanitizers/ui/modules/schart.suppr b/solenv/sanitizers/ui/modules/schart.suppr
index 2f2f10f..f68f0c1 100644
--- a/solenv/sanitizers/ui/modules/schart.suppr
+++ b/solenv/sanitizers/ui/modules/schart.suppr
@@ -1,3 +1,4 @@
chart2/uiconfig/ui/columnfragment.ui://GtkEntry[@id='entry'] no-labelled-by
chart2/uiconfig/ui/dlg_DataLabel.ui://GtkLabel[@id='CT_LABEL_DIAL'] orphan-label
chart2/uiconfig/ui/dlg_DataLabel.ui://GtkLabel[@id='STR_DLG_NUMBERFORMAT_FOR_PERCENTAGE_VALUE'] orphan-label
chart2/uiconfig/ui/dlg_DataLabel.ui://GtkSpinButton[@id='NF_LABEL_DEGREES'] no-labelled-by