/*
 * Copyright 2011 Serbian Object Laboratories (SOL)
 * 
 * Licensed under the GPL licence
 * 
 * http://www.gnu.org/licenses/gpl.html
 */
package companyorganization;

import rs.sol.soloist.helpers.init.DefaultContextInit;
import rs.sol.soloist.helpers.init.Initializer;
import rs.sol.soloist.helpers.init.InitializerFailedException;
import rs.sol.soloist.server.builtindomains.common.TextDescriptor;
import rs.sol.soloist.server.guiconfiguration.components.GUIApplicationComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIDeckComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIHTMLComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIImageComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUILabelComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUILinkComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIPanelComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIStatusBarComponent;
import rs.sol.soloist.server.guiconfiguration.construction.GUIComponentBinding;
import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIEdit;
import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIInput;
import rs.sol.soloist.server.guiconfiguration.layout.HorizontalAlignment;
import rs.sol.soloist.server.guiconfiguration.layout.TableLayoutData;
import rs.sol.soloist.server.guiconfiguration.layout.VerticalAlignment;
import rs.sol.soloist.server.guiconfiguration.nonvisualcompoments.GUIFindSingleInstanceSAPComponent;
import rs.sol.soloist.server.guiconfiguration.style.GUIContext;
import rs.sol.soloist.server.guiconfiguration.style.GUINavigatorFeature;
import rs.sol.soloist.server.guiconfiguration.style.GUIObjectSetting;
import rs.sol.soloist.server.guiconfiguration.style.GUIPictureFeature;
import rs.sol.soloist.server.guiconfiguration.style.GUITextFeature;
import rs.sol.soloist.server.server.SoloistServiceServlet;

public class ApplicationInit implements Initializer {

	public static final String SOL = "SOL";
	private static final String COPYRIGHT_TEXT = "Copyright &copy; 2011 - <a href='http://www.sol.rs/'>Serbian Object Laboratories (SOL)</a> - <a href='http://www.soloist4uml.com/pricing-and-licensing'>Licence</a>&nbsp;";
	private static final String TITLE = "SOLoist Demo - Company Organization";

	private GUIApplicationComponent application;
	private GUIContext context;
	private GUIPanelComponent mainPanel;

	private GUIPanelComponent titlePanel;
	private GUIDeckComponent centralPanel;
	private GUIPanelComponent departmentPanel;

	private GUIInput departmentTreeView;
	private GUIInput membersList;
	
	private GUIFindSingleInstanceSAPComponent rootDeptSAP;

	public void init() throws InitializerFailedException {

		application = new GUIApplicationComponent();
		SoloistServiceServlet.registerApplication(application);
		application.setName("CompanyOrganization");
		application.setTitle("Company Organization");
		
		context = new GUIContext();
		DefaultContextInit.getRoot().addContext(context);
		application.setContext(context);

		mainPanel = GUIPanelComponent.createVertical(application);
		mainPanel.setStyle("main_panel");

		// Title panel
		initTitlePanel();

		// Central panel
		centralPanel = GUIDeckComponent.create(GUIPanelComponent.createFlow(mainPanel));
		centralPanel.setStyle("centralPanel");
		
		rootDeptSAP = GUIFindSingleInstanceSAPComponent.create(centralPanel, Department.FQ_TYPE_NAME, Department.FQPropertyNames.name, TextDescriptor.create(SOL));
		rootDeptSAP.setMustExist(true);
		
		initDepartmentPanel();

		// Bottom panel
		initBottomPanel();

		// Style settings
		initStyle();
	}

	public void initTitlePanel() {

		titlePanel = GUIPanelComponent.createHorizontal(mainPanel);
		titlePanel.setStyle("titlePanel");
		titlePanel.setCellAlignment(null, VerticalAlignment.TOP);
		titlePanel.setCellSize("100%", "80");

		// Logo
		GUIImageComponent leftLogoComponent = GUIImageComponent.create(titlePanel, "res/img/logo-left.png");
		leftLogoComponent.setStyle("logo-image");
		leftLogoComponent.setCellSize("200", null);

		GUILabelComponent pageTitle = GUILabelComponent.create(titlePanel, TITLE, null);
		pageTitle.setStyle("page_title");

		GUILinkComponent poweredBy = GUILinkComponent.create(titlePanel, "Powered by SOLoist", "http://www.soloist4uml.com/");
		poweredBy.setStyle("poweredBy");
		
		poweredBy.setCellAlignment(null, VerticalAlignment.BOTTOM);
		
	}

	public void initDepartmentPanel() {

		departmentPanel = GUIPanelComponent.createVertical(GUIPanelComponent.createFlow(centralPanel));
		departmentPanel.setStyle("tablePanels");

		GUILabelComponent labelEmployeeTitle = GUILabelComponent.create(departmentPanel, "Departments details", null);
		labelEmployeeTitle.setStyle("titleLabel");

		GUIPanelComponent departmentDetailsPanel = GUIPanelComponent.createHorizontal(departmentPanel);
		departmentDetailsPanel.setStyle("tablePanels");

		// Department panel
		GUIPanelComponent treePanel = GUIPanelComponent.createVertical(departmentDetailsPanel);
		treePanel.setStyle("tablePanels");

		GUILabelComponent.create(treePanel, "Select Department: ", null);

		departmentTreeView = GUIInput.createTree(treePanel);
		departmentTreeView.setStyle("departments");
		GUIComponentBinding.create(rootDeptSAP.opValue(), departmentTreeView.ipCollection());

		GUIPanelComponent detailsPanel = GUIPanelComponent.createTable(departmentDetailsPanel);
		detailsPanel.setStyle("tablePanels");

		GUILabelComponent.create(detailsPanel, "Name: ", 0, 0);

		GUIEdit nameSlot = GUIEdit.createField(detailsPanel, Department.PROPERTIES.name, 0, 1);
		nameSlot.setSize("300px", "25px");

		GUILabelComponent lab3 = GUILabelComponent.create(detailsPanel, "Responsibility: ", 1, 0);
		lab3.setCellAlignment(null, VerticalAlignment.TOP);
		GUIEdit respSlotComponent = GUIEdit.createField(detailsPanel, Department.PROPERTIES.responsibility, 1, 1);
		respSlotComponent.setMultiline(true);
		respSlotComponent.setSize("300px", "100px");

		GUILabelComponent.create(detailsPanel, "Members: ", 3, 0);

		membersList = GUIInput.createList(detailsPanel, Department.PROPERTIES.members);
		membersList.setLayoutData(TableLayoutData.create(4, 0, 1, 2));
		membersList.setStyle("members");
		// end Department panel

		// Bindings for departments
		GUIComponentBinding.create(departmentTreeView.opValue(), nameSlot.ipElement());
		GUIComponentBinding.create(departmentTreeView.opValue(), respSlotComponent.ipElement());
		GUIComponentBinding.create(departmentTreeView.opValue(), membersList.ipSlotValueElement());

	}

	public void initBottomPanel() {

		GUIPanelComponent bottomPanel = GUIPanelComponent.createVertical(mainPanel);
		bottomPanel.setStyle("bottomPanel");		

		GUIPanelComponent statusBarPanel = GUIPanelComponent.createHorizontal(bottomPanel);
		statusBarPanel.setStyle("status_bar_panel");
		statusBarPanel.setCellSize("100%", null);
		
		GUILabelComponent statusBarLabel = GUILabelComponent.create(statusBarPanel, "Status bar: ", null);
		statusBarLabel.setCellSize("75px", null);
		statusBarLabel.setStyle("status_bar_label");

		GUIStatusBarComponent statusBar = GUIStatusBarComponent.create(statusBarPanel);
		statusBar.setStyle("status_bar");

		GUIHTMLComponent html = GUIHTMLComponent.create(statusBarPanel, COPYRIGHT_TEXT);
		html.setStyle("footer_panel");
		html.setCellAlignment(HorizontalAlignment.LEFT, null);
		html.setSize("400", null);
	}

	public void initStyle() {

		// Object setting for department
		GUIObjectSetting departmentOS = GUIObjectSetting.create(application.getContext(), Department.CLASSIFIER);
		GUIPictureFeature.createSmallIcon(departmentOS, "res/img/CompanyOrganizationIcons/3.01_Department1.png");
		GUITextFeature.createName(departmentOS, "name");
		GUINavigatorFeature.createSubnodes(departmentOS, "subDepts");

		// Object setting for employee
		GUIObjectSetting employeeOS = GUIObjectSetting.create(application.getContext(), Employee.CLASSIFIER);
		GUIPictureFeature.createSmallIcon(employeeOS, "res/img/CompanyOrganizationIcons/3.03_MaleEmployee2.png");
		GUITextFeature.createName(employeeOS, "name");

		// Tooltip for department
		GUITextFeature tooltipDepr = new GUITextFeature();
		tooltipDepr.setFixed(true);
		tooltipDepr.setTextValue("Double click to see details");
		departmentOS.addFeature(tooltipDepr);

	}
}
