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 >
Wrap
Text File
|
2006-11-29
|
7KB
|
278 lines
/**
* File:
* OSRProgress.ycp
*
* Module:
*
* Summary:
*
* Author:
* Johannes Buchhold <jbuch@suse.de>
*
* $Id: OSRProgress.ycp 20450 2004-12-01 11:55:31Z jsuchome $
*/
{
module "OSRProgress";
textdomain "repair";
import "Mode";
/**
* The length of a ProgressBar
*/
global integer length = 1000;
/**
* Data of all created ProgressBar and Downloadprogress
*/
map progresses = $[];
/**
* Reset module settings.
*/
global define void Reset()``{
progresses = $[];
}
global define term CreateProgressBar (symbol id, string label,
integer real_steps ) ``{
if( ! haskey( progresses, id ) )
{
progresses = add( progresses, id , $[ "type" : "ProgressBar",
"current" : 0,
"increment" : 1,
"label" : label ]);
}
return `ProgressBar( `id( id ), progresses[id, "label"]:"" , real_steps );
}
/**
* Create a new Progress Widget
*/
global define term Create(symbol id, string label, integer steps, boolean downloadprogress ) ``{
if ( ! (downloadprogress && UI::HasSpecialWidget(`DownloadProgress)))
{
if( ! haskey( progresses , id ))
{
progresses = add( progresses, id , $[
"type" : "ProgressBar",
"current" : 0,
"increment": tointeger( length / steps ),
"label" : label ]
);
}
return `ProgressBar(
`id( id ),
progresses[id, "label"]:"",
length );
}
else {
if ( ! haskey( progresses, id ))
{
progresses = add(progresses, id, $[ "type" : "DownloadProgress",
"label" : label
] );
}
return `DownloadProgress(`id( id ), progresses[id, "label"]:"", progresses[id, "file"]:"", length );
}
}
global define void Update()``{
y2milestone(" progresses data %1" ,progresses);
foreach( symbol id, map p_data , (map<symbol,map<string,any> >)progresses, ``{
if ( UI::WidgetExists(`id(id)))
{
UI::ChangeWidget(`id(id), `Value, p_data["current"]:length);
UI::ChangeWidget(`id(id), `Label, p_data["label"]:"");
}
});
}
/**
* Set the Steps of a normal ProgressBar Widget.
*/
global define void SetSteps( symbol id, integer steps)``{
if (Mode::test ()) return;
map progress = progresses[id]:$[];
if ( progress["type"]:"" == "ProgressBar" ) {
progresses[id, "increment"] = tointeger( length / steps );
progresses[id, "current"] = 0;
UI::ChangeWidget(`id(id), `Value, 0);
}
}
/**
* This method is called after one detection function is successfully
* executed. It shows the continuous progress to the user with the global
* progress bar.
*
* For internal use only.
*
* @return boolean True if the progress value was increased successfully.
*/
global define boolean Increase(symbol id ) ``{
if (Mode::test ()) return true;
map progress = progresses[id]:$[];
if ( progress["type"]:"" == "ProgressBar" ) {
integer new_current = progress["current"]:length +
progress["increment"]:0;
if ( new_current <= length )
{
progresses[id, "current"] = new_current;
return (UI::ChangeWidget( `id(id), `Value, new_current ));
}
}
return false;
};
global define boolean DownloadIncrease(symbol id, string new_label ) ``{
map progress = progresses[id]:$[];
if ( progress["type"]:"" == "DownloadProgress" ) {
return ((integer) WFM::Execute (.local.bash,
sformat ("/bin/echo \"%1\" >> %2", new_label,
UI::QueryWidget(`id(id), `Filename) )) == 0);
}
return false;
}
/**
* Set the label of a progress-bar to the specified one.
* @param string new_label The new label.
* @return boolen True if the label was set correctly.
*/
global define boolean SetLabel(symbol id, string new_label) ``{
if (Mode::test ()) return true;
if (UI::QueryWidget(`id(id), `Label) != new_label)
{
if ( new_label != "")
{
UI::ChangeWidget(`id(id), `Label, new_label);
// save label
progresses[id, "label"] = new_label;
}
if ( progresses[id, "type"]:"" == "ProgressBar" )
return (Increase(id));
else {
return DownloadIncrease(id, new_label);
}
}
return false;
};
/**
* Fills the global-progress-bar with 100%.
* @return boolean True if the progress value was increased successfully.
*/
global define boolean Fill(symbol id) ``{
if (Mode::test ()) return true;
map progress = progresses[id]:$[];
if ( progress["type"]:"" == "ProgressBar" ) {
progresses[id, "current"] = length ;
return (UI::ChangeWidget(`id(id), `Value, length));
}
else {
string file = (string) UI::QueryWidget(`id(id), `Filename);
integer current = (integer) WFM::Read(.local.size, file);
integer diff = 0;
integer result = 0;
if (current < 0)
{
current = 0;
}
diff = (integer) UI::QueryWidget(`id(id), `ExpectedSize) - current;
if (diff >= 0)
{
while ( UI::QueryWidget(`id(id), `ExpectedSize) > current )
{
string fill = "##########";
while (size (fill) < diff/3)
{
fill = fill + fill;
}
string command = sformat("/bin/echo \"%1\" >> %2", fill, file);
result = (integer) WFM::Execute(.local.bash, command);
current = (integer) WFM::Read(.local.size, file);
}
return (result == 0);
}
else
{
return true;
}
}
};
/**
* Only for DownloadProgress !!
* Delete the progress file.
*/
global define boolean DeleteFile(string file ) ``{
if( file == "" || file == nil ) return false;
string cmd = sformat("if /usr/bin/test -f %1; then /bin/rm %1; fi", file);
// delete the old progress_file, if it exists
if ( WFM::Execute(.local.bash, cmd) != 0 ) {
y2error("The file %1 could not be deleted.", file);
return false;
}
return true;
}
/**
* Specifies a new filename for the DownloadProgress widget.
* @param string file Filename as a string.
* @example OSRModuleProgress::SetFile("/tmp/YaST2-823/osr_lilo_progress");
*/
global define boolean SetFile(symbol id, string new_file) ``{
map progress = progresses[id]:$[];
if ( progress["type"]:"" == "DownloadProgress" ) {
DeleteFile ((string) UI::QueryWidget(`id(id), `Filename));
progresses[id, "file"] = new_file;
return UI::ChangeWidget(`id(id), `Filename, new_file );
}
return false;
};
/**
* Set the length of a progress bar.
*/
global define boolean SetLength(symbol id, integer new_length) ``{
map progress = progresses[id]:$[];
if ( progress["type"]:"" == "DownloadProgress" )
return UI::ChangeWidget(`id(id), `ExpectedSize, new_length);
return false;
};
}