// Copyright (C) 2013 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.diff;

import com.google.gerrit.client.changes.CommentInfo;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.user.client.ui.Composite;

import net.codemirror.lib.CodeMirror;
import net.codemirror.lib.Configuration;
import net.codemirror.lib.TextMarker;
import net.codemirror.lib.TextMarker.FromTo;

/** An HtmlPanel for displaying a comment */
abstract class CommentBox extends Composite {
  static {
    Resources.I.style().ensureInjected();
  }

  interface Style extends CssResource {
    String commentWidgets();
    String commentBox();
    String contents();
    String message();
    String header();
    String summary();
    String date();

    String goPrev();
    String goNext();
    String goUp();
  }

  private final CommentGroup group;
  private ScrollbarAnnotation annotation;
  private FromTo fromTo;
  private TextMarker rangeMarker;
  private TextMarker rangeHighlightMarker;

  CommentBox(CommentGroup group, CommentRange range) {
    this.group = group;
    if (range != null) {
      fromTo = FromTo.create(range);
      rangeMarker = group.getCm().markText(
          fromTo.from(),
          fromTo.to(),
          Configuration.create()
              .set("className", DiffTable.style.range()));
    }
    addDomHandler(new MouseOverHandler() {
      @Override
      public void onMouseOver(MouseOverEvent event) {
        setRangeHighlight(true);
      }
    }, MouseOverEvent.getType());
    addDomHandler(new MouseOutHandler() {
      @Override
      public void onMouseOut(MouseOutEvent event) {
        setRangeHighlight(isOpen());
      }
    }, MouseOutEvent.getType());
  }

  abstract CommentInfo getCommentInfo();
  abstract boolean isOpen();

  void setOpen(boolean open) {
    group.resize();
    setRangeHighlight(open);
    getCm().focus();
  }

  CommentGroup getCommentGroup() {
    return group;
  }

  CommentManager getCommentManager() {
    return group.getCommentManager();
  }

  ScrollbarAnnotation getAnnotation() {
    return annotation;
  }

  void setAnnotation(ScrollbarAnnotation mh) {
    annotation = mh;
  }

  void setRangeHighlight(boolean highlight) {
    if (fromTo != null) {
      if (highlight && rangeHighlightMarker == null) {
        rangeHighlightMarker = group.getCm().markText(
            fromTo.from(),
            fromTo.to(),
            Configuration.create()
                .set("className", DiffTable.style.rangeHighlight()));
      } else if (!highlight && rangeHighlightMarker != null) {
        rangeHighlightMarker.clear();
        rangeHighlightMarker = null;
      }
    }
  }

  void clearRange() {
    if (rangeMarker != null) {
      rangeMarker.clear();
      rangeMarker = null;
    }
  }

  CodeMirror getCm() {
    return group.getCm();
  }

  FromTo getFromTo() {
    return fromTo;
  }
}
