/* * 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.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.ColorHighlighter; import org.jdesktop.swingx.decorator.HighlightPredicate; import ro.nextreports.designer.Globals; import ro.nextreports.designer.ui.BaseDialog; import ro.nextreports.designer.util.I18NSupport; import ro.nextreports.designer.util.ImageUtil; import ro.nextreports.designer.util.Show; import ro.nextreports.engine.util.ObjectCloner; import ro.nextreports.engine.querybuilder.sql.util.CollectionUtil; import ro.nextreports.engine.queryexec.QueryParameter; import com.jgoodies.looks.HeaderStyle; import com.jgoodies.looks.Options; /** * @author Decebal Suiu */ public class ParametersPanel extends JPanel { private JXTable table; private ParametersTableModel model; public ParametersPanel() { initUI(); } private void initUI() { setLayout(new BorderLayout()); JToolBar toolBar = new JToolBar(); toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // hide buttons borders toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH); toolBar.setBorderPainted(false); toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)){ return ImageUtil.getImageIcon("add"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("parameter.add"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { add(); } }); toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)){ return ImageUtil.getImageIcon("add_par"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("parameter.add.from.report"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { addFromReport(); } }); toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)){ return ImageUtil.getImageIcon("parameter_clone"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("parameter.add.clone"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { cloneParameter(); } }); toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)){ return ImageUtil.getImageIcon("edit"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("parameter.edit"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { modify(); } }); toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)){ return ImageUtil.getImageIcon("delete"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("parameter.delete"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { delete(); } }); toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)){ return ImageUtil.getImageIcon("parameter_up"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("parameter.up"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { up(); } }); toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)){ return ImageUtil.getImageIcon("parameter_down"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("parameter.down"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { down(); } }); // SwingUtil.registerButtonsForFocus(buttonsPanel); add(toolBar, BorderLayout.NORTH); createTable(); 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); /* if ("Object".equals(tmp)) { tmp = "Any"; } */ setText(tmp); return this; } }); table.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { if (event.getClickCount() == 2) { modify(); } } }); table.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent event) { int keyCode = event.getKeyCode(); if (keyCode == KeyEvent.VK_ENTER) { modify(); // don't let anyone else handle the event event.consume(); } else if (keyCode == KeyEvent.VK_INSERT) { add(); // don't let anyone else handle the event event.consume(); } else if (keyCode == KeyEvent.VK_DELETE) { delete(); // don't let anyone else handle the event event.consume(); } } }); add(new JScrollPane(table), BorderLayout.CENTER); table.setPreferredScrollableViewportSize(new Dimension(250, 200)); } private void createTable() { model = new ParametersTableModel(); table = new JXTable(model); table.setSortable(false); //table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setRolloverEnabled(true); table.addHighlighter(new ColorHighlighter(HighlightPredicate.ROLLOVER_ROW, null, Color.RED)); } public void addAll(List<QueryParameter> parameters) { for (QueryParameter param : parameters) { ParameterManager.getInstance().addParameter(param); model.addObject(param); } } public void set(List<QueryParameter> parameters) { ParameterManager.getInstance().clearParameters(); model.clear(); addAll(parameters); } public void addParameter(QueryParameter param) { ParameterManager.getInstance().addParameter(param); model.addObject(param); } private void add() { if (Globals.getConnection() == null) { Show.info(I18NSupport.getString("no.data.source.connected")); return; } ParameterEditPanel panel = new ParameterEditPanel(null); ParameterEditDialog dlg = new ParameterEditDialog(panel, I18NSupport.getString("add.parameter.title"), true); dlg.pack(); Show.centrateComponent(Globals.getMainFrame(), dlg); dlg.setVisible(true); if (dlg.okPressed() && (dlg.getParameter() != null)) { ParameterManager.getInstance().addParameter(dlg.getParameter()); model.addObject(dlg.getParameter()); } } private void addFromReport() { if (Globals.getConnection() == null) { Show.info(I18NSupport.getString("no.data.source.connected")); return; } final ReportParametersPanel panel = new ReportParametersPanel(); panel.setMinimumSize(new Dimension(300, (int)panel.getMinimumSize().getHeight())); BaseDialog dialog = new BaseDialog(panel, I18NSupport.getString("parameter.add.from.report")) { protected boolean ok() { List<QueryParameter> parameters = panel.getSelectedParameters(); if (parameters.size() == 0) { return false; } for (QueryParameter qp : parameters) { if (ParameterManager.getInstance().containsParameter(qp.getName())) { JOptionPane.showMessageDialog(this, I18NSupport.getString("parameter.edit.name.exists.value", qp.getName())); return false; } } return true; } }; panel.setParent(dialog); dialog.pack(); Show.centrateComponent(Globals.getMainFrame(), dialog); dialog.setVisible(true); if (dialog.okPressed()) { for (QueryParameter qp : panel.getSelectedParameters()) { ParameterManager.getInstance().addParameter(qp); } model.addObjects(panel.getSelectedParameters()); } } private void cloneParameter() { int[] selectedRows = table.getSelectedRows(); if (selectedRows.length != 1) { Show.info(I18NSupport.getString("parameter.select")); return; } QueryParameter oldParam = (QueryParameter) model.getObjectForRow(selectedRows[0]); QueryParameter clone = ObjectCloner.silenceDeepCopy(oldParam); clone.setName(clone.getName() + "_c"); ParameterManager.getInstance().addParameter(clone); model.addObject(clone); } private void modify() { int[] selectedRows = table.getSelectedRows(); if (selectedRows.length != 1) { Show.info(I18NSupport.getString("parameter.select")); return; } QueryParameter oldParam = (QueryParameter) model.getObjectForRow(selectedRows[0]); ParameterEditPanel panel = new ParameterEditPanel(oldParam); ParameterEditDialog dlg = new ParameterEditDialog(panel, I18NSupport.getString("modify.parameter.title"), true); dlg.pack(); Show.centrateComponent(Globals.getMainFrame(), dlg); dlg.setVisible(true); if (!dlg.okPressed()) { return; } QueryParameter newParam = dlg.getParameter(); ParameterManager.getInstance().modifyParameter(oldParam, newParam); model.updateObject(selectedRows[0], newParam); } private void delete() { int[] selectedRows = table.getSelectedRows(); if (selectedRows.length == 0) { Show.info(I18NSupport.getString("parameter.select")); return; } if (JOptionPane.showConfirmDialog(Globals.getMainFrame(), I18NSupport.getString("parameter.askDelete")) != JOptionPane.OK_OPTION) { return; } for (int i = selectedRows.length - 1; i >= 0; i--) { QueryParameter param = (QueryParameter) model.getObjectForRow(selectedRows[i]); ParameterManager.getInstance().deleteParameter(param); model.deleteObject(selectedRows[i]); } } private void up() { int[] selectedRows = table.getSelectedRows(); if (selectedRows.length != 1) { Show.info(I18NSupport.getString("parameter.select")); return; } QueryParameter param = (QueryParameter) model.getObjectForRow(selectedRows[0]); ParameterManager.getInstance().moveParameter(param.getName(), true); model.moveObjectUp(selectedRows[0]); } private void down() { int[] selectedRows = table.getSelectedRows(); if (selectedRows.length != 1) { Show.info(I18NSupport.getString("parameter.select")); return; } QueryParameter param = (QueryParameter) model.getObjectForRow(selectedRows[0]); ParameterManager.getInstance().moveParameter(param.getName(), false); model.moveObjectDown(selectedRows[0]); } public class ParametersTableModel extends AbstractTableModel { private final String[] columnNames = { I18NSupport.getString("parameter.name"), I18NSupport.getString("parameter.type") // "Description" }; private List elements = ParameterManager.getInstance().getParameters(); public String getColumnName(int columnIndex) { return columnNames[columnIndex]; } public int getColumnCount() { return columnNames.length; } public int getRowCount() { // this method is called in the constructor so we must test for null if (elements == null) { return 0; } return elements.size(); } @SuppressWarnings("unchecked") public void addObject(Object object) { elements.add(object); fireTableDataChanged(); } @SuppressWarnings("unchecked") public void addObjects(List objects) { elements.addAll(objects); fireTableDataChanged(); } public void deleteObject(int rowIndex) { elements.remove(rowIndex); fireTableDataChanged(); } public void moveObjectUp(int rowIndex) { if (rowIndex > 0) { QueryParameter param = (QueryParameter) elements.get(rowIndex); CollectionUtil.moveItem(elements, param, rowIndex - 1); fireTableDataChanged(); table.setRowSelectionInterval(rowIndex - 1, rowIndex - 1); } } public void moveObjectDown(int rowIndex) { if (rowIndex < elements.size() - 1) { QueryParameter param = (QueryParameter) elements.get(rowIndex); CollectionUtil.moveItem(elements, param, rowIndex + 1); fireTableDataChanged(); table.setRowSelectionInterval(rowIndex + 1, rowIndex + 1); } } @SuppressWarnings("unchecked") public void deleteObjects(List objects) { elements.removeAll(objects); fireTableDataChanged(); } public void clear() { elements.clear(); fireTableDataChanged(); } public Object getObjectForRow(int rowIndex) { return elements.get(rowIndex); } @SuppressWarnings("unchecked") public void updateObject(int row, Object object) { row = table.convertRowIndexToModel(row); elements.set(row, object); fireTableDataChanged(); } 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(); // case 2: // return row.getDescription(); default: return null; } } } }