/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.server.headlessclient.dataui; import java.awt.Point; import java.util.ArrayList; import java.util.List; import javax.swing.JEditorPane; import javax.swing.SwingConstants; import org.apache.wicket.Application; import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.protocol.http.WicketURLEncoder; import org.apache.wicket.util.crypt.ICrypt; import org.apache.wicket.util.string.AppendingStringBuffer; import com.servoy.j2db.IApplication; import com.servoy.j2db.server.headlessclient.WebForm; import com.servoy.j2db.ui.IEventExecutor; import com.servoy.j2db.ui.IFieldComponent; import com.servoy.j2db.ui.ILabel; import com.servoy.j2db.ui.ISupportScroll; import com.servoy.j2db.ui.scripting.AbstractRuntimeTextEditor; import com.servoy.j2db.util.Text; import com.servoy.j2db.util.Utils; /** * Represents the HTML Field in the webbrowser. Has support for call backs of scripts through javascript:methodname links or other tags. * * @author jcompagner */ public class WebDataHtmlView extends WebDataSubmitLink implements IFieldComponent, ISupportScriptCallback, ISupportScroll { private static final long serialVersionUID = 1L; private InlineScriptExecutorBehavior inlineScriptExecutor; public WebDataHtmlView(IApplication application, AbstractRuntimeTextEditor<IFieldComponent, JEditorPane> scriptable, String id) { super(application, scriptable, id); setHorizontalAlignment(SwingConstants.LEFT); setVerticalAlignment(SwingConstants.TOP); setEscapeModelStrings(false); add(new ScrollBehavior(this)); } /** * @see com.servoy.j2db.server.headlessclient.dataui.WebBaseSubmitLink#onSubmit() */ @Override public void onSubmit() { super.onSubmit(); String scriptName = RequestCycle.get().getRequest().getParameter(getInputName()); WebForm wf = findParent(WebForm.class); if (wf != null) { wf.getController().eval(scriptName); } } /** * @see com.servoy.j2db.server.headlessclient.dataui.ISupportScriptCallback#getCallBackUrl(java.lang.String, boolean) */ @SuppressWarnings("nls") public CharSequence getCallBackUrl(String scriptName, boolean testDoubleClick) { boolean useAJAX = Utils.getAsBoolean(application.getRuntimeProperties().get("useAJAX")); if (useAJAX) { if (inlineScriptExecutor == null) { inlineScriptExecutor = new InlineScriptExecutorBehavior(this); add(inlineScriptExecutor); } AppendingStringBuffer asb = new AppendingStringBuffer(80); if (testDoubleClick) { asb.append("if (testDoubleClickId('"); asb.append(getMarkupId()); asb.append("')) { "); } asb.append("document.getElementById('").append(getMarkupId()).append("').focus();"); asb.append("window.setTimeout(function() { wicketAjaxGet('"); asb.append(inlineScriptExecutor.getCallbackUrl()); ICrypt urlCrypt = Application.get().getSecuritySettings().getCryptFactory().newCrypt(); asb.append("&snenc="); String escapedScriptName = Utils.stringReplace(Utils.stringReplace(scriptName, "\\\'", "\'"), """, "\""); asb.append(WicketURLEncoder.QUERY_INSTANCE.encode(urlCrypt.encryptUrlSafe(escapedScriptName))); for (String browserArgument : inlineScriptExecutor.getBrowserArguments(scriptName)) { asb.append("&").append(browserArgument).append("=' + ").append(browserArgument).append(" + '"); } asb.append("');}, 0);"); if (testDoubleClick) { asb.append("} "); } asb.append("return false;"); return asb.toString(); } else { return StripHTMLTagsConverter.getTriggerJavaScript(this, scriptName); } } /** * @see wicket.markup.html.form.SubmitLink#onComponentTag(wicket.markup.ComponentTag) */ @SuppressWarnings("nls") @Override protected void onComponentTag(ComponentTag tag) { tag.put("id", getMarkupId()); } /** * This is because in the super classes we add a container <span> tag to fix the horizontal/vertical * alignment, and that tag is missing the 'width' and 'height' attributes by default. By returning true * here we force the two attributes to be added. */ @Override protected boolean hasHtmlOrImage() { return true; } @Override protected String getCSSId() { return null; } @Override protected boolean isAnchored() { return Utils.getAsBoolean(application.getRuntimeProperties().get("enableAnchors")); //$NON-NLS-1$ } public void setActionCmd(String actionCmd, Object[] args) { IEventExecutor eventExecutor = getEventExecutor(); if (eventExecutor instanceof WebEventExecutor) ((WebEventExecutor)eventExecutor).setActionCmd(actionCmd, args); } public void setChangeCmd(String changeCmd, Object[] args) { } public void setEditable(boolean editable) { } public boolean isEditable() { return false; } public void setEnterCmds(String[] enterCmds, Object[][] args) { IEventExecutor eventExecutor = getEventExecutor(); if (eventExecutor instanceof WebEventExecutor) ((WebEventExecutor)eventExecutor).setEnterCmds(enterCmds, args); } public void setLeaveCmds(String[] leaveCmds, Object[][] args) { IEventExecutor eventExecutor = getEventExecutor(); if (eventExecutor instanceof WebEventExecutor) ((WebEventExecutor)eventExecutor).setLeaveCmds(leaveCmds, args); } public void setMaxLength(int maxLength) { } public void setSelectOnEnter(boolean selectOnEnter) { } private List<ILabel> labels; public void addLabelFor(ILabel label) { if (labels == null) labels = new ArrayList<ILabel>(3); labels.add(label); } public List<ILabel> getLabelsFor() { return labels; } /* * visible--------------------------------------------------- */ @Override public void setComponentVisible(boolean visible) { if (isViewable() || !visible) { super.setComponentVisible(visible); if (labels != null) { for (int i = 0; i < labels.size(); i++) { ILabel label = labels.get(i); label.setComponentVisible(visible); } } } } @Override public void setComponentEnabled(final boolean b) { if (accessible || !b) { super.setComponentEnabled(b); if (labels != null) { for (int i = 0; i < labels.size(); i++) { ILabel label = labels.get(i); label.setComponentEnabled(b); } } } } @Override public int getFontSize() { // Since the fontSize is used only for calculating web size, it is safe to just return 0 // in order to avoid any padding adjustments. (issue 169037) return 0; } public String getTitleText() { return Text.processTags(titleText, resolver); } public void setReadOnly(boolean b) { } @Override public boolean isReadOnly() { return true; } @Override public void setTitleText(String title) { super.setTitleText(title); // see ComponentFactory createField if (needEntireState() && getDataProviderID() == null) { setTagText(application.getI18NMessageIfPrefixed(title)); } } private final Point scroll = new Point(0, 0); /* * (non-Javadoc) * * @see com.servoy.j2db.ui.ISupportScroll#setScroll(int, int) */ @Override public void setScroll(int x, int y) { scroll.x = x; scroll.y = y; } /* * (non-Javadoc) * * @see com.servoy.j2db.ui.ISupportScroll#getScroll() */ @Override public Point getScroll() { return scroll; } /* * (non-Javadoc) * * @see com.servoy.j2db.ui.ISupportScroll#getScrollComponentMarkupId() */ @Override public String getScrollComponentMarkupId() { return getMarkupId(); } }