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.awt.Frame;
034: import java.awt.event.ActionEvent;
035:
036: import javax.swing.*;
037: import javax.swing.border.EmptyBorder;
038:
039: import com.jgoodies.binding.tutorial.Album;
040: import com.jgoodies.binding.tutorial.TutorialUtils;
041: import com.jgoodies.forms.builder.PanelBuilder;
042: import com.jgoodies.forms.factories.Borders;
043: import com.jgoodies.forms.factories.ButtonBarFactory;
044: import com.jgoodies.forms.layout.CellConstraints;
045: import com.jgoodies.forms.layout.FormLayout;
046:
047: /**
048: * A dialog for editing an Album. Uses an AlbumEditorView to build
049: * the editor form and just adds buttons to accept or cancel the edit.
050: * These buttons trigger a commit or flush in the dialog's PresentationModel.
051: *
052: * @author Karsten Lentzsch
053: * @version $Revision: 1.15 $
054: *
055: * @see AlbumEditorView
056: * @see AlbumManagerModel
057: * @see com.jgoodies.binding.tutorial.AlbumPresentationModel
058: * @see com.jgoodies.binding.PresentationModel
059: */
060:
061: public final class AlbumEditorDialog extends JDialog {
062:
063: /**
064: * Holds the edited album and vends ValueModels that adapt album properties.
065: */
066: private final BufferedAlbumPresentationModel albumPresentationModel;
067:
068: /**
069: * Will be set to <code>true</code> if the dialog is canceled.
070: *
071: * @see #hasBeenCanceled()
072: */
073: private boolean canceled;
074:
075: // Instance Creation ******************************************************
076:
077: /**
078: * Constructs an AlbumEditorDialog for the given Album.
079: *
080: * @param parent this dialog's parent frame
081: * @param album the Album to be edited
082: */
083: public AlbumEditorDialog(Frame parent, Album album) {
084: super (parent, "Album Editor", true);
085: this .albumPresentationModel = new BufferedAlbumPresentationModel(
086: album);
087: canceled = false;
088: }
089:
090: // Dialog Life Cycle ******************************************************
091:
092: /**
093: * Builds the dialog content, marks it as not canceled and makes it visible.
094: */
095: public void open() {
096: build();
097: canceled = false;
098: setVisible(true);
099: }
100:
101: /**
102: * Closes the dialog: releases obsolete bindings, and disposes the dialog,
103: * which in turn releases all required OS resources.
104: */
105: public void close() {
106: release();
107: dispose();
108: }
109:
110: /**
111: * Checks and answers whether the dialog has been canceled.
112: * This indicator is set in #doAccept and #doCancel.
113: *
114: * @return true indicates that the dialog has been canceled
115: */
116: public boolean hasBeenCanceled() {
117: return canceled;
118: }
119:
120: /**
121: * Removes listeners from the dialog's Album that are created
122: * by the PresentationModel when requesting adapting ValueModels
123: * via <code>#getModel</code> or <code>#getBufferedModel</code>.
124: * Setting the presentation model's bean to <code>null</code>
125: * removes all these listeners.
126: *
127: * @see com.jgoodies.binding.PresentationModel
128: * @see com.jgoodies.binding.beans.BeanAdapter#release()
129: */
130: private void release() {
131: albumPresentationModel.setBean(null);
132: }
133:
134: // Building ***************************************************************
135:
136: /**
137: * Builds the dialog's content pane, packs it, sets the resizable property,
138: * and locates it on the screen. The dialog is then ready to be opened.<p>
139: *
140: * Subclasses should rarely override this method.
141: */
142: private void build() {
143: setContentPane(buildContentPane());
144: pack();
145: setResizable(false);
146: TutorialUtils.locateOnOpticalScreenCenter(this );
147: }
148:
149: private JComponent buildContentPane() {
150: FormLayout layout = new FormLayout("fill:pref",
151: "fill:pref, 6dlu, pref");
152: PanelBuilder builder = new PanelBuilder(layout);
153: builder.getPanel().setBorder(new EmptyBorder(18, 12, 12, 12));
154: CellConstraints cc = new CellConstraints();
155: builder.add(buildEditorPanel(), cc.xy(1, 1));
156: builder.add(buildButtonBar(), cc.xy(1, 3));
157: return builder.getPanel();
158: }
159:
160: private JComponent buildEditorPanel() {
161: return new AlbumEditorView(albumPresentationModel).buildPanel();
162: }
163:
164: private JComponent buildButtonBar() {
165: JPanel bar = ButtonBarFactory.buildOKCancelBar(new JButton(
166: new OKAction()), new JButton(new CancelAction()));
167: bar.setBorder(Borders.BUTTON_BAR_GAP_BORDER);
168: return bar;
169: }
170:
171: // Actions ****************************************************************
172:
173: private final class OKAction extends AbstractAction {
174:
175: private OKAction() {
176: super ("OK");
177: }
178:
179: public void actionPerformed(ActionEvent e) {
180: albumPresentationModel.triggerCommit();
181: canceled = false;
182: close();
183: }
184: }
185:
186: private final class CancelAction extends AbstractAction {
187:
188: private CancelAction() {
189: super ("Cancel");
190: }
191:
192: public void actionPerformed(ActionEvent e) {
193: albumPresentationModel.triggerFlush();
194: canceled = true;
195: close();
196: }
197: }
198:
199: }
|