package org.apache.samoa.moa.tasks;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * 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.
 * #L%
 */

/**
 * Interface representing a task monitor.
 * 
 * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
 * @version $Revision: 7 $
 */
public interface TaskMonitor {

  /**
   * Sets the description and the percentage done of the current activity.
   * 
   * @param activity
   *          the description of the current activity
   * @param fracComplete
   *          the percentage done of the current activity
   */
  public void setCurrentActivity(String activityDescription,
      double fracComplete);

  /**
   * Sets the description of the current activity.
   * 
   * @param activity
   *          the description of the current activity
   */
  public void setCurrentActivityDescription(String activity);

  /**
   * Sets the percentage done of the current activity
   * 
   * @param fracComplete
   *          the percentage done of the current activity
   */
  public void setCurrentActivityFractionComplete(double fracComplete);

  /**
   * Gets whether the task should abort.
   * 
   * @return true if the task should abort
   */
  public boolean taskShouldAbort();

  /**
   * Gets whether there is a request for preview the task result.
   * 
   * @return true if there is a request for preview the task result
   */
  public boolean resultPreviewRequested();

  /**
   * Sets the current result to preview
   * 
   * @param latestPreview
   *          the result to preview
   */
  public void setLatestResultPreview(Object latestPreview);

  /**
   * Gets the description of the current activity.
   * 
   * @return the description of the current activity
   */
  public String getCurrentActivityDescription();

  /**
   * Gets the percentage done of the current activity
   * 
   * @return the percentage done of the current activity
   */
  public double getCurrentActivityFractionComplete();

  /**
   * Requests the task monitored to pause.
   * 
   */
  public void requestPause();

  /**
   * Requests the task monitored to resume.
   * 
   */
  public void requestResume();

  /**
   * Requests the task monitored to cancel.
   * 
   */
  public void requestCancel();

  /**
   * Gets whether the task monitored is paused.
   * 
   * @return true if the task is paused
   */
  public boolean isPaused();

  /**
   * Gets whether the task monitored is cancelled.
   * 
   * @return true if the task is cancelled
   */
  public boolean isCancelled();

  /**
   * Requests to preview the task result.
   * 
   */
  public void requestResultPreview();

  /**
   * Requests to preview the task result.
   * 
   * @param toInform
   *          the listener of the changes in the preview of the result
   */
  public void requestResultPreview(ResultPreviewListener toInform);

  /**
   * Gets the current result to preview
   * 
   * @return the result to preview
   */
  public Object getLatestResultPreview();
}
