/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2017 Pentaho and others // Copyright (C) 2006-2007 CINCOM SYSTEMS, INC. // All Rights Reserved. */ package mondrian.gui; import org.apache.log4j.Logger; import org.eigenbase.xom.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.border.EtchedBorder; import javax.swing.event.*; import javax.swing.plaf.basic.BasicArrowButton; import javax.swing.table.*; import javax.swing.text.DefaultEditorKit; import javax.swing.text.PlainDocument; import javax.swing.tree.*; /** * @author sean */ public class SchemaExplorer extends javax.swing.JPanel implements TreeSelectionListener, CellEditorListener { private static final Logger LOGGER = Logger.getLogger(SchemaExplorer.class); private final Workbench workbench; private MondrianGuiDef.Schema schema; private SchemaTreeModel model; private SchemaTreeCellRenderer renderer; private File schemaFile; private JTreeUpdater updater; private final ClassLoader myClassLoader; private boolean newFile; // indicates file is without changes, dirty=true when some changes are made // to the file private boolean dirty = false; // indicates dirty status shown on title private boolean dirtyFlag = false; private JInternalFrame parentIFrame; private JdbcMetaData jdbcMetaData; private boolean editModeXML = false; private String errMsg = null; /** * Creates new form SchemaExplorer */ public SchemaExplorer(Workbench workbench) { this.workbench = workbench; myClassLoader = this.getClass().getClassLoader(); initComponents(); } public SchemaExplorer( Workbench workbench, File f, JdbcMetaData jdbcMetaData, boolean newFile, JInternalFrame parentIFrame) { this(workbench); alert = getResourceConverter().getString( "schemaExplorer.alert.title", "Alert"); // XML editor try { jEditorPaneXML = new JEditorPane(); } catch (Exception ex) { LOGGER.error("SchemaExplorer-JEditorPane", ex); } jEditorPaneXML.setLayout(new java.awt.BorderLayout()); jEditorPaneXML.setEditable(false); jScrollPaneXML = new JScrollPane(jEditorPaneXML); jPanelXML.setLayout(new java.awt.BorderLayout()); jPanelXML.add(jScrollPaneXML, java.awt.BorderLayout.CENTER); jPanelXML.add(targetLabel2, java.awt.BorderLayout.NORTH); jPanelXML.add(validStatusLabel2, java.awt.BorderLayout.SOUTH); jPanelXML.setMaximumSize(jPanel1.getMaximumSize()); jPanelXML.setPreferredSize(jPanel1.getPreferredSize()); databaseLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.database.text", "Database - {0} ({1})", nvl(jdbcMetaData.getDbCatalogName()), jdbcMetaData.getDatabaseProductName())); try { Parser xmlParser = XOMUtil.createDefaultParser(); this.schemaFile = f; this.setNewFile(newFile); this.parentIFrame = parentIFrame; this.jdbcMetaData = jdbcMetaData; if (newFile) { schema = new MondrianGuiDef.Schema(); schema.parameters = new MondrianGuiDef.Parameter[0]; schema.cubes = new MondrianGuiDef.Cube[0]; schema.dimensions = new MondrianGuiDef.Dimension[0]; schema.namedSets = new MondrianGuiDef.NamedSet[0]; schema.roles = new MondrianGuiDef.Role[0]; schema.userDefinedFunctions = new MondrianGuiDef.UserDefinedFunction[0]; schema.virtualCubes = new MondrianGuiDef.VirtualCube[0]; String sname = schemaFile.getName(); int ext = sname.indexOf("."); if (ext != -1) { schema.name = "New " + sname.substring(0, ext); } } else { try { schema = new MondrianGuiDef.Schema( xmlParser.parse( schemaFile.toURL())); } catch (XOMException ex) { // Parsing error of the schema file causes default tree of // colors etc. to be displayed in schema explorer. // Initialize the schema to display an empty schema if you // want to show schema explorer for file where parsing // failed. ex.printStackTrace(); schema = new MondrianGuiDef.Schema(); schema.parameters = new MondrianGuiDef.Parameter[0]; schema.cubes = new MondrianGuiDef.Cube[0]; schema.dimensions = new MondrianGuiDef.Dimension[0]; schema.namedSets = new MondrianGuiDef.NamedSet[0]; schema.roles = new MondrianGuiDef.Role[0]; schema.userDefinedFunctions = new MondrianGuiDef.UserDefinedFunction[0]; schema.virtualCubes = new MondrianGuiDef.VirtualCube[0]; LOGGER.error( "Exception : Schema file parsing failed." + ex.getMessage(), ex); errMsg = getResourceConverter().getFormattedString( "schemaExplorer.parsing.error", "Parsing Error: Could not open file {0}\n{1}", schemaFile.toString(), ex.getLocalizedMessage()); } } // sets title of i frame with schema name and file name setTitle(); renderer = new SchemaTreeCellRenderer(workbench, jdbcMetaData); model = new SchemaTreeModel(schema); tree.setModel(model); tree.setCellRenderer(renderer); tree.addTreeSelectionListener(this); JComboBox listEditor = new JComboBox( new String[]{ getResourceConverter().getString( "schemaExplorer.hierarchy.select.join", "Join"), getResourceConverter().getString( "schemaExplorer.hierarchy.select.table", "Table") }); listEditor.setToolTipText( getResourceConverter().getString( "schemaExplorer.hierarchy.select.title", "Select Join or Table Hierarchy")); listEditor.setPreferredSize( new java.awt.Dimension( listEditor.getPreferredSize().width, 24)); // Do not remove this listEditor.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { tree.stopEditing(); TreePath tpath = tree.getSelectionPath(); if (tpath != null) { TreePath parentpath = tpath.getParentPath(); if (parentpath != null) { refreshTree(parentpath); } } } }); TreeCellEditor comboEditor = new DefaultCellEditor(listEditor); SchemaTreeCellEditor editor = new SchemaTreeCellEditor( workbench, tree, renderer, comboEditor); tree.setCellEditor(editor); tree.setEditable(true); SchemaPropertyCellEditor spce = new SchemaPropertyCellEditor( workbench, jdbcMetaData); spce.addCellEditorListener(this); propertyTable.setDefaultEditor(Object.class, spce); // to set background color of attribute columns SchemaPropertyCellRenderer.attributeBackground = jScrollPane2.getBackground(); SchemaPropertyCellRenderer spcr = new SchemaPropertyCellRenderer(workbench); propertyTable.setDefaultRenderer(Object.class, spcr); } catch (Exception ex) { LOGGER.error("SchemaExplorer init error", ex); } } private static String nvl(String s) { return s == null ? "" : s; } /** * Called from within the constructor to initialize the form. */ private void initComponents() { jPanelXML = new JPanel(); jScrollPaneXML = new JScrollPane(); footer = new JPanel(); databaseLabel = new javax.swing.JLabel(); jSeparator1 = new JSeparator(); jSeparator2 = new JSeparator(); jSplitPane1 = new JSplitPane(); jPanel1 = new JPanel(); jScrollPane2 = new JScrollPane(); // propertyTable includes changeSelection and processKeyEvent // processing for keyboard navigation propertyTable = new JTable() { public void changeSelection( int rowIndex, int columnIndex, boolean toggle, boolean extend) { if (columnIndex == 0) { AWTEvent currentEvent = EventQueue.getCurrentEvent(); if (currentEvent instanceof KeyEvent) { KeyEvent ke = (KeyEvent) currentEvent; int kcode = ke.getKeyCode(); if (kcode == KeyEvent.VK_TAB) { if ((ke.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK) { rowIndex -= 1; if (rowIndex < 0) { rowIndex = propertyTable.getRowCount() - 1; } } setTableCellFocus(rowIndex); return; } } } super.changeSelection(rowIndex, columnIndex, toggle, extend); } public void processKeyEvent(KeyEvent e) { int kcode = e.getKeyCode(); if (kcode == KeyEvent.VK_UP || kcode == KeyEvent.VK_DOWN) { int row = propertyTable.getSelectedRow(); setTableCellFocus(row); return; } super.processKeyEvent(e); } }; targetLabel = new javax.swing.JLabel(); validStatusLabel = new javax.swing.JLabel(); targetLabel2 = new javax.swing.JLabel(); validStatusLabel2 = new javax.swing.JLabel(); jPanel2 = new JPanel(); jScrollPane1 = new JScrollPane(); tree = new JTree(); tree.getSelectionModel().setSelectionMode( DefaultTreeSelectionModel.SINGLE_TREE_SELECTION); ToolTipManager.sharedInstance().registerComponent(tree); jToolBar1 = new JToolBar(); addCubeButton = new JButton(); addDimensionButton = new JButton(); addDimensionUsageButton = new JButton(); addHierarchyButton = new JButton(); addNamedSetButton = new JButton(); addUserDefinedFunctionButton = new JButton(); addRoleButton = new JButton(); addMeasureButton = new JButton(); addCalculatedMemberButton = new JButton(); addLevelButton = new JButton(); addPropertyButton = new JButton(); addCalculatedMemberPropertyButton = new JButton(); addVirtualCubeButton = new JButton(); addVirtualCubeDimensionButton = new JButton(); addVirtualCubeMeasureButton = new JButton(); cutButton = new JButton(new DefaultEditorKit.CutAction()); copyButton = new JButton(new DefaultEditorKit.CopyAction()); pasteButton = new JButton(new DefaultEditorKit.PasteAction()); deleteButton = new JButton(); editModeButton = new JToggleButton(); setLayout(new BorderLayout()); jSplitPane1.setDividerLocation(200); jPanel1.setLayout(new BorderLayout()); propertyTable.setModel( new DefaultTableModel( new Object[][]{ }, new String[]{ getResourceConverter().getString( "schemaExplorer.propertyTable.attribute", "Attribute"), getResourceConverter().getString( "schemaExplorer.propertyTable.value", "Value") }) { Class[] types = {String.class, Object.class}; boolean[] canEdit = {false, true}; public Class getColumnClass(int columnIndex) { return types[columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit[columnIndex]; } }); // Set property table column headers to bold. propertyTable.getTableHeader().setFont( new Font( "Dialog", Font.BOLD, 12)); jScrollPane2.setViewportView(propertyTable); jPanel1.add(jScrollPane2, java.awt.BorderLayout.CENTER); targetLabel.setFont(new Font("Dialog", 1, 14)); targetLabel.setForeground( (Color) UIManager.getDefaults().get( "CheckBoxMenuItem.acceleratorForeground")); targetLabel.setHorizontalAlignment(SwingConstants.CENTER); targetLabel.setText( getResourceConverter().getString( "schemaExplorer.targetLabel.title", "Schema")); targetLabel.setBorder(new EtchedBorder()); // up arrow button for property table heading jPanel3 = new JPanel(); jPanel3.setLayout(new BorderLayout()); BasicArrowButton arrowButtonUp = new BasicArrowButton(SwingConstants.NORTH); BasicArrowButton arrowButtonDown = new BasicArrowButton(SwingConstants.SOUTH); arrowButtonUp.setToolTipText( getResourceConverter().getString( "schemaExplorer.arrowButtonUp.toolTip", "move to parent element")); arrowButtonDown.setToolTipText( getResourceConverter().getString( "schemaExplorer.arrowButtonDown.toolTip", "move to child element")); arrowButtonUpAction = new AbstractAction( getResourceConverter().getString( "schemaExplorer.arrowButtonUp.title", "Arrow button up")) { public void actionPerformed(ActionEvent e) { arrowButtonUpAction(e); } }; arrowButtonDownAction = new AbstractAction( getResourceConverter().getString( "schemaExplorer.arrowButtonDown.title", "Arrow button down")) { public void actionPerformed(ActionEvent e) { arrowButtonDownAction(e); } }; arrowButtonUp.addActionListener(arrowButtonUpAction); arrowButtonDown.addActionListener(arrowButtonDownAction); jPanel3.add(arrowButtonDown, java.awt.BorderLayout.EAST); jPanel3.add(arrowButtonUp, java.awt.BorderLayout.WEST); jPanel3.add(targetLabel, java.awt.BorderLayout.CENTER); jPanel1.add(jPanel3, java.awt.BorderLayout.NORTH); validStatusLabel.setFont(new Font("Dialog", Font.PLAIN, 12)); validStatusLabel.setForeground(Color.RED); validStatusLabel.setHorizontalAlignment(SwingConstants.CENTER); jPanel1.add(validStatusLabel, java.awt.BorderLayout.SOUTH); // for XML viewing targetLabel2.setFont(new Font("Dialog", 1, 14)); targetLabel2.setForeground( (Color) UIManager.getDefaults().get( "CheckBoxMenuItem.acceleratorForeground")); targetLabel2.setHorizontalAlignment(SwingConstants.CENTER); targetLabel2.setText( getResourceConverter().getString( "schemaExplorer.targetLabel.title", "Schema")); targetLabel2.setBorder(new EtchedBorder()); validStatusLabel2.setFont(new Font("Dialog", Font.PLAIN, 12)); validStatusLabel2.setForeground(Color.RED); validStatusLabel2.setHorizontalAlignment(SwingConstants.CENTER); jSplitPane1.setRightComponent(jPanel1); jPanel2.setLayout(new java.awt.BorderLayout()); jScrollPane1.setViewportView(tree); jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER); jSplitPane1.setLeftComponent(jPanel2); // ======================================================== // actions // ======================================================== addCube = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCube.title", "Add Cube")) { public void actionPerformed(ActionEvent e) { addCube(e); } }; addParameter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addParameter.title", "Add Parameter")) { public void actionPerformed(ActionEvent e) { addParameter(e); } }; addDimension = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addDimension.title", "Add Dimension")) { public void actionPerformed(ActionEvent e) { addDimension(e); } }; addDimensionUsage = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addDimensionUsage.title", "Add Dimension Usage")) { public void actionPerformed(ActionEvent e) { addDimensionUsage(e); } }; addHierarchy = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addHierarchy.title", "Add Hierarchy")) { public void actionPerformed(ActionEvent e) { addHierarchy(e); } }; addNamedSet = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addNamedSet.title", "Add Named Set")) { public void actionPerformed(ActionEvent e) { addNamedSet(e); } }; addMeasure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMeasure.title", "Add Measure")) { public void actionPerformed(ActionEvent e) { addMeasure(e); } }; addCalculatedMember = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCalculatedMember.title", "Add Calculated Member")) { public void actionPerformed(ActionEvent e) { addCalculatedMember(e); } }; addUserDefinedFunction = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addUserDefinedFunction.title", "Add User Defined Function")) { public void actionPerformed(ActionEvent e) { addUserDefinedFunction(e); } }; addScript = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addScript.title", "Add Script")) { public void actionPerformed(ActionEvent e) { addScript(e); } }; addCellFormatter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCellFormatter.title", "Add Cell Formatter")) { public void actionPerformed(ActionEvent e) { addCellFormatter(e); } }; addPropertyFormatter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addPropertyFormatter.title", "Add Property Formatter")) { public void actionPerformed(ActionEvent e) { addPropertyFormatter(e); } }; addMemberFormatter = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMemberFormatter.title", "Add Member Formatter")) { public void actionPerformed(ActionEvent e) { addMemberFormatter(e); } }; addRole = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addRole.title", "Add Role")) { public void actionPerformed(ActionEvent e) { addRole(e); } }; addSchemaGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addSchemaGrant.title", "Add Schema Grant")) { public void actionPerformed(ActionEvent e) { addSchemaGrant(e); } }; addCubeGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCubeGrant.title", "Add Cube Grant")) { public void actionPerformed(ActionEvent e) { addCubeGrant(e); } }; addDimensionGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addDimensionGrant.title", "Add Dimension Grant")) { public void actionPerformed(ActionEvent e) { addDimensionGrant(e); } }; addHierarchyGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addHierarchyGrant.title", "Add Hierarchy Grant")) { public void actionPerformed(ActionEvent e) { addHierarchyGrant(e); } }; addMemberGrant = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMemberGrant.title", "Add Member Grant")) { public void actionPerformed(ActionEvent e) { addMemberGrant(e); } }; addAnnotations = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAnnotations.title", "Add Annotations")) { public void actionPerformed(ActionEvent e) { addAnnotations(e); } }; addAnnotation = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAnnotation.title", "Add Annotation")) { public void actionPerformed(ActionEvent e) { addAnnotation(e); } }; addLevel = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addLevel.title", "Add Level")) { public void actionPerformed(ActionEvent e) { addLevel(e); } }; addClosure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addClosure.title", "Add Closure")) { public void actionPerformed(ActionEvent e) { addClosure(e); } }; addKeyExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addKeyExpression.title", "Add Key Expression")) { public void actionPerformed(ActionEvent e) { addKeyExp(e); } }; addNameExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addNameExpression.title", "Add Name Expression")) { public void actionPerformed(ActionEvent e) { addNameExp(e); } }; addOrdinalExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addOrdinalExpression.title", "Add Ordinal Expression")) { public void actionPerformed(ActionEvent e) { addOrdinalExp(e); } }; addCaptionExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCaptionExpression.title", "Add Caption Expression")) { public void actionPerformed(ActionEvent e) { addCaptionExp(e); } }; addParentExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addParentExpression.title", "Add Parent Expression")) { public void actionPerformed(ActionEvent e) { addParentExp(e); } }; addMeasureExp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addMeasureExpression.title", "Add Measure Expression")) { public void actionPerformed(ActionEvent e) { addMeasureExp(e); } }; addFormula = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addFormula.title", "Add Formula")) { public void actionPerformed(ActionEvent e) { addFormula(e); } }; addSQL = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addSQL.title", "Add SQL")) { public void actionPerformed(ActionEvent e) { addSQL(e); } }; addTable = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addTable.title", "Add Table")) { public void actionPerformed(ActionEvent e) { addTable(e); } }; addJoin = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addJoin.title", "Add Join")) { public void actionPerformed(ActionEvent e) { addJoin(e); } }; addView = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addView.title", "Add View")) { public void actionPerformed(ActionEvent e) { addView(e); } }; addInlineTable = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addInlineTable.title", "Add Inline Table")) { public void actionPerformed(ActionEvent e) { addInlineTable(e); } }; moveLevelUp = new AbstractAction( getResourceConverter().getString( "schemaExplorer.moveLevelUp.title", "Move Up")) { public void actionPerformed(ActionEvent e) { moveLevelUp(e); } }; moveLevelDown = new AbstractAction( getResourceConverter().getString( "schemaExplorer.moveLevelDown.title", "Move Down")) { public void actionPerformed(ActionEvent e) { moveLevelDown(e); } }; addProperty = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addProperty.title", "Add Property")) { public void actionPerformed(ActionEvent e) { addProperty(e); } }; addCalculatedMemberProperty = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addCalculatedMemberProperty.title", "Add Calculated Member Property")) { public void actionPerformed(ActionEvent e) { addCalculatedMemberProperty(e); } }; addVirtualCube = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addVirtualCube.title", "Add Virtual Cube")) { public void actionPerformed(ActionEvent e) { addVirtualCube(e); } }; addVirtualCubeDimension = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addVirtualCubeDimension.title", "Add Virtual Cube Dimension")) { public void actionPerformed(ActionEvent e) { addVirtualCubeDimension(e); } }; addVirtualCubeMeasure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addVirtualCubeMeasure.title", "Add Virtual Cube Measure")) { public void actionPerformed(ActionEvent e) { addVirtualCubeMeasure(e); } }; addAggPattern = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregatePattern.title", "Add Aggregate Pattern")) { public void actionPerformed(ActionEvent e) { addAggPattern(e); } }; addAggExclude = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateExcludeTable.title", "Add Aggregate Exclude Table")) { public void actionPerformed(ActionEvent e) { addAggExclude(e); } }; addAggName = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateName.title", "Add Aggregate Name")) { public void actionPerformed(ActionEvent e) { addAggName(e); } }; addAggIgnoreColumn = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateIgnoreColumn.title", "Add Aggregate Ignore Column")) { public void actionPerformed(ActionEvent e) { addAggIgnoreColumn(e); } }; addAggForeignKey = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateForeignKey.title", "Add Aggregate Foreign Key")) { public void actionPerformed(ActionEvent e) { addAggForeignKey(e); } }; addAggMeasure = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateMeasure.title", "Add Aggregate Measure")) { public void actionPerformed(ActionEvent e) { addAggMeasure(e); } }; addAggLevel = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateLevel.title", "Add Aggregate Level")) { public void actionPerformed(ActionEvent e) { addAggLevel(e); } }; addAggLevelProperty = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateLevelProperty.title", "Add Aggregate Level Property")) { public void actionPerformed(ActionEvent e) { addAggLevelProperty(e); } }; addAggFactCount = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateFactCount.title", "Add Aggregate Fact Count")) { public void actionPerformed(ActionEvent e) { addAggFactCount(e); } }; addAggMeasureFactCount = new AbstractAction( getResourceConverter().getString( "schemaExplorer.addAggregateMeasureFactCount.title", "Add Aggregate Measure Fact Count")) { public void actionPerformed(ActionEvent e) { addAggMeasureFactCount(e); } }; delete = new AbstractAction( getResourceConverter().getString( "schemaExplorer.actionDelete.title", "Delete")) { public void actionPerformed(ActionEvent e) { delete(e); } }; editMode = new AbstractAction( getResourceConverter().getString( "schemaExplorer.actionEdit.title", "EditMode")) { public void actionPerformed(ActionEvent e) { editMode(e); } }; // ======================================================== // toolbar buttons // ======================================================== addCubeButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addCube")))); addCubeButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addCube.title", "Add cube")); addCubeButton.addActionListener(addCube); addDimensionButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addDimension")))); addDimensionButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addDimension.title", "Add Dimension")); addDimensionButton.addActionListener(addDimension); addDimensionUsageButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addDimensionUsage")))); addDimensionUsageButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addDimensionUsage.title", "Add Dimension Usage")); addDimensionUsageButton.addActionListener(addDimensionUsage); addHierarchyButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addHierarchy")))); addHierarchyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addHierarchy.title", "Add Hierarchy")); addHierarchyButton.addActionListener(addHierarchy); addNamedSetButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addNamedSet")))); addNamedSetButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addNamedSet.title", "Add Named Set")); addNamedSetButton.addActionListener(addNamedSet); addUserDefinedFunctionButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addUserDefinedFunction")))); addUserDefinedFunctionButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addUserDefinedFunction.title", "Add User defined Function")); addUserDefinedFunctionButton.addActionListener(addUserDefinedFunction); addCalculatedMemberButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addCalculatedMember")))); addCalculatedMemberButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addCalculatedMember.title", "Add Calculated Member")); addCalculatedMemberButton.addActionListener(addCalculatedMember); addMeasureButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addMeasure")))); addMeasureButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addMeasure.title", "Add Measure")); addMeasureButton.addActionListener(addMeasure); addLevelButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addLevel")))); addLevelButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addLevel.title", "Add Level")); addLevelButton.addActionListener(addLevel); addPropertyButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addProperty")))); addPropertyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addProperty.title", "Add Property")); addPropertyButton.addActionListener(addProperty); addCalculatedMemberPropertyButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addCalculatedMemberProperty")))); addCalculatedMemberPropertyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addCalculatedMemberProperty.title", "Add Calculated Member Property")); addCalculatedMemberPropertyButton.addActionListener( addCalculatedMemberProperty); addVirtualCubeButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addVirtualCube")))); addVirtualCubeButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addVirtualCube.title", "Add Virtual Cube")); addVirtualCubeButton.addActionListener(addVirtualCube); addVirtualCubeDimensionButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addVirtualCubeDimension")))); addVirtualCubeDimensionButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addVirtualCubeDimension.title", "Add Virtual Dimension")); addVirtualCubeDimensionButton .addActionListener(addVirtualCubeDimension); addVirtualCubeMeasureButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference( "addVirtualCubeMeasure")))); addVirtualCubeMeasureButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addVirtualCubeMeasure.title", "Add Virtual Measure")); addVirtualCubeMeasureButton.addActionListener(addVirtualCubeMeasure); addRoleButton.setIcon( new ImageIcon( myClassLoader.getResource( getResourceConverter().getGUIReference("addRole")))); addRoleButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.addRole.title", "Add Role")); addRoleButton.addActionListener(addRole); cutButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("cut")))); cutButton.setText(""); cutButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionCut.title", "Cut")); copyButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("copy")))); copyButton.setText(""); copyButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionCopy.title", "Copy")); pasteButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("paste")))); pasteButton.setText(""); pasteButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionPaste.title", "Paste")); deleteButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("delete")))); deleteButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionDelete.title", "Delete")); deleteButton.addActionListener(delete); editModeButton.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("edit")))); editModeButton.setToolTipText( getResourceConverter().getString( "schemaExplorer.actionEdit.title", "Edit Mode")); editModeButton.addActionListener(editMode); databaseLabel.setIcon( new javax.swing.ImageIcon( getClass().getResource( getResourceConverter().getGUIReference("database")))); jToolBar1.add(addCubeButton); jToolBar1.add(addDimensionButton); jToolBar1.add(addDimensionUsageButton); jToolBar1.add(addHierarchyButton); jToolBar1.add(addNamedSetButton); jToolBar1.add(addUserDefinedFunctionButton); jToolBar1.add(addCalculatedMemberButton); jToolBar1.add(addMeasureButton); jToolBar1.add(addLevelButton); jToolBar1.add(addPropertyButton); jToolBar1.add(addCalculatedMemberPropertyButton); jToolBar1.addSeparator(); jToolBar1.add(addVirtualCubeButton); jToolBar1.add(addVirtualCubeDimensionButton); jToolBar1.add(addVirtualCubeMeasureButton); jToolBar1.addSeparator(); jToolBar1.add(addRoleButton); jToolBar1.addSeparator(); jToolBar1.add(cutButton); jToolBar1.add(copyButton); jToolBar1.add(pasteButton); jToolBar1.addSeparator(); jToolBar1.add(deleteButton); jToolBar1.addSeparator(); jToolBar1.add(editModeButton); // ======================================================== // popup menu // ======================================================== jPopupMenu = new CustomJPopupMenu(); // ======================================================== // tree mouse listener // ======================================================== tree.addMouseListener(new PopupTrigger()); tree.addKeyListener( new KeyAdapter() { public void keyPressed(KeyEvent e) { // keytext=Delete // keycode=127 // keytext=NumPad . // keycode=110 int kcode = e.getKeyCode(); if (kcode == 127 || kcode == 110) { delete(e); } } }); // add footer for connected database footer.setLayout(new java.awt.BorderLayout()); footer.add(databaseLabel, java.awt.BorderLayout.CENTER); // ======================================================== // jpanel // ======================================================== this.add(jSplitPane1, java.awt.BorderLayout.CENTER); this.add(jToolBar1, java.awt.BorderLayout.NORTH); this.add(footer, java.awt.BorderLayout.SOUTH); updater = new JTreeUpdater(tree); } protected void arrowButtonUpAction(ActionEvent evt) { TreePath tpath = tree.getSelectionPath(); if (tpath != null) { TreePath parentpath = tpath.getParentPath(); if (parentpath != null) { tree.setSelectionPath(parentpath); refreshTree(parentpath); } } } protected void arrowButtonDownAction(ActionEvent evt) { TreePath tpath = tree.getSelectionPath(); if (tpath != null) { Object current = tpath.getLastPathComponent(); Object child = tree.getModel().getChild(current, 0); if (child != null) { Object[] treeObjs = new Object[30]; treeObjs[0] = child; treeObjs[1] = current; // traverse upward through tree, saving parent nodes TreePath parentpath; parentpath = tpath.getParentPath(); int objCnt = 2; while (parentpath != null) { Object po = parentpath.getLastPathComponent(); treeObjs[objCnt] = po; objCnt += 1; parentpath = parentpath.getParentPath(); } // reverse the array so that schema is first, then the children Object[] nodes = new Object[objCnt]; int loopCnt = objCnt - 1; for (int j = 0; j < objCnt; j++) { nodes[j] = treeObjs[loopCnt]; loopCnt--; } TreePath childPath = new TreePath(nodes); tree.setSelectionPath(childPath); refreshTree(childPath); } } } /** * Several methods are called, e.g. editCellAt, to get the focus set in the * value column of the specified row. The attribute column has the * parameter name and should not receive focus. */ protected void setTableCellFocus(int row) { propertyTable.editCellAt(row, 1); TableCellEditor editor = propertyTable.getCellEditor(row, 1); Component comp = editor.getTableCellEditorComponent( propertyTable, propertyTable.getValueAt(row, 1), true, row, 1); } protected void addCube(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.Cube cube = new MondrianGuiDef.Cube(); cube.name = ""; cube.dimensions = new MondrianGuiDef.Dimension[0]; cube.measures = new MondrianGuiDef.Measure[0]; cube.calculatedMembers = new MondrianGuiDef.CalculatedMember[0]; cube.namedSets = new MondrianGuiDef.NamedSet[0]; cube.name = getNewName( getResourceConverter().getString( "schemaExplorer.newCube.title", "New Cube"), schema.cubes); cube.cache = Boolean.TRUE; cube.enabled = Boolean.TRUE; cube.visible = Boolean.TRUE; NodeDef[] temp = schema.cubes; schema.cubes = new MondrianGuiDef.Cube[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.cubes[_i] = (MondrianGuiDef.Cube) temp[_i]; } schema.cubes[schema.cubes.length - 1] = cube; tree.setSelectionPath( (new TreePath(model.getRoot())).pathByAddingChild( cube)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addParameter(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.Parameter parameter = new MondrianGuiDef.Parameter(); parameter.name = ""; // set the required fields parameter.name = getNewName( getResourceConverter().getString( "schemaExplorer.newParameter.title", "New Parameter"), schema.parameters); // set the default values parameter.type = "String"; parameter.modifiable = Boolean.TRUE; NodeDef[] temp = schema.parameters; schema.parameters = new MondrianGuiDef.Parameter[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.parameters[_i] = (MondrianGuiDef.Parameter) temp[_i]; } schema.parameters[schema.parameters.length - 1] = parameter; tree.setSelectionPath( (new TreePath(model.getRoot())).pathByAddingChild( parameter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addRole(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.Role role = new MondrianGuiDef.Role(); role.name = ""; role.schemaGrants = new MondrianGuiDef.SchemaGrant[0]; // add cube to schema role.name = getNewName( getResourceConverter().getString( "schemaExplorer.newRole.title", "New Role"), schema.roles); NodeDef[] temp = schema.roles; schema.roles = new MondrianGuiDef.Role[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.roles[_i] = (MondrianGuiDef.Role) temp[_i]; } schema.roles[schema.roles.length - 1] = role; tree.setSelectionPath( (new TreePath(model.getRoot())).pathByAddingChild( role)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addVirtualCube(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.VirtualCube cube = new MondrianGuiDef.VirtualCube(); cube.name = ""; cube.dimensions = new MondrianGuiDef.VirtualCubeDimension[0]; cube.measures = new MondrianGuiDef.VirtualCubeMeasure[0]; cube.calculatedMembers = new MondrianGuiDef.CalculatedMember[0]; cube.enabled = Boolean.TRUE; // add cube to schema cube.name = getNewName( getResourceConverter().getString( "schemaExplorer.newVirtualCube.title", "New Virtual Cube"), schema.virtualCubes); NodeDef[] temp = schema.virtualCubes; schema.virtualCubes = new MondrianGuiDef.VirtualCube[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schema.virtualCubes[i] = (MondrianGuiDef.VirtualCube) temp[i]; } schema.virtualCubes[schema.virtualCubes.length - 1] = cube; tree.setSelectionPath( new TreePath(model.getRoot()).pathByAddingChild( cube)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addUserDefinedFunction(ActionEvent evt) { MondrianGuiDef.Schema schema = (MondrianGuiDef.Schema) tree.getModel().getRoot(); MondrianGuiDef.UserDefinedFunction udf = new MondrianGuiDef.UserDefinedFunction(); udf.name = ""; udf.name = getNewName( getResourceConverter().getString( "schemaExplorer.newUserDefinedFunction.title", "New User defined Function"), schema.userDefinedFunctions); NodeDef[] temp = schema.userDefinedFunctions; schema.userDefinedFunctions = new MondrianGuiDef.UserDefinedFunction[temp.length + 1]; for (int _i = 0; _i < temp.length; _i++) { schema.userDefinedFunctions[_i] = (MondrianGuiDef.UserDefinedFunction) temp[_i]; } schema.userDefinedFunctions[schema.userDefinedFunctions.length - 1] = udf; tree.setSelectionPath( new TreePath(model.getRoot()).pathByAddingChild( udf)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } /** * Updates the tree display after an Add / Delete operation. */ private void refreshTree(TreePath path) { setDirty(true); if (!dirtyFlag) { setDirtyFlag(true); // dirty indication shown on title setTitle(); } updater.update(); tree.scrollPathToVisible(path); } protected void addMeasure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube) { path = p; break; } } } // Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Cube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeNotSelected.alert", "Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) path; MondrianGuiDef.Measure measure = new MondrianGuiDef.Measure(); measure.name = ""; measure.name = getNewName( getResourceConverter().getString( "schemaExplorer.newMeasure.title", "New Measure"), cube.measures); measure.visible = Boolean.TRUE; measure.aggregator = "distinct-count"; NodeDef[] temp = cube.measures; cube.measures = new MondrianGuiDef.Measure[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.measures[i] = (MondrianGuiDef.Measure) temp[i]; } cube.measures[cube.measures.length - 1] = measure; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(measure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggPattern(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Table) { if (((parentIndex - 1) >= 0) && (tpath.getPathComponent(parentIndex - 1) instanceof MondrianGuiDef.Cube)) { path = p; break; } } } } // Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Table)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeFactTableNotSelected.alert", "Cube Fact Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Table factTable = (MondrianGuiDef.Table) path; MondrianGuiDef.AggPattern aggname = new MondrianGuiDef.AggPattern(); aggname.pattern = ""; // add cube to schema aggname.ignorecase = Boolean.TRUE; aggname.factcount = null; aggname.ignoreColumns = new MondrianGuiDef.AggIgnoreColumn[0]; aggname.foreignKeys = new MondrianGuiDef.AggForeignKey[0]; aggname.measures = new MondrianGuiDef.AggMeasure[0]; aggname.levels = new MondrianGuiDef.AggLevel[0]; aggname.excludes = new MondrianGuiDef.AggExclude[0]; NodeDef[] temp = factTable.aggTables; factTable.aggTables = new MondrianGuiDef.AggTable[temp.length + 1]; for (int i = 0; i < temp.length; i++) { factTable.aggTables[i] = (MondrianGuiDef.AggTable) temp[i]; } factTable.aggTables[factTable.aggTables.length - 1] = aggname; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggname)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggName(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Table) { if (((parentIndex - 1) >= 0) && tpath.getPathComponent(parentIndex - 1) instanceof MondrianGuiDef.Cube) { path = p; break; } } } } if (!(path instanceof MondrianGuiDef.Table)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.tableNotSelected.alert", "Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Table factTable = (MondrianGuiDef.Table) path; MondrianGuiDef.AggName aggname = new MondrianGuiDef.AggName(); aggname.name = ""; // add cube to schema aggname.ignorecase = Boolean.TRUE; aggname.factcount = null; aggname.ignoreColumns = new MondrianGuiDef.AggIgnoreColumn[0]; aggname.foreignKeys = new MondrianGuiDef.AggForeignKey[0]; aggname.measures = new MondrianGuiDef.AggMeasure[0]; aggname.levels = new MondrianGuiDef.AggLevel[0]; NodeDef[] temp = factTable.aggTables; if (temp == null) { factTable.aggTables = new MondrianGuiDef.AggTable[1]; } else { factTable.aggTables = new MondrianGuiDef.AggTable[temp.length + 1]; for (int i = 0; i < temp.length; i++) { factTable.aggTables[i] = (MondrianGuiDef.AggTable) temp[i]; } } factTable.aggTables[factTable.aggTables.length - 1] = aggname; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggname)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggExclude(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { // aggexcludes can be added to cube fact table or final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Table) { if (((parentIndex - 1) >= 0) && tpath.getPathComponent(parentIndex - 1) instanceof MondrianGuiDef.Cube) { path = p; break; } } else if (p instanceof MondrianGuiDef.AggPattern) { // aggexcludes can also be added to aggregate patterns path = p; break; } } } // Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Table || path instanceof MondrianGuiDef.AggPattern)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeFactTableOrAggPatternNotSelected.alert", "Cube Fact Table or Aggregate Pattern not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggExclude aggexclude = new MondrianGuiDef.AggExclude(); aggexclude.pattern = ""; aggexclude.ignorecase = Boolean.TRUE; if (path instanceof MondrianGuiDef.Table) { MondrianGuiDef.Table parent = (MondrianGuiDef.Table) path; // fact table NodeDef[] temp = parent.aggExcludes; parent.aggExcludes = new MondrianGuiDef.AggExclude[temp.length + 1]; for (int i = 0; i < temp.length; i++) { parent.aggExcludes[i] = (MondrianGuiDef.AggExclude) temp[i]; } parent.aggExcludes[parent.aggExcludes.length - 1] = aggexclude; } else { MondrianGuiDef.AggPattern parent = (MondrianGuiDef.AggPattern) path; // aggpattern NodeDef[] temp = parent.excludes; parent.excludes = new MondrianGuiDef.AggExclude[temp.length + 1]; for (int i = 0; i < temp.length; i++) { parent.excludes[i] = (MondrianGuiDef.AggExclude) temp[i]; } parent.excludes[parent.excludes.length - 1] = aggexclude; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggexclude)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggIgnoreColumn(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggIgnoreColumn aggicol = new MondrianGuiDef.AggIgnoreColumn(); aggicol.column = ""; NodeDef[] temp = aggTable.ignoreColumns; aggTable.ignoreColumns = new MondrianGuiDef.AggIgnoreColumn[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.ignoreColumns[i] = (MondrianGuiDef.AggIgnoreColumn) temp[i]; } aggTable.ignoreColumns[aggTable.ignoreColumns.length - 1] = aggicol; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggicol)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggForeignKey(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggForeignKey aggfkey = new MondrianGuiDef.AggForeignKey(); NodeDef[] temp = aggTable.foreignKeys; aggTable.foreignKeys = new MondrianGuiDef.AggForeignKey[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.foreignKeys[i] = (MondrianGuiDef.AggForeignKey) temp[i]; } aggTable.foreignKeys[aggTable.foreignKeys.length - 1] = aggfkey; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggfkey)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggMeasure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggMeasure aggmeasure = new MondrianGuiDef.AggMeasure(); NodeDef[] temp = aggTable.measures; aggTable.measures = new MondrianGuiDef.AggMeasure[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.measures[i] = (MondrianGuiDef.AggMeasure) temp[i]; } aggTable.measures[aggTable.measures.length - 1] = aggmeasure; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggmeasure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggLevel(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggTable)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableNotSelected.alert", "Aggregate Table not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggLevel agglevel = new MondrianGuiDef.AggLevel(); NodeDef[] temp = aggTable.levels; aggTable.levels = new MondrianGuiDef.AggLevel[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.levels[i] = (MondrianGuiDef.AggLevel) temp[i]; } aggTable.levels[aggTable.levels.length - 1] = agglevel; agglevel.collapsed = Boolean.TRUE; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(agglevel)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggLevelProperty(ActionEvent evt) { TreePath tpath = getTreePath(evt); Object path = null; int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggLevel) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.AggLevel)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateLevelNotSelected.alert", "Aggregate Level not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggLevel aggLevel = (MondrianGuiDef.AggLevel) path; MondrianGuiDef.AggLevelProperty aggLevelProperty = new MondrianGuiDef.AggLevelProperty(); appendAggLevelProperty(aggLevel, aggLevelProperty); Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggLevelProperty)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } private void appendAggLevelProperty( MondrianGuiDef.AggLevel aggLevel, MondrianGuiDef.AggLevelProperty aggLevelProperty) { if (aggLevel.properties == null) { aggLevel.properties = new MondrianGuiDef.AggLevelProperty[] { aggLevelProperty }; } else { aggLevel.properties = Arrays.copyOf( aggLevel.properties, aggLevel.properties.length + 1); aggLevel.properties[aggLevel.properties.length - 1] = aggLevelProperty; } } private TreePath getTreePath(ActionEvent evt) { TreePath tpath; if (evt.getSource() instanceof Component && ((Component)evt.getSource()) .getParent() instanceof CustomJPopupMenu) { tpath = ((CustomJPopupMenu)((Component)evt.getSource()) .getParent()).getPath(); } else { tpath = tree.getSelectionPath(); } return tpath; } protected void addAggFactCount(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.AggName) || (path instanceof MondrianGuiDef.AggPattern))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableOrAggPatternNotSelected.alert", "Aggregate Table or Aggregate Pattern not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggFactCount aggFactCount = new MondrianGuiDef.AggFactCount(); MondrianGuiDef.AggTable aggName = null; MondrianGuiDef.AggPattern aggPattern = null; if (path instanceof MondrianGuiDef.AggName) { aggName = (MondrianGuiDef.AggName) path; aggName.factcount = new MondrianGuiDef.AggFactCount(); } else { aggPattern = (MondrianGuiDef.AggPattern) path; aggPattern.factcount = new MondrianGuiDef.AggFactCount(); } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggFactCount)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAggMeasureFactCount(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.AggTable) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.AggName) || (path instanceof MondrianGuiDef.AggPattern))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.aggregateTableOrAggPatternNotSelected.alert", "Aggregate Table or Aggregate Pattern not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.AggTable aggTable = (MondrianGuiDef.AggTable) path; MondrianGuiDef.AggMeasureFactCount aggMeasureFactCount = new MondrianGuiDef.AggMeasureFactCount(); NodeDef[] temp = aggTable.measuresfactcount; aggTable.measuresfactcount = new MondrianGuiDef.AggMeasureFactCount[temp.length + 1]; for (int i = 0; i < temp.length; i++) { aggTable.measuresfactcount[i] = (MondrianGuiDef.AggMeasureFactCount) temp[i]; } aggTable.measuresfactcount[aggTable.measuresfactcount.length - 1] = aggMeasureFactCount; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(aggMeasureFactCount)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addVirtualCubeMeasure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.VirtualCube) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.VirtualCube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.virtualCubeNotSelected.alert", "Virtual Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.VirtualCube cube = (MondrianGuiDef.VirtualCube) path; MondrianGuiDef.VirtualCubeMeasure measure = new MondrianGuiDef.VirtualCubeMeasure(); measure.name = ""; measure.name = getNewName( getResourceConverter().getString( "schemaExplorer.newVirtualMeasure.title", "New Virtual Measure"), cube.measures); measure.visible = Boolean.TRUE; // default true NodeDef[] temp = cube.measures; cube.measures = new MondrianGuiDef.VirtualCubeMeasure[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.measures[i] = (MondrianGuiDef.VirtualCubeMeasure) temp[i]; } cube.measures[cube.measures.length - 1] = measure; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(measure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCalculatedMember(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube || p instanceof MondrianGuiDef.VirtualCube) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.Cube) || (path instanceof MondrianGuiDef.VirtualCube))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeOrVirtualCubeNotSelected.alert", "Cube or Virtual Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = null; MondrianGuiDef.VirtualCube vcube = null; if (path instanceof MondrianGuiDef.Cube) { cube = (MondrianGuiDef.Cube) path; } else { vcube = (MondrianGuiDef.VirtualCube) path; } MondrianGuiDef.CalculatedMember calcmember = new MondrianGuiDef.CalculatedMember(); calcmember.name = ""; calcmember.dimension = "Measures"; calcmember.visible = Boolean.TRUE; // default value calcmember.formatString = ""; calcmember.formula = ""; calcmember.formulaElement = new MondrianGuiDef.Formula(); calcmember.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[0]; // add cube to schema if (cube != null) { calcmember.name = getNewName( getResourceConverter().getString( "schemaExplorer.newCalculatedMember.title", "New Calculated Member"), cube.calculatedMembers); NodeDef[] temp = cube.calculatedMembers; cube.calculatedMembers = new MondrianGuiDef.CalculatedMember[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.calculatedMembers[i] = (MondrianGuiDef.CalculatedMember) temp[i]; } cube.calculatedMembers[cube.calculatedMembers.length - 1] = calcmember; } else { calcmember.name = getNewName( getResourceConverter().getString( "schemaExplorer.newCalculatedMember.title", "New Calculated Member"), vcube.calculatedMembers); NodeDef[] temp = vcube.calculatedMembers; vcube.calculatedMembers = new MondrianGuiDef.CalculatedMember[temp.length + 1]; for (int i = 0; i < temp.length; i++) { vcube.calculatedMembers[i] = (MondrianGuiDef.CalculatedMember) temp[i]; } vcube.calculatedMembers[vcube.calculatedMembers.length - 1] = calcmember; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(calcmember)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected boolean editMode(EventObject evt) { // toggle edit mode between xml or properties table form editModeXML = !isEditModeXML(); editModeButton.setSelected(isEditModeXML()); if (isEditModeXML()) { jSplitPane1.setRightComponent(jPanelXML); } else { jSplitPane1.setRightComponent(jPanel1); } // update the workbench view menu Component o = parentIFrame.getDesktopPane().getParent(); while (o != null) { if (o.getClass() == Workbench.class) { ((Workbench) o).getViewXmlMenuItem().setSelected(editModeXML); break; } o = o.getParent(); } return isEditModeXML(); } protected void delete(EventObject evt) { // delete the selected schema object TreePath tpath = null; Object path = null; if (evt.getSource() instanceof Component && ((Component)evt.getSource()) .getParent() instanceof CustomJPopupMenu) { tpath = ((CustomJPopupMenu)((Component)evt.getSource()) .getParent()).getPath(); } else { tpath = tree.getSelectionPath(); } if (tpath == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.objectToDeleteNotSelected.alert", "Object to delete in Schema not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } delete(tpath); } void delete(TreePath tpath) { Object child = tpath.getLastPathComponent(); // to be deleted Object nextSibling = null; Object prevSibling = null; Object parent = null; Object grandparent = null; boolean grandparentAsSibling = false; for (int i = tpath.getPathCount() - 1 - 1; i >= 0; i--) { // get parent path parent = tpath.getPathComponent(i); if (tpath.getPathCount() - 3 > 0) { // get parent path grandparent = tpath.getPathComponent(i - 1); } break; } if (parent == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cantDeleteObject.alert", "Schema object cannot be deleted."), alert, JOptionPane.WARNING_MESSAGE); return; } boolean tofind = true; Field[] fs = parent.getClass().getFields(); for (int i = 0; i < fs.length; i++) { if (fs[i].getType().isArray() && (fs[i].getType().getComponentType().isInstance(child))) { try { // get the parent's array of child objects Object parentArr = fs[i].get(parent); int parentArrLen = Array.getLength(parentArr); Object newArr = Array.newInstance( fs[i].getType().getComponentType(), parentArrLen - 1); tofind = true; for (int k = 0, m = 0; k < parentArrLen; k++) { Object match = Array.get(parentArr, k); if (tofind && match.equals(child)) { if (child instanceof MondrianGuiDef.CubeDimension) { // Check equality of parent class attributes for // a special case when child is an object of // CubeDimensions MondrianGuiDef.CubeDimension matchDim = (MondrianGuiDef.CubeDimension) match; MondrianGuiDef.CubeDimension childDim = (MondrianGuiDef.CubeDimension) child; if (eq(matchDim.name, childDim.name) && eq(matchDim.caption, childDim.caption) && eq( matchDim.foreignKey, childDim.foreignKey)) { tofind = false; if (k + 1 < parentArrLen) { nextSibling = Array.get( parentArr, k + 1); } if (k - 1 >= 0) { prevSibling = Array.get( parentArr, k - 1); } continue; } } else { // other cases require no such check tofind = false; if (k + 1 < parentArrLen) { nextSibling = Array.get(parentArr, k + 1); } if (k - 1 >= 0) { prevSibling = Array.get(parentArr, k - 1); } continue; } } Array.set(newArr, m++, match); } // After deletion check before the saving the new array in // parent. Check for min 1 SQL object(child) in (parent) // expression for (grandparent) level. If 1 or more, save // the newarray in parent, otherwise delete parent from // grandparent. if ((child instanceof MondrianGuiDef.SQL) && (parent instanceof MondrianGuiDef.ExpressionView) && (Array.getLength(newArr) < 1)) { if (parent instanceof MondrianGuiDef.KeyExpression) { ((MondrianGuiDef.Level) grandparent).keyExp = null; } else if (parent instanceof MondrianGuiDef.NameExpression) { ((MondrianGuiDef.Level) grandparent).nameExp = null; } else if (parent instanceof MondrianGuiDef.OrdinalExpression) { ((MondrianGuiDef.Level) grandparent).ordinalExp = null; } else if (parent instanceof MondrianGuiDef.CaptionExpression) { ((MondrianGuiDef.Level) grandparent).captionExp = null; } else if (parent instanceof MondrianGuiDef.ParentExpression) { ((MondrianGuiDef.Level) grandparent).parentExp = null; } else if (parent instanceof MondrianGuiDef.MeasureExpression) { ((MondrianGuiDef.Measure) grandparent).measureExp = null; } grandparentAsSibling = true; } else { fs[i].set(parent, newArr); } } catch (Exception ex) { // field not found } break; } else if (fs[i].getType().isInstance(child)) { // parent's field is an instanceof child object' try { if (fs[i].get(parent) == child) { fs[i].set(parent, null); break; } } catch (Exception ex) { LOGGER.error("delete", ex); // field not found } } } // delete the node from set of expended nodes in JTreeUpdater also TreeExpansionEvent e = null; e = new TreeExpansionEvent(tree, tpath); updater.treeCollapsed(e); if (nextSibling != null) { tree.setSelectionPath( tpath.getParentPath().pathByAddingChild( nextSibling)); } else if (prevSibling != null) { tree.setSelectionPath( tpath.getParentPath().pathByAddingChild( prevSibling)); } else if (grandparentAsSibling) { tree.setSelectionPath(tpath.getParentPath().getParentPath()); } else { tree.setSelectionPath(tpath.getParentPath()); } refreshTree(tree.getSelectionPath()); } private boolean eq( String o1, String o2) { return o1 == null ? o2 == null : o1.equals(o2); } protected void addDimension(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube || p instanceof MondrianGuiDef.Schema) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.Cube) || (path instanceof MondrianGuiDef.Schema))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeOrSchemaNotSelected.alert", "Cube or Schema not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = null; MondrianGuiDef.Schema schema = null; if (path instanceof MondrianGuiDef.Cube) { cube = (MondrianGuiDef.Cube) path; } else { schema = (MondrianGuiDef.Schema) path; } MondrianGuiDef.Dimension dimension = new MondrianGuiDef.Dimension(); dimension.name = ""; dimension.visible = Boolean.TRUE; dimension.type = "StandardDimension"; // default dimension type dimension.hierarchies = new MondrianGuiDef.Hierarchy[1]; dimension.hierarchies[0] = new MondrianGuiDef.Hierarchy(); dimension.hierarchies[0].name = getResourceConverter().getString( "schemaExplorer.newHierarchyInTree.title", "New Hierarchy 0"); dimension.hierarchies[0].visible = Boolean.TRUE; dimension.hierarchies[0].hasAll = true; dimension.hierarchies[0].levels = new MondrianGuiDef.Level[0]; dimension.hierarchies[0].memberReaderParameters = new MondrianGuiDef.MemberReaderParameter[0]; // add cube to schema if (cube != null) { dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newDimension.title", "New Dimension"), cube.dimensions); NodeDef[] temp = cube.dimensions; cube.dimensions = new MondrianGuiDef.CubeDimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.dimensions[i] = (MondrianGuiDef.CubeDimension) temp[i]; } cube.dimensions[cube.dimensions.length - 1] = dimension; } else { dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newDimension.title", "New Dimension"), schema.dimensions); NodeDef[] temp = schema.dimensions; schema.dimensions = new MondrianGuiDef.Dimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schema.dimensions[i] = (MondrianGuiDef.Dimension) temp[i]; } schema.dimensions[schema.dimensions.length - 1] = dimension; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimension)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addVirtualCubeDimension(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.VirtualCube) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.VirtualCube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.virtualCubeNotSelected.alert", "Virtual Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.VirtualCube cube = (MondrianGuiDef.VirtualCube) path; MondrianGuiDef.VirtualCubeDimension dimension = new MondrianGuiDef.VirtualCubeDimension(); dimension.name = ""; dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newVirtualDimension.title", "New Virtual Dimension"), cube.dimensions); NodeDef[] temp = cube.dimensions; cube.dimensions = new MondrianGuiDef.VirtualCubeDimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.dimensions[i] = (MondrianGuiDef.VirtualCubeDimension) temp[i]; } cube.dimensions[cube.dimensions.length - 1] = dimension; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimension)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } private String getNewName(String preName, Object[] objs) { String newName = ""; String workName = preName.trim() + " "; if (objs != null) { int objNo = objs.length; try { Field f = objs.getClass().getComponentType().getField("name"); boolean exists; do { newName = workName + objNo++; exists = existsWithFieldValue(objs, newName, f); } while (exists); } catch (Exception ex) { LOGGER.error("getNewName", ex); } } else { newName = workName + 0; } return newName; } private static boolean existsWithFieldValue( Object[] objs, String seek, Field f) throws IllegalAccessException { for (int i = 0; i < objs.length; i++) { String value = (String) f.get(objs[i]); if (seek.equals(value)) { return true; } } return false; } protected void addNamedSet(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube || p instanceof MondrianGuiDef.Schema) { path = p; break; } } } if (!((path instanceof MondrianGuiDef.Cube) || (path instanceof MondrianGuiDef.Schema))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeOrSchemaNotSelected.alert", "Cube or Schema not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = null; MondrianGuiDef.Schema schema = null; if (path instanceof MondrianGuiDef.Cube) { cube = (MondrianGuiDef.Cube) path; } else { schema = (MondrianGuiDef.Schema) path; } MondrianGuiDef.NamedSet namedset = new MondrianGuiDef.NamedSet(); namedset.name = ""; namedset.formula = ""; namedset.formulaElement = new MondrianGuiDef.Formula(); // add cube to schema if (cube != null) { namedset.name = getNewName( getResourceConverter().getString( "schemaExplorer.newNamedSet.title", "New Named Set"), cube.namedSets); NodeDef[] temp = cube.namedSets; cube.namedSets = new MondrianGuiDef.NamedSet[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.namedSets[i] = (MondrianGuiDef.NamedSet) temp[i]; } cube.namedSets[cube.namedSets.length - 1] = namedset; } else { namedset.name = getNewName( getResourceConverter().getString( "schemaExplorer.newNamedSet.title", "New Named Set"), schema.namedSets); NodeDef[] temp = schema.namedSets; schema.namedSets = new MondrianGuiDef.NamedSet[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schema.namedSets[i] = (MondrianGuiDef.NamedSet) temp[i]; } schema.namedSets[schema.namedSets.length - 1] = namedset; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(namedset)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addDimensionUsage(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Cube) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Cube)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeNotSelected.alert", "Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) path; MondrianGuiDef.DimensionUsage dimension = new MondrianGuiDef.DimensionUsage(); dimension.name = ""; dimension.visible = Boolean.TRUE; dimension.name = getNewName( getResourceConverter().getString( "schemaExplorer.newDimensionUsage.title", "New Dimension Usage"), cube.dimensions); NodeDef[] temp = cube.dimensions; cube.dimensions = new MondrianGuiDef.CubeDimension[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cube.dimensions[i] = (MondrianGuiDef.CubeDimension) temp[i]; } cube.dimensions[cube.dimensions.length - 1] = dimension; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimension)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addSchemaGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Role) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Role)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.roleNotSelected.alert", "Role not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Role role = (MondrianGuiDef.Role) path; MondrianGuiDef.SchemaGrant schemaGrant = new MondrianGuiDef.SchemaGrant(); schemaGrant.access = ""; schemaGrant.cubeGrants = new MondrianGuiDef.CubeGrant[0]; // add cube to schema NodeDef[] temp = role.schemaGrants; role.schemaGrants = new MondrianGuiDef.SchemaGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { role.schemaGrants[i] = (MondrianGuiDef.SchemaGrant) temp[i]; } role.schemaGrants[role.schemaGrants.length - 1] = schemaGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(schemaGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCubeGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.SchemaGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.SchemaGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.schemaGrantNotSelected.alert", "Schema Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.SchemaGrant schemaGrant = (MondrianGuiDef.SchemaGrant) path; MondrianGuiDef.CubeGrant cubeGrant = new MondrianGuiDef.CubeGrant(); cubeGrant.access = ""; cubeGrant.dimensionGrants = new MondrianGuiDef.DimensionGrant[0]; cubeGrant.hierarchyGrants = new MondrianGuiDef.HierarchyGrant[0]; // add cube to schema NodeDef[] temp = schemaGrant.cubeGrants; schemaGrant.cubeGrants = new MondrianGuiDef.CubeGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { schemaGrant.cubeGrants[i] = (MondrianGuiDef.CubeGrant) temp[i]; } schemaGrant.cubeGrants[schemaGrant.cubeGrants.length - 1] = cubeGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(cubeGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addDimensionGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.CubeGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.CubeGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeGrantNotSelected.alert", "Cube Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.CubeGrant cubeGrant = (MondrianGuiDef.CubeGrant) path; MondrianGuiDef.DimensionGrant dimeGrant = new MondrianGuiDef.DimensionGrant(); dimeGrant.access = ""; // add cube to schema NodeDef[] temp = cubeGrant.dimensionGrants; cubeGrant.dimensionGrants = new MondrianGuiDef.DimensionGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cubeGrant.dimensionGrants[i] = (MondrianGuiDef.DimensionGrant) temp[i]; } cubeGrant.dimensionGrants[cubeGrant.dimensionGrants.length - 1] = dimeGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(dimeGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addHierarchyGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.CubeGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.CubeGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.cubeGrantNotSelected.alert", "Cube Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.CubeGrant cubeGrant = (MondrianGuiDef.CubeGrant) path; MondrianGuiDef.HierarchyGrant hieGrant = new MondrianGuiDef.HierarchyGrant(); hieGrant.access = ""; hieGrant.memberGrants = new MondrianGuiDef.MemberGrant[0]; // add cube to schema NodeDef[] temp = cubeGrant.hierarchyGrants; cubeGrant.hierarchyGrants = new MondrianGuiDef.HierarchyGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { cubeGrant.hierarchyGrants[i] = (MondrianGuiDef.HierarchyGrant) temp[i]; } cubeGrant.hierarchyGrants[cubeGrant.hierarchyGrants.length - 1] = hieGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(hieGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addMemberGrant(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.HierarchyGrant) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.HierarchyGrant)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.hierarchyGrantNotSelected.alert", "Hierarchy Grant not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.HierarchyGrant hieGrant = (MondrianGuiDef.HierarchyGrant) path; MondrianGuiDef.MemberGrant memberGrant = new MondrianGuiDef.MemberGrant(); memberGrant.access = ""; // add cube to schema NodeDef[] temp = hieGrant.memberGrants; hieGrant.memberGrants = new MondrianGuiDef.MemberGrant[temp.length + 1]; for (int i = 0; i < temp.length; i++) { hieGrant.memberGrants[i] = (MondrianGuiDef.MemberGrant) temp[i]; } hieGrant.memberGrants[hieGrant.memberGrants.length - 1] = memberGrant; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(memberGrant)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addAnnotations(ActionEvent evt) { TreePath tpath = null; tpath = getTreePath(evt); Object path = tree.getSelectionPath().getLastPathComponent(); // Verify that the node selected in the tree is something that supports // annotations. if (path == null || (!(path instanceof MondrianGuiDef.Schema) && !(path instanceof MondrianGuiDef.CubeDimension) && !(path instanceof MondrianGuiDef.Cube) && !(path instanceof MondrianGuiDef.VirtualCube) && !(path instanceof MondrianGuiDef.VirtualCubeMeasure) && !(path instanceof MondrianGuiDef.Hierarchy) && !(path instanceof MondrianGuiDef.Level) && !(path instanceof MondrianGuiDef.Measure) && !(path instanceof MondrianGuiDef.CalculatedMember) && !(path instanceof MondrianGuiDef.NamedSet) && !(path instanceof MondrianGuiDef.Role))) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.objectNotSelectedForAnnotations.alert", "Please select an object that supports annotations."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Annotations annotations = new MondrianGuiDef.Annotations(); annotations.array = new MondrianGuiDef.Annotation[0]; Class cls = path.getClass(); try { Field field = cls.getField("annotations"); field.set(path, annotations); } catch (Exception e) { throw new RuntimeException(e); } tree.setSelectionPath(tpath.pathByAddingChild(annotations)); refreshTree(tree.getSelectionPath()); } protected void addAnnotation(ActionEvent evt) { TreePath tpath = null; tpath = getTreePath(evt); Object path = tree.getSelectionPath().getLastPathComponent(); if (!(path instanceof MondrianGuiDef.Annotations)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.annotationsNotSelected.alert", "Annotations not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Annotations annotations = (MondrianGuiDef.Annotations) path; MondrianGuiDef.Annotation annotation = new MondrianGuiDef.Annotation(); annotation.name = getNewName( getResourceConverter().getString( "schemaExplorer.newAnnotation.title", "New Annotation"), annotations.array); MondrianGuiDef.Annotation[] temp = annotations.array; annotations.array = new MondrianGuiDef.Annotation[temp.length + 1]; for (int i = 0; i < temp.length; i++) { annotations.array[i] = (MondrianGuiDef.Annotation) temp[i]; } annotations.array[annotations.array.length - 1] = annotation; tree.setSelectionPath(tpath.pathByAddingChild(annotation)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addLevel(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Hierarchy) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Hierarchy)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.hierarchyNotSelected.alert", "Hierarchy not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Hierarchy hierarchy = (MondrianGuiDef.Hierarchy) path; MondrianGuiDef.Level level = new MondrianGuiDef.Level(); level.uniqueMembers = false; level.visible = Boolean.TRUE; level.name = ""; level.properties = new MondrianGuiDef.Property[0]; level.name = getNewName( getResourceConverter().getString( "schemaExplorer.newLevel.title", "New Level"), hierarchy.levels); NodeDef[] temp = hierarchy.levels; hierarchy.levels = new MondrianGuiDef.Level[temp.length + 1]; for (int i = 0; i < temp.length; i++) { hierarchy.levels[i] = (MondrianGuiDef.Level) temp[i]; } hierarchy.levels[hierarchy.levels.length - 1] = level; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(level)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addSQL(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.ExpressionView || p instanceof MondrianGuiDef.View) { // parent could also be MondrianGuiDef.Expression? path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.sqlExpressionNotSelected.alert", "Expression or View for SQL not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.SQL sql = new MondrianGuiDef.SQL(); sql.dialect = "generic"; if (path instanceof MondrianGuiDef.ExpressionView) { MondrianGuiDef.ExpressionView expview = (MondrianGuiDef.ExpressionView) path; // add sql to ExpressionView NodeDef[] temp = expview.expressions; expview.expressions = new MondrianGuiDef.SQL[temp.length + 1]; for (int i = 0; i < temp.length; i++) { expview.expressions[i] = (MondrianGuiDef.SQL) temp[i]; } expview.expressions[expview.expressions.length - 1] = sql; } else { // Its a View MondrianGuiDef.View view = (MondrianGuiDef.View) path; // add sql to ExpressionView NodeDef[] temp = view.selects; view.selects = new MondrianGuiDef.SQL[temp.length + 1]; for (int i = 0; i < temp.length; i++) { view.selects[i] = (MondrianGuiDef.SQL) temp[i]; } view.selects[view.selects.length - 1] = sql; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(sql)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addScript(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.UserDefinedFunction || p instanceof MondrianGuiDef.MemberFormatter || p instanceof MondrianGuiDef.CellFormatter || p instanceof MondrianGuiDef.PropertyFormatter) { path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.userDefinedFunctionOrFormatterNotSelected.alert", "User Defined Function or Formatter not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } final MondrianGuiDef.Script script = new MondrianGuiDef.Script(); if (path instanceof MondrianGuiDef.UserDefinedFunction) { final MondrianGuiDef.UserDefinedFunction parent = (MondrianGuiDef.UserDefinedFunction) path; parent.script = script; } else if (path instanceof MondrianGuiDef.CellFormatter) { final MondrianGuiDef.CellFormatter parent = (MondrianGuiDef.CellFormatter) path; parent.script = script; } else if (path instanceof MondrianGuiDef.MemberFormatter) { final MondrianGuiDef.MemberFormatter parent = (MondrianGuiDef.MemberFormatter) path; parent.script = script; } else if (path instanceof MondrianGuiDef.PropertyFormatter) { final MondrianGuiDef.PropertyFormatter parent = (MondrianGuiDef.PropertyFormatter) path; parent.script = script; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(script)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCellFormatter(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Measure || p instanceof MondrianGuiDef.CalculatedMember) { path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.measureOrCalculatedMemberNotSelected.alert", "Measure or Calculated Member not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } final MondrianGuiDef.CellFormatter formatter = new MondrianGuiDef.CellFormatter(); if (path instanceof MondrianGuiDef.Measure) { final MondrianGuiDef.Measure parent = (MondrianGuiDef.Measure) path; parent.cellFormatter = formatter; } else if (path instanceof MondrianGuiDef.CalculatedMember) { final MondrianGuiDef.CalculatedMember parent = (MondrianGuiDef.CalculatedMember) path; parent.cellFormatter = formatter; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formatter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } private static class LevelInfo { MondrianGuiDef.Level level = null; Object[] parentPathObjs = null; } protected LevelInfo getSelectedLevel(ActionEvent evt) { final LevelInfo info = new LevelInfo(); TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Level) { path = p; break; } } } if (path == null || !(path instanceof MondrianGuiDef.Level)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.levelNotSelected.alert", "Level not selected."), alert, JOptionPane.WARNING_MESSAGE); return null; } info.level = (MondrianGuiDef.Level) path; info.parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { info.parentPathObjs[i] = tpath.getPathComponent(i); } return info; } protected void addMemberFormatter(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } final MondrianGuiDef.MemberFormatter formatter = new MondrianGuiDef.MemberFormatter(); info.level.memberFormatter = formatter; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formatter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addPropertyFormatter(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Property) { path = p; break; } } } if (path == null) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.propertyNotSelected.alert", "Property not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } final MondrianGuiDef.PropertyFormatter formatter = new MondrianGuiDef.PropertyFormatter(); final MondrianGuiDef.Property parent = (MondrianGuiDef.Property) path; parent.propertyFormatter = formatter; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formatter)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addKeyExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.KeyExpression keyExp = new MondrianGuiDef.KeyExpression(); keyExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 keyExp.expressions[0] = new MondrianGuiDef.SQL(); keyExp.expressions[0].dialect = "generic"; keyExp.expressions[0].cdata = ""; info.level.keyExp = keyExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(keyExp)); refreshTree(tree.getSelectionPath()); } protected void addNameExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.NameExpression nameExp = new MondrianGuiDef.NameExpression(); nameExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 nameExp.expressions[0] = new MondrianGuiDef.SQL(); nameExp.expressions[0].dialect = "generic"; nameExp.expressions[0].cdata = ""; info.level.nameExp = nameExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(nameExp)); refreshTree(tree.getSelectionPath()); } protected void addOrdinalExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.OrdinalExpression ordinalExp = new MondrianGuiDef.OrdinalExpression(); ordinalExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 ordinalExp.expressions[0] = new MondrianGuiDef.SQL(); ordinalExp.expressions[0].dialect = "generic"; ordinalExp.expressions[0].cdata = ""; info.level.ordinalExp = ordinalExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(ordinalExp)); refreshTree(tree.getSelectionPath()); } protected void addCaptionExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.CaptionExpression captionExp = new MondrianGuiDef.CaptionExpression(); captionExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 captionExp.expressions[0] = new MondrianGuiDef.SQL(); captionExp.expressions[0].dialect = "generic"; captionExp.expressions[0].cdata = ""; info.level.captionExp = captionExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(captionExp)); refreshTree(tree.getSelectionPath()); } protected void addParentExp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.ParentExpression parentExp = new MondrianGuiDef.ParentExpression(); parentExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 parentExp.expressions[0] = new MondrianGuiDef.SQL(); parentExp.expressions[0].dialect = "generic"; parentExp.expressions[0].cdata = ""; info.level.parentExp = parentExp; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(parentExp)); refreshTree(tree.getSelectionPath()); } protected void addMeasureExp(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Measure) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Measure)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.measureNotSelected.alert", "Measure not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Measure measure = (MondrianGuiDef.Measure) path; MondrianGuiDef.MeasureExpression measureExp = new MondrianGuiDef.MeasureExpression(); measureExp.expressions = new MondrianGuiDef.SQL[1]; // min 1 measureExp.expressions[0] = new MondrianGuiDef.SQL(); measureExp.expressions[0].dialect = "generic"; measureExp.expressions[0].cdata = ""; measure.measureExp = measureExp; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(measureExp)); refreshTree(tree.getSelectionPath()); } protected void addFormula(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.NamedSet || p instanceof MondrianGuiDef.CalculatedMember) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.NamedSet || path instanceof MondrianGuiDef.CalculatedMember)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.namedsetOrCalcMemberNotSelected.alert", "Named Set or Calculated Member not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Formula formulaElement = new MondrianGuiDef.Formula(); formulaElement.cdata = ""; if (path instanceof MondrianGuiDef.NamedSet) { MondrianGuiDef.NamedSet ns = (MondrianGuiDef.NamedSet) path; ns.formulaElement = formulaElement; } else if (path instanceof MondrianGuiDef.CalculatedMember) { MondrianGuiDef.CalculatedMember ns = (MondrianGuiDef.CalculatedMember) path; ns.formulaElement = formulaElement; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(formulaElement)); refreshTree(tree.getSelectionPath()); } protected void addTable(ActionEvent evt) { MondrianGuiDef.RelationOrJoin relation = new MondrianGuiDef.Table( "", "Table", "", null); addRelation(evt, relation); } protected void addJoin(ActionEvent evt) { MondrianGuiDef.RelationOrJoin relation = new MondrianGuiDef.Join( "", "", new MondrianGuiDef.Table("", "Table 1", "", null), "", "", new MondrianGuiDef.Table("", "Table 2", "", null)); addRelation(evt, relation); } protected void addView(ActionEvent evt) { MondrianGuiDef.View view = new MondrianGuiDef.View(); view.alias = ""; view.selects = new MondrianGuiDef.SQL[1]; view.selects[0] = new MondrianGuiDef.SQL(); view.selects[0].dialect = "generic"; view.selects[0].cdata = ""; addRelation(evt, view); } protected void addInlineTable(ActionEvent evt) { MondrianGuiDef.InlineTable inlineTable = new MondrianGuiDef.InlineTable(); inlineTable.alias = ""; inlineTable.columnDefs = new MondrianGuiDef.ColumnDefs(); inlineTable.rows = new MondrianGuiDef.Rows(); addRelation(evt, inlineTable); } protected void addRelation( ActionEvent evt, MondrianGuiDef.RelationOrJoin relation) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Hierarchy || p instanceof MondrianGuiDef.Cube) { path = p; break; } } } if (path instanceof MondrianGuiDef.Hierarchy) { MondrianGuiDef.Hierarchy h = (MondrianGuiDef.Hierarchy) path; // add relation to hierarchy h.relation = relation; } else if (path instanceof MondrianGuiDef.Cube) { if (!(relation instanceof MondrianGuiDef.Relation)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.relationOrJoinNotRelation.alert", "Can't add a Join."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) path; // add relation to cube cube.fact = (MondrianGuiDef.Relation) relation; } else { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.hierarchyOrCubeNotSelected.alert", "Hierarchy or Cube not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(relation)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addHierarchy(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Dimension) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Dimension)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.dimensionNotSelected.alert", "Dimension not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Dimension dimension = (MondrianGuiDef.Dimension) path; MondrianGuiDef.Hierarchy hierarchy = new MondrianGuiDef.Hierarchy(); hierarchy.name = ""; hierarchy.hasAll = Boolean.TRUE; hierarchy.visible = Boolean.TRUE; hierarchy.levels = new MondrianGuiDef.Level[0]; hierarchy.memberReaderParameters = new MondrianGuiDef.MemberReaderParameter[0]; hierarchy.name = getNewName( getResourceConverter().getString( "schemaExplorer.newHierarchy.title", "New Hierarchy"), dimension.hierarchies); NodeDef[] temp = dimension.hierarchies; dimension.hierarchies = new MondrianGuiDef.Hierarchy[temp.length + 1]; for (int i = 0; i < temp.length; i++) { dimension.hierarchies[i] = (MondrianGuiDef.Hierarchy) temp[i]; } dimension.hierarchies[dimension.hierarchies.length - 1] = hierarchy; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(hierarchy)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void moveLevelUp(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.Hierarchy hierarchy = (MondrianGuiDef.Hierarchy) info.parentPathObjs[info.parentPathObjs.length - 2]; int loc = -1; for (int i = 0; i < hierarchy.levels.length; i++) { if (hierarchy.levels[i] == info.level) { loc = i; break; } } if (loc > 0) { MondrianGuiDef.Level tmp = hierarchy.levels[loc - 1]; hierarchy.levels[loc - 1] = info.level; hierarchy.levels[loc] = tmp; } TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void moveLevelDown(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.Hierarchy hierarchy = (MondrianGuiDef.Hierarchy) info.parentPathObjs[info.parentPathObjs.length - 2]; int loc = -1; for (int i = 0; i < hierarchy.levels.length; i++) { if (hierarchy.levels[i] == info.level) { loc = i; break; } } if (loc < hierarchy.levels.length - 1) { MondrianGuiDef.Level tmp = hierarchy.levels[loc + 1]; hierarchy.levels[loc + 1] = info.level; hierarchy.levels[loc] = tmp; } TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addProperty(ActionEvent evt) { final LevelInfo info = getSelectedLevel(evt); if (info == null) { return; } MondrianGuiDef.Property property = new MondrianGuiDef.Property(); property.name = ""; if (info.level.properties == null) { info.level.properties = new MondrianGuiDef.Property[0]; } property.name = getNewName( getResourceConverter().getString( "schemaExplorer.newProperty.title", "New Property"), info.level.properties); NodeDef[] temp = info.level.properties; info.level.properties = new MondrianGuiDef.Property[temp.length + 1]; for (int i = 0; i < temp.length; i++) { info.level.properties[i] = (MondrianGuiDef.Property) temp[i]; } info.level.properties[info.level.properties.length - 1] = property; TreePath parentPath = new TreePath(info.parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(property)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCalculatedMemberProperty(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.CalculatedMember || p instanceof MondrianGuiDef.Measure) { path = p; break; } } } if (path instanceof MondrianGuiDef.CalculatedMember) { addCalcMemberPropToCalcMember( (MondrianGuiDef.CalculatedMember)path, parentIndex, tpath); } else if (path instanceof MondrianGuiDef.Measure) { addCalcMemberPropToMeasure( (MondrianGuiDef.Measure)path, parentIndex, tpath); } else { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.calculatedMemberNotSelected.alert", "Calculated Member or Measure not selected."), alert, JOptionPane.WARNING_MESSAGE); } } protected void addCalcMemberPropToCalcMember( MondrianGuiDef.CalculatedMember calcMember, int parentIndex, TreePath tpath) { MondrianGuiDef.CalculatedMemberProperty property = new MondrianGuiDef.CalculatedMemberProperty(); property.name = ""; if (calcMember.memberProperties == null) { calcMember.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[0]; } property.name = getNewName( getResourceConverter().getString( "schemaExplorer.newProperty.title", "New Property"), calcMember.memberProperties); NodeDef[] temp = calcMember.memberProperties; calcMember.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[temp.length + 1]; for (int i = 0; i < temp.length; i++) { calcMember.memberProperties[i] = (MondrianGuiDef.CalculatedMemberProperty) temp[i]; } calcMember.memberProperties[calcMember.memberProperties.length - 1] = property; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(property)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addCalcMemberPropToMeasure( MondrianGuiDef.Measure measure, int parentIndex, TreePath tpath) { MondrianGuiDef.CalculatedMemberProperty property = new MondrianGuiDef.CalculatedMemberProperty(); property.name = ""; if (measure.memberProperties == null) { measure.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[0]; } property.name = getNewName( getResourceConverter().getString( "schemaExplorer.newProperty.title", "New Property"), measure.memberProperties); NodeDef[] temp = measure.memberProperties; measure.memberProperties = new MondrianGuiDef.CalculatedMemberProperty[temp.length + 1]; for (int i = 0; i < temp.length; i++) { measure.memberProperties[i] = (MondrianGuiDef.CalculatedMemberProperty) temp[i]; } measure.memberProperties[measure.memberProperties.length - 1] = property; Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(property)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } protected void addClosure(ActionEvent evt) { TreePath tpath = null; Object path = null; tpath = getTreePath(evt); int parentIndex = -1; if (tpath != null) { for (parentIndex = tpath.getPathCount() - 1; parentIndex >= 0; parentIndex--) { final Object p = tpath.getPathComponent(parentIndex); if (p instanceof MondrianGuiDef.Level) { path = p; break; } } } if (!(path instanceof MondrianGuiDef.Level)) { JOptionPane.showMessageDialog( this, getResourceConverter().getString( "schemaExplorer.levelNotSelected.alert", "Level not selected."), alert, JOptionPane.WARNING_MESSAGE); return; } MondrianGuiDef.Level level = (MondrianGuiDef.Level) path; MondrianGuiDef.Closure closure = new MondrianGuiDef.Closure(); closure.parentColumn = ""; closure.childColumn = ""; closure.table = new MondrianGuiDef.Table("", "Table", "", null); if (level.closure == null) { level.closure = closure; } Object[] parentPathObjs = new Object[parentIndex + 1]; for (int i = 0; i <= parentIndex; i++) { parentPathObjs[i] = tpath.getPathComponent(i); } TreePath parentPath = new TreePath(parentPathObjs); tree.setSelectionPath(parentPath.pathByAddingChild(closure)); refreshTree(tree.getSelectionPath()); setTableCellFocus(0); } public MondrianGuiDef.Schema getSchema() { return this.schema; } /** * returns the schema file * * @return File */ public File getSchemaFile() { return this.schemaFile; } /** * sets the schema file */ public void setSchemaFile(File f) { this.schemaFile = f; } public Object lastSelected; /** * Called whenever the value of the selection changes. * * @param e the event that characterizes the change. */ public void valueChanged(TreeSelectionEvent e) { if (propertyTable.isEditing() && (lastSelected != e.getPath() .getLastPathComponent())) { SchemaPropertyCellEditor sce = (SchemaPropertyCellEditor) propertyTable.getCellEditor(); if (sce != null) { TreeSelectionEvent e2 = e; sce.stopCellEditing(); e = e2; } } lastSelected = e.getPath().getLastPathComponent(); String selectedFactTable = null; String selectedFactTableSchema = null; for (int i = e.getPath().getPathCount() - 1; i >= 0; i--) { Object comp = e.getPath().getPathComponent(i); if (comp instanceof MondrianGuiDef.Cube) { final MondrianGuiDef.Cube cube = (MondrianGuiDef.Cube) comp; if (cube.fact instanceof MondrianGuiDef.Table) { final MondrianGuiDef.Table table = (MondrianGuiDef.Table) cube.fact; selectedFactTable = table.name; selectedFactTableSchema = table.schema; } } } TreePath tpath = e.getPath(); Object o = tpath.getLastPathComponent(); Object po = null; // look for parent information TreePath parentTpath = tpath.getParentPath(); String parentName = ""; String elementName = ""; if (parentTpath != null) { po = parentTpath.getLastPathComponent(); Class parentClassName = po.getClass(); try { Field nameField = po.getClass().getField("name"); elementName = (String) nameField.get(po); if (elementName == null) { elementName = ""; } else { elementName = "'" + elementName + "'"; } } catch (Exception ex) { elementName = ""; } int pos = parentClassName.toString().lastIndexOf("$"); if (pos > 0) { parentName = parentClassName.toString().substring(pos + 1); } } // Begin : For xml edit mode display StringWriter sxml = new StringWriter(); org.eigenbase.xom.XMLOutput pxml = new org.eigenbase.xom.XMLOutput(sxml); pxml.setIndentString(" "); pxml.setAlwaysQuoteCData(true); // End : For xml edit mode display String[] pNames = DEF_DEFAULT; validStatusLabel.setText(renderer.invalid(tree, e.getPath(), o)); validStatusLabel2.setText(validStatusLabel.getText()); if (o instanceof MondrianGuiDef.Column) { pNames = DEF_COLUMN; targetLabel.setText( getResourceConverter().getString( "common.column.title", LBL_COLUMN)); } else if (o instanceof MondrianGuiDef.Cube) { pNames = DEF_CUBE; targetLabel.setText( getResourceConverter().getString( "common.cube.title", LBL_CUBE)); ((MondrianGuiDef.Cube) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Dimension) { pNames = DEF_DIMENSION; if (po instanceof MondrianGuiDef.Schema) { targetLabel.setText( getResourceConverter().getString( "common.sharedDimension.title", "Shared Dimension")); } else { targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.dimensionElementParent.title", "Dimension for {0} {1}", elementName, parentName)); } ((MondrianGuiDef.Dimension) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.DimensionUsage) { pNames = DEF_DIMENSION_USAGE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.dimensionUsageForElement.title", "Dimension Usage for {0} {1}", elementName, parentName)); ((MondrianGuiDef.DimensionUsage) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.KeyExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.keyExpression.title", LBL_KEY_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.NameExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.nameExpression.title", LBL_NAME_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.OrdinalExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.ordinalExpression.title", LBL_ORDINAL_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.ParentExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.parentExpression.title", LBL_PARENT_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.ExpressionView) { pNames = DEF_EXPRESSION_VIEW; targetLabel.setText( getResourceConverter().getString( "common.expressionView.title", LBL_EXPRESSION_VIEW)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MeasureExpression) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.measureExpression.title", LBL_MEASURE_EXPRESSION)); ((MondrianGuiDef.ExpressionView) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Hierarchy) { pNames = DEF_HIERARCHY; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.hierarchyElementParent.title", "Hierarchy for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Hierarchy) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Join) { pNames = DEF_JOIN; if (parentName.equalsIgnoreCase("Join")) { Object parentJoin = parentTpath.getLastPathComponent(); int indexOfChild = tree.getModel().getIndexOfChild( parentJoin, o); switch (indexOfChild) { case 0: targetLabel.setText( getResourceConverter().getString( "common.leftJoin.title", "Left : " + LBL_JOIN)); break; case 1: targetLabel.setText( getResourceConverter().getString( "common.rightJoin.title", "Right : " + LBL_JOIN)); } } else { targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.generalJoinForElement.title", "Join for {0} {1}", elementName, parentName)); } ((MondrianGuiDef.Join) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Level) { pNames = DEF_LEVEL; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.levelForElement.title", "Level for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Level) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Measure) { pNames = DEF_MEASURE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.measureForElement.title", "Measure for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Measure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CalculatedMember) { pNames = DEF_CALCULATED_MEMBER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.calculatedMemberForElement.title", "Calculated Member for {0} {1}", elementName, parentName)); ((MondrianGuiDef.CalculatedMember) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CalculatedMemberProperty) { pNames = DEF_CALCULATED_MEMBER_PROPERTY; targetLabel.setText( getResourceConverter().getString( "common.calculatedMemberProperty.title", LBL_CALCULATED_MEMBER_PROPERTY)); } else if (o instanceof MondrianGuiDef.NamedSet) { pNames = DEF_NAMED_SET; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.namedSetForElement.title", "Named Set for {0} {1}", elementName, parentName)); ((MondrianGuiDef.NamedSet) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Formula) { pNames = DEF_FORMULA; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.formulaForElement.title", "Formula for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Formula) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.UserDefinedFunction) { pNames = DEF_USER_DEFINED_FUNCTION; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.userDefinedFunctionForElement.title", "User Defined Function for {0} {1}", elementName, parentName)); ((MondrianGuiDef.UserDefinedFunction) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Script) { pNames = DEF_SCRIPT; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.scriptForElement.title", "Script for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Script) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CellFormatter) { pNames = DEF_FORMATTER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.cellFormatterForElement.title", "Cell Formatter for {0} {1}", elementName, parentName)); ((MondrianGuiDef.CellFormatter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.PropertyFormatter) { pNames = DEF_FORMATTER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.propertyFormatterForElement.title", "Property Formatter for {0} {1}", elementName, parentName)); ((MondrianGuiDef.PropertyFormatter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MemberFormatter) { pNames = DEF_FORMATTER; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.memberFormatterForElement.title", "Member Formatter for {0} {1}", elementName, parentName)); ((MondrianGuiDef.MemberFormatter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MemberReaderParameter) { pNames = DEF_PARAMETER; targetLabel.setText( getResourceConverter().getString( "common.parameter.title", LBL_PARAMETER)); } else if (o instanceof MondrianGuiDef.Property) { pNames = DEF_PROPERTY; targetLabel.setText( getResourceConverter().getString( "common.property.title", LBL_PROPERTY)); ((MondrianGuiDef.Property) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Closure) { pNames = DEF_CLOSURE; targetLabel.setText( getResourceConverter().getString( "common.closure.title", LBL_CLOSURE)); ((MondrianGuiDef.Closure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Schema) { pNames = DEF_SCHEMA; targetLabel.setText( getResourceConverter().getString( "common.schema.title", LBL_SCHEMA)); ((MondrianGuiDef.Schema) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.SQL) { pNames = DEF_SQL; targetLabel.setText( getResourceConverter().getString( "common.sql.title", LBL_SQL)); ((MondrianGuiDef.SQL) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Table) { pNames = DEF_TABLE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.tableForElement.title", "Table for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Table) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggName) { pNames = DEF_AGG_NAME; targetLabel.setText( getResourceConverter().getString( "common.aggName.title", LBL_AGG_NAME)); ((MondrianGuiDef.AggName) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggIgnoreColumn) { pNames = DEF_AGG_IGNORE_COLUMN; targetLabel.setText( getResourceConverter().getString( "common.aggIgnoreColumn.title", LBL_AGG_IGNORE_COLUMN)); ((MondrianGuiDef.AggIgnoreColumn) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggForeignKey) { pNames = DEF_AGG_FOREIGN_KEY; targetLabel.setText( getResourceConverter().getString( "common.aggForeignKey.title", LBL_AGG_FOREIGN_KEY)); ((MondrianGuiDef.AggForeignKey) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggMeasure) { pNames = DEF_AGG_MEASURE; targetLabel.setText( getResourceConverter().getString( "common.aggMeasure.title", LBL_AGG_MEASURE)); ((MondrianGuiDef.AggMeasure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggLevel) { pNames = DEF_AGG_LEVEL; targetLabel.setText( getResourceConverter().getString( "common.aggLevel.title", LBL_AGG_LEVEL)); ((MondrianGuiDef.AggLevel) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggLevelProperty) { pNames = DEF_AGG_LEVEL_PROP; targetLabel.setText( getResourceConverter().getString( "common.aggLevelProperty.title", LBL_AGG_LEVEL_PROP)); ((MondrianGuiDef.AggLevelProperty) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggExclude) { pNames = DEF_AGG_EXCLUDE; targetLabel.setText( getResourceConverter().getString( "common.aggExclude.title", LBL_AGG_EXCLUDE)); ((MondrianGuiDef.AggExclude) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggPattern) { pNames = DEF_AGG_PATTERN; targetLabel.setText( getResourceConverter().getString( "common.aggPattern.title", LBL_AGG_PATTERN)); ((MondrianGuiDef.AggPattern) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggFactCount) { pNames = DEF_AGG_FACT_COUNT; targetLabel.setText( getResourceConverter().getString( "common.aggFactCount.title", LBL_AGG_FACT_COUNT)); ((MondrianGuiDef.AggFactCount) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.AggMeasureFactCount) { pNames = DEF_AGG_MEASURE_FACT_COUNT; targetLabel.setText( getResourceConverter().getString( "common.aggMeasureFactCount.title", LBL_AGG_MEASURE_FACT_COUNT)); ((MondrianGuiDef.AggMeasureFactCount) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.View) { pNames = DEF_VIEW; targetLabel.setText( getResourceConverter().getString( "common.view.title", LBL_VIEW)); } else if (o instanceof MondrianGuiDef.Role) { pNames = DEF_ROLE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.roleElementParent.title", "Role for {0} {1}", elementName, parentName)); ((MondrianGuiDef.Role) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Parameter) { pNames = DEF_PARAMETER_SCHEMA; targetLabel.setText( getResourceConverter().getString( "common.schemaParameter.title", LBL_PARAMETER_SCHEMA)); ((MondrianGuiDef.Parameter) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.SchemaGrant) { pNames = DEF_SCHEMA_GRANT; targetLabel.setText( getResourceConverter().getString( "common.schemaGrant.title", LBL_SCHEMA_GRANT)); ((MondrianGuiDef.SchemaGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.CubeGrant) { pNames = DEF_CUBE_GRANT; targetLabel.setText( getResourceConverter().getString( "common.cubeGrant.title", LBL_CUBE_GRANT)); ((MondrianGuiDef.CubeGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.DimensionGrant) { pNames = DEF_DIMENSION_GRANT; targetLabel.setText( getResourceConverter().getString( "common.dimensionGrant.title", LBL_DIMENSION_GRANT)); ((MondrianGuiDef.DimensionGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.HierarchyGrant) { pNames = DEF_HIERARCHY_GRANT; targetLabel.setText( getResourceConverter().getString( "common.hierarchyGrant.title", LBL_HIERARCHY_GRANT)); ((MondrianGuiDef.HierarchyGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.MemberGrant) { pNames = DEF_MEMBER_GRANT; targetLabel.setText( getResourceConverter().getString( "common.memberGrant.title", LBL_MEMBER_GRANT)); ((MondrianGuiDef.MemberGrant) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.VirtualCube) { pNames = DEF_VIRTUAL_CUBE; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.virtualCubeElementParent.title", "Virtual Cube for {0} {1}", elementName, parentName)); ((MondrianGuiDef.VirtualCube) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.VirtualCubeDimension) { pNames = DEF_VIRTUAL_CUBE_DIMENSION; targetLabel.setText( getResourceConverter().getFormattedString( "schemaExplorer.virtualCubeDimensionElementParent.title", "Virtual Cube Dimension for {0} {1}", elementName, parentName)); ((MondrianGuiDef.VirtualCubeDimension) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.VirtualCubeMeasure) { pNames = DEF_VIRTUAL_CUBE_MEASURE; targetLabel.setText( getResourceConverter().getString( "common.virtualCubeMeasure.title", LBL_VIRTUAL_CUBE_MEASURE)); ((MondrianGuiDef.VirtualCubeMeasure) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Annotations) { pNames = DEF_DEFAULT; targetLabel.setText( getResourceConverter().getString( "common.annotations.title", LBL_ANNOTATIONS)); ((MondrianGuiDef.Annotations) o).displayXML(pxml, 0); } else if (o instanceof MondrianGuiDef.Annotation) { pNames = DEF_ANNOTATION; targetLabel.setText( getResourceConverter().getString( "common.annotation.title", LBL_ANNOTATION)); ((MondrianGuiDef.Annotation) o).displayXML(pxml, 0); } else { targetLabel.setText( getResourceConverter().getString( "common.unknownType.title", LBL_UNKNOWN_TYPE)); } try { jEditorPaneXML.read(new StringReader(sxml.toString()), null); jEditorPaneXML.getDocument().putProperty( PlainDocument.tabSizeAttribute, new Integer(2)); } catch (Exception ex) { } targetLabel2.setText(targetLabel.getText()); PropertyTableModel ptm = new PropertyTableModel(workbench, o, pNames); ptm.setFactTable(selectedFactTable); ptm.setFactTableSchema(selectedFactTableSchema); // Generate a list of pre-existing names of siblings in parent // component for checking unique names. Object parent = null; for (int i = e.getPath().getPathCount() - 1 - 1; i >= 0; i--) { parent = e.getPath().getPathComponent(i); // get parent path break; } if (parent != null) { Field[] fs = parent.getClass().getFields(); List<String> names = new ArrayList<String>(); for (int i = 0; i < fs.length; i++) { if (fs[i].getType().isArray() && (fs[i].getType().getComponentType().isInstance(o))) { // Selected schema object is an instance of parent's field // (an array). try { // name field of array's objects. Field fname = fs[i].getType().getComponentType().getField("name"); // get the parent's array of child objects Object objs = fs[i].get(parent); for (int j = 0; j < Array.getLength(objs); j++) { Object child = Array.get(objs, j); String vname = (String) fname.get(child); names.add(vname); } ptm.setNames(names); } catch (Exception ex) { // name field dosen't exist, skip parent object. } break; } } } propertyTable.setModel(ptm); propertyTable.getColumnModel().getColumn(0).setMaxWidth(150); propertyTable.getColumnModel().getColumn(0).setMinWidth(150); for (int i = 0; i < propertyTable.getRowCount(); i++) { TableCellRenderer renderer = propertyTable.getCellRenderer(i, 1); Component comp = renderer.getTableCellRendererComponent( propertyTable, propertyTable.getValueAt(i, 1), false, false, i, 1); try { int height = comp.getMaximumSize().height; propertyTable.setRowHeight(i, height); } catch (Exception ea) { } } } /** * @see javax.swing.event.CellEditorListener#editingCanceled(ChangeEvent) */ public void editingCanceled(ChangeEvent e) { updater.update(); } /** * @see javax.swing.event.CellEditorListener#editingStopped(ChangeEvent) */ public void editingStopped(ChangeEvent e) { setDirty(true); if (!dirtyFlag || ((PropertyTableModel) propertyTable .getModel()).target instanceof MondrianGuiDef.Schema) { setDirtyFlag(true); // true means dirty indication shown on title setTitle(); } String emsg = ((PropertyTableModel) propertyTable.getModel()).getErrorMsg(); if (emsg != null) { JOptionPane.showMessageDialog( this, emsg, "Error", JOptionPane.ERROR_MESSAGE); ((PropertyTableModel) propertyTable.getModel()).setErrorMsg(null); } updater.update(); } class PopupTrigger extends MouseAdapter { // From MouseAdapter javadoc: // // Popup menus are triggered differently // on different systems. Therefore, isPopupTrigger // should be checked in both mousePressed // and mouseReleased // for proper cross-platform functionality. public void mousePressed(MouseEvent e) { showMenu(e); } public void mouseReleased(MouseEvent e) { showMenu(e); } public void showMenu(MouseEvent e) { if (e.isPopupTrigger()) { int x = e.getX(); int y = e.getY(); TreePath path = tree.getPathForLocation(x, y); if (path != null) { jPopupMenu.setPath(path); jPopupMenu.removeAll(); Object pathSelected = path.getLastPathComponent(); if (pathSelected instanceof MondrianGuiDef.Schema) { MondrianGuiDef.Schema s = (MondrianGuiDef.Schema) pathSelected; jPopupMenu.add(addCube); jPopupMenu.add(addDimension); jPopupMenu.add(addNamedSet); jPopupMenu.add(addUserDefinedFunction); jPopupMenu.add(jSeparator1); jPopupMenu.add(addVirtualCube); jPopupMenu.add(addRole); jPopupMenu.add(addParameter); jPopupMenu.add(addAnnotations); if (s.annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } } else if (pathSelected instanceof MondrianGuiDef.Cube) { jPopupMenu.add(addDimension); jPopupMenu.add(addDimensionUsage); jPopupMenu.add(addMeasure); jPopupMenu.add(addCalculatedMember); jPopupMenu.add(addNamedSet); jPopupMenu.add(jSeparator1); jPopupMenu.add(addTable); jPopupMenu.add(addView); jPopupMenu.add(addInlineTable); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Cube) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator2); jPopupMenu.add(delete); if (((MondrianGuiDef.Cube) pathSelected).fact == null) { addMeasure.setEnabled(false); addCalculatedMember.setEnabled(false); addTable.setEnabled(true); addView.setEnabled(true); addInlineTable.setEnabled(true); } else { addMeasure.setEnabled(true); addCalculatedMember.setEnabled(true); addTable.setEnabled(false); addView.setEnabled(false); addInlineTable.setEnabled(false); } } else if (pathSelected instanceof MondrianGuiDef.Dimension) { jPopupMenu.add(addHierarchy); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Dimension) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Hierarchy) { jPopupMenu.add(addLevel); jPopupMenu.add(jSeparator1); jPopupMenu.add(addTable); jPopupMenu.add(addJoin); jPopupMenu.add(addView); jPopupMenu.add(addInlineTable); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Hierarchy) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator2); jPopupMenu.add(delete); // Disable Add Level if the relation has not been set // Enable Add <Relation> if (((MondrianGuiDef.Hierarchy) pathSelected).relation == null) { addLevel.setEnabled(false); addTable.setEnabled(true); addJoin.setEnabled(true); addView.setEnabled(true); addInlineTable.setEnabled(true); } else { // Enable Add Level if the relation has been set, // disable Add <Relation> addLevel.setEnabled(true); addTable.setEnabled(false); addJoin.setEnabled(false); addView.setEnabled(false); addInlineTable.setEnabled(false); } } else if (pathSelected instanceof MondrianGuiDef.Level) { jPopupMenu.add(moveLevelUp); jPopupMenu.add(moveLevelDown); jPopupMenu.add(addProperty); jPopupMenu.add(addKeyExp); MondrianGuiDef.Level level = (MondrianGuiDef.Level) pathSelected; if (level.keyExp == null) { addKeyExp.setEnabled(true); } else { addKeyExp.setEnabled(false); } jPopupMenu.add(addNameExp); if (level.nameExp == null) { addNameExp.setEnabled(true); } else { addNameExp.setEnabled(false); } jPopupMenu.add(addOrdinalExp); if (level.ordinalExp == null) { addOrdinalExp.setEnabled(true); } else { addOrdinalExp.setEnabled(false); } jPopupMenu.add(addCaptionExp); if (level.captionExp == null) { addCaptionExp.setEnabled(true); } else { addCaptionExp.setEnabled(false); } jPopupMenu.add(addParentExp); if (level.parentExp == null) { addParentExp.setEnabled(true); } else { addParentExp.setEnabled(false); } jPopupMenu.add(addClosure); if (level.closure == null) { addClosure.setEnabled(true); } else { addClosure.setEnabled(false); } jPopupMenu.add(addAnnotations); if (level.annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(addMemberFormatter); if (((MondrianGuiDef.Level) pathSelected) .memberFormatter == null) { addMemberFormatter.setEnabled(true); } else { addMemberFormatter.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.KeyExpression || pathSelected instanceof MondrianGuiDef.NameExpression || pathSelected instanceof MondrianGuiDef.OrdinalExpression || pathSelected instanceof MondrianGuiDef.CaptionExpression || pathSelected instanceof MondrianGuiDef.ParentExpression || pathSelected instanceof MondrianGuiDef.ExpressionView || pathSelected instanceof MondrianGuiDef.View) { jPopupMenu.add(addSQL); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.RelationOrJoin) { Object po = path.getParentPath().getLastPathComponent(); if (!(po instanceof MondrianGuiDef.RelationOrJoin) && !(po instanceof MondrianGuiDef.Closure)) { if (po instanceof MondrianGuiDef.Cube) { jPopupMenu.add(addAggName); jPopupMenu.add(addAggPattern); jPopupMenu.add(addAggExclude); jPopupMenu.add(jSeparator1); } jPopupMenu.add(delete); } else { return; } } else if (pathSelected instanceof MondrianGuiDef.Measure) { jPopupMenu.add(addMeasureExp); jPopupMenu.add(addCalculatedMemberProperty); if (((MondrianGuiDef.Measure) pathSelected).measureExp == null) { addMeasureExp.setEnabled(true); } else { addMeasureExp.setEnabled(false); } jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Measure) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(addCellFormatter); if (((MondrianGuiDef.Measure) pathSelected) .cellFormatter == null) { addCellFormatter.setEnabled(true); } else { addCellFormatter.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.NamedSet) { jPopupMenu.add(addFormula); if (((MondrianGuiDef.NamedSet) pathSelected) .formulaElement == null) { addFormula.setEnabled(false); } else { addFormula.setEnabled(false); } jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.NamedSet) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.CalculatedMember) { jPopupMenu.add(addFormula); jPopupMenu.add(addCalculatedMemberProperty); if (((MondrianGuiDef.CalculatedMember) pathSelected) .formulaElement == null) { addFormula.setEnabled(false); } else { addFormula.setEnabled(false); } jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.CalculatedMember) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(addCellFormatter); if (((MondrianGuiDef.CalculatedMember) pathSelected) .cellFormatter == null) { addCellFormatter.setEnabled(true); } else { addCellFormatter.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.MeasureExpression) { jPopupMenu.add(addSQL); addSQL.setEnabled(false); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Closure) { jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.AggName || pathSelected instanceof MondrianGuiDef.AggPattern) { jPopupMenu.add(addAggFactCount); jPopupMenu.add(addAggMeasureFactCount); jPopupMenu.add(addAggIgnoreColumn); jPopupMenu.add(addAggForeignKey); jPopupMenu.add(addAggMeasure); jPopupMenu.add(addAggLevel); if (pathSelected instanceof MondrianGuiDef.AggPattern) { jPopupMenu.add(addAggExclude); if (((MondrianGuiDef.AggPattern) pathSelected) .factcount == null) { addAggFactCount.setEnabled(true); } else { addAggFactCount.setEnabled(false); } } else { if (((MondrianGuiDef.AggName) pathSelected) .factcount == null) { addAggFactCount.setEnabled(true); } else { addAggFactCount.setEnabled(false); } } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.AggLevel) { jPopupMenu.add(addAggLevelProperty); } else if ( pathSelected instanceof MondrianGuiDef.VirtualCube) { jPopupMenu.add(addVirtualCubeDimension); jPopupMenu.add(addVirtualCubeMeasure); jPopupMenu.add(addCalculatedMember); jPopupMenu.add(addAnnotations); if ( ((MondrianGuiDef.VirtualCube) pathSelected) .annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Role) { jPopupMenu.add(addSchemaGrant); jPopupMenu.add(addAnnotations); if (((MondrianGuiDef.Role) pathSelected).annotations == null) { addAnnotations.setEnabled(true); } else { addAnnotations.setEnabled(false); } jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.SchemaGrant) { jPopupMenu.add(addCubeGrant); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.CubeGrant) { jPopupMenu.add(addDimensionGrant); jPopupMenu.add(addHierarchyGrant); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.VirtualCubeMeasure) { jPopupMenu.add(addAnnotations); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.HierarchyGrant) { jPopupMenu.add(addMemberGrant); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.Annotations) { jPopupMenu.add(addAnnotation); jPopupMenu.add(jSeparator1); jPopupMenu.add(delete); } else if ( pathSelected instanceof MondrianGuiDef.UserDefinedFunction) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.Property) { jPopupMenu.add(addPropertyFormatter); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.CellFormatter) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.MemberFormatter) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else if (pathSelected instanceof MondrianGuiDef.PropertyFormatter) { jPopupMenu.add(addScript); jPopupMenu.add(delete); } else { jPopupMenu.add(delete); } jPopupMenu.show(tree, x, y); } } } } static final String[] DEF_DEFAULT = {}; static final String[] DEF_VIRTUAL_CUBE = {"name", "description", "caption", "enabled", "visible"}; static final String[] DEF_VIRTUAL_CUBE_MEASURE = { "name", "cubeName", "visible"}; static final String[] DEF_VIRTUAL_CUBE_DIMENSION = { "name", "cubeName", "caption", "foreignKey"}; static final String[] DEF_VIEW = {"alias"}; static final String[] DEF_TABLE = {"schema", "name", "alias"}; static final String[] DEF_AGG_FACT_COUNT = {"column"}; static final String[] DEF_AGG_MEASURE_FACT_COUNT = {"column", "factColumn"}; static final String[] DEF_AGG_NAME = { "name", "ignorecase", "approxRowCount"}; static final String[] DEF_AGG_PATTERN = {"pattern", "ignorecase"}; static final String[] DEF_AGG_EXCLUDE = {"pattern", "name", "ignorecase"}; static final String[] DEF_AGG_IGNORE_COLUMN = {"column"}; static final String[] DEF_AGG_FOREIGN_KEY = {"factColumn", "aggColumn"}; static final String[] DEF_AGG_MEASURE = {"column", "name", "rollupType"}; static final String[] DEF_AGG_LEVEL = { "column", "name", "collapsed", "captionColumn", "ordinalColumn", "nameColumn" }; static final String[] DEF_AGG_LEVEL_PROP = {"name", "column"}; static final String[] DEF_CLOSURE = {"parentColumn", "childColumn"}; static final String[] DEF_RELATION = {"name"}; static final String[] DEF_SQL = {"cdata", "dialect"}; //? static final String[] DEF_ANNOTATION = {"name", "cdata"}; static final String[] DEF_SCHEMA = { "name", "description", "measuresCaption", "defaultRole"}; static final String[] DEF_PROPERTY = { "name", "description", "column", "type", "formatter", "caption"}; static final String[] DEF_PARAMETER_SCHEMA = { "name", "description", "type", "modifiable", "defaultValue"}; //? static final String[] DEF_PARAMETER = {"name", "value"}; //? static final String[] DEF_MEASURE = { "name", "description", "aggregator", "column", "formatString", "datatype", "formatter", "caption", "visible" }; static final String[] DEF_CALCULATED_MEMBER = { "name", "description", "caption", "dimension", "hierarchy", "parent", "visible", "formula | formulaElement.cdata", "formatString", }; static final String[] DEF_FORMULA = {"cdata"}; static final String[] DEF_CALCULATED_MEMBER_PROPERTY = { "name", "description", "caption", "expression", "value"}; static final String[] DEF_NAMED_SET = {"name", "description", "formula", "caption"}; static final String[] DEF_USER_DEFINED_FUNCTION = {"name", "className"}; static final String[] DEF_SCRIPT = {"language", "cdata"}; static final String[] DEF_LEVEL = { "name", "description", "table", "column", "nameColumn", "parentColumn", "nullParentValue", "ordinalColumn", "type", "internalType", "uniqueMembers", "levelType", "hideMemberIf", "approxRowCount", "caption", "captionColumn", "formatter", "visible" }; static final String[] DEF_JOIN = { "leftAlias", "leftKey", "rightAlias", "rightKey"}; static final String[] DEF_HIERARCHY = { "name", "description", "hasAll", "allMemberName", "allMemberCaption", "allLevelName", "defaultMember", "memberReaderClass", "primaryKeyTable", "primaryKey", "caption", "visible" }; static final String[] DEF_FORMATTER = {"className"}; static final String[] DEF_EXPRESSION_VIEW = {}; static final String[] DEF_DIMENSION_USAGE = { "name", "foreignKey", "source", "level", "usagePrefix", "caption", "visible"}; static final String[] DEF_DIMENSION = { "name", "description", "foreignKey", "type", "usagePrefix", "caption", "visible"}; static final String[] DEF_CUBE = {"name", "description", "caption", "cache", "enabled", "visible"}; static final String[] DEF_ROLE = {"name"}; static final String[] DEF_SCHEMA_GRANT = {"access"}; static final String[] DEF_CUBE_GRANT = {"access", "cube"}; static final String[] DEF_DIMENSION_GRANT = {"access", "dimension"}; static final String[] DEF_HIERARCHY_GRANT = { "access", "hierarchy", "topLevel", "bottomLevel", "rollupPolicy"}; static final String[] DEF_MEMBER_GRANT = {"access", "member"}; static final String[] DEF_COLUMN = {"name", "table"}; //? private static final String LBL_COLUMN = "Column"; private static final String LBL_CUBE = "Cube"; private static final String LBL_ROLE = "Role"; private static final String LBL_SCHEMA_GRANT = "Schema Grant"; private static final String LBL_CUBE_GRANT = "Cube Grant"; private static final String LBL_DIMENSION_GRANT = "Dimension Grant"; private static final String LBL_HIERARCHY_GRANT = "Hierarchy Grant"; private static final String LBL_MEMBER_GRANT = "Member Grant"; private static final String LBL_DIMENSION = "Dimension"; private static final String LBL_DIMENSION_USAGE = "Dimension Usage"; private static final String LBL_EXPRESSION_VIEW = "Expression View"; private static final String LBL_KEY_EXPRESSION = "Key Expression"; private static final String LBL_NAME_EXPRESSION = "Name Expression"; private static final String LBL_ANNOTATIONS = "Annotations"; private static final String LBL_ANNOTATION = "Annotation"; private static final String LBL_ORDINAL_EXPRESSION = "Ordinal Expression"; private static final String LBL_PARENT_EXPRESSION = "Parent Expression"; private static final String LBL_MEASURE_EXPRESSION = "Measure Expression"; private static final String LBL_HIERARCHY = "Hierarchy"; private static final String LBL_JOIN = "Join"; private static final String LBL_LEVEL = "Level"; private static final String LBL_MEASURE = "Measure"; private static final String LBL_CALCULATED_MEMBER = "Calculated Member"; private static final String LBL_CALCULATED_MEMBER_PROPERTY = "Calculated Member Property"; private static final String LBL_NAMED_SET = "Named Set"; private static final String LBL_USER_DEFINED_FUNCTION = "User Defined Function"; private static final String LBL_PARAMETER = "Parameter"; private static final String LBL_PARAMETER_SCHEMA = "Schema Parameter"; private static final String LBL_PROPERTY = "Property"; private static final String LBL_SCHEMA = "Schema"; private static final String LBL_SQL = "SQL"; private static final String LBL_TABLE = "Table"; private static final String LBL_CLOSURE = "Closure"; private static final String LBL_AGG_NAME = "Aggregate Name"; private static final String LBL_AGG_IGNORE_COLUMN = "Aggregate Ignore Column"; private static final String LBL_AGG_FOREIGN_KEY = "Aggregate Foreign Key"; private static final String LBL_AGG_MEASURE = "Aggregate Measure"; private static final String LBL_AGG_LEVEL = "Aggregate Level"; private static final String LBL_AGG_LEVEL_PROP = "Aggregate Level Property"; private static final String LBL_AGG_PATTERN = "Aggregate Pattern"; private static final String LBL_AGG_EXCLUDE = "Aggregate Exclude"; private static final String LBL_AGG_FACT_COUNT = "Aggregate Fact Count"; private static final String LBL_AGG_MEASURE_FACT_COUNT = "Aggregate Measure Fact Count"; private static final String LBL_VIEW = "View"; private static final String LBL_VIRTUAL_CUBE = "Virtual Cube"; private static final String LBL_VIRTUAL_CUBE_DIMENSION = "Virtual Cube Dimension"; private static final String LBL_VIRTUAL_CUBE_MEASURE = "Virtual Cube Measure"; private static final String LBL_UNKNOWN_TYPE = "Unknown Type"; private static String alert = "Alert"; private AbstractAction arrowButtonUpAction; private AbstractAction arrowButtonDownAction; private AbstractAction addCube; private AbstractAction addRole; private AbstractAction addParameter; private AbstractAction addSchemaGrant; private AbstractAction addCubeGrant; private AbstractAction addDimensionGrant; private AbstractAction addHierarchyGrant; private AbstractAction addMemberGrant; private AbstractAction addAnnotations; private AbstractAction addAnnotation; private AbstractAction addDimension; private AbstractAction addDimensionUsage; private AbstractAction addHierarchy; private AbstractAction addNamedSet; private AbstractAction addUserDefinedFunction; private AbstractAction addScript; private AbstractAction addCalculatedMember; private AbstractAction addMeasure; private AbstractAction addMeasureExp; private AbstractAction addFormula; private AbstractAction addLevel; private AbstractAction addSQL; private AbstractAction addKeyExp; private AbstractAction addNameExp; private AbstractAction addOrdinalExp; private AbstractAction addCaptionExp; private AbstractAction addParentExp; private AbstractAction addTable; private AbstractAction addJoin; private AbstractAction addView; private AbstractAction addInlineTable; private AbstractAction moveLevelUp; private AbstractAction moveLevelDown; private AbstractAction addProperty; private AbstractAction addCalculatedMemberProperty; private AbstractAction addClosure; private AbstractAction addAggName; private AbstractAction addAggIgnoreColumn; private AbstractAction addAggForeignKey; private AbstractAction addAggMeasure; private AbstractAction addAggLevel; private AbstractAction addAggLevelProperty; private AbstractAction addAggPattern; private AbstractAction addAggExclude; private AbstractAction addAggFactCount; private AbstractAction addAggMeasureFactCount; private AbstractAction addVirtualCube; private AbstractAction addVirtualCubeDimension; private AbstractAction addVirtualCubeMeasure; private AbstractAction addCellFormatter; private AbstractAction addMemberFormatter; private AbstractAction addPropertyFormatter; private AbstractAction delete; private AbstractAction editMode; private JTable propertyTable; private JPanel jPanel1; private JPanel jPanel2; private JPanel jPanel3; private JButton addLevelButton; private JScrollPane jScrollPane2; private JScrollPane jScrollPane1; private JButton addPropertyButton; private JButton addCalculatedMemberPropertyButton; private JButton pasteButton; private JLabel targetLabel; private JLabel validStatusLabel; private JLabel targetLabel2; private JLabel validStatusLabel2; JTree tree; private JSplitPane jSplitPane1; private JButton addDimensionButton; private JButton addDimensionUsageButton; private JButton addHierarchyButton; private JButton addNamedSetButton; private JButton addUserDefinedFunctionButton; private JButton addCalculatedMemberButton; private JButton cutButton; private JButton addMeasureButton; private JButton addCubeButton; private JButton addRoleButton; private JButton addVirtualCubeButton; private JButton addVirtualCubeDimensionButton; private JButton addVirtualCubeMeasureButton; private JButton deleteButton; private JToggleButton editModeButton; private JButton copyButton; private JToolBar jToolBar1; private CustomJPopupMenu jPopupMenu; private class CustomJPopupMenu extends JPopupMenu { private TreePath path; void setPath(TreePath path) { this.path = path; } public TreePath getPath() { return path; } } private JSeparator jSeparator1; private JSeparator jSeparator2; private JPanel footer; private JLabel databaseLabel; private JPanel jPanelXML; private JScrollPane jScrollPaneXML; private JEditorPane jEditorPaneXML; public boolean isNewFile() { return newFile; } public void setNewFile(boolean newFile) { this.newFile = newFile; } public boolean isDirty() { return dirty; } public void setDirty(boolean dirty) { this.dirty = dirty; } public void setTitle() { // Sets the title of Internal Frame within which this schema explorer is // displayed. The title includes schema name and schema file name. parentIFrame.setTitle( getResourceConverter().getFormattedString( "schemaExplorer.frame.title", "Schema - {0} ({1}){2}", schema.name, schemaFile.getName(), isDirty() ? "*" : "")); parentIFrame.setToolTipText(schemaFile.toString()); } public void setDirtyFlag(boolean dirtyFlag) { this.dirtyFlag = dirtyFlag; } public Object getParentObject() { TreePath tPath = tree.getSelectionPath(); if ((tPath != null) && (tPath.getParentPath() != null)) { return tPath.getParentPath().getLastPathComponent(); } return null; } public String getJdbcConnectionUrl() { return this.jdbcMetaData.jdbcConnectionUrl; } public String getJdbcUsername() { return this.jdbcMetaData.jdbcUsername; } public String getJdbcPassword() { return this.jdbcMetaData.jdbcPassword; } public String getErrMsg() { return errMsg; } public boolean isEditModeXML() { // used by schema frame focuslistener in workbench/desktoppane return editModeXML; } public I18n getResourceConverter() { return workbench.getResourceConverter(); } public static void getTableNamesForJoin( MondrianGuiDef.RelationOrJoin aRelOrJoin, Set<String> aTableNames) { // EC: Loops join tree and collects table names. if (aRelOrJoin instanceof MondrianGuiDef.Join) { MondrianGuiDef.RelationOrJoin theRelOrJoin_L = ((MondrianGuiDef.Join) aRelOrJoin).left; MondrianGuiDef.RelationOrJoin theRelOrJoin_R = ((MondrianGuiDef.Join) aRelOrJoin).right; for (int i = 0; i < 2; i++) { // Searches first using the Left Join and then the Right. MondrianGuiDef.RelationOrJoin theCurrentRelOrJoin = (i == 0) ? theRelOrJoin_L : theRelOrJoin_R; if (theCurrentRelOrJoin instanceof MondrianGuiDef.Table) { MondrianGuiDef.Table theTable = ((MondrianGuiDef.Table) theCurrentRelOrJoin); String theTableName = (theTable.alias != null && theTable.alias.trim().length() > 0) ? theTable.alias : theTable.name; aTableNames.add(theTableName); } else { // Calls recursively collecting all table names down the // join tree. getTableNamesForJoin(theCurrentRelOrJoin, aTableNames); } } } } public static String[] getTableNameForAlias( MondrianGuiDef.RelationOrJoin aRelOrJoin, String anAlias) { String theTableName = anAlias; String schemaName = null; // EC: Loops join tree and finds the table name for an alias. if (aRelOrJoin instanceof MondrianGuiDef.Join) { MondrianGuiDef.RelationOrJoin theRelOrJoin_L = ((MondrianGuiDef.Join) aRelOrJoin).left; MondrianGuiDef.RelationOrJoin theRelOrJoin_R = ((MondrianGuiDef.Join) aRelOrJoin).right; for (int i = 0; i < 2; i++) { // Searches first using the Left Join and then the Right. MondrianGuiDef.RelationOrJoin theCurrentRelOrJoin = (i == 0) ? theRelOrJoin_L : theRelOrJoin_R; if (theCurrentRelOrJoin instanceof MondrianGuiDef.Table) { MondrianGuiDef.Table theTable = ((MondrianGuiDef.Table) theCurrentRelOrJoin); if (theTable.alias != null && theTable.alias .equals(anAlias)) { // If the alias was found get its table name and return // it. theTableName = theTable.name; schemaName = theTable.schema; } } else { // otherwise continue down the join tree. String[] result = getTableNameForAlias( theCurrentRelOrJoin, anAlias); schemaName = result[0]; theTableName = result[1]; } } } return new String[]{schemaName, theTableName}; } public void resetMetaData(JdbcMetaData aMetaData) { // Update the JdbcMetaData in the SchemaExplorer jdbcMetaData = aMetaData; // Update the database label String theLabel = getResourceConverter().getFormattedString( "schemaExplorer.database.text", "Database - {0} ({1})", jdbcMetaData.getDbCatalogName(), jdbcMetaData.getDatabaseProductName()); databaseLabel.setText(theLabel); // Update the JdbcMetaData in the SchemaTreeCellRenderer. renderer.setMetaData(aMetaData); // Update the JdbcMetaData in the SchemaPropertyCellEditor. TableCellEditor theTableCellEditor = propertyTable.getDefaultEditor( Object.class); if (theTableCellEditor instanceof SchemaPropertyCellEditor) { ((SchemaPropertyCellEditor) theTableCellEditor).setMetaData( aMetaData); } } public JTreeUpdater getTreeUpdater() { return updater; } } // End SchemaExplorer.java