1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #ifndef _CUI_FMSEARCH_HXX 29 #define _CUI_FMSEARCH_HXX 30 31 #include <com/sun/star/sdbc/XResultSet.hpp> 32 33 #include <svx/fmsearch.hxx> //CHINA001 34 35 #define _SVSTDARR_STRINGSDTOR 36 #include <svl/svstdarr.hxx> 37 38 #ifndef _DIALOG_HXX //autogen 39 #include <vcl/dialog.hxx> 40 #endif 41 42 #ifndef _BUTTON_HXX //autogen 43 #include <vcl/button.hxx> 44 #endif 45 46 #ifndef _FIXED_HXX //autogen 47 #include <vcl/fixed.hxx> 48 #endif 49 50 #ifndef _EDIT_HXX //autogen 51 #include <vcl/edit.hxx> 52 #endif 53 #include <vcl/combobox.hxx> 54 #include <vcl/lstbox.hxx> 55 #include <tools/link.hxx> 56 #include <comphelper/uno3.hxx> 57 #include <comphelper/stl_types.hxx> 58 #include <tools/string.hxx> 59 60 namespace svxform { 61 class FmSearchConfigItem; 62 } 63 64 // =================================================================================================== 65 // = class FmSearchDialog - Dialog fuer Suchen in Formularen/Tabellen 66 // =================================================================================================== 67 68 struct FmSearchProgress; 69 70 class FmSearchEngine; 71 72 class FmSearchDialog : public ModalDialog 73 { 74 friend class FmSearchEngine; 75 76 // meine ganzen Controls 77 FixedLine m_flSearchFor; 78 RadioButton m_rbSearchForText; 79 RadioButton m_rbSearchForNull; 80 RadioButton m_rbSearchForNotNull; 81 ComboBox m_cmbSearchText; 82 FixedLine m_flWhere; 83 FixedText m_ftForm; 84 ListBox m_lbForm; 85 RadioButton m_rbAllFields; 86 RadioButton m_rbSingleField; 87 ListBox m_lbField; 88 FixedLine m_flOptions; 89 FixedText m_ftPosition; 90 ListBox m_lbPosition; 91 CheckBox m_cbUseFormat; 92 CheckBox m_cbCase; 93 CheckBox m_cbBackwards; 94 CheckBox m_cbStartOver; 95 CheckBox m_cbWildCard; 96 CheckBox m_cbRegular; 97 CheckBox m_cbApprox; 98 PushButton m_pbApproxSettings; 99 CheckBox m_aHalfFullFormsCJK; 100 CheckBox m_aSoundsLikeCJK; 101 PushButton m_aSoundsLikeCJKSettings; 102 FixedLine m_flState; 103 FixedText m_ftRecordLabel; 104 FixedText m_ftRecord; 105 FixedText m_ftHint; 106 PushButton m_pbSearchAgain; 107 CancelButton m_pbClose; 108 HelpButton m_pbHelp; 109 String m_sSearch; 110 String m_sCancel; 111 112 Window* m_pPreSearchFocus; 113 114 Link m_lnkFoundHandler; // Handler fuer "gefunden" 115 Link m_lnkCanceledNotFoundHdl; // Handler fuer Positionierung des Cursors 116 117 Link m_lnkContextSupplier; // fuer Suche in verschiedenen Kontexten 118 119 // ein Array, in dem ich mir fuer jeden Kontext das aktuell selektierte Feld merke 120 ::std::vector<String> m_arrContextFields; 121 122 // fuer die eigentliche Arbeit ... 123 FmSearchEngine* m_pSearchEngine; 124 125 Timer m_aDelayedPaint; 126 // siehe EnableSearchUI 127 128 ::svxform::FmSearchConfigItem* m_pConfig; 129 public: 130 /** hiermit kann in verschiedenen Saetzen von Feldern gesucht werden. Es gibt eine Reihe von Kontexten, deren Namen in 131 strContexts stehen (getrennt durch ';'), der Benutzer kann einen davon auswaehlen. 132 Wenn der Benutzer einen Kontext auswaehlt, wird lnkContextSupplier aufgerufen, er bekommt einen Zeiger auf eine 133 FmSearchContext-Struktur, die gefuellt werden muss. 134 Fuer die Suche gilt dann : 135 a) bei formatierter Suche wird der Iterator selber verwendet (wie beim ersten Constructor auch) 136 b) bei formatierter Suche wird NICHT der FormatKey an den Fields des Iterators verwendet, sondern die entsprechende 137 TextComponent wird gefragt (deshalb auch die Verwendung des originalen Iterator, durch dessen Move werden hoffentlich 138 die hinter den TextComponent-Interfaces stehenden Controls geupdatet) 139 c) bei nicht formatierter Suche wird ein Clone des Iterators verwendet (da ich hier die TextComponent-Interfaces nicht 140 fragen muss) 141 (natuerlich zwingend erforderlich : der String Nummer i in strUsedFields eines Kontexts muss mit dem Interface Nummer i 142 in arrFields des Kontexts korrespondieren) 143 */ 144 FmSearchDialog(Window* pParent, const String& strInitialText, const ::std::vector< String >& _rContexts, sal_Int16 nInitialContext, 145 const Link& lnkContextSupplier); 146 147 virtual ~FmSearchDialog(); 148 149 /** der Found-Handler bekommt im "gefunden"-Fall einen Zeiger auf eine FmFoundRecordInformation-Struktur 150 (dieser ist nur im Handler gueltig, wenn man sich also die Daten merken muss, nicht den Zeiger, sondern die 151 Struktur kopieren) 152 Dieser Handler MUSS gesetzt werden. 153 Ausserdem sollte beachtet werden, dass waehrend des Handlers der Suchdialog immer noch modal ist 154 */ 155 void SetFoundHandler(const Link& lnk) { m_lnkFoundHandler = lnk; } 156 /** 157 Wenn die Suche abgebrochen oder erfolglos beendet wurde, wird im Suchdialog immer der aktuelle Datensatz angezeigt 158 Damit das mit der eventuellen Anzeige des Aufrufers synchron geht, existiert dieser Handler (der nicht undbedingt gesetzt 159 werden muss). 160 Der dem Handler uebergebene Zeiger zeigt auf eine FmFoundRecordInformation-Struktur, bei der aPosition und eventuell 161 (bei Suche mit Kontexten) nContext gueltig sind. 162 */ 163 void SetCanceledNotFoundHdl(const Link& lnk) { m_lnkCanceledNotFoundHdl = lnk; } 164 165 inline void SetActiveField(const String& strField); 166 167 protected: 168 virtual sal_Bool Close(); 169 170 void Init(const String& strVisibleFields, const String& strInitialText); 171 // nur von den Constructoren aus zu verwenden 172 173 void OnFound(const ::com::sun::star::uno::Any& aCursorPos, sal_Int16 nFieldPos); 174 175 void EnableSearchUI(sal_Bool bEnable); 176 // beim Suchen in einem eigenen Thread moechte ich natuerlich die UI zum Starten/Parameter-Setzen der Suche disablen 177 // Bei bEnable == sal_False wird fuer alle betroffenen Controls das Painten kurz aus- und mittels m_aDelayedPaint nach 178 // einer kurzen Weile wieder angeschaltet. Wenn inzwischen eine Anforderung mit bEnable==sal_True kommt, wird der Timer gestoppt 179 // und das Painten gleich wieder angeschaltet. Als Konsequenz dieses umstaendlichen Vorgehens ist kein Flackern zu sehen, 180 // wenn man schnell hintereinander aus- und wieder einschaltet. 181 182 void EnableSearchForDependees(sal_Bool bEnable); 183 184 void EnableControlPaint(sal_Bool bEnable); 185 // enabled (disabled) fuer alle wichtigen Controls ihr Paint 186 187 void InitContext(sal_Int16 nContext); 188 189 void LoadParams(); 190 void SaveParams() const; 191 192 private: 193 // Handler fuer die Controls 194 DECL_LINK( OnClickedFieldRadios, Button* ); 195 DECL_LINK( OnClickedSearchAgain, Button* ); 196 DECL_LINK( OnClickedSpecialSettings, Button* ); 197 198 DECL_LINK( OnSearchTextModified, ComboBox* ); 199 200 DECL_LINK( OnPositionSelected, ListBox* ); 201 DECL_LINK( OnFieldSelected, ListBox* ); 202 203 DECL_LINK( OnCheckBoxToggled, CheckBox* ); 204 205 DECL_LINK( OnContextSelection, ListBox* ); 206 207 // Such-Fortschritt 208 DECL_LINK( OnSearchProgress, FmSearchProgress* ); 209 210 DECL_LINK( OnDelayedPaint, void* ); 211 // siehe EnableSearchUI 212 213 void implMoveControls(Control** _ppControls, sal_Int32 _nControls, sal_Int32 _nUp, Control* _pToResize); 214 215 void initCommon( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet >& _rxCursor ); 216 }; 217 218 inline void FmSearchDialog::SetActiveField(const String& strField) 219 { 220 sal_uInt16 nInitialField = m_lbField.GetEntryPos(strField); 221 if (nInitialField == COMBOBOX_ENTRY_NOTFOUND) 222 nInitialField = 0; 223 m_lbField.SelectEntryPos(nInitialField); 224 LINK(this, FmSearchDialog, OnFieldSelected).Call(&m_lbField); 225 } 226 227 #endif // _CUI_FMSEARCH_HXX 228