blob: a057c83c0b5f728585ecc9683a09aa86248a56c6 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
import com.sun.star.lib.uno.helper.WeakBase;
import com.sun.star.uno.Any;
import com.sun.star.uno.AnyConverter;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.uno.TypeClass;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.Type;
import com.sun.star.uno.XComponentContext;
import com.sun.star.beans.XIntrospectionAccess;
import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.reflection.XIdlMethod;
import javax.swing.tree.ExpandVetoException;
import org.openoffice.XInstanceInspector;
import javax.swing.tree.TreePath;
import javax.swing.event.TreeWillExpandListener;
public class InspectorPane extends WeakBase implements XInstanceInspector{ //, XServiceInfo
private XIdlMethod[] xIdlMethods;
private Property[] aProperties;
private boolean bIncludeContent = false;
private XComponentContext m_xComponentContext;
private XDialogProvider m_xDialogProvider;
private Introspector m_oIntrospector = null;
private SourceCodeGenerator m_oSourceCodeGenerator;
private XTreeControlProvider m_xTreeControlProvider;
private String sTitle = "";
/** The constructor of the inner class has a XMultiServiceFactory parameter.
* @param xMultiServiceFactory XMultiServiceFactory
*/
public InspectorPane(XComponentContext _xComponentContext, XDialogProvider _xDialogProvider, XTreeControlProvider _xTreeControlProvider, int _nLanguage) {
m_xComponentContext = _xComponentContext;
m_xTreeControlProvider = _xTreeControlProvider;
m_xDialogProvider = _xDialogProvider;
m_oIntrospector = Introspector.getIntrospector(m_xComponentContext);
m_oSourceCodeGenerator = new SourceCodeGenerator(_nLanguage);
_xTreeControlProvider.addInspectorPane(this);
}
private void setMaximumOfProgressBar(Object _oUnoObject){
int nMaxValue = 0;
xIdlMethods = m_oIntrospector.getMethods(_oUnoObject);
aProperties = m_oIntrospector.getProperties(_oUnoObject);
}
/** Inspect the given object for methods, properties, interfaces, and
* services.
* @param a The object to inspect
* @throws RuntimeException If
*/
public void inspect(java.lang.Object _oUserDefinedObject, String _sTitle) throws com.sun.star.uno.RuntimeException {
try {
Object oContainer = m_xTreeControlProvider.inspect(_oUserDefinedObject, _sTitle);
m_xDialogProvider.addInspectorPage(getTitle(), oContainer);
}
catch( Exception exception ) {
exception.printStackTrace(System.out);
}}
public void setTitle(String _sTitle){
if (_sTitle != null){
if (_sTitle.length() > 0){
sTitle = _sTitle;
}
}
}
public String getTitle(){
return sTitle;
}
private Type[] getTypes(Object _oUnoObject){
Type[] aTypes = null;
if (m_oIntrospector.isArray(_oUnoObject)){
aTypes = (Type[])_oUnoObject;
}
else{
aTypes = m_oIntrospector.getInterfaces(_oUnoObject);
}
return aTypes;
}
private Object invoke(XUnoMethodNode _oUnoMethodNode){
try{
String sParamValueDescription = "";
Object oUnoReturnObject = _oUnoMethodNode.invoke();
boolean bHasParameters = _oUnoMethodNode.hasParameters();
boolean bIsPrimitive = _oUnoMethodNode.isPrimitive();
if (bHasParameters){
sParamValueDescription = " (" + m_oSourceCodeGenerator.getMethodParameterValueDescription(_oUnoMethodNode, _oUnoMethodNode.getLastParameterObjects(), true) + ")";
}
if (oUnoReturnObject != null ){
String sNodeDescription = "";
XUnoNode oUnoNode = null;
if (_oUnoMethodNode.getXIdlMethod().getReturnType().getTypeClass().getValue() == TypeClass.VOID_value){
sNodeDescription += _oUnoMethodNode.getXIdlMethod().getReturnType().getName() + " " + _oUnoMethodNode.getXIdlMethod().getName() + sParamValueDescription;
_oUnoMethodNode.setLabel(sNodeDescription);
m_xTreeControlProvider.nodeChanged(_oUnoMethodNode);
}
else if (bHasParameters || !bIsPrimitive){
if (bIsPrimitive){
sNodeDescription += m_oSourceCodeGenerator.getStringValueOfObject(oUnoReturnObject, _oUnoMethodNode.getTypeClass());
}
else{
Any aReturnObject = Any.complete(oUnoReturnObject);
String sShortClassName = m_oIntrospector.getShortClassName(aReturnObject.getType().getTypeName());
sNodeDescription += m_oSourceCodeGenerator.getVariableNameforUnoObject(sShortClassName);
}
if (m_oIntrospector.isArray(oUnoReturnObject)){
if (m_oIntrospector.isUnoTypeObject(oUnoReturnObject)){
oUnoNode = addUnoFacetteNode(_oUnoMethodNode, XUnoFacetteNode.SINTERFACEDESCRIPTION, _oUnoMethodNode.getUnoObject());
}
else if(m_oIntrospector.isUnoPropertyTypeObject(oUnoReturnObject)){
oUnoNode = addUnoFacetteNode(_oUnoMethodNode, XUnoFacetteNode.SPROPERTYINFODESCRIPTION, oUnoReturnObject);
}
else if(m_oIntrospector.isUnoPropertyValueTypeObject(oUnoReturnObject)){
oUnoNode = addUnoFacetteNode(_oUnoMethodNode, XUnoFacetteNode.SPROPERTYVALUEDESCRIPTION, oUnoReturnObject);
}
}
if (oUnoNode == null){
if (bHasParameters){
sNodeDescription += sParamValueDescription;
}
oUnoNode = addUnoNode(null, oUnoReturnObject, sNodeDescription);
if (bHasParameters){
oUnoNode.setParameterObjects(_oUnoMethodNode.getLastParameterObjects());
}
}
if (oUnoNode != null){
oUnoNode.setFoldable(!bIsPrimitive);
_oUnoMethodNode.setFoldable(false);
_oUnoMethodNode.addChildNode(oUnoNode);
m_xTreeControlProvider.nodeInserted(_oUnoMethodNode, oUnoNode, _oUnoMethodNode.getChildCount()-1);
}
}
else{
if (bIsPrimitive){
sNodeDescription = _oUnoMethodNode.getStandardMethodDescription() + "=" + UnoMethodNode.getDisplayValueOfPrimitiveType(oUnoReturnObject);
_oUnoMethodNode.setLabel(sNodeDescription);
m_xTreeControlProvider.nodeChanged(_oUnoMethodNode);
}
}
}
// ReturnObject of method node == null..
else{
if (!bHasParameters){
_oUnoMethodNode.setLabel(_oUnoMethodNode.getLabel() + " = null");
}
else{
_oUnoMethodNode.setLabel(_oUnoMethodNode.getXIdlMethod().getName() + sParamValueDescription + " = null");
}
m_xTreeControlProvider.nodeChanged(_oUnoMethodNode);
}
return oUnoReturnObject;
}catch(Exception exception ) {
return null;
}}
public void invokeSelectedMethodNode(){
XTreePathProvider xTreePathProvider = m_xTreeControlProvider.getSelectedPath();
XUnoNode oUnoNode = xTreePathProvider.getLastPathComponent();
if (oUnoNode instanceof XUnoMethodNode){
invoke((XUnoMethodNode) oUnoNode);
m_xTreeControlProvider.expandPath(xTreePathProvider);
}
}
public void addSourceCodeOfSelectedNode(){
XTreePathProvider oTreePathProvider = m_xTreeControlProvider.getSelectedPath();
XUnoNode oUnoNode = oTreePathProvider.getLastPathComponent();
if (oUnoNode instanceof XUnoMethodNode){
XUnoMethodNode oUnoMethodNode = (XUnoMethodNode) oUnoNode;
if (!oUnoMethodNode.isInvoked() && oUnoMethodNode.isInvokable()){
invoke(oUnoMethodNode);
}
}
String sSourceCode = m_oSourceCodeGenerator.addSourceCodeOfUnoObject(oTreePathProvider, true, true, true);
m_xTreeControlProvider.setSourceCode(sSourceCode);
}
public void convertCompleteSourceCode(int _nLanguage){
String sSourceCode = m_oSourceCodeGenerator.convertAllUnoObjects(_nLanguage);
m_xTreeControlProvider.setSourceCode(sSourceCode);
}
protected XUnoNode getSelectedNode(){
return m_xTreeControlProvider.getSelectedNode();
}
// add the object to the hashtable for a possible access in the tree
private XUnoFacetteNode addUnoFacetteNode(XUnoNode _oParentNode, String _sNodeDescription, Object _oUnoObject){
return m_xTreeControlProvider.addUnoFacetteNode( _oParentNode, _sNodeDescription, _oUnoObject);
}
private XUnoMethodNode addMethodNode(Object _objectElement, XIdlMethod _xIdlMethod){
return m_xTreeControlProvider.addMethodNode(_objectElement, _xIdlMethod);
}
public void addMethodsToTreeNode(XUnoNode _oGrandParentNode, Object _oUnoParentObject, XIdlMethod[] _xIdlMethods){
if (this.m_oIntrospector.isValid(_xIdlMethods)){
for ( int n = 0; n < _xIdlMethods.length; n++ ) {
XIdlMethod xIdlMethod = _xIdlMethods[n];
if (!xIdlMethod.getDeclaringClass().getName().equals("com.sun.star.uno.XInterface")){
XUnoMethodNode oChildNode = addMethodNode(_oUnoParentObject, xIdlMethod);
if (oChildNode != null){
_oGrandParentNode.addChildNode(oChildNode);
}
}
}
}
}
private void addFacetteNodesToTreeNode(XUnoNode _oParentNode, Object _oUnoObject){
if (m_oIntrospector.hasMethods(_oUnoObject)){
XUnoFacetteNode oUnoFacetteNode = addUnoFacetteNode(_oParentNode, XUnoFacetteNode.SMETHODDESCRIPTION, _oUnoObject);
}
if (m_oIntrospector.hasProperties(_oUnoObject)){
XUnoFacetteNode oUnoFacetteNode = addUnoFacetteNode(_oParentNode, XUnoFacetteNode.SPROPERTYDESCRIPTION, _oUnoObject);
}
if (m_oIntrospector.hasInterfaces(_oUnoObject)){
XUnoFacetteNode oUnoFacetteNode = addUnoFacetteNode(_oParentNode, XUnoFacetteNode.SINTERFACEDESCRIPTION, _oUnoObject);
}
if (m_oIntrospector.isContainer(_oUnoObject)){
XUnoFacetteNode oUnoFacetteNode = addUnoFacetteNode(_oParentNode, XUnoFacetteNode.SCONTAINERDESCRIPTION, _oUnoObject);
}
if (m_oIntrospector.hasSupportedServices(_oUnoObject)){
XUnoFacetteNode oUnoFacetteNode = addUnoFacetteNode(_oParentNode, XUnoFacetteNode.SSERVICEDESCRIPTION, _oUnoObject);
}
}
private void addInterfacesToTreeNode(XUnoNode _oGrandParentNode, Object _oUnoParentObject, Type[] _aTypes) {
try {
if (_oUnoParentObject != null){
for ( int m = 0; m < _aTypes.length; m++ ) {
addUnoNode(_oGrandParentNode, _oUnoParentObject, _aTypes[m]);
}
}
}
catch( Exception exception ) {
exception.printStackTrace(System.out);
}}
// add all services for the given object to the tree under the node parent
private void addServicesToTreeNode(XUnoNode _oGrandParentNode, Object _oUnoObject) {
try{
XServiceInfo xServiceInfo = ( XServiceInfo ) UnoRuntime.queryInterface( XServiceInfo.class, _oUnoObject );
if ( xServiceInfo != null ){
String[] sSupportedServiceNames = xServiceInfo.getSupportedServiceNames();
for ( int m = 0; m < sSupportedServiceNames.length; m++ ) {
String sServiceName = sSupportedServiceNames[m];
if (sServiceName.length() > 0){
XUnoNode oUnoNode = addUnoNode(_oGrandParentNode, _oUnoObject, sSupportedServiceNames[m]);
oUnoNode.setNodeType(XUnoNode.nSERVICE);
}
}
}
}
catch(Exception exception) {
exception.printStackTrace(System.out);
}}
private void addPropertiesAndInterfacesOfService(XUnoNode _oUnoServiceNode){
String sServiceName = _oUnoServiceNode.getClassName();
Object oUnoObject = _oUnoServiceNode.getUnoObject();
addInterfacesToTreeNode(_oUnoServiceNode, oUnoObject, m_oIntrospector.getInterfaces(oUnoObject, sServiceName));
addPropertiesToTreeNode(_oUnoServiceNode, oUnoObject, m_oIntrospector.getProperties(oUnoObject, sServiceName));
}
private void addPropertiesToTreeNode(XUnoNode _oParentNode, Object _oUnoParentObject, Property[] _aProperties) {
try {
if (_aProperties.length > 0){
for ( int n = 0; n < _aProperties.length; n++ ){
Property aProperty = _aProperties[n];
XIntrospectionAccess xIntrospectionAccess = m_oIntrospector.getXIntrospectionAccess(_oUnoParentObject);
XPropertySet xPropertySet = ( XPropertySet ) UnoRuntime.queryInterface( XPropertySet.class, xIntrospectionAccess.queryAdapter(new Type( XPropertySet.class)));
if (xPropertySet != null) {
if (xPropertySet.getPropertySetInfo().hasPropertyByName(aProperty.Name)){
Object objectElement = xPropertySet.getPropertyValue(aProperty.Name);
if (objectElement != null) {
XUnoNode oChildNode = m_xTreeControlProvider.addUnoPropertyNode(_oUnoParentObject, aProperty, objectElement);
if (oChildNode != null){
_oParentNode.addChildNode(oChildNode);
}
}
}
}
}
}
}
catch(Exception exception) {
exception.printStackTrace(System.out);
}}
public void addContainerElementsToTreeNode(XUnoNode _oParentNode, Object _oUnoParentObject){
Object[] oUnoContainerElements = m_oIntrospector.getUnoObjectsOfContainer(_oUnoParentObject);
if (m_oIntrospector.isValid(oUnoContainerElements)){
if (oUnoContainerElements.length > 0){
for (int i=0; i< oUnoContainerElements.length; i++){
XUnoNode oChildNode = addUnoNode(_oParentNode, oUnoContainerElements[i], UnoNode.getNodeDescription(oUnoContainerElements[i]));
m_xTreeControlProvider.nodeInserted(_oParentNode, oChildNode, _oParentNode.getChildCount()-1);
}
}
}
}
private XUnoNode addUnoNode(XUnoNode _oParentNode, Object _oUnoObject, String _sLabel ){
XUnoNode oUnoNode = this.m_xTreeControlProvider.addUnoNode(_oUnoObject);
oUnoNode.setLabel(_sLabel);
if (_oParentNode != null){
_oParentNode.addChildNode(oUnoNode);
}
setNodeFoldable(oUnoNode, _oUnoObject);
return oUnoNode;
}
private void setNodeFoldable(XUnoNode _oUnoNode, Object _oUnoObject){
if (_oUnoObject != null){
if (!m_oIntrospector.isObjectPrimitive(_oUnoObject)){
_oUnoNode.setFoldable(true);
}
}
}
private XUnoNode addUnoNode(XUnoNode _oParentNode, Object _oUnoObject, Type _aType){
XUnoNode oUnoNode = this.m_xTreeControlProvider.addUnoNode(_oUnoObject, _aType);
if (_oParentNode != null){
_oParentNode.addChildNode(oUnoNode);
}
setNodeFoldable(oUnoNode, _oUnoObject);
return oUnoNode;
}
private void addPropertySetInfoNodesToTreeNode(XUnoFacetteNode _oUnoFacetteNode, Object _oUnoObject){
if (_oUnoObject.getClass().isArray()){
Object[] object = ( Object[] ) _oUnoObject;
for ( int i = 0; i < object.length; i++ ) {
Property aProperty = (Property) object[i];
XUnoPropertyNode oUnoPropertyNode = m_xTreeControlProvider.addUnoPropertyNode(_oUnoObject, aProperty);
oUnoPropertyNode.setLabel(XUnoFacetteNode.SPROPERTYINFODESCRIPTION + " (" + aProperty.Name + ")");
oUnoPropertyNode.setFoldable(true);
_oUnoFacetteNode.addChildNode(oUnoPropertyNode);
}
}
}
private void addPrimitiveValuesToTreeNode(XUnoNode _oUnoNode, Object _oUnoObject){
if (_oUnoObject.getClass().isArray()){
if (!_oUnoObject.getClass().getComponentType().isPrimitive()){
Object[] object = ( Object[] ) _oUnoObject;
for ( int i = 0; i < object.length; i++ ) {
if (m_oIntrospector.isObjectPrimitive(object[i])){
XUnoNode oChildNode = addUnoNode(_oUnoNode, null, UnoNode.getNodeDescription(object[i]));
}
}
}
else{
String[] sDisplayValues = UnoNode.getDisplayValuesofPrimitiveArray(_oUnoObject);
for ( int i = 0; i < sDisplayValues.length; i++ ) {
XUnoNode oUnoNode = addUnoNode(_oUnoNode, null, sDisplayValues[i]);
}
}
}
}
private void addPropertySetInfoSubNodes(XUnoPropertyNode _oUnoPropertyNode){
Property aProperty = _oUnoPropertyNode.getProperty();
_oUnoPropertyNode.addChildNode(m_xTreeControlProvider.addUnoPropertyNodeWithName(aProperty));
_oUnoPropertyNode.addChildNode(m_xTreeControlProvider.addUnoPropertyNodeWithType(aProperty));
_oUnoPropertyNode.addChildNode(m_xTreeControlProvider.addUnoPropertyNodeWithHandle(aProperty));
_oUnoPropertyNode.addChildNode(m_xTreeControlProvider.addUnoPropertyNodeWithAttributesDescription(aProperty));
}
private void addPropertyValueSubNodes(XUnoFacetteNode _oUnoFacetteNode, Object _oUnoObject){
if (m_oIntrospector.isUnoPropertyValueTypeObject(_oUnoObject)){
Object[] object = ( Object[] ) _oUnoObject;
for ( int i = 0; i < object.length; i++ ) {
String sObjectClassName = object[i].getClass().getName();
if (sObjectClassName.equals("com.sun.star.beans.PropertyValue")){
XUnoNode oChildNode = null;
PropertyValue aPropertyValue = (PropertyValue) object[i];
if (! m_oIntrospector.isObjectPrimitive(aPropertyValue.Value)){
oChildNode = m_xTreeControlProvider.addUnoPropertyNode(_oUnoObject, aPropertyValue, _oUnoObject);
}
else{
oChildNode = addUnoNode(null, aPropertyValue.Value, UnoPropertyNode.getStandardPropertyValueDescription(aPropertyValue));
}
if (oChildNode != null){
_oUnoFacetteNode.addChildNode(oChildNode);
}
}
}
}
}
public boolean expandNode(XUnoNode _oUnoNode, XTreePathProvider _xTreePathProvider){
if ( _oUnoNode != null ) {
_oUnoNode.setFoldable(false);
if (m_xTreeControlProvider.isMethodNode(_oUnoNode)){
XUnoMethodNode oUnoMethodNode = (XUnoMethodNode) _oUnoNode;
if (!oUnoMethodNode.isInvoked()){
Object oUnoReturnObject = invoke((XUnoMethodNode) _oUnoNode);
if (oUnoReturnObject == null){
_oUnoNode.setFoldable(true);
return false;
}
}
}
else if (m_xTreeControlProvider.isPropertyNode(_oUnoNode)){
XUnoPropertyNode oUnoPropertyNode = (XUnoPropertyNode) _oUnoNode;
Object oUnoObject = oUnoPropertyNode.getUnoReturnObject();
if (oUnoPropertyNode.getPropertyNodeType() == XUnoPropertyNode.nPROPERTYSETINFOTYPE){
addPropertySetInfoSubNodes(oUnoPropertyNode);
}
else{
//TOOD this code is redundant!!!
if ( oUnoObject.getClass().isArray()){
// TOODO probably we should provid a possibility to insert also non-primitive nodes
addPrimitiveValuesToTreeNode(oUnoPropertyNode, oUnoObject);
}
else{
addFacetteNodesToTreeNode(oUnoPropertyNode, oUnoObject);
}
}
}
else if (m_xTreeControlProvider.isFacetteNode(_oUnoNode)){
XUnoFacetteNode oUnoFacetteNode = (XUnoFacetteNode) _oUnoNode;
Object oUnoObject = _oUnoNode.getUnoObject();
if (oUnoFacetteNode.isMethodNode()){
addMethodsToTreeNode(oUnoFacetteNode, oUnoObject, m_oIntrospector.getMethods(oUnoObject));
}
if (oUnoFacetteNode.isPropertyNode()){
String sNodeDescription = oUnoFacetteNode.getLabel();
// TODO: it's very dangerous to distinguishe the different UnoFacetteNodes only by the nodedescription
if (sNodeDescription.startsWith(XUnoFacetteNode.SPROPERTYINFODESCRIPTION)){
addPropertySetInfoNodesToTreeNode(oUnoFacetteNode, oUnoObject);
}
else if (sNodeDescription.startsWith(XUnoFacetteNode.SPROPERTYVALUEDESCRIPTION)){
addPropertyValueSubNodes(oUnoFacetteNode, oUnoObject);
}
else{
addPropertiesToTreeNode(oUnoFacetteNode, oUnoObject, m_oIntrospector.getProperties(oUnoObject));
}
}
if (oUnoFacetteNode.isServiceNode()){
addServicesToTreeNode(oUnoFacetteNode, oUnoObject);
}
if (oUnoFacetteNode.isInterfaceNode()){
addInterfacesToTreeNode(oUnoFacetteNode, oUnoObject, getTypes(oUnoObject));
}
if (oUnoFacetteNode.isContainerNode()){
addContainerElementsToTreeNode(oUnoFacetteNode, oUnoObject);
}
}
else if (_oUnoNode.getNodeType() == XUnoNode.nSERVICE){
addPropertiesAndInterfacesOfService(_oUnoNode);
}
else if (_oUnoNode.getNodeType() == XUnoNode.nINTERFACE){
Type aType = _oUnoNode.getUnoType();
if (aType != null){
addMethodsToTreeNode(_oUnoNode, _oUnoNode.getUnoObject(), m_oIntrospector.getMethodsOfInterface(aType));
}
}
else if (_oUnoNode.getNodeType() == XUnoNode.nOTHERS){
Object oUnoObject = _oUnoNode.getUnoObject();
if ( oUnoObject.getClass().isArray()){
// TOODO probably we should provid a possibility to insert also non-primitive nodes
addPrimitiveValuesToTreeNode(_oUnoNode, oUnoObject);
}
else{
addFacetteNodesToTreeNode(_oUnoNode, oUnoObject);
}
}
}
return true;
}
public void applyFilter(XUnoFacetteNode _oUnoFacetteNode, String _sFilter){
for (int i = 0; i < _oUnoFacetteNode.getChildCount(); i++){
XUnoNode oUnoNode = _oUnoFacetteNode.getChild(i);
boolean bIsVisible = oUnoNode.isFilterApplicable(_sFilter);
m_xTreeControlProvider.setNodeVisible(oUnoNode, bIsVisible);
}
_oUnoFacetteNode.setFilter(_sFilter);
}
/** In opposition to 'getUnoObjectOfTreeNode' this method inspects the passed node if it represents a Uno object
* If not it returns null
*
*/
private Object getUnoObjectOfExplicitTreeNode(XTreePathProvider _xTreePathProvider){
XUnoNode oUnoNode = _xTreePathProvider.getLastPathComponent();
if (oUnoNode != null){
return oUnoNode.getUnoObject();
}
return null;
}
public String getFilter(XUnoNode _oUnoNode){
String sFilter = "";
if (_oUnoNode != null){
XUnoNode oUnoNode = _oUnoNode;
boolean bleaveLoop = false;
do{
if (m_xTreeControlProvider.isFacetteNode(oUnoNode)){
sFilter = ((XUnoFacetteNode) oUnoNode).getFilter();
bleaveLoop = true;
}
else{
if (oUnoNode.getParentNode() != null){
oUnoNode = oUnoNode.getParentNode();
}
else{
bleaveLoop = true;
}
}
} while(!bleaveLoop);
}
return sFilter;
}
/** In opposition to 'getUnoObjectOfexplictTreeNode' this method inspects the passed node if it represents a Uno object
* if not it keeps checking all ancestors until it finds a Uno representation
*/
private Object getUnoObjectOfTreeNode(XTreePathProvider _xTreePathProvider){
XTreePathProvider xTreePathProvider = _xTreePathProvider;
HideableMutableTreeNode oNode = null;
Object oUnoObject = null;
while (xTreePathProvider != null){
oUnoObject = getUnoObjectOfExplicitTreeNode(xTreePathProvider);
if (oUnoObject != null){
if (oUnoObject instanceof String){
}
else{
if (!m_oIntrospector.isUnoTypeObject(oUnoObject)){
return oUnoObject;
}
}
}
xTreePathProvider = xTreePathProvider.getParentPath();
}
return null;
}
public void showPopUpMenu(Object _invoker, int x, int y) throws ClassCastException{
XUnoNode oUnoNode = getSelectedNode();
boolean bdoEnableInvoke = oUnoNode instanceof XUnoMethodNode;
// boolean bdoEnableSourceCodeGeneration = true;
if (bdoEnableInvoke){
XUnoMethodNode oUnoMethodNode = (XUnoMethodNode) oUnoNode;
bdoEnableInvoke = oUnoMethodNode.isInvokable();
// bdoEnableSourceCodeGeneration = bdoEnableInvoke;
}
m_xDialogProvider.enablePopupMenuItem(XDialogProvider.SINVOKE, bdoEnableInvoke);
// m_xDialogProvider.enablePopupMenuItem(XDialogProvider.SADDTOSOURCECODE, bdoEnableSourceCodeGeneration);
m_xDialogProvider.showPopUpMenu(_invoker, x, y);
}
}