/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dashbuilder.displayer.client.widgets.sourcecode; import java.util.HashMap; import java.util.Map; import javax.enterprise.context.Dependent; import javax.inject.Inject; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.uberfire.client.mvp.UberView; import org.uberfire.mvp.Command; /** * Source code editor supporting the HTML and Javascript languages. * * <p>(Check out the {@link SourceCodeType} interface which contains the list of supported languages)</p> */ @Dependent public class SourceCodeEditor implements IsWidget { public interface View extends UberView<SourceCodeEditor> { void clearAll(); void edit(SourceCodeType type, String code); void declareVariable(String var, String description); void injectVariable(String var); void focus(); void error(String error); void clearError(); } View view; SourceCodeType type; String code; Command onSourceCodeChanged; HtmlValidator htmlValidator; JsValidator jsValidator; boolean hasErrors = false; Map<String,String> varMap; @Inject public SourceCodeEditor(View view, HtmlValidator htmlValidator, JsValidator jsValidator) { this.view = view; this.htmlValidator = htmlValidator; this.jsValidator = jsValidator; view.init(this); } @Override public Widget asWidget() { return view.asWidget(); } public String getCode() { return code; } public boolean hasErrors() { return hasErrors; } public void init(SourceCodeType type, String code, Map<String,String> varMap, Command onSourceCodeChanged) { this.type = type; this.code = code; this.varMap = varMap == null ? new HashMap<>() : varMap; this.hasErrors = false; this.onSourceCodeChanged = onSourceCodeChanged; view.clearAll(); view.edit(type, code); view.focus(); for (String var : varMap.keySet()) { view.declareVariable(var, varMap.get(var)); } String error = validateSourceCode(code); if (error != null) { hasErrors = true; view.error(error); } } public void focus() { view.focus(); } public String validateSourceCode(String newCode) { if (newCode != null && newCode.length() > 0) { switch (type) { case JAVASCRIPT: return jsValidator.validate(newCode, varMap.keySet()); case HTML: return htmlValidator.validate(newCode); } } return null; } public void onVariableSelected(String var) { view.injectVariable(var); view.focus(); } public boolean onSourceCodeChanged(String newCode) { String error = validateSourceCode(newCode); if (error != null) { hasErrors = true; view.error(error); view.focus(); return false; } else { code = newCode; hasErrors = false; view.clearError(); onSourceCodeChanged.execute(); return true; } } }