Dear LibreOffice Community,
GSoC progress for week #4.
> Blog Posts:
Blog post for week #3 and #4: https://bayramcicek.com.tr/libreoffice-dev/2021/07/05/week-03-04-gsoc.html
> Group selection works with Drawing objects, but doesn't work
with raster images / Writer
Writer can group shapes(rectangles, circles), text boxes and draw
images(from Draw/Calc); but this feature does not work on raster
images because images in Writer handled as Frame
objects(Graphics/holding images/bitmaps).
Last 2 weeks, I was working on "drawing objects" to understand how grouping works. I worked mainly on debugging and finding why raster images does not group with shapes. Here is what I found:
(All code pointers are in the blog post)
const SdrMarkList &rMrkList = pDView->GetMarkedObjectList();
> In SwFEShell::SelectObj, SAL_DEBUG( rMrkList.GetMarkDescription() ) returns:
For shapes: "shapes"
For 2+ shapes: "2 shapes"
For draw images: "Image with transparency"
For text box: "Text Frame"
For raster images: "[Drawing object]"
"[Drawing object]" defined as STR_ObjNameSingulNONE. This means GetMarkDescription() doesn't know what the raster images?
> Contents by position:
Shape : OBJCNT_SIMPLE
Raster images : OBJCNT_GRF
> Selection Type:
Shape : SelectionType::DrawObject
Raster images : SelectionType::Graphic (CNT_GRF)
> Selecting raster images via SHIFT+CLICK add them in rMrkList, but only 1 of them:
While shapes added normally on the rMrkList, raster
images added only once, then be unmarked, because ::GetFlyFromMarked(
&rMrkList, this ) always returns an address which is
caused to execute pDView->UnmarkAll().
> Frame is not accessible
Another interesting issue is when trying to add(select) a raster image to the shape list (unmarking disabled) debugging warns "warn: /*...*/ frame is not accessible".
SwAccessibleMap::InvalidateCursorPosition:
bool bShapeSelected = false;
// ...
else if( pFESh->IsObjSelected() > 0 )
{
bShapeSelected = true;
aFrameOrObj = static_cast<const SwFrame
*>( nullptr );
}
// ...
OSL_ENSURE( bShapeSelected ||
aFrameOrObj.IsAccessible(GetShell()->IsPreview()),
"frame is not accessible" );
"pFESh->IsObjSelected()" should return GetMarkCount(), not 0. Otherwise bShapeSelected stays false and OSL_ENSURE warns "frame is not accessible":
size_t SwFEShell::IsObjSelected() const
{
if ( IsFrameSelected() || !Imp()->HasDrawView() )
return 0;
return
Imp()->GetDrawView()->GetMarkedObjectList().GetMarkCount();
}
bool SwFEShell::IsFrameSelected() const
{
if ( !Imp()->HasDrawView() )
return false;
else
return nullptr != ::GetFlyFromMarked(
&Imp()->GetDrawView()->GetMarkedObjectList(),
const_cast<SwFEShell*>(this) );
}
When selecting raster images, in SwFEShell::IsFrameSelected():
return nullptr != ::GetFlyFromMarked(/*..*/);
GetFlyFromMarked should return false 0(null) (as like shapes do), not an address which make nullptr != 0x01... true.
I also looked at Draw and Calc to see how images are handled. Images are converted a drawing objects and have the same attributes like shapes. But in Writer, images have different attributes and handling.
> Summary of last 2 weeks
- Tried to understand how shapes grouped together- Debugging
> Next week TO-DO:
Thank you all.
Regards, Bayram Çiçek
_______________________________________________ LibreOffice mailing list LibreOffice@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/libreoffice