summaryrefslogtreecommitdiff
path: root/formula/source/ui/dlg/funcutl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'formula/source/ui/dlg/funcutl.cxx')
-rw-r--r--formula/source/ui/dlg/funcutl.cxx1106
1 files changed, 1106 insertions, 0 deletions
diff --git a/formula/source/ui/dlg/funcutl.cxx b/formula/source/ui/dlg/funcutl.cxx
new file mode 100644
index 000000000000..c4e28b3da8f1
--- /dev/null
+++ b/formula/source/ui/dlg/funcutl.cxx
@@ -0,0 +1,1106 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_formula.hxx"
+
+//----------------------------------------------------------------------------
+#include <vcl/sound.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/scrbar.hxx>
+
+#include "formula/funcutl.hxx"
+#include "formula/IControlReferenceHandler.hxx"
+#include "ControlHelper.hxx"
+#include "ModuleHelper.hxx"
+#include "ForResId.hrc"
+
+
+namespace formula
+{
+//============================================================================
+// class ValWnd
+//----------------------------------------------------------------------------
+
+ValWnd::ValWnd( Window* pParent, const ResId& rId ) : Window( pParent, rId )
+{
+ Font aFnt( GetFont() );
+ aFnt.SetTransparent( TRUE );
+ aFnt.SetWeight( WEIGHT_LIGHT );
+ if ( pParent->IsBackground() )
+ {
+ Wallpaper aBack = pParent->GetBackground();
+ SetFillColor( aBack.GetColor() );
+ SetBackground( aBack );
+ aFnt.SetFillColor( aBack.GetColor() );
+ }
+ else
+ {
+ SetFillColor();
+ SetBackground();
+ }
+ SetFont( aFnt );
+ SetLineColor();
+
+ Size aSzWnd = GetOutputSizePixel();
+ long nHeight = GetTextHeight();
+ long nDiff = aSzWnd.Height()-nHeight;
+
+ aRectOut = Rectangle( Point( 1, ( nDiff<2 ) ? 1 : nDiff/2),
+ Size ( aSzWnd.Width()-2, nHeight ) );
+ SetClipRegion( Region( aRectOut ) );
+}
+
+//----------------------------------------------------------------------------
+
+void __EXPORT ValWnd::Paint( const Rectangle& )
+{
+ DrawText( aRectOut.TopLeft(), aStrValue );
+}
+
+//----------------------------------------------------------------------------
+
+void ValWnd::SetValue( const String& rStrVal )
+{
+ if ( aStrValue != rStrVal )
+ {
+ aStrValue = rStrVal;
+ DrawRect( aRectOut ); // alten Text loeschen
+ Paint( aRectOut ); // und neu malen
+ }
+}
+
+//============================================================================
+// class ArgEdit
+//----------------------------------------------------------------------------
+
+ArgEdit::ArgEdit( Window* pParent, const ResId& rResId )
+ : RefEdit( pParent, rResId ),
+ pEdPrev ( NULL ),
+ pEdNext ( NULL ),
+ pSlider ( NULL ),
+ nArgs ( 0 )
+{
+}
+
+//----------------------------------------------------------------------------
+
+void ArgEdit::Init( ArgEdit* pPrevEdit, ArgEdit* pNextEdit,
+ ScrollBar& rArgSlider, USHORT nArgCount )
+{
+ pEdPrev = pPrevEdit;
+ pEdNext = pNextEdit;
+ pSlider = &rArgSlider;
+ nArgs = nArgCount;
+}
+
+//----------------------------------------------------------------------------
+
+// Cursorsteuerung fuer EditFelder im Argument-Dialog
+
+void __EXPORT ArgEdit::KeyInput( const KeyEvent& rKEvt )
+{
+ KeyCode aCode = rKEvt.GetKeyCode();
+ BOOL bUp = (aCode.GetCode() == KEY_UP);
+ BOOL bDown = (aCode.GetCode() == KEY_DOWN);
+ ArgEdit* pEd = NULL;
+
+ if ( pSlider
+ && ( !aCode.IsShift() && !aCode.IsMod1() && !aCode.IsMod2() )
+ && ( bUp || bDown ) )
+ {
+ if ( nArgs > 1 )
+ {
+ long nThumb = pSlider->GetThumbPos();
+ BOOL bDoScroll = FALSE;
+ BOOL bChangeFocus = FALSE;
+
+ if ( bDown )
+ {
+ if ( nArgs > 4 )
+ {
+ if ( !pEdNext )
+ {
+ nThumb++;
+ bDoScroll = ( nThumb+3 < (long)nArgs );
+ }
+ else
+ {
+ pEd = pEdNext;
+ bChangeFocus = TRUE;
+ }
+ }
+ else if ( pEdNext )
+ {
+ pEd = pEdNext;
+ bChangeFocus = TRUE;
+ }
+ }
+ else // if ( bUp )
+ {
+ if ( nArgs > 4 )
+ {
+ if ( !pEdPrev )
+ {
+ nThumb--;
+ bDoScroll = ( nThumb >= 0 );
+ }
+ else
+ {
+ pEd = pEdPrev;
+ bChangeFocus = TRUE;
+ }
+ }
+ else if ( pEdPrev )
+ {
+ pEd = pEdPrev;
+ bChangeFocus = TRUE;
+ }
+ }
+
+ if ( bDoScroll )
+ {
+ pSlider->SetThumbPos( nThumb );
+ ((Link&)pSlider->GetEndScrollHdl()).Call( pSlider );
+ }
+ else if ( bChangeFocus )
+ {
+ pEd->GrabFocus();
+ }
+ else
+ Sound::Beep();
+ }
+ else
+ Sound::Beep();
+ }
+ else
+ RefEdit::KeyInput( rKEvt );
+}
+
+
+
+
+/*************************************************************************
+#* Member: ArgInput Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Konstruktor der Klasse ArgInput
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+
+ArgInput::ArgInput()
+{
+ pFtArg=NULL;
+ pBtnFx=NULL;
+ pEdArg=NULL;
+ pRefBtn=NULL;
+}
+
+/*************************************************************************
+#* Member: InitArgInput Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Initialisiert die Pointer der Klasse
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+
+void ArgInput::InitArgInput(FixedText* pftArg,
+ ImageButton* pbtnFx,
+ ArgEdit* pedArg,
+ RefButton* prefBtn)
+{
+ pFtArg =pftArg;
+ pBtnFx =pbtnFx;
+ pEdArg =pedArg;
+ pRefBtn=prefBtn;
+
+ if(pBtnFx!=NULL)
+ {
+ pBtnFx->SetClickHdl ( LINK( this, ArgInput, FxBtnClickHdl ) );
+ pBtnFx->SetGetFocusHdl( LINK( this, ArgInput, FxBtnFocusHdl ) );
+ }
+ if(pRefBtn!=NULL)
+ {
+ pRefBtn->SetClickHdl ( LINK( this, ArgInput, RefBtnClickHdl ) );
+ pRefBtn->SetGetFocusHdl( LINK( this, ArgInput, RefBtnFocusHdl ) );
+ }
+ if(pEdArg!=NULL)
+ {
+ pEdArg->SetGetFocusHdl ( LINK( this, ArgInput, EdFocusHdl ) );
+ pEdArg->SetModifyHdl ( LINK( this, ArgInput, EdModifyHdl ) );
+ }
+
+}
+
+/*************************************************************************
+#* Member: SetArgName Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Setzt den Namen fuer das Argument
+#*
+#* Input: String
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::SetArgName(const String &aArg)
+{
+ if(pFtArg !=NULL) pFtArg->SetText(aArg );
+}
+
+/*************************************************************************
+#* Member: GetArgName Datum:06.02.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Liefert den Namen fuer das Argument zurueck
+#*
+#* Input: String
+#*
+#* Output: ---
+#*
+#************************************************************************/
+String ArgInput::GetArgName()
+{
+ String aPrivArgName;
+ if(pFtArg !=NULL)
+ aPrivArgName=pFtArg->GetText();
+
+ return aPrivArgName;
+}
+
+
+/*************************************************************************
+#* Member: SetArgName Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Setzt den Namen fuer das Argument
+#*
+#* Input: String
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::SetArgNameFont (const Font &aFont)
+{
+ if(pFtArg !=NULL) pFtArg->SetFont(aFont);
+}
+
+/*************************************************************************
+#* Member: SetArgSelection Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Stellt die Selection fuer die EditBox ein.
+#*
+#* Input: String
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::SetArgSelection (const Selection& rSel )
+{
+ if(pEdArg !=NULL) pEdArg ->SetSelection(rSel );
+}
+
+/*************************************************************************
+#* Member: SetArgSelection Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Liefert die Selection fuer die EditBox zurueck.
+#*
+#* Input: String
+#*
+#* Output: ---
+#*
+#************************************************************************/
+Selection ArgInput::GetArgSelection ()
+{
+ Selection aSel;
+ if(pEdArg !=NULL) aSel=pEdArg ->GetSelection();
+ return aSel;
+}
+
+/*************************************************************************
+#* Member: SetArgSelection Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Ersetzt die Selection in der EditBox.
+#*
+#* Input: String
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::ReplaceSelOfArg(const String& rStr )
+{
+ if(pEdArg !=NULL) pEdArg ->ReplaceSelected(rStr );
+}
+
+
+
+/*************************************************************************
+#* Member: SetArgVal Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Setzt den Wert fuer das Argument
+#*
+#* Input: String
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::SetArgVal(const String &aVal)
+{
+ if(pEdArg !=NULL)
+ {
+ pEdArg ->SetRefString(aVal );
+ }
+}
+
+/*************************************************************************
+#* Member: SetArgName Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Liefert den Wert fuer das Argument
+#*
+#* Input: ---
+#*
+#* Output: String
+#*
+#************************************************************************/
+String ArgInput::GetArgVal()
+{
+ String aResult;
+ if(pEdArg!=NULL)
+ {
+ aResult=pEdArg->GetText();
+ }
+ return aResult;
+}
+
+/*************************************************************************
+#* Member: SetArgName Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Versteckt die Controls
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::Hide()
+{
+ if ( pFtArg && pBtnFx && pEdArg && pRefBtn)
+ {
+ pFtArg->Hide();
+ pBtnFx->Hide();
+ pEdArg->Hide();
+ pRefBtn->Hide();
+ }
+}
+
+/*************************************************************************
+#* Member: SetArgName Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Zaubert die Controls wieder hervor.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::Show()
+{
+ if ( pFtArg && pBtnFx && pEdArg && pRefBtn)
+ {
+ pFtArg->Show();
+ pBtnFx->Show();
+ pEdArg->Show();
+ pRefBtn->Show();
+ }
+}
+
+/*************************************************************************
+#* Member: FxClick Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Gibt den Event weiter.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::FxClick()
+{
+ aFxClickLink.Call(this);
+}
+
+/*************************************************************************
+#* Member: RefClick Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Gibt den Event weiter.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::RefClick()
+{
+ aRefClickLink.Call(this);
+}
+
+/*************************************************************************
+#* Member: FxFocus Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Gibt den Event weiter.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::FxFocus()
+{
+ aFxFocusLink.Call(this);
+}
+
+/*************************************************************************
+#* Member: RefFocus Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Gibt den Event weiter.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::RefFocus()
+{
+ aRefFocusLink.Call(this);
+}
+
+/*************************************************************************
+#* Member: EdFocus Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Gibt den Event weiter.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::EdFocus()
+{
+ aEdFocusLink.Call(this);
+}
+
+/*************************************************************************
+#* Member: EdModify Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Gibt den Event weiter.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void ArgInput::EdModify()
+{
+ aEdModifyLink.Call(this);
+}
+
+/*************************************************************************
+#* Handle: FxBtnHdl Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Handle fuer Fx-Button Click-Event.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+IMPL_LINK( ArgInput, FxBtnClickHdl, ImageButton*, pBtn )
+{
+ if(pBtn==pBtnFx) FxClick();
+
+ return 0;
+}
+
+/*************************************************************************
+#* Handle: RefBtnClickHdl Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Handle fuer Fx-Button Click-Event.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+IMPL_LINK( ArgInput, RefBtnClickHdl,RefButton*, pBtn )
+{
+ if(pRefBtn==pBtn) RefClick();
+
+ return 0;
+}
+
+/*************************************************************************
+#* Handle: FxBtnFocusHdl Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Handle fuer Fx-Button Focus-Event.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+IMPL_LINK( ArgInput, FxBtnFocusHdl, ImageButton*, pBtn )
+{
+ if(pBtn==pBtnFx) FxFocus();
+
+ return 0;
+}
+
+/*************************************************************************
+#* Handle: RefBtnFocusHdl Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Handle fuer Fx-Button Focus-Event.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+IMPL_LINK( ArgInput, RefBtnFocusHdl,RefButton*, pBtn )
+{
+ if(pRefBtn==pBtn) RefFocus();
+
+ return 0;
+}
+
+/*************************************************************************
+#* Handle: EdFocusHdl Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Handle fuer Fx-Button Focus-Event.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+IMPL_LINK( ArgInput, EdFocusHdl, ArgEdit*, pEd )
+{
+ if(pEd==pEdArg) EdFocus();
+
+ return 0;
+}
+
+/*************************************************************************
+#* Handle: RefBtnClickHdl Datum:13.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: ArgInput
+#*
+#* Funktion: Handle fuer Fx-Button Focus-Event.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+IMPL_LINK( ArgInput, EdModifyHdl,ArgEdit*, pEd )
+{
+ if(pEd==pEdArg) EdModify();
+
+ return 0;
+}
+
+/*************************************************************************
+#* Member: EditBox Datum:20.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: EditBox
+#*
+#* Funktion: Konstruktor der Klasse ArgInput
+#*
+#* Input: Parent, Window-Style
+#*
+#* Output: ---
+#*
+#************************************************************************/
+EditBox::EditBox( Window* pParent,WinBits nWinStyle)
+ :Control(pParent,nWinStyle|WB_DIALOGCONTROL)
+{
+ pMEdit=new MultiLineEdit(this,WB_LEFT | WB_VSCROLL | (nWinStyle & WB_TABSTOP) |
+ WB_NOBORDER | WB_NOHIDESELECTION | WB_IGNORETAB);
+
+ pMEdit->Show();
+ aOldSel=pMEdit->GetSelection();
+}
+
+/*************************************************************************
+#* Member: EditBox Datum:20.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: EditBox
+#*
+#* Funktion: Konstruktor der Klasse ArgInput
+#*
+#* Input: Parent, Resource
+#*
+#* Output: ---
+#*
+#************************************************************************/
+EditBox::EditBox( Window* pParent, const ResId& rResId )
+ :Control(pParent,rResId),
+ bMouseFlag(FALSE)
+{
+ WinBits nStyle=GetStyle();
+ SetStyle( nStyle| WB_DIALOGCONTROL);
+
+ pMEdit=new MultiLineEdit(this,WB_LEFT | WB_VSCROLL | (nStyle & WB_TABSTOP) |
+ WB_NOBORDER | WB_NOHIDESELECTION | WB_IGNORETAB);
+ pMEdit->Show();
+ aOldSel=pMEdit->GetSelection();
+ Resize();
+ WinBits nWinStyle=GetStyle() | WB_DIALOGCONTROL;
+ SetStyle(nWinStyle);
+
+ // #105582# the HelpId from the resource must be set for the MultiLineEdit,
+ // not for the control that contains it.
+ pMEdit->SetHelpId( GetHelpId() );
+ SetHelpId( "" );
+}
+
+EditBox::~EditBox()
+{
+ MultiLineEdit* pTheEdit=pMEdit;
+ pMEdit->Disable();
+ pMEdit=NULL;
+ delete pTheEdit;
+}
+/*************************************************************************
+#* Member: EditBox Datum:20.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: EditBox
+#*
+#* Funktion: Wenn sich die Selektion geaendert hat, so wird
+#* diese Funktion aufgerufen.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void EditBox::SelectionChanged()
+{
+ aSelChangedLink.Call(this);
+}
+
+/*************************************************************************
+#* Member: EditBox Datum:20.05.98
+#*------------------------------------------------------------------------
+#*
+#* Klasse: EditBox
+#*
+#* Funktion: Wenn sich die Groesse geaendert hat, so muss
+#* auch der MultiLineEdit angepasst werden..
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void EditBox::Resize()
+{
+ Size aSize=GetOutputSizePixel();
+ if(pMEdit!=NULL) pMEdit->SetOutputSizePixel(aSize);
+}
+
+/*************************************************************************
+#* Member: GetFocus Datum:26.05.98
+#*------------------------------------------------------------------------
+#*
+#* Klasse: EditBox
+#*
+#* Funktion: Wenn der Control aktiviert wird, so wird
+#* die Selection aufgehoben und der Cursor ans
+#* Ende gesetzt.
+#*
+#* Input: ---
+#*
+#* Output: ---
+#*
+#************************************************************************/
+void EditBox::GetFocus()
+{
+ if(pMEdit!=NULL)
+ {
+ pMEdit->GrabFocus();
+ }
+}
+
+
+
+/*************************************************************************
+#* Member: EditBox Datum:20.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: EditBox
+#*
+#* Funktion: Wenn ein Event ausgeloest wird, so wird diese Routine
+#* zuerst aufgerufen und ein PostUserEvent verschickt.
+#*
+#* Input: Notify-Event
+#*
+#* Output: ---
+#*
+#************************************************************************/
+long EditBox::PreNotify( NotifyEvent& rNEvt )
+{
+ long nResult=TRUE;
+
+ if(pMEdit==NULL) return nResult;
+
+ USHORT nSwitch=rNEvt.GetType();
+ if(nSwitch==EVENT_KEYINPUT)// || nSwitch==EVENT_KEYUP)
+ {
+ const KeyCode& aKeyCode=rNEvt.GetKeyEvent()->GetKeyCode();
+ USHORT nKey=aKeyCode.GetCode();
+ if( (nKey==KEY_RETURN && !aKeyCode.IsShift()) || nKey==KEY_TAB )
+ {
+ nResult=GetParent()->Notify(rNEvt);
+ }
+ else
+ {
+ nResult=Control::PreNotify(rNEvt);
+ Application::PostUserEvent( LINK( this, EditBox, ChangedHdl ) );
+ }
+
+ }
+ else
+ {
+ nResult=Control::PreNotify(rNEvt);
+
+ if(nSwitch==EVENT_MOUSEBUTTONDOWN || nSwitch==EVENT_MOUSEBUTTONUP)
+ {
+ bMouseFlag=TRUE;
+ Application::PostUserEvent( LINK( this, EditBox, ChangedHdl ) );
+ }
+ }
+ return nResult;
+}
+
+/*************************************************************************
+#* Member: EditBox Datum:21.01.97
+#*------------------------------------------------------------------------
+#*
+#* Klasse: EditBox
+#*
+#* Funktion: Wenn ein Event ausgeloest wurde, so wird diese Routine
+#* zuerst aufgerufen.
+#*
+#* Input: Key-Event
+#*
+#* Output: ---
+#*
+#************************************************************************/
+IMPL_LINK( EditBox, ChangedHdl, EditBox*, EMPTYARG )
+{
+ if(pMEdit!=NULL)
+ {
+ Selection aNewSel=pMEdit->GetSelection();
+
+ if(aNewSel.Min()!=aOldSel.Min() || aNewSel.Max()!=aOldSel.Max())
+ {
+ SelectionChanged();
+ aOldSel=aNewSel;
+ }
+ }
+ return 0;
+}
+
+void EditBox::UpdateOldSel()
+{
+ // if selection is set for editing a function, store it as aOldSel,
+ // so SelectionChanged isn't called in the next ChangedHdl call
+
+ if (pMEdit)
+ aOldSel = pMEdit->GetSelection();
+}
+//----------------------------------------------------------------------------
+
+//============================================================================
+// class RefEdit
+//----------------------------------------------------------------------------
+
+#define SC_ENABLE_TIME 100
+
+RefEdit::RefEdit( Window* _pParent,IControlReferenceHandler* pParent, const ResId& rResId ) :
+ Edit( _pParent, rResId ),
+ pAnyRefDlg( pParent ),
+ bSilentFocus( FALSE )
+{
+ aTimer.SetTimeoutHdl( LINK( this, RefEdit, UpdateHdl ) );
+ aTimer.SetTimeout( SC_ENABLE_TIME );
+}
+
+RefEdit::RefEdit( Window* pParent, const ResId& rResId ) :
+ Edit( pParent, rResId ),
+ pAnyRefDlg( NULL ),
+ bSilentFocus( FALSE )
+{
+}
+
+RefEdit::~RefEdit()
+{
+ aTimer.SetTimeoutHdl( Link() );
+ aTimer.Stop();
+}
+
+void RefEdit::SetRefString( const XubString& rStr )
+{
+ Edit::SetText( rStr );
+}
+
+void RefEdit::SetText( const XubString& rStr )
+{
+ Edit::SetText( rStr );
+ UpdateHdl( &aTimer );
+}
+
+void RefEdit::StartUpdateData()
+{
+ aTimer.Start();
+}
+
+void RefEdit::SilentGrabFocus()
+{
+ bSilentFocus = TRUE;
+ GrabFocus();
+ bSilentFocus = FALSE;
+}
+
+void RefEdit::SetRefDialog( IControlReferenceHandler* pDlg )
+{
+ pAnyRefDlg = pDlg;
+
+ if( pDlg )
+ {
+ aTimer.SetTimeoutHdl( LINK( this, RefEdit, UpdateHdl ) );
+ aTimer.SetTimeout( SC_ENABLE_TIME );
+ }
+ else
+ {
+ aTimer.SetTimeoutHdl( Link() );
+ aTimer.Stop();
+ }
+}
+
+void RefEdit::Modify()
+{
+ Edit::Modify();
+ if( pAnyRefDlg )
+ pAnyRefDlg->HideReference();
+}
+
+void RefEdit::KeyInput( const KeyEvent& rKEvt )
+{
+ const KeyCode& rKeyCode = rKEvt.GetKeyCode();
+ if( pAnyRefDlg && !rKeyCode.GetModifier() && (rKeyCode.GetCode() == KEY_F2) )
+ pAnyRefDlg->ReleaseFocus( this );
+ else
+ Edit::KeyInput( rKEvt );
+}
+
+void RefEdit::GetFocus()
+{
+ Edit::GetFocus();
+ if( !bSilentFocus )
+ StartUpdateData();
+}
+
+void RefEdit::LoseFocus()
+{
+ Edit::LoseFocus();
+ if( pAnyRefDlg )
+ pAnyRefDlg->HideReference();
+}
+
+IMPL_LINK( RefEdit, UpdateHdl, Timer*, EMPTYARG )
+{
+ if( pAnyRefDlg )
+ pAnyRefDlg->ShowReference( GetText() );
+ return 0;
+}
+
+
+//============================================================================
+// class RefButton
+//----------------------------------------------------------------------------
+RefButton::RefButton( Window* _pParent, const ResId& rResId) :
+ ImageButton( _pParent, rResId ),
+ aImgRefStart( ModuleRes( RID_BMP_REFBTN1 ) ),
+ aImgRefStartHC( ModuleRes( RID_BMP_REFBTN1_H ) ),
+ aImgRefDone( ModuleRes( RID_BMP_REFBTN2 ) ),
+ aImgRefDoneHC( ModuleRes( RID_BMP_REFBTN2_H ) ),
+ pAnyRefDlg( NULL ),
+ pRefEdit( NULL )
+{
+ SetStartImage();
+}
+
+RefButton::RefButton( Window* _pParent, const ResId& rResId, RefEdit* pEdit, IControlReferenceHandler* _pDlg ) :
+ ImageButton( _pParent, rResId ),
+ aImgRefStart( ModuleRes( RID_BMP_REFBTN1 ) ),
+ aImgRefStartHC( ModuleRes( RID_BMP_REFBTN1_H ) ),
+ aImgRefDone( ModuleRes( RID_BMP_REFBTN2 ) ),
+ aImgRefDoneHC( ModuleRes( RID_BMP_REFBTN2_H ) ),
+ pAnyRefDlg( _pDlg ),
+ pRefEdit( pEdit )
+{
+ SetStartImage();
+}
+
+void RefButton::SetStartImage()
+{
+ SetModeImage( aImgRefStart );
+ SetModeImage( aImgRefStartHC, BMP_COLOR_HIGHCONTRAST );
+}
+
+void RefButton::SetEndImage()
+{
+ SetModeImage( aImgRefDone );
+ SetModeImage( aImgRefDoneHC, BMP_COLOR_HIGHCONTRAST );
+}
+
+void RefButton::SetReferences( IControlReferenceHandler* pDlg, RefEdit* pEdit )
+{
+ pAnyRefDlg = pDlg;
+ pRefEdit = pEdit;
+}
+
+//----------------------------------------------------------------------------
+
+void RefButton::Click()
+{
+ if( pAnyRefDlg )
+ pAnyRefDlg->ToggleCollapsed( pRefEdit, this );
+}
+
+void RefButton::KeyInput( const KeyEvent& rKEvt )
+{
+ const KeyCode& rKeyCode = rKEvt.GetKeyCode();
+ if( pAnyRefDlg && !rKeyCode.GetModifier() && (rKeyCode.GetCode() == KEY_F2) )
+ pAnyRefDlg->ReleaseFocus( pRefEdit );
+ else
+ ImageButton::KeyInput( rKEvt );
+}
+
+void RefButton::GetFocus()
+{
+ ImageButton::GetFocus();
+ if( pRefEdit )
+ pRefEdit->StartUpdateData();
+}
+
+void RefButton::LoseFocus()
+{
+ ImageButton::LoseFocus();
+ if( pRefEdit )
+ pRefEdit->Modify();
+}
+
+
+} // formula