1 32 33 package it.businesslogic.ireport.data.olap; 34 35 import it.businesslogic.ireport.FieldsProviderEditor; 36 import it.businesslogic.ireport.JRField; 37 import it.businesslogic.ireport.gui.MainFrame; 38 import it.businesslogic.ireport.gui.ReportQueryDialog; 39 import it.businesslogic.ireport.gui.sheet.Tag; 40 import java.io.StringReader ; 41 import java.util.Vector ; 42 import javax.swing.JOptionPane ; 43 import javax.swing.JTable ; 44 import javax.swing.SwingUtilities ; 45 import javax.swing.table.DefaultTableModel ; 46 import javax.swing.tree.DefaultMutableTreeNode ; 47 import javax.swing.tree.DefaultTreeModel ; 48 import javax.swing.tree.DefaultTreeSelectionModel ; 49 import javax.swing.tree.TreePath ; 50 import mondrian.olap.*; 51 52 import net.sf.jasperreports.olap.mapping.MappingLexer; 53 import net.sf.jasperreports.olap.mapping.MappingParser; 54 import it.businesslogic.ireport.util.I18n; 55 59 public class OlapBrowser extends javax.swing.JPanel implements FieldsProviderEditor { 60 61 private JTable jTableFields = null; 62 private ReportQueryDialog reportQueryDialog = null; 63 64 65 public OlapBrowser() { 66 initComponents(); 67 68 DefaultMutableTreeNode root = new DefaultMutableTreeNode (); 69 jTree1.setModel(new DefaultTreeModel (root)); 70 jTree1.setCellRenderer( new OlapTreeCellRenderer()); 71 72 jComboBoxType.addItem(new Tag("java.lang.String",I18n.getString("mdx.type.Text", "Text") )); 73 jComboBoxType.addItem(new Tag("java.lang.Number", I18n.getString("mdx.type.Numeric", "Numeric") )); 74 jComboBoxType.addItem(new Tag("java.util.Date", I18n.getString("mdx.type.Date", "Date"))); 75 jComboBoxType.addItem(new Tag("java.util.Date", I18n.getString("mdx.type.Boolean", "Boolean") )); 76 77 jComboBoxType.setSelectedIndex(0); 78 79 applyI18n(); 80 81 ((DefaultTreeSelectionModel )jTree1.getSelectionModel()).setSelectionMode(DefaultTreeSelectionModel.SINGLE_TREE_SELECTION ); 82 } 83 84 85 public void setOlapQuery(Query query) 86 { 87 88 89 DefaultTreeModel dtm = (DefaultTreeModel )jTree1.getModel(); 90 DefaultMutableTreeNode root = (DefaultMutableTreeNode )dtm.getRoot(); 91 root.removeAllChildren(); 92 93 if (query == null) 94 { 95 jTree1.updateUI(); 96 return; 97 } 98 99 QueryAxis[] axes = query.getAxes(); 100 101 Hierarchy[][] queryHierarchies = new Hierarchy[axes.length][]; 102 int[][] fieldsMaxDepths = new int[axes.length][]; 103 int[][] maxDepths = new int[axes.length][]; 104 105 int hCount = 0; 106 for (int i = 0; i < axes.length; i++) 107 { 108 queryHierarchies[i] = query.getMdxHierarchiesOnAxis(i); 109 110 DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (new WalkableWrapper(axes[i],root)); 111 112 if ( queryHierarchies[i].length == 1 && 113 queryHierarchies[i][0].getDimension().isMeasures()) 114 { 115 addChildren(childNode, axes[i].getChildren()); 116 } 117 else 118 { 119 addChildren(childNode, queryHierarchies[i]); 120 } 121 122 root.add(childNode ); 123 124 hCount += queryHierarchies[i].length; 125 fieldsMaxDepths[i] = new int[queryHierarchies[i].length]; 126 maxDepths[i] = new int[queryHierarchies[i].length]; 127 } 128 129 jTree1.updateUI(); 130 } 131 132 public void setOlapResult2(Result result) 133 { 134 DefaultTreeModel dtm = (DefaultTreeModel )jTree1.getModel(); 135 DefaultMutableTreeNode root = (DefaultMutableTreeNode )dtm.getRoot(); 136 root.removeAllChildren(); 137 138 if (result == null) 139 { 140 jTree1.updateUI(); 141 return; 142 } 143 144 146 147 QueryAxis[] axis = result.getQuery().getAxes(); 148 Axis[] raxis = result.getAxes(); 149 150 for (int i=0; i<axis.length; ++i) 151 { 152 DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (new WalkableWrapper(axis[i], root)); 153 addChildren(childNode, axis[i].getChildren()); 154 root.add(childNode ); 155 } 156 157 jTree1.updateUI(); 158 } 159 160 public void setOlapResultData(Result result) 161 { 162 DefaultTreeModel dtm = (DefaultTreeModel )jTree1.getModel(); 163 DefaultMutableTreeNode root = (DefaultMutableTreeNode )dtm.getRoot(); 164 root.removeAllChildren(); 165 166 if (result == null) 167 { 168 jTree1.updateUI(); 169 return; 170 } 171 172 174 175 QueryAxis[] axis = result.getQuery().getAxes(); 176 Axis[] raxis = result.getAxes(); 177 178 for (int i=0; i<axis.length; ++i) 179 { 180 DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (new WalkableWrapper(axis[i], root)); 181 Position[] positions = raxis[i].positions; 182 addChildren(childNode, positions); 183 root.add(childNode ); 184 } 185 186 jTree1.updateUI(); 187 } 188 189 public void addChildren(DefaultMutableTreeNode node, Object [] children) 190 { 191 if (children == null) return; 192 for (int i=0; i<children.length; ++i) 193 { 194 if (children[i] instanceof FunCall) 195 { 196 197 addChildren( node, ((FunCall)children[i]).getChildren()); 198 } 199 else 200 { 201 DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (new WalkableWrapper(children[i], node)); 202 if (children[i] instanceof Position) 203 { 204 addChildren(childNode, ((Position)children[i]).getMembers()); 205 } 206 else if (children[i] instanceof Hierarchy) 207 { 208 addChildren(childNode, ((Hierarchy)children[i]).getLevels()); 209 } 210 211 node.add(childNode ); 212 } 213 218 } 219 } 220 221 public JTable getJTableFields() { 222 return jTableFields; 223 } 224 225 public void setJTableFields(JTable jTableFields) { 226 this.jTableFields = jTableFields; 227 } 228 229 234 private void initComponents() { 236 java.awt.GridBagConstraints gridBagConstraints; 237 238 jScrollPane1 = new javax.swing.JScrollPane (); 239 jTree1 = new javax.swing.JTree (); 240 jLabel4 = new javax.swing.JLabel (); 241 jPanel1 = new javax.swing.JPanel (); 242 jLabel1 = new javax.swing.JLabel (); 243 jTextFieldName = new javax.swing.JTextField (); 244 jLabel3 = new javax.swing.JLabel (); 245 jComboBoxType = new javax.swing.JComboBox (); 246 jLabel2 = new javax.swing.JLabel (); 247 jTextFieldExpression = new javax.swing.JTextField (); 248 jPanel2 = new javax.swing.JPanel (); 249 jButton2 = new javax.swing.JButton (); 250 jButton1 = new javax.swing.JButton (); 251 252 setLayout(new java.awt.GridBagLayout ()); 253 254 setMinimumSize(new java.awt.Dimension (250, 85)); 255 setPreferredSize(new java.awt.Dimension (405, 384)); 256 jScrollPane1.setPreferredSize(new java.awt.Dimension (400, 322)); 257 jTree1.setRootVisible(false); 258 jTree1.addMouseListener(new java.awt.event.MouseAdapter () { 259 public void mouseClicked(java.awt.event.MouseEvent evt) { 260 jTree1MouseClicked(evt); 261 } 262 }); 263 264 jScrollPane1.setViewportView(jTree1); 265 266 gridBagConstraints = new java.awt.GridBagConstraints (); 267 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 268 gridBagConstraints.weightx = 1.0; 269 gridBagConstraints.weighty = 1.0; 270 gridBagConstraints.insets = new java.awt.Insets (0, 0, 2, 4); 271 add(jScrollPane1, gridBagConstraints); 272 273 jLabel4.setForeground(new java.awt.Color (0, 51, 255)); 274 jLabel4.setText("Double click on a tree element the get it's expression"); 275 gridBagConstraints = new java.awt.GridBagConstraints (); 276 gridBagConstraints.gridx = 0; 277 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 278 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; 279 gridBagConstraints.weightx = 1.0; 280 gridBagConstraints.insets = new java.awt.Insets (4, 4, 4, 4); 281 add(jLabel4, gridBagConstraints); 282 283 jPanel1.setLayout(new java.awt.GridBagLayout ()); 284 285 jLabel1.setText("Field name"); 286 gridBagConstraints = new java.awt.GridBagConstraints (); 287 gridBagConstraints.gridy = 0; 288 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 289 gridBagConstraints.insets = new java.awt.Insets (4, 4, 0, 0); 290 jPanel1.add(jLabel1, gridBagConstraints); 291 292 gridBagConstraints = new java.awt.GridBagConstraints (); 293 gridBagConstraints.gridy = 0; 294 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 295 gridBagConstraints.weightx = 0.5; 296 gridBagConstraints.insets = new java.awt.Insets (4, 4, 0, 0); 297 jPanel1.add(jTextFieldName, gridBagConstraints); 298 299 jLabel3.setText("Type"); 300 gridBagConstraints = new java.awt.GridBagConstraints (); 301 gridBagConstraints.gridy = 0; 302 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 303 gridBagConstraints.insets = new java.awt.Insets (4, 6, 0, 0); 304 jPanel1.add(jLabel3, gridBagConstraints); 305 306 jComboBoxType.setMinimumSize(new java.awt.Dimension (30, 19)); 307 jComboBoxType.setPreferredSize(new java.awt.Dimension (50, 19)); 308 gridBagConstraints = new java.awt.GridBagConstraints (); 309 gridBagConstraints.gridy = 0; 310 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 311 gridBagConstraints.weightx = 0.3; 312 gridBagConstraints.insets = new java.awt.Insets (4, 2, 0, 4); 313 jPanel1.add(jComboBoxType, gridBagConstraints); 314 315 jLabel2.setText("Expression"); 316 gridBagConstraints = new java.awt.GridBagConstraints (); 317 gridBagConstraints.gridy = 1; 318 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 319 gridBagConstraints.insets = new java.awt.Insets (4, 4, 0, 0); 320 jPanel1.add(jLabel2, gridBagConstraints); 321 322 gridBagConstraints = new java.awt.GridBagConstraints (); 323 gridBagConstraints.gridy = 1; 324 gridBagConstraints.gridwidth = 3; 325 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 326 gridBagConstraints.weightx = 1.0; 327 gridBagConstraints.insets = new java.awt.Insets (4, 4, 0, 4); 328 jPanel1.add(jTextFieldExpression, gridBagConstraints); 329 330 jPanel2.setLayout(new java.awt.GridBagLayout ()); 331 332 jButton2.setText("Clear"); 333 jButton2.addActionListener(new java.awt.event.ActionListener () { 334 public void actionPerformed(java.awt.event.ActionEvent evt) { 335 jButton2ActionPerformed(evt); 336 } 337 }); 338 339 gridBagConstraints = new java.awt.GridBagConstraints (); 340 gridBagConstraints.gridy = 5; 341 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; 342 gridBagConstraints.weightx = 1.0; 343 gridBagConstraints.insets = new java.awt.Insets (2, 0, 2, 4); 344 jPanel2.add(jButton2, gridBagConstraints); 345 346 jButton1.setText("Add field"); 347 jButton1.addActionListener(new java.awt.event.ActionListener () { 348 public void actionPerformed(java.awt.event.ActionEvent evt) { 349 jButton1ActionPerformed(evt); 350 } 351 }); 352 353 gridBagConstraints = new java.awt.GridBagConstraints (); 354 gridBagConstraints.gridy = 5; 355 gridBagConstraints.gridwidth = 2; 356 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; 357 gridBagConstraints.insets = new java.awt.Insets (2, 0, 2, 4); 358 jPanel2.add(jButton1, gridBagConstraints); 359 360 gridBagConstraints = new java.awt.GridBagConstraints (); 361 gridBagConstraints.gridx = 0; 362 gridBagConstraints.gridwidth = 5; 363 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 364 gridBagConstraints.weightx = 1.0; 365 jPanel1.add(jPanel2, gridBagConstraints); 366 367 gridBagConstraints = new java.awt.GridBagConstraints (); 368 gridBagConstraints.gridx = 0; 369 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 370 gridBagConstraints.weightx = 1.0; 371 add(jPanel1, gridBagConstraints); 372 373 } 375 private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { 377 jTextFieldName.setText(""); 378 jComboBoxType.setSelectedIndex(0); 379 jTextFieldExpression.setText(""); 380 381 } 383 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 385 if (jTextFieldName.getText().length() == 0) 386 { 387 JOptionPane.showMessageDialog(this, I18n.getString("message.olapBrowser.notValidFieldName","Field name not valid"),I18n.getString("message.title.error","Error"), JOptionPane.ERROR_MESSAGE); 388 return; 389 390 } 391 if (jTextFieldExpression.getText().length() == 0) 392 { 393 JOptionPane.showMessageDialog(this,I18n.getString("message.olapBrowser.notValidFieldExpression","Field expression not valid"), I18n.getString("message.title.error","Error"), JOptionPane.ERROR_MESSAGE); 394 return; 395 } 396 397 JRField field = new JRField(jTextFieldName.getText().trim(), ""+((Tag)jComboBoxType.getSelectedItem()).getValue() ); 398 field.setDescription( jTextFieldExpression.getText() ); 399 400 415 416 417 if (fieldAlreadyExists(field)) 418 { 419 JOptionPane.showMessageDialog(this,I18n.getString("message.olapBrowser.fieldDuplicated","A field with this name is already present"), I18n.getString("message.title.error","Error"), JOptionPane.ERROR_MESSAGE); 420 return; 421 } 422 423 Vector row = new Vector (); 424 row.addElement(field); 425 row.addElement(field.getClassType()); 426 row.addElement(field.getDescription()); 427 428 DefaultTableModel dtm = (DefaultTableModel )getJTableFields().getModel(); 429 dtm.addRow(row); 430 getJTableFields().getSelectionModel().addSelectionInterval( getJTableFields().getRowCount()-1, getJTableFields().getRowCount()-1 ); 431 432 433 } 435 private void jTree1MouseClicked(java.awt.event.MouseEvent evt) { 437 if (evt.getClickCount() == 2 && evt.getButton() == evt.BUTTON1) 438 { 439 TreePath tp = jTree1.getSelectionPath(); 440 if (tp != null) 441 { 442 WalkableWrapper ww = (WalkableWrapper)((DefaultMutableTreeNode )tp.getLastPathComponent()).getUserObject(); 443 444 String exp = ww.getExpression(); 445 if (exp != null) 446 { 447 if (ww.isMeasure()) 448 { 449 jTextFieldName.setText( ww+""); 450 jTextFieldExpression.setText( exp); 451 } 452 else 453 { 454 String newexp = jTextFieldExpression.getText(); 455 int ss = ( jTextFieldExpression.getSelectionStart() >= 0 ) ? jTextFieldExpression.getSelectionStart() : jTextFieldExpression.getCaretPosition(); 456 int se = ( jTextFieldExpression.getSelectionEnd() >= 0 ) ? jTextFieldExpression.getSelectionEnd() : jTextFieldExpression.getCaretPosition(); 457 newexp = newexp.substring(0,ss) + exp + newexp.substring(se); 458 jTextFieldExpression.setText( newexp); 459 jTextFieldExpression.requestFocusInWindow(); 460 } 461 } 462 } 463 464 465 466 } 467 } 469 470 private boolean fieldAlreadyExists(JRField field) 471 { 472 boolean found = false; 473 for (int j=0; j<getJTableFields().getRowCount(); ++j) 474 { 475 Object ff = getJTableFields().getValueAt(j, 0); 476 if ( ff instanceof it.businesslogic.ireport.JRField ) 477 { 478 if ( ((it.businesslogic.ireport.JRField)ff).getName().equals(field.getName())) 479 { 480 found = true; 481 break; 482 } 483 } 484 } 485 486 return found; 487 } 488 private javax.swing.JButton jButton1; 490 private javax.swing.JButton jButton2; 491 private javax.swing.JComboBox jComboBoxType; 492 private javax.swing.JLabel jLabel1; 493 private javax.swing.JLabel jLabel2; 494 private javax.swing.JLabel jLabel3; 495 private javax.swing.JLabel jLabel4; 496 private javax.swing.JPanel jPanel1; 497 private javax.swing.JPanel jPanel2; 498 private javax.swing.JScrollPane jScrollPane1; 499 private javax.swing.JTextField jTextFieldExpression; 500 private javax.swing.JTextField jTextFieldName; 501 private javax.swing.JTree jTree1; 502 504 public void applyI18n(){ 505 jButton1.setText(I18n.getString("olapBrowser.button1","Add field")); 507 jButton2.setText(I18n.getString("olapBrowser.button2","Clear")); 508 jLabel1.setText(I18n.getString("olapBrowser.label1","Field name")); 509 jLabel2.setText(I18n.getString("olapBrowser.label2","Expression")); 510 jLabel3.setText(I18n.getString("olapBrowser.label3","Type")); 511 jLabel4.setText(I18n.getString("olapBrowser.label4","Double click on a tree element the get it's expression")); 512 } 514 515 516 int lastExecution = 0; 517 518 public void queryChanged(String newQuery) { 519 520 lastExecution++; 521 int thisExecution = lastExecution; 522 524 String error_msg = ""; 525 lastExecution++; 526 527 int in = lastExecution; 528 529 getReportQueryDialog().getJLabelStatusSQL().setText("Executing MDX query...."); 530 532 try { 533 Thread.currentThread().setContextClassLoader( MainFrame.getMainInstance().getReportClassLoader()); 534 } catch (Exception ex) 535 { 536 ex.printStackTrace(); 537 } 538 539 if (in < lastExecution) return; 541 OLAPQueryExecuter olapQE = new OLAPQueryExecuter(newQuery, getReportQueryDialog().getSubDataset().getParameters()); 542 543 String lastError = ""; 544 try { 545 546 final mondrian.olap.Query query = olapQE.createOlapQuery(); 548 549 if (in < lastExecution) return; SwingUtilities.invokeAndWait( new Runnable () { 551 public void run() { 552 setOlapQuery( query ); 553 } 554 } ); 555 556 } catch (Exception ex) 557 { 558 ex.printStackTrace(); 559 setOlapQuery( null ); 560 lastError = " (Last error was " + ex.getMessage() +")"; 561 } 562 563 getReportQueryDialog().getJLabelStatusSQL().setText("Ready"); 564 } 565 566 public ReportQueryDialog getReportQueryDialog() { 567 return reportQueryDialog; 568 } 569 570 public void setReportQueryDialog(ReportQueryDialog reportQueryDialog) { 571 this.reportQueryDialog = reportQueryDialog; 572 } 573 } 574 | Popular Tags |