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
10c4eee24dSAndrew Rist *
11c4eee24dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12c4eee24dSAndrew Rist *
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.
19c4eee24dSAndrew Rist *
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