2009年12月23日 星期三

實作Ext Layout(七)


接續Ext Layout(一)功能,此練習主要是於Layout(border)南邊加入一張圖作為Layout練習之結束,且此練習亦是一個完整的電影資訊維護小功能。

開發環境:
IDE:MyEclipse6.6GA
Web Server:Tomcat 6.0.20
Database:MySql 5.1.36
MVC:Struts2.1.8
FrameWork:Spring2.0,Hibernate3.2
Client UI:Ext2.3.0

一、Layout頁面(layout8.jsp):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

    

    <title>My JSP 'combox.jsp' starting page</title>

    

 <meta http-equiv="pragma" content="no-cache">

 <meta http-equiv="cache-control" content="no-cache">

 <meta http-equiv="expires" content="0">    

 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

 <meta http-equiv="description" content="This is my page">

 <!--

 <link rel="stylesheet" type="text/css" href="styles.css">

 -->

 <link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css">

 <link rel="stylesheet" type="text/css" href="css/onReady.css">

 <script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>

 <script type="text/javascript" src="extjs/ext-all.js"></script>

 <script type="text/javascript" src="extjs/ext-lang-zh_TW.js"></script> 

 <script type="text/javascript">

 <!--

  Ext.onReady(function(){

   var tabCount=5;

   Ext.BLANK_IMAGE_URL='extjs/resources/images/default/s.gif';

   Ext.QuickTips.init();

   /* normal store

   var store = new Ext.data.Store({

    url: 'SysMgrJson!getMovies.action',

    reader: new Ext.data.JsonReader({root:'results',totalProperty:'totals'}, [

     'id',

     'coverthumb',

     'title',

     'director',

     {name: 'released', type: 'date', dateFormat: 'Y-m-d'},

     'genre',

     'tagline',

     {name: 'price', type: 'float'},

     {name: 'active'}

    ])

   });

   */

   //Grouping store

   var store = new Ext.data.GroupingStore({

    url: 'SysMgrJson!getMovies.action',

    sortInfo: {

     field: 'genre',

     direction: "ASC"

    },

    groupField: 'genre',

    reader: new Ext.data.JsonReader({root:'results',totalProperty:'totals'}, [

     'id',

     'coverthumb',

     'title',

     'director',

     {name: 'released', type: 'date', dateFormat: 'Y-m-d'},

     'genre',

     'tagline',

     {name: 'price', type: 'float'},

     {name: 'active'}

    ])

   });

      

   var genres = new Ext.data.Store({

    data: [

     [1,"Comedy"],

     [2,"Drama"],

     [3,"Action"],

     [4,"Mystery"]    

    ],

    reader: new Ext.data.ArrayReader({id:'id'}, [

     'id',

     'genre'])

   }); 

        

   //Combining two columns function

   function title_tagline(val, x, store){

    return '<b>'+val+'</b><br>'+store.data.tagline;

   }

   //Generating HTML and graphics

   function cover_image(val){

    return '<img src="images/'+val+'.jpg" width="50%" height="50%">';

   }

   //for edit field of grid

   var title_edit = new Ext.form.TextField();

   var director_edit = new Ext.form.TextField();

   var tagline_edit = new Ext.form.TextField({

    maxLength: 45

   });

   var price_edit = new Ext.form.TextField();

   var coverthumb_edit = new Ext.form.TextField();

   var released_edit = new Ext.form.DateField();

   var genre_edit = new Ext.form.ComboBox({

    typeAhead: true,

    triggerAction: 'all',

    mode: 'local',

    store: genres,

    displayField:'genre',

    valueField: 'genre'

   });

   

   //for add row to grid

   var ds_model = Ext.data.Record.create([

    'id',  

    'title',

    'director',

    {name: 'released', type: 'date', dateFormat: 'Y-m-d'},

    'genre',

    'tagline',

    'coverthumb',

    {name: 'price', type: 'float'},

    {name: 'active'}

   ]);      

   // add your data store here

   var grid = new Ext.grid.EditorGridPanel({

    //renderTo: document.body,

    //renderTo:'example-grid',

    frame:true,

    title: 'Movie Database',

    id: 'MovieDatabase',

    height:300,

    width:550,

    stripeRows:true,

    store: store,

    //matching Grouping store    

    view: new Ext.grid.GroupingView(),

    //增加grid event for Row Selection mode

    sm: new Ext.grid.RowSelectionModel({

     //singleSelect: true,

     listeners: {

      rowselect: {

       fn: function(sm,index,record) {

        index++;

        Ext.Msg.alert('提示','您選擇了,'+record.data.title+',第 '+index+'筆資料');

        //將grid選擇列之資料Load到Form中。

        //注意grid之欄位名稱需和form之欄位名稱相同,才可以將grid之資料Load到form中。

        movie_form.getForm().loadRecord(record);

       }

      }

     }

    }),

    //Altering the grid at the click of a button 

    tbar: [

     //modify title column of grid

     {

      text: '修改 Title',

      handler: function(){

       var sm = grid.getSelectionModel();

       if (sm.hasSelection()){

        var sel = sm.getSelected();

        Ext.Msg.show({

         title: '修改 Title',

         prompt: true,

         buttons: Ext.MessageBox.OKCANCEL,

         value: sel.data.title,

         fn: function(btn,text){

          if (btn == 'ok'){

           sel.set('title', text);

          }

         }

        });

       }else{

        Ext.Msg.alert('提示','請選擇欲修改Title之列');

       }

      }

     },

     //hidden price column of grid

     {

      text: 'Hide Price',

      handler: function(btn){

       var cm = grid.getColumnModel();

       var pi = cm.getIndexById('price');

       //var pi=5;

       if (cm.isHidden(pi)){

        cm.setHidden(pi,false);

        btn.setText('Hide Price');

       }else{

        cm.setHidden(pi,true);

        btn.setText('Show Price');

       }

       btn.render();

      }

     },

     //add first row to grid

     {

      text: 'Add Movie(First)',

      icon: 'images/RowInsert.png',

      cls: 'x-btn-text-icon',

      handler: function() {

       grid.getStore().insert(0,new ds_model({

        id:'',

        title:'New Movie',

        director:'',

        genre:'Comedy',

        tagline:'',

        active:'1'

        })

       );

       grid.startEditing(0,0);

      }

     },

     //add last row to grid

     {

      text: 'Add Movie(Last)',

      icon: 'images/RowInsert.png',

      cls: 'x-btn-text-icon',

      handler: function() {

       grid.getStore().insert(grid.getStore().getCount(),new ds_model({

        id:'',

        title:'New Movie',

        director:'',

        genre:'Comedy',

        tagline:'',

        active:'1'

        })

       );

       grid.startEditing(grid.getStore().getCount()-1,0);

      }

     },

     //Deleting data from the server

     {

      text: 'Remove Movie',

      icon: 'images/RowDelete.png',

      cls: 'x-btn-text-icon',

      handler: function() {

       var sm = grid.getSelectionModel();

       if (sm.hasSelection()){

        //var sel = sm.getSelected();

        var sels = sm.getSelections();

        var len = sels.length;

        var ids = new Array(len);

        for(var i=0;i<len;i++){

         ids[i] = sels[i].data.id;

         if(i==0){

          var msgs = '刪除: '+sels[i].data.title;

         }else{

          msgs = msgs +',\n'+sels[i].data.title; 

         }

        };

        Ext.Msg.show({

        title: '刪除電影',

         buttons: Ext.MessageBox.YESNOCANCEL,

         msg: msgs,

         fn: function(btn){

          if (btn == 'yes'){

           var conn = new Ext.data.Connection();

           conn.request({

            url: 'SysMgrJson!updateMovies.action',

            method:'post',

            params: {

             action: 'delete',

             id: ids

            },

            success: function(resp,opt) {

             //grid.getStore().remove(sel);

             grid.getStore().reload();

            },

            failure: function(resp,opt) {

             Ext.Msg.alert('Error',

             'Unable to delete movie');

            }

           });

          }

         }

        });

       }else{

        Ext.Msg.alert('提示','請選擇欲刪除(多)列之資料');

       }

      }

      },

     //Saving data to the server

     {

      text: 'Save Movie',

      icon: 'images/save-icon.png',

      cls: 'x-btn-text-icon',

      handler: function() {

       var sm = grid.getSelectionModel();

       if (sm.hasSelection()){

        var sels = sm.getSelections();

        var len = sels.length;

        var values = new Array(len);

        for(var i=0;i<len;i++){

         values[i] = new Array(9);

         values[i][0] = sels[i].data.id;

         values[i][1] = sels[i].data.title;

         values[i][2] = sels[i].data.director;

         values[i][3] = (sels[i].data.released).format('Y-m-d');

         values[i][4] = sels[i].data.genre;

         values[i][5] = sels[i].data.tagline;

         values[i][6] = sels[i].data.coverthumb;

         values[i][7] = sels[i].data.price;

         values[i][8] = sels[i].data.active;

         if(i==0){

          var msgs = '儲存: '+sels[i].data.title;

         }else{

          msgs = msgs +',\n'+sels[i].data.title; 

         }

        };

        Ext.Msg.show({

        title: '儲存電影',

         buttons: Ext.MessageBox.YESNOCANCEL,

         msg: msgs,

         fn: function(btn){

          if (btn == 'yes'){

           var conn = new Ext.data.Connection();

           conn.request({

            url: 'SysMgrJson!updateMovies.action',

            method:'post',

            params: {

             action: 'update',

             values: values

            },

            success: function(resp,opt) {

             //grid.getStore().remove(sel);

             grid.getStore().reload();

            },

            failure: function(resp,opt) {

             Ext.Msg.alert('Error',

             'Unable to save movie');

            }

           });

          }

         }

        });

       }else{

        Ext.Msg.alert('提示','請選擇欲儲存(多)列之資料');

       }

      }

      }             

    ],

          bbar: new Ext.PagingToolbar({

              pageSize: 5,

              store: store,

              displayInfo: true,

              displayMsg: '第 {0} 筆 - {1} 筆 of {2} 筆',

              emptyMsg: "沒有資料"

          }),       

    //Defining a Grids column model and want to display column

    columns: [

    {header: "Cover", dataIndex: 'coverthumb',renderer:cover_image},

    {header: "CoverThumb", dataIndex: 'coverthumb',editor:coverthumb_edit},

    //Combining two columns

    {header: "Title", dataIndex: 'title',renderer:title_tagline,editor:title_edit},

    {header: "Director", dataIndex: 'director',editor:director_edit},

    //Client-side sorting

    {header: "Released", dataIndex: 'released',sortable:true,

    renderer: Ext.util.Format.dateRenderer('m/d/Y'),editor:released_edit},

    {header: "Genre", dataIndex: 'genre',editor:genre_edit},    

    {header: "Price",dataIndex: 'price',id:'price',editor:price_edit},

    //setup hidden column

    {header: "Tagline", dataIndex: 'tagline',hidden:true,editor:tagline_edit}

    ]

   });

   

   //Load content on menu item click

   var Movies = function() {

    return {

     showHelp : function(btn){

      var helpbody = Ext.get('EastPanel01');

      if (!helpbody) {

       Ext.DomHelper.append(Ext.getBody(),{

        tag:'div',

        id:'EastPanel01'

        });

      }

      Movies.doLoad(btn.helpfile);

     },

     doLoad : function(file){

      Ext.get('EastPanel01').load({

       url: 'html/' + file + '.txt'

      });

     }

    };

   }();

   //

   var TabOper = function(){

    return{

     activeTab:function(btn){

      var tabId = btn.helpfile;

      Ext.Msg.alert('提示','開啟 '+tabId+' Tab');

      Ext.getCmp('movieview').findById('movietabs').activate(tabId);

     },

     addTab:function(){

      var len = ++tabCount;

      var title = 'Tab_'+len;

      var index = len % 4;

      var autoLoadFile;

      if(index==0){

       autoLoadFile = "html/BombaySummer.html";

      }else if(index==1){

       autoLoadFile = "html/NewYorkLove.html";

      }else if(index==2){

       autoLoadFile = "html/SHERLOCKHOLMES.html";

      }else{

       autoLoadFile = "html/Thirst.html";

      }

      Ext.getCmp('movieview').findById('movietabs').add({

       title: title,

       id: title,

       html: title,

       iconCls: 'Microsoft',

       closable:true,

       autoLoad: autoLoadFile,

       autoScroll: true      

      });

      Ext.getCmp('movieview').findById('movietabs').activate(title);      

     },

     removeTab:function(){

      var len = tabCount;

      var title = 'Tab_'+len;

      Ext.getCmp('movieview').findById('movietabs').remove(title);

      len = tabCount--

      title = 'Tab_'+len;

      Ext.getCmp('movieview').findById('movietabs').activate(title);

      if(tabCount<=5){

       tabCount=5;

      }      

     }          

    };

   }();



   //create myToolBar

   var myToolBar = new Ext.Toolbar({

    //renderTo:document.body,

    items:[{xtype:'tbbutton',

         text:'按我',

         //加入Icon

         cls:'x-btn-text-icon',

         icon:'images/forumlink.gif',

         //加入按鈕事件

         handler:function(){Ext.Msg.alert('按我','您按到我了!');}},

        {xtype:'tbbutton',

         text:'Add Tab',

         handler:TabOper.addTab},

         {xtype:'tbbutton',

         text:'Remove Tab',

         handler:TabOper.removeTab},

        {xtype:'tbbutton',

         text:'Acitve Tab',

         //加入群組及checked default value

      menu:[{text:'Movie Database',

            checked:true,

            group:'quality',

            helpfile:'MovieDatabase',

            handler:TabOper.activeTab},

         {text:'Move Descriptions',

            checked:false,

            group:'quality',

            helpfile:'MovieDescriptions',

            handler:TabOper.activeTab},

         {text:'Nested Layout',

            checked:false,

            group:'quality',

            helpfile:'NestedLayout',

            handler:TabOper.activeTab},

           {text:'Microsoft',

            checked:false,

            group:'quality',

            helpfile:'Microsoft',

            handler:TabOper.activeTab},

           {text:'Office Space',

            checked:false,

            group:'quality',

            helpfile:'OfficeSpace',

            handler:TabOper.activeTab}]},

        {xtype:'tbsplit',

         text:'Help',

         menu:[{text:'Genre',

             helpfile:'genre',

             handler:Movies.showHelp},

            {text:'Director',

             helpfile:'director',

             handler:Movies.showHelp},

            {text:'Title',

             helpfile:'title',

             handler:Movies.showHelp}]}

       ]

   });

   

   var genre = new Ext.form.ComboBox({

    typeAhead: true,

    triggerAction: 'all',

    mode: 'local',

    store: genres,

    fieldLabel:'Genre',

    displayField:'genre',

    valueField: 'genre',

    hiddenName: 'genre',

    width:80

   });

      

   //create movie form

   var movie_form = new Ext.form.FormPanel({

    frame:true,

    title:'Movie information form',

    labelAlign:'left',

    items:[{xtype:'textfield',fieldLabel:'Title',name:'title',allowBlank:false,maxLength:45,maxLengthText:45},

        {xtype:'textfield',fieldLabel:'Director',name:'director',allowBlank:false,maxLength:45,maxLengthText:45},

        {xtype:'textfield',fieldLabel:'Coverthumb',name:'coverthumb',maxLength:45},

        {xtype:'datefield',fieldLabel:'Released',name:'released',disabledDays:[0,6]},

        {xtype:'textfield',fieldLabel:'Price',name:'price',maxLength:45},

        {xtype:'checkbox',fieldLabel:'Available?',name:'active'},

        genre,

        {xtype:'textarea',fieldLabel:'Tagline',name:'tagline',autoScroll:true} 

    ],

    buttons: [

     {text: 'Save',

      handler: function(){

       var values = new Array(1);

       values[0] = new Array(9);

       var bf = movie_form.getForm();

       values[0][0] = '';//id

       values[0][1] = bf.findField('title').getValue();//title

       values[0][2] = bf.findField('director').getValue();//director

       values[0][3] = (bf.findField('released').getValue()).format('Y-m-d');//released

       values[0][4] = bf.findField('genre').getValue();//genre

       values[0][5] = bf.findField('tagline').getValue();//tagline

       values[0][6] = bf.findField('coverthumb').getValue();//coverthumb

       values[0][7] = bf.findField('price').getValue();//price

       values[0][8] = (bf.findField('active').getValue()==true)?'1':'0';//active      

       movie_form.getForm().submit({

        url:'SysMgrJson!updateMovies.action',

        method:'post',     

        params:{action: 'update', values:values},

        success: function(f,a){

         grid.getStore().reload();

         Ext.Msg.alert('Success', 'It worked');

        },

        failure: function(f,a){

         Ext.Msg.alert('Warning', 'Error');

        }

       });

      }

     }, 

     {text: 'Reset',

      handler: function(){

       movie_form.getForm().reset();

      }

     }]

   });

                        
   var south_img = '<img src="images/top_002.jpg" 
width="1280">';    

   var viewport = new Ext.Viewport({

    layout: 'border',

    id: 'movieview',

    renderTo: Ext.getBody(),    

    items: [{region: 'north',

      xtype: 'toolbar',

      items:[myToolBar]},

      {region: 'west',

      //xtype: 'panel',

      split: true,

      //open/close panel

      collapsible: true,

      collapseMode: 'mini',

      title: 'Some Info',

      bodyStyle:'padding:5px;',

      width: 250,

      minSize: 200,

      items:movie_form},

      {region: 'center',

      //Adding a tab panel

      xtype: 'tabpanel',

      id: 'movietabs',

      activeTab: 0,

      items: [

      //add grid into tabpanel

      grid,

      //layout accordion into tabpanel

      {title: 'Movie Descriptions',

       id: 'MovieDescriptions',

       layout: 'accordion',       

       items: [{title: 'Bombay Summer',

          autoLoad: 'html/BombaySummer.html',

          autoScroll: true},

         {title: '紐約我愛你',

          autoLoad: 'html/NewYorkLove.html',

          autoScroll: true},

         {title: 'SHERLOCK HOLMES',

          autoLoad: 'html/SHERLOCKHOLMES.html',

          autoScroll: true},

         {title: 'Thirst',

          autoLoad: 'html/Thirst.html',

          autoScroll: true}]

      },

      //Nested layouts

      {title: 'NestedLayout',

       id: 'NestedLayout',

       layout: 'border',

       border: false,

       items: [{region: 'north',

          height: 100,

          split: true,

          html: 'Nested North'

          },

          {region: 'center',

           html: 'Nested Center'

          }]

      },    

      {title: 'Microsoft',

       id: 'Microsoft',

       iconCls: 'Microsoft',

       html: 'Microsoft!'

      }]

      },

      {region: 'east',

      xtype: 'panel',

      split: true,

      title: 'genre information form',

      id: 'moreinfo',

      //open/close panel

      collapsible: true,

      width: 200,

      //html: 'East',

      //指定Div id

      items:[{id: 'EastPanel01'}]      

      },

      {region: 'south',

      xtype: 'panel',

      height:100,


      html: south_img}]

   });

   //需在gridPanel建立後才可以Load資料

   store.load({params:{start:0, limit:5}});

                        //利用程式方式動態將Layout(border)東邊Panel關閉之方法
   var moreinfo = Ext.getCmp('movieview').findById('moreinfo');

   if (moreinfo.isVisible()){

    //moreinfo.expand();

    moreinfo.collapse();

   }

                        //利用程式方式動態將Layout(border)中間加入一個Tab之方法
   Ext.getCmp('movieview').findById('movietabs').add({

    title: 'Office Space',

    id: 'OfficeSpace',

    html: 'Movie Info'

   });      

  });  

 //-->

 </script>

  </head>  

  <body>



  </body>

</html>

二、測試結果:
1.http://localhost:8080/ExtStudy/Basic/layout8.jsp


沒有留言:

張貼留言