/************************************************************** * * 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 //CHINA001 #include #include #include #include #include #include #include #include #include #include #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_uInt32 nParCnt = pEdEngine->GetParagraphCount(); for (sal_uInt32 i=0; iSetParaAttribs( 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 ); } */