diff options
29 files changed, 1460 insertions, 1559 deletions
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in index 50b8118b0b91..5cc174b9ab3a 100644 --- a/extras/source/glade/libreoffice-catalog.xml.in +++ b/extras/source/glade/libreoffice-catalog.xml.in @@ -287,9 +287,6 @@ <glade-widget-class title="Edit" name="foruilo-ArgEdit" generic-name="Edit" parent="GtkEntry" icon-name="widget-gtk-textentry"/> - <glade-widget-class title="Edit Box" name="foruilo-EditBox" - generic-name="Edit Box" parent="GtkTextView" - icon-name="widget-gtk-textview"/> <glade-widget-class title="URL Entry" name="cuilo-SvxHyperURLBox" generic-name="URL Entry" parent="GtkEntry" @@ -399,13 +396,6 @@ generic-name="DriverListControl" parent="GtkEntry" icon-name="widget-gtk-combobox"/> - <glade-widget-class title="Formula ListBox" name="foruilo-FormulaListBox" - generic-name="Formula ListBox" parent="GtkTreeView" - icon-name="widget-gtk-treeview"/> - <glade-widget-class title="Formula ListBox" name="foruilo-StructListBox" - generic-name="Formula ListBox" parent="GtkTreeView" - icon-name="widget-gtk-treeview"/> - <glade-widget-class title="Statusbar" name="svxlo-StatusBar" generic-name="Statusbar" parent="GtkStatusbar" icon-name="widget-gtk-statusbar"/> diff --git a/formula/source/ui/dlg/ControlHelper.hxx b/formula/source/ui/dlg/ControlHelper.hxx index a5f975d64b65..8ec7d504279e 100644 --- a/formula/source/ui/dlg/ControlHelper.hxx +++ b/formula/source/ui/dlg/ControlHelper.hxx @@ -24,58 +24,28 @@ namespace formula { -// class EditBox -class EditBox : public Control -{ -private: - - VclPtr<MultiLineEdit> pMEdit; - Link<EditBox&,void> aSelChangedLink; - Selection aOldSel; - - DECL_LINK(ChangedHdl, void *, void); - -protected: - - virtual bool PreNotify( NotifyEvent& rNEvt ) override; - virtual void Resize() override; - virtual void GetFocus() override; - - -public: - EditBox( vcl::Window* pParent, WinBits nBits ); - - virtual ~EditBox() override; - virtual void dispose() override; - - MultiLineEdit* GetEdit() {return pMEdit;} - - void SetSelChangedHdl( const Link<EditBox&,void>& rLink ) { aSelChangedLink = rLink; } - - void UpdateOldSel(); -}; - +class ParaWin; // class ArgEdit -class ArgEdit : public RefEdit +class ArgEdit : public WeldRefEdit { public: - ArgEdit( vcl::Window* pParent, WinBits nBits ); - virtual ~ArgEdit() override; - virtual void dispose() override; + ArgEdit(std::unique_ptr<weld::Entry> xControl); - void Init( ArgEdit* pPrevEdit, ArgEdit* pNextEdit, - ScrollBar& rArgSlider, sal_uInt16 nArgCount ); + void Init(ArgEdit* pPrevEdit, ArgEdit* pNextEdit, + weld::ScrolledWindow& rArgSlider, + ParaWin& rParaWin, sal_uInt16 nArgCount); protected: - virtual void KeyInput( const KeyEvent& rKEvt ) override; + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); private: - VclPtr<ArgEdit> pEdPrev; - VclPtr<ArgEdit> pEdNext; - VclPtr<ScrollBar> pSlider; - sal_uInt16 nArgs; + ArgEdit* pEdPrev; + ArgEdit* pEdNext; + weld::ScrolledWindow* pSlider; + ParaWin* pParaWin; + sal_uInt16 nArgs; }; @@ -89,24 +59,24 @@ private: Link<ArgInput&,void> aEdFocusLink; Link<ArgInput&,void> aEdModifyLink; - VclPtr<FixedText> pFtArg; - VclPtr<PushButton> pBtnFx; - VclPtr<ArgEdit> pEdArg; - VclPtr<RefButton> pRefBtn; + weld::Label*pFtArg; + weld::Button* pBtnFx; + ArgEdit* pEdArg; + WeldRefButton* pRefBtn; - DECL_LINK( FxBtnClickHdl, Button*, void ); - DECL_LINK( FxBtnFocusHdl, Control&, void ); - DECL_LINK( EdFocusHdl, Control&, void ); - DECL_LINK( EdModifyHdl, Edit&, void ); + DECL_LINK( FxBtnClickHdl, weld::Button&, void ); + DECL_LINK( FxBtnFocusHdl, weld::Widget&, void ); + DECL_LINK( EdFocusHdl, WeldRefEdit&, void ); + DECL_LINK( EdModifyHdl, WeldRefEdit&, void ); public: ArgInput(); - void InitArgInput ( FixedText* pftArg, - PushButton* pbtnFx, - ArgEdit* pedArg, - RefButton* prefBtn); + void InitArgInput(weld::Label* pftArg, + weld::Button* pbtnFx, + ArgEdit* pedArg, + WeldRefButton* prefBtn); void SetArgName(const OUString &aArg); OUString GetArgName(); @@ -115,9 +85,9 @@ public: void SetArgVal(const OUString &aVal); OUString GetArgVal(); - void SetArgSelection (const Selection& rSel); + void SelectAll(); - ArgEdit* GetArgEdPtr() {return pEdArg;} + ArgEdit* GetArgEdPtr() { return pEdArg; } void SetFxClickHdl( const Link<ArgInput&,void>& rLink ) { aFxClickLink = rLink; } diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx index e7c5fede138d..73a8d30ed8ea 100644 --- a/formula/source/ui/dlg/formula.cxx +++ b/formula/source/ui/dlg/formula.cxx @@ -61,9 +61,6 @@ #include <map> // For tab page -#define TP_FUNCTION 1 -#define TP_STRUCT 2 - #define TOKEN_OPEN 0 #define TOKEN_CLOSE 1 #define TOKEN_SEP 2 @@ -75,9 +72,9 @@ using namespace ::com::sun::star; class FormulaDlg_Impl { public: - ::std::pair<RefButton*, RefEdit*> + static ::std::pair<RefButton*, RefEdit*> RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ); - static ::std::pair<WeldRefButton*, WeldRefEdit*> + ::std::pair<WeldRefButton*, WeldRefEdit*> RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ); void RefInputStartAfter(); void RefInputDoneAfter( bool bForced ); @@ -88,8 +85,8 @@ public: sal_Int32 GetFunctionPos(sal_Int32 nPos); void ClearAllParas(); - void MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, const FormulaToken* pFuncToken, - const FormulaToken* _pToken, long Count ); + void MakeTree(StructPage* _pTree, weld::TreeIter* pParent, const FormulaToken* pFuncToken, + const FormulaToken* _pToken, long Count); void fillTree(StructPage* _pTree); void UpdateTokenArray( const OUString& rStrExp); OUString RepairFormula(const OUString& aFormula); @@ -120,20 +117,22 @@ public: void UpdateParaWin( const Selection& _rSelection, const OUString& _sRefStr); void SetData( sal_Int32 nFStart, sal_Int32 nNextFStart, sal_Int32 nNextFEnd, sal_Int32& PrivStart, sal_Int32& PrivEnd); - void PreNotify( NotifyEvent const & rNEvt ); - RefEdit* GetCurrRefEdit(); + WeldRefEdit* GetCurrRefEdit(); const FormulaHelper& GetFormulaHelper() const { return m_aFormulaHelper;} void InitFormulaOpCodeMapper(); + void UpdateOldSel(); + void FormulaCursor(); + DECL_LINK( ModifyHdl, ParaWin&, void ); DECL_LINK( FxHdl, ParaWin&, void ); - DECL_LINK( MatrixHdl, Button*, void ); - DECL_LINK( FormulaHdl, Edit&, void); - DECL_LINK( FormulaCursorHdl, EditBox&, void ); - DECL_LINK( BtnHdl, Button*, void ); + DECL_LINK( MatrixHdl, weld::Button&, void ); + DECL_LINK( FormulaHdl, weld::TextView&, void); + DECL_LINK( FormulaCursorHdl, weld::TextView&, void ); + DECL_LINK( BtnHdl, weld::Button&, void ); DECL_LINK( DblClkHdl, FuncPage&, void ); DECL_LINK( FuncSelHdl, FuncPage&, void ); DECL_LINK( StructSelHdl, StructPage&, void ); @@ -148,44 +147,12 @@ public: mutable const sheet::FormulaOpCodeMapEntry* m_pFunctionOpCodesEnd; ::std::map<const FormulaToken*, sheet::FormulaToken> m_aTokenMap; IFormulaEditorHelper* m_pHelper; - VclPtr<Dialog> m_pParent; - VclPtr<TabControl> m_pTabCtrl; - VclPtr<VclVBox> m_pParaWinBox; - VclPtr<ParaWin> m_pParaWin; - VclPtr<FixedText> m_pFtHeadLine; - VclPtr<FixedText> m_pFtFuncName; - VclPtr<FixedText> m_pFtFuncDesc; - - VclPtr<FixedText> m_pFtEditName; - - VclPtr<FixedText> m_pFtResult; - VclPtr<Edit> m_pWndResult; - - VclPtr<FixedText> m_pFtFormula; - VclPtr<EditBox> m_pMEFormula; - - VclPtr<CheckBox> m_pBtnMatrix; - VclPtr<CancelButton> m_pBtnCancel; - - VclPtr<PushButton> m_pBtnBackward; - VclPtr<PushButton> m_pBtnForward; - VclPtr<OKButton> m_pBtnEnd; + weld::Dialog& m_rDialog; + weld::Builder& m_rParent; - VclPtr<RefEdit> m_pEdRef; - VclPtr<RefButton> m_pRefBtn; - - VclPtr<FixedText> m_pFtFormResult; - VclPtr<Edit> m_pWndFormResult; - - VclPtr<RefEdit> m_pTheRefEdit; - VclPtr<RefButton> m_pTheRefButton; - VclPtr<FuncPage> m_pFuncPage; - VclPtr<StructPage> m_pStructPage; OUString m_aOldFormula; bool m_bStructUpdate; - VclPtr<MultiLineEdit> m_pMEdit; bool m_bUserMatrixFlag; - Idle m_aIdle; const OUString m_aTitle1; const OUString m_aTitle2; @@ -194,7 +161,6 @@ public: OString m_aEditHelpId; OString m_aOldHelp; - bool m_bIsShutDown; bool m_bMakingTree; // in method of constructing tree bool m_bEditFlag; @@ -205,157 +171,172 @@ public: sal_Int32 m_nFuncExpStart; ///< current formula position for treeview results - FormulaDlg_Impl(Dialog* pParent - , bool _bSupportFunctionResult - , bool _bSupportResult - , bool _bSupportMatrix - , IFormulaEditorHelper* _pHelper - , const IFunctionManager* _pFunctionMgr - , IControlReferenceHandler* _pDlg); - ~FormulaDlg_Impl(); + int m_nSelectionStart; + int m_nSelectionEnd; -}; + WeldRefEdit* m_pTheRefEdit; + WeldRefButton* m_pTheRefButton; + + std::unique_ptr<weld::Notebook> m_xTabCtrl; + std::unique_ptr<weld::Container> m_xParaWinBox; + std::unique_ptr<ParaWin> m_xParaWin; + std::unique_ptr<weld::Label> m_xFtHeadLine; + std::unique_ptr<weld::Label> m_xFtFuncName; + std::unique_ptr<weld::Label> m_xFtFuncDesc; + + std::unique_ptr<weld::Label> m_xFtEditName; + + std::unique_ptr<weld::Label> m_xFtResult; + std::unique_ptr<weld::Entry> m_xWndResult; -FormulaDlg_Impl::FormulaDlg_Impl(Dialog* pParent - , bool _bSupportFunctionResult - , bool _bSupportResult - , bool _bSupportMatrix - , IFormulaEditorHelper* _pHelper - , const IFunctionManager* _pFunctionMgr - , IControlReferenceHandler* _pDlg) - : - m_pFunctionOpCodesEnd(nullptr), - m_pHelper (_pHelper), - m_pParent (pParent), - m_pTheRefEdit (nullptr), - m_pTheRefButton (nullptr), - m_pMEdit (nullptr), - m_bUserMatrixFlag(false), - m_aTitle1 ( ForResId( STR_TITLE1 ) ), - m_aTitle2 ( ForResId( STR_TITLE2 ) ), - m_aFormulaHelper(_pFunctionMgr), - m_bIsShutDown (false), - m_bMakingTree (false), - m_pFuncDesc (nullptr), - m_nArgs (0), - m_nFuncExpStart (0) -{ - pParent->get(m_pParaWinBox, "BOX"); - pParent->get(m_pTabCtrl, "tabs"); - pParent->get(m_pFtHeadLine, "headline"); - pParent->get(m_pFtFuncName, "funcname"); - pParent->get(m_pFtFuncDesc, "funcdesc"); - pParent->get(m_pFtEditName, "editname"); - pParent->get(m_pFtResult, "label2"); - pParent->get(m_pWndResult, "result"); - pParent->get(m_pFtFormula, "formula"); + std::unique_ptr<weld::Label> m_xFtFormula; + std::unique_ptr<weld::TextView> m_xMEdit; + std::unique_ptr<weld::CheckButton> m_xBtnMatrix; + std::unique_ptr<weld::Button> m_xBtnCancel; + + std::unique_ptr<weld::Button> m_xBtnBackward; + std::unique_ptr<weld::Button> m_xBtnForward; + std::unique_ptr<weld::Button> m_xBtnEnd; + + std::unique_ptr<weld::Label> m_xFtFormResult; + std::unique_ptr<weld::Entry> m_xWndFormResult; + + std::unique_ptr<WeldRefEdit> m_xEdRef; + std::unique_ptr<WeldRefButton> m_xRefBtn; + + std::unique_ptr<FuncPage> m_xFuncPage; + std::unique_ptr<StructPage> m_xStructPage; + + FormulaDlg_Impl(weld::Dialog& rDialog, + weld::Builder& rBuilder, + bool _bSupportFunctionResult, + bool _bSupportResult, + bool _bSupportMatrix, + IFormulaEditorHelper* _pHelper, + const IFunctionManager* _pFunctionMgr, + IControlReferenceHandler* _pDlg); + ~FormulaDlg_Impl(); +}; + +FormulaDlg_Impl::FormulaDlg_Impl(weld::Dialog& rDialog, + weld::Builder& rBuilder, + bool _bSupportFunctionResult, + bool _bSupportResult, + bool _bSupportMatrix, + IFormulaEditorHelper* _pHelper, + const IFunctionManager* _pFunctionMgr, + IControlReferenceHandler* _pDlg) + : m_pFunctionOpCodesEnd(nullptr) + , m_pHelper(_pHelper) + , m_rDialog(rDialog) + , m_rParent(rBuilder) + , m_bUserMatrixFlag(false) + , m_aTitle1( ForResId( STR_TITLE1 ) ) + , m_aTitle2( ForResId( STR_TITLE2 ) ) + , m_aFormulaHelper(_pFunctionMgr) + , m_bMakingTree(false) + , m_pFuncDesc(nullptr) + , m_nArgs(0) + , m_nFuncExpStart(0) + , m_nSelectionStart(-1) + , m_nSelectionEnd(-1) + , m_pTheRefEdit(nullptr) + , m_pTheRefButton(nullptr) + , m_xTabCtrl(rBuilder.weld_notebook("tabs")) + , m_xParaWinBox(rBuilder.weld_container("BOX")) + , m_xFtHeadLine(rBuilder.weld_label("headline")) + , m_xFtFuncName(rBuilder.weld_label("funcname")) + , m_xFtFuncDesc(rBuilder.weld_label("funcdesc")) + , m_xFtEditName(rBuilder.weld_label("editname")) + , m_xFtResult(rBuilder.weld_label("label2")) + , m_xWndResult(rBuilder.weld_entry("result")) + , m_xFtFormula(rBuilder.weld_label("formula")) + , m_xMEdit(rBuilder.weld_text_view("ed_formula")) + , m_xBtnMatrix(rBuilder.weld_check_button("array")) + , m_xBtnCancel(rBuilder.weld_button("cancel")) + , m_xBtnBackward(rBuilder.weld_button("back")) + , m_xBtnForward(rBuilder.weld_button("next")) + , m_xBtnEnd(rBuilder.weld_button("ok")) + , m_xFtFormResult(rBuilder.weld_label("label1")) + , m_xWndFormResult(rBuilder.weld_entry("formula_result")) + , m_xEdRef(new WeldRefEdit(rBuilder.weld_entry("ED_REF"))) + , m_xRefBtn(new WeldRefButton(rBuilder.weld_button("RB_REF"))) +{ //Space for two lines of text - m_pFtHeadLine->SetText("X\nX\n"); - long nHeight = m_pFtHeadLine->GetOptimalSize().Height(); - m_pFtHeadLine->set_height_request(nHeight); - m_pFtHeadLine->SetText(""); - - m_pFtFuncName->SetText("X\nX\n"); - nHeight = m_pFtFuncName->GetOptimalSize().Height(); - m_pFtFuncName->set_height_request(nHeight); - m_pFtFuncDesc->set_height_request(nHeight); - m_pFtFuncName->SetText(""); - - pParent->get(m_pMEFormula, "ed_formula"); - Size aSize(pParent->LogicToPixel(Size(203, 43), MapMode(MapUnit::MapAppFont))); - m_pMEFormula->set_height_request(aSize.Height()); - m_pMEFormula->set_width_request(aSize.Width()); - pParent->get(m_pBtnMatrix, "array"); - pParent->get(m_pBtnCancel, "cancel"); - pParent->get(m_pBtnBackward, "back"); - pParent->get(m_pBtnForward, "next"); - pParent->get(m_pBtnEnd, "ok"); - pParent->get(m_pFtFormResult, "label1"); - pParent->get(m_pWndFormResult, "formula_result"); - pParent->get(m_pEdRef, "ED_REF"); - m_pEdRef->SetReferences(_pDlg, m_pFtEditName); - pParent->get(m_pRefBtn, "RB_REF"); - m_pRefBtn->SetReferences(_pDlg, m_pEdRef); - - m_pParaWin = VclPtr<ParaWin>::Create(m_pParaWinBox, _pDlg); - m_pParaWin->Show(); - m_pParaWinBox->Hide(); - m_pFtEditName->Hide(); - m_pEdRef->Hide(); - m_pRefBtn->Hide(); - - m_pMEdit = m_pMEFormula->GetEdit(); - - m_pMEdit->SetAccessibleName(m_pFtFormula->GetText()); - - m_aEditHelpId = m_pMEdit->GetHelpId(); + m_xFtHeadLine->set_label("X\nX\n"); + auto nHeight = m_xFtHeadLine->get_preferred_size().Height(); + m_xFtHeadLine->set_size_request(-1, nHeight); + m_xFtHeadLine->set_label(""); + + m_xFtFuncName->set_label("X\nX\n"); + nHeight = m_xFtFuncName->get_preferred_size().Height(); + m_xFtFuncName->set_size_request(-1, nHeight); + m_xFtFuncDesc->set_size_request(-1, nHeight); + m_xFtFuncName->set_label(""); + + m_xMEdit->set_size_request(m_xMEdit->get_approximate_digit_width() * 62, + m_xMEdit->get_height_rows(5)); + + m_xEdRef->SetReferences(_pDlg, m_xFtEditName.get()); + m_xRefBtn->SetReferences(_pDlg, m_xEdRef.get()); + + m_xParaWin.reset(new ParaWin(m_xParaWinBox.get(), _pDlg)); + m_xParaWin->Show(); + m_xParaWinBox->hide(); + m_xFtEditName->hide(); + m_xEdRef->GetWidget()->hide(); + m_xRefBtn->GetWidget()->hide(); + + m_xMEdit->set_accessible_name(m_xFtFormula->get_label()); + + m_aEditHelpId = m_xMEdit->get_help_id(); m_bEditFlag =false; m_bStructUpdate =true; - m_pParaWin->SetArgModifiedHdl( LINK( this, FormulaDlg_Impl, ModifyHdl ) ); - m_pParaWin->SetFxHdl( LINK( this, FormulaDlg_Impl, FxHdl ) ); + m_xParaWin->SetArgModifiedHdl( LINK( this, FormulaDlg_Impl, ModifyHdl ) ); + m_xParaWin->SetFxHdl( LINK( this, FormulaDlg_Impl, FxHdl ) ); - m_pFuncPage = VclPtr<FuncPage>::Create( m_pTabCtrl, _pFunctionMgr); - m_pStructPage = VclPtr<StructPage>::Create( m_pTabCtrl); - m_pFuncPage->Hide(); - m_pStructPage->Hide(); - m_pTabCtrl->SetTabPage( TP_FUNCTION, m_pFuncPage); - m_pTabCtrl->SetTabPage( TP_STRUCT, m_pStructPage); + m_xFuncPage.reset(new FuncPage(m_xTabCtrl->get_page("function"), _pFunctionMgr)); + m_xStructPage.reset(new StructPage(m_xTabCtrl->get_page("struct"))); + m_xTabCtrl->set_current_page("function"); - m_aOldHelp = pParent->GetHelpId(); // HelpId from resource always for "Page 1" + m_aOldHelp = m_rDialog.get_help_id(); // HelpId from resource always for "Page 1" - m_pFtResult->Show( _bSupportResult ); - m_pWndResult->Show( _bSupportResult ); + m_xFtResult->set_visible( _bSupportResult ); + m_xWndResult->set_visible( _bSupportResult ); - m_pFtFormResult->Show( _bSupportFunctionResult ); - m_pWndFormResult->Show( _bSupportFunctionResult ); + m_xFtFormResult->set_visible( _bSupportFunctionResult ); + m_xWndFormResult->set_visible( _bSupportFunctionResult ); if ( _bSupportMatrix ) - m_pBtnMatrix->SetClickHdl( LINK( this, FormulaDlg_Impl, MatrixHdl ) ); + m_xBtnMatrix->connect_clicked( LINK( this, FormulaDlg_Impl, MatrixHdl ) ); else - m_pBtnMatrix->Hide(); + m_xBtnMatrix->hide(); - m_pBtnCancel ->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) ); - m_pBtnEnd ->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) ); - m_pBtnForward ->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) ); - m_pBtnBackward->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) ); + m_xBtnCancel->connect_clicked( LINK( this, FormulaDlg_Impl, BtnHdl ) ); + m_xBtnEnd->connect_clicked( LINK( this, FormulaDlg_Impl, BtnHdl ) ); + m_xBtnForward->connect_clicked( LINK( this, FormulaDlg_Impl, BtnHdl ) ); + m_xBtnBackward->connect_clicked( LINK( this, FormulaDlg_Impl, BtnHdl ) ); - m_pFuncPage->SetDoubleClickHdl( LINK( this, FormulaDlg_Impl, DblClkHdl ) ); - m_pFuncPage->SetSelectHdl( LINK( this, FormulaDlg_Impl, FuncSelHdl) ); - m_pStructPage->SetSelectionHdl( LINK( this, FormulaDlg_Impl, StructSelHdl ) ); - m_pMEdit->SetModifyHdl( LINK( this, FormulaDlg_Impl, FormulaHdl ) ); - m_pMEFormula->SetSelChangedHdl( LINK( this, FormulaDlg_Impl, FormulaCursorHdl ) ); + m_xFuncPage->SetDoubleClickHdl( LINK( this, FormulaDlg_Impl, DblClkHdl ) ); + m_xFuncPage->SetSelectHdl( LINK( this, FormulaDlg_Impl, FuncSelHdl) ); + m_xStructPage->SetSelectionHdl( LINK( this, FormulaDlg_Impl, StructSelHdl ) ); + m_xMEdit->connect_changed( LINK( this, FormulaDlg_Impl, FormulaHdl ) ); + m_xMEdit->connect_cursor_position( LINK( this, FormulaDlg_Impl, FormulaCursorHdl ) ); - vcl::Font aFntLight = m_pFtFormula->GetFont(); - aFntLight.SetTransparent( true ); + vcl::Font aFntLight = m_xFtFormula->get_font(); vcl::Font aFntBold = aFntLight; aFntBold.SetWeight( WEIGHT_BOLD ); - m_pParaWin->SetArgumentFonts( aFntBold, aFntLight); - - // function description for choosing a function is no longer in a different color - - m_pFtHeadLine->SetFont(aFntBold); - m_pFtFuncName->SetFont(aFntLight); - m_pFtFuncDesc->SetFont(aFntLight); + m_xParaWin->SetArgumentFonts( aFntBold, aFntLight); } FormulaDlg_Impl::~FormulaDlg_Impl() { - if (m_aIdle.IsActive()) - { - m_aIdle.ClearInvokeHandler(); - m_aIdle.Stop(); - } - m_bIsShutDown = true; // Set it in order to PreNotify not to save GetFocus. - - m_pTabCtrl->RemovePage(TP_FUNCTION); - m_pTabCtrl->RemovePage(TP_STRUCT); + m_xTabCtrl->remove_page("function"); + m_xTabCtrl->remove_page("struct"); - m_pStructPage.disposeAndClear(); - m_pFuncPage.disposeAndClear(); - m_pParaWin.disposeAndClear(); DeleteArgs(); } @@ -363,37 +344,23 @@ void FormulaDlg_Impl::StoreFormEditData(FormEditData* pData) { if (pData) // it won't be destroyed via Close { - pData->SetFStart(m_pMEdit->GetSelection().Min()); - pData->SetSelection(m_pMEdit->GetSelection()); + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); - if (m_pTabCtrl->GetCurPageId() == TP_FUNCTION) + pData->SetFStart(nStartPos); + pData->SetSelection(Selection(nStartPos, nEndPos)); + + if (m_xTabCtrl->get_current_page_ident() == "function") pData->SetMode( FormulaDlgMode::Formula ); else pData->SetMode( FormulaDlgMode::Edit ); - pData->SetUndoStr(m_pMEdit->GetText()); - pData->SetMatrixFlag(m_pBtnMatrix->IsChecked()); + pData->SetUndoStr(m_xMEdit->get_text()); + pData->SetMatrixFlag(m_xBtnMatrix->get_active()); } } - -void FormulaDlg_Impl::PreNotify( NotifyEvent const & rNEvt ) -{ - if (m_bIsShutDown) - return; - MouseNotifyEvent nSwitch = rNEvt.GetType(); - if (nSwitch != MouseNotifyEvent::GETFOCUS) - return; - vcl::Window* pWin = rNEvt.GetWindow(); - if (!pWin) - return; - if (m_aIdle.IsActive()) // will be destroyed via Close - return; - FormEditData* pData = m_pHelper->getFormEditData(); - if (!pData) - return; - pData->SetFocusWindow(pWin); -} - void FormulaDlg_Impl::InitFormulaOpCodeMapper() { if ( m_xOpCodeMapper.is() ) @@ -426,7 +393,7 @@ sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos) const sal_Unicode sep = m_pHelper->getFunctionManager()->getSingleToken(IFunctionManager::eSep); sal_Int32 nFuncPos = SAL_MAX_INT32; - OUString aFormString = m_aFormulaHelper.GetCharClass()->uppercase(m_pMEdit->GetText()); + OUString aFormString = m_aFormulaHelper.GetCharClass()->uppercase(m_xMEdit->get_text()); const uno::Reference< sheet::XFormulaParser > xParser(m_pHelper->getFormulaParser()); const table::CellAddress aRefPos(m_pHelper->getReferencePosition()); @@ -450,7 +417,7 @@ sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos) if ( !m_bUserMatrixFlag && FormulaCompiler::IsMatrixFunction(static_cast<OpCode>(eOp)) ) { - m_pBtnMatrix->Check(); + m_xBtnMatrix->set_active(true); } if (eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::PUSH].Token.OpCode || @@ -508,7 +475,7 @@ sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos) { if ( nBracketCount < 1 ) { - nFuncPos = m_pMEdit->GetText().getLength(); + nFuncPos = m_xMEdit->get_text().getLength(); } else if ( !bFlag ) { @@ -544,7 +511,7 @@ bool FormulaDlg_Impl::CalcValue( const OUString& rStrExp, OUString& rStrResult, bool bInput = Application::AnyInput( VclInputFlags::KEYBOARD ); if ( !bInput ) { - bResult = m_pHelper->calculateValue( rStrExp, rStrResult, bForceMatrixFormula || m_pBtnMatrix->IsChecked()); + bResult = m_pHelper->calculateValue( rStrExp, rStrResult, bForceMatrixFormula || m_xBtnMatrix->get_active()); } else bResult = false; @@ -560,7 +527,7 @@ void FormulaDlg_Impl::UpdateValues( bool bForceRecalcStruct ) bool bForceArray = false; // Only necessary if it's not a matrix formula anyway and matrix evaluation // is supported, i.e. the button is visible. - if (m_pBtnMatrix->IsVisible() && !m_pBtnMatrix->IsChecked()) + if (m_xBtnMatrix->get_visible() && !m_xBtnMatrix->get_active()) { std::unique_ptr<FormulaCompiler> pCompiler(m_pHelper->createCompiler(*m_pTokenArray)); // In the case of the reportdesign dialog there is no currently active @@ -586,20 +553,20 @@ void FormulaDlg_Impl::UpdateValues( bool bForceRecalcStruct ) OUString aStrResult; if (m_pFuncDesc && CalcValue( m_pFuncDesc->getFormula( m_aArguments), aStrResult, bForceArray)) - m_pWndResult->SetText( aStrResult ); + m_xWndResult->set_text( aStrResult ); if (m_bMakingTree) return; aStrResult.clear(); if ( CalcValue( m_pHelper->getCurrentFormula(), aStrResult ) ) - m_pWndFormResult->SetText( aStrResult ); + m_xWndFormResult->set_text( aStrResult ); else { aStrResult.clear(); - m_pWndFormResult->SetText( aStrResult ); + m_xWndFormResult->set_text( aStrResult ); } - CalcStruct( m_pMEdit->GetText(), bForceRecalcStruct); + CalcStruct( m_xMEdit->get_text(), bForceRecalcStruct); } void FormulaDlg_Impl::CalcStruct( const OUString& rStrExp, bool bForceRecalcStruct ) @@ -608,7 +575,7 @@ void FormulaDlg_Impl::CalcStruct( const OUString& rStrExp, bool bForceRecalcStru if ( !rStrExp.isEmpty() && (bForceRecalcStruct || m_aOldFormula != rStrExp) && m_bStructUpdate) { - m_pStructPage->ClearStruct(); + m_xStructPage->ClearStruct(); OUString aString = rStrExp; if (rStrExp[nLength-1] == '(') @@ -620,10 +587,10 @@ void FormulaDlg_Impl::CalcStruct( const OUString& rStrExp, bool bForceRecalcStru OUString aStrResult; if ( CalcValue( aString, aStrResult ) ) - m_pWndFormResult->SetText( aStrResult ); + m_xWndFormResult->set_text(aStrResult); UpdateTokenArray(aString); - fillTree(m_pStructPage); + fillTree(m_xStructPage.get()); m_aOldFormula = rStrExp; if (rStrExp[nLength-1] == '(') @@ -631,9 +598,8 @@ void FormulaDlg_Impl::CalcStruct( const OUString& rStrExp, bool bForceRecalcStru } } - -void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, const FormulaToken* pFuncToken, - const FormulaToken* _pToken, long Count ) +void FormulaDlg_Impl::MakeTree(StructPage* _pTree, weld::TreeIter* pParent, const FormulaToken* pFuncToken, + const FormulaToken* _pToken, long Count) { if ( _pToken != nullptr && Count > 0 ) { @@ -655,7 +621,8 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co if ( nParas > 0 ) { - SvTreeListEntry* pEntry; + std::unique_ptr<weld::TreeIter> xEntry; + weld::TreeIter* pEntry; bool bCalcSubformula = false; OUString aTest = _pTree->GetEntryText(pParent); @@ -666,25 +633,29 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co } else { + xEntry = m_xStructPage->GetTlbStruct().make_iterator(); + if (eOp == ocBad) { - pEntry = _pTree->InsertEntry( aResult, pParent, STRUCT_ERROR, 0, _pToken); + _pTree->InsertEntry(aResult, pParent, STRUCT_ERROR, 0, _pToken, *xEntry); } else if (!((SC_OPCODE_START_BIN_OP <= eOp && eOp < SC_OPCODE_STOP_BIN_OP) || (SC_OPCODE_START_UN_OP <= eOp && eOp < SC_OPCODE_STOP_UN_OP))) { // Not a binary or unary operator. bCalcSubformula = true; - pEntry = _pTree->InsertEntry( aResult, pParent, STRUCT_FOLDER, 0, _pToken); + _pTree->InsertEntry(aResult, pParent, STRUCT_FOLDER, 0, _pToken, *xEntry); } else { /* TODO: question remains, why not sub calculate operators? */ - pEntry = _pTree->InsertEntry( aResult, pParent, STRUCT_FOLDER, 0, _pToken); + _pTree->InsertEntry(aResult, pParent, STRUCT_FOLDER, 0, _pToken, *xEntry); } + + pEntry = xEntry.get(); } - MakeTree( _pTree, pEntry, _pToken, m_pTokenArrayIterator->PrevRPN(), nParas); + MakeTree(_pTree, pEntry, _pToken, m_pTokenArrayIterator->PrevRPN(), nParas); if (bCalcSubformula) { @@ -704,9 +675,9 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co OUString aStr; if (CalcValue( aFormula, aStr, _pToken->IsInForceArray())) - m_pWndResult->SetText( aStr ); - aStr = m_pWndResult->GetText(); - m_pStructPage->GetTlbStruct()->SetEntryText( pEntry, aResult + " = " + aStr); + m_xWndResult->set_text( aStr ); + aStr = m_xWndResult->get_text(); + m_xStructPage->GetTlbStruct().set_text(*pEntry, aResult + " = " + aStr); } --Count; @@ -715,9 +686,10 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co } else { + std::unique_ptr<weld::TreeIter> xEntry(m_xStructPage->GetTlbStruct().make_iterator()); if (eOp == ocBad) { - _pTree->InsertEntry( aResult, pParent, STRUCT_ERROR, 0, _pToken); + _pTree->InsertEntry( aResult, pParent, STRUCT_ERROR, 0, _pToken, *xEntry); } else if (eOp == ocPush) { @@ -725,7 +697,7 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co // as array elements. Depending on parameter classification // a scalar value (non-array context) is calculated first. OUString aUnforcedResult; - bool bForceMatrix = (!m_pBtnMatrix->IsChecked() && + bool bForceMatrix = (!m_xBtnMatrix->get_active() && (_pToken->GetType() == svDoubleRef || _pToken->GetType() == svExternalDoubleRef)); if (bForceMatrix && pFuncToken) { @@ -765,14 +737,14 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co // Cell is a formula, print subformula. // With scalar values prints "A1:A3 = 2 {1;2;3}" _pTree->InsertEntry( aResult + " = " + aUnforcedResult + aCellResult, - pParent, STRUCT_END, 0, _pToken); + pParent, STRUCT_END, 0, _pToken, *xEntry); } else - _pTree->InsertEntry( aResult, pParent, STRUCT_END, 0, _pToken); + _pTree->InsertEntry(aResult, pParent, STRUCT_END, 0, _pToken, *xEntry); } else { - _pTree->InsertEntry( aResult, pParent, STRUCT_END, 0, _pToken); + _pTree->InsertEntry(aResult, pParent, STRUCT_END, 0, _pToken, *xEntry); } --Count; MakeTree( _pTree, pParent, _pToken, m_pTokenArrayIterator->PrevRPN(), Count); @@ -840,22 +812,21 @@ void FormulaDlg_Impl::FillDialog(bool bFlag) FillListboxes(); if (bFlag) { - m_pBtnBackward->Enable(bPrev); - m_pBtnForward->Enable(bNext); + m_xBtnBackward->set_sensitive(bPrev); + m_xBtnForward->set_sensitive(bNext); } OUString aStrResult; if ( CalcValue( m_pHelper->getCurrentFormula(), aStrResult ) ) - m_pWndFormResult->SetText( aStrResult ); + m_xWndFormResult->set_text( aStrResult ); else { aStrResult.clear(); - m_pWndFormResult->SetText( aStrResult ); + m_xWndFormResult->set_text( aStrResult ); } } - void FormulaDlg_Impl::FillListboxes() { // Switch between the "Pages" @@ -864,24 +835,24 @@ void FormulaDlg_Impl::FillListboxes() if ( m_pFuncDesc && m_pFuncDesc->getCategory() ) { // We'll never have more than int32 max categories so this is safe ... - if ( m_pFuncPage->GetCategory() != static_cast<sal_Int32>(m_pFuncDesc->getCategory()->getNumber() + 1) ) - m_pFuncPage->SetCategory(m_pFuncDesc->getCategory()->getNumber() + 1); + if ( m_xFuncPage->GetCategory() != static_cast<sal_Int32>(m_pFuncDesc->getCategory()->getNumber() + 1) ) + m_xFuncPage->SetCategory(m_pFuncDesc->getCategory()->getNumber() + 1); - sal_Int32 nPos = m_pFuncPage->GetFuncPos(m_pFuncDesc); + sal_Int32 nPos = m_xFuncPage->GetFuncPos(m_pFuncDesc); - m_pFuncPage->SetFunction(nPos); + m_xFuncPage->SetFunction(nPos); } else if ( pData ) { - m_pFuncPage->SetCategory( 1 ); - m_pFuncPage->SetFunction( LISTBOX_ENTRY_NOTFOUND ); + m_xFuncPage->SetCategory( 1 ); + m_xFuncPage->SetFunction( -1 ); } - FuncSelHdl(*m_pFuncPage); + FuncSelHdl(*m_xFuncPage); m_pHelper->setDispatcherLock( true ); // Activate Modal-Mode // HelpId for 1. page is the one from the resource - m_pParent->SetHelpId( m_aOldHelp ); + m_rDialog.set_help_id( m_aOldHelp ); } void FormulaDlg_Impl::FillControls( bool &rbNext, bool &rbPrev) @@ -907,16 +878,16 @@ void FormulaDlg_Impl::FillControls( bool &rbNext, bool &rbPrev) const bool bTestFlag = (pOldFuncDesc != m_pFuncDesc); if (bTestFlag) { - m_pFtHeadLine->Hide(); - m_pFtFuncName->Hide(); - m_pFtFuncDesc->Hide(); - m_pParaWin->SetFunctionDesc(m_pFuncDesc); - m_pFtEditName->SetText( m_pFuncDesc->getFunctionName() ); - m_pFtEditName->Show(); - m_pParaWinBox->Show(); + m_xFtHeadLine->hide(); + m_xFtFuncName->hide(); + m_xFtFuncDesc->hide(); + m_xParaWin->SetFunctionDesc(m_pFuncDesc); + m_xFtEditName->set_label( m_pFuncDesc->getFunctionName() ); + m_xFtEditName->show(); + m_xParaWinBox->show(); const OString aHelpId = m_pFuncDesc->getHelpId(); if ( !aHelpId.isEmpty() ) - m_pMEdit->SetHelpId(aHelpId); + m_xMEdit->set_help_id(aHelpId); } sal_Int32 nOldStart, nOldEnd; @@ -929,11 +900,11 @@ void FormulaDlg_Impl::FillControls( bool &rbNext, bool &rbPrev) m_aFuncSel.Max() = nNextFEnd; if (!m_bEditFlag) - m_pMEdit->SetText(m_pHelper->getCurrentFormula()); + m_xMEdit->set_text(m_pHelper->getCurrentFormula()); sal_Int32 PrivStart, PrivEnd; m_pHelper->getSelection( PrivStart, PrivEnd); if (!m_bEditFlag) - m_pMEdit->SetSelection( Selection( PrivStart, PrivEnd)); + m_xMEdit->select_region(PrivStart, PrivEnd); m_nArgs = m_pFuncDesc->getSuppressedArgumentCount(); sal_uInt16 nOffset = pData->GetOffset(); @@ -941,16 +912,22 @@ void FormulaDlg_Impl::FillControls( bool &rbNext, bool &rbPrev) // Concatenate the Edit's for Focus-Control if (bTestFlag) - m_pParaWin->SetArgumentOffset(nOffset); + m_xParaWin->SetArgumentOffset(nOffset); sal_uInt16 nActiv = 0; sal_Int32 nArgPos = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 ); - sal_Int32 nEditPos = m_pMEdit->GetSelection().Min(); + + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); + + sal_Int32 nEditPos = nStartPos; bool bFlag = false; for (sal_Int32 i = 0; i < m_nArgs; i++) { sal_Int32 nLength = m_aArguments[i].getLength()+1; - m_pParaWin->SetArgument( i, m_aArguments[i]); + m_xParaWin->SetArgument( i, m_aArguments[i]); if (nArgPos <= nEditPos && nEditPos < nArgPos+nLength) { nActiv = i; @@ -958,25 +935,31 @@ void FormulaDlg_Impl::FillControls( bool &rbNext, bool &rbPrev) } nArgPos = nArgPos + nLength; } - m_pParaWin->UpdateParas(); + m_xParaWin->UpdateParas(); if (bFlag) { - m_pParaWin->SetActiveLine(nActiv); + m_xParaWin->SetActiveLine(nActiv); } UpdateValues(); } else { - m_pFtEditName->SetText(""); - m_pMEdit->SetHelpId( m_aEditHelpId ); + m_xFtEditName->set_label(""); + m_xMEdit->set_help_id(m_aEditHelpId); } // test if before/after are anymore functions sal_Int32 nTempStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 ); rbNext = m_aFormulaHelper.GetNextFunc( aFormula, false, nTempStart ); - nTempStart = m_pMEdit->GetSelection().Min(); + + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); + + nTempStart = nStartPos; pData->SetFStart(nTempStart); rbPrev = m_aFormulaHelper.GetNextFunc( aFormula, true, nTempStart ); } @@ -986,20 +969,20 @@ void FormulaDlg_Impl::ClearAllParas() { DeleteArgs(); m_pFuncDesc = nullptr; - m_pParaWin->ClearAll(); - m_pWndResult->SetText(OUString()); - m_pFtFuncName->SetText(OUString()); - FuncSelHdl(*m_pFuncPage); + m_xParaWin->ClearAll(); + m_xWndResult->set_text(OUString()); + m_xFtFuncName->set_label(OUString()); + FuncSelHdl(*m_xFuncPage); - if (m_pFuncPage->IsVisible()) + if (m_xFuncPage->IsVisible()) { - m_pFtEditName->Hide(); - m_pParaWinBox->Hide(); + m_xFtEditName->hide(); + m_xParaWinBox->hide(); - m_pBtnForward->Enable(); //@new - m_pFtHeadLine->Show(); - m_pFtFuncName->Show(); - m_pFtFuncDesc->Show(); + m_xBtnForward->set_sensitive(true); //@new + m_xFtHeadLine->show(); + m_xFtFuncName->show(); + m_xFtFuncDesc->show(); } } @@ -1036,14 +1019,14 @@ void FormulaDlg_Impl::DoEnter(bool bOk) { // remove dummy arguments OUString aInputFormula = m_pHelper->getCurrentFormula(); - OUString aString = RepairFormula(m_pMEdit->GetText()); + OUString aString = RepairFormula(m_xMEdit->get_text()); m_pHelper->setSelection( 0, aInputFormula.getLength()); m_pHelper->setCurrentFormula(aString); } m_pHelper->switchBack(); - m_pHelper->dispatch( bOk, m_pBtnMatrix->IsChecked()); + m_pHelper->dispatch( bOk, m_xBtnMatrix->get_active()); // Clear data m_pHelper->deleteFormData(); @@ -1052,22 +1035,22 @@ void FormulaDlg_Impl::DoEnter(bool bOk) } -IMPL_LINK( FormulaDlg_Impl, BtnHdl, Button*, pBtn, void ) +IMPL_LINK(FormulaDlg_Impl, BtnHdl, weld::Button&, rBtn, void) { - if ( pBtn == m_pBtnCancel ) + if (&rBtn == m_xBtnCancel.get()) { DoEnter(false); // closes the Dialog } - else if ( pBtn == m_pBtnEnd ) + else if (&rBtn == m_xBtnEnd.get()) { DoEnter(true); // closes the Dialog } - else if ( pBtn == m_pBtnForward ) + else if (&rBtn == m_xBtnForward.get()) { const IFunctionDescription* pDesc; - sal_Int32 nSelFunc = m_pFuncPage->GetFunction(); - if (nSelFunc != LISTBOX_ENTRY_NOTFOUND) - pDesc = m_pFuncPage->GetFuncDesc( nSelFunc ); + sal_Int32 nSelFunc = m_xFuncPage->GetFunction(); + if (nSelFunc != -1) + pDesc = m_xFuncPage->GetFuncDesc( nSelFunc ); else { // Do not overwrite the selected formula expression, just edit the @@ -1075,61 +1058,60 @@ IMPL_LINK( FormulaDlg_Impl, BtnHdl, Button*, pBtn, void ) m_pFuncDesc = pDesc = nullptr; } - if (pDesc == m_pFuncDesc || !m_pFuncPage->IsVisible()) + if (pDesc == m_pFuncDesc || !m_xFuncPage->IsVisible()) EditNextFunc( true ); else { - DblClkHdl(*m_pFuncPage); //new - m_pBtnForward->Enable(false); //new + DblClkHdl(*m_xFuncPage); //new + m_xBtnForward->set_sensitive(false); //new } } - else if ( pBtn == m_pBtnBackward ) + else if (&rBtn == m_xBtnBackward.get()) { m_bEditFlag = false; - m_pBtnForward->Enable(); + m_xBtnForward->set_sensitive(true); EditNextFunc( false ); - m_pMEFormula->Invalidate(); - m_pMEFormula->Update(); } } - // Functions for 1. Page - // Handler for Listboxes IMPL_LINK_NOARG( FormulaDlg_Impl, DblClkHdl, FuncPage&, void) { - sal_Int32 nFunc = m_pFuncPage->GetFunction(); + sal_Int32 nFunc = m_xFuncPage->GetFunction(); // ex-UpdateLRUList - const IFunctionDescription* pDesc = m_pFuncPage->GetFuncDesc(nFunc); + const IFunctionDescription* pDesc = m_xFuncPage->GetFuncDesc(nFunc); m_pHelper->insertEntryToLRUList(pDesc); - OUString aFuncName = m_pFuncPage->GetSelFunctionName() + "()"; + OUString aFuncName = m_xFuncPage->GetSelFunctionName() + "()"; m_pHelper->setCurrentFormula(aFuncName); - m_pMEdit->ReplaceSelected(aFuncName); + m_xMEdit->replace_selection(aFuncName); - Selection aSel = m_pMEdit->GetSelection(); - aSel.Max() = aSel.Max()-1; - m_pMEdit->SetSelection(aSel); + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); - FormulaHdl(*m_pMEdit); + nEndPos = nEndPos - 1; + m_xMEdit->select_region(nStartPos, nEndPos); - aSel.Min() = aSel.Max(); - m_pMEdit->SetSelection(aSel); + FormulaHdl(*m_xMEdit); + + nStartPos = nEndPos; + m_xMEdit->select_region(nStartPos, nEndPos); if (m_nArgs == 0) { - BtnHdl(m_pBtnBackward); + BtnHdl(*m_xBtnBackward); } - m_pParaWin->SetEdFocus(); - m_pBtnForward->Enable(false); //@New + m_xParaWin->SetEdFocus(); + m_xBtnForward->set_sensitive(false); //@New } - // Functions for right Page void FormulaDlg_Impl::SetData( sal_Int32 nFStart, sal_Int32 nNextFStart, sal_Int32 nNextFEnd, sal_Int32& PrivStart, sal_Int32& PrivEnd) @@ -1140,14 +1122,14 @@ void FormulaDlg_Impl::SetData( sal_Int32 nFStart, sal_Int32 nNextFStart, sal_Int m_pHelper->getSelection( nFStart, nFEnd ); m_pHelper->setSelection( nNextFStart, nNextFEnd ); if (!m_bEditFlag) - m_pMEdit->SetText(m_pHelper->getCurrentFormula()); + m_xMEdit->set_text(m_pHelper->getCurrentFormula()); m_pHelper->getSelection( PrivStart, PrivEnd); if (!m_bEditFlag) { - m_pMEdit->SetSelection( Selection( PrivStart, PrivEnd)); - m_pMEFormula->UpdateOldSel(); + m_xMEdit->select_region(PrivStart, PrivEnd); + UpdateOldSel(); } FormEditData* pData = m_pHelper->getFormEditData(); @@ -1264,13 +1246,13 @@ void FormulaDlg_Impl::SaveArg( sal_uInt16 nEd ) if ( m_aArguments[i].isEmpty() ) m_aArguments[i] = " "; } - if (!m_pParaWin->GetArgument(nEd).isEmpty()) - m_aArguments[nEd] = m_pParaWin->GetArgument(nEd); + if (!m_xParaWin->GetArgument(nEd).isEmpty()) + m_aArguments[nEd] = m_xParaWin->GetArgument(nEd); sal_uInt16 nClearPos = nEd+1; for (sal_Int32 i = nEd+1; i < m_nArgs; i++) { - if ( !m_pParaWin->GetArgument(i).isEmpty() ) + if ( !m_xParaWin->GetArgument(i).isEmpty() ) { nClearPos = i+1; } @@ -1285,17 +1267,17 @@ void FormulaDlg_Impl::SaveArg( sal_uInt16 nEd ) IMPL_LINK( FormulaDlg_Impl, FxHdl, ParaWin&, rPtr, void ) { - if (&rPtr == m_pParaWin) + if (&rPtr == m_xParaWin.get()) { - m_pBtnForward->Enable(); //@ In order to be able to input another function. - m_pTabCtrl->SetCurPageId(TP_FUNCTION); + m_xBtnForward->set_sensitive(true); //@ In order to be able to input another function. + m_xTabCtrl->set_current_page("function"); OUString aUndoStr = m_pHelper->getCurrentFormula(); // it will be added before a ";" FormEditData* pData = m_pHelper->getFormEditData(); if (!pData) return; - sal_uInt16 nArgNo = m_pParaWin->GetActiveLine(); + sal_uInt16 nArgNo = m_xParaWin->GetActiveLine(); sal_uInt16 nEdFocus = nArgNo; SaveArg(nArgNo); @@ -1313,23 +1295,23 @@ IMPL_LINK( FormulaDlg_Impl, FxHdl, ParaWin&, rPtr, void ) ClearAllParas(); FillDialog(false); - m_pFuncPage->SetFocus(); //There Parawin is not visible anymore + m_xFuncPage->SetFocus(); //There Parawin is not visible anymore } } IMPL_LINK( FormulaDlg_Impl, ModifyHdl, ParaWin&, rPtr, void ) { - if (&rPtr == m_pParaWin) + if (&rPtr == m_xParaWin.get()) { - SaveArg(m_pParaWin->GetActiveLine()); + SaveArg(m_xParaWin->GetActiveLine()); UpdateValues(); UpdateSelection(); - CalcStruct(m_pMEdit->GetText()); + CalcStruct(m_xMEdit->get_text()); } } -IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaHdl, Edit&, void) +IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaHdl, weld::TextView&, void) { FormEditData* pData = m_pHelper->getFormEditData(); @@ -1338,48 +1320,50 @@ IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaHdl, Edit&, void) m_bEditFlag = true; OUString aInputFormula = m_pHelper->getCurrentFormula(); - OUString aString = m_pMEdit->GetText(); + OUString aString = m_xMEdit->get_text(); - Selection aSel = m_pMEdit->GetSelection(); + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); if (aString.isEmpty()) // in case everything was cleared { aString += "="; - m_pMEdit->SetText(aString); - aSel .Min() = 1; - aSel .Max() = 1; - m_pMEdit->SetSelection(aSel); + m_xMEdit->set_text(aString); + nStartPos = 1; + nEndPos = 1; + m_xMEdit->select_region(nStartPos, nEndPos); } else if (aString[0]!='=') // in case it's replaced { aString = "=" + aString; - m_pMEdit->SetText(aString); - aSel .Min() += 1; - aSel .Max() += 1; - m_pMEdit->SetSelection(aSel); + m_xMEdit->set_text(aString); + nStartPos += 1; + nEndPos += 1; + m_xMEdit->select_region(nStartPos, nEndPos); } - m_pHelper->setSelection( 0, aInputFormula.getLength()); m_pHelper->setCurrentFormula(aString); - m_pHelper->setSelection( aSel.Min(), aSel.Max()); + m_pHelper->setSelection(nStartPos, nEndPos); - sal_Int32 nPos = aSel.Min()-1; + sal_Int32 nPos = nStartPos - 1; OUString aStrResult; if ( CalcValue( m_pHelper->getCurrentFormula(), aStrResult ) ) - m_pWndFormResult->SetText( aStrResult ); + m_xWndFormResult->set_text( aStrResult ); else { aStrResult.clear(); - m_pWndFormResult->SetText( aStrResult ); + m_xWndFormResult->set_text( aStrResult ); } CalcStruct(aString); nPos = GetFunctionPos(nPos); - if (nPos < aSel.Min()-1) + if (nPos < nStartPos - 1) { sal_Int32 nPos1 = aString.indexOf( '(', nPos); EditNextFunc( false, nPos1); @@ -1389,11 +1373,11 @@ IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaHdl, Edit&, void) ClearAllParas(); } - m_pHelper->setSelection( aSel.Min(), aSel.Max()); + m_pHelper->setSelection(nStartPos, nEndPos); m_bEditFlag = false; } -IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaCursorHdl, EditBox&, void) +void FormulaDlg_Impl::FormulaCursor() { FormEditData* pData = m_pHelper->getFormEditData(); if (!pData) @@ -1401,20 +1385,24 @@ IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaCursorHdl, EditBox&, void) m_bEditFlag = true; - OUString aString = m_pMEdit->GetText(); + OUString aString = m_xMEdit->get_text(); + + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); - Selection aSel = m_pMEdit->GetSelection(); - m_pHelper->setSelection( aSel.Min(), aSel.Max()); + m_pHelper->setSelection(nStartPos, nEndPos); - if (aSel.Min() == 0) + if (nStartPos == 0) { - aSel.Min() = 1; - m_pMEdit->SetSelection(aSel); + nStartPos = 1; + m_xMEdit->select_region(nStartPos, nEndPos); } - if (aSel.Min() != aString.getLength()) + if (nStartPos != aString.getLength()) { - sal_Int32 nPos = aSel.Min(); + sal_Int32 nPos = nStartPos; sal_Int32 nFStart = GetFunctionPos(nPos - 1); @@ -1456,16 +1444,38 @@ IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaCursorHdl, EditBox&, void) ClearAllParas(); } } - m_pHelper->setSelection( aSel.Min(), aSel.Max()); + m_pHelper->setSelection(nStartPos, nEndPos); m_bEditFlag = false; } +void FormulaDlg_Impl::UpdateOldSel() +{ + m_xMEdit->get_selection_bounds(m_nSelectionStart, m_nSelectionEnd); + if (m_nSelectionStart > m_nSelectionEnd) + std::swap(m_nSelectionStart, m_nSelectionEnd); +} + +IMPL_LINK_NOARG( FormulaDlg_Impl, FormulaCursorHdl, weld::TextView&, void) +{ + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); + + if (nStartPos != m_nSelectionStart || nEndPos != m_nSelectionEnd) + { + m_nSelectionStart = nStartPos; + m_nSelectionEnd = nEndPos; + FormulaCursor(); + } +} + void FormulaDlg_Impl::UpdateSelection() { m_pHelper->setSelection( m_aFuncSel.Min(), m_aFuncSel.Max()); m_pHelper->setCurrentFormula( m_pFuncDesc->getFormula( m_aArguments ) ); - m_pMEdit->SetText(m_pHelper->getCurrentFormula()); + m_xMEdit->set_text(m_pHelper->getCurrentFormula()); sal_Int32 PrivStart, PrivEnd; m_pHelper->getSelection( PrivStart, PrivEnd); m_aFuncSel.Min() = PrivStart; @@ -1473,10 +1483,10 @@ void FormulaDlg_Impl::UpdateSelection() m_nArgs = m_pFuncDesc->getSuppressedArgumentCount(); - OUString aFormula = m_pMEdit->GetText(); + OUString aFormula = m_xMEdit->get_text(); sal_Int32 nArgPos = m_aFormulaHelper.GetArgStart( aFormula, PrivStart, 0); - sal_uInt16 nPos = m_pParaWin->GetActiveLine(); + sal_uInt16 nPos = m_xParaWin->GetActiveLine(); if (nPos >= m_aArguments.size()) { SAL_WARN("formula.ui","FormulaDlg_Impl::UpdateSelection - shot in foot: nPos " << @@ -1493,41 +1503,48 @@ void FormulaDlg_Impl::UpdateSelection() } sal_Int32 nLength = (nPos < m_aArguments.size()) ? m_aArguments[nPos].getLength() : 0; - Selection aSel( nArgPos, nArgPos+nLength); - m_pHelper->setSelection( static_cast<sal_uInt16>(nArgPos),static_cast<sal_uInt16>(nArgPos+nLength)); - m_pMEdit->SetSelection(aSel); - m_pMEFormula->UpdateOldSel(); + m_pHelper->setSelection(nArgPos, nArgPos + nLength); + m_xMEdit->select_region(nArgPos, nArgPos + nLength); + UpdateOldSel(); } -::std::pair<RefButton*, RefEdit*> FormulaDlg_Impl::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ) +::std::pair<WeldRefButton*, WeldRefEdit*> FormulaDlg_Impl::RefInputStartBefore(WeldRefEdit* pEdit, WeldRefButton* pButton) { - //because its initially hidden, give it its optimal - //size so clicking the refbutton has an initial - //size to work when retro-fitting this to .ui - m_pEdRef->SetSizePixel(m_pEdRef->GetOptimalSize()); - m_pEdRef->Show(); m_pTheRefEdit = pEdit; m_pTheRefButton = pButton; + Selection aOrigSelection; + if (m_pTheRefEdit) + { + // grab selection before showing next widget in case the selection is blown away + // by it appearing + aOrigSelection = m_pTheRefEdit->GetSelection(); + } + + // because its initially hidden, give it its optimal size so clicking the + // refbutton has an initial size to work when retro-fitting this to .ui + m_xEdRef->GetWidget()->set_size_request(m_xEdRef->GetWidget()->get_preferred_size().Width(), -1); + m_xEdRef->GetWidget()->show(); + if ( m_pTheRefEdit ) { - m_pEdRef->SetRefString( m_pTheRefEdit->GetText() ); - m_pEdRef->SetSelection( m_pTheRefEdit->GetSelection() ); - m_pEdRef->SetHelpId( m_pTheRefEdit->GetHelpId() ); + m_xEdRef->SetRefString(m_pTheRefEdit->GetText()); + m_xEdRef->SetSelection(aOrigSelection); + m_xEdRef->GetWidget()->set_help_id(m_pTheRefEdit->GetWidget()->get_help_id()); } - m_pRefBtn->Show( pButton != nullptr ); + m_xRefBtn->GetWidget()->set_visible(pButton != nullptr); - ::std::pair<RefButton*, RefEdit*> aPair; - aPair.first = pButton ? m_pRefBtn.get() : nullptr; - aPair.second = m_pEdRef; + ::std::pair<WeldRefButton*, WeldRefEdit*> aPair; + aPair.first = pButton ? m_xRefBtn.get() : nullptr; + aPair.second = m_xEdRef.get(); return aPair; } -::std::pair<WeldRefButton*, WeldRefEdit*> FormulaDlg_Impl::RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ) +::std::pair<RefButton*, RefEdit*> FormulaDlg_Impl::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ) { assert(!pEdit && !pButton); - ::std::pair<WeldRefButton*, WeldRefEdit*> aPair; + ::std::pair<RefButton*, RefEdit*> aPair; aPair.first = pButton; aPair.second = pEdit; return aPair; @@ -1535,105 +1552,109 @@ void FormulaDlg_Impl::UpdateSelection() void FormulaDlg_Impl::RefInputStartAfter() { - m_pRefBtn->SetEndImage(); + m_xRefBtn->SetEndImage(); - if ( m_pTheRefEdit ) + if (m_pTheRefEdit) { - OUString aStr = m_aTitle2 + " " + m_pFtEditName->GetText() + "( "; + OUString aStr = m_aTitle2 + " " + m_xFtEditName->get_label() + "( "; - if ( m_pParaWin->GetActiveLine() > 0 ) + if ( m_xParaWin->GetActiveLine() > 0 ) aStr += "...; "; - aStr += m_pParaWin->GetActiveArgName(); - if ( m_pParaWin->GetActiveLine() + 1 < m_nArgs ) + aStr += m_xParaWin->GetActiveArgName(); + if ( m_xParaWin->GetActiveLine() + 1 < m_nArgs ) aStr += "; ..."; aStr += " )"; - m_pParent->SetText( MnemonicGenerator::EraseAllMnemonicChars( aStr ) ); + m_rDialog.set_title(m_rDialog.strip_mnemonic(aStr)); } } void FormulaDlg_Impl::RefInputDoneAfter( bool bForced ) { - m_pRefBtn->SetStartImage(); - if ( bForced || !m_pRefBtn->IsVisible() ) + m_xRefBtn->SetStartImage(); + if (bForced || !m_xRefBtn->GetWidget()->get_visible()) { - m_pEdRef->Hide(); - m_pRefBtn->Hide(); + m_xEdRef->GetWidget()->hide(); + m_xRefBtn->GetWidget()->hide(); if ( m_pTheRefEdit ) { - m_pTheRefEdit->SetRefString( m_pEdRef->GetText() ); + m_pTheRefEdit->SetRefString( m_xEdRef->GetText() ); m_pTheRefEdit->GrabFocus(); if ( m_pTheRefButton ) m_pTheRefButton->SetStartImage(); - sal_uInt16 nPrivActiv = m_pParaWin->GetActiveLine(); - m_pParaWin->SetArgument( nPrivActiv, m_pEdRef->GetText() ); - ModifyHdl( *m_pParaWin ); + sal_uInt16 nPrivActiv = m_xParaWin->GetActiveLine(); + m_xParaWin->SetArgument( nPrivActiv, m_xEdRef->GetText() ); + ModifyHdl( *m_xParaWin ); m_pTheRefEdit = nullptr; } - m_pParent->SetText( m_aTitle1 ); + m_rDialog.set_title(m_aTitle1); } } -RefEdit* FormulaDlg_Impl::GetCurrRefEdit() +WeldRefEdit* FormulaDlg_Impl::GetCurrRefEdit() { - return m_pEdRef->IsVisible() ? m_pEdRef.get() : m_pParaWin->GetActiveEdit(); + return m_xEdRef->GetWidget()->get_visible() ? m_xEdRef.get() : m_xParaWin->GetActiveEdit(); } void FormulaDlg_Impl::Update() { FormEditData* pData = m_pHelper->getFormEditData(); - const OUString sExpression = m_pMEdit->GetText(); + const OUString sExpression = m_xMEdit->get_text(); m_aOldFormula.clear(); UpdateTokenArray(sExpression); - FormulaCursorHdl(*m_pMEFormula); + FormulaCursor(); CalcStruct(sExpression); if (pData->GetMode() == FormulaDlgMode::Formula) - m_pTabCtrl->SetCurPageId(TP_FUNCTION); + m_xTabCtrl->set_current_page("function"); else - m_pTabCtrl->SetCurPageId(TP_STRUCT); - m_pBtnMatrix->Check(pData->GetMatrixFlag()); + m_xTabCtrl->set_current_page("struct"); + m_xBtnMatrix->set_active(pData->GetMatrixFlag()); } void FormulaDlg_Impl::Update(const OUString& _sExp) { CalcStruct(_sExp); FillDialog(); - FuncSelHdl(*m_pFuncPage); + FuncSelHdl(*m_xFuncPage); } void FormulaDlg_Impl::SetMeText(const OUString& _sText) { FormEditData* pData = m_pHelper->getFormEditData(); - m_pMEdit->SetText(_sText); - m_pMEdit->SetSelection( pData->GetSelection()); - m_pMEFormula->UpdateOldSel(); + m_xMEdit->set_text(_sText); + auto aSelection = pData->GetSelection(); + m_xMEdit->select_region(aSelection.Min(), aSelection.Max()); + UpdateOldSel(); } FormulaDlgMode FormulaDlg_Impl::SetMeText( const OUString& _sText, sal_Int32 PrivStart, sal_Int32 PrivEnd, bool bMatrix, bool _bSelect, bool _bUpdate) { FormulaDlgMode eMode = FormulaDlgMode::Formula; if (!m_bEditFlag) - m_pMEdit->SetText(_sText); + m_xMEdit->set_text(_sText); if ( _bSelect || !m_bEditFlag ) - m_pMEdit->SetSelection( Selection( PrivStart, PrivEnd)); + m_xMEdit->select_region(PrivStart, PrivEnd); if ( _bUpdate ) { - m_pMEFormula->UpdateOldSel(); - m_pMEdit->Invalidate(); - m_pHelper->showReference(m_pMEdit->GetSelected()); + UpdateOldSel(); + int nStartPos, nEndPos; + m_xMEdit->get_selection_bounds(nStartPos, nEndPos); + if (nStartPos > nEndPos) + std::swap(nStartPos, nEndPos); + m_pHelper->showReference(m_xMEdit->get_text().copy(nStartPos, nEndPos - nStartPos)); eMode = FormulaDlgMode::Edit; - m_pBtnMatrix->Check( bMatrix ); + m_xBtnMatrix->set_active( bMatrix ); } // if ( _bUpdate ) return eMode; } bool FormulaDlg_Impl::CheckMatrix(OUString& aFormula) { - m_pMEdit->GrabFocus(); + m_xMEdit->grab_focus(); sal_Int32 nLen = aFormula.getLength(); bool bMatrix = nLen > 3 // Matrix-Formula && aFormula[0] == '{' @@ -1642,23 +1663,23 @@ bool FormulaDlg_Impl::CheckMatrix(OUString& aFormula) if ( bMatrix ) { aFormula = aFormula.copy( 1, aFormula.getLength()-2 ); - m_pBtnMatrix->Check( bMatrix ); - m_pBtnMatrix->Disable(); + m_xBtnMatrix->set_active( bMatrix ); + m_xBtnMatrix->set_sensitive(false); } // if ( bMatrix ) - m_pTabCtrl->SetCurPageId(TP_STRUCT); + m_xTabCtrl->set_current_page("struct"); return bMatrix; } IMPL_LINK_NOARG( FormulaDlg_Impl, StructSelHdl, StructPage&, void) { m_bStructUpdate = false; - if (m_pStructPage->IsVisible()) - m_pBtnForward->Enable(false); //@New + if (m_xStructPage->IsVisible()) + m_xBtnForward->set_sensitive(false); //@New m_bStructUpdate = true; } -IMPL_LINK_NOARG( FormulaDlg_Impl, MatrixHdl, Button*, void) +IMPL_LINK_NOARG( FormulaDlg_Impl, MatrixHdl, weld::Button&, void) { m_bUserMatrixFlag = true; UpdateValues(true); @@ -1666,78 +1687,78 @@ IMPL_LINK_NOARG( FormulaDlg_Impl, MatrixHdl, Button*, void) IMPL_LINK_NOARG( FormulaDlg_Impl, FuncSelHdl, FuncPage&, void) { - if ( (m_pFuncPage->GetFunctionEntryCount() > 0) - && (m_pFuncPage->GetFunction() != LISTBOX_ENTRY_NOTFOUND) ) + if ( (m_xFuncPage->GetFunctionEntryCount() > 0) + && (m_xFuncPage->GetFunction() != -1) ) { - const IFunctionDescription* pDesc = m_pFuncPage->GetFuncDesc( m_pFuncPage->GetFunction() ); + const IFunctionDescription* pDesc = m_xFuncPage->GetFuncDesc( m_xFuncPage->GetFunction() ); if (pDesc != m_pFuncDesc) - m_pBtnForward->Enable(); //new + m_xBtnForward->set_sensitive(true); //new if (pDesc) { pDesc->initArgumentInfo(); // full argument info is needed OUString aSig = pDesc->getSignature(); - m_pFtHeadLine->SetText( pDesc->getFunctionName() ); - m_pFtFuncName->SetText( aSig ); - m_pFtFuncDesc->SetText( pDesc->getDescription() ); + m_xFtHeadLine->set_label( pDesc->getFunctionName() ); + m_xFtFuncName->set_label( aSig ); + m_xFtFuncDesc->set_label( pDesc->getDescription() ); } } else { - m_pFtHeadLine->SetText( OUString() ); - m_pFtFuncName->SetText( OUString() ); - m_pFtFuncDesc->SetText( OUString() ); + m_xFtHeadLine->set_label( OUString() ); + m_xFtFuncName->set_label( OUString() ); + m_xFtFuncDesc->set_label( OUString() ); } } void FormulaDlg_Impl::UpdateParaWin( const Selection& _rSelection, const OUString& _sRefStr) { Selection theSel = _rSelection; - m_pEdRef->ReplaceSelected( _sRefStr ); + m_xEdRef->GetWidget()->replace_selection(_sRefStr); theSel.Max() = theSel.Min() + _sRefStr.getLength(); - m_pEdRef->SetSelection( theSel ); + m_xEdRef->SetSelection( theSel ); // Manual Update of the results' fields: - sal_uInt16 nPrivActiv = m_pParaWin->GetActiveLine(); - m_pParaWin->SetArgument( nPrivActiv, m_pEdRef->GetText()); - m_pParaWin->UpdateParas(); + sal_uInt16 nPrivActiv = m_xParaWin->GetActiveLine(); + m_xParaWin->SetArgument( nPrivActiv, m_xEdRef->GetText()); + m_xParaWin->UpdateParas(); - Edit* pEd = GetCurrRefEdit(); - if ( pEd != nullptr ) + WeldRefEdit* pEd = GetCurrRefEdit(); + if (pEd) pEd->SetSelection( theSel ); } bool FormulaDlg_Impl::UpdateParaWin(Selection& _rSelection) { OUString aStrEd; - Edit* pEd = GetCurrRefEdit(); - if (pEd != nullptr && m_pTheRefEdit == nullptr) + WeldRefEdit* pEd = GetCurrRefEdit(); + if (pEd && !m_pTheRefEdit) { _rSelection = pEd->GetSelection(); _rSelection.Justify(); aStrEd = pEd->GetText(); - m_pEdRef->SetRefString(aStrEd); - m_pEdRef->SetSelection( _rSelection ); + m_xEdRef->SetRefString(aStrEd); + m_xEdRef->SetSelection( _rSelection ); } else { - _rSelection = m_pEdRef->GetSelection(); + _rSelection = m_xEdRef->GetSelection(); _rSelection.Justify(); - aStrEd = m_pEdRef->GetText(); + aStrEd = m_xEdRef->GetText(); } return m_pTheRefEdit == nullptr; } void FormulaDlg_Impl::SetEdSelection() { - Edit* pEd = GetCurrRefEdit()/*aScParaWin.GetActiveEdit()*/; - if ( pEd ) + WeldRefEdit* pEd = GetCurrRefEdit()/*aScParaWin.GetActiveEdit()*/; + if (pEd) { - Selection theSel = m_pEdRef->GetSelection(); + Selection theSel = m_xEdRef->GetSelection(); // Edit may have the focus -> call ModifyHdl in addition // to what's happening in GetFocus pEd->GetModifyHdl().Call(*pEd); @@ -1746,24 +1767,18 @@ void FormulaDlg_Impl::SetEdSelection() } // if ( pEd ) } -FormulaModalDialog::FormulaModalDialog( vcl::Window* pParent - , IFunctionManager const * _pFunctionMgr - , IControlReferenceHandler* _pDlg ) - : ModalDialog(pParent, "FormulaDialog", "formula/ui/formuladialog.ui") - , m_pImpl(new FormulaDlg_Impl(this, false/*_bSupportFunctionResult*/, +FormulaModalDialog::FormulaModalDialog(weld::Window* pParent, + IFunctionManager const * _pFunctionMgr, + IControlReferenceHandler* _pDlg) + : GenericDialogController(pParent, "formula/ui/formuladialog.ui", "FormulaDialog") + , m_pImpl(new FormulaDlg_Impl(*m_xDialog, *m_xBuilder, false/*_bSupportFunctionResult*/, false/*_bSupportResult*/, false/*_bSupportMatrix*/, this, _pFunctionMgr, _pDlg)) { - SetText(m_pImpl->m_aTitle1); + m_xDialog->set_title(m_pImpl->m_aTitle1); } -FormulaModalDialog::~FormulaModalDialog() { disposeOnce(); } - -void FormulaModalDialog::dispose() -{ - m_pImpl.reset(); - ModalDialog::dispose(); -} +FormulaModalDialog::~FormulaModalDialog() { } void FormulaModalDialog::Update(const OUString& _sExp) { @@ -1785,12 +1800,12 @@ void FormulaModalDialog::Update() m_pImpl->Update(); } -::std::pair<RefButton*, RefEdit*> FormulaModalDialog::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ) +::std::pair<WeldRefButton*, WeldRefEdit*> FormulaModalDialog::RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ) { return m_pImpl->RefInputStartBefore( pEdit, pButton ); } -::std::pair<WeldRefButton*, WeldRefEdit*> FormulaModalDialog::RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ) +::std::pair<RefButton*, RefEdit*> FormulaModalDialog::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ) { return formula::FormulaDlg_Impl::RefInputStartBefore(pEdit, pButton); } @@ -1805,40 +1820,26 @@ void FormulaModalDialog::RefInputDoneAfter() m_pImpl->RefInputDoneAfter( true/*bForced*/ ); } -bool FormulaModalDialog::PreNotify( NotifyEvent& rNEvt ) -{ - if (m_pImpl) - m_pImpl->PreNotify( rNEvt ); - - return ModalDialog::PreNotify(rNEvt); -} - void FormulaModalDialog::StoreFormEditData(FormEditData* pData) { m_pImpl->StoreFormEditData(pData); } - // Initialisation / General functions for Dialog - -FormulaDlg::FormulaDlg( SfxBindings* pB, SfxChildWindow* pCW, - vcl::Window* pParent - , IFunctionManager const * _pFunctionMgr, IControlReferenceHandler* _pDlg ) : - SfxModelessDialog( pB, pCW, pParent, "FormulaDialog", "formula/ui/formuladialog.ui" ), - m_pImpl( new FormulaDlg_Impl(this, true/*_bSupportFunctionResult*/ - , true/*_bSupportResult*/ - , true/*_bSupportMatrix*/ - , this, _pFunctionMgr, _pDlg)) +FormulaDlg::FormulaDlg(SfxBindings* pB, SfxChildWindow* pCW, + weld::Window* pParent, + IFunctionManager const * _pFunctionMgr, IControlReferenceHandler* _pDlg) + : SfxModelessDialogController( pB, pCW, pParent, "formula/ui/formuladialog.ui", "FormulaDialog") + , m_pImpl(new FormulaDlg_Impl(*m_xDialog, *m_xBuilder, true/*_bSupportFunctionResult*/ + , true/*_bSupportResult*/ + , true/*_bSupportMatrix*/ + , this, _pFunctionMgr, _pDlg)) { - SetText(m_pImpl->m_aTitle1); + m_xDialog->set_title(m_pImpl->m_aTitle1); } -FormulaDlg::~FormulaDlg() {disposeOnce();} - -void FormulaDlg::dispose() +FormulaDlg::~FormulaDlg() { - m_pImpl.reset(); - SfxModelessDialog::dispose(); } void FormulaDlg::Update(const OUString& _sExp) @@ -1846,7 +1847,6 @@ void FormulaDlg::Update(const OUString& _sExp) m_pImpl->Update(_sExp); } - void FormulaDlg::SetMeText(const OUString& _sText) { m_pImpl->SetMeText(_sText); @@ -1864,14 +1864,12 @@ bool FormulaDlg::CheckMatrix(OUString& aFormula) OUString FormulaDlg::GetMeText() const { - return m_pImpl->m_pMEdit->GetText(); + return m_pImpl->m_xMEdit->get_text(); } void FormulaDlg::Update() { m_pImpl->Update(); - m_pImpl->m_aIdle.SetInvokeHandler( LINK( this, FormulaDlg, UpdateFocusHdl)); - m_pImpl->m_aIdle.Start(); } void FormulaDlg::DoEnter() @@ -1879,12 +1877,12 @@ void FormulaDlg::DoEnter() m_pImpl->DoEnter(false); } -::std::pair<RefButton*, RefEdit*> FormulaDlg::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ) +::std::pair<WeldRefButton*, WeldRefEdit*> FormulaDlg::RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ) { return m_pImpl->RefInputStartBefore( pEdit, pButton ); } -::std::pair<WeldRefButton*, WeldRefEdit*> FormulaDlg::RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ) +::std::pair<RefButton*, RefEdit*> FormulaDlg::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ) { return formula::FormulaDlg_Impl::RefInputStartBefore(pEdit, pButton); } @@ -1899,16 +1897,9 @@ void FormulaDlg::RefInputDoneAfter( bool bForced ) m_pImpl->RefInputDoneAfter( bForced ); } -bool FormulaDlg::PreNotify( NotifyEvent& rNEvt ) -{ - if (m_pImpl) - m_pImpl->PreNotify( rNEvt ); - return SfxModelessDialog::PreNotify(rNEvt); -} - void FormulaDlg::disableOk() { - m_pImpl->m_pBtnEnd->Disable(); + m_pImpl->m_xBtnEnd->set_sensitive(false); } void FormulaDlg::StoreFormEditData(FormEditData* pData) @@ -1935,9 +1926,9 @@ bool FormulaDlg::UpdateParaWin(Selection& _rSelection) return m_pImpl->UpdateParaWin(_rSelection); } -RefEdit* FormulaDlg::GetActiveEdit() +WeldRefEdit* FormulaDlg::GetActiveEdit() { - return m_pImpl->m_pParaWin->GetActiveEdit(); + return m_pImpl->m_xParaWin->GetActiveEdit(); } const FormulaHelper& FormulaDlg::GetFormulaHelper() const @@ -1950,17 +1941,6 @@ void FormulaDlg::SetEdSelection() m_pImpl->SetEdSelection(); } -IMPL_LINK_NOARG( FormulaDlg, UpdateFocusHdl, Timer *, void) -{ - FormEditData* pData = m_pImpl->m_pHelper->getFormEditData(); - if (!pData) - return; - // won't be destroyed via Close - VclPtr<vcl::Window> xWin(pData->GetFocusWindow()); - if (xWin && !xWin->IsDisposed()) - xWin->GrabFocus(); -} - void FormEditData::SaveValues() { Reset(); @@ -1972,7 +1952,6 @@ void FormEditData::Reset() nFStart = 0; nOffset = 0; bMatrix = false; - xFocusWin.clear(); aSelection.Min() = 0; aSelection.Max() = 0; aUndoStr.clear(); @@ -1985,7 +1964,6 @@ FormEditData& FormEditData::operator=( const FormEditData& r ) nOffset = r.nOffset; aUndoStr = r.aUndoStr; bMatrix = r.bMatrix ; - xFocusWin = r.xFocusWin; aSelection = r.aSelection; return *this; } diff --git a/formula/source/ui/dlg/funcpage.cxx b/formula/source/ui/dlg/funcpage.cxx index ce8c23da4eff..3cb0facba86c 100644 --- a/formula/source/ui/dlg/funcpage.cxx +++ b/formula/source/ui/dlg/funcpage.cxx @@ -23,6 +23,7 @@ #include <svl/stritem.hxx> #include <vcl/builderfactory.hxx> #include <vcl/event.hxx> +#include <vcl/svapp.hxx> #include <formula/IFunctionDescription.hxx> #include "funcpage.hxx" @@ -32,44 +33,26 @@ namespace formula { -FormulaListBox::FormulaListBox( vcl::Window* pParent, WinBits nBits ): - ListBox(pParent, nBits) -{} - -void FormulaListBox::KeyInput( const KeyEvent& rKEvt ) -{ - if(rKEvt.GetCharCode()==' ') - DoubleClick(); -} - -bool FormulaListBox::PreNotify( NotifyEvent& rNEvt ) +IMPL_LINK(FuncPage, KeyInputHdl, const KeyEvent&, rKEvt, bool) { - NotifyEvent aNotifyEvt=rNEvt; - - bool bResult = ListBox::PreNotify(rNEvt); - - MouseNotifyEvent nSwitch=aNotifyEvt.GetType(); - if(nSwitch==MouseNotifyEvent::KEYINPUT) + if (rKEvt.GetCharCode() == ' ') { - KeyInput(*aNotifyEvt.GetKeyEvent()); + aDoubleClickLink.Call(*this); + return true; } - return bResult; + return false; } -VCL_BUILDER_FACTORY_ARGS(FormulaListBox, WB_BORDER | WB_SORT) - -FuncPage::FuncPage(vcl::Window* pParent,const IFunctionManager* _pFunctionManager): - TabPage(pParent, "FunctionPage", "formula/ui/functionpage.ui"), - m_pFunctionManager(_pFunctionManager) +FuncPage::FuncPage(weld::Container* pParent, const IFunctionManager* _pFunctionManager) + : m_xBuilder(Application::CreateBuilder(pParent, "formula/ui/functionpage.ui")) + , m_xContainer(m_xBuilder->weld_container("FunctionPage")) + , m_xLbCategory(m_xBuilder->weld_combo_box("category")) + , m_xLbFunction(m_xBuilder->weld_tree_view("function")) + , m_xLbFunctionSearchString(m_xBuilder->weld_entry("search")) + , m_pFunctionManager(_pFunctionManager) { - get(m_pLbCategory, "category"); - get(m_pLbFunction, "function"); - get(m_plbFunctionSearchString, "search"); - m_pLbFunction->SetStyle(m_pLbFunction->GetStyle() | WB_SORT); - Size aSize(LogicToPixel(Size(86 , 162), MapMode(MapUnit::MapAppFont))); - m_pLbFunction->set_height_request(aSize.Height()); - m_pLbFunction->set_width_request(aSize.Width()); - m_aHelpId = m_pLbFunction->GetHelpId(); + m_xLbFunction->make_sorted(); + m_aHelpId = m_xLbFunction->get_help_id(); m_pFunctionManager->fillLastRecentlyUsedFunctions(aLRUList); @@ -77,30 +60,25 @@ FuncPage::FuncPage(vcl::Window* pParent,const IFunctionManager* _pFunctionManage for(sal_uInt32 j= 0; j < nCategoryCount; ++j) { const IFunctionCategory* pCategory = m_pFunctionManager->getCategory(j); - m_pLbCategory->SetEntryData(m_pLbCategory->InsertEntry(pCategory->getName()),const_cast<IFunctionCategory *>(pCategory)); + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pCategory))); + m_xLbCategory->append(sId, pCategory->getName()); } - m_pLbCategory->SetDropDownLineCount(m_pLbCategory->GetEntryCount()); - m_pLbCategory->SelectEntryPos(1); - OUString searchStr = m_plbFunctionSearchString->GetText(); + m_xLbCategory->set_active(1); + OUString searchStr = m_xLbFunctionSearchString->get_text(); UpdateFunctionList(searchStr); - m_pLbCategory->SetSelectHdl( LINK( this, FuncPage, SelHdl ) ); - m_pLbFunction->SetSelectHdl( LINK( this, FuncPage, SelHdl ) ); - m_pLbFunction->SetDoubleClickHdl( LINK( this, FuncPage, DblClkHdl ) ); - m_plbFunctionSearchString->SetModifyHdl( LINK( this, FuncPage, ModifyHdl ) ); + // lock to its initial size + m_xLbFunction->set_size_request(m_xLbFunction->get_preferred_size().Width(), + m_xLbFunction->get_height_rows(15)); + m_xLbCategory->connect_changed( LINK( this, FuncPage, SelComboBoxHdl ) ); + m_xLbFunction->connect_changed( LINK( this, FuncPage, SelTreeViewHdl ) ); + m_xLbFunction->connect_row_activated( LINK( this, FuncPage, DblClkHdl ) ); + m_xLbFunction->connect_key_press( LINK( this, FuncPage, KeyInputHdl ) ); + m_xLbFunctionSearchString->connect_changed( LINK( this, FuncPage, ModifyHdl ) ); } FuncPage::~FuncPage() { - disposeOnce(); -} - -void FuncPage::dispose() -{ - m_pLbCategory.clear(); - m_pLbFunction.clear(); - m_plbFunctionSearchString.clear(); - TabPage::dispose(); } void FuncPage::impl_addFunctions(const IFunctionCategory* _pCategory) @@ -110,23 +88,24 @@ void FuncPage::impl_addFunctions(const IFunctionCategory* _pCategory) { TFunctionDesc pDesc(_pCategory->getFunction(i)); if (!pDesc->isHidden()) - m_pLbFunction->SetEntryData( - m_pLbFunction->InsertEntry(pDesc->getFunctionName() ),const_cast<IFunctionDescription *>(pDesc) ); + { + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pDesc))); + m_xLbFunction->append(sId, pDesc->getFunctionName()); + } } } //aStr is non-empty when user types in the search box to search some function void FuncPage::UpdateFunctionList(const OUString& aStr) { + m_xLbFunction->clear(); + m_xLbFunction->freeze(); - m_pLbFunction->Clear(); - m_pLbFunction->SetUpdateMode( false ); - - const sal_Int32 nSelPos = m_pLbCategory->GetSelectedEntryPos(); + const sal_Int32 nSelPos = m_xLbCategory->get_active(); if (aStr.isEmpty() || nSelPos == 0) { - const IFunctionCategory* pCategory = static_cast<const IFunctionCategory*>(m_pLbCategory->GetEntryData(nSelPos)); + const IFunctionCategory* pCategory = reinterpret_cast<const IFunctionCategory*>(m_xLbCategory->get_id(nSelPos).toInt64()); if ( nSelPos > 0 ) { @@ -149,8 +128,8 @@ void FuncPage::UpdateFunctionList(const OUString& aStr) { if (elem) // may be null if a function is no longer available { - m_pLbFunction->SetEntryData( - m_pLbFunction->InsertEntry( elem->getFunctionName() ), const_cast<IFunctionDescription *>(elem) ); + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(elem))); + m_xLbFunction->append(sId, elem->getFunctionName()); } } } @@ -164,10 +143,10 @@ void FuncPage::UpdateFunctionList(const OUString& aStr) const sal_uInt32 nCategoryCount = m_pFunctionManager->getCount(); // Category listbox holds additional entries for Last Used and All, so // the offset should be two but hard coded numbers are ugly.. - const sal_Int32 nCategoryOffset = m_pLbCategory->GetEntryCount() - nCategoryCount; + const sal_Int32 nCategoryOffset = m_xLbCategory->get_count() - nCategoryCount; // If a real category (not Last Used or All) is selected, list only // functions of that category. Else list all, LRU is handled above. - sal_Int32 nCatBeg = (nSelPos == LISTBOX_ENTRY_NOTFOUND ? -1 : nSelPos - nCategoryOffset); + sal_Int32 nCatBeg = (nSelPos == -1 ? -1 : nSelPos - nCategoryOffset); sal_uInt32 nCatEnd; if (nCatBeg < 0) { @@ -189,105 +168,105 @@ void FuncPage::UpdateFunctionList(const OUString& aStr) { if (!pDesc->isHidden()) { - m_pLbFunction->SetEntryData( - m_pLbFunction->InsertEntry( pDesc->getFunctionName()), - const_cast<IFunctionDescription *>(pDesc)); + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pDesc))); + m_xLbFunction->append(sId, pDesc->getFunctionName()); } } } } } - m_pLbFunction->SetUpdateMode( true ); + m_xLbFunction->thaw(); // Ensure no function is selected so the Next button doesn't overwrite a // function that is not in the list with an arbitrary selected one. - m_pLbFunction->SetNoSelection(); + m_xLbFunction->unselect_all(); - if(IsVisible()) SelHdl(*m_pLbFunction); + if (IsVisible()) + SelTreeViewHdl(*m_xLbFunction); } -IMPL_LINK( FuncPage, SelHdl, ListBox&, rLb, void ) +IMPL_LINK_NOARG(FuncPage, SelComboBoxHdl, weld::ComboBox&, void) { - if(&rLb==m_pLbFunction) - { - const IFunctionDescription* pDesc = GetFuncDesc( GetFunction() ); - if ( pDesc ) - { - const OString sHelpId = pDesc->getHelpId(); - if ( !sHelpId.isEmpty() ) - m_pLbFunction->SetHelpId(sHelpId); - } - aSelectionLink.Call(*this); - } - else + OUString searchStr = m_xLbFunctionSearchString->get_text(); + m_xLbFunction->set_help_id(m_aHelpId); + UpdateFunctionList(searchStr); +} + +IMPL_LINK_NOARG(FuncPage, SelTreeViewHdl, weld::TreeView&, void) +{ + const IFunctionDescription* pDesc = GetFuncDesc( GetFunction() ); + if ( pDesc ) { - OUString searchStr = m_plbFunctionSearchString->GetText(); - m_pLbFunction->SetHelpId(m_aHelpId); - UpdateFunctionList(searchStr); + const OString sHelpId = pDesc->getHelpId(); + if ( !sHelpId.isEmpty() ) + m_xLbFunction->set_help_id(sHelpId); } + aSelectionLink.Call(*this); } -IMPL_LINK_NOARG(FuncPage, DblClkHdl, ListBox&, void) +IMPL_LINK_NOARG(FuncPage, DblClkHdl, weld::TreeView&, void) { aDoubleClickLink.Call(*this); } -IMPL_LINK_NOARG(FuncPage, ModifyHdl, Edit&, void) +IMPL_LINK_NOARG(FuncPage, ModifyHdl, weld::Entry&, void) { // While typing select All category. - m_pLbCategory->SelectEntryPos(1); - OUString searchStr = m_plbFunctionSearchString->GetText(); + m_xLbCategory->set_active(1); + OUString searchStr = m_xLbFunctionSearchString->get_text(); UpdateFunctionList(searchStr); } void FuncPage::SetCategory(sal_Int32 nCat) { - m_pLbCategory->SelectEntryPos(nCat); + m_xLbCategory->set_active(nCat); UpdateFunctionList(OUString()); } sal_Int32 FuncPage::GetFuncPos(const IFunctionDescription* _pDesc) { - return m_pLbFunction->GetEntryPos(_pDesc); + return m_xLbFunction->find_id(OUString::number(reinterpret_cast<sal_Int64>(_pDesc))); } void FuncPage::SetFunction(sal_Int32 nFunc) { - if (nFunc == LISTBOX_ENTRY_NOTFOUND) - m_pLbFunction->SetNoSelection(); + if (nFunc == -1) + m_xLbFunction->unselect_all(); else - m_pLbFunction->SelectEntryPos(nFunc); + m_xLbFunction->select(nFunc); } void FuncPage::SetFocus() { - m_pLbFunction->GrabFocus(); + m_xLbFunction->grab_focus(); } sal_Int32 FuncPage::GetCategory() { - return m_pLbCategory->GetSelectedEntryPos(); + return m_xLbCategory->get_active(); } sal_Int32 FuncPage::GetFunction() { - return m_pLbFunction->GetSelectedEntryPos(); + return m_xLbFunction->get_selected_index(); } sal_Int32 FuncPage::GetFunctionEntryCount() { - return m_pLbFunction->GetSelectedEntryCount(); + return m_xLbFunction->n_children(); } OUString FuncPage::GetSelFunctionName() const { - return m_pLbFunction->GetSelectedEntry(); + return m_xLbFunction->get_selected_text(); } const IFunctionDescription* FuncPage::GetFuncDesc( sal_Int32 nPos ) const { + if (nPos == -1) + return nullptr; // not pretty, but hopefully rare - return static_cast<const IFunctionDescription*>(m_pLbFunction->GetEntryData(nPos)); + return reinterpret_cast<const IFunctionDescription*>(m_xLbFunction->get_id(nPos).toInt64()); } } // formula diff --git a/formula/source/ui/dlg/funcpage.hxx b/formula/source/ui/dlg/funcpage.hxx index b4bccbc64199..1b5b92b6b2fb 100644 --- a/formula/source/ui/dlg/funcpage.hxx +++ b/formula/source/ui/dlg/funcpage.hxx @@ -37,49 +37,39 @@ class IFunctionDescription; class IFunctionManager; class IFunctionCategory; - -class FormulaListBox : public ListBox -{ -protected: - - virtual void KeyInput( const KeyEvent& rKEvt ) override; - virtual bool PreNotify( NotifyEvent& rNEvt ) override; - -public: - FormulaListBox( vcl::Window* pParent, WinBits nBits ); - -}; - - typedef const IFunctionDescription* TFunctionDesc; -class FuncPage final : public TabPage +class FuncPage final { private: + std::unique_ptr<weld::Builder> m_xBuilder; + std::unique_ptr<weld::Container> m_xContainer; + + std::unique_ptr<weld::ComboBox> m_xLbCategory; + std::unique_ptr<weld::TreeView> m_xLbFunction; + std::unique_ptr<weld::Entry> m_xLbFunctionSearchString; + Link<FuncPage&,void> aDoubleClickLink; Link<FuncPage&,void> aSelectionLink; - VclPtr<ListBox> m_pLbCategory; - VclPtr<FormulaListBox> m_pLbFunction; - VclPtr<Edit> m_plbFunctionSearchString; const IFunctionManager* m_pFunctionManager; ::std::vector< TFunctionDesc > aLRUList; OString m_aHelpId; - void impl_addFunctions(const IFunctionCategory* _pCategory); - DECL_LINK( SelHdl, ListBox&, void ); - DECL_LINK(DblClkHdl, ListBox&, void); - DECL_LINK(ModifyHdl, Edit&, void); - void UpdateFunctionList(const OUString&); + DECL_LINK(SelComboBoxHdl, weld::ComboBox&, void); + DECL_LINK(SelTreeViewHdl, weld::TreeView&, void); + DECL_LINK(DblClkHdl, weld::TreeView&, void); + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + DECL_LINK(ModifyHdl, weld::Entry&, void); + void UpdateFunctionList(const OUString&); public: - FuncPage( vcl::Window* pParent,const IFunctionManager* _pFunctionManager); - virtual ~FuncPage() override; - virtual void dispose() override; + FuncPage(weld::Container* pContainer, const IFunctionManager* _pFunctionManager); + ~FuncPage(); void SetCategory(sal_Int32 nCat); void SetFunction(sal_Int32 nFunc); @@ -96,6 +86,9 @@ public: void SetSelectHdl( const Link<FuncPage&,void>& rLink ) { aSelectionLink = rLink; } + void Show() { m_xContainer->show(); } + bool IsVisible() { return m_xContainer->get_visible(); } + void Hide() { m_xContainer->hide(); } }; } // formula diff --git a/formula/source/ui/dlg/funcutl.cxx b/formula/source/ui/dlg/funcutl.cxx index 698afeab405c..2aeb01ab0ae4 100644 --- a/formula/source/ui/dlg/funcutl.cxx +++ b/formula/source/ui/dlg/funcutl.cxx @@ -27,6 +27,7 @@ #include <formula/funcutl.hxx> #include <formula/IControlReferenceHandler.hxx> #include "ControlHelper.hxx" +#include "parawin.hxx" #include <strings.hrc> #include <bitmaps.hlst> #include <core_resource.hxx> @@ -36,41 +37,29 @@ namespace formula { // class ArgEdit -ArgEdit::ArgEdit( vcl::Window* pParent, WinBits nBits ) - : RefEdit( pParent, nullptr, nBits ), - pEdPrev ( nullptr ), - pEdNext ( nullptr ), - pSlider ( nullptr ), - nArgs ( 0 ) +ArgEdit::ArgEdit(std::unique_ptr<weld::Entry> xControl) + : WeldRefEdit(std::move(xControl)) + , pEdPrev(nullptr) + , pEdNext(nullptr) + , pSlider(nullptr) + , pParaWin(nullptr) + , nArgs(0) { } -ArgEdit::~ArgEdit() -{ - disposeOnce(); -} - -void ArgEdit::dispose() -{ - pEdPrev.clear(); - pEdNext.clear(); - pSlider.clear(); - RefEdit::dispose(); -} - -VCL_BUILDER_FACTORY_ARGS(ArgEdit, WB_BORDER) - -void ArgEdit::Init( ArgEdit* pPrevEdit, ArgEdit* pNextEdit, - ScrollBar& rArgSlider, sal_uInt16 nArgCount ) +void ArgEdit::Init(ArgEdit* pPrevEdit, ArgEdit* pNextEdit, + weld::ScrolledWindow& rArgSlider, + ParaWin& rParaWin, sal_uInt16 nArgCount) { pEdPrev = pPrevEdit; pEdNext = pNextEdit; pSlider = &rArgSlider; + pParaWin = &rParaWin; nArgs = nArgCount; } // Cursor control for Edit Fields in Argument Dialog -void ArgEdit::KeyInput( const KeyEvent& rKEvt ) +IMPL_LINK(ArgEdit, KeyInputHdl, const KeyEvent&, rKEvt, bool) { vcl::KeyCode aCode = rKEvt.GetKeyCode(); bool bUp = (aCode.GetCode() == KEY_UP); @@ -83,7 +72,7 @@ void ArgEdit::KeyInput( const KeyEvent& rKEvt ) if ( nArgs > 1 ) { ArgEdit* pEd = nullptr; - long nThumb = pSlider->GetThumbPos(); + int nThumb = pSlider->vadjustment_get_value(); bool bDoScroll = false; bool bChangeFocus = false; @@ -132,17 +121,17 @@ void ArgEdit::KeyInput( const KeyEvent& rKEvt ) if ( bDoScroll ) { - pSlider->SetThumbPos( nThumb ); - pSlider->GetEndScrollHdl().Call( pSlider ); + pSlider->vadjustment_set_value( nThumb ); + pParaWin->SliderMoved(); } else if ( bChangeFocus ) { pEd->GrabFocus(); } } + return true; } - else - RefEdit::KeyInput( rKEvt ); + return false; } // class ArgInput @@ -154,8 +143,8 @@ ArgInput::ArgInput() pRefBtn=nullptr; } -void ArgInput::InitArgInput( FixedText* pftArg, PushButton* pbtnFx, - ArgEdit* pedArg, RefButton* prefBtn) +void ArgInput::InitArgInput(weld::Label* pftArg, weld::Button* pbtnFx, + ArgEdit* pedArg, WeldRefButton* prefBtn) { pFtArg =pftArg; pBtnFx =pbtnFx; @@ -164,240 +153,124 @@ void ArgInput::InitArgInput( FixedText* pftArg, PushButton* pbtnFx, if(pBtnFx!=nullptr) { - pBtnFx->SetClickHdl ( LINK( this, ArgInput, FxBtnClickHdl ) ); - pBtnFx->SetGetFocusHdl( LINK( this, ArgInput, FxBtnFocusHdl ) ); + pBtnFx->connect_clicked( LINK( this, ArgInput, FxBtnClickHdl ) ); + pBtnFx->connect_focus_in( LINK( this, ArgInput, FxBtnFocusHdl ) ); } if(pEdArg!=nullptr) { pEdArg->SetGetFocusHdl ( LINK( this, ArgInput, EdFocusHdl ) ); pEdArg->SetModifyHdl ( LINK( this, ArgInput, EdModifyHdl ) ); } - } // Sets the Name for the Argument void ArgInput::SetArgName(const OUString &aArg) { - if(pFtArg !=nullptr) pFtArg->SetText(aArg ); + if (pFtArg) + pFtArg->set_label(aArg ); } // Returns the Name for the Argument OUString ArgInput::GetArgName() { OUString aPrivArgName; - if(pFtArg !=nullptr) - aPrivArgName=pFtArg->GetText(); - + if (pFtArg) + aPrivArgName = pFtArg->get_label(); return aPrivArgName; } //Sets the Name for the Argument -void ArgInput::SetArgNameFont (const vcl::Font &aFont) +void ArgInput::SetArgNameFont(const vcl::Font &aFont) { - if(pFtArg !=nullptr) pFtArg->SetFont(aFont); + if (pFtArg) + pFtArg->set_font(aFont); } //Sets up the Selection for the EditBox. -void ArgInput::SetArgSelection (const Selection& rSel ) +void ArgInput::SelectAll() { - if(pEdArg !=nullptr) pEdArg ->SetSelection(rSel ); + if (pEdArg) + pEdArg->SelectAll(); } //Sets the Value for the Argument void ArgInput::SetArgVal(const OUString &rVal) { - if(pEdArg != nullptr) - { - pEdArg ->SetRefString(rVal); - } + if (pEdArg) + pEdArg->SetRefString(rVal); } //Returns the Value for the Argument OUString ArgInput::GetArgVal() { OUString aResult; - if(pEdArg!=nullptr) - { + if (pEdArg) aResult=pEdArg->GetText(); - } return aResult; } //Hides the Controls void ArgInput::Hide() { - if ( pFtArg && pBtnFx && pEdArg && pRefBtn) + if (pFtArg && pBtnFx && pEdArg && pRefBtn) { - pFtArg->Hide(); - pBtnFx->Hide(); - pEdArg->Hide(); - pRefBtn->Hide(); + pFtArg->hide(); + pBtnFx->hide(); + pEdArg->GetWidget()->hide(); + pRefBtn->GetWidget()->hide(); } } //Casts the Controls again. void ArgInput::Show() { - if ( pFtArg && pBtnFx && pEdArg && pRefBtn) + if (pFtArg && pBtnFx && pEdArg && pRefBtn) { - pFtArg->Show(); - pBtnFx->Show(); - pEdArg->Show(); - pRefBtn->Show(); + pFtArg->show(); + pBtnFx->show(); + pEdArg->GetWidget()->show(); + pRefBtn->GetWidget()->show(); } } void ArgInput::UpdateAccessibleNames() { OUString aArgName(":"); - aArgName += pFtArg->GetText(); + aArgName += pFtArg->get_label(); - OUString aName = pBtnFx->GetQuickHelpText(); + OUString aName = pBtnFx->get_tooltip_text(); aName += aArgName; - pBtnFx->SetAccessibleName(aName); + pBtnFx->set_accessible_name(aName); - aName = pRefBtn->GetQuickHelpText(); + aName = pRefBtn->GetWidget()->get_tooltip_text(); aName += aArgName; - pRefBtn->SetAccessibleName(aName); + pRefBtn->GetWidget()->set_accessible_name(aName); } -IMPL_LINK( ArgInput, FxBtnClickHdl, Button*, pBtn, void ) +IMPL_LINK(ArgInput, FxBtnClickHdl, weld::Button&, rBtn, void) { - if(pBtn == pBtnFx) + if (&rBtn == pBtnFx) aFxClickLink.Call(*this); } -IMPL_LINK( ArgInput, FxBtnFocusHdl, Control&, rControl, void ) +IMPL_LINK( ArgInput, FxBtnFocusHdl, weld::Widget&, rControl, void ) { - if(&rControl == pBtnFx) + if (&rControl == pBtnFx) aFxFocusLink.Call(*this); } -IMPL_LINK( ArgInput, EdFocusHdl, Control&, rControl, void ) +IMPL_LINK( ArgInput, EdFocusHdl, WeldRefEdit&, rControl, void ) { - if(&rControl == pEdArg) + if (&rControl == pEdArg) aEdFocusLink.Call(*this); } -IMPL_LINK( ArgInput, EdModifyHdl, Edit&, rEdit, void ) +IMPL_LINK( ArgInput, EdModifyHdl, WeldRefEdit&, rEdit, void ) { - if(&rEdit == pEdArg) + if (&rEdit == pEdArg) aEdModifyLink.Call(*this); } -// class EditBox - -EditBox::EditBox( vcl::Window* pParent, WinBits nBits ) - :Control(pParent,nBits) -{ - WinBits nStyle=GetStyle(); - SetStyle( nStyle| WB_DIALOGCONTROL); - - pMEdit=VclPtr<MultiLineEdit>::Create(this,WB_LEFT | WB_VSCROLL | (nStyle & WB_TABSTOP) | - WB_NOBORDER | WB_NOHIDESELECTION | WB_IGNORETAB); - pMEdit->Show(); - aOldSel=pMEdit->GetSelection(); - Resize(); - WinBits nWinStyle=GetStyle() | WB_DIALOGCONTROL; - SetStyle(nWinStyle); - - // #105582# the HelpId from the resource must be set for the MultiLineEdit, - // not for the control that contains it. - pMEdit->SetHelpId( GetHelpId() ); - SetHelpId( "" ); -} - -VCL_BUILDER_FACTORY_ARGS(EditBox, WB_BORDER) - -EditBox::~EditBox() -{ - disposeOnce(); -} - -void EditBox::dispose() -{ - pMEdit->Disable(); - pMEdit.disposeAndClear(); - Control::dispose(); -} - -// When the size is changed, MultiLineEdit must be adapted.. -void EditBox::Resize() -{ - Size aSize=GetOutputSizePixel(); - if(pMEdit!=nullptr) pMEdit->SetOutputSizePixel(aSize); -} - -// When the Control is activated, the Selection is repealed -// and the Cursor set at the end. -void EditBox::GetFocus() -{ - if(pMEdit!=nullptr) - { - pMEdit->GrabFocus(); - } -} - -// When an event is being triggered, this routine is called first and -// a PostUserEvent is sent. -bool EditBox::PreNotify( NotifyEvent& rNEvt ) -{ - bool bResult = true; - - if(pMEdit==nullptr) return bResult; - - MouseNotifyEvent nSwitch=rNEvt.GetType(); - if(nSwitch==MouseNotifyEvent::KEYINPUT)// || nSwitch==MouseNotifyEvent::KEYUP) - { - const vcl::KeyCode& aKeyCode=rNEvt.GetKeyEvent()->GetKeyCode(); - sal_uInt16 nKey=aKeyCode.GetCode(); - if( (nKey==KEY_RETURN && !aKeyCode.IsShift()) || nKey==KEY_TAB ) - { - bResult = GetParent()->EventNotify(rNEvt); - } - else - { - bResult=Control::PreNotify(rNEvt); - Application::PostUserEvent( LINK( this, EditBox, ChangedHdl ), nullptr, true ); - } - - } - else - { - bResult=Control::PreNotify(rNEvt); - - if(nSwitch==MouseNotifyEvent::MOUSEBUTTONDOWN || nSwitch==MouseNotifyEvent::MOUSEBUTTONUP) - { - Application::PostUserEvent( LINK( this, EditBox, ChangedHdl ), nullptr, true ); - } - } - return bResult; -} - -// When an event was triggered, this routine is called first. -IMPL_LINK_NOARG(EditBox, ChangedHdl, void*, void) -{ - if(pMEdit!=nullptr) - { - Selection aNewSel=pMEdit->GetSelection(); - - if(aNewSel.Min()!=aOldSel.Min() || aNewSel.Max()!=aOldSel.Max()) - { - aSelChangedLink.Call(*this); - aOldSel=aNewSel; - } - } -} - -void EditBox::UpdateOldSel() -{ - // if selection is set for editing a function, store it as aOldSel, - // so SelectionChanged isn't called in the next ChangedHdl call - - if (pMEdit) - aOldSel = pMEdit->GetSelection(); -} - // class RefEdit RefEdit::RefEdit( vcl::Window* _pParent, vcl::Window* pShrinkModeLabel, WinBits nStyle ) diff --git a/formula/source/ui/dlg/parawin.cxx b/formula/source/ui/dlg/parawin.cxx index d901bc1a7cfa..4774b7ba415b 100644 --- a/formula/source/ui/dlg/parawin.cxx +++ b/formula/source/ui/dlg/parawin.cxx @@ -21,6 +21,7 @@ #include <svl/zforlist.hxx> #include <svl/stritem.hxx> #include <vcl/settings.hxx> +#include <vcl/svapp.hxx> #include <sal/log.hxx> #include "parawin.hxx" @@ -34,73 +35,68 @@ namespace formula { - -ParaWin::ParaWin(vcl::Window* pParent,IControlReferenceHandler* _pDlg): - TabPage (pParent, "ParameterPage", "formula/ui/parameter.ui"), - pFuncDesc ( nullptr ), - pMyParent (_pDlg), - m_sOptional ( ForResId( STR_OPTIONAL ) ), - m_sRequired ( ForResId( STR_REQUIRED ) ) +ParaWin::ParaWin(weld::Container* pParent,IControlReferenceHandler* _pDlg) + : pFuncDesc(nullptr) + , pMyParent(_pDlg) + , m_sOptional(ForResId(STR_OPTIONAL)) + , m_sRequired(ForResId(STR_REQUIRED)) + , m_xBuilder(Application::CreateBuilder(pParent, "formula/ui/parameter.ui")) + , m_xContainer(m_xBuilder->weld_container("ParameterPage")) + , m_xSlider(m_xBuilder->weld_scrolled_window("scrollbar")) + , m_xParamGrid(m_xBuilder->weld_widget("paramgrid")) + , m_xGrid(m_xBuilder->weld_widget("grid")) + , m_xFtEditDesc(m_xBuilder->weld_label("editdesc")) + , m_xFtArgName(m_xBuilder->weld_label("parname")) + , m_xFtArgDesc(m_xBuilder->weld_label("pardesc")) + , m_xBtnFx1(m_xBuilder->weld_button("FX1")) + , m_xBtnFx2(m_xBuilder->weld_button("FX2")) + , m_xBtnFx3(m_xBuilder->weld_button("FX3")) + , m_xBtnFx4(m_xBuilder->weld_button("FX4")) + , m_xFtArg1(m_xBuilder->weld_label("FT_ARG1")) + , m_xFtArg2(m_xBuilder->weld_label("FT_ARG2")) + , m_xFtArg3(m_xBuilder->weld_label("FT_ARG3")) + , m_xFtArg4(m_xBuilder->weld_label("FT_ARG4")) + , m_xEdArg1(new ArgEdit(m_xBuilder->weld_entry("ED_ARG1"))) + , m_xEdArg2(new ArgEdit(m_xBuilder->weld_entry("ED_ARG2"))) + , m_xEdArg3(new ArgEdit(m_xBuilder->weld_entry("ED_ARG3"))) + , m_xEdArg4(new ArgEdit(m_xBuilder->weld_entry("ED_ARG4"))) + , m_xRefBtn1(new WeldRefButton(m_xBuilder->weld_button("RB_ARG1"))) + , m_xRefBtn2(new WeldRefButton(m_xBuilder->weld_button("RB_ARG2"))) + , m_xRefBtn3(new WeldRefButton(m_xBuilder->weld_button("RB_ARG3"))) + , m_xRefBtn4(new WeldRefButton(m_xBuilder->weld_button("RB_ARG4"))) { - get(m_pFtEditDesc, "editdesc"); - get(m_pFtArgName, "parname"); - get(m_pFtArgDesc, "pardesc"); - // Space for three lines of text in function description. - m_pFtEditDesc->SetText("X\nX\nX\n"); - long nEditHeight = m_pFtEditDesc->GetOptimalSize().Height(); - m_pFtEditDesc->set_height_request(nEditHeight); - m_pFtEditDesc->SetText(""); + m_xFtEditDesc->set_label("X\nX\nX\n"); + auto nEditHeight = m_xFtEditDesc->get_preferred_size().Height(); + m_xFtEditDesc->set_size_request(-1, nEditHeight); + m_xFtEditDesc->set_label(""); // Space for two lines of text in parameter description. - m_pFtArgDesc->SetText("X\nX\n"); - long nArgHeight = m_pFtArgDesc->GetOptimalSize().Height(); - m_pFtArgDesc->set_height_request(nArgHeight); - m_pFtArgDesc->SetText(""); - - get(m_pBtnFx1, "FX1"); - m_pBtnFx1->SetModeImage(Image(StockImage::Yes, BMP_FX)); - get(m_pBtnFx2, "FX2"); - m_pBtnFx2->SetModeImage(Image(StockImage::Yes, BMP_FX)); - get(m_pBtnFx3, "FX3"); - m_pBtnFx3->SetModeImage(Image(StockImage::Yes, BMP_FX)); - get(m_pBtnFx4, "FX4"); - m_pBtnFx4->SetModeImage(Image(StockImage::Yes, BMP_FX)); - - get(m_pFtArg1, "FT_ARG1"); - get(m_pFtArg2, "FT_ARG2"); - get(m_pFtArg3, "FT_ARG3"); - get(m_pFtArg4, "FT_ARG4"); - - get(m_pEdArg1, "ED_ARG1"); - get(m_pEdArg2, "ED_ARG2"); - get(m_pEdArg3, "ED_ARG3"); - get(m_pEdArg4, "ED_ARG4"); - - get(m_pRefBtn1, "RB_ARG1"); - get(m_pRefBtn2, "RB_ARG2"); - get(m_pRefBtn3, "RB_ARG3"); - get(m_pRefBtn4, "RB_ARG4"); - - get(m_pSlider, "scrollbar"); + m_xFtArgDesc->set_label("X\nX\n"); + auto nArgHeight = m_xFtArgDesc->get_preferred_size().Height(); + m_xFtArgDesc->set_size_request(-1, nArgHeight); + m_xFtArgDesc->set_label(""); + + m_xBtnFx1->set_from_icon_name(BMP_FX); + m_xBtnFx2->set_from_icon_name(BMP_FX); + m_xBtnFx3->set_from_icon_name(BMP_FX); + m_xBtnFx4->set_from_icon_name(BMP_FX); //lock down initial preferences - vcl::Window *pGrid = get<vcl::Window>("paramgrid"); - pGrid->set_height_request(pGrid->get_preferred_size().Height()); - Size aSize(get_preferred_size()); - set_width_request(aSize.Width()); - set_height_request(aSize.Height()); + m_xParamGrid->set_size_request(-1, m_xParamGrid->get_preferred_size().Height()); + Size aSize(m_xContainer->get_preferred_size()); + m_xContainer->set_size_request(aSize.Width(), aSize.Height()); - aDefaultString=m_pFtEditDesc->GetText(); - nEdFocus=NOT_FOUND; - nActiveLine=0; + aDefaultString = m_xFtEditDesc->get_label(); + nEdFocus = NOT_FOUND; + nActiveLine = 0; - m_pSlider->SetEndScrollHdl( LINK( this, ParaWin, ScrollHdl ) ); - m_pSlider->SetScrollHdl( LINK( this, ParaWin, ScrollHdl ) ); + m_xSlider->set_user_managed_scrolling(); + m_xSlider->connect_vadjustment_changed(LINK(this, ParaWin, ScrollHdl)); - InitArgInput( 0, *m_pFtArg1, *m_pBtnFx1, *m_pEdArg1, *m_pRefBtn1); - InitArgInput( 1, *m_pFtArg2, *m_pBtnFx2, *m_pEdArg2, *m_pRefBtn2); - InitArgInput( 2, *m_pFtArg3, *m_pBtnFx3, *m_pEdArg3, *m_pRefBtn3); - InitArgInput( 3, *m_pFtArg4, *m_pBtnFx4, *m_pEdArg4, *m_pRefBtn4); + InitArgInput( 0, *m_xFtArg1, *m_xBtnFx1, *m_xEdArg1, *m_xRefBtn1); + InitArgInput( 1, *m_xFtArg2, *m_xBtnFx2, *m_xEdArg2, *m_xRefBtn2); + InitArgInput( 2, *m_xFtArg3, *m_xBtnFx3, *m_xEdArg3, *m_xRefBtn3); + InitArgInput( 3, *m_xFtArg4, *m_xBtnFx4, *m_xEdArg4, *m_xRefBtn4); ClearAll(); } @@ -228,42 +224,15 @@ void ParaWin::UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 i ) ParaWin::~ParaWin() { - disposeOnce(); -} - -void ParaWin::dispose() -{ // #i66422# if the focus changes during destruction of the controls, // don't call the focus handlers - Link<Control&,void> aEmptyLink; - m_pBtnFx1->SetGetFocusHdl( aEmptyLink ); - m_pBtnFx2->SetGetFocusHdl( aEmptyLink ); - m_pBtnFx3->SetGetFocusHdl( aEmptyLink ); - m_pBtnFx4->SetGetFocusHdl( aEmptyLink ); - m_pFtEditDesc.clear(); - m_pFtArgName.clear(); - m_pFtArgDesc.clear(); - m_pBtnFx1.clear(); - m_pFtArg1.clear(); - m_pEdArg1.clear(); - m_pRefBtn1.clear(); - m_pBtnFx2.clear(); - m_pFtArg2.clear(); - m_pEdArg2.clear(); - m_pRefBtn2.clear(); - m_pBtnFx3.clear(); - m_pFtArg3.clear(); - m_pEdArg3.clear(); - m_pRefBtn3.clear(); - m_pBtnFx4.clear(); - m_pFtArg4.clear(); - m_pEdArg4.clear(); - m_pRefBtn4.clear(); - m_pSlider.clear(); - TabPage::dispose(); + Link<weld::Widget&,void> aEmptyLink; + m_xBtnFx1->connect_focus_in(aEmptyLink); + m_xBtnFx2->connect_focus_in(aEmptyLink); + m_xBtnFx3->connect_focus_in(aEmptyLink); + m_xBtnFx4->connect_focus_in(aEmptyLink); } - void ParaWin::SetActiveLine(sal_uInt16 no) { if(no<nArgs) @@ -282,7 +251,7 @@ void ParaWin::SetActiveLine(sal_uInt16 no) } } -RefEdit* ParaWin::GetActiveEdit() +WeldRefEdit* ParaWin::GetActiveEdit() { if(nArgs>0 && nEdFocus!=NOT_FOUND) { @@ -350,13 +319,14 @@ void ParaWin::SetFunctionDesc(const IFunctionDescription* pFDesc) } nArgs = pFuncDesc->getSuppressedArgumentCount(); pFuncDesc->fillVisibleArgumentMapping(aVisibleArgMapping); - m_pSlider->Hide(); + m_xSlider->set_vpolicy(VclPolicyType::NEVER); + m_xSlider->set_size_request(-1, -1); OString sHelpId = pFuncDesc->getHelpId(); - SetHelpId( sHelpId ); - m_pEdArg1->SetHelpId( sHelpId ); - m_pEdArg2->SetHelpId( sHelpId ); - m_pEdArg3->SetHelpId( sHelpId ); - m_pEdArg4->SetHelpId( sHelpId ); + m_xContainer->set_help_id(sHelpId); + m_xEdArg1->GetWidget()->set_help_id(sHelpId); + m_xEdArg2->GetWidget()->set_help_id(sHelpId); + m_xEdArg3->GetWidget()->set_help_id(sHelpId); + m_xEdArg4->GetWidget()->set_help_id(sHelpId); SetActiveLine(0); } @@ -369,17 +339,17 @@ void ParaWin::SetFunctionDesc(const IFunctionDescription* pFDesc) void ParaWin::SetArgumentText(const OUString& aText) { - m_pFtArgName->SetText(aText); + m_xFtArgName->set_label(aText); } void ParaWin::SetArgumentDesc(const OUString& aText) { - m_pFtArgDesc->SetText(aText); + m_xFtArgDesc->set_label(aText); } void ParaWin::SetEditDesc(const OUString& aText) { - m_pFtEditDesc->SetText(aText); + m_xFtEditDesc->set_label(aText); } void ParaWin::SetArgName(sal_uInt16 no,const OUString& aText) @@ -400,9 +370,8 @@ void ParaWin::SetEdFocus() aArgInput[0].GetArgEdPtr()->GrabFocus(); } - -void ParaWin::InitArgInput( sal_uInt16 nPos, FixedText& rFtArg, PushButton& rBtnFx, - ArgEdit& rEdArg, RefButton& rRefBtn) +void ParaWin::InitArgInput(sal_uInt16 nPos, weld::Label& rFtArg, weld::Button& rBtnFx, + ArgEdit& rEdArg, WeldRefButton& rRefBtn) { rRefBtn.SetReferences(pMyParent, &rEdArg); @@ -428,7 +397,7 @@ void ParaWin::ClearAll() void ParaWin::SetArgumentOffset(sal_uInt16 nOffset) { aParaArray.clear(); - m_pSlider->SetThumbPos(0); + m_xSlider->vadjustment_set_value(0); aParaArray.resize(nArgs); @@ -440,25 +409,24 @@ void ParaWin::SetArgumentOffset(sal_uInt16 nOffset) aArgInput[i].GetArgEdPtr()->Init( (i==0) ? nullptr : aArgInput[i-1].GetArgEdPtr(), (i==3 || i==nArgs-1) ? nullptr : aArgInput[i+1].GetArgEdPtr(), - *m_pSlider, nArgs ); + *m_xSlider, *this, nArgs ); } } + UpdateParas(); + if ( nArgs < 5 ) { - m_pSlider->Hide(); + m_xSlider->set_vpolicy(VclPolicyType::NEVER); + m_xSlider->set_size_request(-1, -1); } else { - m_pSlider->SetPageSize( 4 ); - m_pSlider->SetVisibleSize( 4 ); - m_pSlider->SetLineSize( 1 ); - m_pSlider->SetRange( Range( 0, nArgs ) ); - m_pSlider->SetThumbPos( nOffset ); - m_pSlider->Show(); + m_xSlider->vadjustment_configure(nOffset, 0, nArgs, 1, 4, 4); + m_xSlider->set_vpolicy(VclPolicyType::ALWAYS); + Size aPrefSize(m_xGrid->get_preferred_size()); + m_xSlider->set_size_request(aPrefSize.Width(), aPrefSize.Height()); } - - UpdateParas(); } void ParaWin::UpdateParas() @@ -482,16 +450,16 @@ void ParaWin::UpdateParas() sal_uInt16 ParaWin::GetSliderPos() { - return static_cast<sal_uInt16>(m_pSlider->GetThumbPos()); + return static_cast<sal_uInt16>(m_xSlider->vadjustment_get_value()); } void ParaWin::SetSliderPos(sal_uInt16 nSliderPos) { sal_uInt16 nOffset = GetSliderPos(); - if(m_pSlider->IsVisible() && nOffset!=nSliderPos) + if(m_xSlider->get_visible() && nOffset!=nSliderPos) { - m_pSlider->SetThumbPos(nSliderPos); + m_xSlider->vadjustment_set_value(nSliderPos); for ( sal_uInt16 i=0; i<4; i++ ) { UpdateArgInput( nSliderPos, i ); @@ -510,9 +478,10 @@ void ParaWin::SliderMoved() if(nEdFocus!=NOT_FOUND) { UpdateArgDesc( nEdFocus ); - aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); + aArgInput[nEdFocus].SelectAll(); nActiveLine=nEdFocus+nOffset; ArgumentModified(); + aArgInput[nEdFocus].SelectAll(); // ensure all is still selected aArgInput[nEdFocus].UpdateAccessibleNames(); } } @@ -537,7 +506,7 @@ IMPL_LINK( ParaWin, GetFxHdl, ArgInput&, rPtr, void ) if(nEdFocus!=NOT_FOUND) { - aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); + aArgInput[nEdFocus].SelectAll(); nActiveLine=nEdFocus+nOffset; aFxLink.Call(*this); } @@ -558,13 +527,12 @@ IMPL_LINK( ParaWin, GetFxFocusHdl, ArgInput&, rPtr, void ) if(nEdFocus!=NOT_FOUND) { - aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); + aArgInput[nEdFocus].SelectAll(); UpdateArgDesc( nEdFocus ); nActiveLine=nEdFocus+nOffset; } } - IMPL_LINK( ParaWin, GetEdFocusHdl, ArgInput&, rPtr, void ) { sal_uInt16 nOffset = GetSliderPos(); @@ -580,16 +548,16 @@ IMPL_LINK( ParaWin, GetEdFocusHdl, ArgInput&, rPtr, void ) if(nEdFocus!=NOT_FOUND) { - aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); + aArgInput[nEdFocus].SelectAll(); UpdateArgDesc( nEdFocus ); nActiveLine=nEdFocus+nOffset; ArgumentModified(); + aArgInput[nEdFocus].SelectAll(); // ensure all is still selected aArgInput[nEdFocus].UpdateAccessibleNames(); } } - -IMPL_LINK_NOARG(ParaWin, ScrollHdl, ScrollBar*, void) +IMPL_LINK_NOARG(ParaWin, ScrollHdl, weld::ScrolledWindow&, void) { SliderMoved(); } diff --git a/formula/source/ui/dlg/parawin.hxx b/formula/source/ui/dlg/parawin.hxx index 013b9bf1fc0d..8bb6443fed64 100644 --- a/formula/source/ui/dlg/parawin.hxx +++ b/formula/source/ui/dlg/parawin.hxx @@ -25,6 +25,7 @@ #include <vcl/tabpage.hxx> #include <vcl/tabctrl.hxx> #include <vcl/scrbar.hxx> +#include <vcl/weld.hxx> #include <vector> #include <formula/funcutl.hxx> @@ -38,7 +39,7 @@ namespace formula class IFunctionDescription; class IControlReferenceHandler; -class ParaWin final : public TabPage +class ParaWin { private: Link<ParaWin&,void> aFxLink; @@ -51,31 +52,6 @@ private: vcl::Font aFntBold; vcl::Font aFntLight; - VclPtr<FixedText> m_pFtEditDesc; - VclPtr<FixedText> m_pFtArgName; - VclPtr<FixedText> m_pFtArgDesc; - - VclPtr<PushButton> m_pBtnFx1; - VclPtr<FixedText> m_pFtArg1; - VclPtr<ArgEdit> m_pEdArg1; - VclPtr<RefButton> m_pRefBtn1; - - VclPtr<PushButton> m_pBtnFx2; - VclPtr<FixedText> m_pFtArg2; - VclPtr<ArgEdit> m_pEdArg2; - VclPtr<RefButton> m_pRefBtn2; - - VclPtr<PushButton> m_pBtnFx3; - VclPtr<FixedText> m_pFtArg3; - VclPtr<ArgEdit> m_pEdArg3; - VclPtr<RefButton> m_pRefBtn3; - - VclPtr<PushButton> m_pBtnFx4; - VclPtr<FixedText> m_pFtArg4; - VclPtr<ArgEdit> m_pEdArg4; - VclPtr<RefButton> m_pRefBtn4; - - VclPtr<ScrollBar> m_pSlider; OUString m_sOptional; OUString m_sRequired; @@ -84,20 +60,49 @@ private: ArgInput aArgInput[4]; OUString aDefaultString; - ::std::vector<OUString> - aParaArray; + ::std::vector<OUString> aParaArray; + + std::unique_ptr<weld::Builder> m_xBuilder; + std::unique_ptr<weld::Container> m_xContainer; + + std::unique_ptr<weld::ScrolledWindow> m_xSlider; + std::unique_ptr<weld::Widget> m_xParamGrid; + std::unique_ptr<weld::Widget> m_xGrid; + + std::unique_ptr<weld::Label> m_xFtEditDesc; + std::unique_ptr<weld::Label> m_xFtArgName; + std::unique_ptr<weld::Label> m_xFtArgDesc; - DECL_LINK( ScrollHdl, ScrollBar*, void); + std::unique_ptr<weld::Button> m_xBtnFx1; + std::unique_ptr<weld::Button> m_xBtnFx2; + std::unique_ptr<weld::Button> m_xBtnFx3; + std::unique_ptr<weld::Button> m_xBtnFx4; + + std::unique_ptr<weld::Label> m_xFtArg1; + std::unique_ptr<weld::Label> m_xFtArg2; + std::unique_ptr<weld::Label> m_xFtArg3; + std::unique_ptr<weld::Label> m_xFtArg4; + + std::unique_ptr<ArgEdit> m_xEdArg1; + std::unique_ptr<ArgEdit> m_xEdArg2; + std::unique_ptr<ArgEdit> m_xEdArg3; + std::unique_ptr<ArgEdit> m_xEdArg4; + + std::unique_ptr<WeldRefButton> m_xRefBtn1; + std::unique_ptr<WeldRefButton> m_xRefBtn2; + std::unique_ptr<WeldRefButton> m_xRefBtn3; + std::unique_ptr<WeldRefButton> m_xRefBtn4; + + DECL_LINK( ScrollHdl, weld::ScrolledWindow&, void); DECL_LINK( ModifyHdl, ArgInput&, void ); DECL_LINK( GetEdFocusHdl, ArgInput&, void ); DECL_LINK( GetFxFocusHdl, ArgInput&, void ); DECL_LINK( GetFxHdl, ArgInput&, void ); - void SliderMoved(); void ArgumentModified(); - void InitArgInput( sal_uInt16 nPos, FixedText& rFtArg, PushButton& rBtnFx, - ArgEdit& rEdArg, RefButton& rRefBtn); + void InitArgInput(sal_uInt16 nPos, weld::Label& rFtArg, weld::Button& rBtnFx, + ArgEdit& rEdArg, WeldRefButton& rRefBtn); void SetArgumentDesc(const OUString& aText); void SetArgumentText(const OUString& aText); @@ -110,9 +115,8 @@ private: void UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 i ); public: - ParaWin(vcl::Window* pParent,IControlReferenceHandler* _pDlg); - virtual ~ParaWin() override; - virtual void dispose() override; + ParaWin(weld::Container* pParent, IControlReferenceHandler* _pDlg); + ~ParaWin(); void SetFunctionDesc(const IFunctionDescription* pFDesc); void SetArgumentOffset(sal_uInt16 nOffset); @@ -122,7 +126,7 @@ public: sal_uInt16 GetActiveLine() { return nActiveLine;} void SetActiveLine(sal_uInt16 no); - RefEdit* GetActiveEdit(); + WeldRefEdit* GetActiveEdit(); OUString GetActiveArgName(); OUString GetArgument(sal_uInt16 no); @@ -135,6 +139,10 @@ public: void SetArgModifiedHdl( const Link<ParaWin&,void>& rLink ) { aArgModifiedLink = rLink; } void SetFxHdl( const Link<ParaWin&,void>& rLink ) { aFxLink = rLink; } + + void SliderMoved(); + + void Show() { m_xContainer->show(); } }; diff --git a/formula/source/ui/dlg/structpg.cxx b/formula/source/ui/dlg/structpg.cxx index 6f2a51b3228e..365eb20f3362 100644 --- a/formula/source/ui/dlg/structpg.cxx +++ b/formula/source/ui/dlg/structpg.cxx @@ -21,6 +21,7 @@ #include <svl/stritem.hxx> #include <vcl/builderfactory.hxx> #include <vcl/treelistentry.hxx> +#include <vcl/svapp.hxx> #include "structpg.hxx" #include <formula/formdata.hxx> @@ -34,8 +35,6 @@ namespace formula StructListBox::StructListBox(vcl::Window* pParent, WinBits nBits ): SvTreeListBox(pParent, nBits) { - bActiveFlag = false; - vcl::Font aFont( GetFont() ); Size aSize = aFont.GetFontSize(); aSize.AdjustHeight(-2); @@ -53,12 +52,11 @@ SvTreeListEntry* StructListBox::InsertStaticEntry( return pEntry; } -void StructListBox::SetActiveFlag(bool bFlag) +void StructPage::SetActiveFlag(bool bFlag) { bActiveFlag = bFlag; } - void StructListBox::MouseButtonDown( const MouseEvent& rMEvt ) { bActiveFlag = true; @@ -77,89 +75,89 @@ void StructListBox::LoseFocus() SvTreeListBox::LoseFocus(); } -VCL_BUILDER_FACTORY_ARGS(StructListBox, WB_BORDER) - -StructPage::StructPage(vcl::Window* pParent): - TabPage(pParent, "StructPage", "formula/ui/structpage.ui"), - maImgEnd(BitmapEx(BMP_STR_END)), - maImgError(BitmapEx(BMP_STR_ERROR)), - pSelectedToken ( nullptr ) +StructPage::StructPage(weld::Container* pParent) + : m_xBuilder(Application::CreateBuilder(pParent, "formula/ui/structpage.ui")) + , m_xContainer(m_xBuilder->weld_container("StructPage")) + , m_xTlbStruct(m_xBuilder->weld_tree_view("struct")) + , maImgEnd(BMP_STR_END) + , maImgError(BMP_STR_ERROR) + , pSelectedToken(nullptr) + , bActiveFlag(false) { - get(m_pTlbStruct, "struct"); - Size aSize(LogicToPixel(Size(86, 162), MapMode(MapUnit::MapAppFont))); - m_pTlbStruct->set_height_request(aSize.Height()); - m_pTlbStruct->set_width_request(aSize.Width()); - m_pTlbStruct->SetStyle(m_pTlbStruct->GetStyle()|WB_HASLINES|WB_CLIPCHILDREN| - WB_HASBUTTONS|WB_HSCROLL|WB_NOINITIALSELECTION); - - m_pTlbStruct->SetNodeDefaultImages(); - m_pTlbStruct->SetDefaultExpandedEntryBmp(Image(StockImage::Yes, BMP_STR_OPEN)); - m_pTlbStruct->SetDefaultCollapsedEntryBmp(Image(StockImage::Yes, BMP_STR_CLOSE)); - + m_xTlbStruct->set_size_request(m_xTlbStruct->get_approximate_digit_width() * 20, + m_xTlbStruct->get_height_rows(17)); - m_pTlbStruct->SetSelectHdl(LINK( this, StructPage, SelectHdl ) ); + m_xTlbStruct->connect_changed(LINK( this, StructPage, SelectHdl ) ); } StructPage::~StructPage() { - disposeOnce(); -} - -void StructPage::dispose() -{ - m_pTlbStruct.clear(); - TabPage::dispose(); } void StructPage::ClearStruct() { - m_pTlbStruct->SetActiveFlag(false); - m_pTlbStruct->Clear(); + SetActiveFlag(false); + m_xTlbStruct->clear(); } -SvTreeListEntry* StructPage::InsertEntry( const OUString& rText, SvTreeListEntry* pParent, - sal_uInt16 nFlag, sal_uLong nPos, const FormulaToken* pIFormulaToken ) +bool StructPage::InsertEntry(const OUString& rText, weld::TreeIter* pParent, + sal_uInt16 nFlag, int nPos, + const FormulaToken* pIFormulaToken, + weld::TreeIter& rRet) { - m_pTlbStruct->SetActiveFlag( false ); + SetActiveFlag(false); - SvTreeListEntry* pEntry = nullptr; - switch( nFlag ) + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pIFormulaToken))); + + bool bEntry = false; + switch (nFlag) { case STRUCT_FOLDER: - pEntry = m_pTlbStruct->InsertEntry( rText, pParent, false, nPos, - const_cast<FormulaToken*>(pIFormulaToken)); - break; + m_xTlbStruct->insert(pParent, nPos, &rText, &sId, nullptr, nullptr, + nullptr, false, &rRet); + m_xTlbStruct->set_image(rRet, BMP_STR_OPEN); + bEntry = true; + break; case STRUCT_END: - pEntry = m_pTlbStruct->InsertStaticEntry( rText, maImgEnd, pParent, nPos, pIFormulaToken ); - break; + m_xTlbStruct->insert(pParent, nPos, &rText, &sId, nullptr, nullptr, + nullptr, false, &rRet); + m_xTlbStruct->set_image(rRet, maImgEnd); + bEntry = true; + break; case STRUCT_ERROR: - pEntry = m_pTlbStruct->InsertStaticEntry( rText, maImgError, pParent, nPos, pIFormulaToken ); - break; + m_xTlbStruct->insert(pParent, nPos, &rText, &sId, nullptr, nullptr, + nullptr, false, &rRet); + m_xTlbStruct->set_image(rRet, maImgError); + bEntry = true; + break; } - if ( pEntry && pParent ) - m_pTlbStruct->Expand( pParent ); - return pEntry; + if (bEntry && pParent) + m_xTlbStruct->expand_row(*pParent); + return bEntry; } -OUString StructPage::GetEntryText(SvTreeListEntry* pEntry) const +OUString StructPage::GetEntryText(weld::TreeIter* pEntry) const { OUString aString; - if (pEntry != nullptr) - aString = m_pTlbStruct->GetEntryText(pEntry); - return aString; + if (pEntry) + aString = m_xTlbStruct->get_text(*pEntry); + return aString; } -const FormulaToken* StructPage::GetFunctionEntry(SvTreeListEntry* pEntry) +const FormulaToken* StructPage::GetFunctionEntry(weld::TreeIter* pEntry) { - if (pEntry != nullptr) + if (pEntry) { - const FormulaToken * pToken = static_cast<const FormulaToken *>(pEntry->GetUserData()); - if (pToken != nullptr) + const FormulaToken * pToken = reinterpret_cast<const FormulaToken *>(m_xTlbStruct->get_id(*pEntry).toInt64()); + if (pToken) { if ( !(pToken->IsFunction() || pToken->GetParamCount() > 1 ) ) { - return GetFunctionEntry(m_pTlbStruct->GetParent(pEntry)); + std::unique_ptr<weld::TreeIter> xParent(m_xTlbStruct->make_iterator(pEntry)); + if (!m_xTlbStruct->iter_parent(*xParent)) + return nullptr; + return GetFunctionEntry(xParent.get()); } else { @@ -170,21 +168,21 @@ const FormulaToken* StructPage::GetFunctionEntry(SvTreeListEntry* pEntry) return nullptr; } -IMPL_LINK( StructPage, SelectHdl, SvTreeListBox*, pTlb, void ) +IMPL_LINK(StructPage, SelectHdl, weld::TreeView&, rTlb, void) { - if (m_pTlbStruct->GetActiveFlag()) + if (GetActiveFlag()) { - if (pTlb == m_pTlbStruct) + if (&rTlb == m_xTlbStruct.get()) { - SvTreeListEntry* pCurEntry = m_pTlbStruct->GetCurEntry(); - if (pCurEntry != nullptr) + std::unique_ptr<weld::TreeIter> xCurEntry(m_xTlbStruct->make_iterator()); + if (m_xTlbStruct->get_cursor(xCurEntry.get())) { - pSelectedToken = static_cast<const FormulaToken *>(pCurEntry->GetUserData()); - if (pSelectedToken != nullptr) + pSelectedToken = reinterpret_cast<const FormulaToken *>(m_xTlbStruct->get_id(*xCurEntry).toInt64()); + if (pSelectedToken) { if ( !(pSelectedToken->IsFunction() || pSelectedToken->GetParamCount() > 1) ) { - pSelectedToken = GetFunctionEntry(pCurEntry); + pSelectedToken = GetFunctionEntry(xCurEntry.get()); } } } diff --git a/formula/source/ui/dlg/structpg.hxx b/formula/source/ui/dlg/structpg.hxx index 34c32e0a9cd2..092b29b055ae 100644 --- a/formula/source/ui/dlg/structpg.hxx +++ b/formula/source/ui/dlg/structpg.hxx @@ -51,45 +51,53 @@ public: sal_uLong nPos, const FormulaToken* pToken ); - void SetActiveFlag(bool bFlag); - bool GetActiveFlag() { return bActiveFlag;} void GetFocus() override; void LoseFocus() override; }; -class StructPage final : public TabPage +class StructPage final { private: + std::unique_ptr<weld::Builder> m_xBuilder; + std::unique_ptr<weld::Container> m_xContainer; + std::unique_ptr<weld::TreeView> m_xTlbStruct; + Link<StructPage&,void> aSelLink; - VclPtr<StructListBox> m_pTlbStruct; - Image maImgEnd; - Image maImgError; + OUString maImgEnd; + OUString maImgError; const FormulaToken* pSelectedToken; + bool bActiveFlag; - DECL_LINK( SelectHdl, SvTreeListBox*, void ); + DECL_LINK(SelectHdl, weld::TreeView&, void); - using Window::GetParent; + const FormulaToken* GetFunctionEntry(weld::TreeIter* pEntry); - const FormulaToken* GetFunctionEntry(SvTreeListEntry* pEntry); + void SetActiveFlag(bool bFlag); + bool GetActiveFlag() { return bActiveFlag;} public: - explicit StructPage(vcl::Window* pParent); - virtual ~StructPage() override; - virtual void dispose() override; + explicit StructPage(weld::Container* pParent); + ~StructPage(); void ClearStruct(); - SvTreeListEntry* InsertEntry(const OUString& rText, SvTreeListEntry* pParent, - sal_uInt16 nFlag, sal_uLong nPos, const FormulaToken* pScToken); + bool InsertEntry(const OUString& rText, weld::TreeIter* pParent, + sal_uInt16 nFlag, int nPos, + const FormulaToken* pIFormulaToken, + weld::TreeIter& rRet); - OUString GetEntryText(SvTreeListEntry* pEntry) const; + OUString GetEntryText(weld::TreeIter* pEntry) const; void SetSelectionHdl( const Link<StructPage&,void>& rLink ) { aSelLink = rLink; } - StructListBox* GetTlbStruct() const { return m_pTlbStruct; } + weld::TreeView& GetTlbStruct() const { return *m_xTlbStruct; } + + void Show() { m_xContainer->show(); } + bool IsVisible() { return m_xContainer->get_visible(); } + void Hide() { m_xContainer->hide(); } }; } // formula diff --git a/formula/uiconfig/ui/formuladialog.ui b/formula/uiconfig/ui/formuladialog.ui index 0434fe838d75..504fe8935107 100644 --- a/formula/uiconfig/ui/formuladialog.ui +++ b/formula/uiconfig/ui/formuladialog.ui @@ -1,12 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.20.0 --> +<!-- Generated with glade 3.22.1 --> <interface domain="for"> <requires lib="gtk+" version="3.18"/> - <requires lib="LibreOffice" version="1.0"/> <object class="GtkDialog" id="FormulaDialog"> <property name="can_focus">False</property> <property name="border_width">5</property> + <property name="default_width">0</property> + <property name="default_height">0</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> @@ -23,9 +27,9 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> - <property name="use_underline">True</property> <property name="halign">start</property> <property name="hexpand">True</property> + <property name="use_underline">True</property> <property name="xalign">0</property> <property name="draw_indicator">True</property> </object> @@ -137,7 +141,6 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="vexpand">True</property> - <property name="scrollable">True</property> <property name="enable_popup">True</property> <child> <object class="GtkGrid"> @@ -146,6 +149,30 @@ <child> <placeholder/> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </object> </child> <child type="tab"> @@ -165,6 +192,30 @@ <child> <placeholder/> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </object> <packing> <property name="position">1</property> @@ -181,21 +232,6 @@ <property name="tab_fill">False</property> </packing> </child> - <child> - <object class="GtkGrid"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="position">2</property> - </packing> - </child> - <child type="tab"> - <placeholder/> - </child> </object> <packing> <property name="expand">False</property> @@ -236,6 +272,7 @@ <property name="can_focus">False</property> <property name="halign">end</property> <property name="editable">False</property> + <property name="activates_default">True</property> </object> <packing> <property name="left_attach">3</property> @@ -392,6 +429,7 @@ <property name="can_focus">False</property> <property name="halign">end</property> <property name="editable">False</property> + <property name="activates_default">True</property> </object> <packing> <property name="left_attach">2</property> @@ -406,13 +444,24 @@ </packing> </child> <child> - <object class="foruilo-EditBox" id="ed_formula"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="ed_formula-atkobject"> - <property name="AtkObject::accessible-name" translatable="yes" context="formuladialog|ed_formula-atkobject">Formula</property> + <property name="vscrollbar_policy">always</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTextView" id="ed_formula"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="wrap_mode">word</property> + <property name="accepts_tab">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="ed_formula-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="formuladialog|ed_formula-atkobject">Formula</property> + </object> + </child> </object> </child> </object> @@ -444,7 +493,7 @@ <property name="row_spacing">6</property> <property name="column_spacing">6</property> <child> - <object class="foruilo-RefEdit" id="ED_REF"> + <object class="GtkEntry" id="ED_REF"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> @@ -456,7 +505,7 @@ </packing> </child> <child> - <object class="foruilo-RefButton" id="RB_REF"> + <object class="GtkButton" id="RB_REF"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -486,8 +535,8 @@ </child> <action-widgets> <action-widget response="-11">help</action-widget> - <action-widget response="0">back</action-widget> - <action-widget response="0">next</action-widget> + <action-widget response="102">back</action-widget> + <action-widget response="101">next</action-widget> <action-widget response="-5">ok</action-widget> <action-widget response="-6">cancel</action-widget> </action-widgets> diff --git a/formula/uiconfig/ui/functionpage.ui b/formula/uiconfig/ui/functionpage.ui index 28ca825e5072..35500f1d0f38 100644 --- a/formula/uiconfig/ui/functionpage.ui +++ b/formula/uiconfig/ui/functionpage.ui @@ -1,12 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.18.3 --> +<!-- Generated with glade 3.22.1 --> <interface domain="for"> <requires lib="gtk+" version="3.18"/> - <requires lib="LibreOffice" version="1.0"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkBox" id="FunctionPage"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="hexpand">True</property> <property name="vexpand">True</property> <property name="border_width">6</property> <property name="orientation">vertical</property> @@ -31,7 +37,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="halign">start</property> - <property name="hexpand">True</property> + <property name="activates_default">True</property> </object> <packing> <property name="expand">False</property> @@ -58,7 +64,6 @@ <object class="GtkComboBoxText" id="category"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="hexpand">True</property> <items> <item translatable="yes" context="functionpage|category">Last Used</item> <item translatable="yes" context="functionpage|category">All</item> @@ -86,13 +91,39 @@ </packing> </child> <child> - <object class="foruilo-FormulaListBox" id="function"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hexpand">True</property> <property name="vexpand">True</property> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="Formula ListBox-selection1"/> + <property name="hscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="function"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="rules_hint">True</property> + <property name="search_column">0</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn3"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer3"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + </object> </child> </object> <packing> diff --git a/formula/uiconfig/ui/parameter.ui b/formula/uiconfig/ui/parameter.ui index 9ea3b0aa4d60..78c943d13e17 100644 --- a/formula/uiconfig/ui/parameter.ui +++ b/formula/uiconfig/ui/parameter.ui @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.16.1 --> +<!-- Generated with glade 3.22.1 --> <interface domain="for"> <requires lib="gtk+" version="3.18"/> - <requires lib="LibreOffice" version="1.0"/> <object class="GtkBox" id="ParameterPage"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -25,10 +24,10 @@ <property name="can_focus">False</property> <property name="halign">start</property> <property name="hexpand">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> <property name="label" translatable="yes" context="parameter|editdesc">Function not known</property> <property name="wrap">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> </object> <packing> <property name="expand">False</property> @@ -56,9 +55,9 @@ <property name="halign">start</property> <property name="hexpand">True</property> <property name="vexpand">True</property> + <property name="wrap">True</property> <property name="xalign">0</property> <property name="yalign">0</property> - <property name="wrap">True</property> </object> <packing> <property name="expand">True</property> @@ -80,272 +79,242 @@ <property name="hexpand">True</property> <property name="column_spacing">12</property> <child> - <object class="GtkGrid" id="grid2"> + <object class="GtkScrolledWindow" id="scrollbar"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">end</property> - <property name="valign">start</property> + <property name="can_focus">True</property> <property name="hexpand">True</property> - <property name="vexpand">True</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - <property name="row_homogeneous">True</property> - <child> - <object class="GtkLabel" id="FT_ARG1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">ED_ARG1</property> - <property name="single_line_mode">True</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> - <object class="GtkLabel" id="FT_ARG2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">ED_ARG2</property> - <property name="single_line_mode">True</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="FT_ARG3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">ED_ARG3</property> - <property name="single_line_mode">True</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">2</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> <child> - <object class="GtkLabel" id="FT_ARG4"> + <object class="GtkViewport"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">ED_ARG4</property> - <property name="single_line_mode">True</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">3</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-ArgEdit" id="ED_ARG1"> - <property name="width_request">150</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hexpand">True</property> - </object> - <packing> - <property name="left_attach">2</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-ArgEdit" id="ED_ARG2"> - <property name="width_request">150</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hexpand">True</property> - </object> - <packing> - <property name="left_attach">2</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-ArgEdit" id="ED_ARG3"> - <property name="width_request">150</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hexpand">True</property> - </object> - <packing> - <property name="left_attach">2</property> - <property name="top_attach">2</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-ArgEdit" id="ED_ARG4"> - <property name="width_request">150</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hexpand">True</property> - </object> - <packing> - <property name="left_attach">2</property> - <property name="top_attach">3</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkButton" id="FX1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="halign">end</property> - </object> - <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> - <child> - <object class="GtkButton" id="FX2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="halign">end</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkButton" id="FX3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="halign">end</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">2</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkButton" id="FX4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="halign">end</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-RefButton" id="RB_ARG1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG1|tooltip_text">Select</property> - <property name="halign">end</property> - </object> - <packing> - <property name="left_attach">3</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-RefButton" id="RB_ARG2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG2|tooltip_text">Select</property> - <property name="halign">end</property> - </object> - <packing> - <property name="left_attach">3</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-RefButton" id="RB_ARG3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG3|tooltip_text">Select</property> - <property name="halign">end</property> - </object> - <packing> - <property name="left_attach">3</property> - <property name="top_attach">2</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="foruilo-RefButton" id="RB_ARG4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG4|tooltip_text">Select</property> - <property name="halign">end</property> + <child> + <object class="GtkGrid" id="grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">6</property> + <property name="margin_right">6</property> + <property name="margin_top">6</property> + <property name="margin_bottom">6</property> + <property name="hexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <child> + <object class="GtkLabel" id="FT_ARG1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">ED_ARG1</property> + <property name="single_line_mode">True</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="FT_ARG2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">ED_ARG2</property> + <property name="single_line_mode">True</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="FT_ARG3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">ED_ARG3</property> + <property name="single_line_mode">True</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="FT_ARG4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">ED_ARG4</property> + <property name="single_line_mode">True</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="ED_ARG1"> + <property name="width_request">150</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="ED_ARG2"> + <property name="width_request">150</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="ED_ARG3"> + <property name="width_request">150</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="ED_ARG4"> + <property name="width_request">150</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="FX1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="FX2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="FX3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="FX4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="RB_ARG1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG1|tooltip_text">Select</property> + </object> + <packing> + <property name="left_attach">3</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="RB_ARG2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG2|tooltip_text">Select</property> + </object> + <packing> + <property name="left_attach">3</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="RB_ARG3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG3|tooltip_text">Select</property> + </object> + <packing> + <property name="left_attach">3</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="RB_ARG4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes" context="parameter|RB_ARG4|tooltip_text">Select</property> + </object> + <packing> + <property name="left_attach">3</property> + <property name="top_attach">3</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> </object> - <packing> - <property name="left_attach">3</property> - <property name="top_attach">3</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> </child> </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> - <object class="GtkScrollbar" id="scrollbar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="vexpand">True</property> - <property name="orientation">vertical</property> - </object> - <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> diff --git a/formula/uiconfig/ui/structpage.ui b/formula/uiconfig/ui/structpage.ui index 3aa18fa7c721..0af026f2b51c 100644 --- a/formula/uiconfig/ui/structpage.ui +++ b/formula/uiconfig/ui/structpage.ui @@ -1,12 +1,20 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.16.1 --> +<!-- Generated with glade 3.22.1 --> <interface domain="for"> <requires lib="gtk+" version="3.18"/> - <requires lib="LibreOffice" version="1.0"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name image --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkBox" id="StructPage"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="hexpand">True</property> <property name="vexpand">True</property> <property name="border_width">6</property> <property name="orientation">vertical</property> @@ -27,13 +35,42 @@ </packing> </child> <child> - <object class="foruilo-StructListBox" id="struct"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hexpand">True</property> <property name="vexpand">True</property> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="Formula ListBox-selection1"/> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="struct"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <property name="search_column">0</property> + <property name="show_expanders">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText" id="cellrenderertext2"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + </object> </child> </object> <packing> diff --git a/include/formula/formdata.hxx b/include/formula/formdata.hxx index 6a1889b3c1ba..e910bd64300f 100644 --- a/include/formula/formdata.hxx +++ b/include/formula/formdata.hxx @@ -44,7 +44,6 @@ public: sal_uInt16 GetOffset() const { return nOffset; } const OUString& GetUndoStr() const { return aUndoStr; } bool GetMatrixFlag()const{ return bMatrix;} - const VclPtr<vcl::Window>& GetFocusWindow()const { return xFocusWin; } const Selection& GetSelection()const { return aSelection;} void SetMode( FormulaDlgMode nNew ) { nMode = nNew; } @@ -52,7 +51,6 @@ public: void SetOffset( sal_uInt16 nNew ) { nOffset = nNew; } void SetUndoStr( const OUString& rNew ) { aUndoStr = rNew; } void SetMatrixFlag(bool bNew) { bMatrix=bNew;} - void SetFocusWindow(const VclPtr<vcl::Window>& rWin) { xFocusWin=rWin;} void SetSelection(const Selection& aSel) { aSelection=aSel;} protected: void Reset(); @@ -65,7 +63,6 @@ private: sal_uInt16 nOffset; OUString aUndoStr; bool bMatrix; - VclPtr<vcl::Window> xFocusWin; Selection aSelection; }; diff --git a/include/formula/formula.hxx b/include/formula/formula.hxx index 873ab04866d7..7b4464e80019 100644 --- a/include/formula/formula.hxx +++ b/include/formula/formula.hxx @@ -60,24 +60,22 @@ class RefButton; class WeldRefButton; class FormEditData; -class FORMULA_DLLPUBLIC FormulaModalDialog : public ModalDialog, public formula::IFormulaEditorHelper +class FORMULA_DLLPUBLIC FormulaModalDialog + : public weld::GenericDialogController, public formula::IFormulaEditorHelper { friend class FormulaDlg_Impl; public: - FormulaModalDialog( vcl::Window* pParent - ,IFunctionManager const * _pFunctionMgr - ,IControlReferenceHandler* _pDlg ); + FormulaModalDialog(weld::Window* pParent, IFunctionManager const * _pFunctionMgr, + IControlReferenceHandler* _pDlg); virtual ~FormulaModalDialog() override; - virtual void dispose() override; private: std::unique_ptr<FormulaDlg_Impl, o3tl::default_delete<FormulaDlg_Impl>> m_pImpl; protected: - virtual bool PreNotify( NotifyEvent& rNEvt ) override; - ::std::pair<RefButton*,RefEdit*> RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ); - static ::std::pair<WeldRefButton*,WeldRefEdit*> RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ); + static ::std::pair<RefButton*,RefEdit*> RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ); + ::std::pair<WeldRefButton*,WeldRefEdit*> RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ); void RefInputStartAfter(); void RefInputDoneAfter(); @@ -90,17 +88,15 @@ protected: }; class FORMULA_DLLPUBLIC FormulaDlg: - public SfxModelessDialog, public IFormulaEditorHelper + public SfxModelessDialogController, public IFormulaEditorHelper { friend class FormulaDlg_Impl; public: - FormulaDlg( SfxBindings* pB - , SfxChildWindow* pCW - , vcl::Window* pParent - , IFunctionManager const * _pFunctionMgr - , IControlReferenceHandler* _pDlg ); + FormulaDlg(SfxBindings* pB, SfxChildWindow* pCW, + weld::Window* pParent, + IFunctionManager const * _pFunctionMgr, + IControlReferenceHandler* _pDlg); virtual ~FormulaDlg() override; - virtual void dispose() override; private: std::unique_ptr<FormulaDlg_Impl, o3tl::default_delete<FormulaDlg_Impl>> m_pImpl; @@ -110,9 +106,8 @@ protected: protected: - virtual bool PreNotify( NotifyEvent& rNEvt ) override; - ::std::pair<RefButton*,RefEdit*> RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ); - static ::std::pair<WeldRefButton*,WeldRefEdit*> RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ); + static ::std::pair<RefButton*,RefEdit*> RefInputStartBefore( RefEdit* pEdit, RefButton* pButton ); + ::std::pair<WeldRefButton*,WeldRefEdit*> RefInputStartBefore( WeldRefEdit* pEdit, WeldRefButton* pButton ); void RefInputStartAfter(); void RefInputDoneAfter( bool bForced ); @@ -126,7 +121,7 @@ protected: const IFunctionDescription* getCurrentFunctionDescription() const; bool UpdateParaWin(Selection& _rSelection); void UpdateParaWin(const Selection& _rSelection, const OUString& _sRefStr); - RefEdit* GetActiveEdit(); + WeldRefEdit* GetActiveEdit(); void SetEdSelection(); void StoreFormEditData(FormEditData* pData); diff --git a/include/formula/funcutl.hxx b/include/formula/funcutl.hxx index 7ab1252e7c97..92578e49f8ad 100644 --- a/include/formula/funcutl.hxx +++ b/include/formula/funcutl.hxx @@ -104,7 +104,7 @@ protected: public: WeldRefEdit(std::unique_ptr<weld::Entry> xControl); - weld::Widget* GetWidget() const { return xEntry.get(); } + weld::Entry* GetWidget() const { return xEntry.get(); } ~WeldRefEdit(); void SetRefString( const OUString& rStr ); @@ -227,7 +227,7 @@ protected: public: WeldRefButton(std::unique_ptr<weld::Button> xControl); - weld::Widget* GetWidget() const { return xButton.get(); } + weld::Button* GetWidget() const { return xButton.get(); } ~WeldRefButton(); void SetReferences(IControlReferenceHandler* pDlg, WeldRefEdit* pEdit); void SetStartImage(); diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index be325ab9af34..c24810f4ebec 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -1491,6 +1491,8 @@ public: virtual OUString get_label() const = 0; virtual void set_mnemonic_widget(Widget* pTarget) = 0; virtual void set_error(bool bShowError) = 0; + // font size is in points, not pixels, e.g. see Window::[G]etPointFont + virtual void set_font(const vcl::Font& rFont) = 0; }; class VCL_DLLPUBLIC TextView : virtual public Container @@ -1501,8 +1503,10 @@ private: protected: Link<TextView&, void> m_aChangeHdl; Link<TextView&, void> m_aVChangeHdl; + Link<TextView&, void> m_aCursorPositionHdl; void signal_changed() { m_aChangeHdl.Call(*this); } + void signal_cursor_position() { m_aCursorPositionHdl.Call(*this); } void signal_vadjustment_changed() { m_aVChangeHdl.Call(*this); } public: @@ -1523,6 +1527,10 @@ public: bool get_value_changed_from_saved() const { return m_sSavedValue != get_text(); } void connect_changed(const Link<TextView&, void>& rLink) { m_aChangeHdl = rLink; } + virtual void connect_cursor_position(const Link<TextView&, void>& rLink) + { + m_aCursorPositionHdl = rLink; + } virtual int vadjustment_get_value() const = 0; virtual int vadjustment_get_upper() const = 0; diff --git a/reportdesign/source/ui/dlg/Formula.cxx b/reportdesign/source/ui/dlg/Formula.cxx index a1597d63502f..9a2b11e8633c 100644 --- a/reportdesign/source/ui/dlg/Formula.cxx +++ b/reportdesign/source/ui/dlg/Formula.cxx @@ -44,7 +44,7 @@ namespace rptui // initialization / shared functions for the dialog -FormulaDialog::FormulaDialog(vcl::Window* pParent +FormulaDialog::FormulaDialog(weld::Window* pParent , const uno::Reference<lang::XMultiServiceFactory>& _xServiceFactory , const std::shared_ptr< IFunctionManager >& _pFunctionMgr , const OUString& _sFormula @@ -88,11 +88,6 @@ void FormulaDialog::fill() FormulaDialog::~FormulaDialog() { - disposeOnce(); -} - -void FormulaDialog::dispose() -{ if ( m_pAddField ) { SvtViewOptions aDlgOpt( EViewType::Window, HID_RPT_FIELD_SEL_WIN ); @@ -102,10 +97,8 @@ void FormulaDialog::dispose() StoreFormEditData( m_pFormulaData ); m_pEdit.clear(); m_pAddField.clear(); - formula::FormulaModalDialog::dispose(); } - // functions for right side bool FormulaDialog::calculateValue( const OUString& rStrExp, OUString& rStrResult, bool /*bMatrixFormula*/ ) @@ -126,8 +119,9 @@ std::unique_ptr<formula::FormulaCompiler> FormulaDialog::createCompiler( formula void FormulaDialog::doClose(bool _bOk) { - EndDialog(_bOk ? RET_OK : RET_CANCEL); + response(_bOk ? RET_OK : RET_CANCEL); } + void FormulaDialog::insertEntryToLRUList(const IFunctionDescription* /*_pDesc*/) { } @@ -217,7 +211,7 @@ void FormulaDialog::ToggleCollapsed( RefEdit* _pEdit, RefButton* _pButton) if ( !m_pAddField ) { - m_pAddField = VclPtr<OAddFieldWindow>::Create(this,m_xRowSet); + m_pAddField = VclPtr<OAddFieldWindow>::Create(nullptr, m_xRowSet); m_pAddField->SetCreateHdl(LINK( this, FormulaDialog, OnClickHdl ) ); SvtViewOptions aDlgOpt( EViewType::Window, HID_RPT_FIELD_SEL_WIN ); if ( aDlgOpt.Exists() ) @@ -230,7 +224,6 @@ void FormulaDialog::ToggleCollapsed( RefEdit* _pEdit, RefButton* _pButton) } RefInputStartAfter(); m_pAddField->Show(); - } void FormulaDialog::ToggleCollapsed( WeldRefEdit* /*_pEdit*/, WeldRefButton* /*_pButton*/) diff --git a/reportdesign/source/ui/inc/Formula.hxx b/reportdesign/source/ui/inc/Formula.hxx index e28438325329..569332e17d40 100644 --- a/reportdesign/source/ui/inc/Formula.hxx +++ b/reportdesign/source/ui/inc/Formula.hxx @@ -60,7 +60,7 @@ class FormulaDialog : public formula::FormulaModalDialog, DECL_LINK( OnClickHdl, OAddFieldWindow&, void ); public: - FormulaDialog( vcl::Window* pParent + FormulaDialog( weld::Window* pParent , const css::uno::Reference< css::lang::XMultiServiceFactory>& _xServiceFactory , const std::shared_ptr< formula::IFunctionManager >& _pFunctionMgr , const OUString& _sFormula @@ -68,7 +68,6 @@ public: , svl::SharedStringPool& rStrPool ); virtual ~FormulaDialog() override; - virtual void dispose() override; // IFormulaEditorHelper virtual void notifyChange() override; diff --git a/reportdesign/source/ui/misc/UITools.cxx b/reportdesign/source/ui/misc/UITools.cxx index 51e847c74135..395cb6c32452 100644 --- a/reportdesign/source/ui/misc/UITools.cxx +++ b/reportdesign/source/ui/misc/UITools.cxx @@ -1009,7 +1009,6 @@ bool openDialogFormula_nothrow( OUString& _in_out_rFormula { xFactory = _xContext->getServiceManager(); xServiceFactory.set(xFactory,uno::UNO_QUERY); - VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( _xInspectorWindow ); uno::Reference< report::meta::XFunctionManager> xMgr(xFactory->createInstanceWithContext("org.libreoffice.report.pentaho.SOFunctionManager",_xContext),uno::UNO_QUERY); if ( xMgr.is() ) @@ -1021,14 +1020,14 @@ bool openDialogFormula_nothrow( OUString& _in_out_rFormula CharClass aCC(_xContext, aLangTag); svl::SharedStringPool aStringPool(aCC); - ScopedVclPtrInstance<FormulaDialog> aDlg( - pParent, xServiceFactory, pFormulaManager, + FormulaDialog aDlg( + Application::GetFrameWeld(_xInspectorWindow), xServiceFactory, pFormulaManager, aFormula.getUndecoratedContent(), _xRowSet, aStringPool); - bSuccess = aDlg->Execute() == RET_OK; + bSuccess = aDlg.run() == RET_OK; if ( bSuccess ) { - OUString sFormula = aDlg->getCurrentFormula(); + OUString sFormula = aDlg.getCurrentFormula(); if ( sFormula[0] == '=' ) _in_out_rFormula = "rpt:" + sFormula.copy(1); else diff --git a/sc/source/ui/formdlg/formula.cxx b/sc/source/ui/formdlg/formula.cxx index 4dd504d7d809..780bd1d65985 100644 --- a/sc/source/ui/formdlg/formula.cxx +++ b/sc/source/ui/formdlg/formula.cxx @@ -56,12 +56,12 @@ using namespace com::sun::star; // init/ shared functions for dialog -ScFormulaDlg::ScFormulaDlg( SfxBindings* pB, SfxChildWindow* pCW, - vcl::Window* pParent, const ScViewData* pViewData, const formula::IFunctionManager* _pFunctionMgr ) - : formula::FormulaDlg( pB, pCW, pParent, _pFunctionMgr,this) +ScFormulaDlg::ScFormulaDlg(SfxBindings* pB, SfxChildWindow* pCW, + weld::Window* pParent, const ScViewData* pViewData, const formula::IFunctionManager* _pFunctionMgr) + : formula::FormulaDlg(pB, pCW, pParent, _pFunctionMgr, this) , m_aHelper(this,pB) { - m_aHelper.SetWindow(this); + m_aHelper.SetDialog(m_xDialog.get()); ScModule* pScMod = SC_MOD(); pScMod->InputEnterHandler(); ScTabViewShell* pScViewShell = nullptr; @@ -235,11 +235,6 @@ void ScFormulaDlg::fill() ScFormulaDlg::~ScFormulaDlg() { - disposeOnce(); -} - -void ScFormulaDlg::dispose() -{ ScModule* pScMod = SC_MOD(); ScFormEditData* pData = pScMod->GetFormEditData(); m_aHelper.dispose(); @@ -250,7 +245,6 @@ void ScFormulaDlg::dispose() pScMod->SetRefInputHdl(nullptr); StoreFormEditData(pData); } - formula::FormulaDlg::dispose(); } bool ScFormulaDlg::IsInputHdl(const ScInputHandler* pHdl) @@ -291,10 +285,9 @@ ScInputHandler* ScFormulaDlg::GetNextInputHandler(const ScDocShell* pDocShell, S return pHdl; } -bool ScFormulaDlg::Close() +void ScFormulaDlg::Close() { DoEnter(); - return true; } // functions for right side diff --git a/sc/source/ui/inc/formula.hxx b/sc/source/ui/inc/formula.hxx index 97737e7c4af9..1940b4bf5865 100644 --- a/sc/source/ui/inc/formula.hxx +++ b/sc/source/ui/inc/formula.hxx @@ -44,10 +44,9 @@ class ScFormulaDlg final : public formula::FormulaDlg, mutable std::shared_ptr<ScCompiler> m_xCompiler; public: - ScFormulaDlg( SfxBindings* pB, SfxChildWindow* pCW, - vcl::Window* pParent, const ScViewData* pViewData, const formula::IFunctionManager* _pFunctionMgr); - virtual ~ScFormulaDlg() override; - virtual void dispose() override; + ScFormulaDlg( SfxBindings* pB, SfxChildWindow* pCW, + weld::Window* pParent, const ScViewData* pViewData, const formula::IFunctionManager* _pFunctionMgr); + virtual ~ScFormulaDlg() override; // IFormulaEditorHelper virtual void notifyChange() override; @@ -75,7 +74,7 @@ public: virtual css::uno::Reference< css::sheet::XFormulaOpCodeMapper> getFormulaOpCodeMapper() const override; virtual css::table::CellAddress getReferencePosition() const override; - virtual bool Close() override; + virtual void Close() override; // sc::IAnyRefDialog virtual void ShowReference(const OUString& _sRef) override; diff --git a/sc/source/ui/view/reffact.cxx b/sc/source/ui/view/reffact.cxx index 9887ba56364b..492dc7c0e697 100644 --- a/sc/source/ui/view/reffact.cxx +++ b/sc/source/ui/view/reffact.cxx @@ -45,7 +45,7 @@ SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScDbNameDlgWrapper, SID_DEFINE_DBNAME ) SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScConsolidateDlgWrapper, SID_OPENDLG_CONSOLIDATE) SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScPrintAreasDlgWrapper, SID_OPENDLG_EDIT_PRINTAREA ) SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScColRowNameRangesDlgWrapper, SID_DEFINE_COLROWNAMERANGES ) -SFX_IMPL_MODELESSDIALOG_WITHID(ScFormulaDlgWrapper, SID_OPENDLG_FUNCTION ) +SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScFormulaDlgWrapper, SID_OPENDLG_FUNCTION) SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScAcceptChgDlgWrapper, FID_CHG_ACCEPT) SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScHighlightChgDlgWrapper, FID_CHG_SHOW ) SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScSimpleRefDlgWrapper, WID_SIMPLE_REF ) @@ -137,7 +137,7 @@ IMPL_CONTROLLER_CHILD_CTOR( ScConsolidateDlgWrapper, SID_OPENDLG_CONSOLIDATE ) IMPL_CONTROLLER_CHILD_CTOR( ScPrintAreasDlgWrapper, SID_OPENDLG_EDIT_PRINTAREA ) -IMPL_CHILD_CTOR( ScFormulaDlgWrapper, SID_OPENDLG_FUNCTION ) +IMPL_CONTROLLER_CHILD_CTOR( ScFormulaDlgWrapper, SID_OPENDLG_FUNCTION ) // ScSimpleRefDlgWrapper diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index a5a04d91b63b..3ff4ff52d4e4 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -142,14 +142,6 @@ VclPtr<SfxModelessDialog> ScTabViewShell::CreateRefDialog( switch( nSlotId ) { - case SID_OPENDLG_FUNCTION: - { - // dialog checks, what is in the cell - - pResult = VclPtr<ScFormulaDlg>::Create( pB, pCW, pParent, &GetViewData(),ScGlobal::GetStarCalcFunctionMgr() ); - } - break; - case WID_CONDFRMT_REF: { bool bFound = false; @@ -475,6 +467,12 @@ std::unique_ptr<SfxModelessDialogController> ScTabViewShell::CreateRefDialogCont break; } + case SID_OPENDLG_FUNCTION: + { + // dialog checks, what is in the cell + xResult.reset(new ScFormulaDlg(pB, pCW, pParent, &GetViewData(),ScGlobal::GetStarCalcFunctionMgr())); + break; + } } if (xResult) diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py index 2ae33970d6b9..e2710ff004bb 100755 --- a/solenv/bin/native-code.py +++ b/solenv/bin/native-code.py @@ -440,14 +440,12 @@ custom_widgets = [ 'DataTreeListBox', 'DriverListControl', 'DropdownBox', - 'EditBox', 'EmojiView', 'ExtBoxWithBtns', 'ExtensionBox', 'FontNameBox', 'FontSizeBox', 'FontStyleBox', - 'FormulaListBox', 'IndexBox', 'IndexBox', 'LightButton', @@ -481,7 +479,6 @@ custom_widgets = [ 'SidebarToolBox', 'SpacingListBox', 'StatusBar', - 'StructListBox', 'SvSimpleTableContainer', 'SvTreeListBox', 'SvtFileView', diff --git a/solenv/sanitizers/ui/formula.suppr b/solenv/sanitizers/ui/formula.suppr index 04eb7f8f10c5..a36cedfdc08b 100644 --- a/solenv/sanitizers/ui/formula.suppr +++ b/solenv/sanitizers/ui/formula.suppr @@ -3,7 +3,7 @@ formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='label3'] orphan-label formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='headline'] orphan-label formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='funcname'] orphan-label formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='funcdesc'] orphan-label -formula/uiconfig/ui/formuladialog.ui://foruilo-RefEdit[@id='ED_REF'] no-labelled-by +formula/uiconfig/ui/formuladialog.ui://GtkEntry[@id='ED_REF'] no-labelled-by formula/uiconfig/ui/parameter.ui://GtkLabel[@id='editdesc'] orphan-label formula/uiconfig/ui/parameter.ui://GtkLabel[@id='parname'] orphan-label formula/uiconfig/ui/parameter.ui://GtkLabel[@id='pardesc'] orphan-label diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 6a7f3ab5c5d7..c1ad54838e2f 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -1138,7 +1138,9 @@ public: //hide everything except the aVisibleWidgets hideUnless(pContentArea, aVisibleWidgets, m_aHiddenWidgets); - pRefEdit->set_width_request(nOldEditWidth); + // the insert function case has an initially hidden edit widget, so it has + // not start size, so take larger of actual size and size request + pRefEdit->set_width_request(std::max(nOldEditWidth, m_nOldEditWidthReq)); m_nOldBorderWidth = m_xDialog->get_border_width(); m_xDialog->set_border_width(0); if (vcl::Window *pActionArea = m_xDialog->get_action_area()) @@ -3909,6 +3911,12 @@ public: else m_xLabel->SetControlBackground(); } + + virtual void set_font(const vcl::Font& rFont) override + { + m_xLabel->SetPointFont(*m_xLabel, rFont); + m_xLabel->Invalidate(); + } }; std::unique_ptr<weld::Label> SalInstanceFrame::weld_label_widget() const @@ -3927,6 +3935,7 @@ private: DECL_LINK(ChangeHdl, Edit&, void); DECL_LINK(VscrollHdl, ScrollBar*, void); + DECL_LINK(CursorListener, VclWindowEvent&, void); public: SalInstanceTextView(VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : SalInstanceContainer(pTextView, pBuilder, bTakeOwnership) @@ -3990,6 +3999,13 @@ public: m_xTextView->SetControlFont(aFont); } + virtual void connect_cursor_position(const Link<TextView&, void>& rLink) override + { + assert(!m_aCursorPositionHdl.IsSet()); + m_xTextView->AddEventListener(LINK(this, SalInstanceTextView, CursorListener)); + weld::TextView::connect_cursor_position(rLink); + } + virtual int vadjustment_get_value() const override { ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); @@ -4025,6 +4041,8 @@ public: { if (!m_xTextView->IsDisposed()) { + if (m_aCursorPositionHdl.IsSet()) + m_xTextView->RemoveEventListener(LINK(this, SalInstanceTextView, CursorListener)); m_xTextView->SetModifyHdl(Link<Edit&, void>()); ScrollBar& rVertScrollBar = m_xTextView->GetVScrollBar(); rVertScrollBar.SetScrollHdl(m_aOrigVScrollHdl); @@ -4043,6 +4061,14 @@ IMPL_LINK_NOARG(SalInstanceTextView, ChangeHdl, Edit&, void) signal_changed(); } +IMPL_LINK(SalInstanceTextView, CursorListener, VclWindowEvent&, rEvent, void) +{ + if (notify_events_disabled()) + return; + if (rEvent.GetId() == VclEventId::EditSelectionChanged || rEvent.GetId() == VclEventId::EditCaretChanged) + signal_cursor_position(); +} + class SalInstanceExpander : public SalInstanceContainer, public virtual weld::Expander { private: diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index bb1803828ffa..f12e6f4baa6b 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -3145,7 +3145,23 @@ public: gtk_container_set_border_width(GTK_CONTAINER(m_pDialog), 0); if (GtkWidget* pActionArea = gtk_dialog_get_action_area(m_pDialog)) gtk_widget_hide(pActionArea); + + // calc's insert->function is springing back to its original size if the ref-button + // is used to shrink the dialog down and then the user clicks in the calc area to do + // the selection +#if defined(GDK_WINDOWING_WAYLAND) + bool bWorkaroundSizeSpringingBack = DLSYM_GDK_IS_WAYLAND_DISPLAY(gtk_widget_get_display(m_pWidget)); + if (bWorkaroundSizeSpringingBack) + gtk_widget_unmap(GTK_WIDGET(m_pDialog)); +#endif + resize_to_request(); + +#if defined(GDK_WINDOWING_WAYLAND) + if (bWorkaroundSizeSpringingBack) + gtk_widget_map(GTK_WIDGET(m_pDialog)); +#endif + m_pRefEdit = pRefEdit; } @@ -5471,6 +5487,83 @@ public: } }; +namespace +{ + PangoAttrList* create_attr_list(const vcl::Font& rFont) + { + PangoAttrList* pAttrList = pango_attr_list_new(); + pango_attr_list_insert(pAttrList, pango_attr_family_new(OUStringToOString(rFont.GetFamilyName(), RTL_TEXTENCODING_UTF8).getStr())); + pango_attr_list_insert(pAttrList, pango_attr_size_new(rFont.GetFontSize().Height() * PANGO_SCALE)); + switch (rFont.GetItalic()) + { + case ITALIC_NONE: + pango_attr_list_insert(pAttrList, pango_attr_style_new(PANGO_STYLE_NORMAL)); + break; + case ITALIC_NORMAL: + pango_attr_list_insert(pAttrList, pango_attr_style_new(PANGO_STYLE_ITALIC)); + break; + case ITALIC_OBLIQUE: + pango_attr_list_insert(pAttrList, pango_attr_style_new(PANGO_STYLE_OBLIQUE)); + break; + default: + break; + } + switch (rFont.GetWeight()) + { + case WEIGHT_ULTRALIGHT: + pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_ULTRALIGHT)); + break; + case WEIGHT_LIGHT: + pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_LIGHT)); + break; + case WEIGHT_NORMAL: + pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_NORMAL)); + break; + case WEIGHT_BOLD: + pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_BOLD)); + break; + case WEIGHT_ULTRABOLD: + pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_ULTRABOLD)); + break; + default: + break; + } + switch (rFont.GetWidthType()) + { + case WIDTH_ULTRA_CONDENSED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_ULTRA_CONDENSED)); + break; + case WIDTH_EXTRA_CONDENSED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_EXTRA_CONDENSED)); + break; + case WIDTH_CONDENSED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_CONDENSED)); + break; + case WIDTH_SEMI_CONDENSED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_SEMI_CONDENSED)); + break; + case WIDTH_NORMAL: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_NORMAL)); + break; + case WIDTH_SEMI_EXPANDED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_SEMI_EXPANDED)); + break; + case WIDTH_EXPANDED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_EXPANDED)); + break; + case WIDTH_EXTRA_EXPANDED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_EXTRA_EXPANDED)); + break; + case WIDTH_ULTRA_EXPANDED: + pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_ULTRA_EXPANDED)); + break; + default: + break; + } + return pAttrList; + } +} + class GtkInstanceEntry : public GtkInstanceWidget, public virtual weld::Entry { private: @@ -5653,75 +5746,7 @@ public: virtual void set_font(const vcl::Font& rFont) override { - PangoAttrList* pAttrList = pango_attr_list_new(); - pango_attr_list_insert(pAttrList, pango_attr_family_new(OUStringToOString(rFont.GetFamilyName(), RTL_TEXTENCODING_UTF8).getStr())); - pango_attr_list_insert(pAttrList, pango_attr_size_new(rFont.GetFontSize().Height() * PANGO_SCALE)); - switch (rFont.GetItalic()) - { - case ITALIC_NONE: - pango_attr_list_insert(pAttrList, pango_attr_style_new(PANGO_STYLE_NORMAL)); - break; - case ITALIC_NORMAL: - pango_attr_list_insert(pAttrList, pango_attr_style_new(PANGO_STYLE_ITALIC)); - break; - case ITALIC_OBLIQUE: - pango_attr_list_insert(pAttrList, pango_attr_style_new(PANGO_STYLE_OBLIQUE)); - break; - default: - break; - } - switch (rFont.GetWeight()) - { - case WEIGHT_ULTRALIGHT: - pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_ULTRALIGHT)); - break; - case WEIGHT_LIGHT: - pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_LIGHT)); - break; - case WEIGHT_NORMAL: - pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_NORMAL)); - break; - case WEIGHT_BOLD: - pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_BOLD)); - break; - case WEIGHT_ULTRABOLD: - pango_attr_list_insert(pAttrList, pango_attr_weight_new(PANGO_WEIGHT_ULTRABOLD)); - break; - default: - break; - } - switch (rFont.GetWidthType()) - { - case WIDTH_ULTRA_CONDENSED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_ULTRA_CONDENSED)); - break; - case WIDTH_EXTRA_CONDENSED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_EXTRA_CONDENSED)); - break; - case WIDTH_CONDENSED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_CONDENSED)); - break; - case WIDTH_SEMI_CONDENSED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_SEMI_CONDENSED)); - break; - case WIDTH_NORMAL: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_NORMAL)); - break; - case WIDTH_SEMI_EXPANDED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_SEMI_EXPANDED)); - break; - case WIDTH_EXPANDED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_EXPANDED)); - break; - case WIDTH_EXTRA_EXPANDED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_EXTRA_EXPANDED)); - break; - case WIDTH_ULTRA_EXPANDED: - pango_attr_list_insert(pAttrList, pango_attr_stretch_new(PANGO_STRETCH_ULTRA_EXPANDED)); - break; - default: - break; - } + PangoAttrList* pAttrList = create_attr_list(rFont); gtk_entry_set_attributes(m_pEntry, pAttrList); pango_attr_list_unref(pAttrList); } @@ -7408,6 +7433,9 @@ public: virtual bool get_dest_row_at_pos(const Point &rPos, weld::TreeIter* pResult) override { + gtk_drag_unhighlight(GTK_WIDGET(m_pTreeView)); + gtk_drag_highlight(gtk_widget_get_parent(GTK_WIDGET(m_pTreeView))); + // to keep it simple we'll default to always drop before the current row // except for the special edge cases GtkTreeViewDropPosition pos = GTK_TREE_VIEW_DROP_BEFORE; @@ -7931,6 +7959,13 @@ public: else gtk_label_set_attributes(m_pLabel, nullptr); } + + virtual void set_font(const vcl::Font& rFont) override + { + PangoAttrList* pAttrList = create_attr_list(rFont); + gtk_label_set_attributes(m_pLabel, pAttrList); + pango_attr_list_unref(pAttrList); + } }; std::unique_ptr<weld::Label> GtkInstanceFrame::weld_label_widget() const @@ -7948,6 +7983,7 @@ private: GtkTextBuffer* m_pTextBuffer; GtkAdjustment* m_pVAdjustment; gulong m_nChangedSignalId; + gulong m_nCursorPosSignalId; gulong m_nVAdjustChangedSignalId; static void signalChanged(GtkTextView*, gpointer widget) @@ -7957,6 +7993,12 @@ private: pThis->signal_changed(); } + static void signalCursorPosition(GtkTextView*, GParamSpec*, gpointer widget) + { + GtkInstanceTextView* pThis = static_cast<GtkInstanceTextView*>(widget); + pThis->signal_cursor_position(); + } + static void signalVAdjustValueChanged(GtkAdjustment*, gpointer widget) { GtkInstanceTextView* pThis = static_cast<GtkInstanceTextView*>(widget); @@ -7971,6 +8013,7 @@ public: , m_pTextBuffer(gtk_text_view_get_buffer(pTextView)) , m_pVAdjustment(gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(pTextView))) , m_nChangedSignalId(g_signal_connect(m_pTextBuffer, "changed", G_CALLBACK(signalChanged), this)) + , m_nCursorPosSignalId(g_signal_connect(m_pTextBuffer, "notify::cursor-position", G_CALLBACK(signalCursorPosition), this)) , m_nVAdjustChangedSignalId(g_signal_connect(m_pVAdjustment, "value-changed", G_CALLBACK(signalVAdjustValueChanged), this)) { } @@ -8053,6 +8096,7 @@ public: virtual void disable_notify_events() override { g_signal_handler_block(m_pVAdjustment, m_nVAdjustChangedSignalId); + g_signal_handler_block(m_pTextBuffer, m_nCursorPosSignalId); g_signal_handler_block(m_pTextBuffer, m_nChangedSignalId); GtkInstanceContainer::disable_notify_events(); } @@ -8061,6 +8105,7 @@ public: { GtkInstanceContainer::enable_notify_events(); g_signal_handler_unblock(m_pTextBuffer, m_nChangedSignalId); + g_signal_handler_unblock(m_pTextBuffer, m_nCursorPosSignalId); g_signal_handler_unblock(m_pVAdjustment, m_nVAdjustChangedSignalId); } @@ -8111,6 +8156,7 @@ public: { g_signal_handler_disconnect(m_pVAdjustment, m_nVAdjustChangedSignalId); g_signal_handler_disconnect(m_pTextBuffer, m_nChangedSignalId); + g_signal_handler_disconnect(m_pTextBuffer, m_nCursorPosSignalId); } }; |