Tuesday 30 October 2007

How to synchronize iCal with Exchange?

Apple iCal is a very neat calendaring application. I love it. It synchronizes with my iPhone. It works reliably. The new version supplied with Leopard has everything I need: scheduling appointments, booking rooms, inviting other people, tells other people when I am busy or free.

Though, it is not compatible with Microsoft Exchange server our University uses.

I have run a little investigation on how to resolve the problem, and I'd like to share my finding with you.



Solution 1: Use Microsoft Entourage.

Entourage is a part of Microsoft Office for Mac. It is a Mac version of Outlook. It will allow you to manage your mail and calendars well. You can even synchronise your calendar with iCal! Automatically!
Just go to Entourage>preferences, and select Sync Services.
Now, on the right, you can ask Entourage to synchronise your calendar with iCal. This will create an additional calendar in your iCal called Entourage. It gives you three options.
  1. Take verything from Exchange and put it into iCal,
  2. take everything from that special calendar in iCal and put it into Exchange,
  3. Merge the calendars, and make sync work both ways.

If you want to book a room, you can do it with Entourage. If you just want to notify your colleagues that you are not available for a meeting every workday from 1pm to 2pm, just create a recurring appointment called "Lunch" and they will know you are busy.

If you are happy with this solution, go for it! It will even synchronise with your iPhone! Thanks for coming, and you know how to make a blogger happy - read carefully what Google guys suggest to you in the right part of the page.

Now, why I don't like Entourage.

First of all, I just love iCal and Mail.app. I do not want to use Entourage, even though I get it for free through the site license.

Second, the current version of Entourage was written years ago, when Macs were made with PowerPC processors. Those processors spoke a different language to what Intel processors speak. If you run Entourage (which is written in the ancient language of PowerPC) on you shiny new Intel Mac, you use a translator with a Rosetta Stone (go and find what it is in Wikipedia, it is interesting). The point is that the translator is slow. And iCal is written in plain English, oops... in plain Intel, and it works natively.

Third, Entourage can only synchronize your calendars while it is running. You cannot say it synchronize, and go on using iCal and mail.app alone. You still need to run Entourage. Though, you can run it hidden, press Command-H when Entourage is open and it is now hidden.

Fourth.... I do not like Entourage. I do not want to support Microsoft... I want everything to be simple....

We all hope that Microsoft will update their Office for Mac early next year, and hopefully some of my problems will be resolved. I am not sure, though, if it is worth the money people pay for it.

Oh, if you are a representative of Microsoft marketing, please, contact me and I will let you know what I want for Christmas.

If you are still with me, than you are probably looking for an alternative, so there you go:

Solution 2: Use GroupCal from Snerdware

The guys have made quite a job. It really works! Everything I ever wanted. Though, it does not work under Leopard.... yet...
Go and see for yourself: www.snerdware.com/groupcal

I would be happy, but...

  1. It does not work with Leopard.... yet...

  2. The way you see other people's free/busy time, and if the room is available is not nice. How I wish it worked just exactly like iCal in Leopard promises...

  3. I do not have a site license, and my Boss will tell me to go and use Windows. So, paying $55 from my own pocket is unpleasant. Please, fix the problems and make it a 20...



So, I went on went on with my investigation

Solution 3: Use open standards! Like iCal Server!

Oh, if you are powerful enough, you can save yourself quite a buck by not using Exchange at all! Go for CalDAV solution which will do everything you ever waned for free. It will work seamlessly with iCal in the end. And remember, iCal Server is open source, you can install it on one of your Macs for free. Whatever Apple charge for OS X Server, they charge it for the convenience of seamless installation. Contact the (smart) tech support.

This was not an option for me... so I went on and discovered another twisted solution.

Solution 4: iCal to Google Calendar to Outlook to Exchange. All aboard!

Bad news - you won't be able to see busy/free time of other people, and you still have to pay $50.
Good news - it will also synchronise with Google Calendar, and even send you SMS with notifications if you want.

The solution consists of two parts. The first one is to use magical Spanning Sync. This is a little program which will synhronize your iCal with Google Calendar. Works like a charm. Go for it even if you do not want anything else. Leopard compatible. Best program you can buy for your Mac, and just $25 for a year.

The second part is to use SyncMyCal tool from www.syncmycal.com on a Windows machine. I have enough of old computers I can hide in a cupboard at work which will run a scheduled synchronisation of Google Calendars with my Exchange...

Well... maybe Entourage is not all that bad after all... This is a really twisted solution. I am not going to use it.

Solution 5: Use Outlook Web Access

This is a web application to access your mail and calendars on the Exchange servers. Many companies have it. Clumsy and awful... I will use it only if I have no other choise whatsoever.

Solution 6: Do it the geeky way
Here is how: http://www.macosxhints.com/article.php?story=20041110141248547

I have to admit that I never tried this idea. Tell me if it works for you.

Solution 7: Hosted services

There are a number of synchronisation services, free and commercial, which will allow you to synchronise your calendars across different platforms. I have tried these:
  • Xchange network
  • ScheduleWorld


The main problem with these is that I do not want my calendars to be hosted somewhere else. I do not want even a potential breach of my privacy.

Now iCal supports proper communication with Microsoft Exchange server. If you are looking for hosted Exchange solution check out SherWeb at http://www.sherweb.com/

Nonexisting Solution: CalDAV connector to Exchange

This is what I would like to see. I want to have a CalDAV server, like iCal Server from Apple, able to fetch all the data from Exchange. This has to work transparently, as if I am using CalDAV.

The project itself does not sound impossibe. There are open source CalDAV implementations. There is Evolution Exchange Connector, an open source client for Microsoft Exchange. The final step is to make a transparent implementation of CalDAV server which talk to Exchange. Everyone will be happy then.

If you are a developer, and you can make this happen, then please, do! Make it cheap, like $20-$30, and you will sell a ton of copies. Send me a cheque for the idea if it works out well. Seriously, contact me if you are interested in this development, I can contribute to requirements. We can make millions happy.

Conclusions

I ended up printing out my calendar and sticking it to my door. People have to ask me if I am free at any particular moment, and I will check with my iCal. I do not synchronise with Exchange.

I really hope, the whole problem can be resolved in the year to come.

So far... dead end....

Thanks for reading. I guess, there must be some other solutions. Please, share your experiences and ideas in the comments. Check out what Google suggests in the right pane, they may have found a better solution elsewhere.

I do not hold any stock in any companies mentioned in this article. Your feedback is always welcome.

Cheers!

PS: I just have found that Boeing claim they have implemented an Exchange connector for CalDAV. I could not find any more details about this rumor.

Tuesday 9 October 2007

Curvy tabs in your Eclipse RCP Application

You might have noticed that the default look and feel of your Eclipse RCP application is slightly different to what you are used to while using Eclipse IDE. Many developers want to have exactly the same "Curvy" shape of tabs for the views instead of "lame" square ones. There are two ways of achieving that.

Way 1: The proper one. Depending on the version of Eclipse platform you are using, you have to edit (or create) either preferences.ini or plugin_customization.ini file in the root of your defining plugin. Add the following line to that file:
org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
and voila!

Way 2: The working one. I have no idea why the previous (proper) way of parameter definition fails sometimes. I have found a neat fix for the problem: you might want to set this workbench preference in your application workbench window adviser.
In ApplicationWorkbenchWindowAdviser.java add the following line:

PlatformUI.getPreferenceStore().setValue(IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS, false);

to public void preWindowOpen() method. and everything will begin to work like magic!

Good luck!

Thursday 4 October 2007

Dynamic Palettes in GEF

Hello again, I am finally back from holiday. Today I will describe a short trick for dynamically updating your GEF Palette.
I wanted to change the contents of the palette in graphical editor depending on user's choice in one of the combo boxes. Imagine combining two models into one by giving user a choice which one to use.

The original palette is usually created on graphical editor initialisation. You, however, can change the contents of this palette dynamically by modifying the PaletteRoot of your graphical editor.

So, I have created an additional method in my graphical editor:

public void updatePalette(LogicalModel model) {
PaletteRoot root = getPaletteRoot();
List children = root.getChildren();
for (int i = 0; i < children.size(); i++) {
if (children.get(i) instanceof PaletteGroup) {
PaletteGroup entry = (PaletteGroup) children.get(i);
if (entry.getLabel().equals("Plots")) {
// This is a group we want to update
List plots = model.getPlots();
int size = entry.getChildren().size();
for (int j = 0; j < size; j++) {
entry.getChildren().remove(0);
}
for (int j = 0; j < plots.size(); j++) {
CombinedTemplateCreationEntry component = new CombinedTemplateCreationEntry(plots.get(j).getName(), plots.get(j).getName(),
Plot.class, new SimpleFactory(Plot.class), ImageDescriptor.createFromFile(ResultsEditor.class,
"icons/plot.gif"), ImageDescriptor.createFromFile(ResultsEditor.class, "icons/plot.gif"));
entry.add(component);
}
}
}
}
}

This method flushes the whole content of the palette group named "Plots", and recreates it from some logical model.
All I have to do now is to call this new method from an appropriate listener to combo's selection change.