/**************************************************************
 *
 * 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.
 *
 *************************************************************/


#ifndef _BASOBJ_HXX
#define _BASOBJ_HXX

#include "scriptdocument.hxx"
#include <tools/string.hxx>
#include <svl/lstner.hxx>

#ifndef _COM_SUN_STAR_IO_XINPUTSTREAMPROVIDER_HXX_
#include <com/sun/star/io/XInputStreamProvider.hpp>
#endif
#include <com/sun/star/script/XLibraryContainer.hpp>
#include <com/sun/star/frame/XModel.hpp>

class SfxMacro;
class SbMethod;
class SbModule;
class SbxObject;
class SbxVariable;
class StarBASIC;
class BasicManager;
class SfxUInt16Item;
class SfxBindings;
class Window;
struct BasicIDE_Impl;

namespace BasicIDE
{
    void			Organize( sal_Int16 tabId );


	// Hilfsmethoden fuer den allg. Gebrauch:
    SbMethod*	CreateMacro( SbModule* pModule, const String& rMacroName );
	void			RunMethod( SbMethod* pMethod );

	StarBASIC*	FindBasic( const SbxVariable* pVar );
	void			StopBasic();
    long         HandleBasicError( StarBASIC* pBasic );
	void			BasicStopped( sal_Bool* pbAppWindowDisabled = 0, sal_Bool* pbDispatcherLocked = 0, sal_uInt16* pnWaitCount = 0,
							SfxUInt16Item** ppSWActionCount = 0, SfxUInt16Item** ppSWLockViewCount = 0 );

	sal_Bool			IsValidSbxName( const String& rName );

    BasicManager* 		FindBasicManager( StarBASIC* pLib );

    SfxBindings* 		GetBindingsPtr();

	void			InvalidateDebuggerSlots();

    // libraries

    ::com::sun::star::uno::Sequence< ::rtl::OUString > GetMergedLibraryNames(
        const ::com::sun::star::uno::Reference< ::com::sun::star::script::XLibraryContainer >& xModLibContainer,
        const ::com::sun::star::uno::Reference< ::com::sun::star::script::XLibraryContainer >& xDlgLibContainer );

	// new methods for modules

	::rtl::OUString		GetModule(
		const ScriptDocument& rDocument, const String& rLibName, const String& rModName )
		throw( ::com::sun::star::container::NoSuchElementException );

    /** renames a module

        Will show an error message when renaming fails because the new name is already used.
    */
	bool                 RenameModule(
        Window* pErrorParent, const ScriptDocument& rDocument,
        const String& rLibName, const String& rOldName, const String& rNewName );

	// new methods for macros

    ::rtl::OUString		ChooseMacro( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rxLimitToDocument,
        sal_Bool bChooseOnly, const ::rtl::OUString& rMacroDesc );

	::com::sun::star::uno::Sequence< ::rtl::OUString > GetMethodNames(
		const ScriptDocument& rDocument, const String& rLibName, const String& rModName )
		throw( ::com::sun::star::container::NoSuchElementException );

	sal_Bool					HasMethod(
		const ScriptDocument& rDocument, const String& rLibName, const String& rModName, const String& rMethName );

	// new methods for dialogs

	::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStreamProvider > GetDialog(
		const ScriptDocument& rDocument, const String& rLibName, const String& rDlgName )
		throw( ::com::sun::star::container::NoSuchElementException );

    /** renames a dialog

        Will show an error message when renaming fails because the new name is already used.
    */
	bool                 RenameDialog(
		Window* pErrorParent, const ScriptDocument& rDocument, const String& rLibName, const String& rOldName, const String& rNewName )
		throw( ::com::sun::star::container::ElementExistException, ::com::sun::star::container::NoSuchElementException );

	bool                 RemoveDialog(
		const ScriptDocument& rDocument, const String& rLibName, const String& rDlgName );

	void 				MarkDocumentModified( const ScriptDocument& rDocument );
}

#endif	// _BASOBJ_HXX
