/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ro.nextreports.designer.querybuilder;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.tree.TreePath;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import ro.nextreports.designer.FormLoader;
import ro.nextreports.designer.Globals;
import ro.nextreports.designer.chart.ChartUtil;
import ro.nextreports.designer.persistence.ReportPersistence;
import ro.nextreports.designer.persistence.ReportPersistenceFactory;
import ro.nextreports.designer.ui.BaseDialog;
import ro.nextreports.designer.util.I18NSupport;
import ro.nextreports.designer.util.Show;
import ro.nextreports.engine.Report;
import ro.nextreports.engine.queryexec.QueryParameter;
public class ReportParametersPanel extends JPanel {
private DBBrowserTree dbBrowserTree;
private JXTable table;
private ReportParametersTableModel model;
private Component parent;
private Dimension scrDim = new Dimension(200, 200);
public ReportParametersPanel() {
JScrollPane scroll = createBrowserTree();
createTable();
setLayout(new GridBagLayout());
add(scroll, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
GridBagConstraints.WEST, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
add(new JScrollPane(table), new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0,
GridBagConstraints.WEST, GridBagConstraints.BOTH,
new Insets(0, 5, 0, 0), 0, 0));
}
private JScrollPane createBrowserTree() {
// ignore double click listener for tree (which opens the query)
// and create our own listener (which just selects the path)
dbBrowserTree = new DBBrowserTree(DBObject.DATABASE, false);
dbBrowserTree.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
job(e, true);
}
private void job(MouseEvent e, boolean pressed) {
final TreePath selPath = dbBrowserTree.getPathForLocation(e.getX(), e.getY());
if (selPath == null) {
return;
}
dbBrowserTree.setSelectionPath(selPath);
final DBBrowserNode selectedNode = (DBBrowserNode) selPath.getLastPathComponent();
Report report = null;
if (selectedNode.getDBObject().getType() == DBObject.QUERIES) {
ReportPersistence repPersist = ReportPersistenceFactory.createReportPersistence(
Globals.getReportPersistenceType());
report = repPersist.loadReport(selectedNode.getDBObject().getAbsolutePath());
} else if (selectedNode.getDBObject().getType() == DBObject.REPORTS) {
report = FormLoader.getInstance().load(selectedNode.getDBObject().getAbsolutePath(), false);
} else if(selectedNode.getDBObject().getType() == DBObject.CHARTS) {
report = ChartUtil.loadChart(selectedNode.getDBObject().getAbsolutePath()).getReport();
} else {
report = null;
}
model.clear();
if (report != null) {
model.addObjects(report.getParameters());
}
}
});
JScrollPane scroll = new JScrollPane(dbBrowserTree);
scroll.setPreferredSize(scrDim);
return scroll;
}
private void createTable() {
model = new ReportParametersTableModel();
table = new JXTable(model);
table.setSortable(false);
table.setRolloverEnabled(true);
table.addHighlighter(new ColorHighlighter(HighlightPredicate.ROLLOVER_ROW, null, Color.RED));
table.getColumnModel().getColumn(1).setCellRenderer(new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
row, column);
String tmp = (String) value;
tmp = tmp.substring(tmp.lastIndexOf('.') + 1);
setText(tmp);
return this;
}
});
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent ev) {
if (ev.getClickCount() == 2) {
QueryParameter qp = model.getObjectForRow(table.getSelectedRow());
BaseDialog dialog = new BaseDialog(new ParameterPanelInfo(qp), qp.getName());
dialog.pack();
if (parent == null) {
parent = Globals.getMainFrame();
}
Show.centrateComponent(parent, dialog);
dialog.setVisible(true);
}
}
});
table.setPreferredScrollableViewportSize(new Dimension(250, 200));
}
public class ReportParametersTableModel extends AbstractTableModel {
private final String[] columnNames = {
I18NSupport.getString("parameter.name"),
I18NSupport.getString("parameter.type")
};
private List<QueryParameter> elements = new ArrayList<QueryParameter>();
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
if (elements == null) {
return 0;
}
return elements.size();
}
public void addObject(QueryParameter object) {
elements.add(object);
fireTableDataChanged();
}
public void addObjects(List<QueryParameter> objects) {
elements.addAll(objects);
fireTableDataChanged();
}
public void deleteObject(int rowIndex) {
elements.remove(rowIndex);
fireTableDataChanged();
}
public void deleteObjects(List<QueryParameter> objects) {
elements.removeAll(objects);
fireTableDataChanged();
}
public void clear() {
elements.clear();
fireTableDataChanged();
}
public QueryParameter getObjectForRow(int rowIndex) {
return elements.get(rowIndex);
}
public Object getValueAt(int rowIndex, int columnIndex) {
QueryParameter row = (QueryParameter) elements.get(rowIndex);
switch (columnIndex) {
case 0:
return row.getName();
case 1:
return row.getValueClassName();
default:
return null;
}
}
}
public List<QueryParameter> getSelectedParameters() {
List<QueryParameter> result = new ArrayList<QueryParameter>();
for (int i : table.getSelectedRows()) {
result.add(model.getObjectForRow(i));
}
return result;
}
public void setParent(Component parent) {
this.parent = parent;
}
}