001 /*
002 * Copyright 2002-2008 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.selection.dialog;
017
018 import java.awt.Window;
019
020 import javax.swing.JComponent;
021
022 import org.springframework.rules.closure.Closure;
023 import org.springframework.richclient.dialog.ApplicationDialog;
024 import org.springframework.richclient.layout.TableLayoutBuilder;
025 import org.springframework.util.Assert;
026 import org.springframework.util.StringUtils;
027
028 /**
029 * Base class for selection dialogs.
030 *
031 * @author Peter De Bruycker
032 */
033 public abstract class AbstractSelectionDialog extends ApplicationDialog {
034 private String description;
035
036 private Closure onSelectAction;
037 private Closure onAboutToShow;
038
039 public AbstractSelectionDialog(String title, Window parent) {
040 super(title, parent);
041 }
042
043 protected JComponent createDialogContentPane() {
044 TableLayoutBuilder builder = new TableLayoutBuilder();
045
046 JComponent selectionComponent = createSelectionComponent();
047 Assert.state(selectionComponent != null, "createSelectionComponent cannot return null");
048
049 if (StringUtils.hasText(description)) {
050 builder.cell(getComponentFactory().createLabelFor(description, selectionComponent));
051 builder.relatedGapRow();
052 builder.row();
053 }
054
055 builder.cell(selectionComponent);
056
057 return builder.getPanel();
058 }
059
060 protected abstract JComponent createSelectionComponent();
061
062 protected boolean onFinish() {
063 onSelect(getSelectedObject());
064 return true;
065 }
066
067 public void setDescription(String desc) {
068 Assert.isTrue(!isControlCreated(), "Set the description before the control is created.");
069
070 description = desc;
071 }
072
073 protected abstract Object getSelectedObject();
074
075 protected void onSelect(Object selection) {
076 if (onSelectAction != null) {
077 onSelectAction.call(selection);
078 }
079 else {
080 throw new UnsupportedOperationException("Either provide an onSelectAction or override the onSelect method");
081 }
082 }
083
084 public void setOnSelectAction(Closure onSelectAction) {
085 this.onSelectAction = onSelectAction;
086 }
087
088 public void setOnAboutToShow(Closure onAboutToShow) {
089 this.onAboutToShow = onAboutToShow;
090 }
091
092 protected void onAboutToShow() {
093 if(onAboutToShow != null) {
094 onAboutToShow.call(null);
095 }
096 }
097 }