001    /**
002     * Copyright 2010 The Kuali Foundation Licensed under the Educational Community License, Version 2.0 (the "License"); you may
003     * not use this file except in compliance with the License. You may obtain a copy of the License at
004     * http://www.osedu.org/licenses/ECL-2.0 Unless required by applicable law or agreed to in writing, software distributed
005     * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
006     * implied. See the License for the specific language governing permissions and limitations under the License.
007     */
008    
009    package org.kuali.student.common.ui.client.util;
010    
011    import java.util.ArrayList;
012    import java.util.List;
013    
014    import org.kuali.student.common.ui.client.configurable.mvc.FieldDescriptor;
015    import org.kuali.student.common.ui.client.configurable.mvc.LayoutController;
016    import org.kuali.student.common.ui.client.configurable.mvc.SectionTitle;
017    import org.kuali.student.common.ui.client.configurable.mvc.sections.BaseSection;
018    import org.kuali.student.common.ui.client.configurable.mvc.sections.Section;
019    import org.kuali.student.common.ui.client.configurable.mvc.views.VerticalSectionView;
020    import org.kuali.student.common.ui.client.mvc.Controller;
021    import org.kuali.student.common.ui.client.reporting.ReportExportWidget;
022    import org.kuali.student.common.ui.client.widgets.KSItemLabel;
023    import org.kuali.student.common.ui.client.widgets.KSLabel;
024    import org.kuali.student.common.ui.client.widgets.list.KSLabelList;
025    import org.kuali.student.common.ui.client.widgets.list.KSSelectedList;
026    import org.kuali.student.common.ui.client.widgets.list.impl.KSLabelListImpl;
027    import org.kuali.student.common.ui.client.widgets.menus.KSListPanel;
028    import org.kuali.student.common.ui.client.widgets.search.KSPicker;
029    import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTable;
030    import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTableBlock;
031    import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTableModel;
032    import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTableRow;
033    import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTableSection;
034    
035    import com.google.gwt.user.client.ui.ComplexPanel;
036    import com.google.gwt.user.client.ui.HasText;
037    import com.google.gwt.user.client.ui.ListBox;
038    import com.google.gwt.user.client.ui.Widget;
039    import com.google.gwt.user.client.ui.WidgetCollection;
040    
041    public class ExportUtils {
042        public static final String PDF = "PDF";
043        public static final String DOC = "DOC";
044        public static final String XLS = "XLS";
045    
046        public static ExportElement getExportItemDetails(ExportElement exportItem, Widget fieldWidget, boolean setFirstFieldValue, String viewName, String sectionName) {
047            ArrayList<ExportElement> subExportElements = new ArrayList<ExportElement>();
048            String fieldValue = null;
049            if (fieldWidget instanceof HasText) {
050                    HasText itemHasTextValue = (HasText) fieldWidget;
051                fieldValue = itemHasTextValue.getText();
052                
053            } else if (fieldWidget instanceof KSLabel) {
054                // ignore labels... as we're not interested
055            } else if (fieldWidget instanceof KSSelectedList) {
056                KSSelectedList selectedList = (KSSelectedList) fieldWidget;
057                List<KSItemLabel> selectedItems = selectedList.getSelectedItems();
058                String values = new String();
059                for (int j = 0; j < selectedItems.size(); j++) {
060                    values = selectedItems.get(j).getDisplayText();
061                }
062                fieldValue = values;
063            } else if (fieldWidget instanceof KSPicker) {
064                KSPicker picker = (KSPicker) fieldWidget;
065                if (picker.getInputWidget() instanceof HasText) {
066                    HasText item = (HasText) picker.getInputWidget();
067                    fieldValue = item.getText();
068                } else if (picker.getInputWidget() instanceof KSLabelList) {
069                    KSLabelList widget = (KSLabelList) picker.getInputWidget();
070                    List<String> selected = widget.getSelectedItemsForExport();
071                    for (int j = 0; j <  selected.size(); j++) {
072                        if (fieldValue == null) {
073                            fieldValue = new String(selected.get(j));
074                        } else {
075                            fieldValue = fieldValue + ", " + selected.get(j);
076                        }
077                    }
078                } 
079            } else if (fieldWidget instanceof ListBox) {
080                ListBox listBox = (ListBox) fieldWidget;
081                fieldValue = listBox.getItemText(listBox.getSelectedIndex());
082            } else if (fieldWidget instanceof SectionTitle) {
083                SectionTitle sectionTitle = (SectionTitle) fieldWidget;            
084                fieldValue = sectionTitle.getElement().getInnerText();
085            } else if (fieldWidget instanceof ComplexPanel) {
086                    subExportElements = ExportUtils.getDetailsForWidget(fieldWidget, subExportElements, viewName, sectionName);
087            } else if (fieldWidget instanceof ReportExportWidget) {
088                ReportExportWidget widget = (ReportExportWidget) fieldWidget;
089                subExportElements = widget.getExportElementsWidget(viewName, sectionName);
090            } else
091            {
092                // logger.warn(exportItem.getFieldLabel() + " Fieldwidget not catered for : class type = " +
093                // fieldWidget.getClass().getName());
094            } 
095            if (setFirstFieldValue) {
096                exportItem.setFieldValue(fieldValue);
097            } else {
098                exportItem.setFieldValue2(fieldValue);
099            }
100            if (subExportElements != null && subExportElements.size() > 0) {
101                exportItem.setSubset(subExportElements);
102            }
103    
104    //                System.out.println(exportItem.getSectionName() + " : Label = " + exportItem.getFieldLabel() + " fieldValue : " + exportItem.getFieldValue() + " fieldValue2 : " + exportItem.getFieldValue2());
105            return exportItem;
106        }
107    
108        /**
109         * This method gets the current controller based on the widget that was passed to it.
110         * 
111         * @param theWidget
112         * @return currentController
113         */
114        public static Controller getController(Widget theWidget) {
115            // TODO Nina - This can't be the correct way of getting handle to Controller, isn't there a better way??
116            if (theWidget != null) {
117    
118                if (theWidget instanceof Controller) {
119                    Controller controller = (Controller) theWidget;
120                    return controller;
121                } else {
122                    return getController(theWidget.getParent());
123                }
124            } else {
125                return null;
126            }
127        }
128    
129        public static void handleExportClickEvent(Controller currentController, String format, String reportTitle) {
130            ArrayList<ExportElement> exportElements = new ArrayList<ExportElement>();
131            exportElements = currentController.getExportElementsFromView();
132            if (exportElements != null && exportElements.size() > 0) {
133    // for debugging            debutExportElementsArray(exportElements);
134                currentController.doReportExport(exportElements, format, reportTitle);
135            }
136        }
137    
138        private static void debutExportElementsArray(ArrayList<ExportElement> exportElements) {
139            System.out.println(" ");
140            System.out.println(" ");
141            System.out.println(" ");
142            System.out.println(" ");
143            System.out.println(" ");
144            System.out.println(" ");
145            System.out.println(" ");
146            System.out.println(" ");
147    
148            for (int i = 0; i < exportElements.size(); i++) {
149                System.out.println(exportElements.get(i).printLine());
150                debutExportElementsArraySubList(exportElements.get(i).getSubset());
151            }
152        }
153    
154        private static void debutExportElementsArraySubList(List<ExportElement> exportElements) {
155            if (exportElements != null) {
156                System.out.println("Sub list : ");
157                for (int j = 0; j < exportElements.size(); j++) {
158                    ExportElement element = exportElements.get(j);
159                    System.out.println(element.printLine());
160                    debutExportElementsArraySubList(element.getSubset());
161                    
162                }
163            }
164        }
165    
166        public static ArrayList<ExportElement> getDetailsForWidget(SummaryTableSection tableSection, ArrayList<ExportElement> exportElements) {
167            SummaryTable sumTable = tableSection.getSummaryTable();
168            SummaryTableModel model = sumTable.getModel();
169            List<SummaryTableBlock> tableSectionList = model.getSectionList();
170            for (int i = 0; i < tableSectionList.size(); i++) {
171                SummaryTableBlock item = tableSectionList.get(i);
172                String blockName = item.getTitle();
173                List<SummaryTableRow> rowItems = item.getSectionRowList();
174                for (int j = 0; j < rowItems.size(); j++) {
175                    ExportElement element = new ExportElement();
176                    SummaryTableRow row = rowItems.get(j);
177                    element.setSectionName(blockName);
178                    element.setViewName(blockName);
179                    element.setFieldLabel(row.getTitle());
180                    element.setMandatory(row.isRequired());
181                    Widget fdWidget = row.getCell1();
182                    if (row.isShown()) {
183                        if (fdWidget != null) {
184                            //
185                            if (fdWidget instanceof KSListPanel) {
186                                ArrayList<ExportElement> subExportElements = new ArrayList<ExportElement>();
187                                subExportElements = ExportUtils.getDetailsForWidget(fdWidget, subExportElements, blockName, blockName);
188                                element.setSubset(subExportElements);
189                            } else {
190                            //
191                            element = ExportUtils.getExportItemDetails(element,fdWidget,true, blockName, blockName);
192                            }
193                        } else {
194                            if (row.getTitle() != null) {
195                                element.setFieldLabel(row.getTitle());
196                            }
197                        }
198                    //
199                        Widget fdWidget2 = row.getCell2();
200                        if (fdWidget2 != null) {
201                            element = ExportUtils.getExportItemDetails(element,fdWidget2,false, blockName, blockName);
202                                           
203                        } else {
204                            if (row.getTitle() != null) {
205                                element.setFieldLabel(row.getTitle());
206                            }
207                        }
208                        if (element != null && element.getViewName() != null) {
209                            exportElements.add(element);
210                        }
211                    }
212                }
213            }
214            return exportElements;
215        }
216    
217        public static ArrayList<ExportElement> getDetailsForWidget(Widget currentViewWidget, ArrayList<ExportElement> exportElements, String viewName, String sectionName) {
218            if (currentViewWidget instanceof Section) {
219                Section widgetHasFields = (Section) currentViewWidget;
220                List<FieldDescriptor> widgetFields = widgetHasFields.getFields();
221                for (FieldDescriptor field : widgetFields) {
222                    ExportElement exportItem = new ExportElement();
223                    exportItem.setSectionName(sectionName + viewName);
224                    exportItem.setViewName(sectionName + viewName);
225                    exportItem.setFieldLabel(field.getFieldLabel());
226                    Widget fieldWidget = field.getFieldElement().getFieldWidget();
227    
228                    exportElements.add(getExportItemDetails(exportItem, fieldWidget, true, viewName, sectionName));
229                }
230            } else if (currentViewWidget instanceof KSListPanel) {
231                KSListPanel ksListPanelWidget = (KSListPanel) currentViewWidget;
232                WidgetCollection children = ksListPanelWidget.getChildren();
233                for (int i = 0; i < children.size(); i++) {
234                    Widget child = children.get(i);
235    
236                    ExportElement exportItem = new ExportElement();
237                    exportItem.setSectionName(sectionName + viewName);
238                    exportItem.setViewName(sectionName + viewName);
239                    exportItem.setFieldLabel("");
240                    exportElements.add(getExportItemDetails(exportItem, child, true, viewName, sectionName));
241                }
242                
243            } else if (currentViewWidget instanceof ComplexPanel){
244                ComplexPanel complexPanel = (ComplexPanel) currentViewWidget;
245                for (int i = 0; i < complexPanel.getWidgetCount(); i++) {
246                    Widget child = complexPanel.getWidget(i);
247                    ExportElement exportItem = new ExportElement();
248                    exportItem.setSectionName(sectionName);
249                    exportItem.setViewName(viewName);
250                    ExportElement exportItemDetails = getExportItemDetails(exportItem, child, true, viewName, sectionName);
251                    if (exportItemDetails.getFieldValue() != null || (exportItemDetails.getSubset() != null && exportItemDetails.getSubset().size() > 0)) {
252                        exportElements.add(exportItemDetails);                    
253                    }
254                }
255    
256                
257    
258            } else {
259            
260                System.out.println("ExportUtils does not cater for this type..." + currentViewWidget.getClass().getName());
261                            
262            }
263            return exportElements;
264        }
265    
266        public static ArrayList<ExportElement> getExportElementsFromView(Widget currentViewWidget, ArrayList<ExportElement> exportElements, String viewName, String sectionName) {
267            if (exportElements == null) {
268                exportElements = new ArrayList<ExportElement>();
269            }
270            if (currentViewWidget instanceof VerticalSectionView) {
271                Section widgetHasFields = (Section) currentViewWidget;
272                List<FieldDescriptor> widgetFields = widgetHasFields.getFields();
273                for (FieldDescriptor field : widgetFields) {
274                    ExportElement exportItem = new ExportElement();
275                    exportItem.setSectionName(sectionName + viewName);
276                    exportItem.setViewName(sectionName + viewName);
277                    exportItem.setFieldLabel(field.getFieldLabel());
278                    Widget fieldWidget = field.getFieldElement().getFieldWidget();
279    
280                    exportElements.add(getExportItemDetails(exportItem, fieldWidget,true,viewName, sectionName));
281                }
282                if ((currentViewWidget instanceof BaseSection) && (widgetHasFields.getFields().size() == 0)) {
283                    BaseSection bSection = (BaseSection) currentViewWidget;
284                    ExportElement exportItem = new ExportElement();
285                    exportItem.setSectionName(sectionName + viewName);
286                    exportItem.setViewName(sectionName + viewName);
287                    exportItem.setFieldLabel("???00");
288                    exportItem = getExportItemDetails(exportItem, bSection.getLayout(), true, viewName, sectionName);
289                    exportElements.add(exportItem);
290                    
291                }
292    //        } else { // Debugging
293    //            System.out.println("ExportUtils.getExportElementsFromView is not implemented for your View, either implement it here or do " + "not call the ExportUtils.getExportElementsFromView but implement it directly on your view");
294            }
295            return exportElements;
296        }
297        
298    }