001 /* 002 * Copyright 2002-2004 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.factory; 017 018 import javax.swing.JComponent; 019 020 import org.springframework.richclient.application.support.ApplicationServicesAccessor; 021 022 /** 023 * A skeleton implementation of the {@link ControlFactory} interface that only 024 * creates it's control when requested. 025 * 026 * <p> 027 * The factory may operate in singleton mode, which is the default. In this 028 * case, the control will be created the first time it is requested and the same 029 * instance will be returned for each subsequent request. When operating in 030 * non-singleton mode, a new control instance is created each time it is 031 * requested. 032 * </p> 033 * 034 * @author Keith Donald 035 */ 036 public abstract class AbstractControlFactory extends ApplicationServicesAccessor implements ControlFactory { 037 038 private boolean singleton = true; 039 040 private JComponent control; 041 042 /** 043 * Creates a new uninitialized {@code AbstractControlFactory}. 044 */ 045 protected AbstractControlFactory() { 046 // do nothing 047 } 048 049 /** 050 * Returns true (the default) if this factory is to create a single instance 051 * of its control. 052 * 053 * @return <code>true</code> if this factory returns a singleton instance 054 * of its control. 055 */ 056 protected final boolean isSingleton() { 057 return singleton; 058 } 059 060 /** 061 * Sets the flag that determines if this factory is to create a single 062 * instance of its control. By default, this flag is true. 063 * 064 * @param singleton The singleton flag. 065 */ 066 protected final void setSingleton(boolean singleton) { 067 this.singleton = singleton; 068 } 069 070 /** 071 * Returns an instance of the control that this factory produces. 072 * 073 * <p> 074 * This implementation is a template method, calling the abstract 075 * {@link #createControl()} method if operating in non-singleton mode or if 076 * the control has not yet been created when operating in singleton mode. 077 * </p> 078 * 079 */ 080 public final JComponent getControl() { 081 if (isSingleton()) { 082 if (this.control == null) { 083 this.control = createControl(); 084 } 085 return this.control; 086 } 087 088 return createControl(); 089 } 090 091 /** 092 * Returns true if the control for this factory has been created. If this 093 * factory is set to non-singleton mode, this method will always return 094 * false even if an instance of the control has previously been created. 095 * 096 * @return <code>true</code> if operating in singleton mode and an instance of the 097 * control has already been created, false otherwise. 098 */ 099 public final boolean isControlCreated() { 100 if (isSingleton()) { 101 return this.control != null; 102 } 103 104 return false; 105 } 106 107 /** 108 * Creates an instance of the control produced by this factory if operating 109 * in singleton mode and the control instance has not already been created. 110 */ 111 protected void createControlIfNecessary() { 112 if (isSingleton() && this.control == null) { 113 getControl(); 114 } 115 } 116 117 /** 118 * Subclasses must override this method to create a new instance of the 119 * control that this factory produces. 120 * 121 * @return The newly created control, never null. 122 */ 123 protected abstract JComponent createControl(); 124 125 }