001/*
002 * Copyright (c) 2010 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: crawl $'
006 * '$Date: 2012-11-26 22:23:27 +0000 (Mon, 26 Nov 2012) $' 
007 * '$Revision: 31127 $'
008 * 
009 * Permission is hereby granted, without written agreement and without
010 * license or royalty fees, to use, copy, modify, and distribute this
011 * software and its documentation for any purpose, provided that the above
012 * copyright notice and the following two paragraphs appear in all copies
013 * of this software.
014 *
015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
019 * SUCH DAMAGE.
020 *
021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
026 * ENHANCEMENTS, OR MODIFICATIONS.
027 *
028 */
029
030package org.kepler.reporting.gui;
031
032import java.awt.BorderLayout;
033import java.awt.Color;
034import java.awt.Cursor;
035import java.awt.Dimension;
036import java.awt.FlowLayout;
037import java.awt.GridLayout;
038import java.awt.datatransfer.Transferable;
039import java.awt.event.MouseEvent;
040import java.awt.event.MouseListener;
041import java.util.ArrayList;
042import java.util.List;
043
044import javax.swing.JPanel;
045import javax.swing.JRadioButton;
046import javax.swing.JTextField;
047import javax.swing.JToolBar;
048import javax.swing.ToolTipManager;
049import javax.swing.event.DocumentEvent;
050import javax.swing.event.DocumentListener;
051
052import org.kepler.reporting.rio.Item;
053import org.kepler.reporting.rio.ItemLabel;
054import org.kepler.reporting.roml.ReportLayout;
055
056import ptolemy.actor.gui.TableauFrame;
057
058public class DynamicReportItemPanel extends DragAndDropPanel implements
059                Transferable {
060
061        public static final int DYNAMIC_REPORT_ITEM_VIEW_WIDTH = 25000;
062        public static final int DYNAMIC_REPORT_ITEM_VIEW_HEIGHT = 85;
063
064        private Color buttonbackgroundcolor = Color.white;
065        private TableauFrame _tableauFrame = null;
066        private ReportLayout _reportLayout = null;
067
068        private ReportDesignerPanel _parentReportDesignerPanel;
069
070        public DynamicReportItemPanel(ReportDesignerPanel reportDesignerPanel,
071                        Item tmpItem, JRadioButton dynamicreportItemButton,
072                        DeleteItemButton delbutton, String strItemFullName,
073                        ReportLayout reportLayout, TableauFrame tableauFrame) {
074
075                super(reportDesignerPanel);
076                _parentReportDesignerPanel = reportDesignerPanel;
077
078                _reportLayout = reportLayout;
079                _tableauFrame = tableauFrame;
080
081                ToolTipManager.sharedInstance().setEnabled(true);
082                this.addMouseListener(new DraggableMouseListener());
083                this.setLayout(new GridLayout(3, 3));
084                setFocusable(true);
085
086                this.setBorder(ovalBorder);
087                this.setBackground(buttonbackgroundcolor);
088                delbutton.setBackground(buttonbackgroundcolor);
089
090                Dimension dimension = new Dimension(DYNAMIC_REPORT_ITEM_VIEW_WIDTH,
091                                DYNAMIC_REPORT_ITEM_VIEW_HEIGHT);
092                this.setPreferredSize(dimension);
093                this.setMinimumSize(dimension);
094                this.setToolTipText(strItemFullName);
095
096                List<LabelPanel> labelpanelslist = new ArrayList<LabelPanel>();
097                List<ItemLabel> currentLabelsList = tmpItem.getLabels();
098
099                if (currentLabelsList.size() == 0) {
100                        createItemLabels(tmpItem);
101                        currentLabelsList = tmpItem.getLabels();
102
103                        for (int z = 0; z < currentLabelsList.size(); z++) {
104
105                                ItemLabel label = tmpItem.getLabels().get(z);
106                                JTextField jtextField = renderItemLabel(tmpItem, label);
107                                LabelPanel labelpanel = renderLabelPanel(tmpItem, jtextField);
108                                this.add(labelpanel);
109
110                                ///labelpanel.getView();
111                                labelpanelslist.add(labelpanel);
112                        }
113
114                } else if (currentLabelsList.size() == 4) {
115
116                        for (int z = 0; z < currentLabelsList.size(); z++) {
117                                ItemLabel label = tmpItem.getLabels().get(z);
118                                JTextField jtextField = renderItemLabel(tmpItem, label);
119                                LabelPanel labelpanel = renderLabelPanel(tmpItem, jtextField);
120                                this.add(labelpanel);
121
122                                ///labelpanel.getView();
123                                labelpanelslist.add(labelpanel);
124                        }
125
126                        renderView(this, dynamicreportItemButton, labelpanelslist,
127                                        delbutton, strItemFullName);
128                }
129        }
130
131        private LabelPanel renderLabelPanel(Item tmpItem, JTextField jtextfield) {
132
133                LabelPanel panel = new LabelPanel();
134                panel.setAssociatedItem(tmpItem);
135                panel.setName(jtextfield.getName());
136                // this sets the size of the draggable area
137                /// does it? not seeing this doing anything:
138                ///panel.setBounds(0, 0, 500, 150);
139                panel.add(jtextfield);
140                
141                return panel;
142        }
143
144        private JTextField renderItemLabel(Item tmpItem, ItemLabel label) {
145
146                String labelposition = label.getPosition();
147                String labelvalue = label.getValue();
148                JTextField jtextfield = new JTextField(labelvalue);
149                jtextfield.setName(labelposition);
150                jtextfield.setText(labelvalue);
151
152                DynamicReportItemLabelMouseListener labelmouselistener = new DynamicReportItemLabelMouseListener();
153                DynamicReportItemLabelDocumentListener labelDocumentListener = new DynamicReportItemLabelDocumentListener();
154
155                jtextfield.addMouseListener(labelmouselistener);
156                jtextfield.getDocument().addDocumentListener(labelDocumentListener);
157                // TODO putting the jtextfield in as a property seems poor:
158                jtextfield.getDocument().putProperty("jTextFieldName", jtextfield);
159
160                return jtextfield;
161        }
162
163        private void createItemLabels(Item tmpItem) {
164
165                ItemLabel northlabel = new ItemLabel("");
166                northlabel.setPosition(ItemLabel.NORTH);
167                tmpItem.addLabel(northlabel);
168
169                ItemLabel southlabel = new ItemLabel("");
170                southlabel.setPosition(ItemLabel.SOUTH);
171                tmpItem.addLabel(southlabel);
172
173                ItemLabel westlabel = new ItemLabel("");
174                westlabel.setPosition(ItemLabel.WEST);
175                tmpItem.addLabel(westlabel);
176
177                ItemLabel eastlabel = new ItemLabel("");
178                eastlabel.setPosition(ItemLabel.EAST);
179                tmpItem.addLabel(eastlabel);
180        }
181
182
183        public DragAndDropPanel renderView(DragAndDropPanel columnPanel, 
184                        JRadioButton dynamicreportItemButton,
185                        List<LabelPanel> labelpanellist, DeleteItemButton delbutton,
186                        String tooltip) {
187
188                dynamicreportItemButton.setToolTipText(tooltip);
189                dynamicreportItemButton.setCursor(Cursor
190                                .getPredefinedCursor(Cursor.HAND_CURSOR));
191
192                int iconheight = dynamicreportItemButton.getIcon().getIconHeight();
193                int iconwidth = dynamicreportItemButton.getIcon().getIconWidth();
194
195                JPanel centerpanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
196                centerpanel.setToolTipText(tooltip);
197                centerpanel.setBackground(buttonbackgroundcolor);
198                centerpanel.setMinimumSize(new Dimension(iconwidth, iconheight));
199
200                JPanel gridpanel1 = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
201                JPanel gridpanel2 = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
202                JPanel gridpanel3 = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
203                JPanel gridpanel4 = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
204
205                gridpanel1.setBackground(buttonbackgroundcolor);
206                gridpanel2.setBackground(buttonbackgroundcolor);
207                gridpanel3.setBackground(buttonbackgroundcolor);
208                gridpanel4.setBackground(buttonbackgroundcolor);
209
210                columnPanel.setLayout(new GridLayout(3, 3, 0, 0));
211                dynamicreportItemButton.setToolTipText(tooltip);
212                dynamicreportItemButton.setEnabled(false);
213                
214                centerpanel.add(dynamicreportItemButton);
215                centerpanel.setBackground(buttonbackgroundcolor);
216
217                LabelPanel northlabelpanel = labelpanellist.get(0);
218                LabelPanel southlabelpanel = labelpanellist.get(1);
219                LabelPanel westlabelpanel = labelpanellist.get(2);
220                LabelPanel eastlabelpanel = labelpanellist.get(3);
221
222                columnPanel.add(gridpanel1);
223                columnPanel.add(northlabelpanel);
224                columnPanel.add(gridpanel2);
225
226                JToolBar toolbar = new JToolBar();
227                toolbar.setBackground(buttonbackgroundcolor);
228                toolbar.setFloatable(false);
229                toolbar.setBorderPainted(false);
230                toolbar.add(delbutton, BorderLayout.LINE_END);
231
232                gridpanel2.add(toolbar);
233                gridpanel2.setBackground(buttonbackgroundcolor);
234                columnPanel.add(westlabelpanel);
235                columnPanel.add(centerpanel);
236                columnPanel.add(eastlabelpanel);
237                columnPanel.add(gridpanel3);
238                columnPanel.add(southlabelpanel);
239                columnPanel.add(gridpanel4);
240
241                return columnPanel;
242
243        }
244
245
246        public void sendLabelValuesToModel(Item labeleditem, String labelcontents,
247                        String position) {
248
249                List<ItemLabel> tmplabelslist = labeleditem.getLabels();
250
251                if (position.equals(ItemLabel.NORTH)) {
252
253                        ItemLabel tmplabel = tmplabelslist.get(0);
254                        tmplabel.setValue(labelcontents);
255                        tmplabel.setPosition(position);
256                }
257
258                if (position.equals(ItemLabel.SOUTH)) {
259
260                        ItemLabel tmplabel = tmplabelslist.get(1);
261                        tmplabel.setValue(labelcontents);
262                        tmplabel.setPosition(position);
263                }
264
265                if (position.equals(ItemLabel.WEST)) {
266
267                        ItemLabel tmplabel = tmplabelslist.get(2);
268                        tmplabel.setValue(labelcontents);
269                        tmplabel.setPosition(position);
270                }
271
272                if (position.equals(ItemLabel.EAST)) {
273
274                        ItemLabel tmplabel = tmplabelslist.get(3);
275                        tmplabel.setValue(labelcontents);
276                        tmplabel.setPosition(position);
277                }
278
279        }
280
281        public class DynamicReportItemLabelDocumentListener implements
282                        DocumentListener {
283
284                public void changedUpdate(DocumentEvent e) {
285                }
286
287                public void insertUpdate(DocumentEvent e) {
288
289                        JTextField labelfieldtext = (JTextField) e.getDocument()
290                                        .getProperty("jTextFieldName");
291                        LabelPanel labeledpanel = (LabelPanel) labelfieldtext.getParent();
292
293                        Item labeleditem = labeledpanel.getAssociatedItem();
294                        String position = labelfieldtext.getName();
295                        String labelcontents = labelfieldtext.getText();
296                        sendLabelValuesToModel(labeleditem, labelcontents, position);
297
298                        _reportLayout.setModified(_tableauFrame);
299                }
300
301                public void removeUpdate(DocumentEvent e) {
302
303                        JTextField labelfieldtext = (JTextField) e.getDocument()
304                                        .getProperty("jTextFieldName");
305                        LabelPanel labeledpanel = (LabelPanel) labelfieldtext.getParent();
306
307                        Item labeleditem = labeledpanel.getAssociatedItem();
308                        String position = labelfieldtext.getName();
309                        String labelcontents = labelfieldtext.getText();
310                        sendLabelValuesToModel(labeleditem, labelcontents, position);
311
312                        _reportLayout.setModified(_tableauFrame);
313                }
314
315        }
316
317        public class DynamicReportItemLabelMouseListener implements MouseListener {
318
319                public void mouseClicked(MouseEvent e) {
320
321                        JTextField labelfieldtext = (JTextField) e.getSource();
322                        LabelPanel labeledpanel = (LabelPanel) labelfieldtext.getParent();
323                        DragAndDropPanel clickedPanel = (DragAndDropPanel) labeledpanel
324                                        .getParent();
325                        DragAndDropPanel prevPanel = _parentReportDesignerPanel
326                                        .getPrevPanel();
327
328                        if (!clickedPanel.equals(prevPanel)) {
329
330                                prevPanel.deselectPanel();
331                                clickedPanel.setSelected(true);
332                                clickedPanel.selectPanel();
333                                clickedPanel.setBorder(new OvalBorder(3, 3, Color.blue,
334                                                Color.blue));
335                                clickedPanel.setOpaque(false);
336                                clickedPanel
337                                                .setBackground(new Color(6, 128, 255, 129).darker());
338                                _parentReportDesignerPanel.setCurrPanel(clickedPanel);
339                                _parentReportDesignerPanel.setPrevPanel(clickedPanel);
340                        }
341
342                        // requestFocusInWindow();
343
344                        // redrawView();
345                        // renderReportLayout();
346                }
347
348                public void mouseEntered(MouseEvent e) {
349                }
350
351                public void mouseExited(MouseEvent e) {
352                }
353
354                public void mousePressed(MouseEvent e) {
355                }
356
357                public void mouseReleased(MouseEvent e) {
358                }
359
360        }
361
362}