 
			
				31.05.2012, 14:13
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.04.2010 
					
					
					
						Сообщений: 87
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Позиционирование компонента img внутри динамического panel в лайоуте
			 
			
		
		
		
		ExtJS 4.1 
Приложение MVC:
 
Ext.application({
    name: 'ECS2',
    appFolder: 'app',
    launch: function() {
        Ext.create('Ext.container.Viewport', {
            layout: 'border',
			items: [{
				region: 'north',
				xtype: 'box',
				height: 30,
				html: '<h1>Система сертификатов ECS</h1>'
			},{
				region: 'west',
				width: 450,
				xtype: 'view_invoices_list'
			},{
				region: 'center',
				//bodyPadding: 10,
				xtype: 'view_certs_preview_area'
			}]
		});
	},
   	controllers: ['controller_invoices', 'controller_certs_preview']
});
Вьювер сертификатов:
 
Ext.define('ECS2.view.view_certs_preview_area.js' ,{
    id: 'certs_panel',
	extend: 'Ext.panel.Panel',
    alias : 'widget.view_certs_preview_area',
    title: 'Просмотр, печать и экспорт сертификатов',
	
    dockedItems: [{
		xtype: 'toolbar',
		dock: 'top',
		height: 35,
		items: [{
			xtype: 'button',
			text: 'Скачать сертификат:',
			arrowAlign: 'right',
			icon: 'images/gears.png',
			menu : [
				{
					text: 'В формате TIF/TIFF',
					icon: 'images/tif_format.png'
				},{
					text: 'В формате JPEG/JPG',
					icon: 'images/jpg_format.png'
				},{
					text: 'В формате GIF',
					icon: 'images/gif_format.png'
				},{
					text: 'В формате PNG',
					icon: 'images/png_format.png'
				}
			]
		},'-',{
			text: 'Скачать накладную',
			icon: 'images/folder.gif'
		},'-',{
			text: 'Распечатать сертификат',
			icon: 'images/print.png'
		}]
	}],
	layout: {
		type: 'vbox',
		pack: 'center',
		align: 'center'
	},
	items: {
		xtype: 'image',
		src: 'images/31302.png',
	        height: Ext.getCmp('certs_panel').getHeight() / 2,
    	        width:  Ext.getCmp('certs_panel').getWeight() / 2
	}
});
В самом конце - тестовая заглушка показа картинки сертификата. Требуется, чтобы она отображалась посредине панели (по вертикали и горизонтали) в некотором масштабе относительно панели в лайоуте, в которой она находится и при изменении размера окна браузера - автоматически изменялся масштаб изображения сертификата.
 
В приведенном выше примере ругается на  "Uncaught TypeError: Cannot call method 'getHeight' of undefined"
Я так понимаю, это из-за того, что при инициализации компонента при загрузке приложения еще не известна высота родительского компонента Panel, потому и ругается на вызов метода получения его высоты.
 
Как реализовать мою задачу позиционирования и автоматического масштабирования ? Засунуть изменение размеров img в контроллер на событие resize ?  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Allan Stark, 31.05.2012 в 14:19.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.06.2012, 12:25
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 С++/C# modest developer 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 07.11.2011 
					
					
					
						Сообщений: 244
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		честно говоря не знаю более простого способа чем высчитывать координаты и габариты вручную, например: 
<!DOCTYPE html>
<html>
<head>
    <title>demo</title>
    <script src='http://dev.sencha.com/deploy/ext-4.0.7-gpl/ext-all.js'></script>
    <link rel="stylesheet" href="http://dev.sencha.com/deploy/ext-4.0.7-gpl/resources/css/ext-all.css">
    <script>
Ext.onReady(function() {
Ext.define('Bla',{
    extend: 'Ext.panel.Panel',
    initComponent: function() {
        this.items = [{
            xtype: 'image',
            src: 'http://eletronichunter.files.wordpress.com/2010/06/extjs_splash.jpg'
        }];
        this.callParent(arguments);
    }
});
Ext.create('Bla', {
    height: 200,
    title: 'ExtJS',
    resizable: true,
    width: 200,
    renderTo: Ext.getBody(),
    margin: 30,
    listeners: {
        resize: function() {
            var img = this.down('image'),
                box = this.getBox(),
                hh = this.getHeader() ? this.getHeader().getHeight() : 0; // определим нужно ли учитывать высоту заголовка
            with(box) {
                x += width/4;
                y += hh+(height-hh)/4;
                height = (height-hh)/2;
                width /= 2;
            }
            img.getEl().setBox(box);
        }
    }
});
        
    });                    
 
    </script>
</head>
  <body></body>
</html>
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.06.2012, 16:41
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.04.2010 
					
					
					
						Сообщений: 87
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 У вас вроде пример под ExtJS 3 заточен. Я же в app MVC делаю... 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.06.2012, 16:52
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 С++/C# modest developer 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 07.11.2011 
					
					
					
						Сообщений: 244
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Allan Stark
			
		
	 | 
 
	| 
		У вас вроде пример под ExtJS 3 заточен. Я же в app MVC делаю...
	 | 
 
	
 
 о_О щито? какой такой 3? ExtJS 4 давно юзаю..
 
Какая разница MVC не MVС, я пример привел, при желании логику в контроллер можно перенести.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				13.06.2012, 14:45
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.04.2010 
					
					
					
						Сообщений: 87
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		В итоге сделал немного изящнее, через масштабирование изображения внутри родительского компонента панели и подбор лайоута (vbox). 
Отображение (вью):
Ext.define( 'ECS2.view.view_certs_preview_area.js', {
    id: 'certs_panel',
	extend: 'Ext.panel.Panel',
    alias : 'widget.view_certs_preview_area',
    title: 'Просмотр, печать и экспорт сертификатов',
	layout: {
		type: 'vbox',
		align: 'center'
	},
    dockedItems: [{
		id: 'toolbar_panel',
		xtype: 'toolbar',
		dock: 'top',
		height: 35,
		items: [{
			xtype: 'button',
			text: 'Скачать сертификат:',
			arrowAlign: 'right',
			icon: 'images/gears.png',
			menu : [
				{
					text: 'В формате TIF/TIFF',
					icon: 'images/tif_format.png'
				},{
					text: 'В формате JPEG/JPG',
					icon: 'images/jpg_format.png'
				},{
					text: 'В формате GIF',
					icon: 'images/gif_format.png'
				},{
					text: 'В формате PNG',
					icon: 'images/png_format.png'
				}
			]
		},'-',{
			text: 'Скачать накладную',
			icon: 'images/folder.gif'
		},'-',{
			text: 'Распечатать сертификат',
			icon: 'images/print.png'
		}]
	}],
	// Отображаемый сертификат
	items: {
		id : 'certs_image',
		xtype: 'image',
		src: 'images/31302.png'
	}
});
Контроллер:
Ext.define('ECS2.controller.controller_certs_preview', {
	extend: 'Ext.app.Controller',
	views: 'view_certs_preview_area',
	init: function () {
		this.control({
			'viewport > panel > image': {
				render: this.onImgRendered
			}
		});
	},
	onImgRendered: function() {
		Ext.getCmp('certs_image').setHeight('95%');
	}
});
Т.е. в обработке события рендера изображения оно масштабируется внутри родительского контейнера (панели) до 95%.
 
Одна проблема - сразу после отрисовки в браузере изображение сертификата (картинки) "прилипает" к левой части пространства панели и только после любых манипуляций с окном браузера (например при ресайзе) - позиционируется по центру панели. 
К тому же изображение выравнивается только по горизонтали, но не по вертикали. 
Что хочется получить - в аттаче к сообщению.
 
Пробовал другие лайоуты в различной комбинации - не удается победить :-(
 
Помогите дошлифовать напильником...
 
P.S. На момент создания поста - некорректно работал аттач изображения...  
		
	
		
		
			
			
			
		
			
			
			
				
					
					Изображения: 
					
						
						
	  | 
	p1.jpg (50.4 Кб, 6 просмотров) | 
 
						 
					 
					
				 
			
			
			
			
			
			
			 
		
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Allan Stark, 13.06.2012 в 14:52.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.06.2012, 13:51
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.04.2010 
					
					
					
						Сообщений: 87
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 В итоге все сие было багом лайоутов версии 4.07, поставил последнюю 4.1.0 - все заработало... 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 
 
 
 
	 | 
 
 
 |