Page 1 of 1

Multiple RTF controls each with its own bar

PostPosted: Wed Oct 12, 2022 2:07 am
by hua
How to code multiple RTF controls on a dialog with each having its own bar?

TIA

Image

Re: Multiple RTF controls each with its own bar

PostPosted: Sun Oct 16, 2022 2:38 am
by cnavarro
I don't know if I understood your problem correctly
Do you mean that you can customize the buttonbar of each RICHEDIT control?
Please put the code of the program in the image above to be able to work on it.

Re: Multiple RTF controls each with its own bar

PostPosted: Sun Oct 16, 2022 6:38 am
by Antonio Linares
Dear Hua,

If I properly understood you, you have to do the following:

1. use "RichEdi5.ch" instead of "RichEdit.ch"

2. Do the REDEFINEs this way:

REDEFINE RICHEDIT5 ::hoGets["edu_1"] VAR ::hGets["edu_1"] ID 301 OF ::oFolder:aDialogs[1] BARBUTTON

Please notice the use of RICHEDIT5 and BARBUTTON

3. Finally to keep visible the buttonbars all the time do this:
Code: Select all  Expand view
      ACTIVATE DIALOG ::oDlg CENTERED ;
          ON INIT ( o:hoTitles[ "edu_1" ]:AddText( 15, 20, "First",,,,, oFont3 ),;
                    o:hoGets["edu_1"]:oBar:Move( 0, 0 ), o:hoGets["edu_1"]:oBar:Show(), o:hoGets["edu_1"]:lBar := .F., .T. )

4. There is a problem in the Class as the ButtonBar can't be visible all the time or the user will overwrite the bar, so better don't use this:
o:hoGets["edu_1"]:oBar:Show(), o:hoGets["edu_1"]:lBar := .F.

5. You can hide the bar when the user types doing:
o:hoGets["edu_1"]:bKeyDown = { || o:hoGets["edu_1"]:oBar:Hide() }
to show the buttonbar again, the user must move the mouse over the top of the richedit

Re: Multiple RTF controls each with its own bar

PostPosted: Sun Oct 16, 2022 3:49 pm
by cnavarro
Thanks Antonio
When I implemented the TRichEdt5 class, and added the option to have a buttonbar included in the control, the idea was also to have the possibility that the user could define his own buttonbar.
To do this, it is simple:
1.- Add the DATA bBuildBar to the class
Code: Select all  Expand view

   DATA   bBuildBar
 

2.- Change in the New method
Code: Select all  Expand view

   ::bBuildBar  := { || BuildRichEditBar( Self, Self, , , .T. ) }
   if ::lBar
      ::oBar := XEval( ::bBuildBar, ::oWnd, Self ) // BuildRichEditBar( Self, Self, , , .T. )
      //::oTop := ::oBar
      ::oBar:Hide()
   endif
 

3.- Change in the Redefine method
Code: Select all  Expand view

   ::bBuildBar  := { || BuildRichEditBar( Self, Self, , , .T. ) }
   if ::lBar
      ::bInit := { || ::oBar := XEval( ::bBuildBar, ::oWnd, Self ), ::oBar:Hide() }
   endif
 

Re: Multiple RTF controls each with its own bar

PostPosted: Tue Oct 18, 2022 9:46 am
by hua
cnavarro wrote:I don't know if I understood your problem correctly
Do you mean that you can customize the buttonbar of each RICHEDIT control?
Please put the code of the program in the image above to be able to work on it.


There 2 goals I would like to achieve with regards to the RTF control:
1. To have each oRtf have its own buttonbar
2. Each oRtf supports all the basic shortcut keys common in Windows when doing editing such as Ctrl+B for Bold, Ctrl-I for Italic, Ctrl-C for Copy, Ctrl-V for Paste, etc.

Below is the requested source.
Code: Select all  Expand view

#include "fivewin.CH"
#include "ttitle.ch"
#include "RichEdi5.ch"

procedure main()
  hr():activate()
return
//----------------------------------------------------------------------
class hr
  data oDlg, oSay, hRtfDll
  data oDbPerson, oFolder
  data hoTitles, hoGets, hGets init {=>}

  method activate()
  method createTitle(oTitle, oFont)
  method refresh()
endclass
//----------------------------------------------------------------------
method activate() class HR
  LOCAL cNotes, oBtnOK, oBtnCnl, oBtnPrn, oSay, oldarea := select()

  LOCAL cTitl := "Title On FolderEx", oFont3, oFnt

  local omfont2 :=TFont():New( "TIMES NEW ROMAN", 0, -24, .F., .f., 0, 1, 650,.T.,,, 0, 3, 2, 1 )

  LOCAL bReturn := <||
                          oFnt:end()
                          oMFont2:end()
                          oFont3:end()
                   >

  local cGet := "", oTitle, cName, o := self

  DEFINE FONT oFnt NAME "SYSTEM_FIXED_FONT" SIZE 0, -12
  DEFINE FONT oFont3 NAME "Verdana" SIZE 0, -20 bold


  ::hGets["edu_1"] := ""
  ::hGets["edu_2"] := ""
  ::hGets["edu_3"] := ""

  ::hRtfDll := LoadLibrary( "Riched20.dll" )
  DEFINE DIALOG ::oDlg RESOURCE "hr" TITLE cTitl FONT oFnt

    REDEFINE FOLDEREX ::oFolder ID 110 OF ::oDlg   ;
     PROMPT "&Education", "&Others" DIALOGS "hr_edu", "Sub1" BOTTOM

       ::oFolder:aDialogs[1]:lTransparent := .f.
       ::oFolder:aDialogs[2]:lTransparent := .f.

       // sub- folders
       REDEFINE TITLE ::hoTitles["edu_1"] ID 102 of ::oFolder:aDialogs[1] SHADOW BOTTOMRIGHT
       REDEFINE RICHEDIT5 ::hoGets["edu_1"] VAR ::hGets["edu_1"] ID 301 OF ::oFolder:aDialogs[1] BARBUTTON

       REDEFINE TITLE ::hoTitles["edu_2"] ID 104 of ::oFolder:aDialogs[1] SHADOW BOTTOMRIGHT
       REDEFINE RICHEDIT5 ::hoGets["edu_2"] VAR ::hGets["edu_1"] ID 105 OF ::oFolder:aDialogs[1] BARBUTTON

       REDEFINE TITLE ::hoTitles["edu_3"] ID 101 of ::oFolder:aDialogs[1] SHADOW BOTTOMRIGHT
       REDEFINE RICHEDIT5 ::hoGets["edu_3"] VAR ::hGets["edu_1"] ID 106 OF ::oFolder:aDialogs[1] BARBUTTON



       REDEFINE BUTTON oBtnOK ID 111 OF ::oDlg                                          ;
          ACTION (                                                                    ;
                   oBtnCnl:click()                                                    ;
                 )

       REDEFINE BUTTON oBtnCnl ID 112 OF ::oDlg                                     ;
          ACTION (                                                                        ;
                   ::oDlg:End()                                                             ;
                 )                                                                        ;

       REDEFINE BUTTON oBtnPrn ID 113 OF ::oDlg

       ACTIVATE DIALOG ::oDlg CENTERED                                                    ;
          ON INIT (                                                                       ;
                    o:refresh(),                                                          ;
                    o:CreateTitle(o:hoTitles["edu_1"], oFont3, "Formal Education"),       ;
                    o:CreateTitle(o:hoTitles["edu_2"], oFont3, "Tertiary Education"),     ;
                    o:CreateTitle(o:hoTitles["edu_3"], oFont3, "Professional Education")  ;
                  )

       EVAL( bReturn )
       FreeLibrary( ::hRtfDll )

RETURN (NIL)
//---------------------------------------------------------------------------
method refresh() class HR
/*
  ::oSay:varput(trim(::oDbPerson:name)+" ("+ trim(::oDbPerson:empno) + ")")

  ::hoGets["edu_1"]:LoadRtf( ::oDbPerson:rtf_edu1 )
  ::hoGets["edu_2"]:LoadRtf( ::oDbPerson:rtf_edu2 )
  ::hoGets["edu_3"]:LoadRtf( ::oDbPerson:rtf_edu3 )
*/

  ::oDlg:update()
return nil
//----------------------------------------------------------------------
method CreateTitle(  oTitle, oFont, cText ) class HR

   @ 2, 55 TITLETEXT OF oTitle TEXT cText FONT oFont
*   @ 10, 10 TITLEIMG OF oTitle RESNAME "users" SIZE 30, 30 REFLEX TRANSPARENT

return nil
//---------------------------------------------------------------------------
 


Code: Select all  Expand view

hr DIALOG 45, 30, 434, 393
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 10, "System"
{
 CONTROL "", 110, "TFolderEx", WS_VISIBLE | WS_TABSTOP, 4, 52, 424, 304
 CONTROL "&Ok", 111, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 132, 369, 50, 14
 CONTROL "&Cancel", 112, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 192, 369, 50, 14
 CONTROL "&Print", 113, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 253, 369, 50, 14
}

hr_edu DIALOG 23, 82, 292, 351
STYLE WS_CHILD
{
 CONTROL "Custom control", 102, "TTITLE", WS_CHILD | WS_VISIBLE, 4, 2, 284, 20
 CONTROL "", 301, "RichEdit50W", ES_LEFT | ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP | ES_WANTRETURN, 3, 24, 286, 88
 CONTROL "", 105, "RichEdit50W", ES_LEFT | ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP | ES_WANTRETURN, 2, 143, 286, 88
 CONTROL "Custom control", 104, "TTITLE", WS_CHILD | WS_VISIBLE, 3, 121, 284, 20
 CONTROL "", 106, "RichEdit50W", ES_LEFT | ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP | ES_WANTRETURN, 2, 258, 286, 88
 CONTROL "Custom control", 101, "TTITLE", WS_CHILD | WS_VISIBLE, 3, 236, 284, 20
}

SUB1 DIALOG 23, 82, 292, 167
STYLE WS_CHILD
{
 CONTROL "", 301, "EDIT", ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 3, 2, 286, 162
}
 

Re: Multiple RTF controls each with its own bar

PostPosted: Tue Oct 18, 2022 9:49 am
by hua
Antonio Linares wrote:Dear Hua,

If I properly understood you, you have to do the following:

1. use "RichEdi5.ch" instead of "RichEdit.ch"

...


Thanks for the reply Antonio.
I managed to change to use RTF5 but when I add the clause BUTTONBAR I get an error when compiling
I was using FWH1912 if that helps.

TIA