Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <tools/urlobj.hxx>
21 : #include <vcl/msgbox.hxx>
22 : #include <vcl/settings.hxx>
23 : #include <unotools/pathoptions.hxx>
24 : #include <sfx2/app.hxx>
25 : #include <sfx2/filedlghelper.hxx>
26 : #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
27 :
28 : #include <cuires.hrc>
29 : #include "helpid.hrc"
30 : #include <svx/dialmgr.hxx>
31 : #include <svx/svdobj.hxx>
32 : #include <svx/svdopath.hxx>
33 : #include "svx/drawitem.hxx"
34 : #include <svx/xpool.hxx>
35 : #include <svx/xtable.hxx>
36 : #include "cuitabline.hxx"
37 : #include <svx/svxdlg.hxx>
38 : #include <dialmgr.hxx>
39 : #include "svx/dlgutil.hxx"
40 : #include <basegfx/range/b2drange.hxx>
41 : #include <basegfx/polygon/b2dpolygontools.hxx>
42 : #include <basegfx/matrix/b2dhommatrix.hxx>
43 : #include <basegfx/polygon/b2dpolygon.hxx>
44 : #include <basegfx/polygon/b2dpolypolygontools.hxx>
45 : #include <basegfx/matrix/b2dhommatrixtools.hxx>
46 : #include <svx/dialogs.hrc>
47 : #include <boost/scoped_ptr.hpp>
48 :
49 : #define XOUT_WIDTH 150
50 :
51 0 : SvxLineEndDefTabPage::SvxLineEndDefTabPage
52 : (
53 : vcl::Window* pParent,
54 : const SfxItemSet& rInAttrs
55 : ) :
56 :
57 : SfxTabPage( pParent
58 : , "LineEndPage"
59 : , "cui/ui/lineendstabpage.ui"
60 : , &rInAttrs ),
61 : rOutAttrs ( rInAttrs ),
62 : pPolyObj ( NULL ),
63 : bObjSelected ( false ),
64 :
65 0 : pXPool ( static_cast<XOutdevItemPool*>(rInAttrs.GetPool()) ),
66 : aXLStyle ( com::sun::star::drawing::LineStyle_SOLID ),
67 : aXWidth ( XOUT_WIDTH ),
68 : aXColor ( OUString(), COL_BLACK ),
69 : aXLineAttr ( pXPool ),
70 0 : rXLSet ( aXLineAttr.GetItemSet() ),
71 : pLineEndList ( NULL ),
72 : pnLineEndListState ( NULL ),
73 : pPageType ( NULL ),
74 : nDlgType ( 0 ),
75 0 : pPosLineEndLb ( NULL )
76 : {
77 0 : get(m_pEdtName,"EDT_NAME");
78 0 : get(m_pLbLineEnds,"LB_LINEENDS");
79 0 : get(m_pBtnAdd,"BTN_ADD");
80 0 : get(m_pBtnModify,"BTN_MODIFY");
81 0 : get(m_pBtnDelete,"BTN_DELETE");
82 0 : get(m_pBtnLoad,"BTN_LOAD");
83 0 : get(m_pBtnSave,"BTN_SAVE");
84 0 : get(m_pCtlPreview,"CTL_PREVIEW");
85 :
86 : // this page needs ExchangeSupport
87 0 : SetExchangeSupport();
88 :
89 0 : rXLSet.Put( aXLStyle );
90 0 : rXLSet.Put( aXWidth );
91 0 : rXLSet.Put( aXColor );
92 0 : rXLSet.Put( XLineStartWidthItem( m_pCtlPreview->GetOutputSize().Height() / 2 ) );
93 0 : rXLSet.Put( XLineEndWidthItem( m_pCtlPreview->GetOutputSize().Height() / 2 ) );
94 :
95 : // #i34740#
96 0 : m_pCtlPreview->SetLineAttributes(aXLineAttr.GetItemSet());
97 :
98 0 : m_pBtnAdd->SetClickHdl( LINK( this, SvxLineEndDefTabPage, ClickAddHdl_Impl ) );
99 0 : m_pBtnModify->SetClickHdl( LINK( this, SvxLineEndDefTabPage, ClickModifyHdl_Impl ) );
100 0 : m_pBtnDelete->SetClickHdl( LINK( this, SvxLineEndDefTabPage, ClickDeleteHdl_Impl ) );
101 0 : m_pBtnLoad->SetClickHdl( LINK( this, SvxLineEndDefTabPage, ClickLoadHdl_Impl ) );
102 0 : m_pBtnSave->SetClickHdl( LINK( this, SvxLineEndDefTabPage, ClickSaveHdl_Impl ) );
103 :
104 0 : m_pLbLineEnds->SetSelectHdl( LINK( this, SvxLineEndDefTabPage, SelectLineEndHdl_Impl ) );
105 :
106 0 : }
107 :
108 0 : SvxLineEndDefTabPage::~SvxLineEndDefTabPage()
109 : {
110 0 : disposeOnce();
111 0 : }
112 :
113 0 : void SvxLineEndDefTabPage::dispose()
114 : {
115 0 : m_pEdtName.clear();
116 0 : m_pLbLineEnds.clear();
117 0 : m_pBtnAdd.clear();
118 0 : m_pBtnModify.clear();
119 0 : m_pBtnDelete.clear();
120 0 : m_pBtnLoad.clear();
121 0 : m_pBtnSave.clear();
122 0 : m_pCtlPreview.clear();
123 0 : SfxTabPage::dispose();
124 0 : }
125 :
126 0 : void SvxLineEndDefTabPage::Resize()
127 : {
128 0 : rXLSet.Put(XLineStartWidthItem(m_pCtlPreview->GetOutputSize().Height() / 2 ));
129 0 : rXLSet.Put(XLineEndWidthItem(m_pCtlPreview->GetOutputSize().Height() / 2 ));
130 0 : SfxTabPage::Resize();
131 0 : }
132 :
133 :
134 :
135 0 : void SvxLineEndDefTabPage::Construct()
136 : {
137 0 : m_pLbLineEnds->Fill( pLineEndList );
138 :
139 0 : bool bCreateArrowPossible = true;
140 :
141 0 : if( !pPolyObj )
142 : {
143 0 : bCreateArrowPossible = false;
144 : }
145 0 : else if( !pPolyObj->ISA( SdrPathObj ) )
146 : {
147 0 : SdrObjTransformInfoRec aInfoRec;
148 0 : pPolyObj->TakeObjInfo( aInfoRec );
149 0 : SdrObject* pNewObj = 0;
150 0 : if( aInfoRec.bCanConvToPath )
151 0 : pNewObj = pPolyObj->ConvertToPolyObj( true, false );
152 :
153 0 : bCreateArrowPossible = pNewObj && pNewObj->ISA( SdrPathObj );
154 0 : SdrObject::Free( pNewObj );
155 : }
156 :
157 0 : if( !bCreateArrowPossible )
158 0 : m_pBtnAdd->Disable();
159 0 : }
160 :
161 :
162 :
163 0 : void SvxLineEndDefTabPage::ActivatePage( const SfxItemSet& )
164 : {
165 0 : if( nDlgType == 0 ) // area dialog
166 : {
167 : // ActivatePage() is called before the dialog receives PageCreated() !!!
168 0 : if( pLineEndList.is() )
169 : {
170 0 : if( *pPosLineEndLb != LISTBOX_ENTRY_NOTFOUND )
171 : {
172 0 : m_pLbLineEnds->SelectEntryPos( *pPosLineEndLb );
173 0 : SelectLineEndHdl_Impl( this );
174 : }
175 0 : INetURLObject aURL( pLineEndList->GetPath() );
176 :
177 0 : aURL.Append( pLineEndList->GetName() );
178 : DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
179 0 : *pPageType = 0; // 3
180 0 : *pPosLineEndLb = LISTBOX_ENTRY_NOTFOUND;
181 : }
182 : }
183 0 : }
184 :
185 :
186 :
187 0 : SfxTabPage::sfxpg SvxLineEndDefTabPage::DeactivatePage( SfxItemSet* _pSet )
188 : {
189 0 : CheckChanges_Impl();
190 :
191 0 : if( _pSet )
192 0 : FillItemSet( _pSet );
193 :
194 0 : return LEAVE_PAGE;
195 : }
196 :
197 :
198 :
199 0 : void SvxLineEndDefTabPage::CheckChanges_Impl()
200 : {
201 0 : sal_Int32 nPos = m_pLbLineEnds->GetSelectEntryPos();
202 :
203 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND )
204 : {
205 0 : OUString aString = m_pEdtName->GetText();
206 :
207 0 : if( aString != m_pLbLineEnds->GetSelectEntry() )
208 : {
209 0 : ScopedVclPtrInstance<MessageDialog> aQueryBox( GetParentDialog()
210 : ,"AskChangeLineEndDialog"
211 0 : ,"cui/ui/querychangelineenddialog.ui" );
212 0 : if ( aQueryBox->Execute() == RET_YES )
213 0 : ClickModifyHdl_Impl( this );
214 0 : }
215 : }
216 0 : nPos = m_pLbLineEnds->GetSelectEntryPos();
217 :
218 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND )
219 0 : *pPosLineEndLb = nPos;
220 0 : }
221 :
222 :
223 :
224 0 : bool SvxLineEndDefTabPage::FillItemSet( SfxItemSet* rSet )
225 : {
226 0 : if( nDlgType == 0 ) // line dialog
227 : {
228 0 : if( *pPageType == 3 )
229 : {
230 0 : CheckChanges_Impl();
231 :
232 0 : long nPos = m_pLbLineEnds->GetSelectEntryPos();
233 0 : XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nPos );
234 :
235 0 : rSet->Put( XLineStartItem( pEntry->GetName(), pEntry->GetLineEnd() ) );
236 0 : rSet->Put( XLineEndItem( pEntry->GetName(), pEntry->GetLineEnd() ) );
237 : }
238 : }
239 0 : return true;
240 : }
241 :
242 :
243 :
244 0 : void SvxLineEndDefTabPage::Reset( const SfxItemSet* )
245 : {
246 0 : m_pLbLineEnds->SelectEntryPos( 0 );
247 :
248 : // Update lineend
249 0 : if( pLineEndList->Count() > 0 )
250 : {
251 0 : int nPos = m_pLbLineEnds->GetSelectEntryPos();
252 :
253 0 : XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nPos );
254 :
255 0 : m_pEdtName->SetText( m_pLbLineEnds->GetSelectEntry() );
256 :
257 0 : rXLSet.Put( XLineStartItem( OUString(), pEntry->GetLineEnd() ) );
258 0 : rXLSet.Put( XLineEndItem( OUString(), pEntry->GetLineEnd() ) );
259 :
260 : // #i34740#
261 0 : m_pCtlPreview->SetLineAttributes(aXLineAttr.GetItemSet());
262 :
263 0 : m_pCtlPreview->Invalidate();
264 : }
265 :
266 : // determine button state
267 0 : if( pLineEndList->Count() )
268 : {
269 0 : m_pBtnModify->Enable();
270 0 : m_pBtnDelete->Enable();
271 0 : m_pBtnSave->Enable();
272 : }
273 : else
274 : {
275 0 : m_pBtnModify->Disable();
276 0 : m_pBtnDelete->Disable();
277 0 : m_pBtnSave->Disable();
278 : }
279 0 : }
280 :
281 :
282 :
283 0 : VclPtr<SfxTabPage> SvxLineEndDefTabPage::Create( vcl::Window* pWindow, const SfxItemSet* rSet )
284 : {
285 0 : return VclPtr<SvxLineEndDefTabPage>::Create( pWindow, *rSet );
286 : }
287 :
288 :
289 :
290 0 : IMPL_LINK_NOARG(SvxLineEndDefTabPage, SelectLineEndHdl_Impl)
291 : {
292 0 : if( pLineEndList->Count() > 0 )
293 : {
294 0 : int nPos = m_pLbLineEnds->GetSelectEntryPos();
295 :
296 0 : XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nPos );
297 :
298 0 : m_pEdtName->SetText( m_pLbLineEnds->GetSelectEntry() );
299 :
300 0 : rXLSet.Put( XLineStartItem( OUString(), pEntry->GetLineEnd() ) );
301 0 : rXLSet.Put( XLineEndItem( OUString(), pEntry->GetLineEnd() ) );
302 :
303 : // #i34740#
304 0 : m_pCtlPreview->SetLineAttributes(aXLineAttr.GetItemSet());
305 :
306 0 : m_pCtlPreview->Invalidate();
307 :
308 : // Is not set before, in order to only take the new style,
309 : // if there is an entry selected in the ListBox
310 0 : *pPageType = 3;
311 : }
312 0 : return 0L;
313 : }
314 :
315 :
316 :
317 0 : long SvxLineEndDefTabPage::ChangePreviewHdl_Impl( void* )
318 : {
319 0 : m_pCtlPreview->Invalidate();
320 0 : return 0L;
321 : }
322 :
323 :
324 :
325 0 : IMPL_LINK_NOARG(SvxLineEndDefTabPage, ClickModifyHdl_Impl)
326 : {
327 0 : sal_Int32 nPos = m_pLbLineEnds->GetSelectEntryPos();
328 :
329 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
330 : {
331 0 : ResMgr& rMgr = CUI_MGR();
332 0 : OUString aDesc( ResId( RID_SVXSTR_DESC_LINEEND, rMgr ) );
333 0 : OUString aName( m_pEdtName->GetText() );
334 0 : long nCount = pLineEndList->Count();
335 0 : bool bDifferent = true;
336 :
337 : // check whether the name is existing already
338 0 : for ( long i = 0; i < nCount && bDifferent; i++ )
339 0 : if ( aName == pLineEndList->GetLineEnd( i )->GetName() )
340 0 : bDifferent = false;
341 :
342 : // if yes, repeat and demand a new name
343 0 : if ( !bDifferent )
344 : {
345 0 : ScopedVclPtrInstance<MessageDialog> aWarningBox( GetParentDialog()
346 : ,"DuplicateNameDialog"
347 0 : ,"cui/ui/queryduplicatedialog.ui" );
348 0 : aWarningBox->Execute();
349 :
350 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
351 : DBG_ASSERT(pFact, "Dialog creation failed!");
352 0 : boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
353 : DBG_ASSERT(pDlg, "Dialog creation failed!");
354 0 : bool bLoop = true;
355 :
356 0 : while( !bDifferent && bLoop && pDlg->Execute() == RET_OK )
357 : {
358 0 : pDlg->GetName( aName );
359 0 : bDifferent = true;
360 :
361 0 : for( long i = 0; i < nCount && bDifferent; i++ )
362 : {
363 0 : if( aName == pLineEndList->GetLineEnd( i )->GetName() )
364 0 : bDifferent = false;
365 : }
366 :
367 0 : if( bDifferent )
368 0 : bLoop = false;
369 : else
370 0 : aWarningBox->Execute();
371 0 : }
372 : }
373 :
374 : // if not existing, enter the entry
375 0 : if( bDifferent )
376 : {
377 0 : const XLineEndEntry* pOldEntry = pLineEndList->GetLineEnd( nPos );
378 :
379 0 : if(pOldEntry)
380 : {
381 : // #123497# Need to replace the existing entry with a new one (old returned needs to be deleted)
382 0 : XLineEndEntry* pEntry = new XLineEndEntry(pOldEntry->GetLineEnd(), aName);
383 0 : delete pLineEndList->Replace(pEntry, nPos);
384 :
385 0 : m_pEdtName->SetText( aName );
386 :
387 0 : m_pLbLineEnds->Modify( *pEntry, nPos, pLineEndList->GetUiBitmap( nPos ) );
388 0 : m_pLbLineEnds->SelectEntryPos( nPos );
389 :
390 : // Flag fuer modifiziert setzen
391 0 : *pnLineEndListState |= ChangeType::MODIFIED;
392 :
393 0 : *pPageType = 3;
394 : }
395 : else
396 : {
397 : OSL_ENSURE(false, "LineEnd to be modified not existing (!)");
398 : }
399 0 : }
400 : }
401 0 : return 0L;
402 : }
403 :
404 :
405 :
406 0 : IMPL_LINK_NOARG(SvxLineEndDefTabPage, ClickAddHdl_Impl)
407 : {
408 0 : if( pPolyObj )
409 : {
410 : const SdrObject* pNewObj;
411 0 : SdrObject* pConvPolyObj = NULL;
412 :
413 0 : if( pPolyObj->ISA( SdrPathObj ) )
414 : {
415 0 : pNewObj = pPolyObj;
416 : }
417 : else
418 : {
419 0 : SdrObjTransformInfoRec aInfoRec;
420 0 : pPolyObj->TakeObjInfo( aInfoRec );
421 :
422 0 : if( aInfoRec.bCanConvToPath )
423 : {
424 0 : pNewObj = pConvPolyObj = pPolyObj->ConvertToPolyObj( true, false );
425 :
426 0 : if( !pNewObj || !pNewObj->ISA( SdrPathObj ) )
427 0 : return 0L; // cancel, additional safety, which
428 : // has no use for group objects though.
429 : }
430 0 : else return 0L; // cancel
431 : }
432 :
433 0 : basegfx::B2DPolyPolygon aNewPolyPolygon(static_cast<const SdrPathObj*>(pNewObj)->GetPathPoly());
434 0 : basegfx::B2DRange aNewRange(basegfx::tools::getRange(aNewPolyPolygon));
435 :
436 : // normalize
437 0 : aNewPolyPolygon.transform(basegfx::tools::createTranslateB2DHomMatrix( -aNewRange.getMinX(), -aNewRange.getMinY()));
438 :
439 0 : SdrObject::Free( pConvPolyObj );
440 :
441 : XLineEndEntry* pEntry;
442 :
443 0 : ResMgr& rMgr = CUI_MGR();
444 0 : OUString aNewName( SVX_RES( RID_SVXSTR_LINEEND ) );
445 0 : OUString aDesc( ResId( RID_SVXSTR_DESC_LINEEND, rMgr ) );
446 0 : OUString aName;
447 :
448 0 : long nCount = pLineEndList->Count();
449 0 : long j = 1;
450 0 : bool bDifferent = false;
451 :
452 0 : while ( !bDifferent )
453 : {
454 0 : aName = aNewName;
455 0 : aName += " ";
456 0 : aName += OUString::number( j++ );
457 0 : bDifferent = true;
458 :
459 0 : for( long i = 0; i < nCount && bDifferent; i++ )
460 0 : if ( aName == pLineEndList->GetLineEnd( i )->GetName() )
461 0 : bDifferent = false;
462 : }
463 :
464 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
465 : DBG_ASSERT(pFact, "Dialog creation failed!");
466 0 : boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
467 : DBG_ASSERT(pDlg, "Dialog creation failed!");
468 0 : bool bLoop = true;
469 :
470 0 : while ( bLoop && pDlg->Execute() == RET_OK )
471 : {
472 0 : pDlg->GetName( aName );
473 0 : bDifferent = true;
474 :
475 0 : for( long i = 0; i < nCount && bDifferent; i++ )
476 : {
477 0 : if( aName == pLineEndList->GetLineEnd( i )->GetName() )
478 0 : bDifferent = false;
479 : }
480 :
481 0 : if( bDifferent )
482 : {
483 0 : bLoop = false;
484 0 : pEntry = new XLineEndEntry( aNewPolyPolygon, aName );
485 :
486 0 : long nLineEndCount = pLineEndList->Count();
487 0 : pLineEndList->Insert( pEntry, nLineEndCount );
488 :
489 : // add to the ListBox
490 0 : m_pLbLineEnds->Append( *pEntry, pLineEndList->GetUiBitmap( nLineEndCount ) );
491 0 : m_pLbLineEnds->SelectEntryPos( m_pLbLineEnds->GetEntryCount() - 1 );
492 :
493 0 : *pnLineEndListState |= ChangeType::MODIFIED;
494 :
495 0 : SelectLineEndHdl_Impl( this );
496 : }
497 : else
498 : {
499 0 : ScopedVclPtrInstance<MessageDialog> aBox( GetParentDialog()
500 : ,"DuplicateNameDialog"
501 0 : ,"cui/ui/queryduplicatedialog.ui" );
502 0 : aBox->Execute();
503 : }
504 0 : }
505 : }
506 : else
507 0 : m_pBtnAdd->Disable();
508 :
509 : // determine button state
510 0 : if ( pLineEndList->Count() )
511 : {
512 0 : m_pBtnModify->Enable();
513 0 : m_pBtnDelete->Enable();
514 0 : m_pBtnSave->Enable();
515 : }
516 0 : return 0L;
517 : }
518 :
519 :
520 :
521 0 : IMPL_LINK_NOARG(SvxLineEndDefTabPage, ClickDeleteHdl_Impl)
522 : {
523 0 : sal_Int32 nPos = m_pLbLineEnds->GetSelectEntryPos();
524 :
525 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
526 : {
527 0 : ScopedVclPtrInstance<MessageDialog> aQueryBox( GetParentDialog()
528 : ,"AskDelLineEndDialog"
529 0 : ,"cui/ui/querydeletelineenddialog.ui" );
530 :
531 0 : if ( aQueryBox->Execute() == RET_YES )
532 : {
533 0 : delete pLineEndList->Remove( nPos );
534 0 : m_pLbLineEnds->RemoveEntry( nPos );
535 0 : m_pLbLineEnds->SelectEntryPos( 0 );
536 :
537 0 : SelectLineEndHdl_Impl( this );
538 0 : *pPageType = 0; // LineEnd shall not be taken over
539 :
540 0 : *pnLineEndListState |= ChangeType::MODIFIED;
541 :
542 0 : ChangePreviewHdl_Impl( this );
543 0 : }
544 : }
545 : // determine button state
546 0 : if( !pLineEndList->Count() )
547 : {
548 0 : m_pBtnModify->Disable();
549 0 : m_pBtnDelete->Disable();
550 0 : m_pBtnSave->Disable();
551 : }
552 0 : return 0L;
553 : }
554 :
555 :
556 :
557 0 : IMPL_LINK_NOARG(SvxLineEndDefTabPage, ClickLoadHdl_Impl)
558 : {
559 0 : sal_uInt16 nReturn = RET_YES;
560 :
561 0 : if ( *pnLineEndListState & ChangeType::MODIFIED )
562 : {
563 0 : nReturn = ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
564 : ,"AskSaveList"
565 0 : ,"cui/ui/querysavelistdialog.ui")->Execute();
566 :
567 0 : if ( nReturn == RET_YES )
568 0 : pLineEndList->Save();
569 : }
570 :
571 0 : if ( nReturn != RET_CANCEL )
572 : {
573 0 : ::sfx2::FileDialogHelper aDlg(com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
574 0 : OUString aStrFilterType( "*.soe" );
575 0 : aDlg.AddFilter( aStrFilterType, aStrFilterType );
576 :
577 0 : OUString aPalettePath(SvtPathOptions().GetPalettePath());
578 0 : OUString aLastDir;
579 0 : sal_Int32 nIndex = 0;
580 0 : do
581 : {
582 0 : aLastDir = aPalettePath.getToken(0, ';', nIndex);
583 : }
584 0 : while (nIndex >= 0);
585 :
586 0 : INetURLObject aFile(aLastDir);
587 0 : aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
588 :
589 0 : if( aDlg.Execute() == ERRCODE_NONE )
590 : {
591 0 : INetURLObject aURL( aDlg.GetPath() );
592 0 : INetURLObject aPathURL( aURL );
593 :
594 0 : aPathURL.removeSegment();
595 0 : aPathURL.removeFinalSlash();
596 :
597 : XLineEndListRef pLeList = XPropertyList::AsLineEndList(
598 : XPropertyList::CreatePropertyList(
599 : XLINE_END_LIST,
600 0 : aPathURL.GetMainURL(INetURLObject::NO_DECODE), ""));
601 0 : pLeList->SetName( aURL.getName() );
602 0 : if( pLeList->Load() )
603 : {
604 0 : pLineEndList = pLeList;
605 0 : static_cast<SvxLineTabDialog*>( GetParentDialog() )->SetNewLineEndList( pLineEndList );
606 0 : m_pLbLineEnds->Clear();
607 0 : m_pLbLineEnds->Fill( pLineEndList );
608 0 : Reset( &rOutAttrs );
609 :
610 0 : pLineEndList->SetName( aURL.getName() );
611 :
612 0 : *pnLineEndListState |= ChangeType::CHANGED;
613 0 : *pnLineEndListState &= ~ChangeType::MODIFIED;
614 : }
615 : else
616 0 : ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
617 : ,"NoLoadedFileDialog"
618 0 : ,"cui/ui/querynoloadedfiledialog.ui")->Execute();
619 0 : }
620 : }
621 :
622 : // determine button state
623 0 : if ( pLineEndList->Count() )
624 : {
625 0 : m_pBtnModify->Enable();
626 0 : m_pBtnDelete->Enable();
627 0 : m_pBtnSave->Enable();
628 : }
629 : else
630 : {
631 0 : m_pBtnModify->Disable();
632 0 : m_pBtnDelete->Disable();
633 0 : m_pBtnSave->Disable();
634 : }
635 0 : return 0L;
636 : }
637 :
638 :
639 :
640 0 : IMPL_LINK_NOARG(SvxLineEndDefTabPage, ClickSaveHdl_Impl)
641 : {
642 0 : ::sfx2::FileDialogHelper aDlg( com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
643 0 : OUString aStrFilterType( "*.soe" );
644 0 : aDlg.AddFilter( aStrFilterType, aStrFilterType );
645 :
646 0 : OUString aPalettePath(SvtPathOptions().GetPalettePath());
647 0 : OUString aLastDir;
648 0 : sal_Int32 nIndex = 0;
649 0 : do
650 : {
651 0 : aLastDir = aPalettePath.getToken(0, ';', nIndex);
652 : }
653 0 : while (nIndex >= 0);
654 :
655 0 : INetURLObject aFile(aLastDir);
656 : DBG_ASSERT( aFile.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
657 :
658 0 : if( !pLineEndList->GetName().isEmpty() )
659 : {
660 0 : aFile.Append( pLineEndList->GetName() );
661 :
662 0 : if( aFile.getExtension().isEmpty() )
663 0 : aFile.SetExtension( "soe" );
664 : }
665 :
666 0 : aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
667 0 : if ( aDlg.Execute() == ERRCODE_NONE )
668 : {
669 0 : INetURLObject aURL( aDlg.GetPath() );
670 0 : INetURLObject aPathURL( aURL );
671 :
672 0 : aPathURL.removeSegment();
673 0 : aPathURL.removeFinalSlash();
674 :
675 0 : pLineEndList->SetName( aURL.getName() );
676 0 : pLineEndList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
677 :
678 0 : if( pLineEndList->Save() )
679 : {
680 0 : *pnLineEndListState |= ChangeType::SAVED;
681 0 : *pnLineEndListState &= ~ChangeType::MODIFIED;
682 : }
683 : else
684 : {
685 0 : ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
686 : ,"NoSaveFileDialog"
687 0 : ,"cui/ui/querynosavefiledialog.ui")->Execute();
688 0 : }
689 : }
690 0 : return 0L;
691 : }
692 :
693 0 : void SvxLineEndDefTabPage::DataChanged( const DataChangedEvent& rDCEvt )
694 : {
695 0 : SfxTabPage::DataChanged( rDCEvt );
696 :
697 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
698 : {
699 0 : sal_Int32 nOldSelect = m_pLbLineEnds->GetSelectEntryPos();
700 0 : m_pLbLineEnds->Clear();
701 0 : m_pLbLineEnds->Fill( pLineEndList );
702 0 : m_pLbLineEnds->SelectEntryPos( nOldSelect );
703 : }
704 0 : }
705 :
706 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|