001: /*
002: The contents of this file are subject to the Common Public Attribution License
003: Version 1.0 (the "License"); you may not use this file except in compliance with
004: the License. You may obtain a copy of the License at
005: http://www.projity.com/license . The License is based on the Mozilla Public
006: License Version 1.1 but Sections 14 and 15 have been added to cover use of
007: software over a computer network and provide for limited attribution for the
008: Original Developer. In addition, Exhibit A has been modified to be consistent
009: with Exhibit B.
010:
011: Software distributed under the License is distributed on an "AS IS" basis,
012: WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the
013: specific language governing rights and limitations under the License. The
014: Original Code is OpenProj. The Original Developer is the Initial Developer and
015: is Projity, Inc. All portions of the code written by Projity are Copyright (c)
016: 2006, 2007. All Rights Reserved. Contributors Projity, Inc.
017:
018: Alternatively, the contents of this file may be used under the terms of the
019: Projity End-User License Agreeement (the Projity License), in which case the
020: provisions of the Projity License are applicable instead of those above. If you
021: wish to allow use of your version of this file only under the terms of the
022: Projity License and not to allow others to use your version of this file under
023: the CPAL, indicate your decision by deleting the provisions above and replace
024: them with the notice and other provisions required by the Projity License. If
025: you do not delete the provisions above, a recipient may use your version of this
026: file under either the CPAL or the Projity License.
027:
028: [NOTE: The text of this license may differ slightly from the text of the notices
029: in Exhibits A and B of the license at http://www.projity.com/license. You should
030: use the latest text at http://www.projity.com/license for your modifications.
031: You may not remove this license text from the source files.]
032:
033: Attribution Information: Attribution Copyright Notice: Copyright © 2006, 2007
034: Projity, Inc. Attribution Phrase (not exceeding 10 words): Powered by OpenProj,
035: an open source solution from Projity. Attribution URL: http://www.projity.com
036: Graphic Image as provided in the Covered Code as file: openproj_logo.png with
037: alternatives listed on http://www.projity.com/logo
038:
039: Display of Attribution Information is required in Larger Works which are defined
040: in the CPAL as a work which combines Covered Code or portions thereof with code
041: not governed by the terms of the CPAL. However, in addition to the other notice
042: obligations, all copies of the Covered Code in Executable and Source Code form
043: distributed must, as a form of attribution of the original author, include on
044: each user interface screen the "OpenProj" logo visible to all users. The
045: OpenProj logo should be located horizontally aligned with the menu bar and left
046: justified on the top left of the screen adjacent to the File menu. The logo
047: must be at least 100 x 25 pixels. When users click on the "OpenProj" logo it
048: must direct them back to http://www.projity.com.
049: */
050: package com.projity.dialog.util;
051:
052: import java.util.Collection;
053: import java.util.HashMap;
054: import java.util.Iterator;
055:
056: import javax.swing.JCheckBox;
057: import javax.swing.JComponent;
058:
059: import com.jgoodies.forms.builder.DefaultFormBuilder;
060: import com.jgoodies.forms.layout.CellConstraints;
061: import com.projity.configuration.Configuration;
062: import com.projity.dialog.FieldDialog;
063: import com.projity.field.Field;
064: import com.projity.field.ObjectRef;
065: import com.projity.grouping.core.Node;
066: import com.projity.grouping.core.model.NodeModel;
067: import com.projity.grouping.core.model.NodeModelDataFactory;
068: import com.projity.grouping.core.model.WalkersNodeModel;
069: import com.projity.help.HelpUtil;
070: import com.projity.pm.task.BelongsToDocument;
071:
072: /**
073: *
074: */
075: public class FieldComponentMap implements ObjectRef {
076: private Object object;
077: private Node node = null;
078: private NodeModel nodeModel = null;
079: private Collection collection = null;
080: private HashMap map = new HashMap();
081: private FieldDialog fieldDialog;
082: private NodeModelDataFactory dataFactory;
083:
084: public FieldComponentMap(Object object) {
085: this .object = object;
086: setDataFactoryFromObject(object);
087: }
088:
089: public FieldComponentMap(Node node, NodeModel nodeModel) {
090: this .node = node;
091: this .nodeModel = nodeModel;
092: dataFactory = nodeModel.getDataFactory();
093: }
094:
095: public FieldComponentMap(Collection collection) {
096: this .collection = collection;
097: if (collection != null && collection.size() > 0) {
098: setDataFactoryFromObject(collection.iterator().next());
099: }
100: }
101:
102: private void setDataFactoryFromObject(Object object) {
103: if (object instanceof BelongsToDocument)
104: dataFactory = (NodeModelDataFactory) ((BelongsToDocument) object)
105: .getDocument();
106: }
107:
108: public JComponent getComponent(String fieldId, int flag) {
109: JComponent component = (JComponent) map.get(fieldId);
110: if (component == null) {
111: Field field = Configuration.getFieldFromId(fieldId);
112: component = ComponentFactory
113: .componentFor(field, this , flag);
114: map.put(fieldId, component);
115: }
116: return component;
117: }
118:
119: public String getLabel(String fieldId) {
120: Field field = Configuration.getFieldFromId(fieldId);
121: return field.getName();
122: }
123:
124: // updates all components
125: public void updateAll() {
126: Iterator i = map.keySet().iterator();
127: String fieldId;
128: Field field;
129: JComponent component;
130: while (i.hasNext()) {
131: fieldId = (String) i.next();
132: field = Configuration.getFieldFromId(fieldId);
133: component = getComponent(fieldId, 0); // argument 0 shouldn't matter because exists already
134: ComponentFactory.updateValueOfComponent(component, field,
135: this );
136: }
137: }
138:
139: public JComponent append(DefaultFormBuilder builder, String fieldId) {
140: return appendField(builder, fieldId, 0);
141: }
142:
143: public void append(DefaultFormBuilder builder, Collection fields) {
144: Iterator i = fields.iterator();
145: while (i.hasNext()) {
146: appendField(builder, ((Field) i.next()).getId(), 0);
147: builder.nextLine(2);
148: }
149: }
150:
151: public JComponent appendReadOnly(DefaultFormBuilder builder,
152: String fieldId) {
153: return appendField(builder, fieldId, ComponentFactory.READ_ONLY);
154: }
155:
156: public JComponent appendSometimesReadOnly(
157: DefaultFormBuilder builder, String fieldId) {
158: return appendField(builder, fieldId,
159: ComponentFactory.SOMETIMES_READ_ONLY);
160: }
161:
162: public JComponent appendField(DefaultFormBuilder builder,
163: String fieldId, int flag) {
164: Field field = Configuration.getFieldFromId(fieldId);
165: if (field == null)
166: return null;
167: JComponent component = getComponent(fieldId, flag);
168: if (component instanceof JCheckBox) // checkboxes already have a label to the right
169: builder.append(component);
170: else
171: builder.append(getLabel(fieldId) + ":", component);
172: String fieldDoc = field.getHelp();
173: if (fieldDoc != null)
174: HelpUtil.addDocHelp(component, fieldDoc);
175: return component;
176: }
177:
178: public JComponent append(DefaultFormBuilder builder,
179: String fieldId, int span) {
180: Field field = Configuration.getFieldFromId(fieldId);
181: if (field == null)
182: return null;
183: JComponent component = getComponent(fieldId, 0);
184: boolean isCheckbox = component instanceof JCheckBox;
185: CellConstraints cc = new CellConstraints().xyw(builder
186: .getColumn()
187: + (isCheckbox ? 0 : 2), builder.getRow(), span);
188: if (component instanceof JCheckBox) {// checkboxes already have a label to the right
189: builder.add(component, cc);
190: } else {
191: builder.addLabel(getLabel(fieldId) + ":");
192: builder.nextColumn(2);
193: builder.add(component, cc);
194: builder.nextColumn(1);
195: }
196: String fieldDoc = field.getHelp();
197: if (fieldDoc != null)
198: HelpUtil.addDocHelp(component, fieldDoc);
199: return component;
200: }
201:
202: public Node getNode() {
203: return node;
204: }
205:
206: public WalkersNodeModel getNodeModel() {
207: return nodeModel;
208: }
209:
210: public Object getObject() {
211: return object;
212: }
213:
214: public void setObject(Object object) {
215: this .object = object;
216: }
217:
218: /**
219: * @return Returns the collection.
220: */
221: public Collection getCollection() {
222: return collection;
223: }
224:
225: /**
226: * @param collection The collection to set.
227: */
228: public void setCollection(Collection collection) {
229: this .collection = collection;
230: }
231:
232: public void setFieldDialog(FieldDialog fieldDialog) {
233: this .fieldDialog = fieldDialog;
234: }
235:
236: public NodeModelDataFactory getDataFactory() {
237: return dataFactory;
238: }
239: }
|