TweetFollow Us on Twitter

OD Contain Yourself
Volume Number:12
Issue Number:1
Column Tag:New Apple Technology

OpenDoc: Contain Yourself ...

Updating applications to work with OpenDoc

By Eric Soldan, Apple Developer Technical Support

It’s time to be an OpenDoc™ container application. It’s not too soon, and it’s not too late. So how do you decide if your application should be an OpenDoc container application or not? Here’s an easy test:

• Will your application benefit from Internet access?

If the answer is yes, then being an OpenDoc container application is probably the right thing to do. By becoming an OpenDoc container application, you automatically get the benefits of everything that is OpenDoc, including CyberDog, which will provide component oriented Internet clients and other Internet services. Now is not the time to ignore the Internet bandwagon. It’s worth jumping on. The only question remaining is how to jump. Do you learn Open Transport and MacTCP and recode your entire application to support the Internet? Or do you look for alternatives, like OpenDoc?

A logical question therefore would be: “Is OpenDoc really the fastest way to add Internet to your application?” Adding Internet support with OpenDoc boils down to adding basic OpenDoc support; in this article we will evaluate the difficulty of adding OpenDoc to an existing application. Then you can decide.

The Container Application Library: Your Friend.

CALib, the Container Application Library, has been evolving for a while. It’s looking really good right now. Joshua Susser, of OpenDoc engineering, and I have been adding CALib support to an application I originally developed in Developer Tech Support called DTS.Draw. I wrote DTS.Draw years ago, without ever considering the possibility of adding something like OpenDoc later. DTS.Draw’s document model, while flexible, is a closed model, so adding OpenDoc support is therefore a very interesting test case for CALib.

It turns out that the amount of additional coding necessary is minimal. However, due to CALib’s flexibility, there were many development issues that had to be discussed for quite a while. If these discussions were not held, the implementation would not have been as robust. I will present what we’ve learned from these discussions.

First, let’s talk about DTS.Draw for a while. When adding OpenDoc, it’s important to understand how the existing application works. Since you are probably not familiar with DTS.Draw, I’ll give you a quick overview.

DTS.Draw is an AppsToGo framework based application. AppsToGo is an object-oriented C framework written by DTS. DTS.Draw is also all C code. DTS.Draw is a “standard” drawing application. It has a tool palette of a variety of drawing objects. It has a hierarchical document architecture which allows for grouping and ungrouping of draw objects. It supports infinite undo. It supports drag and drop.

When a document is saved, the object hierarchy is flattened and streamed to the file. When a drag-out occurs, the selected objects are streamed into a handle; this stream represents a sub-hierarchy of the document. This sub-hierarchy is then just a flavor for the clippings file. When a file is opened (or a drag-in occurs), the hierarchy is reconstructed. Very standard stuff.

Here’s a diagram of a representative DTS.Draw document:

For a save, the objects in the hierarchy are streamed in simple tree-walk order, as indicated by the numbering. The drag objects 2, 4, 5, and 6 can be any supported object. The current implementation of DTS.Draw allows for line, rect, round rect, oval, and pie objects. More can be added of course, and this exactly is how we added OpenDoc support to DTS.Draw; we just added a new OpenDoc Part object into the application. The difference with this object is that the content isn’t anything specifically manipulated by DTS.Draw. It is simply a part the user adds to the document. The DTS.Draw object just serves as a “container” for the OpenDoc part. If a user were to add two OpenDoc parts to the above DTS.Draw document, the document hierarchy might end up looking something like:

The implementation in DTS.Draw is relatively simple. The Part object inherits from DTS.Draw’s native rect object. The difference is that it has a much more complex content that the rect object in the standard DTS.Draw application. The content of the Part object can be any OpenDoc part, of course. The content of the Part object is managed using CALib. Given this information, look at this diagram and see exactly what the relationship between the Part objects and CALib :

As shown above, there’s a lot more to the DTS.Draw document now. Fortunately, most of the new stuff is managed by CALib and OpenDoc. CALib uses a “proxy part” to contain the parts that are placed into the document content. Normally, OpenDoc expects there to be a root part that is an OpenDoc container, but since other parts are “embedded” into your application’s non-OpenDoc document, a proxy container part is created and the “embedded” parts are stored in there. The proxy part, as far as OpenDoc is concerned, is what actually contains the other parts that are referenced from the DTS.Draw native content.

The difficulty here is that the proxy part isn’t “real.” It has no geometry information, and OpenDoc doesn’t automatically bind the proxy part to any code, as is the normal case with OpenDoc parts. Thus, OpenDoc is unable to offer the full range of services for the embedded parts. But this is okay. The proxy part isn’t all that smart, nor should it be. It is simply a part that is used by CALib to have somewhere to put the other parts.

So it’s up to DTS.Draw to control the layout and presentation for the OpenDoc parts. Only the application knows the geometry information for the embedded parts, which is stored in DTS.Draw Part objects. The DTS.Draw Part object also has a persistent reference to the corresponding object embedded in the proxy part. Fortunately, CALib offers API calls to help manage these and other OpenDoc interactions, so the above and other OpenDoc related tasks are relatively simple to implement.

For example, to perform screen updates and such, DTS.Draw simply tells CALib to tell the part to draw itself. All that is needed is the Part Ref value, which indicates to CALib which embedded part to draw. The application doesn’t have to care what it references. It references something, and that thing knows how to draw itself.

Streaming Your Objects

Given that the proxy part can’t really deal with containing parts by itself, (i.e., without your application doing the geometry), the proxy part and its embedded parts do not constitute a valid OpenDoc document. This is important when we decide what type of document you want to create when you save it to disk.

The choices are:

1. A Bento stream placed inside your document.

2. Your document stream placed inside a Bento document.

The right choice will of course depend on your application. For DTS.Draw, we chose 1. Choice 1 is closer to existing Macintosh applications. Choice 2 is closer to regular OpenDoc parts. If you were to consider the development choices, from application to OpenDoc part, with CALib applications somewhere in between, your choices look something like this:

Application:

Standard document architecture.

CALib-friendly application:

Standard document architecture with embedded Bento stream.

CALib-savvy application:

Bento document with application data streamed into an OpenDoc storage unit
value.

OpenDoc part editor:

Bento document with part editor data residing in an OpenDoc storage unit.

When considering drag and drop, the above categories are very important. When applications drag something to the desktop, a clippings file is created. When OpenDoc parts are dragged to the desktop, an OpenDoc document is created, instead of a clippings file. This is an important distinction between applications and OpenDoc. Applications create clippings files because they are a standard and flexible intermediate format. OpenDoc parts create OpenDoc documents on a drag-out because an OpenDoc document is already a universal format. There’s no reason to resort to creating a clippings file.

If you are a CALib application, the choice is no longer so clear. Our suggestion is to base your drag-out decision on whether your document format is still “native,” or if you use a Bento file with your native content embedded.

So, if you are a CALib application, what is one to do on a drag-out? The answer lies in the document type. If the document type is an OpenDoc document (CALib-savvy), then the drag-out type is OpenDoc document. If the document type is a standard document (CALib-friendly), then the drag-out type is a clippings file.

DTS.Draw’s native content is simply streamed out. After adding CALib support, this is still the case. The Bento document is streamed out, as well. Here’s the new document format:

Byte offset Description

0 to 3: length of Bento stream

4 to nativeContent - 1: Bento stream

nativeContent to EOF: native content stream, i.e.,
DTS.Draw old format

There was much discussion as to whether or not the Bento stream should be at the front of the file or the end. It turns out that you can do some interesting things if it is at the front of the file. Try out this situation:

1. Your machine has CALib. You add some OpenDoc parts to your DTS.Draw document.

2. You then send the document to some poor individual who doesn’t have CALib or OpenDoc.

Guess what? If the Bento stream is in the front of the file, the unfortunate individual can still use the file with your CALib-friendly application. The user without CALib can actually edit the native content and save it out. The native content changes size, but hey, it’s on the end of the file.

On machines that don’t have CALib but need to display Part objects in their content, the standard look for “NoPart” should be used. This is what OpenDoc displays when an editor for a particular part isn’t available. In the case of CALib applications, it works for when CALib isn’t available, as well.

Making your CALib-based documents work on machines with or without CALib takes a bit of extra coding, but from a version control standpoint, it is well worth it. Documents can go anywhere. A CALib document can be given to someone without CALib. That this person can actually edit the native content of the document, and then give the document back to you, is pretty nifty.

On machines where CALib isn’t available, users obviously won’t be able to add any new parts to the document. They will be restricted to editing the native content. However, this may include moving part objects around that someone else was nice enough to put in the document. This works. Remember that the geometry information is stored in the native objects, which all users can edit. The proxy part doesn’t handle the geometry. In addition, the user can delete the Part objects (which are displayed using the “No Part” look). This of course means that there is data orphaned in the Bento stream. (Since the user doesn’t have CALib, there is no way their machine can modify the Bento stream.) Fortunately, the stream will be compacted the next time the document is saved on a machine with CALib.

With some extra work, you can even allow the user to resize the Part objects without CALib. When this occurs, the information in the Bento stream for that part is no longer up to date. The native content object will need to be flagged as having been resized. When the document is opened on a machine with CALib, these objects will need to have their frame information renegotiated and resolved to reflect their new size.

We’ve been discussing types of editing that can still occur to a CALib document Part object when CALib isn’t available. There are, of course, edits that can’t be performed. Here are two:

1. Dragging that includes a Part object. Streaming the drag data must include streaming the Bento information into the flavor. This can’t be done without CALib. All that’s in the native object is a persistent reference to somewhere inside the Bento stream. You can’t resolve the reference without CALib.

2. Copying the object. At first, it would seem that you would just copy the native content object. It has a persistent reference. Both copies of the object would then point to the same Bento information, i.e., the part. This is a bad thing. When opened again on a CALib machine, each copy of the part should be independent of the other. (You could flag the copy as an unresolved copy, and then clone the object when the document is next opened on a CALib machine.)

As you can see from this discussion, CALib can be used to add OpenDoc capability to your existing applications without radically changing the way they work. The actual amount of code added to an application isn’t all that bad, either. Of course, this will vary, depending on architecture and document content, but most likely, it’s not a complete recode with major modifications throughout your application. Look for the latest CALib and CASample sample code on the OpenDoc DR4 release.

Have fun out there!

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

VMware Fusion 11.5.6 - Run Windows apps...
VMware Fusion and Fusion Pro - virtualization software for running Windows, Linux, and other systems on a Mac without rebooting. The latest version includes full support for Windows 10, macOS Mojave... Read more
Alfred 4.1 - Quick launcher for apps and...
Alfred is an award-winning productivity application for OS X. Alfred saves you time when you search for files online or on your Mac. Be more productive with hotkeys, keywords, and file actions at... Read more
Dashlane 6.2032.0 - Password manager and...
Dashlane is an award-winning service that revolutionizes the online experience by replacing the drudgery of everyday transactional processes with convenient, automated simplicity - in other words,... Read more
Skype 8.63.0.76 - Voice-over-internet ph...
Skype is a telecommunications app that provides HD video calls, instant messaging, calling to any phone number or landline, and Skype for Business for productive cooperation on the projects. This... Read more
Mellel 5.0.3 - The word processor for sc...
Mellel is the leading word processor for OS X and has been widely considered the industry standard for long form documents since its inception. Mellel focuses on writers and scholars for technical... Read more
A Better Finder Rename 11.20 - File, pho...
A Better Finder Rename is the most complete renaming solution available on the market today. That's why, since 1996, tens of thousands of hobbyists, professionals and businesses depend on A Better... Read more
TunnelBear 3.9.10 - Subscription-based p...
TunnelBear is a subscription-based virtual private network (VPN) service and companion app, enabling you to browse the internet privately and securely. Features Browse privately - Secure your data... Read more
Dropbox 103.4.383 - Cloud backup and syn...
Dropbox for Mac is a file hosting service that provides cloud storage, file synchronization, personal cloud, and client software. It is a modern workspace that allows you to get to all of your files... Read more
Daylite 2020.29.1 - Dynamic business org...
Daylite helps businesses organize themselves with tools such as shared calendars, contacts, tasks, projects, notes, and more. Enable easy collaboration with features such as task and project... Read more
HoudahSpot 5.1.5 - Advanced file-search...
HoudahSpot is a versatile desktop search tool. Use HoudahSpot to locate hard-to-find files and keep frequently used files within reach. HoudahSpot will immediately feel familiar. It works just the... Read more

Latest Forum Discussions

See All

Motorball is a car football game from No...
A few years back Noodlecake Studios announced that they would be dipping in the multiplayer gaming realm with two different games. The first of those, Golf Blitz, released a while back and has proven to be very popular. Now, the second has arrived... | Read more »
SINoALICE's latest update introduce...
SINoALICE's latest update has now arrived, adding several fan-favourite characters from popular RPG series NieR. Young Nier, Kaine, and Young Emil are available in-game as part of a limited-time crossover event set to run until August 20th. [Read... | Read more »
Rocat Jumpurr is an intense roguelite pl...
Rocat Jumpurr is a roguelite platformer from developer Mousetrap Games. You might already be familiar with it if you follow the Big Indie Pitch, where it won first place during this year's Pocket Gamer Connects London competition. Following its... | Read more »
PUBG Mobile's Play As One campaign...
Back in mid-July, we reported that PUGB Mobile had teamed up with Direct Relief to help raise money for the charity's COVID-19 response project. It focused on an in-game running challenge for players, which lead to the PUBG Mobile donating $2... | Read more »
Marvel Contest of Champions' latest...
Marvel Contest of Champions' latest motion comic has arrived, and it shows off new fighters Air-Walker and Dragon Man. Both characters are set to arrive in-game this month. [Read more] | Read more »
Clash Royale: The Road to Legendary Aren...
Supercell recently celebrated its 10th anniversary and their best title, Clash Royale, is as good as it's ever been. Even for lapsed players, returning to the game is as easy as can be. If you want to join us in picking the game back up, we've put... | Read more »
Global Spy is an intriguing 2D spy sim f...
Developer Yuyosoft Innovations' Global Spy launched last month for iOS and Android, though if you missed it at the time, we're here to tell you why it's well worth a go. This one's all about international espionage, tracking down elusive spies,... | Read more »
Distract Yourself With These Great Mobil...
There’s a lot going on right now, and I don’t really feel like trying to write some kind of pithy intro for it. All I’ll say is lots of people have been coming together and helping each other in small ways, and I’m choosing to focus on that as I... | Read more »
Hyena Squad is sci-fi turn-based strateg...
Wave Light Games has just revealed its latest release, Hyena Squad, a turn-based RPG set in a space station infested by gross aliens and the living dead. The announcement was first reported on by Touch Arcade. [Read more] | Read more »
Idle Guardians: Never Die is a pixel art...
SuperPlanet has been fairly prolific with game releases so far this year with both Evil Hunter Tycoon and Lucid Adventure releasing earlier this year. Now, they've released another idle RPG called Idle Guardians: Never Die, which you can download... | Read more »

Price Scanner via MacPrices.net

Apple restocks refurbished 2020 13″ MacBook A...
Apple has restocked Certified Refurbished 2020 13″ MacBook Airs starting at only $849 and up to $200 off the cost of new Airs. Each MacBook features a new outer case, comes with a standard Apple one-... Read more
Apple restocks clearance 2019 13″ 2.4GHz MacB...
Apple has restocked Certified Refurbished 2019 13″ 2.4GHz 4-Core Touch Bar MacBook Pros starting at $1359 and up to $560 off original MSRP. Apple’s one-year warranty is included, shipping is free,... Read more
Apple restocks refurbished iPhone XR models s...
Apple has restocked Certified Refurbished, unlocked, iPhone XR models in the refurbished section of their online store starting at $539. Each iPhone comes with Apple’s standard one-year warranty,... Read more
Price drops! $100-$200 off clearance 27″ 5K i...
B&H Photo has dropped prices on clearance, previous-generation 27″ 5K iMacs by up to $200 off Apple’s original MSRP: – 27″ 3.0GHz 6-Core 5K iMac: $1699 $100 off original MSRP – 27″ 3.1GHz 6-Core... Read more
Woot offers Apple Watch and iPhone models fro...
Amazon-owned Woot has refurbished Apple Watch and iPhone models available from $99-$749 through August 6th. According to Woot, the items may show some wear, but they have all been fully tested and... Read more
Apple’s Phil Schiller Steps Down As SVP OF Wo...
NEWS: 08.05.20 – Former Apple senior Vice President of worldwide marketing, Phil Schiller, is stepping down from his long time role at the company in order to focus on spending more time with family... Read more
Expercom offers $320 discount on the 6-core 1...
Apple reseller Expercom has the Silver 16″ 6-core MacBook Pro on sale for a limited time for $2079 shipped. Their price is $320 off Apple’s MSRP for this model, and it’s the cheapest price currently... Read more
Apple announces Education pricing for new 202...
Purchase a new 2020 iMac or iMac Pro at Apple using Apple’s Education discount, and take up to $400 off MSRP. All teachers, students, and staff of any educational institution with a .edu email... Read more
Apple reseller Expercom offers $256 discount...
Expercom has Apple’s new 2020 10-core iMac Pro available for order and on sale for $4743 shipped. Their price is $256 off Apple’s MSRP for this new model, and it’s the cheapest price we’ve seen so... Read more
Apple releases refreshed 2020 27″ iMacs with...
Apple today released updated versions of their 27″ iMacs featuring 10th generation Intel processors, SSDs across the board, a better 5K display, and improvements to the camera, speakers, and mic.... Read more

Jobs Board

Executive Team Leader GM Sales (Assistant Man...
…(Assistant Manager General Merchandise and Operations) - Apple Valley, CaliforniaApply NowJob ID:R0000082364job family:Store Managementschedule:Full Read more
Cub Foods - *Apple* Valley - Now Hiring Par...
Cub Foods - Apple Valley - Now Hiring Part Time! United States of America, Minnesota, Apple Valley New Retail Post Date 2 days ago Requisition # 122305 Sign Up Read more
Part-time Geek Squad *Apple* Consultation P...
**770829BR** **Job Title:** Part-time Geek Squad Apple Consultation Professional-Store 384(Ithaca) **Job Category:** Store Associates **Store Number or Department:** Read more
Product Manager, *Apple* Commercial Sales -...
Product Manager, Apple Commercial Sales Austin, TX, US Requisition Number:77652 As an Apple Product Manager for the Commercial Sales team at Insight, you Read more
Cub Foods - *Apple* Valley - Now Hiring Par...
Cub Foods - Apple Valley - Now Hiring Part Time! United States of America, Minnesota, Apple Valley New Retail Post Date 1 day ago Requisition # 122305 Sign Up Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.