blob: 23cce6904550c69c762733732ce44a55f85a3035 [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.visualization.gui.flash;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.actf.accservice.swtbridge.AccessibleObject;
import org.eclipse.actf.accservice.swtbridge.MSAA;
import org.eclipse.actf.util.win32.WindowUtil;
import org.eclipse.actf.visualization.gui.ui.views.MSAATreeContentProvider;
public class FlashFinder {
public static boolean debugMode = false;
public static boolean scanAll = false;
private List<AccessibleObject> result = new ArrayList<AccessibleObject>();
private boolean showOffScreen;
public void find(Object[] inputElements) {
showOffScreen = MSAATreeContentProvider.getDefault().showOffscreen;
for (int i = 0; i < inputElements.length; i++) {
if (inputElements[i] instanceof AccessibleObject) {
AccessibleObject accObject = (AccessibleObject)inputElements[i];
if( scanAll ||
0 != findFlashWindow(accObject.getWindow()) ) {
findChildren(accObject);
}
}
}
}
private static int findFlashWindow(int hwnd) {
if( 0 != hwnd ) {
if( FlashUtil.isFlashClass(WindowUtil.GetWindowClassName(hwnd)) ) {
return hwnd;
}
for( int hwndChild=WindowUtil.GetChildWindow (hwnd); 0!=hwndChild;
hwndChild=WindowUtil.GetNextWindow (hwndChild) )
{
int hwndFound = findFlashWindow(hwndChild);
if( 0 != hwndFound ) {
return hwndFound;
}
}
}
return 0;
}
private void findChildren(Object[] inputElements) {
for (int i = 0; i < inputElements.length; i++) {
findChildren((AccessibleObject) inputElements[i]);
}
}
private void findChildren(AccessibleObject accObject) {
if (null != accObject) {
int role = accObject.getAccRole();
if ((MSAA.ROLE_SYSTEM_WINDOW==role||MSAA.ROLE_SYSTEM_CLIENT==role) && FlashUtil.isFlash(accObject)) {
result.add(accObject);
} else {
switch( accObject.getAccState() & (MSAA.STATE_INVISIBLE|MSAA.STATE_OFFSCREEN) ) {
case MSAA.STATE_INVISIBLE|MSAA.STATE_OFFSCREEN:
if( !showOffScreen ) break;
case 0:
findChildren(accObject.getChildren());
break;
}
}
}
}
public Object[] getResults() {
return result.toArray();
}
}