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_scui.hxx"
26 
27 
28 
29 
30 //------------------------------------------------------------------
31 
32 #include "scitems.hxx"
33 #include <svx/algitem.hxx>
34 #include <editeng/boxitem.hxx>
35 #include <editeng/brshitem.hxx>
36 #include <editeng/cntritem.hxx>
37 #include <editeng/colritem.hxx>
38 #include <editeng/crsditem.hxx>
39 #include <editeng/fontitem.hxx>
40 #include <editeng/postitem.hxx>
41 #include <editeng/shdditem.hxx>
42 #include <editeng/udlnitem.hxx>
43 #include <editeng/wghtitem.hxx>
44 #include <svl/zforlist.hxx>
45 #include <vcl/msgbox.hxx>
46 #include <comphelper/processfactory.hxx>
47 #include <sfx2/sfxresid.hxx>
48 #include "sc.hrc"
49 #include "scmod.hxx"
50 #include "attrib.hxx"
51 #include "zforauto.hxx"
52 #include "scitems.hxx"
53 #include "global.hxx"
54 #include "globstr.hrc"
55 #include "autoform.hxx"
56 #include "strindlg.hxx"
57 #include "miscdlgs.hrc"
58 #include "scuiautofmt.hxx"
59 #include "scresid.hxx"
60 #include "document.hxx"
61 
62 //========================================================================
63 // AutoFormat-Dialog:
64 
ScAutoFormatDlg(Window * pParent,ScAutoFormat * pAutoFormat,const ScAutoFormatData * pSelFormatData,ScDocument * pDoc)65 ScAutoFormatDlg::ScAutoFormatDlg( Window*					pParent,
66 								  ScAutoFormat* 			pAutoFormat,
67                                   const ScAutoFormatData*   pSelFormatData,
68                                   ScDocument*               pDoc ) :
69 
70 	ModalDialog 	( pParent, ScResId( RID_SCDLG_AUTOFORMAT ) ),
71 	//
72     aFlFormat       ( this, ScResId( FL_FORMAT ) ),
73 	aLbFormat		( this, ScResId( LB_FORMAT ) ),
74     pWndPreview     ( new ScAutoFmtPreview( this, ScResId( WND_PREVIEW ), pDoc ) ),
75 	aBtnOk			( this, ScResId( BTN_OK ) ),
76 	aBtnCancel		( this, ScResId( BTN_CANCEL ) ),
77 	aBtnHelp		( this, ScResId( BTN_HELP ) ),
78 	aBtnAdd 		( this, ScResId( BTN_ADD ) ),
79 	aBtnRemove		( this, ScResId( BTN_REMOVE ) ),
80 	aBtnMore		( this, ScResId( BTN_MORE ) ),
81     aFlFormatting   ( this, ScResId( FL_FORMATTING ) ),
82 	aBtnNumFormat	( this, ScResId( BTN_NUMFORMAT ) ),
83 	aBtnBorder		( this, ScResId( BTN_BORDER ) ),
84 	aBtnFont		( this, ScResId( BTN_FONT ) ),
85 	aBtnPattern 	( this, ScResId( BTN_PATTERN ) ),
86 	aBtnAlignment	( this, ScResId( BTN_ALIGNMENT ) ),
87 	aBtnAdjust		( this, ScResId( BTN_ADJUST ) ),
88 	aBtnRename		( this, ScResId( BTN_RENAME ) ),
89     aStrTitle       ( ScResId( STR_ADD_TITLE ) ),
90     aStrLabel       ( ScResId( STR_ADD_LABEL ) ),
91     aStrClose       ( ScResId( STR_BTN_CLOSE ) ),
92     aStrDelTitle    ( ScResId( STR_DEL_TITLE ) ),
93     aStrDelMsg      ( ScResId( STR_DEL_MSG ) ) ,
94     aStrRename      ( ScResId( STR_RENAME_TITLE ) ),
95 	//
96 	pFormat 		( pAutoFormat ),
97 	pSelFmtData 	( pSelFormatData ),
98 	nIndex			( 0 ),
99 	bCoreDataChanged( sal_False ),
100 	bFmtInserted	( sal_False )
101 {
102 	Init();
103 	pWndPreview->NotifyChange( (*pFormat)[0] );
104 	FreeResource();
105 }
106 
107 //------------------------------------------------------------------------
108 
~ScAutoFormatDlg()109 __EXPORT ScAutoFormatDlg::~ScAutoFormatDlg()
110 {
111 	delete pWndPreview;
112 }
113 
114 //------------------------------------------------------------------------
115 
Init()116 void ScAutoFormatDlg::Init()
117 {
118 	sal_uInt16 nCount;
119 	String aEntry;
120 
121 	aLbFormat	 .SetSelectHdl( LINK( this, ScAutoFormatDlg, SelFmtHdl ) );
122 	aBtnNumFormat.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
123 	aBtnBorder	 .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
124 	aBtnFont	 .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
125 	aBtnPattern  .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
126 	aBtnAlignment.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
127 	aBtnAdjust	 .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
128 	aBtnAdd 	 .SetClickHdl ( LINK( this, ScAutoFormatDlg, AddHdl ) );
129 	aBtnRemove	 .SetClickHdl ( LINK( this, ScAutoFormatDlg, RemoveHdl ) );
130 	aBtnOk		 .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
131 	aBtnCancel	 .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
132 	aBtnRename	 .SetClickHdl ( LINK( this, ScAutoFormatDlg, RenameHdl ) );
133 	aLbFormat	 .SetDoubleClickHdl( LINK( this, ScAutoFormatDlg, DblClkHdl ) );
134 
135 	aBtnMore.AddWindow( &aBtnRename );
136 	aBtnMore.AddWindow( &aBtnNumFormat );
137 	aBtnMore.AddWindow( &aBtnBorder );
138 	aBtnMore.AddWindow( &aBtnFont );
139 	aBtnMore.AddWindow( &aBtnPattern );
140 	aBtnMore.AddWindow( &aBtnAlignment );
141 	aBtnMore.AddWindow( &aBtnAdjust );
142     aBtnMore.AddWindow( &aFlFormatting );
143 
144 	nCount = pFormat->GetCount();
145 
146 	for ( sal_uInt16 i = 0; i < nCount; i++ )
147 	{
148 		((*pFormat)[i])->GetName( aEntry );
149 		aLbFormat.InsertEntry( aEntry );
150 	}
151 
152 	if ( nCount == 1 )
153 		aBtnRemove.Disable();
154 
155 	aLbFormat.SelectEntryPos( 0 );
156 	aBtnRename.Disable();
157 	aBtnRemove.Disable();
158 
159 	nIndex = 0;
160 	UpdateChecks();
161 
162 	if ( !pSelFmtData )
163 	{
164 		aBtnAdd.Disable();
165 		aBtnRemove.Disable();
166 		bFmtInserted = sal_True;
167 	}
168 }
169 
170 //------------------------------------------------------------------------
171 
UpdateChecks()172 void ScAutoFormatDlg::UpdateChecks()
173 {
174 	ScAutoFormatData* pData = (*pFormat)[nIndex];
175 
176 	aBtnNumFormat.Check( pData->GetIncludeValueFormat() );
177 	aBtnBorder	 .Check( pData->GetIncludeFrame() );
178 	aBtnFont	 .Check( pData->GetIncludeFont() );
179 	aBtnPattern  .Check( pData->GetIncludeBackground() );
180 	aBtnAlignment.Check( pData->GetIncludeJustify() );
181 	aBtnAdjust	 .Check( pData->GetIncludeWidthHeight() );
182 }
183 
184 //------------------------------------------------------------------------
185 // Handler:
186 //---------
187 
IMPL_LINK(ScAutoFormatDlg,CloseHdl,PushButton *,pBtn)188 IMPL_LINK( ScAutoFormatDlg, CloseHdl, PushButton *, pBtn )
189 {
190 	if ( pBtn == &aBtnOk || pBtn == &aBtnCancel )
191 	{
192 		if ( bCoreDataChanged )
193 			ScGlobal::GetAutoFormat()->Save();
194 
195 		EndDialog( (pBtn == &aBtnOk) ? RET_OK : RET_CANCEL );
196 	}
197 	return 0;
198 }
199 
200 //------------------------------------------------------------------------
201 
IMPL_LINK_INLINE_START(ScAutoFormatDlg,DblClkHdl,void *,EMPTYARG)202 IMPL_LINK_INLINE_START( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG )
203 {
204 	if ( bCoreDataChanged )
205 		ScGlobal::GetAutoFormat()->Save();
206 
207 	EndDialog( RET_OK );
208 	return 0;
209 }
IMPL_LINK_INLINE_END(ScAutoFormatDlg,DblClkHdl,void *,EMPTYARG)210 IMPL_LINK_INLINE_END( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG )
211 
212 //------------------------------------------------------------------------
213 
214 IMPL_LINK( ScAutoFormatDlg, CheckHdl, Button *, pBtn )
215 {
216 	ScAutoFormatData* pData  = (*pFormat)[nIndex];
217 	sal_Bool			  bCheck = ((CheckBox*)pBtn)->IsChecked();
218 
219 	if ( pBtn == &aBtnNumFormat )
220 		pData->SetIncludeValueFormat( bCheck );
221 	else if ( pBtn == &aBtnBorder )
222 		pData->SetIncludeFrame( bCheck );
223 	else if ( pBtn == &aBtnFont )
224 		pData->SetIncludeFont( bCheck );
225 	else if ( pBtn == &aBtnPattern )
226 		pData->SetIncludeBackground( bCheck );
227 	else if ( pBtn == &aBtnAlignment )
228 		pData->SetIncludeJustify( bCheck );
229 	else if ( pBtn == &aBtnAdjust )
230 		pData->SetIncludeWidthHeight( bCheck );
231 
232 	if ( !bCoreDataChanged )
233 	{
234 		aBtnCancel.SetText( aStrClose );
235 		bCoreDataChanged = sal_True;
236 	}
237 
238 	pWndPreview->NotifyChange( pData );
239 
240 	return 0;
241 }
242 
243 //------------------------------------------------------------------------
244 
IMPL_LINK(ScAutoFormatDlg,AddHdl,void *,EMPTYARG)245 IMPL_LINK( ScAutoFormatDlg, AddHdl, void *, EMPTYARG )
246 {
247 	if ( !bFmtInserted && pSelFmtData )
248 	{
249 		String				aStrStandard( SfxResId(STR_STANDARD) );
250 		String				aFormatName;
251 		ScStringInputDlg*	pDlg;
252 		sal_Bool				bOk = sal_False;
253 
254 		while ( !bOk )
255 		{
256 			pDlg = new ScStringInputDlg( this,
257 										 aStrTitle,
258 										 aStrLabel,
259 										 aFormatName,
260 										 HID_SC_ADD_AUTOFMT, HID_SC_AUTOFMT_NAME );
261 
262 			if ( pDlg->Execute() == RET_OK )
263 			{
264 				pDlg->GetInputString( aFormatName );
265 
266 				if ( (aFormatName.Len() > 0) && (aFormatName != aStrStandard) )
267 				{
268 					ScAutoFormatData* pNewData
269 						= new ScAutoFormatData( *pSelFmtData );
270 
271 					pNewData->SetName( aFormatName );
272 					bFmtInserted = pFormat->Insert( pNewData );
273 
274 					if ( bFmtInserted )
275 					{
276 						sal_uInt16 nAt = pFormat->IndexOf( pNewData );
277 
278 						aLbFormat.InsertEntry( aFormatName, nAt );
279 						aLbFormat.SelectEntry( aFormatName );
280 						aBtnAdd.Disable();
281 
282 						if ( !bCoreDataChanged )
283 						{
284 							aBtnCancel.SetText( aStrClose );
285 							bCoreDataChanged = sal_True;
286 						}
287 
288 						SelFmtHdl( 0 );
289 						bOk = sal_True;
290 					}
291 					else
292 						delete pNewData;
293 
294 				}
295 
296 				if ( !bFmtInserted )
297 				{
298 					sal_uInt16 nRet = ErrorBox( this,
299 											WinBits( WB_OK_CANCEL | WB_DEF_OK),
300 											ScGlobal::GetRscString(STR_INVALID_AFNAME)
301 										  ).Execute();
302 
303 					bOk = ( nRet == RET_CANCEL );
304 				}
305 			}
306 			else
307 				bOk = sal_True;
308 
309 			delete pDlg;
310 		}
311 	}
312 
313 	return 0;
314 }
315 
316 //------------------------------------------------------------------------
317 
IMPL_LINK(ScAutoFormatDlg,RemoveHdl,void *,EMPTYARG)318 IMPL_LINK( ScAutoFormatDlg, RemoveHdl, void *, EMPTYARG )
319 {
320 	if ( (nIndex > 0) && (aLbFormat.GetEntryCount() > 0) )
321 	{
322 		String aMsg( aStrDelMsg.GetToken( 0, '#' ) );
323 
324 		aMsg += aLbFormat.GetSelectEntry();
325 		aMsg += aStrDelMsg.GetToken( 1, '#' );
326 
327 		if ( RET_YES ==
328 			 QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() )
329 		{
330 			aLbFormat.RemoveEntry( nIndex );
331 			aLbFormat.SelectEntryPos( nIndex-1 );
332 
333 			if ( nIndex-1 == 0 )
334 				aBtnRemove.Disable();
335 
336 			if ( !bCoreDataChanged )
337 			{
338 				aBtnCancel.SetText( aStrClose );
339 				bCoreDataChanged = sal_True;
340 			}
341 
342 			pFormat->AtFree( nIndex ); // in der Core loeschen
343 			nIndex--;
344 
345 			SelFmtHdl( 0 );
346 		}
347 	}
348 
349 	SelFmtHdl( 0 );
350 
351 	return 0;
352 }
353 
IMPL_LINK(ScAutoFormatDlg,RenameHdl,void *,EMPTYARG)354 IMPL_LINK( ScAutoFormatDlg, RenameHdl, void *, EMPTYARG )
355 {
356 	sal_Bool bOk = sal_False;
357 	while( !bOk )
358 	{
359 
360 		String aFormatName=aLbFormat.GetSelectEntry();
361 		String aEntry;
362 
363 		ScStringInputDlg* pDlg = new ScStringInputDlg( this,
364 										 aStrRename,
365 										 aStrLabel,
366 										 aFormatName,
367                                          HID_SC_REN_AFMT_DLG, HID_SC_REN_AFMT_NAME );
368 		if( pDlg->Execute() == RET_OK )
369 		{
370 			sal_Bool bFmtRenamed = sal_False;
371 			pDlg->GetInputString( aFormatName );
372 			sal_uInt16 n;
373 
374 			if ( aFormatName.Len() > 0 )
375 			{
376 				for( n = 0; n < pFormat->GetCount(); ++n )
377 				{
378 					(*pFormat)[n]->GetName(aEntry);
379 					if ( aEntry== aFormatName)
380 						break;
381 				}
382 				if( n >= pFormat->GetCount() )
383 				{
384 					// Format mit dem Namen noch nicht vorhanden, also
385 					// umbenennen
386 
387 					aLbFormat.RemoveEntry(nIndex );
388 					ScAutoFormatData* p=(*pFormat)[ nIndex ];
389 					ScAutoFormatData* pNewData
390 						= new ScAutoFormatData(*p);
391 
392 					pFormat->AtFree( nIndex );
393 
394 					pNewData->SetName( aFormatName );
395 
396 					pFormat->Insert( pNewData);
397 
398 					sal_uInt16 nCount = pFormat->GetCount();
399 
400 					aLbFormat.SetUpdateMode(sal_False);
401 					aLbFormat.Clear();
402 					for ( sal_uInt16 i = 0; i < nCount; i++ )
403 					{
404 						((*pFormat)[i])->GetName( aEntry );
405 						aLbFormat.InsertEntry( aEntry );
406 					}
407 
408 					aLbFormat.SetUpdateMode( sal_True);
409 					aLbFormat.SelectEntry( aFormatName);
410 
411 					if ( !bCoreDataChanged )
412 					{
413 						aBtnCancel.SetText( aStrClose );
414 						bCoreDataChanged = sal_True;
415 					}
416 
417 
418 					SelFmtHdl( 0 );
419 					bOk = sal_True;
420 					bFmtRenamed = sal_True;
421 				}
422 			}
423 			if( !bFmtRenamed )
424 			{
425 				bOk = RET_CANCEL == ErrorBox( this,
426 									WinBits( WB_OK_CANCEL | WB_DEF_OK),
427 									ScGlobal::GetRscString(STR_INVALID_AFNAME)
428 									).Execute();
429 			}
430 		}
431 		else
432 			bOk = sal_True;
433 		delete pDlg;
434 	}
435 
436 	return 0;
437 }
438 
439 //------------------------------------------------------------------------
440 
IMPL_LINK(ScAutoFormatDlg,SelFmtHdl,void *,EMPTYARG)441 IMPL_LINK( ScAutoFormatDlg, SelFmtHdl, void *, EMPTYARG )
442 {
443 	nIndex = aLbFormat.GetSelectEntryPos();
444 	UpdateChecks();
445 
446 	if ( nIndex == 0 )
447 	{
448 		aBtnRename.Disable();
449 		aBtnRemove.Disable();
450 	}
451 	else
452 	{
453 		aBtnRename.Enable();
454 		aBtnRemove.Enable();
455 	}
456 
457 	pWndPreview->NotifyChange( (*pFormat)[nIndex] );
458 
459 	return 0;
460 }
461 
462 //------------------------------------------------------------------------
463 
GetCurrFormatName()464 String __EXPORT ScAutoFormatDlg::GetCurrFormatName()
465 {
466 	String	aResult;
467 
468 	((*pFormat)[nIndex])->GetName( aResult );
469 
470 	return aResult;
471 }
472