/*
 * Copyright 2000-2012 JetBrains s.r.o.
 *
 * 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.intellij.ui.popup.util;

import com.intellij.ui.components.JBList;
import com.intellij.util.Alarm;

import javax.swing.*;
import java.io.File;

public class DetailController {
  private final MasterController myMasterController;
  private final Alarm myUpdateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
  private DetailView myDetailView;
  private ItemWrapper mySelectedItem;

  public DetailController(MasterController myMasterController) {
    this.myMasterController = myMasterController;
  }

  protected void doUpdateDetailViewWithItem(ItemWrapper wrapper1) {
    if (wrapper1 != null) {
      wrapper1.updateDetailView(myDetailView);
    }
    else {
      myDetailView.clearEditor();
      myDetailView.setPropertiesPanel(null);
      myDetailView.setCurrentItem(null);
    }
  }

  private String getTitle2Text(String fullText) {
    int labelWidth = getLabel().getWidth();
    if (fullText == null || fullText.length() == 0) return " ";
    while (getLabel().getFontMetrics(getLabel().getFont()).stringWidth(fullText) > labelWidth) {
      int sep = fullText.indexOf(File.separatorChar, 4);
      if (sep < 0) return fullText;
      fullText = "..." + fullText.substring(sep);
    }

    return fullText;
  }

  private JLabel getLabel() {
    return myMasterController.getPathLabel();
  }

  public ItemWrapper getSelectedItem() {
    return mySelectedItem;
  }

  public void doUpdateDetailView(boolean now) {
    final Object[] values = myMasterController.getSelectedItems();
    ItemWrapper wrapper = null;
    if (values != null && values.length == 1) {
      wrapper = (ItemWrapper)values[0];
      getLabel().setText(getTitle2Text(wrapper.footerText()));
    }
    else {
      getLabel().setText(" ");
    }
    mySelectedItem = wrapper;
    myUpdateAlarm.cancelAllRequests();
    if (now) {
      doUpdateDetailViewWithItem(mySelectedItem);
    }
    else {
      myUpdateAlarm.addRequest(new Runnable() {
        @Override
        public void run() {
          doUpdateDetailViewWithItem(mySelectedItem);
          myUpdateAlarm.cancelAllRequests();
        }
      }, 100);
    }
  }

  public void updateDetailView() {
    doUpdateDetailView(false);
  }

  public void setList(final JBList list) {
    final ListSelectionModel listSelectionModel = list.getSelectionModel();
    listSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    if (list.getModel().getSize() == 0) {
      list.clearSelection();
    }
  }

  public void setDetailView(DetailView detailView) {
    myDetailView = detailView;
  }
}