[thelist] Java Logic question for you experts

Tom Dell'Aringa pixelmech at yahoo.com
Wed Oct 19 16:23:25 CDT 2005


I've got a logic issue I can't get my head around. The situation is that I have inherited an old
installation of an Epicentric Portal (internal) that was customized years ago. The nav currently
uses images written out by a jsp. It's horribly slow, so I'm attempting to rewrite the code to use
text only, with styled ULs instead. 

I got to the point where I removed the images and was able to use the code to write out a nice UL
with every nav item (vertically) as a LI, with an anchor inside. It works where if you click on a
nav item that has children, they show up fine, but the style is off. My first solution was to
write a class to the various levels of navigation (n1-n4, below) and indent the LIs. It will work,
but it's kludgy, and the presentation will not be how I want it.

What I really want is to have each level of navigation, as you drill down, be its OWN UL. Like so:

<ul>
<li>level one
   <ul>
     <li>level two
        <ul>
            <li>level three</li>
            <li>level three</li>
        </ul>
     </li>
     <li>level two</li>
     <li>level two</li>
   </ul>
</li>
<li>level one</li>
<li>level one</li>
</ul>

That will allow me to do all the nifty CSS things I want to do. Problem is, I can't figure out how
to do that. Below is the code that I have which I think is 90% there. At the point where the line:

if (node.isSelected() | node.wasSelected()) {

is where I'm currently writing out an 'active' class, and I think that is where the nested UL
should begin. I cannot seem to figure out how to write all the nested LIs within the correct UL.
The stuff I tried (commented out) only got me ONE LI in a nested UL, not right. 

The code below is all I have access to - there is nothing else. Hopefully someone can shed some
light on this problem. My best guess is there needs to be another while loop possibly comparing
indentWidth values...but I can't get anything to work.

Any help is greatly appreciated!

Code below:
--------------------------------------------
<%
	Iterator verticalNodes = nodesInVerticalOrder.iterator();
	if (!verticalNodes.hasNext()) return;

	StringBuffer dataCell = new StringBuffer();
	StringBuffer javaScript = new StringBuffer(); 
	
	int jscriptindex = 1;
	int navindex = 1;	// current iteration through the nav generation loop
	int selectedindex = 0;	// menu item that should be set as selected
	
	// start UL
	dataCell.append("<ul>");

	// iterate through each nav item and write it out
	while (verticalNodes.hasNext()) {

		MenuItemNode node = (MenuItemNode) verticalNodes.next();

		int level = node.getLevel();
		// indentWidth will be 7,14,21 or 28 - indicating what level the nav is at
		String indentWidth = String.valueOf((1+level-startLevel) * 7); 
		int i = Integer.parseInt(indentWidth);
		String className = "";
		
		// set a classname to indent the LIs
		switch (i) {
		  case 7 :
		    className = "n1";
		    break;
		  case 14 :
		    className = "n2";
		    break;
		  case 21 :
		    className = "n3";
		    break;
		  case 28 :
		    className = "n4";
		    break;
		  default :
		    className = "";
		    break;
		}
		
		// begin new list item, write out class name
		dataCell.append("<li class=\"" +className+ "\">");
		
		// possibly write out sub ULs - but seems to only write out one at a time, not the
		// full block we need...
		/*if (node.isSelected() | node.wasSelected()) {
			dataCell.append("<ul><li>");
		}*/
		
		dataCell.append("<a href=\"");
		dataCell.append(node.getHref() + "\"");
		
		// write a class on the active path links to highlight them
		if (node.isSelected() | node.wasSelected()) {
			dataCell.append(" class='active'");
		}
		
		//close the href, write the anchor text, close the anchor.
		dataCell.append(">" + node.getTitle() + ""); 
		dataCell.append("</a>");
		
		// end sub UL..not working yet..
		/*if (node.isSelected()  | node.wasSelected()) {
			dataCell.append("</li></ul>");
		}*/
		
		//close the LI item
		dataCell.append("</li>\n");
	}
	
	// close out the UL
	dataCell.append("</ul>");
%>


<!-- begin output of nav -->
<div id="svmp_vert">
<%= dataCell.toString() %>
</div>
<!-- end Nav-Vert Area -->
------------

Thanks,

Tom


http://www.pixelmech.com/

A man spoke frantically into the phone: "My wife is pregnant and her contractions are only two minutes apart"! "Is this her first child?" the doctor asked. "No, you idiot!" the man shouted. "This is her husband!"

Q: What do you call a muddy chicken who crossed the road two times?
A: A dirty double crosser...



More information about the thelist mailing list