private void xmlWriteFloating(PrintWriter out) throws IOException {
		// there is no list of floating : we have to fetch the dockable states

		// updated : we also need to store grouping information
		ArrayList processedDockables = new ArrayList();

		Window desktopWindow = SwingUtilities.getWindowAncestor(this);
		Point windowLocation;
		if (desktopWindow != null) {
			windowLocation = desktopWindow.getLocation();
		} else {
			windowLocation = new Point(); // fail safe
		}

		ArrayList<Dockable> floatingDockables = context.getDockablesByState(
				this, DockableState.Location.FLOATING);

		for (int i = 0; i < floatingDockables.size(); i++) {
			Dockable d = floatingDockables.get(i);

			// DockableState state = (DockableState)floatingDockables.get(i);
			// Dockable d = (Dockable) state.getDockable();
			if (processedDockables.contains(d)) {
				continue; // ignore this dockable : already processed
			}

			Window w = SwingUtilities.getWindowAncestor(d.getComponent());
			Rectangle r = w.getBounds();
			// out.println("<Floating x=\"" + (r.x - windowLocation.x) +
			// "\" y=\""
			// + (r.y - windowLocation.y) + "\" width=\"" + r.width
			// + "\" height=\"" + r.height + "\">");

			out.println("<Floating x=\"" + (r.x) + "\" y=\"" + (r.y)
					+ "\" width=\"" + r.width + "\" height=\"" + r.height
					+ "\">");

			TabbedDockableContainer tabContainer = DockingUtilities
					.findTabbedDockableContainer(d);
			if (tabContainer != null) {
				// fetch all the dockables of this container
				for (int t = 0; t < tabContainer.getTabCount(); t++) {
					Dockable tabDockable = tabContainer.getDockableAt(t);
					processedDockables.add(tabDockable);
					xmlWriteFloatingDockable(tabDockable, out);
				}
			} else {
				// single floating
				processedDockables.add(d);
				xmlWriteFloatingDockable(d, out);
			}
			out.println("</Floating>");
		}

	}