// Copyright (C) 2012 The Android Open Source Project
//
// 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 com.google.gerrit.client.ui;

public class HighlightingInlineHyperlink extends InlineHyperlink {

  private String toHighlight;

  public HighlightingInlineHyperlink(final String text, String token, String toHighlight) {
    super(text, token);
    this.toHighlight = toHighlight;
    highlight(text, toHighlight);
  }

  @Override
  public void setText(String text) {
    super.setText(text);
    highlight(text, toHighlight);
  }

  private void highlight(String text, String toHighlight) {
    setHTML(Util.highlight(text, toHighlight));
  }
}
