Week #4 Report - GSoC - 100 Paper Cuts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear LibreOffice Community,

GSoC progress for week #4.

> Blog Posts:

Blog post for week #2: https://bayramcicek.com.tr/libreoffice-dev/2021/07/04/week-02-gsoc.html

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)

> All selected objects store in rMrkList list:
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:

    - Make raster images selectable(group) with SHIFT+CLICK

Please let me know if you have any suggestions about group selection of raster images.

Thank you all.

--
Regards,
Bayram Çiçek
_______________________________________________
LibreOffice mailing list
LibreOffice@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/libreoffice

[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux