Revision: 596 http://skycastle.svn.sourceforge.net/skycastle/?rev=596&view=rev Author: zzorn Date: 2008-09-18 23:13:09 +0000 (Thu, 18 Sep 2008) Log Message: ----------- Working on multi-sketch support Modified Paths: -------------- trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchController.java trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchView.java trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/model/SketchImpl.java trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryNodeRenderer.java trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryViewModel.java trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultShelfRenderer.java trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultTomeRenderer.java trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibraryViewModel.java trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/ListLibraryView.java Added Paths: ----------- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibrarySelectionListener.java Modified: trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchController.java =================================================================== --- trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchController.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchController.java 2008-09-18 23:13:09 UTC (rev 596) @@ -21,13 +21,9 @@ import org.skycastle.util.command.AbstractCommand; import org.skycastle.util.command.Command; import org.skycastle.util.command.CommandAction; -import org.skycastle.util.library.Library; -import org.skycastle.util.library.LibraryImpl; -import org.skycastle.util.library.LibraryLocationImpl; -import org.skycastle.util.library.Tome; +import org.skycastle.util.library.*; import org.skycastle.util.library.tomesources.MemoryTomeSource; -import org.skycastle.util.library.view.DefaultTomeRenderer; -import org.skycastle.util.library.view.ListLibraryView; +import org.skycastle.util.library.view.*; import org.skycastle.util.sample.DataSample; import javax.swing.*; @@ -168,7 +164,7 @@ private SidebarImpl createSketchViews() { - final SidebarImpl sidebar = new SidebarImpl( SidebarEdge.LEFT, 300 ); + final SidebarImpl sidebar = new SidebarImpl( SidebarEdge.LEFT, 88 ); sidebar.addSidebarComponent( new AbstractSidebarComponent() { @@ -178,7 +174,7 @@ protected JComponent createUi() { - final DefaultTomeRenderer<Sketch> sketchTomeRenderer = new DefaultTomeRenderer<Sketch>() + final DefaultTomeRenderer<Sketch> sketchTomeRenderer = new DefaultTomeRenderer<Sketch>( false ) { @Override protected Icon getPreviewIcon( final Tome<Sketch> node ) @@ -188,9 +184,22 @@ } }; - final ListLibraryView listLibraryView = new ListLibraryView<Sketch>( mySketchLibrary, - new LibraryLocationImpl(), - sketchTomeRenderer ); + LibraryViewModel<Sketch> model = new DefaultLibraryViewModel<Sketch>( mySketchLibrary, new LibraryLocationImpl() ); + final ListLibraryView listLibraryView = new ListLibraryView<Sketch>( model, + sketchTomeRenderer, + new DefaultShelfRenderer() ); + model.addLibrarySelectionListener( new LibrarySelectionListener<Sketch>() + { + public void onTomeActivated( final Tome<Sketch> activatedTome ) + { + setSketch( activatedTome.getContent() ); + } + + public void onLocationNaviagtedTo( final LibraryLocation location ) + { + // Nothing to do + } + } ); return listLibraryView.getUi(); } } ); @@ -277,7 +286,7 @@ final LoadAction loadAction ) { // TODO: One undo stack per sketch - view.addMenuAction( "File", new CommandAction( getCommandStack(), "New Sketch", "Create a new Sketch" ) + final CommandAction newSketchAction = new CommandAction( getCommandStack(), "New Sketch", "Create a new Sketch" ) { protected Command createCommand() { @@ -291,12 +300,15 @@ } }; } - } ); + }; + + view.addMenuAction( "File", newSketchAction ); view.addMenuAction( "File", saveAsAction ); view.addMenuAction( "File", loadAction ); view.addMenuAction( "File", getExitAction() ); view.addMenuAction( "Edit", getCommandStack().getUndoAction() ); view.addMenuAction( "Edit", getCommandStack().getRedoAction() ); + view.addToolbarAction( newSketchAction ); view.addToolbarAction( saveAsAction ); view.addToolbarAction( getCommandStack().getUndoAction() ); view.addToolbarAction( getCommandStack().getRedoAction() ); Modified: trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchView.java =================================================================== --- trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchView.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/SketchView.java 2008-09-18 23:13:09 UTC (rev 596) @@ -16,7 +16,8 @@ * @author Hans Häggström */ // TODO: Have both a navigation stack and an undo stack, that are independent -public final class SketchView +public final class + SketchView extends Canvas3DApplicationView { Modified: trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/model/SketchImpl.java =================================================================== --- trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/model/SketchImpl.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/sketch/model/SketchImpl.java 2008-09-18 23:13:09 UTC (rev 596) @@ -3,6 +3,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; import org.skycastle.scratchpad.sketch.model.group.Group; import org.skycastle.scratchpad.sketch.model.group.GroupImpl; +import org.skycastle.util.ImageUtils; import java.awt.image.BufferedImage; @@ -22,7 +23,7 @@ @XStreamAlias( "root" ) private final Group myRootGroup = new GroupImpl(); - private transient BufferedImage myPreview = null; + private transient BufferedImage myPreview = ImageUtils.createPlaceholderPicture( 100, 100 ); //====================================================================== // Public Methods Modified: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryNodeRenderer.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryNodeRenderer.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryNodeRenderer.java 2008-09-18 23:13:09 UTC (rev 596) @@ -15,6 +15,7 @@ { private final Color myBackgroundColor; private final Icon myIcon; + private final boolean myShowLabel; public DefaultLibraryNodeRenderer() { @@ -28,10 +29,16 @@ public DefaultLibraryNodeRenderer( final Color backgroundColor, final Icon icon ) { + this( backgroundColor, icon, true ); + } + + public DefaultLibraryNodeRenderer( final Color backgroundColor, final Icon icon, final boolean showLabel ) + { ParameterChecker.checkNotNull( backgroundColor, "backgroundColor" ); myBackgroundColor = backgroundColor; myIcon = icon; + myShowLabel = showLabel; } @Override @@ -50,13 +57,30 @@ label.setBackground( getNodeBackgroundColor( node ) ); } - label.setText( getNodeName( node ) ); - label.setToolTipText( getNodeDescription( node ) ); + label.setText( getLabelText( node ) ); + label.setToolTipText( getTooltip( node ) ); label.setIcon( getPreviewIcon( node ) ); return label; } + private String getLabelText( final T node ) + { + String labelText = null; + if ( myShowLabel ) + { + labelText = getNodeName( node ); + } + return labelText; + } + + private String getTooltip( final T node ) + { + final String description = getNodeDescription( node ); + final String tooltip = description == null || description.length() == 0 ? getNodeName( node ) : description; + return tooltip; + } + protected Color getNodeBackgroundColor( final T node ) { return myBackgroundColor; Modified: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryViewModel.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryViewModel.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultLibraryViewModel.java 2008-09-18 23:13:09 UTC (rev 596) @@ -21,6 +21,8 @@ private final List<LibraryNode<T>> myCurrentlyVisibleNodes = new ArrayList<LibraryNode<T>>(); + private final List<LibrarySelectionListener<T>> myListeners = new ArrayList<LibrarySelectionListener<T>>(); + public DefaultListModel getListModel() { return myListModel; @@ -41,6 +43,26 @@ return myViewedLocation; } + public void addLibrarySelectionListener( LibrarySelectionListener<T> addedLibrarySelectionListener ) + + { + ParameterChecker.checkNotNull( addedLibrarySelectionListener, "addedLibrarySelectionListener" ); + ParameterChecker.checkNotAlreadyContained( addedLibrarySelectionListener, myListeners, "myListeners" ); + + myListeners.add( addedLibrarySelectionListener ); + } + + public void removeLibrarySelectionListener( + LibrarySelectionListener<T> removedLibrarySelectionListener ) + + { + ParameterChecker.checkNotNull( removedLibrarySelectionListener, "removedLibrarySelectionListener" ); + ParameterChecker.checkContained( removedLibrarySelectionListener, myListeners, "myListeners" ); + + myListeners.remove( removedLibrarySelectionListener ); + } + + public void setViewedLocation( final LibraryLocation viewedLocation ) { ParameterChecker.checkNotNull( viewedLocation, "viewedLocation" ); @@ -51,8 +73,14 @@ myListModel.clear(); updateListModel(); + + for ( LibrarySelectionListener<T> listener : myListeners ) + { + listener.onLocationNaviagtedTo( myViewedLocation ); + } } + public void onItemActivated( final LibraryNode<T> selectedValue ) { if ( selectedValue instanceof Shelf ) @@ -65,8 +93,10 @@ { Tome<T> tome = (Tome<T>) selectedValue; - // TODO: Notify listener about tome activation - throw new UnsupportedOperationException( "This method has not yet been implemented." ); // IMPLEMENT + for ( LibrarySelectionListener<T> listener : myListeners ) + { + listener.onTomeActivated( tome ); + } } } Modified: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultShelfRenderer.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultShelfRenderer.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultShelfRenderer.java 2008-09-18 23:13:09 UTC (rev 596) @@ -2,6 +2,7 @@ import org.skycastle.util.library.Shelf; +import javax.swing.*; import java.awt.Color; /** @@ -17,4 +18,13 @@ super( BACKGROUND_COLOR ); } + public DefaultShelfRenderer( final boolean showLabel ) + { + super( BACKGROUND_COLOR, null, showLabel ); + } + + public DefaultShelfRenderer( final Color backgroundColor, final Icon icon, final boolean showLabel ) + { + super( backgroundColor, icon, showLabel ); + } } Modified: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultTomeRenderer.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultTomeRenderer.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/DefaultTomeRenderer.java 2008-09-18 23:13:09 UTC (rev 596) @@ -2,6 +2,7 @@ import org.skycastle.util.library.Tome; +import javax.swing.*; import java.awt.Color; /** @@ -16,4 +17,14 @@ { super( BACKGROUND_COLOR ); } + + public DefaultTomeRenderer( final boolean showLabel ) + { + super( BACKGROUND_COLOR, null, showLabel ); + } + + public DefaultTomeRenderer( final Color backgroundColor, final Icon icon, final boolean showLabel ) + { + super( backgroundColor, icon, showLabel ); + } } Added: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibrarySelectionListener.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibrarySelectionListener.java (rev 0) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibrarySelectionListener.java 2008-09-18 23:13:09 UTC (rev 596) @@ -0,0 +1,37 @@ +package org.skycastle.util.library.view; + +import org.skycastle.util.library.LibraryLocation; +import org.skycastle.util.library.LibraryNode; +import org.skycastle.util.library.Tome; + +/** + * A listener that is notified when a {@link Tome} is selected from the {@link Library}. + * + * @author Hans Haggstrom + */ +public interface LibrarySelectionListener<T> +{ +/* + */ +/** + * Called when the currently focused {@link LibraryNode} changes during navigation of the library. + * @param focusedLibraryNode + */ +/* + void onLibraryNodeFocused( LibraryNode<T> focusedLibraryNode ); +*/ + + /** + * Called when a Tome is activated (double clicked, etc). + * + * @param activatedTome + */ + void onTomeActivated( Tome<T> activatedTome ); + + /** + * Called when the specified shelf is navigated to. + * + * @param location the navigated to shelf, which is now shown. + */ + void onLocationNaviagtedTo( LibraryLocation location ); +} Modified: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibraryViewModel.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibraryViewModel.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/LibraryViewModel.java 2008-09-18 23:13:09 UTC (rev 596) @@ -19,4 +19,21 @@ void setViewedLocation( LibraryLocation viewedLocation ); void onItemActivated( final LibraryNode<T> selectedValue ); + + + /** + * Adds the specified LibrarySelectionListener. + * + * @param addedLibrarySelectionListener should not be null or already added. + */ + void addLibrarySelectionListener( LibrarySelectionListener<T> addedLibrarySelectionListener ); + + /** + * Removes the specified LibrarySelectionListener. + * + * @param removedLibrarySelectionListener + * should not be null, and should be present. + */ + void removeLibrarySelectionListener( + LibrarySelectionListener<T> removedLibrarySelectionListener ); } Modified: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/ListLibraryView.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/ListLibraryView.java 2008-09-17 17:02:07 UTC (rev 595) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/library/view/ListLibraryView.java 2008-09-18 23:13:09 UTC (rev 596) @@ -54,18 +54,32 @@ * @param tomeRenderer used to render the {@link Tome}s in the list. * @param shelfRenderer used to render the {@link Shelf}s in the list. */ - public ListLibraryView( final Library library, + public ListLibraryView( final Library<T> library, final LibraryLocation viewedLocation, final ListCellRenderer tomeRenderer, final ListCellRenderer shelfRenderer ) { + this( new DefaultLibraryViewModel<T>( library, viewedLocation ), tomeRenderer, shelfRenderer ); + ParameterChecker.checkNotNull( library, "library" ); ParameterChecker.checkNotNull( viewedLocation, "viewedLocation" ); + } + + /** + * @param libraryViewModel the {@link LibraryViewModel} to visualize. + * @param tomeRenderer used to render the {@link Tome}s in the list. + * @param shelfRenderer used to render the {@link Shelf}s in the list. + */ + public ListLibraryView( final LibraryViewModel<T> libraryViewModel, + final ListCellRenderer tomeRenderer, + final ListCellRenderer shelfRenderer ) + { + ParameterChecker.checkNotNull( libraryViewModel, "libraryViewModel" ); ParameterChecker.checkNotNull( tomeRenderer, "tomeRenderer" ); ParameterChecker.checkNotNull( shelfRenderer, "shelfRenderer" ); myCellRenderer = new LibraryNodeRenderer( tomeRenderer, shelfRenderer ); - myLibraryViewModel = new DefaultLibraryViewModel( library, viewedLocation ); + myLibraryViewModel = libraryViewModel; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.