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 #if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) && !defined(VCL_INTERNALS) 23 #error "don't use this in new code" 24 #endif 25 26 #include <vcl/ctrl.hxx> 27 #include <vcl/textfilter.hxx> 28 29 #include <memory> 30 31 #include <rtl/ustrbuf.hxx> 32 #include <o3tl/deleter.hxx> 33 #include <vcl/dllapi.h> 34 #include <vcl/dndhelp.hxx> 35 #include <vcl/vclptr.hxx> 36 #include <com/sun/star/uno/Reference.h> 37 38 namespace com::sun::star::i18n { 39 class XBreakIterator; 40 class XExtendedInputSequenceChecker; 41 } 42 namespace weld { 43 class Widget; 44 } 45 46 class PopupMenu; 47 class VclBuilder; 48 struct DDInfo; 49 struct Impl_IMEInfos; 50 51 #define EDIT_NOLIMIT SAL_MAX_INT32 52 53 class Timer; 54 55 class VCL_DLLPUBLIC Edit : public Control, public vcl::unohelper::DragAndDropClient 56 { 57 private: 58 VclPtr<Edit> mpSubEdit; 59 TextFilter* mpFilterText; 60 std::unique_ptr<DDInfo, o3tl::default_delete<DDInfo>> mpDDInfo; 61 std::unique_ptr<Impl_IMEInfos> mpIMEInfos; 62 OUStringBuffer maText; 63 OUString maPlaceholderText; 64 OUString maSaveValue; 65 OUString maUndoText; 66 tools::Long mnXOffset; 67 Selection maSelection; 68 sal_uInt16 mnAlign; 69 sal_Int32 mnMaxTextLen; 70 sal_Int32 mnWidthInChars; 71 sal_Int32 mnMaxWidthChars; 72 sal_Unicode mcEchoChar; 73 bool mbInternModified:1, 74 mbReadOnly:1, 75 mbInsertMode:1, 76 mbClickedInSelection:1, 77 mbIsSubEdit:1, 78 mbActivePopup:1, 79 mbForceControlBackground:1, 80 mbPassword; 81 Link<Edit&,void> maModifyHdl; 82 Link<Edit&,void> maAutocompleteHdl; 83 Link<Edit&,bool> maActivateHdl; 84 std::unique_ptr<VclBuilder> mpUIBuilder; 85 86 css::uno::Reference<css::i18n::XBreakIterator> mxBreakIterator; 87 css::uno::Reference<css::i18n::XExtendedInputSequenceChecker> mxISC; 88 89 SAL_DLLPRIVATE bool ImplTruncateToMaxLen( OUString&, sal_Int32 nSelectionLen ) const; 90 SAL_DLLPRIVATE void ImplInitEditData(); 91 SAL_DLLPRIVATE OUString ImplGetText() const; 92 SAL_DLLPRIVATE void ImplRepaint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRectangle); 93 SAL_DLLPRIVATE void ImplInvalidateOrRepaint(); 94 SAL_DLLPRIVATE void ImplDelete( const Selection& rSelection, sal_uInt8 nDirection, sal_uInt8 nMode ); 95 SAL_DLLPRIVATE void ImplSetText( const OUString& rStr, const Selection* pNewSelection ); 96 SAL_DLLPRIVATE void ImplInsertText( const OUString& rStr, const Selection* pNewSelection = nullptr, bool bIsUserInput = false ); 97 SAL_DLLPRIVATE static OUString ImplGetValidString( const OUString& rString ); 98 SAL_DLLPRIVATE void ImplClearBackground(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRectangle, tools::Long nXStart, tools::Long nXEnd); 99 SAL_DLLPRIVATE void ImplPaintBorder(vcl::RenderContext const & rRenderContext); 100 SAL_DLLPRIVATE void ImplShowCursor( bool bOnlyIfVisible = true ); 101 SAL_DLLPRIVATE void ImplAlign(); 102 SAL_DLLPRIVATE void ImplAlignAndPaint(); 103 SAL_DLLPRIVATE sal_Int32 ImplGetCharPos( const Point& rWindowPos ) const; 104 SAL_DLLPRIVATE void ImplSetCursorPos( sal_Int32 nChar, bool bSelect ); 105 SAL_DLLPRIVATE void ImplShowDDCursor(); 106 SAL_DLLPRIVATE void ImplHideDDCursor(); 107 SAL_DLLPRIVATE bool ImplHandleKeyEvent( const KeyEvent& rKEvt ); 108 SAL_DLLPRIVATE void ImplCopyToSelectionClipboard(); 109 SAL_DLLPRIVATE void ImplCopy(css::uno::Reference<css::datatransfer::clipboard::XClipboard> const & rxClipboard); 110 SAL_DLLPRIVATE void ImplPaste(css::uno::Reference<css::datatransfer::clipboard::XClipboard> const & rxClipboard); 111 SAL_DLLPRIVATE tools::Long ImplGetTextYPosition() const; 112 SAL_DLLPRIVATE css::uno::Reference<css::i18n::XExtendedInputSequenceChecker> const& ImplGetInputSequenceChecker(); 113 SAL_DLLPRIVATE css::uno::Reference<css::i18n::XBreakIterator> const& ImplGetBreakIterator(); 114 SAL_DLLPRIVATE void filterText(); 115 116 protected: 117 using Control::ImplInitSettings; 118 using Window::ImplInit; 119 SAL_DLLPRIVATE void ImplInit( vcl::Window* pParent, WinBits nStyle ); 120 SAL_DLLPRIVATE static WinBits ImplInitStyle( WinBits nStyle ); 121 SAL_DLLPRIVATE void ImplSetSelection( const Selection& rSelection, bool bPaint = true ); 122 SAL_DLLPRIVATE ControlType ImplGetNativeControlType() const; 123 SAL_DLLPRIVATE tools::Long ImplGetExtraXOffset() const; 124 SAL_DLLPRIVATE tools::Long ImplGetExtraYOffset() const; 125 static SAL_DLLPRIVATE void ImplInvalidateOutermostBorder( vcl::Window* pWin ); 126 127 css::uno::Reference<css::datatransfer::dnd::XDragSourceListener > mxDnDListener; 128 129 // DragAndDropClient 130 using vcl::unohelper::DragAndDropClient::dragEnter; 131 using vcl::unohelper::DragAndDropClient::dragExit; 132 using vcl::unohelper::DragAndDropClient::dragOver; 133 virtual void dragGestureRecognized(const css::datatransfer::dnd::DragGestureEvent& dge) override; 134 virtual void dragDropEnd(const css::datatransfer::dnd::DragSourceDropEvent& dsde) override; 135 virtual void drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde) override; 136 virtual void dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtdee) override; 137 virtual void dragExit(const css::datatransfer::dnd::DropTargetEvent& dte) override; 138 virtual void dragOver(const css::datatransfer::dnd::DropTargetDragEvent& dtde) override; 139 140 protected: 141 Edit(WindowType nType); 142 virtual void FillLayoutData() const override; 143 virtual void ApplySettings(vcl::RenderContext& rRenderContext) override; 144 public: 145 // public because needed in button.cxx 146 SAL_DLLPRIVATE bool ImplUseNativeBorder(vcl::RenderContext const & rRenderContext, WinBits nStyle); 147 148 Edit( vcl::Window* pParent, WinBits nStyle = WB_BORDER ); 149 virtual ~Edit() override; 150 virtual void dispose() override; 151 152 virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; 153 virtual void MouseButtonUp( const MouseEvent& rMEvt ) override; 154 virtual void KeyInput( const KeyEvent& rKEvt ) override; 155 virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override; 156 virtual void Resize() override; 157 virtual void Draw( OutputDevice* pDev, const Point& rPos, DrawFlags nFlags ) override; 158 virtual void GetFocus() override; 159 virtual void LoseFocus() override; 160 virtual void Tracking( const TrackingEvent& rTEvt ) override; 161 virtual void Command( const CommandEvent& rCEvt ) override; 162 virtual void StateChanged( StateChangedType nType ) override; 163 virtual void DataChanged( const DataChangedEvent& rDCEvt ) override; 164 165 virtual void Modify(); 166 167 static bool IsCharInput( const KeyEvent& rKEvt ); 168 169 virtual void SetModifyFlag(); 170 171 void SetEchoChar( sal_Unicode c ); GetEchoChar() const172 sal_Unicode GetEchoChar() const { return mcEchoChar; } 173 174 virtual void SetReadOnly( bool bReadOnly = true ); IsReadOnly() const175 virtual bool IsReadOnly() const { return mbReadOnly; } 176 177 void SetInsertMode( bool bInsert ); 178 bool IsInsertMode() const; 179 180 virtual void SetMaxTextLen( sal_Int32 nMaxLen ); GetMaxTextLen() const181 virtual sal_Int32 GetMaxTextLen() const { return mnMaxTextLen; } 182 183 void SetWidthInChars(sal_Int32 nWidthInChars); GetWidthInChars() const184 sal_Int32 GetWidthInChars() const { return mnWidthInChars; } 185 186 void setMaxWidthChars(sal_Int32 nWidth); 187 188 virtual void SetSelection( const Selection& rSelection ); 189 virtual const Selection& GetSelection() const; 190 191 virtual void ReplaceSelected( const OUString& rStr ); 192 virtual void DeleteSelected(); 193 virtual OUString GetSelected() const; 194 195 virtual void Cut(); 196 virtual void Copy(); 197 virtual void Paste(); 198 void Undo(); 199 200 virtual void SetText( const OUString& rStr ) override; 201 virtual void SetText( const OUString& rStr, const Selection& rNewSelection ); 202 virtual OUString GetText() const override; 203 204 void SetCursorAtLast(); 205 206 void SetPlaceholderText( const OUString& rStr ); 207 SaveValue()208 void SaveValue() { maSaveValue = GetText(); } GetSavedValue() const209 const OUString& GetSavedValue() const { return maSaveValue; } 210 SetModifyHdl(const Link<Edit &,void> & rLink)211 virtual void SetModifyHdl( const Link<Edit&,void>& rLink ) { maModifyHdl = rLink; } GetModifyHdl() const212 virtual const Link<Edit&,void>& GetModifyHdl() const { return maModifyHdl; } 213 SetActivateHdl(const Link<Edit &,bool> & rLink)214 void SetActivateHdl(const Link<Edit&,bool>& rLink) { maActivateHdl = rLink; } 215 216 void SetSubEdit( Edit* pEdit ); GetSubEdit() const217 Edit* GetSubEdit() const { return mpSubEdit; } 218 SetAutocompleteHdl(const Link<Edit &,void> & rLink)219 void SetAutocompleteHdl( const Link<Edit&,void>& rLink ) { maAutocompleteHdl = rLink; } GetAutocompleteHdl() const220 const Link<Edit&,void>& GetAutocompleteHdl() const { return maAutocompleteHdl; } 221 222 virtual Size CalcMinimumSize() const; 223 virtual Size CalcMinimumSizeForText(const OUString &rString) const; 224 virtual Size GetOptimalSize() const override; 225 virtual Size CalcSize(sal_Int32 nChars) const; 226 sal_Int32 GetMaxVisChars() const; 227 228 // shows a warning box saying "text too long, truncated" 229 static void ShowTruncationWarning(weld::Widget* pParent); 230 231 VclPtr<PopupMenu> CreatePopupMenu(); 232 233 virtual OUString GetSurroundingText() const override; 234 virtual Selection GetSurroundingTextSelection() const override; 235 virtual bool DeleteSurroundingText(const Selection& rSelection) override; 236 virtual bool set_property(const OString &rKey, const OUString &rValue) override; 237 SetTextFilter(TextFilter * pFilter)238 void SetTextFilter(TextFilter* pFilter) { mpFilterText = pFilter; } 239 240 virtual FactoryFunction GetUITestFactory() const override; 241 SetForceControlBackground(bool b)242 void SetForceControlBackground(bool b) { mbForceControlBackground = b; } 243 IsPassword() const244 bool IsPassword() const { return mbPassword; } 245 246 virtual void DumpAsPropertyTree(tools::JsonWriter& rJsonWriter) override; 247 }; 248 249 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 250