package com.rectang.xsm.types; import java.util.List; import java.util.Comparator; import com.rectang.xsm.XSM; import com.rectang.xsm.doc.DocElement; import com.rectang.xsm.doc.DocGroup; import com.rectang.xsm.doc.DocList; import org.jdom.Element; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.ResourceReference; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.model.Model; public class Glossary extends DocGroup { static QSortAlgorithm sort; public Glossary( java.lang.String name ) { super( name, new GlossaryItem( "item" ) ); sort = new QSortAlgorithm( compare ); } public WebMarkupContainer edit( String wicketId, Element node, String path ) { return new GlossaryPanel( wicketId, node, path ); } public void publish( Element node, StringBuffer s ) { List children = new java.util.Vector( node.getChildren( "item" ) ); node.removeChildren( "item" ); sort.sort( children ); node.addContent( children ); super.publish( node, s ); } static Comparator compare = new Comparator() { public int compare( Object o1, Object o2 ) { String o1term = ((Element) o1).getChildText( "term" ); String o2term = ((Element) o2).getChildText( "term" ); return String.CASE_INSENSITIVE_ORDER.compare( o1term, o2term ); } }; class GlossaryPanel extends Panel { public GlossaryPanel( final String wicketId, final Element node, final String path ) { super( wicketId ); add( new Label( "name", getName() ) ); List children = node.getChildren( element.getName() ); add( new ListView( "elements", children ) { protected void populateItem( ListItem listItem ) { final Element child = (Element) listItem.getModelObject(); final int i = listItem.getIndex(); Link add = new Link( "add" ) { public void onClick() { addChild( node, i ); } }; listItem.add( add.setVisible( listItem.getIndex() == 0 ) ); add.add( new Image( "add-icon", new ResourceReference( XSM.class, "icons/document-new.png" ) ) ); listItem.add( new Label( "add-label", new StringResourceModel( "add", add, new Model( element ) ) ) ); Link delete = new Link( "delete" ) { public void onClick() { //TODO add confirmation input delete( node, element.getName() + "@" + i ); } }; listItem.add( delete ); delete.add( new Image( "delete-icon", new ResourceReference( XSM.class, "icons/edit-delete.png" ) ) ); listItem.add( element.edit( "content", child, path + "/" + element.getName() + "@" + i ) ); } } ).setRenderBodyOnly( true ); } } } class GlossaryItem extends DocList { public GlossaryItem( String name ) { super( name, new DocElement[]{ new com.rectang.xsm.widget.String( "term" ), new com.rectang.xsm.widget.String( "full-term" ), new com.rectang.xsm.widget.TextArea( "definition" ) } ); } public void view( Element root, StringBuffer s ) { s.append( "<p class=\"xsm_glossary_term\">" ); elements[0].view( root.getChild( "term" ), s ); String full = root.getChildText( "full-term" ); if ( full != null && !full.equals( "" ) ) { s.append( " -- (" ); elements[1].view( root.getChild( "full-term" ), s ); s.append( ")" ); } s.append( "<br /><blockquote>" ); elements[2].view( root.getChild( "definition" ), s ); s.append( "</blockquote></p>\n" ); } public void publish( Element root, StringBuffer s ) { s.append( "<p class=\"xsm_glossary_term\">" ); elements[0].view( root.getChild( "term" ), s ); String full = root.getChildText( "full-term" ); if ( full != null && !full.equals( "" ) ) { s.append( " -- (" ); elements[1].view( root.getChild( "full-term" ), s ); s.append( ")" ); } s.append( "</p><blockquote class=\"xsm_glossary_definition\">" ); elements[2].view( root.getChild( "definition" ), s ); s.append( "</blockquote>\n" ); } } /* * @(#)QSortAlgorithm.java 1.6f 95/01/31 James Gosling * * Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and * without fee is hereby granted. * Please refer to the file http://java.sun.com/copy_trademarks.html * for further important copyright and trademark information and to * http://java.sun.com/licensing.html for further important licensing * information for the Java (tm) Technology. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. * * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). SUN * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR * HIGH RISK ACTIVITIES. */ /** * A quick sort demonstration algorithm * SortAlgorithm.java, Thu Oct 27 10:32:35 1994 * * @author James Gosling * @version 1.6f, 31 Jan 1995 */ /** * 19 Feb 1996: Fixed to avoid infinite loop discoved by Paul Haeberli. * Misbehaviour expressed when the pivot element was not unique. * -Jason Harrison * * 21 Jun 1996: Modified code based on comments from Paul Haeberli, and * Peter Schweizer (Peter.Schweizer@mni.fh-giessen.de). * Used Daeron Meyer's (daeron@geom.umn.edu) code for the * new pivoting code. - Jason Harrison * * 09 Jan 1998: Another set of bug fixes by Thomas Everth (everth@wave.co.nz) * and John Brzustowski (jbrzusto@gpu.srv.ualberta.ca). * * 05 Jan 2006: Adapted by Andrew Williams (andy@hndyande.co.uk) to modify List * objects using a Comparator instead of int arrays comparing ints. */ class QSortAlgorithm { private Comparator comp; public QSortAlgorithm( Comparator c ) { this.comp = c; } void sort( List a, int lo0, int hi0 ) { int lo = lo0; int hi = hi0; if ( lo >= hi ) { return; } else if ( lo == hi - 1 ) { /* * sort a two element list by swapping if necessary */ if ( comp.compare( a.get( lo ), a.get( hi ) ) > 0 ) { Object T = a.get( lo ); a.set( lo, a.get( hi ) ); a.set( hi, T ); } return; } /* * Pick a pivot and move it out of the way */ Object pivot = a.get( (lo + hi) / 2 ); a.set( (lo + hi) / 2, a.get( hi ) ); a.set( hi, pivot ); while ( lo < hi ) { /* * Search forward from a[lo] until an element is found that * is greater than the pivot or lo >= hi */ while ( comp.compare( a.get( lo ), pivot ) <= 0 && lo < hi ) { lo++; } /* * Search backward from a[hi] until element is found that * is less than the pivot, or lo >= hi */ while ( comp.compare( pivot, a.get( hi ) ) <= 0 && lo < hi ) { hi--; } /* * Swap elements a[lo] and a[hi] */ if ( lo < hi ) { Object T = a.get( lo ); a.set( lo, a.get( hi ) ); a.set( hi, T ); } } /* * Put the median in the "center" of the list */ a.set( hi0, a.get( hi ) ); a.set( hi, pivot ); /* * Recursive calls, elements a[lo0] to a[lo-1] are less than or * equal to pivot, elements a[hi+1] to a[hi0] are greater than * pivot. */ sort( a, lo0, lo - 1 ); sort( a, hi + 1, hi0 ); } void sort( List a ) { sort( a, 0, a.size() - 1 ); } }