office-gobmx/cui/source/tabpages/tpcolor.cxx
Caolán McNamara 1f116adb7c callcatcher: update unused code
Change-Id: I29b3f1408b814a1424d8bab232e9ac618901b4c2
2015-06-20 14:20:33 +01:00

1229 lines
36 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <tools/urlobj.hxx>
#include <unotools/pathoptions.hxx>
#include <sfx2/app.hxx>
#include <sfx2/module.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/viewsh.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
#include <svtools/colrdlg.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/filedlghelper.hxx>
#include <svx/ofaitem.hxx>
#include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
#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 "defdlgname.hxx"
#include "dlgname.hxx"
#include <svx/svxdlg.hxx>
#include <dialmgr.hxx>
#include <cuitabline.hxx>
#include <svx/dialmgr.hxx>
#include <svx/dialogs.hrc>
#include <boost/scoped_ptr.hpp>
using namespace com::sun::star;
XPropertyListRef SvxColorTabPage::GetList()
{
SvxAreaTabDialog* pArea = dynamic_cast< SvxAreaTabDialog* >( mpTopDlg.get() );
SvxLineTabDialog* pLine = dynamic_cast< SvxLineTabDialog* >( mpTopDlg.get() );
XColorListRef pList;
if( pArea )
pList = pArea->GetNewColorList();
if( pLine )
pList = pLine->GetNewColorList();
if( !pList.is() ) {
if( pArea )
pList = pArea->GetColorList();
if( pLine )
pList = pLine->GetColorList();
}
// URGH - abstract this nicely ... for re-using SvxLoadSaveEmbed
if( !pList.is() ) {
pList = GetColorList();
}
return XPropertyListRef( static_cast< XPropertyList * >( pList.get() ) );
}
void SvxColorTabPage::SetEmbed( bool bEmbed )
{
XPropertyListRef pList = GetList();
if( pList.is() )
pList->SetEmbedInDocument( bEmbed );
m_pBoxEmbed->Check( bEmbed );
}
bool SvxColorTabPage::GetEmbed()
{
XPropertyListRef pList = GetList();
return pList.is() && pList->IsEmbedInDocument();
}
IMPL_LINK_NOARG(SvxColorTabPage, EmbedToggleHdl_Impl)
{
SetEmbed( m_pBoxEmbed->IsChecked() );
return 0;
}
void SvxColorTabPage::UpdateTableName()
{
// Truncate the name if necessary ...
OUString aString( CUI_RES( RID_SVXSTR_TABLE ) );
aString += ": ";
XPropertyListRef pList = GetList();
if( !pList.is() )
return;
INetURLObject aURL( pList->GetPath() );
aURL.Append( pList->GetName() );
if ( aURL.getBase().getLength() > 18 )
{
aString += aURL.getBase().copy( 0, 15 );
aString += "...";
}
else
aString += aURL.getBase();
m_pTableName->SetText( aString );
}
IMPL_LINK_NOARG(SvxColorTabPage, ClickLoadHdl_Impl)
{
sal_uInt16 nReturn = RET_YES;
bool bLoaded = false;
if( IsModified() && GetList()->Count() > 0 )
{
nReturn = ScopedVclPtrInstance<MessageDialog>::Create( GetParentDialog()
,"AskSaveList"
,"cui/ui/querysavelistdialog.ui")->Execute();
if ( nReturn == RET_YES )
GetList()->Save();
}
if ( nReturn != RET_CANCEL )
{
::sfx2::FileDialogHelper aDlg( css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
OUString aStrFilterType( XPropertyList::GetDefaultExtFilter( meType ) );
aDlg.AddFilter( aStrFilterType, aStrFilterType );
OUString aPalettePath(SvtPathOptions().GetPalettePath());
OUString aLastDir;
sal_Int32 nIndex = 0;
do
{
aLastDir = aPalettePath.getToken(0, ';', nIndex);
}
while (nIndex >= 0);
INetURLObject aFile(aLastDir);
aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
if ( aDlg.Execute() == ERRCODE_NONE )
{
XColorListRef pList = XPropertyList::AsColorList(
XPropertyList::CreatePropertyListFromURL(
meType, aDlg.GetPath()));
if( pList->Load() )
{
// check whether the table may be deleted:
SvxAreaTabDialog* pArea = dynamic_cast< SvxAreaTabDialog* >( mpTopDlg.get() );
SvxLineTabDialog* pLine = dynamic_cast< SvxLineTabDialog* >( mpTopDlg.get() );
// FIXME: want to have a generic set and get method by type ...
if( pArea )
pArea->SetNewColorList(pList);
else if( pLine )
pLine->SetNewColorList(pList);
else
SetColorList(pList);
bLoaded = true;
UpdateTableName();
AddState( ChangeType::CHANGED );
SetModified( false );
SetEmbed( true );
}
else
{
ScopedVclPtrInstance<MessageDialog>::Create( mpTopDlg
,"NoLoadedFileDialog"
,"cui/ui/querynoloadedfiledialog.ui")->Execute();
}
}
}
Update( bLoaded );
return 0;
}
void SvxColorTabPage::EnableSave( bool bCanSave )
{
if ( bCanSave )
m_pBtnSave->Enable();
else
m_pBtnSave->Disable();
}
IMPL_LINK_NOARG(SvxColorTabPage, ClickSaveHdl_Impl)
{
::sfx2::FileDialogHelper aDlg(
css::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
OUString aStrFilterType( XPropertyList::GetDefaultExtFilter( meType ) );
aDlg.AddFilter( aStrFilterType, aStrFilterType );
OUString aPalettePath(SvtPathOptions().GetPalettePath());
OUString aLastDir;
sal_Int32 nIndex = 0;
do
{
aLastDir = aPalettePath.getToken(0, ';', nIndex);
}
while (nIndex >= 0);
INetURLObject aFile(aLastDir);
DBG_ASSERT( aFile.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
XPropertyListRef pList = GetList();
if( !pList->GetName().isEmpty() )
{
aFile.Append( pList->GetName() );
if( aFile.getExtension().isEmpty() )
aFile.SetExtension( XPropertyList::GetDefaultExt( meType ) );
}
aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
if ( aDlg.Execute() == ERRCODE_NONE )
{
INetURLObject aURL( aDlg.GetPath() );
INetURLObject aPathURL( aURL );
aPathURL.removeSegment();
aPathURL.removeFinalSlash();
pList->SetName( aURL.getName() );
pList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
if( pList->Save() )
{
UpdateTableName();
AddState( ChangeType::SAVED );
SetModified( false );
}
else
{
ScopedVclPtrInstance<MessageDialog>::Create( mpTopDlg
,"NoSaveFileDialog"
,"cui/ui/querynosavefiledialog.ui")->Execute();
}
}
return 0;
}
void SvxColorTabPage::Update(bool bLoaded)
{
pColorList = XColorListRef( static_cast<XColorList *>( GetList().get() ) );
if (bLoaded)
{
m_pLbColor->Clear();
m_pValSetColorList->Clear();
Construct();
Reset( &rOutAttrs );
if( m_pLbColor->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND )
m_pLbColor->SelectEntryPos( 0 );
else
m_pLbColor->SelectEntryPos( m_pLbColor->GetSelectEntryPos() );
sal_Int32 nPos = m_pLbColor->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
XColorEntry* pEntry = pColorList->GetColor( nPos );
ChangeColor(pEntry->GetColor());
}
SelectColorLBHdl_Impl( this );
}
UpdateModified();
}
// FIXME: you have to hate yourself for this - all this
// horrible and broadly unused pointer based coupling
// needs to die. cf SetupForViewFrame
#define COLORPAGE_UNKNOWN ((sal_uInt16)0xFFFF)
struct SvxColorTabPageShadow
{
sal_uInt16 nUnknownType;
sal_Int32 nUnknownPos;
bool bIsAreaTP;
ChangeType nChangeType;
SvxColorTabPageShadow()
: nUnknownType( COLORPAGE_UNKNOWN )
, nUnknownPos( LISTBOX_ENTRY_NOTFOUND )
, bIsAreaTP( false )
, nChangeType( ChangeType::NONE )
{
}
};
SvxColorTabPage::SvxColorTabPage(vcl::Window* pParent, const SfxItemSet& rInAttrs)
: SfxTabPage(pParent, "ColorPage", "cui/ui/colorpage.ui", &rInAttrs)
, meType( XCOLOR_LIST )
, mpTopDlg( GetParentDialog() )
, pShadow ( new SvxColorTabPageShadow() )
, rOutAttrs ( rInAttrs )
// All the horrific pointers we store and should not
, pnColorListState( 0 )
, pPageType( NULL )
, nDlgType( 0 )
, pPos( NULL )
, pbAreaTP( NULL )
, aXFStyleItem( drawing::FillStyle_SOLID )
, aXFillColorItem( OUString(), Color( COL_BLACK ) )
, aXFillAttr( static_cast<XOutdevItemPool*>( rInAttrs.GetPool() ))
, rXFSet( aXFillAttr.GetItemSet() )
, eCM( CM_RGB )
{
get(m_pBoxEmbed, "embed");
get(m_pBtnLoad, "load");
get(m_pBtnSave, "save");
get(m_pTableName, "colortableft");
get(m_pEdtName, "name");
get(m_pLbColor, "colorlb");
get(m_pValSetColorList, "colorset");
Size aSize = LogicToPixel(Size(94 , 117), MAP_APPFONT);
m_pValSetColorList->set_width_request(aSize.Width());
m_pValSetColorList->set_height_request(aSize.Height());
get(m_pCtlPreviewOld, "oldpreview");
get(m_pCtlPreviewNew, "newpreview");
aSize = LogicToPixel(Size(34 , 25), MAP_APPFONT);
m_pCtlPreviewOld->set_width_request(aSize.Width());
m_pCtlPreviewOld->set_height_request(aSize.Height());
m_pCtlPreviewNew->set_width_request(aSize.Width());
m_pCtlPreviewNew->set_height_request(aSize.Height());
get(m_pLbColorModel, "modellb");
get(m_pRGB, "rgb");
get(m_pR, "R");
get(m_pG, "G");
get(m_pB, "B");
get(m_pCMYK, "cmyk");
get(m_pC, "C");
get(m_pY, "Y");
get(m_pM, "M");
get(m_pK, "K");
get(m_pBtnAdd, "add");
get(m_pBtnModify, "modify");
get(m_pBtnWorkOn, "edit");
get(m_pBtnDelete, "delete");
m_pBoxEmbed->SetToggleHdl( LINK( this, SvxColorTabPage, EmbedToggleHdl_Impl ) );
m_pBtnLoad->SetClickHdl( LINK( this, SvxColorTabPage, ClickLoadHdl_Impl ) );
m_pBtnSave->SetClickHdl( LINK( this, SvxColorTabPage, ClickSaveHdl_Impl ) );
SetEmbed( GetEmbed() );
UpdateTableName();
// this page needs ExchangeSupport
SetExchangeSupport();
// setting the output device
rXFSet.Put( aXFStyleItem );
rXFSet.Put( aXFillColorItem );
m_pCtlPreviewOld->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->SetAttributes( aXFillAttr.GetItemSet() );
// set handler
m_pLbColor->SetSelectHdl(
LINK( this, SvxColorTabPage, SelectColorLBHdl_Impl ) );
m_pValSetColorList->SetSelectHdl(
LINK( this, SvxColorTabPage, SelectValSetHdl_Impl ) );
m_pLbColorModel->SetSelectHdl(
LINK( this, SvxColorTabPage, SelectColorModelHdl_Impl ) );
Link<> aLink = LINK( this, SvxColorTabPage, ModifiedHdl_Impl );
m_pR->SetModifyHdl( aLink );
m_pG->SetModifyHdl( aLink );
m_pB->SetModifyHdl( aLink );
m_pC->SetModifyHdl( aLink );
m_pY->SetModifyHdl( aLink );
m_pM->SetModifyHdl( aLink );
m_pK->SetModifyHdl( aLink );
m_pBtnAdd->SetClickHdl( LINK( this, SvxColorTabPage, ClickAddHdl_Impl ) );
m_pBtnModify->SetClickHdl( LINK( this, SvxColorTabPage, ClickModifyHdl_Impl ) );
m_pBtnWorkOn->SetClickHdl( LINK( this, SvxColorTabPage, ClickWorkOnHdl_Impl ) );
m_pBtnDelete->SetClickHdl( LINK( this, SvxColorTabPage, ClickDeleteHdl_Impl ) );
// ValueSet
m_pValSetColorList->SetStyle( m_pValSetColorList->GetStyle() | WB_ITEMBORDER );
m_pValSetColorList->Show();
}
SvxColorTabPage::~SvxColorTabPage()
{
disposeOnce();
}
void SvxColorTabPage::dispose()
{
delete pShadow;
pShadow = NULL;
mpTopDlg.clear();
m_pBoxEmbed.clear();
m_pBtnLoad.clear();
m_pBtnSave.clear();
m_pTableName.clear();
m_pEdtName.clear();
m_pLbColor.clear();
m_pValSetColorList.clear();
m_pCtlPreviewOld.clear();
m_pCtlPreviewNew.clear();
m_pLbColorModel.clear();
m_pRGB.clear();
m_pR.clear();
m_pG.clear();
m_pB.clear();
m_pCMYK.clear();
m_pC.clear();
m_pY.clear();
m_pM.clear();
m_pK.clear();
m_pBtnAdd.clear();
m_pBtnModify.clear();
m_pBtnWorkOn.clear();
m_pBtnDelete.clear();
SfxTabPage::dispose();
}
void SvxColorTabPage::ImpColorCountChanged()
{
if (!pColorList.is())
return;
m_pValSetColorList->SetColCount(SvxColorValueSet::getColumnCount());
}
void SvxColorTabPage::Construct()
{
if (pColorList.is())
{
m_pLbColor->Fill(pColorList);
m_pValSetColorList->addEntriesForXColorList(*pColorList);
ImpColorCountChanged();
UpdateTableName();
}
}
void SvxColorTabPage::ActivatePage( const SfxItemSet& )
{
if( nDlgType == 0 ) // area dialog
{
*pbAreaTP = false;
if( pColorList.is() )
{
if( *pPageType == PT_COLOR && *pPos != LISTBOX_ENTRY_NOTFOUND )
{
m_pLbColor->SelectEntryPos( *pPos );
m_pValSetColorList->SelectItem( m_pLbColor->GetSelectEntryPos() + 1 );
m_pEdtName->SetText( m_pLbColor->GetSelectEntry() );
XColorEntry* pEntry = pColorList->GetColor( *pPos );
ChangeColor(pEntry->GetColor());
}
else if( *pPageType == PT_COLOR && *pPos == LISTBOX_ENTRY_NOTFOUND )
{
const SfxPoolItem* pPoolItem = NULL;
if( SfxItemState::SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLCOLOR ), true, &pPoolItem ) )
{
m_pLbColorModel->SelectEntryPos( CM_RGB );
ChangeColor(static_cast<const XFillColorItem*>(pPoolItem)->GetColorValue());
m_pEdtName->SetText( static_cast<const XFillColorItem*>( pPoolItem )->GetName() );
m_pR->SetValue( ColorToPercent_Impl( aCurrentColor.GetRed() ) );
m_pG->SetValue( ColorToPercent_Impl( aCurrentColor.GetGreen() ) );
m_pB->SetValue( ColorToPercent_Impl( aCurrentColor.GetBlue() ) );
// fill ItemSet and pass it on to XOut
rXFSet.Put( XFillColorItem( OUString(), aCurrentColor ) );
m_pCtlPreviewOld->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->Invalidate();
m_pCtlPreviewOld->Invalidate();
}
}
// so that the possibly changed color is discarded
SelectColorLBHdl_Impl( this );
*pPageType = PT_COLOR;
*pPos = LISTBOX_ENTRY_NOTFOUND;
}
}
else
m_pBoxEmbed->Hide();
}
SfxTabPage::sfxpg SvxColorTabPage::DeactivatePage( SfxItemSet* _pSet )
{
if ( CheckChanges_Impl() == -1L )
return KEEP_PAGE;
if( _pSet )
FillItemSet( _pSet );
return LEAVE_PAGE;
}
long SvxColorTabPage::CheckChanges_Impl()
{
// used to NOT lose changes
sal_Int32 nPos = m_pLbColor->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
Color aColor = pColorList->GetColor( nPos )->GetColor();
OUString aString = m_pLbColor->GetSelectEntry();
// aNewColor, because COL_USER != COL_something, even if RGB values are the same
// Color aNewColor( aColor.GetRed(), aColor.GetGreen(), aColor.GetBlue() );
if( ColorToPercent_Impl( aCurrentColor.GetRed() ) != ColorToPercent_Impl( aColor.GetRed() ) ||
ColorToPercent_Impl( aCurrentColor.GetGreen() ) != ColorToPercent_Impl( aColor.GetGreen() ) ||
ColorToPercent_Impl( aCurrentColor.GetBlue() ) != ColorToPercent_Impl( aColor.GetBlue() ) ||
aString != m_pEdtName->GetText() )
{
ResMgr& rMgr = CUI_MGR();
Image aWarningBoxImage = WarningBox::GetStandardImage();
ScopedVclPtrInstance<SvxMessDialog> aMessDlg( GetParentDialog(),
SVX_RESSTR( RID_SVXSTR_COLOR ),
ResId( RID_SVXSTR_ASK_CHANGE_COLOR, rMgr ),
&aWarningBoxImage );
aMessDlg->SetButtonText( MESS_BTN_1,
ResId( RID_SVXSTR_CHANGE, rMgr ) );
aMessDlg->SetButtonText( MESS_BTN_2,
ResId( RID_SVXSTR_ADD, rMgr ) );
short nRet = aMessDlg->Execute();
switch( nRet )
{
case RET_BTN_1:
{
ClickModifyHdl_Impl( this );
aColor = pColorList->GetColor( nPos )->GetColor();
}
break;
case RET_BTN_2:
{
ClickAddHdl_Impl( this );
nPos = m_pLbColor->GetSelectEntryPos();
aColor = pColorList->GetColor( nPos )->GetColor();
}
break;
case RET_CANCEL:
break;
}
}
}
if( nDlgType == 0 ) // area dialog
{
nPos = m_pLbColor->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
*pPos = nPos;
}
}
return 0;
}
bool SvxColorTabPage::FillItemSet( SfxItemSet* rSet )
{
if( ( nDlgType != 0 ) ||
( *pPageType == PT_COLOR && !*pbAreaTP ) )
{
OUString aString;
Color aColor;
sal_Int32 nPos = m_pLbColor->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
aColor = pColorList->GetColor( nPos )->GetColor();
aString = m_pLbColor->GetSelectEntry();
}
else
{
aColor.SetColor (aCurrentColor.GetColor());
}
rSet->Put( XFillColorItem( aString, aColor ) );
rSet->Put( XFillStyleItem( drawing::FillStyle_SOLID ) );
}
return true;
}
void SvxColorTabPage::UpdateModified()
{
bool bEnable = pColorList.is() && pColorList->Count();
m_pBtnModify->Enable( bEnable );
m_pBtnWorkOn->Enable( bEnable );
m_pBtnDelete->Enable( bEnable );
EnableSave( bEnable );
}
void SvxColorTabPage::Reset( const SfxItemSet* rSet )
{
SfxItemState nState = rSet->GetItemState( XATTR_FILLCOLOR );
Color aNewColor;
if ( nState >= SfxItemState::DEFAULT )
{
XFillColorItem aColorItem( static_cast<const XFillColorItem&>(rSet->Get( XATTR_FILLCOLOR )) );
aNewColor = aColorItem.GetColorValue();
m_pLbColor->SelectEntry(aNewColor);
m_pValSetColorList->SelectItem( m_pLbColor->GetSelectEntryPos() + 1 );
m_pEdtName->SetText( m_pLbColor->GetSelectEntry() );
}
// set color model
OUString aStr = GetUserData();
m_pLbColorModel->SelectEntryPos( aStr.toInt32() );
ChangeColor(aNewColor);
SelectColorModelHdl_Impl( this );
m_pCtlPreviewOld->Invalidate();
UpdateModified();
}
VclPtr<SfxTabPage> SvxColorTabPage::Create( vcl::Window* pWindow,
const SfxItemSet* rOutAttrs )
{
return VclPtr<SvxColorTabPage>::Create( pWindow, *rOutAttrs );
}
// is called when the content of the MtrFields is changed for color values
IMPL_LINK_NOARG(SvxColorTabPage, ModifiedHdl_Impl)
{
if (eCM == CM_RGB)
{
// read current MtrFields, if cmyk, then k-value as transparency
aCurrentColor.SetColor ( Color( (sal_uInt8)PercentToColor_Impl( (sal_uInt16) m_pR->GetValue() ),
(sal_uInt8)PercentToColor_Impl( (sal_uInt16) m_pG->GetValue() ),
(sal_uInt8)PercentToColor_Impl( (sal_uInt16) m_pB->GetValue() ) ).GetColor() );
}
else
{
// read current MtrFields, if cmyk, then k-value as transparency
aCurrentColor.SetColor ( Color( (sal_uInt8)PercentToColor_Impl( (sal_uInt16) m_pK->GetValue() ),
(sal_uInt8)PercentToColor_Impl( (sal_uInt16) m_pC->GetValue() ),
(sal_uInt8)PercentToColor_Impl( (sal_uInt16) m_pY->GetValue() ),
(sal_uInt8)PercentToColor_Impl( (sal_uInt16) m_pM->GetValue() ) ).GetColor() );
ConvertColorValues (aCurrentColor, CM_RGB);
}
rXFSet.Put( XFillColorItem( OUString(), aCurrentColor ) );
m_pCtlPreviewNew->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->Invalidate();
return 0;
}
IMPL_LINK_NOARG(SvxColorTabPage, ClickAddHdl_Impl)
{
OUString aNewName( SVX_RES( RID_SVXSTR_COLOR ) );
OUString aDesc( CUI_RES( RID_SVXSTR_DESC_COLOR ) );
OUString aName( m_pEdtName->GetText() );
long nCount = pColorList->Count();
long j = 1;
// check if name is already existing
while (true)
{
bool bDifferent = true;
for( long i = 0; i < nCount && bDifferent; i++ )
if ( aName == pColorList->GetColor( i )->GetName() )
bDifferent = false;
if (bDifferent)
break;
aName = aNewName;
aName += " ";
aName += OUString::number( j++ );
}
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
ScopedVclPtr<MessageDialog> pWarnBox;
sal_uInt16 nError = 1;
while (pDlg->Execute() == RET_OK)
{
pDlg->GetName( aName );
bool bDifferent = true;
for (long i = 0; i < nCount && bDifferent; ++i)
{
if( aName == pColorList->GetColor( i )->GetName() )
bDifferent = false;
}
if (bDifferent)
{
nError = 0;
break;
}
if( !pWarnBox )
{
pWarnBox.reset(VclPtr<MessageDialog>::Create( GetParentDialog()
,"DuplicateNameDialog"
,"cui/ui/queryduplicatedialog.ui"));
}
if( pWarnBox->Execute() != RET_OK )
break;
}
pDlg.reset();
pWarnBox.reset();
if (!nError)
{
XColorEntry* pEntry = new XColorEntry( aCurrentColor, aName );
pColorList->Insert( pEntry, pColorList->Count() );
m_pLbColor->Append( *pEntry );
m_pValSetColorList->InsertItem( m_pValSetColorList->GetItemCount() + 1, pEntry->GetColor(), pEntry->GetName() );
ImpColorCountChanged();
m_pLbColor->SelectEntryPos( m_pLbColor->GetEntryCount() - 1 );
*pnColorListState |= ChangeType::MODIFIED;
SelectColorLBHdl_Impl( this );
}
UpdateModified();
return 0;
}
IMPL_LINK_NOARG(SvxColorTabPage, ClickModifyHdl_Impl)
{
sal_Int32 nPos = m_pLbColor->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
ResMgr& rMgr = CUI_MGR();
OUString aDesc( ResId( RID_SVXSTR_DESC_COLOR, rMgr ) );
OUString aName( m_pEdtName->GetText() );
long nCount = pColorList->Count();
bool bDifferent = true;
// check if name is already existing
for ( long i = 0; i < nCount && bDifferent; i++ )
if ( aName == pColorList->GetColor( i )->GetName() && nPos != i )
bDifferent = false;
// if yes, it is repeated and a new name is demanded
if ( !bDifferent )
{
ScopedVclPtrInstance<MessageDialog> aWarningBox( GetParentDialog()
,"DuplicateNameDialog"
,"cui/ui/queryduplicatedialog.ui");
aWarningBox->Execute();
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
boost::scoped_ptr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog( GetParentDialog(), aName, aDesc ));
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 == pColorList->GetColor( i )->GetName() && nPos != i )
bDifferent = false;
if( bDifferent )
bLoop = false;
else
aWarningBox->Execute();
}
}
// if not existing the entry is entered
if( bDifferent )
{
// #123497# Need to replace the existing entry with a new one (old returned needs to be deleted)
XColorEntry* pEntry = new XColorEntry(aCurrentColor, aName);
delete pColorList->Replace(pEntry, nPos);
m_pLbColor->Modify( *pEntry, nPos );
m_pLbColor->SelectEntryPos( nPos );
m_pValSetColorList->SetItemColor( nPos + 1, pEntry->GetColor() );
m_pValSetColorList->SetItemText( nPos + 1, pEntry->GetName() );
m_pEdtName->SetText( aName );
m_pCtlPreviewOld->Invalidate();
*pnColorListState |= ChangeType::MODIFIED;
}
}
return 0;
}
IMPL_LINK_NOARG(SvxColorTabPage, ClickWorkOnHdl_Impl)
{
boost::scoped_ptr<SvColorDialog> pColorDlg(new SvColorDialog( GetParentDialog() ));
pColorDlg->SetColor (aCurrentColor);
pColorDlg->SetMode( svtools::ColorPickerMode_MODIFY );
if( pColorDlg->Execute() == RET_OK )
{
sal_uInt16 nK = 0;
Color aPreviewColor = pColorDlg->GetColor();
aCurrentColor = aPreviewColor;
if (eCM != CM_RGB)
{
ConvertColorValues (aCurrentColor, eCM);
m_pC->SetValue( ColorToPercent_Impl( aCurrentColor.GetRed() ) );
m_pY->SetValue( ColorToPercent_Impl( aCurrentColor.GetGreen() ) );
m_pM->SetValue( ColorToPercent_Impl( aCurrentColor.GetBlue() ) );
m_pK->SetValue( ColorToPercent_Impl( nK ) );
ConvertColorValues (aCurrentColor, CM_RGB);
}
else
{
m_pR->SetValue( ColorToPercent_Impl( aCurrentColor.GetRed() ) );
m_pG->SetValue( ColorToPercent_Impl( aCurrentColor.GetGreen() ) );
m_pB->SetValue( ColorToPercent_Impl( aCurrentColor.GetBlue() ) );
}
// fill ItemSet and pass it on to XOut
rXFSet.Put( XFillColorItem( OUString(), aPreviewColor ) );
//m_pCtlPreviewOld->SetAttributes( aXFillAttr );
m_pCtlPreviewNew->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->Invalidate();
}
return 0;
}
IMPL_LINK_NOARG(SvxColorTabPage, ClickDeleteHdl_Impl)
{
sal_Int32 nPos = m_pLbColor->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
ScopedVclPtrInstance< MessageDialog > aQueryBox( GetParentDialog(),"AskDelColorDialog","cui/ui/querydeletecolordialog.ui");
if( aQueryBox->Execute() == RET_YES )
{
XColorEntry* pEntry = pColorList->Remove( nPos );
DBG_ASSERT( pEntry, "ColorEntry not found !" );
delete pEntry;
// update Listbox and ValueSet
m_pLbColor->RemoveEntry( nPos );
m_pValSetColorList->Clear();
m_pValSetColorList->addEntriesForXColorList(*pColorList);
ImpColorCountChanged();
//FillValueSet_Impl(*m_pValSetColorList);
// positioning
m_pLbColor->SelectEntryPos( nPos );
SelectColorLBHdl_Impl( this );
m_pCtlPreviewOld->Invalidate();
*pnColorListState |= ChangeType::MODIFIED;
}
}
UpdateModified();
return 0;
}
IMPL_LINK_NOARG(SvxColorTabPage, SelectColorLBHdl_Impl)
{
sal_Int32 nPos = m_pLbColor->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
m_pValSetColorList->SelectItem( nPos + 1 );
m_pEdtName->SetText( m_pLbColor->GetSelectEntry() );
rXFSet.Put( XFillColorItem( OUString(),
m_pLbColor->GetSelectEntryColor() ) );
m_pCtlPreviewOld->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewOld->Invalidate();
m_pCtlPreviewNew->Invalidate();
XColorEntry* pEntry = pColorList->GetColor(nPos);
ChangeColor(pEntry->GetColor());
}
return 0;
}
IMPL_LINK_NOARG(SvxColorTabPage, SelectValSetHdl_Impl)
{
sal_Int32 nPos = m_pValSetColorList->GetSelectItemId();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
m_pLbColor->SelectEntryPos( nPos - 1 );
m_pEdtName->SetText( m_pLbColor->GetSelectEntry() );
rXFSet.Put( XFillColorItem( OUString(),
m_pLbColor->GetSelectEntryColor() ) );
m_pCtlPreviewOld->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewOld->Invalidate();
m_pCtlPreviewNew->Invalidate();
XColorEntry* pEntry = pColorList->GetColor(nPos-1);
ChangeColor(pEntry->GetColor());
}
return 0;
}
void SvxColorTabPage::ConvertColorValues (Color& rColor, ColorModel eModell)
{
switch (eModell)
{
case CM_RGB:
{
CmykToRgb_Impl (rColor, (sal_uInt16)rColor.GetTransparency() );
rColor.SetTransparency ((sal_uInt8) 0);
}
break;
case CM_CMYK:
{
sal_uInt16 nK;
RgbToCmyk_Impl (rColor, nK );
rColor.SetTransparency ((sal_uInt8) nK);
}
break;
}
}
IMPL_LINK_NOARG(SvxColorTabPage, SelectColorModelHdl_Impl)
{
int nPos = m_pLbColorModel->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
eCM = (ColorModel) nPos;
switch( eCM )
{
case CM_RGB:
{
m_pRGB->Show();
m_pCMYK->Hide();
}
break;
case CM_CMYK:
{
m_pCMYK->Show();
m_pRGB->Hide();
}
break;
}
ChangeColor(aCurrentColor);
}
return 0;
}
void SvxColorTabPage::ChangeColor(const Color &rNewColor)
{
aCurrentColor = rNewColor;
if (eCM != CM_RGB)
{
ConvertColorValues (aCurrentColor, eCM);
m_pC->SetValue( ColorToPercent_Impl( aCurrentColor.GetRed() ) );
m_pY->SetValue( ColorToPercent_Impl( aCurrentColor.GetGreen() ) );
m_pM->SetValue( ColorToPercent_Impl( aCurrentColor.GetBlue() ) );
m_pK->SetValue( ColorToPercent_Impl( aCurrentColor.GetTransparency() ) );
ConvertColorValues (aCurrentColor, CM_RGB);
}
else
{
m_pR->SetValue( ColorToPercent_Impl( aCurrentColor.GetRed() ) );
m_pG->SetValue( ColorToPercent_Impl( aCurrentColor.GetGreen() ) );
m_pB->SetValue( ColorToPercent_Impl( aCurrentColor.GetBlue() ) );
}
// fill ItemSet and pass it on to XOut
rXFSet.Put( XFillColorItem( OUString(), aCurrentColor ) );
m_pCtlPreviewOld->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->SetAttributes( aXFillAttr.GetItemSet() );
m_pCtlPreviewNew->Invalidate();
}
//void SvxColorTabPage::FillValueSet_Impl( ValueSet& rVs )
//{
// long nCount = pColorList->Count();
// XColorEntry* pColorEntry;
// if( nCount > 104 )
// rVs.SetStyle( rVs.GetStyle() | WB_VSCROLL );
// for( long i = 0; i < nCount; i++ )
// {
// pColorEntry = pColorList->GetColor( i );
// rVs.InsertItem( i + 1, pColorEntry->GetColor(), pColorEntry->GetName() );
// }
//}
// A RGB value is converted to a CMYK value - not in an ideal way as
// R is converted into C, G into M and B into Y. The K value is held in an
// extra variable. For further color models one should develop own
// classes which should contain the respective casts.
void SvxColorTabPage::RgbToCmyk_Impl( Color& rColor, sal_uInt16& rK )
{
sal_uInt16 const nColor1 = 255 - rColor.GetRed();
sal_uInt16 const nColor2 = 255 - rColor.GetGreen();
sal_uInt16 const nColor3 = 255 - rColor.GetBlue();
rK = std::min( std::min( nColor1, nColor2 ), nColor3 );
rColor.SetRed( sal::static_int_cast< sal_uInt8 >( nColor1 - rK ) );
rColor.SetGreen( sal::static_int_cast< sal_uInt8 >( nColor2 - rK ) );
rColor.SetBlue( sal::static_int_cast< sal_uInt8 >( nColor3 - rK ) );
}
// reverse case to RgbToCmyk_Impl (see above)
void SvxColorTabPage::CmykToRgb_Impl( Color& rColor, const sal_uInt16 nK )
{
long lTemp;
lTemp = 255 - ( rColor.GetRed() + nK );
if( lTemp < 0L )
lTemp = 0L;
rColor.SetRed( (sal_uInt8)lTemp );
lTemp = 255 - ( rColor.GetGreen() + nK );
if( lTemp < 0L )
lTemp = 0L;
rColor.SetGreen( (sal_uInt8)lTemp );
lTemp = 255 - ( rColor.GetBlue() + nK );
if( lTemp < 0L )
lTemp = 0L;
rColor.SetBlue( (sal_uInt8)lTemp );
}
sal_uInt16 SvxColorTabPage::ColorToPercent_Impl( sal_uInt16 nColor )
{
sal_uInt16 nWert = 0;
switch (eCM)
{
case CM_RGB :
nWert = nColor;
break;
case CM_CMYK:
nWert = (sal_uInt16) ( (double) nColor * 100.0 / 255.0 + 0.5 );
break;
}
return nWert;
}
sal_uInt16 SvxColorTabPage::PercentToColor_Impl( sal_uInt16 nPercent )
{
sal_uInt16 nWert = 0;
switch (eCM)
{
case CM_RGB :
nWert = nPercent;
break;
case CM_CMYK:
nWert = (sal_uInt16) ( (double) nPercent * 255.0 / 100.0 + 0.5 );
break;
}
return nWert;
}
void SvxColorTabPage::FillUserData()
{
// the color model is saved in the Ini-file
SetUserData( OUString::number( eCM ) );
}
void SvxColorTabPage::SetupForViewFrame( SfxViewFrame *pViewFrame )
{
const OfaRefItem<XColorList> *pPtr = NULL;
if ( pViewFrame != NULL && pViewFrame->GetDispatcher() )
pPtr = static_cast<const OfaRefItem<XColorList> *>(pViewFrame->
GetDispatcher()->Execute( SID_GET_COLORLIST,
SfxCallMode::SYNCHRON ));
pColorList = pPtr ? pPtr->GetValue() : XColorList::GetStdColorList();
SetPageType( &pShadow->nUnknownType );
SetDlgType( COLORPAGE_UNKNOWN );
SetPos( &pShadow->nUnknownPos );
SetAreaTP( &pShadow->bIsAreaTP );
SetColorChgd( &pShadow->nChangeType );
Construct();
}
void SvxColorTabPage::SaveToViewFrame( SfxViewFrame *pViewFrame )
{
if( !pColorList.is() )
return;
pColorList->Save();
if( !pViewFrame )
return;
// notify current viewframe that it uses the same color table
if ( !pViewFrame->GetDispatcher() )
return;
const OfaRefItem<XColorList> * pPtr;
pPtr = static_cast<const OfaRefItem<XColorList>*>(pViewFrame->GetDispatcher()->Execute( SID_GET_COLORLIST, SfxCallMode::SYNCHRON ));
if( pPtr )
{
XColorListRef pReference = pPtr->GetValue();
if( pReference.is() &&
pReference->GetPath() == pColorList->GetPath() &&
pReference->GetName() == pColorList->GetName() )
SfxObjectShell::Current()->PutItem( SvxColorListItem( pColorList,
SID_COLOR_TABLE ) );
}
}
void SvxColorTabPage::SetPropertyList( XPropertyListType t, const XPropertyListRef &xRef )
{
(void) t;
OSL_ASSERT( t == XCOLOR_LIST );
pColorList = XColorListRef( static_cast<XColorList *>(xRef.get() ) );
}
void SvxColorTabPage::SetColorList( XColorListRef pColList )
{
SetPropertyList( XCOLOR_LIST, XPropertyListRef( ( pColList.get() ) ) );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */