You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ca...@apache.org on 2020/04/29 17:17:47 UTC

[royale-asjs] branch develop updated: jewel-virtuallist and virtualcombobox: avoid RTE due to new keyboard capabilities. implement for now the placeholder to avoid RTE, but still not implemented real functionality

This is an automated email from the ASF dual-hosted git repository.

carlosrovira pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 9843627  jewel-virtuallist and virtualcombobox: avoid RTE due to new keyboard capabilities. implement for now the placeholder to avoid RTE, but still not implemented real functionality
     new a629de4  Merge branch 'develop' of https://gitbox.apache.org/repos/asf/royale-asjs into develop
9843627 is described below

commit 98436273ef3d43fdf1522e83a1b107195a4446d7
Author: Carlos Rovira <ca...@apache.org>
AuthorDate: Wed Apr 29 19:16:31 2020 +0200

    jewel-virtuallist and virtualcombobox: avoid RTE due to new keyboard capabilities. implement for now the placeholder to avoid RTE, but still not implemented real functionality
---
 .../projects/Jewel/src/main/resources/defaults.css |   1 +
 .../projects/Jewel/src/main/royale/JewelClasses.as |   1 +
 .../controllers/VirtualListKeyDownController.as    | 156 +++++++++++++++++++++
 .../royale/jewel/beads/views/VirtualListView.as    |  62 +++++++-
 .../Jewel/src/main/sass/components/_list.sass      |   3 +-
 5 files changed, 221 insertions(+), 2 deletions(-)

diff --git a/frameworks/projects/Jewel/src/main/resources/defaults.css b/frameworks/projects/Jewel/src/main/resources/defaults.css
index bfa5856..113d46e 100644
--- a/frameworks/projects/Jewel/src/main/resources/defaults.css
+++ b/frameworks/projects/Jewel/src/main/resources/defaults.css
@@ -3268,6 +3268,7 @@ j|VirtualList {
   IBeadView: ClassReference("org.apache.royale.jewel.beads.views.VirtualListView");
   IBeadLayout: ClassReference("org.apache.royale.jewel.beads.layouts.VirtualListVerticalLayout");
   IDataProviderItemRendererMapper: ClassReference("org.apache.royale.jewel.beads.itemRenderers.VirtualDataItemRendererFactoryForCollectionView");
+  IBeadKeyController: ClassReference("org.apache.royale.jewel.beads.controllers.VirtualListKeyDownController");
 }
 
 j|Navigation {
diff --git a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
index 29c6ef5..069f7dd 100644
--- a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
+++ b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
@@ -53,6 +53,7 @@ package
         import org.apache.royale.jewel.beads.controllers.AlertController; AlertController;
         import org.apache.royale.jewel.beads.controllers.ListSingleSelectionMouseController; ListSingleSelectionMouseController;
         import org.apache.royale.jewel.beads.controllers.ListKeyDownController; ListKeyDownController;
+        import org.apache.royale.jewel.beads.controllers.VirtualListKeyDownController; VirtualListKeyDownController;
         import org.apache.royale.jewel.beads.controllers.TableCellSelectionMouseController; TableCellSelectionMouseController;
         import org.apache.royale.jewel.beads.controllers.ComboBoxController; ComboBoxController;
 		import org.apache.royale.jewel.beads.controllers.SnackbarController; SnackbarController;
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/VirtualListKeyDownController.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/VirtualListKeyDownController.as
new file mode 100644
index 0000000..9ea923a
--- /dev/null
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/VirtualListKeyDownController.as
@@ -0,0 +1,156 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You 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 org.apache.royale.jewel.beads.controllers
+{
+	import org.apache.royale.core.Bead;
+	import org.apache.royale.core.IBeadKeyController;
+	import org.apache.royale.core.IFocusable;
+	import org.apache.royale.core.IRemovableBead;
+	import org.apache.royale.core.ISelectionModel;
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.events.KeyboardEvent;
+	import org.apache.royale.html.beads.IListView;
+	import org.apache.royale.jewel.beads.views.IScrollToIndexView;
+	import org.apache.royale.utils.sendEvent;
+
+    /**
+     *  The Jewel ListSingleSelectionMouseController class is a controller for
+     *  org.apache.royale.jewel.List.
+     * 
+     *  Controllers watch for events from the interactive portions of a View and
+     *  update the data model or dispatch a semantic event.
+     *  This controller watches for events from the item renderers
+     *  and updates an ISelectionModel (which only supports single
+     *  selection).  Other controller/model pairs would support
+     *  various kinds of multiple selection.
+     * 
+     *  Jewel controller takes into account if the component
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9.7
+     */
+	public class VirtualListKeyDownController extends Bead implements IBeadKeyController, IRemovableBead
+	{
+        /**
+         *  Constructor.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.7
+         */
+		public function VirtualListKeyDownController()
+		{
+		}
+
+		/**
+		 *  The model.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.7
+		 */
+		protected var listModel:ISelectionModel;
+
+		/**
+		 *  The view.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.7
+		 */
+		protected var listView:IListView;
+
+        /**
+         *  @copy org.apache.royale.core.IBead#strand
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.7
+         *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
+		 *  @royaleignorecoercion org.apache.royale.jewel.beads.models.IJewelSelectionModel
+         *  @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+         *  @royaleignorecoercion org.apache.royale.core.IListView
+         */
+		override public function set strand(value:IStrand):void
+		{
+			_strand = value;
+			listModel = value.getBeadByType(ISelectionModel) as ISelectionModel;
+			listView = value.getBeadByType(IListView) as IListView;
+
+            listenOnStrand(KeyboardEvent.KEY_DOWN, keyDownEventHandler);
+		}
+
+		/**
+		 *  The actions needed before the removal
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.8
+		 */
+		public function tearDown():void
+		{
+			IEventDispatcher(_strand).removeEventListener(KeyboardEvent.KEY_DOWN, keyDownEventHandler);
+		}
+
+        /**
+		 * @private
+		 */
+		protected function keyDownEventHandler(event:KeyboardEvent):void
+		{
+			// avoid Tab loose the normal behaviour, for navigation we don't want build int scrolling support in browsers
+			if(event.key === KeyboardEvent.KEYCODE__TAB)
+				return;
+			
+			event.preventDefault();
+
+			// var index:int = listModel.selectedIndex;
+
+			// if(event.key === KeyboardEvent.KEYCODE__UP || event.key === KeyboardEvent.KEYCODE__LEFT)
+			// {
+			// 	if(index > 0)
+			// 		listModel.selectedIndex--;
+			// } 
+			// else if(event.key === KeyboardEvent.KEYCODE__DOWN || event.key === KeyboardEvent.KEYCODE__RIGHT)
+			// {
+			// 	listModel.selectedIndex++;
+			// }
+
+			// TODO
+			// if(index != listModel.selectedIndex)
+			// {
+			// 	listModel.selectedItem = listModel.dataProvider.getItemAt(listModel.selectedIndex);
+
+			// 	var ir:IFocusable = listView.dataGroup.getItemRendererForIndex(listModel.selectedIndex) as IFocusable;
+			// 	ir.setFocus();
+				
+            //     (listView as IScrollToIndexView).scrollToIndex(listModel.selectedIndex);
+				
+			// 	sendEvent(listView.host, 'change');
+			// }
+		}
+	}
+}
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/VirtualListView.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/VirtualListView.as
index bc098e5..a53b0aa 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/VirtualListView.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/VirtualListView.as
@@ -42,7 +42,7 @@ package org.apache.royale.jewel.beads.views
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.9.7
 	 */
-	public class VirtualListView extends VirtualDataContainerView
+	public class VirtualListView extends VirtualDataContainerView implements IScrollToIndexView
 	{
 		public function VirtualListView()
 		{
@@ -153,5 +153,65 @@ package org.apache.royale.jewel.beads.views
 		{
 
 		}
+
+		/**
+		 *  Ensures that the data provider item at the given index is visible.
+		 *  
+		 *  If the item is visible, the <code>verticalScrollPosition</code>
+		 *  property is left unchanged even if the item is not the first visible
+		 *  item. If the item is not currently visible, the 
+		 *  <code>verticalScrollPosition</code>
+		 *  property is changed make the item the first visible item, unless there
+		 *  aren't enough rows to do so because the 
+		 *  <code>verticalScrollPosition</code> value is limited by the 
+		 *  <code>maxVerticalScrollPosition</code> property.
+		 *
+		 *  @param index The index of the item in the data provider.
+		 *
+		 *  @return <code>true</code> if <code>verticalScrollPosition</code> changed.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 9
+		 *  @playerversion AIR 1.1
+		 *  @productversion Royale 0.9.7
+		 */
+		public function scrollToIndex(index:int):Boolean
+		{
+			// need to be implemented
+
+			// var scrollArea:HTMLElement = (_strand as IStyledUIBase).element;
+			// var oldScroll:Number = scrollArea.scrollTop;
+
+			// var totalHeight:Number = 0;
+			// var pm:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+			
+			// if(pm.variableRowHeight)
+			// {
+			// 	//each item render can have its own height
+			// 	var n:int = listModel.dataProvider.length;
+			// 	var irHeights:Array = [];
+			// 	for (var i:int = 0; i <= index; i++)
+			// 	{
+			// 		var ir:IItemRenderer = dataGroup.getItemRendererForIndex(i) as IItemRenderer;
+			// 		totalHeight += ir.element.clientHeight;
+			// 		irHeights.push(totalHeight + ir.element.clientHeight - scrollArea.clientHeight);
+			// 	}
+
+			// 	scrollArea.scrollTop = Math.min(irHeights[index], totalHeight);
+
+			// } else 
+			// {
+			// 	var rowHeight:Number;
+			// 	// all items renderers with same height
+			// 	rowHeight = isNaN(pm.rowHeight) ? ListPresentationModel.DEFAULT_ROW_HEIGHT : rowHeight;
+			// 	totalHeight = listModel.dataProvider.length * rowHeight - scrollArea.clientHeight;
+				
+			// 	scrollArea.scrollTop = Math.min(index * rowHeight, totalHeight);
+			// }
+
+			// return oldScroll != scrollArea.scrollTop;
+
+			return false;
+		}
 	}
 }
diff --git a/frameworks/projects/Jewel/src/main/sass/components/_list.sass b/frameworks/projects/Jewel/src/main/sass/components/_list.sass
index 7a9dac8..fe08705 100644
--- a/frameworks/projects/Jewel/src/main/sass/components/_list.sass
+++ b/frameworks/projects/Jewel/src/main/sass/components/_list.sass
@@ -68,4 +68,5 @@ j|ListItemRenderer
 j|VirtualList
     IBeadView:  ClassReference("org.apache.royale.jewel.beads.views.VirtualListView")
     IBeadLayout: ClassReference("org.apache.royale.jewel.beads.layouts.VirtualListVerticalLayout")
-    IDataProviderItemRendererMapper: ClassReference("org.apache.royale.jewel.beads.itemRenderers.VirtualDataItemRendererFactoryForCollectionView")
\ No newline at end of file
+    IDataProviderItemRendererMapper: ClassReference("org.apache.royale.jewel.beads.itemRenderers.VirtualDataItemRendererFactoryForCollectionView")
+    IBeadKeyController: ClassReference("org.apache.royale.jewel.beads.controllers.VirtualListKeyDownController")
\ No newline at end of file