001: /*
002: * Copyright (c) 2002-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.binding.tutorial.manager;
032:
033: import java.beans.PropertyChangeEvent;
034: import java.beans.PropertyChangeListener;
035:
036: import com.jgoodies.binding.tutorial.Album;
037: import com.jgoodies.binding.tutorial.AlbumPresentationModel;
038:
039: /**
040: * In addition to its superclass AlbumPresentationModel this class provides
041: * a bound read-only property and presentation logic for views that present
042: * buffered Album contents.<p>
043: *
044: * The <em>bufferedComposerEnabled</em> property is true if and only if
045: * the underlying Album is non-<code>null</code> and the buffered classical
046: * property is true. This aggregated property is intended to be used by views
047: * that present buffered albums and want to indicate the composer enablement.<p>
048: *
049: * Also, this buffered presentation model adds presentation logic that
050: * is copied from the domain: if the buffered classical property is deselected,
051: * the buffered composer content is set to <code>null</code>.<p>
052: *
053: * This code could be moved to the AlbumPresentationModel. But I wanted to
054: * keep the AlbumPresentationModel close to the example that Martin Fowler
055: * uses to describe the
056: * <a href="http://martinfowler.com/eaaDev/PresentationModel.html">Presentation
057: * Model</a> pattern.
058: *
059: * @author Karsten Lentzsch
060: * @version $Revision: 1.6 $
061: *
062: * @see AlbumPresentationModel
063: */
064: public final class BufferedAlbumPresentationModel extends
065: AlbumPresentationModel {
066:
067: /**
068: * The name of the bound read-only property that indicates that a buffered
069: * presentation for the composer property should be enabled/disabled,
070: * editable/not editable, or visible/hidden.
071: *
072: * @see #isBufferedComposerEnabled()
073: */
074: public static final String PROPERTYNAME_BUFFERED_COMPOSER_ENABLED = "bufferedComposerEnabled";
075:
076: // Instance Creation ******************************************************
077:
078: /**
079: * Constructs a BufferedAlbumPresentationModel for the given Album.
080: *
081: * @param album the initial Album to adapt and work with
082: */
083: public BufferedAlbumPresentationModel(Album album) {
084: super (album);
085: initEventHandling();
086: }
087:
088: // Initialization *********************************************************
089:
090: /**
091: * Registers a listener that is notified about changes in the
092: * buffered classical property of the current Album or a new Album.
093: * That in turn fire a change of the buffered composer enabled property
094: * and resets the buffered composer content, if the buffered classical
095: * property is false.
096: */
097: private void initEventHandling() {
098: getBufferedModel(Album.PROPERTYNAME_CLASSICAL)
099: .addValueChangeListener(
100: new BufferedClassicalChangeHandler());
101: }
102:
103: // Accessing Aggregated Properties ****************************************
104:
105: /**
106: * Checks and answers if the underlying Album is non-<code>null</code>
107: * and the buffered classical property is true. This property is intended
108: * to be used with a variety of presentation styles that indicate that
109: * a composer is absent and cannot be edited. For example a presentations
110: * may choose to switch the view's enablement or the editable state,
111: * or it may hide or show a field or editor section.
112: *
113: * @return true if this model's current Album is non-<code>null</code>
114: * and the buffered classical property is true.
115: */
116: public boolean isBufferedComposerEnabled() {
117: return isBufferedClassical();
118: }
119:
120: /**
121: * Checks and answers if the underlying Album is non-<code>null</code>
122: * and the buffered classical property is true.
123: *
124: * @return true if this model's current Album is non-<code>null</code>
125: * and the buffered classical property is true.
126: */
127: private boolean isBufferedClassical() {
128: return Boolean.TRUE.equals(getBufferedModel(
129: Album.PROPERTYNAME_CLASSICAL).getValue());
130: }
131:
132: // Event Handling *********************************************************
133:
134: /**
135: * Copies domain logic for the buffered album. If the buffered
136: * classical property has changed, the buffered composer enabled
137: * property is updated and the buffered composer name is reset.
138: */
139: private final class BufferedClassicalChangeHandler implements
140: PropertyChangeListener {
141:
142: /**
143: * The Album's buffered classical property has changed. Notifies
144: * listeners about a change in the "bufferedComposerEnabled" property.
145: * Fires an event that uses <code>null</code> as old value, and the
146: * current value of this model's "bufferedComposerEnabled" property
147: * as new value.<p>
148: *
149: * Also sets the buffered composer content to <code>null</code>,
150: * if the buffered classical property is false.
151: *
152: * @param evt the event that describes the classical change
153: */
154: public void propertyChange(PropertyChangeEvent evt) {
155: firePropertyChange(PROPERTYNAME_BUFFERED_COMPOSER_ENABLED,
156: null, Boolean.valueOf(isBufferedComposerEnabled()));
157: if (!isBufferedClassical()) {
158: getBufferedModel(Album.PROPERTYNAME_COMPOSER).setValue(
159: null);
160: }
161: }
162: }
163:
164: }
|