This is an old revision of the document!


Menus

Menus is a SOLoist sample application that demonstrates menu components and 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 the 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