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.
Here is the most important part of the code:
/**
* 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;
}
You can download the full eclipse plug-in code from my blog: http://swarmy.free.fr/wordpress/
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)




Comments
narayan jai replied on Wed, 2009/09/23 - 7:06am
| Editor 1 |
| Editor 2 |
Thanks in advance,
Alex InGermany replied on Mon, 2009/09/28 - 4:32am
To show one editor above another, you need a little change in the code
Line 33 :
((PartSashContainer) cont).add(newPart);
will be removed through the following line :
PartSashContainer c = (PartSashContainer)cont;
c.add(newPart, IPageLayout.BOTTOM, 0.50f, c.findBottomRight());
Vikas Roonwal replied on Mon, 2010/02/01 - 7:57am
I was able to get the split, but now all hot-keys present in the new editor workbook are messed up i.e. if I have the same hot-keys (example - ALT + g) in the new editor that I add to the split-pane and an earlier editor, pressing ALT+g while the focus is on one of the text fields of the new editor triggers the same action on the earlier edtior.
Are we supposed to re-order the workbooks or editors?
Thanks and best regards,
~Vikas