Page 1 of 2

Merging data from one TRichViewEdit into another

Posted: Wed May 19, 2010 9:28 pm
by martindholmes
Hi there,

I'm having a problem figuring out how best to handle the merging of styles. I have two TRichViewEdit controls, each with a different default set of styles. I need to copy the contents of one into a location in the other. I'm doing this with

LoadRVFFromStreamEd

My problem is with how to handle the two sets of styles. I want to preserve the appearance of all the text which is being pasted into the target box, but I don't want to change the default set of styles in that box. As far as I can see, these are my options

rvf_sIgnore: when I choose this option, the text is not inserted for some reason. However, I don't think it's the right option anyway.

rvf_sInsertMap: This replaces the current styles in the target RVE with those from the RVF. That's not what I want at all.

rvf_sInsertMerge: Styles from RVF will be mapped to the most similar existing styles. New styles will not be added. This is not what I want either, because I need to preserve any styles in the incoming RVF which are not present in the target RVE.

I think what I need is something like what is available for RTF:

rvrsAddIfNeeded

which uses existing styles where they exist in the target RVE, but adds new ones if necessary. Is there any way to do this using InsertRVFFromStreamEd?

All help appreciated,
Martin

Posted: Thu May 20, 2010 10:13 am
by Sergey Tkachenko
Use InsertRVFFromStream (without "Ed", InsertRVFFromStreamEd is an editing method).

Example: http://www.trichview.com/forums/viewtopic.php?t=1196

Posted: Thu May 20, 2010 12:53 pm
by martindholmes
When I do that, nothing is pasted. This line works:

ufrmComments.rveFeedback.InsertRVFFromStreamEd(AStream);

But this line fails:

ufrmComments.rveFeedback.InsertRVFFromStream(AStream, ufrmComments.rveFeedback.TopLevelEditor.CurItemNo);


This is what populates the stream:

rveSnippets.SaveRVFToStream(AStream, False);
AStream.Position := 0;

Can you see any problem with this? Any idea why it's failing?

Thanks,
Martin

Posted: Thu May 20, 2010 3:30 pm
by Sergey Tkachenko
InsertRVFFromStream is not an editing method.
Before displaying, call ufrmComments.rveFeedback.Format.
And I think you want to add new text to the end, so call:

Code: Select all

ufrmComments.rveFeedback.InsertRVFFromStream(AStream,
  ufrmComments.rveFeedback.ItemCount); 
ufrmComments.rveFeedback.Format;

Posted: Thu May 20, 2010 7:11 pm
by martindholmes
I don't actually want to add new text at the end; I need to add it at the cursor position.

Cheers,
Martin

Posted: Sat May 22, 2010 11:09 am
by Sergey Tkachenko
Then use

Code: Select all

ufrmComments.rveFeedback.InsertRVFFromStreamEd(AStream); 
ufrmComments.rveFeedback must be formatted before this call. Calling Format after InsertRVFFromStreamEd is not needed (like any editing method, it formats the changed paragraphs itself)

Posted: Sat May 22, 2010 5:02 pm
by martindholmes
But that brings me back to my original problem: I can't get the behaviour I need when merging styles. Is there a way to use InsertRVFFromStreamEd with so that it behaves like "rvrsAddIfNeeded " for RTF?

Cheers,
Martin

Posted: Sat May 22, 2010 6:25 pm
by Sergey Tkachenko
Your initial understanding of RVF style mapping options is not correct.

When loading RVF (LoadRVF or LoadRVFFromStream), in the both rvf_sInsertMap and rvf_sInsertMerge modes, styles are replaced.

However, when inserting RVF (InsertRVFFromStream, AppendRVFFromStream, InsertRVFFromStreamEd):
- rvf_sInsertMap - maps styles to the most similar existing styles; this is the analog of rvrsUseClosest for RTF.
- rvf_sInsertMerge - tries to reuse existing styles, adds new styles if necessary; this is the analog of rvrsAddIfNeeded for RTF.

Posted: Sun May 23, 2010 12:36 am
by martindholmes
rvf_sInsertMerge is what I was using, but it's having an odd effect: it seems to replace the default style in the target RVE. Where styles have the same name in the two RVStyles, the style in the target would be overwritten by the style with the same name in the source. That's why I started looking for an alternative in the first place.

How should rvf_sInsertMerge behave when both the source and the target have styles with the same name, but which are actually different?

Cheers,
Martin

Posted: Sun May 23, 2010 6:39 am
by Sergey Tkachenko
Normally, names of styles are ignored when comparing styles on inserting.
If you included rvfoUseStyleNames in RVFOptions, exclude it.

Posted: Tue May 25, 2010 12:24 pm
by martindholmes
rvfo_UseStyleNames is False for both the source and the target RVE. RVFParaStylesReadMode and RVFTextStylesReadMode are both set to rvf_sInsertMerge.

This is the behaviour I see:
  • The default text style for the target RVE is Arial 10pt black.
    The default text style for the source RVE is Arial 10pt green bold.
    I insert the contents of the source RVE at the cursor position in the target, using InsertRVFFromStreamEd.
    The default text style for the target RVE is now 10pt green bold; even when I press return to get new paragraphs, 10pt green bold persists.
Is this what you'd expect to see?

Cheers,
Martin

Posted: Tue May 25, 2010 12:38 pm
by Sergey Tkachenko
This is the expected. The style at the caret position becomes current.
(unless you include rvprDoNotAutoSwitch in its Protection)
When you press Enter, a new paragraph inherits text and paragraph styles of the current paragraph (unless NextStyleNo and/or NextParaNo properties are defined)

Posted: Tue May 25, 2010 12:52 pm
by martindholmes
I have NextStyleNo and NextParaNo set to 0, so that the default style for the target RVE should be preserved, but that doesn't seem to make any difference.

Cheers,
Martin

Posted: Tue May 25, 2010 1:05 pm
by Sergey Tkachenko
Please send me files necessary to reproduce this problem.

Posted: Tue May 25, 2010 8:23 pm
by martindholmes
I'll have to write a little demo app -- it's all embedded in a full-scale application at the moment.

Cheers,
Martin