xref: /AOO41X/main/cui/source/tabpages/tpgradnt.cxx (revision 3ce09a58b0d6873449cda31e55c66dba2dbc8f7f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <vcl/wrkwin.hxx>
29 #include <tools/shl.hxx>
30 #include <tools/urlobj.hxx>
31 #include <vcl/msgbox.hxx>
32 #include <unotools/pathoptions.hxx>
33 #include <sfx2/app.hxx>
34 #include <sfx2/filedlghelper.hxx>
35 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
36 
37 #define _SVX_TPGRADNT_CXX
38 
39 #include <cuires.hrc>
40 #include "helpid.hrc"
41 #include "svx/xattr.hxx"
42 #include <svx/xtable.hxx>
43 #include <svx/xpool.hxx>
44 #include "svx/drawitem.hxx"
45 #include "cuitabarea.hxx"
46 #include "tabarea.hrc"
47 #include "defdlgname.hxx" //CHINA001 #include "dlgname.hxx"
48 //#include "dlgname.hrc"
49 #include <svx/svxdlg.hxx> //CHINA001
50 #include <dialmgr.hxx>
51 #include <svx/dialmgr.hxx>
52 #include <svx/dialogs.hrc>
53 #include "paragrph.hrc"
54 
55 #define DLGWIN this->GetParent()->GetParent()
56 
57 #define BITMAP_WIDTH  32
58 #define BITMAP_HEIGHT 12
59 
60 /*************************************************************************
61 |*
62 |*  Dialog zum Aendern und Definieren der Farbverlaeufe
63 |*
64 \************************************************************************/
65 
SvxGradientTabPage(Window * pParent,const SfxItemSet & rInAttrs)66 SvxGradientTabPage::SvxGradientTabPage
67 (
68     Window* pParent,
69     const SfxItemSet& rInAttrs
70 ) :
71     SfxTabPage          ( pParent, CUI_RES( RID_SVXPAGE_GRADIENT ), rInAttrs ),
72 
73     aFlProp             ( this, CUI_RES( FL_PROP ) ),
74     aFtType             ( this, CUI_RES( FT_TYPE ) ),
75     aLbGradientType     ( this, CUI_RES( LB_GRADIENT_TYPES ) ),
76     aFtCenterX          ( this, CUI_RES( FT_CENTER_X ) ),
77     aMtrCenterX         ( this, CUI_RES( MTR_CENTER_X ) ),
78     aFtCenterY          ( this, CUI_RES( FT_CENTER_Y ) ),
79     aMtrCenterY         ( this, CUI_RES( MTR_CENTER_Y ) ),
80     aFtAngle            ( this, CUI_RES( FT_ANGLE ) ),
81     aMtrAngle           ( this, CUI_RES( MTR_ANGLE ) ),
82     aFtBorder           ( this, CUI_RES( FT_BORDER ) ),
83     aMtrBorder          ( this, CUI_RES( MTR_BORDER ) ),
84     aFtColorFrom        ( this, CUI_RES( FT_COLOR_FROM ) ),
85     aLbColorFrom        ( this, CUI_RES( LB_COLOR_FROM ) ),
86     aMtrColorFrom       ( this, CUI_RES( MTR_COLOR_FROM ) ),
87     aFtColorTo          ( this, CUI_RES( FT_COLOR_TO ) ),
88     aLbColorTo          ( this, CUI_RES( LB_COLOR_TO ) ),
89     aMtrColorTo         ( this, CUI_RES( MTR_COLOR_TO ) ),
90     aLbGradients        ( this, CUI_RES( LB_GRADIENTS ) ),
91     aCtlPreview         ( this, CUI_RES( CTL_PREVIEW ) ),
92     aBtnAdd             ( this, CUI_RES( BTN_ADD ) ),
93     aBtnModify          ( this, CUI_RES( BTN_MODIFY ) ),
94     aBtnDelete          ( this, CUI_RES( BTN_DELETE ) ),
95     aBtnLoad            ( this, CUI_RES( BTN_LOAD ) ),
96     aBtnSave            ( this, CUI_RES( BTN_SAVE ) ),
97 
98     rOutAttrs           ( rInAttrs ),
99 
100     maColorTab(),
101     maGradientList(),
102 
103     pXPool              ( (XOutdevItemPool*) rInAttrs.GetPool() ),
104     aXFStyleItem        ( XFILL_GRADIENT ),
105     aXGradientItem      ( String(), XGradient( COL_BLACK, COL_WHITE ) ),
106     aXFillAttr          ( pXPool ),
107     rXFSet              ( aXFillAttr.GetItemSet() )
108 {
109     aBtnLoad.SetModeImage( Image( CUI_RES( RID_SVXIMG_LOAD_H ) ), BMP_COLOR_HIGHCONTRAST );
110     aBtnSave.SetModeImage( Image( CUI_RES( RID_SVXIMG_SAVE_H ) ), BMP_COLOR_HIGHCONTRAST );
111 
112     FreeResource();
113 
114     aCtlPreview.SetAccessibleName(String(CUI_RES(STR_EXAMPLE)));
115     aLbGradients.SetAccessibleName( GetText());
116 
117 
118     // diese Page braucht ExchangeSupport
119     SetExchangeSupport();
120 
121     // Solange NICHT vom Item unterstuetzt
122 
123     //aMtrColorTo.Disable();
124     aMtrColorTo.SetValue( 100 );
125     //aMtrColorFrom.Disable();
126     aMtrColorFrom.SetValue( 100 );
127 
128     // Setzen des Output-Devices
129     rXFSet.Put( aXFStyleItem );
130     rXFSet.Put( aXGradientItem );
131     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
132 
133     // Handler ueberladen
134     aLbGradients.SetSelectHdl(
135         LINK( this, SvxGradientTabPage, ChangeGradientHdl_Impl ) );
136     aBtnAdd.SetClickHdl( LINK( this, SvxGradientTabPage, ClickAddHdl_Impl ) );
137     aBtnModify.SetClickHdl(
138         LINK( this, SvxGradientTabPage, ClickModifyHdl_Impl ) );
139     aBtnDelete.SetClickHdl(
140         LINK( this, SvxGradientTabPage, ClickDeleteHdl_Impl ) );
141 
142     Link aLink = LINK( this, SvxGradientTabPage, ModifiedHdl_Impl );
143     aLbGradientType.SetSelectHdl( aLink );
144     aMtrCenterX.SetModifyHdl( aLink );
145     aMtrCenterY.SetModifyHdl( aLink );
146     aMtrAngle.SetModifyHdl( aLink );
147     aMtrBorder.SetModifyHdl( aLink );
148     aMtrColorFrom.SetModifyHdl( aLink );
149     aLbColorFrom.SetSelectHdl( aLink );
150     aMtrColorTo.SetModifyHdl( aLink );
151     aLbColorTo.SetSelectHdl( aLink );
152 
153     aBtnLoad.SetClickHdl(
154         LINK( this, SvxGradientTabPage, ClickLoadHdl_Impl ) );
155     aBtnSave.SetClickHdl(
156         LINK( this, SvxGradientTabPage, ClickSaveHdl_Impl ) );
157 
158     aBtnAdd.SetAccessibleRelationMemberOf( &aFlProp );
159     aBtnModify.SetAccessibleRelationMemberOf( &aFlProp );
160     aBtnDelete.SetAccessibleRelationMemberOf( &aFlProp );
161     aLbGradients.SetAccessibleRelationLabeledBy(&aLbGradients);
162 
163     // #i76307# always paint the preview in LTR, because this is what the document does
164     aCtlPreview.EnableRTL( sal_False );
165 }
166 
167 // -----------------------------------------------------------------------
168 
Construct()169 void SvxGradientTabPage::Construct()
170 {
171     // Farbtabelle
172     aLbColorFrom.Fill( maColorTab );
173     aLbColorTo.CopyEntries( aLbColorFrom );
174 
175     // Farbverlauftabelle
176     aLbGradients.Fill( maGradientList );
177 }
178 
179 // -----------------------------------------------------------------------
180 
ActivatePage(const SfxItemSet &)181 void SvxGradientTabPage::ActivatePage( const SfxItemSet&  )
182 {
183     sal_uInt16 nPos;
184     sal_uInt16 nCount;
185 
186     if( *pDlgType == 0 ) // Flaechen-Dialog
187     {
188         *pbAreaTP = sal_False;
189 
190         if( maColorTab.get() )
191         {
192             // ColorTable
193             if( *pnColorTableState & CT_CHANGED ||
194                 *pnColorTableState & CT_MODIFIED )
195             {
196                 if( *pnColorTableState & CT_CHANGED )
197                     maColorTab = ( (SvxAreaTabDialog*) DLGWIN )->GetNewColorTable();
198 
199                 // LbColorFrom
200                 nPos = aLbColorFrom.GetSelectEntryPos();
201                 aLbColorFrom.Clear();
202                 aLbColorFrom.Fill( maColorTab );
203                 nCount = aLbColorFrom.GetEntryCount();
204                 if( nCount == 0 )
205                     ; // Dieser Fall sollte nicht auftreten
206                 else if( nCount <= nPos )
207                     aLbColorFrom.SelectEntryPos( 0 );
208                 else
209                     aLbColorFrom.SelectEntryPos( nPos );
210 
211                 // LbColorTo
212                 nPos = aLbColorTo.GetSelectEntryPos();
213                 aLbColorTo.Clear();
214                 aLbColorTo.CopyEntries( aLbColorFrom );
215                 nCount = aLbColorTo.GetEntryCount();
216                 if( nCount == 0 )
217                     ; // Dieser Fall sollte nicht auftreten
218                 else if( nCount <= nPos )
219                     aLbColorTo.SelectEntryPos( 0 );
220                 else
221                     aLbColorTo.SelectEntryPos( nPos );
222 
223                 ModifiedHdl_Impl( this );
224             }
225 
226             // Ermitteln (evtl. abschneiden) des Namens und in
227             // der GroupBox darstellen
228             String          aString( CUI_RES( RID_SVXSTR_TABLE ) ); aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
229             INetURLObject   aURL( maGradientList->GetPath() );
230 
231             aURL.Append( maGradientList->GetName() );
232             DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
233 
234             if ( aURL.getBase().getLength() > 18 )
235             {
236                 aString += String(aURL.getBase()).Copy( 0, 15 );
237                 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
238             }
239             else
240                 aString += String(aURL.getBase());
241 
242             if ( *pPageType == PT_GRADIENT && *pPos != LISTBOX_ENTRY_NOTFOUND )
243             {
244                 aLbGradients.SelectEntryPos( *pPos );
245             }
246             // Farben koennten geloescht worden sein
247             ChangeGradientHdl_Impl( this );
248 
249             *pPageType = PT_GRADIENT;
250             *pPos = LISTBOX_ENTRY_NOTFOUND;
251         }
252     }
253 }
254 
255 // -----------------------------------------------------------------------
256 
DeactivatePage(SfxItemSet * _pSet)257 int SvxGradientTabPage::DeactivatePage( SfxItemSet* _pSet )
258 {
259     if( CheckChanges_Impl() == -1L )
260         return KEEP_PAGE;
261 
262     if( _pSet )
263         FillItemSet( *_pSet );
264 
265     return LEAVE_PAGE;
266 }
267 
268 // -----------------------------------------------------------------------
269 
CheckChanges_Impl()270 long SvxGradientTabPage::CheckChanges_Impl()
271 {
272     // wird hier benutzt, um Aenderungen NICHT zu verlieren
273     XGradient aTmpGradient( aLbColorFrom.GetSelectEntryColor(),
274                           aLbColorTo.GetSelectEntryColor(),
275                           (XGradientStyle) aLbGradientType.GetSelectEntryPos(),
276                           static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden
277                           (sal_uInt16) aMtrCenterX.GetValue(),
278                           (sal_uInt16) aMtrCenterY.GetValue(),
279                           (sal_uInt16) aMtrBorder.GetValue(),
280                           (sal_uInt16) aMtrColorFrom.GetValue(),
281                           (sal_uInt16) aMtrColorTo.GetValue() );
282 
283     sal_uInt16 nPos = aLbGradients.GetSelectEntryPos();
284     if( nPos != LISTBOX_ENTRY_NOTFOUND )
285     {
286         XGradient aGradient = maGradientList->GetGradient( nPos )->GetGradient();
287         String aString = aLbGradients.GetSelectEntry();
288 
289         if( !( aTmpGradient == aGradient ) )
290         {
291             ResMgr& rMgr = CUI_MGR();
292             Image aWarningBoxImage = WarningBox::GetStandardImage();
293             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
294             DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
295             AbstractSvxMessDialog* aMessDlg = pFact->CreateSvxMessDialog( DLGWIN, RID_SVXDLG_MESSBOX,
296                                                         SVX_RESSTR( RID_SVXSTR_GRADIENT ),
297                                                         CUI_RESSTR( RID_SVXSTR_ASK_CHANGE_GRADIENT ),
298                                                         &aWarningBoxImage );
299             DBG_ASSERT(aMessDlg, "Dialogdiet fail!");//CHINA001
300             aMessDlg->SetButtonText( MESS_BTN_1, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_1,
301                                     String( ResId( RID_SVXSTR_CHANGE, rMgr ) ) );
302             aMessDlg->SetButtonText( MESS_BTN_2, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_2,
303                                     String( ResId( RID_SVXSTR_ADD, rMgr ) ) );
304 
305             short nRet = aMessDlg->Execute(); //CHINA001 short nRet = aMessDlg.Execute();
306 
307             switch( nRet )
308             {
309                 case RET_BTN_1: // Aendern
310                 {
311                     ClickModifyHdl_Impl( this );
312                     aGradient = maGradientList->GetGradient( nPos )->GetGradient();
313                 }
314                 break;
315 
316                 case RET_BTN_2: // Hinzufuegen
317                 {
318                     ClickAddHdl_Impl( this );
319                     nPos = aLbGradients.GetSelectEntryPos();
320                     aGradient = maGradientList->GetGradient( nPos )->GetGradient();
321                 }
322                 break;
323 
324                 case RET_CANCEL:
325                     // return( -1L ); <-- wuerde die Seite nicht verlassen
326                 break;
327                 // return( sal_True ); // Abbruch
328             }
329             delete aMessDlg; //add by CHINA001
330         }
331     }
332     nPos = aLbGradients.GetSelectEntryPos();
333     if( nPos != LISTBOX_ENTRY_NOTFOUND )
334     {
335         *pPos = nPos;
336     }
337     return 0L;
338 }
339 
340 // -----------------------------------------------------------------------
341 
FillItemSet(SfxItemSet & rSet)342 sal_Bool SvxGradientTabPage::FillItemSet( SfxItemSet& rSet )
343 {
344     if( *pDlgType == 0 && *pPageType == PT_GRADIENT && *pbAreaTP == sal_False )
345     {
346         // CheckChanges(); <-- doppelte Abfrage ?
347 
348         XGradient*  pXGradient = NULL;
349         String      aString;
350         sal_uInt16      nPos = aLbGradients.GetSelectEntryPos();
351         if( nPos != LISTBOX_ENTRY_NOTFOUND )
352         {
353             pXGradient = new XGradient( maGradientList->GetGradient( nPos )->GetGradient() );
354             aString = aLbGradients.GetSelectEntry();
355 
356         }
357         else
358         // Farbverlauf wurde (unbekannt) uebergeben
359         {
360             pXGradient = new XGradient( aLbColorFrom.GetSelectEntryColor(),
361                         aLbColorTo.GetSelectEntryColor(),
362                         (XGradientStyle) aLbGradientType.GetSelectEntryPos(),
363                         static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden
364                         (sal_uInt16) aMtrCenterX.GetValue(),
365                         (sal_uInt16) aMtrCenterY.GetValue(),
366                         (sal_uInt16) aMtrBorder.GetValue(),
367                         (sal_uInt16) aMtrColorFrom.GetValue(),
368                         (sal_uInt16) aMtrColorTo.GetValue() );
369         }
370         DBG_ASSERT( pXGradient, "XGradient konnte nicht erzeugt werden" );
371         rSet.Put( XFillStyleItem( XFILL_GRADIENT ) );
372         rSet.Put( XFillGradientItem( aString, *pXGradient ) );
373 
374         delete pXGradient;
375     }
376     return sal_True;
377 }
378 
379 // -----------------------------------------------------------------------
380 
Reset(const SfxItemSet &)381 void SvxGradientTabPage::Reset( const SfxItemSet& )
382 {
383     // aLbGradients.SelectEntryPos( 0 );
384     ChangeGradientHdl_Impl( this );
385 
386     // Status der Buttons ermitteln
387     if( maGradientList->Count() )
388     {
389         aBtnModify.Enable();
390         aBtnDelete.Enable();
391         aBtnSave.Enable();
392     }
393     else
394     {
395         aBtnModify.Disable();
396         aBtnDelete.Disable();
397         aBtnSave.Disable();
398     }
399 }
400 
401 // -----------------------------------------------------------------------
402 
Create(Window * pWindow,const SfxItemSet & rOutAttrs)403 SfxTabPage* SvxGradientTabPage::Create( Window* pWindow,
404                 const SfxItemSet& rOutAttrs )
405 {
406     return new SvxGradientTabPage( pWindow, rOutAttrs );
407 }
408 
409 //------------------------------------------------------------------------
410 
IMPL_LINK(SvxGradientTabPage,ModifiedHdl_Impl,void *,pControl)411 IMPL_LINK( SvxGradientTabPage, ModifiedHdl_Impl, void *, pControl )
412 {
413     XGradientStyle eXGS = (XGradientStyle) aLbGradientType.GetSelectEntryPos();
414 
415     XGradient aXGradient( aLbColorFrom.GetSelectEntryColor(),
416                           aLbColorTo.GetSelectEntryColor(),
417                           eXGS,
418                           static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden
419                           (sal_uInt16) aMtrCenterX.GetValue(),
420                           (sal_uInt16) aMtrCenterY.GetValue(),
421                           (sal_uInt16) aMtrBorder.GetValue(),
422                           (sal_uInt16) aMtrColorFrom.GetValue(),
423                           (sal_uInt16) aMtrColorTo.GetValue() );
424 
425     // Enablen/Disablen von Controls
426     if( pControl == &aLbGradientType || pControl == this )
427         SetControlState_Impl( eXGS );
428 
429     // Anzeigen im XOutDev
430     rXFSet.Put( XFillGradientItem( String(), aXGradient ) );
431     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
432 
433     aCtlPreview.Invalidate();
434 
435     return 0L;
436 }
437 
438 //------------------------------------------------------------------------
439 
IMPL_LINK(SvxGradientTabPage,ClickAddHdl_Impl,void *,EMPTYARG)440 IMPL_LINK( SvxGradientTabPage, ClickAddHdl_Impl, void *, EMPTYARG )
441 {
442     ResMgr& rMgr = CUI_MGR();
443     String aNewName( SVX_RES( RID_SVXSTR_GRADIENT ) );
444     String aDesc( CUI_RES( RID_SVXSTR_DESC_GRADIENT ) );
445     String aName;
446 
447     long nCount = maGradientList.get() ? maGradientList->Count() : 0;
448     long j = 1;
449     sal_Bool bDifferent = sal_False;
450 
451     while( !bDifferent )
452     {
453         aName  = aNewName;
454         aName += sal_Unicode(' ');
455         aName += UniString::CreateFromInt32( j++ );
456         bDifferent = sal_True;
457 
458         for( long i = 0; i < nCount && bDifferent; i++ )
459             if( aName == maGradientList->GetGradient( i )->GetName() )
460                 bDifferent = sal_False;
461     }
462 
463     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
464     DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
465     AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
466     DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
467     WarningBox*    pWarnBox = NULL;
468     sal_uInt16         nError   = RID_SVXSTR_WARN_NAME_DUPLICATE;
469 
470     while( pDlg->Execute() == RET_OK )
471     {
472         pDlg->GetName( aName );
473 
474         bDifferent = sal_True;
475 
476         for( long i = 0; i < nCount && bDifferent; i++ )
477             if( aName == maGradientList->GetGradient( i )->GetName() )
478                 bDifferent = sal_False;
479 
480         if( bDifferent )
481         {
482             nError = 0;
483             break;
484         }
485 
486         if( !pWarnBox )
487         {
488             pWarnBox = new WarningBox( DLGWIN,
489                                        WinBits( WB_OK_CANCEL ),
490                                        String( ResId( nError, rMgr ) ) );
491             pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE );
492         }
493 
494         if( pWarnBox->Execute() != RET_OK )
495             break;
496     }
497     //Rectangle aDlgRect( pDlg->GetPosPixel(), pDlg->GetSizePixel() );
498     delete pDlg;
499     delete pWarnBox;
500 
501     if( !nError )
502     {
503         XGradient aXGradient( aLbColorFrom.GetSelectEntryColor(),
504                               aLbColorTo.GetSelectEntryColor(),
505                               (XGradientStyle) aLbGradientType.GetSelectEntryPos(),
506                               static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden
507                               (sal_uInt16) aMtrCenterX.GetValue(),
508                               (sal_uInt16) aMtrCenterY.GetValue(),
509                               (sal_uInt16) aMtrBorder.GetValue(),
510                               (sal_uInt16) aMtrColorFrom.GetValue(),
511                               (sal_uInt16) aMtrColorTo.GetValue() );
512         XGradientEntry* pEntry = new XGradientEntry( aXGradient, aName );
513 
514         maGradientList->Insert( pEntry, nCount );
515 
516         aLbGradients.Append( *pEntry, maGradientList->GetUiBitmap( nCount ) );
517 
518         aLbGradients.SelectEntryPos( aLbGradients.GetEntryCount() - 1 );
519 
520 #ifdef WNT
521         // hack: #31355# W.P.
522         Rectangle aRect( aLbGradients.GetPosPixel(), aLbGradients.GetSizePixel() );
523         if( sal_True ) {                // ??? overlapped with pDlg
524                                     // and srolling
525             Invalidate( aRect );
526             //aLbGradients.Invalidate();
527         }
528 #endif
529 
530         // Flag fuer modifiziert setzen
531         *pnGradientListState |= CT_MODIFIED;
532 
533         ChangeGradientHdl_Impl( this );
534     }
535 
536     // Status der Buttons ermitteln
537     if( maGradientList.get() && maGradientList->Count() )
538     {
539         aBtnModify.Enable();
540         aBtnDelete.Enable();
541         aBtnSave.Enable();
542     }
543     return 0L;
544 }
545 
546 //------------------------------------------------------------------------
547 
IMPL_LINK(SvxGradientTabPage,ClickModifyHdl_Impl,void *,EMPTYARG)548 IMPL_LINK( SvxGradientTabPage, ClickModifyHdl_Impl, void *, EMPTYARG )
549 {
550     sal_uInt16 nPos = aLbGradients.GetSelectEntryPos();
551 
552     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
553     {
554         ResMgr& rMgr = CUI_MGR();
555         String aNewName( SVX_RES( RID_SVXSTR_GRADIENT ) );
556         String aDesc( CUI_RES( RID_SVXSTR_DESC_GRADIENT ) );
557         String aName( maGradientList->GetGradient( nPos )->GetName() );
558         String aOldName = aName;
559 
560         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
561         DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
562         AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
563         DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
564 
565         long nCount = maGradientList.get() ? maGradientList->Count() : 0;
566         sal_Bool bDifferent = sal_False;
567         sal_Bool bLoop = sal_True;
568 
569         while( bLoop && pDlg->Execute() == RET_OK )
570         {
571             pDlg->GetName( aName );
572             bDifferent = sal_True;
573 
574             for( long i = 0; i < nCount && bDifferent; i++ )
575             {
576                 if( aName == maGradientList->GetGradient( i )->GetName() &&
577                     aName != aOldName )
578                     bDifferent = sal_False;
579             }
580 
581             if( bDifferent )
582             {
583                 bLoop = sal_False;
584                 XGradient aXGradient( aLbColorFrom.GetSelectEntryColor(),
585                                       aLbColorTo.GetSelectEntryColor(),
586                                       (XGradientStyle) aLbGradientType.GetSelectEntryPos(),
587                                       static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden
588                                       (sal_uInt16) aMtrCenterX.GetValue(),
589                                       (sal_uInt16) aMtrCenterY.GetValue(),
590                                       (sal_uInt16) aMtrBorder.GetValue(),
591                                       (sal_uInt16) aMtrColorFrom.GetValue(),
592                                       (sal_uInt16) aMtrColorTo.GetValue() );
593 
594                 XGradientEntry* pEntry = new XGradientEntry( aXGradient, aName );
595 
596                 delete maGradientList->Replace( pEntry, nPos );
597 
598                 aLbGradients.Modify( *pEntry, nPos, maGradientList->GetUiBitmap( nPos ) );
599 
600                 aLbGradients.SelectEntryPos( nPos );
601 
602                 // Flag fuer modifiziert setzen
603                 *pnGradientListState |= CT_MODIFIED;
604             }
605             else
606             {
607                 WarningBox aBox( DLGWIN, WinBits( WB_OK ),String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
608                 aBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
609                 aBox.Execute();
610             }
611 
612         }
613         delete pDlg;
614     }
615     return 0L;
616 }
617 
618 //------------------------------------------------------------------------
619 
IMPL_LINK(SvxGradientTabPage,ClickDeleteHdl_Impl,void *,EMPTYARG)620 IMPL_LINK( SvxGradientTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG )
621 {
622     sal_uInt16 nPos = aLbGradients.GetSelectEntryPos();
623 
624     if( nPos != LISTBOX_ENTRY_NOTFOUND )
625     {
626         QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
627             String( CUI_RES( RID_SVXSTR_ASK_DEL_GRADIENT ) ) );
628 
629         if ( aQueryBox.Execute() == RET_YES )
630         {
631             delete maGradientList->Remove( nPos );
632             aLbGradients.RemoveEntry( nPos );
633             aLbGradients.SelectEntryPos( 0 );
634 
635             aCtlPreview.Invalidate();
636 
637             ChangeGradientHdl_Impl( this );
638 
639             // Flag fuer modifiziert setzen
640             *pnGradientListState |= CT_MODIFIED;
641         }
642     }
643     // Status der Buttons ermitteln
644     if( !maGradientList.get() || !maGradientList->Count() )
645     {
646         aBtnModify.Disable();
647         aBtnDelete.Disable();
648         aBtnSave.Disable();
649     }
650     return 0L;
651 }
652 
653 // -----------------------------------------------------------------------
654 
IMPL_LINK(SvxGradientTabPage,ClickLoadHdl_Impl,void *,EMPTYARG)655 IMPL_LINK( SvxGradientTabPage, ClickLoadHdl_Impl, void *, EMPTYARG )
656 {
657     ResMgr& rMgr = CUI_MGR();
658     sal_uInt16 nReturn = RET_YES;
659 
660     if ( *pnGradientListState & CT_MODIFIED )
661     {
662         nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ),
663             String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute();
664 
665         if ( nReturn == RET_YES )
666             maGradientList->Save();
667     }
668 
669     if ( nReturn != RET_CANCEL )
670     {
671         ::sfx2::FileDialogHelper aDlg(
672             com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
673             0 );
674         String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sog" ) );
675         aDlg.AddFilter( aStrFilterType, aStrFilterType );
676         INetURLObject aFile( SvtPathOptions().GetPalettePath() );
677         aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
678 
679         if( aDlg.Execute() == ERRCODE_NONE )
680         {
681             EnterWait();
682 
683             INetURLObject aURL( aDlg.GetPath() );
684             INetURLObject aPathURL( aURL );
685 
686             aPathURL.removeSegment();
687             aPathURL.removeFinalSlash();
688 
689             // Liste speichern
690             XGradientListSharedPtr aGrdList(XPropertyListFactory::CreateSharedXGradientList(aPathURL.GetMainURL(INetURLObject::NO_DECODE)));
691             aGrdList->SetName( aURL.getName() );
692 
693             if ( aGrdList->Load() )
694             {
695                 if ( aGrdList )
696                 {
697                     maGradientList = aGrdList;
698                     ( (SvxAreaTabDialog*) DLGWIN )->SetNewGradientList( maGradientList );
699 
700                     aLbGradients.Clear();
701                     aLbGradients.Fill( maGradientList );
702                     Reset( rOutAttrs );
703 
704                     maGradientList->SetName( aURL.getName() );
705 
706                     // Ermitteln (evtl. abschneiden) des Namens und in
707                     // der GroupBox darstellen
708                     String aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
709                     aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
710 
711                     if ( aURL.getBase().getLength() > 18 )
712                     {
713                         aString += String(aURL.getBase()).Copy( 0, 15 );
714                         aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
715                     }
716                     else
717                         aString += String(aURL.getBase());
718 
719                     // Flag fuer gewechselt setzen
720                     *pnGradientListState |= CT_CHANGED;
721                     // Flag fuer modifiziert entfernen
722                     *pnGradientListState &= ~CT_MODIFIED;
723                 }
724                 LeaveWait();
725             }
726             else
727             {
728                 LeaveWait();
729                 //aIStream.Close();
730                 ErrorBox( DLGWIN, WinBits( WB_OK ),
731                     String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
732             }
733         }
734     }
735 
736     // Status der Buttons ermitteln
737     if( maGradientList.get() && maGradientList->Count() )
738     {
739         aBtnModify.Enable();
740         aBtnDelete.Enable();
741         aBtnSave.Enable();
742     }
743     else
744     {
745         aBtnModify.Disable();
746         aBtnDelete.Disable();
747         aBtnSave.Disable();
748     }
749     return 0L;
750 }
751 
752 // -----------------------------------------------------------------------
753 
IMPL_LINK(SvxGradientTabPage,ClickSaveHdl_Impl,void *,EMPTYARG)754 IMPL_LINK( SvxGradientTabPage, ClickSaveHdl_Impl, void *, EMPTYARG )
755 {
756     ::sfx2::FileDialogHelper aDlg(
757         com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
758     String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sog" ) );
759     aDlg.AddFilter( aStrFilterType, aStrFilterType );
760 
761     INetURLObject aFile( SvtPathOptions().GetPalettePath() );
762     DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
763 
764     if( maGradientList->GetName().Len() )
765     {
766         aFile.Append( maGradientList->GetName() );
767 
768         if( !aFile.getExtension().getLength() )
769             aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "sog" ) ) );
770     }
771 
772     aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
773     if ( aDlg.Execute() == ERRCODE_NONE )
774     {
775         INetURLObject   aURL( aDlg.GetPath() );
776         INetURLObject   aPathURL( aURL );
777 
778         aPathURL.removeSegment();
779         aPathURL.removeFinalSlash();
780 
781         maGradientList->SetName( aURL.getName() );
782         maGradientList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
783 
784         if( maGradientList->Save() )
785         {
786             // Ermitteln (evtl. abschneiden) des Namens und in
787             // der GroupBox darstellen
788             String aString( CUI_RES( RID_SVXSTR_TABLE ) );
789             aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
790 
791             if ( aURL.getBase().getLength() > 18 )
792             {
793                 aString += String(aURL.getBase()).Copy( 0, 15 );
794                 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
795             }
796             else
797                 aString += String(aURL.getBase());
798 
799             // Flag fuer gespeichert setzen
800             *pnGradientListState |= CT_SAVED;
801             // Flag fuer modifiziert entfernen
802             *pnGradientListState &= ~CT_MODIFIED;
803         }
804         else
805         {
806             ErrorBox( DLGWIN, WinBits( WB_OK ),
807                 String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute();
808         }
809     }
810 
811     return 0L;
812 }
813 
814 //------------------------------------------------------------------------
815 
IMPL_LINK(SvxGradientTabPage,ChangeGradientHdl_Impl,void *,EMPTYARG)816 IMPL_LINK( SvxGradientTabPage, ChangeGradientHdl_Impl, void *, EMPTYARG )
817 {
818     XGradient* pGradient = NULL;
819     int nPos = aLbGradients.GetSelectEntryPos();
820 
821     if( nPos != LISTBOX_ENTRY_NOTFOUND )
822         pGradient = new XGradient( ( (XGradientEntry*) maGradientList->GetGradient( nPos ) )->GetGradient() );
823     else
824     {
825         const SfxPoolItem* pPoolItem = NULL;
826         if( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLSTYLE ), sal_True, &pPoolItem ) )
827         {
828             if( ( XFILL_GRADIENT == (XFillStyle) ( ( const XFillStyleItem* ) pPoolItem )->GetValue() ) &&
829                 ( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLGRADIENT ), sal_True, &pPoolItem ) ) )
830             {
831                 pGradient = new XGradient( ( ( const XFillGradientItem* ) pPoolItem )->GetGradientValue() );
832             }
833         }
834         if( !pGradient )
835         {
836             aLbGradients.SelectEntryPos( 0 );
837             nPos = aLbGradients.GetSelectEntryPos();
838             if( nPos != LISTBOX_ENTRY_NOTFOUND )
839                 pGradient = new XGradient( ( (XGradientEntry*) maGradientList->GetGradient( nPos ) )->GetGradient() );
840         }
841     }
842 
843     if( pGradient )
844     {
845         XGradientStyle eXGS = pGradient->GetGradientStyle();
846 
847         aLbGradientType.SelectEntryPos(
848             sal::static_int_cast< sal_uInt16 >( eXGS ) );
849         // Wenn der EIntrag nicht in der Listbox ist, werden die Farben
850         // temporaer hinzugenommen
851         aLbColorFrom.SetNoSelection();
852         aLbColorFrom.SelectEntry( pGradient->GetStartColor() );
853 
854         if ( aLbColorFrom.GetSelectEntryCount() == 0 )
855         {
856             aLbColorFrom.InsertEntry( pGradient->GetStartColor(),
857                                       String() );
858             aLbColorFrom.SelectEntry( pGradient->GetStartColor() );
859         }
860         aLbColorTo.SetNoSelection();
861         aLbColorTo.SelectEntry( pGradient->GetEndColor() );
862 
863         if ( aLbColorTo.GetSelectEntryCount() == 0 )
864         {
865             aLbColorTo.InsertEntry( pGradient->GetEndColor(), String() );
866             aLbColorTo.SelectEntry( pGradient->GetEndColor() );
867         }
868 
869         aMtrAngle.SetValue( pGradient->GetAngle() / 10 ); // sollte in Resource geaendert werden
870         aMtrBorder.SetValue( pGradient->GetBorder() );
871         aMtrCenterX.SetValue( pGradient->GetXOffset() );
872         aMtrCenterY.SetValue( pGradient->GetYOffset() );
873         aMtrColorFrom.SetValue( pGradient->GetStartIntens() );
874         aMtrColorTo.SetValue( pGradient->GetEndIntens() );
875 
876         // Controls Disablen/Enablen
877         SetControlState_Impl( eXGS );
878 
879         // ItemSet fuellen und an aCtlPreview weiterleiten
880         rXFSet.Put( XFillGradientItem( String(), *pGradient ) );
881         aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
882 
883         aCtlPreview.Invalidate();
884         delete pGradient;
885     }
886     return 0L;
887 }
888 
889 //------------------------------------------------------------------------
890 
SetControlState_Impl(XGradientStyle eXGS)891 void SvxGradientTabPage::SetControlState_Impl( XGradientStyle eXGS )
892 {
893     switch( eXGS )
894     {
895         case XGRAD_LINEAR:
896         case XGRAD_AXIAL:
897             aFtCenterX.Disable();
898             aMtrCenterX.Disable();
899             aFtCenterY.Disable();
900             aMtrCenterY.Disable();
901             aFtAngle.Enable();
902             aMtrAngle.Enable();
903             break;
904 
905         case XGRAD_RADIAL:
906             aFtCenterX.Enable();
907             aMtrCenterX.Enable();
908             aFtCenterY.Enable();
909             aMtrCenterY.Enable();
910             aFtAngle.Disable();
911             aMtrAngle.Disable();
912             break;
913 
914         case XGRAD_ELLIPTICAL:
915             aFtCenterX.Enable();
916             aMtrCenterX.Enable();
917             aFtCenterY.Enable();
918             aMtrCenterY.Enable();
919             aFtAngle.Enable();
920             aMtrAngle.Enable();
921             break;
922 
923         case XGRAD_SQUARE:
924         case XGRAD_RECT:
925             aFtCenterX.Enable();
926             aMtrCenterX.Enable();
927             aFtCenterY.Enable();
928             aMtrCenterY.Enable();
929             aFtAngle.Enable();
930             aMtrAngle.Enable();
931             break;
932     }
933 }
934 
935 
936