blob: 9d7ab8e670864d5197483e252d2d88898362b617 [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"
//------------------------------------------------------------------
#define _TPHFEDIT_CXX
#include "scitems.hxx"
#include <editeng/eeitem.hxx>
//CHINA001 #include <svx/chardlg.hxx>
#include <editeng/editobj.hxx>
#include <editeng/editstat.hxx>
#include <editeng/editview.hxx>
#include <editeng/flditem.hxx>
#include <editeng/adjitem.hxx>
#include <sfx2/basedlgs.hxx>
#include <sfx2/objsh.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/svapp.hxx>
#include "tphfedit.hxx"
#include "editutil.hxx"
#include "global.hxx"
#include "attrib.hxx"
#include "patattr.hxx"
#include "scresid.hxx"
#include "sc.hrc"
#include "globstr.hrc"
#include "tabvwsh.hxx"
#include "prevwsh.hxx"
#include "hfedtdlg.hrc"
//CHINA001 #include "textdlgs.hxx"
#include "AccessibleEditObject.hxx"
#include "scabstdlg.hxx" //CHINA001
// STATIC DATA -----------------------------------------------------------
static ScEditWindow* pActiveEdWnd = NULL;
ScEditWindow* GetScEditWindow ()
{
return pActiveEdWnd;
}
//CHINA001
//CHINA001 static sal_uInt16 pPageRightHeaderRanges[] = { SID_SCATTR_PAGE_HEADERRIGHT,
//CHINA001 SID_SCATTR_PAGE_HEADERRIGHT,
//CHINA001 0 };
//CHINA001
//CHINA001 static sal_uInt16 pPageRightFooterRanges[] = { SID_SCATTR_PAGE_FOOTERRIGHT,
//CHINA001 SID_SCATTR_PAGE_FOOTERRIGHT,
//CHINA001 0 };
//CHINA001
//CHINA001 static sal_uInt16 pPageLeftHeaderRanges[] = { SID_SCATTR_PAGE_HEADERLEFT,
//CHINA001 SID_SCATTR_PAGE_HEADERLEFT,
//CHINA001 0 };
//CHINA001
//CHINA001 static sal_uInt16 pPageLeftFooterRanges[] = { SID_SCATTR_PAGE_FOOTERLEFT,
//CHINA001 SID_SCATTR_PAGE_FOOTERLEFT,
//CHINA001 0 };
//CHINA001
//CHINA001 static ScEditWindow* pActiveEdWnd = NULL;
//CHINA001
//CHINA001
//CHINA001
//CHINA001 //========================================================================
//CHINA001 // class ScHFEditPage
//CHINA001 //
//CHINA001
//CHINA001 ScHFEditPage::ScHFEditPage( Window* pParent,
//CHINA001 sal_uInt16 nResId,
//CHINA001 const SfxItemSet& rCoreAttrs,
//CHINA001 sal_uInt16 nWhichId )
//CHINA001
//CHINA001 : SfxTabPage ( pParent, ScResId( nResId ), rCoreAttrs ),
//CHINA001
//CHINA001 aWndLeft ( this, ScResId( WND_LEFT ), Left ),
//CHINA001 aWndCenter ( this, ScResId( WND_CENTER ), Center ),
//CHINA001 aWndRight ( this, ScResId( WND_RIGHT ), Right ),
//CHINA001 aFtLeft ( this, ScResId( FT_LEFT ) ),
//CHINA001 aFtCenter ( this, ScResId( FT_CENTER ) ),
//CHINA001 aFtRight ( this, ScResId( FT_RIGHT ) ),
//CHINA001 aFlInfo ( this, ScResId( FL_INFO ) ),
//CHINA001 aFtInfo ( this, ScResId( FT_INFO ) ),
//CHINA001 aBtnText ( this, ScResId( BTN_TEXT ) ),
//CHINA001 aBtnPage ( this, ScResId( BTN_PAGE ) ),
//CHINA001 aBtnLastPage ( this, ScResId( BTN_PAGES ) ),
//CHINA001 aBtnDate ( this, ScResId( BTN_DATE ) ),
//CHINA001 aBtnTime ( this, ScResId( BTN_TIME ) ),
//CHINA001 aBtnFile ( this, ScResId( BTN_FILE ) ),
//CHINA001 aBtnTable ( this, ScResId( BTN_TABLE ) ),
//CHINA001 aPopUpFile ( ScResId( RID_POPUP_FCOMMAND) ),
//CHINA001 nWhich ( nWhichId )
//CHINA001 {
//CHINA001 //! use default style from current document?
//CHINA001 //! if font color is used, header/footer background color must be set
//CHINA001
//CHINA001 ScPatternAttr aPatAttr( rCoreAttrs.GetPool() );
//CHINA001
//CHINA001 aBtnFile.SetPopupMenu(&aPopUpFile);
//CHINA001
//CHINA001 aBtnFile.SetMenuHdl( LINK( this, ScHFEditPage, MenuHdl ) );
//CHINA001 aBtnText .SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
//CHINA001 aBtnPage .SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
//CHINA001 aBtnLastPage.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
//CHINA001 aBtnDate .SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
//CHINA001 aBtnTime .SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
//CHINA001 aBtnFile .SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
//CHINA001 aBtnTable .SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
//CHINA001
//CHINA001 aBtnText .SetModeImage( Image( ScResId( IMG_TEXT_H ) ), BMP_COLOR_HIGHCONTRAST );
//CHINA001 aBtnFile .SetModeImage( Image( ScResId( IMG_FILE_H ) ), BMP_COLOR_HIGHCONTRAST );
//CHINA001 aBtnTable .SetModeImage( Image( ScResId( IMG_TABLE_H ) ), BMP_COLOR_HIGHCONTRAST );
//CHINA001 aBtnPage .SetModeImage( Image( ScResId( IMG_PAGE_H ) ), BMP_COLOR_HIGHCONTRAST );
//CHINA001 aBtnLastPage.SetModeImage( Image( ScResId( IMG_PAGES_H ) ), BMP_COLOR_HIGHCONTRAST );
//CHINA001 aBtnDate .SetModeImage( Image( ScResId( IMG_DATE_H ) ), BMP_COLOR_HIGHCONTRAST );
//CHINA001 aBtnTime .SetModeImage( Image( ScResId( IMG_TIME_H ) ), BMP_COLOR_HIGHCONTRAST );
//CHINA001
//CHINA001 aWndLeft. SetFont( aPatAttr );
//CHINA001 aWndCenter. SetFont( aPatAttr );
//CHINA001 aWndRight. SetFont( aPatAttr );
//CHINA001
//CHINA001 FillCmdArr();
//CHINA001
//CHINA001 aWndLeft.GrabFocus();
//CHINA001
//CHINA001 FreeResource();
//CHINA001 }
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 __EXPORT ScHFEditPage::~ScHFEditPage()
//CHINA001 {
//CHINA001 }
//CHINA001
//CHINA001 void ScHFEditPage::SetNumType(SvxNumType eNumType)
//CHINA001 {
//CHINA001 aWndLeft.SetNumType(eNumType);
//CHINA001 aWndCenter.SetNumType(eNumType);
//CHINA001 aWndRight.SetNumType(eNumType);
//CHINA001 }
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 #define IS_AVAILABLE(w)(rCoreSet.GetItemState( (w) ) >= SFX_ITEM_AVAILABLE)
//CHINA001
//CHINA001 void __EXPORT ScHFEditPage::Reset( const SfxItemSet& rCoreSet )
//CHINA001 {
//CHINA001 if ( IS_AVAILABLE( nWhich ) )
//CHINA001 {
//CHINA001 const ScPageHFItem& rItem = (const ScPageHFItem&)(rCoreSet.Get( nWhich ));
//CHINA001
//CHINA001 const EditTextObject* pLeft = rItem.GetLeftArea();
//CHINA001 const EditTextObject* pCenter = rItem.GetCenterArea();
//CHINA001 const EditTextObject* pRight = rItem.GetRightArea();
//CHINA001
//CHINA001 if ( pLeft && pCenter && pRight )
//CHINA001 {
//CHINA001 aWndLeft .SetText( *pLeft );
//CHINA001 aWndCenter .SetText( *pCenter );
//CHINA001 aWndRight .SetText( *pRight );
//CHINA001 }
//CHINA001 }
//CHINA001 }
//CHINA001
//CHINA001 #undef IS_AVAILABLE
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 sal_Bool __EXPORT ScHFEditPage::FillItemSet( SfxItemSet& rCoreSet )
//CHINA001 {
//CHINA001 ScPageHFItem aItem( nWhich );
//CHINA001 EditTextObject* pLeft = aWndLeft .CreateTextObject();
//CHINA001 EditTextObject* pCenter = aWndCenter.CreateTextObject();
//CHINA001 EditTextObject* pRight = aWndRight .CreateTextObject();
//CHINA001
//CHINA001 aItem.SetLeftArea ( *pLeft );
//CHINA001 aItem.SetCenterArea( *pCenter );
//CHINA001 aItem.SetRightArea ( *pRight );
//CHINA001 delete pLeft;
//CHINA001 delete pCenter;
//CHINA001 delete pRight;
//CHINA001
//CHINA001 rCoreSet.Put( aItem );
//CHINA001
//CHINA001 return sal_True;
//CHINA001 }
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 #define SET_CMD(i,id) x
//CHINA001 aCmd = aDel; x
//CHINA001 aCmd += ScGlobal::GetRscString( id ); x
//CHINA001 aCmd += aDel; x
//CHINA001 aCmdArr[i] = aCmd;
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 void ScHFEditPage::FillCmdArr()
//CHINA001 {
//CHINA001 String aDel( ScGlobal::GetRscString( STR_HFCMD_DELIMITER ) );
//CHINA001 String aCmd;
//CHINA001
//CHINA001 SET_CMD( 0, STR_HFCMD_PAGE )
//CHINA001 SET_CMD( 1, STR_HFCMD_PAGES )
//CHINA001 SET_CMD( 2, STR_HFCMD_DATE )
//CHINA001 SET_CMD( 3, STR_HFCMD_TIME )
//CHINA001 SET_CMD( 4, STR_HFCMD_FILE )
//CHINA001 SET_CMD( 5, STR_HFCMD_TABLE )
//CHINA001 }
//CHINA001
//CHINA001 #undef SET_CMD
//CHINA001
//CHINA001 //-----------------------------------------------------------------------
//CHINA001 // Handler:
//CHINA001 //-----------------------------------------------------------------------
//CHINA001
//CHINA001 IMPL_LINK( ScHFEditPage, ClickHdl, ImageButton*, pBtn )
//CHINA001 {
//CHINA001 if ( !pActiveEdWnd )
//CHINA001 return 0;
//CHINA001
//CHINA001 if ( pBtn == &aBtnText )
//CHINA001 {
//CHINA001 pActiveEdWnd->SetCharAttriutes();
//CHINA001 }
//CHINA001 else
//CHINA001 {
//CHINA001 if ( pBtn == &aBtnPage )
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem(SvxPageField()) );
//CHINA001 else if ( pBtn == &aBtnLastPage )
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem(SvxPagesField()) );
//CHINA001 else if ( pBtn == &aBtnDate )
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem(SvxDateField(Date(),SVXDATETYPE_VAR)) );
//CHINA001 else if ( pBtn == &aBtnTime )
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem(SvxTimeField()) );
//CHINA001 else if ( pBtn == &aBtnFile )
//CHINA001 {
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem( SvxFileField() ) );
//CHINA001 }
//CHINA001 else if ( pBtn == &aBtnTable )
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem(SvxTableField()) );
//CHINA001 }
//CHINA001 pActiveEdWnd->GrabFocus();
//CHINA001
//CHINA001 return 0;
//CHINA001 }
//CHINA001
//CHINA001 IMPL_LINK( ScHFEditPage, MenuHdl, ScExtIButton*, pBtn )
//CHINA001 {
//CHINA001 if ( !pActiveEdWnd )
//CHINA001 return 0;
//CHINA001
//CHINA001 if(pBtn!=NULL)
//CHINA001 {
//CHINA001 switch(pBtn->GetSelected())
//CHINA001 {
//CHINA001 case FILE_COMMAND_TITEL:
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem( SvxFileField() ) );
//CHINA001 break;
//CHINA001 case FILE_COMMAND_FILENAME:
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem( SvxExtFileField(
//CHINA001 EMPTY_STRING, SVXFILETYPE_VAR, SVXFILEFORMAT_NAME_EXT ) ) );
//CHINA001 break;
//CHINA001 case FILE_COMMAND_PATH:
//CHINA001 pActiveEdWnd->InsertField( SvxFieldItem( SvxExtFileField(
//CHINA001 EMPTY_STRING, SVXFILETYPE_VAR, SVXFILEFORMAT_FULLPATH ) ) );
//CHINA001 break;
//CHINA001 }
//CHINA001 }
//CHINA001 return 0;
//CHINA001 }
//CHINA001
//CHINA001 //========================================================================
//CHINA001 // class ScRightHeaderEditPage
//CHINA001 //========================================================================
//CHINA001
//CHINA001 ScRightHeaderEditPage::ScRightHeaderEditPage( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 : ScHFEditPage( pParent, RID_SCPAGE_HFED_HR, rCoreSet,
//CHINA001 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_HEADERRIGHT) )
//CHINA001 {}
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 sal_uInt16* __EXPORT ScRightHeaderEditPage::GetRanges()
//CHINA001 { return pPageRightHeaderRanges; }
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 SfxTabPage* __EXPORT ScRightHeaderEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 { return ( new ScRightHeaderEditPage( pParent, rCoreSet ) ); };
//CHINA001
//CHINA001
//CHINA001 //========================================================================
//CHINA001 // class ScLeftHeaderEditPage
//CHINA001 //========================================================================
//CHINA001
//CHINA001 ScLeftHeaderEditPage::ScLeftHeaderEditPage( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 : ScHFEditPage( pParent, RID_SCPAGE_HFED_HL, rCoreSet,
//CHINA001 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_HEADERLEFT) )
//CHINA001 {}
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 sal_uInt16* __EXPORT ScLeftHeaderEditPage::GetRanges()
//CHINA001 { return pPageLeftHeaderRanges; }
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 SfxTabPage* __EXPORT ScLeftHeaderEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 { return ( new ScLeftHeaderEditPage( pParent, rCoreSet ) ); };
//CHINA001
//CHINA001 //========================================================================
//CHINA001 // class ScRightFooterEditPage
//CHINA001 //========================================================================
//CHINA001
//CHINA001 ScRightFooterEditPage::ScRightFooterEditPage( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 : ScHFEditPage( pParent, RID_SCPAGE_HFED_FR, rCoreSet,
//CHINA001 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_FOOTERRIGHT) )
//CHINA001 {}
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 sal_uInt16* __EXPORT ScRightFooterEditPage::GetRanges()
//CHINA001 { return pPageRightFooterRanges; }
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 SfxTabPage* __EXPORT ScRightFooterEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 { return ( new ScRightFooterEditPage( pParent, rCoreSet ) ); };
//CHINA001
//CHINA001 //========================================================================
//CHINA001 // class ScLeftFooterEditPage
//CHINA001 //========================================================================
//CHINA001
//CHINA001 ScLeftFooterEditPage::ScLeftFooterEditPage( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 : ScHFEditPage( pParent, RID_SCPAGE_HFED_FL, rCoreSet,
//CHINA001 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_FOOTERLEFT) )
//CHINA001 {}
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 sal_uInt16* __EXPORT ScLeftFooterEditPage::GetRanges()
//CHINA001 { return pPageLeftFooterRanges; }
//CHINA001
//CHINA001 // -----------------------------------------------------------------------
//CHINA001
//CHINA001 SfxTabPage* __EXPORT ScLeftFooterEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
//CHINA001 { return ( new ScLeftFooterEditPage( pParent, rCoreSet ) ); };
//========================================================================
void lcl_GetFieldData( ScHeaderFieldData& rData )
{
SfxViewShell* pShell = SfxViewShell::Current();
if (pShell)
{
if (pShell->ISA(ScTabViewShell))
((ScTabViewShell*)pShell)->FillFieldData(rData);
else if (pShell->ISA(ScPreviewShell))
((ScPreviewShell*)pShell)->FillFieldData(rData);
}
}
//========================================================================
// class ScEditWindow
//========================================================================
ScEditWindow::ScEditWindow( Window* pParent, const ResId& rResId, ScEditWindowLocation eLoc )
: Control( pParent, rResId ),
eLocation(eLoc),
pAcc(NULL)
{
EnableRTL(sal_False);
const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
Color aBgColor = rStyleSettings.GetWindowColor();
SetMapMode( MAP_TWIP );
SetPointer( POINTER_TEXT );
SetBackground( aBgColor );
Size aSize( GetOutputSize() );
aSize.Height() *= 4;
pEdEngine = new ScHeaderEditEngine( EditEngine::CreatePool(), sal_True );
pEdEngine->SetPaperSize( aSize );
pEdEngine->SetRefDevice( this );
ScHeaderFieldData aData;
lcl_GetFieldData( aData );
// Feldbefehle:
pEdEngine->SetData( aData );
pEdEngine->SetControlWord( pEdEngine->GetControlWord() | EE_CNTRL_MARKFIELDS );
mbRTL = ScGlobal::IsSystemRTL();
if (mbRTL)
pEdEngine->SetDefaultHorizontalTextDirection(EE_HTEXTDIR_R2L);
pEdView = new EditView( pEdEngine, this );
pEdView->SetOutputArea( Rectangle( Point(0,0), GetOutputSize() ) );
pEdView->SetBackgroundColor( aBgColor );
pEdEngine->InsertView( pEdView );
}
// -----------------------------------------------------------------------
__EXPORT ScEditWindow::~ScEditWindow()
{
// delete Accessible object before deleting EditEngine and EditView
if (pAcc)
{
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xTemp = xAcc;
if (xTemp.is())
pAcc->dispose();
}
delete pEdEngine;
delete pEdView;
}
// -----------------------------------------------------------------------
void ScEditWindow::SetNumType(SvxNumType eNumType)
{
pEdEngine->SetNumType(eNumType);
pEdEngine->UpdateFields();
}
// -----------------------------------------------------------------------
EditTextObject* __EXPORT ScEditWindow::CreateTextObject()
{
// wegen #38841# die Absatzattribute zuruecksetzen
// (GetAttribs beim Format-Dialog-Aufruf gibt immer gesetzte Items zurueck)
const SfxItemSet& rEmpty = pEdEngine->GetEmptyItemSet();
sal_uInt16 nParCnt = pEdEngine->GetParagraphCount();
for (sal_uInt16 i=0; i<nParCnt; i++)
pEdEngine->SetParaAttribs( i, rEmpty );
return pEdEngine->CreateTextObject();
}
// -----------------------------------------------------------------------
void ScEditWindow::SetFont( const ScPatternAttr& rPattern )
{
SfxItemSet* pSet = new SfxItemSet( pEdEngine->GetEmptyItemSet() );
rPattern.FillEditItemSet( pSet );
// FillEditItemSet adjusts font height to 1/100th mm,
// but for header/footer twips is needed, as in the PatternAttr:
pSet->Put( rPattern.GetItem(ATTR_FONT_HEIGHT), EE_CHAR_FONTHEIGHT );
pSet->Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CJK );
pSet->Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CTL );
if (mbRTL)
pSet->Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
pEdEngine->SetDefaults( pSet );
}
// -----------------------------------------------------------------------
void ScEditWindow::SetText( const EditTextObject& rTextObject )
{
pEdEngine->SetText( rTextObject );
}
// -----------------------------------------------------------------------
void ScEditWindow::InsertField( const SvxFieldItem& rFld )
{
pEdView->InsertField( rFld );
}
// -----------------------------------------------------------------------
void ScEditWindow::SetCharAttriutes()
{
SfxObjectShell* pDocSh = SfxObjectShell::Current();
SfxViewShell* pViewSh = SfxViewShell::Current();
ScTabViewShell* pTabViewSh = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
DBG_ASSERT( pDocSh, "Current DocShell not found" );
DBG_ASSERT( pViewSh, "Current ViewShell not found" );
if ( pDocSh && pViewSh )
{
if(pTabViewSh!=NULL) pTabViewSh->SetInFormatDialog(sal_True);
SfxItemSet aSet( pEdView->GetAttribs() );
//CHINA001 ScCharDlg* pDlg = new ScCharDlg( GetParent(), &aSet, pDocSh );
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
SfxAbstractTabDialog* pDlg = pFact->CreateScCharDlg( GetParent(), &aSet,
pDocSh,RID_SCDLG_CHAR );
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
pDlg->SetText( ScGlobal::GetRscString( STR_TEXTATTRS ) );
if ( pDlg->Execute() == RET_OK )
{
aSet.ClearItem();
aSet.Put( *pDlg->GetOutputItemSet() );
pEdView->SetAttribs( aSet );
}
if(pTabViewSh!=NULL) pTabViewSh->SetInFormatDialog(sal_False);
delete pDlg;
}
}
// -----------------------------------------------------------------------
void __EXPORT ScEditWindow::Paint( const Rectangle& rRec )
{
const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
Color aBgColor = rStyleSettings.GetWindowColor();
pEdView->SetBackgroundColor( aBgColor );
SetBackground( aBgColor );
Control::Paint( rRec );
pEdView->Paint( rRec );
if( HasFocus() )
pEdView->ShowCursor(sal_True,sal_True);
}
// -----------------------------------------------------------------------
void __EXPORT ScEditWindow::MouseMove( const MouseEvent& rMEvt )
{
pEdView->MouseMove( rMEvt );
}
// -----------------------------------------------------------------------
void __EXPORT ScEditWindow::MouseButtonDown( const MouseEvent& rMEvt )
{
if ( !HasFocus() )
GrabFocus();
pEdView->MouseButtonDown( rMEvt );
}
// -----------------------------------------------------------------------
void __EXPORT ScEditWindow::MouseButtonUp( const MouseEvent& rMEvt )
{
pEdView->MouseButtonUp( rMEvt );
}
// -----------------------------------------------------------------------
void __EXPORT ScEditWindow::KeyInput( const KeyEvent& rKEvt )
{
sal_uInt16 nKey = rKEvt.GetKeyCode().GetModifier()
+ rKEvt.GetKeyCode().GetCode();
if ( nKey == KEY_TAB || nKey == KEY_TAB + KEY_SHIFT )
{
Control::KeyInput( rKEvt );
}
else if ( !pEdView->PostKeyEvent( rKEvt ) )
{
Control::KeyInput( rKEvt );
}
else if ( !rKEvt.GetKeyCode().IsMod1() && !rKEvt.GetKeyCode().IsShift() &&
rKEvt.GetKeyCode().IsMod2() && rKEvt.GetKeyCode().GetCode() == KEY_DOWN )
{
if (aObjectSelectLink.IsSet() )
aObjectSelectLink.Call(this);
}
}
// -----------------------------------------------------------------------
void ScEditWindow::Command( const CommandEvent& rCEvt )
{
pEdView->Command( rCEvt );
}
// -----------------------------------------------------------------------
void __EXPORT ScEditWindow::GetFocus()
{
pEdView->ShowCursor(sal_True,sal_True);
pActiveEdWnd = this;
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xTemp = xAcc;
if (xTemp.is() && pAcc)
{
pAcc->GotFocus();
}
else
pAcc = NULL;
}
void __EXPORT ScEditWindow::LoseFocus()
{
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xTemp = xAcc;
if (xTemp.is() && pAcc)
{
pAcc->LostFocus();
}
else
pAcc = NULL;
}
// -----------------------------------------------------------------------
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > ScEditWindow::CreateAccessible()
{
String sName;
String sDescription(GetHelpText());
switch (eLocation)
{
case Left:
{
sName = String(ScResId(STR_ACC_LEFTAREA_NAME));
// sDescription = String(ScResId(STR_ACC_LEFTAREA_DESCR));
}
break;
case Center:
{
sName = String(ScResId(STR_ACC_CENTERAREA_NAME));
// sDescription = String(ScResId(STR_ACC_CENTERAREA_DESCR));
}
break;
case Right:
{
sName = String(ScResId(STR_ACC_RIGHTAREA_NAME));
// sDescription = String(ScResId(STR_ACC_RIGHTAREA_DESCR));
}
break;
}
pAcc = new ScAccessibleEditObject(GetAccessibleParentWindow()->GetAccessible(), pEdView, this,
rtl::OUString(sName), rtl::OUString(sDescription), EditControl);
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAccessible = pAcc;
xAcc = xAccessible;
return pAcc;
}
/*
class ScExtIButton : public ImageButton
{
private:
Timer aTimer;
ScPopupMenu* pPopupMenu;
DECL_LINK( TimerHdl, Timer*);
void DrawArrow();
protected:
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void MouseButtonUp( const MouseEvent& rMEvt);
virtual void StartPopup();
public:
ScExtIButton(Window* pParent, const ResId& rResId );
void SetPopupMenu(ScPopupMenu* pPopUp);
sal_uInt16 GetSelected();
void SetMenuHdl( const Link& rLink ) { aFxLink = rLink; }
const Link& GetMenuHdl() const { return aFxLink; }
}
*/
ScExtIButton::ScExtIButton(Window* pParent, const ResId& rResId )
: ImageButton(pParent,rResId),
pPopupMenu(NULL)
{
nSelected=0;
aTimer.SetTimeout(600);
SetDropDown( sal_True);
// DrawArrow();
}
void ScExtIButton::SetPopupMenu(ScPopupMenu* pPopUp)
{
pPopupMenu=pPopUp;
}
sal_uInt16 ScExtIButton::GetSelected()
{
return nSelected;
}
void ScExtIButton::MouseButtonDown( const MouseEvent& rMEvt )
{
if(!aTimer.IsActive())
{
aTimer.Start();
aTimer.SetTimeoutHdl(LINK( this, ScExtIButton, TimerHdl));
}
ImageButton::MouseButtonDown(rMEvt );
}
void ScExtIButton::MouseButtonUp( const MouseEvent& rMEvt)
{
aTimer.Stop();
aTimer.SetTimeoutHdl(Link());
ImageButton::MouseButtonUp(rMEvt );
}
void ScExtIButton::Click()
{
aTimer.Stop();
aTimer.SetTimeoutHdl(Link());
ImageButton::Click();
}
void ScExtIButton::StartPopup()
{
nSelected=0;
if(pPopupMenu!=NULL)
{
SetPressed( sal_True );
EndSelection();
Point aPoint(0,0);
aPoint.Y()=GetOutputSizePixel().Height();
nSelected=pPopupMenu->Execute( this, aPoint );
if(nSelected)
{
aMLink.Call(this);
}
SetPressed( sal_False);
}
}
long ScExtIButton::PreNotify( NotifyEvent& rNEvt )
{
sal_uInt16 nSwitch=rNEvt.GetType();
if(nSwitch==EVENT_MOUSEBUTTONUP)
{
MouseButtonUp(*rNEvt.GetMouseEvent());
}
return ImageButton::PreNotify(rNEvt );
}
IMPL_LINK( ScExtIButton, TimerHdl, Timer*, EMPTYARG )
{
StartPopup();
return 0;
}
/*
static void ImplDrawToolArrow( ToolBox* pBox, long nX, long nY, sal_Bool bBlack,
sal_Bool bLeft = sal_False, sal_Bool bTop = sal_False )
{
Color aOldFillColor = pBox->GetFillColor();
WindowAlign eAlign = pBox->meAlign;
if ( bLeft )
eAlign = WINDOWALIGN_RIGHT;
else if ( bTop )
eAlign = WINDOWALIGN_BOTTOM;
switch ( eAlign )
{
case WINDOWALIGN_LEFT:
if ( bBlack )
pBox->SetFillColor( Color( COL_BLACK ) );
pBox->DrawRect( Rectangle( nX+0, nY+0, nX+0, nY+6 ) );
pBox->DrawRect( Rectangle( nX+1, nY+1, nX+1, nY+5 ) );
pBox->DrawRect( Rectangle( nX+2, nY+2, nX+2, nY+4 ) );
pBox->DrawRect( Rectangle( nX+3, nY+3, nX+3, nY+3 ) );
if ( bBlack )
{
pBox->SetFillColor( aOldFillColor );
pBox->DrawRect( Rectangle( nX+1, nY+2, nX+1, nY+4 ) );
pBox->DrawRect( Rectangle( nX+2, nY+3, nX+2, nY+3 ) );
}
break;
case WINDOWALIGN_TOP:
if ( bBlack )
pBox->SetFillColor( Color( COL_BLACK ) );
pBox->DrawRect( Rectangle( nX+0, nY+0, nX+6, nY+0 ) );
pBox->DrawRect( Rectangle( nX+1, nY+1, nX+5, nY+1 ) );
pBox->DrawRect( Rectangle( nX+2, nY+2, nX+4, nY+2 ) );
pBox->DrawRect( Rectangle( nX+3, nY+3, nX+3, nY+3 ) );
if ( bBlack )
{
pBox->SetFillColor( aOldFillColor );
pBox->DrawRect( Rectangle( nX+2, nY+1, nX+4, nY+1 ) );
pBox->DrawRect( Rectangle( nX+3, nY+2, nX+3, nY+2 ) );
}
break;
case WINDOWALIGN_RIGHT:
if ( bBlack )
pBox->SetFillColor( Color( COL_BLACK ) );
pBox->DrawRect( Rectangle( nX+3, nY+0, nX+3, nY+6 ) );
pBox->DrawRect( Rectangle( nX+2, nY+1, nX+2, nY+5 ) );
pBox->DrawRect( Rectangle( nX+1, nY+2, nX+1, nY+4 ) );
pBox->DrawRect( Rectangle( nX+0, nY+3, nX+0, nY+3 ) );
if ( bBlack )
{
pBox->SetFillColor( aOldFillColor );
pBox->DrawRect( Rectangle( nX+2, nY+2, nX+2, nY+4 ) );
pBox->DrawRect( Rectangle( nX+1, nY+3, nX+1, nY+3 ) );
}
break;
case WINDOWALIGN_BOTTOM:
if ( bBlack )
pBox->SetFillColor( Color( COL_BLACK ) );
pBox->DrawRect( Rectangle( nX+0, nY+3, nX+6, nY+3 ) );
pBox->DrawRect( Rectangle( nX+1, nY+2, nX+5, nY+2 ) );
pBox->DrawRect( Rectangle( nX+2, nY+1, nX+4, nY+1 ) );
pBox->DrawRect( Rectangle( nX+3, nY+0, nX+3, nY+0 ) );
if ( bBlack )
{
pBox->SetFillColor( aOldFillColor );
pBox->DrawRect( Rectangle( nX+2, nY+2, nX+4, nY+2 ) );
pBox->DrawRect( Rectangle( nX+3, nY+1, nX+3, nY+1 ) );
}
break;
}
}
Down
- Timer starten
Click
- Timer abbrechen
Timer
if ( ??? )
{
- SetPressed( sal_True );
- EndSelection();
- Menu anzeigen
- SetPressed( sal_False );
}
*/