package org.nlamah.QLS.View.Controllers;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import org.nlamah.QBase.Constants.UIConstants;
import org.nlamah.QL.Model.Form.Form;
import org.nlamah.QL.View.Controllers.FormRootViewController;
import org.nlamah.QLS.Builders.PageFinder;
import org.nlamah.QLS.Model.Abstract.StylesheetBlock;
import org.nlamah.QLS.Model.StylesheetBlock.Page;
import org.nlamah.QLS.Model.StylesheetBlock.Section;
import org.nlamah.QLS.Model.StylesheetBlock.Stylesheet;
public class RootFormViewControllerStyled extends FormRootViewController
{
private Stylesheet stylesheet;
private NavigationViewController navigationViewController;
private List<PageViewController> pageViewControllers;
private StylesheetBlock requestedBlock;
public RootFormViewControllerStyled(Form form, Stylesheet stylesheet)
{
super(form);
this.stylesheet = stylesheet;
navigationViewController = new NavigationViewController(stylesheet.pages(), this);
setupNavigationView();
restoreContentView();
createPageViewControllers(stylesheet.pages());
addPageViewsToView();
show(stylesheet);
}
private String identifierForPage(Page page)
{
int position = stylesheet.pages().indexOf(page);
return Integer.toString(position);
}
public Stylesheet stylesheet()
{
return stylesheet;
}
private PageViewController pageViewControllerForPage(Page page)
{
return pageViewControllers.get(stylesheet.pages().indexOf(page));
}
@Override
public void run()
{
showForm();
}
public void show(StylesheetBlock block)
{
requestedBlock = block;
Page requestedPage = null;
if (block instanceof Page)
{
requestedPage = (Page) block;
}
else if (block instanceof Section)
{
requestedPage = new PageFinder().pageForSection((Section) block);
}
else if (block instanceof Stylesheet)
{
requestedPage = ((Stylesheet) block).pages().get(0);
}
for (PageViewController pageViewController : pageViewControllers)
{
pageViewController.neededViewHeight();
}
PageViewController pageViewController = pageViewControllerForPage(requestedPage);
contentView.setPreferredSize(new Dimension(contentView.getPreferredSize().width, pageViewController.neededViewHeight()));
CardLayout cardLayout = (CardLayout) contentView.getLayout();
cardLayout.show(contentView, pageViewController.identifier());
}
@Override
public void modelStateChanged()
{
super.modelStateChanged();
if (requestedBlock != null)
{
show(requestedBlock);
}
}
private void setupNavigationView()
{
navigationView.setPreferredSize(new Dimension(UIConstants.navigationViewWidth(), navigationViewController.neededViewHeight()));
navigationView.add(navigationViewController.view);
}
private void restoreContentView()
{
contentView.removeAll();
contentView.setLayout(new CardLayout());
}
private void createPageViewControllers(List<Page> pages)
{
pageViewControllers = new ArrayList<PageViewController>();
for (Page page : pages)
{
pageViewControllers.add(new PageViewController((Form) modelElement, identifierForPage(page), page, this));
}
}
private void addPageViewsToView()
{
for (PageViewController pageViewController : pageViewControllers)
{
contentView.add(pageViewController.view, pageViewController.identifier());
contentView.setPreferredSize(new Dimension(UIConstants.contentWidth(), pageViewController.neededViewHeight()));
}
}
}