xref: /trunk/main/sd/source/ui/app/sdpopup.cxx (revision 5829e3e6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 
28 #include <editeng/eeitem.hxx>
29 
30 #include <editeng/editeng.hxx>
31 #include <editeng/flditem.hxx>
32 #include <svl/zforlist.hxx>
33 #include <sfx2/objsh.hxx>
34 #include <sfx2/docfile.hxx>
35 #include <unotools/useroptions.hxx>
36 
37 #include "strings.hrc"
38 #include "sdpopup.hxx"
39 #include "sdresid.hxx"
40 #include "sdmod.hxx"
41 #include "drawdoc.hxx"
42 #include "DrawDocShell.hxx"
43 
44 /*************************************************************************
45 |* PopupMenu zum Bearbeiten von Feldbefehlen
46 \************************************************************************/
47 
SdFieldPopup(const SvxFieldData * pInField,LanguageType eLanguage)48 SdFieldPopup::SdFieldPopup( const SvxFieldData* pInField, LanguageType eLanguage ) :
49 		PopupMenu	(),
50 		pField		( pInField )
51 {
52 	Fill( eLanguage );
53 }
54 
55 /*************************************************************************
56 |* Dtor
57 \************************************************************************/
58 
~SdFieldPopup()59 SdFieldPopup::~SdFieldPopup()
60 {
61 }
62 
63 /*************************************************************************
64 |* Fill
65 \************************************************************************/
66 
Fill(LanguageType eLanguage)67 void SdFieldPopup::Fill( LanguageType eLanguage )
68 {
69 	sal_uInt16 nID = 1;
70 	sal_uInt16 nStyle = MIB_RADIOCHECK | MIB_AUTOCHECK;
71 	InsertItem( nID++, String( SdResId( STR_FIX ) ), nStyle );
72 	InsertItem( nID++, String( SdResId( STR_VAR ) ), nStyle );
73 	InsertSeparator();
74 
75 	if( pField->ISA( SvxDateField ) )
76 	{
77 		const SvxDateField* pDateField = (const SvxDateField*) pField;
78 		SvxDateField aDateField( *pDateField );
79 
80 		if( pDateField->GetType() == SVXDATETYPE_FIX )
81 			CheckItem( 1 );
82 		else
83 			CheckItem( 2 );
84 
85 		//SVXDATEFORMAT_APPDEFAULT,		// Wird nicht benutzt
86 		//SVXDATEFORMAT_SYSTEM,			// Wird nicht benutzt
87 		InsertItem( nID++, String( SdResId( STR_STANDARD_SMALL ) ), nStyle );
88 		InsertItem( nID++, String( SdResId( STR_STANDARD_BIG ) ), nStyle );
89 
90 		SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter();
91 		aDateField.SetFormat( SVXDATEFORMAT_A );	// 13.02.96
92 		InsertItem( nID++, aDateField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
93 		aDateField.SetFormat( SVXDATEFORMAT_B );	// 13.02.1996
94 		InsertItem( nID++, aDateField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
95 		aDateField.SetFormat( SVXDATEFORMAT_C );	// 13.Feb 1996
96 		InsertItem( nID++, aDateField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
97 
98 		aDateField.SetFormat( SVXDATEFORMAT_D );	// 13.Februar 1996
99 		InsertItem( nID++, aDateField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
100 		aDateField.SetFormat( SVXDATEFORMAT_E );	// Die, 13.Februar 1996
101 		InsertItem( nID++, aDateField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
102 		aDateField.SetFormat( SVXDATEFORMAT_F );	// Dienstag, 13.Februar 1996
103 		InsertItem( nID++, aDateField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
104 
105 		CheckItem( (sal_uInt16) ( pDateField->GetFormat() ) + 1 ); // - 2 + 3 !
106 	}
107 	else if( pField->ISA( SvxExtTimeField ) )
108 	{
109 		const SvxExtTimeField* pTimeField = (const SvxExtTimeField*) pField;
110 		SvxExtTimeField aTimeField( *pTimeField );
111 
112 		if( pTimeField->GetType() == SVXTIMETYPE_FIX )
113 			CheckItem( 1 );
114 		else
115 			CheckItem( 2 );
116 
117 		//SVXTIMEFORMAT_APPDEFAULT,		// Wird nicht benutzt
118 		//SVXTIMEFORMAT_SYSTEM,			// Wird nicht benutzt
119 		InsertItem( nID++, String( SdResId( STR_STANDARD_NORMAL ) ), nStyle );
120 
121 		SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter();
122 		aTimeField.SetFormat( SVXTIMEFORMAT_24_HM );	// 13:49
123 		InsertItem( nID++, aTimeField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
124 		aTimeField.SetFormat( SVXTIMEFORMAT_24_HMS );	// 13:49:38
125 		InsertItem( nID++, aTimeField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
126 		aTimeField.SetFormat( SVXTIMEFORMAT_24_HMSH );	// 13:49:38.78
127 		InsertItem( nID++, aTimeField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
128 
129 		aTimeField.SetFormat( SVXTIMEFORMAT_12_HM );	// 01:49
130 		InsertItem( nID++, aTimeField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
131 		aTimeField.SetFormat( SVXTIMEFORMAT_12_HMS );	// 01:49:38
132 		InsertItem( nID++, aTimeField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
133 		aTimeField.SetFormat( SVXTIMEFORMAT_12_HMSH );	// 01:49:38.78
134 		InsertItem( nID++, aTimeField.GetFormatted( *pNumberFormatter, eLanguage ), nStyle );
135 		//SVXTIMEFORMAT_AM_HM,	// 01:49 PM
136 		//SVXTIMEFORMAT_AM_HMS,	// 01:49:38 PM
137 		//SVXTIMEFORMAT_AM_HMSH	// 01:49:38.78 PM
138 
139 		CheckItem( (sal_uInt16) ( pTimeField->GetFormat() ) + 1 ); // - 2 + 3 !
140 	}
141 	else if( pField->ISA( SvxExtFileField ) )
142 	{
143 		const SvxExtFileField* pFileField = (const SvxExtFileField*) pField;
144 		//SvxExtFileField aFileField( *pFileField );
145 
146 		if( pFileField->GetType() == SVXFILETYPE_FIX )
147 			CheckItem( 1 );
148 		else
149 			CheckItem( 2 );
150 
151 		InsertItem( nID++, String( SdResId( STR_FILEFORMAT_NAME_EXT ) ), nStyle );
152 		InsertItem( nID++, String( SdResId( STR_FILEFORMAT_FULLPATH ) ), nStyle );
153 		InsertItem( nID++, String( SdResId( STR_FILEFORMAT_PATH ) ), nStyle );
154 		InsertItem( nID++, String( SdResId( STR_FILEFORMAT_NAME ) ), nStyle );
155 
156 		CheckItem( (sal_uInt16) ( pFileField->GetFormat() ) + 3 );
157 	}
158 	else if( pField->ISA( SvxAuthorField ) )
159 	{
160 		const SvxAuthorField* pAuthorField = (const SvxAuthorField*) pField;
161 		SvxAuthorField aAuthorField( *pAuthorField );
162 
163 		if( pAuthorField->GetType() == SVXAUTHORTYPE_FIX )
164 			CheckItem( 1 );
165 		else
166 			CheckItem( 2 );
167 
168 		for( sal_uInt16 i = 0; i < 4; i++ )
169 		{
170 			aAuthorField.SetFormat( (SvxAuthorFormat) i );
171 			InsertItem( nID++, aAuthorField.GetFormatted(), nStyle );
172 		}
173 		CheckItem( (sal_uInt16) ( pAuthorField->GetFormat() ) + 3 );
174 	}
175 }
176 
177 /*************************************************************************
178 |* Gibt das neue Feld zurueck, gehoert dem Caller.
179 |* Liefert NULL, wenn sich nichts geaendert hat.
180 \************************************************************************/
181 
GetField()182 SvxFieldData* SdFieldPopup::GetField()
183 {
184 	SvxFieldData* pNewField = NULL;
185 	sal_uInt16 nCount = GetItemCount();
186 
187 	if( pField->ISA( SvxDateField ) )
188 	{
189 		const SvxDateField* pDateField = (const SvxDateField*) pField;
190 		SvxDateType	  eType;
191 		SvxDateFormat eFormat;
192 		sal_uInt16 i;
193 
194 		if( IsItemChecked( 1 ) )
195 			eType = SVXDATETYPE_FIX;
196 		else
197 			eType = SVXDATETYPE_VAR;
198 
199 		for( i = 3; i <= nCount; i++ )
200 		{
201 			if( IsItemChecked( i ) )
202 				break;
203 		}
204 		eFormat = (SvxDateFormat) ( i - 1 );
205 
206 		if( pDateField->GetFormat() != eFormat ||
207 			pDateField->GetType() != eType )
208 		{
209 			pNewField = new SvxDateField( *pDateField );
210 			( (SvxDateField*) pNewField )->SetType( eType );
211 			( (SvxDateField*) pNewField )->SetFormat( eFormat );
212 
213 			if( (pDateField->GetType() == SVXDATETYPE_VAR) && (eType == SVXDATETYPE_FIX) )
214 			{
215 				Date aDate;
216 				( (SvxDateField*) pNewField )->SetFixDate( aDate );
217 			}
218 		}
219 	}
220 	else if( pField->ISA( SvxExtTimeField ) )
221 	{
222 		const SvxExtTimeField* pTimeField = (const SvxExtTimeField*) pField;
223 		SvxTimeType	  eType;
224 		SvxTimeFormat eFormat;
225 		sal_uInt16 i;
226 
227 		if( IsItemChecked( 1 ) )
228 			eType = SVXTIMETYPE_FIX;
229 		else
230 			eType = SVXTIMETYPE_VAR;
231 
232 		for( i = 3; i <= nCount; i++ )
233 		{
234 			if( IsItemChecked( i ) )
235 				break;
236 		}
237 		eFormat = (SvxTimeFormat) ( i - 1 );
238 
239 		if( pTimeField->GetFormat() != eFormat ||
240 			pTimeField->GetType() != eType )
241 		{
242 			pNewField = new SvxExtTimeField( *pTimeField );
243 			( (SvxExtTimeField*) pNewField )->SetType( eType );
244 			( (SvxExtTimeField*) pNewField )->SetFormat( eFormat );
245 
246 			if( (pTimeField->GetType() == SVXTIMETYPE_VAR) && (eType == SVXTIMETYPE_FIX) )
247 			{
248 				Time aTime;
249 				( (SvxExtTimeField*) pNewField )->SetFixTime( aTime );
250 			}
251 
252 		}
253 	}
254 	else if( pField->ISA( SvxExtFileField ) )
255 	{
256 		const SvxExtFileField* pFileField = (const SvxExtFileField*) pField;
257 		SvxFileType	  eType;
258 		SvxFileFormat eFormat;
259 		sal_uInt16 i;
260 
261 		if( IsItemChecked( 1 ) )
262 			eType = SVXFILETYPE_FIX;
263 		else
264 			eType = SVXFILETYPE_VAR;
265 
266 		for( i = 3; i <= nCount; i++ )
267 		{
268 			if( IsItemChecked( i ) )
269 				break;
270 		}
271 		eFormat = (SvxFileFormat) ( i - 3 );
272 
273 		if( pFileField->GetFormat() != eFormat ||
274 			pFileField->GetType() != eType )
275 		{
276 			::sd::DrawDocShell* pDocSh = PTR_CAST(::sd::DrawDocShell,
277 				SfxObjectShell::Current() );
278 
279 			if( pDocSh )
280 			{
281 				SvxExtFileField aFileField( *pFileField );
282 
283 				String aName;
284 				if( pDocSh->HasName() )
285 					aName = pDocSh->GetMedium()->GetName();
286 
287 				// #91225# Get current filename, not the one stored in the old field
288 				pNewField = new SvxExtFileField( aName );
289 				( (SvxExtFileField*) pNewField )->SetType( eType );
290 				( (SvxExtFileField*) pNewField )->SetFormat( eFormat );
291 			}
292 		}
293 	}
294 	else if( pField->ISA( SvxAuthorField ) )
295 	{
296 		const SvxAuthorField* pAuthorField = (const SvxAuthorField*) pField;
297 		SvxAuthorType	eType;
298 		SvxAuthorFormat eFormat;
299 		sal_uInt16 i;
300 
301 		if( IsItemChecked( 1 ) )
302 			eType = SVXAUTHORTYPE_FIX;
303 		else
304 			eType = SVXAUTHORTYPE_VAR;
305 
306 		for( i = 3; i <= nCount; i++ )
307 		{
308 			if( IsItemChecked( i ) )
309 				break;
310 		}
311 		eFormat = (SvxAuthorFormat) ( i - 3 );
312 
313 		if( pAuthorField->GetFormat() != eFormat ||
314 			pAuthorField->GetType() != eType )
315 		{
316 			// #91225# Get current state of address, not the old one
317 			SvtUserOptions aUserOptions;
318 			pNewField = new SvxAuthorField( aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() );
319 			( (SvxAuthorField*) pNewField )->SetType( eType );
320 			( (SvxAuthorField*) pNewField )->SetFormat( eFormat );
321 		}
322 	}
323 	return( pNewField );
324 }
325