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