/**************************************************************
 * 
 * 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 _SFXSPLITWIN_HXX
#define _SFXSPLITWIN_HXX

#ifndef _SPLITWIN_HXX //autogen
#include <vcl/splitwin.hxx>
#endif
#include <sfx2/childwin.hxx>

class SfxWorkWindow;
class SfxDockingWindow;
class SfxDockArr_Impl;
class SfxEmptySplitWin_Impl;
struct SfxDock_Impl;

class SfxSplitWindow : public SplitWindow
{
friend class SfxEmptySplitWin_Impl;

private:
	SfxChildAlignment 	eAlign;
	SfxWorkWindow*		pWorkWin;
	SfxDockArr_Impl*	pDockArr;
	sal_Bool				bLocked;
	sal_Bool				bPinned;
	SfxEmptySplitWin_Impl*	pEmptyWin;
	SfxDockingWindow*	pActive;

	void				InsertWindow_Impl( SfxDock_Impl* pDockWin,
							const Size& rSize,
							sal_uInt16 nLine,
							sal_uInt16 nPos,
							sal_Bool bNewLine=sal_False );

	DECL_LINK(			TimerHdl, Timer* );
	sal_Bool				CursorIsOverRect( sal_Bool bForceAdding = sal_False ) const;
	void				SetPinned_Impl( sal_Bool );
	void				SetFadeIn_Impl( sal_Bool );
	void				SaveConfig_Impl();
	void				FadeOut_Impl();

protected:

	virtual void		StartSplit();
	virtual void		SplitResize();
	virtual void 		Split();
	virtual void		Command ( const CommandEvent& rCEvt );
	virtual void		MouseButtonDown ( const MouseEvent& );

public:
						SfxSplitWindow( Window* pParent, SfxChildAlignment eAl,
							SfxWorkWindow *pW, sal_Bool bWithButtons,
							WinBits nBits = WB_BORDER | WB_SIZEABLE | WB_3DLOOK );

						~SfxSplitWindow();

	void				ReleaseWindow_Impl(SfxDockingWindow *pWin, sal_Bool bSaveConfig=sal_True);

	void				InsertWindow( SfxDockingWindow* pDockWin,
							const Size& rSize);

	void				InsertWindow( SfxDockingWindow* pDockWin,
							const Size& rSize,
							sal_uInt16 nLine,
							sal_uInt16 nPos,
							sal_Bool bNewLine=sal_False );

	void				MoveWindow( SfxDockingWindow* pDockWin,
							const Size& rSize,
							sal_uInt16 nLine,
							sal_uInt16 nPos,
							sal_Bool bNewLine=sal_False );

	void				RemoveWindow( SfxDockingWindow* pDockWin, sal_Bool bHide=sal_True);

	void				Lock( sal_Bool bLock=sal_True )
						{
							bLocked = bLock;
							SetUpdateMode( !bLock );
						}
        using Window::IsLocked;
	sal_Bool				IsLocked() const { return bLocked; }
	sal_Bool				GetWindowPos( const SfxDockingWindow* pWindow,
									  sal_uInt16& rLine, sal_uInt16& rPos ) const;
	sal_Bool				GetWindowPos( const Point& rTestPos,
									  sal_uInt16& rLine, sal_uInt16& rPos ) const;
	sal_uInt16				GetLineCount() const;
	long				GetLineSize( sal_uInt16 ) const;
	sal_uInt16				GetWindowCount(sal_uInt16 nLine) const;
	sal_uInt16				GetWindowCount() const;

	sal_Bool				IsPinned() const { return bPinned; }
	sal_Bool				IsFadeIn() const;
	sal_Bool				IsAutoHide( sal_Bool bSelf = sal_False ) const;
	SplitWindow*		GetSplitWindow();

	virtual void		AutoHide();
	virtual void		FadeOut();
	virtual void		FadeIn();
	void				Show_Impl();
	void				Pin_Impl( sal_Bool bPinned );
	sal_Bool				ActivateNextChild_Impl( sal_Bool bForward = sal_True );
	void				SetActiveWindow_Impl( SfxDockingWindow* pWin );
};

#endif // #ifndef _SFXSPLITWIN_HXX


