/*******************************************************************************
* Copyright (c) 2016 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.vpe.reddeer.preview.editor;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.gef.ui.views.palette.PalettePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Event;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.core.handler.BrowserHandler;
import org.jboss.reddeer.core.util.Display;
import org.jboss.reddeer.core.util.ResultRunnable;
import org.jboss.reddeer.swt.impl.shell.DefaultShell;
import org.jboss.reddeer.swt.impl.toolbar.DefaultToolItem;
import org.jboss.reddeer.workbench.ui.dialogs.FilteredPreferenceDialog;
import org.jboss.tools.vpe.preview.editor.VpvEditorPart;
import org.jboss.tools.vpe.reddeer.VisualEditor;
import org.jboss.tools.vpe.reddeer.condition.VPVBackIsEnabled;
import org.jboss.tools.vpe.reddeer.condition.VPVForwardIsEnabled;
import org.jboss.tools.vpe.reddeer.resref.core.VpvResourcesDialog;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
import org.jboss.tools.common.model.ui.views.palette.IPaletteAdapter;
import org.jboss.tools.jst.reddeer.palette.JQueryMobilePalette;
import org.jboss.tools.jst.reddeer.web.ui.editor.jspeditor.JSPMultiPageEditor;
import org.jboss.tools.jst.web.ui.internal.editor.jspeditor.PalettePageImpl;
import org.jboss.tools.jst.web.ui.palette.PaletteAdapter;
public class VPVEditor extends VisualEditor{
public VPVEditor() {
super();
}
@SuppressWarnings("restriction")
public String getSelectedTextInBrowser(){
VpvEditorPart vpvEditor = (VpvEditorPart)editor.getVisualEditor();
Browser vpvBrowser = getBrowser();
Long selectedElementId = getSelectedElementId(vpvEditor);
String pageText = BrowserHandler.getInstance().getText(vpvBrowser);
org.jsoup.nodes.Document document = Jsoup.parse(pageText);
if(selectedElementId == null){
return null;
}
Elements selectedElements = document.getElementsByAttributeValue("data-vpvid", selectedElementId.toString());
if(selectedElements.size() > 0){
return selectedElements.get(0).text();
}
return null;
}
private Long getSelectedElementId(final VpvEditorPart vpvEditor){
return Display.syncExec(new ResultRunnable<Long>() {
@Override
public Long run() {
return vpvEditor.getVisualEditor().getCurrentSelectedElementId();
}
});
}
private Browser getBrowser(){
VpvEditorPart vpvEditor = (VpvEditorPart)editor.getVisualEditor();
return vpvEditor.getVisualEditor().getBrowser();
}
public Object evaluateScript(final String script){
return Display.syncExec(new ResultRunnable<Object>() {
@Override
public Object run() {
return getBrowser().evaluate(script);
}
});
}
public Boolean executeScript(final String script){
return Display.syncExec(new ResultRunnable<Boolean>() {
@Override
public Boolean run() {
return getBrowser().execute(script);
}
});
}
public void clickInBrowser(String text){
Object[] coord = (Object[])evaluateScript("var elements = document.getElementsByTagName('*'); var i;"
+ "for(i=0; i<elements.length; i++){ "
+ "if(elements[i].textContent == '"+text+"'){"
+ "var coord = new Array(); coord[0]= elements[i].getBoundingClientRect().right-"
+ "((elements[i].getBoundingClientRect().right-elements[i].getBoundingClientRect().left)/2);"
+ "coord[1]= elements[i].getBoundingClientRect().top - "
+ "((elements[i].getBoundingClientRect().top-elements[i].getBoundingClientRect().bottom)/2);"
+ "return coord}}");
final Event ev = new Event();
ev.x=(int)((Double)coord[0]).doubleValue();
ev.y=(int)((Double)coord[1]).doubleValue();
Display.syncExec(new Runnable() {
@Override
public void run() {
getBrowser().notifyListeners(SWT.MouseDown, ev);
getBrowser().notifyListeners(SWT.MouseUp, ev);
}
});
}
public String getBrowserURL(){
return Display.syncExec(new ResultRunnable<String>() {
@Override
public String run() {
return getBrowser().getUrl();
}
});
}
public VpvEditorPart getVpvEditor(){
return (VpvEditorPart)editor.getVisualEditor();
}
public JQueryMobilePalette getPalette(){
PaletteViewer viewer = Display.syncExec(new ResultRunnable<PaletteViewer>() {
@Override
public PaletteViewer run() {
PalettePage page = (PalettePage)editor.getAdapter(PalettePage.class);
PalettePageImpl palettePage = (PalettePageImpl)page;
IPaletteAdapter adapter = palettePage.getAdapter();
PaletteViewer viewer = ((PaletteAdapter)adapter).getViewer();
return viewer;
}
});
JQueryMobilePalette jqp = new JQueryMobilePalette(viewer);
return jqp;
}
public boolean isBackEnabled(){
return new DefaultToolItem("Back").isEnabled();
}
public void back(){
new WaitUntil(new VPVBackIsEnabled(this),TimePeriod.SHORT);
new DefaultToolItem("Back").click();
}
public boolean isForwardEnabled(){
return new DefaultToolItem("Forward").isEnabled();
}
public void forward(){
new WaitUntil(new VPVForwardIsEnabled(this),TimePeriod.SHORT);
new DefaultToolItem("Forward").click();
}
public FilteredPreferenceDialog openPreferences(){
new DefaultToolItem("Preferences").click();
new DefaultShell(FilteredPreferenceDialog.DIALOG_TITLE);
return new FilteredPreferenceDialog();
}
public VpvResourcesDialog openPageDesignOptions(){
new DefaultToolItem("Page Design Options").click();
return new VpvResourcesDialog();
}
}