// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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.collide.client.editor.selection;

import com.google.collide.client.editor.Buffer;
import com.google.collide.client.editor.FocusManager;
import com.google.collide.client.editor.renderer.Renderer;
import com.google.collide.shared.document.Document;

/*
 * TODO: split SelectionModel into multiple components owned by
 * this class
 */
/**
 * Manages and owns different components related to text selection.
 */
public class SelectionManager {

  public static SelectionManager create(Document document, Buffer buffer,
      FocusManager focusManager, SelectionLineRenderer.Resources resources) {
    SelectionModel selectionModel = SelectionModel.create(document, buffer);
    SelectionLineRenderer selectionLineRenderer =
        new SelectionLineRenderer(selectionModel, focusManager, resources);

    return new SelectionManager(selectionModel, selectionLineRenderer);
  }

  private Renderer renderer;
  private final SelectionLineRenderer selectionLineRenderer;
  private final SelectionModel selectionModel;

  private SelectionManager(SelectionModel selectionModel,
      SelectionLineRenderer selectionLineRenderer) {
    this.selectionModel = selectionModel;
    this.selectionLineRenderer = selectionLineRenderer;
  }

  public void initialize(Renderer renderer) {
    this.renderer = renderer;
    renderer.addLineRenderer(selectionLineRenderer);
  }

  public void teardown() {
    renderer.removeLineRenderer(selectionLineRenderer);
    selectionModel.teardown();
  }

  public SelectionModel getSelectionModel() {
    return selectionModel;
  }
}
