/*******************************************************************************
* Copyright (c) 2014 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.usage.internal.reporting;
import java.lang.reflect.Field;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.jboss.tools.usage.event.UsageEventType;
import org.jboss.tools.usage.event.UsageReporter;
import org.jboss.tools.usage.internal.JBossToolsUsageActivator;
import org.jboss.tools.usage.util.StringUtils;
/**
* @author Alexey Kazakov
*/
public class WizardListener implements Listener {
private UsageEventType finishButtonType;
public static final String FINISH_BUTTON_FIELD_NAME = "finishButton";
public static final String CANCEL_BUTTON_FIELD_NAME = "cancelButton";
public WizardListener(UsageEventType finishButtonType) {
this.finishButtonType = finishButtonType;
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
@Override
public void handleEvent(Event event) {
try {
final IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if(window!=null) {
Shell workbenchShell = window.getShell();
Shell[] existedShells = workbench.getDisplay().getShells();
for (Shell shell : existedShells) {
if(shell!=workbenchShell) {
Object data = shell.getData();
if(data instanceof WizardDialog) {
WizardDialog dialog = (WizardDialog)data;
IWizardPage page = dialog.getCurrentPage();
if(page !=null) {
// Wizard is open
Button finishButton = getButton(dialog, FINISH_BUTTON_FIELD_NAME);
if(finishButton !=null) {
finishButton.addSelectionListener(new ButtonListener(dialog, finishButtonType));
// Button cancelButton = getButton(dialog, CANCEL_BUTTON_FIELD_NAME);
// if(cancelButton!=null) {
// cancelButton.addSelectionListener(new ButtonListener(dialog, cancelButtonType));
// }
}
break;
}
}
}
}
}
} catch (Exception e) {
// Catch all Exceptions to make sure, in case of bugs, Usage doesn't prevent JBT from working
JBossToolsUsageActivator.getDefault().getLogger().error(e, true);
}
}
private Button getButton(WizardDialog dialog, String fieldName) {
Object button = null;
try {
Field field = WizardDialog.class.getDeclaredField(fieldName);
field.setAccessible(true);
button = field.get(dialog);
if(button instanceof Button) {
return (Button)button;
}
} catch (NoSuchFieldException e) {
JBossToolsUsageActivator.getDefault().getLogger().error(e);
} catch (SecurityException e) {
JBossToolsUsageActivator.getDefault().getLogger().error(e);
} catch (IllegalArgumentException e) {
JBossToolsUsageActivator.getDefault().getLogger().error(e);
} catch (IllegalAccessException e) {
JBossToolsUsageActivator.getDefault().getLogger().error(e);
}
return null;
}
private static class ButtonListener implements SelectionListener {
private WizardDialog dialog;
private UsageEventType type;
public ButtonListener(WizardDialog dialog, UsageEventType type) {
this.dialog = dialog;
this.type = type;
}
@Override
public void widgetSelected(SelectionEvent e) {
IWizardPage page = dialog.getCurrentPage();
if(page!=null) {
IWizard wizard = page.getWizard();
if(wizard!=null) {
String className = StringUtils.compressClassName(wizard.getClass().getName());
// String title = wizard.getWindowTitle();
// Count the event
UsageReporter.getInstance().countEvent(type.event(className));
}
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
}
}