blob: 2d6f8502d93ee7ed47662897051a5b2b4f674a29 [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
* Kentarou FUKUDA - 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.accservice.swtbridge.util.HTMLElementUtil;
import org.eclipse.actf.model.flash.internal.ASBridge;
import org.eclipse.actf.model.flash.internal.Messages;
import org.eclipse.actf.model.flash.util.ASObject;
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 = HTMLElementUtil.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, (ASObject) 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, (ASObject) result);
}
}
return null;
}
public boolean hasChild(FlashNode parentNode, boolean visual) {
return hasChild(parentNode, visual, false);
}
public boolean hasChild(FlashNode parentNode, boolean visual,
boolean debugMode) {
if (visual) {
return true;
}
if (null != bridge) {
String sidMethod;
if (visual) {
sidMethod = sidGetNumDebugChildren;
} else {
sidMethod = 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) {
return getChildren(parentNode, visual, false);
}
public FlashNode[] getChildren(FlashNode parentNode, boolean visual,
boolean debugMode) {
List<FlashNode> children = new ArrayList<FlashNode>();
if (null != bridge) {
String sidMethod;
if (visual) {
sidMethod = sidGetInnerNodes;
} else {
sidMethod = 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,
(ASObject) 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;
}
}