/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.extension.machine.client.machine.console;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SimpleHtmlSanitizer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.ide.api.parts.PartStackUIResources;
import org.eclipse.che.ide.api.parts.base.BaseView;
/**
* Implementation of {@link MachineConsoleView}.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class MachineConsoleViewImpl extends BaseView<MachineConsoleView.ActionDelegate> implements MachineConsoleView {
private static final String PRE_STYLE = "style='margin:0px;'";
@UiField
SimplePanel toolbarPanel;
@UiField
ScrollPanel scrollPanel;
@UiField
FlowPanel consoleLines;
@Inject
public MachineConsoleViewImpl(PartStackUIResources resources, MachineConsoleViewImplUiBinder uiBinder) {
super(resources);
setContentWidget(uiBinder.createAndBindUi(this));
minimizeButton.ensureDebugId("machine-console-minimizeButton");
// this hack used for adding box shadow effect to toolbar
toolbarPanel.getElement().getParentElement().getStyle().setOverflow(Overflow.VISIBLE);
toolbarPanel.getElement().getParentElement().getStyle().setZIndex(1);
scrollPanel.getElement().setTabIndex(0);
}
/** {@inheritDoc} */
@Override
public AcceptsOneWidget getToolbarPanel() {
return toolbarPanel;
}
/** {@inheritDoc} */
@Override
public void print(String message) {
final HTML html = new HTML(buildSafeHtmlMessage(message));
html.getElement().getStyle().setPaddingLeft(2, Style.Unit.PX);
consoleLines.add(html);
}
/** {@inheritDoc} */
@Override
public void clear() {
consoleLines.clear();
}
/** {@inheritDoc} */
@Override
public void scrollBottom() {
scrollPanel.getElement().setScrollTop(scrollPanel.getElement().getScrollHeight());
}
/** Return sanitized message (with all restricted HTML-tags escaped) in {@link SafeHtml}. */
private SafeHtml buildSafeHtmlMessage(String message) {
return new SafeHtmlBuilder()
.appendHtmlConstant("<pre " + PRE_STYLE + ">")
.append(SimpleHtmlSanitizer.sanitizeHtml(message))
.appendHtmlConstant("</pre>")
.toSafeHtml();
}
@Override
protected void focusView() {
scrollPanel.getElement().focus();
}
interface MachineConsoleViewImplUiBinder extends UiBinder<Widget, MachineConsoleViewImpl> {
}
}