/** * @class Ext.chooser.Window * @extends Ext.window.Window * @author Ed Spencer * * This is a simple subclass of the built-in Ext.window.Window class. Although it weighs in at 100+ lines, most of this * is just configuration. This Window class uses a border layout and creates a DataView in the central region and an * information panel in the east. It also sets up a toolbar to enable sorting and filtering of the items in the * DataView. We add a few simple methods to the class at the bottom, see the comments inline for details. */ Ext.define('Ext.chooser.Window', { extend: 'Ext.window.Window', uses: [ 'Ext.layout.container.Border', 'Ext.form.field.Text', 'Ext.form.field.ComboBox', 'Ext.toolbar.TextItem' ], height: 400, width : 600, title : 'Choose an Image', closeAction: 'hide', layout: 'border', // modal: true, border: false, bodyBorder: false, /** * initComponent is a great place to put any code that needs to be run when a new instance of a component is * created. Here we just specify the items that will go into our Window, plus the Buttons that we want to appear * at the bottom. Finally we call the superclass initComponent. */ initComponent: function() { this.items = [ { xtype: 'panel', region: 'center', autoScroll: true, items: { xtype: 'iconbrowser', id: 'img-chooser-view', listeners: { scope: this, selectionchange: this.onIconSelect, itemdblclick: this.fireImageSelected } }, tbar: [ { xtype: 'textfield', name : 'filter', fieldLabel: 'Filter', labelAlign: 'right', labelWidth: 35, listeners: { scope : this, buffer: 50, change: this.filter } }, ' ', { xtype: 'combo', fieldLabel: 'Sort By', labelAlign: 'right', labelWidth: 45, valueField: 'field', displayField: 'label', value: 'Type', editable: false, store: Ext.create('Ext.data.Store', { fields: ['field', 'label'], sorters: 'type', proxy : { type: 'memory', data : [{label: 'Name', field: 'name'}, {label: 'Type', field: 'type'}] } }), listeners: { scope : this, select: this.sort } } ] }, { xtype: 'infopanel', region: 'east', split: true } ]; this.buttons = [ { text: 'OK', scope: this, handler: this.fireImageSelected }, { text: 'Cancel', scope: this, handler: function() { this.hide(); } } ]; this.callParent(arguments); /** * Specifies a new event that this component will fire when the user selects an item. The event is fired by the * fireImageSelected function below. Other components can listen to this event and take action when it is fired */ this.addEvents( /** * @event selected * Fired whenever the user selects an image by double clicked it or clicking the window's OK button * @param {Ext.data.Model} image The image that was selected */ 'selected' ); }, /** * @private * Called whenever the user types in the Filter textfield. Filters the DataView's store */ filter: function(field, newValue) { var store = this.down('iconbrowser').store, dataview = this.down('dataview'); store.suspendEvents(); store.clearFilter(); dataview.getSelectionModel().clearSelections(); store.resumeEvents(); store.filter({ property: 'name', anyMatch: true, value : newValue }); }, /** * @private * Called whenever the user changes the sort field using the top toolbar's combobox */ sort: function() { var field = this.down('combobox').getValue(); this.down('dataview').store.sort(field); }, /** * Called whenever the user clicks on an item in the DataView. This tells the info panel in the east region to * display the details of the image that was clicked on */ onIconSelect: function(dataview, selections) { var selected = selections[0]; if (selected) { this.down('infopanel').loadRecord(selected); } }, /** * Fires the 'selected' event, informing other components that an image has been selected */ fireImageSelected: function() { var selectedImage = this.down('iconbrowser').selModel.getSelection()[0]; if (selectedImage) { this.fireEvent('selected', selectedImage); this.hide(); } } });