diff options
23 files changed, 375 insertions, 1780 deletions
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx index 77c833e3872a..596126c02b8b 100644 --- a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx +++ b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx @@ -44,6 +44,7 @@ #include <vcl/bitmapex.hxx> #include <vcl/bmpacc.hxx> +#include <vcl/pngwrite.hxx> const static sal_Int32 gnSuperSampleFactor (2); @@ -56,7 +57,7 @@ namespace sd { namespace slidesorter { namespace cache { BitmapFactory::BitmapFactory (void) : maRenderer(NULL, false), - mbRemoveBorder(true) + mbRemoveBorder(false) { } @@ -92,7 +93,21 @@ BitmapFactory::~BitmapFactory (void) ::boost::shared_ptr<BitmapEx> pPreview (new BitmapEx(aPreview.GetBitmapEx())); if (mbRemoveBorder) + { + static sal_Int32 gnCounter (0); + SvFileStream aOut ( + ::rtl::OUString::createFromAscii("c:\\tmp\\image-") + +::rtl::OUString::valueOf(gnCounter) + +::rtl::OUString::createFromAscii(".png"), + STREAM_WRITE); + ::vcl::PNGWriter aWriter (*pPreview); + aWriter.Write(aOut); + ++gnCounter; + + OSL_ASSERT(pPreview->GetSizePixel() == aSize); pPreview->Crop(Rectangle(1,1,aSize.Width()-2,aSize.Height()-2)); + OSL_ASSERT(pPreview->GetSizePixel() == Size(aSize.Width()-2,aSize.Height()-2)); + } if (bDo) { #if 1 diff --git a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx index 8ee0f748fcd3..0f007284d2c0 100644 --- a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx +++ b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx @@ -54,6 +54,8 @@ #include "view/SlsViewOverlay.hxx" #include "view/SlsFontProvider.hxx" #include "view/SlsPageObjectLayouter.hxx" +#include "view/SlsPageObjectPainter.hxx" +#include "view/SlsTheme.hxx" #include "cache/SlsPageCache.hxx" #include "cache/SlsPageCacheManager.hxx" @@ -637,6 +639,11 @@ IMPL_LINK(SlideSorterController, WindowEventHandler, VclWindowEvent*, pEvent) // When the system font has changed a layout has to be done. mrView.Resize(); FontProvider::Instance().Invalidate(); + + // Update theme colors. + mrSlideSorter.GetProperties()->HandleDataChangeEvent(); + mrSlideSorter.GetTheme()->Update(mrSlideSorter.GetProperties()); + mrView.GetPageObjectPainter()->SetTheme(mrSlideSorter.GetTheme()); } break; diff --git a/sd/source/ui/slidesorter/controller/SlsAnimator.cxx b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx index 69be776179d3..a067428d50ab 100644 --- a/sd/source/ui/slidesorter/controller/SlsAnimator.cxx +++ b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx @@ -48,15 +48,16 @@ class Animator::Animation public: Animation ( const Animator::AnimationFunctor& rAnimation, - const double nDelta, - const double nEnd, + const double nDuration, + const double nGlobalTime, const Animator::AnimationId nAnimationId, const Animator::FinishFunctor& rFinishFunctor); ~Animation (void); /** Run next animation step. If animation has reached its end it is expired. */ - bool Run (void); + bool Run (const double nGlobalTime); + /** Typically called when an animation has finished, but also from Animator::Disposed(). The finish functor is called and the animation is marked as expired to prevent another run. @@ -67,9 +68,9 @@ public: Animator::AnimationFunctor maAnimation; Animator::FinishFunctor maFinishFunctor; const Animator::AnimationId mnAnimationId; - double mnValue; + const double mnDuration; const double mnEnd; - const double mnDelta; + const double mnGlobalTimeAtStart; bool mbIsExpired; }; @@ -82,7 +83,8 @@ Animator::Animator (SlideSorter& rSlideSorter) mbIsDisposed(false), maAnimations(), mpDrawLock(), - mnNextAnimationId(0) + mnNextAnimationId(0), + maElapsedTime() { maTimer.SetTimeout(gnResolution); maTimer.SetTimeoutHdl(LINK(this,Animator,TimeoutHandler)); @@ -130,16 +132,16 @@ Animator::AnimationId Animator::AddAnimation ( if (mbIsDisposed) return -1; - const double nDelta = double(gnResolution) / double(nDuration); boost::shared_ptr<Animation> pAnimation ( - new Animation(rAnimation, nDelta, 1.0, ++mnNextAnimationId, rFinishFunctor)); + new Animation( + rAnimation, + nDuration / 1000.0, + maElapsedTime.getElapsedTime(), + ++mnNextAnimationId, + rFinishFunctor)); maAnimations.push_back(pAnimation); - // Prevent redraws except for the ones in TimeoutHandler. - // While the Animator is active it will schedule repaints regularly. - // Repaints in between would only lead to visual artifacts. - mpDrawLock.reset(new view::SlideSorterView::DrawLock(mrSlideSorter)); - maTimer.Start(); + RequestNextFrame(); return pAnimation->mnAnimationId; } @@ -158,14 +160,15 @@ Animator::AnimationId Animator::AddInfiniteAnimation ( return -1; boost::shared_ptr<Animation> pAnimation ( - new Animation(rAnimation, nDelta, -1.0, mnNextAnimationId++, FinishFunctor())); + new Animation( + rAnimation, + -1, + maElapsedTime.getElapsedTime(), + mnNextAnimationId++, + FinishFunctor())); maAnimations.push_back(pAnimation); - // Prevent redraws except for the ones in TimeoutHandler. - // While the Animator is active it will schedule repaints regularly. - // Repaints in between would only lead to visual artifacts. - mpDrawLock.reset(new view::SlideSorterView::DrawLock(mrSlideSorter)); - maTimer.Start(); + RequestNextFrame(); return pAnimation->mnAnimationId; } @@ -199,7 +202,7 @@ void Animator::RemoveAnimation (const Animator::AnimationId nId) -bool Animator::ProcessAnimations (void) +bool Animator::ProcessAnimations (const double nTime) { bool bExpired (false); @@ -212,7 +215,7 @@ bool Animator::ProcessAnimations (void) AnimationList::const_iterator iAnimation; for (iAnimation=aCopy.begin(); iAnimation!=aCopy.end(); ++iAnimation) { - bExpired |= (*iAnimation)->Run(); + bExpired |= (*iAnimation)->Run(nTime); } return bExpired; @@ -242,26 +245,34 @@ void Animator::CleanUpAnimationList (void) +void Animator::RequestNextFrame (const double nFrameStart) +{ + if ( ! maTimer.IsActive()) + { + // Prevent redraws except for the ones in TimeoutHandler. While the + // Animator is active it will schedule repaints regularly. Repaints + // in between would only lead to visual artifacts. + mpDrawLock.reset(new view::SlideSorterView::DrawLock(mrSlideSorter)); + maTimer.Start(); + } +} + + + + IMPL_LINK(Animator, TimeoutHandler, Timer*, EMPTYARG) { if (mbIsDisposed) return 0; - OSL_TRACE("Animator timeout start"); - - if (ProcessAnimations()) + if (ProcessAnimations(maElapsedTime.getElapsedTime())) CleanUpAnimationList(); // Unlock the draw lock. This should lead to a repaint. mpDrawLock.reset(); if (maAnimations.size() > 0) - { - mpDrawLock.reset(new view::SlideSorterView::DrawLock(mrSlideSorter)); - maTimer.Start(); - } - - OSL_TRACE("Animator timeout end"); + RequestNextFrame(); return 0; } @@ -273,20 +284,26 @@ IMPL_LINK(Animator, TimeoutHandler, Timer*, EMPTYARG) Animator::Animation::Animation ( const Animator::AnimationFunctor& rAnimation, - const double nDelta, - const double nEnd, + const double nDuration, + const double nGlobalTime, const Animator::AnimationId nId, const Animator::FinishFunctor& rFinishFunctor) : maAnimation(rAnimation), maFinishFunctor(rFinishFunctor), mnAnimationId(nId), - mnValue(0), - mnEnd(nEnd), - mnDelta(nDelta), + mnDuration(nDuration), + mnEnd(nGlobalTime + nDuration), + mnGlobalTimeAtStart(nGlobalTime), mbIsExpired(false) { - maAnimation(mnValue); - mnValue = mnDelta; + if (mnDuration > 0) + maAnimation(0.0); + else if (mnDuration < 0) + maAnimation(nGlobalTime); + else + { + OSL_ASSERT(mnDuration != 0); + } } @@ -299,25 +316,30 @@ Animator::Animation::~Animation (void) -bool Animator::Animation::Run (void) +bool Animator::Animation::Run (const double nGlobalTime) { if ( ! mbIsExpired) { - if (mnEnd>=0 && mnValue>=mnEnd) + if (mnDuration > 0) { - maAnimation(mnEnd); - Expire(); - return true; + if (nGlobalTime >= mnEnd) + { + maAnimation(1.0); + Expire(); + } + else + { + maAnimation((nGlobalTime - mnGlobalTimeAtStart) / mnDuration); + } } - else + else if (mnDuration < 0) { - maAnimation(mnValue); - mnValue += mnDelta; - return false; + // Animations without end have to be expired by their owner. + maAnimation(nGlobalTime); } } - else - return true; + + return mbIsExpired; } diff --git a/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx index 0c0213e9e702..900658c4bcad 100644 --- a/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx +++ b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx @@ -35,6 +35,7 @@ #include "PaneDockingWindow.hxx" #include "controller/SlideSorterController.hxx" #include "controller/SlsSelectionManager.hxx" +#include "controller/SlsCurrentSlideManager.hxx" #include "model/SlideSorterModel.hxx" #include "model/SlsPageDescriptor.hxx" #include "view/SlideSorterView.hxx" @@ -44,6 +45,8 @@ #include "Window.hxx" #include "sdpage.hxx" +#define UNIFY_FOCUS_AND_CURRENT_PAGE + namespace sd { namespace slidesorter { namespace controller { FocusManager::FocusManager (SlideSorter& rSlideSorter) @@ -164,7 +167,11 @@ void FocusManager::MoveFocus (FocusMoveDirection eDirection) } if (mbPageIsFocused) + { +#ifndef UNIFY_FOCUS_AND_CURRENT_PAGE ShowFocusIndicator(GetFocusedPageDescriptor(), true); +#endif + } } } @@ -288,6 +295,7 @@ void FocusManager::ShowFocusIndicator ( const model::SharedPageDescriptor& rpDescriptor, const bool bScrollToFocus) { +#ifndef UNIFY_FOCUS_AND_CURRENT_PAGE if (rpDescriptor.get() != NULL) { mrSlideSorter.GetView().SetState(rpDescriptor, model::PageDescriptor::ST_Focused, true); @@ -303,6 +311,7 @@ void FocusManager::ShowFocusIndicator ( mrSlideSorter.GetView().RequestRepaint (rpDescriptor); NotifyFocusChangeListeners(); } +#endif } diff --git a/sd/source/ui/slidesorter/controller/SlsProperties.cxx b/sd/source/ui/slidesorter/controller/SlsProperties.cxx index 829cc1b05368..48cc8a705cde 100644 --- a/sd/source/ui/slidesorter/controller/SlsProperties.cxx +++ b/sd/source/ui/slidesorter/controller/SlsProperties.cxx @@ -45,7 +45,7 @@ Properties::Properties (void) mbIsSuspendPreviewUpdatesDuringFullScreenPresentation(true), maBackgroundColor(Application::GetSettings().GetStyleSettings().GetWindowColor()), maTextColor(Application::GetSettings().GetStyleSettings().GetActiveTextColor()), - maSelectionColor(Application::GetSettings().GetStyleSettings().GetMenuHighlightColor()), + maSelectionColor(Application::GetSettings().GetStyleSettings().GetHighlightColor()), maHighlightColor(Application::GetSettings().GetStyleSettings().GetMenuHighlightColor()), mbIsUIReadOnly(false) { @@ -61,6 +61,17 @@ Properties::~Properties (void) +void Properties::HandleDataChangeEvent (void) +{ + maBackgroundColor = Application::GetSettings().GetStyleSettings().GetWindowColor(); + maTextColor = Application::GetSettings().GetStyleSettings().GetActiveTextColor(); + maSelectionColor = Application::GetSettings().GetStyleSettings().GetHighlightColor(); + maHighlightColor = Application::GetSettings().GetStyleSettings().GetMenuHighlightColor(); +} + + + + bool Properties::IsHighlightCurrentSlide (void) const { return mbIsHighlightCurrentSlide; diff --git a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx index 5f4e2b3c1fb5..63daebe6544d 100644 --- a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx +++ b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx @@ -500,10 +500,11 @@ void ScrollBarManager::SetTop (const sal_Int32 nNewTop) // Flush pending repaints before scrolling to avoid temporary artifacts. mrSlideSorter.GetContentWindow()->Update(); + OSL_TRACE("setting top of vertical scroll bar to %d", nNewTop); mpVerticalScrollBar->SetThumbPos(nNewTop); mnVerticalPosition = double(nNewTop) / double(mpVerticalScrollBar->GetRange().Len()); - mrSlideSorter.GetContentWindow()->SetVisibleXY ( - mnHorizontalPosition, mnVerticalPosition); + mrSlideSorter.GetContentWindow()->SetVisibleXY (mnHorizontalPosition, mnVerticalPosition); + mrSlideSorter.GetView().InvalidatePageObjectVisibilities(); } } diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx index 362bd4abf17f..1c61a14ac261 100644 --- a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx +++ b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx @@ -353,16 +353,16 @@ BOOL SelectionFunction::MouseMove (const MouseEvent& rEvent) (rEvent.GetButtons() & MOUSE_LEFT)!=0); } - Rectangle aRectangle (Point(0,0),mpWindow->GetOutputSizePixel()); - if ( ! aRectangle.IsInside(aMousePosition) - && mpSubstitutionHandler) + if (rEvent.IsLeaveWindow()) { - // Mouse left the window with pressed left button. Make it a drag. - StartDrag(aMousePosition); - // Mouse motion events are not sent to us while the mouse is outside - // the window and drag&drop is active. Therefore hide the - // substitution. - // mpSubstitutionHandler->Hide(); + // Rectangle aRectangle (Point(0,0),mpWindow->GetOutputSizePixel()); + // if ( ! aRectangle.IsInside(aMousePosition) + if (mpSubstitutionHandler) + { + // Mouse left the window with pressed left button. Make it a drag. + StartDrag(aMousePosition); + } + mrSlideSorter.GetView().SetPageUnderMouse(model::SharedPageDescriptor()); } else { diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx index ff511b60625e..432d370234f1 100644 --- a/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx +++ b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx @@ -105,7 +105,9 @@ SelectionManager::SelectionManager (SlideSorter& rSlideSorter) : mrSlideSorter(rSlideSorter), mrController(rSlideSorter.GetController()), maSelectionBeforeSwitch(), - mbIsMakeSelectionVisiblePending(true) + mbIsMakeSelectionVisiblePending(true), + mnInsertionPosition(-1), + mnAnimationId(Animator::NotAnAnimationId) { } @@ -440,9 +442,13 @@ Size SelectionManager::MakeRectangleVisible (const Rectangle& rBox) if (nNewTop != aVisibleArea.Top()) { if (mrSlideSorter.GetProperties()->IsSmoothSelectionScrolling()) - mrController.GetAnimator()->AddAnimation( + { + if (mnAnimationId != Animator::NotAnAnimationId) + mrController.GetAnimator()->RemoveAnimation(mnAnimationId); + mnAnimationId = mrController.GetAnimator()->AddAnimation( VerticalVisibleAreaScroller(mrSlideSorter, aVisibleArea.Top(), nNewTop), 300); + } else VerticalVisibleAreaScroller(mrSlideSorter, aVisibleArea.Top(), nNewTop)(1.0); } @@ -644,10 +650,13 @@ void VerticalVisibleAreaScroller::operator() (const double nTime) { const double nLocalTime (maAccelerationFunction(nTime)); const sal_Int32 nNewTop (mnStart * (1.0 - nLocalTime) + mnEnd * nLocalTime); + mrSlideSorter.GetController().GetScrollBarManager().SetTop(nNewTop); + /* mrSlideSorter.GetViewShell()->Scroll( 0, nNewTop - mrSlideSorter.GetController().GetScrollBarManager().GetTop()); mrSlideSorter.GetView().InvalidatePageObjectVisibilities(); + */ } diff --git a/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx b/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx index e9683e0dc075..6a63060316f1 100644 --- a/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx +++ b/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx @@ -34,6 +34,7 @@ #include "SlideSorter.hxx" #include "view/SlideSorterView.hxx" +#include <canvas/elapsedtime.hxx> #include <vcl/timer.hxx> #include <sal/types.h> #include <vector> @@ -99,6 +100,7 @@ private: class Animation; typedef ::std::vector<boost::shared_ptr<Animation> > AnimationList; AnimationList maAnimations; + ::canvas::tools::ElapsedTime maElapsedTime; ::boost::scoped_ptr<view::SlideSorterView::DrawLock> mpDrawLock; @@ -107,15 +109,19 @@ private: DECL_LINK(TimeoutHandler, Timer*); /** Execute one step of every active animation. + @param nTime + Time measured in milli seconds with some arbitrary reference point. @return When one or more animation has finished then <TRUE/> is returned. Call CleanUpAnimationList() in this case. */ - bool ProcessAnimations (void); + bool ProcessAnimations (const double nTime); /** Remove animations that have expired. */ void CleanUpAnimationList (void); + + void RequestNextFrame (const double nFrameStart = 0); }; diff --git a/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx b/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx index 53a72a5ec6cf..15aa980aaca5 100644 --- a/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx +++ b/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx @@ -44,6 +44,11 @@ public: Properties (void); ~Properties (void); + /** Call this method after receiving a VCLEVENT_APPLICATION_DATACHANGED + event. + */ + void HandleDataChangeEvent (void); + /** When this method returns <TRUE/> then the current slide is highlighted in the view. The default value is <FALSE/>. */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx index 665d01a89987..47bcafe134f4 100644 --- a/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx +++ b/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx @@ -33,6 +33,7 @@ #define SD_SLIDESORTER_CONTROLLER_SELECTION_MANAGER_HXX #include "model/SlsSharedPageDescriptor.hxx" +#include "controller/SlsAnimator.hxx" #include <sal/types.h> #include <tools/gen.hxx> #include <basegfx/range/b2irectangle.hxx> @@ -175,6 +176,8 @@ private: */ sal_Int32 mnInsertionPosition; + Animator::AnimationId mnAnimationId; + /** Delete the given list of normal pages. This method is a helper function for DeleteSelectedPages(). @param rSelectedNormalPages diff --git a/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx b/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx index 65f67efaeb22..026b60238d91 100644 --- a/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx +++ b/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx @@ -73,6 +73,8 @@ public: MouseOverIndicator, // Bounding box of the page number. PageNumber, + // Bounding box of the frame that sometimes is painted around the page number. + PageNumberFrame, // Bounding box of the pane name. Name, // Indicator whether or not there is a slide transition associated @@ -140,18 +142,12 @@ public: const Point& rWindowLocation); private: - /// Minimal border around the page number area. - static const sal_Int32 mnPageNumberOffset; - static const sal_Int32 mnOuterBorderWidth; - static const sal_Int32 mnInfoAreaMinWidth; - static const Size maButtonSize; - static const sal_Int32 mnButtonGap; - SharedSdWindow mpWindow; Size maPageObjectSize; double mnModelToWindowScale; Rectangle maPageObjectBoundingBox; Rectangle maPageNumberAreaBoundingBox; + Rectangle maPageNumberFrameBoundingBox; Rectangle maPreviewBoundingBox; Rectangle maTransitionEffectBoundingBox; Rectangle maButtonAreaBoundingBox; @@ -161,7 +157,7 @@ private: Rectangle CalculatePreviewBoundingBox ( Size& rPageObjectSize, const Size& rPreviewModelSize, - const sal_Int32 nInfoAreaWidth); + const sal_Int32 nPageNumberAreaWidth); }; diff --git a/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx index 4b01376aaeeb..ec42b3db4fd9 100644 --- a/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx +++ b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx @@ -62,6 +62,13 @@ public: void NotifyResize (void); + /** Called when the theme changes, either because it is replaced with + another or because the system colors have changed. So, even when + the given theme is the same object as the one already in use by this + painter everything that depends on the theme is updated. + */ + void SetTheme (const ::boost::shared_ptr<view::Theme>& rpTheme); + private: const Layouter& mrLayouter; ::boost::shared_ptr<PageObjectLayouter> mpPageObjectLayouter; diff --git a/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx index c8bdfd6e9882..ad6a9ee7b2cb 100644 --- a/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx +++ b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx @@ -76,7 +76,9 @@ public: ButtonBackground, MouseOverColor, PageNumberBorder, - Selection + PageNumberColor, + Selection, + PreviewBorder }; ColorData GetColor (const ColorType eType); @@ -103,7 +105,18 @@ public: BitmapEx GetIcon (const IconType eType); private: + class GradientDescriptor + { + public: + ColorData maFillColor1; + ColorData maFillColor2; + ColorData maBorderColor1; + ColorData maBorderColor2; + }; ColorData maBackgroundColor; + GradientDescriptor maNormalGradient; + GradientDescriptor maSelectedGradient; + GradientDescriptor maMouseOverGradient; BitmapEx maRawShadow; BitmapEx maInsertionIndicator; }; diff --git a/sd/source/ui/slidesorter/view/SlideSorterView.cxx b/sd/source/ui/slidesorter/view/SlideSorterView.cxx index 1f77a40df57b..ceef51c8071b 100644 --- a/sd/source/ui/slidesorter/view/SlideSorterView.cxx +++ b/sd/source/ui/slidesorter/view/SlideSorterView.cxx @@ -525,7 +525,8 @@ void SlideSorterView::PostModelChange (void) model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); // The new page objects have to be scaled and positioned. - Layout (); + Layout(); + RequestRepaint(); } @@ -792,9 +793,9 @@ void SlideSorterView::CompleteRedraw ( sdr::contact::ViewObjectContactRedirector* pRedirector) { const double nStartTime (gaTimer.getElapsedTime()); - OSL_TRACE("SlideSorterView::CompleteRedraw start at %f, %d", + OSL_TRACE("SlideSorterView::CompleteRedraw start at %f, %s", nStartTime, - mnLockRedrawSmph); + mnLockRedrawSmph ? "locked" : ""); if (pDevice == NULL || pDevice!=mrSlideSorter.GetContentWindow().get()) return; diff --git a/sd/source/ui/slidesorter/view/SlsLayouter.cxx b/sd/source/ui/slidesorter/view/SlsLayouter.cxx index 5eab152419eb..0f69e892779b 100644 --- a/sd/source/ui/slidesorter/view/SlsLayouter.cxx +++ b/sd/source/ui/slidesorter/view/SlsLayouter.cxx @@ -48,8 +48,8 @@ Layouter::Layouter (const SharedSdWindow& rpWindow) mnRightBorder(30), mnTopBorder(10), mnBottomBorder(10), - mnVerticalGap (20), - mnHorizontalGap (20), + mnVerticalGap (10), + mnHorizontalGap (10), mnMinimalWidth (100), mnPreferredWidth (200), mnMaximalWidth (300), @@ -477,7 +477,7 @@ Point Layouter::GetInsertionMarkerLocation ( if (bLeftOrTop) { // Above. - aLocation.setY(aBox.Top() - mnVerticalGap/2); + aLocation.setY(aBox.Top() - (mnVerticalGap+1)/2 - 1); } else { diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx index be5c5066863a..10cd7ca93ef6 100644 --- a/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx +++ b/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx @@ -39,12 +39,15 @@ namespace sd { namespace slidesorter { namespace view { -const sal_Int32 PageObjectLayouter::mnPageNumberOffset = 9; -const sal_Int32 PageObjectLayouter::mnOuterBorderWidth = 6; -const sal_Int32 PageObjectLayouter::mnInfoAreaMinWidth = 26; -const Size PageObjectLayouter::maButtonSize (32,32); -const sal_Int32 PageObjectLayouter::mnButtonGap (5); - +namespace { +const static sal_Int32 gnPageNumberOffset = 5; +const static sal_Int32 gnPageNumberFrameHorizontalOffset = 2; +const static sal_Int32 gnPageNumberFrameVerticalOffset = 1; +const static sal_Int32 gnOuterBorderWidth = 6; +const static sal_Int32 gnInfoAreaMinWidth = 26; +const static Size gaButtonSize (32,32); +const static sal_Int32 gnButtonGap (5); +} PageObjectLayouter::PageObjectLayouter ( const Size& rPageObjectWindowSize, @@ -63,37 +66,41 @@ PageObjectLayouter::PageObjectLayouter ( { const Size aPageNumberAreaSize (GetPageNumberAreaSize(nPageCount)); - const int nMaximumBorderWidth (mnOuterBorderWidth); - - // Set up some bounding boxes relative to the page object origin. - - maPageNumberAreaBoundingBox = Rectangle( - mnPageNumberOffset, - nMaximumBorderWidth, - mnPageNumberOffset + aPageNumberAreaSize.Width(), - nMaximumBorderWidth + aPageNumberAreaSize.Height()); + const int nMaximumBorderWidth (gnOuterBorderWidth); maPreviewBoundingBox = CalculatePreviewBoundingBox( maPageObjectSize, Size(rPageSize.Width(), rPageSize.Height()), - ::std::min(aPageNumberAreaSize.Width(), mnInfoAreaMinWidth)); + aPageNumberAreaSize.Width()); maPageObjectBoundingBox = Rectangle(Point(0,0), maPageObjectSize); + maPageNumberAreaBoundingBox = Rectangle( + Point( + maPreviewBoundingBox.Left() + - gnPageNumberOffset + - gnPageNumberFrameHorizontalOffset + - aPageNumberAreaSize.Width(), + nMaximumBorderWidth), + aPageNumberAreaSize); + + maPageNumberFrameBoundingBox = Rectangle( + maPageNumberAreaBoundingBox.Left() - gnPageNumberFrameHorizontalOffset, + maPageNumberAreaBoundingBox.Top() - gnPageNumberFrameVerticalOffset, + maPageNumberAreaBoundingBox.Right() + gnPageNumberFrameHorizontalOffset, + maPageNumberAreaBoundingBox.Bottom() + gnPageNumberFrameVerticalOffset); + const Size aIconSize (maTransitionEffectIcon.GetSizePixel()); - const int nLeft (maPreviewBoundingBox.Left() - - mnPageNumberOffset - aIconSize.Width() - nMaximumBorderWidth); - const int nTop (maPreviewBoundingBox.Bottom() - aIconSize.Height()); maTransitionEffectBoundingBox = Rectangle( - nLeft, - nTop, - nLeft + aIconSize.Width(), - nTop + aIconSize.Height()); + Point( + (maPreviewBoundingBox.Left() - aIconSize.Width()) / 2, + maPreviewBoundingBox.Bottom() - aIconSize.Height()), + aIconSize); maButtonAreaBoundingBox = Rectangle( 0, - maPageObjectBoundingBox.Bottom() - maButtonSize.Height() - mnButtonGap, - maPageObjectBoundingBox.Right() - mnButtonGap, - maPageObjectBoundingBox.Bottom() - mnButtonGap); + maPageObjectBoundingBox.Bottom() - gaButtonSize.Height() - gnButtonGap, + maPageObjectBoundingBox.Right() - gnButtonGap, + maPageObjectBoundingBox.Bottom() - gnButtonGap); } @@ -109,42 +116,44 @@ PageObjectLayouter::~PageObjectLayouter(void) Rectangle PageObjectLayouter::CalculatePreviewBoundingBox ( Size& rPageObjectSize, const Size& rPageSize, - const sal_Int32 nInfoAreaWidth) + const sal_Int32 nPageNumberAreaWidth) { - const int nMaximumBorderWidth (mnOuterBorderWidth); - const int nLeftAreaWidth ( - 2*mnPageNumberOffset - + ::std::max( - nInfoAreaWidth, - maTransitionEffectIcon.GetSizePixel().Width())); - int nPreviewWidth; - int nPreviewHeight; + const sal_Int32 nIconWidth (maTransitionEffectIcon.GetSizePixel().Width()); + const sal_Int32 nLeftAreaWidth ( + ::std::max( + gnInfoAreaMinWidth, + 2*gnPageNumberOffset + + ::std::max( + nPageNumberAreaWidth + 2 * gnPageNumberFrameHorizontalOffset, + nIconWidth))); + sal_Int32 nPreviewWidth; + sal_Int32 nPreviewHeight; const double nPageAspectRatio (double(rPageSize.Width()) / double(rPageSize.Height())); if (rPageObjectSize.Height() == 0) { // Calculate height so that the preview fills the available // horizontal space completely while observing the aspect ratio of // the preview. - nPreviewWidth = rPageObjectSize.Width() - nLeftAreaWidth - 2*nMaximumBorderWidth - 1; + nPreviewWidth = rPageObjectSize.Width() - nLeftAreaWidth - gnOuterBorderWidth - 1; nPreviewHeight = ::basegfx::fround(nPreviewWidth / nPageAspectRatio); - rPageObjectSize.setHeight(nPreviewHeight + 2*nMaximumBorderWidth + 1); + rPageObjectSize.setHeight(nPreviewHeight + 2*gnOuterBorderWidth + 1); } else if (rPageObjectSize.Width() == 0) { // Calculate the width of the page object so that the preview fills // the available vertical space completely while observing the // aspect ratio of the preview. - nPreviewHeight = rPageObjectSize.Height() - 2*nMaximumBorderWidth - 1; + nPreviewHeight = rPageObjectSize.Height() - 2*gnOuterBorderWidth - 1; nPreviewWidth = ::basegfx::fround(nPreviewHeight * nPageAspectRatio); - rPageObjectSize.setWidth(nPreviewWidth + nLeftAreaWidth + 2*nMaximumBorderWidth + 1); + rPageObjectSize.setWidth(nPreviewWidth + nLeftAreaWidth + gnOuterBorderWidth + 1); } else { // The size of the page object is given. Calculate the size of the // preview. - nPreviewWidth = rPageObjectSize.Width() - nLeftAreaWidth - 2*nMaximumBorderWidth - 1; - nPreviewHeight = rPageObjectSize.Height() - 2*nMaximumBorderWidth - 1; + nPreviewWidth = rPageObjectSize.Width() - nLeftAreaWidth - gnOuterBorderWidth - 1; + nPreviewHeight = rPageObjectSize.Height() - gnOuterBorderWidth - 1; if (double(nPreviewWidth)/double(nPreviewHeight) > nPageAspectRatio) nPreviewWidth = ::basegfx::fround(nPreviewHeight * nPageAspectRatio); else @@ -152,9 +161,8 @@ Rectangle PageObjectLayouter::CalculatePreviewBoundingBox ( } // When the preview does not fill the available space completely then // place it flush right and vertically centered. - const int nLeft (rPageObjectSize.Width() - nMaximumBorderWidth - nPreviewWidth - 1); - const int nTop (nMaximumBorderWidth - + (rPageObjectSize.Height() - 2*nMaximumBorderWidth - nPreviewHeight)/2); + const int nLeft (rPageObjectSize.Width() - gnOuterBorderWidth - nPreviewWidth - 1); + const int nTop ((rPageObjectSize.Height() - nPreviewHeight)/2); return Rectangle( nLeft, nTop, @@ -187,6 +195,10 @@ Rectangle PageObjectLayouter::GetBoundingBox ( aBoundingBox = maPageNumberAreaBoundingBox; break; + case PageNumberFrame: + aBoundingBox = maPageNumberFrameBoundingBox; + break; + case Name: aBoundingBox = maPageNumberAreaBoundingBox; break; @@ -203,9 +215,9 @@ Rectangle PageObjectLayouter::GetBoundingBox ( aBoundingBox = Rectangle( maPageObjectBoundingBox.BottomRight() - Point( - (nIndex+1)*(maButtonSize.Width() + mnButtonGap), - maButtonSize.Height() + mnButtonGap), - maButtonSize); + (nIndex+1)*(gaButtonSize.Width() + gnButtonGap), + gaButtonSize.Height() + gnButtonGap), + gaButtonSize); break; } diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx index f0edc65efd4a..6fd2fbf55bc3 100644 --- a/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx +++ b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx @@ -300,6 +300,15 @@ void PageObjectPainter::NotifyResize (void) +void PageObjectPainter::SetTheme (const ::boost::shared_ptr<view::Theme>& rpTheme) +{ + mpTheme = rpTheme; + NotifyResize(); +} + + + + void PageObjectPainter::PaintBackground ( OutputDevice& rDevice, const model::SharedPageDescriptor& rpDescriptor) const @@ -357,15 +366,6 @@ void PageObjectPainter::PaintPreview ( rDevice.DrawBitmapEx(aBox.TopLeft(), aBitmap); } - - // Draw border around preview. - --aBox.Left(); - --aBox.Top(); - ++aBox.Right(); - ++aBox.Bottom(); - rDevice.SetLineColor(Color(0,0,0)); - rDevice.SetFillColor(); - rDevice.DrawRect(aBox); } @@ -375,7 +375,7 @@ void PageObjectPainter::PaintPageNumber ( OutputDevice& rDevice, const model::SharedPageDescriptor& rpDescriptor) const { - Rectangle aBox (mpPageObjectLayouter->GetBoundingBox( + const Rectangle aBox (mpPageObjectLayouter->GetBoundingBox( rpDescriptor, PageObjectLayouter::PageNumber, PageObjectLayouter::WindowCoordinateSystem)); @@ -385,22 +385,22 @@ void PageObjectPainter::PaintPageNumber ( const sal_Int32 nPageNumber ((rpDescriptor->GetPage()->GetPageNum() - 1) / 2 + 1); const String sPageNumber (String::CreateFromInt32(nPageNumber)); rDevice.SetFont(*mpPageNumberFont); - rDevice.SetTextColor(Color(0x0848a8f)); - rDevice.DrawText(aBox.TopLeft(), sPageNumber); + rDevice.SetTextColor(Color(mpTheme->GetColor(Theme::PageNumberColor))); + rDevice.DrawText(aBox, sPageNumber, TEXT_DRAW_RIGHT | TEXT_DRAW_VCENTER); if (rpDescriptor->GetVisualState().GetCurrentVisualState() == model::VisualState::VS_Excluded) { // Paint border around the number. - aBox.Left()-= 2; - aBox.Top() -= 1; - aBox.Right() += 2; - aBox.Bottom() += 1; + const Rectangle aFrameBox (mpPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::PageNumberFrame, + PageObjectLayouter::WindowCoordinateSystem)); rDevice.SetLineColor(Color(mpTheme->GetColor(Theme::PageNumberBorder))); rDevice.SetFillColor(); - rDevice.DrawRect(aBox); + rDevice.DrawRect(aFrameBox); - rDevice.DrawLine(aBox.TopLeft(), aBox.BottomRight()); + rDevice.DrawLine(aFrameBox.TopLeft(), aBox.BottomRight()); } } @@ -536,7 +536,6 @@ Bitmap PageObjectPainter::CreateBackgroundBitmap( // Paint the background with a linear gradient that starts some pixels // below the top and ends some pixels above the bottom. -#if 1 const sal_Int32 nDefaultConstantSize(aSize.Height()/4); const sal_Int32 nMinimalGradientSize(40); const sal_Int32 nHeight (aSize.Height()); @@ -563,15 +562,6 @@ Bitmap PageObjectPainter::CreateBackgroundBitmap( } aBitmapDevice.DrawLine(Point(0,nY), Point(aSize.Width(),nY)); } -#else - const Color aTopColor(mpTheme->GetColor(eColorType, Theme::Fill1)); - const Color aBottomColor(mpTheme->GetColor(eColorType, Theme::Fill2)); - Color aColor (aTopColor); - aColor.Merge(aBottomColor, 128); - aBitmapDevice.SetFillColor(aColor); - aBitmapDevice.SetLineColor(aColor); - aBitmapDevice.DrawRect(Rectangle(Point(0,0), aSize)); -#endif // Paint the border. aBitmapDevice.SetFillColor(); @@ -582,15 +572,17 @@ Bitmap PageObjectPainter::CreateBackgroundBitmap( // Get bounding box of the preview around which a shadow is painted. // Compensate for the border around the preview. - Rectangle aBox (mpPageObjectLayouter->GetBoundingBox( + const Rectangle aBox (mpPageObjectLayouter->GetBoundingBox( model::SharedPageDescriptor(), PageObjectLayouter::Preview, PageObjectLayouter::WindowCoordinateSystem)); - aBox.Left() -= 1; - aBox.Top() -= 1; - aBox.Right() += 1; - aBox.Bottom() += 1; - mpShadowPainter->PaintFrame(aBitmapDevice, aBox); + Rectangle aFrameBox (aBox.Left()-1,aBox.Top()-1,aBox.Right()+1,aBox.Bottom()+1); + mpShadowPainter->PaintFrame(aBitmapDevice, aFrameBox); + + // Clear the area where the preview will later be painted. + aBitmapDevice.SetFillColor(mpTheme->GetColor(Theme::Background)); + aBitmapDevice.SetLineColor(mpTheme->GetColor(Theme::PreviewBorder)); + aBitmapDevice.DrawRect(aFrameBox); return aBitmapDevice.GetBitmap (Point(0,0),aSize); } diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectViewContact.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectViewContact.cxx deleted file mode 100644 index 5849140f8327..000000000000 --- a/sd/source/ui/slidesorter/view/SlsPageObjectViewContact.cxx +++ /dev/null @@ -1,143 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: SlsPageObjectViewContact.cxx,v $ - * $Revision: 1.10 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "precompiled_sd.hxx" - -#include "view/SlsPageObjectViewContact.hxx" - -#include "model/SlsPageDescriptor.hxx" -#include "controller/SlsPageObjectFactory.hxx" - -#include <svx/svdopage.hxx> -#include <tools/debug.hxx> - -#include <basegfx/polygon/b2dpolygontools.hxx> -#include <drawinglayer/primitive2d/polygonprimitive2d.hxx> - -using namespace ::sdr::contact; - -namespace sd { namespace slidesorter { namespace view { - - -PageObjectViewContact::PageObjectViewContact ( - SdrPageObj& rPageObj, - const model::SharedPageDescriptor& rpDescriptor) - : ViewContactOfPageObj (rPageObj), - mbInDestructor(false), - mpDescriptor(rpDescriptor) -{ -} - -PageObjectViewContact::~PageObjectViewContact (void) -{ - // remember that this instance is in destruction - mbInDestructor = true; -} - - - -ViewObjectContact& - PageObjectViewContact::CreateObjectSpecificViewObjectContact( - ObjectContact& rObjectContact) -{ - OSL_ASSERT(mpDescriptor.get()!=NULL); - - ViewObjectContact* pResult - = mpDescriptor->GetPageObjectFactory().CreateViewObjectContact ( - rObjectContact, - *this); - DBG_ASSERT (pResult!=NULL, - "PageObjectViewContact::CreateObjectSpecificViewObjectContact() was not able to create object."); - return *pResult; -} - -const SdrPage* PageObjectViewContact::GetPage (void) const -{ - // when this instance itself is in destruction, do no longer - // provide the referenced page to VOC childs of this OC. This - // happens e.g. in destructor which destroys all child-VOCs which - // may in their implementation still reference their VC from - // their own destructor - if (!mbInDestructor) - return GetReferencedPage(); - else - return NULL; -} - -void PageObjectViewContact::ActionChanged (void) -{ - ViewContactOfPageObj::ActionChanged(); -} - -Rectangle PageObjectViewContact::GetPageObjectBoundingBox (void) const -{ - // use model data directly here - OSL_ASSERT(mpDescriptor.get()!=NULL); - Rectangle aRetval(GetPageObject().GetLastBoundRect()); - const SvBorder aPageDescriptorBorder(mpDescriptor->GetModelBorder()); - - aRetval.Left() -= aPageDescriptorBorder.Left(); - aRetval.Top() -= aPageDescriptorBorder.Top(); - aRetval.Right() += aPageDescriptorBorder.Right(); - aRetval.Bottom() += aPageDescriptorBorder.Bottom(); - - return aRetval; -} - -SdrPageObj& PageObjectViewContact::GetPageObject (void) const -{ - return ViewContactOfPageObj::GetPageObj(); -} - -drawinglayer::primitive2d::Primitive2DSequence PageObjectViewContact::createViewIndependentPrimitive2DSequence() const -{ - // ceate graphical visualisation data. Since this is the view-independent version which should not be used, - // create a replacement graphic visualisation here. Use GetLastBoundRect to access the model data directly - // which is aOutRect for SdrPageObj. - OSL_ASSERT(mpDescriptor.get()!=NULL); - Rectangle aModelRectangle(GetPageObj().GetLastBoundRect()); - const SvBorder aBorder(mpDescriptor->GetModelBorder()); - - aModelRectangle.Left() -= aBorder.Left(); - aModelRectangle.Right() += aBorder.Right(); - aModelRectangle.Top() -= aBorder.Top(); - aModelRectangle.Bottom() += aBorder.Bottom(); - - const basegfx::B2DRange aModelRange(aModelRectangle.Left(), aModelRectangle.Top(), aModelRectangle.Right(), aModelRectangle.Bottom()); - const basegfx::B2DPolygon aOutline(basegfx::tools::createPolygonFromRect(aModelRange)); - const basegfx::BColor aYellow(1.0, 1.0, 0.0); - const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aOutline, aYellow)); - - return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); -} - -} } } // end of namespace ::sd::slidesorter::view - -// eof diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectViewObjectContact.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectViewObjectContact.cxx deleted file mode 100644 index 8c3fd4532c4f..000000000000 --- a/sd/source/ui/slidesorter/view/SlsPageObjectViewObjectContact.cxx +++ /dev/null @@ -1,1421 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: SlsPageObjectViewObjectContact.cxx,v $ - * $Revision: 1.23 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "precompiled_sd.hxx" - -#include "view/SlsPageObjectViewObjectContact.hxx" - -#include "controller/SlsProperties.hxx" -#include "view/SlideSorterView.hxx" -#include "view/SlsPageObjectViewContact.hxx" -#include "view/SlsPageObject.hxx" -#include "view/SlsFontProvider.hxx" -#include "model/SlsPageDescriptor.hxx" -#include "cache/SlsPageCache.hxx" -#include "cache/SlsPageCacheManager.hxx" -#include "res_bmp.hrc" -#include "tools/IconCache.hxx" -#include "PreviewRenderer.hxx" - -#include "sdpage.hxx" -#include "sdresid.hxx" -#include "glob.hrc" -#include "drawdoc.hxx" -#include <svx/sdr/contact/displayinfo.hxx> -#include <svx/sdr/contact/viewcontact.hxx> -#include <svx/svdopage.hxx> -#include <svx/svdpagv.hxx> -#include <svx/xlndsit.hxx> -#include <svx/xlnclit.hxx> -#include <svx/svdoutl.hxx> -#include <svx/sdrpagewindow.hxx> -#include <vcl/bitmap.hxx> -#include <vcl/outdev.hxx> -#include <vcl/virdev.hxx> -#include <vcl/lineinfo.hxx> -#include <tools/color.hxx> -#include <boost/shared_ptr.hpp> -#include <com/sun/star/uno/Exception.hpp> -#include <vcl/svapp.hxx> - -using namespace ::sdr::contact; -using namespace ::sd::slidesorter::model; - -using drawinglayer::primitive2d::Primitive2DReference; -using drawinglayer::primitive2d::Primitive2DSequence; - -namespace sd { namespace slidesorter { namespace view { - - -const sal_Int32 PageObjectViewObjectContact::mnSelectionIndicatorOffset = 2; -const sal_Int32 PageObjectViewObjectContact::mnSelectionIndicatorThickness = 3; -const sal_Int32 PageObjectViewObjectContact::mnFocusIndicatorOffset = 3; -const sal_Int32 PageObjectViewObjectContact::mnFadeEffectIndicatorOffset = 9; -const sal_Int32 PageObjectViewObjectContact::mnFadeEffectIndicatorSize = 14; -const sal_Int32 PageObjectViewObjectContact::mnPageNumberOffset = 9; -const sal_Int32 PageObjectViewObjectContact::mnMouseOverEffectOffset = 3; -const sal_Int32 PageObjectViewObjectContact::mnMouseOverEffectThickness = 1; - -PageObjectViewObjectContact::PageObjectViewObjectContact ( - ObjectContact& rObjectContact, - ViewContact& rViewContact, - const ::boost::shared_ptr<cache::PageCache>& rpCache, - const ::boost::shared_ptr<controller::Properties>& rpProperties) - : ViewObjectContactOfPageObj(rObjectContact, rViewContact), - mbInDestructor(false), - mxCurrentPageContents(), - mpCache(rpCache), - mpProperties(rpProperties) -{ - SharedPageDescriptor pDescriptor (GetPageDescriptor()); - OSL_ASSERT(pDescriptor.get()!=NULL); - if (pDescriptor.get() != NULL) - pDescriptor->SetViewObjectContact(this); -} - - - - -PageObjectViewObjectContact::~PageObjectViewObjectContact (void) -{ - mbInDestructor = true; - - GetPageDescriptor()->SetViewObjectContact(NULL); - - if (mpCache.get() != NULL) - { - const SdrPage* pPage = GetPage(); - - if(pPage) - { - mpCache->ReleasePreviewBitmap(GetPage()); - } - } -} - - - - -void PageObjectViewObjectContact::SetCache (const ::boost::shared_ptr<cache::PageCache>& rpCache) -{ - mpCache = rpCache; -} - - - - -Rectangle PageObjectViewObjectContact::GetBoundingBox ( - OutputDevice& rDevice, - BoundingBoxType eType, - CoordinateSystem eCoordinateSystem) const -{ - // Most of the bounding boxes are based on the bounding box of the preview. - // SdrPageObj is a SdrObject, so use SdrObject::aOutRect as model data - const PageObjectViewContact& rPaObVOC(static_cast<PageObjectViewContact&>(GetViewContact())); - Rectangle aBoundingBox(rPaObVOC.GetPageObject().GetLastBoundRect()); - - CoordinateSystem eCurrentCoordinateSystem (ModelCoordinateSystem); - switch(eType) - { - case PageObjectBoundingBox: - { - const SvBorder aPageDescriptorBorder(GetPageDescriptor()->GetModelBorder()); - aBoundingBox.Left() -= aPageDescriptorBorder.Left(); - aBoundingBox.Top() -= aPageDescriptorBorder.Top(); - aBoundingBox.Right() += aPageDescriptorBorder.Right(); - aBoundingBox.Bottom() += aPageDescriptorBorder.Bottom(); - break; - } - case PreviewBoundingBox: - { - // The aBoundingBox already has the right value. - break; - } - case MouseOverIndicatorBoundingBox: - { - const sal_Int32 nBorderWidth (mnMouseOverEffectOffset+mnMouseOverEffectThickness); - const Size aBorderSize (rDevice.PixelToLogic(Size(nBorderWidth,nBorderWidth))); - aBoundingBox.Left() -= aBorderSize.Width(); - aBoundingBox.Top() -= aBorderSize.Height(); - aBoundingBox.Right() += aBorderSize.Width(); - aBoundingBox.Bottom() += aBorderSize.Height(); - break; - } - case FocusIndicatorBoundingBox: - { - const sal_Int32 nBorderWidth (mnFocusIndicatorOffset+1); - const Size aBorderSize (rDevice.PixelToLogic(Size(nBorderWidth,nBorderWidth))); - aBoundingBox.Left() -= aBorderSize.Width(); - aBoundingBox.Top() -= aBorderSize.Height(); - aBoundingBox.Right() += aBorderSize.Width(); - aBoundingBox.Bottom() += aBorderSize.Height(); - break; - } - case SelectionIndicatorBoundingBox: - { - const sal_Int32 nBorderWidth(mnSelectionIndicatorOffset+mnSelectionIndicatorThickness); - const Size aBorderSize (rDevice.PixelToLogic(Size(nBorderWidth,nBorderWidth))); - aBoundingBox.Left() -= aBorderSize.Width(); - aBoundingBox.Top() -= aBorderSize.Height(); - aBoundingBox.Right() += aBorderSize.Width(); - aBoundingBox.Bottom() += aBorderSize.Height(); - break; - } - case PageNumberBoundingBox: - { - Size aModelOffset = rDevice.PixelToLogic(Size(mnPageNumberOffset,mnPageNumberOffset)); - Size aNumberSize (GetPageDescriptor()->GetPageNumberAreaModelSize()); - aBoundingBox = Rectangle ( - Point ( - aBoundingBox.Left() - aModelOffset.Width() - aNumberSize.Width(), - aBoundingBox.Top()), - aNumberSize); - break; - } - - case NameBoundingBox: - break; - - case FadeEffectIndicatorBoundingBox: - Size aModelOffset = rDevice.PixelToLogic(Size (0, mnFadeEffectIndicatorOffset)); - // Flush left just outside the selection rectangle. - aBoundingBox = Rectangle ( - Point ( - aBoundingBox.Left(), - aBoundingBox.Bottom() + aModelOffset.Height() - ), - rDevice.PixelToLogic ( - IconCache::Instance().GetIcon(BMP_FADE_EFFECT_INDICATOR).GetSizePixel()) - ); - break; - } - - // Make sure the bounding box uses the requested coordinate system. - if (eCurrentCoordinateSystem != eCoordinateSystem) - { - if (eCoordinateSystem == ModelCoordinateSystem) - aBoundingBox = Rectangle( - rDevice.PixelToLogic(aBoundingBox.TopLeft()), - rDevice.PixelToLogic(aBoundingBox.GetSize())); - else - aBoundingBox = Rectangle( - rDevice.LogicToPixel(aBoundingBox.TopLeft()), - rDevice.LogicToPixel(aBoundingBox.GetSize())); - } - return aBoundingBox; -} - -/////////////////////////////////////////////////////////////////////////////////////////////// -// example implementation for primitive usage for PageObjectViewObjectContact - -} } } // end of namespace ::sd::slidesorter::view - -#include <drawinglayer/primitive2d/polygonprimitive2d.hxx> -#include <basegfx/polygon/b2dpolygontools.hxx> -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <drawinglayer/primitive2d/bitmapprimitive2d.hxx> -#include <sd_primitivetypes2d.hxx> -#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> -#include <drawinglayer/primitive2d/textlayoutdevice.hxx> -#include <drawinglayer/primitive2d/textprimitive2d.hxx> -#include <drawinglayer/geometry/viewinformation2d.hxx> -#include <svx/sdr/contact/objectcontact.hxx> - -namespace sd { namespace slidesorter { namespace view { - -/////////////////////////////////////////////////////////////////////////////////////////////// -// All primitives for SdrPageObject visualisation are based on one range which describes -// the size of the inner rectangle for PagePreview visualisation. Use a common implementation -// class for all derived SdPageObjectPrimitives. The SdPageObjectBasePrimitive itself -// is pure virtual - -class SdPageObjectBasePrimitive : public drawinglayer::primitive2d::BufferedDecompositionPrimitive2D -{ -private: - // the inner range of the SdPageObject visualisation - basegfx::B2DRange maRange; - -public: - // constructor and destructor - SdPageObjectBasePrimitive(const basegfx::B2DRange& rRange); - virtual ~SdPageObjectBasePrimitive(); - - // data access - const basegfx::B2DRange& getPageObjectRange() const { return maRange; } - - // compare operator - virtual bool operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const; -}; - -SdPageObjectBasePrimitive::SdPageObjectBasePrimitive(const basegfx::B2DRange& rRange) -: drawinglayer::primitive2d::BufferedDecompositionPrimitive2D(), - maRange(rRange) -{ -} - -SdPageObjectBasePrimitive::~SdPageObjectBasePrimitive() -{ -} - -bool SdPageObjectBasePrimitive::operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const -{ - if(drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::operator==(rPrimitive)) - { - const SdPageObjectBasePrimitive& rCompare = static_cast< const SdPageObjectBasePrimitive& >(rPrimitive); - return (getPageObjectRange() == rCompare.getPageObjectRange()); - } - - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////// -// SdPageObjectPrimitive for selected visualisation - -class SdPageObjectPageBitmapPrimitive : public SdPageObjectBasePrimitive -{ -private: - // the bitmap containing the PagePreview - BitmapEx maBitmapEx; - -protected: - // method which is to be used to implement the local decomposition of a 2D primitive. - virtual Primitive2DSequence create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const; - -public: - // constructor and destructor - SdPageObjectPageBitmapPrimitive( - const basegfx::B2DRange& rRange, - const BitmapEx& rBitmapEx); - ~SdPageObjectPageBitmapPrimitive(); - - // data access - const BitmapEx& getBitmapEx() const { return maBitmapEx; } - - // compare operator - virtual bool operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const; - - // provide unique ID - DeclPrimitrive2DIDBlock() -}; - -Primitive2DSequence SdPageObjectPageBitmapPrimitive::create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const -{ - // add bitmap primitive - // to avoid scaling, use the Bitmap pixel size as primitive size - basegfx::B2DHomMatrix aBitmapTransform; - const Size aBitmapSize(getBitmapEx().GetSizePixel()); - const basegfx::B2DVector aBitmapSizeLogic(rViewInformation.getInverseObjectToViewTransformation() * - basegfx::B2DVector(aBitmapSize.getWidth() - 1, aBitmapSize.getHeight() - 1)); - - // short form for scale and translate transformation - aBitmapTransform.set(0L, 0L, aBitmapSizeLogic.getX()); - aBitmapTransform.set(1L, 1L, aBitmapSizeLogic.getY()); - aBitmapTransform.set(0L, 2L, getPageObjectRange().getMinX()); - aBitmapTransform.set(1L, 2L, getPageObjectRange().getMinY()); - - // add a BitmapPrimitive2D to the result - const Primitive2DReference xReference( - new drawinglayer::primitive2d::BitmapPrimitive2D(getBitmapEx(), aBitmapTransform)); - return Primitive2DSequence(&xReference, 1); -} - -SdPageObjectPageBitmapPrimitive::SdPageObjectPageBitmapPrimitive( - const basegfx::B2DRange& rRange, - const BitmapEx& rBitmapEx) -: SdPageObjectBasePrimitive(rRange), - maBitmapEx(rBitmapEx) -{ -} - -SdPageObjectPageBitmapPrimitive::~SdPageObjectPageBitmapPrimitive() -{ -} - -bool SdPageObjectPageBitmapPrimitive::operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const -{ - if(SdPageObjectBasePrimitive::operator==(rPrimitive)) - { - const SdPageObjectPageBitmapPrimitive& rCompare = static_cast< const SdPageObjectPageBitmapPrimitive& >(rPrimitive); - return (getBitmapEx() == rCompare.getBitmapEx()); - } - - return false; -} - -ImplPrimitrive2DIDBlock(SdPageObjectPageBitmapPrimitive, PRIMITIVE2D_ID_SDPAGEOBJECTPAGEBITMAPPRIMITIVE) - -/////////////////////////////////////////////////////////////////////////////////////////////// -// SdPageObjectPrimitive for selected visualisation - -class SdPageObjectSelectPrimitive : public SdPageObjectBasePrimitive -{ -private: - /// Gap between border of page object and inside of selection rectangle. - static const sal_Int32 mnSelectionIndicatorOffset; - - /// Thickness of the selection rectangle. - static const sal_Int32 mnSelectionIndicatorThickness; - -protected: - // method which is to be used to implement the local decomposition of a 2D primitive. - virtual Primitive2DSequence create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const; - -public: - // constructor and destructor - SdPageObjectSelectPrimitive(const basegfx::B2DRange& rRange); - ~SdPageObjectSelectPrimitive(); - - // provide unique ID - DeclPrimitrive2DIDBlock() -}; - -const sal_Int32 SdPageObjectSelectPrimitive::mnSelectionIndicatorOffset(1); -const sal_Int32 SdPageObjectSelectPrimitive::mnSelectionIndicatorThickness(3); - -Primitive2DSequence SdPageObjectSelectPrimitive::create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const -{ - Primitive2DSequence xRetval(2); - - // since old Width/Height calculations always added a single pixel value, - // it is necessary to create a inner range which is one display unit less - // at the bottom right. - const basegfx::B2DVector aDiscretePixel(rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 1.0)); - const basegfx::B2DRange aAdaptedInnerRange( - getPageObjectRange().getMinX(), getPageObjectRange().getMinY(), - getPageObjectRange().getMaxX() - aDiscretePixel.getX(), getPageObjectRange().getMaxY() - aDiscretePixel.getY()); - - // PaintSelectionIndicator replacement. Grow by offset first - basegfx::B2DRange aDiscreteOuterRange(aAdaptedInnerRange); - aDiscreteOuterRange.grow(mnSelectionIndicatorOffset * aDiscretePixel.getX()); - - // Remember inner border. Make it one bigger in top left since polygons - // do not paint their lower-right corners. Since this is the inner polygon, - // the top-left corders are the ones to grow here - const basegfx::B2DRange aDiscreteInnerRange( - aDiscreteOuterRange.getMinimum() + aDiscretePixel, - aDiscreteOuterRange.getMaximum() - aDiscretePixel); - - // grow by line width - aDiscreteOuterRange.grow((mnSelectionIndicatorThickness - 1) * aDiscretePixel.getX()); - - // create a PolyPolygon from those ranges. For the outer polygon, round edges by - // giving a relative radius to the polygon creator (use mnSelectionIndicatorThickness here, too) - const double fPixelFactor(aDiscretePixel.getX() * (mnSelectionIndicatorThickness + 2.5)); - const double fRelativeRadiusX(fPixelFactor / ::std::max(aDiscreteOuterRange.getWidth(), 1.0)); - const double fRelativeRadiusY(fPixelFactor / ::std::max(aDiscreteOuterRange.getHeight(), 1.0)); - basegfx::B2DPolyPolygon aFramePolyPolygon; - const basegfx::B2DPolygon aRoundedOuterPolygon(basegfx::tools::createPolygonFromRect(aDiscreteOuterRange, fRelativeRadiusX, fRelativeRadiusY)); - - aFramePolyPolygon.append(aRoundedOuterPolygon); - aFramePolyPolygon.append(basegfx::tools::createPolygonFromRect(aDiscreteInnerRange)); - - // add colored PolyPolygon - const svtools::ColorConfig aColorConfig; - static bool bTestWithBrightColors(false); - const basegfx::BColor aFrameColor(bTestWithBrightColors ? basegfx::BColor(0,1,0) : Application::GetSettings().GetStyleSettings().GetMenuHighlightColor().getBColor()); - - xRetval[0] = Primitive2DReference( - new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(aFramePolyPolygon, aFrameColor)); - - // add aRoundedOuterPolygon again as non-filled line polygon to get the roundungs - // painted correctly - xRetval[1] = Primitive2DReference( - new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aRoundedOuterPolygon, aFrameColor)); - - return xRetval; -} - -SdPageObjectSelectPrimitive::SdPageObjectSelectPrimitive(const basegfx::B2DRange& rRange) -: SdPageObjectBasePrimitive(rRange) -{ -} - -SdPageObjectSelectPrimitive::~SdPageObjectSelectPrimitive() -{ -} - -ImplPrimitrive2DIDBlock(SdPageObjectSelectPrimitive, PRIMITIVE2D_ID_SDPAGEOBJECTSELECTPRIMITIVE) - -/////////////////////////////////////////////////////////////////////////////////////////////// -// SdPageObjectPrimitive for border around bitmap visualisation - -class SdPageObjectBorderPrimitive : public SdPageObjectBasePrimitive -{ -protected: - // method which is to be used to implement the local decomposition of a 2D primitive. - virtual Primitive2DSequence create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const; - -public: - // constructor and destructor - SdPageObjectBorderPrimitive(const basegfx::B2DRange& rRange); - ~SdPageObjectBorderPrimitive(); - - // provide unique ID - DeclPrimitrive2DIDBlock() -}; - -Primitive2DSequence SdPageObjectBorderPrimitive::create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const -{ - // since old Width/Height calculations always added a single pixel value, - // it is necessary to create a inner range which is one display unit less - // at the bottom right. - const basegfx::B2DVector aDiscretePixel(rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 1.0)); - const basegfx::B2DRange aAdaptedInnerRange( - getPageObjectRange().getMinX(), getPageObjectRange().getMinY(), - getPageObjectRange().getMaxX() - aDiscretePixel.getX(), getPageObjectRange().getMaxY() - aDiscretePixel.getY()); - - // Paint_Border replacement. (use aBorderColor) - static bool bTestWithBrightColors(false); - const svtools::ColorConfig aColorConfig; - const basegfx::BColor aBorderColor(bTestWithBrightColors ? basegfx::BColor(1,0,0) : Color(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor).getBColor()); - - const Primitive2DReference xReference( - new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(basegfx::tools::createPolygonFromRect(aAdaptedInnerRange), aBorderColor)); - return Primitive2DSequence(&xReference, 1); -} - -SdPageObjectBorderPrimitive::SdPageObjectBorderPrimitive(const basegfx::B2DRange& rRange) -: SdPageObjectBasePrimitive(rRange) -{ -} - -SdPageObjectBorderPrimitive::~SdPageObjectBorderPrimitive() -{ -} - -ImplPrimitrive2DIDBlock(SdPageObjectBorderPrimitive, PRIMITIVE2D_ID_SDPAGEOBJECTBORDERPRIMITIVE) - -/////////////////////////////////////////////////////////////////////////////////////////////// -// SdPageObjectPrimitive for focus visualisation - -class SdPageObjectFocusPrimitive : public SdPageObjectBasePrimitive -{ -private: - /// Gap between border of page object and inside of focus rectangle. - static const sal_Int32 mnFocusIndicatorOffset; - const bool mbContrastToSelected; - -protected: - // method which is to be used to implement the local decomposition of a 2D primitive. - virtual Primitive2DSequence create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const; - -public: - // constructor and destructor - SdPageObjectFocusPrimitive(const basegfx::B2DRange& rRange, const bool bContrast); - ~SdPageObjectFocusPrimitive(); - - // provide unique ID - DeclPrimitrive2DIDBlock() -}; - -const sal_Int32 SdPageObjectFocusPrimitive::mnFocusIndicatorOffset(2); - -Primitive2DSequence SdPageObjectFocusPrimitive::create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const -{ - Primitive2DSequence xRetval(2); - - // since old Width/Height calculations always added a single pixel value, - // it is necessary to create a inner range which is one display unit less - // at the bottom right. - const basegfx::B2DVector aDiscretePixel(rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 1.0)); - const basegfx::B2DRange aAdaptedInnerRange( - getPageObjectRange().getMinX(), getPageObjectRange().getMinY(), - getPageObjectRange().getMaxX() - aDiscretePixel.getX(), getPageObjectRange().getMaxY() - aDiscretePixel.getY()); - - // Paint_FocusIndicator replacement. (black and white). - // imitate Paint_DottedRectangle: First paint a white rectangle and above it a black dotted one - basegfx::B2DRange aFocusIndicatorRange(aAdaptedInnerRange); - aFocusIndicatorRange.grow(mnFocusIndicatorOffset * aDiscretePixel.getX()); - - // create polygon - const basegfx::B2DPolygon aIndicatorPolygon(basegfx::tools::createPolygonFromRect(aFocusIndicatorRange)); - - const StyleSettings& rStyleSettings(Application::GetSettings().GetStyleSettings()); - - // "background" rectangle - const Color aBackgroundColor(mbContrastToSelected ? rStyleSettings.GetMenuHighlightColor() : rStyleSettings.GetWindowColor()); - xRetval[0] = Primitive2DReference( - new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aIndicatorPolygon, Color(COL_WHITE).getBColor())); - - // dotted black rectangle with same geometry - ::std::vector< double > aDotDashArray; - - const sal_Int32 nFocusIndicatorWidth (3); - aDotDashArray.push_back(nFocusIndicatorWidth *aDiscretePixel.getX()); - aDotDashArray.push_back(nFocusIndicatorWidth * aDiscretePixel.getX()); - - // prepare line and stroke attributes - const Color aLineColor(mbContrastToSelected ? rStyleSettings.GetMenuHighlightTextColor() : rStyleSettings.GetWindowTextColor()); - const drawinglayer::attribute::LineAttribute aLineAttribute(aLineColor.getBColor()); - const drawinglayer::attribute::StrokeAttribute aStrokeAttribute( - aDotDashArray, 2.0 * nFocusIndicatorWidth * aDiscretePixel.getX()); - - - xRetval[1] = Primitive2DReference( - new drawinglayer::primitive2d::PolygonStrokePrimitive2D(aIndicatorPolygon, aLineAttribute, aStrokeAttribute)); - - return xRetval; -} - -SdPageObjectFocusPrimitive::SdPageObjectFocusPrimitive(const basegfx::B2DRange& rRange, const bool bContrast) - : SdPageObjectBasePrimitive(rRange), - mbContrastToSelected(bContrast) -{ -} - -SdPageObjectFocusPrimitive::~SdPageObjectFocusPrimitive() -{ -} - -ImplPrimitrive2DIDBlock(SdPageObjectFocusPrimitive, PRIMITIVE2D_ID_SDPAGEOBJECTFOCUSPRIMITIVE) - -/////////////////////////////////////////////////////////////////////////////////////////////// -// SdPageObjectPrimitive for fade effect visualisation - -class SdPageObjectFadeNameNumberPrimitive : public SdPageObjectBasePrimitive -{ -private: - /// Size of width and height of the fade effect indicator in pixels. - static const sal_Int32 mnFadeEffectIndicatorOffset; - - /// Size of width and height of the comments indicator in pixels. - static const sal_Int32 mnCommentsIndicatorOffset; - - /// Gap between border of page object and number rectangle. - static const sal_Int32 mnPageNumberOffset; - - /// the indicator bitmaps. Static since it is usable outside this primitive - /// for size comparisons - static BitmapEx* mpFadeEffectIconBitmap; - static BitmapEx* mpCommentsIconBitmap; - - /// page name, number and needed infos - String maPageName; - sal_uInt32 mnPageNumber; - Font maPageNameFont; - Size maPageNumberAreaModelSize; - - // bitfield - bool mbShowFadeEffectIcon : 1; - bool mbShowCommentsIcon : 1; - bool mbExcluded : 1; - - // private helpers - const BitmapEx& getFadeEffectIconBitmap() const; - const BitmapEx& getCommentsIconBitmap() const; - -protected: - // method which is to be used to implement the local decomposition of a 2D primitive. - virtual Primitive2DSequence create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const; - -public: - // constructor and destructor - SdPageObjectFadeNameNumberPrimitive( - const basegfx::B2DRange& rRange, - const String& rPageName, - sal_uInt32 nPageNumber, - const Font& rPageNameFont, - const Size& rPageNumberAreaModelSize, - bool bShowFadeEffectIcon, - bool bShowCommentsIcon, - bool bExcluded); - ~SdPageObjectFadeNameNumberPrimitive(); - - // data access - const String& getPageName() const { return maPageName; } - sal_uInt32 getPageNumber() const { return mnPageNumber; } - const Font& getPageNameFont() const { return maPageNameFont; } - const Size& getPageNumberAreaModelSize() const { return maPageNumberAreaModelSize; } - bool getShowFadeEffectIcon() const { return mbShowFadeEffectIcon; } - bool getShowCommentsIcon() const { return mbShowCommentsIcon; } - bool getExcluded() const { return mbExcluded; } - - // compare operator - virtual bool operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const; - - // provide unique ID - DeclPrimitrive2DIDBlock() -}; - -const sal_Int32 SdPageObjectFadeNameNumberPrimitive::mnFadeEffectIndicatorOffset(9); -const sal_Int32 SdPageObjectFadeNameNumberPrimitive::mnPageNumberOffset(9); -BitmapEx* SdPageObjectFadeNameNumberPrimitive::mpFadeEffectIconBitmap = 0; - -const BitmapEx& SdPageObjectFadeNameNumberPrimitive::getFadeEffectIconBitmap() const -{ - if(mpFadeEffectIconBitmap == NULL) - { - // prepare FadeEffectIconBitmap on demand - const sal_uInt16 nIconId(Application::GetSettings().GetStyleSettings().GetHighContrastMode() - ? BMP_FADE_EFFECT_INDICATOR_H - : BMP_FADE_EFFECT_INDICATOR); - const BitmapEx aFadeEffectIconBitmap(IconCache::Instance().GetIcon(nIconId).GetBitmapEx()); - const_cast< SdPageObjectFadeNameNumberPrimitive* >(this)->mpFadeEffectIconBitmap = new BitmapEx(aFadeEffectIconBitmap); - } - - return *mpFadeEffectIconBitmap; -} - - -const sal_Int32 SdPageObjectFadeNameNumberPrimitive::mnCommentsIndicatorOffset(9); -BitmapEx* SdPageObjectFadeNameNumberPrimitive::mpCommentsIconBitmap = 0; - -const BitmapEx& SdPageObjectFadeNameNumberPrimitive::getCommentsIconBitmap() const -{ - if(mpCommentsIconBitmap == NULL) - { - // prepare CommentsIconBitmap on demand - const sal_uInt16 nIconId(Application::GetSettings().GetStyleSettings().GetHighContrastMode() - ? BMP_COMMENTS_INDICATOR_H - : BMP_COMMENTS_INDICATOR); - const BitmapEx aCommentsIconBitmap(IconCache::Instance().GetIcon(nIconId).GetBitmapEx()); - const_cast< SdPageObjectFadeNameNumberPrimitive* >(this)->mpCommentsIconBitmap = new BitmapEx(aCommentsIconBitmap); - } - - return *mpCommentsIconBitmap; -} - -Primitive2DSequence SdPageObjectFadeNameNumberPrimitive::create2DDecomposition(const drawinglayer::geometry::ViewInformation2D& rViewInformation) const -{ - const xub_StrLen nTextLength(getPageName().Len()); - const sal_uInt32 nCount( - (getShowFadeEffectIcon() ? 1 : 0) + // FadeEffect icon - (nTextLength ? 1 : 0) + // PageName - 1 + // PageNumber (always) - (getExcluded() ? 2 : 0) // PageNumber crossed out - ); - sal_uInt32 nInsert(0); - Primitive2DSequence xRetval(nCount); - - // since old Width/Height calculations always added a single pixel value, - // it is necessary to create a inner range which is one display unit less - // at the bottom right. - const basegfx::B2DVector aDiscretePixel(rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 1.0)); - const basegfx::B2DRange aAdaptedInnerRange( - getPageObjectRange().getMinX(), getPageObjectRange().getMinY(), - getPageObjectRange().getMaxX() - aDiscretePixel.getX(), getPageObjectRange().getMaxY() - aDiscretePixel.getY()); - - // preapre TextLayouter - drawinglayer::primitive2d::TextLayouterDevice aTextLayouter; - aTextLayouter.setFont(getPageNameFont()); - - // get font attributes - basegfx::B2DVector aTextSizeAttribute; - const drawinglayer::attribute::FontAttribute aFontAttribute( - drawinglayer::primitive2d::getFontAttributeFromVclFont( - aTextSizeAttribute, - getPageNameFont(), - false, - false)); - - // prepare locale; this may need some more information in the future - const ::com::sun::star::lang::Locale aLocale; - - // prepare font color from System - const basegfx::BColor aFontColor(Application::GetSettings().GetStyleSettings().GetFontColor().getBColor()); - - if(getShowFadeEffectIcon()) - { - // prepare fFadeEffect Sizes - const basegfx::B2DVector aFadeEffectBitmapSizeLogic(rViewInformation.getInverseObjectToViewTransformation() * - basegfx::B2DVector( - getFadeEffectIconBitmap().GetSizePixel().getWidth() - 1, - getFadeEffectIconBitmap().GetSizePixel().getHeight() - 1)); - - // Paint_FadeEffectIndicator replacement. - // create transformation. To avoid bitmap scaling, use bitmap size as size - basegfx::B2DHomMatrix aBitmapTransform; - - // short form for scale and translate transformation - aBitmapTransform.set(0L, 0L, aFadeEffectBitmapSizeLogic.getX()); - aBitmapTransform.set(1L, 1L, aFadeEffectBitmapSizeLogic.getY()); - aBitmapTransform.set(0L, 2L, aAdaptedInnerRange.getMinX()); - aBitmapTransform.set(1L, 2L, aAdaptedInnerRange.getMaxY() + ((mnFadeEffectIndicatorOffset + 1) * aDiscretePixel.getX())); - - xRetval[nInsert++] = Primitive2DReference( - new drawinglayer::primitive2d::BitmapPrimitive2D(getFadeEffectIconBitmap(), aBitmapTransform)); - } - - if(nTextLength) - { - // prepare fFadeEffect Sizes since it consumes from text size - const basegfx::B2DVector aFadeEffectBitmapSizeLogic(rViewInformation.getInverseObjectToViewTransformation() * - basegfx::B2DVector( - getFadeEffectIconBitmap().GetSizePixel().getWidth() - 1, - getFadeEffectIconBitmap().GetSizePixel().getHeight() - 1)); - - // Paint_PageName replacement. Get text size - const double fTextWidth(aTextLayouter.getTextWidth(getPageName(), 0, nTextLength)); - const double fTextHeight(getPageNameFont().GetHeight()); - const double fFadeEffectWidth(aFadeEffectBitmapSizeLogic.getX() * 2.0); - const double fFadeEffectTextGap(((mnFadeEffectIndicatorOffset + 2) * aDiscretePixel.getX())); - String aPageName(getPageName()); - - // calculate text start position - double fStartX( - aAdaptedInnerRange.getMaxX() - - fTextWidth - + (aDiscretePixel.getX() * 3.0)); - const double fStartY( - aAdaptedInnerRange.getMaxY() - + fTextHeight - + fFadeEffectTextGap); - const bool bNeedClipping(fStartX < aAdaptedInnerRange.getMinX() + fFadeEffectWidth); - - // if text is too big, clip it - if(bNeedClipping) - { - // new left start - fStartX = aAdaptedInnerRange.getMinX() + fFadeEffectWidth; - - // find out how many characters to use - const double fAvailableLength(aAdaptedInnerRange.getWidth() - fFadeEffectWidth); - static const String aThreePoints(String::CreateFromAscii("...")); - const double fWidthThreePoints(aTextLayouter.getTextWidth(aThreePoints, 0, aThreePoints.Len())); - xub_StrLen a(1); - - for(; a < (xub_StrLen)nTextLength; a++) - { - const double fSnippetLength(aTextLayouter.getTextWidth(aPageName, 0, a)); - - if(fSnippetLength + fWidthThreePoints > fAvailableLength) - { - break; - } - } - - // build new string - aPageName = String(aPageName, 0, a - 1); - aPageName += aThreePoints; - } - - // fill text matrix - basegfx::B2DHomMatrix aTextMatrix; - - aTextMatrix.set(0, 0, aTextSizeAttribute.getX()); - aTextMatrix.set(1, 1, aTextSizeAttribute.getY()); - aTextMatrix.set(0, 2, fStartX); - aTextMatrix.set(1, 2, fStartY); - - // prepare DXTextArray (can be empty one) - const ::std::vector< double > aDXArray; - - // create Text primitive and add to target - xRetval[nInsert++] = Primitive2DReference( - new drawinglayer::primitive2d::TextSimplePortionPrimitive2D( - aTextMatrix, - aPageName, - 0, - aPageName.Len(), - aDXArray, - aFontAttribute, - aLocale, - aFontColor)); - } - - { - // Paint_PageNumber replacement. Get the range where it shall be centered and prepare the string - const double fLeft(aAdaptedInnerRange.getMinX() - (mnPageNumberOffset * aDiscretePixel.getX()) - getPageNumberAreaModelSize().Width()); - const double fTop(aAdaptedInnerRange.getMinY()); - const basegfx::B2DRange aNumberRange(fLeft, fTop, - fLeft + getPageNumberAreaModelSize().Width(), fTop + getPageNumberAreaModelSize().Height()); - const String aPageNumber(String::CreateFromInt32(getPageNumber())); - const xub_StrLen nNumberLen(aPageNumber.Len()); - - // Get text size - const double fTextWidth(aTextLayouter.getTextWidth(aPageNumber, 0, nNumberLen)); - const double fTextHeight(getPageNameFont().GetHeight()); - - // get text start postion - const double fStartX(aNumberRange.getCenterX() - (fTextWidth / 2.0)); - const double fStartY(aNumberRange.getMinY() + fTextHeight + aDiscretePixel.getX()); - - // fill text matrix - basegfx::B2DHomMatrix aTextMatrix; - - aTextMatrix.set(0, 0, aTextSizeAttribute.getX()); - aTextMatrix.set(1, 1, aTextSizeAttribute.getY()); - aTextMatrix.set(0, 2, fStartX); - aTextMatrix.set(1, 2, fStartY); - - // prepare DXTextArray (can be empty one) - const ::std::vector< double > aDXArray; - - // create Text primitive - xRetval[nInsert++] = Primitive2DReference( - new drawinglayer::primitive2d::TextSimplePortionPrimitive2D( - aTextMatrix, - aPageNumber, - 0, - nNumberLen, - aDXArray, - aFontAttribute, - aLocale, - aFontColor)); - - if(getExcluded()) - { - // create a box with strikethrough from top left to bottom right - const basegfx::BColor aActiveColor(Application::GetSettings().GetStyleSettings().GetActiveColor().getBColor()); - basegfx::B2DPolygon aStrikethrough; - - aStrikethrough.append(aNumberRange.getMinimum()); - aStrikethrough.append(aNumberRange.getMaximum()); - - xRetval[nInsert++] = Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D( - basegfx::tools::createPolygonFromRect(aNumberRange), aActiveColor)); - - xRetval[nInsert++] = Primitive2DReference(new drawinglayer::primitive2d::PolygonHairlinePrimitive2D( - aStrikethrough, aActiveColor)); - } - } - - return xRetval; -} - -SdPageObjectFadeNameNumberPrimitive::SdPageObjectFadeNameNumberPrimitive( - const basegfx::B2DRange& rRange, - const String& rPageName, - sal_uInt32 nPageNumber, - const Font& rPageNameFont, - const Size& rPageNumberAreaModelSize, - bool bShowFadeEffectIcon, - bool bShowCommentsIcon, - bool bExcluded) -: SdPageObjectBasePrimitive(rRange), - maPageName(rPageName), - mnPageNumber(nPageNumber), - maPageNameFont(rPageNameFont), - maPageNumberAreaModelSize(rPageNumberAreaModelSize), - mbShowFadeEffectIcon(bShowFadeEffectIcon), - mbShowCommentsIcon(bShowCommentsIcon), - mbExcluded(bExcluded) -{ -} - -SdPageObjectFadeNameNumberPrimitive::~SdPageObjectFadeNameNumberPrimitive() -{ -} - -bool SdPageObjectFadeNameNumberPrimitive::operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const -{ - if(SdPageObjectBasePrimitive::operator==(rPrimitive)) - { - const SdPageObjectFadeNameNumberPrimitive& rCompare = static_cast< const SdPageObjectFadeNameNumberPrimitive& >(rPrimitive); - - return (getPageName() == rCompare.getPageName() - && getPageNumber() == rCompare.getPageNumber() - && getPageNameFont() == rCompare.getPageNameFont() - && getPageNumberAreaModelSize() == rCompare.getPageNumberAreaModelSize() - && getShowFadeEffectIcon() == rCompare.getShowFadeEffectIcon() - && getExcluded() == rCompare.getExcluded()); - } - - return false; -} - -ImplPrimitrive2DIDBlock(SdPageObjectFadeNameNumberPrimitive, PRIMITIVE2D_ID_SDPAGEOBJECTFADENAMENUMBERPRIMITIVE) - -/////////////////////////////////////////////////////////////////////////////////////////////// -// createPrimitive2DSequence -// -// This method will replace the whole painting mechanism. Task is no longer to paint stuff to an OutDev, -// but to provide the necessary geometrical information using primitives. - -Primitive2DSequence PageObjectViewObjectContact::createPrimitive2DSequence(const sdr::contact::DisplayInfo& rDisplayInfo) const -{ - // OutputDevice* pDevice = rDisplayInfo.GetDIOutputDevice(); - OutputDevice* pDevice = GetObjectContact().TryToGetOutputDevice(); - - // get primitive vector from parent class. Do remember the contents for later use; this - // is done to create the page content renderer (see PagePrimitiveExtractor in svx) at the - // original object and to setup the draw hierarchy there so that changes to VCs of displayed - // objects will lead to InvalidatePartOfView-calls which will be forwarded from the helper-OC - // to this VOC in calling a ActionChanged(). - // - // This already produces the displayable page content as a primitive sequence, complete with - // embedding in the page visualizer, clipping if needed and object and aspect ratio - // preparations. It would thus be the base for creating the cached visualisation, too, - // by just painting extactly this primitive sequence. - // - // Currently, this slows down PagePane display heavily. Reason is that the current mechanism - // to react on a SdrObject change in an edit view is to react on the ModelChange and to completely - // reset the PagePane (delete SdrPageObjs, re-create and layout them). This works, but kicks - // the complete sequence of primitive creation at VOCs and VCs and their buffering out of - // memory each time. So there are two choices: - // - // 1, disable getting the sequence of primtives - // -> invalidate uses ModelChange - // -> cache repaint uses complete view creation and repainting - // - // 2, create and use the sequence of primitives - // -> invalidate would not need ModelChange, no destroy/recreate of SdrObjects, no rearrange, - // the invalidate and the following repaint would exactly update the SdrPages involved and - // use the DrawingLayer provided ActionChanged() invalidations over the VOCs and VCs - // -> cache repaint could use the here offered sequence of primitives to re-create the bitmap - // (just hand over the local member to the cache) - // - // For the moment i will use (1) and disable primitive creation for SdrPageObj contents here - - // const_cast< PageObjectViewObjectContact* >(this)->mxCurrentPageContents = ViewObjectContactOfPageObj::createPrimitive2DSequence(rDisplayInfo); - - // assert when this call is issued indirectly from the destructor of - // this instance. This is not allowed and needs to be looked at -#ifdef DBG_UTIL - if(mbInDestructor) - { - OSL_ENSURE(false, "Higher call inside PageObjectViewObjectContact in destructor (!)"); - } -#endif - - // Check if buffering can and shall be done. - if (pDevice != NULL - && !GetObjectContact().isOutputToPrinter() - && !GetObjectContact().isOutputToRecordingMetaFile() - && !mbInDestructor) - { - // get inner and outer logic rectangles. Use model data directly for creation. Do NOT use getBoundRect()/ - // getSnapRect() functionality; these will use the sequence of primitives in the long run itself. SdrPageObj - // is a SdrObject, so use SdrObject::aOutRect as model data. Access using GetLastBoundRect() to not execute anything - PageObjectViewContact& rPaObVOC(static_cast< PageObjectViewContact& >(GetViewContact())); - const Rectangle aInnerLogic(rPaObVOC.GetPageObject().GetLastBoundRect()); - - // get BitmapEx from cache. Do exactly the same as Paint_Preview() to avoid a repaint loop - // caused by slightly different pixel sizes of what the cache sees as pixel size and what is - // calculated here in discrete coordinates. This includes to not use LogicToPiyel on the Rectangle, - // but to do the same as the GetBoundingBox() implementation - const Rectangle aInnerPixel(Rectangle(pDevice->LogicToPixel(aInnerLogic.TopLeft()), pDevice->LogicToPixel(aInnerLogic.GetSize()))); - BitmapEx aBitmapEx(const_cast< PageObjectViewObjectContact* >(this)->GetPreview(rDisplayInfo, aInnerPixel)); - - // prepare inner range - const basegfx::B2DRange aInnerRange(aInnerLogic.Left(), aInnerLogic.Top(), aInnerLogic.Right(), aInnerLogic.Bottom()); - - // provide default parameters - String aPageName; - Font aPageNameFont; - sal_uInt32 nPageNumber(0); - Size aPageNumberAreaModelSize; - bool bShowFadeEffectIcon(false); - bool bShowCommentsIcon(false); - bool bExcluded(false); - - if(GetPage()) - { - const SdPage* pPage = static_cast<const SdPage*>(GetPage()); - - // decide if fade effect indicator will be painted - if(pPage->getTransitionType() > 0) - { - bShowFadeEffectIcon = true; - } - - bShowCommentsIcon = !pPage->getAnnotations().empty(); - - // prepare PageName, PageNumber, font and AreaModelSize - aPageName = pPage->GetName(); - aPageNameFont = *FontProvider::Instance().GetFont(*pDevice); - nPageNumber = ((pPage->GetPageNum() - 1) / 2) + 1; - aPageNumberAreaModelSize = GetPageDescriptor()->GetPageNumberAreaModelSize(); - - if(!aPageName.Len()) - { - aPageName = String(SdResId(STR_PAGE)); - aPageName += String::CreateFromInt32(nPageNumber); - } - - // decide if page is excluded - bExcluded = pPage->IsExcluded(); - } - - // create specialized primitives for focus, select and PagePreview itself - const bool bCreateBitmap(!aBitmapEx.IsEmpty()); - const bool bCreateFocused(GetPageDescriptor()->IsFocused()); - const bool bCreateSelected(GetPageDescriptor()->IsSelected()); - - const sal_uInt32 nCount( - (bCreateBitmap ? 1 : 0) + // bitmap itself - 1 + // border around bitmap (always) - 1 + // FadeEffect, PageName and PageNumber visualisation (always) - (bCreateFocused ? 1 : 0) + // create focused - (bCreateSelected ? 1 : 0) // create selected - ); - sal_uInt32 nInsert(0); - Primitive2DSequence xRetval(nCount); - - if(bCreateBitmap) - { - // add selection indicator if used - xRetval[nInsert++] = Primitive2DReference(new SdPageObjectPageBitmapPrimitive(aInnerRange, aBitmapEx)); - } - - if(true) - { - // add border (always) - xRetval[nInsert++] = Primitive2DReference(new SdPageObjectBorderPrimitive(aInnerRange)); - } - - if(true) - { - // add fade effext, page name and number if used - xRetval[nInsert++] = Primitive2DReference(new SdPageObjectFadeNameNumberPrimitive( - aInnerRange, - aPageName, - nPageNumber, - aPageNameFont, - aPageNumberAreaModelSize, - bShowFadeEffectIcon, - bShowCommentsIcon, - bExcluded)); - } - - if(bCreateSelected) - { - // add selection indicator if used - xRetval[nInsert++] = Primitive2DReference(new SdPageObjectSelectPrimitive(aInnerRange)); - } - - if(bCreateFocused) - { - // add focus indicator if used - xRetval[nInsert++] = Primitive2DReference(new SdPageObjectFocusPrimitive(aInnerRange, bCreateSelected)); - } - - return xRetval; - } - else - { - // Call parent. Output to printer or metafile will use vector data, not cached bitmaps - return ViewObjectContactOfPageObj::createPrimitive2DSequence(rDisplayInfo); - } -} - -BitmapEx PageObjectViewObjectContact::CreatePreview (const DisplayInfo& /*rDisplayInfo*/) -{ - const SdPage* pPage = static_cast<const SdPage*>(GetPage()); - OutputDevice* pDevice = GetObjectContact().TryToGetOutputDevice(); - - if(pDevice) - { - Rectangle aPreviewPixelBox (GetBoundingBox(*pDevice,PreviewBoundingBox,PixelCoordinateSystem)); - - PreviewRenderer aRenderer (pDevice); - Image aPreview (aRenderer.RenderPage( - pPage, - aPreviewPixelBox.GetSize(), - String())); - - return aPreview.GetBitmapEx(); - } - else - { - return BitmapEx(); - } -} - - - - -BitmapEx PageObjectViewObjectContact::GetPreview ( - const DisplayInfo& rDisplayInfo, - const Rectangle& rNewSizePixel) -{ - BitmapEx aBitmap; - - try - { - // assert when this call is issued indirectly from the destructor of - // this instance. This is not allowed and needs to be looked at - OSL_ENSURE(!mbInDestructor, "Higher call inside PageObjectViewObjectContact in destructor (!)"); - - if (!mbInDestructor) - { - if (mpCache != NULL) - { - aBitmap = mpCache->GetPreviewBitmap( - GetPage(), - rNewSizePixel.GetSize()); - mpCache->SetPreciousFlag(GetPage(), true); - } - else - aBitmap = CreatePreview(rDisplayInfo); - } - } - catch (const ::com::sun::star::uno::Exception&) - { - OSL_TRACE("PageObjectViewObjectContact::GetPreview: caught exception"); - } - - return aBitmap; -} - - - - -const SdrPage* PageObjectViewObjectContact::GetPage (void) const -{ - return static_cast<PageObjectViewContact&>(GetViewContact()).GetPage(); -} - - - - -void PageObjectViewObjectContact::ActionChanged (void) -{ - // Even when we are called from destructor we still have to invalide - // the preview bitmap in the cache. - const SdrPage* pPage = GetPage(); - - if(pPage) - { - SdDrawDocument* pDocument = dynamic_cast<SdDrawDocument*>(pPage->GetModel()); - if (mpCache!=NULL && pPage!=NULL && pDocument!=NULL) - { - cache::PageCacheManager::Instance()->InvalidatePreviewBitmap( - pDocument->getUnoModel(), - pPage); - } - } - - // call parent - ViewObjectContactOfPageObj::ActionChanged(); -} - -////////////////////////////////////////////////////////////////////////////// -// helper MouseOverEffectPrimitive -// -// Used to allow view-dependent primitive definition. For that purpose, the -// initially created primitive (here: in createMouseOverEffectPrimitive2DSequence()) -// always has to be view-independent, but the decomposition is made view-dependent. -// Very simple primitive which just remembers the discrete data and applies -// it at decomposition time. - -class MouseOverEffectPrimitive : public drawinglayer::primitive2d::BufferedDecompositionPrimitive2D -{ -private: - basegfx::B2DRange maLogicRange; - sal_uInt32 mnDiscreteOffset; - sal_uInt32 mnDiscreteWidth; - basegfx::BColor maRGBColor; - -protected: - virtual drawinglayer::primitive2d::Primitive2DSequence create2DDecomposition( - const drawinglayer::geometry::ViewInformation2D& rViewInformation) const; - -public: - MouseOverEffectPrimitive( - const basegfx::B2DRange& rLogicRange, - sal_uInt32 nDiscreteOffset, - sal_uInt32 nDiscreteWidth, - const basegfx::BColor& rRGBColor) - : drawinglayer::primitive2d::BufferedDecompositionPrimitive2D(), - maLogicRange(rLogicRange), - mnDiscreteOffset(nDiscreteOffset), - mnDiscreteWidth(nDiscreteWidth), - maRGBColor(rRGBColor) - {} - - // data access - const basegfx::B2DRange& getLogicRange() const { return maLogicRange; } - sal_uInt32 getDiscreteOffset() const { return mnDiscreteOffset; } - sal_uInt32 getDiscreteWidth() const { return mnDiscreteWidth; } - const basegfx::BColor& getRGBColor() const { return maRGBColor; } - - virtual bool operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const; - - DeclPrimitrive2DIDBlock() -}; - -drawinglayer::primitive2d::Primitive2DSequence MouseOverEffectPrimitive::create2DDecomposition( - const drawinglayer::geometry::ViewInformation2D& rViewInformation) const -{ - // get logic sizes in object coordinate system - const double fDiscreteWidth((rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 0.0)).getLength()); - const double fOffset(fDiscreteWidth * getDiscreteOffset()); - const double fWidth(fDiscreteWidth * getDiscreteWidth()); - - // create range (one pixel less to get a good fitting) - basegfx::B2DRange aRange( - getLogicRange().getMinimum(), - getLogicRange().getMaximum() - basegfx::B2DTuple(fDiscreteWidth, fDiscreteWidth)); - - // grow range - aRange.grow(fOffset - (fWidth * 0.5)); - - // create fat line with parameters. The formerly hand-painted edge - // roundings will now be done using rounded edges of this fat line - const basegfx::B2DPolygon aPolygon(basegfx::tools::createPolygonFromRect(aRange)); - const drawinglayer::attribute::LineAttribute aLineAttribute(getRGBColor(), fWidth); - const drawinglayer::primitive2d::Primitive2DReference xReference( - new drawinglayer::primitive2d::PolygonStrokePrimitive2D( - aPolygon, - aLineAttribute)); - - return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); -} - -bool MouseOverEffectPrimitive::operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const -{ - if(drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::operator==(rPrimitive)) - { - const MouseOverEffectPrimitive& rCompare = static_cast< const MouseOverEffectPrimitive& >(rPrimitive); - - return (getLogicRange() == rCompare.getLogicRange() - && getDiscreteOffset() == rCompare.getDiscreteOffset() - && getDiscreteWidth() == rCompare.getDiscreteWidth() - && getRGBColor() == rCompare.getRGBColor()); - } - - return false; -} - -ImplPrimitrive2DIDBlock(MouseOverEffectPrimitive, PRIMITIVE2D_ID_SDMOUSEOVEREFFECTPRIMITIVE) - -////////////////////////////////////////////////////////////////////////////// - -drawinglayer::primitive2d::Primitive2DSequence PageObjectViewObjectContact::createMouseOverEffectPrimitive2DSequence() -{ - drawinglayer::primitive2d::Primitive2DSequence aRetval; - - if(GetPageDescriptor()->IsSelected() && mpProperties.get() && mpProperties->IsShowSelection()) - { - // When the selection frame is visualized the mouse over frame is not - // visible and does not have to be created. - } - else - { - const PageObjectViewContact& rPaObVOC(static_cast<PageObjectViewContact&>(GetViewContact())); - const Rectangle aBoundingBox(rPaObVOC.GetPageObject().GetLastBoundRect()); - const basegfx::B2DRange aLogicRange(aBoundingBox.Left(), aBoundingBox.Top(), aBoundingBox.Right(), aBoundingBox.Bottom()); - const basegfx::BColor aSelectionColor(mpProperties->GetSelectionColor().getBColor()); - const drawinglayer::primitive2d::Primitive2DReference aReference( - new MouseOverEffectPrimitive( - aLogicRange, - mnMouseOverEffectOffset, - mnMouseOverEffectThickness, - aSelectionColor)); - - aRetval = drawinglayer::primitive2d::Primitive2DSequence(&aReference, 1); - } - - return aRetval; -} - - - - -SvBorder PageObjectViewObjectContact::CalculatePageModelBorder ( - OutputDevice* pDevice, - int nPageCount) -{ - SvBorder aModelBorder; - - if (pDevice != NULL) - { - // 1. Initialize the border with the values that do not depend on - // the device. - Size aTopLeftBorders (pDevice->PixelToLogic (Size ( - mnPageNumberOffset+1, - mnSelectionIndicatorOffset + mnSelectionIndicatorThickness))); - Size aBottomRightBorders (pDevice->PixelToLogic (Size ( - mnSelectionIndicatorOffset + mnSelectionIndicatorThickness, - mnFadeEffectIndicatorOffset))); - aModelBorder = SvBorder ( - aTopLeftBorders.Width(), - aTopLeftBorders.Height(), - aBottomRightBorders.Width(), - aBottomRightBorders.Height()); - - - // 2. Add the device dependent values. - - // Calculate the area of the page number. - Size aPageNumberModelSize ( - CalculatePageNumberAreaModelSize (pDevice, nPageCount)); - - // Update the border. - aModelBorder.Left() += aPageNumberModelSize.Width(); - // The height of the page number area is the same as the height of - // the page name area. - aModelBorder.Bottom() += aPageNumberModelSize.Height(); - } - - return aModelBorder; -} - - - - -Size PageObjectViewObjectContact::CalculatePageNumberAreaModelSize ( - OutputDevice* pDevice, - int nPageCount) -{ - // Set the correct font. - Font aOriginalFont (pDevice->GetFont()); - pDevice->SetFont(*FontProvider::Instance().GetFont(*pDevice)); - - String sPageNumberTemplate; - if (nPageCount < 10) - sPageNumberTemplate = String::CreateFromAscii("9"); - else if (nPageCount < 100) - sPageNumberTemplate = String::CreateFromAscii("99"); - else if (nPageCount < 200) - // Just for the case that 1 is narrower than 9. - sPageNumberTemplate = String::CreateFromAscii("199"); - else if (nPageCount < 1000) - sPageNumberTemplate = String::CreateFromAscii("999"); - else - sPageNumberTemplate = String::CreateFromAscii("9999"); - // More then 9999 pages are not handled. - - Size aSize ( - pDevice->GetTextWidth (sPageNumberTemplate), - pDevice->GetTextHeight ()); - - pDevice->SetFont (aOriginalFont); - - return aSize; -} - - - - -model::SharedPageDescriptor - PageObjectViewObjectContact::GetPageDescriptor (void) const -{ - PageObjectViewContact& rViewContact ( - static_cast<PageObjectViewContact&>(GetViewContact())); - PageObject& rPageObject ( - static_cast<PageObject&>(rViewContact.GetPageObject())); - return rPageObject.GetDescriptor(); -} - - - -} } } // end of namespace ::sd::slidesorter::view diff --git a/sd/source/ui/slidesorter/view/SlsTheme.cxx b/sd/source/ui/slidesorter/view/SlsTheme.cxx index 3c43c8917e70..ddc1e4ccd543 100644 --- a/sd/source/ui/slidesorter/view/SlsTheme.cxx +++ b/sd/source/ui/slidesorter/view/SlsTheme.cxx @@ -37,6 +37,7 @@ #include <vcl/outdev.hxx> #include <vcl/image.hxx> +#define USE_SYSTEM_SELECTION_COLOR namespace sd { namespace slidesorter { namespace view { @@ -61,14 +62,6 @@ namespace sd { namespace slidesorter { namespace view { // Off grays #define Arsenic 0x3b444b -const static ColorData SelectionFill1ColorData = 0xb7daf0; -const static ColorData SelectionFill2ColorData = 0x6db5e1; - -const static ColorData MouseOverFill1ColorData = 0x0e85cd; -const static ColorData MouseOverFill2ColorData = 0x044c99; - -const static ColorData Border1ColorData = 0x6db5e1; -const static ColorData Border2ColorData = 0x0e85cd; const static ColorData BackgroundColorData = 0xffffff; @@ -76,8 +69,25 @@ const static ColorData gnMouseOverColor = 0x59000000 | StellaBlue; const static double gnCornerRadius = 4.0; + +ColorData ChangeLuminance (const ColorData aColorData, const int nValue) +{ + Color aColor (aColorData); + if (nValue > 0) + aColor.IncreaseLuminance(nValue); + else + aColor.DecreaseLuminance(-nValue); + return aColor.GetColor(); +} + + + + Theme::Theme (const ::boost::shared_ptr<controller::Properties>& rpProperties) : maBackgroundColor(rpProperties->GetBackgroundColor().GetColor()), + maNormalGradient(), + maSelectedGradient(), + maMouseOverGradient(), maRawShadow(), maInsertionIndicator() { @@ -85,6 +95,8 @@ Theme::Theme (const ::boost::shared_ptr<controller::Properties>& rpProperties) maRawShadow = Image(SdResId(IMAGE_SHADOW)).GetBitmapEx(); maInsertionIndicator = Image(SdResId(IMAGE_INSERTION_INDICATOR_SELECT)).GetBitmapEx(); + + Update(rpProperties); } @@ -93,9 +105,40 @@ Theme::Theme (const ::boost::shared_ptr<controller::Properties>& rpProperties) void Theme::Update (const ::boost::shared_ptr<controller::Properties>& rpProperties) { maBackgroundColor = rpProperties->GetBackgroundColor().GetColor(); +#ifdef USE_SYSTEM_SELECTION_COLOR + const ColorData aSelectionColor (rpProperties->GetSelectionColor().GetColor()); + maSelectedGradient.maFillColor1 = ChangeLuminance(aSelectionColor, +50); + maSelectedGradient.maFillColor2 = ChangeLuminance(aSelectionColor, -10); + maSelectedGradient.maBorderColor1 = ChangeLuminance(aSelectionColor, -10); + maSelectedGradient.maBorderColor2 = ChangeLuminance(aSelectionColor, -30); + + maMouseOverGradient.maFillColor1 = ChangeLuminance(aSelectionColor, -30); + maMouseOverGradient.maFillColor2 = ChangeLuminance(aSelectionColor, -90); + maMouseOverGradient.maBorderColor1 = ChangeLuminance(aSelectionColor, -30); + maMouseOverGradient.maBorderColor2 = ChangeLuminance(aSelectionColor, -10); + +#else + + maSelectedGradient.maFillColor1 = 0xb7daf0; + maSelectedGradient.maFillColor2 = 0x6db5e1; + maSelectedGradient.maBorderColor1 = 0x6db5e1; + maSelectedGradient.maBorderColor2 = 0x0e85cd; + + maMouseOverGradient.maFillColor1 = 0x0e85cd; + maMouseOverGradient.maFillColor2 = 0x044c99; + maMouseOverGradient.maBorderColor1 = 0x6db5e1; + maMouseOverGradient.maBorderColor2 = 0x0e85cd; +#endif + + maNormalGradient.maFillColor1 = maBackgroundColor; + maNormalGradient.maFillColor2 = maBackgroundColor; + maNormalGradient.maBorderColor1 = maBackgroundColor; + maNormalGradient.maBorderColor2 = maBackgroundColor; } + + ::boost::shared_ptr<Font> Theme::CreateFont ( const FontType eType, OutputDevice& rDevice) const @@ -166,8 +209,14 @@ ColorData Theme::GetColor (const ColorType eType) case PageNumberBorder: return Azure; + case PageNumberColor: + return 0x0848a8f; + case Selection: return StellaBlue; + + case PreviewBorder: + return 0x000000; } return 0; } @@ -179,55 +228,40 @@ ColorData Theme::GetGradientColor ( const GradientColorType eType, const GradientColorClass eClass) { + GradientDescriptor* pDescriptor = NULL; switch(eType) { case NormalPage: - switch (eClass) - { - case Border1: - case Border2: - return maBackgroundColor; - - case Fill1: - case Fill2: - return maBackgroundColor; - } + pDescriptor = &maNormalGradient; break; case SelectedPage: - switch (eClass) - { - case Border1: - return Border1ColorData; - - case Border2: - return Border2ColorData; - - case Fill1: - return SelectionFill1ColorData; - - case Fill2: - return SelectionFill2ColorData; - } + pDescriptor = &maSelectedGradient; break; case MouseOverPage: - switch (eClass) - { - case Border1: - return Border1ColorData; - - case Border2: - return Border2ColorData; - - case Fill1: - return MouseOverFill1ColorData; + pDescriptor = &maMouseOverGradient; + break; - case Fill2: - return MouseOverFill2ColorData; - } + default: + OSL_ASSERT(false); break; } + + if (pDescriptor != NULL) + { + switch (eClass) + { + case Border1: return pDescriptor->maBorderColor1; + case Border2: return pDescriptor->maBorderColor2; + case Fill1: return pDescriptor->maFillColor1; + case Fill2: return pDescriptor->maFillColor2; + + default: + OSL_ASSERT(false); + break; + } + } return 0; } diff --git a/sd/source/ui/toolpanel/TaskPaneViewShell.cxx b/sd/source/ui/toolpanel/TaskPaneViewShell.cxx index 2d1475ca980c..287298fdca9b 100644 --- a/sd/source/ui/toolpanel/TaskPaneViewShell.cxx +++ b/sd/source/ui/toolpanel/TaskPaneViewShell.cxx @@ -89,7 +89,8 @@ #ifdef SHOW_TEST_PANEL #include "TestPanel.hxx" #endif -//#define SHOW_COLOR_MENU + +#define SHOW_COLOR_MENU #ifdef SHOW_COLOR_MENU #include "TestMenu.hxx" #endif @@ -191,6 +192,7 @@ public: class ResourceActivationClickHandler { public: + ResourceActivationClickHandler (void); ResourceActivationClickHandler ( const ::boost::shared_ptr<FrameworkHelper>& rpFrameworkHelper, const Reference<drawing::framework::XResourceId>& rxResourceId, @@ -200,7 +202,7 @@ public: private: ::boost::shared_ptr<FrameworkHelper> mpFrameworkHelper; Reference<drawing::framework::XResourceId> mxResourceId; - ControlContainer& mrControlContainer; + ControlContainer* mpControlContainer; }; } // end of anonymouse namespace @@ -299,7 +301,8 @@ void TaskPaneViewShell::Implementation::Setup ( pToolPanel->AddControl ( ColorMenu::CreateControlFactory(), String::CreateFromAscii ("Color Test Menu"), - 0); + 0, + ResourceActivationClickHandler()); #endif #ifdef SHOW_TEST_PANEL @@ -866,13 +869,23 @@ void PanelActivation::operator() (bool) //===== ResourceActivationClickHandler ======================================== +ResourceActivationClickHandler::ResourceActivationClickHandler (void) + : mpFrameworkHelper(), + mxResourceId(), + mpControlContainer(NULL) +{ +} + + + + ResourceActivationClickHandler::ResourceActivationClickHandler ( const ::boost::shared_ptr<FrameworkHelper>& rpFrameworkHelper, const Reference<drawing::framework::XResourceId>& rxResourceId, ControlContainer& rControlContainer) : mpFrameworkHelper(rpFrameworkHelper), mxResourceId(rxResourceId), - mrControlContainer(rControlContainer) + mpControlContainer(&rControlContainer) { } @@ -881,11 +894,14 @@ ResourceActivationClickHandler::ResourceActivationClickHandler ( void ResourceActivationClickHandler::operator () (TitledControl& rTitledControl) { - mrControlContainer.SetExpansionState ( - &rTitledControl, - ControlContainer::ES_EXPAND); - mpFrameworkHelper->GetConfigurationController()->requestResourceActivation( - mxResourceId, drawing::framework::ResourceActivationMode_REPLACE); + if (mxResourceId.is() && mpFrameworkHelper && mpControlContainer!=NULL) + { + mpControlContainer->SetExpansionState ( + &rTitledControl, + ControlContainer::ES_EXPAND); + mpFrameworkHelper->GetConfigurationController()->requestResourceActivation( + mxResourceId, drawing::framework::ResourceActivationMode_REPLACE); + } } diff --git a/sd/source/ui/tools/PreviewRenderer.cxx b/sd/source/ui/tools/PreviewRenderer.cxx index 770ca7fabf6c..4a166b74e1a1 100644 --- a/sd/source/ui/tools/PreviewRenderer.cxx +++ b/sd/source/ui/tools/PreviewRenderer.cxx @@ -418,8 +418,8 @@ void PreviewRenderer::ProvideView (DrawDocShell* pDocShell) } mpView->SetPreviewRenderer( sal_True ); mpView->SetBordVisible(FALSE); - mpView->SetPageBorderVisible(FALSE); - mpView->SetPageVisible(TRUE); + mpView->SetPageBorderVisible(TRUE); + mpView->SetPageVisible(FALSE); } |