/************************************************************** * * 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 SD_TOOLPANEL_SCROLL_PANEL_HXX #define SD_TOOLPANEL_SCROLL_PANEL_HXX #include "taskpane/TaskPaneTreeNode.hxx" #include #include #include #include namespace sd { namespace toolpanel { class TitledControl; /** The scroll panel shows its controls one above the other. When their total height is larger than the height of the scroll area then only a part of the controls is visible. Scroll bars control which part that is. The scroll panel registers itself as window event listener at the controls and their title bars (conceptually; it really is the TitledControl) to track changes of the selection and focus rectangles. On such a change it tries to move the selected or focused part into the visible area. At the moment this moving into view only works with valuesets and TitleBars. */ class ScrollPanel : public ::Control, public TreeNode { public: /** Create a new scroll panel which itself is the root of a TreeNode hierarchy parent. This will usually be a child window. */ ScrollPanel (::Window& i_rParentWindow); virtual ~ScrollPanel (void); /** Add a control to the sub panel. An title bar is added above the control. @param rTitle The title that will be shown in the two title bars that belong to the control. @param nHelpId The help id is set at the title bar not the actual control. @return The new titled control that contains the given control and a new title bar as children is returned. */ TitledControl* AddControl ( ::std::auto_ptr pControl, const String& rTitle, const rtl::OString& sHelpId); /** Add a control to the sub panel without a title bar. */ void AddControl (::std::auto_ptr pControl); virtual void Paint (const Rectangle& rRect); /** Initiate a rearrangement of the controls and title bars. */ virtual void Resize (void); virtual void RequestResize (void); virtual Size GetPreferredSize (void); virtual sal_Int32 GetPreferredWidth (sal_Int32 nHeight); virtual sal_Int32 GetPreferredHeight (sal_Int32 nWidth); virtual bool IsResizable (void); virtual ::Window* GetWindow (void); virtual sal_Int32 GetMinimumWidth (void); virtual void ExpandControl ( TreeNode* pControl, bool bExpansionState); bool IsVerticalScrollBarVisible (void) const; bool IsHorizontalScrollBarVisible (void) const; ScrollBar& GetVerticalScrollBar (void); ScrollBar& GetHorizontalScrollBar (void); // ::Window virtual long Notify( NotifyEvent& rNEvt ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> CreateAccessibleObject ( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible>& rxParent); /** Scroll the given rectangle into the visible area. @param aRectangle The box to move into the visible area in pixel coordinates relative to the given window. @param pWindow This window is used to translate the given coordinates into ones that are relative to the scroll panel. */ void MakeRectangleVisible ( Rectangle& aRectangle, ::Window* pWindow); private: ::Control maScrollWindow; ScrollBar maVerticalScrollBar; ScrollBar maHorizontalScrollBar; ::Window maScrollBarFiller; ::Window maScrollWindowFiller; Point maScrollOffset; bool mbIsRearrangePending; bool mbIsLayoutPending; sal_uInt32 mnChildrenWidth; /// Border above top-most and below bottom-most control. const int mnVerticalBorder; /// Gap between two controls. const int mnVerticalGap; /// Border at the left and right of the controls. const int mnHorizontalBorder; /** List of horizontal stripes that is created from the gaps between children when they are layouted. The stripes are painted in Paint() to fill the space around the children. */ typedef ::std::vector< ::std::pair > StripeList; StripeList maStripeList; /** Calculate position, size, and visibility of the controls. Call this method after the list of controls, their expansion state, or the size of the sub panel has changed. */ void Rearrange (void); /** Determine the minimal size that is necessary to show the controls one over the other. It may be smaller than the available area. */ Size GetRequiredSize (void); /** Place the child windows one above the other and return the size of the bounding box. */ sal_Int32 LayoutChildren (void); /** ctor-impl */ void Construct(); Size SetupScrollBars (const Size& rRequiresSize); sal_Int32 SetupVerticalScrollBar (bool bShow, sal_Int32 nRange); sal_Int32 SetupHorizontalScrollBar (bool bShow, sal_Int32 nRange); DECL_LINK(ScrollBarHandler, ScrollBar*); DECL_LINK(WindowEventListener, VclSimpleEvent*); using Window::GetWindow; }; } } // end of namespace ::sd::toolpanel #endif