Package org.gudy.azureus2.ui.swt.progress

Source Code of org.gudy.azureus2.ui.swt.progress.ProgressReporter$ProgressReport

package org.gudy.azureus2.ui.swt.progress;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.swt.graphics.Image;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.Debug;

import com.aelitis.azureus.core.util.CopyOnWriteList;

/**
* A implementation of <code>IProgressReporter</code>
* <p>Any process wishing to participate in providing global progress indication can instantiate
* this class and simply use the available methods so set values or issue a command
*
* <p>
* When ever any state changes in this reporter a notification will be sent to the global
* reporting manager {@link ProgressReportingManager} followed by a notification to all
* registered listeners of this reporter</p>
*
* The listeners will be passed an immutable progress report {@link ProgressReporter.ProgressReport} which
* represents a snapshot of all the public properties contained in this reporter; inspecting the
* ProgressReport is the only way a listener can query the properties of this reporter.  This pattern
* allows the ProgressReporter to continue and process requests by not having to thread lock all public
* methods.  Additionally, the listeners are guaranteed a consistent snapshot of the reporter.
*
* <p>
* This reporter also has the capability to receive loop back commands from a listener for actions such like
* {@link #cancel()} and {@link #retry()}.  These commands are enabled by calling
*     {@link ProgressReporter#setCancelAllowed(boolean)}
* or {@link ProgressReporter#setRetryAllowed(boolean)}.
*
* The listener only initiates these actions by sending a notification back to the owner of the reporter;
* it is up the to owner to perform the actual act of canceling or retrying.
* </p><p>
*
* A typical life cycle of the ProgresReporter as seen from an owner is as follows
* (an owner is defined as the process that created the reporter):
* <ul>
* <li>Create ProgressReporter</li>
* <li>Set initial properties</li>
* <li>Register a listener to the reporter to respond to loopback notifications (optional)</li>
* <li>Update the reporter</li>
* <ul>
* <li>Set selection or percentage [{@link ProgressReporter#setSelection(int, String)}, {@link ProgressReporter#setPercentage(int, String)}]</li>
* <li>Set message [{@link ProgressReporter#setMessage(String)}]</li>
* <li>...</li>
* <li>Repeat until done</li>
* <li>Set done [{@link ProgressReporter#setDone()}]</li>
* </ul>
*
* <li>Then optionally Dispose of the reporter [{@link ProgressReporter#dispose(Object)}]</li>.<p>
* In addition to internal clean-ups, calling dispose(Object) will effectively remove the reporter from the history stack of the
* reporting manager and no more messages from this reporter will be processed.</P>
* </ul></p><p>
*
* Once a reporter is created and any property in the reporter is set the global reporting manager is
* notified; at which point any listener listening to the manager is forwarded this reporter.
* The manager listener may decide to display this reporter in a UI element, may register specific
* listeners to this reporter, may query its properties and take action, or can simply monitor it
* for such functions as logging.</p>
*
* This implementation is non-intrusive to the owner process and so provides existing processes the
* ability to participate in global progress indication without significant modification to the underlying
* processes.
*
*
*
* @author knguyen
*
*/
public class ProgressReporter
  implements IProgressReporter, IProgressReportConstants
{

  private ProgressReportingManager manager = null;

  /**
   * An instance id for this reporter that is guaranteed to be unique within this same session
   * It is declared as transient to help ensure no accidental reliance on the persistence of this ID
   * between sessionS (just in case this class is declared serializable in a future modification)
   */
  private transient int ID;

  private int minimum, maximum, selection, percentage;

  private int latestReportType = REPORT_TYPE_INIT;

  private boolean isIndeterminate, isDone, isPercentageInUse, isCancelAllowed,
      isCanceled, isRetryAllowed, isInErrorState, isDisposed;

  private String title = "";

  private String message = "";

  /**
   * Accumulates the detail messages in a List
   * <p>This is for when a listener starts listening to this reporter after it has started running;
   * upon initialization the listener may query this list to get all messages sent up to that point.</p>
   *
   */
  private CopyOnWriteList messageHistory = new CopyOnWriteList();

  private String detailMessage = "";

  private String errorMessage = "";

  private String name = "";

  private Image image = null;

  private String reporterType = REPORTER_TYPE_DEFAULT;

  private IProgressReport latestProgressReport = null;

  private CopyOnWriteList reporterListeners = null; //KN: Lazy init since not all reporters will have direct listeners

  /**
   * An arbitrary object reference that can be used by the owner of the <code>ProgressReporter</code> and its
   * listeners to share additional information should the current implementation be insufficient
   */
  private Object objectData = null;

  private int messageHistoryLimit = 1000;

  /**
   * If any of the following states have been reached then the reporter is considered inactive:
   * <ul>
   * <li><code>isDisposed</code>       ==   <code>true</code></li>
   * <li><code>isDone</code>           ==   <code>true</code></li>
   * <li><code>isInErrorState</code>  ==  <code>true</code></li>
   * <li><code>isCanceled</code>       ==  <code>true</code></li>
   * </ul>
   */
  private boolean isActive = true;

  /**
   * Construct a <code>ProgressReporter</code>; the returned instance is initialized with the proper ID
   */
  protected ProgressReporter(ProgressReportingManager manager) {
    this(manager,null);
  }

  /**
   * Construct a <code>ProgressReporter</code> with the given <code>name</code>; the returned
   * instance would have been initialized with the proper ID
   * @param name
   */
  protected ProgressReporter(ProgressReportingManager _manager, String name) {
    manager = _manager;
    this.name = name;
    this.ID = manager.getNextAvailableID();
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setReporterType(String)
   */
  public void setReporterType(String reporterType) {
    this.reporterType = reporterType;
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#dispose()
   */
  public void dispose() {

    synchronized (this) {
      /*
       * Disposed already so no need to do it again
       */

      if (true == isDisposed) {
        return;
      }

      isDisposed = true;
      isActive = false;
    }

    latestReportType = REPORT_TYPE_DISPOSED;

    /*
     * Notifies listeners
     */
    notifyListeners( getProgressReport());

    /*
     * Then dispose all listeners to let GC do it's magic.
     * This is just to do final clearing since at this point most listeners should have been disposed
     * already.
     */
    if (null != reporterListeners) {
      reporterListeners.clear();
    }

    /*
     * Finally notifies the manager
     */
    manager.notifyManager(this);
  }

  /**
   * Resets this reporter to its initial states such that values are reset to default
   * <p>An appropriate use for this is when a process is restarting or retrying; this allows an owning process
   * to keep on using the same instance of this reporter without having to create and dispatch a new one</p>
   */
  private void reInit() {
    isActive = true;
    isCanceled = false;
    isDone = false;
    isInErrorState = false;
    errorMessage = "";
    message = "";
    detailMessage = "";
    messageHistory.clear();
  }

  /**
   * Notifies registered listener that an event has occurred.
   * Subsequently a listener may be removed if it returns the value of  <code>RETVAL_OK_TO_DISPOSE</code>;
   * this optimization is designed to prevent dangling/orphaned listeners, and also reduces the
   * number of listeners to notify upon the next event
   */
  private void notifyListeners( IProgressReport report) {
    if (null == reporterListeners || reporterListeners.size() < 1) {
      return;
    }

    List removalList = new ArrayList();

    for (Iterator iterator = reporterListeners.iterator(); iterator.hasNext();) {
      IProgressReporterListener listener = ((IProgressReporterListener) iterator.next());

      try {
        /*
         * If the listener returned RETVAL_OK_TO_DISPOSE then it has indicated that it is no longer needed so we release it
         */
        if (RETVAL_OK_TO_DISPOSE == listener.report( report )) {
          removalList.add(listener);
        }
      } catch (Throwable e) {
        Debug.out(e);
      }
    }

    /*
     * Removes any listeners marked ok to disposed
     */
    for (Iterator iterator = removalList.iterator(); iterator.hasNext();) {
      reporterListeners.remove(iterator.next());
    }
  }

  /**
   * Updates and notifies listeners
   * @param REPORT_TYPE
   */
  private void updateAndNotify(int eventType) {
    latestReportType = eventType;

    /*
     * Take a snap shot of the reporter
     */
    latestProgressReport = new ProgressReport();

    /*
     * We directly bubble up this event to the manager for efficiency;
     * as opposed to having the manager register as a listener to each and every ProgressReporter.
     * Effectively this allows the manager to receive all events from all reporters
     */
    manager.notifyManager(this);

    /*
     * If a property has changed but the reporter has been canceled then don't notify the listener
     * since they are no longer expecting a REPORT_TYPE_PROPERTY_CHANGED event
     */
    if (eventType == REPORT_TYPE_PROPERTY_CHANGED && true == isCanceled) {
      return;
    }

    /*
     * Now we can notify listeners for this specific reporter
     */
    notifyListeners( latestProgressReport );
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setSelection(int, java.lang.String)
   */
  public void setSelection(int selection, String message) {
    if (true == shouldIgnore()) {
      return;
    }
    this.message = message;

    if (selection >= maximum) {
      setDone();
      return;
    }
    if (selection < minimum) {
      percentage = 0;
      selection = minimum;
      isIndeterminate = true;
      return;
    }
    this.selection = selection;
    percentage = (selection * 100) / (maximum - minimum);
    isDone = false;
    isPercentageInUse = false;
    isIndeterminate = false;

    if (null != message && message.length() > 0) {
      addToMessageHistory(message, MSG_TYPE_INFO);
    }

    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setPercentage(int, java.lang.String)
   */
  public void setPercentage(int percentage, String message) {
    if (true == shouldIgnore()) {
      return;
    }

    this.message = message;

    if (percentage >= 100) {
      setDone();
      return;
    }

    if (percentage < 0) {
      percentage = 0;
      selection = minimum;
      isIndeterminate = true;
      return;
    }
    minimum = 0;
    maximum = 100;
    this.percentage = percentage;
    this.selection = percentage;
    isDone = false;
    isPercentageInUse = true;
    isIndeterminate = false;

    if (null != message && message.length() > 0) {
      addToMessageHistory(message, MSG_TYPE_INFO);
    }

    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setIndeterminate(boolean)
   */
  public void setIndeterminate(boolean isIndeterminate) {
    if (true == shouldIgnore()) {
      return;
    }

    this.isIndeterminate = isIndeterminate;
    if (true == isIndeterminate) {
      minimum = 0;
      maximum = 0;
    }
    updateAndNotify(REPORT_TYPE_MODE_CHANGE);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setDone()
   */
  public void setDone() {
    synchronized (this) {
      if (true == shouldIgnore()) {
        return;
      }

      isDone = true;
      isActive = false;
    }

    selection = maximum;
    percentage = 100;
    isIndeterminate = false;
    message = MessageText.getString("Progress.reporting.status.finished");
    addToMessageHistory(message, MSG_TYPE_LOG);
    updateAndNotify(REPORT_TYPE_DONE);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setMessage(java.lang.String)
   */
  public void setMessage(String message) {
    if (true == shouldIgnore()) {
      return;
    }
    this.message = message;
    addToMessageHistory(message, MSG_TYPE_INFO);
    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setDetailMessage(java.lang.String)
   */
  public void appendDetailMessage(String detailMessage) {
    if (true == shouldIgnore()) {
      return;
    }
    this.detailMessage = detailMessage;

    addToMessageHistory(detailMessage, MSG_TYPE_LOG);

    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);

    /*
     * The detail message operates in append mode so after we have notified all the listeners
     * we reset it.  It is up to the listeners to accumulate the messages.
     *
     * Lazy implementor can also simply query the messageHistory
     */
    this.detailMessage = "";
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setMinimum(int)
   */
  public void setMinimum(int min) {
    if (true == shouldIgnore()) {
      return;
    }
    this.minimum = min;
    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setMaximum(int)
   */
  public void setMaximum(int max) {
    if (true == shouldIgnore()) {
      return;
    }
    this.maximum = max;
    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#cancel()
   */
  public void cancel() {
    synchronized (this) {
      if (true == isCanceled || true == shouldIgnore()) {
        return;
      }

      isCanceled = true;
      isActive = false;
    }
    message = MessageText.getString("Progress.reporting.status.canceled");
    addToMessageHistory(message, MSG_TYPE_LOG);
    updateAndNotify(REPORT_TYPE_CANCEL);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#retry()
   */
  public void retry() {
    synchronized (this) {
      if (true == shouldIgnore()) {
        return;
      }
      reInit();
    }
    message = MessageText.getString("Progress.reporting.status.retrying");
    addToMessageHistory(message, MSG_TYPE_LOG);
    updateAndNotify(REPORT_TYPE_RETRY);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setCancelAllowed(boolean)
   */
  public void setCancelAllowed(boolean cancelAllowed) {
    if (true == shouldIgnore()) {
      return;
    }

    this.isCancelAllowed = cancelAllowed;
    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setName(java.lang.String)
   */
  public void setName(String name) {
    if (true == shouldIgnore()) {
      return;
    }
    this.name = name + ""; //KN: Just a quick way to ensure the name is not null
    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setTitle(java.lang.String)
   */
  public void setTitle(String title) {
    if (true == shouldIgnore()) {
      return;
    }
    this.title = title;
    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setImage(org.eclipse.swt.graphics.Image)
   */
  public void setImage(Image image) {
    if (true == shouldIgnore()) {
      return;
    }
    this.image = image;
    updateAndNotify(REPORT_TYPE_PROPERTY_CHANGED);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setErrorMessage(java.lang.String)
   */
  public void setErrorMessage(String errorMessage) {
    if (true == shouldIgnore()) {
      return;
    }

    /*
     * Ignores duplicate error messages
     * NOTE: TorrentDownloaderImpl#runSupport() has a loop that currently sends the same error message
     * multiple times; there may be other processes doing the same thing so this code is meant to prevent
     * forwarding any error message from the same reporter more than once.
     */
    if (null != this.errorMessage
        && true == this.errorMessage.equals(errorMessage)) {
      return;
    }

    if (null == errorMessage || errorMessage.length() < 1) {
      this.errorMessage = MessageText.getString("Progress.reporting.default.error");
    } else {
      this.errorMessage = errorMessage;
    }
    isInErrorState = true;
    isActive = false;
    addToMessageHistory(this.errorMessage, MSG_TYPE_ERROR);
    updateAndNotify(REPORT_TYPE_ERROR);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setRetryAllowed(boolean)
   */
  public void setRetryAllowed(boolean retryOnError) {
    if (true == shouldIgnore()) {
      return;
    }
    this.isRetryAllowed = retryOnError;
  }

  /**
   * A convenience method to return whether this reporter should ignore subsequent calls to its accessor methods.
   * When a reporter has reached this state listeners usually make the assumption that there will be no
   * more changes to any properties in this reporter.  The use of this method is intended to provide a more consistent
   * state for the reporter; without this check a listener may have reference to a reporter that is marked as <code>done</code>
   * but then a subsequent message says it's at 50% completion.  By cutting of the notification here we prevent such
   * ambiguity from occurring for the listeners.
   * <p>
   * If any of the following states have been reached then the reporter can ignore subsequent calls to its accessor methods:
   * <ul>
   * <li><code>isDisposed</code>       ==   <code>true</code></li>
   * <li><code>isDone</code>           ==   <code>true</code></li>
   * </ul>
   * </p>
   * @return
   */
  private boolean shouldIgnore() {
    return (true == isDisposed || true == isDone);
  }

  /**
   * Create and add an <code>IMessage</code> to the message history
   * @param value
   * @param type
   */
  private void addToMessageHistory(String value, int type) {

    /*
     * Limiting the history list to prevent runaway processes from taking up too much resources
     */
    if (messageHistory.size() >= messageHistoryLimit) {
      return;
    }

    if (messageHistory.size() < messageHistoryLimit) {
      messageHistory.add(new ProgressReportMessage(value, type));
    }

    if (messageHistory.size() == messageHistoryLimit) {
      Debug.out(MessageText.getString(
          "Progress.reporting.detail.history.limit", new String[] {
            messageHistoryLimit + ""
          }));
    }
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#setObjectData(java.lang.Object)
   */
  public void setObjectData(Object objectData) {
    if (true == shouldIgnore()) {
      return;
    }
    this.objectData = objectData;
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#getMessageHistory()
   */
  public IMessage[] getMessageHistory() {
    /*
     * Converting to array so the original list is insulated from modification
     */
    List tmp = messageHistory.getList();
    return (IMessage[]) tmp.toArray(new IMessage[tmp.size()]);
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#addListener(org.gudy.azureus2.ui.swt.mainwindow.IProgressReporterListener)
   */
  public void addListener(IProgressReporterListener listener) {
    if (true == shouldIgnore()) {
      return;
    }
    if (null != listener) {
      if (null == reporterListeners) {
        reporterListeners = new CopyOnWriteList();
        reporterListeners.add(listener);
      } else if (false == reporterListeners.contains(listener)) {
        reporterListeners.add(listener);
      }
    }
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#removeListener(org.gudy.azureus2.ui.swt.mainwindow.IProgressReporterListener)
   */
  public void removeListener(IProgressReporterListener listener) {
    if (null == reporterListeners) {
      return;
    }
    reporterListeners.remove(listener);
  }

  /**
   * Numerically compare by reporter ID's
   */
  public int compareTo(Object obj) {
    if (obj instanceof IProgressReporter) {
      //KN: Will this always work as expected as opposed to using ((IProgressReporter)obj).getID()?
      return (ID < obj.hashCode() ? -1 : (ID == obj.hashCode() ? 0 : 1));
    }
    return 0;
  }

  /**
   * Reporters are equal iif they have the same ID
   */
  public boolean equals(Object obj) {
    if (obj instanceof IProgressReporter) {
      //KN: Will this always work as expected as opposed to using ((IProgressReporter)obj).getID()?
      return ID == obj.hashCode();
    }
    return false;
  }

  /**
   * Hashcode and ID are the same
   */
  public int hashCode() {
    return ID;
  }

  /* (non-Javadoc)
   * @see org.gudy.azureus2.ui.swt.mainwindow.IProgressReporter#getProgressReport()
   */
  public IProgressReport getProgressReport() {
    if (null == latestProgressReport) {
      latestProgressReport = new ProgressReport();
    }
    return latestProgressReport;
  }

  /**
   * An immutable object containing all interesting values in a <code>ProgressReporter</code>.
   * <p>This represents a snapshot of all values at a single moment so instantiation of this class
   * should be guarded against multi-threaded modification of the source <code>ProgressReporter</code> </p>
   *
   * <p>This class is the only way an observer can query the properties of a <code>ProgressReporter</code>;
   * though they do not have to be, all variables are declared <code>final</code> to help remind the user of this class
   * that modification to any of its properties would have no effect on the reporter itself.
   * <p>
   * An exception to this insulation is the <code>objectData</code> variable; both the reporter
   * and the ProgressReport consumer have full access to it.  This is to facilitate advanced
   * 2-way communication between the 2 parties.</p>
   *
   *
   * @author knguyen
   * @see ProgressReporter#getProgressReport()
   */
  public class ProgressReport
    implements IProgressReport
  {
    private final String reporterType = ProgressReporter.this.reporterType;

    private final int reporterID = ProgressReporter.this.ID;

    private final int minimum = ProgressReporter.this.minimum;

    private final int maximum = ProgressReporter.this.maximum;

    private final int selection = ProgressReporter.this.selection;

    private final int percentage = ProgressReporter.this.percentage;

    private final boolean isActive = ProgressReporter.this.isActive;

    private final boolean isIndeterminate = ProgressReporter.this.isIndeterminate;

    private final boolean isDone = ProgressReporter.this.isDone;

    private final boolean isPercentageInUse = ProgressReporter.this.isPercentageInUse;

    private final boolean isCancelAllowed = ProgressReporter.this.isCancelAllowed;

    public final boolean isCanceled = ProgressReporter.this.isCanceled;

    private final boolean isRetryAllowed = ProgressReporter.this.isRetryAllowed;

    private final boolean isInErrorState = ProgressReporter.this.isInErrorState;

    private final boolean isDisposed = ProgressReporter.this.isDisposed;

    private final String title = ProgressReporter.this.title;

    private final String message = ProgressReporter.this.message;

    private final String detailMessage = ProgressReporter.this.detailMessage;

    private final String errorMessage = ProgressReporter.this.errorMessage;

    private final String name = ProgressReporter.this.name;

    private final Image image = ProgressReporter.this.image;

    private final Object objectData = ProgressReporter.this.objectData;

    private final int REPORT_TYPE = ProgressReporter.this.latestReportType;

    /**
     * Construct a ProgressReport
     */
    private ProgressReport() {
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getReporterType()
     */
    public String getReporterType() {
      return reporterType;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getReporterID()
     */
    public int getReporterID() {
      return reporterID;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getMinimum()
     */
    public int getMinimum() {
      return minimum;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getMaximum()
     */
    public int getMaximum() {
      return maximum;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getSelection()
     */
    public int getSelection() {
      return selection;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getPercentage()
     */
    public int getPercentage() {
      return percentage;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isActive()
     */
    public boolean isActive() {
      return isActive;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isIndeterminate()
     */
    public boolean isIndeterminate() {
      return isIndeterminate;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isDone()
     */
    public boolean isDone() {
      return isDone;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isPercentageInUse()
     */
    public boolean isPercentageInUse() {
      return isPercentageInUse;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isCancelAllowed()
     */
    public boolean isCancelAllowed() {
      return isCancelAllowed;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isCanceled()
     */
    public boolean isCanceled() {
      return isCanceled;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isRetryAllowed()
     */
    public boolean isRetryAllowed() {
      return isRetryAllowed;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isInErrorState()
     */
    public boolean isInErrorState() {
      return isInErrorState;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#isDisposed()
     */
    public boolean isDisposed() {
      return isDisposed;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getTitle()
     */
    public String getTitle() {
      return title;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getMessage()
     */
    public String getMessage() {
      return message;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getDetailMessage()
     */
    public String getDetailMessage() {
      return detailMessage;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getErrorMessage()
     */
    public String getErrorMessage() {
      return errorMessage;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getName()
     */
    public String getName() {
      return name;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getImage()
     */
    public Image getImage() {
      return image;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getObjectData()
     */
    public Object getObjectData() {
      return objectData;
    }

    /* (non-Javadoc)
     * @see org.gudy.azureus2.ui.swt.progress.IProgressReport#getREPORT_TYPE()
     */
    public int getReportType() {
      return REPORT_TYPE;
    }

  }

}
TOP

Related Classes of org.gudy.azureus2.ui.swt.progress.ProgressReporter$ProgressReport

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.