Source code: jac/aspects/gui/web/ObjectChooser.java
1 /*
2 Copyright (C) 2001-2003 Renaud Pawlak <renaud@aopsys.com>,
3 Laurent Martelli <laurent@aopsys.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 USA */
19
20 package jac.aspects.gui.web;
21
22 import jac.aspects.gui.*;
23 import jac.core.Collaboration;
24 import jac.core.Jac;
25 import jac.core.Wrappee;
26 import jac.core.Wrapping;
27 import jac.core.rtti.ClassItem;
28 import jac.core.rtti.CollectionItem;
29 import jac.core.rtti.ConstructorItem;
30 import jac.core.rtti.FieldItem;
31 import jac.core.rtti.MethodItem;
32 import jac.util.Log;
33 import java.io.PrintWriter;
34 import java.util.Collection;
35 import java.util.HashMap;
36 import java.util.Iterator;
37 import java.util.List;
38 import java.util.Vector;
39
40 /**
41 * This is a special value editor that allows the user to choose a
42 * value within a set of object of a given type. */
43
44 public class ObjectChooser extends AbstractFieldEditor
45 implements HTMLEditor, ChoiceListener
46 {
47 ComboBoxModel model;
48 boolean isEditable=false;
49
50 /**
51 * Constructs a new object chooser.
52 *
53 * @param substance
54 * @param reference the subtance reference that is affected by this
55 * chooser (can be null)
56 * @param isEditable should the user be allowed to enter a new value
57 */
58
59 public ObjectChooser(Object substance, FieldItem reference,
60 ComboBoxModel model,
61 boolean isEditable)
62 {
63 super(substance,reference);
64 this.model = model;
65 this.isEditable=isEditable;
66 }
67
68 // FieldEditor interface
69
70 public void setValue(Object value) {
71 super.setValue(value);
72 model.setSelectedObject(value);
73 }
74
75 public Object getValue() {
76 Log.trace("gui.chooser","selectedItem = "+model.getSelectedObject());
77 return model.getSelectedObject();
78 }
79
80 public void close() {
81 super.close();
82 model.close();
83 }
84
85 // HTMLEditor
86 public void genHTML(PrintWriter out) {
87 String selected = (String)model.getSelectedItem();
88 Log.trace("gui.chooser","ObjectChooser(selected="+selected+
89 ", type="+model.getType()+")");
90
91 out.println("<select name=\""+label+"\">");
92
93 for (int i=0; i<model.getSize(); i++) {
94 String label = (String)model.getElementAt(i);
95 out.println("<option"+
96 (label.equals(selected)?" selected":"")+
97 " value=\""+label+"\""+
98 ">"+
99 label+"</OPTION>");
100 }
101 out.println("</SELECT>");
102
103 // display a "new" button
104 if (isEditable && model.getType()!=null &&
105 GuiAC.isCreatable(model.getType())) {
106 JacRequest request = ((WebDisplay)context.getDisplay()).getRequest();
107 if (request.isIEUserAgent()) {
108 out.println(
109 "<table class=\"method\"><td>"+
110 iconElement(ResourceManager.getResource("new_icon"),"")+
111 eventURL(GuiAC.getLabelNew(),"onCreateObject","").toString()+
112 "</td></table>");
113 } else {
114 out.println(
115 "<span class=\"method\">"+
116 iconElement(ResourceManager.getResource("new_icon"),"")+
117 eventURL(GuiAC.getLabelNew(),"onCreateObject","").toString()+
118 "</span>");
119 }
120 }
121 }
122
123 public boolean readValue(Object parameter) {
124 String string = (String)parameter;
125 model.setSelectedItem(string);
126 Object value = model.getSelectedObject();
127 super.setValue(value);
128 return true;
129 }
130
131 // ChoiceListener interface
132 public void onCreateObject() {
133 Thread createThread = new CreateThread();
134 createThread.start();
135 }
136
137 class CreateThread extends Thread {
138 Collaboration parentCollaboration;
139 public CreateThread() {
140 parentCollaboration = Collaboration.get();
141 }
142 public void run() {
143 Collaboration.set(new Collaboration(parentCollaboration));
144 Collaboration.get().addAttribute(GuiAC.AUTO_CREATION,"true");
145 Object instance =
146 EventHandler.get().onCreateObject(context,model.getType(),substance,field);
147 if (instance!=null) {
148 model.addObject(instance);
149 value = instance;
150 model.setSelectedObject(value);
151 // do not use setValue(), because it would then fail to
152 // commit on close
153 }
154 context.getDisplay().refresh();
155 }
156 }
157 }
158