blob: bb9299b3a90716663ba19248d159352ae17f1f20 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Takashi ITOH - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.model.flash;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.actf.accservice.swtbridge.AccessibleObject;
import org.eclipse.actf.util.as.ASObject;
import org.eclipse.actf.visualization.flash.Messages;
import org.eclipse.actf.visualization.gui.common.WebBrowserUtil;
import org.eclipse.actf.visualization.gui.flash.FlashFinder;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.Variant;
public class FlashPlayer {
private OleAutomation automation;
private Variant varMarker;
private int idGetAttribute;
private int idSetAttribute;
private int idWMode;
private int idGetVariable;
private int idSetVariable;
public boolean isVisible = true;
private static final String
sidGetRootNode = "getRootNode", //$NON-NLS-1$
sidGetNumDebugChildren = "getNumSuccessorNodes", //$NON-NLS-1$
sidGetDebugChildren = "getSuccessorNodes", //$NON-NLS-1$
sidGetNumChildren = "getNumChildNodes", //$NON-NLS-1$
sidGetChildren = "getChildNodes", //$NON-NLS-1$
sidGetInnerNodes = "getInnerNodes", //$NON-NLS-1$
sidNewMarker = "newMarker", //$NON-NLS-1$
sidSetMarker = "setMarker", //$NON-NLS-1$
sidGetNodeFromPath = "getNodeFromPath",//$NON-NLS-1$
sidCallMethod = "callMethodA"; //$NON-NLS-1$
private ASBridge bridge;
public FlashPlayer(Variant flash) {
automation = flash.getAutomation();
idWMode = getIDsOfNames("wmode"); //$NON-NLS-1$
idGetVariable = getIDsOfNames("GetVariable"); //$NON-NLS-1$
idSetVariable = getIDsOfNames("SetVariable"); //$NON-NLS-1$
idGetAttribute = getIDsOfNames("getAttribute"); //$NON-NLS-1$
idSetAttribute = getIDsOfNames("setAttribute"); //$NON-NLS-1$
bridge = ASBridge.getInstance(this);
}
public static FlashPlayer getPlayerFromObject(AccessibleObject accObject) {
Variant varFlash = WebBrowserUtil.getHTMLElementFromObject(accObject);
if( null != varFlash ) {
return new FlashPlayer(varFlash);
}
return null;
}
public FlashNode getRootNode() {
if( null != bridge ) {
Object result = invoke(sidGetRootNode);
if( result instanceof ASObject ) {
return new FlashNode(null,this,result);
}
}
return null;
}
public FlashNode getNodeFromPath(String path) {
if( null != bridge ) {
Object result = invoke(sidGetNodeFromPath,path);
if( result instanceof ASObject ) {
return new FlashNode(null,this,result);
}
}
return null;
}
public boolean hasChild(FlashNode parentNode, boolean visual) {
if( visual ) {
return true;
}
if( null != bridge ) {
String sidMethod;
if( visual ) {
sidMethod = sidGetNumDebugChildren;
}
else {
sidMethod = FlashFinder.debugMode ? sidGetNumDebugChildren : sidGetNumChildren;
}
Object result = invoke(sidMethod,parentNode.getTarget());
if( result instanceof Integer ) {
return ((Integer)result).intValue() > 0;
}
}
return false;
}
public FlashNode[] getChildren(FlashNode parentNode,boolean visual) {
List<FlashNode> children = new ArrayList<FlashNode>();
if( null != bridge ) {
String sidMethod;
if( visual ) {
sidMethod = sidGetInnerNodes;
}
else {
sidMethod = FlashFinder.debugMode ? sidGetDebugChildren : sidGetChildren;
}
Object result = invoke(sidMethod,parentNode.getTarget());
if( result instanceof Object[] ) {
Object[] objChildren = (Object[])result;
for( int i=0; i<objChildren.length; i++ ) {
if( objChildren[i] instanceof ASObject ) {
children.add(new FlashNode(parentNode,this,objChildren[i]));
}
}
}
}
return children.toArray(new FlashNode[children.size()]);
}
public void setMarker(Object objX, Object objY, Object objW, Object objH) {
if( null != objX && null != objY && null != objW && null != objH ) {
if( null == varMarker ) {
varMarker = automation.invoke(idGetAttribute,new Variant[]{new Variant("marker")}); //$NON-NLS-1$
if( null == varMarker || OLE.VT_I4 != varMarker.getType() ) {
Object objMarker = invoke(sidNewMarker);
if( !(objMarker instanceof Integer) ) {
return;
}
varMarker = new Variant(((Integer)objMarker).intValue());
automation.invoke(idSetAttribute,new Variant[]{new Variant("marker"),varMarker}); //$NON-NLS-1$
}
}
if( null != bridge && null != varMarker ) {
bridge.invoke(new Object[]{sidSetMarker,new Integer(varMarker.getInt()),objX,objY,objW,objH});
}
}
}
public Variant callMethod(String target,String method,Variant arg1) {
if( null != bridge ) {
Object result = null;
switch( arg1.getType() ) {
case OLE.VT_I4:
result = callMethod(target, method, new Integer(arg1.getInt()));
break;
case OLE.VT_BSTR:
result = callMethod(target, method, arg1.getString());
break;
}
if( result instanceof Integer ) {
return new Variant(((Integer)result).intValue());
}
else if( result instanceof Double ) {
return new Variant(((Double)result).doubleValue());
}
else if( result instanceof String ) {
return new Variant(result.toString());
}
}
return null;
}
private Object callMethod(String target,String method,Object arg1) {
return bridge.invoke(new Object[] {sidCallMethod,target,method,arg1});
}
private Object invoke(String method) {
return bridge.invoke(new Object[]{method});
}
private Object invoke(String method, Object arg1) {
return bridge.invoke(new Object[] {method,arg1});
}
private int getIDsOfNames(String name) {
try {
int dispid[] = automation.getIDsOfNames(new String[]{name});
if( null != dispid ) {
return dispid[0];
}
}
catch( Exception e ) {
e.printStackTrace();
}
return 0;
}
public String getErrorText() {
Variant varError = automation.invoke(idGetAttribute,new Variant[]{new Variant("aDesignerError")}); //$NON-NLS-1$
if( null != varError && OLE.VT_BSTR == varError.getType() ) {
String strError = varError.getString();
if ( strError.startsWith(FlashAdjust.ERROR_WAIT) ) {
return Messages.getString("flash.player_loading"); //$NON-NLS-1$
}
if ( strError.startsWith(FlashAdjust.ERROR_NG) ) {
return Messages.getString("flash.player_no_dom"); //$NON-NLS-1$
}
if ( strError.startsWith(FlashAdjust.ERROR_NA) ) {
return Messages.getString("flash.player_no_xcode"); //$NON-NLS-1$
}
}
// return Messages.getString("flash.player_unknown"); //$NON-NLS-1$
return Messages.getString("flash.player_no_xcode"); //$NON-NLS-1$
}
public OleAutomation getAutomation() {
return automation;
}
public void dispose() {
if( null != varMarker ) {
varMarker.dispose();
varMarker = null;
}
if( null != automation ) {
automation.dispose();
automation = null;
}
}
protected void finalize() throws Throwable {
dispose();
super.finalize();
}
public String getWMode() {
if( 0 != idWMode ) {
Variant varWMode = automation.getProperty(idWMode);
if( null!=varWMode && OLE.VT_BSTR==varWMode.getType() ) {
return varWMode.getString();
}
}
return null;
}
public void setVariable(String name, String value) {
if( 0 != idSetVariable ) {
automation.invoke(idSetVariable, new Variant[]{new Variant(name),new Variant(value)});
}
}
public String getVariable(String name) {
if( 0 != idGetVariable ) {
Variant varValue = automation.invoke(idGetVariable, new Variant[]{new Variant(name)});
if( null != varValue ) {
return varValue.getString();
}
}
return null;
}
}