<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CTAPbIu_MABP&#039;s BLOG &#187; progress bar</title>
	<atom:link href="http://mabp.kiev.ua/tag/progress-bar/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Sat, 12 May 2012 07:40:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Пример модальных диалогов для Android</title>
		<link>http://mabp.kiev.ua/2009/09/16/androids-modal-dialogs-example/</link>
		<comments>http://mabp.kiev.ua/2009/09/16/androids-modal-dialogs-example/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 20:56:17 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Modal Dialog]]></category>
		<category><![CDATA[pbank]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1121</guid>
		<description><![CDATA[Здравствуйте, дорогие слушатели, сегодня в нашем подкасте вы узнаете о том как создать красивый стандартный индикатор загрузки в своем приложении... Ой, а что, никто не записывает?! Ну, ладно... тогда проговаривайте (можно про себя) текст и думайте что это подкаст. И нет, я не курил, просто настроение хорошее. В общем решил показать массам как выглядит код [...]]]></description>
			<content:encoded><![CDATA[<p>Здравствуйте, дорогие слушатели, сегодня в нашем подкасте вы узнаете о том как создать <s>красивый</s> стандартный индикатор загрузки в своем приложении... Ой, а что, никто не записывает?! Ну, ладно... тогда проговаривайте (можно про себя) текст и думайте что это подкаст. </p>
<span id="more-1121"></span>
<p style="color:white;">И нет, я не курил, просто настроение хорошее.</p>
<p>В общем решил показать массам как выглядит код моего <a href="http://mabp.kiev.ua/2009/09/05/pbank/">e-banking'a</a>. Но что-то меня берёт жадность (нету духа опенсорса) показывать именно код приложения, поэтому я тут по-быстрому сговнял классик, который показывает на экране кнопку при нажатии на которую вылазит алерт с вопросом да/нет, при нажатии на "да" вылазит прогрессбар и потом пропадает а при нажатии на "нет" - ничего не происходит.</p>

<p>Кстати, я уже скачал себе новую SDK 1.6. Так что можете сравнить вид эмуляторов. Ну и раз уж я заговорил о ней то надо сказать что наличие новых методов для работы с CDMA, я не оценил, зато заметил что починили <a href="http://mabp.kiev.ua/2009/09/14/android-first-bugs/">баг c URLConnection</a>, а это не может не радовать :).</p>

<pre><code class="java">
package ua.kiev.mabp;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.Random;

public class MyActivity extends Activity {

    // список диалогов
    private static final int CONFIRM = 1;
    private static final int PROGRESS = 2;

    // счетчик вызовов
    private int counter;

    /**
     * Метод вызывается один раз при создании активности
     *
     * @param savedInstanceState предыдущее состояние активности
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Создаем кнопку
        Button button = new Button(this);
        button.setText("click me!");
        // вешаем на неё листенер
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // котрый покажет диалог CONFIRM
                showDialog(CONFIRM);
            }
        });
        // сетим кнопку в основной лайаут
        setContentView(button, new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));
    }

    /**
     * Метод вызывается один раз на каждый диалог
     *
     * @param id номер диалога онисан в начале класса
     * @return диалог
     */
    @Override
    protected Dialog onCreateDialog(int id) {
        super.onCreateDialog(id);
        switch (id) {
            case CONFIRM:
                // новый лайаут для диалога
                LinearLayout confirmView = new LinearLayout(this);

                // создаем диалог с параметрами и двумя кнопками
                return new AlertDialog.Builder(MyActivity.this)
                        .setIcon(android.R.drawable.ic_dialog_info)
                        .setView(confirmView)
                        .setTitle("Title")
                        .setMessage("Message")
                        // положительная кнопка с листенером который показывает диалог PROGRESS
                        .setPositiveButton("Click me!", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                // запустит новый диалог загрузки
                                showDialog(PROGRESS);
                                // в новом потоке
                                new Thread(new Runnable() {
                                    public void run() {
                                        // запустит фоновую процедуру
                                        wasteMyTime();
                                        // по завершении которой в основном потоке
                                        MyActivity.this.runOnUiThread(new Runnable() {
                                            public void run() {
                                                // диплог загрузки закроется
                                                dismissDialog(PROGRESS);
                                            }
                                        });
                                    }
                                }).start();
                            }
                        })
                        // отрицатильная кнопка просто скроет диалог
                        .setNegativeButton("Cancel", null)
                        .create();
            case PROGRESS:
                // Диалог загрузки
                ProgressDialog dialog = new ProgressDialog(this);
                dialog.setTitle("Please, waite...");
                dialog.setMessage("Dummy message about loading...");
                // без процентов
                dialog.setIndeterminate(true);
                // можно закрыть кнопкой телефона
                dialog.setCancelable(true);
                return dialog;
            default:
                return null;
        }
    }

    /**
     * Метод вызывается каждый раз перед появлением диалога
     *
     * @param id     номер появляющегося диалога
     * @param dialog сам диалог
     */
    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);
        switch (id) {
            case CONFIRM:
                ((AlertDialog) dialog).setMessage("Этот диалог был вызван " + (++counter) + " раз");
                break;
            default:
                break;
        }
    }

    /**
     * Метод просто тратит время
     */
    public static void wasteMyTime() {
        Random random = new Random();
        for (int i = 0; i &lt; 10000; i++) {
            random.nextGaussian();
        }
    }
}

</code></pre>

<p>Вот так это выглядит в новом красивом но не очень удобном (я уже привык к прошлому) эмуляторе.</p>
<div style="text-align:center"><img src="/content/img/pbank/dialog.jpg" alt="modal dialog example"/></div>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/09/16/androids-modal-dialogs-example/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>jQuery UI: Progress Bar with custom event</title>
		<link>http://mabp.kiev.ua/2009/03/26/jquery-ui-progress-bar-with-custom-event/</link>
		<comments>http://mabp.kiev.ua/2009/03/26/jquery-ui-progress-bar-with-custom-event/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 14:29:21 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=928</guid>
		<description><![CDATA[Начитался Брэндона Аарона и решил создать небольшое практическое пособие для начинающих по пользовательским событиям (custom events). Напомню что пользовательские события это такие же события как onclick только запускает их не браузер а сам jQuery. Такими событиями являются, например, события "mouseenter", "mouseleave", "ready" и целый набор ajax'овых событий. jQuery также дает возможность создавать пользовательские события, чем [...]]]></description>
			<content:encoded><![CDATA[<p>Начитался <a href="http://brandonaaron.net/blog/2009/03/26/special-events" rel="nofollow external">Брэндона Аарона</a> и решил создать небольшое практическое пособие для начинающих по пользовательским событиям (custom events). Напомню что пользовательские события это такие же события как onclick только запускает их не браузер а сам <a href="http://mabp.kiev.ua/tag/jquery/" title="jQuery">jQuery</a>. Такими событиями являются, например, события "mouseenter", "mouseleave", "ready" и целый набор <a href="http://docs.jquery.com/Ajax_Events" rel="nofollow external">ajax'овых событий</a>. 
<p><a href="http://mabp.kiev.ua/tag/jquery/" title="jQuery">jQuery</a> также дает возможность создавать пользовательские события, чем я и воспользуюсь, создав собственное событие с помощью которого буду обновлять ползунок из <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a>. Практическая польза от этого скрипта нулевая, но для демонстрации самое то что доктор прописал. На самом деле весь код описанный в событии можно перенести в стандартный callback 'change'. Итак задача: обновлять ползунок при помощи пользовательского события, при срабатывании события ползунок увеличивается и меняет цвет.</p>
<span id="more-928"></span>

<link rel="stylesheet" type="text/css" media="screen" href="/content/css/jquery-ui-progress-bar-with-custom-event.css"/>
<script type="text/javascript" src="/content/js/jquery-ui-progress-bar-with-custom-event.js"></script>


<pre><code class="html">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;head&gt;
&lt;title&gt;Progress Bar with custom event&lt;/title&gt;
&lt;script src="jquery-1.3.2.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.core.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.resizable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.draggable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.dialog.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.progressbar.js" type="text/javascript"&gt;&lt;/script&gt;

&lt;link href="themes/smoothness/ui.core.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.theme.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.resizable.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.dialog.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.progressbar.css" type="text/css" rel="stylesheet" /&gt;

&lt;style&gt;
.ui-progressbar-indicator{
	line-height:40px;
	position:absolute;
	text-indent:-20px;
	left:50%;
}
&lt;/style&gt;

&lt;script type="text/javascript"&gt;
jQuery().ready(function($){

	var counter = 0, 
	dialog = $("&lt;div/&gt;")
		.dialog({modal:true,title:"Заголовок",overlay:{backgroundColor:'#000',opacity: 0.5}})
		.parent().find(".ui-dialog-titlebar-close").hide().end().end(),
	indicator = $("&lt;div/&gt;").addClass("ui-progressbar-indicator").text("0").appendTo(dialog),
	// создаю пользовательское событие myEvent
	// вторым параметром можно передавать null потому что он не используеться в примере
	// но я предпочитаю передавать this, тут this является контекстом функцией переданой параметром в jQuery().ready
	// тоесть window, но если этот объект не window то это единственный способ получить к нему доступ.
	// пример такого использования можно посмотреть в плагине autocomplete
	progressbar = $("&lt;div/&gt;").bind("myEvent", this, function(event,data){
			// event.data хранит данные переданые при создании события
			// тоесть event.data == window
			// data хранит данные переданые при срабатывании события 
			// тоесть data == {counter:counter}
			var 	c = data.counter,
				// процет цвета который заполняет ползунок
				seed = Math.round(255*c/100),
				// в HEX
				green = seed.toString(16),
				// форматируем до двух знаков
				green = green.length == 1 ? "0"+green : green,
				// процент цвета который покидает ползунок
				red = (255 - seed).toString(16),
				// его тоже форматируем
				red = red.length == 1 ? "0"+red : red;
			// увеличиваез значение индикатора
			indicator.text(c+"%");
			// удлиняем ползунок
			$(this).progressbar("value",counter);
			// закрашиваем ползунок новым цветом
			$("div",this).css({background:"#"+red+green+"00"});
		})
		.progressbar({value:0})
		.appendTo(dialog),
	// имитируем длительный процесс
	interval = setInterval(function () {
		counter+=1;
		progressbar.trigger("myEvent",{counter:counter});
		if (counter == 100) {
			clearInterval(interval);
			setTimeout(function(){
				progressbar.progressbar("destroy");
				dialog.dialog("destroy");
				indicator.remove();
			},50);
		}
	}, 50);
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<input type="button" id="example" value="Позырить результат"/>
<br />
<p>Более подробные комментарии можно посмотреть в <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a></p>
<br />]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/26/jquery-ui-progress-bar-with-custom-event/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jQuery UI: Google Gears local store setup</title>
		<link>http://mabp.kiev.ua/2009/03/25/jquery-ui-and-googlegears-local-store-setup/</link>
		<comments>http://mabp.kiev.ua/2009/03/25/jquery-ui-and-googlegears-local-store-setup/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 13:31:31 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>
		<category><![CDATA[Modal Dialog]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=926</guid>
		<description><![CDATA[В одной из прошлых статей я рассказывал как совместить Modal Dialog и Progress Bar, теперь пришло время рассказать как это можно использовать. Есть такая штука как Google Gears это интернет акселератор предназначенный по большому счету для продуктов самого Google, таких как почта, календарь, ридер и т.д. Но Google предоставляет возможность устанавливать акселератор и на сторонние [...]]]></description>
			<content:encoded><![CDATA[<p>В одной из прошлых статей я рассказывал как совместить <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a>, теперь пришло время рассказать как это можно использовать. Есть такая штука как <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a> это интернет акселератор предназначенный по большому счету для продуктов самого Google, таких как почта, календарь, ридер и т.д. Но Google предоставляет возможность устанавливать акселератор и на сторонние сайты, чем я сейчас и займусь. Самым простым видом акселерации является загрузка в кеш статических файлов, то есть картинок, скриптов и css стилей, хотя теоретически можно загружать и все остальное включая html самой страницы. Я покажу как сделать анимацию загрузки файлов в хранилище <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a>.</p>
<span id="more-926"></span>
<p>Итак начну с начала, мне понадобиться <a href="http://code.google.com/intl/ru/apis/gears/gears_init.js" rel="nofollow external">скрипт</a> который инициализирует <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a>, он написан самим Google и является единственным официальным способом запустить <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a>, и <a href="http://mabp.kiev.ua/tag/jquery-ui/">jQuery UI</a> для создания модального диалога из прошлой статьи. Скрипт создаёт фабрику объектов с которой я буду работать дальше, хотя там и так подробно описано в комментариях. Дальше логика такая - нужно создать новый "склад" и передать все отобранные для кеширования файлы, обновляя после каждого файла ползунок загрузки. Поехали:</p>

<pre><code class="html">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;head&gt;
&lt;title&gt;GoogleGears local store setup&lt;/title&gt;
&lt;script src="jquery-1.3.2.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.core.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.resizable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.draggable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.dialog.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.progressbar.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="http://code.google.com/intl/ru/apis/gears/gears_init.js" type="text/javascript"&gt;&lt;/script&gt;

&lt;link href="themes/smoothness/ui.core.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.theme.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.resizable.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.dialog.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.progressbar.css" type="text/css" rel="stylesheet" /&gt;
&lt;style&gt;
.ui-progressbar-indicator{
	line-height:40px;
	position:absolute;
	text-indent:-20px;
	left:50%;
}
&lt;/style&gt;
&lt;script type="text/javascript"&gt;
if(!window.console)
	console = {info:function(){}};

jQuery().ready(function($){
	// определяю все с чем буду работать
	var 
	localServer, // сервер
	localStore, // хранилище
	counter = 0, // итератор файлов
	percent = 0, // текущий процент
	store = "myStore", // имя хранилища
	filesToCapture = [  ], // список файлов

	// диалог 
	dialog = $("&lt;div/&gt;")
		// с параметрами но на этот раз без кнопки
		.dialog({modal:true,title:"Заголовок",overlay:{backgroundColor:'#000',opacity: 0.5}})
		// и без крестика
		.parent().find(".ui-dialog-titlebar-close").hide().end().end(),

	// с цифровым индикатором
	indicator = $("&lt;div/&gt;").addClass("ui-progressbar-indicator").text("0")
		.appendTo(dialog),

	// и ползунком
	progressbar = $("&lt;div/&gt;")
		// обновляю значение индикатора
		.progressbar({value:0,change:function(event,ui){indicator.text(percent+"%")}})
		.appendTo(dialog);

	try {
		// пробую создать локальный сервер
		localServer = google.gears.factory.create('beta.localserver');
		window.console.info('Ready!');
		// в нем локальное хранилище
		localServer.createStore(store);
		window.console.info('Created the store');
	} catch (e) {
		// при неудаче - выходим
		window.console.info(e.message);
		return;
	}

	// открываем хранилище
	localStore = localServer.openStore(store);
	// передаем в него список файлов
	localStore.capture(filesToCapture, function (url, success, captureId) {
		counter++;
		// считаем текущий процент
		percent = Math.round(counter/filesToCapture.length*100);
		// обновляем ползунок
		progressbar.progressbar("value",percent)
		// если все файлы закешированы чистим ненужное
		if (counter == filesToCapture.length) {
			progressbar.progressbar("destroy"); 
			dialog.dialog("destroy");
			indicator.remove();
		}
		// на всякий случай пишу все в лог
		window.console.info(url + ' captured ' + (success ? 'succeeded' : 'failed'));
	});
});

&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>Примера к сожалению не будет потому что даже если у когото из вас и установлен Google Gears, то у меня нечего особо кешировать, можете посмотреть как выглядит анимация в статье <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a></p>
<p>Конечно же интереснее было бы использовать ManagedResourceStore с манифестом, это дает возможность иметь сразу например несколько цветовых схем сайта, но тогда бы не получилось анимировать процесс загрузки.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/25/jquery-ui-and-googlegears-local-store-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery UI: Modal Dialog и Progress Bar</title>
		<link>http://mabp.kiev.ua/2009/01/28/jquery-ui-modal-dialog-and-progress-bar/</link>
		<comments>http://mabp.kiev.ua/2009/01/28/jquery-ui-modal-dialog-and-progress-bar/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 19:55:02 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>
		<category><![CDATA[Modal Dialog]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=578</guid>
		<description><![CDATA[Сегодня будет вторая статья из цикла о jQueryUI. На самом деле я не хочу вам рассказывать про Modal Dialog и Progress Bar, просто потому что я готовил эту статью с чувством что меня наебали. Наебали тем что оба эти виджета абсолютны не пригодны к реальному использованию, и если Modal Dialog еще как-то можно простить отсутствие [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня будет вторая статья из цикла о <a href="http://mabp.kiev.ua/tag/jquery-ui/">jQueryUI</a>. На самом деле я не хочу вам рассказывать про Modal Dialog и Progress Bar, просто потому что я готовил эту статью с чувством что меня наебали. Наебали тем что оба эти виджета абсолютны не пригодны к реальному использованию, и если Modal Dialog еще как-то можно простить отсутствие у него свойства closeable, то отсутствие каких либо свойств кроме заполненности у ползунка простить нельзя.</p>

<span id="more-578"></span>

<link rel="stylesheet" type="text/css" media="screen" href="/content/css/jquery-ui-modal-dialog-and-progress-bar.css"/>
<script type="text/javascript" src="/content/examples/jquery-ui-modal-dialog-and-progress-bar.js"></script>

<p>Итак приступим к трепанации. Делаем ползунок на модальном не закрывающемся окошке с отображением процентов. Первый хак касается именно незакрываеймости окошка, поскольку параметрами убрать кнопку "Х" никак нельзя, начинаем стучать в бубен.</p>

<pre><code class="javascript">
// создаем новый див
var dialog = $("&lt;div/&gt;")
	// и делаем из него диалог с параметрами
	.dialog({modal:true,title:"Заголовок",resizable:false,
		// делаем недоступной остальные элементы страницы
		overlay:{backgroundColor:'#000',opacity: 0.5,
		// одну кнопку все же добавим чтоб можно было все это безобразие закрыть
		buttons:{OK:function(){$(this).dialog('destroy').remove();}}
	})
	.parent()
	// вот он крестик :)
	.find(".ui-dialog-titlebar-close")
	.hide();
</code></pre>
<input type="button" id="example1" value="Позырить результат"/>
<p>Родительский элемент приходиться брать потому что текущий указывает на тот див из которого мы построили Modal Dialog, а находиться он в самом центра этого самого Modal Dialog'a, чтобы текст этого дива сразу стал сообщением. В принципе удобно, но у нас тут немного другой случай.</p>
<p>Второй хак - это прикручивание индикатора с цифрами, положим его в верхний слой относительно полоски, для этого немного пошаманим с <a href="http://mabp.kiev.ua/category/programming/css/">CSS</a>. </p>
<pre><code class="css">
.ui-progressbar-indicator{
	line-height:40px;
	position:absolute;
	text-indent:-15px;
	left:50%;
}
</code></pre>
<pre><code class="javascript">
// это будет цифровой индикатор
var indicator = $("&lt;div/&gt;")
	.addClass("ui-progressbar-indicator")
	.text("50%")
	.appendTo(dialog),
// а это - ползунок
progressbar = $("&lt;div/&gt;")
	.progressbar({value:50})
	.appendTo(dialog);
</code></pre>
<input type="button" id="example2" value="Позырить результат"/>

<p>Ну вот почти все готово, осталось собрать это все вместе и присоединить к какому то медленному процессу, индикацию которого мы будем показывать. К сожалению самый лакомый процесс загрузки файла мы не можем показать поэтому поставим обновление индикатора просто на таймер, по 10% каждые пол секунды. Когда процесс достигнет 100% модальное окошко просто исчезнет и страницей снова можно будет пользоваться :)</p>
<pre><code class="html">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;head&gt;
&lt;title&gt;Modal Dialog + Progress Bar&lt;/title&gt;
&lt;script src="jquery-1.3.2.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.core.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.resizable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.draggable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.dialog.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.progressbar.js" type="text/javascript"&gt;&lt;/script&gt;

&lt;link href="themes/smoothness/ui.core.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.theme.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.resizable.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.dialog.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.progressbar.css" type="text/css" rel="stylesheet" /&gt;

&lt;style&gt;
.ui-progressbar-indicator{
	line-height:40px;
	position:absolute;
	text-indent:-20px;
	left:50%;
}
&lt;/style&gt;
&lt;script type="text/javascript"&gt;
jQuery().ready(function($){
	// итак все с начала
	var counter = 0, 
	// диалог 
	dialog = $("&lt;div/&gt;")
		// с параметрами но на этот раз без кнопки
		.dialog({modal:true,title:"Заголовок",overlay:{backgroundColor:'#000',opacity: 0.5}})
		// и без крестика
		.parent().find(".ui-dialog-titlebar-close").hide().end().end(),
	// с цифровым индикатором
	indicator = $("&lt;div/&gt;").addClass("ui-progressbar-indicator").text("0").appendTo(dialog),
	// и ползунком
	progressbar = $("&lt;div/&gt;")
		.progressbar({value:0,change:function(event,ui){indicator.text(counter+"%")}})
		.appendTo(dialog),
	// имитируем длительный процесс
	interval = setInterval(function () {
		// инкреминтируем счетчик
		counter+=10;
		// двигаем ползунок
		progressbar.progressbar("value",counter);
		// и если достигли конца
		if (counter == 100) {
			// убираем цикл
			clearInterval(interval);
			// но ждем еще пол секунды перед тем
			setTimeout(function(){
				// как разрушить индикатор, диалог и ползунок
				progressbar.progressbar("destroy");
				dialog.dialog("destroy").remove();
			},500);

		}
	}, 500);
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<input type="button" id="example3" value="Позырить результат"/>

<p>PS: Как выяснилось при подготовке статьи метод "destroy" не до конца разрушает созданый "на лету" div и после него надо еще вызывать метод "remove", чтобы не засорять html.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/01/28/jquery-ui-modal-dialog-and-progress-bar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

