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