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 <vcl/wrkwin.hxx>
21 : #include <vcl/msgbox.hxx>
22 : #include <tools/urlobj.hxx>
23 : #include <unotools/ucbstreamhelper.hxx>
24 : #include <unotools/pathoptions.hxx>
25 : #include <sfx2/app.hxx>
26 : #include <sfx2/dialoghelper.hxx>
27 : #include <sfx2/filedlghelper.hxx>
28 : #include <unotools/localfilehelper.hxx>
29 : #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
30 : #include <svx/dialmgr.hxx>
31 : #include <vcl/bmpacc.hxx>
32 : #include <vcl/settings.hxx>
33 : #include <svx/dialogs.hrc>
34 :
35 : #include <cuires.hrc>
36 : #include "helpid.hrc"
37 : #include "svx/xattr.hxx"
38 : #include <svx/xpool.hxx>
39 : #include <svx/xtable.hxx>
40 : #include "svx/xoutbmp.hxx"
41 : #include "svx/drawitem.hxx"
42 : #include "cuitabarea.hxx"
43 : #include "defdlgname.hxx"
44 : #include "dlgname.hxx"
45 : #include <svx/svxdlg.hxx>
46 : #include <dialmgr.hxx>
47 : #include "sfx2/opengrf.hxx"
48 : #include "paragrph.hrc"
49 : #include <boost/scoped_ptr.hpp>
50 :
51 : using namespace com::sun::star;
52 :
53 0 : SvxBitmapTabPage::SvxBitmapTabPage( vcl::Window* pParent, const SfxItemSet& rInAttrs) :
54 :
55 : SvxTabPage ( pParent,
56 : "BitmapTabPage",
57 : "cui/ui/bitmaptabpage.ui",
58 : rInAttrs ),
59 : rOutAttrs ( rInAttrs ),
60 :
61 : pnBitmapListState ( 0 ),
62 : pnColorListState ( 0 ),
63 : pPageType ( 0 ),
64 : nDlgType ( 0 ),
65 : pPos ( 0 ),
66 : pbAreaTP ( 0 ),
67 :
68 : bBmpChanged ( false ),
69 :
70 0 : pXPool ( static_cast<XOutdevItemPool*>( rInAttrs.GetPool() )),
71 : aXFStyleItem ( drawing::FillStyle_BITMAP ),
72 : aXBitmapItem ( OUString(), Graphic() ),
73 : aXFillAttr ( pXPool ),
74 0 : rXFSet ( aXFillAttr.GetItemSet() )
75 : {
76 0 : get(m_pBxPixelEditor,"maingrid");
77 0 : get(m_pCtlPixel,"CTL_PIXEL");
78 0 : get(m_pLbColor,"LB_COLOR");
79 0 : get(m_pLbBackgroundColor,"LB_BACKGROUND_COLOR");
80 0 : get(m_pCtlPreview,"CTL_PREVIEW");
81 0 : get(m_pLbBitmaps,"LB_BITMAPS");
82 0 : get(m_pLbBitmapsHidden,"FT_BITMAPS_HIDDEN");
83 0 : get(m_pBtnAdd,"BTN_ADD");
84 0 : get(m_pBtnModify,"BTN_MODIFY");
85 0 : get(m_pBtnImport,"BTN_IMPORT");
86 0 : get(m_pBtnDelete,"BTN_DELETE");
87 0 : get(m_pBtnLoad,"BTN_LOAD");
88 0 : get(m_pBtnSave,"BTN_SAVE");
89 :
90 : // size of the bitmap listbox
91 0 : Size aSize = getDrawListBoxOptimalSize(this);
92 0 : m_pLbBitmaps->set_width_request(aSize.Width());
93 0 : m_pLbBitmaps->set_height_request(aSize.Height());
94 :
95 : // size of the bitmap display
96 0 : Size aSize2 = getDrawPreviewOptimalSize(this);
97 0 : m_pCtlPreview->set_width_request(aSize2.Width());
98 0 : m_pCtlPreview->set_height_request(aSize2.Height());
99 :
100 0 : m_pBitmapCtl = new SvxBitmapCtl(this, aSize2);
101 :
102 : // this page needs ExchangeSupport
103 0 : SetExchangeSupport();
104 :
105 : // setting the output device
106 0 : rXFSet.Put( aXFStyleItem );
107 0 : rXFSet.Put( aXBitmapItem );
108 :
109 0 : m_pBtnAdd->SetClickHdl( LINK( this, SvxBitmapTabPage, ClickAddHdl_Impl ) );
110 0 : m_pBtnImport->SetClickHdl( LINK( this, SvxBitmapTabPage, ClickImportHdl_Impl ) );
111 0 : m_pBtnModify->SetClickHdl( LINK( this, SvxBitmapTabPage, ClickModifyHdl_Impl ) );
112 0 : m_pBtnDelete->SetClickHdl( LINK( this, SvxBitmapTabPage, ClickDeleteHdl_Impl ) );
113 0 : m_pBtnLoad->SetClickHdl( LINK( this, SvxBitmapTabPage, ClickLoadHdl_Impl ) );
114 0 : m_pBtnSave->SetClickHdl( LINK( this, SvxBitmapTabPage, ClickSaveHdl_Impl ) );
115 :
116 0 : m_pLbBitmaps->SetSelectHdl( LINK( this, SvxBitmapTabPage, ChangeBitmapHdl_Impl ) );
117 0 : m_pLbColor->SetSelectHdl( LINK( this, SvxBitmapTabPage, ChangePixelColorHdl_Impl ) );
118 0 : m_pLbBackgroundColor->SetSelectHdl( LINK( this, SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl ) );
119 :
120 0 : setPreviewsToSamePlace(pParent, this);
121 0 : }
122 :
123 0 : SvxBitmapTabPage::~SvxBitmapTabPage()
124 : {
125 0 : disposeOnce();
126 0 : }
127 :
128 0 : void SvxBitmapTabPage::dispose()
129 : {
130 0 : delete m_pBitmapCtl;
131 0 : m_pBitmapCtl = NULL;
132 0 : m_pBxPixelEditor.clear();
133 0 : m_pCtlPixel.clear();
134 0 : m_pLbColor.clear();
135 0 : m_pLbBackgroundColor.clear();
136 0 : m_pLbBitmapsHidden.clear();
137 0 : m_pLbBitmaps.clear();
138 0 : m_pCtlPreview.clear();
139 0 : m_pBtnAdd.clear();
140 0 : m_pBtnModify.clear();
141 0 : m_pBtnImport.clear();
142 0 : m_pBtnDelete.clear();
143 0 : m_pBtnLoad.clear();
144 0 : m_pBtnSave.clear();
145 0 : SvxTabPage::dispose();
146 0 : }
147 :
148 0 : void SvxBitmapTabPage::Construct()
149 : {
150 0 : m_pLbColor->Fill( pColorList );
151 0 : m_pLbBackgroundColor->CopyEntries( *m_pLbColor );
152 :
153 0 : m_pLbBitmaps->Fill( pBitmapList );
154 0 : }
155 :
156 :
157 :
158 0 : void SvxBitmapTabPage::ActivatePage( const SfxItemSet& )
159 : {
160 : sal_Int32 nPos;
161 : sal_Int32 nCount;
162 :
163 0 : if( nDlgType == 0 ) // area dialog
164 : {
165 0 : *pbAreaTP = false;
166 :
167 0 : if( pColorList.is() )
168 : {
169 : // ColorList
170 0 : if( *pnColorListState & ChangeType::CHANGED ||
171 0 : *pnColorListState & ChangeType::MODIFIED )
172 : {
173 0 : if( *pnColorListState & ChangeType::CHANGED )
174 0 : pColorList = static_cast<SvxAreaTabDialog*>( GetParentDialog() )->GetNewColorList();
175 :
176 : // LbColor
177 0 : nPos = m_pLbColor->GetSelectEntryPos();
178 0 : m_pLbColor->Clear();
179 0 : m_pLbColor->Fill( pColorList );
180 0 : nCount = m_pLbColor->GetEntryCount();
181 0 : if( nCount == 0 )
182 : ; // this case should not occur
183 0 : else if( nCount <= nPos )
184 0 : m_pLbColor->SelectEntryPos( 0 );
185 : else
186 0 : m_pLbColor->SelectEntryPos( nPos );
187 :
188 : // LbColorBackground
189 0 : nPos = m_pLbBackgroundColor->GetSelectEntryPos();
190 0 : m_pLbBackgroundColor->Clear();
191 0 : m_pLbBackgroundColor->CopyEntries( *m_pLbColor );
192 0 : nCount = m_pLbBackgroundColor->GetEntryCount();
193 0 : if( nCount == 0 )
194 : ; // this case should not occur
195 0 : else if( nCount <= nPos )
196 0 : m_pLbBackgroundColor->SelectEntryPos( 0 );
197 : else
198 0 : m_pLbBackgroundColor->SelectEntryPos( nPos );
199 :
200 0 : ChangePixelColorHdl_Impl( this );
201 0 : ChangeBackgrndColorHdl_Impl( this );
202 : }
203 :
204 : // determining (possibly cutting) the name and
205 : // displaying it in the GroupBox
206 0 : OUString aString( CUI_RES( RID_SVXSTR_TABLE ) );
207 0 : aString += ": ";
208 0 : INetURLObject aURL( pBitmapList->GetPath() );
209 :
210 0 : aURL.Append( pBitmapList->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_BITMAP && *pPos != LISTBOX_ENTRY_NOTFOUND )
222 : {
223 0 : m_pLbBitmaps->SelectEntryPos( *pPos );
224 : }
225 : // colors could have been deleted
226 0 : ChangeBitmapHdl_Impl( this );
227 :
228 0 : *pPageType = PT_BITMAP;
229 0 : *pPos = LISTBOX_ENTRY_NOTFOUND;
230 : }
231 : }
232 0 : }
233 :
234 :
235 :
236 0 : SfxTabPage::sfxpg SvxBitmapTabPage::DeactivatePage( SfxItemSet* _pSet)
237 : {
238 0 : if ( CheckChanges_Impl() == -1L )
239 0 : return KEEP_PAGE;
240 :
241 0 : if( _pSet )
242 0 : FillItemSet( _pSet );
243 :
244 0 : return LEAVE_PAGE;
245 : }
246 :
247 :
248 :
249 0 : bool SvxBitmapTabPage::FillItemSet( SfxItemSet* _rOutAttrs )
250 : {
251 0 : if( nDlgType == 0 && !*pbAreaTP ) // area dialog
252 : {
253 0 : if(PT_BITMAP == *pPageType)
254 : {
255 0 : _rOutAttrs->Put(XFillStyleItem(drawing::FillStyle_BITMAP));
256 0 : sal_Int32 nPos = m_pLbBitmaps->GetSelectEntryPos();
257 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
258 : {
259 0 : const XBitmapEntry* pXBitmapEntry = pBitmapList->GetBitmap(nPos);
260 0 : const OUString aString(m_pLbBitmaps->GetSelectEntry());
261 :
262 0 : _rOutAttrs->Put(XFillBitmapItem(aString, pXBitmapEntry->GetGraphicObject()));
263 : }
264 : else
265 : {
266 0 : const BitmapEx aBitmapEx(m_pBitmapCtl->GetBitmapEx());
267 :
268 0 : _rOutAttrs->Put(XFillBitmapItem(OUString(), Graphic(aBitmapEx)));
269 : }
270 : }
271 : }
272 :
273 0 : return true;
274 : }
275 :
276 :
277 :
278 0 : void SvxBitmapTabPage::Reset( const SfxItemSet* )
279 : {
280 : // aLbBitmaps.SelectEntryPos( 0 );
281 :
282 0 : m_pBitmapCtl->SetLines( m_pCtlPixel->GetLineCount() );
283 0 : m_pBitmapCtl->SetPixelColor( m_pLbColor->GetSelectEntryColor() );
284 0 : m_pBitmapCtl->SetBackgroundColor( m_pLbBackgroundColor->GetSelectEntryColor() );
285 0 : m_pBitmapCtl->SetBmpArray( m_pCtlPixel->GetBitmapPixelPtr() );
286 :
287 : // get bitmap and display it
288 0 : const XFillBitmapItem aBmpItem(OUString(), Graphic(m_pBitmapCtl->GetBitmapEx()));
289 0 : rXFSet.Put( aBmpItem );
290 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
291 0 : m_pCtlPreview->Invalidate();
292 :
293 0 : ChangeBitmapHdl_Impl( this );
294 :
295 : // determine button state
296 0 : if( pBitmapList.is() && pBitmapList->Count() )
297 : {
298 0 : m_pBtnAdd->Enable();
299 0 : m_pBtnModify->Enable();
300 0 : m_pBtnDelete->Enable();
301 0 : m_pBtnSave->Enable();
302 : }
303 : else
304 : {
305 0 : m_pBtnModify->Disable();
306 0 : m_pBtnDelete->Disable();
307 0 : m_pBtnSave->Disable();
308 0 : }
309 0 : }
310 :
311 :
312 :
313 0 : VclPtr<SfxTabPage> SvxBitmapTabPage::Create( vcl::Window* pWindow,
314 : const SfxItemSet* rSet )
315 : {
316 0 : return VclPtr<SvxBitmapTabPage>::Create( pWindow, *rSet );
317 : }
318 :
319 :
320 :
321 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ChangeBitmapHdl_Impl)
322 : {
323 0 : boost::scoped_ptr<GraphicObject> pGraphicObject;
324 0 : int nPos(m_pLbBitmaps->GetSelectEntryPos());
325 :
326 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
327 : {
328 0 : pGraphicObject.reset(new GraphicObject(pBitmapList->GetBitmap(nPos)->GetGraphicObject()));
329 : }
330 : else
331 : {
332 0 : const SfxPoolItem* pPoolItem = 0;
333 :
334 0 : if(SfxItemState::SET == rOutAttrs.GetItemState(GetWhich(XATTR_FILLSTYLE), true, &pPoolItem))
335 : {
336 0 : const drawing::FillStyle eXFS((drawing::FillStyle)static_cast<const XFillStyleItem*>(pPoolItem)->GetValue());
337 :
338 0 : if((drawing::FillStyle_BITMAP == eXFS) && (SfxItemState::SET == rOutAttrs.GetItemState(GetWhich(XATTR_FILLBITMAP), true, &pPoolItem)))
339 : {
340 0 : pGraphicObject.reset(new GraphicObject(static_cast<const XFillBitmapItem*>(pPoolItem)->GetGraphicObject()));
341 : }
342 : }
343 :
344 0 : if(!pGraphicObject)
345 : {
346 0 : m_pLbBitmaps->SelectEntryPos(0);
347 0 : nPos = m_pLbBitmaps->GetSelectEntryPos();
348 :
349 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
350 : {
351 0 : pGraphicObject.reset(new GraphicObject(pBitmapList->GetBitmap(nPos)->GetGraphicObject()));
352 : }
353 : }
354 : }
355 :
356 0 : if(pGraphicObject)
357 : {
358 0 : BitmapColor aBack;
359 0 : BitmapColor aFront;
360 0 : bool bIs8x8(isHistorical8x8(pGraphicObject->GetGraphic().GetBitmap(), aBack, aFront));
361 :
362 0 : m_pLbColor->SetNoSelection();
363 0 : m_pLbBackgroundColor->SetNoSelection();
364 :
365 0 : if(bIs8x8)
366 : {
367 0 : m_pCtlPixel->SetPaintable( true );
368 0 : m_pBxPixelEditor->Enable();
369 0 : m_pBtnModify->Enable();
370 0 : m_pBtnAdd->Enable();
371 :
372 : // setting the pixel control
373 :
374 0 : m_pCtlPixel->SetXBitmap(pGraphicObject->GetGraphic().GetBitmapEx());
375 :
376 0 : Color aPixelColor = aFront;
377 0 : Color aBackColor = aBack;
378 :
379 : // #i123564# This causes the wrong color to be selected
380 : // as foreground color when the 1st bitmap in the bitmap
381 : // list is selected. I see no reason why this is done,
382 : // thus I will take it out
383 :
384 : //if( 0 == m_pLbBitmaps->GetSelectEntryPos() )
385 : //{
386 : // m_pLbColor->SelectEntry( Color( COL_BLACK ) );
387 : // ChangePixelColorHdl_Impl( this );
388 : //}
389 : //else
390 :
391 0 : m_pLbColor->SelectEntry( aPixelColor );
392 :
393 0 : if( m_pLbColor->GetSelectEntryCount() == 0 )
394 : {
395 0 : m_pLbColor->InsertEntry( aPixelColor, OUString() );
396 0 : m_pLbColor->SelectEntry( aPixelColor );
397 : }
398 :
399 0 : m_pLbBackgroundColor->SelectEntry( aBackColor );
400 :
401 0 : if( m_pLbBackgroundColor->GetSelectEntryCount() == 0 )
402 : {
403 0 : m_pLbBackgroundColor->InsertEntry( aBackColor, OUString() );
404 0 : m_pLbBackgroundColor->SelectEntry( aBackColor );
405 : }
406 :
407 : // update m_pBitmapCtl, rXFSet and m_pCtlPreview
408 0 : m_pBitmapCtl->SetPixelColor( aPixelColor );
409 0 : m_pBitmapCtl->SetBackgroundColor( aBackColor );
410 0 : rXFSet.Put(XFillBitmapItem(OUString(), Graphic(m_pBitmapCtl->GetBitmapEx())));
411 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
412 0 : m_pCtlPreview->Invalidate();
413 : }
414 : else
415 : {
416 0 : m_pCtlPixel->Reset();
417 0 : m_pCtlPixel->SetPaintable( false );
418 0 : m_pBxPixelEditor->Disable();
419 0 : m_pBtnModify->Disable();
420 0 : m_pBtnAdd->Disable();
421 : }
422 :
423 0 : m_pCtlPixel->Invalidate();
424 :
425 : // display bitmap
426 0 : const XFillBitmapItem aXBmpItem(OUString(), *pGraphicObject);
427 0 : rXFSet.Put( aXBmpItem );
428 :
429 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
430 0 : m_pCtlPreview->Invalidate();
431 :
432 0 : bBmpChanged = false;
433 : }
434 :
435 0 : return 0;
436 : }
437 :
438 :
439 :
440 0 : long SvxBitmapTabPage::CheckChanges_Impl()
441 : {
442 0 : sal_Int32 nPos = m_pLbBitmaps->GetSelectEntryPos();
443 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
444 : {
445 0 : if( bBmpChanged )
446 : {
447 0 : ResMgr& rMgr = CUI_MGR();
448 0 : Image aWarningBoxImage = WarningBox::GetStandardImage();
449 0 : ScopedVclPtrInstance<SvxMessDialog> aMessDlg( GetParentDialog(),
450 0 : SVX_RES( RID_SVXSTR_BITMAP ),
451 0 : CUI_RES( RID_SVXSTR_ASK_CHANGE_BITMAP ),
452 0 : &aWarningBoxImage );
453 : DBG_ASSERT(aMessDlg, "Dialog creation failed!");
454 0 : aMessDlg->SetButtonText( MESS_BTN_1, ResId( RID_SVXSTR_CHANGE, rMgr ) );
455 0 : aMessDlg->SetButtonText( MESS_BTN_2, ResId( RID_SVXSTR_ADD, rMgr ) );
456 :
457 0 : short nRet = aMessDlg->Execute();
458 :
459 0 : switch( nRet )
460 : {
461 : case RET_BTN_1:
462 : {
463 0 : ClickModifyHdl_Impl( this );
464 : }
465 0 : break;
466 :
467 : case RET_BTN_2:
468 : {
469 0 : ClickAddHdl_Impl( this );
470 : }
471 0 : break;
472 :
473 : case RET_CANCEL:
474 0 : break;
475 0 : }
476 : }
477 : }
478 0 : nPos = m_pLbBitmaps->GetSelectEntryPos();
479 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
480 0 : *pPos = nPos;
481 0 : return 0L;
482 : }
483 :
484 :
485 :
486 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ClickAddHdl_Impl)
487 : {
488 :
489 0 : OUString aNewName( SVX_RES( RID_SVXSTR_BITMAP ) );
490 0 : OUString aDesc( CUI_RES( RID_SVXSTR_DESC_NEW_BITMAP ) );
491 0 : OUString aName;
492 :
493 0 : long nCount = pBitmapList->Count();
494 0 : long j = 1;
495 0 : bool bDifferent = false;
496 :
497 0 : while( !bDifferent )
498 : {
499 0 : aName = aNewName;
500 0 : aName += " ";
501 0 : aName += OUString::number( j++ );
502 0 : bDifferent = true;
503 :
504 0 : for( long i = 0; i < nCount && bDifferent; i++ )
505 0 : if( aName == pBitmapList->GetBitmap( i )->GetName() )
506 0 : bDifferent = false;
507 : }
508 :
509 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
510 : DBG_ASSERT(pFact, "Dialog creation failed!");
511 0 : boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
512 : DBG_ASSERT(pDlg, "Dialog creation failed!");
513 0 : ScopedVclPtr<MessageDialog> pWarnBox;
514 0 : sal_uInt16 nError(1);
515 :
516 0 : while( pDlg->Execute() == RET_OK )
517 : {
518 0 : pDlg->GetName( aName );
519 :
520 0 : bDifferent = true;
521 :
522 0 : for( long i = 0; i < nCount && bDifferent; i++ )
523 0 : if( aName == pBitmapList->GetBitmap( i )->GetName() )
524 0 : bDifferent = false;
525 :
526 0 : if( bDifferent ) {
527 0 : nError = 0;
528 0 : break;
529 : }
530 :
531 0 : if( !pWarnBox )
532 : {
533 0 : pWarnBox.reset(VclPtr<MessageDialog>::Create( GetParentDialog()
534 : ,"DuplicateNameDialog"
535 0 : ,"cui/ui/queryduplicatedialog.ui"));
536 : }
537 :
538 0 : if( pWarnBox->Execute() != RET_OK )
539 0 : break;
540 : }
541 :
542 0 : pDlg.reset();
543 0 : pWarnBox.reset();
544 :
545 0 : if( !nError )
546 : {
547 0 : XBitmapEntry* pEntry = 0;
548 0 : if( m_pCtlPixel->IsEnabled() )
549 : {
550 0 : const BitmapEx aBitmapEx(m_pBitmapCtl->GetBitmapEx());
551 :
552 0 : pEntry = new XBitmapEntry(Graphic(aBitmapEx), aName);
553 : }
554 : else // it must be a not existing imported bitmap
555 : {
556 0 : const SfxPoolItem* pPoolItem = 0;
557 :
558 0 : if(SfxItemState::SET == rOutAttrs.GetItemState(XATTR_FILLBITMAP, true, &pPoolItem))
559 : {
560 0 : pEntry = new XBitmapEntry(dynamic_cast< const XFillBitmapItem* >(pPoolItem)->GetGraphicObject(), aName);
561 : }
562 : }
563 :
564 : DBG_ASSERT( pEntry, "SvxBitmapTabPage::ClickAddHdl_Impl(), pEntry == 0 ?" );
565 :
566 0 : if( pEntry )
567 : {
568 0 : pBitmapList->Insert( pEntry );
569 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
570 0 : m_pLbBitmaps->Append(rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry );
571 0 : m_pLbBitmaps->SelectEntryPos( m_pLbBitmaps->GetEntryCount() - 1 );
572 :
573 0 : *pnBitmapListState |= ChangeType::MODIFIED;
574 :
575 0 : ChangeBitmapHdl_Impl( this );
576 : }
577 : }
578 :
579 : // determine button state
580 0 : if( pBitmapList->Count() )
581 : {
582 0 : m_pBtnModify->Enable();
583 0 : m_pBtnDelete->Enable();
584 0 : m_pBtnSave->Enable();
585 : }
586 0 : return 0L;
587 : }
588 :
589 :
590 : /******************************************************************************/
591 : /******************************************************************************/
592 :
593 :
594 :
595 :
596 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ClickImportHdl_Impl)
597 : {
598 0 : ResMgr& rMgr = CUI_MGR();
599 0 : SvxOpenGraphicDialog aDlg( OUString("Import") );
600 0 : aDlg.EnableLink(false);
601 :
602 0 : if( !aDlg.Execute() )
603 : {
604 0 : Graphic aGraphic;
605 :
606 0 : EnterWait();
607 0 : int nError = aDlg.GetGraphic( aGraphic );
608 0 : LeaveWait();
609 :
610 0 : if( !nError )
611 : {
612 0 : OUString aDesc( ResId(RID_SVXSTR_DESC_EXT_BITMAP, rMgr) );
613 0 : ScopedVclPtr<MessageDialog> pWarnBox;
614 :
615 : // convert file URL to UI name
616 0 : OUString aName;
617 0 : INetURLObject aURL( aDlg.GetPath() );
618 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
619 : DBG_ASSERT(pFact, "Dialog creation failed!");
620 0 : boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aURL.GetName().getToken( 0, '.' ), aDesc ));
621 : DBG_ASSERT(pDlg, "Dialog creation failed!");
622 0 : nError = 1;
623 :
624 0 : while( pDlg->Execute() == RET_OK )
625 : {
626 0 : pDlg->GetName( aName );
627 :
628 0 : bool bDifferent = true;
629 0 : long nCount = pBitmapList->Count();
630 :
631 0 : for( long i = 0; i < nCount && bDifferent; i++ )
632 0 : if( aName == pBitmapList->GetBitmap( i )->GetName() )
633 0 : bDifferent = false;
634 :
635 0 : if( bDifferent ) {
636 0 : nError = 0;
637 0 : break;
638 : }
639 :
640 0 : if( !pWarnBox )
641 : {
642 0 : pWarnBox.reset(VclPtr<MessageDialog>::Create( GetParentDialog()
643 : ,"DuplicateNameDialog"
644 0 : ,"cui/ui/queryduplicatedialog.ui"));
645 : }
646 :
647 0 : if( pWarnBox->Execute() != RET_OK )
648 0 : break;
649 : }
650 :
651 0 : pDlg.reset();
652 0 : pWarnBox.reset();
653 :
654 0 : if( !nError )
655 : {
656 0 : XBitmapEntry* pEntry = new XBitmapEntry( aGraphic, aName );
657 0 : pBitmapList->Insert( pEntry );
658 :
659 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
660 0 : m_pLbBitmaps->Append(rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry );
661 0 : m_pLbBitmaps->SelectEntryPos( m_pLbBitmaps->GetEntryCount() - 1 );
662 :
663 0 : *pnBitmapListState |= ChangeType::MODIFIED;
664 :
665 0 : ChangeBitmapHdl_Impl( this );
666 0 : }
667 : }
668 : else
669 : // graphic couldn't be loaded
670 0 : ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
671 : ,"NoLoadedFileDialog"
672 0 : ,"cui/ui/querynoloadedfiledialog.ui")->Execute();
673 : }
674 :
675 0 : return 0L;
676 : }
677 :
678 :
679 :
680 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ClickModifyHdl_Impl)
681 : {
682 0 : sal_Int32 nPos = m_pLbBitmaps->GetSelectEntryPos();
683 :
684 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND )
685 : {
686 0 : ResMgr& rMgr = CUI_MGR();
687 0 : OUString aDesc( ResId( RID_SVXSTR_DESC_NEW_BITMAP, rMgr ) );
688 0 : OUString aName( pBitmapList->GetBitmap( nPos )->GetName() );
689 0 : OUString aOldName = aName;
690 :
691 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
692 : DBG_ASSERT(pFact, "Dialog creation failed!");
693 0 : boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
694 : DBG_ASSERT(pDlg, "Dialog creation failed!");
695 :
696 0 : long nCount = pBitmapList->Count();
697 0 : bool bLoop = true;
698 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
699 :
700 0 : while( bLoop && pDlg->Execute() == RET_OK )
701 : {
702 0 : pDlg->GetName( aName );
703 0 : bool bDifferent = true;
704 :
705 0 : for( long i = 0; i < nCount && bDifferent; i++ )
706 : {
707 0 : if( aName == pBitmapList->GetBitmap( i )->GetName() &&
708 0 : aName != aOldName )
709 0 : bDifferent = false;
710 : }
711 :
712 0 : if( bDifferent )
713 : {
714 0 : bLoop = false;
715 :
716 0 : const BitmapEx aBitmapEx(m_pBitmapCtl->GetBitmapEx());
717 :
718 : // #i123497# Need to replace the existing entry with a new one (old returned needs to be deleted)
719 0 : XBitmapEntry* pEntry = new XBitmapEntry(Graphic(aBitmapEx), aName);
720 0 : delete pBitmapList->Replace(pEntry, nPos);
721 :
722 0 : m_pLbBitmaps->Modify( rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry, nPos );
723 0 : m_pLbBitmaps->SelectEntryPos( nPos );
724 :
725 0 : *pnBitmapListState |= ChangeType::MODIFIED;
726 :
727 0 : bBmpChanged = false;
728 : }
729 : else
730 : {
731 : ScopedVclPtrInstance<MessageDialog> aBox(
732 0 : GetParentDialog()
733 : ,"DuplicateNameDialog"
734 0 : ,"cui/ui/queryduplicatedialog.ui");
735 0 : aBox->Execute();
736 : }
737 0 : }
738 : }
739 0 : return 0L;
740 : }
741 :
742 :
743 :
744 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ClickDeleteHdl_Impl)
745 : {
746 0 : sal_Int32 nPos = m_pLbBitmaps->GetSelectEntryPos();
747 :
748 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND )
749 : {
750 0 : ScopedVclPtrInstance< MessageDialog > aQueryBox( GetParentDialog(),"AskDelBitmapDialog","cui/ui/querydeletebitmapdialog.ui" );
751 :
752 0 : if( aQueryBox->Execute() == RET_YES )
753 : {
754 0 : delete pBitmapList->Remove( nPos );
755 0 : m_pLbBitmaps->RemoveEntry( nPos );
756 0 : m_pLbBitmaps->SelectEntryPos( 0 );
757 :
758 0 : m_pCtlPreview->Invalidate();
759 0 : m_pCtlPixel->Invalidate();
760 :
761 0 : ChangeBitmapHdl_Impl( this );
762 :
763 0 : *pnBitmapListState |= ChangeType::MODIFIED;
764 0 : }
765 : }
766 : // determine button state
767 0 : if( !pBitmapList->Count() )
768 : {
769 0 : m_pBtnModify->Disable();
770 0 : m_pBtnDelete->Disable();
771 0 : m_pBtnSave->Disable();
772 : }
773 0 : return 0L;
774 : }
775 :
776 :
777 :
778 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ClickLoadHdl_Impl)
779 : {
780 0 : sal_uInt16 nReturn = RET_YES;
781 0 : ResMgr& rMgr = CUI_MGR();
782 :
783 0 : if ( *pnBitmapListState & ChangeType::MODIFIED )
784 : {
785 0 : nReturn = ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
786 : ,"AskSaveList"
787 0 : ,"cui/ui/querysavelistdialog.ui")->Execute();
788 :
789 0 : if ( nReturn == RET_YES )
790 0 : pBitmapList->Save();
791 : }
792 :
793 0 : if ( nReturn != RET_CANCEL )
794 : {
795 0 : ::sfx2::FileDialogHelper aDlg( com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
796 0 : OUString aStrFilterType( "*.sob" );
797 0 : aDlg.AddFilter( aStrFilterType, aStrFilterType );
798 0 : OUString aPalettePath(SvtPathOptions().GetPalettePath());
799 0 : OUString aLastDir;
800 0 : sal_Int32 nIndex = 0;
801 0 : do
802 : {
803 0 : aLastDir = aPalettePath.getToken(0, ';', nIndex);
804 : }
805 0 : while (nIndex >= 0);
806 :
807 0 : INetURLObject aFile(aLastDir);
808 0 : aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
809 :
810 0 : if ( aDlg.Execute() == ERRCODE_NONE )
811 : {
812 0 : EnterWait();
813 0 : INetURLObject aURL( aDlg.GetPath() );
814 0 : INetURLObject aPathURL( aURL );
815 :
816 0 : aPathURL.removeSegment();
817 0 : aPathURL.removeFinalSlash();
818 :
819 : // save table
820 : XBitmapListRef pBmpList = XPropertyList::AsBitmapList(
821 : XPropertyList::CreatePropertyList(
822 : XBITMAP_LIST, aPathURL.GetMainURL(INetURLObject::NO_DECODE),
823 0 : ""));
824 0 : pBmpList->SetName( aURL.getName() );
825 0 : if( pBmpList->Load() )
826 : {
827 0 : pBitmapList = pBmpList;
828 0 : static_cast<SvxAreaTabDialog*>( GetParentDialog() )->SetNewBitmapList( pBitmapList );
829 :
830 0 : m_pLbBitmaps->Clear();
831 0 : m_pLbBitmaps->Fill( pBitmapList );
832 0 : Reset( &rOutAttrs );
833 :
834 0 : pBitmapList->SetName( aURL.getName() );
835 :
836 : // determining (possibly cutting) the name
837 : // displaying it in the GroupBox
838 0 : OUString aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
839 0 : aString += ": ";
840 :
841 0 : if ( aURL.getBase().getLength() > 18 )
842 : {
843 0 : aString += aURL.getBase().copy( 0, 15 );
844 0 : aString += "...";
845 : }
846 : else
847 0 : aString += aURL.getBase();
848 :
849 0 : *pnBitmapListState |= ChangeType::CHANGED;
850 0 : *pnBitmapListState &= ~ChangeType::MODIFIED;
851 0 : LeaveWait();
852 : }
853 : else
854 : {
855 0 : LeaveWait();
856 0 : ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
857 : ,"NoLoadedFileDialog"
858 0 : ,"cui/ui/querynoloadedfiledialog.ui")->Execute();
859 0 : }
860 0 : }
861 : }
862 :
863 : // determine button state
864 0 : if( pBitmapList->Count() )
865 : {
866 0 : m_pBtnModify->Enable();
867 0 : m_pBtnDelete->Enable();
868 0 : m_pBtnSave->Enable();
869 : }
870 : else
871 : {
872 0 : m_pBtnModify->Disable();
873 0 : m_pBtnDelete->Disable();
874 0 : m_pBtnSave->Disable();
875 : }
876 0 : return 0L;
877 : }
878 :
879 :
880 :
881 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ClickSaveHdl_Impl)
882 : {
883 0 : ::sfx2::FileDialogHelper aDlg( com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
884 0 : OUString aStrFilterType( "*.sob" );
885 0 : aDlg.AddFilter( aStrFilterType, aStrFilterType );
886 :
887 0 : OUString aPalettePath(SvtPathOptions().GetPalettePath());
888 0 : OUString aLastDir;
889 0 : sal_Int32 nIndex = 0;
890 0 : do
891 : {
892 0 : aLastDir = aPalettePath.getToken(0, ';', nIndex);
893 : }
894 0 : while (nIndex >= 0);
895 :
896 0 : INetURLObject aFile(aLastDir);
897 : DBG_ASSERT( aFile.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
898 :
899 0 : if( !pBitmapList->GetName().isEmpty() )
900 : {
901 0 : aFile.Append( pBitmapList->GetName() );
902 :
903 0 : if( aFile.getExtension().isEmpty() )
904 0 : aFile.SetExtension( OUString("sob") );
905 : }
906 :
907 0 : aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
908 0 : if ( aDlg.Execute() == ERRCODE_NONE )
909 : {
910 0 : INetURLObject aURL( aDlg.GetPath() );
911 0 : INetURLObject aPathURL( aURL );
912 :
913 0 : aPathURL.removeSegment();
914 0 : aPathURL.removeFinalSlash();
915 :
916 0 : pBitmapList->SetName( aURL.getName() );
917 0 : pBitmapList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
918 :
919 0 : if( pBitmapList->Save() )
920 : {
921 : // determining (possibly cutting) the name
922 : // displaying it in the GroupBox
923 0 : OUString aString( CUI_RES( RID_SVXSTR_TABLE ) );
924 0 : aString += ": ";
925 :
926 0 : if ( aURL.getBase().getLength() > 18 )
927 : {
928 0 : aString += aURL.getBase().copy( 0, 15 );
929 0 : aString += "...";
930 : }
931 : else
932 0 : aString += aURL.getBase();
933 :
934 0 : *pnBitmapListState |= ChangeType::SAVED;
935 0 : *pnBitmapListState &= ~ChangeType::MODIFIED;
936 : }
937 : else
938 : {
939 0 : ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
940 : ,"NoSaveFileDialog"
941 0 : ,"cui/ui/querynosavefiledialog.ui")->Execute();
942 0 : }
943 : }
944 :
945 0 : return 0L;
946 : }
947 :
948 :
949 :
950 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ChangePixelColorHdl_Impl)
951 : {
952 0 : m_pCtlPixel->SetPixelColor( m_pLbColor->GetSelectEntryColor() );
953 0 : m_pCtlPixel->Invalidate();
954 :
955 0 : m_pBitmapCtl->SetPixelColor( m_pLbColor->GetSelectEntryColor() );
956 :
957 : // get bitmap and display it
958 0 : rXFSet.Put(XFillBitmapItem(OUString(), Graphic(m_pBitmapCtl->GetBitmapEx())));
959 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
960 0 : m_pCtlPreview->Invalidate();
961 :
962 0 : bBmpChanged = true;
963 :
964 0 : return 0L;
965 : }
966 :
967 :
968 :
969 0 : IMPL_LINK_NOARG(SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl)
970 : {
971 0 : m_pCtlPixel->SetBackgroundColor( m_pLbBackgroundColor->GetSelectEntryColor() );
972 0 : m_pCtlPixel->Invalidate();
973 :
974 0 : m_pBitmapCtl->SetBackgroundColor( m_pLbBackgroundColor->GetSelectEntryColor() );
975 :
976 : // get bitmap and display it
977 0 : rXFSet.Put(XFillBitmapItem(OUString(), Graphic(m_pBitmapCtl->GetBitmapEx())));
978 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
979 0 : m_pCtlPreview->Invalidate();
980 :
981 0 : bBmpChanged = true;
982 :
983 0 : return 0L;
984 : }
985 :
986 :
987 :
988 0 : void SvxBitmapTabPage::PointChanged( vcl::Window* pWindow, RECT_POINT )
989 : {
990 0 : if( pWindow == m_pCtlPixel )
991 : {
992 0 : m_pBitmapCtl->SetBmpArray( m_pCtlPixel->GetBitmapPixelPtr() );
993 :
994 : // get bitmap and display it
995 0 : rXFSet.Put(XFillBitmapItem(OUString(), Graphic(m_pBitmapCtl->GetBitmapEx())));
996 0 : m_pCtlPreview->SetAttributes( aXFillAttr.GetItemSet() );
997 0 : m_pCtlPreview->Invalidate();
998 :
999 0 : bBmpChanged = true;
1000 : }
1001 0 : }
1002 :
1003 :
1004 :
1005 :
1006 0 : vcl::Window* SvxBitmapTabPage::GetParentLabeledBy( const vcl::Window* pLabeled ) const
1007 : {
1008 0 : if (pLabeled == m_pLbBitmaps)
1009 0 : return m_pLbBitmapsHidden.get();
1010 : else
1011 0 : return SvxTabPage::GetParentLabeledBy (pLabeled);
1012 0 : }
1013 :
1014 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|