/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.view;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;


/**
 * A list view example where the 
 * data comes from a custom
 * ListAdapter
 */
public class List6 extends ListActivity 
{
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        
        // Use our own list adapter
        setListAdapter(new SpeechListAdapter(this));
    }
        
    
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) 
    {    
       ((SpeechListAdapter)getListAdapter()).toggle(position);
    }
    
    /**
     * A sample ListAdapter that presents content
     * from arrays of speeches and text.
     *
     */
    private class SpeechListAdapter extends BaseAdapter {
        public SpeechListAdapter(Context context)
        {
            mContext = context;
        }

        
        /**
         * The number of items in the list is determined by the number of speeches
         * in our array.
         * 
         * @see android.widget.ListAdapter#getCount()
         */
        public int getCount() {
            return mTitles.length;
        }

        /**
         * Since the data comes from an array, just returning
         * the index is sufficent to get at the data. If we
         * were using a more complex data structure, we
         * would return whatever object represents one 
         * row in the list.
         * 
         * @see android.widget.ListAdapter#getItem(int)
         */
        public Object getItem(int position) {
            return position;
        }

        /**
         * Use the array index as a unique id.
         * @see android.widget.ListAdapter#getItemId(int)
         */
        public long getItemId(int position) {
            return position;
        }

        /**
         * Make a SpeechView to hold each row.
         * @see android.widget.ListAdapter#getView(int, android.view.View, android.view.ViewGroup)
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            SpeechView sv;
            if (convertView == null) {
                sv = new SpeechView(mContext, mTitles[position], mDialogue[position], mExpanded[position]);
            } else {
                sv = (SpeechView)convertView;
                sv.setTitle(mTitles[position]);
                sv.setDialogue(mDialogue[position]);
                sv.setExpanded(mExpanded[position]);
            }
            
            return sv;
        }

        public void toggle(int position) {
            mExpanded[position] = !mExpanded[position];
            notifyDataSetChanged();
        }
        
        /**
         * Remember our context so we can use it when constructing views.
         */
        private Context mContext;
        
        /**
         * Our data, part 1.
         */
        private String[] mTitles = 
        {
                "Henry IV (1)",   
                "Henry V",
                "Henry VIII",       
                "Richard II",
                "Richard III",
                "Merchant of Venice",  
                "Othello",
                "King Lear"
        };
        
        /**
         * Our data, part 2.
         */
        private String[] mDialogue = 
        {
                "So shaken as we are, so wan with care," +
                "Find we a time for frighted peace to pant," +
                "And breathe short-winded accents of new broils" +
                "To be commenced in strands afar remote." +
                "No more the thirsty entrance of this soil" +
                "Shall daub her lips with her own children's blood;" +
                "Nor more shall trenching war channel her fields," +
                "Nor bruise her flowerets with the armed hoofs" +
                "Of hostile paces: those opposed eyes," +
                "Which, like the meteors of a troubled heaven," +
                "All of one nature, of one substance bred," +
                "Did lately meet in the intestine shock" +
                "And furious close of civil butchery" +
                "Shall now, in mutual well-beseeming ranks," +
                "March all one way and be no more opposed" +
                "Against acquaintance, kindred and allies:" +
                "The edge of war, like an ill-sheathed knife," +
                "No more shall cut his master. Therefore, friends," +
                "As far as to the sepulchre of Christ," +
                "Whose soldier now, under whose blessed cross" +
                "We are impressed and engaged to fight," +
                "Forthwith a power of English shall we levy;" +
                "Whose arms were moulded in their mothers' womb" +
                "To chase these pagans in those holy fields" +
                "Over whose acres walk'd those blessed feet" +
                "Which fourteen hundred years ago were nail'd" +
                "For our advantage on the bitter cross." +
                "But this our purpose now is twelve month old," +
                "And bootless 'tis to tell you we will go:" +
                "Therefore we meet not now. Then let me hear" +
                "Of you, my gentle cousin Westmoreland," +
                "What yesternight our council did decree" +
                "In forwarding this dear expedience.",
                
                "Hear him but reason in divinity," + 
                "And all-admiring with an inward wish" + 
                "You would desire the king were made a prelate:" + 
                "Hear him debate of commonwealth affairs," + 
                "You would say it hath been all in all his study:" + 
                "List his discourse of war, and you shall hear" + 
                "A fearful battle render'd you in music:" + 
                "Turn him to any cause of policy," + 
                "The Gordian knot of it he will unloose," + 
                "Familiar as his garter: that, when he speaks," + 
                "The air, a charter'd libertine, is still," + 
                "And the mute wonder lurketh in men's ears," + 
                "To steal his sweet and honey'd sentences;" + 
                "So that the art and practic part of life" + 
                "Must be the mistress to this theoric:" + 
                "Which is a wonder how his grace should glean it," + 
                "Since his addiction was to courses vain," + 
                "His companies unletter'd, rude and shallow," + 
                "His hours fill'd up with riots, banquets, sports," + 
                "And never noted in him any study," + 
                "Any retirement, any sequestration" + 
                "From open haunts and popularity.",

                "I come no more to make you laugh: things now," +
                "That bear a weighty and a serious brow," +
                "Sad, high, and working, full of state and woe," +
                "Such noble scenes as draw the eye to flow," +
                "We now present. Those that can pity, here" +
                "May, if they think it well, let fall a tear;" +
                "The subject will deserve it. Such as give" +
                "Their money out of hope they may believe," +
                "May here find truth too. Those that come to see" +
                "Only a show or two, and so agree" +
                "The play may pass, if they be still and willing," +
                "I'll undertake may see away their shilling" +
                "Richly in two short hours. Only they" +
                "That come to hear a merry bawdy play," +
                "A noise of targets, or to see a fellow" +
                "In a long motley coat guarded with yellow," +
                "Will be deceived; for, gentle hearers, know," +
                "To rank our chosen truth with such a show" +
                "As fool and fight is, beside forfeiting" +
                "Our own brains, and the opinion that we bring," +
                "To make that only true we now intend," +
                "Will leave us never an understanding friend." +
                "Therefore, for goodness' sake, and as you are known" +
                "The first and happiest hearers of the town," +
                "Be sad, as we would make ye: think ye see" +
                "The very persons of our noble story" +
                "As they were living; think you see them great," +
                "And follow'd with the general throng and sweat" +
                "Of thousand friends; then in a moment, see" +
                "How soon this mightiness meets misery:" +
                "And, if you can be merry then, I'll say" +
                "A man may weep upon his wedding-day.",
                
                "First, heaven be the record to my speech!" + 
                "In the devotion of a subject's love," + 
                "Tendering the precious safety of my prince," + 
                "And free from other misbegotten hate," + 
                "Come I appellant to this princely presence." + 
                "Now, Thomas Mowbray, do I turn to thee," + 
                "And mark my greeting well; for what I speak" + 
                "My body shall make good upon this earth," + 
                "Or my divine soul answer it in heaven." + 
                "Thou art a traitor and a miscreant," + 
                "Too good to be so and too bad to live," + 
                "Since the more fair and crystal is the sky," + 
                "The uglier seem the clouds that in it fly." + 
                "Once more, the more to aggravate the note," + 
                "With a foul traitor's name stuff I thy throat;" + 
                "And wish, so please my sovereign, ere I move," + 
                "What my tongue speaks my right drawn sword may prove.",
                
                "Now is the winter of our discontent" + 
                "Made glorious summer by this sun of York;" + 
                "And all the clouds that lour'd upon our house" + 
                "In the deep bosom of the ocean buried." + 
                "Now are our brows bound with victorious wreaths;" + 
                "Our bruised arms hung up for monuments;" + 
                "Our stern alarums changed to merry meetings," + 
                "Our dreadful marches to delightful measures." + 
                "Grim-visaged war hath smooth'd his wrinkled front;" + 
                "And now, instead of mounting barded steeds" + 
                "To fright the souls of fearful adversaries," + 
                "He capers nimbly in a lady's chamber" + 
                "To the lascivious pleasing of a lute." + 
                "But I, that am not shaped for sportive tricks," + 
                "Nor made to court an amorous looking-glass;" + 
                "I, that am rudely stamp'd, and want love's majesty" + 
                "To strut before a wanton ambling nymph;" + 
                "I, that am curtail'd of this fair proportion," + 
                "Cheated of feature by dissembling nature," + 
                "Deformed, unfinish'd, sent before my time" + 
                "Into this breathing world, scarce half made up," + 
                "And that so lamely and unfashionable" + 
                "That dogs bark at me as I halt by them;" + 
                "Why, I, in this weak piping time of peace," + 
                "Have no delight to pass away the time," + 
                "Unless to spy my shadow in the sun" + 
                "And descant on mine own deformity:" + 
                "And therefore, since I cannot prove a lover," + 
                "To entertain these fair well-spoken days," + 
                "I am determined to prove a villain" + 
                "And hate the idle pleasures of these days." + 
                "Plots have I laid, inductions dangerous," + 
                "By drunken prophecies, libels and dreams," + 
                "To set my brother Clarence and the king" + 
                "In deadly hate the one against the other:" + 
                "And if King Edward be as true and just" + 
                "As I am subtle, false and treacherous," + 
                "This day should Clarence closely be mew'd up," + 
                "About a prophecy, which says that 'G'" + 
                "Of Edward's heirs the murderer shall be." + 
                "Dive, thoughts, down to my soul: here" + 
                "Clarence comes.",
                
                "To bait fish withal: if it will feed nothing else," + 
                "it will feed my revenge. He hath disgraced me, and" + 
                "hindered me half a million; laughed at my losses," + 
                "mocked at my gains, scorned my nation, thwarted my" + 
                "bargains, cooled my friends, heated mine" + 
                "enemies; and what's his reason? I am a Jew. Hath" + 
                "not a Jew eyes? hath not a Jew hands, organs," + 
                "dimensions, senses, affections, passions? fed with" + 
                "the same food, hurt with the same weapons, subject" + 
                "to the same diseases, healed by the same means," + 
                "warmed and cooled by the same winter and summer, as" + 
                "a Christian is? If you prick us, do we not bleed?" + 
                "if you tickle us, do we not laugh? if you poison" + 
                "us, do we not die? and if you wrong us, shall we not" + 
                "revenge? If we are like you in the rest, we will" + 
                "resemble you in that. If a Jew wrong a Christian," + 
                "what is his humility? Revenge. If a Christian" + 
                "wrong a Jew, what should his sufferance be by" + 
                "Christian example? Why, revenge. The villany you" + 
                "teach me, I will execute, and it shall go hard but I" + 
                "will better the instruction.",
                
                "Virtue! a fig! 'tis in ourselves that we are thus" + 
                "or thus. Our bodies are our gardens, to the which" + 
                "our wills are gardeners: so that if we will plant" + 
                "nettles, or sow lettuce, set hyssop and weed up" + 
                "thyme, supply it with one gender of herbs, or" + 
                "distract it with many, either to have it sterile" + 
                "with idleness, or manured with industry, why, the" + 
                "power and corrigible authority of this lies in our" + 
                "wills. If the balance of our lives had not one" + 
                "scale of reason to poise another of sensuality, the" + 
                "blood and baseness of our natures would conduct us" + 
                "to most preposterous conclusions: but we have" + 
                "reason to cool our raging motions, our carnal" + 
                "stings, our unbitted lusts, whereof I take this that" + 
                "you call love to be a sect or scion.",

                "Blow, winds, and crack your cheeks! rage! blow!" + 
                "You cataracts and hurricanoes, spout" + 
                "Till you have drench'd our steeples, drown'd the cocks!" + 
                "You sulphurous and thought-executing fires," + 
                "Vaunt-couriers to oak-cleaving thunderbolts," + 
                "Singe my white head! And thou, all-shaking thunder," + 
                "Smite flat the thick rotundity o' the world!" + 
                "Crack nature's moulds, an germens spill at once," + 
                "That make ingrateful man!"
        };
        
        /**
         * Our data, part 3.
         */
        private boolean[] mExpanded = 
        {
                false,
                false,
                false,
                false,
                false,
                false,
                false,
                false   
        };
    }
    
    /**
     * We will use a SpeechView to display each speech. It's just a LinearLayout
     * with two text fields.
     *
     */
    private class SpeechView extends LinearLayout {
        public SpeechView(Context context, String title, String dialogue, boolean expanded) {
            super(context);
            
            this.setOrientation(VERTICAL);
            
            // Here we build the child views in code. They could also have
            // been specified in an XML file.
            
            mTitle = new TextView(context);
            mTitle.setText(title);
            addView(mTitle, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            
            mDialogue = new TextView(context);
            mDialogue.setText(dialogue);
            addView(mDialogue, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            
            mDialogue.setVisibility(expanded ? VISIBLE : GONE);
        }
        
        /**
         * Convenience method to set the title of a SpeechView
         */
        public void setTitle(String title) {
            mTitle.setText(title);
        }
        
        /**
         * Convenience method to set the dialogue of a SpeechView
         */
        public void setDialogue(String words) {
            mDialogue.setText(words);
        }
        
        /**
         * Convenience method to expand or hide the dialogue
         */
        public void setExpanded(boolean expanded) {
            mDialogue.setVisibility(expanded ? VISIBLE : GONE);
        }
        
        private TextView mTitle;
        private TextView mDialogue;
    }
}
