接續Ext Layout(一)功能,此練習主要是於Layout(border)中間之第三個Tab加入一個layout,稱作Nest 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頁面(layout7.jsp):
二、測試結果:
1.http://localhost:8080/ExtStudy/Basic/layout7.jsp
開發環境:
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頁面(layout7.jsp):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!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(){
Ext.BLANK_IMAGE_URL='extjs/resources/images/default/s.gif';
/* 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',
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+'筆資料');
}
}
}
}),
//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'
});
}
};
}();
//create myToolBar
var myToolBar = new Ext.Toolbar({
//renderTo:document.body,
items:[{xtype:'tbbutton',
text:'Button',
//加入Icon
cls:'x-btn-text-icon',
icon:'images/forumlink.gif',
//加入按鈕事件
handler:function(){Ext.Msg.alert('按我','您按到我了!');}},
{xtype:'tbbutton',
text:'Menu Button',
//加入群組及checked default value
menu:[{text:'Better',
checked:true,
group:'quality'},
{text:'Good',
checked:false,
group:'quality'},
{text:'Best',
checked:false,
group:'quality'}]},
{xtype:'tbsplit',
text:'Split Button',
menu:[{text:'Item One'},
{text:'Item Two'},
{text:'Item Three'}]
},
{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 viewport = new Ext.Viewport({
layout: 'border',
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',
activeTab: 0,
items: [
//add grid into tabpanel
grid,
//layout accordion into tabpanel
{title: 'Movie Descriptions',
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: 'Nested Layout',
layout: 'border',
border: false,
items: [{region: 'north',
height: 100,
split: true,
html: 'Nested North'
},
{region: 'center',
html: 'Nested Center'
}]
}]
},
{region: 'east',
xtype: 'panel',
split: true,
title: 'genre information form',
//open/close panel
collapsible: true,
width: 200,
//html: 'East',
//指定Div id
items:[{id: 'EastPanel01'}]
},
{region: 'south',
xtype: 'panel',
html: 'South'}]
});
//需在gridPanel建立後才可以Load資料
store.load({params:{start:0, limit:5}});
});
//-->
</script>
</head>
<body>
</body>
</html>
二、測試結果:
1.http://localhost:8080/ExtStudy/Basic/layout7.jsp
沒有留言:
張貼留言