xref: /trunk/main/cui/source/tabpages/tphatch.cxx (revision 3e407bd8)
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_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <tools/shl.hxx>
29 #include <tools/urlobj.hxx>
30 #include <vcl/msgbox.hxx>
31 #include <unotools/pathoptions.hxx>
32 #include <sfx2/app.hxx>
33 #include <sfx2/module.hxx>
34 #include <sfx2/filedlghelper.hxx>
35 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
36 
37 #define _SVX_TPHATCH_CXX
38 
39 #include <cuires.hrc>
40 #include "tabarea.hrc"
41 //#include "dlgname.hrc"
42 #include "helpid.hrc"
43 #include "svx/xattr.hxx"
44 #include <svx/xpool.hxx>
45 #include <svx/xtable.hxx>
46 #include "svx/drawitem.hxx"
47 #include "cuitabarea.hxx"
48 #include "defdlgname.hxx" //CHINA001 #include "dlgname.hxx"
49 #include <svx/svxdlg.hxx> //CHINA001
50 #include <dialmgr.hxx>
51 #include "svx/dlgutil.hxx"
52 #include <svx/dialmgr.hxx>
53 #include "paragrph.hrc"
54 #include <svx/dialogs.hrc>
55 
56 #define DLGWIN this->GetParent()->GetParent()
57 
58 #define BITMAP_WIDTH  32
59 #define BITMAP_HEIGHT 12
60 
61 /*************************************************************************
62 |*
63 |*	Dialog zum Aendern und Definieren der Schraffuren
64 |*
65 \************************************************************************/
66 
SvxHatchTabPage(Window * pParent,const SfxItemSet & rInAttrs)67 SvxHatchTabPage::SvxHatchTabPage
68 (
69 	Window* pParent,
70 	const SfxItemSet& rInAttrs
71 ) :
72 
73 	SvxTabPage			( pParent, CUI_RES( RID_SVXPAGE_HATCH ), rInAttrs ),
74 
75     aFtDistance         ( this, CUI_RES( FT_LINE_DISTANCE ) ),
76 	aMtrDistance		( this, CUI_RES( MTR_FLD_DISTANCE ) ),
77 	aFtAngle			( this, CUI_RES( FT_LINE_ANGLE ) ),
78 	aMtrAngle			( this, CUI_RES( MTR_FLD_ANGLE ) ),
79 	aCtlAngle			( this, CUI_RES( CTL_ANGLE ),
80 									RP_RB, 200, 80, CS_ANGLE ),
81     aFlProp             ( this, CUI_RES( FL_PROP ) ),
82 	aFtLineType			( this, CUI_RES( FT_LINE_TYPE ) ),
83 	aLbLineType			( this, CUI_RES( LB_LINE_TYPE ) ),
84 	aFtLineColor		( this, CUI_RES( FT_LINE_COLOR ) ),
85 	aLbLineColor		( this, CUI_RES( LB_LINE_COLOR ) ),
86 	aLbHatchings		( this, CUI_RES( LB_HATCHINGS ) ),
87 	aCtlPreview			( this, CUI_RES( CTL_PREVIEW ) ),
88 	aBtnAdd				( this, CUI_RES( BTN_ADD ) ),
89 	aBtnModify			( this, CUI_RES( BTN_MODIFY ) ),
90 	aBtnDelete			( this, CUI_RES( BTN_DELETE ) ),
91 	aBtnLoad			( this, CUI_RES( BTN_LOAD ) ),
92 	aBtnSave			( this, CUI_RES( BTN_SAVE ) ),
93 
94     rOutAttrs           ( rInAttrs ),
95     maColorTab(),
96     maHatchingList(),
97 
98     pXPool              ( (XOutdevItemPool*) rInAttrs.GetPool() ),
99     aXFStyleItem        ( XFILL_HATCH ),
100     aXHatchItem         ( String(), XHatch() ),
101     aXFillAttr          ( pXPool ),
102     rXFSet              ( aXFillAttr.GetItemSet() )
103 
104 {
105 	aBtnLoad.SetModeImage( Image( CUI_RES( RID_SVXIMG_LOAD_H ) ), BMP_COLOR_HIGHCONTRAST );
106 	aBtnSave.SetModeImage( Image( CUI_RES( RID_SVXIMG_SAVE_H ) ), BMP_COLOR_HIGHCONTRAST );
107 
108 	FreeResource();
109 
110 	// diese Page braucht ExchangeSupport
111 	SetExchangeSupport();
112 
113 	// Metrik einstellen
114 	FieldUnit eFUnit = GetModuleFieldUnit( rInAttrs );
115 
116 	switch ( eFUnit )
117 	{
118 		case FUNIT_M:
119 		case FUNIT_KM:
120 			eFUnit = FUNIT_MM;
121 			break;
122         default: ;//prevent warning
123 	}
124 	SetFieldUnit( aMtrDistance, eFUnit );
125 
126 	// PoolUnit ermitteln
127 	SfxItemPool* pPool = rOutAttrs.GetPool();
128 	DBG_ASSERT( pPool, "Wo ist der Pool?" );
129 	ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH );
130 
131 	// Setzen des Output-Devices
132 	rXFSet.Put( aXFStyleItem );
133 	rXFSet.Put( aXHatchItem );
134 	aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
135 
136 	aLbHatchings.SetSelectHdl( LINK( this, SvxHatchTabPage, ChangeHatchHdl_Impl ) );
137 
138 	Link aLink = LINK( this, SvxHatchTabPage, ModifiedHdl_Impl );
139 	aMtrDistance.SetModifyHdl( aLink );
140 	aMtrAngle.SetModifyHdl( aLink );
141 	aLbLineType.SetSelectHdl( aLink );
142 	aLbLineColor.SetSelectHdl( aLink );
143 
144 	aBtnAdd.SetClickHdl( LINK( this, SvxHatchTabPage, ClickAddHdl_Impl ) );
145 	aBtnModify.SetClickHdl(
146 		LINK( this, SvxHatchTabPage, ClickModifyHdl_Impl ) );
147 	aBtnDelete.SetClickHdl(
148 		LINK( this, SvxHatchTabPage, ClickDeleteHdl_Impl ) );
149 	aBtnLoad.SetClickHdl( LINK( this, SvxHatchTabPage, ClickLoadHdl_Impl ) );
150 	aBtnSave.SetClickHdl( LINK( this, SvxHatchTabPage, ClickSaveHdl_Impl ) );
151 
152 	aCtlPreview.SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
153 
154 	aCtlPreview.SetAccessibleName(String(CUI_RES(STR_EXAMPLE)));
155 	aLbHatchings.SetAccessibleName( String(CUI_RES(STR_LB_HATCHINGSTYLE)) );
156 	aCtlAngle.SetAccessibleRelationMemberOf( &aFlProp );
157 	aLbHatchings.SetAccessibleRelationMemberOf( &aFlProp );
158 	aBtnAdd.SetAccessibleRelationMemberOf( &aFlProp );
159 	aBtnModify.SetAccessibleRelationMemberOf( &aFlProp );
160 	aBtnDelete.SetAccessibleRelationMemberOf( &aFlProp );
161 	aLbHatchings.SetAccessibleRelationLabeledBy(&aLbHatchings);
162 }
163 
164 // -----------------------------------------------------------------------
165 
Construct()166 void SvxHatchTabPage::Construct()
167 {
168 	// Farbtabelle
169 	aLbLineColor.Fill( maColorTab );
170 
171 	// Schraffurentabelle
172 	aLbHatchings.Fill( maHatchingList );
173 }
174 
175 // -----------------------------------------------------------------------
176 
ActivatePage(const SfxItemSet & rSet)177 void SvxHatchTabPage::ActivatePage( const SfxItemSet& rSet )
178 {
179 	sal_uInt16 nPos;
180 	sal_uInt16 nCount;
181 
182 	if( *pDlgType == 0 ) // Flaechen-Dialog
183 	{
184 		*pbAreaTP = sal_False;
185 
186 		if( maColorTab.get() )
187 		{
188 			// ColorTable
189 			if( *pnColorTableState & CT_CHANGED ||
190 				*pnColorTableState & CT_MODIFIED )
191 			{
192 				if( *pnColorTableState & CT_CHANGED )
193 					maColorTab = ( (SvxAreaTabDialog*) DLGWIN )->GetNewColorTable();
194 
195 				// LbLineColor
196 				nPos = aLbLineColor.GetSelectEntryPos();
197 				aLbLineColor.Clear();
198 				aLbLineColor.Fill( maColorTab );
199 				nCount = aLbLineColor.GetEntryCount();
200 				if( nCount == 0 )
201 					; // Dieser Fall sollte nicht auftreten
202 				else if( nCount <= nPos )
203 					aLbLineColor.SelectEntryPos( 0 );
204 				else
205 					aLbLineColor.SelectEntryPos( nPos );
206 
207 				ModifiedHdl_Impl( this );
208 			}
209 
210 			// Ermitteln (evtl. abschneiden) des Namens und in
211 			// der GroupBox darstellen
212 			String			aString( CUI_RES( RID_SVXSTR_TABLE ) ); aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
213 			INetURLObject	aURL( maHatchingList->GetPath() );
214 
215 			aURL.Append( maHatchingList->GetName() );
216 			DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
217 
218 			if ( aURL.getBase().getLength() > 18 )
219 			{
220 				aString += String(aURL.getBase()).Copy( 0, 15 );
221 				aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
222 			}
223 			else
224 				aString += String(aURL.getBase());
225 
226 			if( *pPageType == PT_HATCH && *pPos != LISTBOX_ENTRY_NOTFOUND )
227 			{
228 				aLbHatchings.SelectEntryPos( *pPos );
229 			}
230 			// Farben koennten geloescht worden sein
231 			ChangeHatchHdl_Impl( this );
232 
233 			*pPageType = PT_HATCH;
234 			*pPos = LISTBOX_ENTRY_NOTFOUND;
235 		}
236 	}
237 
238 	rXFSet.Put ( ( XFillColorItem& )    rSet.Get(XATTR_FILLCOLOR) );
239 	rXFSet.Put ( ( XFillBackgroundItem&)rSet.Get(XATTR_FILLBACKGROUND) );
240 	aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
241 	aCtlPreview.Invalidate();
242 }
243 
244 // -----------------------------------------------------------------------
245 
DeactivatePage(SfxItemSet * _pSet)246 int SvxHatchTabPage::DeactivatePage( SfxItemSet* _pSet )
247 {
248 	if ( CheckChanges_Impl() == -1L )
249 		return KEEP_PAGE;
250 
251     if( _pSet )
252         FillItemSet( *_pSet );
253 
254 	return LEAVE_PAGE;
255 }
256 
257 // -----------------------------------------------------------------------
258 
CheckChanges_Impl()259 long SvxHatchTabPage::CheckChanges_Impl()
260 {
261 	if( aMtrDistance.GetText()			 != aMtrDistance.GetSavedValue() ||
262 		aMtrAngle.GetText()				 != aMtrAngle.GetSavedValue() ||
263 		aLbLineType.GetSelectEntryPos()	 != aLbLineType.GetSavedValue()  ||
264 		aLbLineColor.GetSelectEntryPos() != aLbLineColor.GetSavedValue() ||
265 		aLbHatchings.GetSelectEntryPos() != aLbHatchings.GetSavedValue() )
266 	{
267 		ResMgr& rMgr = CUI_MGR();
268         Image aWarningBoxImage = WarningBox::GetStandardImage();
269 		SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
270 		DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
271 		AbstractSvxMessDialog* aMessDlg = pFact->CreateSvxMessDialog( DLGWIN, RID_SVXDLG_MESSBOX,
272 														SVX_RESSTR( RID_SVXSTR_HATCH ),
273 														CUI_RESSTR( RID_SVXSTR_ASK_CHANGE_HATCH ),
274 														&aWarningBoxImage );
275 		DBG_ASSERT(aMessDlg, "Dialogdiet fail!");//CHINA001
276 		aMessDlg->SetButtonText( MESS_BTN_1, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_1,
277 								String( ResId( RID_SVXSTR_CHANGE, rMgr ) ) );
278 		aMessDlg->SetButtonText( MESS_BTN_2, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_2,
279 								String( ResId( RID_SVXSTR_ADD, rMgr ) ) );
280 
281 		short nRet = aMessDlg->Execute(); //CHINA001 short nRet = aMessDlg.Execute();
282 
283 		switch( nRet )
284 		{
285 			case RET_BTN_1: // Aendern
286 			{
287 				ClickModifyHdl_Impl( this );
288 			}
289 			break;
290 
291 			case RET_BTN_2: // Hinzufuegen
292 			{
293 				ClickAddHdl_Impl( this );
294 			}
295 			break;
296 
297 			case RET_CANCEL:
298 				// return( -1L ); <-- wuerde die Seite nicht verlassen
299 			break;
300 			// return( sal_True ); // Abbruch
301 		}
302 		delete aMessDlg; //add by CHINA001
303 	}
304 
305 	sal_uInt16 nPos = aLbHatchings.GetSelectEntryPos();
306 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
307 		*pPos = nPos;
308 	return 0L;
309 }
310 
311 // -----------------------------------------------------------------------
312 
FillItemSet(SfxItemSet & rSet)313 sal_Bool SvxHatchTabPage::FillItemSet( SfxItemSet& rSet )
314 {
315 	if( *pDlgType == 0 && *pbAreaTP == sal_False ) // Flaechen-Dialog
316 	{
317 		if( *pPageType == PT_HATCH )
318 		{
319 			// CheckChanges(); <-- doppelte Abfrage ?
320 
321 			XHatch*	pXHatch = NULL;
322 			String	aString;
323 			sal_uInt16	nPos = aLbHatchings.GetSelectEntryPos();
324 			if( nPos != LISTBOX_ENTRY_NOTFOUND )
325 			{
326                 pXHatch = new XHatch( maHatchingList->GetHatch( nPos )->GetHatch() );
327 				aString = aLbHatchings.GetSelectEntry();
328 			}
329 			// Farbverlauf wurde (unbekannt) uebergeben
330 			else
331 			{
332 				pXHatch = new XHatch( aLbLineColor.GetSelectEntryColor(),
333 								 (XHatchStyle) aLbLineType.GetSelectEntryPos(),
334 								 GetCoreValue( aMtrDistance, ePoolUnit ),
335 								 static_cast<long>(aMtrAngle.GetValue() * 10) );
336 			}
337 			DBG_ASSERT( pXHatch, "XHatch konnte nicht erzeugt werden" );
338             rSet.Put( XFillStyleItem( XFILL_HATCH ) );
339             rSet.Put( XFillHatchItem( aString, *pXHatch ) );
340 
341 			delete pXHatch;
342 		}
343 	}
344 	return sal_True;
345 }
346 
347 // -----------------------------------------------------------------------
348 
Reset(const SfxItemSet & rSet)349 void SvxHatchTabPage::Reset( const SfxItemSet& rSet )
350 {
351 	// aLbHatchings.SelectEntryPos( 0 );
352 	ChangeHatchHdl_Impl( this );
353 
354 	// Status der Buttons ermitteln
355 	if( maHatchingList.get() && maHatchingList->Count() )
356 	{
357 		aBtnModify.Enable();
358 		aBtnDelete.Enable();
359 		aBtnSave.Enable();
360 	}
361 	else
362 	{
363 		aBtnModify.Disable();
364 		aBtnDelete.Disable();
365 		aBtnSave.Disable();
366 	}
367 
368     rXFSet.Put ( ( XFillColorItem& )    rSet.Get(XATTR_FILLCOLOR) );
369     rXFSet.Put ( ( XFillBackgroundItem&)rSet.Get(XATTR_FILLBACKGROUND) );
370 	aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
371 	aCtlPreview.Invalidate();
372 }
373 
374 // -----------------------------------------------------------------------
375 
Create(Window * pWindow,const SfxItemSet & rSet)376 SfxTabPage* SvxHatchTabPage::Create( Window* pWindow,
377                 const SfxItemSet& rSet )
378 {
379     return new SvxHatchTabPage( pWindow, rSet );
380 }
381 
382 //------------------------------------------------------------------------
383 
IMPL_LINK(SvxHatchTabPage,ModifiedHdl_Impl,void *,p)384 IMPL_LINK( SvxHatchTabPage, ModifiedHdl_Impl, void *, p )
385 {
386 	if( p == &aMtrAngle )
387 	{
388 		// Setzen des Winkels im AngleControl
389 		switch( aMtrAngle.GetValue() )
390 		{
391 			case 135: aCtlAngle.SetActualRP( RP_LT ); break;
392 			case  90: aCtlAngle.SetActualRP( RP_MT ); break;
393 			case  45: aCtlAngle.SetActualRP( RP_RT ); break;
394 			case 180: aCtlAngle.SetActualRP( RP_LM ); break;
395 			case   0: aCtlAngle.SetActualRP( RP_RM ); break;
396 			case 225: aCtlAngle.SetActualRP( RP_LB ); break;
397 			case 270: aCtlAngle.SetActualRP( RP_MB ); break;
398 			case 315: aCtlAngle.SetActualRP( RP_RB ); break;
399 			default:  aCtlAngle.SetActualRP( RP_MM ); break;
400 		}
401 	}
402 
403 	XHatch aXHatch( aLbLineColor.GetSelectEntryColor(),
404 					(XHatchStyle) aLbLineType.GetSelectEntryPos(),
405 					GetCoreValue( aMtrDistance, ePoolUnit ),
406 					static_cast<long>(aMtrAngle.GetValue() * 10) );
407 
408 	rXFSet.Put( XFillHatchItem( String(), aXHatch ) );
409 	aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
410 
411 	aCtlPreview.Invalidate();
412 
413 	return 0L;
414 }
415 
416 //------------------------------------------------------------------------
417 
IMPL_LINK(SvxHatchTabPage,ChangeHatchHdl_Impl,void *,EMPTYARG)418 IMPL_LINK( SvxHatchTabPage, ChangeHatchHdl_Impl, void *, EMPTYARG )
419 {
420 	XHatch* pHatch = NULL;
421 	int nPos = aLbHatchings.GetSelectEntryPos();
422 
423 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
424         pHatch = new XHatch( ( (XHatchEntry*) maHatchingList->GetHatch( nPos ) )->GetHatch() );
425 	else
426 	{
427 		const SfxPoolItem* pPoolItem = NULL;
428 		if( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLSTYLE ), sal_True, &pPoolItem ) )
429 		{
430 			if( ( XFILL_HATCH == (XFillStyle) ( ( const XFillStyleItem* ) pPoolItem )->GetValue() ) &&
431 				( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLHATCH ), sal_True, &pPoolItem ) ) )
432 			{
433                 pHatch = new XHatch( ( ( const XFillHatchItem* ) pPoolItem )->GetHatchValue() );
434 			}
435 		}
436 		if( !pHatch )
437 		{
438 			aLbHatchings.SelectEntryPos( 0 );
439 			nPos = aLbHatchings.GetSelectEntryPos();
440 			if( nPos != LISTBOX_ENTRY_NOTFOUND )
441                 pHatch = new XHatch( ( (XHatchEntry*) maHatchingList->GetHatch( nPos ) )->GetHatch() );
442 		}
443 	}
444 	if( pHatch )
445 	{
446 		aLbLineType.SelectEntryPos(
447             sal::static_int_cast< sal_uInt16 >( pHatch->GetHatchStyle() ) );
448 		// Wenn der Eintrag nicht in der Listbox ist, wird die Farbe
449 		// temporaer hinzugenommen
450 		aLbLineColor.SetNoSelection();
451 		aLbLineColor.SelectEntry( pHatch->GetColor() );
452 		if( aLbLineColor.GetSelectEntryCount() == 0 )
453 		{
454 			aLbLineColor.InsertEntry( pHatch->GetColor(), String() );
455 			aLbLineColor.SelectEntry( pHatch->GetColor() );
456 		}
457 		SetMetricValue( aMtrDistance, pHatch->GetDistance(), ePoolUnit );
458 		aMtrAngle.SetValue( pHatch->GetAngle() / 10 );
459 
460 		// Setzen des Winkels im AngleControl
461 		switch( aMtrAngle.GetValue() )
462 		{
463 			case 135: aCtlAngle.SetActualRP( RP_LT ); break;
464 			case  90: aCtlAngle.SetActualRP( RP_MT ); break;
465 			case  45: aCtlAngle.SetActualRP( RP_RT ); break;
466 			case 180: aCtlAngle.SetActualRP( RP_LM ); break;
467 			case   0: aCtlAngle.SetActualRP( RP_RM ); break;
468 			case 225: aCtlAngle.SetActualRP( RP_LB ); break;
469 			case 270: aCtlAngle.SetActualRP( RP_MB ); break;
470 			case 315: aCtlAngle.SetActualRP( RP_RB ); break;
471 			default:  aCtlAngle.SetActualRP( RP_MM ); break;
472 		}
473 
474 		// Backgroundcolor
475 		/*
476 		const SfxPoolItem* pPoolItem = NULL;
477 		if( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLBACKGROUND ), sal_True, &pPoolItem ) )
478 		{
479 			rXFSet.Put ( XFillBackgroundItem( ( ( XFillBackgroundItem* )pPoolItem)->GetValue() ) );
480 			if( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLCOLOR ), sal_True, &pPoolItem ) )
481 			{
482 				Color aColor( ( ( const XFillColorItem* ) pPoolItem )->GetValue() );
483 				rXFSet.Put( XFillColorItem( String(), aColor ) );
484 			}
485 		}
486 		*/
487 		// ItemSet fuellen und an aCtlPreview weiterleiten
488 		rXFSet.Put( XFillHatchItem( String(), *pHatch ) );
489 		aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
490 
491 		aCtlPreview.Invalidate();
492 		delete pHatch;
493 	}
494 	aMtrDistance.SaveValue();
495 	aMtrAngle.SaveValue();
496 	aLbLineType.SaveValue();
497 	aLbLineColor.SaveValue();
498 	aLbHatchings.SaveValue();
499 
500 	return 0L;
501 }
502 
503 //------------------------------------------------------------------------
504 
IMPL_LINK(SvxHatchTabPage,ClickAddHdl_Impl,void *,EMPTYARG)505 IMPL_LINK( SvxHatchTabPage, ClickAddHdl_Impl, void *, EMPTYARG )
506 {
507 	ResMgr& rMgr = CUI_MGR();
508 	String aNewName( SVX_RES( RID_SVXSTR_HATCH ) );
509 	String aDesc( CUI_RES( RID_SVXSTR_DESC_HATCH ) );
510 	String aName;
511 
512 	long nCount = maHatchingList.get() ? maHatchingList->Count() : 0;
513 	long j = 1;
514 	sal_Bool bDifferent = sal_False;
515 
516 	while( !bDifferent )
517 	{
518 		aName  = aNewName;
519 		aName += sal_Unicode(' ');
520 		aName += UniString::CreateFromInt32( j++ );
521 		bDifferent = sal_True;
522 
523 		for( long i = 0; i < nCount && bDifferent; i++ )
524             if( aName == maHatchingList->GetHatch( i )->GetName() )
525 				bDifferent = sal_False;
526 	}
527 
528 	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
529 	DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
530 	AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
531 	DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
532 	WarningBox*    pWarnBox = NULL;
533 	sal_uInt16         nError   = RID_SVXSTR_WARN_NAME_DUPLICATE;
534 
535 	while( pDlg->Execute() == RET_OK )
536 	{
537 		pDlg->GetName( aName );
538 
539 		bDifferent = sal_True;
540 
541 		for( long i = 0; i < nCount && bDifferent; i++ )
542             if( aName == maHatchingList->GetHatch( i )->GetName() )
543 				bDifferent = sal_False;
544 
545 		if( bDifferent ) {
546 			nError = 0;
547 			break;
548 		}
549 
550 		if( !pWarnBox )
551 		{
552 			pWarnBox = new WarningBox( DLGWIN,
553 									   WinBits( WB_OK_CANCEL ),
554 									   String( ResId( nError, rMgr ) ) );
555 			pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE );
556 		}
557 
558 		if( pWarnBox->Execute() != RET_OK )
559 			break;
560 	}
561 	//Rectangle aDlgRect( pDlg->GetPosPixel(), pDlg->GetSizePixel() );
562 	delete pDlg;
563 	delete pWarnBox;
564 
565 	if( !nError )
566 	{
567 		XHatch aXHatch( aLbLineColor.GetSelectEntryColor(),
568 						(XHatchStyle) aLbLineType.GetSelectEntryPos(),
569 						GetCoreValue( aMtrDistance, ePoolUnit ),
570 						static_cast<long>(aMtrAngle.GetValue() * 10) );
571 		XHatchEntry* pEntry = new XHatchEntry( aXHatch, aName );
572 
573 		maHatchingList->Insert( pEntry, nCount );
574 
575 		aLbHatchings.Append( *pEntry, maHatchingList->GetUiBitmap( nCount ) );
576 
577 		aLbHatchings.SelectEntryPos( aLbHatchings.GetEntryCount() - 1 );
578 
579 #ifdef WNT
580 		// hack: #31355# W.P.
581 		Rectangle aRect( aLbHatchings.GetPosPixel(), aLbHatchings.GetSizePixel() );
582 		if( sal_True ) {				// ??? overlapped with pDlg
583 									// and srolling
584 			Invalidate( aRect );
585 			//aLbHatchings.Invalidate();
586 		}
587 #endif
588 
589 		// Flag fuer modifiziert setzen
590 		*pnHatchingListState |= CT_MODIFIED;
591 
592 		ChangeHatchHdl_Impl( this );
593 	}
594 
595 	// Status der Buttons ermitteln
596 	if( maHatchingList.get() && maHatchingList->Count() )
597 	{
598 		aBtnModify.Enable();
599 		aBtnDelete.Enable();
600 		aBtnSave.Enable();
601 	}
602 	return 0L;
603 }
604 
605 //------------------------------------------------------------------------
606 
IMPL_LINK(SvxHatchTabPage,ClickModifyHdl_Impl,void *,EMPTYARG)607 IMPL_LINK( SvxHatchTabPage, ClickModifyHdl_Impl, void *, EMPTYARG )
608 {
609 	sal_uInt16 nPos = aLbHatchings.GetSelectEntryPos();
610 
611 	if ( nPos != LISTBOX_ENTRY_NOTFOUND )
612 	{
613 		ResMgr& rMgr = CUI_MGR();
614 		String aNewName( SVX_RES( RID_SVXSTR_HATCH ) );
615 		String aDesc( CUI_RES( RID_SVXSTR_DESC_HATCH ) );
616         String aName( maHatchingList->GetHatch( nPos )->GetName() );
617 		String aOldName = aName;
618 
619 		SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
620 		DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
621 		AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
622 		DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
623 
624 		long nCount = maHatchingList.get() ? maHatchingList->Count() : 0;
625 		sal_Bool bDifferent = sal_False;
626 		sal_Bool bLoop = sal_True;
627 		while( bLoop && pDlg->Execute() == RET_OK )
628 		{
629 			pDlg->GetName( aName );
630 			bDifferent = sal_True;
631 
632 			for( long i = 0; i < nCount && bDifferent; i++ )
633 			{
634                 if( aName == maHatchingList->GetHatch( i )->GetName() &&
635 					aName != aOldName )
636 					bDifferent = sal_False;
637 			}
638 
639 			if( bDifferent )
640 			{
641 				bLoop = sal_False;
642 				XHatch aXHatch( aLbLineColor.GetSelectEntryColor(),
643 								(XHatchStyle) aLbLineType.GetSelectEntryPos(),
644 								 GetCoreValue( aMtrDistance, ePoolUnit ),
645 								static_cast<long>(aMtrAngle.GetValue() * 10) );
646 
647 				XHatchEntry* pEntry = new XHatchEntry( aXHatch, aName );
648 
649 				delete maHatchingList->Replace( pEntry, nPos );
650 
651 				aLbHatchings.Modify( *pEntry, nPos, maHatchingList->GetUiBitmap( nPos ) );
652 
653 				aLbHatchings.SelectEntryPos( nPos );
654 
655 				// Werte sichern fuer Changes-Erkennung ( -> Methode )
656 				aMtrDistance.SaveValue();
657 				aMtrAngle.SaveValue();
658 				aLbLineType.SaveValue();
659 				aLbLineColor.SaveValue();
660 				aLbHatchings.SaveValue();
661 
662 				// Flag fuer modifiziert setzen
663 				*pnHatchingListState |= CT_MODIFIED;
664 			}
665 			else
666 			{
667 				WarningBox aBox( DLGWIN, WinBits( WB_OK ),String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
668 				aBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
669 				aBox.Execute();
670 			}
671 		}
672 		delete( pDlg );
673 	}
674 	return 0L;
675 }
676 
677 //------------------------------------------------------------------------
678 
IMPL_LINK(SvxHatchTabPage,ClickDeleteHdl_Impl,void *,EMPTYARG)679 IMPL_LINK( SvxHatchTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG )
680 {
681 	sal_uInt16 nPos = aLbHatchings.GetSelectEntryPos();
682 
683 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
684 	{
685 		QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
686 			String( CUI_RES( RID_SVXSTR_ASK_DEL_HATCH ) ) );
687 
688 		if( aQueryBox.Execute() == RET_YES )
689 		{
690 			delete maHatchingList->Remove( nPos );
691 			aLbHatchings.RemoveEntry( nPos );
692 			aLbHatchings.SelectEntryPos( 0 );
693 
694 			aCtlPreview.Invalidate();
695 
696 			ChangeHatchHdl_Impl( this );
697 
698 			// Flag fuer modifiziert setzen
699 			*pnHatchingListState |= CT_MODIFIED;
700 		}
701 	}
702 	// Status der Buttons ermitteln
703 	if( !maHatchingList.get() || !maHatchingList->Count() )
704 	{
705 		aBtnModify.Disable();
706 		aBtnDelete.Disable();
707 		aBtnSave.Disable();
708 	}
709 	return 0L;
710 }
711 
712 // -----------------------------------------------------------------------
713 
IMPL_LINK(SvxHatchTabPage,ClickLoadHdl_Impl,void *,EMPTYARG)714 IMPL_LINK( SvxHatchTabPage, ClickLoadHdl_Impl, void *, EMPTYARG )
715 {
716 	ResMgr& rMgr = CUI_MGR();
717 	sal_uInt16 nReturn = RET_YES;
718 
719 	if ( *pnHatchingListState & CT_MODIFIED )
720 	{
721 		nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ),
722 			String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute();
723 
724 		if ( nReturn == RET_YES )
725 			maHatchingList->Save();
726 	}
727 
728 	if ( nReturn != RET_CANCEL )
729 	{
730     	::sfx2::FileDialogHelper aDlg(
731             com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
732             0 );
733 		String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.soh" ) );
734 		aDlg.AddFilter( aStrFilterType, aStrFilterType );
735 		INetURLObject aFile( SvtPathOptions().GetPalettePath() );
736 		aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
737 
738 		if( aDlg.Execute() == ERRCODE_NONE )
739 		{
740 			INetURLObject aURL( aDlg.GetPath() );
741 			INetURLObject aPathURL( aURL );
742 
743 			aPathURL.removeSegment();
744 			aPathURL.removeFinalSlash();
745 
746 			// Liste speichern
747 			XHatchListSharedPtr aHatchList(XPropertyListFactory::CreateSharedXHatchList(aPathURL.GetMainURL(INetURLObject::NO_DECODE)));
748 			aHatchList->SetName( aURL.getName() );
749 			if( aHatchList->Load() )
750 			{
751 				if( aHatchList.get() )
752 				{
753 					maHatchingList = aHatchList;
754 					( (SvxAreaTabDialog*) DLGWIN )->SetNewHatchingList( maHatchingList );
755 
756 					aLbHatchings.Clear();
757 					aLbHatchings.Fill( maHatchingList );
758 					Reset( rOutAttrs );
759 
760 					maHatchingList->SetName( aURL.getName() );
761 
762 					// Ermitteln (evtl. abschneiden) des Namens und in
763 					// der GroupBox darstellen
764 					String aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
765 					aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
766 
767 					if ( aURL.getBase().getLength() > 18 )
768 					{
769 						aString += String(aURL.getBase()).Copy( 0, 15 );
770 						aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
771 					}
772 					else
773 						aString += String(aURL.getBase());
774 
775 					// Flag fuer gewechselt setzen
776 					*pnHatchingListState |= CT_CHANGED;
777 					// Flag fuer modifiziert entfernen
778 					*pnHatchingListState &= ~CT_MODIFIED;
779 				}
780 			}
781 			else
782 				ErrorBox( DLGWIN, WinBits( WB_OK ),
783 					String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
784 		}
785 	}
786 
787 	// Status der Buttons ermitteln
788 	if ( maHatchingList.get() && maHatchingList->Count() )
789 	{
790 		aBtnModify.Enable();
791 		aBtnDelete.Enable();
792 		aBtnSave.Enable();
793 	}
794 	else
795 	{
796 		aBtnModify.Disable();
797 		aBtnDelete.Disable();
798 		aBtnSave.Disable();
799 	}
800 	return 0L;
801 }
802 
803 // -----------------------------------------------------------------------
804 
IMPL_LINK(SvxHatchTabPage,ClickSaveHdl_Impl,void *,EMPTYARG)805 IMPL_LINK( SvxHatchTabPage, ClickSaveHdl_Impl, void *, EMPTYARG )
806 {
807    	::sfx2::FileDialogHelper aDlg(
808         com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
809 	String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.soh" ) );
810 	aDlg.AddFilter( aStrFilterType, aStrFilterType );
811 
812 	INetURLObject aFile( SvtPathOptions().GetPalettePath() );
813 	DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
814 
815 	if( maHatchingList.get() && maHatchingList->GetName().Len() )
816 	{
817 		aFile.Append( maHatchingList->GetName() );
818 
819 		if( !aFile.getExtension().getLength() )
820 			aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "soh" ) ) );
821 	}
822 
823 	aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
824 	if ( aDlg.Execute() == ERRCODE_NONE )
825 	{
826 		INetURLObject aURL( aDlg.GetPath() );
827 		INetURLObject aPathURL( aURL );
828 
829 		aPathURL.removeSegment();
830 		aPathURL.removeFinalSlash();
831 
832 		maHatchingList->SetName( aURL.getName() );
833 		maHatchingList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
834 
835 		if( maHatchingList->Save() )
836 		{
837 			// Ermitteln (evtl. abschneiden) des Namens und in
838 			// der GroupBox darstellen
839 			String aString( CUI_RES( RID_SVXSTR_TABLE ) );
840 			aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
841 
842 			if ( aURL.getBase().getLength() > 18 )
843 			{
844 				aString += String(aURL.getBase()).Copy( 0, 15 );
845 				aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
846 			}
847 			else
848 				aString += String(aURL.getBase());
849 
850 			// Flag fuer gespeichert setzen
851 			*pnHatchingListState |= CT_SAVED;
852 			// Flag fuer modifiziert entfernen
853 			*pnHatchingListState &= ~CT_MODIFIED;
854 		}
855 		else
856 		{
857 			ErrorBox( DLGWIN, WinBits( WB_OK ),
858 				String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute();
859 		}
860 	}
861 
862 	return 0L;
863 }
864 
865 //------------------------------------------------------------------------
866 
PointChanged(Window * pWindow,RECT_POINT eRcPt)867 void SvxHatchTabPage::PointChanged( Window* pWindow, RECT_POINT eRcPt )
868 {
869 	if( pWindow == &aCtlAngle )
870 	{
871 		switch( eRcPt )
872 		{
873 			case RP_LT: aMtrAngle.SetValue( 135 ); break;
874 			case RP_MT: aMtrAngle.SetValue( 90 );  break;
875 			case RP_RT: aMtrAngle.SetValue( 45 );  break;
876 			case RP_LM: aMtrAngle.SetValue( 180 ); break;
877 			case RP_RM: aMtrAngle.SetValue( 0 );   break;
878 			case RP_LB: aMtrAngle.SetValue( 225 ); break;
879 			case RP_MB: aMtrAngle.SetValue( 270 ); break;
880 			case RP_RB: aMtrAngle.SetValue( 315 ); break;
881             case RP_MM: break;
882 		}
883 		ModifiedHdl_Impl( this );
884 	}
885 }
886 
887 
DataChanged(const DataChangedEvent & rDCEvt)888 void SvxHatchTabPage::DataChanged( const DataChangedEvent& rDCEvt )
889 {
890 	if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
891 		aCtlPreview.SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
892 
893 	SvxTabPage::DataChanged( rDCEvt );
894 }
895 
896