This is an old revision of the document!


Menus Sample

This sample introduces menu components and presents different menu styles.

Live example

UML Model

None.

Business Logic Code

None.

GUI Code

package rs.sol.sampleapps;
 
import org.apache.commons.lang.ArrayUtils;
 
import rs.sol.soloist.helpers.init.Initializer;
import rs.sol.soloist.helpers.init.InitializerFailedException;
import rs.sol.soloist.server.builtindomains.builtindatatypes.Text;
import rs.sol.soloist.server.guiconfiguration.components.GUIApplicationComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIDeckComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUILabelComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUILinkComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIMenuComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIMenuItemComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIPanelComponent;
import rs.sol.soloist.server.guiconfiguration.construction.GUIComponentBinding;
import rs.sol.soloist.server.guiconfiguration.nonvisualcompoments.GUIBufferComponent;
import rs.sol.soloist.server.server.SoloistServiceServlet;
 
public enum Menus implements Initializer {
 
	INSTANCE;
 
	private GUIPanelComponent[] array;
	private String[] strings;
 
	@Override
	public void init() throws InitializerFailedException {
		GUIApplicationComponent application = new GUIApplicationComponent();
		application.name.set(Text.fromString("MenusSample"));
		SoloistServiceServlet.registerApplication(application);
		GUIPanelComponent root = GUIPanelComponent.createFlow(application);
 
		GUILabelComponent title = GUILabelComponent.create(root, "Menus");
		title.styleName.set(Text.fromString("titleStyle"));
 
		GUIPanelComponent menuPanel = GUIPanelComponent.createFlow(root);
		GUIDeckComponent deck = GUIDeckComponent.create(root);
 
		strings = new String[] {"", "A", "A1", "A2", "B", "B1", "B2", "C", "C1", "C2", "D", "D1", "D2", "E", "E1", "E2", "F", "F1", "F2", "G", "G1", "G2", "H"};
		array = new GUIPanelComponent[strings.length];
		for (int i = 0; i < strings.length; i++) {
			array[i] = GUIPanelComponent.createFlow(deck);
			GUILabelComponent.create(array[i], strings[i]).styleName.set(Text.fromString("largeText"));
		}
 
		createGWTMenu(menuPanel, true);
		createGWTMenu(menuPanel, false);
		createDropDownMenu(menuPanel);
    }
	/**
	 * Custom drop down menu using links, depends highly on CSS 
	 */
	private void createDropDownMenu(GUIPanelComponent mainPanel) {
		GUIPanelComponent menu = GUIPanelComponent.createFlow(mainPanel);
		menu.styleName.set(Text.fromString("#menu"));
 
		GUIPanelComponent menuWrapper = GUIPanelComponent.createFlow(menu);
		menuWrapper.styleName.set(Text.fromString("#menu_wrapper"));
 
		GUILinkComponent[] links = new GUILinkComponent[strings.length];
 
		for (int i = 0; i < strings.length; i++) {
			if (i == 0) {
				links[i] = GUILinkComponent.create(menuWrapper, "Home", "javascript:void");
				links[i].styleName.set(Text.fromString("sol-Link-active"));
			} else if (i == strings.length - 1) {
				links[i] = GUILinkComponent.create(menuWrapper, "H", "javascript:void");
			} else if (i % 3 == 1){
				GUIPanelComponent top = GUIPanelComponent.createFlow(menuWrapper);
				top.styleName.set(Text.fromString("#topmenu"));
				links[i] = GUILinkComponent.create(top, strings[i], "javascript:void");
				GUIPanelComponent sub = GUIPanelComponent.createFlow(top);
				sub.styleName.set(Text.fromString("#submenu"));
				links[i + 1] = GUILinkComponent.create(sub, strings[i + 1], "javascript:void");
				links[i + 2] = GUILinkComponent.create(sub, strings[i + 2], "javascript:void");
			}
			GUIComponentBinding.create(links[i].openLink, array[i].show);
		}
 
		menuHighlighter(mainPanel, links[0], (GUILinkComponent[]) ArrayUtils.subarray(links, 1, strings.length));
	}
 
	/**
	 *	Highlights selected menu or sub-menu. 
	 */
	private void menuHighlighter(GUIPanelComponent container, GUILinkComponent home, GUILinkComponent... orderedMenuLinks) {
		GUIBufferComponent[] highlightBuffers = new GUIBufferComponent[orderedMenuLinks.length / 3 + 1];
		GUIBufferComponent homeBuffer = GUIBufferComponent.create(container, false, Text.fromString("active"));
		GUIComponentBinding.create(homeBuffer.output, home.addStyle); // addStyle pin changes CSS class adding "active"
		GUIComponentBinding.create(home.openLink, homeBuffer.send);
		for (int i = 0; i < orderedMenuLinks.length; i++) {
			if (i % 3 == 0) {
				highlightBuffers[i / 3] = GUIBufferComponent.create(container, false, Text.fromString("active"));
				GUIComponentBinding.create(highlightBuffers[i / 3].output, orderedMenuLinks[i].addStyle);
				GUIComponentBinding.create(orderedMenuLinks[i].openLink, highlightBuffers[i / 3].send);
				for (int j = 0; j < orderedMenuLinks.length; j += 3)
					if (!orderedMenuLinks[j].equals(orderedMenuLinks[i]))
						GUIComponentBinding.create(highlightBuffers[i / 3].output, orderedMenuLinks[j].removeStyle);
				GUIComponentBinding.create(homeBuffer.output, orderedMenuLinks[i].removeStyle);
				GUIComponentBinding.create(highlightBuffers[i / 3].output, home.removeStyle);
			} else {
				GUIComponentBinding.create(orderedMenuLinks[i].openLink, highlightBuffers[i / 3].send);
			}
		}
	}
 
	private void createGWTMenu(GUIPanelComponent mainPanel, boolean isHorizontal) {
		GUIMenuComponent myMainMenu = GUIMenuComponent.create(mainPanel, isHorizontal);
		GUIMenuItemComponent[] items = new GUIMenuItemComponent[strings.length];
 
		for (int i = 0; i < strings.length; i++) {
			if (i == 0) {
				items[i] = GUIMenuItemComponent.create(myMainMenu);
		    	items[i].text.set(Text.fromString("Home"));
			} else if (i == strings.length - 1) {
				items[i] = GUIMenuItemComponent.create(myMainMenu);
		    	items[i].text.set(Text.fromString(strings[i]));
			} else if (i % 3 == 1){
				items[i] = GUIMenuItemComponent.create(myMainMenu);
		    	items[i].text.set(Text.fromString(strings[i]));
		    	GUIMenuComponent subA = GUIMenuComponent.create(items[i], !isHorizontal);
		    	items[i + 1] = GUIMenuItemComponent.create(subA);
		    	items[i + 1].text.set(Text.fromString(strings[i + 1]));
		    	items[i + 2] = GUIMenuItemComponent.create(subA);
		    	items[i + 2].text.set(Text.fromString(strings[i + 2]));
			}
			GUIComponentBinding.create(items[i].click, array[i].show);
		}
	}
 
}
Print/export