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 dev-unsubscr...@api.openoffice.org
For additional commands send email to sy...@api.openoffice.org
with Subject: help

Reply via email to