home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / modules / OSRProgress.ycp < prev    next >
Text File  |  2006-11-29  |  7KB  |  278 lines

  1. /**
  2.  * File:
  3.  *   OSRProgress.ycp
  4.  *
  5.  * Module:
  6.  *
  7.  * Summary:
  8.  *
  9.  * Author:
  10.  *   Johannes Buchhold <jbuch@suse.de>
  11.  *
  12.  * $Id: OSRProgress.ycp 20450 2004-12-01 11:55:31Z jsuchome $
  13.  */
  14.  
  15. {
  16.   module "OSRProgress";
  17.  
  18.   textdomain "repair";
  19.  
  20.   import "Mode";
  21.  
  22.   /**
  23.    * The length of a ProgressBar
  24.    */
  25.   global integer length    = 1000;
  26.  
  27.   /**
  28.    * Data of all created ProgressBar and Downloadprogress
  29.    */
  30.   map progresses    = $[];
  31.  
  32.   /**
  33.    * Reset module settings.
  34.    */
  35.   global define void Reset()``{
  36.       progresses = $[];
  37.   }
  38.  
  39.   global define term CreateProgressBar (symbol id, string label,
  40.                     integer real_steps ) ``{
  41.  
  42.     if( ! haskey( progresses, id ) )
  43.     {
  44.     progresses = add( progresses, id , $[ "type"        : "ProgressBar",
  45.                           "current"        : 0,
  46.                           "increment"    : 1,
  47.                           "label"        : label ]);
  48.     }
  49.     return `ProgressBar( `id( id ), progresses[id, "label"]:"" ,  real_steps );
  50.   }
  51.  
  52.   /**
  53.    * Create a new Progress Widget
  54.    */
  55.   global define term Create(symbol id, string label, integer steps, boolean downloadprogress ) ``{
  56.  
  57.  
  58.       if ( ! (downloadprogress && UI::HasSpecialWidget(`DownloadProgress)))
  59.       {
  60.  
  61.       if( ! haskey( progresses , id ))
  62.       {
  63.         progresses = add( progresses, id , $[
  64.         "type"     : "ProgressBar",
  65.         "current"  : 0,
  66.         "increment": tointeger( length / steps ),
  67.         "label"    : label ]
  68.         );
  69.       }
  70.       return `ProgressBar(
  71.                   `id( id ),
  72.                   progresses[id, "label"]:"",
  73.                   length );
  74.       }
  75.       else {
  76.       if ( ! haskey( progresses, id ))
  77.       {
  78.           progresses = add(progresses, id, $[ "type"  : "DownloadProgress",
  79.                           "label" : label
  80.                           ] );
  81.       }
  82.  
  83.       return `DownloadProgress(`id( id ),  progresses[id, "label"]:"", progresses[id, "file"]:"", length );
  84.       }
  85.   }
  86.  
  87.   global define void Update()``{
  88.       y2milestone(" progresses data %1" ,progresses);
  89.       foreach( symbol id, map p_data , (map<symbol,map<string,any> >)progresses, ``{
  90.       if ( UI::WidgetExists(`id(id)))
  91.       {
  92.           UI::ChangeWidget(`id(id), `Value, p_data["current"]:length);
  93.           UI::ChangeWidget(`id(id), `Label, p_data["label"]:"");
  94.       }
  95.       });
  96.   }
  97.  
  98.   /**
  99.    * Set the Steps of a normal ProgressBar Widget.
  100.    */
  101.   global define void SetSteps( symbol id, integer steps)``{
  102.  
  103.     if (Mode::test ()) return;
  104.  
  105.       map progress = progresses[id]:$[];
  106.  
  107.       if ( progress["type"]:"" == "ProgressBar" ) {
  108.  
  109.       progresses[id, "increment"]   = tointeger( length / steps );
  110.       progresses[id, "current"]    = 0;
  111.  
  112.       UI::ChangeWidget(`id(id), `Value, 0);
  113.       }
  114.   }
  115.  
  116.   /**
  117.    *  This method is called after one detection function is successfully
  118.    *  executed. It shows the continuous progress to the user with the global
  119.    *  progress bar.
  120.    *
  121.    *  For internal use only.
  122.    *
  123.    *  @return boolean True if the progress value was increased successfully.
  124.    */
  125.   global define boolean Increase(symbol id ) ``{
  126.  
  127.     if (Mode::test ()) return true;
  128.  
  129.       map progress        = progresses[id]:$[];
  130.  
  131.       if ( progress["type"]:"" == "ProgressBar" ) {
  132.       integer new_current = progress["current"]:length +
  133.         progress["increment"]:0;
  134.  
  135.       if ( new_current <= length )
  136.       {
  137.           progresses[id, "current"]    = new_current;
  138.  
  139.           return (UI::ChangeWidget( `id(id), `Value, new_current ));
  140.       }
  141.       }
  142.       return false;
  143.   };
  144.  
  145.   global define boolean DownloadIncrease(symbol id, string new_label ) ``{
  146.       map progress        = progresses[id]:$[];
  147.  
  148.       if ( progress["type"]:"" == "DownloadProgress" ) {
  149.  
  150.         return ((integer) WFM::Execute (.local.bash,
  151.         sformat ("/bin/echo  \"%1\" >> %2", new_label,
  152.             UI::QueryWidget(`id(id), `Filename) )) == 0);
  153.       }
  154.       return false;
  155.   }
  156.  
  157.  
  158.  /**
  159.    *  Set the label of a progress-bar to the specified one.
  160.    *  @param string new_label The new label.
  161.    *  @return boolen True if the label was set correctly.
  162.    */
  163.   global define boolean SetLabel(symbol id, string new_label) ``{
  164.  
  165.     if (Mode::test ()) return true;
  166.  
  167.     if (UI::QueryWidget(`id(id), `Label) != new_label)
  168.     {
  169.       if ( new_label != "")
  170.       {
  171.           UI::ChangeWidget(`id(id), `Label, new_label);
  172.  
  173.           // save label
  174.           progresses[id, "label"] = new_label;
  175.       }
  176.       if ( progresses[id, "type"]:"" == "ProgressBar" ) 
  177.           return (Increase(id));
  178.       else {
  179.           return DownloadIncrease(id, new_label);
  180.       }
  181.     }
  182.     return false;
  183.   };
  184.  
  185.   /**
  186.    *  Fills the global-progress-bar with 100%.
  187.    *  @return boolean True if the progress value was increased successfully.
  188.    */
  189.   global define boolean Fill(symbol id) ``{
  190.  
  191.     if (Mode::test ()) return true;
  192.  
  193.       map progress        = progresses[id]:$[];
  194.  
  195.       if ( progress["type"]:"" == "ProgressBar" ) {
  196.  
  197.       progresses[id, "current"] = length ;
  198.       return (UI::ChangeWidget(`id(id), `Value, length));
  199.       }
  200.       else {
  201.       string  file     = (string) UI::QueryWidget(`id(id), `Filename);
  202.       integer current  = (integer) WFM::Read(.local.size, file);
  203.       integer diff     = 0;
  204.       integer result   = 0;
  205.  
  206.       if (current < 0)
  207.       {
  208.           current = 0;
  209.       }
  210.  
  211.       diff = (integer) UI::QueryWidget(`id(id), `ExpectedSize) - current;
  212.  
  213.       if (diff >= 0)
  214.       {
  215.           while ( UI::QueryWidget(`id(id), `ExpectedSize) > current )
  216.           {
  217.           string fill    = "##########";
  218.           while (size (fill) < diff/3)
  219.           {
  220.               fill = fill + fill;
  221.           }
  222.           string command = sformat("/bin/echo \"%1\" >> %2", fill, file);
  223.           result  = (integer) WFM::Execute(.local.bash, command);
  224.           current = (integer) WFM::Read(.local.size, file);
  225.           }
  226.           return (result == 0);
  227.       }
  228.       else
  229.       {
  230.           return true;
  231.       }
  232.       }
  233.   };
  234.  
  235.   /**
  236.    * Only for DownloadProgress !!
  237.    * Delete the progress file.
  238.    */
  239.   global define boolean DeleteFile(string file ) ``{
  240.  
  241.       if( file == "" || file == nil ) return false;
  242.  
  243.       string cmd = sformat("if /usr/bin/test -f %1; then /bin/rm %1; fi", file);
  244.       // delete the old progress_file, if it exists
  245.       if (  WFM::Execute(.local.bash, cmd) != 0 ) {
  246.       y2error("The file %1 could not be deleted.", file);
  247.       return false;
  248.       }
  249.       return true;
  250.   }
  251.  
  252.   /**
  253.    *  Specifies a new filename for the DownloadProgress widget.
  254.    *  @param string file Filename as a string.
  255.    *  @example OSRModuleProgress::SetFile("/tmp/YaST2-823/osr_lilo_progress");
  256.    */
  257.   global define boolean SetFile(symbol id, string new_file) ``{
  258.       map progress        = progresses[id]:$[];
  259.  
  260.       if ( progress["type"]:"" == "DownloadProgress" ) {
  261.       DeleteFile ((string) UI::QueryWidget(`id(id), `Filename));
  262.       progresses[id, "file"] = new_file;
  263.       return UI::ChangeWidget(`id(id), `Filename,     new_file   );
  264.       }
  265.       return false;
  266.   };
  267.  
  268.   /**
  269.    * Set the length of a progress bar.
  270.    */
  271.   global define boolean SetLength(symbol id, integer new_length) ``{
  272.       map progress        = progresses[id]:$[];
  273.       if ( progress["type"]:"" == "DownloadProgress" )
  274.       return UI::ChangeWidget(`id(id), `ExpectedSize, new_length);
  275.       return false;
  276.   };
  277. }
  278.