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/dialoghelper.hxx>
26 : #include <sfx2/filedlghelper.hxx>
27 : #include <sfx2/module.hxx>
28 : #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
29 :
30 : #include <cuires.hrc>
31 : #include "helpid.hrc"
32 : #include "svx/xattr.hxx"
33 : #include <svx/xpool.hxx>
34 : #include <svx/xtable.hxx>
35 : #include "svx/drawitem.hxx"
36 : #include "cuitabarea.hxx"
37 : #include "defdlgname.hxx"
38 : #include "dlgname.hxx"
39 : #include <svx/svxdlg.hxx>
40 : #include <dialmgr.hxx>
41 : #include "svx/dlgutil.hxx"
42 : #include <svx/dialmgr.hxx>
43 : #include "paragrph.hrc"
44 : #include <svx/dialogs.hrc>
45 : #include <boost/scoped_ptr.hpp>
46 :
47 : using namespace com::sun::star;
48 :
49 0 : SvxHatchTabPage::SvxHatchTabPage
50 : (
51 : vcl::Window* pParent,
52 : const SfxItemSet& rInAttrs
53 : ) :
54 :
55 : SvxTabPage ( pParent, "HatchPage", "cui/ui/hatchpage.ui", rInAttrs ),
56 :
57 : rOutAttrs ( rInAttrs ),
58 :
59 : pnHatchingListState ( 0 ),
60 : pnColorListState ( 0 ),
61 : pPageType ( 0 ),
62 : nDlgType ( 0 ),
63 : pPos ( 0 ),
64 : pbAreaTP ( 0 ),
65 :
66 0 : pXPool ( static_cast<XOutdevItemPool*>(rInAttrs.GetPool()) ),
67 : aXFStyleItem ( drawing::FillStyle_HATCH ),
68 : aXHatchItem ( OUString(), XHatch() ),
69 : aXFillAttr ( pXPool ),
70 0 : rXFSet ( aXFillAttr.GetItemSet() )
71 :
72 : {
73 0 : get(m_pMtrDistance, "distancemtr");
74 0 : get(m_pMtrAngle, "anglemtr");
75 0 : get(m_pCtlAngle, "anglectl");
76 0 : m_pCtlAngle->SetCS(CS_ANGLE);
77 0 : get(m_pLbLineType, "linetypelb");
78 0 : get(m_pLbLineColor, "linecolorlb");
79 0 : get(m_pLbHatchings, "hatchingslb");
80 0 : Size aSize = getDrawListBoxOptimalSize(this);
81 0 : m_pLbHatchings->set_width_request(aSize.Width());
82 0 : m_pLbHatchings->set_height_request(aSize.Height());
83 0 : get(m_pCtlPreview, "previewctl");
84 0 : aSize = getDrawPreviewOptimalSize(this);
85 0 : m_pCtlPreview->set_width_request(aSize.Width());
86 0 : m_pCtlPreview->set_height_request(aSize.Height());
87 0 : get(m_pBtnAdd, "add");
88 0 : get(m_pBtnModify, "modify");
89 0 : get(m_pBtnDelete, "delete");
90 0 : get(m_pBtnLoad, "load");
91 0 : get(m_pBtnSave, "save");
92 :
93 : // this page needs ExchangeSupport
94 0 : SetExchangeSupport();
95 :
96 : // adjust metric
97 0 : FieldUnit eFUnit = GetModuleFieldUnit( rInAttrs );
98 :
99 0 : switch ( eFUnit )
100 : {
101 : case FUNIT_M:
102 : case FUNIT_KM:
103 0 : eFUnit = FUNIT_MM;
104 0 : break;
105 : default: ;//prevent warning
106 : }
107 0 : SetFieldUnit( *m_pMtrDistance, eFUnit );
108 :
109 : // determine PoolUnit
110 0 : SfxItemPool* pPool = rOutAttrs.GetPool();
111 : DBG_ASSERT( pPool, "Wo ist der Pool?" );
112 0 : ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH );
113 :
114 : // setting the output device
115 0 : rXFSet.Put( aXFStyleItem );
116 0 : rXFSet.Put( aXHatchItem );
117 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
118 :
119 0 : m_pLbHatchings->SetSelectHdl( LINK( this, SvxHatchTabPage, ChangeHatchHdl_Impl ) );
120 :
121 0 : Link<> aLink = LINK( this, SvxHatchTabPage, ModifiedHdl_Impl );
122 0 : m_pMtrDistance->SetModifyHdl( aLink );
123 0 : m_pMtrAngle->SetModifyHdl( aLink );
124 0 : m_pLbLineType->SetSelectHdl( aLink );
125 0 : m_pLbLineColor->SetSelectHdl( aLink );
126 :
127 0 : m_pBtnAdd->SetClickHdl( LINK( this, SvxHatchTabPage, ClickAddHdl_Impl ) );
128 0 : m_pBtnModify->SetClickHdl(
129 0 : LINK( this, SvxHatchTabPage, ClickModifyHdl_Impl ) );
130 0 : m_pBtnDelete->SetClickHdl(
131 0 : LINK( this, SvxHatchTabPage, ClickDeleteHdl_Impl ) );
132 0 : m_pBtnLoad->SetClickHdl( LINK( this, SvxHatchTabPage, ClickLoadHdl_Impl ) );
133 0 : m_pBtnSave->SetClickHdl( LINK( this, SvxHatchTabPage, ClickSaveHdl_Impl ) );
134 :
135 0 : m_pCtlPreview->SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
136 :
137 0 : setPreviewsToSamePlace(pParent, this);
138 0 : }
139 :
140 0 : SvxHatchTabPage::~SvxHatchTabPage()
141 : {
142 0 : disposeOnce();
143 0 : }
144 :
145 0 : void SvxHatchTabPage::dispose()
146 : {
147 0 : m_pMtrDistance.clear();
148 0 : m_pMtrAngle.clear();
149 0 : m_pCtlAngle.clear();
150 0 : m_pLbLineType.clear();
151 0 : m_pLbLineColor.clear();
152 0 : m_pLbHatchings.clear();
153 0 : m_pCtlPreview.clear();
154 0 : m_pBtnAdd.clear();
155 0 : m_pBtnModify.clear();
156 0 : m_pBtnDelete.clear();
157 0 : m_pBtnLoad.clear();
158 0 : m_pBtnSave.clear();
159 0 : SvxTabPage::dispose();
160 0 : }
161 :
162 :
163 0 : void SvxHatchTabPage::Construct()
164 : {
165 0 : m_pLbLineColor->Fill( pColorList );
166 0 : m_pLbHatchings->Fill( pHatchingList );
167 0 : }
168 :
169 :
170 :
171 0 : void SvxHatchTabPage::ActivatePage( const SfxItemSet& rSet )
172 : {
173 : sal_Int32 nPos;
174 : sal_Int32 nCount;
175 :
176 0 : if( nDlgType == 0 ) // area dialog
177 : {
178 0 : *pbAreaTP = false;
179 :
180 0 : if( pColorList.is() )
181 : {
182 : // ColorList
183 0 : if( *pnColorListState & ChangeType::CHANGED ||
184 0 : *pnColorListState & ChangeType::MODIFIED )
185 : {
186 0 : if( *pnColorListState & ChangeType::CHANGED )
187 0 : pColorList = static_cast<SvxAreaTabDialog*>( GetParentDialog() )->GetNewColorList();
188 :
189 : // LbLineColor
190 0 : nPos = m_pLbLineColor->GetSelectEntryPos();
191 0 : m_pLbLineColor->Clear();
192 0 : m_pLbLineColor->Fill( pColorList );
193 0 : nCount = m_pLbLineColor->GetEntryCount();
194 0 : if( nCount == 0 )
195 : ; // this case should not occur
196 0 : else if( nCount <= nPos )
197 0 : m_pLbLineColor->SelectEntryPos( 0 );
198 : else
199 0 : m_pLbLineColor->SelectEntryPos( nPos );
200 :
201 0 : ModifiedHdl_Impl( this );
202 : }
203 :
204 : // determining (possibly cutting) the name
205 : // and displaying it in the GroupBox
206 0 : OUString aString( CUI_RES( RID_SVXSTR_TABLE ) );
207 0 : aString += ": ";
208 0 : INetURLObject aURL( pHatchingList->GetPath() );
209 :
210 0 : aURL.Append( pHatchingList->GetName() );
211 : DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
212 :
213 0 : if ( aURL.getBase().getLength() > 18 )
214 : {
215 0 : aString += aURL.getBase().copy( 0, 15 );
216 0 : aString += "...";
217 : }
218 : else
219 0 : aString += aURL.getBase();
220 :
221 0 : if( *pPageType == PT_HATCH && *pPos != LISTBOX_ENTRY_NOTFOUND )
222 : {
223 0 : m_pLbHatchings->SelectEntryPos( *pPos );
224 : }
225 : // colors could have been deleted
226 0 : ChangeHatchHdl_Impl( this );
227 :
228 0 : *pPageType = PT_HATCH;
229 0 : *pPos = LISTBOX_ENTRY_NOTFOUND;
230 : }
231 : }
232 :
233 0 : rXFSet.Put( static_cast<const XFillColorItem&>( rSet.Get(XATTR_FILLCOLOR)) );
234 0 : rXFSet.Put( static_cast<const XFillBackgroundItem&>(rSet.Get(XATTR_FILLBACKGROUND)) );
235 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
236 0 : m_pCtlPreview->Invalidate();
237 0 : }
238 :
239 :
240 :
241 0 : SfxTabPage::sfxpg SvxHatchTabPage::DeactivatePage( SfxItemSet* _pSet )
242 : {
243 0 : if ( CheckChanges_Impl() == -1L )
244 0 : return KEEP_PAGE;
245 :
246 0 : if( _pSet )
247 0 : FillItemSet( _pSet );
248 :
249 0 : return LEAVE_PAGE;
250 : }
251 :
252 :
253 :
254 0 : long SvxHatchTabPage::CheckChanges_Impl()
255 : {
256 0 : if( m_pMtrDistance->IsValueChangedFromSaved() ||
257 0 : m_pMtrAngle->IsValueChangedFromSaved() ||
258 0 : m_pLbLineType->IsValueChangedFromSaved() ||
259 0 : m_pLbLineColor->IsValueChangedFromSaved() ||
260 0 : m_pLbHatchings->IsValueChangedFromSaved() )
261 : {
262 0 : ResMgr& rMgr = CUI_MGR();
263 0 : Image aWarningBoxImage = WarningBox::GetStandardImage();
264 0 : ScopedVclPtrInstance<SvxMessDialog> aMessDlg( GetParentDialog(),
265 0 : SVX_RESSTR( RID_SVXSTR_HATCH ),
266 0 : CUI_RESSTR( RID_SVXSTR_ASK_CHANGE_HATCH ),
267 0 : &aWarningBoxImage );
268 : DBG_ASSERT(aMessDlg, "Dialog creation failed!");
269 : aMessDlg->SetButtonText( MESS_BTN_1,
270 0 : OUString( ResId( RID_SVXSTR_CHANGE, rMgr ) ) );
271 : aMessDlg->SetButtonText( MESS_BTN_2,
272 0 : OUString( ResId( RID_SVXSTR_ADD, rMgr ) ) );
273 :
274 0 : short nRet = aMessDlg->Execute();
275 :
276 0 : switch( nRet )
277 : {
278 : case RET_BTN_1:
279 : {
280 0 : ClickModifyHdl_Impl( this );
281 : }
282 0 : break;
283 :
284 : case RET_BTN_2:
285 : {
286 0 : ClickAddHdl_Impl( this );
287 : }
288 0 : break;
289 :
290 : case RET_CANCEL:
291 0 : break;
292 0 : }
293 : }
294 :
295 0 : sal_Int32 nPos = m_pLbHatchings->GetSelectEntryPos();
296 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
297 0 : *pPos = nPos;
298 0 : return 0L;
299 : }
300 :
301 :
302 :
303 0 : bool SvxHatchTabPage::FillItemSet( SfxItemSet* rSet )
304 : {
305 0 : if( nDlgType == 0 && !*pbAreaTP ) // area dialog
306 : {
307 0 : if( *pPageType == PT_HATCH )
308 : {
309 : // CheckChanges(); <-- duplicate inquiry ?
310 :
311 0 : boost::scoped_ptr<XHatch> pXHatch;
312 0 : OUString aString;
313 0 : sal_Int32 nPos = m_pLbHatchings->GetSelectEntryPos();
314 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
315 : {
316 0 : pXHatch.reset(new XHatch( pHatchingList->GetHatch( nPos )->GetHatch() ));
317 0 : aString = m_pLbHatchings->GetSelectEntry();
318 : }
319 : // gradient has been (unidentifiedly) passed
320 : else
321 : {
322 0 : pXHatch.reset(new XHatch( m_pLbLineColor->GetSelectEntryColor(),
323 0 : (css::drawing::HatchStyle) m_pLbLineType->GetSelectEntryPos(),
324 0 : GetCoreValue( *m_pMtrDistance, ePoolUnit ),
325 0 : static_cast<long>(m_pMtrAngle->GetValue() * 10) ));
326 : }
327 : DBG_ASSERT( pXHatch, "XHatch konnte nicht erzeugt werden" );
328 0 : rSet->Put( XFillStyleItem( drawing::FillStyle_HATCH ) );
329 0 : rSet->Put( XFillHatchItem( aString, *pXHatch ) );
330 : }
331 : }
332 0 : return true;
333 : }
334 :
335 :
336 :
337 0 : void SvxHatchTabPage::Reset( const SfxItemSet* rSet )
338 : {
339 0 : ChangeHatchHdl_Impl( this );
340 :
341 : // determine button state
342 0 : if( pHatchingList->Count() )
343 : {
344 0 : m_pBtnModify->Enable();
345 0 : m_pBtnDelete->Enable();
346 0 : m_pBtnSave->Enable();
347 : }
348 : else
349 : {
350 0 : m_pBtnModify->Disable();
351 0 : m_pBtnDelete->Disable();
352 0 : m_pBtnSave->Disable();
353 : }
354 :
355 0 : rXFSet.Put( static_cast<const XFillColorItem&>( rSet->Get(XATTR_FILLCOLOR)) );
356 0 : rXFSet.Put( static_cast<const XFillBackgroundItem&>(rSet->Get(XATTR_FILLBACKGROUND)) );
357 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
358 0 : m_pCtlPreview->Invalidate();
359 0 : }
360 :
361 :
362 :
363 0 : VclPtr<SfxTabPage> SvxHatchTabPage::Create( vcl::Window* pWindow,
364 : const SfxItemSet* rSet )
365 : {
366 0 : return VclPtr<SvxHatchTabPage>::Create( pWindow, *rSet );
367 : }
368 :
369 :
370 :
371 0 : IMPL_LINK( SvxHatchTabPage, ModifiedHdl_Impl, void *, p )
372 : {
373 0 : if( p == m_pMtrAngle )
374 : {
375 0 : switch( m_pMtrAngle->GetValue() )
376 : {
377 0 : case 135: m_pCtlAngle->SetActualRP( RP_LT ); break;
378 0 : case 90: m_pCtlAngle->SetActualRP( RP_MT ); break;
379 0 : case 45: m_pCtlAngle->SetActualRP( RP_RT ); break;
380 0 : case 180: m_pCtlAngle->SetActualRP( RP_LM ); break;
381 0 : case 0: m_pCtlAngle->SetActualRP( RP_RM ); break;
382 0 : case 225: m_pCtlAngle->SetActualRP( RP_LB ); break;
383 0 : case 270: m_pCtlAngle->SetActualRP( RP_MB ); break;
384 0 : case 315: m_pCtlAngle->SetActualRP( RP_RB ); break;
385 0 : default: m_pCtlAngle->SetActualRP( RP_MM ); break;
386 : }
387 : }
388 :
389 0 : XHatch aXHatch( m_pLbLineColor->GetSelectEntryColor(),
390 0 : (css::drawing::HatchStyle) m_pLbLineType->GetSelectEntryPos(),
391 0 : GetCoreValue( *m_pMtrDistance, ePoolUnit ),
392 0 : static_cast<long>(m_pMtrAngle->GetValue() * 10) );
393 :
394 0 : rXFSet.Put( XFillHatchItem( OUString(), aXHatch ) );
395 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
396 :
397 0 : m_pCtlPreview->Invalidate();
398 :
399 0 : return 0L;
400 : }
401 :
402 :
403 :
404 0 : IMPL_LINK_NOARG(SvxHatchTabPage, ChangeHatchHdl_Impl)
405 : {
406 0 : boost::scoped_ptr<XHatch> pHatch;
407 0 : int nPos = m_pLbHatchings->GetSelectEntryPos();
408 :
409 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
410 0 : pHatch.reset(new XHatch( pHatchingList->GetHatch( nPos )->GetHatch() ));
411 : else
412 : {
413 0 : const SfxPoolItem* pPoolItem = NULL;
414 0 : if( SfxItemState::SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLSTYLE ), true, &pPoolItem ) )
415 : {
416 0 : if( ( drawing::FillStyle_HATCH == (drawing::FillStyle) static_cast<const XFillStyleItem*>( pPoolItem )->GetValue() ) &&
417 0 : ( SfxItemState::SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLHATCH ), true, &pPoolItem ) ) )
418 : {
419 0 : pHatch.reset(new XHatch( static_cast<const XFillHatchItem*>( pPoolItem )->GetHatchValue() ));
420 : }
421 : }
422 0 : if( !pHatch )
423 : {
424 0 : m_pLbHatchings->SelectEntryPos( 0 );
425 0 : nPos = m_pLbHatchings->GetSelectEntryPos();
426 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
427 0 : pHatch.reset(new XHatch( pHatchingList->GetHatch( nPos )->GetHatch() ));
428 : }
429 : }
430 0 : if( pHatch )
431 : {
432 : m_pLbLineType->SelectEntryPos(
433 0 : sal::static_int_cast< sal_Int32 >( pHatch->GetHatchStyle() ) );
434 : // if the entry is not in the listbox
435 : // the color is added temporarily
436 0 : m_pLbLineColor->SetNoSelection();
437 0 : m_pLbLineColor->SelectEntry( pHatch->GetColor() );
438 0 : if( m_pLbLineColor->GetSelectEntryCount() == 0 )
439 : {
440 0 : m_pLbLineColor->InsertEntry( pHatch->GetColor(), OUString() );
441 0 : m_pLbLineColor->SelectEntry( pHatch->GetColor() );
442 : }
443 0 : SetMetricValue( *m_pMtrDistance, pHatch->GetDistance(), ePoolUnit );
444 0 : m_pMtrAngle->SetValue( pHatch->GetAngle() / 10 );
445 :
446 0 : switch( m_pMtrAngle->GetValue() )
447 : {
448 0 : case 135: m_pCtlAngle->SetActualRP( RP_LT ); break;
449 0 : case 90: m_pCtlAngle->SetActualRP( RP_MT ); break;
450 0 : case 45: m_pCtlAngle->SetActualRP( RP_RT ); break;
451 0 : case 180: m_pCtlAngle->SetActualRP( RP_LM ); break;
452 0 : case 0: m_pCtlAngle->SetActualRP( RP_RM ); break;
453 0 : case 225: m_pCtlAngle->SetActualRP( RP_LB ); break;
454 0 : case 270: m_pCtlAngle->SetActualRP( RP_MB ); break;
455 0 : case 315: m_pCtlAngle->SetActualRP( RP_RB ); break;
456 0 : default: m_pCtlAngle->SetActualRP( RP_MM ); break;
457 : }
458 :
459 : // fill ItemSet and pass it on to m_pCtlPreview
460 0 : rXFSet.Put( XFillHatchItem( OUString(), *pHatch ) );
461 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
462 :
463 0 : m_pCtlPreview->Invalidate();
464 0 : pHatch.reset();
465 : }
466 0 : m_pMtrDistance->SaveValue();
467 0 : m_pMtrAngle->SaveValue();
468 0 : m_pLbLineType->SaveValue();
469 0 : m_pLbLineColor->SaveValue();
470 0 : m_pLbHatchings->SaveValue();
471 :
472 0 : return 0L;
473 : }
474 :
475 :
476 :
477 0 : IMPL_LINK_NOARG(SvxHatchTabPage, ClickAddHdl_Impl)
478 : {
479 0 : OUString aNewName( SVX_RES( RID_SVXSTR_HATCH ) );
480 0 : OUString aDesc( CUI_RES( RID_SVXSTR_DESC_HATCH ) );
481 0 : OUString aName;
482 :
483 0 : long nCount = pHatchingList->Count();
484 0 : long j = 1;
485 0 : bool bDifferent = false;
486 :
487 0 : while( !bDifferent )
488 : {
489 0 : aName = aNewName;
490 0 : aName += " ";
491 0 : aName += OUString::number( j++ );
492 0 : bDifferent = true;
493 :
494 0 : for( long i = 0; i < nCount && bDifferent; i++ )
495 0 : if( aName == pHatchingList->GetHatch( i )->GetName() )
496 0 : bDifferent = false;
497 : }
498 :
499 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
500 : DBG_ASSERT(pFact, "Dialog creation failed!");
501 0 : boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
502 : DBG_ASSERT(pDlg, "Dialog creation failed!");
503 0 : ScopedVclPtr<MessageDialog> pWarnBox;
504 0 : sal_uInt16 nError = 1;
505 :
506 0 : while( pDlg->Execute() == RET_OK )
507 : {
508 0 : pDlg->GetName( aName );
509 :
510 0 : bDifferent = true;
511 :
512 0 : for( long i = 0; i < nCount && bDifferent; i++ )
513 0 : if( aName == pHatchingList->GetHatch( i )->GetName() )
514 0 : bDifferent = false;
515 :
516 0 : if( bDifferent ) {
517 0 : nError = 0;
518 0 : break;
519 : }
520 :
521 0 : if( !pWarnBox )
522 : {
523 0 : pWarnBox.reset(VclPtr<MessageDialog>::Create( GetParentDialog()
524 : ,"DuplicateNameDialog"
525 0 : ,"cui/ui/queryduplicatedialog.ui"));
526 : }
527 :
528 0 : if( pWarnBox->Execute() != RET_OK )
529 0 : break;
530 : }
531 0 : pDlg.reset();
532 0 : pWarnBox.reset();
533 :
534 0 : if( !nError )
535 : {
536 0 : XHatch aXHatch( m_pLbLineColor->GetSelectEntryColor(),
537 0 : (css::drawing::HatchStyle) m_pLbLineType->GetSelectEntryPos(),
538 0 : GetCoreValue( *m_pMtrDistance, ePoolUnit ),
539 0 : static_cast<long>(m_pMtrAngle->GetValue() * 10) );
540 0 : XHatchEntry* pEntry = new XHatchEntry( aXHatch, aName );
541 :
542 0 : pHatchingList->Insert( pEntry, nCount );
543 :
544 0 : m_pLbHatchings->Append( *pEntry, pHatchingList->GetUiBitmap( nCount ) );
545 :
546 0 : m_pLbHatchings->SelectEntryPos( m_pLbHatchings->GetEntryCount() - 1 );
547 :
548 : #ifdef WNT
549 : // hack: #31355# W.P.
550 : Rectangle aRect( m_pLbHatchings->GetPosPixel(), m_pLbHatchings->GetSizePixel() );
551 : if( sal_True ) { // ??? overlapped with pDlg
552 : // and srolling
553 : Invalidate( aRect );
554 : }
555 : #endif
556 :
557 0 : *pnHatchingListState |= ChangeType::MODIFIED;
558 :
559 0 : ChangeHatchHdl_Impl( this );
560 : }
561 :
562 : // determine button state
563 0 : if( pHatchingList->Count() )
564 : {
565 0 : m_pBtnModify->Enable();
566 0 : m_pBtnDelete->Enable();
567 0 : m_pBtnSave->Enable();
568 : }
569 0 : return 0L;
570 : }
571 :
572 :
573 :
574 0 : IMPL_LINK_NOARG(SvxHatchTabPage, ClickModifyHdl_Impl)
575 : {
576 0 : sal_Int32 nPos = m_pLbHatchings->GetSelectEntryPos();
577 :
578 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND )
579 : {
580 0 : OUString aDesc( CUI_RES( RID_SVXSTR_DESC_HATCH ) );
581 0 : OUString aName( pHatchingList->GetHatch( nPos )->GetName() );
582 0 : OUString aOldName = aName;
583 :
584 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
585 : DBG_ASSERT(pFact, "Dialog creation failed!");
586 0 : boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
587 : DBG_ASSERT(pDlg, "Dialog creation failed!");
588 :
589 0 : long nCount = pHatchingList->Count();
590 0 : bool bLoop = true;
591 0 : while( bLoop && pDlg->Execute() == RET_OK )
592 : {
593 0 : pDlg->GetName( aName );
594 0 : bool bDifferent = true;
595 :
596 0 : for( long i = 0; i < nCount && bDifferent; i++ )
597 : {
598 0 : if( aName == pHatchingList->GetHatch( i )->GetName() &&
599 0 : aName != aOldName )
600 0 : bDifferent = false;
601 : }
602 :
603 0 : if( bDifferent )
604 : {
605 0 : bLoop = false;
606 0 : XHatch aXHatch( m_pLbLineColor->GetSelectEntryColor(),
607 0 : (css::drawing::HatchStyle) m_pLbLineType->GetSelectEntryPos(),
608 0 : GetCoreValue( *m_pMtrDistance, ePoolUnit ),
609 0 : static_cast<long>(m_pMtrAngle->GetValue() * 10) );
610 :
611 0 : XHatchEntry* pEntry = new XHatchEntry( aXHatch, aName );
612 :
613 0 : delete pHatchingList->Replace( pEntry, nPos );
614 :
615 0 : m_pLbHatchings->Modify( *pEntry, nPos, pHatchingList->GetUiBitmap( nPos ) );
616 :
617 0 : m_pLbHatchings->SelectEntryPos( nPos );
618 :
619 : // save values for changes recognition (-> method)
620 0 : m_pMtrDistance->SaveValue();
621 0 : m_pMtrAngle->SaveValue();
622 0 : m_pLbLineType->SaveValue();
623 0 : m_pLbLineColor->SaveValue();
624 0 : m_pLbHatchings->SaveValue();
625 :
626 0 : *pnHatchingListState |= ChangeType::MODIFIED;
627 : }
628 : else
629 : {
630 0 : ScopedVclPtrInstance<MessageDialog> aBox( GetParentDialog()
631 : ,"DuplicateNameDialog"
632 0 : ,"cui/ui/queryduplicatedialog.ui" );
633 0 : aBox->Execute();
634 : }
635 0 : }
636 : }
637 0 : return 0L;
638 : }
639 :
640 :
641 :
642 0 : IMPL_LINK_NOARG(SvxHatchTabPage, ClickDeleteHdl_Impl)
643 : {
644 0 : sal_Int32 nPos = m_pLbHatchings->GetSelectEntryPos();
645 :
646 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
647 : {
648 0 : ScopedVclPtrInstance< MessageDialog > aQueryBox( GetParentDialog(),"AskDelHatchDialog","cui/ui/querydeletehatchdialog.ui");
649 :
650 0 : if( aQueryBox->Execute() == RET_YES )
651 : {
652 0 : delete pHatchingList->Remove( nPos );
653 0 : m_pLbHatchings->RemoveEntry( nPos );
654 0 : m_pLbHatchings->SelectEntryPos( 0 );
655 :
656 0 : m_pCtlPreview->Invalidate();
657 :
658 0 : ChangeHatchHdl_Impl( this );
659 :
660 0 : *pnHatchingListState |= ChangeType::MODIFIED;
661 0 : }
662 : }
663 : // determine button state
664 0 : if( !pHatchingList->Count() )
665 : {
666 0 : m_pBtnModify->Disable();
667 0 : m_pBtnDelete->Disable();
668 0 : m_pBtnSave->Disable();
669 : }
670 0 : return 0L;
671 : }
672 :
673 :
674 :
675 0 : IMPL_LINK_NOARG(SvxHatchTabPage, ClickLoadHdl_Impl)
676 : {
677 0 : ResMgr& rMgr = CUI_MGR();
678 0 : sal_uInt16 nReturn = RET_YES;
679 :
680 0 : if ( *pnHatchingListState & ChangeType::MODIFIED )
681 : {
682 0 : nReturn = ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
683 : ,"AskSaveList"
684 0 : ,"cui/ui/querysavelistdialog.ui")->Execute();
685 :
686 0 : if ( nReturn == RET_YES )
687 0 : pHatchingList->Save();
688 : }
689 :
690 0 : if ( nReturn != RET_CANCEL )
691 : {
692 0 : ::sfx2::FileDialogHelper aDlg( com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
693 0 : OUString aStrFilterType( "*.soh" );
694 0 : aDlg.AddFilter( aStrFilterType, aStrFilterType );
695 0 : OUString aPalettePath(SvtPathOptions().GetPalettePath());
696 0 : OUString aLastDir;
697 0 : sal_Int32 nIndex = 0;
698 0 : do
699 : {
700 0 : aLastDir = aPalettePath.getToken(0, ';', nIndex);
701 : }
702 0 : while (nIndex >= 0);
703 :
704 0 : INetURLObject aFile(aLastDir);
705 0 : aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
706 :
707 0 : if( aDlg.Execute() == ERRCODE_NONE )
708 : {
709 0 : INetURLObject aURL( aDlg.GetPath() );
710 0 : INetURLObject aPathURL( aURL );
711 :
712 0 : aPathURL.removeSegment();
713 0 : aPathURL.removeFinalSlash();
714 :
715 : XHatchListRef pHatchList = XPropertyList::AsHatchList(
716 : XPropertyList::CreatePropertyList(
717 0 : XHATCH_LIST, aPathURL.GetMainURL( INetURLObject::NO_DECODE ), "" ));
718 0 : pHatchList->SetName( aURL.getName() );
719 0 : if( pHatchList->Load() )
720 : {
721 0 : pHatchingList = pHatchList;
722 0 : static_cast<SvxAreaTabDialog*>( GetParentDialog() )->SetNewHatchingList( pHatchingList );
723 :
724 0 : m_pLbHatchings->Clear();
725 0 : m_pLbHatchings->Fill( pHatchingList );
726 0 : Reset( &rOutAttrs );
727 :
728 0 : pHatchingList->SetName( aURL.getName() );
729 :
730 : // determining (and possibly cutting) the name
731 : // and displaying it in the GroupBox
732 0 : OUString aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
733 0 : aString += ": ";
734 :
735 0 : if ( aURL.getBase().getLength() > 18 )
736 : {
737 0 : aString += aURL.getBase().copy( 0, 15 );
738 0 : aString += "...";
739 : }
740 : else
741 0 : aString += aURL.getBase();
742 :
743 0 : *pnHatchingListState |= ChangeType::CHANGED;
744 0 : *pnHatchingListState &= ~ChangeType::MODIFIED;
745 : }
746 : else
747 0 : ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
748 : ,"NoLoadedFileDialog"
749 0 : ,"cui/ui/querynoloadedfiledialog.ui")->Execute();
750 0 : }
751 : }
752 :
753 : // determine button state
754 0 : if ( pHatchingList->Count() )
755 : {
756 0 : m_pBtnModify->Enable();
757 0 : m_pBtnDelete->Enable();
758 0 : m_pBtnSave->Enable();
759 : }
760 : else
761 : {
762 0 : m_pBtnModify->Disable();
763 0 : m_pBtnDelete->Disable();
764 0 : m_pBtnSave->Disable();
765 : }
766 0 : return 0L;
767 : }
768 :
769 :
770 :
771 0 : IMPL_LINK_NOARG(SvxHatchTabPage, ClickSaveHdl_Impl)
772 : {
773 0 : ::sfx2::FileDialogHelper aDlg( com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
774 0 : OUString aStrFilterType( "*.soh" );
775 0 : aDlg.AddFilter( aStrFilterType, aStrFilterType );
776 :
777 0 : OUString aPalettePath(SvtPathOptions().GetPalettePath());
778 0 : OUString aLastDir;
779 0 : sal_Int32 nIndex = 0;
780 0 : do
781 : {
782 0 : aLastDir = aPalettePath.getToken(0, ';', nIndex);
783 : }
784 0 : while (nIndex >= 0);
785 :
786 0 : INetURLObject aFile(aLastDir);
787 : DBG_ASSERT( aFile.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
788 :
789 0 : if( !pHatchingList->GetName().isEmpty() )
790 : {
791 0 : aFile.Append( pHatchingList->GetName() );
792 :
793 0 : if( aFile.getExtension().isEmpty() )
794 0 : aFile.SetExtension( OUString("soh") );
795 : }
796 :
797 0 : aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
798 0 : if ( aDlg.Execute() == ERRCODE_NONE )
799 : {
800 0 : INetURLObject aURL( aDlg.GetPath() );
801 0 : INetURLObject aPathURL( aURL );
802 :
803 0 : aPathURL.removeSegment();
804 0 : aPathURL.removeFinalSlash();
805 :
806 0 : pHatchingList->SetName( aURL.getName() );
807 0 : pHatchingList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
808 :
809 0 : if( pHatchingList->Save() )
810 : {
811 : // determining (and possibly cutting) the name
812 : // and displaying it in the GroupBox
813 0 : OUString aString( CUI_RES( RID_SVXSTR_TABLE ) );
814 0 : aString += ": ";
815 :
816 0 : if ( aURL.getBase().getLength() > 18 )
817 : {
818 0 : aString += aURL.getBase().copy( 0, 15 );
819 0 : aString += "...";
820 : }
821 : else
822 0 : aString += aURL.getBase();
823 :
824 0 : *pnHatchingListState |= ChangeType::SAVED;
825 0 : *pnHatchingListState &= ~ChangeType::MODIFIED;
826 : }
827 : else
828 : {
829 0 : ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
830 : ,"NoSaveFileDialog"
831 0 : ,"cui/ui/querynosavefiledialog.ui")->Execute();
832 0 : }
833 : }
834 :
835 0 : return 0L;
836 : }
837 :
838 :
839 :
840 0 : void SvxHatchTabPage::PointChanged( vcl::Window* pWindow, RECT_POINT eRcPt )
841 : {
842 0 : if( pWindow == m_pCtlAngle )
843 : {
844 0 : switch( eRcPt )
845 : {
846 0 : case RP_LT: m_pMtrAngle->SetValue( 135 ); break;
847 0 : case RP_MT: m_pMtrAngle->SetValue( 90 ); break;
848 0 : case RP_RT: m_pMtrAngle->SetValue( 45 ); break;
849 0 : case RP_LM: m_pMtrAngle->SetValue( 180 ); break;
850 0 : case RP_RM: m_pMtrAngle->SetValue( 0 ); break;
851 0 : case RP_LB: m_pMtrAngle->SetValue( 225 ); break;
852 0 : case RP_MB: m_pMtrAngle->SetValue( 270 ); break;
853 0 : case RP_RB: m_pMtrAngle->SetValue( 315 ); break;
854 0 : case RP_MM: break;
855 : }
856 0 : ModifiedHdl_Impl( this );
857 : }
858 0 : }
859 :
860 :
861 0 : void SvxHatchTabPage::DataChanged( const DataChangedEvent& rDCEvt )
862 : {
863 0 : if ( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
864 0 : m_pCtlPreview->SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
865 :
866 0 : SvxTabPage::DataChanged( rDCEvt );
867 0 : }
868 :
869 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|