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/filedlghelper.hxx>
34 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
35
36 #define _SVX_TPLNEEND_CXX
37
38 #include <cuires.hrc>
39 #include "tabline.hrc"
40 #include "helpid.hrc"
41 #include <svx/dialmgr.hxx>
42 #include <svx/svdobj.hxx>
43 #include <svx/svdopath.hxx>
44 #include "svx/drawitem.hxx"
45 #include <svx/xpool.hxx>
46 #include <svx/xtable.hxx>
47 #include "cuitabline.hxx"
48 #include <svx/svxdlg.hxx> //CHINA001
49 #include <dialmgr.hxx>
50 #include "svx/dlgutil.hxx"
51 #include <basegfx/range/b2drange.hxx>
52 #include <basegfx/polygon/b2dpolygontools.hxx>
53 #include <basegfx/matrix/b2dhommatrix.hxx>
54 #include <basegfx/polygon/b2dpolygon.hxx>
55 #include <basegfx/polygon/b2dpolypolygontools.hxx>
56 #include <basegfx/matrix/b2dhommatrixtools.hxx>
57 #include <svx/dialogs.hrc>
58
59 #define DLGWIN this->GetParent()->GetParent()
60
61 #define BITMAP_WIDTH 32
62 #define BITMAP_HEIGHT 12
63 #define XOUT_WIDTH 150
64
65 /*************************************************************************
66 |*
67 |* Dialog zum Definieren von Linienenden-Stilen
68 |*
69 \************************************************************************/
70
SvxLineEndDefTabPage(Window * pParent,const SfxItemSet & rInAttrs)71 SvxLineEndDefTabPage::SvxLineEndDefTabPage
72 (
73 Window* pParent,
74 const SfxItemSet& rInAttrs
75 ) :
76
77 SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_LINEEND_DEF ), rInAttrs ),
78
79 aFlTip ( this, CUI_RES( FL_TIP ) ),
80 aFTTitle ( this, CUI_RES( FT_TITLE ) ),
81 aEdtName ( this, CUI_RES( EDT_NAME ) ),
82 aFTLineEndStyle ( this, CUI_RES( FT_LINE_END_STYLE ) ),
83 aLbLineEnds ( this, CUI_RES( LB_LINEENDS ) ),
84 aBtnAdd ( this, CUI_RES( BTN_ADD ) ),
85 aBtnModify ( this, CUI_RES( BTN_MODIFY ) ),
86 aBtnDelete ( this, CUI_RES( BTN_DELETE ) ),
87 aBtnLoad ( this, CUI_RES( BTN_LOAD ) ),
88 aBtnSave ( this, CUI_RES( BTN_SAVE ) ),
89 aFiTip ( this, CUI_RES( FI_TIP ) ),
90 aCtlPreview ( this, CUI_RES( CTL_PREVIEW ) ),
91
92 rOutAttrs ( rInAttrs ),
93 pPolyObj( NULL ),
94
95 pXPool ( (XOutdevItemPool*) rInAttrs.GetPool() ),
96 aXLStyle ( XLINE_SOLID ),
97 aXWidth ( XOUT_WIDTH ),
98 aXColor ( String(), COL_BLACK ),
99 aXLineAttr ( pXPool ),
100 rXLSet ( aXLineAttr.GetItemSet() ),
101 maLineEndList()
102 {
103 aBtnLoad.SetModeImage( Image( CUI_RES( RID_SVXIMG_LOAD_H ) ), BMP_COLOR_HIGHCONTRAST );
104 aBtnSave.SetModeImage( Image( CUI_RES( RID_SVXIMG_SAVE_H ) ), BMP_COLOR_HIGHCONTRAST );
105
106 FreeResource();
107
108 // diese Page braucht ExchangeSupport
109 SetExchangeSupport();
110
111 rXLSet.Put( aXLStyle );
112 rXLSet.Put( aXWidth );
113 rXLSet.Put( aXColor );
114 rXLSet.Put( XLineStartWidthItem( aCtlPreview.GetOutputSize().Height() / 2 ) );
115 rXLSet.Put( XLineEndWidthItem( aCtlPreview.GetOutputSize().Height() / 2 ) );
116
117 // #i34740#
118 aCtlPreview.SetLineAttributes(aXLineAttr.GetItemSet());
119
120 aBtnAdd.SetClickHdl(
121 LINK( this, SvxLineEndDefTabPage, ClickAddHdl_Impl ) );
122 aBtnModify.SetClickHdl(
123 LINK( this, SvxLineEndDefTabPage, ClickModifyHdl_Impl ) );
124 aBtnDelete.SetClickHdl(
125 LINK( this, SvxLineEndDefTabPage, ClickDeleteHdl_Impl ) );
126 aBtnLoad.SetClickHdl(
127 LINK( this, SvxLineEndDefTabPage, ClickLoadHdl_Impl ) );
128 aBtnSave.SetClickHdl(
129 LINK( this, SvxLineEndDefTabPage, ClickSaveHdl_Impl ) );
130
131 aLbLineEnds.SetSelectHdl(
132 LINK( this, SvxLineEndDefTabPage, SelectLineEndHdl_Impl ) );
133
134 aBtnAdd.SetAccessibleRelationMemberOf(&aFlTip);
135 aBtnModify.SetAccessibleRelationMemberOf(&aFlTip);
136 aBtnDelete.SetAccessibleRelationMemberOf(&aFlTip);
137 }
138
139 //------------------------------------------------------------------------
140
~SvxLineEndDefTabPage()141 SvxLineEndDefTabPage::~SvxLineEndDefTabPage()
142 {
143 }
144
145 // -----------------------------------------------------------------------
146
Construct()147 void SvxLineEndDefTabPage::Construct()
148 {
149 aLbLineEnds.Fill( maLineEndList );
150
151 bool bCreateArrowPossible = true;
152
153 if( !pPolyObj )
154 {
155 bCreateArrowPossible = false;
156 }
157 else if( !pPolyObj->ISA( SdrPathObj ) )
158 {
159 SdrObjTransformInfoRec aInfoRec;
160 pPolyObj->TakeObjInfo( aInfoRec );
161 SdrObject* pNewObj = 0;
162 if( aInfoRec.bCanConvToPath )
163 pNewObj = pPolyObj->ConvertToPolyObj( sal_True, sal_False );
164
165 bCreateArrowPossible = pNewObj && pNewObj->ISA( SdrPathObj );
166 SdrObject::Free( pNewObj );
167 }
168
169 if( !bCreateArrowPossible )
170 aBtnAdd.Disable();
171 }
172
173 // -----------------------------------------------------------------------
174
ActivatePage(const SfxItemSet &)175 void SvxLineEndDefTabPage::ActivatePage( const SfxItemSet& )
176 {
177 if( *pDlgType == 0 ) // Flaechen-Dialog
178 {
179 // ActivatePage() wird aufgerufen bevor der Dialog PageCreated() erhaelt !!!
180 if( maLineEndList.get() )
181 {
182 if( *pPosLineEndLb != LISTBOX_ENTRY_NOTFOUND )
183 {
184 aLbLineEnds.SelectEntryPos( *pPosLineEndLb );
185 SelectLineEndHdl_Impl( this );
186 }
187 INetURLObject aURL( maLineEndList->GetPath() );
188
189 aURL.Append( maLineEndList->GetName() );
190 DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
191 /* // Ermitteln (evtl. abschneiden) des Namens und in
192 // der GroupBox darstellen
193 String aString( CUI_RES( RID_SVXSTR_TABLE ) ); aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
194
195 if ( aURL.getBase().Len() > 18 )
196 {
197 aString += aURL.getBase().Copy( 0, 15 );
198 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
199 }
200 else
201 aString += aURL.getBase();
202
203 aGrpLineEnds.SetText( aString );
204 */
205 *pPageType = 0; // 3
206 *pPosLineEndLb = LISTBOX_ENTRY_NOTFOUND;
207 }
208 }
209 }
210
211 // -----------------------------------------------------------------------
212
DeactivatePage(SfxItemSet * _pSet)213 int SvxLineEndDefTabPage::DeactivatePage( SfxItemSet* _pSet )
214 {
215 CheckChanges_Impl();
216
217 if( _pSet )
218 FillItemSet( *_pSet );
219
220 return( LEAVE_PAGE );
221 }
222
223 // -----------------------------------------------------------------------
224
CheckChanges_Impl()225 void SvxLineEndDefTabPage::CheckChanges_Impl()
226 {
227 sal_uInt16 nPos = aLbLineEnds.GetSelectEntryPos();
228
229 if ( nPos != LISTBOX_ENTRY_NOTFOUND )
230 {
231 String aString = aEdtName.GetText();
232
233 if( aString != aLbLineEnds.GetSelectEntry() )
234 {
235 QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
236 CUI_RESSTR( RID_SVXSTR_ASK_CHANGE_LINEEND ) );
237
238 if ( aQueryBox.Execute() == RET_YES )
239 ClickModifyHdl_Impl( this );
240 }
241 }
242 nPos = aLbLineEnds.GetSelectEntryPos();
243
244 if ( nPos != LISTBOX_ENTRY_NOTFOUND )
245 *pPosLineEndLb = nPos;
246 }
247
248 // -----------------------------------------------------------------------
249
FillItemSet(SfxItemSet & rSet)250 sal_Bool SvxLineEndDefTabPage::FillItemSet( SfxItemSet& rSet )
251 {
252 if( *pDlgType == 0 ) // Linien-Dialog
253 {
254 if( *pPageType == 3 )
255 {
256 CheckChanges_Impl();
257
258 long nPos = aLbLineEnds.GetSelectEntryPos();
259 XLineEndEntry* pEntry = maLineEndList->GetLineEnd( nPos );
260
261 rSet.Put( XLineStartItem( pEntry->GetName(), pEntry->GetLineEnd() ) );
262 rSet.Put( XLineEndItem( pEntry->GetName(), pEntry->GetLineEnd() ) );
263 }
264 }
265 return( sal_True );
266 }
267
268 // -----------------------------------------------------------------------
269
Reset(const SfxItemSet &)270 void SvxLineEndDefTabPage::Reset( const SfxItemSet& )
271 {
272 aLbLineEnds.SelectEntryPos( 0 );
273
274 // Update lineend
275 if( maLineEndList.get() && maLineEndList->Count() > 0 )
276 {
277 int nPos = aLbLineEnds.GetSelectEntryPos();
278
279 XLineEndEntry* pEntry = maLineEndList->GetLineEnd( nPos );
280
281 aEdtName.SetText( aLbLineEnds.GetSelectEntry() );
282
283 rXLSet.Put( XLineStartItem( String(), pEntry->GetLineEnd() ) );
284 rXLSet.Put( XLineEndItem( String(), pEntry->GetLineEnd() ) );
285
286 // #i34740#
287 aCtlPreview.SetLineAttributes(aXLineAttr.GetItemSet());
288
289 aCtlPreview.Invalidate();
290 }
291
292 // Status der Buttons ermitteln
293 if( maLineEndList.get() && maLineEndList->Count() )
294 {
295 aBtnModify.Enable();
296 aBtnDelete.Enable();
297 aBtnSave.Enable();
298 }
299 else
300 {
301 aBtnModify.Disable();
302 aBtnDelete.Disable();
303 aBtnSave.Disable();
304 }
305 }
306
307 // -----------------------------------------------------------------------
308
Create(Window * pWindow,const SfxItemSet & rSet)309 SfxTabPage* SvxLineEndDefTabPage::Create( Window* pWindow,
310 const SfxItemSet& rSet )
311 {
312 return( new SvxLineEndDefTabPage( pWindow, rSet ) );
313 }
314
315 //------------------------------------------------------------------------
316
IMPL_LINK(SvxLineEndDefTabPage,SelectLineEndHdl_Impl,void *,EMPTYARG)317 IMPL_LINK( SvxLineEndDefTabPage, SelectLineEndHdl_Impl, void *, EMPTYARG )
318 {
319 if( maLineEndList.get() && maLineEndList->Count() > 0 )
320 {
321 int nPos = aLbLineEnds.GetSelectEntryPos();
322
323 XLineEndEntry* pEntry = maLineEndList->GetLineEnd( nPos );
324
325 aEdtName.SetText( aLbLineEnds.GetSelectEntry() );
326
327 rXLSet.Put( XLineStartItem( String(), pEntry->GetLineEnd() ) );
328 rXLSet.Put( XLineEndItem( String(), pEntry->GetLineEnd() ) );
329
330 // #i34740#
331 aCtlPreview.SetLineAttributes(aXLineAttr.GetItemSet());
332
333 aCtlPreview.Invalidate();
334
335 // Wird erst hier gesetzt, um den Style nur dann zu uebernehmen,
336 // wenn in der ListBox ein Eintrag ausgewaehlt wurde
337 *pPageType = 3;
338 }
339 return( 0L );
340 }
341
342 //------------------------------------------------------------------------
343
ChangePreviewHdl_Impl(void *)344 long SvxLineEndDefTabPage::ChangePreviewHdl_Impl( void* )
345 {
346 aCtlPreview.Invalidate();
347 return( 0L );
348 }
349
350 //------------------------------------------------------------------------
351
IMPL_LINK(SvxLineEndDefTabPage,ClickModifyHdl_Impl,void *,EMPTYARG)352 IMPL_LINK( SvxLineEndDefTabPage, ClickModifyHdl_Impl, void *, EMPTYARG )
353 {
354 sal_uInt16 nPos = aLbLineEnds.GetSelectEntryPos();
355
356 if( nPos != LISTBOX_ENTRY_NOTFOUND )
357 {
358 ResMgr& rMgr = CUI_MGR();
359 String aDesc( ResId( RID_SVXSTR_DESC_LINEEND, rMgr ) );
360 String aName( aEdtName.GetText() );
361 long nCount = maLineEndList.get() ? maLineEndList->Count() : 0;
362 sal_Bool bDifferent = sal_True;
363
364 // Pruefen, ob Name schon vorhanden ist
365 for ( long i = 0; i < nCount && bDifferent; i++ )
366 if ( aName == maLineEndList->GetLineEnd( i )->GetName() )
367 bDifferent = sal_False;
368
369 // Wenn ja, wird wiederholt ein neuer Name angefordert
370 if ( !bDifferent )
371 {
372 WarningBox aWarningBox( DLGWIN, WinBits( WB_OK ),
373 String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
374 aWarningBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
375 aWarningBox.Execute();
376
377 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
378 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
379 AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
380 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
381 sal_Bool bLoop = sal_True;
382
383 while( !bDifferent && bLoop && pDlg->Execute() == RET_OK )
384 {
385 pDlg->GetName( aName );
386 bDifferent = sal_True;
387
388 for( long i = 0; i < nCount && bDifferent; i++ )
389 {
390 if( aName == maLineEndList->GetLineEnd( i )->GetName() )
391 bDifferent = sal_False;
392 }
393
394 if( bDifferent )
395 bLoop = sal_False;
396 else
397 aWarningBox.Execute();
398 }
399 delete( pDlg );
400 }
401
402 // Wenn nicht vorhanden, wird Eintrag aufgenommen
403 if( bDifferent )
404 {
405 const XLineEndEntry* pOldEntry = maLineEndList->GetLineEnd( nPos );
406
407 if(pOldEntry)
408 {
409 // #123497# Need to replace the existing entry with a new one (old returned needs to be deleted)
410 XLineEndEntry* pEntry = new XLineEndEntry(pOldEntry->GetLineEnd(), aName);
411 delete maLineEndList->Replace(pEntry, nPos);
412
413 aEdtName.SetText( aName );
414
415 aLbLineEnds.Modify( *pEntry, nPos, maLineEndList->GetUiBitmap( nPos ) );
416 aLbLineEnds.SelectEntryPos( nPos );
417
418 // Flag fuer modifiziert setzen
419 *pnLineEndListState |= CT_MODIFIED;
420
421 *pPageType = 3;
422 }
423 else
424 {
425 OSL_ENSURE(false, "LineEnd to be modified not existing (!)");
426 }
427 }
428 }
429 return( 0L );
430 }
431
432 //------------------------------------------------------------------------
433
IMPL_LINK(SvxLineEndDefTabPage,ClickAddHdl_Impl,void *,EMPTYARG)434 IMPL_LINK( SvxLineEndDefTabPage, ClickAddHdl_Impl, void *, EMPTYARG )
435 {
436 if( pPolyObj )
437 {
438 const SdrObject* pNewObj;
439 SdrObject* pConvPolyObj = NULL;
440
441 if( pPolyObj->ISA( SdrPathObj ) )
442 {
443 pNewObj = pPolyObj;
444 }
445 else
446 {
447 SdrObjTransformInfoRec aInfoRec;
448 pPolyObj->TakeObjInfo( aInfoRec );
449
450 if( aInfoRec.bCanConvToPath )
451 {
452 pNewObj = pConvPolyObj = pPolyObj->ConvertToPolyObj( sal_True, sal_False );
453
454 if( !pNewObj || !pNewObj->ISA( SdrPathObj ) )
455 return( 0L ); // Abbruch, zusaetzliche Sicherheit, die bei
456 // Gruppenobjekten aber nichts bringt.
457 }
458 else return( 0L ); // Abbruch
459 }
460
461 basegfx::B2DPolyPolygon aNewPolyPolygon(((SdrPathObj*)pNewObj)->GetPathPoly());
462 basegfx::B2DRange aNewRange(basegfx::tools::getRange(aNewPolyPolygon));
463
464 // Normalisieren
465 aNewPolyPolygon.transform(basegfx::tools::createTranslateB2DHomMatrix(
466 -aNewRange.getMinX(), -aNewRange.getMinY()));
467
468 // Loeschen des angelegten PolyObjektes
469 SdrObject::Free( pConvPolyObj );
470
471 XLineEndEntry* pEntry;
472
473 ResMgr& rMgr = CUI_MGR();
474 String aNewName( SVX_RES( RID_SVXSTR_LINEEND ) );
475 String aDesc( ResId( RID_SVXSTR_DESC_LINEEND, rMgr ) );
476 String aName;
477
478 long nCount = maLineEndList.get() ? maLineEndList->Count() : 0;
479 long j = 1;
480 sal_Bool bDifferent = sal_False;
481
482 while ( !bDifferent )
483 {
484 aName = aNewName;
485 aName += sal_Unicode(' ');
486 aName += UniString::CreateFromInt32( j++ );
487 bDifferent = sal_True;
488
489 for( long i = 0; i < nCount && bDifferent; i++ )
490 if ( aName == maLineEndList->GetLineEnd( i )->GetName() )
491 bDifferent = sal_False;
492 }
493
494 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
495 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
496 AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
497 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
498 sal_Bool bLoop = sal_True;
499
500 while ( bLoop && pDlg->Execute() == RET_OK )
501 {
502 pDlg->GetName( aName );
503 bDifferent = sal_True;
504
505 for( long i = 0; i < nCount && bDifferent; i++ )
506 {
507 if( aName == maLineEndList->GetLineEnd( i )->GetName() )
508 bDifferent = sal_False;
509 }
510
511 if( bDifferent )
512 {
513 bLoop = sal_False;
514 pEntry = new XLineEndEntry( aNewPolyPolygon, aName );
515
516 long nLineEndCount = maLineEndList.get() ? maLineEndList->Count() : 0;
517 maLineEndList->Insert( pEntry, nLineEndCount );
518
519 // Zur ListBox hinzufuegen
520 aLbLineEnds.Append( *pEntry, maLineEndList->GetUiBitmap( nLineEndCount ) );
521 aLbLineEnds.SelectEntryPos( aLbLineEnds.GetEntryCount() - 1 );
522
523 // Flag fuer modifiziert setzen
524 *pnLineEndListState |= CT_MODIFIED;
525
526 SelectLineEndHdl_Impl( this );
527 }
528 else
529 {
530 WarningBox aBox( DLGWIN, WinBits( WB_OK ),String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
531 aBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
532 aBox.Execute();
533 }
534 }
535 delete pDlg;
536 }
537 else
538 aBtnAdd.Disable();
539
540 // Status der Buttons ermitteln
541 if ( maLineEndList.get() && maLineEndList->Count() )
542 {
543 aBtnModify.Enable();
544 aBtnDelete.Enable();
545 aBtnSave.Enable();
546 }
547 return( 0L );
548 }
549
550 //------------------------------------------------------------------------
551
IMPL_LINK(SvxLineEndDefTabPage,ClickDeleteHdl_Impl,void *,EMPTYARG)552 IMPL_LINK( SvxLineEndDefTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG )
553 {
554 sal_uInt16 nPos = aLbLineEnds.GetSelectEntryPos();
555
556 if( nPos != LISTBOX_ENTRY_NOTFOUND )
557 {
558 QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
559 String( CUI_RES( RID_SVXSTR_ASK_DEL_LINEEND ) ) );
560
561 if ( aQueryBox.Execute() == RET_YES )
562 {
563 delete maLineEndList->Remove( nPos );
564 aLbLineEnds.RemoveEntry( nPos );
565 aLbLineEnds.SelectEntryPos( 0 );
566
567 SelectLineEndHdl_Impl( this );
568 *pPageType = 0; // LineEnd soll nicht uebernommen werden
569
570 // Flag fuer modifiziert setzen
571 *pnLineEndListState |= CT_MODIFIED;
572
573 ChangePreviewHdl_Impl( this );
574 }
575 }
576 // Status der Buttons ermitteln
577 if( !maLineEndList.get() || !maLineEndList->Count() )
578 {
579 aBtnModify.Disable();
580 aBtnDelete.Disable();
581 aBtnSave.Disable();
582 }
583 return( 0L );
584 }
585
586 //------------------------------------------------------------------------
587
IMPL_LINK(SvxLineEndDefTabPage,ClickLoadHdl_Impl,void *,EMPTYARG)588 IMPL_LINK( SvxLineEndDefTabPage, ClickLoadHdl_Impl, void *, EMPTYARG )
589 {
590 ResMgr& rMgr = CUI_MGR();
591 sal_uInt16 nReturn = RET_YES;
592
593 if ( *pnLineEndListState & CT_MODIFIED )
594 {
595 nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ),
596 String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute();
597
598 if ( nReturn == RET_YES )
599 maLineEndList->Save();
600 }
601
602 if ( nReturn != RET_CANCEL )
603 {
604 ::sfx2::FileDialogHelper aDlg(
605 com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
606 0 );
607 String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.soe" ) );
608 aDlg.AddFilter( aStrFilterType, aStrFilterType );
609 INetURLObject aFile( SvtPathOptions().GetPalettePath() );
610 aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
611
612 if( aDlg.Execute() == ERRCODE_NONE )
613 {
614 INetURLObject aURL( aDlg.GetPath() );
615 INetURLObject aPathURL( aURL );
616
617 aPathURL.removeSegment();
618 aPathURL.removeFinalSlash();
619
620 // Liste speichern
621 XLineEndListSharedPtr aLeList(XPropertyListFactory::CreateSharedXLineEndList(aPathURL.GetMainURL(INetURLObject::NO_DECODE)));
622 aLeList->SetName( aURL.getName() );
623 if( aLeList->Load() )
624 {
625 if( aLeList.get() )
626 {
627 maLineEndList = aLeList;
628 ( (SvxLineTabDialog*) DLGWIN )->SetNewLineEndList( maLineEndList );
629 aLbLineEnds.Clear();
630 aLbLineEnds.Fill( maLineEndList );
631 Reset( rOutAttrs );
632
633 maLineEndList->SetName( aURL.getName() );
634
635 /* // Ermitteln (evtl. abschneiden) des Namens und in
636 // der GroupBox darstellen
637 String aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
638 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
639 if( aURL.getBase().Len() > 18 )
640 {
641 aString += aURL.getBase().Copy( 0, 15 );
642 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
643 }
644 else
645 aString += aURL.getBase();
646
647 aGrpLineEnds.SetText( aString );
648 */
649 // Flag fuer gewechselt setzen
650 *pnLineEndListState |= CT_CHANGED;
651 // Flag fuer modifiziert entfernen
652 *pnLineEndListState &= ~CT_MODIFIED;
653 }
654 }
655 else
656 ErrorBox( DLGWIN, WinBits( WB_OK ),
657 String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
658 }
659 }
660
661 // Status der Buttons ermitteln
662 if ( maLineEndList.get() && maLineEndList->Count() )
663 {
664 aBtnModify.Enable();
665 aBtnDelete.Enable();
666 aBtnSave.Enable();
667 }
668 else
669 {
670 aBtnModify.Disable();
671 aBtnDelete.Disable();
672 aBtnSave.Disable();
673 }
674 return( 0L );
675 }
676
677 //------------------------------------------------------------------------
678
IMPL_LINK(SvxLineEndDefTabPage,ClickSaveHdl_Impl,void *,EMPTYARG)679 IMPL_LINK( SvxLineEndDefTabPage, ClickSaveHdl_Impl, void *, EMPTYARG )
680 {
681 ::sfx2::FileDialogHelper aDlg(
682 com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
683 String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.soe" ) );
684 aDlg.AddFilter( aStrFilterType, aStrFilterType );
685
686 INetURLObject aFile( SvtPathOptions().GetPalettePath() );
687 DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
688
689 if( maLineEndList.get() && maLineEndList->GetName().Len() )
690 {
691 aFile.Append( maLineEndList->GetName() );
692
693 if( !aFile.getExtension().getLength() )
694 aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "soe" ) ) );
695 }
696
697 aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
698 if ( aDlg.Execute() == ERRCODE_NONE )
699 {
700 INetURLObject aURL( aDlg.GetPath() );
701 INetURLObject aPathURL( aURL );
702
703 aPathURL.removeSegment();
704 aPathURL.removeFinalSlash();
705
706 maLineEndList->SetName( aURL.getName() );
707 maLineEndList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
708
709 if( maLineEndList->Save() )
710 {
711 /* // Ermitteln (evtl. abschneiden) des Namens und in
712 // der GroupBox darstellen
713 String aString( CUI_RES( RID_SVXSTR_TABLE ) );
714 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
715
716 if ( aURL.getBase().Len() > 18 )
717 {
718 aString += aURL.getBase().Copy( 0, 15 );
719 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
720 }
721 else
722 aString += aURL.getBase();
723 aGrpLineEnds.SetText( aString );
724 */
725 // Flag fuer gespeichert setzen
726 *pnLineEndListState |= CT_SAVED;
727 // Flag fuer modifiziert entfernen
728 *pnLineEndListState &= ~CT_MODIFIED;
729 }
730 else
731 {
732 ErrorBox( DLGWIN, WinBits( WB_OK ),
733 String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute();
734 }
735 }
736 return( 0L );
737 }
738
DataChanged(const DataChangedEvent & rDCEvt)739 void SvxLineEndDefTabPage::DataChanged( const DataChangedEvent& rDCEvt )
740 {
741 SfxTabPage::DataChanged( rDCEvt );
742
743 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
744 {
745 sal_uInt16 nOldSelect = aLbLineEnds.GetSelectEntryPos();
746 aLbLineEnds.Clear();
747 aLbLineEnds.Fill( maLineEndList );
748 aLbLineEnds.SelectEntryPos( nOldSelect );
749 }
750 }
751
752