Re: Toolbar items: how to get them to show the shortcut letter underlined ?

"Rony G. Flatscher" <[email protected]> Wed, 25 May 2011 12:06:33 +0200
Newsgroups gmane.comp.openoffice.devel.api
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------000303040303090506030503
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit


On 25.05.2011 11:22, Mathias Bauer wrote:
> On 25.05.2011 10:34, Rony G. Flatscher wrote:
>>
>> On 25.05.2011 08:35, Mathias Bauer wrote:
>>> On 24.05.2011 22:31, Rony G. Flatscher wrote:
>>>> Hi there,
>>>>
>>>> in the meantime I have been able to add shortcuts to the toolbar items
>>>> and they are operational. However, the shortcut letter is not
>>>> underlined, although using the tilde (~) before the letter to be
>>>> underlined in the "Label" property of the toolbar item.
>>>>
>>>> Is there a different property that I would need to use for having OOo
>>>> underline the shortcut-key?
>>>> (Again it works, using SHIFT+ALT+letter, where ALT is the META2
>>>> KeyModifier.)
>>>>
>>>> TIA,
>>>>
>>>> ---rony
>>>>
>>>>
>>>>
>>>
>>> What do you mean by "again it works, using SHIFT+ALT+LETTER" ?
>> Just that the defined shortcut-keys are operational. E.g. the shortcut
>> for the "~Import" toolbar item gets defined as SHIFT+META2+I and if you
>> press SHIFT+ALT+I (META2 is ALT on my Windows keyboard) the toolbar item
>> gets executed. It is just the case that the "I" does not get underlined
>> in the toolbar item (a button where the text and the assigned icon get
>> displayed).
>
> Sorry for being dense ;-), 
That's o.k., as I have no idea what the relevant information is when
reporting this observation. So "dense" questions hopefully help clarify.

> where did you define the shortcut? If a shortcut is defined in a menu,
> it will executed only if the menu has the focus. I don't think that
> this works in toolbars. If I just ad a tilde to a toolbar item label,
> I don't see a way to execute this label as a command like in a menu.
>
> Are you sure that you don't talk about accelerators (those who are
> assigned to commands using tools-customize-keyboard)?
O.K., I think the best is that I show you the code snippets then.

The code is in ooRexx but excersises the Java API "behind the curtain".
The tilde in ooRexx is the message operator, so left of the tilde is the
receiving object, right of it the message. In case a queryInterface() is
needed, the ooRexx UNO support allows one to merely send the unqualified
interface name to the UNO object in order to retrieve that interface.

Line comments start with two consecutive dashes (--), block comments are
C-like (but can be nested in the Rexx language).

Having said that, here's the snippet, which should give you the exact
information, please look for the area after the comments lead in as "/*
*** shortcut *** */":

    ::routine BNF_toolbar   -- rgf, 2011-05-21: create toolbar for writer module
       use arg xContext, install=.true, location="user"   -- "location": Rexx scripts location

       -- define where to store the toolbar
       ToolbarURL = "private:resource/toolbar/custom_bnf4oootoolbar"

       -- get the user interface configuration
       x_MultiServiceFactory = xContext~getServiceManager~XMultiServiceFactory

       configsupplier = "com.sun.star.ui.ModuleUIConfigurationManagerSupplier"
       x_Supplier = x_MultiServiceFactory~createInstance(configsupplier)~XModuleUIConfigurationManagerSupplier
       
       -- the document type this toolbar is bound to
       DocumentType = "com.sun.star.text.TextDocument"
       -- get the user interface configuration of writer
       x_UIConfigurationManager = x_Supplier~getUIConfigurationManager(DocumentType)

          -- define macros and sequence for toolbar
       arrMacro     =.array  ~of("OOoBNF2Diagram.rex", "OOoBNF2All.rex", -
                                 "OOoBNF2XML.rex"    , "OOoXML2BNF.rex", -
                                 "OOoImport.rex"     , "OOoExport.rex" , -
                                 "OptionGUI.rex"     , "addBNF4OOoStyles.rex" , -
                                 "installBNF4OOo.rex")

    /* *** shortcut *** */
          -- in toolbars the label text does not underline the shortcut char indicated with the tilde '~'
       arrMacroLabel=.array  ~of("BNF2~Diagram"       , "BNF2~All"       , -
                                 "BNF2~XML"           , "XML2~BNF"       , -
                                 "~Import"            , "~Export"        , -
                                 "~Options"           , "Add BNF4OOo ~Styles" ,-
                                 "~Uninstall BNF4OOo" )

    /* *** shortcut *** */
          -- define shortcut key for macros
       arrShortCuts=.array   ~of("D", "A", "X", "B", "I", "E", "O", "S", "U")


    ---
          -- build macro urls
       arrMacroURL=.array~new
       do i=1 to arrMacro~items	-- a.k.a. "commandURLs"
          arrMacroURL[i]="vnd.sun.star.script:BNF4OOo."arrMacro[i]"?language=ooRexx&location="location
       end

          -- define built-in icons to be used for our toolbar items
       arrBuiltinIcons=.array~of(".uno:Imagebutton"    , ".uno:ArrowShapes.striped-right-arrow",  -
                                 ".uno:ArrowShapes.right-arrow", ".uno:ArrowShapes.left-arrow", -
                                 ".uno:ImportDialog"   , ".uno:ExportTo", - -- ".uno:ExportDialog", -
                                 ".uno:FormDesignTools", ".uno:StyleApply", -
                                 ".uno:Delete")

          -- build image name (Java) array
       arrImageNames = bsf.createJavaArray("java.lang.String", arrMacro~items)
       do i=1 to arrMacro~items
          if install=.true then arrImageNames[i]=arrBuiltinIcons[i]   -- install names
                           else arrImageNames[i]=arrMacroUrl[i]       -- uninstall names
       end

          -- get image manager
       xImageManager=x_UIConfigurationManager~getImageManager~XImageManager
       short0=box("short",0)  -- box the primitive short value "0" in a java.lang.Short

       if install=.true then
       do
          xGraphics=xImageManager~getImages(short0,arrImageNames)  -- load images by name
             -- now define new names for images
          do i=1 to arrMacro~items
             arrImageNames[i]=arrMacroUrl[i]              -- uninstall names
          end
             -- save images with new name
          xImageManager~insertImages(short0,arrImageNames,xGraphics)
       end
       else  /* uninstall */
       do
          xImageManager~removeImages(short0,arrImageNames)-- remove images by name
       end

       xImageManager~store    -- make changes permanent

       if install=.true then      -- create and install/replace the BNF toolbar
       do
          -- create a new toolbar for writer
          x_IndexContainer = x_UIConfigurationManager~createSettings

          -- set name of toolbar
          x_Propertyset = x_IndexContainer~XPropertySet
          x_Propertyset~setPropertyValue("UIName", "BNF4OOo")

          normalItem = bsf.getConstant("com.sun.star.ui.ItemType", "DEFAULT") -- normal item


    /* *** shortcut *** */
             -- got shortcut manager, define key with Shift+Alt combination
          oShortCutManager=x_UIConfigurationManager~getShortcutManager
          xShortCutManager=oShortCutManager~XAcceleratorConfiguration

          modifiers =bsf.getConstant("com.sun.star.awt.KeyModifier", "SHIFT")  -- Shift-key
          modifiers+=bsf.getConstant("com.sun.star.awt.KeyModifier", "MOD2")   -- Alt-key

          KeyEventClz=bsf.importClass("com.sun.star.awt.KeyEvent")

    /* *** define toolbar items *** */
             -- create toolbar items and insert them
          idx=0 -- index to insert toolbar item
          do i=1 to arrMacroURL~items
             toolbarbutton = uno.CreateArray(.UNO~PROPERTYVALUE, 4)
             toolbarbutton[1] = uno.createProperty("CommandURL", arrMacroURL[i]  )
             toolbarbutton[2] = uno.createProperty("Label",      arrMacroLabel[i])
             toolbarbutton[3] = uno.createProperty("Type",       normalItem)
             toolbarbutton[4] = uno.createProperty("Visible",    .true)
             x_IndexContainer~insertByIndex(idx, toolbarbutton) -- add toolbar element
             idx+=1

    /* *** shortcut *** */
                -- define shortcut for this MacroURL
             aKeyEvent=KeyEventClz~new     -- create a KeyEvent
             aKeyEvent~Modifiers=modifiers -- set modifiers and shortcut key values
             aKeyEvent~KeyCode  =bsf.getConstant("com.sun.star.awt.Key", arrShortCuts[i])
             xShortCutManager~setKeyEvent(aKeyEvent, arrMacroURL[i])
          end
          xShortCutManager~store      -- save shortcuts

          -- if the toolbar allready exists replace it, otherwise add it to the user interface
          If x_UIConfigurationManager~hasSettings(ToolbarURL) then
             x_UIConfigurationManager~replaceSettings( ToolbarURL, x_IndexContainer )
          else
             x_UIConfigurationManager~insertSettings( ToolbarURL, x_IndexContainer )

       end
       else     -- remove BNF toolbar
       do
          If x_UIConfigurationManager~hasSettings(ToolbarURL) then
             x_UIConfigurationManager~removeSettings( ToolbarURL )
       end

       /*
         needed in order to have OOo/LO display icon+text in toolbar!

       cf.: http://www.oooforum.org/forum/viewtopic.phtml?t=66911

           REM See org.openoffice.Office.UI.WindowState.xcs for all possible properties
           REM *** Style: 0 = symbol buttons, 1 = text buttons, 2 = symbols+text butto
       */
       serviceName="com.sun.star.ui.WindowStateConfiguration"
       oWindowState = x_MultiServiceFactory~createInstance(serviceName)
       xWindowState = oWindowState~XNameAccess

       oBasicWindowState = xWindowState~getByName( documentType )
       xBasicWindowState = oBasicWindowState~XNameContainer

       aWindowStateData = uno.CreateArray(.UNO~PROPERTYVALUE, 1)
       aWindowStateData[1] = uno.createProperty("Style", box("short",2))

       if xBasicWindowState~hasByName( ToolbarURL ) then
          xBasicWindowState~replaceByName( ToolbarURL, aWindowStateData )
       else
          xBasicWindowState~insertByName( ToolbarURL, aWindowStateData )

       x_UIConfigurationManager~XUIConfigurationPersistence~store
      

If this is not possible with toolbar item labels, is there another
possibility to still achieve the underlining in the toolbar label text
when displayed to the user?

TIA,

---rony

-- 
-----------------------------------------------------------------
To unsubscribe send email to [email protected]
For additional commands send email to [email protected]
with Subject: help

--------------000303040303090506030503
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
On 25.05.2011 11:22, Mathias Bauer wrote:
<blockquote cite="mid:[email protected]" type="cite">On
25.05.2011 10:34, Rony G. Flatscher wrote:
  <br>
  <blockquote type="cite"><br>
On 25.05.2011 08:35, Mathias Bauer wrote:
    <br>
    <blockquote type="cite">On 24.05.2011 22:31, Rony G. Flatscher
wrote:
      <br>
      <blockquote type="cite">Hi there,
        <br>
        <br>
in the meantime I have been able to add shortcuts to the toolbar items
        <br>
and they are operational. However, the shortcut letter is not
        <br>
underlined, although using the tilde (~) before the letter to be
        <br>
underlined in the "Label" property of the toolbar item.
        <br>
        <br>
Is there a different property that I would need to use for having OOo
        <br>
underline the shortcut-key?
        <br>
(Again it works, using SHIFT+ALT+letter, where ALT is the META2
        <br>
KeyModifier.)
        <br>
        <br>
TIA,
        <br>
        <br>
---rony
        <br>
        <br>
        <br>
        <br>
      </blockquote>
      <br>
What do you mean by "again it works, using SHIFT+ALT+LETTER" ?
      <br>
    </blockquote>
Just that the defined shortcut-keys are operational. E.g. the shortcut
    <br>
for the "~Import" toolbar item gets defined as SHIFT+META2+I and if you
    <br>
press SHIFT+ALT+I (META2 is ALT on my Windows keyboard) the toolbar
item
    <br>
gets executed. It is just the case that the "I" does not get underlined
    <br>
in the toolbar item (a button where the text and the assigned icon get
    <br>
displayed).
    <br>
  </blockquote>
  <br>
Sorry for being dense ;-), </blockquote>
That's o.k., as I have no idea what the relevant information is when
reporting this observation. So "dense" questions hopefully help clarify.<br>
<br>
<blockquote cite="mid:[email protected]" type="cite">where did
you define the shortcut? If a shortcut is defined in a menu, it will
executed only if the menu has the focus. I don't think that this works
in toolbars. If I just ad a tilde to a toolbar item label, I don't see
a way to execute this label as a command like in a menu.
  <br>
  <br>
Are you sure that you don't talk about accelerators (those who are
assigned to commands using tools-customize-keyboard)?
  <br>
</blockquote>
O.K., I think the best is that I show you the code snippets then. <br>
<br>
The code is in ooRexx but excersises the Java API "behind the curtain".
The tilde in ooRexx is the message operator, so left of the tilde is
the receiving object, right of it the message. In case a
queryInterface() is needed, the ooRexx UNO support allows one to merely
send the unqualified interface name to the UNO object in order to
retrieve that interface.<br>
<br>
Line comments start with two consecutive dashes (--), block comments
are C-like (but can be nested in the Rexx language).<br>
<br>
Having said that, here's the snippet, which should give you the exact
information, please look for the area after the comments lead in as "/*
*** shortcut *** */":<br>
<br>
<blockquote>
  <pre>::routine BNF_toolbar   -- rgf, 2011-05-21: create toolbar for writer module
   use arg xContext, install=.true, location="user"   -- "location": Rexx scripts location

   -- define where to store the toolbar
   ToolbarURL = "private:resource/toolbar/custom_bnf4oootoolbar"

   -- get the user interface configuration
   x_MultiServiceFactory = xContext~getServiceManager~XMultiServiceFactory

   configsupplier = "com.sun.star.ui.ModuleUIConfigurationManagerSupplier"
   x_Supplier = x_MultiServiceFactory~createInstance(configsupplier)~XModuleUIConfigurationManagerSupplier
   
   -- the document type this toolbar is bound to
   DocumentType = "com.sun.star.text.TextDocument"
   -- get the user interface configuration of writer
   x_UIConfigurationManager = x_Supplier~getUIConfigurationManager(DocumentType)

      -- define macros and sequence for toolbar
   arrMacro     =.array  ~of("OOoBNF2Diagram.rex", "OOoBNF2All.rex", -
                             "OOoBNF2XML.rex"    , "OOoXML2BNF.rex", -
                             "OOoImport.rex"     , "OOoExport.rex" , -
                             "OptionGUI.rex"     , "addBNF4OOoStyles.rex" , -
                             "installBNF4OOo.rex")

/* *** shortcut *** */
      -- in toolbars the label text does not underline the shortcut char indicated with the tilde '~'
   arrMacroLabel=.array  ~of("BNF2~Diagram"       , "BNF2~All"       , -
                             "BNF2~XML"           , "XML2~BNF"       , -
                             "~Import"            , "~Export"        , -
                             "~Options"           , "Add BNF4OOo ~Styles" ,-
                             "~Uninstall BNF4OOo" )

/* *** shortcut *** */
      -- define shortcut key for macros
   arrShortCuts=.array   ~of("D", "A", "X", "B", "I", "E", "O", "S", "U")


---
      -- build macro urls
   arrMacroURL=.array~new
   do i=1 to arrMacro~items	-- a.k.a. "commandURLs"
      arrMacroURL[i]="vnd.sun.star.script:BNF4OOo."arrMacro[i]"?language=ooRexx&amp;location="location
   end

      -- define built-in icons to be used for our toolbar items
   arrBuiltinIcons=.array~of(".uno:Imagebutton"    , ".uno:ArrowShapes.striped-right-arrow",  -
                             ".uno:ArrowShapes.right-arrow", ".uno:ArrowShapes.left-arrow", -
                             ".uno:ImportDialog"   , ".uno:ExportTo", - -- ".uno:ExportDialog", -
                             ".uno:FormDesignTools", ".uno:StyleApply", -
                             ".uno:Delete")

      -- build image name (Java) array
   arrImageNames = bsf.createJavaArray("java.lang.String", arrMacro~items)
   do i=1 to arrMacro~items
      if install=.true then arrImageNames[i]=arrBuiltinIcons[i]   -- install names
                       else arrImageNames[i]=arrMacroUrl[i]       -- uninstall names
   end

      -- get image manager
   xImageManager=x_UIConfigurationManager~getImageManager~XImageManager
   short0=box("short",0)  -- box the primitive short value "0" in a java.lang.Short

   if install=.true then
   do
      xGraphics=xImageManager~getImages(short0,arrImageNames)  -- load images by name
         -- now define new names for images
      do i=1 to arrMacro~items
         arrImageNames[i]=arrMacroUrl[i]              -- uninstall names
      end
         -- save images with new name
      xImageManager~insertImages(short0,arrImageNames,xGraphics)
   end
   else  /* uninstall */
   do
      xImageManager~removeImages(short0,arrImageNames)-- remove images by name
   end

   xImageManager~store    -- make changes permanent

   if install=.true then      -- create and install/replace the BNF toolbar
   do
      -- create a new toolbar for writer
      x_IndexContainer = x_UIConfigurationManager~createSettings

      -- set name of toolbar
      x_Propertyset = x_IndexContainer~XPropertySet
      x_Propertyset~setPropertyValue("UIName", "BNF4OOo")

      normalItem = bsf.getConstant("com.sun.star.ui.ItemType", "DEFAULT") -- normal item


/* *** shortcut *** */
         -- got shortcut manager, define key with Shift+Alt combination
      oShortCutManager=x_UIConfigurationManager~getShortcutManager
      xShortCutManager=oShortCutManager~XAcceleratorConfiguration

      modifiers =bsf.getConstant("com.sun.star.awt.KeyModifier", "SHIFT")  -- Shift-key
      modifiers+=bsf.getConstant("com.sun.star.awt.KeyModifier", "MOD2")   -- Alt-key

      KeyEventClz=bsf.importClass("com.sun.star.awt.KeyEvent")

/* *** define toolbar items *** */
         -- create toolbar items and insert them
      idx=0 -- index to insert toolbar item
      do i=1 to arrMacroURL~items
         toolbarbutton = uno.CreateArray(.UNO~PROPERTYVALUE, 4)
         toolbarbutton[1] = uno.createProperty("CommandURL", arrMacroURL[i]  )
         toolbarbutton[2] = uno.createProperty("Label",      arrMacroLabel[i])
         toolbarbutton[3] = uno.createProperty("Type",       normalItem)
         toolbarbutton[4] = uno.createProperty("Visible",    .true)
         x_IndexContainer~insertByIndex(idx, toolbarbutton) -- add toolbar element
         idx+=1

/* *** shortcut *** */
            -- define shortcut for this MacroURL
         aKeyEvent=KeyEventClz~new     -- create a KeyEvent
         aKeyEvent~Modifiers=modifiers -- set modifiers and shortcut key values
         aKeyEvent~KeyCode  =bsf.getConstant("com.sun.star.awt.Key", arrShortCuts[i])
         xShortCutManager~setKeyEvent(aKeyEvent, arrMacroURL[i])
      end
      xShortCutManager~store      -- save shortcuts

      -- if the toolbar allready exists replace it, otherwise add it to the user interface
      If x_UIConfigurationManager~hasSettings(ToolbarURL) then
         x_UIConfigurationManager~replaceSettings( ToolbarURL, x_IndexContainer )
      else
         x_UIConfigurationManager~insertSettings( ToolbarURL, x_IndexContainer )

   end
   else     -- remove BNF toolbar
   do
      If x_UIConfigurationManager~hasSettings(ToolbarURL) then
         x_UIConfigurationManager~removeSettings( ToolbarURL )
   end

   /*
     needed in order to have OOo/LO display icon+text in toolbar!

   cf.: <a class="moz-txt-link-freetext" href="http://www.oooforum.org/forum/viewtopic.phtml?t=66911">http://www.oooforum.org/forum/viewtopic.phtml?t=66911</a>

       REM See org.openoffice.Office.UI.WindowState.xcs for all possible properties
       REM *** Style: 0 = symbol buttons, 1 = text buttons, 2 = symbols+text butto
   */
   serviceName="com.sun.star.ui.WindowStateConfiguration"
   oWindowState = x_MultiServiceFactory~createInstance(serviceName)
   xWindowState = oWindowState~XNameAccess

   oBasicWindowState = xWindowState~getByName( documentType )
   xBasicWindowState = oBasicWindowState~XNameContainer

   aWindowStateData = uno.CreateArray(.UNO~PROPERTYVALUE, 1)
   aWindowStateData[1] = uno.createProperty("Style", box("short",2))

   if xBasicWindowState~hasByName( ToolbarURL ) then
      xBasicWindowState~replaceByName( ToolbarURL, aWindowStateData )
   else
      xBasicWindowState~insertByName( ToolbarURL, aWindowStateData )

   x_UIConfigurationManager~XUIConfigurationPersistence~store
  </pre>
</blockquote>
If this is not possible with toolbar item labels, is there another
possibility to still achieve the underlining in the toolbar label text
when displayed to the user?<br>
<br>
TIA,<br>
<br>
---rony<br>
<br>
</body>
</html>

--------------000303040303090506030503--