office-gobmx/sc
Armin Le Grand d464d505fb Refactor calc non-linear ViewToDevice transform
This change solves the non-linear World-To-View trans-
formation that calc uses due to it's screen rendering
as good as currently possible (AFAIK).
Calcv view  is layouted on pixel base (due to better
homogen distances and full pixel lines between cells),
but this leads to having a non-linear transformation
between discrete units (pixels, view) and model coordinates
(World). In principle, each cell has it's own (so called)
ViewTransformation -> the position on screen depends on
the mappings of all cells top/left from it. This is
obvioulsly non-linear and can sometimes be seen by
producing 'offset' errors when many cells (small and thin)
are shown in low zoom stages.
No better solution for this comes to mind easily. The
extremes are - on the one hand AntiAliasing the whole
calc edit view and accept 'unsharp/AAed' lines - on the
other hand what we have now.
Maybe a future solution could find a mapping that gets
close to linear mapping for the full view. On the long
run this state is hard to keep correct. Even with this
extended solution the mapping of SdrObjects spawning
mutiple cells is assumed 'linear' in that area - which
is in reality currently not the case (!)
Note: This is only true for the screen visualization,
print and/or PDF export do not do that pixel-based
layouting.
Note2: This mechanism is general in DrawingLayer (look
for '.*GridOffset.*'. If it is deactivated by providing
no offsets, the result is the unchanged, linear mapping.

First step: Add interfaces to get a possible GridOffset
at ViewObjectContact. There it belongs, we have a view-
dependent offset per object and view. Add mechanisms to
create on-demand and reach back to the view (aka calc's
derivation of it).

Second step: Implement the on-demand creation, adapt to
use it in ViewObjectContact::getPrimitive2DSequence, add
stuff to reset on zoom change, disable temporarily old
mechanism -> paint already works. Need to adapt the
places from old mechanism where the GridOffset was used,
but no longer the geometry creations.

Third step: Isolated and disabled old mechanism (by
already removing SetGridOffset). Marked all places that
possibly need change with '//Z' tag. Main work now will
be to adapt in the SdrView implementations in svx to know
about having a SdrObject-dependent ViewTransformation
at all (currently not known, was hard-coded at some places
from the old code, ViewTransformation set as MapMode at
a target OutputDevice, not member at SdrView at all...).

Fourth step: Adapt the Handles and OverlayObjects to
use an evtl. existing GridOffset. The mechanism is that
the SdrHdl(s) can be seen as 'Model-Objects', these get
converted to OverlayObjects in the ::CreateB2dIAObject()
implementations, for all SdrMarkView and SdrPageView,
so this is the place where the ObjectContact is known
(the SdrPageWindow *is* a ObjectContact) and the view-
dependent GridOffset can be calculated per SdrObject.
I modified OverlayObject to be able to work with a
set Offset that embeds the created visualization using
this additionally.
Handles get now correctly set and have a working HitTest
(due to that already using the primitives). Some inter-
action stuff already working, some will need more
adaption. We simply have no concept for this stuff...
Refactored to not get dependencies to SdrObject in
ObjectContact.

Fifth Step: Make HitTest work by adding the View-And-
Object dependent GridOffset in the View when HitTest
is triggered. This is in SdrMarkView::CheckSingleSdrObjectHit
where pObj->GetCurrentBoundRect() is used that gets the
view-independent form. To make HitTest work, add a possible
GridOffset.
Since this will be necessary more often in SdrView hierarchy,
added a tooling method (getPossibleGridOffsetForSdrObject)
at that level after checking that at that level will be
reachable at all potential spots.
Inside that method the correct ObjectContact will be identified
and the object-specific offset requested there.

Sixth Step: Adaptions and started some cleanups. Still some
adaptions needed:
- After creation of new object, need to relocate from
  used GridOffset setting to WorldCoordinates
- Interactions, e.g. start with dragging handles or full
  object/points

Seventh Step: React on EndCreateObj. Here, the created
SdrObject is in model coordinates and needs to be adapted
to evtl. GridOffset. This is 'tricky' due to calculating
the possible offset based on new coordinates 'close'
to the target position, but may be in the wrong cell.
Nonetheless this is the best we can do here.
Last (hopefully) missing are now all interaction
viszualizations. They already work and are applied
correctly, but wrong visualized.
Have taken the time to unify adding OverlayObjects for
selection visualization to OverlayManager, see
handleNewOverlayObject. This does all needed when adding
OverlayObjects in one place where the GridOffset can
also be handled. It makles things more safe - not possible
to forget one of the three steps for others.

Eighth Step: Do the same unification for creating the
OverlayGeometry, also rename methods to make usage more
clear. We now have
  SdrHdl::insertNewlyCreatedOverlayObjectForSdrHdl
  SdrDragMethod::insertNewlyCreatedOverlayObjectForSdrDragMethod
which can do the needed GridOffset changes centralized.
Needed to get a ObjectContact for this at SdrDragMethod,
so adapted ::CreateOverlayGeometry implementations
accordingly. Missing is now the implementation in
insertNewlyCreatedOverlayObjectForSdrDragMethod to add
the GridOffset - if used. This has no SdrObject at this
time, so we will need a fallback to do the same using a
Range (Rectangle). The stuff doing this for SdrObject
already has a fallback and is based on using the Rectangle
from the SdrObject anyways, so this will be possible.

Ninth Step: Cleanup of old stuff (no more //Z), adapted
some usages of OverlayObject creations to use
getViewIndependentPrimitive2DContainer instead of the
view dependent parts so that offset applied to
drag-overlays is correct and not already added. Adapted
insertNewlyCreatedOverlayObjectForSdrDragMethod to use
calculateGridOffsetForB2DRange. Use now that instead of
SdrObject-based approach in calc - is more generic.
Getting closer, but still not complete - there is an
error with dragging the grepped handle somehow - the
offset for drag is somehow wrong.

Tenth Step: Corrected that offset error. Of course at
interaction start and progress (move) the coordinates
are in GrifOffset coordinates and need to be corrected
to Model coordinates. Done that at ::BegDragObj and
::MovDragObj, works well.
Of course there are exceptions for the crop-handles, so
needed to add setting the correct parameters at SdrHdl
when these got created, then all works as expected.

The strategy is to *not* change the model data itself
in any way, instead do all changes/adaptions in the
view-only code. This has minimal impact and is needed
due to having a 1:n relationship between model and
views anyways.
There are two directions: All visualizations are adapted
to take the GridOffset into account (SdrObjects, overlay,
handles, InteractionObjects, ...). In the other direction
input like MousePosition is in principle in calc EditView
in 'GridOffset'-coordinates and needs to be mapped back
before usage.

Change-Id: I2ecdd409def96a7248a26a65a22e59eb962880a0
Reviewed-on: https://gerrit.libreoffice.org/64057
Tested-by: Jenkins
Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
2018-11-27 11:33:10 +01:00
..
inc Refactor calc non-linear ViewToDevice transform 2018-11-27 11:33:10 +01:00
qa tdf#45904 Move _XLinkTargetSupplier Java Tests to C++ 2018-11-27 04:12:53 +01:00
res/xml
sdi tdf#107240 tdf#120432 Disable time/date entries in read-only/protected mode 2018-11-15 22:33:14 +01:00
source Refactor calc non-linear ViewToDevice transform 2018-11-27 11:33:10 +01:00
uiconfig/scalc tdf#117720 Delete Max from list Min and delete Min from list Max in CF dialog 2018-11-26 18:38:14 +01:00
util
workben
AllLangMoTarget_sc.mk
common_unoapi_tests.mk
CppunitTest_sc_addin_functions_test.mk
CppunitTest_sc_anchor_test.mk
CppunitTest_sc_annotationobj.mk
CppunitTest_sc_annotationshapeobj.mk
CppunitTest_sc_annotationsobj.mk
CppunitTest_sc_arealinkobj.mk
CppunitTest_sc_arealinksobj.mk
CppunitTest_sc_array_functions_test.mk
CppunitTest_sc_autoformatobj.mk
CppunitTest_sc_bugfix_test.mk
CppunitTest_sc_cache_test.mk
CppunitTest_sc_cellcursorobj.mk
CppunitTest_sc_cellformatsenumeration.mk tdf#45904 Move _XEnumeration tests for ScCellFormatsEnumeration to C++ 2018-11-14 17:32:04 +01:00
CppunitTest_sc_cellobj.mk
CppunitTest_sc_cellrangeobj.mk
CppunitTest_sc_cellrangesobj.mk
CppunitTest_sc_cellsenumeration.mk tdf#45904 Move _XEnumeration for ScCellsEnumeration to C++ 2018-11-14 03:50:27 +01:00
CppunitTest_sc_chart2dataprovider.mk
CppunitTest_sc_chart_regression_test.mk
CppunitTest_sc_check_data_pilot_field.mk
CppunitTest_sc_check_data_pilot_table.mk
CppunitTest_sc_check_xcell_ranges_query.mk
CppunitTest_sc_cond_format_merge.mk
CppunitTest_sc_consolidationdescriptorobj.mk
CppunitTest_sc_copypaste.mk
CppunitTest_sc_core.mk
CppunitTest_sc_database_functions_test.mk
CppunitTest_sc_databaserangeobj.mk
CppunitTest_sc_databaserangesobj.mk
CppunitTest_sc_datapilotfieldobj.mk
CppunitTest_sc_datapilotitemobj.mk
CppunitTest_sc_datapilottableobj.mk
CppunitTest_sc_datapilottablesobj.mk
CppunitTest_sc_dataprovider.mk
CppunitTest_sc_datatransformation.mk
CppunitTest_sc_datetime_functions_test.mk
CppunitTest_sc_ddelinkobj.mk
CppunitTest_sc_documentconfigurationobj.mk
CppunitTest_sc_editfieldobj_cell.mk
CppunitTest_sc_editfieldobj_header.mk
CppunitTest_sc_filterdescriptorbaseobj.mk
CppunitTest_sc_filters_test.mk
CppunitTest_sc_financial_functions_test.mk
CppunitTest_sc_functiondescriptionobj.mk
CppunitTest_sc_functionlistobj.mk
CppunitTest_sc_functions_test_old.mk
CppunitTest_sc_headerfootercontentobj.mk
CppunitTest_sc_html_export_test.mk
CppunitTest_sc_importdescriptorbaseobj.mk
CppunitTest_sc_indexenumeration_cellannotationsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-19 18:04:47 +01:00
CppunitTest_sc_indexenumeration_cellarealinksenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-19 19:41:42 +01:00
CppunitTest_sc_indexenumeration_databaserangesenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-19 21:54:41 +01:00
CppunitTest_sc_indexenumeration_datapilotfieldsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-18 04:57:38 +01:00
CppunitTest_sc_indexenumeration_datapilotitemsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-22 06:58:49 +01:00
CppunitTest_sc_indexenumeration_datapilottablesenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-18 04:57:52 +01:00
CppunitTest_sc_indexenumeration_ddelinksenumeration.mk tdf#45904 Move XEnumeration tests to C++ 2018-11-15 02:05:27 +01:00
CppunitTest_sc_indexenumeration_functiondescriptionenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-20 06:53:15 +01:00
CppunitTest_sc_indexenumeration_labelrangesenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-18 08:59:30 +01:00
CppunitTest_sc_indexenumeration_namedrangesenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-18 22:03:38 +01:00
CppunitTest_sc_indexenumeration_scenariosenumeration.mk tdf#45904 Move XEnumeration Java test to C++ 2018-11-15 17:50:49 +01:00
CppunitTest_sc_indexenumeration_sheetcellrangesenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-20 06:59:51 +01:00
CppunitTest_sc_indexenumeration_sheetlinksenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-18 08:05:35 +01:00
CppunitTest_sc_indexenumeration_spreadsheetsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-20 08:45:17 +01:00
CppunitTest_sc_indexenumeration_spreadsheetviewpanesenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-20 08:59:37 +01:00
CppunitTest_sc_indexenumeration_subtotalfieldsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-20 10:18:46 +01:00
CppunitTest_sc_indexenumeration_tableautoformatenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-20 07:00:02 +01:00
CppunitTest_sc_indexenumeration_tablechartsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-20 23:19:46 +01:00
CppunitTest_sc_indexenumeration_tablecolumnsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-17 00:40:34 +01:00
CppunitTest_sc_indexenumeration_tableconditionalentryenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-17 06:32:01 +01:00
CppunitTest_sc_indexenumeration_tablerowsenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-16 07:43:44 +01:00
CppunitTest_sc_indexenumeration_textfieldenumeration.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-17 00:40:20 +01:00
CppunitTest_sc_information_functions_test.mk
CppunitTest_sc_labelrangeobj.mk
CppunitTest_sc_labelrangesobj.mk
CppunitTest_sc_logical_functions_test.mk
CppunitTest_sc_macros_test.mk
CppunitTest_sc_mark_test.mk
CppunitTest_sc_mathematical_functions_test.mk
CppunitTest_sc_modelobj.mk
CppunitTest_sc_namedrangeobj.mk
CppunitTest_sc_namedrangesobj.mk
CppunitTest_sc_new_cond_format_api.mk
CppunitTest_sc_opencl_test.mk
CppunitTest_sc_outlineobj.mk
CppunitTest_sc_parallelism.mk
CppunitTest_sc_perfobj.mk
CppunitTest_sc_pivottable_filters_test.mk
CppunitTest_sc_range_test.mk
CppunitTest_sc_rangelst_test.mk
CppunitTest_sc_recentfunctionsobj.mk
CppunitTest_sc_recordchanges.mk
CppunitTest_sc_scenariosobj.mk
CppunitTest_sc_screenshots.mk
CppunitTest_sc_shapeobj.mk
CppunitTest_sc_sheetlinkobj.mk
CppunitTest_sc_sortdescriptorbaseobj.mk
CppunitTest_sc_spreadsheet_functions_test.mk
CppunitTest_sc_spreadsheetsettings.mk
CppunitTest_sc_spreadsheetsettingsobj.mk
CppunitTest_sc_statistical_functions_test.mk
CppunitTest_sc_styleloaderobj.mk
CppunitTest_sc_subsequent_export_test.mk
CppunitTest_sc_subsequent_filters_test.mk
CppunitTest_sc_subtotaldescriptorbaseobj.mk
CppunitTest_sc_subtotalfieldobj.mk
CppunitTest_sc_tableconditionalentryobj.mk
CppunitTest_sc_tableconditionalformatobj.mk
CppunitTest_sc_tablesheetobj.mk
CppunitTest_sc_tablesheetsobj.mk
CppunitTest_sc_tablevalidationobj.mk
CppunitTest_sc_tabviewobj.mk
CppunitTest_sc_text_functions_test.mk
CppunitTest_sc_tiledrendering.mk
CppunitTest_sc_ucalc.mk
CppunitTest_sc_uniquecellformatsenumeration.mk tdf#45904 Move XEnumeration tests for ScUniqueCellFormatsEnumeration to C++ 2018-11-15 06:47:49 +01:00
CppunitTest_sc_viewpaneobj.mk
IwyuFilter_sc.yaml tdf#42949 Fix IWYU warnings in sc/qa/{perf,unit}/* 2018-11-20 10:42:40 +01:00
JunitTest_sc_complex.mk Fix many Java subsequentcheck test by using JUH 2018-11-09 07:37:50 +01:00
JunitTest_sc_unoapi_1.mk Simplify and fix Java UNO API test makefiles 2018-11-09 07:37:00 +01:00
JunitTest_sc_unoapi_2.mk Simplify and fix Java UNO API test makefiles 2018-11-09 07:37:00 +01:00
JunitTest_sc_unoapi_3.mk Simplify and fix Java UNO API test makefiles 2018-11-09 07:37:00 +01:00
JunitTest_sc_unoapi_4.mk Simplify and fix Java UNO API test makefiles 2018-11-09 07:37:00 +01:00
JunitTest_sc_unoapi_6.mk Simplify and fix Java UNO API test makefiles 2018-11-09 07:37:00 +01:00
JunitTest_sc_unoapi_7.mk Simplify and fix Java UNO API test makefiles 2018-11-09 07:37:00 +01:00
Library_sc.mk
Library_scd.mk
Library_scfilt.mk
Library_scqahelper.mk
Library_scui.mk
Library_vbaobj.mk
Makefile
Module_sc.mk tdf#45904 Move XEnumeration Java tests to C++ 2018-11-22 06:58:49 +01:00
Package_opencl.mk
Package_res_xml.mk
PythonTest_sc_python.mk
README
TODO.performance
UIConfig_scalc.mk Revert "NB tabbed compact calc: copy files to install dir" 2018-11-09 11:03:05 +01:00
UITest_autofilter.mk
UITest_calc_tests.mk
UITest_calc_tests2.mk
UITest_calc_tests3.mk
UITest_calc_tests4.mk
UITest_calc_tests6.mk
UITest_conditional_format.mk
UITest_goalSeek.mk
UITest_hide_cols.mk
UITest_hideShowSheet.mk uitest Calc Show sheet dialog 2018-11-16 08:22:16 +01:00
UITest_inputLine.mk
UITest_key_f4.mk
UITest_options.mk
UITest_protect.mk
UITest_range_name.mk
UITest_search_replace.mk
UITest_signatureLine.mk
UITest_solver.mk
UITest_statistics.mk
UITest_textCase.mk
UITest_validity.mk

Spreadsheet application code.

You can dump some information in a dbgutil build:

=== CTRL+SHIFT+F12 ===

Dumps the column width of the first 20 columns.

=== CTRL+SHIFT+F11 ===

Dumps the graphic objects and their position and size in pixel.

=== CTRL+SHIFT+F9 ===

Dumps the SfxItemSet representing the cell properties' of the
current selection as a xml file. The file will be named dump.xml

=== The Cache Format ===

ScDocument::StoreTabToCache allows storing the content (not the formatting)
of a table to a binary cache format.

The format is column orientated which allows quick serialization of the table.

Header:
    * Number of Columns: 64 bit unsigned integer

Column:
    * Column Index: 64 bit unsigned integer
    * Column Size: 64 bit unsigned integer
    * For each cell type block a new ColumnBlock

ColumnBlock:
    * Start Row: 64 bit unsigned integer
    * Block Size: 64 bit unsigned integer
    * Type: 8 bit unsigned integer
        - 0 : empty
        - 1 : numeric
            * for each cell: 64 bit IEEE 754 double precision value
        - 2 : string
            * for each cell: 32 bit signed string length followed by string length bytes of the string (UTF-8)
        - 3 : formula
            * for each cell: 32 bit signed string length followed by the formula in R1C1 notation as a string