package org.xmind.ui.internal.e4models; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; public abstract class ModelPageContainer extends ModelPage implements IModelPageContainer { private Composite container; private ArrayList<ModelPage> previousPages = new ArrayList<>(); private ArrayList<ModelPage> nextPages = new ArrayList<>(); private Control mainPage; protected void addPreviousPage(ModelPage page) { previousPages.add(page); page.setPageContainer(this); } protected void addNextPage(ModelPage page) { nextPages.add(page); page.setPageContainer(this); } @Override protected IModelPageContainer getPageContainer() { return this; } @Override public void showModelPage() { List<ModelPage> pages = new ArrayList<>(); pages.addAll(previousPages); pages.add(this); pages.addAll(nextPages); ModelPage page = null; for (ModelPage mp : pages) { if (!mp.isPageComplete()) { page = mp; break; } } StackLayout stackLayout = (StackLayout) container.getLayout(); Control topControl = null; if (this == page) { if (mainPage == null || mainPage.isDisposed()) { mainPage = createMainPage(container); } topControl = mainPage; } else { Control control = page.getControl(); if (control == null || control.isDisposed()) { page.createControl(container); } topControl = page.getControl(); } stackLayout.topControl = topControl; container.layout(true); } @Override protected Control doCreateControl(Composite parent) { container = new Composite(parent, SWT.NONE); StackLayout layout = new StackLayout(); layout.marginHeight = 0; layout.marginWidth = 0; container.setLayout(layout); showModelPage(); return container; } protected abstract Control createMainPage(Composite container); }