Hi all Thanks to Thorsten pointing the old (2004) pyUno
I revived it recently and made it workable again, removing some unnecessary things but it is in my plans to make it cleaner as a lot of things is outdated (eg. old OOo links to idl reference - need to be updated). I hope to find time in a near future btw, here is the version i'm actally using the basic use to instrospect an object at runtime is rather simple inside a pyUNo script : from pyXray import XrayBox XrayBox(self.ctx, theUnoObject) self.ctx, is the context Feel free to include it in LibreOffice sources if you find it usefull, provided the licence is ok (otherwise, i may ask my old employer, but there should be no problem, just let me know) I really hope that it will be usefull for someone (as an introspection tool or sample of pyUno script). Let me know and feel free to ask if any question HTH Laurent
# (C) Copyright 2004 Indesko SARL <http://indesko.com> # Author: Laurent Godard <lgod...@indesko.com> (old email) # Laurent Godard <lgodard.li...@laposte.net> # based on Xray Basic macro from Bernard Marcelly # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # import uno, unohelper # UNO GUI toolkit from com.sun.star.awt.WindowClass import TOP, SIMPLE from com.sun.star.awt.PushButtonType import STANDARD as standard from com.sun.star.awt.PushButtonType import OK as ok from com.sun.star.awt.PushButtonType import CANCEL as cancel from com.sun.star.awt.PushButtonType import HELP as help from com.sun.star.awt.TextAlign import CENTER as center from com.sun.star.awt.TextAlign import LEFT as left from com.sun.star.awt.TextAlign import RIGHT as right # used UNO listeners from com.sun.star.awt import XActionListener from com.sun.star.awt import XItemListener from com.sun.star.awt import XMouseListener # UNO typeClass handling for instrospection from com.sun.star.uno.TypeClass import VOID as unoVoid from com.sun.star.uno.TypeClass import CHAR as unoChar from com.sun.star.uno.TypeClass import BOOLEAN as unoBoolean from com.sun.star.uno.TypeClass import BYTE as unoByte from com.sun.star.uno.TypeClass import SHORT as unoShort from com.sun.star.uno.TypeClass import UNSIGNED_SHORT as unoUnsignedShort from com.sun.star.uno.TypeClass import LONG as unoLong from com.sun.star.uno.TypeClass import UNSIGNED_LONG as unoUnsignedLong from com.sun.star.uno.TypeClass import HYPER as unoHyper from com.sun.star.uno.TypeClass import UNSIGNED_HYPER as unoUnsignedHyper from com.sun.star.uno.TypeClass import FLOAT as unoFloat from com.sun.star.uno.TypeClass import DOUBLE as unoDouble from com.sun.star.uno.TypeClass import STRING as unoString from com.sun.star.uno.TypeClass import TYPE as unoType from com.sun.star.uno.TypeClass import ANY as unoAny from com.sun.star.uno.TypeClass import ENUM as unoEnum from com.sun.star.uno.TypeClass import TYPEDEF as unoTypeDef from com.sun.star.uno.TypeClass import STRUCT as unoStruct from com.sun.star.uno.TypeClass import UNION as unoUnion from com.sun.star.uno.TypeClass import EXCEPTION as unoException from com.sun.star.uno.TypeClass import SEQUENCE as unoSequence from com.sun.star.uno.TypeClass import ARRAY as unoArray from com.sun.star.uno.TypeClass import INTERFACE as unoInterface from com.sun.star.uno.TypeClass import SERVICE as unoService from com.sun.star.uno.TypeClass import MODULE as unoModule from com.sun.star.uno.TypeClass import INTERFACE_METHOD as unoInterfaceMethod from com.sun.star.uno.TypeClass import INTERFACE_ATTRIBUTE as unoInterfaceAttribute from com.sun.star.uno.TypeClass import UNKNOWN as unoUnknown from com.sun.star.uno.TypeClass import PROPERTY as unoProperty from com.sun.star.uno.TypeClass import CONSTANT as unoConstant from com.sun.star.uno.TypeClass import CONSTANTS as unoConstants from com.sun.star.uno.TypeClass import SINGLETON as unoSingleton # file utilities from os import sep from os import mkdir # path logo from os import path from sys import modules logo_path = path.dirname (path.abspath (modules["pyXray"].__file__)) #logo_path = logo_path + sep + 'logo.jpg' logo_path="" #Browser for SDK Querying from os import environ as OS_ENVIRON #if sep == '/': # problem on invoking konqueror # http://aspn.activestate.com/ASPN/Mail/Message/python-Tutor/2184915 # if OS_ENVIRON['BROWSER']=='kfmclient openProfile webbrowsing': # OS_ENVIRON['BROWSER']='konqueror' import webbrowser my_browser = webbrowser.get() ##################################################### # # # pyXray # # # # XrayBox (context, object) # # # ##################################################### # USER PARAMETERS to UPDATE # Gui language # supported : fr, en GUI_LANGUAGE = 'fr' # path to SDK IDL reference if sep == '/': # Linux #SDK_ADDRESS = '/home/laurent/OpenOffice.org1.1.0/OpenOffice.org1.1_SDK/docs/common/ref/' #TODO : enable web IDL browsing SDK_ADDRESS = 'http://api.openoffice.org/docs/common/ref/' else: #windows SDK_ADDRESS = 'C:\\Program Files\\Applications\\OOO\\OpenOffice.org1.1_Beta_2_SDK\\docs\\common\\ref\\' ##################################################### class XrayBox(unohelper.Base): """Inspect UNO object, link to sdk and recusrsive calls""" def __init__(self, aContext, UNO_Object): """acontext : a Valid UNO context UNO_Object : the object to inspect """ self.VERSION = '0.6 beta' self.ctx = aContext self.smgr = aContext.ServiceManager # UI Dialog object self.dialog=None # List of openned Listeners self.lst_listeners={} # What is currently handled : # 'property', 'method', 'interface', 'service' or 'listener' self.cur_display='' # History management self.nb_histo_obj = -1 self.lst_histo_obj = {} self.lst_histo_name={} # Create GUI self._setTranslation(GUI_LANGUAGE) self.dialog=self._createBox() self._addListeners() self._initializeObject(UNO_Object) #execute the dialog --> blocking call self.dialog.execute() #end --> release listeners and dispose dialog self._removeListeners() self.dialog.dispose() ##################################################### # GUI definition # ##################################################### def _createBox(self): """Create Xray User Interface""" #create the dialog model and set the properties dialog_model = self.smgr.createInstanceWithContext( 'com.sun.star.awt.UnoControlDialogModel', self.ctx) dialog_model.PositionX = 50 dialog_model.Step = 1 dialog_model.TabIndex = 7 dialog_model.Width = 270 dialog_model.Height = 261 dialog_model.PositionY = 63 dialog = self.smgr.createInstanceWithContext( 'com.sun.star.awt.UnoControlDialog', self.ctx) # Frame Afficher : FrameControl1 frame = dialog_model.createInstance( 'com.sun.star.awt.UnoControlGroupBoxModel') frame.PositionX = 3 frame.TabIndex = 0 frame.Height = 64 frame.Width = 104 frame.PositionY = 2 dialog_model.insertByName('FrameControl1', frame) frame.Label = self.gui_rsc['FrameControl1'] frame = None # Radio Button group : None radiogroup = dialog_model.createInstance( 'com.sun.star.awt.UnoControlGroupBoxModel') dialog_model.insertByName('None', radiogroup) # Radio Button Interfaces : BtnSuppInterf radio = dialog_model.createInstance( 'com.sun.star.awt.UnoControlRadioButtonModel') radio.PositionX = 7 radio.TabIndex = 1 radio.Height = 10 radio.Width = 89 radio.PositionY = 43 radio.State = False radio.Label = self.gui_rsc['BtnSuppInterf'] dialog_model.insertByName('BtnSuppInterf', radio ) # Radio Button Modeles : BtnMethods radio = dialog_model.createInstance( 'com.sun.star.awt.UnoControlRadioButtonModel') radio.PositionX = 7 radio.TabIndex = 2 radio.Height = 10 radio.Width = 46 radio.PositionY = 23 radio.Label = self.gui_rsc['BtnMethods'] radio.State = False dialog_model.insertByName('BtnMethods', radio ) # Radio Button Proprietes : BtnProperties radio = dialog_model.createInstance( 'com.sun.star.awt.UnoControlRadioButtonModel') radio.PositionX = 7 radio.TabIndex = 3 radio.Height = 10 radio.Width = 45 radio.PositionY = 13 radio.State = True radio.Label = self.gui_rsc['BtnProperties'] dialog_model.insertByName('BtnProperties', radio ) # Radio Button Services : BtnServices radio = dialog_model.createInstance( 'com.sun.star.awt.UnoControlRadioButtonModel') radio.PositionX = 7 radio.TabIndex = 4 radio.Height = 10 radio.Width = 89 radio.PositionY = 33 radio.Label = self.gui_rsc['BtnServices'] radio.State = False dialog_model.insertByName('BtnServices', radio ) # Radio Button Listeners : BtnListeners radio = dialog_model.createInstance( 'com.sun.star.awt.UnoControlRadioButtonModel') radio.PositionX = 7 radio.TabIndex = 4 radio.Height = 10 radio.Width = 89 radio.PositionY = 53 radio.State = False radio.Label = self.gui_rsc['BtnListeners'] dialog_model.insertByName('BtnListeners', radio ) # List detailled : ListInspect a_list= dialog_model.createInstance( 'com.sun.star.awt.UnoControlListBoxModel') a_list.PositionX = 1 a_list.TabIndex = 7 a_list.Width = 130 a_list.Height = 173 a_list.PositionY = 86 a_list.HelpText = self.gui_rsc['ListInspect'] a_list.Dropdown= False dialog_model.insertByName('ListInspect', a_list ) # Text information on line selected in ListInspect 'TxtObjInfosDetail' texte_right=a_list textfield = dialog_model.createInstance( 'com.sun.star.awt.UnoControlEditModel') textfield.PositionX = texte_right.Width + 2 textfield.TabIndex = 8 textfield.Width = dialog_model.Width - textfield .PositionX - 1 textfield.PositionY = texte_right.PositionY + 12 textfield.Height = texte_right.Height - (textfield.PositionY - texte_right.PositionY) textfield.VScroll = True textfield.HScroll = False textfield.MultiLine = True textfield.ReadOnly = True dialog_model.insertByName('TxtObjInfosDetail', textfield ) # label Label0 label = dialog_model.createInstance( 'com.sun.star.awt.UnoControlFixedTextModel') label.PositionX = textfield.PositionX label.TabIndex = 9 label.Width = textfield.Width label.Height = textfield.PositionY - texte_right.PositionY label.PositionY = texte_right.PositionY label.Align = 1 label.Label = self.gui_rsc['Label0'] dialog_model.insertByName('Label0', label) # Button Exit : BtnExit button = dialog_model.createInstance( 'com.sun.star.awt.UnoControlButtonModel') button.PositionX = 210 button.TabIndex = 8 button.Height = 12 button.Width = 53 button.PositionY = 40 button.PushButtonType = cancel button.DefaultButton = True button.Label = self.gui_rsc['BtnExit'] dialog_model.insertByName('BtnExit', button ) # label Label1 label = dialog_model.createInstance( 'com.sun.star.awt.UnoControlFixedTextModel') label.PositionX = 111 label.TabIndex = 9 label.Width = 155 label.Height = 12 label.PositionY = 57 label.Align = 1 label.Label = self.gui_rsc['Label1'] dialog_model.insertByName('Label1', label) # label Author label = dialog_model.createInstance( 'com.sun.star.awt.UnoControlFixedTextModel') label.PositionX = 203 label.TabIndex = 11 label.Width = 67 label.Height = 16 label.PositionY = 19 label.Align = 1 label.MultiLine = True label.TextColor = 0x000000 #label.BackgroundColor = -1 #Transparent # label.Label = u"Laurent Godard\n lgod...@indesko.com" dialog_model.insertByName('LabelAuteur', label) # Logo image = dialog_model.createInstance( 'com.sun.star.awt.UnoControlImageControlModel') image.PositionX = 210 image.Width = 53 image.Height = 15 image.PositionY = 3 image.ScaleImage = True image.ImageURL = "" # unohelper.systemPathToFileUrl(logo_path) image.Enabled = True image.Border = 1 #3D dialog_model.insertByName('ImageLogo', image) # Button Xray : recusive call : DeeperBtn button = dialog_model.createInstance( 'com.sun.star.awt.UnoControlButtonModel') button.PositionX = 111 button.Step = 1 button.TabIndex = 12 button.Height = 12 button.Width = 90 button.PositionY = 40 button.Label = self.gui_rsc['DeeperBtn'] dialog_model.insertByName('DeeperBtn', button ) # Button SDK : SDKBtn2 - proprietes et methodes button = dialog_model.createInstance( 'com.sun.star.awt.UnoControlButtonModel') button.PositionX = 111 button.TabIndex = 13 button.Height = 12 button.Width = 90 button.PositionY = 24 button.Label = self.gui_rsc['SDKBtn2'] dialog_model.insertByName('SDKBtn2', button ) # List Historical examinated objects : ListObj a_list= dialog_model.createInstance( 'com.sun.star.awt.UnoControlListBoxModel') a_list.PositionX = 38 a_list.TabIndex = 14 a_list.Width = 230 a_list.Height = 10 a_list.PositionY = 73 a_list.HelpText = self.gui_rsc['ListObj'] a_list.Dropdown = True a_list.LineCount = 15 a_list.Tag = '' dialog_model.insertByName('ListObj', a_list ) # label Label2 label = dialog_model.createInstance( 'com.sun.star.awt.UnoControlFixedTextModel') label.PositionX = 3 label.TabIndex = 16 label.Height = 10 label.Width = 35 label.PositionY = 73 label.Label = self.gui_rsc['Label2'] dialog_model.insertByName('Label2', label) # text Object Name : OriginName textfield = dialog_model.createInstance( 'com.sun.star.awt.UnoControlEditModel') textfield.PositionX = 111 textfield.TabIndex = 15 textfield.BackgroundColor = 0xccffff textfield.Width = 90 textfield.Height = 10 textfield.PositionY = 6 textfield.Align = center textfield.ReadOnly = True textfield.Tabstop = False dialog_model.insertByName('OriginName', textfield ) # End of objects definition if not dialog.getModel(): dialog.setModel(dialog_model) #UNO toolkit definition toolkit = self.smgr.createInstanceWithContext( 'com.sun.star.awt.Toolkit', self.ctx) a_rect = uno.createUnoStruct( 'com.sun.star.awt.Rectangle' ) a_rect.X = 50 dialog.setTitle ( "pyXray - " + self.VERSION ) a_rect.Width = 270 a_rect.Height = 261 a_rect.Y = 63 win_descriptor = uno.createUnoStruct('com.sun.star.awt.WindowDescriptor') win_descriptor.Type = TOP win_descriptor.ParentIndex = -1 win_descriptor.Bounds = a_rect peer = toolkit.createWindow( win_descriptor ) dialog.createPeer( toolkit, peer ) return dialog # ########################## def _addListeners(self): """Add listeners to dialog""" a_control = self.dialog.getControl('DeeperBtn') the_listener = ButtonXrayListener(self) a_control.addActionListener(the_listener) self.lst_listeners['DeeperBtn'] = the_listener a_control = self.dialog.getControl('BtnMethods') the_listener = OptMethodListener(self) a_control.addActionListener(the_listener) self.lst_listeners['BtnMethods']=the_listener a_control = self.dialog.getControl('BtnProperties') the_listener = OptPropertyListener(self) a_control.addActionListener(the_listener) self.lst_listeners['BtnProperties']=the_listener a_control = self.dialog.getControl('BtnSuppInterf') the_listener = OptInterfaceListener(self) a_control.addActionListener(the_listener) self.lst_listeners['BtnSuppInterf']=the_listener a_control = self.dialog.getControl('BtnServices') the_listener = OptServiceListener(self) a_control.addActionListener(the_listener) self.lst_listeners['BtnServices']=the_listener a_control = self.dialog.getControl('BtnListeners') the_listener = OptListenListener(self) a_control.addActionListener(the_listener) self.lst_listeners['BtnListeners']=the_listener a_control=self.dialog.getControl('ListInspect') the_listener = ListInspectListener(self) a_control.addItemListener(the_listener) self.lst_listeners['ListInspect']=the_listener a_control=self.dialog.getControl('ListObj') the_listener = ListHistoListener(self) a_control.addItemListener(the_listener) self.lst_listeners['ListObj']=the_listener a_control = self.dialog.getControl('SDKBtn2') the_listener = ButtonSDKListener(self) a_control.addActionListener(the_listener) self.lst_listeners['SDKBtn2']=the_listener a_control = self.dialog.getControl('LabelAuteur') the_listener = MouseAuthorListener(self) a_control.addMouseListener(the_listener) self.lst_listeners['LabelAuteur']=the_listener a_control = self.dialog.getControl('ImageLogo') the_listener = MouseAuthorListener(self) a_control.addMouseListener(the_listener) self.lst_listeners['ImageLogo']=the_listener return # ########################### def _removeListeners(self): """ remove listeners on exiting""" a_control = self.dialog.getControl('DeeperBtn') a_control.removeActionListener(self.lst_listeners['DeeperBtn']) a_control = self.dialog.getControl('BtnMethods') a_control.removeActionListener(self.lst_listeners['BtnMethods']) a_control = self.dialog.getControl('BtnProperties') a_control.removeActionListener(self.lst_listeners['BtnProperties']) a_control = self.dialog.getControl('BtnSuppInterf') a_control.removeActionListener(self.lst_listeners['BtnSuppInterf']) a_control = self.dialog.getControl('BtnServices') a_control.removeActionListener(self.lst_listeners['BtnServices']) a_control = self.dialog.getControl('BtnListeners') a_control.removeActionListener(self.lst_listeners['BtnListeners']) a_control = self.dialog.getControl('ListInspect') a_control.removeItemListener(self.lst_listeners['ListInspect']) a_control = self.dialog.getControl('ListObj') a_control.removeItemListener(self.lst_listeners['ListObj']) a_control = self.dialog.getControl('SDKBtn2') a_control.removeActionListener(self.lst_listeners['SDKBtn2']) a_control = self.dialog.getControl('LabelAuteur') a_control.removeMouseListener(self.lst_listeners['LabelAuteur']) a_control = self.dialog.getControl('ImageLogo') a_control.removeMouseListener(self.lst_listeners['ImageLogo']) return ##################################################### # Translation # ##################################################### def _setTranslation(self, language): self.gui_rsc = {} if language == 'fr': self._setLanguage_fr() else: self._setLanguage_en() return def _setLanguage_fr(self): """French translation strings""" self.gui_rsc['FrameControl1'] = u" Afficher " self.gui_rsc['BtnSuppInterf'] = u"Interfaces supportees" self.gui_rsc['BtnMethods'] = u"Methodes" self.gui_rsc['BtnProperties'] = u"Proprietes" self.gui_rsc['BtnServices'] = u"Services" self.gui_rsc['BtnListeners'] = u"Listeners supportes" self.gui_rsc['ListInspect'] = "Selectionner une ligne pour avoir le detail" self.gui_rsc['Label0'] = u"Detail de la selection" self.gui_rsc['BtnExit'] = u"Fermer" self.gui_rsc['Label1'] = u"Vous pouvez selectionner et copier le detail affiche" self.gui_rsc['DeeperBtn'] = u"Xray sur la selection" self.gui_rsc['SDKBtn2'] = u"Documentation du SDK" self.gui_rsc['ListObj'] = "Afficher un objet deja analyse" self.gui_rsc['Label2'] = u"Objet affiche" self.gui_rsc['origin'] = "Origine" self.gui_rsc['no_name'] = "( Pas de Nom )" self.gui_rsc['value'] = "Valeur :" self.gui_rsc['return'] = "Retourne : " self.gui_rsc['arg'] = "Arguments :" self.gui_rsc['no_result'] = "Aucun Resultat" self.gui_rsc['need_XRay'] = "Xray Necessaire" return def _setLanguage_en(self): """English translation strings""" self.gui_rsc['FrameControl1'] = u" Display " self.gui_rsc['BtnSuppInterf'] = u"Supported Interfaces" self.gui_rsc['BtnMethods'] = u"Methods" self.gui_rsc['BtnProperties'] = u"Properties" self.gui_rsc['BtnServices'] = u"Services" self.gui_rsc['BtnListeners'] = u"Supported Listeners" self.gui_rsc['ListInspect'] = "Select a line to see detail" self.gui_rsc['Label0'] = u"Selection detail" self.gui_rsc['BtnExit'] = u"Close" self.gui_rsc['Label1'] = u"You can select and copy the displayed detail" self.gui_rsc['DeeperBtn'] = u"Recursive Xray" self.gui_rsc['SDKBtn2'] = u"SDK documentation" self.gui_rsc['ListObj'] = "Display an already analyzed object" self.gui_rsc['Label2'] = u"Current object" self.gui_rsc['origin'] = "Origin" self.gui_rsc['no_name'] = "( No name )" self.gui_rsc['value'] = "Value :" self.gui_rsc['return'] = "Return : " self.gui_rsc['arg'] = "Arguments :" self.gui_rsc['no_result'] = "No result" self.gui_rsc['need_XRay'] = "Recursive Xray needed" return ##################################################### # Work functions # ##################################################### def _initializeObject(self, obj, obj_name = '', obj_rank = -1 ): self.cur_obj = obj # Update historical list obj_rank_int = int(obj_rank) self.nb_histo_obj = self.nb_histo_obj + 1 self.lst_histo_obj[self.nb_histo_obj] = obj if obj_rank_int == -1: # add an object if self.nb_histo_obj == 0: self.lst_histo_name[0]=self.gui_rsc['origin'] else: self.lst_histo_name[self.nb_histo_obj] = \ self.lst_histo_name[self.nb_histo_obj - 1 ] \ + '.' + obj_name else: self.lst_histo_name[self.nb_histo_obj] = \ self.lst_histo_name[obj_rank_int] \ + '.' + obj_name ctrl_lst_histo=self.dialog.getControl('ListObj') if ctrl_lst_histo.getItemCount() > 0: ctrl_lst_histo.removeItems(0,ctrl_lst_histo.getItemCount()) for i in range(len(self.lst_histo_name)): ctrl_lst_histo.addItem( self.lst_histo_name[i].encode('utf-8'), i ) ctrl_lst_histo.selectItemPos(self.nb_histo_obj, True) # update object name ctrl_lbl_name = self.dialog.getControl('OriginName') try: the_value = obj.ImplementationName except: the_value = self.gui_rsc['no_name'] ctrl_lbl_name.setText(the_value) # switch to properties list ctrl_radio = self.dialog.getControl('BtnProperties') ctrl_radio.State = True return # ########################### def _displayObjects(self, lst): """ Display the list built in listeners""" ctrl_lst_inspect = self.dialog.getControl('ListInspect') ctrl_lst_inspect.removeItems(0,ctrl_lst_inspect.getItemCount()) if len(lst) > 0: lst.sort() for i in range(len(lst)): ctrl_lst_inspect.addItem( lst[i].encode('utf-8'), i ) return # ########################### def _displayInfos(self, analyze): """ Display informations in the right text box """ ctrl_lst_inspect = self.dialog.getControl('ListInspect') ctrl_txt_detail = self.dialog.getControl('TxtObjInfosDetail') ctrl_txt_detail.setText('') obj = self.cur_obj ctx = self.ctx # The introsection object introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx ) inspect = introspection.inspect( obj ) # the examinated topic is a property if self.cur_display == 'property': my_prop = inspect.getProperty(analyze, unohelper.METHOD_CONCEPT_ALL) info = '\t' + my_prop.Type.typeName + '\n\n' info += '\t' info += unohelper._propertymode_to_str(my_prop.Attributes) #Content the_value='' the_value=self._getOjbectValue(obj, my_prop) info = info + '\n\n' + self.gui_rsc['value'] info = info + '\n' + str(the_value) # the examinated topic is a method if self.cur_display == 'method': my_method = inspect.getMethod(analyze, unohelper.METHOD_CONCEPT_ALL) arguments = my_method.ParameterTypes informations = my_method.ParameterInfos info = '\n' + self.gui_rsc['return'] + my_method.ReturnType.Name info = info + '\n\n' + self.gui_rsc['arg'] #arguments for i in range(0, len(arguments)): info = info + '\n\n\t' \ + unohelper._mode_to_str( informations[i].aMode ) \ + ' ' + informations[i].aName info = info+ '\n\t' + arguments[i].Name # content uno_class = my_method.ReturnType.TypeClass if (uno_class != unoVoid) and (len(arguments) == 0): the_value = self._getOjbectValue(obj, my_method) info = info + '\n\n' + self.gui_rsc['value'] info = info + '\n'+the_value # the examinated topic is a service --> no Info if self.cur_display == 'service': info = '' # the examinated topic is an interface --> no Info if self.cur_display == 'interface': info = '' # the examinated topic is a listener --> no Info if self.cur_display == 'listener': info = '' if info != '': detail = analyze + '\n' final_text = detail + info ctrl_txt_detail.setText(final_text) return # ########################### def _getOjbectValue( self, obj, element): # Introspection ctx = self.ctx introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx) inspect = introspection.inspect(obj) the_value = () # Retreives Value and type if self.cur_display == 'property': prop_name=element.Name # Invocation object invocation = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.script.Invocation', ctx) invoc = invocation.createInstanceWithArguments((obj,)) inspect = introspection.inspect( invoc ) #retreive the value method = inspect.getMethod( 'getValue' , unohelper.METHOD_CONCEPT_ALL ) the_value, dummy = method.invoke(invoc,(prop_name,)) type_name = element.Type.typeName if self.cur_display == 'method': the_value, dummy = element.invoke(obj, () ) #uno_class = element.ReturnType.TypeClass type_name = element.ReturnType.Name returned_value = self._getParsedValue(type_name, the_value) return returned_value # ########################### def _getXRayObject(self, obj, name): """ Performs the recusive call of name on obj""" ctx = self.ctx introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx) inspect = introspection.inspect(obj) if self.cur_display =='method': if inspect.hasMethod( name , unohelper.METHOD_CONCEPT_ALL): method = inspect.getMethod(name ,unohelper.METHOD_CONCEPT_ALL) the_value, dummy = method.invoke(obj, () ) if self.cur_display =='property': invocation = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.script.Invocation', ctx) invoc = invocation.createInstanceWithArguments( (obj,) ) inspect = introspection.inspect(invoc) method = inspect.getMethod('getValue', unohelper.METHOD_CONCEPT_ALL) the_value = () the_value, dummy = method.invoke(invoc,(name,)) return the_value # ########################### def _isValideXRay(self, name): """ Is a recursive XRay Valid ?""" is_valid = False ctx = self.ctx introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx) inspect = introspection.inspect( self.cur_obj ) if self.cur_display == 'method': # must return an interface and have no parameter my_method = inspect.getMethod(name, unohelper.METHOD_CONCEPT_ALL) if my_method.ReturnType.TypeClass == unoInterface: is_valid = True if len(my_method.ParameterTypes) > 0: is_valid = False if self.cur_display == 'property': # must return an interface if self._getReturnedType(name) == unoInterface: is_valid = True return is_valid # ########################### def _getReturnedType(self, analize): """ Return the UNO type of the argument. It is a com.sun.star.uno.TypeClass""" obj=self.cur_obj ctx = self.ctx introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx) inspect = introspection.inspect(obj) if self.cur_display == 'method': the_method = inspect.getMethod(analize, unohelper.METHOD_CONCEPT_ALL) returned_type = the_method.ReturnType.TypeClass if self.cur_display == 'property': the_prop = inspect.getProperty(analize, unohelper.PROPERTY_CONCEPT_ALL) returned_type = the_prop.Type.typeClass return returned_type # ########################### def _getParsedValue(self, the_name, the_value): """ Build output of result, can be called recursively""" returned_value = '' uno_type = uno.getTypeByName(the_name) # skip the [] uno_class = uno_type.typeClass if uno_class == unoSequence: # a sequence for i in range(len(the_value)): result = self._getParsedValue(the_name[2:],the_value[i]) returned_value = returned_value + '\n----- ' + str(i) returned_value = returned_value + ' -----\n' + result elif uno_class == unoStruct: # a structure # after many failing tries using CoreReflexion service # use of string manipulation tools a_string = str(the_value) # eg: (com.sun.star.beans.PropertyValue) #{ Name = (string)"FilterName", Handle = (long)0x0, # Value = (any){ (string)"StarOffice XML (Writer)" }, # State = (com.sun.star.beans.PropertyState)DIRECT_VALUE } a = a_string.find('{') cleaner = a_string[a+1:len(a_string)-1] #eg : Name = (string)"FilterName", Handle = (long)0x0, # Value = (any){ (string)"StarOffice XML (Writer)" }, # State = (com.sun.star.beans.PropertyState)DIRECT_VALUE decoupe=cleaner.split(',') result = '' for line in decoupe: # Hexa conversion a = line.find('0x') my_str = '' if a != -1: b = line.find(' ',a) if b == -1: b = len(line) hexa = line[a:b] if hexa.find('-') != -1: # handles negative character !!! my_long = hexa[2:] else: my_long = long(hexa,0) my_str = ' = ' + str(my_long) # Concatenate result = result +' '+ line + my_str + '\n' returned_value = result elif uno_class == unoInterface: returned_value = self.gui_rsc['need_XRay'] elif uno_class == unoBoolean: if the_value == 0: returned_value = "False" else: returned_value = "True" elif uno_class == unoVoid: returned_value = '' else: # other type --> use a string returned_value = str(the_value) return returned_value ##################################################### # SDK Querying # ##################################################### def _displaySDK(self, name): """Retreive or Build the HTML page for the SDK Querying""" #first letter to find index file lcase_name = name.lower() alpha = ord(lcase_name[0]) - ord('a') + 1 if alpha == -1: alpha = 27 # name begins with _ # read index file if (alpha >= 1) & (alpha <= 27): doc_filename = 'index-files' + sep + 'index-' + str(alpha) + '.html' doc_addr = SDK_ADDRESS + doc_filename # Open index file if SDK_ADDRESS[:7] == 'http://': # SDK over http:// file_service = self.smgr.createInstanceWithContext( 'com.sun.star.ucb.SimpleFileAccess', self.ctx) #temp index filename ss = self.smgr.createInstanceWithContext( 'com.sun.star.util.PathSubstitution', self.ctx) work_filename = "$(temp)" + sep + doc_filename work_filename = ss.substituteVariables(work_filename, False) # test if file already retreived if not path.isfile(work_filename[7:]): if not path.isdir(path.dirname(work_filename[7:])): #creates temp indexes directory mkdir(path.dirname(work_filename[7:])) # retreive file file_service.copy(doc_addr,work_filename) # open file file_index = open(work_filename[7:], 'r') #[7:] remove file:// else: # SDK local files file_index = open(doc_addr,'r') #read lines lines = file_index.readlines() file_index.close() is_temp_file = False if (self.cur_display == 'method') | ((self.cur_display == 'property')): resultList = self._listPossibleSDKPages(lines, name) if len(resultList) == 1: is_temp_file = False # Normal case - a file has been found mark1 = '<dt><a href="../' mark2 = '">' a_string = resultList[0] x1 = a_string.find(mark1) if x1 > -1: x1 = x1 + len(mark1) x2 = a_string.find(mark2, x1) if x2 > -1: page_address = a_string[x1:x2] else: is_temp_file = True if len(resultList) == 0: #No result contenu = "Aucun Resultat" else: #more than one result contenu = '' for ii in resultList: contenu = contenu + ii # Build temp HTML file cheminBase = unohelper.systemPathToFileUrl(SDK_ADDRESS) cheminBase = cheminBase[7:len(cheminBase)] #vire file:// a_string = '<html> <head> <title>pyXray Results</title>' a_string = a_string +' <base href="' a_string = a_string + cheminBase +'index-files/' a_string = a_string + '"> </head> <body> <h3> ' + name a_string = a_string + '</h3> <dl> ' a_string=a_string + contenu + '</dl> </body> </html>' # save temp file ss = self.smgr.createInstanceWithContext( 'com.sun.star.util.PathSubstitution', self.ctx) work_filename = "$(temp)" + sep + "XrayResults.html" work_filename = ss.substituteVariables(work_filename, False) temp_file = open(work_filename[7:],'w') #remove file:// temp_file.write(a_string) temp_file.close() page_address=work_filename[7:] #remove file:// elif (self.cur_display == 'interface') \ or (self.cur_display == 'service') \ or (self.cur_display == 'listener'): page_address=name.replace( '.', '/')+".html" if not is_temp_file: page_address = SDK_ADDRESS + page_address if sep == '\\': page_address = unohelper.fileUrlToSystemPath(page_address) # launch browser my_browser.open_new(page_address) # methode OOo -> marche pas sur fichier local (ni en macro) - ok pour lien web #leBrowser = self.smgr.createInstanceWithContext("com.sun.star.system.SystemShellExecute",self.ctx) #leBrowser.execute(page_address,"",NO_Error_Web) # ########################### def _listPossibleSDKPages(self, lines, search): """ In alphabetical index, search for property/method on the good interface""" a_list = [] validation_list = [] if self.cur_display == 'method': interfaces = self.cur_obj.getTypes() #interfaces for ii in interfaces: validation_list.append(ii.typeName) search_HTML = '<b>' + search + '()</b></a> - function' elif self.cur_display == 'property': services = self.cur_obj.getSupportedServiceNames() #services for ii in services: validation_list.append(ii) search_HTML = '<b>' + search + '</b></a> - property' # search for a supported interface for line in lines: if line.find(search_HTML) != -1: if self._isValidSDKContext(line, validation_list): a_list.append(line) # Nothing found, list all uinterfaces for search if len(a_list) == 0: for line in lines: if line.find(search_HTML) != -1: a_list.append(line) return a_list # ########################### def _isValidSDKContext(self, line, supported_list): """ returns True if the service or interface of the SDK entry is supported""" valid_context = True x1 = line.find('com/sun/star/') if x1 > -1: x2 = line.find('.html', x1 + 13) if x2 > -1: intf_serv = line[x1:x2] intf_serv = intf_serv.replace( '/', '.') supported_list=str(supported_list) # HACK : TODO !!!! if supported_list.find(intf_serv) == -1: valid_context = False return valid_context ##################################################### # Listeners # ##################################################### class ButtonXrayListener(unohelper.Base, XActionListener): """Recursive call on selected element in ListInspect""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def actionPerformed(self, actionEvent): ctrl_lst_inspect=self.caller.dialog.getControl('ListInspect') selection = ctrl_lst_inspect.getSelectedItem() cleaner = selection.strip() if self.caller._isValideXRay(cleaner): obj = self.caller._getXRayObject(self.caller.cur_obj, cleaner) ctrl_lst_obj = self.caller.dialog.getControl('ListObj') pos = ctrl_lst_obj.SelectedItemPos self.caller._initializeObject(obj, cleaner, pos) ctrl_txt_detail = self.caller.dialog.getControl('TxtObjInfosDetail') ctrl_txt_detail.setText('') ############################ class ButtonSDKListener(unohelper.Base, XActionListener): """call SDK""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def actionPerformed(self, actionEvent): ctrl_list = self.caller.dialog.getControl('ListInspect') selection = ctrl_list.getSelectedItem() cleaner = selection.strip() self.caller._displaySDK(cleaner) ############################ class OptMethodListener(unohelper.Base, XActionListener): """Analyze methods""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def actionPerformed(self, actionEvent): obj = self.caller.cur_obj ctx = self.caller.ctx introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx) inspect = introspection.inspect(obj) methods = inspect.getMethods(unohelper.METHOD_CONCEPT_ALL) a_string = [] for ii in methods: a_string.append(' ' + ii.Name) self.caller._displayObjects(a_string) self.caller.cur_display = 'method' ctrl_list = self.caller.dialog.getControl('ListInspect') ctrl_list.selectItemPos(0,True) ############################ class OptPropertyListener(unohelper.Base, XActionListener): """Analyze properties""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def actionPerformed(self, actionEvent): obj=self.caller.cur_obj ctx = self.caller.ctx introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx) inspect = introspection.inspect(obj) props = inspect.getProperties(unohelper.PROPERTY_CONCEPT_ALL) a_string=[] for ii in props: a_string.append(' ' + ii.Name) self.caller._displayObjects(a_string) self.caller.cur_display='property' ctrl_list = self.caller.dialog.getControl('ListInspect') ctrl_list.selectItemPos(0,True) ############################ class OptInterfaceListener(unohelper.Base, XActionListener): """Analyze interfaces""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def actionPerformed(self, actionEvent): obj = self.caller.cur_obj interfaces = obj.getTypes() a_string = [] for ii in interfaces: a_string.append(' '+ ii.typeName ) self.caller._displayObjects(a_string) self.caller.cur_display = 'interface' ctrl_list = self.caller.dialog.getControl('ListInspect') ctrl_list.selectItemPos(0,True) ############################ class OptServiceListener(unohelper.Base, XActionListener): """Analyze services""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def actionPerformed(self, actionEvent): obj=self.caller.cur_obj a_string=[] # supported services try: names = obj.getSupportedServiceNames() for ii in names: a_string.append(' ' + ii) except: pass #available services try: names = obj.getAvailableServiceNames() a_string = [] for ii in names: a_string.append(' ' + ii) except: pass if len(a_string) == 0: a_string.append(' ') self.caller._displayObjects(a_string) self.caller.cur_display = 'service' ctrl_list = self.caller.dialog.getControl('ListInspect') ctrl_list.selectItemPos(0,True) ############################ class OptListenListener(unohelper.Base, XActionListener): """Analyze listeners""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def actionPerformed(self, actionEvent): obj = self.caller.cur_obj ctx = self.caller.ctx introspection = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.beans.Introspection', ctx) inspect = introspection.inspect(obj) props = inspect.getSupportedListeners() #can be empty a_string = [] if len(props) > 0: for ii in props: a_string.append(' ' + ii.typeName) self.caller._displayObjects(a_string) self.caller.cur_display = 'listener' if len(props) > 0: ctrl_list = caller.dialog.getControl('ListInspect') ctrl_list.selectItemPos(0,True) else: # clean previous detail text ctrl_txt_detail = self.caller.dialog.getControl('TxtObjInfosDetail') ctrl_txt_detail.setText('') ############################ class ListInspectListener(unohelper.Base, XItemListener): """Selection in list""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def itemStateChanged(self, itemEvent): ctrl_list = self.caller.dialog.getControl('ListInspect') selection = ctrl_list.getSelectedItem() cleaner = selection.strip() # enable Xray button for recursive calls ctrl_button=self.caller.dialog.getControl('DeeperBtn') ctrl_button.Enable = self.caller._isValideXRay(cleaner) # fills text informations self.caller._displayInfos(cleaner) ############################ class ListHistoListener(unohelper.Base, XItemListener): """Navigate in historical list""" def __init__(self, caller): self.caller = caller def disposing(self, eventObject): pass def itemStateChanged(self, itemEvent): num_select = int(itemEvent.Selected) self.caller.cur_obj = self.caller.lst_histo_obj[num_select] # update properties list ctrl_radio = self.caller.dialog.getControl('BtnProperties') ctrl_radio.State = True self.caller.lst_listeners['BtnProperties'].actionPerformed(None) ############################ class MouseAuthorListener(unohelper.Base, XMouseListener): """link to author label""" def __init__(self, caller): self.caller = caller def mousePressed(self, eventObject): adress = 'http://www.indesko.org' my_browser.open_new(adress) def mouseReleased(self, eventObject): pass def mouseEntered(self, eventObject): ctrl_label = self.caller.dialog.getControl('LabelAuteur') ctrl_label.Model.TextColor = 0xff0000 # changement de POinteur --> ne marche pas TODO #objPointeur = self.caller.ctx.ServiceManager.queryInterface( "com.sun.star.awt.XPointer", self.caller.ctx ) #print objPointeur #--> retourne None #objPointeur.setType(28) #self.caller.dialog.Peer.setPointer(objPointeur) def mouseExited(self, eventObject): ctrl_label = self.caller.dialog.getControl('LabelAuteur') ctrl_label.Model.TextColor = 0x000000 # changement de Pointeur --> ne marche pas TODO #objPointeur = self.caller.ctx.ServiceManager.createInstanceWithContext( "com.sun.star.awt.XPointer", self.caller.ctx ) #objPointeur.setType(0) #self.caller.dialog.Peer.setPointer(objPointeur)
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice