summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2013-03-24 14:08:14 +0100
committerNoel Power <noel.power@suse.com>2013-06-19 15:20:47 +0000
commitff7280bbb169deaaa5b813ba07a7bfdb715a0482 (patch)
tree393df4640bf71557e7a24640f06e3d8f168c178a
parentb1927a686c74287bb0d0356818700e019714b59d (diff)
fdo#62617 display groups on multiple layers correctly
It is possible to group objects from different layers, so it is an error to rely on layer ID when checking visibility of a group. This problem was partially obscured by the fact that SdrObjGroup::GetLayer() returns 0 if its subobjects are on different layers and 0 is a valid layer ID. (cherry picked from commit 09d4525b11f396a68ca7c5cbb1ae3462db40c77c) Change-Id: I0ef75544a26817154642185864cafd4e6734fa38 Signed-off-by: David Tardon <dtardon@redhat.com> Reviewed-on: https://gerrit.libreoffice.org/4357 Reviewed-by: Noel Power <noel.power@suse.com> Tested-by: Noel Power <noel.power@suse.com>
-rw-r--r--svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx3
-rw-r--r--svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx9
-rw-r--r--svx/source/sdr/contact/viewobjectcontactofgroup.cxx9
-rw-r--r--svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx7
4 files changed, 27 insertions, 1 deletions
diff --git a/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx b/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx
index e189a63f1a73..7a0596aa6414 100644
--- a/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx
+++ b/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx
@@ -49,6 +49,9 @@ namespace sdr
// This method recursively paints the draw hierarchy.
virtual drawinglayer::primitive2d::Primitive2DSequence getPrimitive2DSequenceHierarchy(DisplayInfo& rDisplayInfo) const;
+
+ private:
+ virtual bool isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const;
};
} // end of namespace contact
} // end of namespace sdr
diff --git a/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx b/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx
index e366bbda02f3..e5b1f13a60c6 100644
--- a/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx
+++ b/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx
@@ -34,6 +34,7 @@
//////////////////////////////////////////////////////////////////////////////
// predeclarations
class SdrObject;
+class SetOfByte;
//////////////////////////////////////////////////////////////////////////////
@@ -43,6 +44,14 @@ namespace sdr
{
class SVX_DLLPUBLIC ViewObjectContactOfSdrObj : public ViewObjectContact
{
+ /** Test whether the primitive is visible on any layer from @c aLayers
+
+ This should be overriden by ViewObjectContacts of SDR classes
+ that have subparts which can be on different layers (that is,
+ SdrObjGroup .-)
+ */
+ virtual bool isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const;
+
protected:
const SdrObject& getSdrObject() const;
diff --git a/svx/source/sdr/contact/viewobjectcontactofgroup.cxx b/svx/source/sdr/contact/viewobjectcontactofgroup.cxx
index 3f47bb4ebe73..ee2c63031a08 100644
--- a/svx/source/sdr/contact/viewobjectcontactofgroup.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofgroup.cxx
@@ -34,6 +34,7 @@
#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <basegfx/tools/canvastools.hxx>
#include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/svdobj.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -107,6 +108,14 @@ namespace sdr
}
return xRetval;
}
+
+ bool ViewObjectContactOfGroup::isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const
+ {
+ SetOfByte aObjectLayers;
+ getSdrObject().getMergedHierarchyLayerSet(aObjectLayers);
+ aObjectLayers &= aLayers;
+ return !aObjectLayers.IsEmpty();
+ }
} // end of namespace contact
} // end of namespace sdr
diff --git a/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx b/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
index d9a285f3b83c..b1e9fa9279da 100644
--- a/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
@@ -57,12 +57,17 @@ namespace sdr
{
}
+ bool ViewObjectContactOfSdrObj::isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const
+ {
+ return aLayers.IsSet(getSdrObject().GetLayer());
+ }
+
bool ViewObjectContactOfSdrObj::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
{
const SdrObject& rObject = getSdrObject();
// Test layer visibility
- if(!rDisplayInfo.GetProcessLayers().IsSet(rObject.GetLayer()))
+ if(!isPrimitiveVisibleOnAnyLayer(rDisplayInfo.GetProcessLayers()))
{
return false;
}