Friday, October 1, 2010

Build Web Apps with Dashcode !

When you first launch Dashcode (the easiest way to launch it is through Spotlight), you will see that Dashcode has already created some templates for you to build your Web applications quickly (see Figure 1).


Figure 1: The various templates provided by Dashcode

The best way to learn is to select each template (other than the Custom template) and examine the content of each application. When you have selected a template, examine their contents and press Command-r to test the application on the iPhone Simulator. Go ahead and have fun with each template. When you have enough fun and get yourself acquainted with the environment, come back and we shall create an iPhone Web application from scratch and you will see how each part is built.



Building the UI
Alright, now that you are back, create a new Custom project In Dashcode. Notice that by default, Dashcode created a content and a footer parts for you (see Figure 2). Parts are the various views that you seen on your Web applications, such as buttons, text, etc. For this section, you will create a simple currency convertor Web application for the iPhone.


Figure 2: The parts in the Custom template

Select each of these parts and press the delete key. We shall delete these two parts and add our own parts manually.

Using the Library (Window'Show Library), drag-and-drop a Stack Layout part to the design surface (see Figure 3).


Figure 3: Using the Library to drag and drop parts onto your application

Expand the stackLayout part and you should see that it contains two subviews - view1 and view2. Select view1 and change its size to 320px by 356px (see Figure 4) via the Inspector window (Window'Show Inspector). Do the same for view2.


Figure 4: Changing the size for view1 and view2 via the Inspector window

Double-click on view1 and rename it as mainScreen. Do the same for view2 and rename it as settings (see Figure 5).

Figure 5: Renaming the two subviews

In the Library, drag-and-drop the Rounded Rectangle Shape part onto the mainScreen view (see Figure 6).


Figure 6: Adding the Rounded Rectangle Shape part to the subview

It its Inspector window, select the Fill & Stroke tab and in the Style tab select Gradient fill (see Figure 7) and select two colors.


Figure 7: Using the gradient fill to fill the part

Select the Effects tab and check the Glass and Recess checkboxes (see Figure 8).


Figure 8: Adding glass effect to the part

Select the Metrics tab and select the Absolute layout (see Figure 9).


Figure 9: Using absolute layout for parts positioning



Add the following parts to the Rounded Rectangle Shape part (see Figure 10) and name them as:

Text
TextField
Pop-up Menu
Push Button



    Figure 10: Adding additional parts to the subview

    Select the settings subview and repeat the same steps you have performed above. Figure 11 shows the parts added to the settings subview.


    Figure 11: Populating the settings subview

    You are now ready to view the application on the iPhone Simulator. Press Command-r to view the application on the iPhone Simulator (see Figure 12). Notice that the application is hosted by mobile Safari on the iPhone.

    Figure 12: Click 'Run' toView the application on the iPhone Simulator

    Notice that you can only see the mainScreen subview. To see the settings subview, you need to write some code to navigate to it from the mainScreen subview.




    Coding the Application
    So you are now ready to write some code. With the mainScreen subview selected, right-click on the Settings button and select Events'onclick (see Figure 13).


    Figure 13: Creating an event handler for the onclick event

    You will be asked to name the event handler for this event. Name it as shown in Figure 14.


    Figure 14: Naming the handler for the event

    Notice that the code editor now appears at the bottom of the designer (see Figure 15).


    Figure 15: The code editor where you can add your code


    Enter the following code:

        function btnSettings_ClickHandler(event)
        {
            var views = document.getElementById('stackLayout');
            var settings = document.getElementById('settings');
            if (views && views.object && settings) {
                views.object.setCurrentView(settings);
            }
        }


    Select the settings subview and right-click on the Save Settings button and select Events'onclick. Name the handler as btnSave_ClickHandler. Enter the following code:

        function btnSave_ClickHandler(event)
        {
            var views = document.getElementById('stackLayout');
            var front = document.getElementById('mainScreen');
            if (views && views.object && front) {
                views.object.setCurrentView(front, true);
            }
        }


    Test the application again by pressing Command-r. This time, you will be able to navigate to the settings view by tapping on the Settings button in the mainScreen subview (see Figure 16).


    Figure 16: Tapping on the Settings button navigates to the settings subview


    Database Access
    So far, your application displays two screens where you can perform some currency conversion as well as set the exchange rates for the different currencies. For simplicity, I am going to assume that you are converting the currencies into Singapore Dollars (SGD). All the exchange rates would be based on the SGD as the base currency.

    To allow the users to store their own exchange rates, you will make use of the local database feature as defined in HTML 5 (which is supported by Mobile Safari). Doing so allows users of your application to store the exchange rate locally on their iPhones.

    In the main.js file, add the following lines of code for performing database operations:

        var database = null;                           // The client-side database
        var DB_tableName = "CurrencyKeyValueTable";    // database name

        // Function: initDB() - Init and create the local database, if possible
        function initDB()
        {
            try {
                if (window.openDatabase) {
                    database = openDatabase("ExchangeRatesDB", "1.0",
                                            "Exchange Rates Database", 1000);
                    if (database) {
                        database.transaction(function(tx) {
                            tx.executeSql("SELECT COUNT(*) FROM " + DB_tableName, [],
                            function(tx, result) {
                                loadRates();
                            },
                            function(tx, error) {
                                // Database doesn't exist. Let's create one.
                                tx.executeSql("CREATE TABLE " + DB_tableName +
                                " (id INTEGER PRIMARY KEY," +
                                "  key TEXT," +
                                "  value TEXT)", [], function(tx, result) {
                                    initRates();
                                    loadRates ();
                                });
                            });
                        });
                    }
                }
            } catch(e) {
                database = null;
            }
        }

        // Function: initRates() - Initialize the default exchange rates
        function initRates()
        {
            if (database) {
                database.transaction(function (tx) {
                    tx.executeSql("INSERT INTO " + DB_tableName +
                        " (id, key, value) VALUES (?, ?, ?)", [0, 'USD', 1.44]);
                    tx.executeSql("INSERT INTO " + DB_tableName +
                        " (id, key, value) VALUES (?, ?, ?)", [1, 'EUR', 2.05]);
                    tx.executeSql("INSERT INTO " + DB_tableName +
                        " (id, key, value) VALUES (?, ?, ?)", [2, 'AUS', 1.19]);
                });
            }
        }

        // Function: loadRates() - Load the currency exchange rates from DB
        function loadRates()
        {
            var element;  
            var popUpElement = document.getElementById('popupConvertTo');

            if (database) {
                database.transaction(function(tx) {
                    tx.executeSql("SELECT key, value FROM " + DB_tableName, [],
                    function(tx, result) {
                        for (var i = 0; i < result.rows.length; ++i) {
                            var row = result.rows.item(i);
                            var key = row['key'];
                            var value = row['value'];

                            //---populate the pop-up menu part---
                            popUpElement.options[i].text = key;
                            popUpElement.options[i].value = value;

                            if (key == 'USD') {
                                element = document.getElementById('txtUSD');
                            }
                            else {
                                if (key == 'EUR') {
                                    element = document.getElementById('txtEUR');
                                }
                                else if (key == 'AUS') {
                                    element = document.getElementById('txtAUS');
                                }
                            }
                            element.value = value;
                        }
                    },
                    function(tx, error) {
                        showError('Failed to retrieve stored information from database - ' +
                            error.message);
                    });
                });
            }
            else {
                loadDefaultRates();
            }
        }

        // Function: saveRates() - Save the currency exchange rates into DB
        function saveRates()
        {
            if (database) {
                var elementUSD = document.getElementById('txtUSD');
                var elementEUR = document.getElementById('txtEUR');
                var elementAUS = document.getElementById('txtAUS');

                database.transaction(function (tx) {
                    tx.executeSql("UPDATE " + DB_tableName + " SET key = 'USD',
                        value = ? WHERE id = 0", [elementUSD.value]);
                    tx.executeSql("UPDATE " + DB_tableName + " SET key = 'EUR',
                        value = ? WHERE id = 1", [elementEUR.value]);
                    tx.executeSql("UPDATE " + DB_tableName + " SET key = 'AUS',
                        value = ? WHERE id = 2", [elementAUS.value]);
                });
            }
            loadRates();
        }

        // Function: deleteTable() - Delete currency exchange table from DB
        function deleteTable()
        {
            try {
                if (window.openDatabase) {
                    database = openDatabase("ExchangeRatesDB", "1.0",
                                            "Exchange Rates Database");
                    if (database) {
                        database.transaction(function(tx) {
                            tx.executeSql("DROP TABLE " + DB_tableName, []);
                        });
                    }
                }
            } catch(e) {
            }
        }

        // Function: loadDefaultRates() - Load the default exchange rates
        function loadDefaultRates()
        {
            var popUpElement = document.getElementById('popupConvertTo');
            var element = document.getElementById('txtUSD');
            element.value = "1.44";
            popUpElement.options[0].text = "USD";
            popUpElement.options[0].value = element.value;

            element = document.getElementById('txtEUR');
            element.value = "2.05";
            popUpElement.options[1].text = "EUR";
            popUpElement.options[1].value = element.value;

            element = document.getElementById('txtAUS');
            element.value = "1.19";
            popUpElement.options[2].text = "AUS";
            popUpElement.options[2].value = element.value;
        }


    The database code above is pretty straightforward - store the exchange rates inside the database and populate the pop-up menu part when the rates are retrieved.

    Modify the load() function as follows:

        //
        // Function: load()
        // Called by HTML body element's onload event when the Web application is ready to
        // start
        //
        function load()
        {
            dashcode.setupParts();

            initDB();   
            if (!database) {
                loadDefaultRates();
            }
        }


    Press Command-r to test the application. When the application is loaded, the pop-up menu will now display the three different currencies (see Figure 17).


    Figure 17: The pop-up menu part displaying the different currencies

    When you tap on the Settings button, the exchange rates would also be displayed in the settings subview (see Figure 18).


    Figure 18: The exchange rates displayed in the settings subview



    Performing the Conversion
    You are now ready to perform the actual conversion of the currencies. In Dashcode, select the mainScreen subview and right-click on the Convert! Button and select Events'onclick (see Figure 19).


    Figure 19: Handling the onclick event for the Convert! button



    Name the event handler as btnConvert_ClickHandler and code it as follows:

        function btnConvert_ClickHandler(event)
        {
            var amount = document.getElementById("txtAmount").value;   
            var rates = document.getElementById("popupConvertTo").value;
            var result = amount * rates;
            alert(result);
        }


    Press Command-r to test the application. Enter an amount and select the currency to convert. Tapping on the Convert! button will now display the amount converted (see Figure 20).


    Figure 20: Try converting some currencies!



    Converting your Web Application into an iPhone Native Application
    Now that your application is completed, you may deploy your application onto a Web server so that users can access your application through the Safari browser on their iPhones. However, since this is a Web application, the user must have access to the Internet, or else there is no way to access your application. And since our application does not make use of any server-based data, it is a good candidate to convert into a native iPhone application. The easiest way would be to host the Web application within the Safari browser, which is represented by the WebView view in the iPhone SDK.

    In this section, I will show you how you can convert an iPhone Web application into a native iPhone application.

    First, deploy your Web application by clicking the Share item in Dashcode (see Figure 21). Click the Deploy button so that all the files of the application will be saved to a Web publishing directory. Take note of the Web publishing directory shown in Dashcode. It is saved in /Users//Sites/CurrencyConvertor/. You will make use of the files contained within this folder shortly.



    Figure 21: Deploying a Web application in Dashcode
    • Launch Xcode and create a new View-based Application project. Name the project as CurrencyConvertor.
    • In Finder, navigate to the /Users//Sites/CurrencyConvertor/ folder and select the files shown in Figure 22.


    Figure 22: All the project files created by Dashcode

    Drag-and-drop all the selected files onto the Resources folder in Xcode. Xcode will prompt you with a dialog (see Figure 23). Check the Copy items into destination group's folder (if needed) checkbox and click Add.


    Figure 23: Adding all the Dashcode files into the Resource folder in Xcode

    Perform a global Find-and-Replace (by pressing Shift-Command-F). Search and replace the following strings with an empty string (see Figure 24):

    Parts/
    Images/



    Figure 24: Replacing all instances of "Parts/" and "Images/" with an empty string

    This will update the various HTML and JavaScript files that reference other files using the Parts/ and Images/ folder. Files stored in the Resources folder of your Xcode application have no directory structure when they are deployed; hence all the files are in a flat directory.

    Select the files shown in Figure 25 and drag-and-drop them onto the Copy Bundle Resources (16) folder. This will ensure that all the HTML, JavaScript, CSS, and images files will be deployed together with your application.


    Figure 25: Copying all the Web files into the targets folder so that they are deployed together with your application


    In the CurrencyConvertorViewController.h file, add the following statements to define an outlet:

        #import

        @interface CurrencyConvertorViewController : UIViewController {
            IBOutlet UIWebView *webView;
        }

        @property (nonatomic, retain) UIWebView *webView;

        @end


    Double-click on the CurrencyConvertorViewController.xib file to open it in Interface Builder.
    Add a WebView view to the View window and control-click and drag the File's Owner item to the WebView view (see Figure 26). Select webView.


    Figure 26: Connecting an outlet to a view

    In the CurrencyConvertorViewController.m file, add the following statements:

        #import "CurrencyConvertorViewController.h"

        @implementation CurrencyConvertorViewController

        @synthesize webView;

        - (void)viewDidLoad {
            NSString *path = [[NSBundle mainBundle] pathForResource:@"index"
                                ofType:@"html"];
            [webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath: path
                                    isDirectory:NO] ]];
            [super viewDidLoad];
        }


     



    That's it! Press Command-r to test the application on the iPhone Simulator. The Web application is now hosted within the WebView view (see Figure 27). What you have just done is convert a Web application into a native application!

    Figure 27: Running the Web application as a native iPhone application

    0 comments:

    Post a Comment

    Note: Only a member of this blog may post a comment.

    Yang Populer di Dedi Aryadi Al-Jazairi

    ...organise your mac ★★★★★ 10 Keyboard Shortcuts for Text 10 Quick Mac Tips 10.6 10.7 10.8 10.9 9 to 5 Mac A-Z Glossery - iPhone App Abdullah bin Muhammad As Salafi About Abu ‘Abdil Muhsin bin ‘Abidin as-Soronji Abu Qatadah Accounting Adab Adab Dan Perilaku Administrasi Siistem dan Jaringan Administrasi Staff adsense Ahli Hadits Ahmad Saud AirPlay Akuntan Al-Lajnah Ad-Daimah Lil Buhuts Al-Ilmiah Wal Ifta Al-Quran Amalan Sunnah Anak Anak Muslim Anak Serta Orang Tuanya android Anonymous Anti Virus Apoteker App App Store - News Apple Apple Downloads Apple Gazette Apple Keynotes Apple Matters Apple Pro Apple Support Communities Apple Support Tips Apple Updates apple.stackexchange.com AppleInsider Applelinks AppleNews AppleTV Application Tips applications Apps A-Z Apps Apps Apps Apps on Mac Apps on Mac - Dashboard Widget AppShopper AppShopper.com Aqeedah Aqidah Arab Saudi Arab Saudi' Karawang Artikel ASC Asteroid ATMac Audio Audio dan Video Automator Baby Sitter Bahasa Arab Balikpapan Bandung Bandung Barat Bangkalan Banjarnegara Banking Banten Bantul Banyumas Banyuwangi Batam Batang BBM Beasiswa Pelajar Beby Sitter Bekasi Berita Biaya Gratis Bidah Bidan BindApple Biografi blackberry Blitar Blogger Blogs + Forums Widgets Blora Bogor Bojonegoro Bondowoso Boot Camp Bored of your Mac? Boyolali Brebes Browser Brunei BUMN Business Widgets Calculate + Convert Cataloguer Cerita Cerita Pengajaran Changing the background Check external devices Check spelling and grammar Checker Cheff Cianjur Cibitung Cikarang Cilacap Cilegon Cilengsi Cimahi Cinta Cirebon Cleaning Service Clear Versions History + Auto-Save Cache Data Collect RSS feed URLS from Mail compiz conky Create Ringtones in iTunes Crew CS Cult of Mac Customise your desktop + screen saver Customizing Customizing Your Mac Cydia D3 Daily Tips and Tricks Dajjal Dasar Bermain Backtrack Dashboard Dashboard - Tips+Tricks Dashboard Guidelines Dashboard Widget Dashboard Widgets DashboardCandy DashboardClocks DashboardSearch DashboardWidgets.com Dashcode Delta Silikon Demak Depok Desain Grafis Desktop Desktop Computers Developer Forum Developer News Developer Tips Developer Tools Developer Widgets Development Tools digg Disable restored windows when re-opening specific apps Discussions Disnaker Display a login banner Display a short message Display system stats DKI Jakarta Doa dan Dzikir Dock Does your Mac qualify for free 10.8 upgrade? Download Downloads DR.Muhammad Nur Ihsan Driver Dual Boot OS X 10.7 Lion + OS X 10.8 Mountain Lion Easy Mac Tips Ebook EJIP Email Email + Messaging Widgets Energi Essential Exploitation Tools Extract and Save Mac Application Icons Falsafah Perang ala Sun Tze FAQ Farmasi Fatwa-Fatwa Fatwa-Ulama Financial Services Find a MAC Address in Mac OS X Find iMessage Users + Contacts Finder Fiqh Fiqh Ibadah Fiqh Kontemporer Fiqh Mu'amalah Fiqih Firoq Folders Food Widgets Forensics Formal Free Apps Freeware Furniture games Games Widgets Garut Gas Gatekeeper Get a Homepage - Mac OS X Style Get iTunes track notifications in your Dock Get Mac News Get More Mac and iOS Tips Get quick information with widgets Get RSS Menu Extension for Safari 6 Get Windows Live Hotmail with Mail Get Yahoo Mail with Mail gnome google Google News Gresik Grobogan gSearch - iPhone App Guide Gunung Kidul Guru Hacking Hackint0sh hackintosh Hacks Hadis Hadist Hadits Haji Hartono Jaiz Hasil Seniku Helper Hidden Features Hidden Features in OS X 10.8 Mountain Lion Hong Kong Hongkiat Hotmail How To How to disable the Java web plug-in HRD Ibn Kathir iCal iClarified iCloud iCloud + MobileMe iCloud News iCloud system requirements icon Icon Icons Icons + Screensavers iDesign - iPhone Wallpaper Ied iHackintosh iLife iLife 11 iLife Discussions - GarageBand iLife Discussions - iDVD iLife Discussions - iMovie iLife Discussions - iPhoto iLife Discussions - iTunes iLife Discussions - iWeb iLife News iLife Support Ilmu image Image Capture Imam Imam Abu Hanifah Imam Ghazali Imam Hanbali Iman iMovie Indramayu Info Info CPNS Informal Information Gathering Information Widgets InsanelyMac install driver install kernel install kernel lowlatency install software Install Windows 8 on a Mac Installation International Widgets Internet Internet and Chat Investment Banking iOS 4 iOS Developer News iOS Support iPad iPad - News iPad Support iPhone iPhone - News iPhone 4 iPhone App iPhone SDK iPhone Support iPhone Tips and Tricks iPhoto iPod iPod - News iPod News iPod Support iPod Tips and Tricks - iPhone App iPod touch Irhab iscsi Islam Istri Nabi IT IT Industry Today iTunes iTunes - Latest Movie Trailers iTunes - News iTunes - Top News iTunes App Store iTunes App Store - All New Applications iTunes News iWork Jababeka Jakarta Jaringan Komputer java Java Runtime Environment Jawa Barat Jawa Tengah Jawa Timur Jember Jepara Jlainnya Job Baru job baru brunei Job Baru Malaysia Job Baru Taiwan Job Kontruksi Job Kontruksi Taiwan Jombang Jurnalis Just Added Just Added - iPhone Apps Just Added Downloads Just For Fun Widgets Kalsel Kaltim Karanganyar Karawang Kasir Kata Pengantar Keamanan Komputer Kebumen Kecantikan Kediri Kedokteran Kendal Keputusan Presiden Kerja Kantoran Kesalahan Dalam Solat Kesehatan kext Key Combos Keyboard Shortcuts Keynote Address KIIC Kisah Tauladan Klainnya Klaten Komputer Komuniti Islam Kontruksi Kristologi Kudus Kuliah Kulon Progo Kuningan Kurir Lagu Musik dan Permainan Laki-laki Lamongan Lampung Langsung Launchpad for Mac OS X Snow Leopard Lebak Links Linux Lion Listrik. Logistik Loker Astra LOker Pabrik Lowongan Kerja Lowongan Kerja Guru/Pengajar Lowongan Kerja Pertambangan Lowongan Kerja Rumah Sakit Lowongan Kerja SPG Lowongan Kontruksi Lowongan Kontruksi Taiwan Lowongan Pekerjaan Lumajang Mac Mac 101 Mac 101 - Get One on One with your Mac... Mac App Store Mac App Store - Business Mac App Store - Developer Tools Mac App Store - Education Mac App Store - Entertainment Mac App Store - Finance Mac App Store - Games Mac App Store - Graphics + Design Mac App Store - Health + Fitness Mac App Store - Lifestyle Mac App Store - Medical Mac App Store - Music Mac App Store - News Mac App Store - Photography Mac App Store - Productivity Mac App Store - Reference Mac App Store - Social Networking Mac App Store - Sports Mac App Store - Top 50 Mac Apps Mac App Store - Travel Mac App Store - Utilities Mac App Store - Video Mac App Store - Weather Mac Developer Tips Mac OS X Mac OS X 10.6 Mac OS X 10.7 Lion Mac OS X 10.8 Mountain Lion Mac OS X Applications Mac OS X Things Mac OS X Tips Mac OS X Tips - News Mac OSX Hints Mac OSX Hints - News Mac Quick Tips Mac Support Mac Tip of the Day Mac Tips Mac Tips and Tricks Mac Tips and Tricks - Desktop App Mac Tips Daily Mac|Life Mac101 Mac360 MacApp MacApper MacApps MacFixIt MacintoshOS.com Maciverse MacLion MacNews MacNN MacOSXAudio.com macosxtips.co.uk MacRumors MacSupport MacTech MacTips MacUpdate MacUpdate.com MacVideos MacWidgets Macworld.com - iPhone App Reviews Madiun magazines Magelang Magetan Mahasiswa Mail Maintenance Majalengka Makanan Makna Niat Makrifatullah Malang Malaysia Manager Manajemen Proyek ManiacDev Manufacturing Marketing Masakan Masalah Agama Masalah Rumah Tangga Medis Mekanik Mengenang Ilahi MInyak MM 2100 Mobile MobileMe News ModMyi.com Mojokerto Most Recent Movies + TV Widgets Mualamat Dan Riba Muhammad Thaha Al junayd MUI Mujahideen And Mujahidah Mukjizat Murotal Al-Quran Music Widgets Muslimah Nasehat Nasihat Nasyeed Navigating + Selecting Text in Mac OS X Negara Brunei Negara Canada Negara Taiwan Network Networking + Security Widgets New Application Tips New iPhone Apps news News on Mac News Widgets Nganjuk Ngawi nokia Notification Center Notification Center Tips OB office 2013 Office Boy Oil onemac.net onemac.org Open source OpenDashboard operating system Operator Operator Produksi Organize Your Dock OS OS X OS X - FAQ OS X 10.5 to 10.8 Upgrade OS X 10.7 OS X 10.8 Mountain Lion OS X Basics OS X Daily OS X Lion OS X Mac Tips + Tricks OS X Mavericks OS X Mavericks Tips OS X Mountain Lion OS X Mountain Lion - News OS X Mountain Lion Hompage OS X Mountain Lion Installation Guides OS X Snow Leopard OSX OSX Basics Other OS Pabrik Pacitan Pages Palembang Pamekasan Pandeglang Pangandaran Para Nabi Pasuruan Pati PC Pekalongan Pengumuman Penjaga Orang Jompo Perawat Perawat Panti Jompo Pernikahan Pertambangan & Logam Perusahaan Periklanan Pesanan PJTKI PJTKI Sragen PJTKI Pemalang PJTKI Rembang PJTKI Semarang PJTKI Sukoharjo PJTKI Tegal PLN Podcast Widgets Polisi Khusus Kereta Api Ponorogo Pontianak Portable Computers Ports and Connectors Pos Preambule Preferences Press Release Preview Pria Pro Tip Probolinggo Prof dr. M.M Al-A'Zami proxy PRT Puasa Public Relation Purbalingga Purwakarta Purwodadi Purwokerto Purworejo Putra-Putri Nabi QC Qurban racing Radio + Podcasts Widgets radio islam Rampant Mac - iPhone Wallpapers Rasulullah s.a.w. Remaja Dan Cinta Remote Folder and Synchronization Remove Dock Icons in OS X Mountain Lion Rename Files and Folders Renungan Reporting Tools Resepsionis Reset specific parts of Safari Restart an external device Restoran Riyadhus Shalihin RSS Ruang Keinsafan Rumaha Sakit Rynoedin S1 Safari Safari 5.1 Safari 6 Sahabat Sains dan Al-Quran Salam Redaksi Salatiga Sales Sales Manager Salon Samarinda Sampang Scheduled Startup and Shutdown ScreenCast Online SD and SDXC card slot FAQ Search Widgets Security Sekeretaris Semarang Serang Set up iCloud Set Up Storage Devices Shalat Shaum(Puasa) Shopping Widgets shortcut keyboard Sidoarjo Simple Desks Singapura Siri Siri Tips Situbondo situs islam Sleman SMA SMA/K SMK SMP Snow Leopard Snow Leopard Tips Soccer Softonic - Mac Softonic.com Softpedia Softpedia - Tips + Tricks Softpedia.com Software Solat Sunat Solo Speed Up Your Mac SPG/B Stacks Staff Staff Admin Staff Gudang Staff picks Status Widgets Stop Automatically Updates Storage StorePreview Strategi/Perencanaan Konstruksi Stress testing Subang Sukabumi Sumatera Sumatra Sumedang Sumenep Supervisor Support Surabaya Surakarta suriah Switch 101 switchtoamac.com Syaikh Abdul Aziz bin Baz syaikh Abdullah Bin Abdurrahman Al- Jibrin Syaikh Abdur Razzq 'Afifi Syaikh Abu Usamah Salim bin Ied Al-Hilali Syaikh Ali Hasan Al Halabi Syaikh Dr. Muhammad Musa Alu Nashr Syaikh Ibnu katsir Syaikh Khalid al Husainan Syaikh Kholid bin Abdillah al-Mushlih Syaikh Muhammad bin Abdul Wahhab Syaikh Muhammad bin Jamil Zainu Syaikh Muhammad bin Shalih Utsaimin Syaikh Muhammad Nashiruddin Al-Albani Syaikh Shalih bin Fauzan bin Abdullah Al-Fauzan Syamail Muhammadiyyah syiah.buku-buku sesat Syiakh Masyhur Hasan Salman symbian Syncing with iTunes System Configuration System Preferences Taiwan Take advantage of Quick Look Taking Screenshots Tambun Tangerang tarawih Tasikmalaya Taubat Sahabat Islam Kita Tauhid Tazkiyyatun Nufus Tekhnologi Teknik Mesin Teknisi Temanggung Terminal TextEdit The Apple Blog The Apple Core The Mac Observer The Mac Screencast Guy The MacTips Podcast Theme themes Themes thinkmac.net Time Machine Tip of the Day Tips Tips + Tricks Tips and Support Tips and Trick Tips and Tricks tips ubuntu Tips+Tricks TKI Tki/TKW Sukses TKW tool Top 10 Grossing Apps Top 25 Grossing Apps Top 50 Grossing Apps Top iTunes Tips Top Mac Tips Top10 Mac Tips Top10 Paid Apps Top10 Widgets Top50 Dashboard Widgets TopApps Translates Transportation Travel Widgets Trenggalek tricks TUAW Tuban Tulungagung Tutorial Tutorials tweak Ulama Unix Updates Updating USB 3 devices on Mac - FAQ Use Smart Folders effectively Useful iPhone Shortcuts Ustadz Abdul Hakim Bin Amir Abdat Ustadz Abdullah Taslim Ustadz Abdurrahman bin Abdul Karim At-Tamimi Ustadz Abdurrahman Thayyib Ustadz Abu Abdillah al-Atsari Ustadz Abu Ishaq Muslim Al-Atsari Ustadz Badrussalam Ustadz Firanda Ustadz Hamzah Rifa’i Ustadz Khoilid Abdus Shomad Ustadz Yazid bin Abdul Qadir Jawas Ustadz Zainal Abidin Syamsudin utilities VersionTracker Video Videos Vulnerability Assessment Waiter Waitress wallpaper Wallpaper Doa Wanita Want More Mac Tips ? Warehouse Warisan Wartawan Wates Web Apps web Developer Web Programmer WebApps Webcam Widgets wep cracker whatsapp Which Mac is Worth Your Investment? widget Widgets Windows windows 7 windows 8 windows xp wireless Wonogiri Wonosari Wonosobo Wudhu www.freemacware.com Yahoo Yogyakarta youtube YouTube Videos Yusuf bin Abdullah bin Yusuf Al-Wabil MA Zakat ZDNet  Navigation Mac