/* * 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.*; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetAdapter; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.EventObject; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.sql.Connection; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXPanel; import ro.nextreports.designer.Globals; import ro.nextreports.designer.LayoutHelper; import ro.nextreports.designer.WorkspaceManager; import ro.nextreports.designer.action.query.OpenQueryPerspectiveAction; import ro.nextreports.designer.chart.ChartPropertyPanel; import ro.nextreports.designer.datasource.DataSource; import ro.nextreports.designer.dbviewer.common.DBProcedure; import ro.nextreports.designer.dbviewer.common.DBProcedureColumn; import ro.nextreports.designer.i18n.action.I18nManager; import ro.nextreports.designer.querybuilder.datatransfer.DBProcTransferable; import ro.nextreports.designer.querybuilder.datatransfer.DBTableTransferable; import ro.nextreports.designer.ui.GlobalHotkeyManager; import ro.nextreports.designer.ui.eventbus.CircularEventFilter; import ro.nextreports.designer.ui.eventbus.Subscriber; import ro.nextreports.designer.ui.list.CheckListBox; import ro.nextreports.designer.ui.list.CheckListItem; import ro.nextreports.designer.util.DecoratedScrollPane; import ro.nextreports.designer.util.I18NSupport; import ro.nextreports.designer.util.ImageUtil; import ro.nextreports.designer.util.ShortcutsUtil; import ro.nextreports.designer.util.Show; import ro.nextreports.designer.util.SwingUtil; import ro.nextreports.designer.util.TableUtil; import ro.nextreports.designer.util.TreeUtil; import ro.nextreports.engine.ReleaseInfoAdapter; import ro.nextreports.engine.Report; import ro.nextreports.engine.ReportLayout; import ro.nextreports.engine.chart.Chart; import ro.nextreports.engine.util.ProcUtil; import ro.nextreports.engine.util.DialectUtil; import ro.nextreports.engine.exporter.util.ParametersBean; import ro.nextreports.engine.persistence.TablePersistentObject; import ro.nextreports.engine.querybuilder.MyRow; import ro.nextreports.engine.querybuilder.sql.Column; import ro.nextreports.engine.querybuilder.sql.JoinCriteria; import ro.nextreports.engine.querybuilder.sql.MatchCriteria; import ro.nextreports.engine.querybuilder.sql.SelectQuery; import ro.nextreports.engine.querybuilder.sql.Table; import ro.nextreports.engine.queryexec.QueryParameter; import ro.nextreports.engine.queryexec.QueryResult; import com.jgoodies.looks.HeaderStyle; import com.jgoodies.looks.Options; /** * @author Decebal Suiu */ public class QueryBuilderPanel extends JXPanel { private DBBrowserTree dbBrowserTree; private DBTablesDesktopPane desktop = new DBTablesDesktopPane(this); private JXPanel browserPanel; private JTabbedPane tabbedPane; private ParametersPanel parametersPanel; private SQLViewPanel sqlView; private JToggleButton groupByButton; private JToggleButton distinctButton; private boolean groupBy; private DesignerTablePanel designPanel; private boolean cleaned = true; private boolean hasDesigner = false; /** * key = java.lang.Character - prima litera din numele unei tabele * value = java.lang.Integer - ultimul index alocat unui alias */ private Map<Character, Integer> letterIndexes = new HashMap<Character, Integer>(); private boolean synchronizedPanels = true; // if a query was modified in the editor and we return to designer , the query // is restored from the designer and when we return to the sql panel (editor) // the table of results must be cleared private boolean resetTable = false; private static final Log LOG = LogFactory.getLog(QueryBuilderPanel.class); /** * key = table alias * value = table name */ private Map<String, String> tableNamesMap = new HashMap<String, String>(); private SelectQuery selectQuery = new SelectQuery(); public QueryBuilderPanel() { super(); setLayout(new BorderLayout()); dbBrowserTree = new DBBrowserTree(); Globals.getEventBus().subscribe(GroupByEvent.class, new CircularEventFilter(desktop), new GroupByCheckSubscriber()); initUI(); } private void initUI() { JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); split.setDividerLocation(250); split.setOneTouchExpandable(true); JToolBar toolBar = new JToolBar(); toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // hide buttons borders toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH); toolBar.setBorderPainted(false); // add refresh action toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)) { return ImageUtil.getImageIcon("refresh"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("querybuilder.refresh"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { try { if (Globals.getConnection() == null) { return; } // refresh tables, views, procedures TreeUtil.refreshDatabase(); // add new queries to tree TreeUtil.refreshQueries(); // add new reports to tree TreeUtil.refreshReports(); // add new charts to tree TreeUtil.refreshCharts(); } catch (Exception ex) { Show.error(ex); } } }); // add expand action toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)) { return ImageUtil.getImageIcon("expandall"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("querybuilder.expand.all"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { TreeUtil.expandAll(dbBrowserTree); } }); // add collapse action toolBar.add(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)) { return ImageUtil.getImageIcon("collapseall"); } else if (AbstractAction.SHORT_DESCRIPTION.equals(key)) { return I18NSupport.getString("querybuilder.collapse.all"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { TreeUtil.collapseAll(dbBrowserTree); } }); // add properties button /* JButton propButton = new MagicButton(new AbstractAction() { public Object getValue(String key) { if (AbstractAction.SMALL_ICON.equals(key)) { return ImageUtil.getImageIcon("properties"); } return super.getValue(key); } public void actionPerformed(ActionEvent e) { DBBrowserPropertiesPanel joinPanel = new DBBrowserPropertiesPanel(); JDialog dlg = new DBBrowserPropertiesDialog(joinPanel); dlg.pack(); dlg.setResizable(false); Show.centrateComponent(Globals.getMainFrame(), dlg); dlg.setVisible(true); } }); propButton.setToolTipText(I18NSupport.getString("querybuilder.properties")); */ //browserButtonsPanel.add(propButton); // ro.nextreports.designer.util.SwingUtil.registerButtonsForFocus(browserButtonsPanel); browserPanel = new JXPanel(new BorderLayout()); browserPanel.add(toolBar, BorderLayout.NORTH); // browser tree JScrollPane scroll = new JScrollPane(dbBrowserTree); browserPanel.add(scroll, BorderLayout.CENTER); split.setLeftComponent(browserPanel); tabbedPane = new JTabbedPane(JTabbedPane.BOTTOM); // tabbedPane.putClientProperty(Options.EMBEDDED_TABS_KEY, Boolean.TRUE); // look like eclipse JSplitPane split2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT); split2.setResizeWeight(0.66); split2.setOneTouchExpandable(true); // desktop pane desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); desktop.setDropTarget(new DropTarget(desktop, DnDConstants.ACTION_MOVE, new DesktopPaneDropTargetListener(), true)); // create the toolbar JToolBar toolBar2 = new JToolBar(); toolBar2.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // hide buttons borders toolBar2.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH); toolBar2.setBorderPainted(false); Action distinctAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { if (distinctButton.isSelected()) { selectQuery.setDistinct(true); } else { selectQuery.setDistinct(false); } } }; distinctAction.putValue(Action.SMALL_ICON, ImageUtil.getImageIcon("query.distinct")); distinctAction.putValue(Action.SHORT_DESCRIPTION, I18NSupport.getString("querybuilder.distinct")); toolBar2.add(distinctButton = new JToggleButton(distinctAction)); Action groupByAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { groupBy = groupByButton.isSelected(); Globals.getEventBus().publish(new GroupByEvent(QueryBuilderPanel.this.desktop, groupBy)); } }; groupByAction.putValue(Action.SMALL_ICON, ImageUtil.getImageIcon("query.group_by")); groupByAction.putValue(Action.SHORT_DESCRIPTION, I18NSupport.getString("querybuilder.group.by")); toolBar2.add(groupByButton = new JToggleButton(groupByAction)); Action clearAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { clear(false); } }; clearAction.putValue(Action.SMALL_ICON, ImageUtil.getImageIcon("clear")); clearAction.putValue(Action.SHORT_DESCRIPTION, I18NSupport.getString("querybuilder.clear")); toolBar2.add(clearAction); // add separator SwingUtil.addCustomSeparator(toolBar2); // add run button Action runQueryAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { selectSQLViewTab(); sqlView.doRun(); } }; runQueryAction.putValue(Action.SMALL_ICON, ImageUtil.getImageIcon("run")); KeyStroke ks = KeyStroke.getKeyStroke(ShortcutsUtil.getShortcut("query.run.accelerator", "control 4")); runQueryAction.putValue(Action.SHORT_DESCRIPTION, I18NSupport.getString("run.query") + " (" + ShortcutsUtil.getShortcut("query.run.accelerator.display", "Ctrl 4") + ")"); runQueryAction.putValue(Action.ACCELERATOR_KEY, ks); toolBar2.add(runQueryAction); // register run query shortcut GlobalHotkeyManager hotkeyManager = GlobalHotkeyManager.getInstance(); InputMap inputMap = hotkeyManager.getInputMap(); ActionMap actionMap = hotkeyManager.getActionMap(); inputMap.put((KeyStroke) runQueryAction.getValue(Action.ACCELERATOR_KEY), "runQueryAction"); actionMap.put("runQueryAction", runQueryAction); JScrollPane scroll2 = new JScrollPane(desktop, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll2.setPreferredSize(DBTablesDesktopPane.PREFFERED_SIZE); DecoratedScrollPane.decorate(scroll2); JPanel topPanel = new JPanel(); topPanel.setLayout(new GridBagLayout()); topPanel.add(toolBar2, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); topPanel.add(scroll2, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); split2.setTopComponent(topPanel); designPanel = new DesignerTablePanel(selectQuery); split2.setBottomComponent(designPanel); split2.setDividerLocation(400); tabbedPane.addTab(I18NSupport.getString("querybuilder.query.designer"), ImageUtil.getImageIcon("designer"), split2); tabbedPane.setMnemonicAt(0, 'D'); sqlView = new SQLViewPanel(); sqlView.getEditorPane().setDropTarget(new DropTarget(sqlView.getEditorPane(), DnDConstants.ACTION_MOVE, new SQLViewDropTargetListener(), true)); tabbedPane.addTab(I18NSupport.getString("querybuilder.query.editor"), ImageUtil.getImageIcon("sql"), sqlView); tabbedPane.setMnemonicAt(1, 'E'); split.setRightComponent(tabbedPane); // register a change listener tabbedPane.addChangeListener(new ChangeListener() { // this method is called whenever the selected tab changes public void stateChanged(ChangeEvent ev) { if (ev.getSource() == QueryBuilderPanel.this.tabbedPane) { // get current tab int sel = QueryBuilderPanel.this.tabbedPane.getSelectedIndex(); if (sel == 1) { // sql view String query; if (!synchronizedPanels) { query = sqlView.getQueryString(); synchronizedPanels = true; } else { if (Globals.getConnection() != null) { query = getSelectQuery().toString(); } else { query = ""; } // if (query.equals("")) { // query = sqlView.getQueryString(); // } } if (resetTable) { sqlView.clear(); resetTable = false; } //System.out.println("query="+query); sqlView.setQueryString(query); } else if (sel == 0) { // design view if (queryWasModified(false)) { Object[] options = {I18NSupport.getString("optionpanel.yes"), I18NSupport.getString("optionpanel.no")}; String m1 = I18NSupport.getString("querybuilder.lost"); String m2 = I18NSupport.getString("querybuilder.continue"); int option = JOptionPane.showOptionDialog(Globals.getMainFrame(), "<HTML>" + m1 + "<BR>" + m2 + "</HTML>", I18NSupport.getString("querybuilder.confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); if (option != JOptionPane.YES_OPTION) { synchronizedPanels = false; tabbedPane.setSelectedIndex(1); } else { resetTable = true; } } } else if (sel == 2) { // report view } } } }); // this.add(split, BorderLayout.CENTER); parametersPanel = new ParametersPanel(); } public void initWorkspace() { this.putClientProperty(WorkspaceManager.QUERY_CONTENT, tabbedPane); this.putClientProperty(WorkspaceManager.QUERY_EXPLORER, browserPanel); this.putClientProperty(WorkspaceManager.QUERY_PARAMETERS, parametersPanel); WorkspaceManager.getInstance().setCurrentWorkspace(WorkspaceManager.QUERY_WORKSPACE); } public void addQuery(String name, String path) { try { dbBrowserTree.addQuery(name, path); } catch (Exception e) { Show.error(e); } } public void addReport(String name, String path) { try { dbBrowserTree.addReport(name, path); } catch (Exception e) { Show.error(e); } } public void addFolder(String name, String absPath, byte type, boolean onRoot) { try { dbBrowserTree.addFolder(name, absPath, type, onRoot); } catch (Exception e) { Show.error(e); } } public void addChart(String name, String path) { try { dbBrowserTree.addChart(name, path); } catch (Exception e) { Show.error(e); } } public void addDataSource(String name) { try { dbBrowserTree.addDataSource(name); } catch (Exception e) { Show.error(e); } } public void modifyDataSource(String oldName, String name) { try { dbBrowserTree.modifyDataSource(oldName, name); } catch (Exception e) { Show.error(e); } } public boolean foundQuery(String name) { dbBrowserTree.loadQueries(); return (dbBrowserTree.searchNode(name) != null); } public void refreshTreeOnRestore() { dbBrowserTree.refreshTreeOnRestore(); } public SelectQuery getSelectQuery() { try { selectQuery.setDialect(DialectUtil.getDialect(Globals.getConnection())); } catch (Exception e) { e.printStackTrace(); LOG.error(e.getMessage(), e); } return selectQuery; } public void setSelectQuery(SelectQuery selectQuery) { this.selectQuery = selectQuery; } public void tableColumnRemoved(String tableAlias, String tableName, String columnName) { desktop.tableColumnRemoved(tableAlias, tableName, columnName); } public void allTableColumnsRemoved() { desktop.allTableColumnsRemoved(); } private int getIndexForLetter(char letter) { Integer index = letterIndexes.get(letter); if (index == null) { index = new Integer(1); } else { index = new Integer(index.intValue() + 1); } letterIndexes.put(letter, index); return index.intValue(); } class DesktopPaneDropTargetListener extends DropTargetAdapter { public void dragEnter(DropTargetDragEvent dtde) { if (isDragOk(dtde)) { dtde.acceptDrag(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrag(); } } public void dragOver(DropTargetDragEvent dtde) { if (isDragOk(dtde)) { dtde.acceptDrag(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrag(); } } public void drop(DropTargetDropEvent dtde) { if ((dtde.getDropAction() & DnDConstants.ACTION_MOVE) == DnDConstants.ACTION_MOVE) { dtde.acceptDrop(DnDConstants.ACTION_MOVE); Transferable t = dtde.getTransferable(); Point point = dtde.getLocation(); try { Table dbTable = (Table) t.getTransferData(DBTableTransferable.DATA_FLAVOR); String tableName = dbTable.getName(); String tableAlias = null; Set entrySey = tableNamesMap.entrySet(); for (Iterator it = entrySey.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); if (tableName.equals(entry.getValue())) { if (!desktop.containsIFrame(entry.getKey() + " (" + dbTable.getSchemaName() + "." + tableName + ")")) { // am gasit un alias pentru tabela asta care nu a fost alocat // titlului nici unei ferestre interne tableAlias = (String) entry.getKey(); break; } } } if (tableAlias == null) { // nu am nici un alias liber, creez unul nou tableAlias = tableName.substring(0, 1) + getIndexForLetter(tableName.charAt(0)); tableNamesMap.put(tableAlias, tableName); } cleaned = false; Table table = new Table(tableName, tableAlias); table.setSchemaName(dbTable.getSchemaName()); try { table.setDialect(DialectUtil.getDialect(Globals.getConnection())); } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. LOG.error(e.getMessage(), e); } Map<String, List<CheckListItem>> itemMap = TableUtil.getItemMap(table); DBTableInternalFrame iframe = new DBTableInternalFrame(desktop, table, itemMap); itemMap.clear(); iframe.setSize(CheckListBox.tableDim); computeInternalFrameLocation(iframe, point); desktop.add(iframe); desktop.clearBackgroundImage(); try { iframe.setSelected(true); } catch (PropertyVetoException e) { LOG.error(e.getMessage(), e); e.printStackTrace(); } iframe.setVisible(true); scroll(iframe); } catch (Exception e) { LOG.error(e.getMessage(), e); Show.error(e); e.printStackTrace(); } dtde.dropComplete(true); } } // verifica daca obiectul mutat cu drag peste desktop pane poate fi acceptat private boolean isDragOk(DropTargetDragEvent dtde) { if (dtde.getCurrentDataFlavors().length == 0) { return false; } if (dtde.getCurrentDataFlavors()[0].equals(DBTableTransferable.DATA_FLAVOR)) { return true; } return false; } // calculeaza punctul in care va aparea fereastra cu coloanele tabelei selectate private void computeInternalFrameLocation(JInternalFrame iframe, Point point) { int fwidth = iframe.getWidth(); int px = point.x; int py = point.y; iframe.setLocation(px - (fwidth / 2), py - 10); } } class SQLViewDropTargetListener extends DropTargetAdapter { public void dragEnter(DropTargetDragEvent dtde) { if (isDragOk(dtde)) { dtde.acceptDrag(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrag(); } } public void dragOver(DropTargetDragEvent dtde) { if (isDragOk(dtde)) { dtde.acceptDrag(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrag(); } } public void drop(DropTargetDropEvent dtde) { if ((dtde.getDropAction() & DnDConstants.ACTION_MOVE) == DnDConstants.ACTION_MOVE) { dtde.acceptDrop(DnDConstants.ACTION_MOVE); Transferable t = dtde.getTransferable(); Point point = dtde.getLocation(); try { DBProcedure proc = (DBProcedure) t.getTransferData(DBProcTransferable.DATA_FLAVOR); List<DBProcedureColumn> columns = Globals.getDBViewer().getProcedureColumns(proc.getSchema(), proc.getCatalog(), proc.getName()); if (!Globals.getDBViewer().isValidProcedure(columns)) { Show.info(I18NSupport.getString("procedure.invalid")); return; } else { StringBuilder sb = new StringBuilder("call "); boolean order = Globals.getDialect().schemaBeforeCatalog(); if (!order) { if (proc.getCatalog() != null) { sb.append(proc.getCatalog()).append("."); } } if (!"%".equals(proc.getSchema())) { sb.append(proc.getSchema()).append("."); } if (order) { if (proc.getCatalog() != null) { sb.append(proc.getCatalog()).append("."); } } sb.append(proc.getName()); sb.append("("); int index = 1; for (int i = 0, size = columns.size(); i < size; i++) { DBProcedureColumn col = columns.get(i); if (ProcUtil.IN.equals(col.getReturnType())) { sb.append("${P").append(index).append("}"); index++; if (i < size - 1) { sb.append(", "); } } else if (ProcUtil.OUT.equals(col.getReturnType())) { if (ProcUtil.REF_CURSOR.equals(col.getDataType())) { sb.append("?"); if (i < size - 1) { sb.append(" , "); } } } } sb.append(")"); sqlView.setQueryString(sb.toString()); } } catch (Exception e) { LOG.error(e.getMessage(), e); e.printStackTrace(); } dtde.dropComplete(true); } } // verifica daca obiectul mutat cu drag peste desktop pane poate fi acceptat private boolean isDragOk(DropTargetDragEvent dtde) { if (dtde.getCurrentDataFlavors().length == 0) { return false; } if (dtde.getCurrentDataFlavors()[0].equals(DBProcTransferable.DATA_FLAVOR)) { return true; } return false; } } class GroupByCheckSubscriber implements Subscriber { public void inform(EventObject ev) { GroupByEvent gbEvent = (GroupByEvent) ev; if (groupBy == gbEvent.isGroupByChecked()) { return; // ignore } groupByButton.setSelected(true); } } public DesignerTablePanel getDesignPanel() { return designPanel; } public List<MyRow> getRows() { return getDesignPanel().getRows(); } public void clear(boolean silent) { if (!silent) { int option = JOptionPane.showConfirmDialog(Globals.getMainFrame(), I18NSupport.getString("querybuilder.clear.message"), I18NSupport.getString("querybuilder.clear"), JOptionPane.YES_NO_OPTION); if (option != JOptionPane.YES_OPTION) { return; } } cleaned = true; groupBy = false; groupByButton.setSelected(false); distinctButton.setSelected(false); desktop.clear(); designPanel.clear(); sqlView.clear(); Globals.setCurrentQueryName(null); Globals.setCurrentQueryAbsolutePath(null); } public List<TablePersistentObject> getTables() { return desktop.getAllTables(); } public boolean queryWasModified(boolean testDesignerSelected) { // if you are in the designer tab we are sure the query is not modified if (testDesignerSelected && designerTabSelected()) { return false; } // User does not entered yet in SQL View tab if (SQLViewPanel.DEFAULT_QUERY.equals(sqlView.getQueryString())) { return false; } return !sqlView.getQueryString().equals(designPanel.getQueryString()); } public String getUserSql() { return sqlView.getQueryString(); } public void setUserSql(String sql) { hasDesigner = false; sqlView.setQueryString(sql); } public void setParameters(List<QueryParameter> parameters) { parametersPanel.set(parameters); } public void addParameter(QueryParameter param) { parametersPanel.addParameter(param); } public void drawDesigner(Report report, Map<String, List<CheckListItem>> itemMap) { hasDesigner = true; desktop.clearBackgroundImage(); final SelectQuery query = report.getQuery(); final List<DBTableInternalFrame> frames = new ArrayList<DBTableInternalFrame>(); // System.out.println("tables=" + report.getTables().size()); for (TablePersistentObject tpo : report.getTables()) { Table table = tpo.getTable(); // refresh letterIndexes with the max value String tableAlias = table.getAlias(); Character key = tableAlias.charAt(0); Integer value = Integer.parseInt(tableAlias.substring(1)); //System.out.println("key="+key + " value="+value); Integer oldValue = letterIndexes.get(key); if ((oldValue == null) || (oldValue < value)) { letterIndexes.put(key, value); } //System.out.println(table); DBTableInternalFrame iframe = new DBTableInternalFrame(desktop, table, itemMap); iframe.setSize(tpo.getDim()); iframe.setLocation(tpo.getPoint()); desktop.add(iframe); frames.add(iframe); iframe.setVisible(true); scroll(iframe); } // select the columns in the order they are in the select List<Column> columns = query.getColumns(); for (Column column : columns) { Table table = column.getTable(); for (DBTableInternalFrame frame : frames) { if (frame.getTable().equals(table)) { frame.selectColumn(column); break; } } } if (query.isDistinct()) { distinctButton.setSelected(true); selectQuery.setDistinct(true); } // List<Column> groupByColumns = query.getGroupByColumns(); // if (groupByColumns.size() > 0) { // groupByMenu.setSelected(true); // } if (query.hasNotNullGroupByColumn()) { groupByButton.setSelected(true); } getDesignPanel().updateRows(report.getRows()); // update match criterias (which have parameters) in the selectquery List<MatchCriteria> mcList = query.getParameterMatchCriterias(); selectQuery.updateParameterMatchCriterias(mcList); List<MatchCriteria> mcOrList = query.getOrParameterMatchCriterias(0); selectQuery.updateOrParameterMatchCriterias(mcOrList, 0); selectQuery.setOrders(report.getQuery().getOrders()); List<JoinCriteria> joins = query.getJoins(); for (JoinCriteria crit : joins) { Column source = crit.getSource(); Column destination = crit.getDestination(); Object[] src = getFramePosition(frames, source); Object[] dest = getFramePosition(frames, destination); JoinLine joinLine = new JoinLine((DBTableInternalFrame) src[0], (Integer) src[1], (DBTableInternalFrame) dest[0], (Integer) dest[1]); joinLine.setJoinCriteria(crit); desktop.addJoinLineWithCriteria(joinLine); desktop.repaint(); } // this is necessary because we can load a report when we are inside SQL View Panel setUserSql(selectQuery.toString()); } public void selectTreeNode(String name, byte type) { if (dbBrowserTree != null) { dbBrowserTree.selectNode(name, type); } } public void selectTreeNode(String name, String path, byte type) { if (dbBrowserTree != null) { dbBrowserTree.selectNode(name, path, type); } } private Object[] getFramePosition(List<DBTableInternalFrame> frames, Column column) { Table table = column.getTable(); Object[] result = new Object[2]; for (DBTableInternalFrame frame : frames) { if (frame.getTable().equals(table)) { result[0] = frame; result[1] = frame.getIndex(column); } } return result; } public void loadReport(ReportLayout reportLayout) { try { reportLayout.initBandsListenerList(); // get parameters definition from system Map<String, QueryParameter> params = new HashMap<String, QueryParameter>(); ParameterManager paramManager = ParameterManager.getInstance(); List<String> paramNames = paramManager.getParameterNames(); for (String paramName : paramNames) { QueryParameter param = paramManager.getParameter(paramName); if (param == null) { throw new Exception("Parameter '" + paramName + "' is not defined."); } params.put(paramName, param); } //reportLayout.setColumnNames(ReportLayoutUtil.getSelectedColumnsForReport(reportLayout)); LayoutHelper.setReportLayout(reportLayout); Globals.getReportLayoutPanel().updateUseSize(); Globals.getReportLayoutPanel().removeEditor(); Globals.getReportDesignerPanel().refresh(); Globals.getReportLayoutPanel().selectConnectedDataSource(); // change workspace WorkspaceManager.getInstance().setCurrentWorkspace(WorkspaceManager.REPORT_WORKSPACE); } catch (Exception e) { Show.error(e); } } public void loadChart(Chart chart) { try { Globals.getChartDesignerPanel().setChart(chart); Globals.getChartDesignerPanel().refresh(); Globals.getChartLayoutPanel().selectConnectedDataSource(); // change workspace WorkspaceManager.getInstance().setCurrentWorkspace(WorkspaceManager.CHART_WORKSPACE); Globals.getChartDesignerPanel().selectProperties(ChartPropertyPanel.MAIN_CATEGORY); } catch (Exception e) { Show.error(e); } } public void emptyReportAndChart() { //Globals.getReportDesignerPanel().clear(); (new OpenQueryPerspectiveAction()).actionPerformed(null); Globals.getMainMenuBar().enableLayoutPerspective(false); Globals.getMainToolBar().enableLayoutPerspective(false); } public void refreshSql() { int index = tabbedPane.getSelectedIndex(); selectSQLViewTab(); tabbedPane.setSelectedIndex(index); } public void selectSQLViewTab() { tabbedPane.setSelectedIndex(1); } public void selectDesignerTab() { tabbedPane.setSelectedIndex(0); } public boolean designerTabSelected() { return (tabbedPane.getSelectedIndex() == 0); } public boolean isCleaned() { boolean result; //System.out.println(">>>>>>>>>>> " + sqlView.getQueryString()); if (sqlView.emptyQueryString()) { result = cleaned; } else { result = false; } // just tables with no selections! if (result) { if (desktop.getAllFrames().length > 0) { result = false; } } return result; } public void newQuery() { emptyReportAndChart(); clear(true); Globals.setCurrentReportName(null); Globals.setCurrentReportAbsolutePath(null); Globals.setCurrentChartName(null); Globals.setCurrentChartAbsolutePath(null); ParameterManager.getInstance().clearParameters(); I18nManager.getInstance().clear(); parametersPanel.set(new ArrayList<QueryParameter>()); selectDesignerTab(); } @SuppressWarnings("unchecked") public Report createReport(String name) { Report report = new Report(); report.setName(name); report.setVersion(ReleaseInfoAdapter.getVersionNumber()); if (queryWasModified(true)) { report.setSql(getUserSql()); } else { report.setQuery(getSelectQuery()); report.setTables(getTables()); report.setRows(getRows()); } LinkedList<QueryParameter> parameters = (LinkedList) ParameterManager.getInstance().getParameters(); // Saved the parameters in the order inside sql! // LinkedList<QueryParameter> parameters = new LinkedList(); // ParameterManager manager = ParameterManager.getInstance(); // String[] paramNames = (new Query(getUserSql())).getParameterNames(); // for (String pname : paramNames) { // QueryParameter qp = manager.getParameter(pname); // if (!parameters.contains(qp)) { // parameters.add(qp); // } // } report.setParameters(parameters); return report; } public QueryResult runQuery(ParametersBean pBean, boolean useMaxRows) throws Exception { return runQuery(Globals.getConnection(), pBean, useMaxRows); } public QueryResult runQuery(Connection con, ParametersBean pBean, boolean useMaxRows) throws Exception { return sqlView.runQuery(con, pBean, useMaxRows); } public ParametersBean selectParameters(Report report, DataSource runDS) { return sqlView.selectParameters(report, runDS); } public DBTableInternalFrame addTableToDesktop(String schema, String tableName, Dimension dim, Point location) { String tableAlias = tableName.substring(0, 1) + getIndexForLetter(tableName.charAt(0)); tableNamesMap.put(tableAlias, tableName); Table table = new Table(tableName, tableAlias); table.setSchemaName(schema); try { table.setDialect(DialectUtil.getDialect(Globals.getConnection())); } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. LOG.error(e.getMessage(), e); } Map<String, List<CheckListItem>> itemMap = null; //@todo error try { itemMap = TableUtil.getItemMap(table); } catch (Exception e) { LOG.error(e.getMessage(), e); e.printStackTrace(); } DBTableInternalFrame iframe = new DBTableInternalFrame(desktop, table, itemMap); itemMap.clear(); iframe.setSize(dim); iframe.setLocation(location); desktop.add(iframe); iframe.setVisible(true); return iframe; } public void addJoin(DBTableInternalFrame source, int sourceIndex, DBTableInternalFrame dest, int destIndex) { // System.out.println("sIndex=" + sourceIndex); // System.out.println("destIndex=" + destIndex); source.selectRow(sourceIndex); dest.selectRow(destIndex); JoinLine joinLine = new JoinLine(source, sourceIndex, dest, destIndex); desktop.addJoinLine(joinLine); scroll(dest); } // When a new frame appears in desktop we must scroll to see the full panel public void scroll(DBTableInternalFrame iframe) { int padding = 5; Rectangle r = new Rectangle(iframe.getX(), iframe.getY(), iframe.getWidth() + padding, iframe.getHeight() + padding); int x = Math.max(iframe.getX() + iframe.getWidth() + padding, desktop.getWidth()); int y = Math.max(iframe.getY() + iframe.getHeight() + padding, desktop.getHeight()); Dimension dim = new Dimension(x, y); desktop.setPreferredSize(dim); desktop.scrollRectToVisible(r); desktop.revalidate(); } public DBBrowserTree getTree() { return dbBrowserTree; } public boolean hasDesigner() { return hasDesigner; } class MnemonicTabAction implements ActionListener { int index; public MnemonicTabAction(int index) { this.index = index; } public void actionPerformed(ActionEvent e) { tabbedPane.setSelectedIndex(index); tabbedPane.requestFocus(); } } public void setTabMnemonicAt(int index, int keyCode) { ActionListener action = new MnemonicTabAction(index); KeyStroke stroke = KeyStroke.getKeyStroke(keyCode, ActionEvent.ALT_MASK); tabbedPane.registerKeyboardAction(action, stroke, JTabbedPane.WHEN_IN_FOCUSED_WINDOW); } public void enableMaxCheck() { sqlView.enableMaxCheck(); } }