| /************************************************************** |
| * |
| * 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 SC_OLINEWIN_HXX |
| #define SC_OLINEWIN_HXX |
| |
| #include "viewdata.hxx" |
| |
| class ScOutlineEntry; |
| class ScOutlineArray; |
| class ScOutlineTable; |
| |
| |
| // ============================================================================ |
| |
| enum ScOutlineMode { SC_OUTLINE_HOR, SC_OUTLINE_VER }; |
| |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** The window left of or above the spreadsheet containing the outline groups |
| and controls to expand/collapse them. */ |
| class ScOutlineWindow : public Window |
| { |
| private: |
| ScViewData& mrViewData; /// View data containing the document. |
| ScSplitPos meWhich; /// Which area in split window. |
| bool mbHoriz; /// true = Horizontal orientation. |
| bool mbMirrorEntries; /// true = mirror the order of entries (including header) |
| bool mbMirrorLevels; /// true = mirror the order of levels, including the border |
| |
| ImageList* mpSymbols; /// Symbols for buttons. |
| Color maLineColor; /// Line color for expanded groups. |
| long mnHeaderSize; /// Size of the header area in entry direction. |
| long mnHeaderPos; /// Position of the header area in entry direction. |
| long mnMainFirstPos; /// First position of main area in entry direction. |
| long mnMainLastPos; /// Last position of main area in entry direction. |
| |
| size_t mnMTLevel; /// Mouse tracking: Level of active button. |
| size_t mnMTEntry; /// Mouse tracking: Entry index of active button. |
| bool mbMTActive; /// Mouse tracking active? |
| bool mbMTPressed; /// Mouse tracking: Button currently drawed pressed? |
| |
| Rectangle maFocusRect; /// Focus rectangle on screen. |
| size_t mnFocusLevel; /// Level of focused button. |
| size_t mnFocusEntry; /// Entry index of focused button. |
| bool mbDontDrawFocus; /// Do not redraw focus in next Paint(). |
| |
| public: |
| ScOutlineWindow( |
| Window* pParent, |
| ScOutlineMode eMode, |
| ScViewData* pViewData, |
| ScSplitPos eWhich ); |
| virtual ~ScOutlineWindow(); |
| |
| /** Sets the size of the header area (width/height dep. on window type). */ |
| void SetHeaderSize( long nNewSize ); |
| /** Returns the width/height the window needs to show all levels. */ |
| long GetDepthSize() const; |
| |
| /** Scrolls the window content by the specified amount of pixels. */ |
| void ScrollPixel( long nDiff ); |
| |
| using Window::ShowFocus; |
| |
| private: |
| /** Initializes color and image settings. */ |
| void InitSettings(); |
| |
| /** Returns the calc document. */ |
| inline ScDocument& GetDoc() const { return *mrViewData.GetDocument(); } |
| /** Returns the current sheet index. */ |
| inline SCTAB GetTab() const { return mrViewData.GetTabNo(); } |
| /** Returns the outline array of the corresponding document. */ |
| const ScOutlineArray* GetOutlineArray() const; |
| /** Returns the specified outline entry. */ |
| const ScOutlineEntry* GetOutlineEntry( size_t nLevel, size_t nEntry ) const; |
| |
| /** Returns true, if the column/row is hidden. */ |
| bool IsHidden( SCCOLROW nColRowIndex ) const; |
| /** Returns true, if the column/row is filtered. */ |
| bool IsFiltered( SCCOLROW nColRowIndex ) const; |
| /** Returns true, if all columns/rows before nColRowIndex are hidden. */ |
| bool IsFirstVisible( SCCOLROW nColRowIndex ) const; |
| /** Returns the currently visible column/row range. */ |
| void GetVisibleRange( SCCOLROW& rnColRowStart, SCCOLROW& rnColRowEnd ) const; |
| |
| /** Returns the point in the window of the specified position. */ |
| Point GetPoint( long nLevelPos, long nEntryPos ) const; |
| /** Returns the rectangle in the window of the specified position. */ |
| Rectangle GetRectangle( |
| long nLevelStart, long nEntryStart, |
| long nLevelEnd, long nEntryEnd ) const; |
| |
| /** Returns the window size for the level coordinate. */ |
| long GetOutputSizeLevel() const; |
| /** Returns the window size for the entry coordinate. */ |
| long GetOutputSizeEntry() const; |
| |
| /** Returns the count of levels of the outline array. 0 means no outlines. */ |
| size_t GetLevelCount() const; |
| /** Returns the pixel position of the specified level. */ |
| long GetLevelPos( size_t nLevel ) const; |
| /** Returns the level of the passed pixel position. */ |
| size_t GetLevelFromPos( long nLevelPos ) const; |
| |
| /** Returns the start coordinate of the specified column/row in the window. */ |
| long GetColRowPos( SCCOLROW nColRowIndex ) const; |
| /** Returns the entry position of header images. */ |
| long GetHeaderEntryPos() const; |
| /** Calculates the coordinates the outline entry takes in the window. |
| @return false = no part of the group is visible (outside window or collapsed by parent group). */ |
| bool GetEntryPos( |
| size_t nLevel, size_t nEntry, |
| long& rnStartPos, long& rnEndPos, long& rnImagePos ) const; |
| /** Calculates the absolute position of the image of the specified outline entry. |
| @param nLevel The level of the entry. |
| @param nEntry The entry index or SC_OL_HEADERENTRY for the header image. |
| @return false = image is not visible. */ |
| bool GetImagePos( size_t nLevel, size_t nEntry, Point& rPos ) const; |
| /** Returns true, if the button of the specified entry is visible in the window. */ |
| bool IsButtonVisible( size_t nLevel, size_t nEntry ) const; |
| |
| /** Returns true, if rPos is inside of a button or over the line of an expanded |
| group. The outline entry data is stored in the passed variables. */ |
| bool ItemHit( const Point& rPos, size_t& rnLevel, size_t& rnEntry, bool& rbButton ) const; |
| /** Returns true, if rPos is inside of a button. |
| The button data is stored in the passed variables. */ |
| bool ButtonHit( const Point& rPos, size_t& rnLevel, size_t& rnEntry ) const; |
| /** Returns true, if rPos is over the line of an expanded group. |
| The outline entry data is stored in the passed variables. */ |
| bool LineHit( const Point& rPos, size_t& rnLevel, size_t& rnEntry ) const; |
| |
| /** Performs an action with the specified item. |
| @param nLevel The level of the entry. |
| @param nEntry The entry index or SC_OL_HEADERENTRY for the header entry. */ |
| void DoFunction( size_t nLevel, size_t nEntry ) const; |
| /** Expands the specified entry (does nothing with header entries). */ |
| void DoExpand( size_t nLevel, size_t nEntry ) const; |
| /** Collapses the specified entry (does nothing with header entries). */ |
| void DoCollapse( size_t nLevel, size_t nEntry ) const; |
| |
| /** Returns true, if the focused button is visible in the window. */ |
| bool IsFocusButtonVisible() const; |
| |
| /** Calculates index of next/previous focus button in the current level (no paint). |
| @param bFindVisible true = repeats until a visible button has been found. |
| @return true = focus wrapped from end to start or vice versa. */ |
| bool ImplMoveFocusByEntry( bool bForward, bool bFindVisible ); |
| /** Calculates position of focus button in next/previous level (no paint). |
| @return true = focus wrapped from end to start or vice versa. */ |
| bool ImplMoveFocusByLevel( bool bForward ); |
| /** Calculates position of focus button in tab order. |
| @param bFindVisible true = repeats until a visible button has been found. |
| @return true = focus wrapped from end to start or vice versa. */ |
| bool ImplMoveFocusByTabOrder( bool bForward, bool bFindVisible ); |
| |
| /** If the focused entry is invisible, tries to move to visible position. */ |
| void ImplMoveFocusToVisible( bool bForward ); |
| |
| /** Focuses next/previous button in the current level. */ |
| void MoveFocusByEntry( bool bForward ); |
| /** Focuses button in next/previous level. */ |
| void MoveFocusByLevel( bool bForward ); |
| /** Focuses next/previous button in tab order. */ |
| void MoveFocusByTabOrder( bool bForward ); |
| |
| /** Starts mouse tracking after click on a button. */ |
| void StartMouseTracking( size_t nLevel, size_t nEntry ); |
| /** Returns whether mouse tracking mode is active. */ |
| inline bool IsMouseTracking() const { return mbMTActive; } |
| /** Ends mouse tracking. */ |
| void EndMouseTracking(); |
| |
| /** Sets a clip region for the window area without header. */ |
| void SetEntryAreaClipRegion(); |
| /** Converts coordinates to real window points and draws the line. */ |
| void DrawLineRel( |
| long nLevelStart, long nEntryStart, |
| long nLevelEnd, long nEntryEnd ); |
| /** Converts coordinates to real window points and draws the rectangle. */ |
| void DrawRectRel( |
| long nLevelStart, long nEntryStart, |
| long nLevelEnd, long nEntryEnd ); |
| /** Draws the specified image unpressed. */ |
| void DrawImageRel( long nLevelPos, long nEntryPos, sal_uInt16 nId ); |
| /** Draws a pressed or unpressed border. */ |
| void DrawBorderRel( size_t nLevel, size_t nEntry, bool bPressed ); |
| |
| /** Draws the focus rectangle into the focused button. */ |
| void ShowFocus(); |
| /** Erases the focus rectangle from the focused button. */ |
| void HideFocus(); |
| |
| /** Scrolls the specified range of the window in entry-relative direction. */ |
| void ScrollRel( long nEntryDiff, long nEntryStart, long nEntryEnd ); |
| |
| protected: |
| virtual void Paint( const Rectangle& rRect ); |
| |
| virtual void Resize(); |
| virtual void GetFocus(); |
| virtual void LoseFocus(); |
| |
| virtual void MouseMove( const MouseEvent& rMEvt ); |
| virtual void MouseButtonUp( const MouseEvent& rMEvt ); |
| virtual void MouseButtonDown( const MouseEvent& rMEvt ); |
| |
| virtual void KeyInput( const KeyEvent& rKEvt ); |
| |
| public: |
| virtual void DataChanged( const DataChangedEvent& rDCEvt ); |
| }; |
| |
| |
| // ============================================================================ |
| |
| #endif |
| |