summaryrefslogtreecommitdiff
path: root/cui/source/tabpages/tpcolor.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/tabpages/tpcolor.cxx')
-rw-r--r--cui/source/tabpages/tpcolor.cxx1276
1 files changed, 1276 insertions, 0 deletions
diff --git a/cui/source/tabpages/tpcolor.cxx b/cui/source/tabpages/tpcolor.cxx
new file mode 100644
index 000000000000..616dba0169e8
--- /dev/null
+++ b/cui/source/tabpages/tpcolor.cxx
@@ -0,0 +1,1276 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: tpcolor.cxx,v $
+ * $Revision: 1.33 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_cui.hxx"
+
+// include ---------------------------------------------------------------
+#include <tools/shl.hxx>
+#include <tools/urlobj.hxx>
+#include <unotools/pathoptions.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/module.hxx>
+#include <svtools/colrdlg.hxx>
+#include <vcl/msgbox.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
+
+#define _SVX_TPCOLOR_CXX
+
+#include <cuires.hrc>
+#include "helpid.hrc"
+#include "svx/xattr.hxx"
+#include <svx/xpool.hxx>
+#include <svx/xtable.hxx>
+#include "svx/drawitem.hxx"
+#include "cuitabarea.hxx"
+#include "tabarea.hrc"
+#include "defdlgname.hxx" //CHINA001 #include "dlgname.hxx"
+//#include "dlgname.hrc"
+#include <svx/svxdlg.hxx> //CHINA001
+#include <dialmgr.hxx>
+#include <cuitabline.hxx>
+#include <svx/dialmgr.hxx>
+#include <svx/dialogs.hrc>
+
+#define DLGWIN GetParentDialog( this )
+
+/*************************************************************************
+|*
+|* Dialog zum Aendern und Definieren der Farben
+|*
+\************************************************************************/
+
+static Window* GetParentDialog( Window* pWindow )
+{
+ while( pWindow )
+ {
+ if( pWindow->IsDialog() )
+ break;
+
+ pWindow = pWindow->GetParent();
+ }
+
+ return pWindow;
+}
+
+SvxColorTabPage::SvxColorTabPage
+(
+ Window* pParent,
+ const SfxItemSet& rInAttrs
+) :
+
+ SfxTabPage ( pParent, CUI_RES( RID_SVXPAGE_COLOR ), rInAttrs ),
+
+ aFlProp ( this, CUI_RES( FL_PROP ) ),
+ aFtName ( this, CUI_RES( FT_NAME ) ),
+ aEdtName ( this, CUI_RES( EDT_NAME ) ),
+ aFtColor ( this, CUI_RES( FT_COLOR ) ),
+ aLbColor ( this, CUI_RES( LB_COLOR ) ),
+
+ aTableNameFT ( this, CUI_RES( FT_TABLE_NAME ) ),
+ aValSetColorTable ( this, CUI_RES( CTL_COLORTABLE ) ),
+
+ aCtlPreviewOld ( this, CUI_RES( CTL_PREVIEW_OLD ) ),
+ aCtlPreviewNew ( this, CUI_RES( CTL_PREVIEW_NEW ) ),
+
+ aLbColorModel ( this, CUI_RES( LB_COLORMODEL ) ),
+ aFtColorModel1 ( this, CUI_RES( FT_1 ) ),
+ aMtrFldColorModel1 ( this, CUI_RES( MTR_FLD_1 ) ),
+ aFtColorModel2 ( this, CUI_RES( FT_2 ) ),
+ aMtrFldColorModel2 ( this, CUI_RES( MTR_FLD_2 ) ),
+ aFtColorModel3 ( this, CUI_RES( FT_3 ) ),
+ aMtrFldColorModel3 ( this, CUI_RES( MTR_FLD_3 ) ),
+ aFtColorModel4 ( this, CUI_RES( FT_4 ) ),
+ aMtrFldColorModel4 ( this, CUI_RES( MTR_FLD_4 ) ),
+ aBtnAdd ( this, CUI_RES( BTN_ADD ) ),
+ aBtnModify ( this, CUI_RES( BTN_MODIFY ) ),
+ aBtnWorkOn ( this, CUI_RES( BTN_WORK_ON ) ),
+ aBtnDelete ( this, CUI_RES( BTN_DELETE ) ),
+ aBtnLoad ( this, CUI_RES( BTN_LOAD ) ),
+ aBtnSave ( this, CUI_RES( BTN_SAVE ) ),
+
+ rOutAttrs ( rInAttrs ),
+ pColorTab( NULL ),
+
+ bDeleteColorTable ( TRUE ),
+
+ pXPool ( (XOutdevItemPool*) rInAttrs.GetPool() ),
+ aXFStyleItem ( XFILL_SOLID ),
+ aXFillColorItem ( String(), Color( COL_BLACK ) ),
+ aXFillAttr ( pXPool ),
+ rXFSet ( aXFillAttr.GetItemSet() ),
+
+ eCM ( CM_RGB )
+
+{
+ aBtnLoad.SetModeImage( Image( CUI_RES( RID_SVXIMG_LOAD_H ) ), BMP_COLOR_HIGHCONTRAST );
+ aBtnSave.SetModeImage( Image( CUI_RES( RID_SVXIMG_SAVE_H ) ), BMP_COLOR_HIGHCONTRAST );
+
+ FreeResource();
+
+ // diese Page braucht ExchangeSupport
+ SetExchangeSupport();
+
+ // Setzen des Output-Devices
+ rXFSet.Put( aXFStyleItem );
+ rXFSet.Put( aXFillColorItem );
+ aCtlPreviewOld.SetAttributes( aXFillAttr.GetItemSet() );
+ aCtlPreviewNew.SetAttributes( aXFillAttr.GetItemSet() );
+
+ // Handler ueberladen
+ aLbColor.SetSelectHdl(
+ LINK( this, SvxColorTabPage, SelectColorLBHdl_Impl ) );
+ aValSetColorTable.SetSelectHdl(
+ LINK( this, SvxColorTabPage, SelectValSetHdl_Impl ) );
+ aLbColorModel.SetSelectHdl(
+ LINK( this, SvxColorTabPage, SelectColorModelHdl_Impl ) );
+
+ Link aLink = LINK( this, SvxColorTabPage, ModifiedHdl_Impl );
+ aMtrFldColorModel1.SetModifyHdl( aLink );
+ aMtrFldColorModel2.SetModifyHdl( aLink );
+ aMtrFldColorModel3.SetModifyHdl( aLink );
+ aMtrFldColorModel4.SetModifyHdl( aLink );
+
+ aBtnAdd.SetClickHdl( LINK( this, SvxColorTabPage, ClickAddHdl_Impl ) );
+ aBtnModify.SetClickHdl(
+ LINK( this, SvxColorTabPage, ClickModifyHdl_Impl ) );
+ aBtnWorkOn.SetClickHdl(
+ LINK( this, SvxColorTabPage, ClickWorkOnHdl_Impl ) );
+ aBtnDelete.SetClickHdl(
+ LINK( this, SvxColorTabPage, ClickDeleteHdl_Impl ) );
+ aBtnLoad.SetClickHdl( LINK( this, SvxColorTabPage, ClickLoadHdl_Impl ) );
+ aBtnSave.SetClickHdl( LINK( this, SvxColorTabPage, ClickSaveHdl_Impl ) );
+
+ // ValueSet
+ aValSetColorTable.SetStyle( aValSetColorTable.GetStyle() | WB_VSCROLL | WB_ITEMBORDER );
+ aValSetColorTable.SetColCount( 8 );
+ aValSetColorTable.SetLineCount( 10 );
+ aValSetColorTable.SetExtraSpacing( 0 );
+ aValSetColorTable.Show();
+
+}
+
+// -----------------------------------------------------------------------
+
+void SvxColorTabPage::Construct()
+{
+ aLbColor.Fill( pColorTab );
+ FillValueSet_Impl( aValSetColorTable );
+}
+
+// -----------------------------------------------------------------------
+
+void SvxColorTabPage::ActivatePage( const SfxItemSet& )
+{
+ if( *pDlgType == 0 ) // Flaechen-Dialog
+ {
+ *pbAreaTP = FALSE;
+
+ if( pColorTab )
+ {
+ if( *pPageType == PT_COLOR && *pPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ aLbColor.SelectEntryPos( *pPos );
+ aValSetColorTable.SelectItem( aLbColor.GetSelectEntryPos() + 1 );
+ aEdtName.SetText( aLbColor.GetSelectEntry() );
+
+ ChangeColorHdl_Impl( this );
+ }
+ else if( *pPageType == PT_COLOR && *pPos == LISTBOX_ENTRY_NOTFOUND )
+ {
+ const SfxPoolItem* pPoolItem = NULL;
+ if( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLCOLOR ), TRUE, &pPoolItem ) )
+ {
+ aLbColorModel.SelectEntryPos( CM_RGB );
+
+ aAktuellColor.SetColor ( ( ( const XFillColorItem* ) pPoolItem )->GetColorValue().GetColor() );
+
+ aEdtName.SetText( ( ( const XFillColorItem* ) pPoolItem )->GetName() );
+
+ aMtrFldColorModel1.SetValue( ColorToPercent_Impl( aAktuellColor.GetRed() ) );
+ aMtrFldColorModel2.SetValue( ColorToPercent_Impl( aAktuellColor.GetGreen() ) );
+ aMtrFldColorModel3.SetValue( ColorToPercent_Impl( aAktuellColor.GetBlue() ) );
+
+ // ItemSet fuellen und an XOut weiterleiten
+ rXFSet.Put( XFillColorItem( String(), aAktuellColor ) );
+ aCtlPreviewOld.SetAttributes( aXFillAttr.GetItemSet() );
+ aCtlPreviewNew.SetAttributes( aXFillAttr.GetItemSet() );
+
+ aCtlPreviewNew.Invalidate();
+ aCtlPreviewOld.Invalidate();
+ }
+ }
+
+ // Ermitteln (evtl. abschneiden) des Namens und in
+ // der GroupBox darstellen
+ String aString( CUI_RES( RID_SVXSTR_TABLE ) ); aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
+ INetURLObject aURL( pColorTab->GetPath() );
+
+ aURL.Append( pColorTab->GetName() );
+ DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
+
+ if ( aURL.getBase().getLength() > 18 )
+ {
+ aString += String(aURL.getBase()).Copy( 0, 15 );
+ aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
+ }
+ else
+ aString += String(aURL.getBase());
+
+ aTableNameFT.SetText( aString );
+
+ // Damit evtl. geaenderte Farbe verworfen wird
+ SelectColorLBHdl_Impl( this );
+
+ *pPageType = PT_COLOR;
+ *pPos = LISTBOX_ENTRY_NOTFOUND;
+ }
+ }
+ else
+ {
+ // Buttons werden gehided, weil Paletten z.Z. nur
+ // ueber den AreaDlg funktionieren!!!
+ // ActivatePage() muss von anderen Dialogen explizit
+ // gerufen werden, da ActivatePage() nicht gerufen wird,
+ // wenn Seite als Erste im Dialog angezeigt wird
+ aBtnLoad.Hide();
+ aBtnSave.Hide();
+ }
+}
+
+// -----------------------------------------------------------------------
+
+int SvxColorTabPage::DeactivatePage( SfxItemSet* _pSet )
+{
+ if ( CheckChanges_Impl() == -1L )
+ return( KEEP_PAGE );
+
+ if( _pSet )
+ FillItemSet( *_pSet );
+
+ return( LEAVE_PAGE );
+}
+
+// -----------------------------------------------------------------------
+
+long SvxColorTabPage::CheckChanges_Impl()
+{
+ // wird hier benutzt, um Aenderungen NICHT zu verlieren
+
+ Color aTmpColor (aAktuellColor);
+ if (eCM != CM_RGB)
+ ConvertColorValues (aTmpColor, CM_RGB);
+
+ USHORT nPos = aLbColor.GetSelectEntryPos();
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ Color aColor = pColorTab->GetColor( nPos )->GetColor();
+ String aString = aLbColor.GetSelectEntry();
+
+ // aNewColor, da COL_USER != COL_irgendwas, auch wenn RGB-Werte gleich
+ // Color aNewColor( aColor.GetRed(), aColor.GetGreen(), aColor.GetBlue() );
+
+ if( ColorToPercent_Impl( aTmpColor.GetRed() ) != ColorToPercent_Impl( aColor.GetRed() ) ||
+ ColorToPercent_Impl( aTmpColor.GetGreen() ) != ColorToPercent_Impl( aColor.GetGreen() ) ||
+ ColorToPercent_Impl( aTmpColor.GetBlue() ) != ColorToPercent_Impl( aColor.GetBlue() ) ||
+ aString != aEdtName.GetText() )
+ {
+ ResMgr& rMgr = CUI_MGR();
+ Image aWarningBoxImage = WarningBox::GetStandardImage();
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
+ AbstractSvxMessDialog* aMessDlg = pFact->CreateSvxMessDialog( DLGWIN, RID_SVXDLG_MESSBOX,
+ SVX_RESSTR( RID_SVXSTR_COLOR ),
+ String( ResId( RID_SVXSTR_ASK_CHANGE_COLOR, rMgr ) ),
+ &aWarningBoxImage );
+ DBG_ASSERT(aMessDlg, "Dialogdiet fail!");//CHINA001
+ aMessDlg->SetButtonText( MESS_BTN_1, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_1,
+ String( ResId( RID_SVXSTR_CHANGE, rMgr ) ) );
+ aMessDlg->SetButtonText( MESS_BTN_2, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_2,
+ String( ResId( RID_SVXSTR_ADD, rMgr ) ) );
+
+ short nRet = aMessDlg->Execute(); //CHINA001 short nRet = aMessDlg.Execute();
+
+ switch( nRet )
+ {
+ case RET_BTN_1: // Aendern
+ {
+ ClickModifyHdl_Impl( this );
+ aColor = pColorTab->GetColor( nPos )->GetColor();
+ }
+ break;
+
+ case RET_BTN_2: // Hinzufuegen
+ {
+ ClickAddHdl_Impl( this );
+ nPos = aLbColor.GetSelectEntryPos();
+ aColor = pColorTab->GetColor( nPos )->GetColor();
+ }
+ break;
+
+ case RET_CANCEL:
+ // return( -1L ); <-- wuerde die Seite nicht verlassen
+ break;
+ // return( TRUE ); // Abbruch
+ }
+ delete aMessDlg; //add by CHINA001
+ }
+ }
+ if( *pDlgType == 0 ) // Flaechen-Dialog
+ {
+ nPos = aLbColor.GetSelectEntryPos();
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ *pPos = nPos;
+ }
+ }
+ return( 0L );
+}
+
+// -----------------------------------------------------------------------
+
+BOOL SvxColorTabPage::FillItemSet( SfxItemSet& rSet )
+{
+ if( ( *pDlgType != 0 ) ||
+ ( *pPageType == PT_COLOR && *pbAreaTP == FALSE ) )
+ {
+ String aString;
+ Color aColor;
+
+ // CheckChanges_Impl(); <-- doppelte Abfrage ?
+
+ USHORT nPos = aLbColor.GetSelectEntryPos();
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ aColor = pColorTab->GetColor( nPos )->GetColor();
+ aString = aLbColor.GetSelectEntry();
+ }
+ else
+ {
+ aColor.SetColor (aAktuellColor.GetColor());
+ if (eCM != CM_RGB)
+ ConvertColorValues (aColor, CM_RGB);
+ }
+ rSet.Put( XFillColorItem( aString, aColor ) );
+ rSet.Put( XFillStyleItem( XFILL_SOLID ) );
+ }
+
+ return( TRUE );
+}
+
+// -----------------------------------------------------------------------
+
+void SvxColorTabPage::Reset( const SfxItemSet& rSet )
+{
+ USHORT nState = rSet.GetItemState( XATTR_FILLCOLOR );
+
+ if ( nState >= SFX_ITEM_DEFAULT )
+ {
+ XFillColorItem aColorItem( (const XFillColorItem&)rSet.Get( XATTR_FILLCOLOR ) );
+ aLbColor.SelectEntry( aColorItem.GetColorValue() );
+ aValSetColorTable.SelectItem( aLbColor.GetSelectEntryPos() + 1 );
+ aEdtName.SetText( aLbColor.GetSelectEntry() );
+ }
+
+ // Farbmodell setzen
+ String aStr = GetUserData();
+ aLbColorModel.SelectEntryPos( (USHORT) aStr.ToInt32() );
+
+ ChangeColorHdl_Impl( this );
+ SelectColorModelHdl_Impl( this );
+
+ aCtlPreviewOld.Invalidate();
+
+ // Status der Buttons ermitteln
+ if( pColorTab->Count() )
+ {
+ aBtnModify.Enable();
+ aBtnWorkOn.Enable();
+ aBtnDelete.Enable();
+ aBtnSave.Enable();
+ }
+ else
+ {
+ aBtnModify.Disable();
+ aBtnWorkOn.Disable();
+ aBtnDelete.Disable();
+ aBtnSave.Disable();
+ }
+}
+
+// -----------------------------------------------------------------------
+
+SfxTabPage* SvxColorTabPage::Create( Window* pWindow,
+ const SfxItemSet& rOutAttrs )
+{
+ return( new SvxColorTabPage( pWindow, rOutAttrs ) );
+}
+
+//------------------------------------------------------------------------
+
+//
+// Wird aufgerufen, wenn Inhalt der MtrFileds f�r Farbwerte ver�ndert wird
+//
+IMPL_LINK( SvxColorTabPage, ModifiedHdl_Impl, void *, EMPTYARG )
+{
+ // lese aktuelle MtrFields aus, wenn cmyk, dann k-Wert als Trans.-Farbe
+ aAktuellColor.SetColor ( Color( (UINT8)PercentToColor_Impl( (USHORT) aMtrFldColorModel4.GetValue() ),
+ (UINT8)PercentToColor_Impl( (USHORT) aMtrFldColorModel1.GetValue() ),
+ (UINT8)PercentToColor_Impl( (USHORT) aMtrFldColorModel2.GetValue() ),
+ (UINT8)PercentToColor_Impl( (USHORT) aMtrFldColorModel3.GetValue() ) ).GetColor() );
+
+ Color aTmpColor(aAktuellColor);
+ if (eCM != CM_RGB)
+ ConvertColorValues (aTmpColor, CM_RGB);
+
+ rXFSet.Put( XFillColorItem( String(), aTmpColor ) );
+ aCtlPreviewNew.SetAttributes( aXFillAttr.GetItemSet() );
+
+ aCtlPreviewNew.Invalidate();
+
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+//
+// Button 'Hinzuf�gen'
+//
+IMPL_LINK( SvxColorTabPage, ClickAddHdl_Impl, void *, EMPTYARG )
+{
+ Window *pWindow = this;
+ bool bEnabled;
+ while( pWindow )
+ {
+ bEnabled = pWindow->IsEnabled();
+ pWindow = pWindow->GetParent();
+ }
+
+ ResMgr& rMgr = CUI_MGR();
+ String aDesc( ResId( RID_SVXSTR_DESC_COLOR, rMgr ) );
+ String aName( aEdtName.GetText() );
+ XColorEntry* pEntry;
+ long nCount = pColorTab->Count();
+ BOOL bDifferent = TRUE;
+
+ // Pruefen, ob Name schon vorhanden ist
+ for ( long i = 0; i < nCount && bDifferent; i++ )
+ if ( aName == pColorTab->GetColor( i )->GetName() )
+ bDifferent = FALSE;
+
+ // Wenn ja, wird wiederholt ein neuer Name angefordert
+ if ( !bDifferent )
+ {
+ WarningBox aWarningBox( DLGWIN, WinBits( WB_OK ),
+ String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
+ aWarningBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
+ aWarningBox.Execute();
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
+ AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
+ DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
+ BOOL bLoop = TRUE;
+
+ while ( !bDifferent && bLoop && pDlg->Execute() == RET_OK )
+ {
+ pDlg->GetName( aName );
+ bDifferent = TRUE;
+
+ for( long i = 0; i < nCount && bDifferent; i++ )
+ {
+ if( aName == pColorTab->GetColor( i )->GetName() )
+ bDifferent = FALSE;
+ }
+
+ if( bDifferent )
+ bLoop = FALSE;
+ else
+ aWarningBox.Execute();
+ }
+ delete( pDlg );
+ }
+
+ // Wenn nicht vorhanden, wird Eintrag aufgenommen
+ if( bDifferent )
+ {
+ if (eCM != CM_RGB)
+ ConvertColorValues (aAktuellColor, CM_RGB);
+ pEntry = new XColorEntry( aAktuellColor, aName );
+
+ pColorTab->Insert( pColorTab->Count(), pEntry );
+
+ aLbColor.Append( pEntry );
+ aValSetColorTable.InsertItem( aValSetColorTable.GetItemCount() + 1,
+ pEntry->GetColor(), pEntry->GetName() );
+
+ aLbColor.SelectEntryPos( aLbColor.GetEntryCount() - 1 );
+
+ // Flag fuer modifiziert setzen
+ *pnColorTableState |= CT_MODIFIED;
+
+ SelectColorLBHdl_Impl( this );
+ }
+ // Status der Buttons ermitteln
+ if( pColorTab->Count() )
+ {
+ aBtnModify.Enable();
+ aBtnWorkOn.Enable();
+ aBtnDelete.Enable();
+ aBtnSave.Enable();
+ }
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+//
+// Button '�ndern'
+//
+IMPL_LINK( SvxColorTabPage, ClickModifyHdl_Impl, void *, EMPTYARG )
+{
+ USHORT nPos = aLbColor.GetSelectEntryPos();
+
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ ResMgr& rMgr = CUI_MGR();
+ String aDesc( ResId( RID_SVXSTR_DESC_COLOR, rMgr ) );
+ String aName( aEdtName.GetText() );
+ long nCount = pColorTab->Count();
+ BOOL bDifferent = TRUE;
+
+ // Pruefen, ob Name schon vorhanden ist
+ for ( long i = 0; i < nCount && bDifferent; i++ )
+ if ( aName == pColorTab->GetColor( i )->GetName() && nPos != i )
+ bDifferent = FALSE;
+
+ // Wenn ja, wird wiederholt ein neuer Name angefordert
+ if ( !bDifferent )
+ {
+ WarningBox aWarningBox( DLGWIN, WinBits( WB_OK ),
+ String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
+ aWarningBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
+ aWarningBox.Execute();
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
+ AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
+ DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
+ BOOL bLoop = TRUE;
+
+ while ( !bDifferent && bLoop && pDlg->Execute() == RET_OK )
+ {
+ pDlg->GetName( aName );
+ bDifferent = TRUE;
+
+ for ( long i = 0; i < nCount && bDifferent; i++ )
+ if( aName == pColorTab->GetColor( i )->GetName() && nPos != i )
+ bDifferent = FALSE;
+
+ if( bDifferent )
+ bLoop = FALSE;
+ else
+ aWarningBox.Execute();
+ }
+ delete( pDlg );
+ }
+
+ // Wenn nicht vorhanden, wird Eintrag aufgenommen
+ if( bDifferent )
+ {
+ XColorEntry* pEntry = pColorTab->GetColor( nPos );
+
+ Color aTmpColor (aAktuellColor);
+ if (eCM != CM_RGB)
+ ConvertColorValues (aTmpColor, CM_RGB);
+
+ pEntry->SetColor( aTmpColor );
+ pEntry->SetName( aName );
+
+ aLbColor.Modify( pEntry, nPos );
+ aLbColor.SelectEntryPos( nPos );
+ /////
+ aValSetColorTable.SetItemColor( nPos + 1, pEntry->GetColor() );
+ aValSetColorTable.SetItemText( nPos + 1, pEntry->GetName() );
+ aEdtName.SetText( aName );
+
+ aCtlPreviewOld.Invalidate();
+
+ // Flag fuer modifiziert setzen
+ *pnColorTableState |= CT_MODIFIED;
+ }
+ }
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+//
+// Button 'Bearbeiten'
+//
+IMPL_LINK( SvxColorTabPage, ClickWorkOnHdl_Impl, void *, EMPTYARG )
+{
+ SvColorDialog* pColorDlg = new SvColorDialog( DLGWIN );
+
+ Color aTmpColor (aAktuellColor);
+ if (eCM != CM_RGB)
+ ConvertColorValues (aTmpColor, CM_RGB);
+
+ pColorDlg->SetColor (aTmpColor);
+
+ if( pColorDlg->Execute() == RET_OK )
+ {
+ USHORT nK = 0;
+ Color aPreviewColor = pColorDlg->GetColor();
+ aAktuellColor = aPreviewColor;
+ if (eCM != CM_RGB)
+ ConvertColorValues (aAktuellColor, eCM);
+
+ aMtrFldColorModel1.SetValue( ColorToPercent_Impl( aAktuellColor.GetRed() ) );
+ aMtrFldColorModel2.SetValue( ColorToPercent_Impl( aAktuellColor.GetGreen() ) );
+ aMtrFldColorModel3.SetValue( ColorToPercent_Impl( aAktuellColor.GetBlue() ) );
+ aMtrFldColorModel4.SetValue( ColorToPercent_Impl( nK ) );
+
+ // ItemSet fuellen und an XOut weiterleiten
+ rXFSet.Put( XFillColorItem( String(), aPreviewColor ) );
+ //aCtlPreviewOld.SetAttributes( aXFillAttr );
+ aCtlPreviewNew.SetAttributes( aXFillAttr.GetItemSet() );
+
+ aCtlPreviewNew.Invalidate();
+ }
+ delete( pColorDlg );
+
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+//
+// Button 'Loeschen'
+//
+IMPL_LINK( SvxColorTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG )
+{
+ USHORT nPos = aLbColor.GetSelectEntryPos();
+
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
+ String( CUI_RES( RID_SVXSTR_ASK_DEL_COLOR ) ) );
+
+ if( aQueryBox.Execute() == RET_YES )
+ {
+ // Jetzt wird richtig geloescht
+ ULONG nCount = pColorTab->Count() - 1;
+ XColorEntry* pEntry;
+
+ pEntry = pColorTab->Remove( nPos );
+ DBG_ASSERT( pEntry, "ColorEntry nicht vorhanden (1) !" );
+ delete pEntry;
+
+ for( ULONG i = nPos; i < nCount; i++ )
+ {
+ pEntry = pColorTab->Remove( i + 1 );
+ DBG_ASSERT( pEntry, "ColorEntry nicht vorhanden (2) !" );
+ pColorTab->Insert( i, pEntry );
+ }
+
+ // Listbox und ValueSet aktualisieren
+ aLbColor.RemoveEntry( nPos );
+ aValSetColorTable.Clear();
+ FillValueSet_Impl( aValSetColorTable );
+
+ // Positionieren
+ aLbColor.SelectEntryPos( nPos );
+ SelectColorLBHdl_Impl( this );
+
+ aCtlPreviewOld.Invalidate();
+
+ // Flag fuer modifiziert setzen
+ *pnColorTableState |= CT_MODIFIED;
+ }
+ }
+ // Status der Buttons ermitteln
+ if( !pColorTab->Count() )
+ {
+ aBtnModify.Disable();
+ aBtnWorkOn.Disable();
+ aBtnDelete.Disable();
+ aBtnSave.Disable();
+ }
+ return( 0L );
+}
+
+// -----------------------------------------------------------------------
+
+//
+// Button 'Farbtabelle laden'
+//
+IMPL_LINK( SvxColorTabPage, ClickLoadHdl_Impl, void *, EMPTYARG )
+{
+ ResMgr& rMgr = CUI_MGR();
+ USHORT nReturn = RET_YES;
+
+ if( *pnColorTableState & CT_MODIFIED )
+ {
+ nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ),
+ String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute();
+
+ if ( nReturn == RET_YES )
+ pColorTab->Save();
+ }
+
+ if ( nReturn != RET_CANCEL )
+ {
+ ::sfx2::FileDialogHelper aDlg(
+ com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
+ 0 );
+ String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.soc" ) );
+ aDlg.AddFilter( aStrFilterType, aStrFilterType );
+ INetURLObject aFile( SvtPathOptions().GetPalettePath() );
+ aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
+
+ if ( aDlg.Execute() == ERRCODE_NONE )
+ {
+ INetURLObject aURL( aDlg.GetPath() );
+ INetURLObject aPathURL( aURL );
+
+ aPathURL.removeSegment();
+ aPathURL.removeFinalSlash();
+
+ // Tabelle speichern
+ XColorTable* pColTab = new XColorTable( aPathURL.GetMainURL( INetURLObject::NO_DECODE ), pXPool );
+ pColTab->SetName( aURL.getName() ); // XXX
+ if( pColTab->Load() )
+ {
+ if( pColTab )
+ {
+ // Pruefen, ob Tabelle geloescht werden darf:
+ const XColorTable *pTempTable = 0;
+ SvxAreaTabDialog* pArea = dynamic_cast< SvxAreaTabDialog* >( DLGWIN );
+ SvxLineTabDialog* pLine = dynamic_cast< SvxLineTabDialog* >( DLGWIN );
+ if( pArea )
+ {
+ pTempTable = pArea->GetColorTable();
+ }
+ else if( pLine )
+ {
+ pTempTable = pLine->GetColorTable();
+ }
+
+ if( pColorTab != pTempTable )
+ {
+ if( bDeleteColorTable )
+ delete pColorTab;
+ else
+ bDeleteColorTable = TRUE;
+ }
+
+ pColorTab = pColTab;
+ if( pArea )
+ {
+ pArea->SetNewColorTable( pColorTab );
+ }
+ else if( pLine )
+ {
+ pLine->SetNewColorTable( pColorTab );
+ }
+
+ aLbColor.Clear();
+ aValSetColorTable.Clear();
+ Construct();
+ Reset( rOutAttrs );
+
+ pColorTab->SetName( aURL.getName() );
+
+ // Ermitteln (evtl. abschneiden) des Namens und in
+ // der GroupBox darstellen
+ String aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
+ aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
+
+ if ( aURL.getBase().getLength() > 18 )
+ {
+ aString += String(aURL.getBase()).Copy( 0, 15 );
+ aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
+ }
+ else
+ aString += String(aURL.getBase());
+
+ aTableNameFT.SetText( aString );
+
+ // Flag fuer gewechselt setzen
+ *pnColorTableState |= CT_CHANGED;
+ // Flag fuer modifiziert entfernen
+ *pnColorTableState &= ~CT_MODIFIED;
+
+ if( aLbColor.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND )
+ aLbColor.SelectEntryPos( 0 );
+ else
+ aLbColor.SelectEntryPos( aLbColor.GetSelectEntryPos() );
+
+ ChangeColorHdl_Impl( this );
+ SelectColorLBHdl_Impl( this );
+ }
+ }
+ else
+ {
+ //aIStream.Close();
+ ErrorBox aErrorBox( DLGWIN, WinBits( WB_OK ),
+ String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) );
+ aErrorBox.Execute();
+ }
+ }
+ }
+
+ // Status der Buttons ermitteln
+ if ( pColorTab->Count() )
+ {
+ aBtnModify.Enable();
+ aBtnWorkOn.Enable();
+ aBtnDelete.Enable();
+ aBtnSave.Enable();
+ }
+ else
+ {
+ aBtnModify.Disable();
+ aBtnWorkOn.Disable();
+ aBtnDelete.Disable();
+ aBtnSave.Disable();
+ }
+ return( 0L );
+}
+
+// -----------------------------------------------------------------------
+
+//
+// Button 'Farbtabelle speichern'
+//
+IMPL_LINK( SvxColorTabPage, ClickSaveHdl_Impl, void *, EMPTYARG )
+{
+ ::sfx2::FileDialogHelper aDlg(
+ com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
+ String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.soc" ) );
+ aDlg.AddFilter( aStrFilterType, aStrFilterType );
+
+ INetURLObject aFile( SvtPathOptions().GetPalettePath() );
+ DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
+
+ if( pColorTab->GetName().Len() )
+ {
+ aFile.Append( pColorTab->GetName() );
+
+ if( !aFile.getExtension().getLength() )
+ aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "soc" ) ) );
+ }
+
+ aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
+ if ( aDlg.Execute() == ERRCODE_NONE )
+ {
+ INetURLObject aURL( aDlg.GetPath() );
+ INetURLObject aPathURL( aURL );
+
+ aPathURL.removeSegment();
+ aPathURL.removeFinalSlash();
+
+ pColorTab->SetName( aURL.getName() );
+ pColorTab->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
+
+ if( pColorTab->Save() )
+ {
+ // Ermitteln (evtl. abschneiden) des Namens und in
+ // der GroupBox darstellen
+ String aString( CUI_RES( RID_SVXSTR_TABLE ) );
+ aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
+
+ if ( aURL.getBase().getLength() > 18 )
+ {
+ aString += String(aURL.getBase()).Copy( 0, 15 );
+ aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
+ }
+ else
+ aString += String(aURL.getBase());
+ aTableNameFT.SetText( aString );
+
+ // Flag fuer gespeichert setzen
+ *pnColorTableState |= CT_SAVED;
+ // Flag fuer modifiziert entfernen
+ *pnColorTableState &= ~CT_MODIFIED;
+ }
+ else
+ {
+ ErrorBox aErrorBox( DLGWIN, WinBits( WB_OK ),
+ String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) );
+ aErrorBox.Execute();
+ }
+ }
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+IMPL_LINK( SvxColorTabPage, SelectColorLBHdl_Impl, void *, EMPTYARG )
+{
+ USHORT nPos = aLbColor.GetSelectEntryPos();
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ aValSetColorTable.SelectItem( nPos + 1 );
+ aEdtName.SetText( aLbColor.GetSelectEntry() );
+
+ rXFSet.Put( XFillColorItem( String(),
+ aLbColor.GetSelectEntryColor() ) );
+ aCtlPreviewOld.SetAttributes( aXFillAttr.GetItemSet() );
+ aCtlPreviewNew.SetAttributes( aXFillAttr.GetItemSet() );
+
+ aCtlPreviewOld.Invalidate();
+ aCtlPreviewNew.Invalidate();
+
+ ChangeColorHdl_Impl( this );
+ }
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+IMPL_LINK( SvxColorTabPage, SelectValSetHdl_Impl, void *, EMPTYARG )
+{
+ USHORT nPos = aValSetColorTable.GetSelectItemId();
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ aLbColor.SelectEntryPos( nPos - 1 );
+ aEdtName.SetText( aLbColor.GetSelectEntry() );
+
+ rXFSet.Put( XFillColorItem( String(),
+ aLbColor.GetSelectEntryColor() ) );
+ aCtlPreviewOld.SetAttributes( aXFillAttr.GetItemSet() );
+ aCtlPreviewNew.SetAttributes( aXFillAttr.GetItemSet() );
+
+ aCtlPreviewOld.Invalidate();
+ aCtlPreviewNew.Invalidate();
+
+ ChangeColorHdl_Impl( this );
+ }
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+//
+// Farbwerte je nach �bergebenes Farbmodell umrechnen
+//
+void SvxColorTabPage::ConvertColorValues (Color& rColor, ColorModel eModell)
+{
+ switch (eModell)
+ {
+ case CM_RGB:
+ {
+ CmykToRgb_Impl (rColor, (USHORT)rColor.GetTransparency() );
+ rColor.SetTransparency ((UINT8) 0);
+ }
+ break;
+
+ case CM_CMYK:
+ {
+ USHORT nK;
+ RgbToCmyk_Impl (rColor, nK );
+ rColor.SetTransparency ((UINT8) nK);
+ }
+ break;
+ }
+}
+
+//
+// Auswahl Listbox 'Farbmodell' (RGB/CMY)
+//
+IMPL_LINK( SvxColorTabPage, SelectColorModelHdl_Impl, void *, EMPTYARG )
+{
+ int nPos = aLbColorModel.GetSelectEntryPos();
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ if (eCM != (ColorModel) nPos)
+ {
+ // wenn Farbmodell geaendert wurde, dann Werte umrechnen
+ ConvertColorValues (aAktuellColor, (ColorModel) nPos);
+ }
+
+ eCM = (ColorModel) nPos;
+
+ switch( eCM )
+ {
+ case CM_RGB:
+ {
+ String aStr( aLbColorModel.GetSelectEntry() );
+ String aColorStr( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "~X" ) ) );
+ xub_StrLen nIdx = 1;
+ aColorStr.SetChar( nIdx, aStr.GetChar( 0 ) );
+ aFtColorModel1.SetText( aColorStr );
+ aColorStr.SetChar( nIdx, aStr.GetChar( 1 ) );
+ aFtColorModel2.SetText( aColorStr );
+ aColorStr.SetChar( nIdx, aStr.GetChar( 2 ) );
+ aFtColorModel3.SetText( aColorStr );
+
+ aFtColorModel4.Hide();
+ aMtrFldColorModel4.Hide();
+ aMtrFldColorModel4.SetValue( 0L );
+
+ aMtrFldColorModel1.SetHelpId( HID_TPCOLOR_RGB_1 );
+ aMtrFldColorModel2.SetHelpId( HID_TPCOLOR_RGB_2 );
+ aMtrFldColorModel3.SetHelpId( HID_TPCOLOR_RGB_3 );
+
+ // Da der alte HelpText noch am Control steht wuerde
+ // ein Umsetzen der HelpID alleine nichts bewirken
+ aMtrFldColorModel1.SetHelpText( String() );
+ aMtrFldColorModel2.SetHelpText( String() );
+ aMtrFldColorModel3.SetHelpText( String() );
+
+ // RGB-Werte im Bereich 0..255 verarbeiten (nicht in %),
+ // dazu MetricField's entsprechend einstellen
+ aMtrFldColorModel1.SetUnit(FUNIT_NONE);
+ aMtrFldColorModel1.SetMin(0);
+ aMtrFldColorModel1.SetMax(255);
+ aMtrFldColorModel1.SetLast(255);
+
+ aMtrFldColorModel2.SetUnit(FUNIT_NONE);
+ aMtrFldColorModel2.SetMin(0);
+ aMtrFldColorModel2.SetMax(255);
+ aMtrFldColorModel2.SetLast(255);
+
+ aMtrFldColorModel3.SetUnit(FUNIT_NONE);
+ aMtrFldColorModel3.SetMin(0);
+ aMtrFldColorModel3.SetMax(255);
+ aMtrFldColorModel3.SetLast(255);
+ }
+ break;
+
+ case CM_CMYK:
+ {
+ String aStr( aLbColorModel.GetSelectEntry() );
+ String aColorStr( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "~X" ) ) );
+ xub_StrLen nIdx = 1;
+ aColorStr.SetChar( nIdx, aStr.GetChar( 0 ) );
+ aFtColorModel1.SetText( aColorStr );
+ aColorStr.SetChar( nIdx, aStr.GetChar( 1 ) );
+ aFtColorModel2.SetText( aColorStr );
+ aColorStr.SetChar( nIdx,aStr.GetChar( 2 ) );
+ aFtColorModel3.SetText( aColorStr );
+ aColorStr.SetChar( nIdx,aStr.GetChar( 3 ) );
+ aFtColorModel4.SetText( aColorStr );
+
+ aFtColorModel4.Show();
+ aMtrFldColorModel4.Show();
+
+ aMtrFldColorModel1.SetHelpId( HID_TPCOLOR_CMYK_1 );
+ aMtrFldColorModel2.SetHelpId( HID_TPCOLOR_CMYK_2 );
+ aMtrFldColorModel3.SetHelpId( HID_TPCOLOR_CMYK_3 );
+
+ // s.o.
+ aMtrFldColorModel1.SetHelpText( String() );
+ aMtrFldColorModel2.SetHelpText( String() );
+ aMtrFldColorModel3.SetHelpText( String() );
+
+ // CMYK-Werte im Bereich 0..100% verarbeiten,
+ // dazu MetricField's entsprechend einstellen
+ String aStrUnit( RTL_CONSTASCII_USTRINGPARAM( " %" ) );
+
+ aMtrFldColorModel1.SetUnit(FUNIT_CUSTOM);
+ aMtrFldColorModel1.SetCustomUnitText( aStrUnit );
+ aMtrFldColorModel1.SetMin(0);
+ aMtrFldColorModel1.SetMax(100);
+ aMtrFldColorModel1.SetLast(100);
+
+ aMtrFldColorModel2.SetUnit(FUNIT_CUSTOM);
+ aMtrFldColorModel2.SetCustomUnitText( aStrUnit );
+ aMtrFldColorModel2.SetMin(0);
+ aMtrFldColorModel2.SetMax(100);
+ aMtrFldColorModel2.SetLast(100);
+
+ aMtrFldColorModel3.SetUnit(FUNIT_CUSTOM);
+ aMtrFldColorModel3.SetCustomUnitText( aStrUnit );
+ aMtrFldColorModel3.SetMin(0);
+ aMtrFldColorModel3.SetMax(100);
+ aMtrFldColorModel3.SetLast(100);
+ }
+ break;
+ }
+
+ aMtrFldColorModel1.SetValue( ColorToPercent_Impl( aAktuellColor.GetRed() ) );
+ aMtrFldColorModel2.SetValue( ColorToPercent_Impl( aAktuellColor.GetGreen() ) );
+ aMtrFldColorModel3.SetValue( ColorToPercent_Impl( aAktuellColor.GetBlue() ) );
+ aMtrFldColorModel4.SetValue( ColorToPercent_Impl( aAktuellColor.GetTransparency() ) );
+ }
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+long SvxColorTabPage::ChangeColorHdl_Impl( void* )
+{
+ int nPos = aLbColor.GetSelectEntryPos();
+ if( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ XColorEntry* pEntry = pColorTab->GetColor( nPos );
+
+ aAktuellColor.SetColor ( pEntry->GetColor().GetColor() );
+ if (eCM != CM_RGB)
+ ConvertColorValues (aAktuellColor, eCM);
+
+ aMtrFldColorModel1.SetValue( ColorToPercent_Impl( aAktuellColor.GetRed() ) );
+ aMtrFldColorModel2.SetValue( ColorToPercent_Impl( aAktuellColor.GetGreen() ) );
+ aMtrFldColorModel3.SetValue( ColorToPercent_Impl( aAktuellColor.GetBlue() ) );
+ aMtrFldColorModel4.SetValue( ColorToPercent_Impl( aAktuellColor.GetTransparency() ) );
+
+ // ItemSet fuellen und an XOut weiterleiten
+ rXFSet.Put( XFillColorItem( String(), pEntry->GetColor() ) );
+ aCtlPreviewOld.SetAttributes( aXFillAttr.GetItemSet() );
+ aCtlPreviewNew.SetAttributes( aXFillAttr.GetItemSet() );
+
+ aCtlPreviewNew.Invalidate();
+ }
+ return( 0L );
+}
+
+//------------------------------------------------------------------------
+
+void SvxColorTabPage::FillValueSet_Impl( ValueSet& rVs )
+{
+ long nCount = pColorTab->Count();
+ XColorEntry* pColorEntry;
+
+ for( long i = 0; i < nCount; i++ )
+ {
+ pColorEntry = pColorTab->GetColor( i );
+ rVs.InsertItem( (USHORT) i + 1, pColorEntry->GetColor(), pColorEntry->GetName() );
+ }
+}
+
+//------------------------------------------------------------------------
+
+// Ein RGB-Wert wird in einen CMYK-Wert konvertiert, wobei die Color-
+// Klasse vergewaltigt wird, da R in C, G in M und B in Y umgewandelt
+// wird. Der Wert K wird in einer Extra-Variablen gehalten.
+// Bei weiteren Farbmodellen sollte man hierfuer eigene Klassen entwickeln,
+// die dann auch entsprechende Casts enthalten.
+
+void SvxColorTabPage::RgbToCmyk_Impl( Color& rColor, USHORT& rK )
+{
+ USHORT nColor1, nColor2, nColor3;
+ USHORT nProzent; // nur temporaer !!!
+
+ nColor1 = 255 - rColor.GetRed();
+ nProzent = ColorToPercent_Impl( nColor1 );
+
+ nColor2 = 255 - rColor.GetGreen();
+ nProzent = ColorToPercent_Impl( nColor2 );
+
+ nColor3 = 255 - rColor.GetBlue();
+ nProzent = ColorToPercent_Impl( nColor3 );
+
+ rK = Min( Min( nColor1, nColor2 ), nColor3 );
+
+ rColor.SetRed( sal::static_int_cast< UINT8 >( nColor1 - rK ) );
+ rColor.SetGreen( sal::static_int_cast< UINT8 >( nColor2 - rK ) );
+ rColor.SetBlue( sal::static_int_cast< UINT8 >( nColor3 - rK ) );
+}
+
+//------------------------------------------------------------------------
+
+// Umgekehrter Fall zu RgbToCmyk_Impl (s.o.)
+
+void SvxColorTabPage::CmykToRgb_Impl( Color& rColor, const USHORT nK )
+{
+ long lTemp;
+
+ lTemp = 255 - ( rColor.GetRed() + nK );
+
+ if( lTemp < 0L )
+ lTemp = 0L;
+ rColor.SetRed( (BYTE)lTemp );
+
+ lTemp = 255 - ( rColor.GetGreen() + nK );
+
+ if( lTemp < 0L )
+ lTemp = 0L;
+ rColor.SetGreen( (BYTE)lTemp );
+
+ lTemp = 255 - ( rColor.GetBlue() + nK );
+
+ if( lTemp < 0L )
+ lTemp = 0L;
+ rColor.SetBlue( (BYTE)lTemp );
+}
+
+//------------------------------------------------------------------------
+
+USHORT SvxColorTabPage::ColorToPercent_Impl( USHORT nColor )
+{
+ USHORT nWert = 0;
+
+ switch (eCM)
+ {
+ case CM_RGB :
+ nWert = nColor;
+ break;
+
+ case CM_CMYK:
+ nWert = (USHORT) ( (double) nColor * 100.0 / 255.0 + 0.5 );
+ break;
+ }
+
+ return ( nWert );
+}
+
+//------------------------------------------------------------------------
+
+USHORT SvxColorTabPage::PercentToColor_Impl( USHORT nPercent )
+{
+ USHORT nWert = 0;
+
+ switch (eCM)
+ {
+ case CM_RGB :
+ nWert = nPercent;
+ break;
+
+ case CM_CMYK:
+ nWert = (USHORT) ( (double) nPercent * 255.0 / 100.0 + 0.5 );
+ break;
+ }
+
+ return ( nWert );
+}
+
+//------------------------------------------------------------------------
+
+void SvxColorTabPage::FillUserData()
+{
+ // Das Farbmodell wird in der Ini-Datei festgehalten
+ SetUserData( UniString::CreateFromInt32( eCM ) );
+}
+
+