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