/*
// 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-2009 Pentaho and others
// Copyright (C) 2006-2007 CINCOM SYSTEMS, INC.
// All Rights Reserved.
*/
package mondrian.gui;
import java.awt.*;
import java.io.StringReader;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
/**
* @author sean
*/
public class SchemaPropertyCellRenderer
extends javax.swing.table.DefaultTableCellRenderer
{
Workbench workbench;
JLabel stringRenderer;
JCheckBox booleanRenderer;
JLabel integerRenderer;
JTable tableRenderer;
JComboBox listRenderer;
JScrollPane jScrollPaneCDATA;
// JEditorPane jEditorPaneCDATA;
JTextArea cdataTextArea;
JComboBox relationList; // Join, Table
JTable relationTable;
JPanel relationRenderer, rlPanel;
JScrollPane jScrollPaneT;
// All objects of this class will use this color value to render attribute
// column this value is initialized by SchemaExplorer to the scrollpane
// background color value.
public static Color attributeBackground;
/**
* Creates a new instance of SchemaPropertyCellRenderer
*/
public SchemaPropertyCellRenderer(Workbench wb) {
workbench = wb;
super.setBackground(attributeBackground);
stringRenderer = new JLabel();
stringRenderer.setFont(Font.decode("Dialog"));
// cdata multi-line
cdataTextArea = new JTextArea();
cdataTextArea.setLineWrap(true);
cdataTextArea.setWrapStyleWord(true);
cdataTextArea.setLayout(new java.awt.BorderLayout());
cdataTextArea.setEditable(true);
cdataTextArea.setPreferredSize(new java.awt.Dimension(100, 300));
cdataTextArea.setMinimumSize(new java.awt.Dimension(100, 100));
jScrollPaneCDATA = new JScrollPane(cdataTextArea);
jScrollPaneCDATA.setMaximumSize(cdataTextArea.getPreferredSize());
booleanRenderer = new JCheckBox();
booleanRenderer.setBackground(Color.white);
integerRenderer = new JLabel();
integerRenderer.setHorizontalAlignment(JTextField.RIGHT);
integerRenderer.setFont(Font.decode("Courier"));
listRenderer = new JComboBox(MondrianGuiDef.Measure._aggregator_values);
listRenderer.setMaximumSize(stringRenderer.getMaximumSize());
listRenderer.setFont(Font.decode("Dialog"));
listRenderer.setBackground(Color.white);
//listRenderer.setModel(new ComboBoxModel());
listRenderer.setBorder(
new EmptyBorder(
0, 0, 0, 0)); //super.noFocusBorder);
listRenderer.setRenderer(new ListRenderer(listRenderer.getRenderer()));
/*
relationListRenderer = new JComboBox(new String[] {"Join", "Table"});
relationListRenderer.setMaximumSize(stringRenderer.getMaximumSize());
relationListRenderer.setFont(Font.decode("Dialog"));
relationListRenderer.setBackground(Color.white);
*/
relationRenderer = new JPanel();
rlPanel = new JPanel();
relationList = new JComboBox(
new String[]{
workbench.getResourceConverter().getString(
"schemaPropertyCellRenderer.join", "Join"),
workbench.getResourceConverter().getString(
"schemaPropertyCellRenderer.table", "Table")
});
relationList.setMaximumSize(new Dimension(55, 22));
relationList.setPreferredSize(new Dimension(55, 22));
relationList.setMinimumSize(new Dimension(55, 22));
relationList.setFont(Font.decode("Dialog"));
relationList.setBackground(Color.white);
relationTable = new JTable();
relationTable.setBackground(new java.awt.Color(255, 204, 204));
// to remove table headers 'Property', 'Value''
relationTable.setTableHeader(null);
jScrollPaneT = new JScrollPane();
jScrollPaneT.setViewportBorder(
javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(
255, 0, 255), 2));
jScrollPaneT.setVerticalScrollBarPolicy(
ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
jScrollPaneT.setViewportView(relationTable);
relationRenderer.setLayout(new BorderLayout());
rlPanel.add(relationList);
relationRenderer.add(rlPanel, java.awt.BorderLayout.WEST);
relationRenderer.add(jScrollPaneT, java.awt.BorderLayout.CENTER);
relationRenderer.setBackground(Color.white);
//relationRenderer.add(jScrollPaneT,java.awt.BorderLayout.CENTER);
//JPanel relPanel = new JPanel(); // default flowlayout
//relPanel.add(relationList);
//relPanel.add(jScrollPaneT);
//relationRenderer.add(relationTable);
//relationRenderer.add(relPanel,java.awt.BorderLayout.CENTER);
//relationRenderer.add(jScrollPaneT);
tableRenderer = new JTable();
}
public JCheckBox getBooleanRenderer() {
return booleanRenderer;
}
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
if (column == 1) {
PropertyTableModel tableModel =
(PropertyTableModel) table.getModel();
Class targetClassz = tableModel.target.getClass();
String propertyName = tableModel.getRowName(row);
stringRenderer.setOpaque(false);
stringRenderer.setToolTipText(null);
stringRenderer.setBackground(Color.white);
//targetClassz == MondrianGuiDef.Formula.class &&
if (propertyName.equals("cdata")) {
try {
cdataTextArea.read(new StringReader((String) value), null);
} catch (Exception ex) {
}
return jScrollPaneCDATA;
} else if (value instanceof String) {
stringRenderer.setText((String) value);
return stringRenderer;
} else if (value instanceof Boolean) {
booleanRenderer.setSelected((Boolean) value);
return booleanRenderer;
} else if (value instanceof Integer) {
integerRenderer.setText(value.toString());
return integerRenderer;
} else if (value == null) {
return null;
} else if (value.getClass() == MondrianGuiDef.Join.class) {
stringRenderer.setText(generateJoinStr(value));
stringRenderer.setToolTipText(
workbench.getResourceConverter().getString(
"schemaPropertyCellRenderer.selectJoinObject",
"Select the Join/Table object from Schema tree to "
+ "edit."));
stringRenderer.setOpaque(true);
stringRenderer.setBackground(Color.LIGHT_GRAY);
return stringRenderer;
/* 2: Displaying Join in nested pink boxes
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer();
relationTable.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm =
new PropertyTableModel(value,SchemaExplorer.DEF_JOIN);
relationTable.setModel(ptm);
relationTable.getColumnModel().getColumn(0).setMaxWidth(100);
relationTable.getColumnModel().getColumn(0).setMinWidth(100);
setTableRendererHeight(relationTable, relationRenderer);
return relationRenderer;
*/
} else if (value.getClass()
== MondrianGuiDef.OrdinalExpression.class)
{
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench,
((MondrianGuiDef.OrdinalExpression) value).expressions[0],
SchemaExplorer.DEF_SQL);
tableRenderer.setModel(ptm);
tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100);
tableRenderer.getColumnModel().getColumn(0).setMinWidth(100);
return tableRenderer;
} else if (value.getClass()
== MondrianGuiDef.OrdinalExpression.class)
{
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench,
((MondrianGuiDef.CaptionExpression) value).expressions[0],
SchemaExplorer.DEF_SQL);
tableRenderer.setModel(ptm);
tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100);
tableRenderer.getColumnModel().getColumn(0).setMinWidth(100);
return tableRenderer;
} else if (value.getClass() == MondrianGuiDef.Formula.class) {
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench, value, SchemaExplorer.DEF_FORMULA);
tableRenderer.setModel(ptm);
tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100);
tableRenderer.getColumnModel().getColumn(0).setMinWidth(100);
return tableRenderer;
} else if (value.getClass()
== MondrianGuiDef.CalculatedMemberProperty.class)
{
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench,
value,
SchemaExplorer.DEF_CALCULATED_MEMBER_PROPERTY);
tableRenderer.setModel(ptm);
tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100);
tableRenderer.getColumnModel().getColumn(0).setMinWidth(100);
return tableRenderer;
} else if (value.getClass() == MondrianGuiDef.Table.class) {
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench, value, SchemaExplorer.DEF_TABLE);
tableRenderer.setModel(ptm);
tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100);
tableRenderer.getColumnModel().getColumn(0).setMinWidth(100);
return tableRenderer;
} else if (value.getClass()
== MondrianGuiDef.RelationOrJoin.class)
{
// REVIEW: Covers View and InlineTable, since Table and Join are
// managed above.
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench, value, SchemaExplorer.DEF_RELATION);
tableRenderer.setModel(ptm);
return tableRenderer;
} else if (value.getClass() == MondrianGuiDef.AggFactCount.class) {
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench, value, SchemaExplorer.DEF_AGG_FACT_COUNT);
tableRenderer.setModel(ptm);
tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100);
tableRenderer.getColumnModel().getColumn(0).setMinWidth(100);
return tableRenderer;
} else if (value.getClass() == MondrianGuiDef.Closure.class) {
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench, value, SchemaExplorer.DEF_CLOSURE);
tableRenderer.setModel(ptm);
tableRenderer.getColumnModel().getColumn(0).setMaxWidth(100);
tableRenderer.getColumnModel().getColumn(0).setMinWidth(100);
setTableRendererHeight(tableRenderer, null);
return tableRenderer;
} else if (value.getClass() == MondrianGuiDef.Property.class) {
SchemaPropertyCellRenderer spcr =
new SchemaPropertyCellRenderer(workbench);
tableRenderer.setDefaultRenderer(Object.class, spcr);
PropertyTableModel ptm = new PropertyTableModel(
workbench, value, SchemaExplorer.DEF_PROPERTY);
tableRenderer.setModel(ptm);
return tableRenderer;
} else {
return null;
}
} else {
if (value instanceof String) {
// Use data from workbenchInfo.properties as tooltip when
// available.
PropertyTableModel tableModel =
(PropertyTableModel) table.getModel();
String className = (tableModel.target.getClass()).getName();
int pos = className.lastIndexOf("$");
String tooltip = null;
if (pos > 0) {
String tipName = (className.substring(pos + 1))
+ ","
+ tableModel.getRowName(row);
tooltip = workbench.getTooltip(tipName);
}
stringRenderer.setToolTipText(tooltip);
stringRenderer.setText((String) value);
stringRenderer.setOpaque(true);
stringRenderer.setBackground(new java.awt.Color(221, 221, 221));
if (isSelected && hasFocus) {
table.editCellAt(row, 1);
}
return stringRenderer;
}
}
return super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
}
private String generateJoinStr(Object value) {
MondrianGuiDef.Join currentJoin = (MondrianGuiDef.Join) value;
String joinStr = "<html>"
+ generateLeftRightStr(currentJoin.left)
+ " <b>JOIN</b> "
+ generateLeftRightStr(currentJoin.right)
+ "</html>";
return joinStr;
}
private String generateLeftRightStr(Object value) {
MondrianGuiDef.RelationOrJoin currentObj =
(MondrianGuiDef.RelationOrJoin) value;
if (currentObj instanceof MondrianGuiDef.Table) {
return (((MondrianGuiDef.Table) currentObj).alias == null
|| ((MondrianGuiDef.Table) currentObj).alias.equals("")
? ((MondrianGuiDef.Table) currentObj).name
: ((MondrianGuiDef.Table) currentObj).alias);
}
MondrianGuiDef.Join currentJoin = (MondrianGuiDef.Join) currentObj;
String joinStr = "("
+ generateLeftRightStr(currentJoin.left)
+ " <b>JOIN</b> "
+ generateLeftRightStr(currentJoin.right)
+ ")";
return joinStr;
}
void setTableRendererHeight(JTable relationTable, JPanel relationRenderer) {
int tableH = 0;
int tableW = 0;
Object value = null;
for (int i = 0; i < relationTable.getRowCount(); i++) {
TableCellRenderer renderer = relationTable.getCellRenderer(i, 1);
Component comp = renderer.getTableCellRendererComponent(
relationTable,
relationTable.getValueAt(i, 1),
false,
false,
i,
1);
try {
int height = 0;
int width = 0;
if (comp != null) {
height = comp.getMaximumSize().height;
width = comp.getMaximumSize().width;
relationTable.setRowHeight(i, height);
}
value = relationTable.getValueAt(i, 1);
if (value instanceof MondrianGuiDef.RelationOrJoin) {
tableH += comp.getPreferredSize().height;
tableW = Math.max(
tableW, comp.getPreferredSize().width + stringRenderer
.getMaximumSize().width);
} else if (value == null) {
tableH += stringRenderer.getMaximumSize().height;
tableW = Math.max(
tableW, stringRenderer.getMaximumSize().width * 2);
} else {
tableH += height;
tableW = Math.max(tableW, width * 2);
}
} catch (Exception ea) {
}
}
// table height changes
relationTable.setPreferredSize(
new Dimension(
tableW, tableH));
// scrollpane adjusts to new table height, it also changes scrollpanes'
// preferred size values
relationTable.setPreferredScrollableViewportSize(
relationTable.getPreferredSize());
if (relationRenderer != null) {
relationRenderer.setPreferredSize(
jScrollPaneT.getPreferredSize());
relationRenderer.setMaximumSize(
jScrollPaneT.getPreferredSize());
}
}
}
// End SchemaPropertyCellRenderer.java