Line data Source code
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 : #ifndef INCLUDED_SC_SOURCE_UI_INC_INPUTWIN_HXX
21 : #define INCLUDED_SC_SOURCE_UI_INC_INPUTWIN_HXX
22 :
23 : #include <vector>
24 : #include <vcl/toolbox.hxx>
25 : #include <sfx2/childwin.hxx>
26 : #include <svl/lstner.hxx>
27 : #include <vcl/button.hxx>
28 : #include <vcl/combobox.hxx>
29 : #include <vcl/scrbar.hxx>
30 : #include <vcl/window.hxx>
31 : #include <svtools/transfer.hxx>
32 :
33 : class ScEditEngineDefaulter;
34 : class EditView;
35 : struct ESelection;
36 : class ScInputHandler;
37 : class ScAccessibleEditLineTextData;
38 : struct EENotify;
39 : class ScRangeList;
40 : class ScTabViewShell;
41 : class Accelerator;
42 :
43 672 : class ScTextWndBase : public vcl::Window
44 : {
45 : public:
46 : ScTextWndBase( vcl::Window* pParent, WinBits nStyle );
47 : virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0;
48 : virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0;
49 : virtual void SetTextString( const OUString& rString ) = 0;
50 : virtual const OUString& GetTextString() const = 0;
51 : virtual void StartEditEngine() = 0;
52 : virtual void StopEditEngine( bool bAll ) = 0;
53 : virtual EditView* GetEditView() = 0;
54 : virtual void MakeDialogEditView() = 0;
55 : virtual void SetFormulaMode( bool bSet ) = 0;
56 : virtual bool IsInputActive() = 0;
57 : virtual void TextGrabFocus() = 0;
58 : };
59 :
60 : class ScTextWnd : public ScTextWndBase, public DragSourceHelper // edit window
61 : {
62 : public:
63 : ScTextWnd( vcl::Window* pParent, ScTabViewShell* pViewSh );
64 : virtual ~ScTextWnd();
65 : virtual void dispose() SAL_OVERRIDE;
66 :
67 : virtual void SetTextString( const OUString& rString ) SAL_OVERRIDE;
68 : virtual const OUString& GetTextString() const SAL_OVERRIDE;
69 :
70 : bool IsInputActive() SAL_OVERRIDE;
71 : virtual EditView* GetEditView() SAL_OVERRIDE;
72 :
73 : // for function autopilots
74 : virtual void MakeDialogEditView() SAL_OVERRIDE;
75 :
76 : virtual void StartEditEngine() SAL_OVERRIDE;
77 : virtual void StopEditEngine( bool bAll ) SAL_OVERRIDE;
78 :
79 : virtual void TextGrabFocus() SAL_OVERRIDE;
80 :
81 : virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
82 :
83 : virtual void SetFormulaMode( bool bSet ) SAL_OVERRIDE;
84 :
85 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
86 :
87 : virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) SAL_OVERRIDE;
88 : virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) SAL_OVERRIDE;
89 :
90 : DECL_LINK( NotifyHdl, void* );
91 :
92 : protected:
93 : virtual void Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect ) SAL_OVERRIDE;
94 : virtual void Resize() SAL_OVERRIDE;
95 :
96 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
97 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
98 : virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
99 : virtual void Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;
100 : virtual void KeyInput(const KeyEvent& rKEvt) SAL_OVERRIDE;
101 : virtual void GetFocus() SAL_OVERRIDE;
102 : virtual void LoseFocus() SAL_OVERRIDE;
103 :
104 : virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) SAL_OVERRIDE;
105 :
106 : virtual OUString GetText() const SAL_OVERRIDE;
107 :
108 : void ImplInitSettings();
109 : void UpdateAutoCorrFlag();
110 :
111 239 : ScTabViewShell* GetViewShell() { return mpViewShell;}
112 :
113 : typedef ::std::vector< ScAccessibleEditLineTextData* > AccTextDataVector;
114 :
115 : OUString aString;
116 : vcl::Font aTextFont;
117 : ScEditEngineDefaulter* pEditEngine; // only created when needed
118 : EditView* pEditView;
119 : AccTextDataVector maAccTextDatas; // #i105267# text datas may be cloned, remember all copies
120 : bool bIsRTL;
121 : bool bIsInsertMode;
122 : bool bFormulaMode;
123 :
124 : // #102710#; this flag should be true if a key input or a command is handled
125 : // it prevents the call of InputChanged in the ModifyHandler of the EditEngine
126 : bool bInputMode;
127 :
128 : private:
129 : ScTabViewShell* mpViewShell;
130 : };
131 :
132 : class ScPosWnd : public ComboBox, public SfxListener // Display position
133 : {
134 : private:
135 : OUString aPosStr;
136 : Accelerator* pAccel;
137 : sal_uLong nTipVisible;
138 : bool bFormulaMode;
139 :
140 : public:
141 : ScPosWnd( vcl::Window* pParent );
142 : virtual ~ScPosWnd();
143 : virtual void dispose() SAL_OVERRIDE;
144 :
145 : void SetPos( const OUString& rPosStr ); // Displayed Text
146 : void SetFormulaMode( bool bSet );
147 :
148 : protected:
149 : virtual void Select() SAL_OVERRIDE;
150 : virtual void Modify() SAL_OVERRIDE;
151 :
152 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
153 :
154 : virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) SAL_OVERRIDE;
155 :
156 : private:
157 : void FillRangeNames();
158 : void FillFunctions();
159 : void DoEnter();
160 : void HideTip();
161 :
162 : void ReleaseFocus_Impl();
163 : };
164 :
165 : class ScInputBarGroup;
166 :
167 : class ScMultiTextWnd : public ScTextWnd
168 : {
169 : public:
170 : ScMultiTextWnd( ScInputBarGroup* pParent, ScTabViewShell* pViewSh );
171 : virtual ~ScMultiTextWnd();
172 : virtual void StartEditEngine() SAL_OVERRIDE;
173 : virtual void StopEditEngine( bool bAll ) SAL_OVERRIDE;
174 : virtual void Resize() SAL_OVERRIDE;
175 : virtual EditView* GetEditView() SAL_OVERRIDE;
176 : long GetPixelHeightForLines( long nLines );
177 : long GetEditEngTxtHeight();
178 :
179 : void DoScroll();
180 : virtual void SetTextString( const OUString& rString ) SAL_OVERRIDE;
181 : void SetNumLines( long nLines );
182 5894 : long GetNumLines() { return mnLines; }
183 0 : long GetLastNumExpandedLines() { return mnLastExpandedLines; }
184 : protected:
185 : void SetScrollBarRange();
186 : void InitEditEngine();
187 :
188 : virtual void Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect ) SAL_OVERRIDE;
189 : DECL_LINK( NotifyHdl, EENotify* );
190 : DECL_LINK( ModifyHdl, EENotify* );
191 : private:
192 : long GetPixelTextHeight();
193 : ScInputBarGroup& mrGroupBar;
194 : long mnLines;
195 : long mnLastExpandedLines;
196 : long mnBorderHeight;
197 : bool mbInvalidate;
198 : };
199 :
200 : class ScInputBarGroup : public ScTextWndBase
201 : {
202 :
203 : public:
204 : ScInputBarGroup( vcl::Window* Parent, ScTabViewShell* pViewSh );
205 : virtual ~ScInputBarGroup();
206 : virtual void dispose() SAL_OVERRIDE;
207 : virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) SAL_OVERRIDE;
208 : virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) SAL_OVERRIDE;
209 : // virtual void Paint(const Rectangle& rRect );
210 : void SetTextString( const OUString& rString ) SAL_OVERRIDE;
211 : void StartEditEngine() SAL_OVERRIDE;
212 : EditView* GetEditView() SAL_OVERRIDE;
213 : void SetSize(Size aSize);
214 : virtual void Resize() SAL_OVERRIDE;
215 : virtual const OUString& GetTextString() const SAL_OVERRIDE;
216 : virtual void StopEditEngine( bool bAll ) SAL_OVERRIDE;
217 : virtual void TextGrabFocus() SAL_OVERRIDE;
218 : void InitEditEngine(SfxObjectShell* pObjSh);
219 : void SetFormulaMode( bool bSet ) SAL_OVERRIDE;
220 : bool IsFocus();
221 : void MakeDialogEditView() SAL_OVERRIDE;
222 : bool IsInputActive() SAL_OVERRIDE;
223 736 : ScrollBar& GetScrollBar() { return *aScrollBar.get(); }
224 : void IncrementVerticalSize();
225 : void DecrementVerticalSize();
226 2178 : long GetNumLines() { return aMultiTextWnd->GetNumLines(); }
227 0 : long GetVertOffset() { return nVertOffset; }
228 : private:
229 : void TriggerToolboxLayout();
230 : VclPtr<ScMultiTextWnd> aMultiTextWnd;
231 : VclPtr<ImageButton> aButton;
232 : VclPtr<ScrollBar> aScrollBar;
233 : long nVertOffset;
234 : DECL_LINK( ClickHdl, void* );
235 : DECL_LINK( Impl_ScrollHdl, void* );
236 :
237 : };
238 :
239 : class ScInputWindow : public ToolBox // Parent toolbox
240 : {
241 : public:
242 : ScInputWindow( vcl::Window* pParent, SfxBindings* pBind );
243 : virtual ~ScInputWindow();
244 : virtual void dispose() SAL_OVERRIDE;
245 :
246 : virtual void Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect ) SAL_OVERRIDE;
247 : virtual void Resize() SAL_OVERRIDE;
248 : virtual void Select() SAL_OVERRIDE;
249 :
250 : void SetFuncString( const OUString& rString, bool bDoEdit = true );
251 : void SetPosString( const OUString& rStr );
252 : void SetTextString( const OUString& rString );
253 :
254 : void SetOkCancelMode();
255 : void SetSumAssignMode();
256 : void EnableButtons( bool bEnable = true );
257 :
258 : void SetFormulaMode( bool bSet );
259 :
260 : bool IsInputActive();
261 : EditView* GetEditView();
262 :
263 : void TextGrabFocus();
264 : void TextInvalidate();
265 : void SwitchToTextWin();
266 :
267 : void PosGrabFocus();
268 :
269 : // For function autopilots
270 : void MakeDialogEditView();
271 :
272 : void StopEditEngine( bool bAll );
273 :
274 : void SetInputHandler( ScInputHandler* pNew );
275 :
276 150 : ScInputHandler* GetInputHandler(){ return pInputHdl;}
277 :
278 : void StateChanged( StateChangedType nType ) SAL_OVERRIDE;
279 : virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
280 : virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
281 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
282 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
283 13 : bool IsMultiLineInput() { return mbIsMultiLine; }
284 : protected:
285 : virtual void SetText( const OUString& rString ) SAL_OVERRIDE;
286 : virtual OUString GetText() const SAL_OVERRIDE;
287 :
288 : static bool UseSubTotal( ScRangeList* pRangeList );
289 : bool IsPointerAtResizePos();
290 : private:
291 : VclPtr<ScPosWnd> aWndPos;
292 : VclPtr<ScTextWndBase> pRuntimeWindow;
293 : ScTextWndBase& aTextWindow;
294 : ScInputHandler* pInputHdl;
295 : OUString aTextOk;
296 : OUString aTextCancel;
297 : OUString aTextSum;
298 : OUString aTextEqual;
299 : long mnMaxY;
300 : bool bIsOkCancelMode;
301 : bool bInResize;
302 : bool mbIsMultiLine;
303 : };
304 :
305 672 : class ScInputWindowWrapper : public SfxChildWindow
306 : {
307 : public:
308 : ScInputWindowWrapper( vcl::Window* pParent,
309 : sal_uInt16 nId,
310 : SfxBindings* pBindings,
311 : SfxChildWinInfo* pInfo );
312 :
313 : SFX_DECL_CHILDWINDOW_WITHID(ScInputWindowWrapper);
314 : };
315 :
316 : #endif
317 :
318 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|