<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8177780442405909236</id><updated>2011-11-27T15:32:04.739-08:00</updated><category term='lame'/><category term='Flex'/><category term='adobe flex'/><title type='text'>Techish dot Jeremy Mooer</title><subtitle type='html'>another lame blog by jeremy mooer -- maybe i can find some time to actually do this blogging thing.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://techishdotjeremy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://techishdotjeremy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jeremy</name><uri>http://www.blogger.com/profile/15502013328032987665</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8177780442405909236.post-4232263594592572729</id><published>2009-05-18T14:36:00.000-07:00</published><updated>2009-05-18T22:01:50.334-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adobe flex'/><title type='text'>AutoScrolling Flex Form.</title><content type='html'>At work we have an extensive library for our internal ERP application.  A component therein is our Form component.  It does a lot of little things such as adding default keyListeners for regularly used form shortcuts, or a getFormValues that loops through all children (and all children of childrenContainers ad infinitum), returning a class that we use for most RemoteObject calls.&lt;br /&gt;&lt;br /&gt;Last week I added an autoScroll property to that internal form, using code from &lt;a href="http://www.webapper.com/blog/index.php/2008/02/01/flex-making-scrollbars-follow-focus"&gt;Daryl Bantarri's AutoScroll&lt;/a&gt; utility class (a class that has a single static method).  I had a slight problem with it that required a slight edit or two (breaking the method into a few more manageable functions). (and, of course, my edits had to conform to our internal architectural standards and naming conventions)... so if the "doFunctionName," "canRuleName" or redundant returns in the rule are annoying -- that's my fault --&gt; I wrote a lot of those ridiculous rules over here.&lt;br /&gt;&lt;br /&gt;Also, in the comments of &lt;a href="http://www.webapper.com/blog/index.php/2008/02/01/flex-making-scrollbars-follow-focus"&gt;Daryl's post&lt;/a&gt;, some talked of removing the updateComplete listener.  We add a lot of form components dynamically to forms, so listening for anything after an updateDisplayList, etc., is a necessity for our framework.  Feel free to get rid of that updateComplete listener if need be, especially if your intended use is to hard-code your components in the form.&lt;br /&gt;&lt;br /&gt;A shout out to &lt;a href="http://www.webapper.com/index.cfm/about-us"&gt;Patrick who is part owner of Webapper&lt;/a&gt;... fellow Northern Coloradan whom I've met a small handful of times at random local tech meetups.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private var _autoScroll : Boolean = false;&lt;br /&gt;public function get autoScroll():Boolean&lt;br /&gt;{&lt;br /&gt; return _autoScroll;&lt;br /&gt;}&lt;br /&gt;public function set autoScroll(value:Boolean):void&lt;br /&gt;{&lt;br /&gt; _autoScroll = value;&lt;br /&gt; if(value)&lt;br /&gt;  activateAutoscrollListeners();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private function activateAutoscrollListeners():void&lt;br /&gt;{&lt;br /&gt; var container : DisplayObjectContainer = this.parent;&lt;br /&gt; if(container)&lt;br /&gt; {&lt;br /&gt;  container.addEventListener(FlexEvent.UPDATE_COMPLETE, doAutoScroll);&lt;br /&gt;  container.addEventListener(FocusEvent.FOCUS_IN, doAutoScroll);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;also, on creationComplete (or earlier, since we only need the this.parent in activeAutoScrollLIsteners()):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if(autoScroll)&lt;br /&gt; activateAutoscrollListeners();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private function canAutoScroll(container:Container, focusObject:DisplayObject):Boolean&lt;br /&gt;{&lt;br /&gt; if(!focusObject)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; if(!container)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; if(!container.verticalScrollBar)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; if(!this.contains(focusObject))&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; if(focusObject == this)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* doAutoScroll is the eventListener for the parent container's updateComplete and focusIn.  if(canAutoScroll), this method calls&lt;br /&gt;* completeAutoScroll and updates the parent container's verticalScrollPosition.&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;private function doAutoScroll(event:Event):void&lt;br /&gt;{&lt;br /&gt; var container : Container = Container(event.currentTarget);&lt;br /&gt; //Don't want displayObject.Y of event.target.  getFocus() is more accurate (i.e., mx.controls.combobox).&lt;br /&gt; var focusObject : DisplayObject = DisplayObject(container.focusManager.getFocus());&lt;br /&gt;&lt;br /&gt; if(canAutoScroll(container,focusObject))&lt;br /&gt; {&lt;br /&gt;  var itemParent : DisplayObjectContainer = focusObject.parent;&lt;br /&gt;  var focusObjectTopY : int = (focusObject.parent == this) ? focusObject.y : addTotalYoffSets(focusObject);&lt;br /&gt;   if(container.verticalScrollPosition != focusObjectTopY)&lt;br /&gt;    {&lt;br /&gt;   completeAutoScroll(container, focusObjectTopY, focusObject);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function addTotalYoffSets(focusObject:DisplayObject):int&lt;br /&gt;{&lt;br /&gt; var parentContainer : DisplayObjectContainer = focusObject.parent;&lt;br /&gt; var focusObjectTopY : int = focusObject.y ;&lt;br /&gt;&lt;br /&gt; while(parentContainer != this.parent) {&lt;br /&gt;  focusObjectTopY += parentContainer.y;&lt;br /&gt;  parentContainer = parentContainer.parent;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return focusObjectTopY;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function completeAutoScroll(container:Container, focusObjectTopY:int, focusObject:DisplayObject):void&lt;br /&gt;{&lt;br /&gt; var focusObjectBottomY : int = focusObjectTopY + focusObject.height;&lt;br /&gt; var lastVisibleY : int = container.height + container.verticalScrollPosition;&lt;br /&gt;&lt;br /&gt; if(container.horizontalScrollBar)&lt;br /&gt;  lastVisibleY -= container.horizontalScrollBar.height;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; if(focusObjectTopY &lt; container.verticalScrollPosition)&lt;br /&gt; {&lt;br /&gt;  container.verticalScrollPosition = Math.max( 0, focusObjectTopY - 5 );&lt;br /&gt; }&lt;br /&gt; else if(focusObjectBottomY &gt; lastVisibleY)&lt;br /&gt; {&lt;br /&gt;  //scroll down.  +5 pixels for good measure.&lt;br /&gt;  var newPosition : int = Math.min( container.verticalScrollBar.maxScrollPosition, (container.verticalScrollPosition + (focusObjectBottomY - lastVisibleY)) );&lt;br /&gt;  container.verticalScrollPosition = newPosition + 5;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8177780442405909236-4232263594592572729?l=techishdotjeremy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techishdotjeremy.blogspot.com/feeds/4232263594592572729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8177780442405909236&amp;postID=4232263594592572729' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/4232263594592572729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/4232263594592572729'/><link rel='alternate' type='text/html' href='http://techishdotjeremy.blogspot.com/2009/05/autoscrolling-flex-form.html' title='AutoScrolling Flex Form.'/><author><name>Jeremy</name><uri>http://www.blogger.com/profile/15502013328032987665</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8177780442405909236.post-9150164599918322185</id><published>2009-05-11T19:57:00.000-07:00</published><updated>2009-05-11T20:31:20.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adobe flex'/><title type='text'>A Note on SAP / Flex and iPerspective</title><content type='html'>Ridiculously long time since a post, but, for anyone who knew I went, my trip to Palo Alto wasn't what I had expected.  I thought I'd be writing an interface to parse the SAP metadata used to render an SAP screen and render it in a Flex application.&lt;br /&gt;&lt;br /&gt;It appears as though it had already been done... not sure if it was/is an open source project, but one thing that did come out of my own experimentation is a little interface called &lt;span style="font-weight: bold; font-style: italic;"&gt;iPerspective&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;iPerspective:  In the app I was building it seemed to make sense to (instead of manage components' interactivity through states) dispatch a PerspectiveEvent (listened for in the App and pushed back down to all registered components), changing the look of the ApplicationControlBar, and anything else that is a mx.core.container that implements iPerspective.&lt;br /&gt;&lt;br /&gt;I'll work with it next week if/when I have time -- if it makes sense in practice, maybe I'll open source it.&lt;br /&gt;Anyway, no real stories.  Hope all is well out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8177780442405909236-9150164599918322185?l=techishdotjeremy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techishdotjeremy.blogspot.com/feeds/9150164599918322185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8177780442405909236&amp;postID=9150164599918322185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/9150164599918322185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/9150164599918322185'/><link rel='alternate' type='text/html' href='http://techishdotjeremy.blogspot.com/2009/05/note-on-sap-flex-and-iperspective.html' title='A Note on SAP / Flex and iPerspective'/><author><name>Jeremy</name><uri>http://www.blogger.com/profile/15502013328032987665</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8177780442405909236.post-6906482444503188145</id><published>2008-09-13T10:28:00.001-07:00</published><updated>2009-05-11T19:45:18.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>a random utility class: ObjectSerializer.</title><content type='html'>I'm just going through and editing a few old posts.  This package (objectSerializer) was one that was needed in the case of a serialized object needing to be passed through a url (yes, we had a case where that was needed).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;package of.lovin&lt;br /&gt;{&lt;br /&gt; import flash.utils.ByteArray;&lt;br /&gt; &lt;br /&gt; import mx.utils.Base64Decoder;&lt;br /&gt; import mx.utils.Base64Encoder;&lt;br /&gt; &lt;br /&gt; public class ObjectSerializer&lt;br /&gt; {&lt;br /&gt;&lt;br /&gt;  public static function decode(str:String):*&lt;br /&gt;  {&lt;br /&gt;   // '+' equals '-'  and '/' equals '_'&lt;br /&gt;   &lt;br /&gt;   if (str != null)&lt;br /&gt;   {&lt;br /&gt;    &lt;br /&gt;    var myPattern : RegExp = new RegExp("-", "g");&lt;br /&gt;    var myPattern2 : RegExp = new RegExp("_", "g");&lt;br /&gt;    var myPattern3 : RegExp = new RegExp("~", "g");&lt;br /&gt;    &lt;br /&gt;    var urlModifiedString : String = str;&lt;br /&gt;     urlModifiedString = urlModifiedString.replace(myPattern,"=");&lt;br /&gt;     urlModifiedString = urlModifiedString.replace(myPattern2,"/");&lt;br /&gt;     urlModifiedString = urlModifiedString.replace(myPattern3,"\n");&lt;br /&gt;     &lt;br /&gt;    &lt;br /&gt;    var bytes:ByteArray = new ByteArray();&lt;br /&gt;    var bDecoder : Base64Decoder = new Base64Decoder();&lt;br /&gt;     bDecoder.decode(urlModifiedString);&lt;br /&gt;    bytes = bDecoder.toByteArray() ;&lt;br /&gt;    &lt;br /&gt;    bytes.position = 0;&lt;br /&gt;    &lt;br /&gt;    return bytes.readObject();&lt;br /&gt;   }&lt;br /&gt;   return null;&lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public static function encode(obj:*):String&lt;br /&gt;  {&lt;br /&gt;   // '+' equals '-'  and '/' equals '_'&lt;br /&gt;   &lt;br /&gt;   var bytes:ByteArray = new ByteArray();&lt;br /&gt;    bytes.writeObject( obj );&lt;br /&gt;   &lt;br /&gt;   var bEncoder : Base64Encoder = new Base64Encoder();&lt;br /&gt;    bEncoder.encodeBytes(bytes);&lt;br /&gt;&lt;br /&gt;   var myPattern : RegExp = new RegExp("=", "g");&lt;br /&gt;   var myPattern2 : RegExp = new RegExp("/", "g");&lt;br /&gt;   var myPattern3 : RegExp = new RegExp('\n', "g");&lt;br /&gt;   &lt;br /&gt;   var urlModifiedString : String = bEncoder.toString();&lt;br /&gt;    urlModifiedString = urlModifiedString.replace(myPattern,"-");&lt;br /&gt;    urlModifiedString = urlModifiedString.replace(myPattern2,"_");&lt;br /&gt;    urlModifiedString = urlModifiedString.replace(myPattern3,"~");&lt;br /&gt;   &lt;br /&gt;   return urlModifiedString ;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8177780442405909236-6906482444503188145?l=techishdotjeremy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techishdotjeremy.blogspot.com/feeds/6906482444503188145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8177780442405909236&amp;postID=6906482444503188145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/6906482444503188145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/6906482444503188145'/><link rel='alternate' type='text/html' href='http://techishdotjeremy.blogspot.com/2008/09/random-utility-class-objectserializer.html' title='a random utility class: ObjectSerializer.'/><author><name>Jeremy</name><uri>http://www.blogger.com/profile/15502013328032987665</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8177780442405909236.post-2030234665025706328</id><published>2008-05-10T11:09:00.000-07:00</published><updated>2008-05-15T22:06:35.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adobe flex'/><title type='text'>Flex Builder / Eclipse tip du jour.</title><content type='html'>It's inevitable. You'll be debugging a Flex application, get an error and will need to look at a class, object, function or the like.  Instead of scrolling up and down, or digging through directories, do the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ctrl-click&lt;/span&gt; on the 'identifier' in question and you're in like Flynn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8177780442405909236-2030234665025706328?l=techishdotjeremy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techishdotjeremy.blogspot.com/feeds/2030234665025706328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8177780442405909236&amp;postID=2030234665025706328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/2030234665025706328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/2030234665025706328'/><link rel='alternate' type='text/html' href='http://techishdotjeremy.blogspot.com/2008/05/flex-builder-eclipse-tip-du-jour.html' title='Flex Builder / Eclipse tip du jour.'/><author><name>Jeremy</name><uri>http://www.blogger.com/profile/15502013328032987665</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8177780442405909236.post-4834560766466679765</id><published>2008-05-10T10:38:00.000-07:00</published><updated>2008-05-10T10:39:41.664-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lame'/><title type='text'>30th time is the charm?</title><content type='html'>Maybe it's a bad idea to start ANOTHER blog that may fall into the same ol' my-last-post-was-five-months-ago pit.  But, what the hell...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8177780442405909236-4834560766466679765?l=techishdotjeremy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techishdotjeremy.blogspot.com/feeds/4834560766466679765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8177780442405909236&amp;postID=4834560766466679765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/4834560766466679765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8177780442405909236/posts/default/4834560766466679765'/><link rel='alternate' type='text/html' href='http://techishdotjeremy.blogspot.com/2008/05/30th-time-is-charm.html' title='30th time is the charm?'/><author><name>Jeremy</name><uri>http://www.blogger.com/profile/15502013328032987665</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
