/******************************************************************************* * Copyright (c) 2012-2017 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.editor.orion.client.incremental.find; import elemental.dom.Text; import elemental.html.DivElement; import com.google.gwt.dom.client.Element; import com.google.inject.Inject; import org.eclipse.che.ide.api.editor.texteditor.EditorWidget; import org.eclipse.che.ide.editor.orion.client.OrionEditorWidget; import org.eclipse.che.ide.editor.orion.client.OrionResource; import org.eclipse.che.ide.status.message.StatusMessage; import org.eclipse.che.ide.status.message.StatusMessageObserver; import org.eclipse.che.ide.util.dom.Elements; import static org.eclipse.che.ide.util.StringUtils.isNullOrEmpty; /** * IncrementalFindReportStatusObserver listens editor status messages and filter messages * which contains information about incremental find state. It creates simple UI * for user notification about incremental find operation progress. * Note: incremental find can be straight or reverse. * * @author Alexander Andrienko */ public class IncrementalFindReportStatusObserver implements StatusMessageObserver { private final OrionResource orionResource; private EditorWidget editorWidget; private DivElement findDiv; @Inject public IncrementalFindReportStatusObserver(OrionResource orionResource) { this.orionResource = orionResource; } /** * Sets editor widget which contains text source to incremental search. * * @param editorWidget * editor widget with content to search. */ public void setEditorWidget(OrionEditorWidget editorWidget) { this.editorWidget = editorWidget; } /** * * Checks if {@code statusMessage} is incremental find message. * In case if this is true than create or update simple UI to display * message content, otherwise skip this message. * * @param statusMessage * editor status message. */ @Override public void update(StatusMessage statusMessage) { String message = statusMessage.getMessage(); boolean isIncrementalFindMessage = message.startsWith("Incremental find:") | message.startsWith("Reverse Incremental find:"); if (!message.isEmpty() && !isIncrementalFindMessage) { return; } Element editorElem = editorWidget.asWidget().getElement(); Element findDiv = createFindDiv(message); setStyle(message, findDiv); editorElem.appendChild(findDiv); if (isNullOrEmpty(message) && findDiv != null) { editorElem.removeChild(findDiv); this.findDiv = null; } } private Element createFindDiv(String message) { if (findDiv == null) { findDiv = Elements.createDivElement(); Text messageNode = Elements.createTextNode(message); findDiv.appendChild(messageNode); } findDiv.getFirstChild().setTextContent(message); return (Element)findDiv; } private void setStyle(String message, Element element) { if (message.endsWith("(not found)")) { element.addClassName(orionResource.getIncrementalFindStyle().incrementalFindContainer()); element.addClassName(orionResource.getIncrementalFindStyle().incrementalFindError()); } else { element.setClassName(orionResource.getIncrementalFindStyle().incrementalFindContainer()); } } }