weld SvxPostItDialog
Change-Id: I0aa88270aa604180223f2b35829b45e5828f792a
Reviewed-on: https://gerrit.libreoffice.org/52896
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/cui/source/dialogs/postdlg.cxx b/cui/source/dialogs/postdlg.cxx
index 3633893..dbf6436 100644
--- a/cui/source/dialogs/postdlg.cxx
+++ b/cui/source/dialogs/postdlg.cxx
@@ -18,6 +18,7 @@
*/
#include <tools/date.hxx>
#include <tools/lineend.hxx>
#include <tools/time.hxx>
#include <vcl/svapp.hxx>
#include <vcl/settings.hxx>
@@ -32,54 +33,49 @@
// class SvxPostItDialog -------------------------------------------------
SvxPostItDialog::SvxPostItDialog(vcl::Window* pParent, const SfxItemSet& rCoreSet,
SvxPostItDialog::SvxPostItDialog(weld::Window* pParent, const SfxItemSet& rCoreSet,
bool bPrevNext)
: SfxModalDialog(pParent, "CommentDialog", "cui/ui/comment.ui")
, rSet(rCoreSet)
, pOutSet(nullptr)
: GenericDialogController(pParent, "cui/ui/comment.ui", "CommentDialog")
, m_rSet(rCoreSet)
, m_xLastEditFT(m_xBuilder->weld_label("lastedit"))
, m_xAltTitle(m_xBuilder->weld_label("alttitle"))
, m_xEditED(m_xBuilder->weld_text_view("edit"))
, m_xInsertAuthor(m_xBuilder->weld_widget("insertauthor"))
, m_xAuthorBtn(m_xBuilder->weld_button("author"))
, m_xOKBtn(m_xBuilder->weld_button("ok"))
, m_xPrevBtn(m_xBuilder->weld_button("previous"))
, m_xNextBtn(m_xBuilder->weld_button("next"))
{
get(m_pLastEditFT, "lastedit");
get(m_pInsertAuthor, "insertauthor");
get(m_pAuthorBtn, "author");
get(m_pOKBtn, "ok");
get(m_pPrevBtn, "previous");
get(m_pNextBtn, "next");
get(m_pEditED, "edit");
m_pPrevBtn->SetClickHdl( LINK( this, SvxPostItDialog, PrevHdl ) );
m_pNextBtn->SetClickHdl( LINK( this, SvxPostItDialog, NextHdl ) );
m_pAuthorBtn->SetClickHdl( LINK( this, SvxPostItDialog, Stamp ) );
m_pOKBtn->SetClickHdl( LINK( this, SvxPostItDialog, OKHdl ) );
vcl::Font aFont( m_pEditED->GetFont() );
aFont.SetWeight( WEIGHT_LIGHT );
m_pEditED->SetFont( aFont );
m_xPrevBtn->connect_clicked( LINK( this, SvxPostItDialog, PrevHdl ) );
m_xNextBtn->connect_clicked( LINK( this, SvxPostItDialog, NextHdl ) );
m_xAuthorBtn->connect_clicked( LINK( this, SvxPostItDialog, Stamp ) );
m_xOKBtn->connect_clicked( LINK( this, SvxPostItDialog, OKHdl ) );
bool bNew = true;
sal_uInt16 nWhich = 0;
m_pPrevBtn->Show(bPrevNext);
m_pNextBtn->Show(bPrevNext);
m_xPrevBtn->show(bPrevNext);
m_xNextBtn->show(bPrevNext);
nWhich = rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_AUTHOR );
nWhich = m_rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_AUTHOR );
OUString aAuthorStr, aDateStr;
if ( rSet.GetItemState( nWhich ) >= SfxItemState::DEFAULT )
if (m_rSet.GetItemState( nWhich ) >= SfxItemState::DEFAULT)
{
bNew = false;
const SvxPostItAuthorItem& rAuthor =
static_cast<const SvxPostItAuthorItem&>(rSet.Get( nWhich ));
static_cast<const SvxPostItAuthorItem&>(m_rSet.Get(nWhich));
aAuthorStr = rAuthor.GetValue();
}
else
aAuthorStr = SvtUserOptions().GetID();
nWhich = rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_DATE );
nWhich = m_rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_DATE );
if ( rSet.GetItemState( nWhich ) >= SfxItemState::DEFAULT )
if (m_rSet.GetItemState( nWhich ) >= SfxItemState::DEFAULT)
{
const SvxPostItDateItem& rDate =
static_cast<const SvxPostItDateItem&>(rSet.Get( nWhich ));
static_cast<const SvxPostItDateItem&>(m_rSet.Get( nWhich ));
aDateStr = rDate.GetValue();
}
else
@@ -88,56 +84,38 @@ SvxPostItDialog::SvxPostItDialog(vcl::Window* pParent, const SfxItemSet& rCoreSe
aDateStr = rLocaleWrapper.getDate( Date( Date::SYSTEM ) );
}
nWhich = rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_TEXT );
nWhich = m_rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_TEXT );
OUString aTextStr;
if ( rSet.GetItemState( nWhich ) >= SfxItemState::DEFAULT )
if (m_rSet.GetItemState( nWhich ) >= SfxItemState::DEFAULT)
{
const SvxPostItTextItem& rText =
static_cast<const SvxPostItTextItem&>(rSet.Get( nWhich ));
static_cast<const SvxPostItTextItem&>(m_rSet.Get( nWhich ));
aTextStr = rText.GetValue();
}
ShowLastAuthor(aAuthorStr, aDateStr);
//lock to an initial size before replacing contents
m_pEditED->set_width_request(m_pEditED->approximate_char_width() * 40);
m_pEditED->set_height_request(m_pEditED->GetTextHeight() * 10);
m_pEditED->SetText(convertLineEnd(aTextStr, GetSystemLineEnd()));
m_xEditED->set_size_request(m_xEditED->get_approximate_digit_width() * 32,
m_xEditED->get_height_rows(10));
m_xEditED->set_text(convertLineEnd(aTextStr, GetSystemLineEnd()));
if (!bNew)
SetText( get<FixedText>("alttitle")->GetText() );
m_xDialog->set_title(m_xAltTitle->get_label());
}
SvxPostItDialog::~SvxPostItDialog()
{
disposeOnce();
}
void SvxPostItDialog::dispose()
{
delete pOutSet;
pOutSet = nullptr;
m_pLastEditFT.clear();
m_pEditED.clear();
m_pInsertAuthor.clear();
m_pAuthorBtn.clear();
m_pOKBtn.clear();
m_pPrevBtn.clear();
m_pNextBtn.clear();
SfxModalDialog::dispose();
}
void SvxPostItDialog::ShowLastAuthor(const OUString& rAuthor, const OUString& rDate)
{
OUString sTxt = rAuthor + ", " + rDate;
m_pLastEditFT->SetText( sTxt );
m_xLastEditFT->set_label( sTxt );
}
const sal_uInt16* SvxPostItDialog::GetRanges()
{
static const sal_uInt16 pRanges[] =
@@ -149,31 +127,29 @@ const sal_uInt16* SvxPostItDialog::GetRanges()
return pRanges;
}
void SvxPostItDialog::EnableTravel(bool bNext, bool bPrev)
{
m_pPrevBtn->Enable(bPrev);
m_pNextBtn->Enable(bNext);
m_xPrevBtn->set_sensitive(bPrev);
m_xNextBtn->set_sensitive(bNext);
}
IMPL_LINK_NOARG(SvxPostItDialog, PrevHdl, Button*, void)
IMPL_LINK_NOARG(SvxPostItDialog, PrevHdl, weld::Button&, void)
{
aPrevHdlLink.Call( *this );
m_aPrevHdlLink.Call( *this );
}
IMPL_LINK_NOARG(SvxPostItDialog, NextHdl, Button*, void)
IMPL_LINK_NOARG(SvxPostItDialog, NextHdl, weld::Button&, void)
{
aNextHdlLink.Call( *this );
m_aNextHdlLink.Call( *this );
}
IMPL_LINK_NOARG(SvxPostItDialog, Stamp, Button*, void)
IMPL_LINK_NOARG(SvxPostItDialog, Stamp, weld::Button&, void)
{
Date aDate( Date::SYSTEM );
tools::Time aTime( tools::Time::SYSTEM );
OUString aTmp( SvtUserOptions().GetID() );
const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
OUString aStr( m_pEditED->GetText() );
OUString aStr( m_xEditED->get_text() );
aStr += "\n---- ";
if ( !aTmp.isEmpty() )
@@ -183,24 +159,23 @@ IMPL_LINK_NOARG(SvxPostItDialog, Stamp, Button*, void)
aStr += rLocaleWrapper.getDate(aDate) + ", " + rLocaleWrapper.getTime(aTime, false) + " ----\n";
aStr = convertLineEnd(aStr, GetSystemLineEnd());
m_pEditED->SetText(aStr);
m_xEditED->set_text(aStr);
sal_Int32 nLen = aStr.getLength();
m_pEditED->GrabFocus();
m_pEditED->SetSelection( Selection( nLen, nLen ) );
m_xEditED->grab_focus();
m_xEditED->select_region(nLen, nLen);
}
IMPL_LINK_NOARG(SvxPostItDialog, OKHdl, Button*, void)
IMPL_LINK_NOARG(SvxPostItDialog, OKHdl, weld::Button&, void)
{
const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
pOutSet = new SfxItemSet( rSet );
pOutSet->Put( SvxPostItAuthorItem( SvtUserOptions().GetID(),
rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_AUTHOR ) ) );
pOutSet->Put( SvxPostItDateItem( rLocaleWrapper.getDate( Date( Date::SYSTEM ) ),
rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_DATE ) ) );
pOutSet->Put( SvxPostItTextItem( m_pEditED->GetText(),
rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_TEXT ) ) );
EndDialog( RET_OK );
m_xOutSet.reset(new SfxItemSet(m_rSet));
m_xOutSet->Put( SvxPostItAuthorItem(SvtUserOptions().GetID(),
m_rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_AUTHOR ) ) );
m_xOutSet->Put( SvxPostItDateItem(rLocaleWrapper.getDate( Date( Date::SYSTEM ) ),
m_rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_DATE ) ) );
m_xOutSet->Put( SvxPostItTextItem(m_xEditED->get_text(),
m_rSet.GetPool()->GetWhich( SID_ATTR_POSTIT_TEXT ) ) );
m_xDialog->response(RET_OK);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx
index 590c168..dc7ecab 100644
--- a/cui/source/factory/dlgfact.cxx
+++ b/cui/source/factory/dlgfact.cxx
@@ -171,7 +171,11 @@ short AbstractInsertObjectDialog_Impl::Execute()
IMPL_ABSTDLG_BASE(AbstractLinksDialog_Impl);
IMPL_ABSTDLG_BASE(AbstractSpellDialog_Impl);
IMPL_ABSTDLG_BASE(AbstractSvxPostItDialog_Impl);
short AbstractSvxPostItDialog_Impl::Execute()
{
return m_xDlg->run();
}
short AbstractPasswordToOpenModifyDialog_Impl::Execute()
{
@@ -783,63 +787,75 @@ void AbstractSvxAreaTabDialog_Impl::SetText( const OUString& rStr )
void AbstractSvxPostItDialog_Impl::SetText( const OUString& rStr )
{
pDlg->SetText( rStr );
m_xDlg->set_title(rStr);
}
const SfxItemSet* AbstractSvxPostItDialog_Impl::GetOutputItemSet() const
{
return pDlg->GetOutputItemSet();
return m_xDlg->GetOutputItemSet();
}
void AbstractSvxPostItDialog_Impl::EnableTravel(bool bNext, bool bPrev)
{
pDlg->EnableTravel( bNext, bPrev );
m_xDlg->EnableTravel( bNext, bPrev );
}
OUString AbstractSvxPostItDialog_Impl::GetNote()
{
return pDlg->GetNote();
return m_xDlg->GetNote();
}
void AbstractSvxPostItDialog_Impl::SetNote(const OUString& rTxt)
{
pDlg->SetNote( rTxt );
m_xDlg->SetNote( rTxt );
}
void AbstractSvxPostItDialog_Impl::ShowLastAuthor(const OUString& rAuthor, const OUString& rDate)
{
pDlg->ShowLastAuthor( rAuthor, rDate );
m_xDlg->ShowLastAuthor( rAuthor, rDate );
}
void AbstractSvxPostItDialog_Impl::DontChangeAuthor()
{
pDlg->DontChangeAuthor();
m_xDlg->DontChangeAuthor();
}
void AbstractSvxPostItDialog_Impl::HideAuthor()
{
pDlg->HideAuthor();
m_xDlg->HideAuthor();
}
void AbstractSvxPostItDialog_Impl::SetNextHdl( const Link<AbstractSvxPostItDialog&,void>& rLink )
{
aNextHdl = rLink;
if( rLink.IsSet() )
pDlg->SetNextHdl( LINK(this, AbstractSvxPostItDialog_Impl, NextHdl ) );
m_xDlg->SetNextHdl( LINK(this, AbstractSvxPostItDialog_Impl, NextHdl ) );
else
pDlg->SetNextHdl( Link<SvxPostItDialog&,void>() );
m_xDlg->SetNextHdl( Link<SvxPostItDialog&,void>() );
}
void AbstractSvxPostItDialog_Impl::SetPrevHdl( const Link<AbstractSvxPostItDialog&,void>& rLink )
{
aPrevHdl = rLink;
if( rLink.IsSet() )
pDlg->SetPrevHdl( LINK(this, AbstractSvxPostItDialog_Impl, PrevHdl ) );
m_xDlg->SetPrevHdl( LINK(this, AbstractSvxPostItDialog_Impl, PrevHdl ) );
else
pDlg->SetPrevHdl( Link<SvxPostItDialog&,void>() );
m_xDlg->SetPrevHdl( Link<SvxPostItDialog&,void>() );
}
IMPL_LINK_NOARG(AbstractSvxPostItDialog_Impl, NextHdl, SvxPostItDialog&, void)
{
aNextHdl.Call(*this);
}
IMPL_LINK_NOARG(AbstractSvxPostItDialog_Impl, PrevHdl, SvxPostItDialog&, void)
{
aPrevHdl.Call(*this);
}
vcl::Window * AbstractSvxPostItDialog_Impl::GetWindow()
std::shared_ptr<weld::Dialog> AbstractSvxPostItDialog_Impl::GetDialog()
{
return static_cast<vcl::Window *>(pDlg);
return m_xDlg->GetDialog();
}
OUString AbstractPasswordToOpenModifyDialog_Impl::GetPasswordToOpen() const
@@ -1308,12 +1324,11 @@ VclPtr<SfxAbstractDialog> AbstractDialogFactory_Impl::CreateSfxDialog( vcl::Wind
return nullptr;
}
VclPtr<AbstractSvxPostItDialog> AbstractDialogFactory_Impl::CreateSvxPostItDialog( vcl::Window* pParent,
VclPtr<AbstractSvxPostItDialog> AbstractDialogFactory_Impl::CreateSvxPostItDialog( weld::Window* pParent,
const SfxItemSet& rCoreSet,
bool bPrevNext )
{
VclPtrInstance<SvxPostItDialog> pDlg( pParent, rCoreSet, bPrevNext );
return VclPtr<AbstractSvxPostItDialog_Impl>::Create( pDlg );
return VclPtr<AbstractSvxPostItDialog_Impl>::Create(new SvxPostItDialog(pParent, rCoreSet, bPrevNext));
}
class SvxMacroAssignDialog : public VclAbstractDialog
diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx
index 940a0b2..923d74d 100644
--- a/cui/source/factory/dlgfact.hxx
+++ b/cui/source/factory/dlgfact.hxx
@@ -477,18 +477,25 @@ public:
class SvxPostItDialog;
class AbstractSvxPostItDialog_Impl :public AbstractSvxPostItDialog
{
DECL_ABSTDLG_BASE( AbstractSvxPostItDialog_Impl, SvxPostItDialog )
private:
std::unique_ptr<SvxPostItDialog> m_xDlg;
public:
AbstractSvxPostItDialog_Impl(SvxPostItDialog* pDlg)
: m_xDlg(pDlg)
{
}
virtual short Execute() override;
virtual void SetText( const OUString& rStr ) override; //From class Window
virtual const SfxItemSet* GetOutputItemSet() const override;
virtual void SetPrevHdl( const Link<AbstractSvxPostItDialog&,void>& rLink ) override ;
virtual void SetNextHdl( const Link<AbstractSvxPostItDialog&,void>& rLink ) override ;
virtual void EnableTravel(bool bNext, bool bPrev) override ;
virtual OUString GetNote() override ;
virtual void SetNote(const OUString& rTxt) override ;
virtual void ShowLastAuthor(const OUString& rAuthor, const OUString& rDate) override ;
virtual void DontChangeAuthor() override ;
virtual void HideAuthor() override ;
virtual vcl::Window * GetWindow() override;
virtual void SetPrevHdl( const Link<AbstractSvxPostItDialog&,void>& rLink ) override;
virtual void SetNextHdl( const Link<AbstractSvxPostItDialog&,void>& rLink ) override;
virtual void EnableTravel(bool bNext, bool bPrev) override;
virtual OUString GetNote() override;
virtual void SetNote(const OUString& rTxt) override;
virtual void ShowLastAuthor(const OUString& rAuthor, const OUString& rDate) override;
virtual void DontChangeAuthor() override;
virtual void HideAuthor() override;
virtual std::shared_ptr<weld::Dialog> GetDialog() override;
private:
Link<AbstractSvxPostItDialog&,void> aNextHdl;
Link<AbstractSvxPostItDialog&,void> aPrevHdl;
@@ -698,7 +705,7 @@ public:
SdrModel* pModel,
const SdrObject* pObj,
bool bHasObj ) override;
virtual VclPtr<AbstractSvxPostItDialog> CreateSvxPostItDialog( vcl::Window* pParent,
virtual VclPtr<AbstractSvxPostItDialog> CreateSvxPostItDialog( weld::Window* pParent,
const SfxItemSet& rCoreSet,
bool bPrevNext = false ) override;
diff --git a/cui/source/inc/postdlg.hxx b/cui/source/inc/postdlg.hxx
index 9c33e4a..0434f19 100644
--- a/cui/source/inc/postdlg.hxx
+++ b/cui/source/inc/postdlg.hxx
@@ -19,12 +19,7 @@
#ifndef INCLUDED_CUI_SOURCE_INC_POSTDLG_HXX
#define INCLUDED_CUI_SOURCE_INC_POSTDLG_HXX
#include <vcl/button.hxx>
#include <vcl/edit.hxx>
#include <vcl/group.hxx>
#include <vcl/layout.hxx>
#include <sfx2/basedlgs.hxx>
#include <svtools/svmedit.hxx>
#include <vcl/weld.hxx>
// class SvxPostItDialog -------------------------------------------------
/*
@@ -39,64 +34,68 @@
<SvxPostItTextItem><SID_ATTR_POSTIT_TEXT>
*/
class SvxPostItDialog : public SfxModalDialog
class SvxPostItDialog : public weld::GenericDialogController
{
public:
SvxPostItDialog(vcl::Window* pParent, const SfxItemSet& rCoreSet,
SvxPostItDialog(weld::Window* pParent, const SfxItemSet& rCoreSet,
bool bPrevNext);
virtual ~SvxPostItDialog() override;
virtual void dispose() override;
static const sal_uInt16* GetRanges();
const SfxItemSet* GetOutputItemSet() const { return pOutSet; }
const SfxItemSet* GetOutputItemSet() { return m_xOutSet.get(); }
void SetPrevHdl( const Link<SvxPostItDialog&,void>& rLink )
{ aPrevHdlLink = rLink; }
{ m_aPrevHdlLink = rLink; }
void SetNextHdl( const Link<SvxPostItDialog&,void>& rLink )
{ aNextHdlLink = rLink; }
{ m_aNextHdlLink = rLink; }
void EnableTravel(bool bNext, bool bPrev);
OUString GetNote()
OUString GetNote() const
{
return m_pEditED->GetText();
return m_xEditED->get_text();
}
void SetNote(const OUString& rTxt)
{
m_pEditED->SetText(rTxt);
m_xEditED->set_text(rTxt);
}
void ShowLastAuthor(const OUString& rAuthor, const OUString& rDate);
void DontChangeAuthor()
{
m_pAuthorBtn->Enable(false);
m_xAuthorBtn->set_sensitive(false);
}
void HideAuthor()
{
m_pInsertAuthor->Hide();
m_xInsertAuthor->hide();
}
void set_title(const OUString& rTitle)
{
m_xDialog->set_title(rTitle);
}
std::shared_ptr<weld::Dialog> GetDialog()
{
return m_xDialog;
}
private:
VclPtr<FixedText> m_pLastEditFT;
const SfxItemSet& m_rSet;
std::unique_ptr<SfxItemSet> m_xOutSet;
VclPtr<VclMultiLineEdit> m_pEditED;
Link<SvxPostItDialog&,void> m_aPrevHdlLink;
Link<SvxPostItDialog&,void> m_aNextHdlLink;
VclPtr<VclContainer> m_pInsertAuthor;
VclPtr<PushButton> m_pAuthorBtn;
std::unique_ptr<weld::Label> m_xLastEditFT;
std::unique_ptr<weld::Label> m_xAltTitle;
std::unique_ptr<weld::TextView> m_xEditED;
std::unique_ptr<weld::Widget> m_xInsertAuthor;
std::unique_ptr<weld::Button> m_xAuthorBtn;
std::unique_ptr<weld::Button> m_xOKBtn;
std::unique_ptr<weld::Button> m_xPrevBtn;
std::unique_ptr<weld::Button> m_xNextBtn;
VclPtr<OKButton> m_pOKBtn;
VclPtr<PushButton> m_pPrevBtn;
VclPtr<PushButton> m_pNextBtn;
const SfxItemSet& rSet;
SfxItemSet* pOutSet;
Link<SvxPostItDialog&,void> aPrevHdlLink;
Link<SvxPostItDialog&,void> aNextHdlLink;
DECL_LINK(Stamp, Button*, void);
DECL_LINK(OKHdl, Button*, void);
DECL_LINK(PrevHdl, Button*, void);
DECL_LINK(NextHdl, Button*, void);
DECL_LINK(Stamp, weld::Button&, void);
DECL_LINK(OKHdl, weld::Button&, void);
DECL_LINK(PrevHdl, weld::Button&, void);
DECL_LINK(NextHdl, weld::Button&, void);
};
#endif
diff --git a/cui/uiconfig/ui/comment.ui b/cui/uiconfig/ui/comment.ui
index 17c2f80..20d2c5d 100644
--- a/cui/uiconfig/ui/comment.ui
+++ b/cui/uiconfig/ui/comment.ui
@@ -1,20 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.4 -->
<interface domain="cui">
<!-- interface-requires gtk+ 3.0 -->
<requires lib="gtk+" version="3.18"/>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-go-back</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-go-forward</property>
</object>
<object class="GtkDialog" id="CommentDialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes" context="comment|CommentDialog">Insert Comment</property>
<property name="modal">True</property>
<property name="default_width">0</property>
<property name="default_height">0</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="layout_style">start</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="ok">
<property name="label">gtk-ok</property>
@@ -59,6 +73,7 @@
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="secondary">True</property>
</packing>
</child>
<child>
@@ -82,8 +97,6 @@
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
@@ -98,8 +111,6 @@
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
</object>
@@ -149,8 +160,8 @@
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes" context="comment|label2">Author</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
@@ -181,10 +192,10 @@
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes" context="comment|label4">_Text</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">edit:border</property>
<property name="mnemonic_widget">edit</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
@@ -200,7 +211,7 @@
<property name="vexpand">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="edit:border">
<object class="GtkTextView" id="edit">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
@@ -210,7 +221,7 @@
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
@@ -224,16 +235,14 @@
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes" context="comment|label5">_Insert</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">author</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
@@ -246,8 +255,6 @@
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
</object>
@@ -297,15 +304,8 @@
<action-widget response="-6">cancel</action-widget>
<action-widget response="-11">help</action-widget>
</action-widgets>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-go-back</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-go-forward</property>
<child>
<placeholder/>
</child>
</object>
</interface>
diff --git a/include/svx/svxdlg.hxx b/include/svx/svxdlg.hxx
index 511677c..9603739 100644
--- a/include/svx/svxdlg.hxx
+++ b/include/svx/svxdlg.hxx
@@ -60,7 +60,10 @@ typedef const sal_uInt16* (*DialogGetRanges)();
typedef ::std::vector< OUString > TargetList;
namespace svx{ class SpellDialogChildWindow;}
namespace weld{ class Window; }
namespace weld{
class Dialog;
class Window;
}
class AbstractSvxDistributeDialog :public VclAbstractDialog
{
@@ -279,7 +282,7 @@ public:
virtual void SetValidateFramePosLink( const Link<SvxSwFrameValidation&,void>& rLink ) = 0;
};
class AbstractSvxPostItDialog :public VclAbstractDialog
class AbstractSvxPostItDialog : public VclAbstractDialog
{
protected:
virtual ~AbstractSvxPostItDialog() override = default;
@@ -294,7 +297,7 @@ public:
virtual void ShowLastAuthor(const OUString& rAuthor, const OUString& rDate) = 0;
virtual void DontChangeAuthor() = 0;
virtual void HideAuthor() = 0;
virtual vcl::Window * GetWindow() = 0;
virtual std::shared_ptr<weld::Dialog> GetDialog() = 0;
};
class SvxAbstractSplitTableDialog : public VclAbstractDialog
@@ -441,9 +444,7 @@ public:
virtual VclPtr<SfxAbstractDialog> CreateEventConfigDialog( vcl::Window* pParent,
const SfxItemSet& rAttr,
const css::uno::Reference< css::frame::XFrame >& _rxFrame )=0;
virtual VclPtr<AbstractSvxPostItDialog> CreateSvxPostItDialog( vcl::Window* pParent,
const SfxItemSet& rCoreSet,
bool bPrevNext = false) = 0;
virtual VclPtr<AbstractSvxPostItDialog> CreateSvxPostItDialog(weld::Window* pParent, const SfxItemSet& rCoreSet, bool bPrevNext = false) = 0;
virtual VclPtr<VclAbstractDialog> CreateSvxScriptOrgDialog( vcl::Window* pParent, const OUString& rLanguage ) override = 0;
virtual DialogGetRanges GetDialogGetRangesFunc() = 0;
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 97bea29..52585c6 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -143,6 +143,8 @@ public:
virtual OUString get_title() const = 0;
virtual void set_busy_cursor(bool bBusy) = 0;
virtual void window_move(int x, int y) = 0;
virtual bool get_extents_relative_to(Window& rRelative, int& x, int& y, int& width, int& height)
= 0;
virtual css::uno::Reference<css::awt::XWindow> GetXWindow() = 0;
@@ -606,9 +608,14 @@ class VCL_DLLPUBLIC TextView : virtual public Container
public:
virtual void set_text(const OUString& rText) = 0;
virtual OUString get_text() const = 0;
virtual Selection get_selection() const = 0;
virtual void set_selection(const Selection&) = 0;
virtual void select_region(int nStartPos, int nEndPos) = 0;
virtual bool get_selection_bounds(int& rStartPos, int& rEndPos) = 0;
virtual void set_editable(bool bEditable) = 0;
int get_height_rows(int nRows) const
{
//can improve this if needed
return get_text_height() * nRows;
}
};
class VCL_DLLPUBLIC Expander : virtual public Container
@@ -745,7 +752,7 @@ private:
protected:
std::unique_ptr<weld::Builder> m_xBuilder;
std::unique_ptr<weld::Dialog> m_xDialog;
std::shared_ptr<weld::Dialog> m_xDialog;
public:
GenericDialogController(weld::Widget* pParent, const OUString& rUIFile,
diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx
index e59bf0e..4ec5864 100644
--- a/sc/source/ui/docshell/docsh3.cxx
+++ b/sc/source/ui/docshell/docsh3.cxx
@@ -630,7 +630,7 @@ void ScDocShell::SetChangeComment( ScChangeAction* pAction, const OUString& rCom
}
}
void ScDocShell::ExecuteChangeCommentDialog( ScChangeAction* pAction, vcl::Window* pParent, bool bPrevNext)
void ScDocShell::ExecuteChangeCommentDialog( ScChangeAction* pAction, weld::Window* pParent, bool bPrevNext)
{
if (!pAction) return; // without action is nothing..
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index 8b53fa8..bad5729 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -237,7 +237,7 @@ public:
ScChangeAction* GetChangeAction( const ScAddress& rPos );
void SetChangeComment( ScChangeAction* pAction, const OUString& rComment );
void ExecuteChangeCommentDialog( ScChangeAction* pAction, vcl::Window* pParent, bool bPrevNext = true );
void ExecuteChangeCommentDialog( ScChangeAction* pAction, weld::Window* pParent, bool bPrevNext = true );
/// Protect/unprotect ChangeTrack and return <TRUE/> if
/// protection was successfully changed.
/// If bJustQueryIfProtected==sal_True protection is not
diff --git a/sc/source/ui/inc/redcom.hxx b/sc/source/ui/inc/redcom.hxx
index 622ac2e..245e259 100644
--- a/sc/source/ui/inc/redcom.hxx
+++ b/sc/source/ui/inc/redcom.hxx
@@ -20,7 +20,7 @@
#ifndef INCLUDED_SC_SOURCE_UI_INC_REDCOM_HXX
#define INCLUDED_SC_SOURCE_UI_INC_REDCOM_HXX
#include <vcl/dialog.hxx>
#include <vcl/weld.hxx>
#include <chgtrack.hxx>
class ScDocShell;
@@ -44,7 +44,7 @@ class ScRedComDialog final
public:
ScRedComDialog( vcl::Window* pParent, const SfxItemSet& rCoreSet,
ScRedComDialog( weld::Window* pParent, const SfxItemSet& rCoreSet,
ScDocShell *pShell, ScChangeAction *pAction, bool bPrevNext);
~ScRedComDialog();
diff --git a/sc/source/ui/miscdlgs/acredlin.cxx b/sc/source/ui/miscdlgs/acredlin.cxx
index 03f89b6..b40d198 100644
--- a/sc/source/ui/miscdlgs/acredlin.cxx
+++ b/sc/source/ui/miscdlgs/acredlin.cxx
@@ -1692,7 +1692,7 @@ IMPL_LINK_NOARG(ScAcceptChgDlg, CommandHdl, SvSimpleTable*, void)
ScChangeAction* pScChangeAction=
static_cast<ScChangeAction*>(pEntryData->pData);
pViewData->GetDocShell()->ExecuteChangeCommentDialog( pScChangeAction, this,false);
pViewData->GetDocShell()->ExecuteChangeCommentDialog(pScChangeAction, GetFrameWeld(), false);
}
}
}
diff --git a/sc/source/ui/miscdlgs/redcom.cxx b/sc/source/ui/miscdlgs/redcom.cxx
index 45c90f0..9753c2e 100644
--- a/sc/source/ui/miscdlgs/redcom.cxx
+++ b/sc/source/ui/miscdlgs/redcom.cxx
@@ -25,7 +25,7 @@
#include <svx/svxdlg.hxx>
#include <svx/dialogs.hrc>
ScRedComDialog::ScRedComDialog( vcl::Window* pParent, const SfxItemSet& rCoreSet,
ScRedComDialog::ScRedComDialog( weld::Window* pParent, const SfxItemSet& rCoreSet,
ScDocShell *pShell, ScChangeAction *pAction, bool bPrevNext)
: pChangeAction(nullptr)
, pDocShell(nullptr)
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index a31a91f..5c4d1b0b 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -1016,7 +1016,7 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
}
else
{
pDocSh->ExecuteChangeCommentDialog( pAction, GetDialogParent() );
pDocSh->ExecuteChangeCommentDialog(pAction, GetFrameWeld());
rReq.Done();
}
}
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index c7931d7..f8b37a6 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -28,6 +28,7 @@
#include <vcl/mapmod.hxx>
#include <vcl/vclptr.hxx>
#include <vcl/lazydelete.hxx>
#include <vcl/weld.hxx>
namespace com { namespace sun { namespace star { namespace accessibility {
class XAccessible; } } } }
@@ -168,6 +169,7 @@ class SW_DLLPUBLIC SwViewShell : public sw::Ring<SwViewShell>
protected:
static ShellResource* mpShellRes; ///< Resources for the Shell.
static vcl::DeleteOnDeinit< VclPtr<vcl::Window> > mpCareWindow; ///< Avoid this window.
static vcl::DeleteOnDeinit< std::shared_ptr<weld::Dialog> > mpCareDialog; ///< Avoid this window.
SwRect maVisArea; ///< The modern version of VisArea.
rtl::Reference<SwDoc> mxDoc; ///< The document; never 0.
@@ -429,6 +431,9 @@ public:
static vcl::Window* GetCareWin(SwViewShell const & rVSh)
{ return (*mpCareWindow.get()) ? mpCareWindow.get()->get() : CareChildWin(rVSh); }
static vcl::Window* CareChildWin(SwViewShell const & rVSh);
static void SetCareDialog(const std::shared_ptr<weld::Dialog>& rNew);
static weld::Dialog* GetCareDialog()
{ return (*mpCareDialog.get()) ? mpCareDialog.get()->get() : nullptr; }
SfxViewShell *GetSfxViewShell() const { return mpSfxViewShell; }
void SetSfxViewShell(SfxViewShell *pNew) { mpSfxViewShell = pNew; }
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 7c536e8..609afdf 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -91,6 +91,7 @@
bool SwViewShell::mbLstAct = false;
ShellResource *SwViewShell::mpShellRes = nullptr;
vcl::DeleteOnDeinit< VclPtr<vcl::Window> > SwViewShell::mpCareWindow(new VclPtr<vcl::Window>);
vcl::DeleteOnDeinit<std::shared_ptr<weld::Dialog>> SwViewShell::mpCareDialog(new std::shared_ptr<weld::Dialog>);
static bool bInSizeNotify = false;
@@ -566,7 +567,7 @@ const SwRect& SwViewShell::VisArea() const
void SwViewShell::MakeVisible( const SwRect &rRect )
{
if ( !VisArea().IsInside( rRect ) || IsScrollMDI( this, rRect ) || GetCareWin(*this) )
if ( !VisArea().IsInside( rRect ) || IsScrollMDI( this, rRect ) || GetCareWin(*this) || GetCareDialog() )
{
if ( !IsViewLocked() )
{
@@ -2468,6 +2469,11 @@ void SwViewShell::SetCareWin( vcl::Window* pNew )
(*mpCareWindow.get()) = pNew;
}
void SwViewShell::SetCareDialog(const std::shared_ptr<weld::Dialog>& rNew)
{
(*mpCareDialog.get()) = rNew;
}
sal_uInt16 SwViewShell::GetPageCount() const
{
return GetLayout() ? GetLayout()->GetPageNum() : 1;
diff --git a/sw/source/uibase/misc/redlndlg.cxx b/sw/source/uibase/misc/redlndlg.cxx
index 6d1c674..29747e9 100644
--- a/sw/source/uibase/misc/redlndlg.cxx
+++ b/sw/source/uibase/misc/redlndlg.cxx
@@ -1088,7 +1088,7 @@ IMPL_LINK_NOARG(SwRedlineAcceptDlg, CommandHdl, SvSimpleTable*, void)
rRedline.GetRedlineData().GetTimeStamp() ),
SID_ATTR_POSTIT_DATE ));
ScopedVclPtr<AbstractSvxPostItDialog> pDlg(pFact->CreateSvxPostItDialog( m_pParentDlg, aSet ));
ScopedVclPtr<AbstractSvxPostItDialog> pDlg(pFact->CreateSvxPostItDialog(m_pParentDlg->GetFrameWeld(), aSet));
OSL_ENSURE(pDlg, "Dialog creation failed!");
pDlg->HideAuthor();
@@ -1116,7 +1116,7 @@ IMPL_LINK_NOARG(SwRedlineAcceptDlg, CommandHdl, SvSimpleTable*, void)
sTitle += SwResId(pResId);
pDlg->SetText(sTitle);
SwViewShell::SetCareWin(pDlg->GetWindow());
SwViewShell::SetCareDialog(pDlg->GetDialog());
if ( pDlg->Execute() == RET_OK )
{
@@ -1129,7 +1129,7 @@ IMPL_LINK_NOARG(SwRedlineAcceptDlg, CommandHdl, SvSimpleTable*, void)
}
pDlg.disposeAndClear();
SwViewShell::SetCareWin(nullptr);
SwViewShell::SetCareDialog(nullptr);
}
}
else if (nRet)
diff --git a/sw/source/uibase/shells/textfld.cxx b/sw/source/uibase/shells/textfld.cxx
index e65646e..bb2131f 100644
--- a/sw/source/uibase/shells/textfld.cxx
+++ b/sw/source/uibase/shells/textfld.cxx
@@ -592,7 +592,7 @@ void SwTextShell::ExecField(SfxRequest &rReq)
SvxAbstractDialogFactory* pFact2 = SvxAbstractDialogFactory::Create();
assert(pFact2 && "Dialog creation failed!");
ScopedVclPtr<AbstractSvxPostItDialog> pDlg(pFact2->CreateSvxPostItDialog( pMDI, aSet, bTravel ));
ScopedVclPtr<AbstractSvxPostItDialog> pDlg(pFact2->CreateSvxPostItDialog(pMDI->GetFrameWeld(), aSet, bTravel));
assert(pDlg && "Dialog creation failed!");
pDlg->HideAuthor();
@@ -605,7 +605,7 @@ void SwTextShell::ExecField(SfxRequest &rReq)
pDlg->SetNextHdl(LINK(this, SwTextShell, RedlineNextHdl));
}
SwViewShell::SetCareWin(pDlg->GetWindow());
SwViewShell::SetCareDialog(pDlg->GetDialog());
g_bNoInterrupt = true;
if ( pDlg->Execute() == RET_OK )
diff --git a/sw/source/uibase/uiview/viewport.cxx b/sw/source/uibase/uiview/viewport.cxx
index dba6610..affe271 100644
--- a/sw/source/uibase/uiview/viewport.cxx
+++ b/sw/source/uibase/uiview/viewport.cxx
@@ -401,10 +401,22 @@ void SwView::Scroll( const tools::Rectangle &rRect, sal_uInt16 nRangeX, sal_uInt
long nDiffY = 0;
vcl::Window* pCareWn = SwViewShell::GetCareWin(GetWrtShell());
if ( pCareWn )
weld::Dialog* pCareDialog = SwViewShell::GetCareDialog();
if (pCareWn || pCareDialog)
{
tools::Rectangle aDlgRect( GetEditWin().PixelToLogic(
pCareWn->GetWindowExtentsRelative( &GetEditWin() ) ) );
int x, y, width, height;
tools::Rectangle aDlgRect;
if (pCareWn)
{
aDlgRect = GetEditWin().PixelToLogic(pCareWn->GetWindowExtentsRelative(&GetEditWin()));
}
else if (pCareDialog && pCareDialog->get_extents_relative_to(*GetEditWin().GetFrameWeld(), x, y, width, height))
{
Point aTopLeft(GetEditWin().GetSystemWindow()->OutputToAbsoluteScreenPixel(Point(x, y)));
aTopLeft = GetEditWin().AbsoluteScreenToOutputPixel(aTopLeft);
aDlgRect = GetEditWin().PixelToLogic(tools::Rectangle(aTopLeft, Size(width, height)));
}
// Only if the dialogue is not the VisArea right or left:
if ( aDlgRect.Left() < m_aVisArea.Right() &&
aDlgRect.Right() > m_aVisArea.Left() )
@@ -505,7 +517,7 @@ void SwView::Scroll( const tools::Rectangle &rRect, sal_uInt16 nRangeX, sal_uInt
aPnt.setX( std::max( (GetLeftMargin( *this ) - lMin) + nLeftOfst, aPnt.X() ) );
}
m_aVisArea = aOldVisArea;
if( pCareWn )
if (pCareWn || pCareDialog)
{ // If we want to avoid only a dialogue, we do
// not want to go beyond the end of the document.
aPnt.setY( SetVScrollMax( aPnt.Y() ) );
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 56da3de..d06590d 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -528,6 +528,21 @@ public:
m_xWindow->SetPosPixel(Point(x, y));
}
SystemWindow* getWindow()
{
return m_xWindow.get();
}
virtual bool get_extents_relative_to(Window& rRelative, int& x, int &y, int& width, int &height) override
{
tools::Rectangle aRect(m_xWindow->GetWindowExtentsRelative(dynamic_cast<SalInstanceWindow&>(rRelative).getWindow()));
x = aRect.Left();
y = aRect.Top();
width = aRect.GetWidth();
height = aRect.GetHeight();
return true;
}
virtual ~SalInstanceWindow() override
{
clear_child_help(m_xWindow);
@@ -1373,14 +1388,17 @@ public:
return m_xTextView->GetText();
}
virtual Selection get_selection() const override
bool get_selection_bounds(int& rStartPos, int &rEndPos) override
{
return m_xTextView->GetSelection();
const Selection& rSelection = m_xTextView->GetSelection();
rStartPos = rSelection.Min();
rEndPos = rSelection.Max();
return rSelection.Len();
}
virtual void set_selection(const Selection& rSelection) override
virtual void select_region(int nStartPos, int nEndPos) override
{
m_xTextView->SetSelection(rSelection);
m_xTextView->SetSelection(Selection(nStartPos, nEndPos < 0 ? SELECTION_MAX : nEndPos));
}
virtual void set_editable(bool bEditable) override
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 9425d93..3eded53 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -1700,6 +1700,16 @@ public:
gtk_window_move(m_pWindow, x, y);
}
virtual bool get_extents_relative_to(Window& rRelative, int& x, int &y, int& width, int &height) override
{
//this is sadly futile under wayland, so we can't tell where a dialog is in order to allow
//the document underneath to auto-scroll to place content in a visible location
gboolean ret = gtk_widget_translate_coordinates(dynamic_cast<GtkInstanceWindow&>(rRelative).getWidget(), m_pWidget, 0, 0, &x, &y);
width = gtk_widget_get_allocated_width(m_pWidget);
height = gtk_widget_get_allocated_height(m_pWidget);
return ret;
}
virtual ~GtkInstanceWindow() override
{
if (m_xWindow.is())
@@ -3176,20 +3186,22 @@ public:
return sRet;
}
virtual Selection get_selection() const override
virtual bool get_selection_bounds(int& rStartPos, int& rEndPos) override
{
GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView);
GtkTextIter start, end;
gtk_text_buffer_get_selection_bounds(pBuffer, &start, &end);
return Selection(gtk_text_iter_get_offset(&start), gtk_text_iter_get_offset(&end));
rStartPos = gtk_text_iter_get_offset(&start);
rEndPos = gtk_text_iter_get_offset(&end);
return rStartPos != rEndPos;
}
virtual void set_selection(const Selection& rSelection) override
virtual void select_region(int nStartPos, int nEndPos) override
{
GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView);
GtkTextIter start, end;
gtk_text_buffer_get_iter_at_offset(pBuffer, &start, rSelection.Min());
gtk_text_buffer_get_iter_at_offset(pBuffer, &end, rSelection.Max());
gtk_text_buffer_get_iter_at_offset(pBuffer, &start, nStartPos);
gtk_text_buffer_get_iter_at_offset(pBuffer, &end, nEndPos);
gtk_text_buffer_select_range(pBuffer, &start, &end);
GtkTextMark* mark = gtk_text_buffer_create_mark(pBuffer, "scroll", &end, true);
gtk_text_view_scroll_mark_onscreen(m_pTextView, mark);