001    /**
002     * Copyright 2010 The Kuali Foundation Licensed under the
003     * Educational Community License, Version 2.0 (the "License"); you may
004     * not use this file except in compliance with the License. You may
005     * obtain a copy of the License at
006     *
007     * http://www.osedu.org/licenses/ECL-2.0
008     *
009     * Unless required by applicable law or agreed to in writing,
010     * software distributed under the License is distributed on an "AS IS"
011     * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012     * or implied. See the License for the specific language governing
013     * permissions and limitations under the License.
014     */
015    
016    package org.kuali.student.common.ui.client.configurable.mvc;
017    
018    import java.util.List;
019    
020    import org.kuali.student.common.ui.client.mvc.Callback;
021    import org.kuali.student.common.ui.client.mvc.Controller;
022    import org.kuali.student.common.ui.client.mvc.ModelRequestCallback;
023    import org.kuali.student.common.ui.client.mvc.dto.ReferenceModel;
024    
025    import com.google.gwt.user.client.Window;
026    import com.google.gwt.user.client.ui.LazyPanel;
027    import com.google.gwt.user.client.ui.Widget;
028    
029    /**
030     * A view that delays its generation until it requested to be shown.
031     * 
032     * @author Kuali Student Team
033     *
034     */
035    public abstract class DelayedToolView extends LazyPanel implements ToolView{
036        private Controller controller;    
037        private Enum<?> viewEnum;
038        private String viewName;    //View name is being used as menu item label   
039    
040        private HasReferenceId reference;
041        
042        private ModelRequestCallback<ReferenceModel> modelRequestCallback = 
043            new ModelRequestCallback<ReferenceModel>(){
044                public void onModelReady(ReferenceModel model) {
045                    reference.setReferenceId(model.getReferenceId());
046                    reference.setReferenceTypeKey(model.getReferenceTypeKey());
047                    reference.setReferenceType(model.getReferenceType());
048                    reference.setReferenceState(model.getReferenceState());
049                    DelayedToolView.this.setVisible(true);       
050                }
051        
052                public void onRequestFail(Throwable cause) {
053                    Window.alert(cause.toString());
054                }
055        };
056        
057        
058        /**
059         * @param controller
060         * @param name
061         */
062        public DelayedToolView(Controller controller, Enum<?> viewEnum, String viewName) {
063            this.controller = controller;
064            this.viewName = viewName;
065            this.viewEnum = viewEnum;
066        }
067    
068    
069        public DelayedToolView(Enum<?> viewEnum, String viewName) {
070            this.controller = null;
071            this.viewEnum = viewEnum;
072            this.viewName = viewName;
073        }
074       
075        @Override
076        public void beforeShow(final Callback<Boolean> onReadyCallback){
077            if (getWidget() instanceof HasReferenceId){
078                reference = (HasReferenceId)getWidget();
079                controller.requestModel(ReferenceModel.class, modelRequestCallback);
080            } else if (this instanceof HasReferenceId){
081                reference = (HasReferenceId)this;
082                controller.requestModel(ReferenceModel.class, modelRequestCallback);            
083            } else {
084                this.setVisible(true);
085            }
086            // FIXME ? need to wire onReadyCallback into the model request, so that we aren't indicating that we're ready before the model is available?
087            onReadyCallback.exec(true);
088        }
089    
090        /**
091         * @see org.kuali.student.common.ui.client.mvc.View#beforeHide()
092         */
093        @Override
094        public boolean beforeHide() {
095            return true;
096        }
097    
098    
099        /**
100         * @see org.kuali.student.common.ui.client.mvc.View#getController()
101         */
102        @Override
103        public Controller getController() {
104            return this.controller;
105        }
106    
107    
108        /**
109         * @see org.kuali.student.common.ui.client.mvc.View#getName()
110         */
111        @Override
112        public String getName() {
113            return this.viewName;
114        }
115    
116        public Enum<?> getViewEnum() {
117            return viewEnum;
118        }
119    
120        /**
121         * @see org.kuali.student.common.ui.client.mvc.View#updateModel()
122         */
123        @Override
124        public void updateModel() {
125            //There is no model to update here, reference model is read-only        
126        }
127        
128        public void setController(Controller controller){
129            this.controller = controller;
130        }
131    
132        
133        public Widget asWidget(){
134            return this;
135        }
136        
137        @Override
138        public String collectHistory(String historyStack) {
139            return null;
140        }
141    
142    
143            @Override
144            protected Widget createWidget() {
145                    // TODO Auto-generated method stub
146                    return null;
147            }
148    
149            @Override
150            public void onHistoryEvent(String historyStack) {
151                    
152            }
153    
154            @Override
155            public void collectBreadcrumbNames(List<String> names) {
156                    names.add(this.getName());
157                    
158            }
159            
160               public boolean isExportButtonActive() {
161                    return false;
162                }
163    }