Coverage Report

Created: 2026-09-28 10:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/sc/source/ui/inc/inputwin.hxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 * This file incorporates work covered by the following license notice:
10
 *
11
 *   Licensed to the Apache Software Foundation (ASF) under one or more
12
 *   contributor license agreements. See the NOTICE file distributed
13
 *   with this work for additional information regarding copyright
14
 *   ownership. The ASF licenses this file to you under the Apache
15
 *   License, Version 2.0 (the "License"); you may not use this file
16
 *   except in compliance with the License. You may obtain a copy of
17
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
 */
19
20
#pragma once
21
22
#include <set>
23
#include <vector>
24
#include <memory>
25
#include <vcl/toolbox.hxx>
26
#include <vcl/InterimItemWindow.hxx>
27
#include <vcl/weld/Builder.hxx>
28
#include <vcl/weld/Button.hxx>
29
#include <vcl/weld/ComboBox.hxx>
30
#include <vcl/weld/Container.hxx>
31
#include <vcl/weld/ScrolledWindow.hxx>
32
#include <vcl/weld/customweld.hxx>
33
#include <sfx2/childwin.hxx>
34
#include <svl/lstner.hxx>
35
#include <svtools/stringtransfer.hxx>
36
#include <vcl/window.hxx>
37
#include <formula/opcode.hxx>
38
#include <svx/weldeditview.hxx>
39
#include "inputhdl.hxx"
40
41
class EditView;
42
class ScAccessibleEditLineTextData;
43
class ScAccessibleEditObject;
44
class ScTextWndGroup;
45
class ScInputBarGroup;
46
class ScTabViewShell;
47
48
class ScTextWndBase
49
{
50
public:
51
    virtual void            InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0;
52
    virtual void            RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0;
53
    virtual void            SetTextString( const OUString& rString, bool bKitUpdate ) = 0;
54
    virtual const OUString& GetTextString() const = 0;
55
    virtual void            StartEditEngine(const ErrorHdl& errorHdl) = 0;
56
    virtual void            StopEditEngine( bool bAll ) = 0;
57
    virtual EditView*       GetEditView() const = 0;
58
    virtual bool            HasEditView() const = 0;
59
    virtual void            MakeDialogEditView() = 0;
60
    virtual void            SetFormulaMode( bool bSet ) = 0;
61
    virtual bool            IsInputActive() = 0;
62
    virtual void            TextGrabFocus() = 0;
63
    virtual tools::Long            GetNumLines() const = 0;
64
0
    virtual ~ScTextWndBase() {}
65
};
66
67
class ScTextWnd : public WeldEditView
68
                , public ScTextWndBase
69
{
70
public:
71
    ScTextWnd(ScTextWndGroup& rParent, ScTabViewShell* pViewSh);
72
    virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
73
    virtual ~ScTextWnd() override;
74
75
    virtual void            SetTextString( const OUString& rString, bool bKitUpdate ) override;
76
    virtual const OUString& GetTextString() const override;
77
78
    bool                    IsInputActive() override;
79
    virtual EditView*       GetEditView() const override;
80
    virtual bool            HasEditView() const override;
81
82
    const OutputDevice&     GetEditViewDevice() const;
83
84
                        // for function autopilots
85
    virtual void            MakeDialogEditView() override;
86
87
    virtual void            StartEditEngine(const ErrorHdl& errorHdl) override;
88
    virtual void            StopEditEngine( bool bAll ) override;
89
90
    virtual void            TextGrabFocus() override;
91
92
    virtual void            StyleUpdated() override;
93
94
    // Triggered if scroll bar state should change
95
    virtual void EditViewScrollStateChange() override;
96
97
    virtual void            SetFormulaMode( bool bSet ) override;
98
99
    virtual rtl::Reference<comphelper::OAccessible> CreateAccessible() override;
100
101
    virtual void            InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) override;
102
    virtual void            RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) override;
103
104
    virtual void            Resize() override;
105
106
    int GetPixelHeightForLines(tools::Long nLines);
107
    int GetEditEngTxtHeight() const;
108
109
    virtual tools::Long GetNumLines() const override;
110
    void SetNumLines(tools::Long nLines);
111
0
    tools::Long GetLastNumExpandedLines() const { return mnLastExpandedLines; }
112
0
    void SetLastNumExpandedLines(tools::Long nLastExpandedLines) { mnLastExpandedLines = nLastExpandedLines; }
113
114
    void DoScroll();
115
116
    DECL_LINK(ModifyHdl, LinkParamNone*, void);
117
    DECL_LINK(EditStatusHdl, EditStatus&, void);
118
119
protected:
120
    virtual void    Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
121
122
    virtual bool    MouseMove( const MouseEvent& rMEvt ) override;
123
    virtual bool    MouseButtonDown( const MouseEvent& rMEvt ) override;
124
    virtual bool    MouseButtonUp( const MouseEvent& rMEvt ) override;
125
    virtual bool    Command( const CommandEvent& rCEvt ) override;
126
    virtual bool    KeyInput(const KeyEvent& rKEvt) override;
127
    virtual bool    CanFocus() const override;
128
    virtual void    GetFocus() override;
129
130
    virtual bool    StartDrag() override;
131
132
private:
133
    void            ImplInitSettings();
134
    void            UpdateAutoCorrFlag();
135
136
    void SetScrollBarRange();
137
138
    void InitEditEngine();
139
140
    void UpdateFocus(const ErrorHdl& errorHdl);
141
142
    rtl::Reference<svt::OStringTransferable> m_xHelper;
143
144
    typedef ::std::vector< ScAccessibleEditLineTextData* > AccTextDataVector;
145
146
    rtl::Reference<ScAccessibleEditObject> pAcc;
147
148
    OUString    aString;
149
    vcl::Font   aTextFont;
150
    AccTextDataVector maAccTextDatas;   // #i105267# text data may be cloned, remember all copies
151
    bool        bIsRTL;
152
    bool        bIsInsertMode;
153
    bool        bFormulaMode;
154
155
    // #102710#; this flag should be true if a key input or a command is handled
156
    // it prevents the call of InputChanged in the ModifyHandler of the EditEngine
157
    bool        bInputMode;
158
159
    ScTabViewShell* mpViewShell;
160
    ScTextWndGroup& mrGroupBar;
161
    tools::Long mnLastExpandedLines;
162
    bool mbInvalidate;
163
};
164
165
class ScPosWnd final : public InterimItemWindow, public SfxListener        // Display position
166
{
167
private:
168
    std::unique_ptr<weld::ComboBox> m_xWidget;
169
170
    ImplSVEvent* m_nAsyncGetFocusId;
171
172
    OUString aPosStr;
173
    void* nTipVisible;
174
    bool bFormulaMode;
175
    std::set<OUString> aRangeNames;
176
177
public:
178
    ScPosWnd(vcl::Window* pParent);
179
    virtual         ~ScPosWnd() override;
180
    virtual void    dispose() override;
181
182
    void            SetPos( const OUString& rPosStr );        // Displayed Text
183
    void            SetFormulaMode( bool bSet );
184
185
    static OUString createLocalRangeName(std::u16string_view rName, std::u16string_view rTableName);
186
187
private:
188
    DECL_LINK(OnAsyncGetFocus, void*, void);
189
    DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
190
    DECL_LINK(ActivateHdl, weld::ComboBox&, bool);
191
    DECL_LINK(ModifyHdl, weld::ComboBox&, void);
192
    DECL_LINK(FocusInHdl, weld::Widget&, void);
193
    DECL_LINK(FocusOutHdl, weld::Widget&, void);
194
195
    virtual void    Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
196
197
private:
198
    void            FillRangeNames(bool initialize = false);
199
    void            FillFunctions();
200
    void            DoEnter();
201
    void            HideTip();
202
203
    void            ReleaseFocus_Impl();
204
};
205
206
class ScTextWndGroup : public ScTextWndBase
207
{
208
public:
209
    ScTextWndGroup(ScInputBarGroup& pParent, ScTabViewShell* pViewSh);
210
    virtual ~ScTextWndGroup() override;
211
212
    virtual void            InsertAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
213
    virtual EditView*       GetEditView() const override;
214
    const OutputDevice&     GetEditViewDevice() const;
215
    Point                   GetCursorScreenPixelPos(bool bBelowLine);
216
    tools::Long             GetLastNumExpandedLines() const;
217
    void SetLastNumExpandedLines(tools::Long nLastExpandedLines);
218
    virtual tools::Long     GetNumLines() const override;
219
    int                     GetPixelHeightForLines(tools::Long nLines);
220
    weld::ScrolledWindow&   GetScrollWin();
221
    virtual const OUString& GetTextString() const override;
222
    virtual bool            HasEditView() const override;
223
    virtual bool            IsInputActive() override;
224
    virtual void            MakeDialogEditView() override;
225
    virtual void            RemoveAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
226
    void                    SetScrollPolicy();
227
    void                    SetNumLines(tools::Long nLines);
228
    virtual void            SetFormulaMode(bool bSet) override;
229
    virtual void            SetTextString(const OUString& rString, bool bKitUpdate) override;
230
    virtual void            StartEditEngine(const ErrorHdl& errorHdl) override;
231
    virtual void            StopEditEngine(bool bAll) override;
232
    virtual void            TextGrabFocus() override;
233
234
0
    vcl::Window&            GetVclParent() { return mrParent; }
235
236
private:
237
    std::unique_ptr<ScTextWnd> mxTextWnd;
238
    std::unique_ptr<weld::ScrolledWindow> mxScrollWin;
239
    std::unique_ptr<weld::CustomWeld> mxTextWndWin;
240
    vcl::Window& mrParent;
241
242
    DECL_LINK(Impl_ScrollHdl, weld::ScrolledWindow&, void);
243
};
244
245
class ScInputBarGroup : public InterimItemWindow
246
                      , public ScTextWndBase
247
{
248
public:
249
                            ScInputBarGroup(vcl::Window* Parent, ScTabViewShell* pViewSh);
250
    virtual                 ~ScInputBarGroup() override;
251
    virtual void            dispose() override;
252
    virtual void            InsertAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
253
    virtual void            RemoveAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
254
    void                    SetTextString(const OUString& rString, bool bKitUpdate) override;
255
    void                    StartEditEngine(const ErrorHdl& errorHdl) override;
256
    virtual EditView*       GetEditView() const override;
257
    virtual bool            HasEditView() const override;
258
    Point                   GetCursorScreenPixelPos(bool bBelowLine);
259
    virtual void            Resize() override;
260
    virtual void            DataChanged(const DataChangedEvent& rDCEvt) override;
261
    virtual const OUString& GetTextString() const override;
262
    virtual void            StopEditEngine(bool bAll) override;
263
    virtual void            TextGrabFocus() override;
264
    void                    SetFormulaMode(bool bSet) override;
265
    void                    MakeDialogEditView() override;
266
    bool                    IsInputActive() override;
267
    void                    IncrementVerticalSize();
268
    void                    DecrementVerticalSize();
269
    void                    NumLinesChanged();
270
0
    virtual tools::Long     GetNumLines() const override { return mxTextWndGroup->GetNumLines(); }
271
272
    int GetPixelHeightForLines(tools::Long nLines) const
273
0
    {
274
0
        return mxTextWndGroup->GetPixelHeightForLines(nLines);
275
0
    }
276
277
0
    weld::Builder&          GetBuilder() { return *m_xBuilder; }
278
279
private:
280
    void            TriggerToolboxLayout();
281
    void            SetBackgrounds();
282
283
    std::unique_ptr<weld::Container> mxBackground;
284
    std::unique_ptr<ScTextWndGroup> mxTextWndGroup;
285
    std::unique_ptr<weld::Button> mxButtonUp;
286
    std::unique_ptr<weld::Button> mxButtonDown;
287
288
    DECL_LINK(ClickHdl, weld::Button&, void);
289
};
290
291
class ScInputWindow final : public ToolBox                        // Parent toolbox
292
{
293
public:
294
                    ScInputWindow( vcl::Window* pParent, const SfxBindings* pBind );
295
    virtual         ~ScInputWindow() override;
296
    virtual void    dispose() override;
297
298
    virtual void    PixelInvalidate(const tools::Rectangle* pRectangle) override;
299
    virtual void    SetSizePixel( const Size& rNewSize ) override;
300
    virtual void    Resize() override;
301
    virtual void    Select() override;
302
303
    void            SetFuncString( const OUString& rString, bool bDoEdit = true );
304
    void            SetPosString( const OUString& rStr );
305
    void            SetTextString(const OUString& rString, bool bKitUpdate);
306
307
    void            SetOkCancelMode();
308
    void            SetSumAssignMode();
309
    void            EnableButtons( bool bEnable );
310
    /// Update Input bar after the number of lines was changed externally
311
    void            NumLinesChanged();
312
313
    void            StartFormula();
314
    void            SetFormulaMode( bool bSet );
315
316
    bool            IsInputActive();
317
    EditView*       GetEditView();
318
    vcl::Window*    GetEditWindow();
319
    Point           GetCursorScreenPixelPos(bool bBelowLine = false);
320
321
    void            TextGrabFocus();
322
    void            TextInvalidate();
323
    void            SwitchToTextWin();
324
325
    void            PosGrabFocus();
326
327
    // For function autopilots
328
    void            MakeDialogEditView();
329
330
    void            StopEditEngine( bool bAll );
331
332
    void            SetInputHandler( ScInputHandler* pNew );
333
334
0
    ScInputHandler* GetInputHandler(){ return pInputHdl;}
335
336
    void            StateChanged( StateChangedType nType ) override;
337
    virtual void    DataChanged( const DataChangedEvent& rDCEvt ) override;
338
    virtual void    MouseButtonUp( const MouseEvent& rMEvt ) override;
339
    virtual void    MouseButtonDown( const MouseEvent& rMEvt ) override;
340
    virtual void    MouseMove( const MouseEvent& rMEvt ) override;
341
342
    void            NotifyLOKClient();
343
344
    void MenuHdl(std::u16string_view command);
345
    DECL_LINK( DropdownClickHdl, ToolBox*, void );
346
347
    void            AutoSum( bool& bRangeFinder, bool& bSubTotal, OpCode eCode );
348
349
private:
350
    bool IsPointerAtResizePos();
351
352
    VclPtr<ScPosWnd>  aWndPos;
353
    VclPtr<ScInputBarGroup> mxTextWindow;
354
    ScInputHandler* pInputHdl;
355
    ScTabViewShell* mpViewShell;
356
    tools::Long     mnMaxY;
357
    tools::Long     mnStandardItemHeight;
358
    bool            bIsOkCancelMode;
359
    bool            bInResize;
360
};
361
362
class ScInputWindowWrapper : public SfxChildWindow
363
{
364
public:
365
    ScInputWindowWrapper(vcl::Window* pParent, sal_uInt16 nId, SfxBindings& rBindings,
366
                         SfxChildWinInfo& rInfo);
367
368
    SFX_DECL_CHILDWINDOW_WITHID(ScInputWindowWrapper);
369
};
370
371
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */