blob: 67d9f1d91fdccc837ecda39eeec6f85ebc74b5b3 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
#undef SC_DLLIMPLEMENTATION
//------------------------------------------------------------------
#include "scitems.hxx"
#include <svx/algitem.hxx>
#include <editeng/boxitem.hxx>
#include <editeng/brshitem.hxx>
#include <editeng/cntritem.hxx>
#include <editeng/colritem.hxx>
#include <editeng/crsditem.hxx>
#include <editeng/fontitem.hxx>
#include <editeng/postitem.hxx>
#include <editeng/shdditem.hxx>
#include <editeng/udlnitem.hxx>
#include <editeng/wghtitem.hxx>
#include <svl/zforlist.hxx>
#include <vcl/msgbox.hxx>
#include <comphelper/processfactory.hxx>
#include <sfx2/sfxresid.hxx>
#include "sc.hrc"
#include "scmod.hxx"
#include "attrib.hxx"
#include "zforauto.hxx"
#include "scitems.hxx"
#include "global.hxx"
#include "globstr.hrc"
#include "autoform.hxx"
#include "strindlg.hxx"
#include "miscdlgs.hrc"
#include "scuiautofmt.hxx"
#include "scresid.hxx"
#include "document.hxx"
//========================================================================
// AutoFormat-Dialog:
ScAutoFormatDlg::ScAutoFormatDlg( Window* pParent,
ScAutoFormat* pAutoFormat,
const ScAutoFormatData* pSelFormatData,
ScDocument* pDoc ) :
ModalDialog ( pParent, ScResId( RID_SCDLG_AUTOFORMAT ) ),
//
aFlFormat ( this, ScResId( FL_FORMAT ) ),
aLbFormat ( this, ScResId( LB_FORMAT ) ),
pWndPreview ( new ScAutoFmtPreview( this, ScResId( WND_PREVIEW ), pDoc ) ),
aBtnOk ( this, ScResId( BTN_OK ) ),
aBtnCancel ( this, ScResId( BTN_CANCEL ) ),
aBtnHelp ( this, ScResId( BTN_HELP ) ),
aBtnAdd ( this, ScResId( BTN_ADD ) ),
aBtnRemove ( this, ScResId( BTN_REMOVE ) ),
aBtnMore ( this, ScResId( BTN_MORE ) ),
aFlFormatting ( this, ScResId( FL_FORMATTING ) ),
aBtnNumFormat ( this, ScResId( BTN_NUMFORMAT ) ),
aBtnBorder ( this, ScResId( BTN_BORDER ) ),
aBtnFont ( this, ScResId( BTN_FONT ) ),
aBtnPattern ( this, ScResId( BTN_PATTERN ) ),
aBtnAlignment ( this, ScResId( BTN_ALIGNMENT ) ),
aBtnAdjust ( this, ScResId( BTN_ADJUST ) ),
aBtnRename ( this, ScResId( BTN_RENAME ) ),
aStrTitle ( ScResId( STR_ADD_TITLE ) ),
aStrLabel ( ScResId( STR_ADD_LABEL ) ),
aStrClose ( ScResId( STR_BTN_CLOSE ) ),
aStrDelTitle ( ScResId( STR_DEL_TITLE ) ),
aStrDelMsg ( ScResId( STR_DEL_MSG ) ) ,
aStrRename ( ScResId( STR_RENAME_TITLE ) ),
//
pFormat ( pAutoFormat ),
pSelFmtData ( pSelFormatData ),
nIndex ( 0 ),
bCoreDataChanged( sal_False ),
bFmtInserted ( sal_False )
{
Init();
pWndPreview->NotifyChange( (*pFormat)[0] );
FreeResource();
}
//------------------------------------------------------------------------
__EXPORT ScAutoFormatDlg::~ScAutoFormatDlg()
{
delete pWndPreview;
}
//------------------------------------------------------------------------
void ScAutoFormatDlg::Init()
{
sal_uInt16 nCount;
String aEntry;
aLbFormat .SetSelectHdl( LINK( this, ScAutoFormatDlg, SelFmtHdl ) );
aBtnNumFormat.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
aBtnBorder .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
aBtnFont .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
aBtnPattern .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
aBtnAlignment.SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
aBtnAdjust .SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
aBtnAdd .SetClickHdl ( LINK( this, ScAutoFormatDlg, AddHdl ) );
aBtnRemove .SetClickHdl ( LINK( this, ScAutoFormatDlg, RemoveHdl ) );
aBtnOk .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
aBtnCancel .SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
aBtnRename .SetClickHdl ( LINK( this, ScAutoFormatDlg, RenameHdl ) );
aLbFormat .SetDoubleClickHdl( LINK( this, ScAutoFormatDlg, DblClkHdl ) );
aBtnMore.AddWindow( &aBtnRename );
aBtnMore.AddWindow( &aBtnNumFormat );
aBtnMore.AddWindow( &aBtnBorder );
aBtnMore.AddWindow( &aBtnFont );
aBtnMore.AddWindow( &aBtnPattern );
aBtnMore.AddWindow( &aBtnAlignment );
aBtnMore.AddWindow( &aBtnAdjust );
aBtnMore.AddWindow( &aFlFormatting );
nCount = pFormat->GetCount();
for ( sal_uInt16 i = 0; i < nCount; i++ )
{
((*pFormat)[i])->GetName( aEntry );
aLbFormat.InsertEntry( aEntry );
}
if ( nCount == 1 )
aBtnRemove.Disable();
aLbFormat.SelectEntryPos( 0 );
aBtnRename.Disable();
aBtnRemove.Disable();
nIndex = 0;
UpdateChecks();
if ( !pSelFmtData )
{
aBtnAdd.Disable();
aBtnRemove.Disable();
bFmtInserted = sal_True;
}
}
//------------------------------------------------------------------------
void ScAutoFormatDlg::UpdateChecks()
{
ScAutoFormatData* pData = (*pFormat)[nIndex];
aBtnNumFormat.Check( pData->GetIncludeValueFormat() );
aBtnBorder .Check( pData->GetIncludeFrame() );
aBtnFont .Check( pData->GetIncludeFont() );
aBtnPattern .Check( pData->GetIncludeBackground() );
aBtnAlignment.Check( pData->GetIncludeJustify() );
aBtnAdjust .Check( pData->GetIncludeWidthHeight() );
}
//------------------------------------------------------------------------
// Handler:
//---------
IMPL_LINK( ScAutoFormatDlg, CloseHdl, PushButton *, pBtn )
{
if ( pBtn == &aBtnOk || pBtn == &aBtnCancel )
{
if ( bCoreDataChanged )
ScGlobal::GetAutoFormat()->Save();
EndDialog( (pBtn == &aBtnOk) ? RET_OK : RET_CANCEL );
}
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK_INLINE_START( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG )
{
if ( bCoreDataChanged )
ScGlobal::GetAutoFormat()->Save();
EndDialog( RET_OK );
return 0;
}
IMPL_LINK_INLINE_END( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG )
//------------------------------------------------------------------------
IMPL_LINK( ScAutoFormatDlg, CheckHdl, Button *, pBtn )
{
ScAutoFormatData* pData = (*pFormat)[nIndex];
sal_Bool bCheck = ((CheckBox*)pBtn)->IsChecked();
if ( pBtn == &aBtnNumFormat )
pData->SetIncludeValueFormat( bCheck );
else if ( pBtn == &aBtnBorder )
pData->SetIncludeFrame( bCheck );
else if ( pBtn == &aBtnFont )
pData->SetIncludeFont( bCheck );
else if ( pBtn == &aBtnPattern )
pData->SetIncludeBackground( bCheck );
else if ( pBtn == &aBtnAlignment )
pData->SetIncludeJustify( bCheck );
else if ( pBtn == &aBtnAdjust )
pData->SetIncludeWidthHeight( bCheck );
if ( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
pWndPreview->NotifyChange( pData );
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( ScAutoFormatDlg, AddHdl, void *, EMPTYARG )
{
if ( !bFmtInserted && pSelFmtData )
{
String aStrStandard( SfxResId(STR_STANDARD) );
String aFormatName;
ScStringInputDlg* pDlg;
sal_Bool bOk = sal_False;
while ( !bOk )
{
pDlg = new ScStringInputDlg( this,
aStrTitle,
aStrLabel,
aFormatName,
HID_SC_ADD_AUTOFMT, HID_SC_AUTOFMT_NAME );
if ( pDlg->Execute() == RET_OK )
{
pDlg->GetInputString( aFormatName );
if ( (aFormatName.Len() > 0) && (aFormatName != aStrStandard) )
{
ScAutoFormatData* pNewData
= new ScAutoFormatData( *pSelFmtData );
pNewData->SetName( aFormatName );
bFmtInserted = pFormat->Insert( pNewData );
if ( bFmtInserted )
{
sal_uInt16 nAt = pFormat->IndexOf( pNewData );
aLbFormat.InsertEntry( aFormatName, nAt );
aLbFormat.SelectEntry( aFormatName );
aBtnAdd.Disable();
if ( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
SelFmtHdl( 0 );
bOk = sal_True;
}
else
delete pNewData;
}
if ( !bFmtInserted )
{
sal_uInt16 nRet = ErrorBox( this,
WinBits( WB_OK_CANCEL | WB_DEF_OK),
ScGlobal::GetRscString(STR_INVALID_AFNAME)
).Execute();
bOk = ( nRet == RET_CANCEL );
}
}
else
bOk = sal_True;
delete pDlg;
}
}
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( ScAutoFormatDlg, RemoveHdl, void *, EMPTYARG )
{
if ( (nIndex > 0) && (aLbFormat.GetEntryCount() > 0) )
{
String aMsg( aStrDelMsg.GetToken( 0, '#' ) );
aMsg += aLbFormat.GetSelectEntry();
aMsg += aStrDelMsg.GetToken( 1, '#' );
if ( RET_YES ==
QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() )
{
aLbFormat.RemoveEntry( nIndex );
aLbFormat.SelectEntryPos( nIndex-1 );
if ( nIndex-1 == 0 )
aBtnRemove.Disable();
if ( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
pFormat->AtFree( nIndex ); // in der Core loeschen
nIndex--;
SelFmtHdl( 0 );
}
}
SelFmtHdl( 0 );
return 0;
}
IMPL_LINK( ScAutoFormatDlg, RenameHdl, void *, EMPTYARG )
{
sal_Bool bOk = sal_False;
while( !bOk )
{
String aFormatName=aLbFormat.GetSelectEntry();
String aEntry;
ScStringInputDlg* pDlg = new ScStringInputDlg( this,
aStrRename,
aStrLabel,
aFormatName,
HID_SC_REN_AFMT_DLG, HID_SC_REN_AFMT_NAME );
if( pDlg->Execute() == RET_OK )
{
sal_Bool bFmtRenamed = sal_False;
pDlg->GetInputString( aFormatName );
sal_uInt16 n;
if ( aFormatName.Len() > 0 )
{
for( n = 0; n < pFormat->GetCount(); ++n )
{
(*pFormat)[n]->GetName(aEntry);
if ( aEntry== aFormatName)
break;
}
if( n >= pFormat->GetCount() )
{
// Format mit dem Namen noch nicht vorhanden, also
// umbenennen
aLbFormat.RemoveEntry(nIndex );
ScAutoFormatData* p=(*pFormat)[ nIndex ];
ScAutoFormatData* pNewData
= new ScAutoFormatData(*p);
pFormat->AtFree( nIndex );
pNewData->SetName( aFormatName );
pFormat->Insert( pNewData);
sal_uInt16 nCount = pFormat->GetCount();
aLbFormat.SetUpdateMode(sal_False);
aLbFormat.Clear();
for ( sal_uInt16 i = 0; i < nCount; i++ )
{
((*pFormat)[i])->GetName( aEntry );
aLbFormat.InsertEntry( aEntry );
}
aLbFormat.SetUpdateMode( sal_True);
aLbFormat.SelectEntry( aFormatName);
if ( !bCoreDataChanged )
{
aBtnCancel.SetText( aStrClose );
bCoreDataChanged = sal_True;
}
SelFmtHdl( 0 );
bOk = sal_True;
bFmtRenamed = sal_True;
}
}
if( !bFmtRenamed )
{
bOk = RET_CANCEL == ErrorBox( this,
WinBits( WB_OK_CANCEL | WB_DEF_OK),
ScGlobal::GetRscString(STR_INVALID_AFNAME)
).Execute();
}
}
else
bOk = sal_True;
delete pDlg;
}
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( ScAutoFormatDlg, SelFmtHdl, void *, EMPTYARG )
{
nIndex = aLbFormat.GetSelectEntryPos();
UpdateChecks();
if ( nIndex == 0 )
{
aBtnRename.Disable();
aBtnRemove.Disable();
}
else
{
aBtnRename.Enable();
aBtnRemove.Enable();
}
pWndPreview->NotifyChange( (*pFormat)[nIndex] );
return 0;
}
//------------------------------------------------------------------------
String __EXPORT ScAutoFormatDlg::GetCurrFormatName()
{
String aResult;
((*pFormat)[nIndex])->GetName( aResult );
return aResult;
}