Here’s a neat little experiment I did with combining
Degrafa and
ObjectHandles. (View-source is enabled for the example.)
It lets you move and resize shapes drawn with Degrafa by using the ObjectHandles stuff. It was amazingly simple to make this work, essentially just something like:
<oh:ObjectHandle id=”myHandle”>
<degrafa:Surface left="0" top="0">
<degrafa:fills>
<degrafa:SolidFill id="aqua" colorKey="aqua"/>
</degrafa:fills>
<degrafa:GeometryGroup>
<degrafa:Elipse width="{myHandle.width}" height="{myHandle.height}}" fill="{aqua}" radius="20"/>
</degrafa:GeometryGroup>
</degrafa:Surface>
</oh:ObjectHandle>
I bet it’d be amazingly simple to make some sort of impressive drawing or charting application with this.
The first public release of my Flex spreadsheet component is now available from Google Code. This component is very similar to the Flex datagrid with a few notable distinctions:
- It’s designed for extensibility, not for speed or ease of use.
- Item Renderers or Item Editors can implement a custom interface to get more information and control over the spreadsheet they’re in.
- They get more data about the spreadsheet.
- They can dispatch a variety of events to cause the spreadsheet to do things
- Editors don’t neccessarily need to be confined to the size of the
- It’s designed primarily for data-input, not data-display
- The spreadsheet can have a “placeholder” row.
- This row is created by the spreadsheet and is only inserted into the underlying data model when it’s “valid”.
- You can specify a class factory for creating these, and a custom validator class to determine when a row is or is not valid.
- Visually, it’s slightly greyed out.
- Keyboard navigation is sane
- Tabbing between cells
- Using the arrows between cells.
- Using the arrows within while editing a cell
- Hitting enter submits an entire row.
- Leaving a cell submits that cell
- Build-in support for auto completion of cells with sane keyboard navigation of the auto-complete
- Hitting escape cancels a cell-edit
I originally wrote this for
AgileAgenda, recently we began using it for another project at my day-job. Seeing how it was general enough for that, I thought it might be worth sharing for comments / suggestions / etc.
This component is not ready for general-use. If you want to try it out expect:
- It’s not well documented.
- There are bugs
- For large data sets (300+ rows) it’s slow
- I do have several specific plans for greatly improving this, but I like to optimize last. You never know when feature changes can really affect performance.
- The partitioning feature will be completely re-written, don’t play with it yet.
- You will have questions. I don’t have time to answer them right now.
- Many of the features (like sorting) have only been implemented enough to support my current projects and are not general enough to support every need yet.
So why am I posting this now? I’m looking for feedback. What works well, what doesn’t. What other things might you need to use it in your projects?
Getting started:
Grab the source and look at Main.mxml, it has a moderately commented example of using the component. Also, Spreadsheet.as has a few comments in it that may be useful.
If you want to test out a sample, go here:
Eventually, more information about the project will be at that URL.
I’ve been looking for an open source user management system to build project upon. Someone pointed out Kasai to me a while back and I took a quick look. It’ seemed to be about 1/2 of what I wanted.
But I just took a more in-depth look at the docs and it might actually be much closer to what I was hoping to find. It looks promising. Hopefully I’ll be able to give it a try sometime soon and see how far it gets me.
http://kasai.manentiasoftware.com/
Just solved a mind-boggling problem I was having with some date manipulation.
The Date constructor returns a date with a different timezone depending on whether the date is today & before, or in the future.
var today:Date = new Date();
var yesterday:Date = new Date( today.fullYear, today.month, today.date - 1 );
var today2:Date = new Date( today.fullYear, today.month, today.date );
var tomorrow:Date = new Date( today.fullYear, today.month, today.date + 1 );
trace( yesterday.timezoneOffset );
trace( today2.timezoneOffset );
trace( tomorrow.timezoneOffset );
Traces output:
300
300
240
What’s worse if you then subtract a day from “tomorrow” it doesn’t equal today.
tomorrow.date–;
trace( tomorrow.time == today.time );
trace( tomorrow == today );
Output: false / false
Guess why?
Today’s daylight savings switchover day. Arghhh.
I really wish Actionscript had a date-only type.
A new version of Pulse Particles has been released.
This one has one new feature. If you create a MovieClip for your particle, there’s a new rule which will randomly pick a frame in that MovieClip to use.
From the particle explorer, you just have to check off the box on the “intial” tab to get this functionality.
This lets you create a single effect with multiple particles very easily.
If you were using animated particles you could still do that by placing an animated movie clip on each frame of the main particle’s movie clip. Or don’t check that box off and nothing changes.
I’ve been working with a few other (much more well known) authors on an open source flash book and it just hit Amazon for preorders. Neat stuff!
http://www.amazon.com/Essential-Guide-Source-Flash-Development/dp/1430209933/ref=sr_1_1?ie=UTF8&s=books&qid=1204814390&sr=8-1
Check it out
Too bad they spelled my name wrong.
-Marc
A while back I probed around to see if there are any open source user management systems out there and didn’t come up with any great leads.
Weird thing, at my day-job, yesterday, the general manager asked me the same question. Clearly there is a need for something like this.
My original list of requirements went something like this:
- Allowing users to sign up (email verification, catpcha support, configurable list of user details to require)
- Assign various access levels (or attributes?) to users.
- Allow users to log in / log out
- Detect multiple failed logins for a user or from a source host with configurable temporary lockouts
- Provide a simple API to use in applications that build upon it to get login status & access level (preferably language-agnostic)
- Mechanism for retrieval of forgotten passwords (email? security question(s)?, combination?)
- Provide a simple html based UI to handle all of these functions (including administrative functions like approving, disabling, changing access, etc.).
- Provide an XML-RPC based interface to perform all of the functions so it’s easily customizable by application that build upon it.
A new requirement that this request brought up was:
- Support for paid subscriptions
So here’s another blog post, and I’ll go hit up the OSFlash mailing list to see if anything comes up.

Ever see something that’s just screaming to be run through photoshop? I just couldn’t help myself this morning.
I noticed something while implementing the solution I talked about yesterday for dealing with self-signed vs. CA signed AIR apps.
The publisherId field is a blank string when running from within ADL. It’s an easy way to detect an installed AIR version vs. a version running within the debugger or just directly using ADL.
I haven’t really needed it so I haven’t searched the docs. There might be an explicit way to detect that scenario in the AIR api (feel free to comment and point it out), but if not and you need it, there you go.
I got my official Thawte code-signing certificate this week. It turns out you can’t upgrade an application from a self-signed to a CA-signed version in AIR. If you have the same problem you might be interested in the solution I’m going to use.
First, here’s my goals:
- Migrate people to the new CA signed version
- Don’t force most people with the Self-Signed version to upgrade immediately
- Keep both self and CA signed versions up to date (for a limited amount of time)
I’ll be moving the website download to the signed version
- New people will get the signed version.
- Existing users who go to the website to upgrade will be told they can’t install it. Those people will have to manually uninstall their version, and install the new signed version.
I have an auto-upgrade option in the software. Most people use this to upgrade. Previous versions checked a file called appUpdate.xml to see if there was an available update. I’ll start publishing two versions of that file.
- appUpdate.xml - This will continue to point to the self-signed version
- signedAppUpdate.xml - This will point to the new CA-signed version
In my application, I’ll add code to determine which of those to choose. Luckily, the nativeApplication.publisherID variable will be different depending on how the AIR app was signed.
if( nativeApplication.publisherID == “MY_SIGNED_PUBLISHER_ID” )
{
// This is our officially signed version
appUpdater.updateURL = “http://www.agileagenda.com/download/signedAppUpdate.xml”;
}
else
{
// This is our self signed version
appUpdater.updateURL = “http://www.agileagenda.com/download/appUpdate.xml”;
}
And finally, I update my ANT build script so I generate two different .air files, and create both the appUpdate XML files.
I’ll also put a nag into the self-signed version’s upgrade window saying something like:
We’ve recently started cryptographically signing our applications for your safety. Unfortunately, you can’t upgrade from a non-signed version to a signed version. For your security we suggest that you uninstall this unsigned software and then download and install from our website. You may continue using unsigned versions if you prefer.
And then someday I’ll completely disable the auto-update of the self-signed version when enough people have migrated over.