Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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