code: package org.sunflow.system;
  
  import java.util.Locale;
  
  import org.sunflow.system.ui.ConsoleInterface;
  import org.sunflow.system.ui.SilentInterface;
  
  /**
   * Static singleton interface to a UserInterface object. This is set to a text
   * console by default.
   */
  public final class UI {
      private static UserInterface ui = new ConsoleInterface();
      private static boolean canceled = false;
      private static int verbosity = 3;
  
      public enum Module {
          API, GEOM, HAIR, ACCEL, BCKT, IPR, LIGHT, GUI, SCENE, BENCH, TEX, IMG, DISP, QMC, SYS, USER, CAM,
      }
  
      public enum PrintLevel {
          ERROR, WARN, INFO, DETAIL
      }
  
      private UI() {
      }
  
      /**
       * Sets the active user interface implementation. Passing <code>null</code>
       * silences printing completely.
       * 
       * @param ui object to recieve all user interface calls
       */
      public final static void set(UserInterface ui) {
          if (ui == null)
              ui = new SilentInterface();
          UI.ui = ui;
      }
  
      public final static void verbosity(int verbosity) {
          UI.verbosity = verbosity;
      }
  
      public final static String formatOutput(Module m, PrintLevel level, String s) {
          return String.format("%-5s  %-6s: %s", m.name(), level.name().toLowerCase(Locale.ENGLISH), s);
      }
  
      public final static synchronized void printDetailed(Module m, String s, Object... args) {
          if (verbosity > 3)
              ui.print(m, PrintLevel.DETAIL, String.format(s, args));
      }
  
      public final static synchronized void printInfo(Module m, String s, Object... args) {
          if (verbosity > 2)
              ui.print(m, PrintLevel.INFO, String.format(s, args));
      }
  
      public final static synchronized void printWarning(Module m, String s, Object... args) {
          if (verbosity > 1)
              ui.print(m, PrintLevel.WARN, String.format(s, args));
      }
  
      public final static synchronized void printError(Module m, String s, Object... args) {
          if (verbosity > 0)
              ui.print(m, PrintLevel.ERROR, String.format(s, args));
      }
  
      public final static synchronized void taskStart(String s, int min, int max) {
          ui.taskStart(s, min, max);
      }
  
      public final static synchronized void taskUpdate(int current) {
          ui.taskUpdate(current);
      }
  
      public final static synchronized void taskStop() {
          ui.taskStop();
          // reset canceled status
          // this assume the parent application will deal with it immediately
          canceled = false;
      }
  
      /**
       * Cancel the currently active task. This forces the application to abort as
       * soon as possible.
       */
      public final static synchronized void taskCancel() {
          printInfo(Module.GUI, "Abort requested by the user ...");
          canceled = true;
      }
  
      /**
       * Check to see if the current task should be aborted.
       * 
       * @return <code>true</code> if the current task should be stopped,
       *         <code>false</code> otherwise
       */
      public final static synchronized boolean taskCanceled() {
          if (canceled)
              printInfo(Module.GUI, "Abort request noticed by the current task");
          return canceled;
      }
  }