Dimitri Missoh
enthusiastic technologist and problem solver

August 28th, 2008

Programmatically split an editor area to show two editors side by side.

Last time a workmate of mine asked me if it is possible, to programmatically split the editor area of an eclipse RCP application.

We all know that if you have two editors opened in the workbench, you can drag one of the editors and drop it in one of the regions of the editor area (bottom, top, left or right) so that both editors are side by side.

I started to analyze the eclipse code and look for a public API that I can use to achieve this task. I didn’t find anything. My first idea was to simulate the Drag&Drop behavior, but it came out to be a very challenging task.

So I’ve decided to use some of the API calls, which the eclipse team discourages to use. And it works. I bundled my code into a plug-in. Maybe someone will find this useful.

Download Projects Files.

Here is the most important part of the code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
 * Split the editor area if there is at least two editors in it.
 */
private void splitEditorArea() {
	IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
	IWorkbenchPart part = workbenchPage.getActivePart();
	PartPane partPane = ((PartSite) part.getSite()).getPane();
	LayoutPart layoutPart = partPane.getPart();
 
	IEditorReference[] editorReferences = workbenchPage.getEditorReferences();
	// Do it only if we have more that one editor
	if (editorReferences.length > 1) {
		// Get PartPane that correspond to the active editor
		PartPane currentEditorPartPane = ((PartSite) workbenchPage.getActiveEditor().getSite()).getPane();
		EditorSashContainer editorSashContainer = null;
		ILayoutContainer rootLayoutContainer = layoutPart.getContainer();
		if (rootLayoutContainer instanceof LayoutPart) {
			ILayoutContainer editorSashLayoutContainer = ((LayoutPart) rootLayoutContainer).getContainer();
			if (editorSashLayoutContainer instanceof EditorSashContainer) {
				editorSashContainer = ((EditorSashContainer) editorSashLayoutContainer);
			}
		}
		/*
		 * Create a new part stack (i.e. a workbook) to home the
		 * currentEditorPartPane which hold the active editor
		 */
		PartStack newPart = createStack(editorSashContainer);
		editorSashContainer.stack(currentEditorPartPane, newPart);
		if (rootLayoutContainer instanceof LayoutPart) {
			ILayoutContainer cont = ((LayoutPart) rootLayoutContainer).getContainer();
			if (cont instanceof PartSashContainer) {
				// "Split" the editor area by adding the new part
				((PartSashContainer) cont).add(newPart);
			}
		}
	}
}
 
/**
 * A method to create a part stack container (a new workbook)
 * 
 * @param editorSashContainer the <code>EditorSashContainer</code> to set for the returned <code>PartStack</code>
 * @return a new part stack container
 */
private PartStack createStack(EditorSashContainer editorSashContainer) {
	WorkbenchPage workbenchPage = (WorkbenchPage) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
	EditorStack newWorkbook = EditorStack.newEditorWorkbook(editorSashContainer, workbenchPage);
	return newWorkbook;
}