xref: /aoo41x/main/cui/source/inc/cuifmsearch.hxx (revision ae4d94bc)
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