blob: d467aed47ca5539a658b6494c6bca4b138c75e8b [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_automation.hxx"
#include <com/sun/star/frame/XFramesSupplier.hpp>
#include <com/sun/star/frame/XDispatch.hpp>
#include <com/sun/star/frame/XDispatchProvider.hpp>
#include <com/sun/star/util/XURLTransformer.hpp>
#include <comphelper/processfactory.hxx>
#include <comphelper/uieventslogger.hxx>
#include <tools/wintypes.hxx>
#include <vcl/dialog.hxx>
#include <vcl/button.hxx>
#include <vcl/menubtn.hxx>
#include <svtools/svtreebx.hxx>
#include <svtools/brwbox.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/dockwin.hxx>
#include <vcl/floatwin.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/combobox.hxx>
#include <vcl/morebtn.hxx>
#include <vcl/field.hxx>
#include <vcl/toolbox.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/tabpage.hxx>
#include <vcl/menu.hxx>
#include <vcl/status.hxx>
#include <svtools/prgsbar.hxx>
#include <svtools/editbrowsebox.hxx>
#include <vcl/splitwin.hxx>
#include <vcl/group.hxx>
#include <vcl/fixed.hxx>
#include <vcl/wrkwin.hxx>
#include <osl/diagnose.h>
#include <svtools/valueset.hxx>
#include <svtools/roadmap.hxx>
#include <svtools/table/tablecontrol.hxx>
#include <svtools/table/tablecontrolinterface.hxx>
#include <svl/poolitem.hxx>
#include <svtools/extensionlistbox.hxx>
#include <svtools/svtdata.hxx>
#include <tools/time.hxx>
#include <svtools/stringtransfer.hxx>
#include <tools/stream.hxx>
#include <tools/fsys.hxx>
#include <svl/stritem.hxx>
#include <svtools/ttprops.hxx>
#include <basic/ttstrhlp.hxx>
#include <basic/dispdefs.hxx>
#include <basic/sbuno.hxx>
#include <vos/socket.hxx>
#include <svl/pickerhistory.hxx>
#include <com/sun/star/util/XCancellable.hpp>
#include <sot/storage.hxx>
#include <sot/storinfo.hxx>
#include "statemnt.hxx"
#include "scmdstrm.hxx"
#include "retstrm.hxx"
#if OSL_DEBUG_LEVEL > 1
#include "editwin.hxx"
#endif
#include "rcontrol.hxx"
#include <automation/communi.hxx>
#include "testtool.hxx"
#include "profiler.hxx"
#include "recorder.hxx"
#include "testtool.hrc"
#include <basic/svtmsg.hrc>
#include <algorithm>
#include <vcl/dibtools.hxx>
using namespace com::sun::star::frame;
using namespace com::sun::star::uno;
//using namespace com::sun::star::util; geht wegen Color nicht
using namespace com::sun::star::beans;
using namespace svt;
//using namespace svt::table;
#ifndef SBX_VALUE_DECL_DEFINED
#define SBX_VALUE_DECL_DEFINED
SV_DECL_REF(SbxValue)
#endif
SV_IMPL_REF(SbxValue)
CommunicationLink *StatementFlow::pCommLink = NULL;
sal_Bool StatementFlow::bUseIPC = sal_True;
sal_Bool StatementFlow::bSending = sal_False;
ImplRemoteControl *StatementFlow::pRemoteControl = NULL;
sal_uInt16 StatementCommand::nDirPos = 0;
Dir *StatementCommand::pDir = NULL;
pfunc_osl_printDebugMessage StatementCommand::pOriginal_osl_DebugMessageFunc = NULL;
#define RESET_APPLICATION_TO_BACKING_WINDOW
#define SET_WINP_CLOSING(pWin) \
pWindowWaitPointer = pWin; \
aWindowWaitUId = pControl->GetUniqueOrHelpId(); \
aWindowWaitOldHelpId = pWin->GetHelpId(); \
aWindowWaitOldUniqueId = pWin->GetUniqueId(); \
pWin->SetHelpId( rtl::OString("TT_Win_is_closing_HID") ); \
pWin->SetUniqueId( rtl::OString("TT_Win_is_closing_UID") );
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
StatementFlow::StatementFlow( StatementList *pAfterThis, sal_uInt16 nArtP )
: nArt(nArtP)
, nParams(0)
, nSNr1(0)
, nLNr1(0)
, aString1()
, bBool1(sal_False)
{
QueStatement( pAfterThis );
}
StatementFlow::StatementFlow( sal_uLong nServiceId, SCmdStream *pCmdIn, ImplRemoteControl *pRC )
: nArt(0)
, nParams(0)
, nSNr1(0)
, nLNr1(0)
, aString1()
, bBool1(sal_False)
{
QueStatement( NULL );
bUseIPC = (nServiceId == SI_IPCCommandBlock);
pRemoteControl = pRC;
pCmdIn->Read( nArt );
pCmdIn->Read( nParams );
if( nParams & PARAM_USHORT_1 ) pCmdIn->Read( nSNr1 );
if( nParams & PARAM_ULONG_1 ) pCmdIn->Read( nLNr1 );
if( nParams & PARAM_STR_1 ) pCmdIn->Read( aString1 );
if( nParams & PARAM_BOOL_1 ) pCmdIn->Read( bBool1 ); // sollte nie auftreten!!
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Reading FlowControl: " );
m_pDbgWin->AddText( String::CreateFromInt32( nArt ) );
m_pDbgWin->AddText( " Params:" );
if( nParams & PARAM_USHORT_1 ) {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nSNr1 ) );}
if( nParams & PARAM_ULONG_1 ) {m_pDbgWin->AddText( " l1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
if( nParams & PARAM_STR_1 ) {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
if( nParams & PARAM_BOOL_1 ) {m_pDbgWin->AddText( " b2:" );m_pDbgWin->AddText( bBool1 ? "TRUE" : "FALSE" );}
m_pDbgWin->AddText( "\n" );
#endif
}
void StatementFlow::SendViaSocket()
{
if ( bSending )
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "SendViaSocket called recursively. Aborted!!!\n" );
#endif
DBG_ERROR("SendViaSocket called recursively. Aborted!!!");
return;
}
bSending = sal_True;
if ( pCommLink )
{
if ( !pCommLink->TransferDataStream( pRet->GetStream() ) ) // tritt ein Fehler auf, so wird sofort gelöscht ...
pCommLink = NULL;
}
else
{
// Macht nix. Wenn das Basic nicht mehr da ist, ist sowiso alles egal
DBG_ERROR("Cannot send results to TestTool");
}
pRet->Reset();
bSending = sal_False;
IsError = sal_False;
}
sal_Bool StatementFlow::Execute()
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Executing Flow: " );
m_pDbgWin->AddText( String::CreateFromInt32( nArt ) );
m_pDbgWin->AddText( "\n" );
#endif
switch ( nArt )
{
case F_EndCommandBlock:
{
if ( !bUseIPC )
{
// bBool1 wurde im CTOR auf sal_False initialisiert
if ( !bBool1 ) // also erster Durchlauf
{
pRemoteControl->pRetStream = pRet->GetStream();
bBool1 = sal_True; // wurde im CTOR auf sal_False initialisiert
nRetryCount = nRetryCount * 4;
}
if ( pRemoteControl->pRetStream && (nRetryCount--) ) // also solange nicht abgeholt
{
return sal_False; // Bitte einmal vom Callstack runter
}
}
}
break;
}
Advance();
switch ( nArt )
{
case F_EndCommandBlock:
if ( !bUseIPC )
{ // wird oben abgehandelt
pRet->Reset();
IsError = sal_False;
}
else
SendViaSocket();
break;
case F_Sequence:
pRet->GenReturn(RET_Sequence,nLNr1);
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Sending Sequence Nr: " );
m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );
m_pDbgWin->AddText( "\n" );
#endif
break;
// case RET_:
default:
DBG_ERROR( "Unknown Flowcontrol" );
break;
}
delete this;
return sal_True;
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// neue Hilfsfunktion, die stetig erweitert werden muss
static short ImpGetRType( Window *pWin )
{
short nRT = C_NoType;
WindowType eRT = pWin->GetType();
switch( eRT ) {
case WINDOW_WINDOW: nRT = C_Window ; break;
case WINDOW_TABCONTROL: nRT = C_TabControl ; break;
case WINDOW_RADIOBUTTON: nRT = C_RadioButton ; break;
case WINDOW_CHECKBOX: nRT = C_CheckBox ; break;
case WINDOW_TRISTATEBOX: nRT = C_TriStateBox ; break;
case WINDOW_EDIT: nRT = C_Edit ; break;
case WINDOW_MULTILINEEDIT: nRT = C_MultiLineEdit ; break;
case WINDOW_MULTILISTBOX: nRT = C_MultiListBox ; break;
case WINDOW_LISTBOX: nRT = C_ListBox ; break;
case WINDOW_COMBOBOX: nRT = C_ComboBox ; break;
case WINDOW_PUSHBUTTON: nRT = C_PushButton ; break;
case WINDOW_SPINFIELD: nRT = C_SpinField ; break;
case WINDOW_PATTERNFIELD: nRT = C_PatternField ; break;
case WINDOW_NUMERICFIELD: nRT = C_NumericField ; break;
case WINDOW_METRICFIELD: nRT = C_MetricField ; break;
case WINDOW_CURRENCYFIELD: nRT = C_CurrencyField ; break;
case WINDOW_DATEFIELD: nRT = C_DateField ; break;
case WINDOW_TIMEFIELD: nRT = C_TimeField ; break;
case WINDOW_IMAGERADIOBUTTON: nRT = C_ImageRadioButton ; break;
case WINDOW_NUMERICBOX: nRT = C_NumericBox ; break;
case WINDOW_METRICBOX: nRT = C_MetricBox ; break;
case WINDOW_CURRENCYBOX: nRT = C_CurrencyBox ; break;
case WINDOW_DATEBOX: nRT = C_DateBox ; break;
case WINDOW_TIMEBOX: nRT = C_TimeBox ; break;
case WINDOW_IMAGEBUTTON: nRT = C_ImageButton ; break;
case WINDOW_MENUBUTTON: nRT = C_MenuButton ; break;
case WINDOW_MOREBUTTON: nRT = C_MoreButton ; break;
case WINDOW_TABPAGE: nRT = C_TabPage; break;
case WINDOW_MODALDIALOG: nRT = C_ModalDlg; break;
case WINDOW_FLOATINGWINDOW: nRT = C_FloatWin; break;
case WINDOW_MODELESSDIALOG: nRT = C_ModelessDlg; break;
case WINDOW_WORKWINDOW: nRT = C_WorkWin; break;
case WINDOW_DOCKINGWINDOW: nRT = C_DockingWin; break;
case WINDOW_MESSBOX: nRT = C_MessBox; break;
case WINDOW_INFOBOX: nRT = C_InfoBox; break;
case WINDOW_WARNINGBOX: nRT = C_WarningBox; break;
case WINDOW_ERRORBOX: nRT = C_ErrorBox; break;
case WINDOW_QUERYBOX: nRT = C_QueryBox; break;
#if 0 //ifndef VCL
case WINDOW_FILEDIALOG: nRT = C_FileDlg; break;
case WINDOW_PATHDIALOG: nRT = C_PathDlg; break;
case WINDOW_PRINTDIALOG: nRT = C_PrintDlg; break;
case WINDOW_PRINTERSETUPDIALOG: nRT = C_PrinterSetupDlg;break;
case WINDOW_COLORDIALOG: nRT = C_ColorDlg; break;
#endif
case WINDOW_TABDIALOG: nRT = C_TabDlg; break;
// case WINDOW_TABDIALOG: nRT = C_SingleTabDlg; break;
case WINDOW_PATTERNBOX: nRT = C_PatternBox; break;
case WINDOW_TOOLBOX: nRT = C_ToolBox; break;
// Gibts nicht case WINDOW_VALUESET: nRT = C_ValueSet; break;
case WINDOW_CONTROL: nRT = C_Control; break;
case WINDOW_OKBUTTON: nRT = C_OkButton; break;
case WINDOW_CANCELBUTTON: nRT = C_CancelButton; break;
case WINDOW_BUTTONDIALOG: nRT = C_ButtonDialog; break;
case WINDOW_TREELISTBOX: nRT = C_TreeListBox; break;
case WINDOW_DIALOG: nRT = C_Dialog; break;
}
return nRT;
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
StatementSlot::StatementSlot( SCmdStream *pCmdIn )
: pItemArr(NULL)
{
QueStatement( NULL );
pCmdIn->Read( nFunctionId );
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Reading Slot: " );
m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
m_pDbgWin->AddText( "\n" );
#endif
pCmdIn->Read( nAnzahl );
if ( nAnzahl )
{
switch ( pCmdIn->GetNextType() )
{
case BinUSHORT: // use old calling method
{
nAnzahl++;
pItemArr = new SfxPoolItem*[nAnzahl];
for (sal_uInt16 i = 0 ; i+1 < nAnzahl ; i++)
pCmdIn->Read( pItemArr[i] );
pItemArr[nAnzahl-1] = NULL;
}
break;
case BinString: // new Method
{
aArgs.realloc(nAnzahl);
PropertyValue* pArg = aArgs.getArray();
for (sal_uInt16 i = 0 ; i < nAnzahl ; i++)
pCmdIn->Read( pArg[i] );
}
break;
}
}
}
// Constructor for UnoSlot
StatementSlot::StatementSlot()
: nAnzahl( 0 )
, pItemArr(NULL)
, nFunctionId( 0 )
, bMenuClosed(sal_False)
{}
StatementSlot::StatementSlot( sal_uLong nSlot, SfxPoolItem* pItem )
: pItemArr(NULL)
, bMenuClosed(sal_False)
{
QueStatement( NULL );
nFunctionId = sal_uInt16(nSlot);
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Reading Slot: " );
m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
m_pDbgWin->AddText( "\n" );
#endif
if ( pItem )
{
nAnzahl = 2;
pItemArr = new SfxPoolItem*[2];
pItemArr[0] = pItem;
pItemArr[1] = NULL;
}
else
nAnzahl = 0;
}
StatementSlot::~StatementSlot()
{
if (nAnzahl)
{
if ( pItemArr )
{
for (sal_uInt16 i = 0 ; i+1 < nAnzahl ; i++)
delete pItemArr[i];
delete[] pItemArr;
}
aArgs.realloc( 0 );
}
}
void StatementSlot::AddReferer()
{
HACK( "only to test!" );
// because slot 6102 /*SID_VERB_START*/ crashes when called with Property Referer
// We return to the previous behavior (which was a bug realy) of not adding this Property to calls which have no properties at all
// according to MBA most likely this Property can be removed at all and is maybe only needed for Slots with URLs
if ( !nAnzahl )
return;
PropertyValue* pArg;
nAnzahl++;
aArgs.realloc(nAnzahl);
pArg = aArgs.getArray();
pArg[nAnzahl-1].Name = rtl::OUString::createFromAscii("Referer");
pArg[nAnzahl-1].Value <<= ::rtl::OUString::createFromAscii("private:user");
nAnzahl++;
aArgs.realloc(nAnzahl);
pArg = aArgs.getArray();
pArg[nAnzahl-1].Name = rtl::OUString::createFromAscii("SynchronMode");
pArg[nAnzahl-1].Value <<= sal_Bool( sal_True );
}
class SlotStatusListener : public cppu::WeakImplHelper1< XStatusListener >
{
public:
SlotStatusListener();
// XStatusListener
virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw (::com::sun::star::uno::RuntimeException);
// XEventListener
virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
// local Members
sal_Bool bDisposed;
sal_Bool bEnabled;
};
/*
struct FeatureStateEvent : public ::com::sun::star::lang::EventObject
::com::sun::star::util::URL FeatureURL;
::rtl::OUString FeatureDescriptor;
sal_Bool IsEnabled;
sal_Bool Requery;
::com::sun::star::uno::Any State;
::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > Source;
*/
SlotStatusListener::SlotStatusListener()
: bDisposed( sal_False )
, bEnabled( sal_True )
{}
// XStatusListener
void SAL_CALL SlotStatusListener::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw (::com::sun::star::uno::RuntimeException)
{
// DBG_ERROR1("FeatureURL: %s", ByteString( String( Event.FeatureURL.Complete ), RTL_TEXTENCODING_UTF8 ).GetBuffer() );
// DBG_ERROR1("FeatureDescriptor: %s", ByteString( String( Event.FeatureDescriptor ), RTL_TEXTENCODING_UTF8 ).GetBuffer() );
bEnabled = Event.IsEnabled;
// DBG_ASSERT( Event.IsEnabled, "Not enabled" );
// DBG_ASSERT( !Event.Requery, "Requery" );
}
// XEventListener
void SAL_CALL SlotStatusListener::disposing( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException)
{
bDisposed = sal_True;
}
sal_Bool StatementSlot::Execute()
{
if ( IsError )
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Skipping Slot: " );
m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
m_pDbgWin->AddText( "\n" );
#endif
Advance();
delete this;
return sal_True;
}
InitProfile();
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Executing Slot: " );
m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
m_pDbgWin->AddText( "\n" );
#endif
PopupMenu *pPopup = NULL;
MenuBar *pMenuBar = NULL;
Menu *pMenu;
GetCurrentMenues( pPopup, pMenuBar, pMenu );
if ( pPopup )
{
if ( !bMenuClosed )
{
pPopup->EndExecute(0);
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
bMenuClosed = sal_True;
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Closed contextmenu\n" );
#endif
return sal_False;
}
else if ( nRetryCount-- )
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Waiting for contextmenu to close\n" );
#endif
return sal_False;
}
else
ReportError( GEN_RES_STR0( S_MENU_NOT_CLOSING ) );
}
Advance();
if ( !IsError )
{
if ( ( nAnzahl == 0 && !getenv("OLDSLOTHANDLING") ) || aArgs.hasElements() )
{ // trying to call slots via uno
AddReferer();
if ( !aUnoUrl.Len() )
aUnoUrl = CUniString("slot:").Append( String::CreateFromInt32( nFunctionId ) );
::com::sun::star::util::URL aTargetURL;
aTargetURL.Complete = aUnoUrl;
Reference < XFramesSupplier > xDesktop = Reference < XFramesSupplier >( ::comphelper::getProcessServiceFactory()->createInstance( CUniString("com.sun.star.frame.Desktop") ), UNO_QUERY );
Reference < XFrame > xFrame;
if ( xDesktop.is() )
{
xFrame = xDesktop->getActiveFrame();
if ( !xFrame.is() )
{
Reference < XFrames > xFrames;
xFrames = xDesktop->getFrames();
if ( xFrames.is() && xFrames->getCount() > 0 )
{
Any aFrame = xFrames->getByIndex( xFrames->getCount() -1 );
aFrame >>= xFrame;
}
}
if ( !xFrame.is() )
{
if ( GetFirstDocFrame() )
GetFirstDocFrame()->ToTop();
xFrame = xDesktop->getActiveFrame();
}
}
if ( xFrame.is() )
xDesktop = Reference < XFramesSupplier >( xFrame, UNO_QUERY );
else
xDesktop.clear();
while ( xDesktop.is() && xDesktop->getActiveFrame().is() )
{
xFrame = xDesktop->getActiveFrame();
#if OSL_DEBUG_LEVEL > 1
::rtl::OUString aName;
if ( xFrame.is() )
aName = xFrame->getName();
#endif
xDesktop = Reference < XFramesSupplier >( xFrame, UNO_QUERY );
}
if ( !xFrame.is() )
ReportError( GEN_RES_STR1( S_UNO_URL_EXECUTE_FAILED_NO_FRAME, aTargetURL.Complete ) );
else
{
Reference < ::com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( CUniString("com.sun.star.util.URLTransformer" )), UNO_QUERY );
xTrans->parseStrict( aTargetURL );
Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
Reference < XDispatch > xDisp;
while ( xProv.is() && !xDisp.is() )
{
xDisp = xProv->queryDispatch( aTargetURL, ::rtl::OUString(), 0 );
if ( !xDisp.is() )
{
xFrame = Reference < XFrame > ( xFrame->getCreator(), UNO_QUERY );
xProv = Reference < XDispatchProvider > ( xFrame, UNO_QUERY );
}
}
if ( xDisp.is() )
{
Reference < XStatusListener > xListener = ( XStatusListener* )new SlotStatusListener;
xDisp->addStatusListener( xListener, aTargetURL );
if ( static_cast< SlotStatusListener* >(xListener.get())->bEnabled )
{
if ( bIsSlotInExecute )
ReportError( GEN_RES_STR0( S_SLOT_IN_EXECUTE ) );
else
{
bIsSlotInExecute = sal_True;
xDisp->dispatch( aTargetURL, aArgs );
bIsSlotInExecute = sal_False;
}
}
else
ReportError( GEN_RES_STR1( S_UNO_URL_EXECUTE_FAILED_DISABLED, aTargetURL.Complete ) );
xDisp->removeStatusListener( xListener, aTargetURL );
}
else
ReportError( GEN_RES_STR1( S_UNO_URL_EXECUTE_FAILED_NO_DISPATCHER, aTargetURL.Complete ) );
}
}
else
{
DirectLog( S_QAError, GEN_RES_STR0( S_DEPRECATED ) );
if ( !pTTProperties )
pTTProperties = new TTProperties();
switch ( pTTProperties->ExecuteFunction( nFunctionId, pItemArr, EXECUTEMODE_DIALOGASYNCHRON | nUseBindings ) )
{
case TT_PR_ERR_NODISPATCHER:
{
ReportError( rtl::OString::valueOf((sal_Int32)nFunctionId), GEN_RES_STR0( S_SID_EXECUTE_FAILED_NO_DISPATCHER ) );
}
break;
case TT_PR_ERR_NOEXECUTE:
{
ReportError( rtl::OString::valueOf((sal_Int32)nFunctionId), GEN_RES_STR0( S_SID_EXECUTE_FAILED ) );
}
break;
}
}
}
/* Neues Verfahren ab 334!
Neue Methode zum einstellen, daß Modale Dialoge immer Asynchron aufgerufen werden
und echter Returnwert, ob Slot geklappt hat
und Testen ob Slot überhaupt durch UI aufgerufen werden kann */
SendProfile( SlotString( nFunctionId ) );
delete this;
return sal_True;
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
StatementUnoSlot::StatementUnoSlot(SCmdStream *pIn)
{
QueStatement( NULL );
pIn->Read( aUnoUrl );
#if OSL_DEBUG_LEVEL > 1
StatementList::m_pDbgWin->AddText( "UnoUrl:" );
StatementList::m_pDbgWin->AddText( aUnoUrl );
StatementList::m_pDbgWin->AddText( "\n" );
#endif
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
StatementCommand::StatementCommand( StatementList *pAfterThis, sal_uInt16 MethodId, sal_uInt16 Params, sal_uInt16 Nr1 )
: nMethodId( MethodId )
, nParams(Params)
, nNr1(Nr1)
, nNr2(0)
, nNr3(0)
, nNr4(0)
, nLNr1(0)
, aString1()
, aString2()
, bBool1(sal_False)
, bBool2(sal_False)
{
QueStatement( pAfterThis );
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Directly adding Conmmand:" );
m_pDbgWin->AddText( " Methode: " );
m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
m_pDbgWin->AddText( " Params:" );
if( nParams & PARAM_USHORT_1 ) {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr1 ) );}
if( nParams & PARAM_USHORT_2 ) {m_pDbgWin->AddText( " n2:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr2 ) );}
if( nParams & PARAM_USHORT_3 ) {m_pDbgWin->AddText( " n3:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr3 ) );}
if( nParams & PARAM_USHORT_4 ) {m_pDbgWin->AddText( " n4:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr4 ) );}
if( nParams & PARAM_ULONG_1 ) {m_pDbgWin->AddText( " nl1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
if( nParams & PARAM_STR_1 ) {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
if( nParams & PARAM_STR_2 ) {m_pDbgWin->AddText( " s2:" );m_pDbgWin->AddText( aString2 );}
if( nParams & PARAM_BOOL_1 ) {m_pDbgWin->AddText( " b1:" );m_pDbgWin->AddText( bBool1 ? "TRUE" : "FALSE" );}
if( nParams & PARAM_BOOL_2 ) {m_pDbgWin->AddText( " b2:" );m_pDbgWin->AddText( bBool2 ? "TRUE" : "FALSE" );}
m_pDbgWin->AddText( "\n" );
#endif
}
StatementCommand::StatementCommand( SCmdStream *pCmdIn )
: nMethodId(0)
, nParams(0)
, nNr1(0)
, nNr2(0)
, nNr3(0)
, nNr4(0)
, nLNr1(0)
, aString1()
, aString2()
, bBool1(sal_False)
, bBool2(sal_False)
{
QueStatement( NULL );
pCmdIn->Read( nMethodId );
pCmdIn->Read( nParams );
if( nParams & PARAM_USHORT_1 ) pCmdIn->Read( nNr1 );
if( nParams & PARAM_USHORT_2 ) pCmdIn->Read( nNr2 );
if( nParams & PARAM_USHORT_3 ) pCmdIn->Read( nNr3 );
if( nParams & PARAM_USHORT_4 ) pCmdIn->Read( nNr4 );
if( nParams & PARAM_ULONG_1 ) pCmdIn->Read( nLNr1 );
if( nParams & PARAM_STR_1 ) pCmdIn->Read( aString1 );
if( nParams & PARAM_STR_2 ) pCmdIn->Read( aString2 );
if( nParams & PARAM_BOOL_1 ) pCmdIn->Read( bBool1 );
if( nParams & PARAM_BOOL_2 ) pCmdIn->Read( bBool2 );
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Reading Conmmand:" );
m_pDbgWin->AddText( " Methode: " );
m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
m_pDbgWin->AddText( " Params:" );
if( nParams & PARAM_USHORT_1 ) {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr1 ) );}
if( nParams & PARAM_USHORT_2 ) {m_pDbgWin->AddText( " n2:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr2 ) );}
if( nParams & PARAM_USHORT_3 ) {m_pDbgWin->AddText( " n3:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr3 ) );}
if( nParams & PARAM_USHORT_4 ) {m_pDbgWin->AddText( " n4:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr4 ) );}
if( nParams & PARAM_ULONG_1 ) {m_pDbgWin->AddText( " nl1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
if( nParams & PARAM_STR_1 ) {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
if( nParams & PARAM_STR_2 ) {m_pDbgWin->AddText( " s2:" );m_pDbgWin->AddText( aString2 );}
if( nParams & PARAM_BOOL_1 ) {m_pDbgWin->AddText( " b1:" );m_pDbgWin->AddText( bBool1 ? "TRUE" : "FALSE" );}
if( nParams & PARAM_BOOL_2 ) {m_pDbgWin->AddText( " b2:" );m_pDbgWin->AddText( bBool2 ? "TRUE" : "FALSE" );}
m_pDbgWin->AddText( "\n" );
#endif
if ( nMethodId == RC_AppAbort )
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "*Deleting all Commands:\n" );
#endif
bReadingCommands = sal_False;
while ( StatementList::pFirst != this ) // Alles Löschen außer mich selbst
{
StatementList *pDeQue = StatementList::pFirst;
pDeQue->Advance();
delete pDeQue;
}
bReadingCommands = sal_True;
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "*Done deleting all Commands:\n" );
#endif
}
}
void StatementCommand::WriteControlData( Window *pBase, sal_uLong nConf, sal_Bool bFirst )
{
if ( IsDialog(pBase) && !bFirst )
return;
if ( bFirst )
pRet->GenReturn ( RET_WinInfo, rtl::OString(), (comm_ULONG)nConf | DH_MODE_DATA_VALID, UniString(), sal_True );
if ( bFirst )
{
if ( pBase->GetType() == WINDOW_WINDOW && pBase->GetParent() && pBase->GetParent()->GetType() == WINDOW_CONTROL &&
dynamic_cast< svt::table::TableControl* > ( pBase->GetParent() ) )
pBase = pBase->GetParent();
}
{ // Klammerung, so daß der String nicht während der Rekursion bestehen bleibt
String aName;
sal_Bool bSkip = sal_False;
switch ( pBase->GetType() )
{
case WINDOW_RADIOBUTTON:
case WINDOW_CHECKBOX:
case WINDOW_TRISTATEBOX:
case WINDOW_PUSHBUTTON:
case WINDOW_OKBUTTON:
case WINDOW_CANCELBUTTON:
case WINDOW_IMAGERADIOBUTTON:
case WINDOW_IMAGEBUTTON:
case WINDOW_MENUBUTTON:
case WINDOW_MOREBUTTON:
case WINDOW_TABPAGE:
case WINDOW_MODALDIALOG:
case WINDOW_FLOATINGWINDOW:
case WINDOW_MODELESSDIALOG:
case WINDOW_WORKWINDOW:
case WINDOW_DOCKINGWINDOW:
case WINDOW_CONTROL:
case WINDOW_FILEDIALOG:
case WINDOW_PATHDIALOG:
case WINDOW_PRINTDIALOG:
case WINDOW_PRINTERSETUPDIALOG:
case WINDOW_COLORDIALOG:
case WINDOW_TABDIALOG:
case WINDOW_BUTTONDIALOG:
case WINDOW_MENUBARWINDOW:
aName = pBase->GetText().EraseAllChars('~');
break;
case WINDOW_EDIT:
case WINDOW_MULTILINEEDIT:
case WINDOW_MULTILISTBOX:
case WINDOW_LISTBOX:
case WINDOW_COMBOBOX:
case WINDOW_SPINFIELD:
case WINDOW_PATTERNFIELD:
case WINDOW_NUMERICFIELD:
case WINDOW_METRICFIELD:
case WINDOW_CURRENCYFIELD:
case WINDOW_DATEFIELD:
case WINDOW_TIMEFIELD:
case WINDOW_NUMERICBOX:
case WINDOW_METRICBOX:
case WINDOW_CURRENCYBOX:
case WINDOW_DATEBOX:
case WINDOW_TIMEBOX:
case WINDOW_PATTERNBOX:
case WINDOW_TOOLBOX:
aName = pBase->GetQuickHelpText();
break;
case WINDOW_MESSBOX:
case WINDOW_INFOBOX:
case WINDOW_WARNINGBOX:
case WINDOW_ERRORBOX:
case WINDOW_QUERYBOX:
aName = ((MessBox*)pBase)->GetMessText();
break;
default:
if ( pBase->GetUniqueOrHelpId().isEmpty() && !( nConf & DH_MODE_ALLWIN ) )
bSkip = sal_True;
break;
}
if ( !bSkip )
{
if ( aName.Len() == 0 )
aName = pBase->GetQuickHelpText();
if ( aName.Len() == 0 )
aName = pBase->GetHelpText();
if ( aName.Len() == 0 )
aName = pBase->GetText();
String aTypeSuffix;
if ( pBase->GetType() == WINDOW_CONTROL )
{
if ( dynamic_cast< EditBrowseBox* >(pBase) )
aTypeSuffix.AppendAscii( "/BrowseBox", 10 );
else if ( dynamic_cast< ValueSet* >(pBase) )
aTypeSuffix.AppendAscii( "/ValueSet", 9 );
else if ( dynamic_cast< ORoadmap* >(pBase) )
aTypeSuffix.AppendAscii( "/RoadMap", 8 );
else if ( dynamic_cast< IExtensionListBox* >(pBase) )
aTypeSuffix.AppendAscii( "/ExtensionListBox" );
else if ( dynamic_cast< svt::table::TableControl* >(pBase) )
aTypeSuffix.AppendAscii( "/TableControl" );
else
aTypeSuffix.AppendAscii( "/Unknown", 8 );
}
rtl::OString aId = pBase->GetUniqueOrHelpId();
pRet->GenReturn ( RET_WinInfo, aId, (comm_ULONG)pBase->GetType(),
TypeString(pBase->GetType()).Append(aTypeSuffix).AppendAscii(": ").Append(aName), sal_False );
if ( pBase->GetType() == WINDOW_TOOLBOX ) // Buttons und Controls auf Toolboxen.
{
ToolBox *pTB = ((ToolBox*)pBase);
sal_uInt16 i;
for ( i = 0; i < pTB->GetItemCount() ; i++ )
{
aName = String();
// if ( aName.Len() == 0 )
// aName = pTB->GetQuickHelpText();
if ( aName.Len() == 0 )
aName = pTB->GetHelpText( pTB->GetItemId( i ) );
if ( aName.Len() == 0 )
aName = pTB->GetItemText( pTB->GetItemId( i ) );
Window *pItemWin;
pItemWin = pTB->GetItemWindow( pTB->GetItemId( i ) );
if ( pTB->GetItemType( i ) == TOOLBOXITEM_BUTTON && ( !pItemWin || !pItemWin->IsVisible() ) )
{
if ( pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, Str2Id(pTB->GetItemCommand(pTB->GetItemId( i ))), (comm_ULONG)WINDOW_BUTTON,
TypeString(WINDOW_BUTTON).AppendAscii(": ").Append(aName), sal_False );
if ( !pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, pTB->GetHelpId(pTB->GetItemId( i )), (comm_ULONG)WINDOW_BUTTON,
TypeString(WINDOW_BUTTON).AppendAscii(": ").Append(aName), sal_False );
}
else
{
if ( pItemWin )
{
if ( pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, Str2Id(pTB->GetItemCommand(pTB->GetItemId( i ))), (comm_ULONG)pItemWin->GetType(),
TypeString(pItemWin->GetType()).AppendAscii(": ").Append(aName), sal_False );
if ( !pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, pTB->GetHelpId(pTB->GetItemId( i )), (comm_ULONG)pItemWin->GetType(),
TypeString(pItemWin->GetType()).AppendAscii(": ").Append(aName), sal_False );
sal_uInt16 ii;
for( ii = 0 ; ii < pItemWin->GetChildCount(); ii++ )
WriteControlData( pItemWin->GetChild(ii), nConf, sal_False );
}
else
{
if ( nConf & DH_MODE_ALLWIN )
{
String aToolBoxItemType;
switch ( pTB->GetItemType( i ) )
{
case TOOLBOXITEM_DONTKNOW:
aToolBoxItemType.AssignAscii("TOOLBOXITEM_DONTKNOW");
break;
case TOOLBOXITEM_BUTTON:
aToolBoxItemType.AssignAscii("TOOLBOXITEM_BUTTON");
break;
case TOOLBOXITEM_SPACE:
aToolBoxItemType.AssignAscii("TOOLBOXITEM_SPACE");
break;
case TOOLBOXITEM_SEPARATOR:
aToolBoxItemType.AssignAscii("TOOLBOXITEM_SEPARATOR");
break;
case TOOLBOXITEM_BREAK:
aToolBoxItemType.AssignAscii("TOOLBOXITEM_BREAK");
break;
default:
DBG_ERROR1( "Unknown TOOLBOXITEM %i", pTB->GetItemType( i ) );
}
if ( pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, Str2Id( pTB->GetItemCommand(pTB->GetItemId( i )) ), (comm_ULONG)WINDOW_BASE,
aToolBoxItemType.AppendAscii(": ").Append(aName), sal_False );
if ( !pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, pTB->GetHelpId(pTB->GetItemId( i )), (comm_ULONG)WINDOW_BASE,
aToolBoxItemType.AppendAscii(": ").Append(aName), sal_False );
}
}
}
}
return; // ToolBox ist hier schon komplett abgehandelt.
}
if ( pBase->GetType() == WINDOW_BUTTONDIALOG // Buttons auf Buttondialogen mit ID
|| pBase->GetType() == WINDOW_MESSBOX
|| pBase->GetType() == WINDOW_INFOBOX
|| pBase->GetType() == WINDOW_WARNINGBOX
|| pBase->GetType() == WINDOW_ERRORBOX
|| pBase->GetType() == WINDOW_QUERYBOX )
{
ButtonDialog *pBD = ((ButtonDialog*)pBase);
sal_uInt16 i;
for ( i = 0; i < pBD->GetButtonCount() ; i++ )
{
aName = String();
if ( aName.Len() == 0 )
aName = pBD->GetPushButton( pBD->GetButtonId(i) )->GetText();
ByteString aID;
switch ( pBD->GetButtonId(i) )
{
case BUTTONID_OK:
aID.Assign("Ok");
break;
case BUTTONID_CANCEL:
aID.Assign("Cancel");
break;
case BUTTONID_YES:
aID.Assign("Yes");
break;
case BUTTONID_NO:
aID.Assign("No");
break;
case BUTTONID_RETRY:
aID.Assign("Retry");
break;
case BUTTONID_HELP:
aID.Assign("Help");
break;
default:
aID = ByteString::CreateFromInt32( pBD->GetButtonId(i) );
break;
}
pRet->GenReturn ( RET_WinInfo, aID, (comm_ULONG)pBD->GetPushButton( pBD->GetButtonId(i) )->GetType(), // So daß der Text angezeigt wird!
TypeString(pBD->GetPushButton( pBD->GetButtonId(i) )->GetType()).AppendAscii(": ").Append(aName)
.AppendAscii(" ButtonId = ").AppendAscii( aID.GetBuffer() ), sal_False );
}
return; // ButtonDialog ist hier schon komplett abgehandelt.
}
Menu* pMenu = GetMatchingMenu( pBase );
if ( pMenu ) // Menus
{
sal_uInt16 i;
for ( i = 0; i < pMenu->GetItemCount() ; i++ )
{
sal_uInt16 nID = pMenu->GetItemId( i );
aName = String();
if ( aName.Len() == 0 )
aName = pMenu->GetHelpText( nID );
if ( aName.Len() == 0 )
aName = pMenu->GetItemText( nID );
if ( pMenu->GetItemType( i ) == MENUITEM_STRING || pMenu->GetItemType( i ) == MENUITEM_IMAGE || pMenu->GetItemType( i ) == MENUITEM_STRINGIMAGE || (nConf & DH_MODE_ALLWIN) )
{
String aMenuItemType;
switch ( pMenu->GetItemType( i ) )
{
case MENUITEM_STRING:
aMenuItemType.AssignAscii("MENUITEM_STRING");
break;
case MENUITEM_STRINGIMAGE:
aMenuItemType.AssignAscii("MENUITEM_STRINGIMAGE");
break;
case MENUITEM_IMAGE:
aMenuItemType.AssignAscii("MENUITEM_IMAGE");
break;
case MENUITEM_SEPARATOR:
aMenuItemType.AssignAscii("MENUITEM_SEPARATOR");
break;
case MENUITEM_DONTKNOW:
aMenuItemType.AssignAscii("MENUITEM_DONTKNOW");
break;
default:
DBG_ERROR1( "Unknown MENUITEM %i", pMenu->GetItemType( i ) );
}
if ( pMenu->GetItemCommand(nID).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, Str2Id( pMenu->GetItemCommand(nID) ), (comm_ULONG)0,
aMenuItemType.AppendAscii(": ").Append(aName), sal_False );
if ( !pMenu->GetItemCommand(nID).Len() || ( nConf & DH_MODE_ALLWIN ) )
pRet->GenReturn ( RET_WinInfo, rtl::OString::valueOf( (sal_Int32)nID ), (comm_ULONG)0,
aMenuItemType.AppendAscii(": ").Append(aName), sal_False );
}
}
return; // Menu ist hier schon komplett abgehandelt.
}
}
}
for( sal_uInt16 i = 0 ; i < pBase->GetChildCount(); i++ )
WriteControlData( pBase->GetChild(i), nConf, sal_False );
}
class SysWinContainer : public WorkWindow
{
private:
ToolBox *pClientWin;
DockingWindow *pDock;
public:
SysWinContainer( ToolBox *pClient );
~SysWinContainer();
virtual void Resize();
virtual void Resizing( Size& rSize );
};
SysWinContainer::SysWinContainer( ToolBox *pClient )
: WorkWindow( NULL, WB_BORDER | WB_SIZEMOVE | WB_CLOSEABLE )
, pClientWin( pClient )
{
pDock = new DockingWindow( this );
pClientWin->SetParent( pDock );
pClientWin->SetFloatingMode( sal_False );
SetText( pClient->GetText() );
SetPosPixel( Point( 1,40 ) );
Resize();
pDock->Show();
EnableAlwaysOnTop();
Show();
}
SysWinContainer::~SysWinContainer()
{
delete pDock;
}
void SysWinContainer::Resize()
{
Size aSize( GetOutputSizePixel() );
Resizing( aSize );
// aSize = pClientWin->GetSizePixel();
// aSize = pClientWin->CalcWindowSizePixel();
if ( aSize != GetSizePixel() )
{
SetOutputSizePixel( aSize );
pDock->SetSizePixel( aSize );
pClientWin->SetSizePixel( aSize );
}
}
void SysWinContainer::Resizing( Size& rSize )
{
Size aSize;
Size aBestSize;
sal_uInt16 i;
sal_Bool bHasValue = sal_False;
sal_uLong nBestValue = 0;
sal_uLong nThisValue;
for ( i=1 ; i<=1 ; i++ )
{
aSize = pClientWin->CalcWindowSizePixel( i );
nThisValue = Abs( aSize.Width() - rSize.Width() ) + Abs( aSize.Height() - rSize.Height() );
if ( !bHasValue || ( nThisValue < nBestValue ) )
{
nBestValue = nThisValue;
aBestSize = aSize;
bHasValue = sal_True;
}
}
rSize = aBestSize;
}
class DisplayHidWin : public ToolBox
{
Edit *pEdit;
Size aMinEditSize;
sal_uInt16 nLastItemID;
sal_Bool bIsDraging;
sal_Bool bIsPermanentDraging;
void SetDraging( sal_Bool bNewDraging );
Image *pShow, *pShow2;
sal_Bool bConfigChanged;
void EnableButtons( sal_uLong nConf );
sal_uLong nEventHookID;
static long stub_VCLEventHookProc( NotifyEvent& rEvt, void* pData )
{
return ((DisplayHidWin*)pData)->VCLEventHook( rEvt );
}
long VCLEventHook( NotifyEvent& rEvt );
Window *pLastMouseMoveWin;
SysWinContainer *pContainer;
// aborting by pressing shist twice
sal_Bool bOldShift;
Time aLatest;
sal_uInt16 nShiftCount;
public:
DisplayHidWin();
~DisplayHidWin();
virtual void Tracking( const TrackingEvent& rTEvt );
virtual void Click();
virtual void Select();
virtual void SetText( const XubString& rStr );
void SetDisplayText( const String &aNewText ){ pEdit->SetText(aNewText); }
String GetDisplayText() const { return pEdit->GetText(); }
sal_Bool IsDisplayTextModified() const { return pEdit->IsModified(); }
void ClearDisplayTextModified() const { pEdit->ClearModifyFlag(); }
void SetConfig( sal_uLong nConf );
sal_uLong GetConfig();
sal_Bool IsConfigChanged() { return bConfigChanged; }
void ConfigSent() { bConfigChanged = sal_False; }
sal_Bool IsSendData() { return GetItemState( TT_SEND_DATA ) == STATE_CHECK; }
// sal_Bool IsAllWin() { return GetItemState( TT_ALLWIN ) == STATE_CHECK; }
sal_Bool IsDraging() { return bIsDraging; }
Window* LastMouseMoveWin() { return pLastMouseMoveWin; }
};
DisplayHidWin::DisplayHidWin()
: ToolBox( StatementList::GetFirstDocFrame(), TTProperties::GetSvtResId(DisplayHidToolBox) )
, bIsDraging( sal_False )
, bIsPermanentDraging( sal_False )
, pShow( NULL )
, pShow2( NULL )
, pLastMouseMoveWin( NULL )
, bOldShift( 0 )
, nShiftCount( 0 )
{
SetOutStyle( TOOLBOX_STYLE_HANDPOINTER | TOOLBOX_STYLE_FLAT );
pEdit = new Edit( this, WB_CENTER | WB_BORDER );
aMinEditSize = GetItemRect( TT_OUTPUT ).GetSize();
/**/ aMinEditSize=Size(20,20);
aMinEditSize.Width() *= 12;
pEdit->SetSizePixel( aMinEditSize );
pEdit->Show();
SetItemWindow( TT_OUTPUT, pEdit );
Resize();
pContainer = new SysWinContainer( this );
nEventHookID = Application::AddEventHook( stub_VCLEventHookProc, this );
}
DisplayHidWin::~DisplayHidWin()
{
Application::RemoveEventHook( nEventHookID );
Hide(); // so GetFirstDocFrame won't return ourselves (needed for SOPlayer)
SetParent( StatementList::GetFirstDocFrame() );
delete pContainer;
delete pEdit;
}
void DisplayHidWin::SetDraging( sal_Bool bNewDraging )
{
if ( !pShow )
pShow = new Image( GetItemImage( TT_SHOW ) );
if ( !pShow2 )
pShow2 = new Image( Bitmap( TTProperties::GetSvtResId( TT_SHOW2 ) ) );
if ( bNewDraging )
SetItemImage( TT_SHOW, *pShow2 );
else
SetItemImage( TT_SHOW, *pShow );
bIsDraging = bNewDraging;
}
void DisplayHidWin::EnableButtons( sal_uLong nConf )
{
sal_Bool bSend = sal_Bool(nConf & DH_MODE_SEND_DATA);
EnableItem( TT_ALLWIN, bSend );
EnableItem( TT_KURZNAME, bSend );
EnableItem( TT_LANGNAME, bSend );
}
void DisplayHidWin::Tracking( const TrackingEvent& rTEvt )
{
// if ( nLastItemID == TT_SHOW && GetItemState( TT_SHOW ) == STATE_NOCHECK && ( rTEvt.IsTrackingEnded() || rTEvt.IsTrackingCanceled() ) )
// SetDraging( sal_False );
if ( nLastItemID == TT_SHOW && GetItemState( TT_SHOW ) == STATE_NOCHECK )
EndTracking( ENDTRACK_CANCEL );
ToolBox::Tracking( rTEvt);
}
void DisplayHidWin::Click()
{
nLastItemID = GetCurItemId();
if ( nLastItemID == TT_SHOW )
{
SetDraging( sal_True );
}
ToolBox::Click();
}
void DisplayHidWin::Select()
{
if ( GetItemState( GetCurItemId() ) == STATE_NOCHECK )
{
SetItemState( GetCurItemId(), STATE_CHECK );
if ( GetCurItemId() == TT_SHOW )
{
bIsPermanentDraging = sal_True;
SetDraging( sal_True );
}
}
else
{
SetItemState( GetCurItemId(), STATE_NOCHECK );
if ( GetCurItemId() == TT_SHOW )
{
bIsPermanentDraging = sal_False;
SetDraging( sal_False );
}
}
if ( GetCurItemId() == TT_SEND_DATA )
{
EnableButtons( GetConfig() );
}
}
void DisplayHidWin::SetConfig( sal_uLong nConf )
{
SetItemState( TT_KURZNAME, ( nConf & DH_MODE_KURZNAME ) ? STATE_CHECK : STATE_NOCHECK );
SetItemState( TT_LANGNAME, ( nConf & DH_MODE_LANGNAME ) ? STATE_CHECK : STATE_NOCHECK );
SetItemState( TT_ALLWIN, ( nConf & DH_MODE_ALLWIN ) ? STATE_CHECK : STATE_NOCHECK );
SetItemState( TT_SEND_DATA, ( nConf & DH_MODE_SEND_DATA ) ? STATE_CHECK : STATE_NOCHECK );
EnableButtons( nConf );
}
sal_uLong DisplayHidWin::GetConfig()
{
sal_uLong nConf = 0;
if ( GetItemState( TT_KURZNAME ) == STATE_CHECK )
nConf |= DH_MODE_KURZNAME;
if ( GetItemState( TT_LANGNAME ) == STATE_CHECK )
nConf |= DH_MODE_LANGNAME;
if ( GetItemState( TT_ALLWIN ) == STATE_CHECK )
nConf |= DH_MODE_ALLWIN;
if ( IsSendData() )
nConf |= DH_MODE_SEND_DATA;
return nConf;
}
void DisplayHidWin::SetText( const XubString& rStr )
{
pContainer->SetText( rStr );
}
long DisplayHidWin::VCLEventHook( NotifyEvent& rEvt )
{
if ( EVENT_MOUSEMOVE == rEvt.GetType() )
{
pLastMouseMoveWin = rEvt.GetWindow();
// check if abort with pressing shift twice
MouseEvent* pMEvt = (MouseEvent*)rEvt.GetMouseEvent();
if ( ( pMEvt->IsShift() && !bOldShift ) ) // Shift pressed
{
if ( aLatest < Time() )
{
nShiftCount = 0;
aLatest = Time()+Time( 0, 0, 0, 50 );
}
nShiftCount++;
}
if ( ( !pMEvt->IsShift() && bOldShift ) ) // Shift released
{
nShiftCount++;
if ( nShiftCount == 4 && aLatest > Time() )
{
bIsPermanentDraging = sal_False;
SetDraging( sal_False );
SetItemState( TT_SHOW, STATE_NOCHECK );
}
}
bOldShift = pMEvt->IsShift();
}
if ( ( ( EVENT_MOUSEBUTTONUP == rEvt.GetType() && rEvt.GetMouseEvent()->GetButtons() == MOUSE_LEFT) || ( EVENT_MOUSEMOVE == rEvt.GetType() && !rEvt.GetMouseEvent()->GetButtons() ) )
&& IsDraging() && !bIsPermanentDraging )
SetDraging( sal_False );
return 0;
}
sal_Bool StatementCommand::DisplayHID()
{
// Return sal_True -> reexecute command
if ( !bBool2 ) // Wird auf sal_False initialisiert
{
bBool2 = sal_True; // Wir sind initialisiert.
GetTTSettings()->pDisplayInstance = this; // Und haben die Macht (Alle anderen beenden sich)
if ( !(nParams & PARAM_ULONG_1) )
{
if( GetTTSettings()->pDisplayHidWin ) // Nichts verändern
nLNr1 = GetTTSettings()->pDisplayHidWin->GetConfig();
else // Beim ersten Aufruf wollen wir alles richtig einstellen
nLNr1 = DH_MODE_KURZNAME | DH_MODE_LANGNAME;
if( ((nParams & PARAM_BOOL_1) && bBool1) )
nLNr1 |= DH_MODE_SEND_DATA;
else
nLNr1 &= ( ~DH_MODE_SEND_DATA );
}
if ( GetTTSettings()->pDisplayHidWin )
GetTTSettings()->pDisplayHidWin->SetConfig( nLNr1 );
}
if ( GetTTSettings()->pDisplayInstance && GetTTSettings()->pDisplayInstance != this )
{
DBG_WARNING("Mehrere DisplayHID am laufen");
return sal_False; // Noch eine andere Instanz macht das gleiche!
}
if ( !GetTTSettings()->pDisplayHidWin )
{
GetTTSettings()->pDisplayHidWin = new DisplayHidWin();
GetTTSettings()->aOriginalCaption = GetTTSettings()->pDisplayHidWin->GetText();
GetTTSettings()->pDisplayHidWin->Show();
if ( bBool1 )
nLNr1 |= DH_MODE_SEND_DATA;
GetTTSettings()->pDisplayHidWin->SetConfig( nLNr1 );
GetTTSettings()->Old = NULL;
GetTTSettings()->Act = NULL;
GetTTSettings()->pDisplayInstance = this;
}
else
{
GetTTSettings()->pDisplayHidWin->GetWindow( WINDOW_OVERLAP )->Enable( sal_True, sal_True );
GetTTSettings()->pDisplayHidWin->GetWindow( WINDOW_OVERLAP )->EnableInput( sal_True, sal_True );
}
if ( GetTTSettings()->pDisplayHidWin->IsVisible() && !bDying )
{
if ( GetTTSettings()->pDisplayHidWin->IsDraging() )
{
#define HIGHLIGHT_WIN( WinPtr ) \
{ \
Color aLineColMem = WinPtr->GetLineColor(); \
WinPtr->SetLineColor( Color( COL_WHITE ) ); \
Color aFillColMem = WinPtr->GetFillColor(); \
WinPtr->SetFillColor( Color( COL_LIGHTRED ) ); \
RasterOp aROp = WinPtr->GetRasterOp(); \
WinPtr->SetRasterOp( ROP_XOR ); \
Size aSz = WinPtr->PixelToLogic( WinPtr->GetSizePixel() );\
sal_uLong nMaxCornerRadius = WinPtr->PixelToLogic( Point( 80, 0 ) ).X();\
sal_uLong iCorner = std::max ((sal_uLong) 8, (sal_uLong) std::min( nMaxCornerRadius, (sal_uLong) std::min((sal_uLong) (aSz.Width() / 6), (sal_uLong)(aSz.Height() / 6))));\
WinPtr->DrawRect(Rectangle(Point(),aSz), iCorner, iCorner);\
WinPtr->SetLineColor( aLineColMem ); \
WinPtr->SetFillColor( aFillColMem ); \
WinPtr->SetRasterOp( aROp ); \
}
#define SET_WIN( WinPtr ) \
if ( StatementList::WinPtrValid(WinPtr) ) \
{ \
HIGHLIGHT_WIN ( WinPtr ); \
}
#define RESET_WIN( WinPtr ) \
if ( StatementList::WinPtrValid(WinPtr) ) \
{ \
WinPtr->Invalidate( INVALIDATE_NOTRANSPARENT ); \
WinPtr->Update(); \
}
GetTTSettings()->Old = GetTTSettings()->Act;
// GetTTSettings()->Act = GetMouseWin();
GetTTSettings()->Act = GetTTSettings()->pDisplayHidWin->LastMouseMoveWin();
if ( !StatementList::WinPtrValid ( GetTTSettings()->Old ) )
GetTTSettings()->Old = NULL;
if ( !StatementList::WinPtrValid ( GetTTSettings()->Act ) )
GetTTSettings()->Act = NULL;
if ( GetTTSettings()->Act && GetTTSettings()->Act->GetType() == WINDOW_BORDERWINDOW )
GetTTSettings()->Act = GetTTSettings()->Act->GetWindow( WINDOW_CLIENT );
if ( GetTTSettings()->Act != GetTTSettings()->Old )
{
if ( GetTTSettings()->Old )
{
RESET_WIN(GetTTSettings()->Old);
}
if ( GetTTSettings()->Act )
{
SET_WIN(GetTTSettings()->Act);
GetTTSettings()->pDisplayHidWin->SetDisplayText( Id2Str(GetTTSettings()->Act->GetUniqueOrHelpId()).AppendAscii(" WinType: ")
.Append(UniString::CreateFromInt64(GetTTSettings()->Act->GetType())).AppendAscii(" ").Append(GetTTSettings()->Act->GetText()));
if ( GetTTSettings()->Act && !GetTTSettings()->Act->GetUniqueId().equals( GetTTSettings()->Act->GetHelpId() ) )
GetTTSettings()->pDisplayHidWin->SetText(UniString( TTProperties::GetSvtResId( TT_ALTERNATE_CAPTION ) ).AppendAscii(GetTTSettings()->Act->GetHelpId().getStr()));
else
GetTTSettings()->pDisplayHidWin->SetText( GetTTSettings()->aOriginalCaption );
}
else
GetTTSettings()->pDisplayHidWin->SetDisplayText(CUniString("Kein Window/Control gefunden"));
}
else if ( GetTTSettings()->Act )
{
// SET_WIN(GetTTSettings()->Act);
// allow setting a HelpID manually (just enter the ID in the displayHID Window and terminate it by |
if ( GetTTSettings()->pDisplayHidWin->IsDisplayTextModified() && GetTTSettings()->pDisplayHidWin->GetDisplayText().GetTokenCount( '|' ) > 1 )
{
GetTTSettings()->Act->SetUniqueId( Str2Id( GetTTSettings()->pDisplayHidWin->GetDisplayText().GetToken( '|' ) ) );
GetTTSettings()->pDisplayHidWin->ClearDisplayTextModified();
}
}
/* if ( Application::GetLastInputInterval() > 5000 ) // 5 Sekunden lang nix geschehen
{
GetTTSettings()->pDisplayHidWin->ToTop( TOTOP_NOGRABFOCUS );
}
*/
if ( GetTTSettings()->pDisplayHidWin->IsSendData() /*&& bBool2*/ && GetTTSettings()->Act )
{
if ( !StatementFlow::bSending )
{ // Normalerweise syncronisierung über Protokoll. Hier ist das aber asyncron!!!
WriteControlData( GetTTSettings()->Act, GetTTSettings()->pDisplayHidWin->GetConfig() );
new StatementFlow( this, F_EndCommandBlock ); // Kommando zum Senden erzeugen und in que eintragen
}
}
} //if ( GetTTSettings()->pDisplayHidWin->IsDraging() )
else
{
if ( GetTTSettings()->Act )
{
RESET_WIN(GetTTSettings()->Act);
GetTTSettings()->Act = NULL;
}
}
if ( pFirst == this ) // Sollte immer so sein, aber besser isses
if ( pNext ) // Befehle warten auf Ausführung
{ // An Ende neu einsortieren
Advance();
QueStatement( NULL );
}
// { // Ersten und 2. austauschen.
// pFirst = pNext;
// pNext = pNext->pNext;
// pFirst->pNext = this;
// }
}
else
{
delete GetTTSettings()->pDisplayHidWin;
GetTTSettings()->pDisplayHidWin = NULL;
GetTTSettings()->pDisplayInstance = NULL;
}
return GetTTSettings()->pDisplayHidWin != NULL;
}
class TranslateWin : public WorkWindow
{
private:
DECL_LINK( DoAccept, PushButton* );
DECL_LINK( DoNext, PushButton* );
DECL_LINK( DoSelect, PushButton* );
DECL_LINK( DoRestore, PushButton* );
DECL_LINK( TranslationChanged, Edit* );
DECL_LINK( ShowInplace, Timer* );
Timer InplaceTimer;
// virtual void MouseButtonUp( const MouseEvent& rMEvt );
// virtual void MouseMove( const MouseEvent& rMEvt );
PushButton PushButtonTT_PB_NEXT;
GroupBox GroupBoxTT_GB_TRANSLATION;
Edit EditTT_E_NEW;
GroupBox GroupBoxTT_GB_COMMENT;
Edit EditTT_E_COMMENT;
PushButton PushButtonTT_PB_ACCEPT;
FixedText FixedTextTT_FT_OLD;
PushButton PushButtonTT_PB_SELECT;
PushButton PushButtonTT_PB_RESTORE;
Window *Old;
Window *Act;
Window *pTranslateWin;
sal_Bool bSelecting;
sal_Bool bAvailable;
sal_Bool bNext;
sal_Bool TestChangedDataSaved();
sal_uLong nEventHookID;
static long stub_VCLEventHookProc( NotifyEvent& rEvt, void* pData )
{
return ((TranslateWin*)pData)->VCLEventHook( rEvt );
}
long VCLEventHook( NotifyEvent& rEvt );
public:
TranslateWin();
~TranslateWin();
static String MarkShortcutErrors( Window* pBase, sal_Bool bMark );
sal_Bool IsTranslationAvailable(){ return bAvailable; }
sal_Bool IsNextDialog(){ return bNext; }
void ResetNextDialog(){ bNext = sal_False; }
Window* GetTranslationWindow(){ return pTranslateWin; }
String GetOriginalText(){ return FixedTextTT_FT_OLD.GetText(); }
String GetTranslationText(){ return EditTT_E_NEW.GetText(); }
String GetComment(){ return EditTT_E_COMMENT.GetText(); }
void EnableTranslation();
};
TranslateWin::TranslateWin()
: WorkWindow( NULL, TTProperties::GetSvtResId( TT_INLINE_TRANSLATION ) )
, PushButtonTT_PB_NEXT( this, TTProperties::GetSvtResId( TT_PB_NEXT ) )
, GroupBoxTT_GB_TRANSLATION( this, TTProperties::GetSvtResId( TT_GB_TRANSLATION ) )
, EditTT_E_NEW( this, TTProperties::GetSvtResId( TT_E_NEW ) )
, GroupBoxTT_GB_COMMENT( this, TTProperties::GetSvtResId( TT_GB_COMMENT ) )
, EditTT_E_COMMENT( this, TTProperties::GetSvtResId( TT_E_COMMENT ) )
, PushButtonTT_PB_ACCEPT( this, TTProperties::GetSvtResId( TT_PB_ACCEPT ) )
, FixedTextTT_FT_OLD( this, TTProperties::GetSvtResId( TT_FT_OLD ) )
, PushButtonTT_PB_SELECT( this, TTProperties::GetSvtResId( TT_PB_SELECT ) )
, PushButtonTT_PB_RESTORE( this, TTProperties::GetSvtResId( TT_PB_RESTORE ) )
, Old( NULL )
, Act( NULL )
, pTranslateWin( NULL )
, bSelecting( sal_False )
, bAvailable( sal_False )
, bNext( sal_False )
{
FreeResource();
PushButtonTT_PB_NEXT.SetClickHdl( LINK( this, TranslateWin, DoNext ) );
PushButtonTT_PB_ACCEPT.SetClickHdl( LINK( this, TranslateWin, DoAccept ) );
PushButtonTT_PB_SELECT.SetClickHdl( LINK( this, TranslateWin, DoSelect ) );
PushButtonTT_PB_RESTORE.SetClickHdl( LINK( this, TranslateWin, DoRestore ) );
EditTT_E_NEW.SetModifyHdl( LINK( this, TranslateWin, TranslationChanged ) );
InplaceTimer.SetTimeout( 250 );
InplaceTimer.SetTimeoutHdl( LINK( this, TranslateWin, ShowInplace ) );
EnableAlwaysOnTop();
nEventHookID = Application::AddEventHook( stub_VCLEventHookProc, this );
}
TranslateWin::~TranslateWin()
{
Application::RemoveEventHook( nEventHookID );
}
sal_Bool TranslateWin::TestChangedDataSaved()
{
if ( ( EditTT_E_NEW.GetText().CompareTo( FixedTextTT_FT_OLD.GetText() ) != COMPARE_EQUAL
|| EditTT_E_COMMENT.GetText().Len() )
&& PushButtonTT_PB_ACCEPT.IsEnabled() )
{
return MessBox( this, TTProperties::GetSvtResId( TT_DISCARD_CHANGED_DATA ) ).Execute() == RET_YES;
}
else
return sal_True;
}
IMPL_LINK( TranslateWin, DoAccept, PushButton*, EMPTYARG )
{
PushButtonTT_PB_SELECT.Disable();
PushButtonTT_PB_NEXT.Disable();
PushButtonTT_PB_RESTORE.Disable();
EditTT_E_NEW.Disable();
EditTT_E_COMMENT.Disable();
PushButtonTT_PB_ACCEPT.Disable();
bAvailable = sal_True;
return 0;
}
IMPL_LINK( TranslateWin, DoNext, PushButton*, EMPTYARG )
{
if ( TestChangedDataSaved() )
{
PushButtonTT_PB_SELECT.Disable();
PushButtonTT_PB_NEXT.Disable();
PushButtonTT_PB_RESTORE.Disable();
EditTT_E_NEW.Disable();
EditTT_E_COMMENT.Disable();
PushButtonTT_PB_ACCEPT.Disable();
bNext = sal_True;
}
return 0;
}
IMPL_LINK( TranslateWin, DoSelect, PushButton*, EMPTYARG )
{
if ( bSelecting )
{
// ReleaseMouse();
bSelecting = sal_False;
}
else
{
if ( TestChangedDataSaved() )
{
PushButtonTT_PB_RESTORE.Disable();
// CaptureMouse();
bSelecting = sal_True;
}
}
return 0;
}
IMPL_LINK( TranslateWin, DoRestore, PushButton*, EMPTYARG )
{
String sTT_E_OLD( FixedTextTT_FT_OLD.GetText());
sTT_E_OLD.SearchAndReplaceAll( CUniString("\\n"), CUniString("\n") );
sTT_E_OLD.SearchAndReplaceAll( CUniString("\\t"), CUniString("\t") );
String sTT_E_NEW( EditTT_E_NEW.GetText());
sTT_E_NEW.SearchAndReplaceAll( CUniString("\\n"), CUniString("\n") );
sTT_E_NEW.SearchAndReplaceAll( CUniString("\\t"), CUniString("\t") );
if ( StatementList::WinPtrValid( pTranslateWin ) && pTranslateWin->GetText().CompareTo( sTT_E_NEW ) == COMPARE_EQUAL )
{ // Im ersten schritt nur in der UI zurück
pTranslateWin->SetText( sTT_E_OLD );
}
else
{ // Im zweite Schritt auch den eingegebenen Text
EditTT_E_NEW.SetText( FixedTextTT_FT_OLD.GetText() );
PushButtonTT_PB_RESTORE.Disable();
}
if ( StatementList::WinPtrValid( pTranslateWin ) )
MarkShortcutErrors( pTranslateWin->GetWindow( WINDOW_OVERLAP ), sal_True );
return 0;
}
IMPL_LINK( TranslateWin, TranslationChanged, Edit*, pEdit )
{
(void) pEdit; /* avoid warning about unused parameter */
PushButtonTT_PB_RESTORE.Enable();
InplaceTimer.Start();
return 0;
}
IMPL_LINK( TranslateWin, ShowInplace, Timer*, EMPTYARG )
{
PushButtonTT_PB_RESTORE.Enable();
if ( StatementList::WinPtrValid( pTranslateWin ) )
{
String sTT_E_NEW( EditTT_E_NEW.GetText());
// alle CRs UnQuoten
sTT_E_NEW.SearchAndReplaceAll( CUniString("\\n"), CUniString("\n") );
// alle TABSs UnQuoten
sTT_E_NEW.SearchAndReplaceAll( CUniString("\\t"), CUniString("\t") );
pTranslateWin->SetText( sTT_E_NEW );
MarkShortcutErrors( pTranslateWin->GetWindow( WINDOW_OVERLAP ), sal_True );
}
return 0;
}
long TranslateWin::VCLEventHook( NotifyEvent& rEvt )
{
if ( EVENT_MOUSEMOVE == rEvt.GetType() )
{
if ( bSelecting )
{
const MouseEvent *pMEvt = rEvt.GetMouseEvent();
Old = Act;
Act = rEvt.GetWindow();
if ( Act )
{
Window *pWin = Act;
sal_uInt16 i;
for ( i = 0 ; i < Act->GetChildCount() ; i++ )
{
pWin = Act->GetChild(i);
Rectangle aWinPosSize( pWin->GetPosPixel(), pWin->GetSizePixel() );
if ( ( pWin->IsMouseTransparent() || !pWin->IsEnabled() ) && aWinPosSize.IsInside( pMEvt->GetPosPixel() ) )
{
Act = pWin;
break;
}
}
}
if ( !StatementList::WinPtrValid ( Old ) )
Old = NULL;
if ( Act != Old )
{
if ( Old )
{
Window *pWin;
if ( Old->IsMouseTransparent() && Old->GET_REAL_PARENT() )
pWin = Old->GET_REAL_PARENT();
else
pWin = Old;
RESET_WIN(pWin);
}
if ( Act )
{
SET_WIN(Act);
FixedTextTT_FT_OLD.SetText( Act->GetText() );
}
else
FixedTextTT_FT_OLD.SetText( String() );
}
else if ( Act )
{
// SET_WIN(Act);
}
/* if ( Application::GetLastInputInterval() > 5000 ) // 5 Sekunden lang nix geschehen
{
ToTop();
}
*/
} //if ( bSelecting )
else
{
if ( Act )
{
if ( Act->IsMouseTransparent() && Act->GET_REAL_PARENT() )
Act = Act->GET_REAL_PARENT();
RESET_WIN(Act);
Act = NULL;
}
}
}
else if ( EVENT_MOUSEBUTTONUP == rEvt.GetType() )
{
if ( bSelecting )
{
pTranslateWin = Act;
if ( pTranslateWin )
{
MarkShortcutErrors( pTranslateWin->GetWindow( WINDOW_OVERLAP ), sal_True );
// alle CRs quoten (NF)
String sTT_E_NEW( pTranslateWin->GetText());
sTT_E_NEW.SearchAndReplaceAll( CUniString("\n"), CUniString("\\n") );
// alle TABSs quoten ()
sTT_E_NEW.SearchAndReplaceAll( CUniString("\t"), CUniString("\\t") );
FixedTextTT_FT_OLD.SetText( sTT_E_NEW );
EditTT_E_NEW.SetText( sTT_E_NEW );
EditTT_E_NEW.Enable();
EditTT_E_NEW.GrabFocus();
EditTT_E_COMMENT.SetText( String() );
EditTT_E_COMMENT.Enable();
PushButtonTT_PB_ACCEPT.Enable();
}
// ReleaseMouse();
bSelecting = sal_False;
}
}
return 0;
}
#define FDS_ACTION_COLLECT 1
#define FDS_ACTION_MARK 2
#define FDS_ACTION_UNMARK 3
class FindShortcutErrors: public Search
{
String aShortcuts,aDoubleShortcuts;
sal_uInt16 nAction;
public:
FindShortcutErrors();
virtual sal_Bool IsWinOK( Window *pWin );
void SetAction( sal_uInt16 nA );
String GetDoubleShortcuts() { return aDoubleShortcuts; }
};
FindShortcutErrors::FindShortcutErrors()
: Search( SEARCH_NOOVERLAP | SEARCH_NO_TOPLEVEL_WIN )
{
SetAction( FDS_ACTION_COLLECT ); // Wir fange immer mit sammeln an, ODER??
}
void FindShortcutErrors::SetAction( sal_uInt16 nA )
{
nAction = nA;
if ( FDS_ACTION_COLLECT == nAction )
{
aShortcuts = UniString();
aDoubleShortcuts = UniString();
}
}
sal_Bool FindShortcutErrors::IsWinOK( Window *pWin )
{
if ( pWin->IsReallyVisible() )
{
String aText = pWin->GetText();
xub_StrLen nPos = aText.Search('~');
String aShortcut;
sal_Bool bHasAccel = sal_False;
if ( nPos != STRING_NOTFOUND )
{
aShortcut = aText.Copy( nPos+1, 1 );
aShortcut.ToLowerAscii();
bHasAccel = aShortcut.Len() == 1;
}
switch ( nAction )
{
case FDS_ACTION_COLLECT:
{
if ( aShortcuts.Search( aShortcut ) != STRING_NOTFOUND )
aDoubleShortcuts += aShortcut;
else
aShortcuts += aShortcut;
}
break;
case FDS_ACTION_MARK:
{
sal_Bool bMissing = sal_False;
if ( !bHasAccel && aText.Len() ) // should there be an accelarator defined
{
Window* pChild;
pChild = pWin->GetWindow( WINDOW_CLIENT );
if ( (pChild->GetType() == WINDOW_RADIOBUTTON) ||
(pChild->GetType() == WINDOW_IMAGERADIOBUTTON) ||
(pChild->GetType() == WINDOW_CHECKBOX) ||
(pChild->GetType() == WINDOW_TRISTATEBOX) ||
(pChild->GetType() == WINDOW_PUSHBUTTON) )
{
if ( !pChild->GetText().EqualsAscii( "..." ) )
bMissing = sal_True;
}
if ( pChild->GetType() == WINDOW_FIXEDTEXT )
{
Window* pTempChild = pWin->GetWindow( WINDOW_NEXT );
if ( pTempChild )
pTempChild = pTempChild->GetWindow( WINDOW_CLIENT );
if ( pTempChild && pChild->GetText().Len() )
{
if ( (pTempChild->GetType() == WINDOW_EDIT) ||
(pTempChild->GetType() == WINDOW_MULTILINEEDIT) ||
(pTempChild->GetType() == WINDOW_SPINFIELD) ||
(pTempChild->GetType() == WINDOW_PATTERNFIELD) ||
(pTempChild->GetType() == WINDOW_NUMERICFIELD) ||
(pTempChild->GetType() == WINDOW_METRICFIELD) ||
(pTempChild->GetType() == WINDOW_CURRENCYFIELD) ||
(pTempChild->GetType() == WINDOW_DATEFIELD) ||
(pTempChild->GetType() == WINDOW_TIMEFIELD) ||
(pTempChild->GetType() == WINDOW_LISTBOX) ||
(pTempChild->GetType() == WINDOW_MULTILISTBOX) ||
(pTempChild->GetType() == WINDOW_COMBOBOX) ||
(pTempChild->GetType() == WINDOW_PATTERNBOX) ||
(pTempChild->GetType() == WINDOW_NUMERICBOX) ||
(pTempChild->GetType() == WINDOW_METRICBOX) ||
(pTempChild->GetType() == WINDOW_CURRENCYBOX) ||
(pTempChild->GetType() == WINDOW_DATEBOX) ||
(pTempChild->GetType() == WINDOW_TIMEBOX) )
{
bMissing = sal_True;
}
}
}
}
if ( bHasAccel && aDoubleShortcuts.Search( aShortcut ) != STRING_NOTFOUND )
{
if ( pWin->GetType() == WINDOW_GROUPBOX )
pWin->SetControlForeground( Color( COL_LIGHTRED ) );
else
{
pWin->SetControlBackground();
Color aCol(COL_GRAY);
aCol.SetRed( 0xff );
pWin->SetControlBackground( aCol );
}
}
else if ( bMissing )
{
pWin->SetControlBackground();
Color aCol(COL_GRAY);
aCol.SetRed( 0xff );
aCol.SetGreen( 0xff );
pWin->SetControlBackground( aCol );
}
else
{
pWin->SetControlForeground();
pWin->SetControlBackground();
}
}
break;
case FDS_ACTION_UNMARK:
{
pWin->SetControlForeground();
pWin->SetControlBackground();
}
break;
}
}
else
if ( FDS_ACTION_MARK == nAction || FDS_ACTION_UNMARK == nAction )
{
pWin->SetControlForeground();
pWin->SetControlBackground();
}
return sal_False;
}
String TranslateWin::MarkShortcutErrors( Window* pBase, sal_Bool bMark )
{
if ( pBase )
{
FindShortcutErrors aFinder;
if ( bMark )
{
StatementList::SearchAllWin( pBase, aFinder, sal_True ); // collect Shortcuts first
aFinder.SetAction( FDS_ACTION_MARK );
}
else
aFinder.SetAction( FDS_ACTION_UNMARK );
StatementList::SearchAllWin( pBase, aFinder, sal_True );
return aFinder.GetDoubleShortcuts();
}
return UniString();
}
void TranslateWin::EnableTranslation()
{
PushButtonTT_PB_SELECT.Enable();
PushButtonTT_PB_NEXT.Enable();
bAvailable = sal_False;
bNext = sal_False;
}
void StatementCommand::Translate()
{
// Es wurde eine initale UniqueId mitgegeben. Dann nur die dopelten Shortcuts liefern
if( (nParams & PARAM_STR_1) && nLNr1 )
{
String aDouble;
Window *pWin = SearchTree( Str2Id( aString1 ) ,sal_False );
if ( pWin )
{
pWin = pWin->GetWindow( WINDOW_OVERLAP );
aDouble = TranslateWin::MarkShortcutErrors( pWin, sal_True );
}
pRet->GenReturn ( RET_Value, nMethodId, aDouble );
return;
}
if ( !GetTTSettings()->pTranslateWin )
{
GetTTSettings()->pTranslateWin = new TranslateWin;
GetTTSettings()->bToTop = sal_True;
}
GetTTSettings()->pTranslateWin->Show();
if ( GetTTSettings()->bToTop )
{
GetTTSettings()->pTranslateWin->ToTop();
GetTTSettings()->bToTop = sal_False;
}
// GetTTSettings()->pTranslateWin->GetWindow( WINDOW_OVERLAP )->Enable( sal_True, sal_True );
GetTTSettings()->pTranslateWin->GetWindow( WINDOW_OVERLAP )->EnableInput( sal_True, sal_True );
if ( GetTTSettings()->pTranslateWin->IsTranslationAvailable() )
{
String aTranslation;
Window* pTranslationWindow = GetTTSettings()->pTranslateWin->GetTranslationWindow();
DBG_ASSERT( pTranslationWindow, "Kein Translation Window" );
if ( WinPtrValid( pTranslationWindow ) )
{
if ( pTranslationWindow->GetType() == WINDOW_BORDERWINDOW && pTranslationWindow->GetWindow( WINDOW_CLIENT ) )
{
Window* pNew = pTranslationWindow->GetWindow( WINDOW_CLIENT );
// Bei Dockingwindoes das kanze Geraffel von Docking Floating überspringen
while ( IsDialog( pNew ) && pNew->GetUniqueOrHelpId().isEmpty() && pNew->GetChildCount() == 1 )
pNew = pNew->GetChild( 0 );
pTranslationWindow = pNew;
}
aTranslation = CUniString("0;");
aTranslation += Id2Str( pTranslationWindow->GetUniqueOrHelpId() );
aTranslation += ';';
aTranslation += TypeString( pTranslationWindow->GetType() );
aTranslation += ';';
Window* pParentDialog = pTranslationWindow;
while ( pParentDialog && !IsDialog( pParentDialog ) )
{
pParentDialog = pParentDialog->GET_REAL_PARENT();
}
if ( pParentDialog )
{
aTranslation += Id2Str(pParentDialog->GetUniqueOrHelpId());
aTranslation += ';';
aTranslation += TypeString( pParentDialog->GetType() );
}
else
aTranslation.AppendAscii( "0;" ); // Zahl + leerer String
aTranslation += ';';
aTranslation += '\"';
aTranslation += GetTTSettings()->pTranslateWin->GetOriginalText();
aTranslation += '\"';
aTranslation += ';';
aTranslation += '\"';
aTranslation += GetTTSettings()->pTranslateWin->GetTranslationText();
aTranslation += '\"';
aTranslation += ';';
aTranslation += '\"';
aTranslation += GetTTSettings()->pTranslateWin->GetComment();
aTranslation += '\"';
// alle CRs quoten (NF)
aTranslation.SearchAndReplaceAll( CUniString("\n"), CUniString("\\n") );
// alle TABSs quoten ()
aTranslation.SearchAndReplaceAll( CUniString("\t"), CUniString("\\t") );
pRet->GenReturn ( RET_Value, nMethodId, aTranslation );
GetTTSettings()->pTranslateWin->EnableTranslation();
GetTTSettings()->bToTop = sal_True;
}
else
{
pRet->GenReturn ( RET_Value, nMethodId, String() );
GetTTSettings()->pTranslateWin->EnableTranslation();
ErrorBox err( GetTTSettings()->pTranslateWin, TTProperties::GetSvtResId( TT_NO_CONTROL ));
err.Execute();
GetTTSettings()->bToTop = sal_True;
}
}
else if ( GetTTSettings()->pTranslateWin->IsNextDialog() )
{
pRet->GenReturn ( RET_Value, nMethodId, CUniString("1") );
GetTTSettings()->pTranslateWin->ResetNextDialog();
GetTTSettings()->pTranslateWin->LoseFocus();
GetTTSettings()->bToTop = sal_True;
}
else
{
GetTTSettings()->pTranslateWin->EnableTranslation();
pRet->GenReturn ( RET_Value, nMethodId, String() );
}
}
Window* StatementCommand::GetNextOverlap( Window* pBase )
{ // Findet irgendwelche Overlap-Fenster, die schließbar aussehen
// Eventuell muß noch die Auswahl verfeinert werden.
if ( pBase->GetType() != WINDOW_BORDERWINDOW )
pBase = pBase->GetWindow( WINDOW_OVERLAP );
Window *pControl = NULL;
if ( pBase->GetWindow( WINDOW_FIRSTOVERLAP ) )
{
pControl = GetNextOverlap( pBase->GetWindow( WINDOW_FIRSTOVERLAP ) );
}
if ( !pControl && pBase->GetWindow( WINDOW_NEXT ) )
{
pControl = GetNextOverlap( pBase->GetWindow( WINDOW_NEXT ) );
}
if ( !pControl )
{
Window *pTest = pBase->GetWindow( WINDOW_CLIENT );
if ( IsAccessable (pTest)
&& pTest->IsEnabled()
&& pTest->IsVisible()
&& ((pTest->GetStyle() & WB_CLOSEABLE ) || (pBase->GetStyle() & WB_CLOSEABLE )) )
return pTest;
else
return NULL;
}
else
return pControl;
}
Window* StatementCommand::GetNextRecoverWin()
{
// über die TopLevelWindows der App iterieren
Window* pBase = Application::GetFirstTopLevelWindow();
Window *pControl = NULL;
Window* pMyFirstDocFrame = NULL;
while ( pBase )
{
// zuerst weitere Fenster auf dem Fenster suchen und schliessen
pControl = GetNextOverlap( pBase );
if ( pControl && pControl->GetType() == WINDOW_HELPTEXTWINDOW )
{} // skip it
else
{
if ( pControl && pControl->IsVisible() && !IsFirstDocFrame( pControl ) && !IsIMEWin( pControl ) )
{
Window* pTB = pControl->GetChild( 0 );
if ( pControl->GetChildCount() == 1 && pTB->GetType() == WINDOW_TOOLBOX )
// return pTB;
; // do not act on floating toolboxes #i38796
else
return pControl;
}
// dann das Fenster selbst Schliessen
// erstes DocWin überspringen
// Assumption that Doc Windows are Borderwindows and ButtonDialog and such are not
if ( pBase->IsVisible() && !IsFirstDocFrame( pBase ) && pBase->GetType() != WINDOW_BORDERWINDOW && !IsIMEWin( pBase ) )
return pBase;
if ( !pMyFirstDocFrame && IsFirstDocFrame( pBase ) )
pMyFirstDocFrame = pBase;
}
pBase = Application::GetNextTopLevelWindow( pBase );
}
#ifdef RESET_APPLICATION_TO_BACKING_WINDOW
// close the FirstDocFrame last, It will not be closed, but the Document inside will be closed.
if ( IsDocWin( pMyFirstDocFrame ) )
return pMyFirstDocFrame;
#endif // def RESET_APPLICATION_TO_BACKING_WINDOW
return NULL;
}
sal_Bool StatementCommand::Execute()
{
if ( IsError )
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Skipping Command: " );
m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
m_pDbgWin->AddText( "\n" );
#endif
Advance();
delete this;
return sal_True;
}
InitProfile();
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Executing Command: " );
m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
m_pDbgWin->AddText( "\n" );
#endif
#if OSL_DEBUG_LEVEL > 1
#define REPORT_WIN_CLOSED(pControl, aInfo) \
_REPORT_WIN_CLOSED(pControl, aInfo) \
m_pDbgWin->AddText( aInfo.AppendAscii(" \"").Append( pControl->GetText() ).AppendAscii("\" geschlossen, RType = ").Append( TypeString(pControl->GetType()) ).AppendAscii(", UId = ").Append( UIdString( pControl->GetUniqueOrHelpId() ) ) );
#else
#define REPORT_WIN_CLOSED(pControl, aInfo) _REPORT_WIN_CLOSED(pControl, aInfo)
#endif
#define REPORT_WIN_CLOSEDc(pControl, aInfo ) \
REPORT_WIN_CLOSED(pControl, CUniString(aInfo) )
#define _REPORT_WIN_CLOSED(pControl, aInfo) \
if ( aString1.Len() ) \
aString1 += '\n'; \
aString1 += aInfo; \
aString1.AppendAscii(" \""); \
aString1 += pControl->GetText(); \
aString1.AppendAscii("\" geschlossen, RType = ");\
aString1 += TypeString(pControl->GetType()); \
aString1.AppendAscii(", UId = "); \
aString1 += UIdString(pControl->GetUniqueOrHelpId());
switch ( nMethodId )
{
case RC_AppDelay:
if ( !bBool1 )
{
nLNr1 = Time().GetTime() + nNr1/10;
bBool1 = sal_True;
}
if ( Time().GetTime() < long(nLNr1) ) // Aktuelle Zeit kleiner Endzeit
return sal_False;
break;
case RC_DisplayHid:
if ( DisplayHID() )
return sal_False;
break;
case RC_ResetApplication:
{
if ( !bBool1 )
{
nRetryCount = 150; // das sollte reichen.
bBool1 = sal_True; // Nur beim ersten mal!
nNr1 = 1; // Welcher Button ist dran?
nLNr1 = 0; // Speichern des AppWin
aString1 = UniString(); // Liste der geschlossenen Fenster
// So daß nacher auch wieder alles auf Default steht
nUseBindings = 0;
bCatchGPF = sal_True;
bUsePostEvents = sal_True;
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
}
if ( !nRetryCount )
ReportError( GEN_RES_STR0( S_RESETAPPLICATION_FAILED_COMPLEX ) );
Window *pControl = GetNextRecoverWin();
if ( pControl )
{
bBool2 = sal_False; // flag for wait when all windows are closed
pControl->GrabFocus();
if ( pControl->GetType() != WINDOW_DOCKINGWINDOW
&& pControl->GetType() != WINDOW_FLOATINGWINDOW
&& pControl->GetType() != WINDOW_MODELESSDIALOG
&& pControl->GetType() != WINDOW_WORKWINDOW
&& pControl->GetType() != WINDOW_TOOLBOX
&& pControl->GetType() != WINDOW_BORDERWINDOW
&& nRetryCount-- )
{
short nRT = ImpGetRType( pControl );
if ( nRT == C_TabControl && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
{ // Bei Tabcontrol den zugehörigen Tabdialog nehmen
pControl = pControl->GET_REAL_PARENT();
nRT = ImpGetRType( pControl );
}
switch( nRT )
{
case C_ModalDlg:
case C_Dialog:
case C_TabDlg:
REPORT_WIN_CLOSEDc(pControl, "Dialog");
SET_WINP_CLOSING(pControl);
((SystemWindow*)pControl)->Close();
break;
case C_WorkWin:
break;
case C_MessBox:
case C_InfoBox:
case C_WarningBox:
case C_ErrorBox:
case C_QueryBox:
case C_ButtonDialog:
{
ButtonDialog* pBD = (ButtonDialog*)pControl;
// nNr1 >= 10 bedeutet (Custom)-Buttons durchgehen
if ( nNr1 >= 10+pBD->GetButtonCount() ) nNr1 = 1;
switch( nNr1 )
{
case 5:
if ( pBD->GetPushButton( BUTTONID_OK ) )
{
REPORT_WIN_CLOSEDc(pControl, "Message Box (OK)");
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_OK);
}
nNr1 = 10; // Nochmal alle Buttons der Reihe nach
break;
case 4:
if ( pBD->GetPushButton( BUTTONID_CANCEL ) )
{
REPORT_WIN_CLOSEDc(pControl, "Message Box (Cancel)");
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_CANCEL);
}
nNr1++;
break;
case 3:
if ( pBD->GetPushButton( BUTTONID_YES ) )
{
REPORT_WIN_CLOSEDc(pControl, "Message Box (Yes)");
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_YES);
}
nNr1++;
break;
case 2: // BUG 48239
case 1:
if ( pBD->GetPushButton( BUTTONID_NO ) )
{
REPORT_WIN_CLOSEDc(pControl, "Message Box (No)");
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_NO);
}
nNr1++;
break;
default:
{
sal_uInt16 nID = pBD->GetButtonId( nNr1-10 );
if ( nID != BUTTONID_HELP )
{
REPORT_WIN_CLOSED(pControl, CUniString("Message Box (").Append( UniString::CreateFromInt32(nID) ).AppendAscii(")"));
SET_WINP_CLOSING(pControl);
pBD->EndDialog(nID);
}
nNr1++;
}
}
break;
}
default:
DBG_ERROR( "Unknown Windowtype" );
REPORT_WIN_CLOSEDc(pControl, "Unknown Windowtype");
ReportError( GEN_RES_STR0( S_RESETAPPLICATION_FAILED_UNKNOWN ), pControl->GetType() );
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( " Unbekannter Objekttyp aus UId" );
#endif
break;
}
return sal_False;
}
else
{
if ( (pControl->GetType() == WINDOW_DOCKINGWINDOW || pControl->GetType() == WINDOW_TOOLBOX) && nRetryCount-- )
{
if ( (((DockingWindow*)pControl)->GetStyle() | ((DockingWindow*)pControl)->GetFloatStyle()) & WB_CLOSEABLE )
{
REPORT_WIN_CLOSED(pControl, TypeString(pControl->GetType()));
SET_WINP_CLOSING(pControl);
((DockingWindow*)pControl)->Close();
// Eigentlich nur bei TaskWindows! Hoffen wir mal, daß keine anderen DockingWindows dazwischen hauen.
if ( (Window*)nLNr1 != pControl )
nNr1 = 1; // Zum durchprobieren der Buttons beim Schließen
nLNr1 = (sal_uLong)pControl;
return sal_False;
}
}
if ( nRetryCount--
&& ( (pControl->GetType() == WINDOW_FLOATINGWINDOW)
|| (pControl->GetType() == WINDOW_MODELESSDIALOG)
|| (pControl->GetType() == WINDOW_WORKWINDOW)
|| (pControl->GetType() == WINDOW_BORDERWINDOW) ) )
{
// if ( pControl->GetStyle() & WB_CLOSEABLE )
{
#ifdef RESET_APPLICATION_TO_BACKING_WINDOW
// Special handling for last Document; do not close the Frame, only the Document
if ( GetDocWinCount() == 1 && IsDocFrame( pControl ) )
{
if ( IsDocWin( pControl ) )
{
if ( GetDocFrameMenuBar( pControl ) )
{
MenuBar* pMenu = GetDocFrameMenuBar( pControl );
if ( pMenu->HasCloser() )
{
REPORT_WIN_CLOSED( pControl, TypeString(pControl->GetType()));
SET_WINP_CLOSING(pControl);
pMenu->GetCloserHdl().Call( pMenu );
// nur bei TaskWindows!
if ( (Window*)nLNr1 != pControl )
nNr1 = 1; // Zum durchprobieren der Buttons beim Schließen
nLNr1 = (sal_uLong)pControl;
return sal_False;
}
}
}
}
else
#endif // def RESET_APPLICATION_TO_BACKING_WINDOW
{
REPORT_WIN_CLOSED( pControl, TypeString(pControl->GetType()));
SET_WINP_CLOSING(pControl);
((SystemWindow*)pControl)->Close();
// Eigentlich nur bei TaskWindows!
if ( (Window*)nLNr1 != pControl )
nNr1 = 1; // Zum durchprobieren der Buttons beim Schließen
nLNr1 = (sal_uLong)pControl;
return sal_False;
}
}
}
}
}
// wait for some time if more windows show up
// E.g.: Floating toolbars on a Task which was hidden by another Task before
if ( !bBool2 )
{
nLNr1 = Time().GetTime() + 100; // 100 = 1 Second
bBool2 = sal_True;
}
if ( Time().GetTime() < long(nLNr1) ) // Aktuelle Zeit kleiner Endzeit
return sal_False;
else
pRet->GenReturn ( RET_Value, nMethodId, aString1);
}
break;
case RC_WaitSlot:
{
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1000; // defaults to 1000 = 1 Sec.
if ( !bBool1 )
{
nLNr1 = Time().GetTime() + nNr1/10;
bBool1 = sal_True;
}
if ( !bIsSlotInExecute )
pRet->GenReturn ( RET_Value, nMethodId, comm_USHORT(CONST_WSFinished) );
else
{
if ( Time().GetTime() < long(nLNr1) ) // Aktuelle Zeit kleiner Endzeit
return sal_False;
pRet->GenReturn ( RET_Value, nMethodId, comm_USHORT(CONST_WSTimeout) );
}
}
break;
}
Advance();
switch ( nMethodId )
{
case RC_AppDelay: // Diese Befehle werden anderswo behandelt
case RC_DisplayHid:
case RC_ResetApplication:
case RC_WaitSlot:
case RC_AppAbort: // Sofortiges Löschen aller Befehle
break;
case RC_Assert:
{
ByteString aAssertion( "Diese Assertion wurde vom Testtool per Befehl ausgelöst" );
aAssertion = ByteString( String( aAssertion, RTL_TEXTENCODING_MS_1252 ), RTL_TEXTENCODING_UTF8 );
DBG_ASSERT( !aString1.Len(), ByteString( aString1, RTL_TEXTENCODING_UTF8 ).GetBuffer() );
DBG_ASSERT( aString1.Len(), aAssertion.GetBuffer() );
OSL_ENSURE( !aString1.Len(), ByteString( aString1, RTL_TEXTENCODING_UTF8 ).GetBuffer() );
OSL_ENSURE( aString1.Len(), aAssertion.GetBuffer() );
}
break;
case RC_CaptureAssertions:
#ifdef DBG_UTIL
if( !(nParams & PARAM_BOOL_1) || bBool1 )
{
DBG_INSTOUTERROR( DBG_OUT_TESTTOOL );
osl_setDebugMessageFunc( osl_TestToolDebugPrint );
}
else
{
DBG_INSTOUTERROR( DBG_OUT_MSGBOX );
osl_setDebugMessageFunc( pOriginal_osl_DebugMessageFunc );
}
#endif
break;
case RC_Translate:
Translate();
break;
case RC_ApplicationBusy:
{
sal_Bool bWait = sal_False;
ReportError( GEN_RES_STR0( S_NO_ACTIVE_WINDOW ) );
// if ( Application::GetAppWindow() )
// bWait = Application::GetAppWindow()->IsWait();
pRet->GenReturn ( RET_Value, nMethodId, bWait );
break;
}
case RC_GetClipboard:
{
::rtl::OUString aTemp;
::svt::OStringTransfer::PasteString( aTemp, GetFirstDocFrame() );
pRet->GenReturn ( RET_Value, nMethodId, String( aTemp ) );
}
break;
case RC_SetClipboard:
::svt::OStringTransfer::CopyString(aString1,GetFirstDocFrame());
break;
case RC_WinTree:
pRet->GenReturn ( RET_Value, nMethodId, Tree( NULL, 0));
break;
#if OSL_DEBUG_LEVEL > 1
case RC_NoDebug:
m_pDbgWin->bQuiet = sal_True;
m_pDbgWin->Hide();
m_pDbgWin->Clear();
break;
case RC_Debug:
m_pDbgWin->bQuiet = sal_False;
m_pDbgWin->Show();
break;
#endif
case RC_GPF:
((TabControl*)NULL)->SetCurPageId( 12345 );
break;
case RC_GetNextCloseWindow:
{
Window *pWin = GetActive( WINDOW_BASE ); // WINDOW_ANYTYPE
if ( !pWin )
ReportError( GEN_RES_STR0( S_NO_ACTIVE_WINDOW ) );
else if ( !IsDialog(pWin) )
ReportError( GEN_RES_STR0( S_NO_DIALOG_IN_GETACTIVE ) );
else
{
pRet->GenReturn( RET_Value, nMethodId, Id2Str(pWin->GetUniqueOrHelpId()) );
}
}
break;
case RC_UseBindings:
if( !(nParams & PARAM_BOOL_1) || bBool1 )
nUseBindings = SFX_USE_BINDINGS;
else
nUseBindings = 0;
break;
case RC_Profile:
// Bei folgenden Parametern passiert folgendes:
// ein boolean=false Alles Profiling stoppen (Ergebnisse liefern)
// ein boolean=true, 1-4 ints Einteilung der Zeiten in Kästchen
// kein! boolean keine ints loggen jeden Befehls
// kein! boolean 1 int loggen alle int Millisekunden
// ein String wird in das Logfile übernommen(sonst passiert nichts)
if( !(nParams & PARAM_BOOL_1) || bBool1 )
{
if ( !pProfiler )
{
pProfiler = new TTProfiler;
InitProfile();
}
if( !(nParams & PARAM_BOOL_1) && (nParams & PARAM_USHORT_1) )
{ // Autoprofiling: Profile nNr
if ( pProfiler->IsProfilingPerCommand() )
{
pProfiler->StopProfilingPerCommand();
}
pProfiler->StartAutoProfiling( nNr1 );
// Der Header ist abhängig vom Modus
pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetProfileHeader() );
}
else if ( nParams & PARAM_USHORT_1 )
{ // Partitioning initialisieren: Profile true [,nNr][,nNr][,nNr][,nNr]
comm_ULONG nAnzahl=0;
if ( nParams & PARAM_USHORT_1 ) { nAnzahl++; };
if ( nParams & PARAM_USHORT_2 ) { nAnzahl++; };
if ( nParams & PARAM_USHORT_3 ) { nAnzahl++; };
if ( nParams & PARAM_USHORT_4 ) { nAnzahl++; };
// Hier werden die Parameter ans Testtool zurück übertragen.
// Das ist zwar etwas eigenartig, aber ansonsten müsste man im Testtool
// die einfache Struktur der Remotebefehle aufbrechen.
pRet->GenReturn( RET_ProfileInfo, S_ProfileReset, nAnzahl );
// Und die einzelnen Grenzen
if ( nParams & PARAM_USHORT_1 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder1, (comm_ULONG)nNr1 ); };
if ( nParams & PARAM_USHORT_2 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder2, (comm_ULONG)nNr2 ); };
if ( nParams & PARAM_USHORT_3 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder3, (comm_ULONG)nNr3 ); };
if ( nParams & PARAM_USHORT_4 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder4, (comm_ULONG)nNr4 ); };
pProfiler->StartPartitioning();
}
else if( nParams == PARAM_STR_1 ) // Genau ein String!
{ // Nur einen String ins Profiling aufnehmen
aString1 += '\n';
pRet->GenReturn( RET_ProfileInfo, 0, aString1 );
}
else
{ // Normales Profiling je Kommando: profile
if ( pProfiler->IsAutoProfiling() )
{
pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetAutoProfiling() );
pProfiler->StopAutoProfiling();
}
pProfiler->StartProfilingPerCommand();
// Der Header ist abhängig vom Modus
pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetProfileHeader() );
}
}
else // Profiling wieder ausschalten: Profile false
if ( pProfiler )
{
if ( pProfiler->IsProfilingPerCommand() )
pProfiler->StopProfilingPerCommand();
if ( pProfiler->IsAutoProfiling() )
{
pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetAutoProfiling() );
pProfiler->StopAutoProfiling();
}
if ( pProfiler->IsPartitioning() )
{
pRet->GenReturn( RET_ProfileInfo, S_ProfileDump, (comm_ULONG)0 );
pProfiler->StopPartitioning();
}
delete pProfiler;
pProfiler = NULL;
}
break;
case RC_MenuGetItemCount:
case RC_MenuGetItemId:
case RC_MenuGetItemPos:
case RC_MenuIsSeperator:
case RC_MenuIsItemChecked:
case RC_MenuIsItemEnabled:
case RC_MenuGetItemText:
case RC_MenuGetItemCommand:
case RC_MenuHasSubMenu:
case RC_MenuSelect:
{
PopupMenu *pPopup = NULL;
MenuBar *pMenuBar = NULL;
Menu *pMenu;
sal_uInt16 nErr = GetCurrentMenues( pPopup, pMenuBar, pMenu );
if ( !pMenu )
{
if ( nErr == 1 )
ReportError( GEN_RES_STR0( S_NO_POPUP ) );
else
ReportError( GEN_RES_STR0( S_NO_SUBMENU ) );
break;
}
sal_uInt16 nItemCount = 0;
switch ( nMethodId )
{
case RC_MenuGetItemCount:
case RC_MenuGetItemId:
case RC_MenuIsSeperator:
{
nItemCount = pMenu->GetItemCount();
if ( pMenu->GetMenuFlags() & MENU_FLAG_HIDEDISABLEDENTRIES )
{ // jep, we have to adjust the count
sal_Bool bLastWasSeperator = sal_True; // sal_True for Separator at the top
for ( sal_uInt16 i = 0 ; i < pMenu->GetItemCount() ; i++ )
{
if ( !pMenu->IsItemEnabled( pMenu->GetItemId( i ) ) )
nItemCount--;
else
{
if ( pMenu->GetItemType( i ) == MENUITEM_SEPARATOR && bLastWasSeperator )
nItemCount--;
bLastWasSeperator = pMenu->GetItemType( i ) == MENUITEM_SEPARATOR;
}
}
if ( bLastWasSeperator ) // Separator at bottom
nItemCount--;
}
}
break;
}
// for certain methods calculate the physical index (reinserting the hidden entries)
sal_uInt16 nPhysicalIndex = 0;
switch ( nMethodId )
{
case RC_MenuGetItemId:
case RC_MenuIsSeperator:
{
nPhysicalIndex = nNr1;
if ( pMenu->GetMenuFlags() & MENU_FLAG_HIDEDISABLEDENTRIES )
{ // jep, we have to adjust the position
sal_Bool bLastWasSeperator = sal_True; // sal_True for Separator at the top
sal_uInt16 nVisibleCount = 0;
for ( sal_uInt16 i = 0 ; i < pMenu->GetItemCount() && nVisibleCount < nNr1 ; i++ )
{
if ( pMenu->IsItemEnabled( pMenu->GetItemId( i ) )
&& !( pMenu->GetItemType( i ) == MENUITEM_SEPARATOR && bLastWasSeperator ) )
{
nVisibleCount++;
bLastWasSeperator = pMenu->GetItemType( i ) == MENUITEM_SEPARATOR;
}
else
nPhysicalIndex++;
}
DBG_ASSERT( nVisibleCount == nNr1, "Adaption of Index failed: nVisibleCount != nNr1" );
}
}
break;
}
switch ( nMethodId )
{
case RC_MenuGetItemCount:
{
pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)nItemCount );
}
break;
case RC_MenuGetItemId:
{
if ( ValueOK( rtl::OString(), RcString( nMethodId ),nNr1,nItemCount) )
pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)pMenu->GetItemId(nPhysicalIndex-1) );
}
break;
case RC_MenuGetItemPos:
{
sal_uInt16 nLogicalPos = pMenu->GetItemPos(nNr1);
if ( MENU_ITEM_NOTFOUND != nLogicalPos && pMenu->GetMenuFlags() & MENU_FLAG_HIDEDISABLEDENTRIES )
{ // jep, we have to adjust the position
if ( !pMenu->IsItemEnabled( nNr1 ) )
nLogicalPos = MENU_ITEM_NOTFOUND;
else
{
sal_Bool bLastWasSeperator = sal_False;
for ( int i = nLogicalPos ; i >= 0 ; i-- )
{
if ( !pMenu->IsItemEnabled( pMenu->GetItemId( sal::static_int_cast< sal_uInt16 >(i) ) ) ||
( pMenu->GetItemType( sal::static_int_cast< sal_uInt16 >(i) ) == MENUITEM_SEPARATOR && bLastWasSeperator ) )
nLogicalPos--;
bLastWasSeperator = pMenu->GetItemType( sal::static_int_cast< sal_uInt16 >(i) ) == MENUITEM_SEPARATOR;
}
}
}
pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)(nLogicalPos+1) );
}
break;
case RC_MenuIsSeperator:
{
if ( ValueOK( rtl::OString(), RcString( nMethodId ),nNr1,nItemCount) )
pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)(pMenu->GetItemType(nPhysicalIndex-1) == MENUITEM_SEPARATOR) );
}
break;
case RC_MenuIsItemChecked:
{
pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)pMenu->IsItemChecked(nNr1) );
}
break;
case RC_MenuIsItemEnabled:
{
pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)pMenu->IsItemEnabled(nNr1) );
}
break;
case RC_MenuGetItemText:
{
pRet->GenReturn ( RET_Value, nMethodId, (String)pMenu->GetItemText(nNr1) );
}
break;
case RC_MenuGetItemCommand:
{
pRet->GenReturn ( RET_Value, nMethodId, (String)pMenu->GetItemCommand(nNr1) );
}
break;
case RC_MenuHasSubMenu:
{
pRet->GenReturn ( RET_Value, nMethodId, (sal_Bool)(pMenu->GetPopupMenu(nNr1) != NULL) );
}
break;
case RC_MenuSelect:
{
if ( pMenu->GetPopupMenu(nNr1) )
{
if ( !aSubMenuId1 )
aSubMenuId1 = nNr1;
else if ( !aSubMenuId2 )
aSubMenuId2 = nNr1;
else if ( !aSubMenuId3 )
aSubMenuId3 = nNr1;
if ( pPopup )
pPopup->SelectEntry(nNr1);
else
pMenuBar->SelectEntry(nNr1);
}
else
{
if ( pPopup )
{
pPopup->EndExecute(nNr1);
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
}
else
{
pMenuBar->SelectEntry(nNr1);
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
}
}
}
break;
}
}
break;
case RC_SetControlType:
{
DirectLog( S_QAError, GEN_RES_STR0( S_DEPRECATED ) );
}
break;
case RC_Kill:
case RC_RmDir:
case RC_MkDir:
case RC_FileCopy:
case RC_Name:
case RC_Dir:
case RC_FileLen:
case RC_FileDateTime:
{
long nErrorcode = FSYS_ERR_OK;
switch ( nMethodId )
{
case RC_Kill:
{
DirEntry aFile( aString1 );
nErrorcode = aFile.GetError();
if ( FSYS_ERR_OK == nErrorcode && FileStat( aFile ).IsKind( FSYS_KIND_FILE ) )
nErrorcode = aFile.Kill();
else
nErrorcode = FSYS_ERR_NOTAFILE;
}
break;
case RC_RmDir:
{
DirEntry aDir( aString1 );
nErrorcode = aDir.GetError();
if ( FSYS_ERR_OK == nErrorcode && FileStat( aDir ).IsKind( FSYS_KIND_DIR ) )
nErrorcode = aDir.Kill();
else
nErrorcode = FSYS_ERR_NOTADIRECTORY;
}
break;
case RC_MkDir:
{
DirEntry aDir( aString1 );
nErrorcode = aDir.GetError();
if ( !nErrorcode && !aDir.MakeDir() )
nErrorcode = FSYS_ERR_UNKNOWN;
// Workaround für Bug 60693
// nErrorcode = aDir.GetError();
}
break;
case RC_FileCopy:
{
nErrorcode = DirEntry( aString1 ).CopyTo( DirEntry( aString2 ), FSYS_ACTION_COPYFILE );
}
break;
case RC_Name:
{
nErrorcode = DirEntry( aString1 ).MoveTo( DirEntry( aString2 ) );
}
break;
case RC_Dir:
{
String aPath;
sal_uInt16 nDirFlags = 0;
// from basic/source/inc/runtime.hxx
#define Sb_ATTR_NORMAL 0x0000
#define Sb_ATTR_HIDDEN 0x0002
#define Sb_ATTR_SYSTEM 0x0004
#define Sb_ATTR_VOLUME 0x0008
#define Sb_ATTR_DIRECTORY 0x0010
#define Sb_ATTR_ARCHIVE 0x0020
// copied from Basic and adapted basic/source/runtime/methods.cxx Revision 1.54
if ( (nParams & PARAM_STR_1) )
{
delete pDir;
pDir = NULL; // wg. Sonderbehandlung Sb_ATTR_VOLUME
DirEntry aEntry( aString1 );
FileStat aStat( aEntry );
if(!aStat.GetError() && (aStat.GetKind() & FSYS_KIND_FILE))
{
// OK, only a filename
// cut off path (VB4)
aPath = aEntry.GetName();
}
else
{
sal_uInt16 nFlags = 0;
if ( (nParams & PARAM_USHORT_1) )
nDirFlags = nFlags = nNr1;
else
nDirFlags = nFlags = Sb_ATTR_HIDDEN | Sb_ATTR_SYSTEM | Sb_ATTR_DIRECTORY;
// Nur diese Bitmaske ist unter Windows erlaubt
// Sb_ATTR_VOLUME wird getrennt gehandelt
if( nDirFlags & Sb_ATTR_VOLUME )
aPath = aEntry.GetVolume();
else
{
// Die richtige Auswahl treffen
sal_uInt16 nMode = FSYS_KIND_FILE;
if( nFlags & Sb_ATTR_DIRECTORY )
nMode |= FSYS_KIND_DIR;
if( nFlags == Sb_ATTR_DIRECTORY )
nMode = FSYS_KIND_DIR;
pDir = new Dir( aEntry, (DirEntryKind) nMode );
nErrorcode = pDir->GetError();
nDirPos = 0;
}
}
}
if( pDir )
{
for( ;; )
{
if( nDirPos >= pDir->Count() )
{
delete pDir;
pDir = NULL;
aPath.Erase();
break;
}
DirEntry aNextEntry=(*(pDir))[nDirPos++];
aPath = aNextEntry.GetName(); //Full();
break;
}
}
if ( !nErrorcode )
{
pRet->GenReturn ( RET_Value, nMethodId, aPath );
}
/* keep old Implementation for now
// neues Verzeichnis einlesen
if ( (nParams & PARAM_STR_1) )
{
if ( pDir )
{
delete pDir;
pDir = NULL;
}
DirEntryKind aDirEntryKind = FSYS_KIND_FILE | FSYS_KIND_DIR;
if ( (nParams & PARAM_USHORT_1) && nNr1 )
{
if ( nNr1 & 16 )
aDirEntryKind = FSYS_KIND_DIR;
else
ReportError( GEN_RES_STR0( S_SELECTION_BY_ATTRIBUTE_ONLY_DIRECTORIES ) );
}
DirEntry aEntry( aString1 );
nErrorcode = aEntry.GetError();
if ( !nErrorcode )
{
nDirPos = 0;
FileStat aFS( aEntry );
if ( !aFS.IsKind( FSYS_KIND_WILD ) && !aFS.IsKind( FSYS_KIND_DIR ) && aEntry.Exists() )
{ // Sonderbehandlung für genau einen Eintrag
if ( !aFS.IsKind( FSYS_KIND_DIR ) && ( aDirEntryKind == FSYS_KIND_DIR ) )
pRet->GenReturn ( RET_Value, nMethodId, String() );
else
pRet->GenReturn ( RET_Value, nMethodId, (String)(aEntry.GetName()) );
break;
}
else
{
pDir = new Dir( aEntry, aDirEntryKind );
nErrorcode = pDir->GetError();
}
}
}
if ( !pDir )
pDir = new Dir;
if ( !nErrorcode && ValueOK( nMethodId, GEN_RES_STR0( S_NO_MORE_FILES ), nDirPos+1, pDir->Count()+1 ) )
{
if ( nDirPos == pDir->Count() )
pRet->GenReturn ( RET_Value, nMethodId, String() );
else
pRet->GenReturn ( RET_Value, nMethodId, (String)((*pDir)[ nDirPos ].GetName()) );
nDirPos++;
}*/
}
break;
case RC_FileLen:
{
DirEntry aFile( aString1 );
nErrorcode = aFile.GetError();
if ( FSYS_ERR_OK == nErrorcode )
{
FileStat aFS( aFile );
pRet->GenReturn ( RET_Value, nMethodId, static_cast<comm_ULONG>(aFS.GetSize()) ); //GetSize() sal_uLong != comm_ULONG on 64bit
nErrorcode = aFS.GetError();
}
}
break;
case RC_FileDateTime:
{
DirEntry aFile( aString1 );
nErrorcode = aFile.GetError();
if ( FSYS_ERR_OK == nErrorcode )
{
FileStat aStat( aFile );
Time aTime( aStat.TimeModified() );
Date aDate( aStat.DateModified() );
nErrorcode = aStat.GetError();
double fSerial = (double)( aDate - Date(30,12,1899) );
long nSeconds = aTime.GetHour();
nSeconds *= 3600;
nSeconds += aTime.GetMin() * 60;
nSeconds += aTime.GetSec();
double nDays = ((double)nSeconds) / (double)(24.0*3600.0);
fSerial += nDays;
SbxValueRef xValue = new SbxValue( SbxDATE );
xValue->PutDate( fSerial );
pRet->GenReturn ( RET_Value, nMethodId, *xValue );
}
}
break;
}
switch ( nErrorcode )
{
case FSYS_ERR_OK:
break;
case FSYS_ERR_MISPLACEDCHAR:
{
ReportError( CUniString("MISPLACEDCHAR") );
}
break;
case FSYS_ERR_INVALIDCHAR:
{
ReportError( CUniString("INVALIDCHAR") );
}
break;
case FSYS_ERR_NOTEXISTS:
{
ReportError( CUniString("NOTEXISTS") );
}
break;
case FSYS_ERR_ALREADYEXISTS:
{
ReportError( CUniString("ALREADYEXISTS") );
}
break;
case FSYS_ERR_NOTADIRECTORY:
{
ReportError( CUniString("NOTADIRECTORY") );
}
break;
case FSYS_ERR_NOTAFILE:
{
ReportError( CUniString("NOTAFILE") );
}
break;
case FSYS_ERR_INVALIDDEVICE:
{
ReportError( CUniString("INVALIDDEVICE") );
}
break;
case FSYS_ERR_ACCESSDENIED:
{
ReportError( CUniString("ACCESSDENIED") );
}
break;
case FSYS_ERR_LOCKVIOLATION:
{
ReportError( CUniString("LOCKVIOLATION") );
}
break;
case FSYS_ERR_VOLUMEFULL:
{
ReportError( CUniString("VOLUMEFULL") );
}
break;
case FSYS_ERR_ISWILDCARD:
{
ReportError( CUniString("ISWILDCARD") );
}
break;
case FSYS_ERR_NOTSUPPORTED:
{
ReportError( CUniString("NOTSUPPORTED") );
}
break;
case FSYS_ERR_UNKNOWN:
{
ReportError( CUniString("UNKNOWN") );
}
break;
default:
{
ReportError( CUniString("Not an FSYS Error") );
}
}
}
break;
case RC_TypeKeysDelay:
{
if( (nParams & PARAM_BOOL_1) )
{
bDoTypeKeysDelay = bBool1;
}
else if( nParams & PARAM_USHORT_1 )
{
nMinTypeKeysDelay = nNr1;
if( nParams & PARAM_USHORT_2 )
nMaxTypeKeysDelay = nNr2;
else
nMaxTypeKeysDelay = nMinTypeKeysDelay;
}
else
ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
}
break;
case RC_GetMouseStyle:
{
Pointer aPointer;
// if ( DragManager::GetDragManager() )
// aPointer = DragManager::GetDragManager()->GetDragPointer();
// else
{
Window *pActualWin = GetMouseWin();
if ( pActualWin )
aPointer = pActualWin->GetPointer();
else
{
ReportError( GEN_RES_STR1( S_POINTER_OUTSIDE_APPWIN, RcString( nMethodId ) ) );
aPointer = Pointer( POINTER_NULL );
}
}
pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)aPointer.GetStyle() );
}
break;
case RC_UnpackStorage:
{
if( (nParams & PARAM_STR_1) )
{
String aFileName( aString1 );
DirEntry aDestPath;
if( (nParams & PARAM_STR_2) )
aDestPath = DirEntry( aString2 );
else
{
aDestPath = DirEntry( aFileName );
aDestPath.SetExtension( CUniString( "plaintext" ) );
}
#if OSL_DEBUG_LEVEL > 1
sal_uInt16 nEntries = Dir( aDestPath, FSYS_KIND_FILE | FSYS_KIND_DIR ).Count();
(void) nEntries; /* avoid warning about unused parameter */
#endif
// The Count is only larger than 2 is the path is a directory which is not empty
// the Count of 2 results from the "." and ".." directory
if ( Dir( aDestPath, FSYS_KIND_FILE | FSYS_KIND_DIR ).Count() > 2 )
DirectLog( S_QAError, GEN_RES_STR1( S_DIRECTORY_NOT_EMPTY, aDestPath.GetFull() ) );
SotStorageRef xStorage = new SotStorage( aFileName, STREAM_STD_READ );
if ( xStorage->GetError() )
ReportError( GEN_RES_STR2(S_UNPACKING_STORAGE_FAILED, aFileName, aDestPath.GetFull()) );
else
UnpackStorage( xStorage, aDestPath );
}
else
ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
}
break;
case RC_CloseSysDialog:
case RC_ExistsSysDialog:
{
if( (nParams & PARAM_USHORT_1) )
{
Reference < ::com::sun::star::util::XCancellable > xPicker;
switch( nNr1 )
{
case CONST_FilePicker:
{
xPicker.set( Reference < ::com::sun::star::util::XCancellable >( svt::GetTopMostFilePicker(), UNO_QUERY ) );
}
break;
case CONST_FolderPicker:
{
xPicker.set( Reference < ::com::sun::star::util::XCancellable >( svt::GetTopMostFolderPicker(), UNO_QUERY ) );
}
break;
default:
ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
}
switch( nMethodId )
{
case RC_CloseSysDialog:
{
if ( xPicker.is() )
xPicker->cancel();
else
ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
}
break;
case RC_ExistsSysDialog:
{
pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)xPicker.is() );
}
break;
default:
ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
}
}
else
ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
}
break;
case RC_SAXCheckWellformed:
case RC_SAXReadFile:
case RC_SAXGetNodeType:
case RC_SAXGetAttributeCount:
case RC_SAXGetAttributeName:
case RC_SAXGetAttributeValue:
case RC_SAXGetChildCount:
case RC_SAXGetElementName:
case RC_SAXGetChars:
case RC_SAXSeekElement:
case RC_SAXHasElement:
case RC_SAXGetElementPath:
case RC_SAXRelease:
{
HandleSAXParser();
}
break;
case RC_RecordMacro:
{
if ( ! (nParams & PARAM_BOOL_1) )
bBool1 = sal_True;
MacroRecorder::GetMacroRecorder()->SetActionRecord( bBool1 );
}
break;
case RC_GetDocumentCount :
{
pRet->GenReturn ( RET_Value, nMethodId, (comm_USHORT)GetDocWinCount() );
}
break;
case RC_ActivateDocument :
{
if( nParams & PARAM_USHORT_1 )
{
if ( ValueOK( rtl::OString(), RcString( nMethodId ), nNr1, GetDocWinCount() ) )
{
Window* pWin = GetDocWin( nNr1-1 );
if ( pWin )
{
pWin->ToTop();
pWin->GrabFocus();
}
}
}
else
ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
}
break;
case RC_GetSystemLanguage :
{
pRet->GenReturn ( RET_Value, nMethodId, (comm_USHORT)Application::GetSettings().GetLanguage() );
}
break;
case RC_CatchGPF :
{
if( (nParams & PARAM_BOOL_1) )
bCatchGPF = bBool1;
else
bCatchGPF = sal_True;
}
break;
case RC_IsProduct :
{
sal_Bool bIsProduct;
#ifdef DBG_UTIL
bIsProduct = sal_False;
#else
bIsProduct = sal_True;
#endif
pRet->GenReturn ( RET_Value, nMethodId, (sal_Bool)bIsProduct );
}
break;
case RC_UsePostEvents :
{
if( (nParams & PARAM_BOOL_1) )
bUsePostEvents = bBool1;
else
bUsePostEvents = sal_True;
}
break;
default:
ReportError( GEN_RES_STR1( S_UNKNOWN_COMMAND, RcString( nMethodId ) ) );
}
SendProfile( RcString(nMethodId) );
delete this;
return sal_True;
}
sal_Bool StatementCommand::UnpackStorage( SotStorageRef xStorage, DirEntry &aBaseDir )
{
SvStorageInfoList aList;
xStorage->FillInfoList( &aList );
for( sal_uInt16 i = 0; i < aList.Count(); i++ )
{
SvStorageInfo& rInfo = aList.GetObject( i );
String aName = rInfo.GetName();
DirEntry aPath ( aBaseDir );
aPath += DirEntry( aName );
sal_Bool bIsStorage = xStorage->IsStorage( aName );
if ( bIsStorage )
{
SotStorageRef xSubStorage = xStorage->OpenSotStorage( aName, STREAM_STD_READ );
if ( xSubStorage->GetError() )
{
ReportError( GEN_RES_STR2(S_UNPACKING_STORAGE_FAILED, aName, aPath.GetFull()) );
return sal_False;
}
UnpackStorage( xSubStorage, aPath );
}
else
{
if ( !aPath.MakeDir( sal_True ) )
{
ReportError( GEN_RES_STR1(S_CANNOT_CREATE_DIRECTORY, aPath.GetFull()) );
return sal_False;
}
SotStorageStreamRef xStream = xStorage->OpenSotStream( aName, STREAM_STD_READ );
SvFileStream aDestination( aPath.GetFull(), STREAM_STD_READWRITE | STREAM_TRUNC );
(*xStream) >> aDestination;
if ( aDestination.GetError() != ERRCODE_NONE )
{
ReportError( GEN_RES_STR2(S_UNPACKING_STORAGE_FAILED, aName, aPath.GetFull()) );
return sal_False;
}
aDestination.Close();
}
}
return sal_True;
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
StatementControl::StatementControl( SCmdStream *pCmdIn, sal_uInt16 nControlIdType )
: StatementList()
, nNr1( 0 )
, nNr2( 0 )
, nNr3( 0 )
, nNr4( 0 )
, nLNr1( 0 )
, aString1()
, aString2()
, bBool1(sal_False)
, bBool2(sal_False)
{
QueStatement( NULL );
//HELPID BACKWARD (SIControl is no longer needed)
if ( nControlIdType == SIControl )
{
comm_ULONG nId;
pCmdIn->Read( nId );
aUId = rtl::OString( nId );
if ( nId == 0 )
aUId = UID_ACTIVE;
else
ReportError( aUId, GEN_RES_STR1c( S_INTERNAL_ERROR, "using numeric HelpID from old Testtool" ) );
}
else if ( nControlIdType == SIStringControl )
{
String aId;
pCmdIn->Read( aId );
aUId = Str2Id( aId );
}
else
{
DBG_ERROR( "Wrong ControlType" );
}
pCmdIn->Read( nMethodId );
pCmdIn->Read( nParams );
if( nParams & PARAM_USHORT_1 ) pCmdIn->Read( nNr1 );
if( nParams & PARAM_USHORT_2 ) pCmdIn->Read( nNr2 );
if( nParams & PARAM_USHORT_3 ) pCmdIn->Read( nNr3 );
if( nParams & PARAM_USHORT_4 ) pCmdIn->Read( nNr4 );
if( nParams & PARAM_ULONG_1 ) pCmdIn->Read( nLNr1 );
if( nParams & PARAM_STR_1 ) pCmdIn->Read( aString1 );
if( nParams & PARAM_STR_2 ) pCmdIn->Read( aString2 );
if( nParams & PARAM_BOOL_1 ) pCmdIn->Read( bBool1 );
if( nParams & PARAM_BOOL_2 ) pCmdIn->Read( bBool2 );
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Reading Control: UId: " );
m_pDbgWin->AddText( Id2Str( aUId ) );
m_pDbgWin->AddText( " Methode: " );
m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
m_pDbgWin->AddText( " Params:" );
if( nParams & PARAM_USHORT_1 ) {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr1 ) );}
if( nParams & PARAM_USHORT_2 ) {m_pDbgWin->AddText( " n2:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr2 ) );}
if( nParams & PARAM_USHORT_3 ) {m_pDbgWin->AddText( " n3:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr3 ) );}
if( nParams & PARAM_USHORT_4 ) {m_pDbgWin->AddText( " n4:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr4 ) );}
if( nParams & PARAM_ULONG_1 ) {m_pDbgWin->AddText( " nl1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
if( nParams & PARAM_STR_1 ) {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
if( nParams & PARAM_STR_2 ) {m_pDbgWin->AddText( " s2:" );m_pDbgWin->AddText( aString2 );}
/* if( nParams & PARAM_BOOL_1 ) pCmdIn->Read( bBool1 );
if( nParams & PARAM_BOOL_2 ) pCmdIn->Read( bBool2 );*/
m_pDbgWin->AddText( "\n" );
#endif
}
sal_Bool IsDialog(Window *pWin)
{ // Alles was von SystemWindow abgeleitet ist
if ( !pWin )
return sal_False;
switch (pWin->GetType())
{
case WINDOW_FLOATINGWINDOW:
case WINDOW_DOCKINGWINDOW:
case WINDOW_MODELESSDIALOG:
case WINDOW_DIALOG:
case WINDOW_MODALDIALOG:
case WINDOW_WORKWINDOW:
case WINDOW_TABDIALOG:
case WINDOW_MESSBOX:
case WINDOW_INFOBOX:
case WINDOW_WARNINGBOX:
case WINDOW_ERRORBOX:
case WINDOW_QUERYBOX:
case WINDOW_BUTTONDIALOG:
case WINDOW_FILEDIALOG:
case WINDOW_PRINTDIALOG:
case WINDOW_PRINTERSETUPDIALOG:
// ab hier nicht ansprechbar (da nicht implementiert)
case WINDOW_SYSWINDOW:
case WINDOW_SYSTEMDIALOG:
case WINDOW_COLORDIALOG:
case WINDOW_FONTDIALOG:
case WINDOW_PATHDIALOG:
return sal_True;
// break;
default:
return sal_False;
// break;
}
}
sal_Bool IsAccessable(Window *pWin)
{
if ( pWin == NULL )
return sal_False;
return pWin->IsEnabled() && pWin->IsInputEnabled();
}
// neue Hilfsfunktion
static Window*ImpGetButton( Window *pBase, WinBits nMask, WinBits nWinBits )
{
sal_uInt16 n = pBase->GetChildCount();
for( sal_uInt16 i = 0 ; i < n; i++ ) {
Window *pChild = pBase->GetChild(i);
if( pChild->GetType() == WINDOW_OKBUTTON
|| pChild->GetType() == WINDOW_CANCELBUTTON
|| pChild->GetType() == WINDOW_HELPBUTTON
|| pChild->GetType() == WINDOW_PUSHBUTTON )
if( !nMask || ( pChild->GetStyle() & nMask ) == nWinBits )
return pChild;
}
return NULL;
}
sal_Bool StatementControl::ControlOK( Window *pControl, const sal_Char* cBezeichnung )
{
if ( pControl && ( ( ( IsAccessable(pControl) || (nMethodId & M_WITH_RETURN) ) &&
pControl->IsVisible() ) ||
aUId.equals( UID_ACTIVE ) ) )
return sal_True;
else
{
UniString aBezeichnung( cBezeichnung, RTL_TEXTENCODING_ASCII_US );
if ( aBezeichnung.Len() > 0 )
{
if (!pControl)
ReportError( aUId, GEN_RES_STR1( S_WIN_NOT_FOUND, aBezeichnung ) );
else if ( !pControl->IsVisible() )
ReportError( aUId, GEN_RES_STR1( S_WIN_INVISIBLE, aBezeichnung ) );
else
ReportError( aUId, GEN_RES_STR1( S_WIN_DISABLED, aBezeichnung ) );
}
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( aBezeichnung.AppendAscii(" NotFound or Disabled or Invisible") );
#endif
return sal_False;
}
}
sal_Bool StatementList::ValueOK( rtl::OString aId, String aBezeichnung, sal_uLong nValue, sal_uLong nMax )
{
if ( nMax < nValue )
{
if ( aBezeichnung.Len() > 0 )
ReportError( aId, GEN_RES_STR3( S_NUMBER_TOO_BIG, aBezeichnung, UniString::CreateFromInt32( nValue ), UniString::CreateFromInt32( nMax ) ) );
return sal_False;
}
if ( nValue < 1 )
{
if ( aBezeichnung.Len() > 0 )
ReportError( aId, GEN_RES_STR3c3( S_NUMBER_TOO_SMALL, aBezeichnung, UniString::CreateFromInt32( nValue ), "1" ) );
return sal_False;
}
return sal_True;
}
sal_uInt16 StatementList::GetCurrentMenues( PopupMenu *&pPopup, MenuBar *&pMenuBar, Menu *&pMenu )
{
if ( WinPtrValid( pMenuWindow ) )
pMenuBar = pMenuWindow->GetMenuBar();
if ( pMenuBar ) // use MenuBar as base
pMenu = pMenuBar;
else // use contextmenu as base
{
pMenu = PopupMenu::GetActivePopupMenu();
pPopup = PopupMenu::GetActivePopupMenu();
}
if ( !pMenu )
return 1;
if ( aSubMenuId1 )
{
pPopup = pMenu->GetPopupMenu( aSubMenuId1 );
pMenu = pPopup;
}
if ( pMenu && aSubMenuId2 )
{
pPopup = pMenu->GetPopupMenu( aSubMenuId2 );
pMenu = pPopup;
}
if ( pMenu && aSubMenuId3 )
{
pPopup = pMenu->GetPopupMenu( aSubMenuId3 );
pMenu = pPopup;
}
return 0;
}
void StatementControl::AnimateMouse( Window *pControl, TTHotSpots aWohin )
{
Point aZiel;
switch (aWohin)
{
case MitteLinks:
{
long nHeight = pControl->GetSizePixel().Height();
aZiel.X() += 5;
aZiel.Y() += nHeight / 2;
}
break;
case Mitte:
{
Size aSize = pControl->GetOutputSizePixel();
aZiel.Move( aSize.Width() / 2, aSize.Height() / 2 );
}
break;
case MitteOben:
{
long nWidth = pControl->GetSizePixel().Width();
aZiel.X() += nWidth / 2;
aZiel.Y() += 5;
}
break;
}
AnimateMouse( pControl, aZiel );
}
void StatementControl::AnimateMouse( Window *pControl, Point aWohin )
{
Point aAkt = pControl->GetPointerPosPixel();
Point aZiel = aWohin;
long nSteps;
Point aDiff = aAkt - aZiel;
if ( Abs(aDiff.X()) < Abs(aDiff.Y()) )
nSteps = Abs(aDiff.Y()) / 5;
else
nSteps = Abs(aDiff.X()) / 5;
if ( nSteps == 0 )
return;
aDiff *= 1000;
aDiff /= nSteps;
StatementList::bExecuting = sal_True; // Bah ist das ein ekliger Hack
// Das verhindert, daß schon der nächste Befehl ausgeführt wird.
for ( ; nSteps ; nSteps-- )
{
if ( Abs((aAkt - pControl->GetPointerPosPixel()).X()) > 5 ||
Abs((aAkt - pControl->GetPointerPosPixel()).Y()) > 5 )
nSteps = 1;
aAkt = aZiel + aDiff * nSteps / 1000;
pControl->SetPointerPosPixel(aAkt);
SafeReschedule();
}
pControl->SetPointerPosPixel(aZiel);
StatementList::bExecuting = sal_False; // Bah ist das ein ekliger Hack
}
sal_Bool StatementControl::MaybeDoTypeKeysDelay( Window *pTestWindow )
{
if ( bDoTypeKeysDelay )
{
sal_uLong nTimeWait = nMinTypeKeysDelay;
if ( nMaxTypeKeysDelay != nMinTypeKeysDelay )
nTimeWait += Time::GetSystemTicks() % ( nMaxTypeKeysDelay - nMinTypeKeysDelay );
Timer aTimer;
aTimer.SetTimeout( nTimeWait );
aTimer.Start();
StatementList::bExecuting = sal_True; // Bah ist das ein ekliger Hack
// Das verhindert, daß schon der nächste Befehl ausgeführt wird.
while ( aTimer.IsActive() )
{
SafeReschedule( sal_True );
}
StatementList::bExecuting = sal_False; // Bah ist das ein ekliger Hack
if ( !WinPtrValid(pTestWindow ) )
{
ReportError( aUId, GEN_RES_STR1( S_WINDOW_DISAPPEARED, MethodString( nMethodId ) ) );
return sal_False;
}
}
return sal_True;
}
sal_Bool StatementControl::HandleVisibleControls( Window *pControl )
{
if( pControl ) // Also auch bei Disabled nicht jedoch bei Invisible
{
switch( nMethodId )
{
case M_IsEnabled:
pRet->GenReturn ( RET_Value, aUId, IsAccessable(pControl) );
break;
case M_IsVisible:
pRet->GenReturn ( RET_Value, aUId, pControl->IsVisible() );
break;
case M_GetPosX:
if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für FloatingWindows
if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für TabDialoge
if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für Border
if ( (nParams & PARAM_BOOL_1) && bBool1 )
pControl = pControl->GetWindow( WINDOW_OVERLAP );
if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_SPLITWINDOW )
{
Point aPos = pControl->GetPosPixel();
aPos = pControl->GET_REAL_PARENT()->OutputToScreenPixel( aPos );
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)aPos.X() );
}
else
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetPosPixel().X() );
break;
case M_GetPosY:
if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für FloatingWindows
if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für TabDialoge
if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für Border
if ( (nParams & PARAM_BOOL_1) && bBool1 )
pControl = pControl->GetWindow( WINDOW_OVERLAP );
if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_SPLITWINDOW )
{
Point aPos = pControl->GetPosPixel();
aPos = pControl->GET_REAL_PARENT()->OutputToScreenPixel( aPos );
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)aPos.Y() );
}
else
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetPosPixel().Y() );
break;
case M_GetSizeX:
if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für FloatingWindows
if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für TabDialoge
if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für Border
if ( (nParams & PARAM_BOOL_1) && bBool1 )
pControl = pControl->GetWindow( WINDOW_OVERLAP );
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetSizePixel().Width() );
break;
case M_GetSizeY:
if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für FloatingWindows
if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für TabDialoge
if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für Border
if ( (nParams & PARAM_BOOL_1) && bBool1 )
pControl = pControl->GetWindow( WINDOW_OVERLAP );
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetSizePixel().Height() );
break;
case M_SnapShot:
{
if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für FloatingWindows
if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für TabDialoge
if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
pControl = pControl->GET_REAL_PARENT(); // Sonderbehandlung für Border
if ( (nParams & PARAM_BOOL_1) && bBool1 )
pControl = pControl->GetWindow( WINDOW_OVERLAP );
Bitmap aBmp = pControl->SnapShot();
if ( pControl->GetType() == WINDOW_WORKWINDOW )
{
Point aStart = pControl->GetPosPixel();
if ( !(nParams & PARAM_USHORT_4) )
{
nParams |= PARAM_USHORT_1;
nParams |= PARAM_USHORT_2;
nParams |= PARAM_USHORT_3;
nParams |= PARAM_USHORT_4;
nNr1 = (sal_uInt16)-aStart.X();
nNr2 = (sal_uInt16)-aStart.Y();
nNr3 = (sal_uInt16)pControl->GetSizePixel().Width() + 2*(sal_uInt16)aStart.X();
nNr4 = (sal_uInt16)pControl->GetSizePixel().Height() + 2*(sal_uInt16)aStart.Y();
}
nNr1 = std::max((sal_uInt16)-aStart.X(),nNr1);
nNr2 = std::max((sal_uInt16)-aStart.Y(),nNr2);
nNr3 = std::min((sal_uInt16)(pControl->GetSizePixel().Width() + 2*(sal_uInt16)aStart.X()),nNr3);
nNr4 = std::min((sal_uInt16)(pControl->GetSizePixel().Height() + 2*(sal_uInt16)aStart.Y()),nNr4);
}
if( nParams & PARAM_USHORT_4 )
{ // Zuschneiden
Point aPt(-nNr1,-nNr2);
Size aSz(nNr3,nNr4);
VirtualDevice aVDev( *pControl );
aVDev.SetOutputSizePixel( aSz );
aVDev.DrawBitmap( aPt, aBmp );
aBmp = aVDev.GetBitmap( Point(), aSz );
}
SvFileStream fOut;
fOut.Open(aString1,STREAM_STD_WRITE);
WriteDIB(aBmp, fOut, true, true);
if ( fOut.GetError() )
ReportError( aUId, GEN_RES_STR1( S_ERROR_SAVING_IMAGE, UniString::CreateFromInt32( fOut.GetError() ) ) );
fOut.Close();
}
break;
case M_GetFixedTextCount:
{
pRet->GenReturn ( RET_Value, aUId, CountWinByRT( pControl, WINDOW_FIXEDTEXT, sal_True ) );
}
break;
case M_GetFixedText:
{
if( ( nParams & PARAM_USHORT_1 ) == 0 )
nNr1 = 1;
FixedText* pFixedText = (FixedText*)GetWinByRT( pControl, WINDOW_FIXEDTEXT, sal_True, nNr1-1 );
if ( pFixedText )
pRet->GenReturn ( RET_Value, aUId, pFixedText->GetText() );
else
ValueOK(aUId, MethodString( nMethodId ),nNr1,CountWinByRT( pControl, WINDOW_FIXEDTEXT, sal_True ) );
}
break;
case M_HasFocus:
{
pRet->GenReturn ( RET_Value, aUId, pControl->HasFocus() );
break;
}
case M_GetScreenRectangle:
{
Rectangle aRect = bBool1 ? pControl->GetClientWindowExtentsRelative(NULL) : pControl->GetWindowExtentsRelative( NULL );
pRet->GenReturn ( RET_Value, aUId,
UniString::CreateFromInt32(aRect.Left()).
AppendAscii(",").Append(UniString::CreateFromInt32(aRect.Top())).
AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetWidth())).
AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetHeight()))
);
}
break;
case M_GetHelpText:
{
pRet->GenReturn ( RET_Value, aUId, pControl->GetHelpText());
}
break;
case M_GetQuickHelpText:
{
pRet->GenReturn ( RET_Value, aUId,pControl->GetQuickHelpText());
}
break;
default:
return sal_False;
}
SendProfile( UIdString( aUId ).Append('.').Append( MethodString( nMethodId ) ) );
return sal_True;
}
return sal_False;
}
sal_Bool StatementControl::HandleCommonMethods( Window *pControl )
{
switch( nMethodId ) // Diese können an jedem Window ausgeführt werden
{
case M_Exists: // Oben schon Behandelt. Unterdrückt hier nur Fehler
case M_NotExists:
case M_IsEnabled:
case M_IsVisible:
case M_SnapShot:
break;
case M_Caption :
{
if ( pControl->GetText().Len() == 0 && IsDocFrame( pControl->GetWindow( WINDOW_FRAME ) ) )
pRet->GenReturn ( RET_Value, aUId, pControl->GetWindow( WINDOW_FRAME )->GetText());
else
pRet->GenReturn ( RET_Value, aUId, pControl->GetText());
}
break;
case M_GetRT:
{
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetType() );
}
break;
case M_TypeKeys:
{
if( !(nParams & PARAM_USHORT_1) ) // Anzahl wiederholungen
nNr1 = 1;
if( !(nParams & PARAM_BOOL_1) ) // Follow Focus
bBool1 = sal_False; // so bleibt das bisherige Verhalten
if ( !bBool1 ) // Altes Verhalten
pControl->GrabFocus();
else // If focus is not inside given control we grab it once.
{
Window *pFocus = GetpApp()->GetFocusWindow();
if ( !pFocus || !pControl->IsWindowOrChild( pFocus, sal_True ) )
pControl->GrabFocus();
}
// maybe this can get removed since we are using GetPreferredKeyInputWindow()
if ( pControl->GetType() == WINDOW_COMBOBOX )
{ // Bei COMBOBOX an das Edit direkt liefern
Window *pTemp = NULL;
for ( sal_uInt16 i = 0 ; i < pControl->GetChildCount() && !pTemp ; i++ )
if ( pControl->GetChild( i )->GetType() == WINDOW_EDIT )
pTemp = pControl->GetChild( i );
if ( pTemp )
pControl = pTemp;
}
Window *pDeliverHere = pControl;
for (int j = 0; j < nNr1; j++)
for (xub_StrLen i = 0; i < aString1.Len(); i++)
{
if ( StatementList::bUsePostEvents )
{ // grab focus every time
Window *pFocus = GetpApp()->GetFocusWindow();
if ( !pFocus || !pControl->IsWindowOrChild( pFocus, sal_True ) )
pControl->GrabFocus();
}
if ( bBool1 ) // Jedesmal das FocusWindow finden
{
Window *pFocus = GetpApp()->GetFocusWindow();
if ( pFocus && pControl->IsWindowOrChild( pFocus, sal_True ) )
pDeliverHere = pFocus;
else // sonst fallback auf das Basisfenster
pDeliverHere = pControl;
}
pDeliverHere = pDeliverHere->GetPreferredKeyInputWindow();
KeyEvent aEvent;
if ( ((sal_uInt16)aString1.GetChar(i)) <= 7 )
{
sal_uInt16 nVal = 0;
switch (aString1.GetChar(i))
{
case 1: nVal = aString1.GetChar(i+1) + (aString1.GetChar(i+2) << 8);
i += 2;
break;
case 3: nVal = (aString1.GetChar(i+1) << 8);
i++;
break;
case 5: nVal = aString1.GetChar(i+1);
i++;
break;
case 7: nVal = 0;
break;
}
// #105672#
// find out the keycode
sal_uInt16 nKeygroup = nVal & KEYGROUP_TYPE;
sal_uInt16 nKeyCode = nVal & KEY_CODE;
sal_Unicode aCh;
switch (nKeygroup)
{
case KEYGROUP_NUM:
aCh = nKeyCode - KEY_0 + '0';
break;
case KEYGROUP_ALPHA:
aCh = nKeyCode - KEY_A;
if ( nVal & KEY_MOD1 )
{}
else if ( nVal & KEY_SHIFT )
aCh += 'A';
else
aCh += 'a';
break;
case KEYGROUP_MISC:
{ // CR ESC TAB BACK
ByteString aPrintableMisc("\x0d\x1b\x09\x08 **+-*/.,<>=",16);
if ( nKeyCode-KEY_RETURN < aPrintableMisc.Len()
&& nKeyCode != KEY_INSERT && nKeyCode != KEY_DELETE )
aCh = aPrintableMisc.GetChar( nKeyCode-KEY_RETURN );
else
aCh = 0;
}
break;
case KEYGROUP_CURSOR:
case KEYGROUP_FKEYS:
default:
aCh = 0;
}
aEvent = KeyEvent(aCh,KeyCode(nVal & 0xFFF,nVal & 0xF000));
}
else
{
// CR ESC TAB BACK
String aPrintableMisc = CUniString("\x0d\x1b\x09\x08 xx+-*/.,<>=");
sal_Unicode aCh = aString1.GetChar(i);
if ( aCh >= 'a' && aCh <= 'z' )
aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_ALPHA + aCh-'a', 0));
else if ( aCh >= 'A' && aCh <= 'Z' )
aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_ALPHA + aCh-'a', KEY_SHIFT));
else if ( aCh >= '0' && aCh <= '9' )
aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_NUM + aCh-'0', 0));
else if ( aPrintableMisc.Search(aCh) != STRING_NOTFOUND )
aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_MISC + (sal_uInt16)aPrintableMisc.Search(aCh), 0));
else // Sollte eigentlich nicht auftreten
aEvent = KeyEvent(aCh, KeyCode());
}
ImplKeyInput( pDeliverHere, aEvent );
if ( !MaybeDoTypeKeysDelay( pControl ) )
break;
else
SafeReschedule();SafeReschedule();SafeReschedule();
}
}
break;
#define CalcMouseButton\
sal_uInt16 nButton = MOUSE_LEFT;\
if ( (nParams & PARAM_USHORT_3) )\
{\
switch ( nNr3 )\
{\
case 1: nButton = MOUSE_LEFT; break;\
case 2: nButton = MOUSE_MIDDLE; break;\
case 3: nButton = MOUSE_RIGHT; break;\
}\
}\
case M_MouseDown:
{
CalcMouseButton;
Size aS = pControl->GetOutputSizePixel();
Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
Window *pActualWin = pControl->FindWindow( aPos );
// AnimateMouse( pControl, aPos );
if ( pActualWin )
aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
// aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
else
pActualWin = pControl;
AnimateMouse( pActualWin, aPos );
pActualWin->GrabFocus();
MouseEvent aMEvnt(aPos,1,MOUSE_SIMPLECLICK|MOUSE_SELECT,nButton);
ImplMouseButtonDown( pActualWin, aMEvnt );
}
break;
case M_MouseUp:
{
CalcMouseButton;
Size aS = pControl->GetOutputSizePixel();
Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
Window *pActualWin = pControl->FindWindow( aPos );
if ( pActualWin )
aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
// aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
else
pActualWin = pControl;
AnimateMouse( pActualWin, aPos );
// pActualWin->GrabFocus();
MouseEvent aMEvt( aPos, 1, MOUSE_SIMPLECLICK|MOUSE_SELECT, nButton );
ImplMouseButtonUp( pActualWin, aMEvt );
}
break;
case M_MouseMove:
{
CalcMouseButton;
Size aS = pControl->GetOutputSizePixel();
Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
Window *pActualWin = pControl->FindWindow( aPos );
if ( pActualWin )
{
aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
// aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
}
else
pActualWin = pControl;
AnimateMouse( pActualWin, aPos );
// pActualWin->GrabFocus();
MouseEvent aMEvt( aPos, 0, MOUSE_SIMPLEMOVE|MOUSE_DRAGMOVE, nButton );
ImplMouseMove( pActualWin, aMEvt );
}
break;
case M_MouseDoubleClick:
{
CalcMouseButton;
Size aS = pControl->GetOutputSizePixel();
Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
Window *pActualWin = pControl->FindWindow( aPos );
if ( pActualWin )
{
aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
// aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
}
else
pActualWin = pControl;
AnimateMouse( pActualWin, aPos );
pActualWin->GrabFocus();
MouseEvent aMEvnt;
aMEvnt = MouseEvent(aPos,1,MOUSE_SIMPLECLICK|MOUSE_SELECT,nButton);
ImplMouseButtonDown( pActualWin, aMEvnt );
ImplMouseButtonUp ( pActualWin, aMEvnt );
aMEvnt = MouseEvent(aPos,2,MOUSE_SIMPLECLICK|MOUSE_SELECT,nButton);
ImplMouseButtonDown( pActualWin, aMEvnt );
ImplMouseButtonUp ( pActualWin, aMEvnt );
}
break;
case M_DisplayPercent:
{
ModelessDialog *pDlg = new ModelessDialog(NULL);
pDlg->SetOutputSizePixel(Size(100,30));
Edit *pMyEd = new Edit(pDlg,WB_CENTER | WB_BORDER );
pMyEd->SetSizePixel(Size(100,30));
pDlg->SetText(UniString("Schließen", RTL_TEXTENCODING_ISO_8859_1));
pDlg->Show();
pMyEd->Show();
sal_uLong nTime = Time().GetTime();
while (pDlg->IsVisible())
{
pDlg->ToTop();
for (int i = 1 ; i<10 ; i++)
SafeReschedule();
Point Pos = pControl->GetPointerPosPixel();
Size Siz=pControl->GetOutputSizePixel();
if ( Time().GetTime() - nTime > 10 )
{
nTime = Time().GetTime();
pMyEd->SetText(UniString::CreateFromInt32(Pos.X()*100/Siz.Width()).AppendAscii("%x").Append( UniString::CreateFromInt32(Pos.Y()*100/Siz.Height()) ).Append('%'));
}
}
delete pMyEd;
delete pDlg;
}
break;
case M_OpenContextMenu:
{
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
Point aPos;
ToolBox* pTB = (ToolBox*)pControl;
if ( (pControl->GetType() == WINDOW_TOOLBOX) && pTB->IsMenuEnabled() )
{
pTB->ExecuteCustomMenu();
/* Rectangle aRect = pTB->GetMenubuttonRect();
AnimateMouse( pControl, aRect.Center() );
MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
ImplMouseButtonDown( pTB, aMEvnt );*/
}
else
{
sal_Bool bAtMousePos = ( nParams & PARAM_BOOL_1 ) && bBool1;
if ( bAtMousePos )
{
aPos = pControl->GetPointerPosPixel();
Window *pActualWin = pControl->FindWindow( aPos );
if ( pActualWin )
{
aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
// aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
pControl = pActualWin;
}
}
CommandEvent aEvent( aPos, COMMAND_CONTEXTMENU, bAtMousePos );
ImplCommand( pControl, aEvent );
}
}
break;
case M_UseMenu:
{
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
while ( pControl && !( ( pControl->GetType() == WINDOW_SYSWINDOW || pControl->GetType() == WINDOW_WORKWINDOW ) && ControlOK( pControl, "" ) ) )
pControl = pControl->GET_REAL_PARENT();
if ( pControl && ((SystemWindow*)pControl)->GetMenuBar() )
pMenuWindow = ((SystemWindow*)pControl);
else
ReportError( GEN_RES_STR1( S_NO_MENU, MethodString( nMethodId ) ) );
}
break;
case M_FadeIn:
case M_FadeOut:
case M_Pin:
case M_IsFadeIn:
case M_IsPin:
{
WindowAlign aWindowAlign = WINDOWALIGN_LEFT;
if ( (nParams & PARAM_USHORT_1) )
{
switch ( nNr1 )
{
case CONST_ALIGN_LEFT:
aWindowAlign = WINDOWALIGN_LEFT;
break;
case CONST_ALIGN_TOP:
aWindowAlign = WINDOWALIGN_TOP;
break;
case CONST_ALIGN_RIGHT:
aWindowAlign = WINDOWALIGN_RIGHT;
break;
case CONST_ALIGN_BOTTOM:
aWindowAlign = WINDOWALIGN_BOTTOM;
break;
default:
ReportError( aUId, GEN_RES_STR1( S_INVALID_POSITION, MethodString( nMethodId ) ) );
}
}
Window* pTemp = NULL;
while ( !pTemp && pControl )
{
pTemp = GetFadeSplitWin( pControl, aWindowAlign );
pControl = pControl->GET_REAL_PARENT();
}
if ( !pTemp )
{
ReportError( aUId, GEN_RES_STR1( S_SPLITWIN_NOT_FOUND, MethodString( nMethodId ) ) );
break;
}
pControl = pTemp; // So daß wir unten ohne Fehler durchkommen
SplitWindow *pSW = (SplitWindow*) pTemp;
// Rectangle GetAutoHideRect() const;
// Rectangle GetFadeInRect() const;
// Rectangle GetFadeOutRect() const;
switch( nMethodId )
{
case M_FadeIn:
if ( pSW->IsFadeInButtonVisible() )
pSW->FadeIn();
break;
case M_FadeOut:
if ( pSW->IsFadeOutButtonVisible() )
pSW->FadeOut();
break;
case M_Pin:
if ( ( pSW->GetAutoHideState() && bBool1 )
|| ( !pSW->GetAutoHideState() && !bBool1 ) )
{
MouseEvent aMEvnt;
Point aPt( pSW->GetAutoHideRect().Center() );
aMEvnt = MouseEvent( aPt,1,MOUSE_SIMPLECLICK,MOUSE_LEFT );
ImplMouseButtonDown( pControl, aMEvnt, FORCE_DIRECT_CALL );
ImplMouseButtonUp ( pControl, aMEvnt, FORCE_DIRECT_CALL );
}
// pSW->AutoHide();
break;
case M_IsFadeIn:
pRet->GenReturn ( RET_Value, aUId, pSW->IsFadeOutButtonVisible() );
break;
case M_IsPin:
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)!pSW->GetAutoHideState() );
break;
default:
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
}
SendProfile( UIdString( aUId ).Append('.').Append( MethodString( nMethodId ) ) );
}
break;
case M_StatusGetText:
case M_StatusIsProgress:
case M_StatusGetItemCount:
case M_StatusGetItemId:
{
StatusBar *pStatus = NULL;
while ( !pStatus && pControl )
{
pStatus = (StatusBar*)GetWinByRT( pControl, WINDOW_STATUSBAR, sal_True );
pControl = pControl->GET_REAL_PARENT();
}
if ( !pStatus )
{
ReportError( aUId, GEN_RES_STR1( S_NO_STATUSBAR, MethodString( nMethodId ) ) );
break;
}
switch ( nMethodId )
{
case M_StatusGetText:
{
if ( (nParams & PARAM_USHORT_1) )
{
if ( pStatus->AreItemsVisible() )
pRet->GenReturn ( RET_Value, aUId, String(pStatus->GetItemText(nNr1)));
else
ReportError( aUId, GEN_RES_STR1( S_ITEMS_INVISIBLE, MethodString( nMethodId ) ) );
}
else
{
if ( pStatus->AreItemsVisible() )
{
if ( pStatus->GetItemCount() == 1 )
{
pRet->GenReturn ( RET_Value, aUId, pStatus->GetItemText( pStatus->GetItemId(0) ));
}
else
{
pRet->GenReturn ( RET_Value, aUId, String() );
}
}
else
pRet->GenReturn ( RET_Value, aUId, (String)pStatus->GetText() );
}
}
break;
case M_StatusIsProgress:
{
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)pStatus->IsProgressMode() );
}
break;
case M_StatusGetItemCount:
if ( pStatus->AreItemsVisible() )
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pStatus->GetItemCount()));
else
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
break;
case M_StatusGetItemId:
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pStatus->GetItemCount()) )
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pStatus->GetItemId(nNr1-1)));
break;
}
}
break;
case M_HasScrollBar:
case M_IsScrollBarEnabled:
{
if ( (nParams | PARAM_USHORT_1) != PARAM_USHORT_1 ) // so there are other params
{
ReportError( aUId, GEN_RES_STR0( S_INVALID_PARAMETERS ) );
break;
}
if( !(nParams & PARAM_USHORT_1) )
nNr1 = CONST_ALIGN_RIGHT; // default is right Scrollbar(vertical)
if ( (nNr1 != CONST_ALIGN_RIGHT) && (nNr1 != CONST_ALIGN_BOTTOM) )
{
ReportError( aUId, GEN_RES_STR1( S_INVALID_POSITION, MethodString( nMethodId ) ) );
break;
}
ScrollBar *pScroll = NULL;
sal_uInt16 nSteps = 2;
while ( !pScroll && pControl && nSteps-- )
{
pScroll = GetScrollBar( pControl, nNr1, sal_True );
pControl = pControl->GET_REAL_PARENT();
}
switch ( nMethodId )
{
case M_HasScrollBar:
{
if ( pScroll )
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_True );
else
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_False );
}
break;
case M_IsScrollBarEnabled:
{
if ( !pScroll )
{
ReportError( aUId, GEN_RES_STR1( S_NO_SCROLLBAR, MethodString( nMethodId ) ) );
break;
}
pRet->GenReturn ( RET_Value, aUId, pScroll->IsEnabled() );
}
break;
}
}
break;
default:
return sal_False;
}
return sal_True;
}
sal_Bool StatementControl::Execute()
{
Window *pControl;
sal_Bool bStatementDone = sal_True;
if ( IsError )
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Skipping Window: " );
m_pDbgWin->AddText( Id2Str( aUId ) );
m_pDbgWin->AddText( " Method: " );
m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
m_pDbgWin->AddText( "\n" );
#endif
Advance();
delete this;
return sal_True;
}
InitProfile();
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Executing Window: " );
m_pDbgWin->AddText( Id2Str( aUId ) );
m_pDbgWin->AddText( " Method: " );
m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
m_pDbgWin->AddText( "\n" );
#endif
if ( aUId.equals( UID_ACTIVE ) )
pControl = GetAnyActive();
else
{
sal_Bool bSearchButtonOnToolbox = (nParams == PARAM_NONE) && ((M_Click == nMethodId) || (M_TearOff == nMethodId) || (M_IsEnabled == nMethodId) || (M_OpenMenu == nMethodId));
bSearchButtonOnToolbox |= (nParams == PARAM_USHORT_1) && (M_GetState == nMethodId);
if ( nMethodId == M_TypeKeys || nMethodId == M_MouseDown
|| nMethodId == M_MouseUp || nMethodId == M_MouseMove
|| nMethodId == M_SnapShot )
{
pControl = NULL;
if ( /*(nMethodId == M_SnapShot || nMethodId == M_TypeKeys) &&*/ !pControl )
pControl = SearchTree( aUId ,bSearchButtonOnToolbox );
}
else
pControl = SearchTree( aUId ,bSearchButtonOnToolbox );
}
if ( pControl && pControl->GetType() == WINDOW_TOOLBOX )
{
if ( !aUId.equals( pControl->GetUniqueOrHelpId() ) )
{ // Also wenn wir irgendwas auf einer Toolbox gefunden haben
switch ( nMethodId )
{
case M_Click:
case M_TearOff:
case M_OpenMenu:
case M_GetState:
break;
case M_IsEnabled:
nMethodId = _M_IsEnabled; // Umlabeln, da die Behandlung essentiell anders ist!
break;
default:
pControl = NULL;
}
}
}
switch ( nMethodId )
{
case M_Exists:
case M_NotExists:
Time aT;
sal_uInt16 aSeconds = aT.GetMin()*60+aT.GetSec();
if ( !bBool2 ) // wurde im Konstruktor auf sal_False gesetzt
{
bBool2 = sal_True;
nNr2 = aSeconds;
if( !(nParams & PARAM_USHORT_1) )
nNr1 = 0; // defaultmäßig sofort zurück
}
if ( aSeconds < nNr2 ) // Falls die Stunde umgesprungen ist
aSeconds += 60*60;
if ( /* !IsAccessable(pControl)#87019# */ !pControl || !pControl->IsVisible() )
pControl = NULL;
if ( ((nMethodId == M_Exists) && pControl) ||
((nMethodId == M_NotExists) && !pControl) )
{ // Wenn Bedingung erfüllt
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_True );
}
else
if ( aSeconds <= nNr2 + nNr1 ) // Zeit ist noch nicht abgelaufen
return sal_False;
else
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_False );
Advance();
delete this;
return sal_True;
// break;
}
short nRT = 0;
if( pControl ) // Das Fenster Existiert irgendwo, kann aber auch hidden sein!
{
nRT = ImpGetRType( pControl );
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Type is: " );
m_pDbgWin->AddText( String::CreateFromInt32( nRT ) );
m_pDbgWin->AddText( "\n" );
#endif
}
if ( nRT == C_Window && // Search for WorkWindow to satisfy these commands
( nMethodId == M_Close
// || nMethodId == M_Size
// || nMethodId == M_Move
|| nMethodId == M_IsMax
|| nMethodId == M_IsMin
|| nMethodId == M_IsRestore
|| nMethodId == M_Minimize
|| nMethodId == M_Maximize
|| nMethodId == M_Restore ) )
{
Window* pNewControl = pControl;
while ( pNewControl && pNewControl->GetType() != WINDOW_WORKWINDOW )
pNewControl = pNewControl->GET_REAL_PARENT();
if ( pNewControl )
{
pControl = pNewControl;
nRT = C_WorkWin;
}
}
if ( (!ControlOK( pControl, "" )) && ( nMethodId != M_SnapShot ) && (nRetryCount--))
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( CUniString("Reschedule command (").Append( UniString::CreateFromInt32(nRetryCount) ).AppendAscii(")\n") );
#endif
return sal_False;
}
if( ControlOK( pControl, "" ) )
{
if ( nMethodId == M_OpenContextMenu && !bBool2 )
{
pControl->GrabFocus(); // to get asyncron focus on unix
bBool2 = sal_True;
return sal_False;
}
// TODO: handle GetFocus for all Methods and Windows like this (remove part below)
// See for impact of changed focus for HandleVisibleControls() (taking Snapshots might be different, possible exclude those methods)
if (( (nRT == C_TreeListBox) && !bBool2 )
&& nMethodId != M_TypeKeys // TypeKeys macht das selbst, falls eigenes Focushandling gewünscht
&& nMethodId != M_MouseDown
&& nMethodId != M_MouseUp
&& nMethodId != M_MouseMove
/*&& nMethodId != M_MouseDoubleClick*/ )
{
if ( !pControl->HasFocus() )
{
pControl->GrabFocus();
int i = 10;
while ( i-- && !pControl->HasFocus() ) // reschedule a bit
{
SafeReschedule();
if ( !WinPtrValid( pControl ) )
return sal_False;
}
if ( !pControl->HasFocus() ) // to get asyncronous focus
{
bBool2 = sal_True;
return sal_False;
}
}
}
}
Advance();
if ( HandleVisibleControls( pControl ) )
{
delete this;
return sal_True;
}
if( ControlOK( pControl, "Window/Control" ) )
{
if (((( nRT < C_TabPage && nRT > C_TabControl )
|| nRT == C_PatternBox
|| nRT == C_ToolBox
|| nRT == C_ValueSet
|| nRT == C_Control
|| nRT == C_TreeListBox
)
|| nMethodId == M_OpenContextMenu )
&& nMethodId != M_TypeKeys // TypeKeys macht das selbst, falls eigenes Focushandling gewünscht
&& nMethodId != M_MouseDown
&& nMethodId != M_MouseUp
&& nMethodId != M_MouseMove
/*&& nMethodId != M_MouseDoubleClick*/ )
pControl->GrabFocus();
/* leads to problems because settext sets the text whereas typekeys adds to the text.
if ( bDoTypeKeysDelay && nMethodId == M_SetText && ( nParams & PARAM_STR_1 ) )
{ // Hier wird das Statement auf ein TypeKeys umgebogen
nMethodId = M_TypeKeys;
nParams = PARAM_BOOL_1 | PARAM_STR_1;
bBool1 = sal_True;
pControl->GrabFocus();
}
*/
if ( !HandleCommonMethods( pControl ) )
{
switch( nRT )
{
case C_TabControl:
switch( nMethodId )
{
case M_GetPageId:
if ( (nParams & PARAM_USHORT_1) )
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((TabControl*)pControl)->GetPageCount() ) )
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)((TabControl*)pControl)->GetPageId(nNr1-1));
}
else
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)((TabControl*)pControl)->GetCurPageId());
break;
case M_GetPageCount:
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)((TabControl*)pControl)->GetPageCount());
break;
case M_SetPageId:
if (((TabControl*)pControl)->GetCurPageId())
((TabControl*)pControl)->DeactivatePage();
((TabControl*)pControl)->SetCurPageId( nNr1 );
((TabControl*)pControl)->ActivatePage();
break;
case M_SetPageNr:
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((TabControl*)pControl)->GetPageCount() ) )
{
if (((TabControl*)pControl)->GetCurPageId())
((TabControl*)pControl)->DeactivatePage();
((TabControl*)pControl)->SetCurPageId( ((TabControl*)pControl)->GetPageId( nNr1-1 ) );
((TabControl*)pControl)->ActivatePage();
}
break;
case M_GetPage:
pRet->GenReturn ( RET_Value, aUId, Id2Str( ((TabControl*)pControl)->GetTabPage(((TabControl*)pControl)->GetCurPageId())->GetUniqueOrHelpId() ) );
break;
case M_SetPage :
{ // Wegen lokaler Variablen
TabControl *pTControl = ((TabControl*)pControl);
sal_uInt16 nActive = pTControl->GetCurPageId();
sal_uInt16 i,anz;
rtl::OString aID;
rtl::OString aWantedID;
//HELPID BACKWARD (No numbers please (remove PARAM_ULONG_1 part)
if ( (nParams & PARAM_ULONG_1) )
{
//aWantedID = rtl::OString( nLNr1 );
ReportError( aUId, GEN_RES_STR1c( S_INTERNAL_ERROR, "using numeric HelpID from old Testtool" ) );
}
else if ( (nParams & PARAM_STR_1) )
{
aWantedID = Str2Id( aString1 );
}
else
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
i = pTControl->GetPagePos( pTControl->GetCurPageId() );
for ( anz=0 ; anz < pTControl->GetPageCount() && !aID.equals( aWantedID ) ; anz++ )
{
pTControl->SelectTabPage( pTControl->GetPageId(i) );
/*if (pTControl->GetCurPageId())
pTControl->DeactivatePage();
pTControl->SetCurPageId( pTControl->GetPageId(i) );
pTControl->ActivatePage();*/
aID = pTControl->GetTabPage(pTControl->GetCurPageId())->GetUniqueOrHelpId();
i++;
if ( i >= pTControl->GetPageCount() )
i = 0;
if ( !MaybeDoTypeKeysDelay( pTControl ) || !MaybeDoTypeKeysDelay( pTControl ) || !MaybeDoTypeKeysDelay( pTControl ) ) // 3 Mal aufrufen
break;
}
if ( !aID.equals( aWantedID ) )
{
pTControl->SelectTabPage( nActive );
/*if (pTControl->GetCurPageId())
pTControl->DeactivatePage();
pTControl->SetCurPageId( nActive );
pTControl->ActivatePage();*/
ReportError( aWantedID, GEN_RES_STR1( S_TABPAGE_NOT_FOUND, MethodString( nMethodId ) ) );
}
}
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TabControl" ) );
break;
}
break;
case C_RadioButton:
case C_ImageRadioButton:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteLinks);
break;
case M_IsChecked :
pRet->GenReturn ( RET_Value, aUId, ((RadioButton*)pControl)->IsChecked());
break;
case M_Check :
((RadioButton*)pControl)->Check();
((RadioButton*)pControl)->Click();
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "RadioButton" ) );
break;
}
break;
case C_CheckBox:
case C_TriStateBox:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteLinks);
break;
case M_IsChecked :
pRet->GenReturn ( RET_Value, aUId, comm_BOOL( ((TriStateBox*)pControl)->GetState() == STATE_CHECK) );
break;
case M_IsTristate :
pRet->GenReturn ( RET_Value, aUId, comm_BOOL( ((TriStateBox*)pControl)->GetState() == STATE_DONTKNOW) );
break;
case M_GetState :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((TriStateBox*)pControl)->GetState()));
break;
case M_Check :
((TriStateBox*)pControl)->SetState( STATE_CHECK );
((TriStateBox*)pControl)->Click();
break;
case M_UnCheck :
((TriStateBox*)pControl)->SetState( STATE_NOCHECK );
((TriStateBox*)pControl)->Click();
break;
case M_TriState :
if ( ((TriStateBox*)pControl)->IsTriStateEnabled() )
{
((TriStateBox*)pControl)->SetState( STATE_DONTKNOW );
((TriStateBox*)pControl)->Click();
}
else
{
ReportError( aUId, GEN_RES_STR0( S_TRISTATE_NOT_ALLOWED ) );
}
break;
case M_Click :
{
TriStateBox *pTB = ((TriStateBox*)pControl);
if ( pTB->GetState() == STATE_NOCHECK )
pTB->SetState( STATE_CHECK );
else if ( pTB->GetState() == STATE_CHECK )
{
if ( pTB->IsTriStateEnabled() )
pTB->SetState( STATE_DONTKNOW );
else
pTB->SetState( STATE_NOCHECK );
}
else
pTB->SetState( STATE_NOCHECK );
pTB->Click();
}
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TriStateBox" ) );
break;
}
break;
case C_Edit:
case C_MultiLineEdit:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, Mitte);
break;
case M_GetText :
pRet->GenReturn ( RET_Value, aUId, ((Edit*)pControl)->GetText());
break;
case M_IsWritable:
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((Edit*)pControl)->IsReadOnly() );
break;
default:
if ( ! ((Edit*)pControl)->IsReadOnly() )
{
switch( nMethodId )
{
case M_SetText :
((Edit*)pControl)->SetText( aString1 );
if ( nRT == C_MultiLineEdit ) // since SetModifyFlag is not virtual we have to do this
((MultiLineEdit*)pControl)->SetModifyFlag();
else
((Edit*)pControl)->SetModifyFlag();
((Edit*)pControl)->Modify();
if ( ((Edit*)pControl)->GetText().CompareTo(aString1) != COMPARE_EQUAL )
ReportError( aUId, GEN_RES_STR1( S_ERROR_IN_SET_TEXT, MethodString( nMethodId ) ) );
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "(MultiLine)Edit" ) );
break;
}
}
else
ReportError( aUId, GEN_RES_STR1c( S_ATTEMPT_TO_WRITE_READONLY, "(MultiLine)Edit" ) );
}
break;
case C_MultiListBox:
case C_ListBox:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
case M_GetSelCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ListBox*)pControl)->GetSelectEntryCount()));
break;
case M_GetSelIndex :
if ( ! (nParams & PARAM_USHORT_1) )
{
if ( ((ListBox*)pControl)->GetSelectEntryCount() == 0 )
{
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
break;
}
nNr1 = 1;
}
ValueOK(aUId, MethodString( nMethodId ),nNr1,((ListBox*)pControl)->GetSelectEntryCount());
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ListBox*)pControl)->GetSelectEntryPos(nNr1-1)) +1);
break;
case M_GetSelText :
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
pRet->GenReturn ( RET_Value, aUId, ((ListBox*)pControl)->GetSelectEntry(nNr1-1));
break;
case M_GetItemCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ListBox*)pControl)->GetEntryCount()));
break;
case M_GetItemText :
pRet->GenReturn ( RET_Value, aUId, ((ListBox*)pControl)->GetEntry(nNr1-1));
break;
case M_Select:
case M_MultiSelect:
{
sal_Bool bUnselectBeforeSelect = ( nMethodId == M_Select );
sal_Bool bFehler = sal_False;
if ( ! (nParams & PARAM_BOOL_1) )
bBool1 = sal_True;
if ( nMethodId == M_MultiSelect && nRT == C_ListBox )
{
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ListBox" ) );
bFehler = sal_True;
}
if ( !bBool1 && nMethodId == M_Select )
{
ReportError( aUId, GEN_RES_STR1( S_NO_SELECT_FALSE, MethodString( nMethodId ) ) );
bFehler = sal_True;
}
if ( !bFehler )
{
if( nParams & PARAM_STR_1 )
{
ListBox *pLB = ((ListBox*)pControl);
sal_uInt16 nPos;
if ( (nPos = pLB->GetEntryPos( aString1 )) == LISTBOX_ENTRY_NOTFOUND )
ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
else
{
if ( bUnselectBeforeSelect )
pLB->SetNoSelection();
pLB->SelectEntryPos( nPos, bBool1 );
if ( pLB->IsEntryPosSelected( nPos ) ? !bBool1 : bBool1 ) // XOR rein mit BOOL
ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), aString1 ) );
}
}
else
{
ListBox *pLB = ((ListBox*)pControl);
pLB = static_cast<ListBox*>(pControl);
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pLB->GetEntryCount()) )
{
if ( bUnselectBeforeSelect )
pLB->SetNoSelection();
pLB->SelectEntryPos( nNr1-1, bBool1 );
if ( pLB->IsEntryPosSelected( nNr1-1 ) ? !bBool1 : bBool1 ) // XOR rein mit BOOL
ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), UniString::CreateFromInt32( nNr1 ) ) );
}
}
((ListBox*)pControl)->Select();
}
}
break;
case M_SetNoSelection :
((ListBox*)pControl)->SetNoSelection();
((ListBox*)pControl)->Select();
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "(Multi)ListBox" ) );
break;
}
break;
case C_ComboBox:
case C_PatternBox:
case C_NumericBox:
case C_MetricBox:
case C_CurrencyBox:
case C_DateBox:
case C_TimeBox:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
case M_GetSelText :
pRet->GenReturn ( RET_Value, aUId, ((ComboBox*)pControl)->GetText());
break;
case M_GetSelIndex :
{
sal_uInt16 nPos = ((ComboBox*)pControl)->GetEntryPos(((ComboBox*)pControl)->GetText());
if ( nPos == COMBOBOX_ENTRY_NOTFOUND )
nPos = 0;
else
nPos++;
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG) nPos);
}
break;
case M_GetItemCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ComboBox*)pControl)->GetEntryCount()));
break;
case M_GetItemText :
pRet->GenReturn ( RET_Value, aUId, ((ComboBox*)pControl)->GetEntry(nNr1-1));
break;
case M_IsWritable:
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((ComboBox*)pControl)->IsReadOnly() );
break;
case M_Select :
if( nParams & PARAM_USHORT_1 )
{
if ( !ValueOK(aUId, MethodString( nMethodId ),nNr1,((ComboBox*)pControl)->GetEntryCount()) )
break;
aString1 = ((ComboBox*)pControl)->GetEntry(nNr1-1);
}
else
{
if ( ((ComboBox*)pControl)->GetEntryPos( aString1 ) == COMBOBOX_ENTRY_NOTFOUND )
{
ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
break;
}
}
((ComboBox*)pControl)->SetText( aString1 );
((ComboBox*)pControl)->SetModifyFlag();
((ComboBox*)pControl)->Modify();
break;
case M_SetText :
if ( ! ((ComboBox*)pControl)->IsReadOnly() )
{
if ( ! (nParams & PARAM_STR_1) )
aString1 = String();
((ComboBox*)pControl)->SetText( aString1 );
((ComboBox*)pControl)->SetModifyFlag();
((ComboBox*)pControl)->Modify();
}
else
ReportError( aUId, GEN_RES_STR1c( S_ATTEMPT_TO_WRITE_READONLY, "ComboBox" ) );
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ComboBox" ) );
break;
}
break;
case C_PushButton:
case C_OkButton:
case C_CancelButton:
case C_ImageButton:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, Mitte);
break;
case M_Click :
((PushButton*)pControl)->Click();
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "PushButton" ) );
break;
}
break;
case C_MoreButton:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, Mitte);
break;
case M_IsOpen :
pRet->GenReturn ( RET_Value, aUId, ((MoreButton*)pControl)->GetState());
break;
case M_Click :
((MoreButton*)pControl)->Click();
break;
case M_Open :
((MoreButton*)pControl)->SetState(sal_True);
break;
case M_Close :
((MoreButton*)pControl)->SetState(sal_False);
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MoreButton" ) );
break;
}
break;
case C_SpinField:
case C_PatternField:
case C_NumericField:
case C_MetricField:
case C_CurrencyField:
case C_DateField:
case C_TimeField:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, Mitte);
break;
case M_GetText :
pRet->GenReturn ( RET_Value, aUId, ((SpinField*)pControl)->GetText());
break;
case M_IsWritable:
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((SpinField*)pControl)->IsReadOnly() );
break;
case M_SetText :
if ( ! ((SpinField*)pControl)->IsReadOnly() )
{
((SpinField*)pControl)->SetText( aString1 );
((SpinField*)pControl)->SetModifyFlag();
((SpinField*)pControl)->Modify();
}
else
ReportError( aUId, GEN_RES_STR1c( S_ATTEMPT_TO_WRITE_READONLY, "SpinField" ) );
break;
case M_More :
{
if ( !(nParams & PARAM_USHORT_1) )
nNr1 = 1;
for (int i = 1; i<= nNr1; i++)
{
((SpinField*)pControl)->Up();
((SpinField*)pControl)->SetModifyFlag();
((SpinField*)pControl)->Modify();
}
}
break;
case M_Less :
{
if ( !(nParams & PARAM_USHORT_1) )
nNr1 = 1;
for (int i = 1; i<= nNr1; i++)
{
((SpinField*)pControl)->Down();
((SpinField*)pControl)->SetModifyFlag();
((SpinField*)pControl)->Modify();
}
}
break;
case M_ToMin :
((SpinField*)pControl)->First();
((SpinField*)pControl)->SetModifyFlag();
((SpinField*)pControl)->Modify();
break;
case M_ToMax :
((SpinField*)pControl)->Last();
((SpinField*)pControl)->SetModifyFlag();
((SpinField*)pControl)->Modify();
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "SpinField" ) );
break;
}
break;
case C_MenuButton:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, Mitte);
break;
case M_Click :
{
MouseEvent aMEvnt;
Point aPt( pControl->GetSizePixel().Width() / 2, pControl->GetSizePixel().Height() / 2 );
aMEvnt = MouseEvent( aPt,1,MOUSE_SIMPLECLICK,MOUSE_LEFT );
ImplMouseButtonDown( pControl, aMEvnt, FORCE_DIRECT_CALL );
ImplMouseButtonUp ( pControl, aMEvnt, FORCE_DIRECT_CALL );
}
break;
case M_Open :
case M_OpenMenu :
{
MouseEvent aMEvnt;
Point aPt( pControl->GetSizePixel().Width() / 2, pControl->GetSizePixel().Height() / 2 );
aMEvnt = MouseEvent( aPt,1,MOUSE_SIMPLECLICK,MOUSE_LEFT );
ImplMouseButtonDown( pControl, aMEvnt, FORCE_DIRECT_CALL );
sal_uLong nStart = Time::GetSystemTicks();
sal_uLong nDelay = pControl->GetSettings().GetMouseSettings().GetActionDelay();
while ( ( Time::GetSystemTicks() - nStart ) < nDelay + 100 )
SafeReschedule();
ImplMouseButtonUp ( pControl, aMEvnt, FORCE_DIRECT_CALL );
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
}
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MenuButton" ) );
break;
}
break;
case C_ToolBox:
{
ToolBox *pTB = ((ToolBox*)pControl);
if ( !aUId.equals( pTB->GetUniqueOrHelpId() ) ) // So we found a Button on the ToolBox
{
if ( (nParams == PARAM_NONE) || (nParams == PARAM_USHORT_1) )
{ // Wir fälschen einen Parameter
nParams |= PARAM_STR_1;
aString1 = Id2Str( aUId );
}
else
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
}
#define FIND_ITEM\
sal_uInt16 nItemPos = 0;\
sal_Bool bItemFound = sal_False;\
{\
rtl::OString aButtonId;\
if( nParams & PARAM_STR_1 )\
aButtonId = Str2Id( aString1 );\
else\
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );\
for ( nItemPos = 0; nItemPos < pTB->GetItemCount() && !aButtonId.equals(Str2Id( pTB->GetItemCommand(pTB->GetItemId(nItemPos)) )) &&\
!aButtonId.equals(pTB->GetHelpId(pTB->GetItemId(nItemPos))) ; nItemPos++ ) {}\
bItemFound = aButtonId.equals(Str2Id( pTB->GetItemCommand(pTB->GetItemId(nItemPos)) )) || aButtonId.equals(pTB->GetHelpId(pTB->GetItemId(nItemPos)));\
if ( !bItemFound )\
ReportError( aUId, GEN_RES_STR1( S_HELPID_ON_TOOLBOX_NOT_FOUND, MethodString( nMethodId ) ) );\
else\
{\
if ( !pTB->IsItemEnabled( pTB->GetItemId(nItemPos) ) && nMethodId != _M_IsEnabled && nMethodId != M_GetState )\
{\
ReportError( aUId, GEN_RES_STR1( S_BUTTON_DISABLED_ON_TOOLBOX, MethodString( nMethodId ) ) );\
bItemFound = sal_False;\
}\
else if ( !pTB->IsItemVisible( pTB->GetItemId(nItemPos) ) && nMethodId != M_GetState )\
{\
ReportError( aUId, GEN_RES_STR1( S_BUTTON_HIDDEN_ON_TOOLBOX, MethodString( nMethodId ) ) );\
bItemFound = sal_False;\
}\
else\
{\
if ( pTB->IsMenuEnabled() )\
{ /* button is in Menu */\
}\
else\
{ /* Try the multi line way */\
if ( pTB->GetItemRect(pTB->GetItemId(nItemPos)).IsEmpty() )\
{\
sal_uInt16 nLine = pTB->GetCurLine();\
do\
{\
pTB->ShowLine( sal_False );\
for ( int i = 1 ; i < 30 ; i++ )\
SafeReschedule();\
}\
while ( pTB->GetCurLine() != nLine && pTB->GetItemRect(pTB->GetItemId(nItemPos)).IsEmpty() );\
pTB->Invalidate( pTB->GetScrollRect() );\
}\
if ( pTB->GetItemRect(pTB->GetItemId(nItemPos)).IsEmpty() )\
{\
ReportError( aUId, GEN_RES_STR1( S_CANNOT_MAKE_BUTTON_VISIBLE_IN_TOOLBOX, MethodString( nMethodId ) ) );\
bItemFound = sal_False;\
}\
}\
}\
}\
}
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteLinks);
break;
case M_Click :
{
FIND_ITEM;
if ( bItemFound ) // FIND_ITEM Erfolgreich
{
Rectangle aRect = pTB->GetItemRect(pTB->GetItemId(nItemPos));
if ( aRect.IsEmpty() )
{
pTB->ExecuteCustomMenu();
/* aRect = pTB->GetMenubuttonRect();
MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
ImplMouseButtonDown( pTB, aMEvnt );*/
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
new StatementCommand( this, RC_MenuSelect, PARAM_USHORT_1, pTB->GetItemId(nItemPos) + TOOLBOX_MENUITEM_START );
}
else
{
aRect = pTB->GetItemRect(pTB->GetItemId(nItemPos));
MouseEvent aMEvnt;
aMEvnt = MouseEvent(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
ImplMouseButtonDown( pTB, aMEvnt, FORCE_DIRECT_CALL );
ImplMouseButtonUp ( pTB, aMEvnt, FORCE_DIRECT_CALL );
}
}
}
break;
case M_TearOff :
{
FIND_ITEM;
if ( bItemFound ) // FIND_ITEM Erfolgreich
{
Rectangle aRect = pTB->GetItemPosDropDownRect( nItemPos );
AnimateMouse( pControl, aRect.Center() );
MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
ImplMouseButtonDown( pTB, aMEvnt, FORCE_DIRECT_CALL );
Window *pWin = NULL;
// Wait for the window to open.
StatementList::bExecuting = sal_True; // Bah ist das ein ekliger Hack
{ // Das verhindert, daß schon der nächste Befehl ausgeführt wird.
Time aDelay;
while ( !pWin && ( (pWin = GetPopupFloatingWin()) == NULL ) && ( Time() - aDelay ).GetSec() < 15 )
SafeReschedule();
}
StatementList::bExecuting = sal_False; // Bah ist das ein ekliger Hack
if ( pWin && pWin->GetType() == WINDOW_FLOATINGWINDOW )
{
aMEvnt = MouseEvent(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
ImplMouseButtonUp( pTB, aMEvnt, FORCE_DIRECT_CALL );
((FloatingWindow*)pWin)->EndPopupMode( FLOATWIN_POPUPMODEEND_TEAROFF );
}
else
{
aMEvnt = MouseEvent(Point(1,-10), 1, MOUSE_SIMPLECLICK,MOUSE_LEFT);
ImplMouseButtonUp( pTB, aMEvnt, FORCE_DIRECT_CALL );
ReportError( aUId, GEN_RES_STR1( S_TEAROFF_FAILED, MethodString( nMethodId ) ) );
}
}
}
break;
case M_OpenMenu :
{
FIND_ITEM;
if ( bItemFound ) // FIND_ITEM Erfolgreich
{
Rectangle aRect = pTB->GetItemPosDropDownRect( nItemPos );
AnimateMouse( pControl, aRect.Center() );
MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
ImplMouseButtonDown( pTB, aMEvnt);
ImplMouseButtonUp( pTB, aMEvnt);
// Das Fenster ist offen.
aSubMenuId1 = 0;
aSubMenuId2 = 0;
aSubMenuId3 = 0;
pMenuWindow = NULL;
}
}
break;
case _M_IsEnabled:
{
FIND_ITEM;
if ( bItemFound ) // FIND_ITEM Erfolgreich
{
pRet->GenReturn ( RET_Value, aUId, pTB->IsItemEnabled( pTB->GetItemId(nItemPos) ) );
}
}
break;
case M_GetState :
{
FIND_ITEM;
if ( bItemFound ) // FIND_ITEM Erfolgreich
{
if ( ValueOK( aUId, CUniString("GetState"), nNr1, 4 ) )
switch (nNr1)
{
case 0:
pRet->GenReturn ( RET_Value, aUId, Id2Str( pTB->GetHelpId(pTB->GetItemId(nItemPos)) ) );
break;
case 1:
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemType(nItemPos));
break;
case 2:
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemState(pTB->GetItemId(nItemPos)));
break;
case 3:
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemId(nItemPos));
break;
case 11:
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG) nItemPos + 1);
break;
case 12:
pRet->GenReturn ( RET_Value, aUId, Id2Str(pTB->GetHelpId())); // The toolbox's help id
break;
case 13:
{
Rectangle aRect = pTB->GetItemPosRect( nItemPos );
Rectangle aTBRect = pTB->GetWindowExtentsRelative( NULL );
pRet->GenReturn ( RET_Value, aUId,
UniString::CreateFromInt32(aRect.Left()+aTBRect.Left()).
AppendAscii(",").Append(UniString::CreateFromInt32(aRect.Top()+aTBRect.Top())).
AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetWidth())).
AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetHeight()))
);
break;
}
default:
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
break;
}
}
}
break;
case M_GetItemHelpText :
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTB->GetItemCount() ))
pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetHelpText(pTB->GetItemId(nNr1-1)));
break;
case M_GetItemQuickHelpText :
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTB->GetItemCount() ))
pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetQuickHelpText(pTB->GetItemId(nNr1-1)));
break;
case M_GetItemText2:
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTB->GetItemCount() ))
pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetItemText(pTB->GetItemId(nNr1-1)));
break;
case M_GetItemText :
pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetItemText(nNr1));
break;
case M_GetText :
pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetText());
break;
case M_GetItemCount :
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemCount());
break;
case M_SetNextToolBox :
if ( (nParams & PARAM_STR_1) )
pTB->SetNextToolBox( aString1 );
else
pTB->SetNextToolBox( pTB->GetNextToolBox() );
pTB->NextToolBox();
break;
case M_GetNextToolBox :
pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetNextToolBox());
break;
case M_Dock :
case M_Undock :
case M_IsDocked :
case M_Close:
case M_Size:
case M_Move:
case M_IsMax:
case M_Minimize:
case M_Maximize:
case M_Help: // Alles was unten weiterbehandelt werden soll
goto DockingWin;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ToolBox" ) );
break;
}
}
break;
case C_TreeListBox:
switch( nMethodId )
{
#define GET_NTH_ENTRY_LBOX( First, Next, Anzahl) \
SvLBoxEntry *pThisEntry = ((SvTreeListBox*)pControl)->First(); \
{ \
int niTemp = Anzahl; \
while ( niTemp-- ) \
{ \
pThisEntry = ((SvTreeListBox*)pControl)->Next( pThisEntry ); \
} \
}
case M_GetText : // Get the first text of the given (default=1) line
{ // should get removed some time
SvTreeListBox *pTree = (SvTreeListBox*)pControl;
SvLBoxEntry *pThisEntry = pTree->GetCurEntry();
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
if ( pThisEntry )
{
SvLBoxString* pItem = NULL;
sal_uInt16 nValidTextItemCount = 0;
{
sal_uInt16 nIndex = 0;
SvLBoxItem *pMyItem;
while ( ( nValidTextItemCount < nNr1 ) && nIndex < pThisEntry->ItemCount() )
{
pMyItem = pThisEntry->GetItem( nIndex );
if ( pMyItem->IsA() == SV_ITEM_ID_LBOXSTRING )
{
pItem = (SvLBoxString*)pMyItem;
nValidTextItemCount++;
}
nIndex++;
}
}
if ( ValueOK( aUId, CUniString("GetText"), nNr1, nValidTextItemCount ) )
pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
}
else
ReportError( aUId, GEN_RES_STR2c2( S_NO_SELECTED_ENTRY, MethodString( nMethodId ), "TreeListBox" ) );
}
break;
case M_GetSelCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetSelectionCount()));
break;
case M_GetItemCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetVisibleCount()) );
break;
case M_GetSelIndex :
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
if ( ValueOK(aUId, CUniString("GetSelIndex"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
{
nNr1--;
GET_NTH_ENTRY_LBOX( FirstSelected, NextSelected, nNr1);
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( ((SvTreeListBox*)pControl)->GetVisiblePos( pThisEntry )) +1 );
}
break;
case M_Select :
if ( ! (nParams & PARAM_BOOL_1) )
bBool1 = sal_True;
if( nParams & PARAM_STR_1 )
{
/* ListBox *pLB = ((ListBox*)pControl);
if ( pLB->GetEntryPos( aString1 ) == LISTBOX_ENTRY_NOTFOUND )
ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
else
{
pLB->SelectEntry( aString1, bBool1 );
if ( pLB->IsEntrySelected( aString1 ) ? !bBool1 : bBool1 ) // XOR rein mit BOOL
ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), aString1 ) );
}
*/ ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
}
else
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
((SvTreeListBox*)pControl)->Select ( pEntry, bBool1 );
}
}
break;
case M_Collapse :
if( nParams & PARAM_STR_1 )
{
ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
}
else
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
((SvTreeListBox*)pControl)->Collapse ( pEntry );
}
}
break;
case M_Expand :
if( nParams & PARAM_STR_1 )
{
ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
}
else
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
((SvTreeListBox*)pControl)->Expand ( pEntry );
}
}
break;
case M_GetSelText :
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
if ( ! (nParams & PARAM_USHORT_2) )
nNr2 = 1;
if ( ValueOK(aUId, CUniString("GetSelText"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
{
nNr1--;
GET_NTH_ENTRY_LBOX( FirstSelected, NextSelected, nNr1);
if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
{
SvLBoxString* pItem = NULL;
if ( ! (nParams & PARAM_USHORT_2) )
pItem = (SvLBoxString*)pThisEntry->GetFirstItem( SV_ITEM_ID_LBOXSTRING );
else
{
SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
if ( pMyItem->IsA() == SV_ITEM_ID_LBOXSTRING )
pItem = (SvLBoxString*)pMyItem;
}
if ( pItem )
pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
else
ReportError( aUId, GEN_RES_STR1( S_NO_LIST_BOX_STRING, MethodString( nMethodId ) ) );
}
}
break;
case M_GetItemText :
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
SvLBoxEntry *pThisEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
if ( ! (nParams & PARAM_USHORT_2) )
nNr2 = 1;
if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
{
SvLBoxString* pItem = NULL;
if ( ! (nParams & PARAM_USHORT_2) )
pItem = (SvLBoxString*)pThisEntry->GetFirstItem( SV_ITEM_ID_LBOXSTRING );
else
{
SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
if ( pMyItem->IsA() == SV_ITEM_ID_LBOXSTRING )
pItem = (SvLBoxString*)pMyItem;
}
if ( pItem )
pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
else
ReportError( aUId, GEN_RES_STR1( S_NO_LIST_BOX_STRING, MethodString( nMethodId ) ) );
}
}
break;
case M_IsChecked :
case M_IsTristate :
case M_GetState :
case M_Check :
case M_UnCheck :
case M_TriState :
{
SvTreeListBox *pTree = (SvTreeListBox*)pControl;
SvLBoxEntry *pThisEntry = NULL;
if ( ! (nParams & PARAM_USHORT_1) )
{
pThisEntry = pTree->GetCurEntry();
if ( !pThisEntry )
ReportError( aUId, GEN_RES_STR2c2( S_NO_SELECTED_ENTRY, MethodString( nMethodId ), "TreeListBox" ) );
}
else
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
pThisEntry = (SvLBoxEntry*)pTree->GetEntryAtVisPos( nNr1-1 );
}
}
if ( ! (nParams & PARAM_USHORT_2) )
nNr2 = 1;
if ( pThisEntry )
{
if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
{
SvLBoxButton* pItem = NULL;
if ( ! (nParams & PARAM_USHORT_2) )
pItem = (SvLBoxButton*)pThisEntry->GetFirstItem( SV_ITEM_ID_LBOXBUTTON );
else
{
SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
if ( pMyItem->IsA() == SV_ITEM_ID_LBOXBUTTON )
pItem = (SvLBoxButton*)pMyItem;
}
if ( pItem )
{
switch( nMethodId )
{
case M_IsChecked :
pRet->GenReturn ( RET_Value, aUId, comm_BOOL( pItem->IsStateChecked() ) );
break;
case M_IsTristate :
pRet->GenReturn ( RET_Value, aUId, comm_BOOL( pItem->IsStateTristate() ) );
break;
case M_GetState :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pItem->GetButtonFlags() & ~SV_STATE_MASK ));
break;
case M_Check :
if ( !pItem->IsStateChecked() )
{
pItem->SetStateChecked();
pTree->CheckButtonHdl();
pTree->InvalidateEntry( pThisEntry );
}
break;
case M_UnCheck :
if ( pItem->IsStateChecked() || pItem->IsStateTristate() )
{
pItem->SetStateUnchecked();
pTree->CheckButtonHdl();
pTree->InvalidateEntry( pThisEntry );
}
break;
case M_TriState :
if ( !pItem->IsStateTristate() )
{
pItem->SetStateTristate();
pTree->CheckButtonHdl();
pTree->InvalidateEntry( pThisEntry );
}
break;
default:
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
break;
}
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_LIST_BOX_BUTTON, MethodString( nMethodId ) ) );
}
}
}
break;
case M_GetItemType :
{
SvTreeListBox *pTree = (SvTreeListBox*)pControl;
SvLBoxEntry *pThisEntry = NULL;
if ( ! (nParams & PARAM_USHORT_1) )
{
pThisEntry = pTree->GetCurEntry();
if ( !pThisEntry )
ReportError( aUId, GEN_RES_STR2c2( S_NO_SELECTED_ENTRY, MethodString( nMethodId ), "TreeListBox" ) );
}
else
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
pThisEntry = (SvLBoxEntry*)pTree->GetEntryAtVisPos( nNr1-1 );
}
}
if ( pThisEntry )
{
if ( ! (nParams & PARAM_USHORT_2) )
nNr2 = 1;
if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
{
SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
comm_USHORT nType;
switch ( pMyItem->IsA() )
{
case SV_ITEM_ID_LBOXSTRING: nType = CONST_ItemTypeText ; break;
case SV_ITEM_ID_LBOXBMP: nType = CONST_ItemTypeBMP ; break;
case SV_ITEM_ID_LBOXBUTTON: nType = CONST_ItemTypeCheckbox ; break;
case SV_ITEM_ID_LBOXCONTEXTBMP: nType = CONST_ItemTypeContextBMP ; break;
default: nType = CONST_ItemTypeUnknown;
}
pRet->GenReturn ( RET_Value, aUId, nType );
}
}
}
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TreeListBox" ) );
break;
}
break;
case C_Control:
{
sal_uInt16 nRealControlType = 0;
if ( dynamic_cast< EditBrowseBox* >(pControl) )
nRealControlType = CONST_CTBrowseBox;
else if ( dynamic_cast< ValueSet* >(pControl) )
nRealControlType = CONST_CTValueSet;
else if ( dynamic_cast< ORoadmap* >(pControl) )
nRealControlType = CONST_CTORoadmap;
else if ( dynamic_cast< IExtensionListBox* >(pControl) )
nRealControlType = CONST_CTIExtensionListBox;
else if ( dynamic_cast< ::svt::table::TableControl* >(pControl) )
nRealControlType = CONST_CTTableControl;
else
nRealControlType = CONST_CTUnknown;
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
default:
switch( nRealControlType )
{
case CONST_CTBrowseBox:
{
EditBrowseBox* pEBBox = dynamic_cast< EditBrowseBox* >(pControl);
switch( nMethodId )
{
/*
sal_Bool MakeFieldVisible( long nRow, sal_uInt16 nColId, sal_Bool bComplete = sal_False );
// access to dynamic values of cursor row
String GetColumnTitle( sal_uInt16 nColumnId ) const;
sal_uInt16 GetColumnId( sal_uInt16 nPos ) const;
sal_uInt16 GetColumnPos( sal_uInt16 nColumnId ) const;
// access and movement of cursor
long GetCurRow() const { return nCurRow; }
sal_uInt16 GetCurColumnId() const { return nCurColId; }
sal_Bool GoToRow( long nRow );
sal_Bool GoToRowAndDoNotModifySelection( long nRow );
sal_Bool GoToColumnId( sal_uInt16 nColId );
sal_Bool GoToRowColumnId( long nRow, sal_uInt16 nColId );
// selections
void SetNoSelection();
void SelectAll();
void SelectRow( long nRow, sal_Bool bSelect = sal_True, sal_Bool bExpand = sal_True );
void SelectColumnPos( sal_uInt16 nCol, sal_Bool bSelect = sal_True )
{ SelectColumnPos( nCol, bSelect, sal_True); }
void SelectColumnId( sal_uInt16 nColId, sal_Bool bSelect = sal_True )
{ SelectColumnPos( GetColumnPos(nColId), bSelect, sal_True); }
long GetSelectRowCount() const;
sal_uInt16 GetSelectColumnCount() const;
sal_Bool IsRowSelected( long nRow ) const;
sal_Bool IsColumnSelected( sal_uInt16 nColumnId ) const;
long FirstSelectedRow( sal_Bool bInverse = sal_False );
long LastSelectedRow( sal_Bool bInverse = sal_False );
long PrevSelectedRow();
long NextSelectedRow();
const MultiSelection* GetSelection() const
{ return bMultiSelection ? uRow.pSel : 0; }
void SetSelection( const MultiSelection &rSelection );
virtual String GetCellText(long _nRow, sal_uInt16 _nColId) const;
sal_uInt16 GetColumnCount() const { return ColCount(); }
protected:
virtual long GetRowCount() const;
EditBrowseBox
sal_Bool IsEditing() const {return aController.Is();}
void InvalidateStatusCell(long nRow) {RowModified(nRow, 0);}
void InvalidateHandleColumn();
CellControllerRef Controller() const { return aController; }
sal_Int32 GetBrowserFlags() const { return m_nBrowserFlags; }
virtual void ActivateCell(long nRow, sal_uInt16 nCol, sal_Bool bSetCellFocus = sal_True);
virtual void DeactivateCell(sal_Bool bUpdate = sal_True);
*/
case M_GetSelText :
{
pRet->GenReturn ( RET_Value, aUId, pEBBox->GetCellText( pEBBox->GetCurrRow(), pEBBox->GetColumnId( pEBBox->GetCurrColumn() )));
}
break;
case M_GetColumnCount :
{
sal_uInt16 nColCount = pEBBox->GetColumnCount();
comm_USHORT nUnfrozenColCount = 0;
sal_uInt16 i;
for ( i=0 ; i < nColCount ; i++ )
{
if ( !pEBBox->IsFrozen( pEBBox->GetColumnId( i ) ) )
nUnfrozenColCount++;
}
pRet->GenReturn ( RET_Value, aUId, nUnfrozenColCount );
}
break;
case M_GetRowCount :
{
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pEBBox->GetRowCount() );
}
break;
case M_IsEditing :
{
CellControllerRef aControler;
aControler = pEBBox->Controller();
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)aControler.Is() );
}
break;
case M_Select :
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pEBBox->GetRowCount() ) )
{
sal_uInt16 nColCount = pEBBox->GetColumnCount();
comm_USHORT nUnfrozenColCount = 0;
sal_uInt16 i;
for ( i=0 ; i < nColCount ; i++ )
{
if ( !pEBBox->IsFrozen( pEBBox->GetColumnId( i ) ) )
nUnfrozenColCount++;
}
if ( ValueOK(aUId, MethodString( nMethodId ),nNr2,nUnfrozenColCount ) )
pEBBox->GoToRowColumnId( nNr1-1, pEBBox->GetColumnId( nNr2 ) );
}
}
break;
/*
case M_GetSelCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetSelectionCount()));
break;
case M_GetSelIndex :
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
if ( ValueOK(aUId, CUniString("GetSelIndex"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
{
nNr1--;
COUNT_LBOX( FirstSelected, NextSelected, nNr1);
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( ((SvTreeListBox*)pControl)->GetVisiblePos( pThisEntry )) +1 );
}
break;
case M_GetSelText :
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
if ( ValueOK(aUId, CUniString("GetSelText"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
{
nNr1--;
COUNT_LBOX( FirstSelected, NextSelected, nNr1);
GetFirstValidTextItem( pThisEntry );
pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
}
break;
case M_GetItemCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetVisibleCount()) );
break;
case M_GetItemText :
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
GetFirstValidTextItem( pEntry );
pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
}
break;
case M_Select :
if ( ! (nParams & PARAM_BOOL_1) )
bBool1 = sal_True;
if( nParams & PARAM_STR_1 )
{
/ * ListBox *pLB = ((ListBox*)pControl);
if ( pLB->GetEntryPos( aString1 ) == LISTBOX_ENTRY_NOTFOUND )
ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
else
{
pLB->SelectEntry( aString1, bBool1 );
if ( pLB->IsEntrySelected( aString1 ) ? !bBool1 : bBool1 ) // XOR rein mit BOOL
ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), aString1 ) );
}
* / ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
}
else
{
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
{
SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
((SvTreeListBox*)pControl)->Select ( pEntry, bBool1 );
}
}
break;*/
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "EditBrowseBox" ) );
break;
}
}
break;
case CONST_CTValueSet:
{
ValueSet *pVS = dynamic_cast< ValueSet* >(pControl);
switch ( nMethodId )
{
case M_GetItemCount:
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pVS->GetItemCount()));
break;
case M_GetItemText:
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pVS->GetItemCount() ))
pRet->GenReturn ( RET_Value, aUId, pVS->GetItemText( pVS->GetItemId( nNr1-1 ) ) );
break;
case M_Select:
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pVS->GetItemCount() ))
pVS->SelectItem( pVS->GetItemId( nNr1-1 ) );
break;
case M_GetSelIndex :
if ( pVS->IsNoSelection() )
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
else
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pVS->GetItemPos( pVS->GetSelectItemId() ) +1));
break;
case M_GetSelText :
if ( pVS->IsNoSelection() )
pRet->GenReturn ( RET_Value, aUId, String() );
else
pRet->GenReturn ( RET_Value, aUId, pVS->GetItemText( pVS->GetSelectItemId() ) );
break;
case M_SetNoSelection :
pVS->SetNoSelection();
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ValueSet" ) );
break;
}
}
break;
case CONST_CTORoadmap:
{
ORoadmap *pRM = dynamic_cast< ORoadmap* >(pControl);
switch ( nMethodId )
{
case M_GetItemCount:
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pRM->GetItemCount()));
break;
case M_GetItemText:
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pRM->GetItemCount() ))
pRet->GenReturn ( RET_Value, aUId, pRM->GetRoadmapItemLabel( pRM->GetItemID( nNr1-1 ) ) );
break;
case M_Select:
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pRM->GetItemCount() ))
{
if ( pRM->IsRoadmapItemEnabled( pRM->GetItemID( nNr1-1 ) ) )
pRM->SelectRoadmapItemByID( pRM->GetItemID( nNr1-1 ) );
else
ReportError( aUId, GEN_RES_STR1c( S_WIN_DISABLED, "RoadmapItem" ) );
}
break;
case M_GetSelIndex :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pRM->GetItemIndex( pRM->GetCurrentRoadmapItemID() ) +1));
break;
case M_GetSelText :
pRet->GenReturn ( RET_Value, aUId, pRM->GetRoadmapItemLabel( pRM->GetCurrentRoadmapItemID() ) );
break;
case M_IsItemEnabled :
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pRM->GetItemCount() ))
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)pRM->IsRoadmapItemEnabled( pRM->GetItemID( nNr1-1 ) ) );
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "RoadMap" ) );
break;
}
}
break;
case CONST_CTIExtensionListBox:
{
IExtensionListBox *pELB = dynamic_cast< IExtensionListBox* >(pControl);
switch ( nMethodId )
{
case M_GetItemCount:
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pELB->getItemCount()));
break;
case M_GetItemText:
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pELB->getItemCount() ))
switch ( nNr2 )
{
case 1:
pRet->GenReturn ( RET_Value, aUId, pELB->getItemName( nNr1 -1 ) );
break;
case 2:
pRet->GenReturn ( RET_Value, aUId, pELB->getItemVersion( nNr1 -1 ) );
break;
case 3:
pRet->GenReturn ( RET_Value, aUId, pELB->getItemDescription( nNr1 -1 ) );
break;
case 4:
pRet->GenReturn ( RET_Value, aUId, pELB->getItemPublisher( nNr1 -1 ) );
break;
case 5:
pRet->GenReturn ( RET_Value, aUId, pELB->getItemPublisherLink( nNr1 -1 ) );
break;
default:
ValueOK( aUId, MethodString( nMethodId ).AppendAscii(" String Number"), nNr2, 5 );
}
break;
case M_Select:
if ( (nParams & PARAM_USHORT_1) )
{
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pELB->getItemCount() ))
{
pELB->select( nNr1-1 );
}
}
else if ( (nParams & PARAM_STR_1) )
{
pELB->select( aString1 );
sal_Bool bSuccess = sal_True;
if ( pELB->getSelIndex() == EXTENSION_LISTBOX_ENTRY_NOTFOUND )
bSuccess = sal_False;
else
{
if ( !aString1.Equals( String( pELB->getItemName( pELB->getSelIndex() ) ) ) )
bSuccess = sal_False;
}
if ( !bSuccess )
ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
}
break;
case M_GetSelCount :
if ( pELB->getSelIndex() == EXTENSION_LISTBOX_ENTRY_NOTFOUND )
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( 0 ));
else
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( 1 ));
break;
case M_GetSelIndex :
if ( pELB->getSelIndex() == EXTENSION_LISTBOX_ENTRY_NOTFOUND )
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( 0 ));
else
pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pELB->getSelIndex() +1));
break;
/* xxxcase M_SetNoSelection :
((ListBox*)pControl)->SetNoSelection();
((ListBox*)pControl)->Select();
break; */
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "RoadMap" ) );
break;
}
}
break;
case CONST_CTTableControl:
{
::svt::table::TableControl *pTC = dynamic_cast< ::svt::table::TableControl* >(pControl);
switch ( nMethodId )
{
case M_GetItemType :
{
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTC->GetColumnCount() ) &&
ValueOK( aUId, MethodString( nMethodId ), nNr2, pTC->GetRowCount() ))
{
::svt::table::PTableModel pModel = pTC->GetModel();
Any aCell;
pModel->getCellContent( nNr1-1, nNr2-1, aCell );
pRet->GenReturn ( RET_Value, aUId, String( aCell.getValueTypeName() ));
}
}
break;
case M_GetItemText :
{
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTC->GetColumnCount() ) &&
ValueOK( aUId, MethodString( nMethodId ), nNr2, pTC->GetRowCount() ))
{
::svt::table::PTableModel pModel = pTC->GetModel();
Any aCell;
pModel->getCellContent( nNr1-1, nNr2-1, aCell );
/* doesn't work ATM since it gets casted to SbxDATE in VCLTestTool unfortunately
SbxVariableRef xRes = new SbxVariable( SbxVARIANT );
unoToSbxValue( xRes, aCell );
pRet->GenReturn ( RET_Value, aUId, *xRes );*/
Type aType = aCell.getValueType();
TypeClass eTypeClass = aType.getTypeClass();
switch( eTypeClass )
{
/*case TypeClass_ENUM:
{
sal_Int32 nEnum = 0;
enum2int( nEnum, aValue );
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)nEnum );
}
break;*/
case TypeClass_BOOLEAN:
pRet->GenReturn ( RET_Value, aUId, *(sal_Bool*)aCell.getValue() );
break;
case TypeClass_CHAR:
{
::rtl::OUString aContent( *(sal_Unicode*)aCell.getValue() );
pRet->GenReturn ( RET_Value, aUId, aContent );
}
break;
case TypeClass_STRING:
{
::rtl::OUString aContent;
aCell >>= aContent;
pRet->GenReturn ( RET_Value, aUId, aContent );
}
break;
//case TypeClass_FLOAT: break;
//case TypeClass_DOUBLE: break;
//case TypeClass_OCTET: break;
case TypeClass_BYTE:
case TypeClass_SHORT:
case TypeClass_LONG:
case TypeClass_HYPER:
case TypeClass_UNSIGNED_LONG:
case TypeClass_UNSIGNED_HYPER:
{
comm_ULONG val = 0;
aCell >>= val;
pRet->GenReturn ( RET_Value, aUId, val );
}
break;
//case TypeClass_UNSIGNED_OCTET:break;
case TypeClass_UNSIGNED_SHORT:
{
comm_USHORT val = 0;
aCell >>= val;
pRet->GenReturn ( RET_Value, aUId, val );
}
break;
default:
pRet->GenReturn ( RET_Value, aUId, comm_USHORT(0) );
break;
}
}
}
break;
case M_GetColumnCount :
{
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTC->GetColumnCount() );
}
break;
case M_GetRowCount :
{
pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTC->GetRowCount() );
}
break;
case M_Select :
{
if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTC->GetRowCount() ))
{
if ( pTC->GoToRow( ::svt::table::RowPos( nNr1-1 ) ) )
{
Size aSize( pTC->GetSizePixel() );
// DirectLog( S_QAError, UniString::CreateFromInt32( aSize.Width() ).Append( UniString::CreateFromInt32( aSize.Height() ) ) );
Point aPos( aSize.Width() / 2, aSize.Height() / 2 );
long nStep = aSize.Height() / 4;
::svt::table::RowPos nLastPos;
while ( ( nLastPos = pTC->getTableControlInterface().hitTest( aPos ).nRow ) != nNr1-1 && nStep > 0 )
{
if ( nLastPos > nNr1-1 || nLastPos == ROW_INVALID )
aPos.Y() -= nStep;
else
aPos.Y() += nStep;
nStep /= 2;
}
if ( pTC->getTableControlInterface().hitTest( aPos ).nRow == nNr1-1 )
{
MouseEvent aMEvnt(aPos,1,MOUSE_SIMPLECLICK|MOUSE_SELECT,MOUSE_LEFT,KEY_MOD1);
pTC->getSelEngine()->SelMouseButtonDown( aMEvnt );
pTC->getSelEngine()->SelMouseButtonUp( aMEvnt );
if ( pTC->IsRowSelected( nNr1-1 ) )
pTC->Select();
}
else
ReportError( aUId, GEN_RES_STR2c2( S_METHOD_FAILED, MethodString( nMethodId ), "find pos" ) );
}
else
ReportError( aUId, GEN_RES_STR2c2( S_METHOD_FAILED, MethodString( nMethodId ), "GoTo" ) );
}
}
break;
case M_GetSelCount :
pRet->GenReturn ( RET_Value, aUId, comm_USHORT( pTC->GetSelectedRowCount() ));
break;
case M_GetSelIndex :
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
if ( ValueOK( aUId, CUniString("GetSelIndex"), nNr1, pTC->GetSelectedRowCount() ) )
pRet->GenReturn ( RET_Value, aUId, comm_USHORT( pTC->GetSelectedRowIndex( nNr1-1 ) +1 ) );
break;
/* case M_GetSelText :
if ( ! (nParams & PARAM_USHORT_1) )
nNr1 = 1;
if ( ValueOK(aUId, CUniString("GetSelText"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
{
nNr1--;
COUNT_LBOX( FirstSelected, NextSelected, nNr1);
GetFirstValidTextItem( pThisEntry );
pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
}
break;
*/
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TableControl" ) );
break;
}
}
break;
case CONST_CTUnknown:
ReportError( aUId, GEN_RES_STR2( S_UNKNOWN_TYPE, UniString::CreateFromInt32( nRT ), MethodString(nMethodId) ) );
break;
default:
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
break;
}
}
break;
}
case C_Window:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "Window" ) );
break;
}
break;
case C_DockingWin:
DockingWin:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
case M_Dock :
if ( ((DockingWindow*)pControl)->IsFloatingMode() )
((DockingWindow*)pControl)->SetFloatingMode(sal_False);
else
ReportError( aUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_FLOATING_MODE, MethodString( nMethodId ) ) );
break;
case M_Undock :
if ( !((DockingWindow*)pControl)->IsFloatingMode() )
((DockingWindow*)pControl)->SetFloatingMode(sal_True);
else
ReportError( aUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_FLOATING_MODE, MethodString( nMethodId ) ) );
break;
case M_IsDocked :
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((DockingWindow*)pControl)->IsFloatingMode());
break;
case M_Close:
//aWindowWaitUId = aUId;
DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
SET_WINP_CLOSING(pControl);
((DockingWindow*)pControl)->Close();
break;
case M_Size:
case M_Move:
case M_IsMax:
case M_Minimize:
case M_Maximize:
if ( ((DockingWindow*)pControl)->IsFloatingMode() )
{
Window* pFloat = ((DockingWindow*)pControl)->GetFloatingWindow();
if ( !pFloat && ((DockingWindow*)pControl)->IsFloatingMode() )
{
if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
pFloat = pControl->GET_REAL_PARENT();
else
{
DBG_ERROR("FloatingMode set but Parent is no FloatingWindow");
}
}
if ( pFloat && pFloat->GetType() == WINDOW_FLOATINGWINDOW )
{
pControl = pFloat;
goto FloatWin;
}
else
ReportError( aUId, GEN_RES_STR1( S_CANNOT_FIND_FLOATING_WIN, MethodString( nMethodId ) ) );
}
else
ReportError( aUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_DOCKING_MODE, MethodString( nMethodId ) ) );
break;
case M_Help: // Alles was unten weiterbehandelt werden soll
goto MoreDialog;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "DockingWindow" ) );
break;
}
break;
case C_FloatWin:
FloatWin:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
case M_IsMax :
pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)!((FloatingWindow*)pControl)->IsRollUp());
break;
case M_Minimize :
((FloatingWindow*)pControl)->RollUp();
break;
case M_Maximize :
((FloatingWindow*)pControl)->RollDown();
break;
case M_Size:
{
if ( pControl->GetStyle() & WB_SIZEABLE )
{
Size aMin = ((FloatingWindow*)pControl)->GetMinOutputSizePixel();
if ( aMin.Width() <= nNr1 && aMin.Height() <= nNr2 )
{
pControl->SetSizePixel(Size(nNr1,nNr2));
pControl->Resize();
}
else
{
ReportError( aUId, GEN_RES_STR2( S_SIZE_BELOW_MINIMUM, String::CreateFromInt32( aMin.Width() ), String::CreateFromInt32( aMin.Height() ) ) );
}
}
else
ReportError( aUId, GEN_RES_STR1( S_SIZE_NOT_CHANGEABLE, MethodString( nMethodId ) ) );
break;
}
case M_Close:
DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
SET_WINP_CLOSING(pControl);
((FloatingWindow*)pControl)->Close();
break;
case M_Help: // Alles was unten weiterbehandelt werden soll
case M_Move:
goto MoreDialog;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "FloatingWin" ) );
break;
}
break;
case C_ModelessDlg:
case C_ModalDlg:
case C_Dialog:
case C_TabDlg:
MoreDialog:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
case M_Close:
DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
SET_WINP_CLOSING(pControl);
((SystemWindow*)pControl)->Close();
break;
case M_OK:
{
Window *pChild = GetWinByRT( pControl, WINDOW_OKBUTTON );
if( ControlOK( pChild, "OK Button" ) )
{
DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
SET_WINP_CLOSING(pControl);
((Button*)pChild)->Click();
}
break;
}
case M_Cancel:
{
Window *pChild = GetWinByRT( pControl, WINDOW_CANCELBUTTON );
if( ControlOK( pChild, "Cancel Button" ) )
{
DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
SET_WINP_CLOSING(pControl);
((Button*)pChild)->Click();
}
break;
}
case M_Help:
{
Window *pChild = GetWinByRT( pControl, WINDOW_HELPBUTTON );
if( ControlOK( pChild, "Help Button" ) )
((Button*)pChild)->Click();
break;
}
case M_Default:
{
Window *pChild = ImpGetButton( pControl, WB_DEFBUTTON, WB_DEFBUTTON );
if( ControlOK( pChild, "Default Button" ) )
((Button*)pChild)->Click();
break;
}
case M_Move:
{
pControl->SetPosPixel(Point(nNr1,nNr2));
break;
}
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "Dialog" ) );
break;
}
break;
case C_WorkWin:
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, MitteOben);
break;
case M_Close:
DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
SET_WINP_CLOSING(pControl);
((WorkWindow*)pControl)->Close();
break;
case M_Size:
case M_Move:
goto FloatWin;
// break;
case M_IsMax :
pRet->GenReturn ( RET_Value, aUId, ((WorkWindow*)pControl)->IsMaximized() );
break;
case M_IsMin :
pRet->GenReturn ( RET_Value, aUId, ((WorkWindow*)pControl)->IsMinimized() );
break;
case M_IsRestore :
pRet->GenReturn ( RET_Value, aUId, comm_BOOL (!((WorkWindow*)pControl)->IsMaximized() && !((WorkWindow*)pControl)->IsMinimized()) );
break;
case M_Minimize :
((WorkWindow*)pControl)->Maximize( sal_False );
((WorkWindow*)pControl)->Minimize();
break;
case M_Maximize :
((WorkWindow*)pControl)->Maximize();
break;
case M_Restore :
((WorkWindow*)pControl)->Maximize( sal_False );
((WorkWindow*)pControl)->Restore();
break;
case M_Help: // Alles was unten weiterbehandelt werden soll
goto MoreDialog;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "WorkWindow" ) );
break;
}
break;
case C_TabPage:
ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
break;
case C_MessBox:
case C_InfoBox:
case C_WarningBox:
case C_ErrorBox:
case C_QueryBox:
{
sal_Bool bDone = sal_True;
MessBox* pMB = (MessBox*)pControl;
switch( nMethodId )
{
case M_GetCheckBoxText:
pRet->GenReturn ( RET_Value, aUId, pMB->GetCheckBoxText() );
break;
case M_IsChecked :
pRet->GenReturn ( RET_Value, aUId, comm_BOOL( pMB->GetCheckBoxState() == STATE_CHECK) );
break;
case M_Check :
pMB->SetCheckBoxState( sal_True );
break;
case M_UnCheck :
pMB->SetCheckBoxState( sal_False );
break;
case M_GetText :
pRet->GenReturn ( RET_Value, aUId, pMB->GetMessText());
break;
default:
bDone = sal_False;
break;
}
if ( bDone )
break; // break the case here else continue at C_ButtonDialog
}
case C_ButtonDialog:
{
ButtonDialog* pBD = (ButtonDialog*)pControl;
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "Working MessBox: " );
if (pControl->IsVisible())
m_pDbgWin->AddText("*(Visible)\n");
else
m_pDbgWin->AddText("*(nicht Visible)\n");
#endif
switch( nMethodId )
{
case M_AnimateMouse :
AnimateMouse( pControl, Mitte);
break;
case M_OK:
if ( pBD->GetPushButton( BUTTONID_OK ) )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_OK);
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_OK_BUTTON, MethodString( nMethodId ) ) );
break;
case M_Cancel:
if ( pBD->GetPushButton( BUTTONID_CANCEL ) )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_CANCEL);
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_CANCEL_BUTTON, MethodString( nMethodId ) ) );
break;
case M_Yes:
if ( pBD->GetPushButton( BUTTONID_YES ) )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_YES);
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_YES_BUTTON, MethodString( nMethodId ) ) );
break;
case M_No:
if ( pBD->GetPushButton( BUTTONID_NO ) )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_NO);
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_NO_BUTTON, MethodString( nMethodId ) ) );
break;
case M_Repeat:
if ( pBD->GetPushButton( BUTTONID_RETRY ) )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_RETRY);
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_RETRY_BUTTON, MethodString( nMethodId ) ) );
break;
case M_Help:
if ( pBD->GetPushButton( BUTTONID_HELP ) )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(BUTTONID_HELP);
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_HELP_BUTTON, MethodString( nMethodId ) ) );
break;
case M_Default:
{
WinBits Style = pControl->GetStyle();
if ( Style & WB_DEF_OK )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_OK);
}
else if ( Style & WB_DEF_CANCEL )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_CANCEL);
}
else if ( Style & WB_DEF_YES )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_YES);
}
else if ( Style & WB_DEF_NO )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_NO);
}
else if ( Style & WB_DEF_RETRY )
{
SET_WINP_CLOSING(pControl);
pBD->EndDialog(RET_RETRY);
}
else
ReportError( aUId, GEN_RES_STR1( S_NO_DEFAULT_BUTTON, MethodString( nMethodId ) ) );
}
break;
case M_GetText :
pRet->GenReturn ( RET_Value, aUId, pControl->GetText());
break;
case M_Click:
if ( nParams & PARAM_USHORT_1 )
{
if ( pBD->GetPushButton( nNr1 ) )
{
if ( nNr1 != BUTTONID_HELP )
{
SET_WINP_CLOSING(pControl);
}
pBD->GetPushButton( nNr1 )->Click();
}
else
ReportError( aUId, GEN_RES_STR2( S_NO_DEFAULT_BUTTON, UniString::CreateFromInt32( nNr1 ), MethodString( nMethodId ) ) );
}
else
ReportError( aUId, GEN_RES_STR1( S_BUTTONID_REQUIRED, MethodString( nMethodId ) ) );
break;
case M_GetButtonCount :
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pBD->GetButtonCount()));
break;
case M_GetButtonId :
if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pBD->GetButtonCount()) )
pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pBD->GetButtonId(nNr1-1)));
break;
default:
ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MessageBox" ) );
break;
}
break;
}
default:
DBG_ERROR( "Unknown Objekttype from UId or Method not suported" );
ReportError( aUId, GEN_RES_STR2( S_UNKNOWN_TYPE, UniString::CreateFromInt32( nRT ), MethodString(nMethodId) ) );
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( " Unknown Objekttype from UId or Method not suported" );
#endif
break;
}
}
for( int i = 0; i < 32; i++ )
SafeReschedule();
}
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( "\n" );
#endif
if ( bStatementDone )
{
SendProfile( UIdString( aUId ).Append('.').Append( MethodString( nMethodId ) ) );
delete this;
}
else
{
if ( nRetryCount-- )
{
#if OSL_DEBUG_LEVEL > 1
m_pDbgWin->AddText( CUniString("Reschedule command (requed) (").Append( UniString::CreateFromInt32(nRetryCount) ).AppendAscii(")\n") );
#endif
QueStatement( this ); // will que at the start of the list
}
else
{
bStatementDone=sal_True;
}
}
return bStatementDone;
#define FINISH_NEXT
#define FINISH_SAME
}