package org.openswing.swing.client;
import java.beans.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import org.openswing.swing.form.client.*;
import org.openswing.swing.logger.client.*;
import org.openswing.swing.table.client.*;
import org.openswing.swing.table.columns.client.*;
import org.openswing.swing.table.filter.client.*;
import org.openswing.swing.table.java.*;
import org.openswing.swing.table.model.client.*;
import org.openswing.swing.table.profiles.java.*;
import org.openswing.swing.util.client.*;
import org.openswing.swing.util.java.*;
import org.openswing.swing.export.java.GridExportOptions;
import org.openswing.swing.table.permissions.java.GridPermissions;
import org.openswing.swing.table.client.OrderPolicy;
import org.openswing.swing.message.receive.java.ValueObject;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Grid based on VOListTableModel.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class GridControl extends JPanel {
/** grid contained in this panel; it will be created only on run-time */
private Grids table = null;
/** top grid contained in this panel (optional); it will be created only on run-time */
private Grids topTable = null;
/** bottom grid contained in this panel (optional); it will be created only on run-time */
private Grids bottomTable = null;
/** columns container; used only in design-time */
private ColumnContainer itsColumnContainer = new ColumnContainer();
/** scrollpane used to contain the columns container; used only in design-time */
private JScrollPane designScrollPane = new JScrollPane();
/** layout used by the columns container */
private FlowLayout flowLayout1 = new FlowLayout();
/** layout used by the scrollpane */
private BorderLayout borderLayout1 = new BorderLayout(0,0);
/** value object class name (all rows of the grid will have a value object of this type) */
private String valueObjectClassName = null;
/** flag used to specify if column reordering is allowed */
private boolean reorderingAllowed = true;
/** flag used to specify if column resizing is allowed */
private boolean resizingAllowed = true;
/** current grid mode; default value: READONLY */
private int mode = Consts.READONLY;
/** grid container */
private GridController controller = new GridController();
/* status panel */
private GridStatusPanel labelPanel = new GridStatusPanel();
/** panel used to contain the grid and the status panel */
private JPanel gridStatusPanel = new JPanel();
/** layout used by panel used to contain the grid and the status panel */
private BorderLayout borderLayout2 = new BorderLayout(0,0);
/** flag used to specify if the status panel is visible; default value: "true" */
private boolean visibleStatusPanel = true;
/** grid selection mode; default value: SINGLE_SELECTION */
private int selectionMode = ListSelectionModel.SINGLE_SELECTION;
/** insert button */
private InsertButton insertButton = null;
/** export button */
private ExportButton exportButton = null;
/** import button */
private ImportButton importButton = null;
/** filter/sort button */
private FilterButton filterButton = null;
/** copy button */
private CopyButton copyButton = null;
/** edit button */
private EditButton editButton = null;
/** reload/cancel button */
private ReloadButton reloadButton = null;
/** delete button */
private DeleteButton deleteButton = null;
/** save button */
private SaveButton saveButton = null;
/** flag used to specify if data loading will be automatically performed when the grid is set to visible; default value: "true". */
private boolean autoLoadData = true;
/** identifier (functionId) associated to the container */
private String functionId = null;
/** other grid parameters */
private Map otherGridParams = new HashMap();
/** grid data locator; can be set to "ClientGridDataLocator" or to "ServerGridDataLocator" */
private GridDataLocator gridDataLocator = null;
/** navigation bar (optional) */
private NavigatorBar navBar = null;
/** maximum number of sorted columns */
private int maxSortedColumns = 1;
/** number of locked columns, i.e. columns anchored to the left side of the grid; default value: 0 */
private int lockedColumns = 0;
/** define where to anchor locked columns: to the left or to the right of the grid; default value: <code>true</code> i.e. to the left */
private boolean anchorLockedColumnsToLeft = true;
/** grid identifier (optional); used in drag 'n drop events */
private String gridId = null;
/** cache used to temporally store buttons disabilitation policies (until Gris is set to visibile) */
private ArrayList buttonsNotEnabled = new ArrayList();
/** generic buttons */
private ArrayList genericButtons = new ArrayList();
/** maximum number of rows to insert by pressing "down" key; default value: 1 */
private int maxNumberOfRowsOnInsert = 1;
/** list of columns added to grid */
private ArrayList components = new ArrayList();
/** row height of the grid control; default value: ClientSettings.CELL_HEIGHT */
private int rowHeight = ClientSettings.CELL_HEIGHT;
/** flag used to define if row height can change for each row, according to image height included in a cell of grid; default value: <code>true</code> */
private boolean rowHeightFixed = true;
/** flag used to define if grid sorting operation must always invoke loadData method to retrieve a new list of v.o. or the grid must sort the current v.o. list without invoking loadData (only with the whole result set loaded); default value: <code>true</code> */
private boolean orderWithLoadData = true;
/** interface that must be implemented in order to sort columns */
private OrderPolicy orderPolicy = new OrderPolicy();
/** <code>true</code> to automatically show a filter panel when moving mouse at right of the grid; <code>false</code> to do not show it */
private boolean showFilterPanelOnGrid = ClientSettings.FILTER_PANEL_ON_GRID;
/** this property is used only when "showFilterPanelOnGrid" is set to <code>true</code>; define filter panel policy for hiding it; allowed values: Consts.FILTER_PANEL_ON_GRID_xxx; default value: ClientSettings.FILTER_PANEL_ON_GRID_POLICY */
private int filterPanelOnGridPolicy = ClientSettings.FILTER_PANEL_ON_GRID_POLICY;
/** split pane used to split grid component from filter panel (optional) */
private JSplitPane split = new JSplitPane();
/** filter panel to show at the right of the grid (optional) */
private FilterPanel filterPanel = null;
/** number of rows locked (anchored) on the bottom of the grid; default value: 0 */
private int lockedRowsOnBottom = 0;
/** number of rows locked (anchored) on the top of the grid; default value: 0 */
private int lockedRowsOnTop = 0;
/** top grid controller (optional) */
private GridController topGridController = new GridController();
/** bottom grid controller (optional) */
private GridController bottomGridController = new GridController();
/** top grid data locator (optional) */
private GridDataLocator topGridDataLocator = null;
/** bottom grid data locator (optional) */
private GridDataLocator bottomGridDataLocator = null;
/** container of all grids (top, std and bottom (locked and non) */
private JPanel tmpPanel = new JPanel();
/** default value that could be set in the quick filter criteria; default value: ClientSettings.DEFAULT_QUICK_FILTER_CRITERIA; values allowed: Consts.EQUALS,Consts.CONTAINS,Consts.STARTS_WITH,Consts.ENDS_WITH */
private int defaultQuickFilterCriteria = ClientSettings.DEFAULT_QUICK_FILTER_CRITERIA;
/** intercell spacing; default value = ClientSettings.INTERCELL_SPACING */
private Dimension spacing = ClientSettings.INTERCELL_SPACING;
/** row margin; default value = ClientSettings.ROW_MARGIN */
private int rowMargin = ClientSettings.ROW_MARGIN;
/** flag used to define if an inner v.o. must be automatically instantiated when a setter method is invoked; default value: <code>true</code> */
private boolean createInnerVO = true;
/** list of objects {int[],int[]} used to merge cells */
private ArrayList mergedCells = new ArrayList();
/** flag used to define if background and foreground colors must be setted according to GridController definition only in READONLY mode; default value: <code>true</code> */
private boolean colorsInReadOnlyMode = true;
/** list of ActionListener objetcs related to the event "loading data completed" */
private ArrayList loadDataCompletedListeners = new ArrayList();
/** list of custom commands added to the popup menu accessed by right mouse click on grid */
private ArrayList popupCommands = new ArrayList();
/** current grid profile */
private GridProfile profile = null;
/** default grid profile */
private GridProfile defaultProfile = null;
/** grid permissions */
private GridPermissions permissions = null;
/** profile management menu */
private JMenu profileMenu = new JMenu(ClientSettings.getInstance().getResources().getResource("grid profile management"));
/** profile list menu */
private JMenu profilesMenu = new JMenu(ClientSettings.getInstance().getResources().getResource("select grid profile"));
/** flag used to anchor the last column on the right margin of the grid, only when all columns width is lesser than grid width */
private boolean anchorLastColumn = false;
/** column index declared as expandable, i.e. user can click on it to expand cell to show an inner component; default value: 0 (first column) */
private int expandableColumn = 0;
/** define whether expanded rows in the past must be collapsed when expanding the current one; used only when "overwriteRowWhenExpanding" property is not null; default value: <code>false</code> */
private boolean singleExpandableRow = false;
/** define whether the row to show, when expanding the current one, must be showed over the current one on in a new row below it; used only when "overwriteRowWhenExpanding" property is not null; default value: <code>false</code> i.e. do not overwrite it*/
private boolean overwriteRowWhenExpanding = false;
/** define the controller that manages row expansion */
private ExpandableRowController expandableRowController = null;
/** parent frame: JFrame or JInternalFrame */
private JInternalFrame parentFrame = null;
/** column properties */
private Column[] columnProperties = null;
/** flag used to define if a warning message must be showed when reloading data in grid and grid is in EDIT/INSERT mode; default value: <code>true</code> */
private boolean showWarnMessageBeforeReloading = true;
/** flag used to allow insert row (using DOWN key) in edit mode too; default value: <code>false</code> */
private boolean allowInsertInEdit = false;
/** define where new rows must be added: <code>true</code> at the top of the grid or <code>false</code> at the bottom; default value: <code>ClientSettings.INSERT_ROWS_ON_TOP</code> */
private boolean insertRowsOnTop = ClientSettings.INSERT_ROWS_ON_TOP;
/** header height; default value: <code>ClientSettings.HEADER_HEIGHT</code> */
private int headerHeight = ClientSettings.HEADER_HEIGHT;
/** flag used to force the editing of one row only: the current selected row; default value: <code>false</code>, i.e. all rows are editable */
private boolean editOnSingleRow = false;
/** list of objects {int[],int[]} used to merge cells in top table */
private ArrayList topTableMergedCells = new ArrayList();
/** list of objects {int[],int[]} used to merge cells in bottom table */
private ArrayList bottomTableMergedCells = new ArrayList();
/** combo-box filters to apply to column headers */
private HashMap listFilters = new HashMap();
/** flag used to show current page number in grid; default value: ClientSettings.SHOW_PAGE_NUMBER_IN_GRID */
public boolean showPageNumber = ClientSettings.SHOW_PAGE_NUMBER_IN_GRID;
/** flag used in grid to enable the retrieval of additional rows in fast search, when search criteria fails; default value: ClientSettings.SEARCH_ADDITION_ROWS */
public boolean searchAdditionalRows = ClientSettings.SEARCH_ADDITIONAL_ROWS;
/** flag used to allow the columns sorting in edit mode too; default value: <code>false</code>; note that this setting is used only when <code>orderWithLoadData</code> property is set to <code>false</code> */
private boolean allowColumnsSortingInEdit = false;
/** flag used to allow the columns permission; default value: <code>true</code> */
private boolean allowColumnsPermission = true;
/** flag used to allow the columns profile; default value: <code>true</code> */
private boolean allowColumnsProfile = true;
/** criteria to use with findNextValue method: search for values exactly uquals to the one specified as argument in findNextValue method */
public static int FIND_CRITERIA_EQUALS = 0;
/** criteria to use with findNextValue method: search for values uqualsIgnoreCase to the one specified as argument in findNextValue method */
public static int FIND_CRITERIA_EQUALS_IGNORE_CASE = 1;
/** criteria to use with findNextValue method: search for values that starts with the one specified as argument in findNextValue method */
public static int FIND_CRITERIA_STARTS_WITH = 2;
/** criteria to use with findNextValue method: search for values (case insensitive) that starts with the one specified as argument in findNextValue method */
public static int FIND_CRITERIA_STARTS_WITH_IGNORE_CASE = 3;
/** criteria to use with findNextValue method: search for values that contains (as for value like '%value%') the one specified as argument in findNextValue method */
public static int FIND_CRITERIA_CONTAINS = 4;
/** criteria to use with findNextValue method: search for values that contains (case insensitive, as for VALUE like '%VALUE%') the one specified as argument in findNextValue method */
public static int FIND_CRITERIA_CONTAINS_IGNORE_CASE = 5;
/**
* Costructor.
*/
public GridControl() {
super();
try {
jbInit();
setVisibleStatusPanel(true);
}
catch(Exception e) {
e.printStackTrace();
}
}
protected final void jbInit() throws Exception {
gridStatusPanel.setLayout(borderLayout2);
gridStatusPanel.add(designScrollPane,BorderLayout.CENTER);
this.setLayout(borderLayout1);
super.add(gridStatusPanel,BorderLayout.CENTER);
designScrollPane.getViewport().add(itsColumnContainer);
flowLayout1.setAlignment(FlowLayout.LEFT);
flowLayout1.setHgap(0);
flowLayout1.setVgap(0);
itsColumnContainer.setLayout(flowLayout1);
try {
labelPanel.setPreferredSize(new Dimension(this.getPreferredSize().width,22));
}
catch (Exception ex) {
}
}
/**
* Method called when the this panel is set to visible: it calls commitColumnContainer method.
*/
public final void addNotify() {
super.addNotify();
commitColumnContainer();
}
/**
* This method is called by addNotify method when this panel is set to visible:
* it will create the grid and add it to this panel.
* It must not be manually invoked!
*/
public final void commitColumnContainer() {
try {
long time = System.currentTimeMillis();
if (Beans.isDesignTime())
return;
// the method terminates after the first execution...
if (itsColumnContainer == null)
return;
gridStatusPanel.remove(designScrollPane);
Component[] c = (Component[]) components.toArray(new Component[components.size()]);
columnProperties = new Column[c.length];
for (int i = 0; i < c.length; i++) {
if (!(c[i] instanceof Column)) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "You are not allowed to add a '"+c.getClass().getName()+"' class to grid control: only Column type components are accepted.", null);
return;
}
columnProperties[i] = (Column) c[i];
if (columnProperties[i].getListFilter()!=null)
listFilters.put(columnProperties[i].getColumnName(),columnProperties[i].getListFilter());
}
table = new Grids(
this,
lockedColumns,
anchorLockedColumnsToLeft,
valueObjectClassName,
columnProperties,
controller,
labelPanel,
gridDataLocator,
otherGridParams,
colorsInReadOnlyMode,
popupCommands,
anchorLastColumn,
expandableColumn,
singleExpandableRow,
overwriteRowWhenExpanding,
expandableRowController,
listFilters,
headerHeight,
searchAdditionalRows,
allowColumnsSortingInEdit,
Grid.MAIN_GRID
);
table.setEditOnSingleRow(editOnSingleRow);
for (int i = 0; i < columnProperties.length; i++) {
columnProperties[i].setTable(table);
if (columnProperties[i].getDefaultFilterValues()!=null)
table.getQuickFilterValues().put(
columnProperties[i].getColumnName(),
columnProperties[i].getDefaultFilterValues()
);
}
// apply grid permissions, if defined...
if (ClientSettings.getInstance().GRID_PERMISSION_MANAGER!=null &&
functionId!=null &&
!functionId.trim().equals("") &&
allowColumnsPermission) {
try {
String[] columnsAttribute = new String[columnProperties.length];
String[] headerColumnsName = new String[columnProperties.length];
boolean[] columnsVisibility = new boolean[columnProperties.length];
boolean[] columnsEditableInIns = new boolean[columnProperties.length];
boolean[] columnsEditableInEdit = new boolean[columnProperties.length];
boolean[] columnsMandatory = new boolean[columnProperties.length];
for(int i=0;i<columnProperties.length;i++) {
columnsAttribute[i] = columnProperties[i].getColumnName();
headerColumnsName[i] = columnProperties[i].getHeaderColumnName();
columnsVisibility[i] = columnProperties[i].isColumnVisible();
columnsEditableInIns[i] = columnProperties[i].isEditableOnInsert();
columnsEditableInEdit[i] = columnProperties[i].isEditableOnEdit();
columnsMandatory[i] = columnProperties[i].isColumnRequired();
}
// compare current and last digests...
String lastDigest = (String)ClientSettings.getInstance().getLastGridPermissionsDigests().get(functionId);
if (lastDigest==null) {
lastDigest = ClientSettings.getInstance().GRID_PERMISSION_MANAGER.getLastGridDigest(functionId);
if (lastDigest!=null)
ClientSettings.getInstance().getLastGridPermissionsDigests().put(functionId,lastDigest);
}
String currentDigest = ClientSettings.getInstance().GRID_PERMISSION_MANAGER.getCurrentGridDigest(columnsAttribute,functionId);
if (!currentDigest.equals(lastDigest)) {
// restore grid digest, remove all grid permissions and create grid permissions defaults...
ClientSettings.getInstance().GRID_PERMISSION_MANAGER.storeGridDigest(functionId,currentDigest);
ClientSettings.getInstance().GRID_PERMISSION_MANAGER.deleteAllGridPermissionsPerFunctionId(functionId);
ClientSettings.getInstance().GRID_PERMISSION_MANAGER.storeGridPermissionsDefaults(
functionId,columnsAttribute,headerColumnsName,columnsVisibility,columnsEditableInIns,columnsEditableInEdit,columnsMandatory
);
ClientSettings.getInstance().getLastGridPermissionsDigests().put(functionId,currentDigest);
ClientSettings.getInstance().getGridPermissions().remove(functionId);
}
applyGridPermissions(columnsAttribute,columnsVisibility,columnsEditableInIns,columnsEditableInEdit,columnsMandatory);
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "Error while fetching grid permissions:\n"+ex.getMessage(),ex);
}
}
if (ClientSettings.getInstance().GRID_PROFILE_MANAGER!=null &&
functionId!=null &&
!functionId.trim().equals("") &&
allowColumnsProfile) {
try {
// compare current and last digests...
String lastDigest = (String)ClientSettings.getInstance().getLastUserGridDigests().get(functionId);
if (lastDigest==null) {
lastDigest = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getLastGridDigest(functionId);
if (lastDigest!=null)
ClientSettings.getInstance().getLastUserGridDigests().put(functionId,lastDigest);
}
String[] columnNames = new String[columnProperties.length];
for(int i=0;i<columnProperties.length;i++)
columnNames[i] = columnProperties[i].getColumnName();
String currentDigest = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getCurrentGridDigest(columnNames,functionId);
if (!currentDigest.equals(lastDigest)) {
// restore grid digest and remove all grid profiles...
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridDigest(functionId,currentDigest);
ClientSettings.getInstance().GRID_PROFILE_MANAGER.deleteAllGridProfiles(functionId);
ClientSettings.getInstance().GRID_PROFILE_MANAGER.deleteAllGridProfileIds(functionId);
ClientSettings.getInstance().getLastUserGridDigests().put(functionId,currentDigest);
ClientSettings.getInstance().getLastUserGridProfileIds().remove(functionId);
ClientSettings.getInstance().getUserGridProfiles().remove(functionId);
ClientSettings.getInstance().getGridProfileDescriptions().remove(functionId);
}
addPopupCommand(profileMenu);
// define default profile...
setDefaultProfile(columnProperties);
Object id = ClientSettings.getInstance().getLastUserGridProfileIds().get(functionId);
if (id==null) {
id = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getLastGridProfileId(functionId);
if (id!=null)
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId,id);
}
if (id!=null) {
// retrieve a previously stored profile...
try {
profile = (GridProfile)ClientSettings.getInstance().getUserGridProfiles(functionId).get(id);
if (profile==null) {
profile = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getUserProfile(functionId, id);
if (profile!=null) {
ClientSettings.getInstance().getUserGridProfiles(functionId).put(id,profile);
// ClientSettings.getInstance().getGridProfileDescriptions(functionId).add(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
}
}
}
catch (IOException ex1) {
Logger.error(this.getClass().getName(), "commitColumnContainer", ex1.getMessage()+": "+id,ex1);
profile = (GridProfile)defaultProfile.clone();
id = ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeUserProfile(profile);
profile.setId(id);
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridProfileId(functionId, profile.getId());
if (profile!=null) {
ClientSettings.getInstance().getUserGridProfiles(functionId).put(profile.getId(),profile);
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId,profile.getId());
// ClientSettings.getInstance().getGridProfileDescriptions(functionId).add(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
}
}
}
else {
// create a new profile...
profile = (GridProfile)defaultProfile.clone();
id = ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeUserProfile(profile);
profile.setId(id);
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridProfileId(functionId, profile.getId());
if (profile!=null) {
ClientSettings.getInstance().getUserGridProfiles(functionId).put(profile.getId(),profile);
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId,profile.getId());
ClientSettings.getInstance().getGridProfileDescriptions(functionId).add(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
}
}
JMenuItem restoreMenu = new JMenuItem(ClientSettings.getInstance().getResources().getResource("restore default grid profile"));
restoreMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
for(int i=0;i<profilesMenu.getMenuComponentCount();i++)
((JCheckBoxMenuItem)profilesMenu.getMenuComponent(i)).setSelected(false);
// remove previous default profile from the storage media...
profile = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getDefaultProfile(functionId);
if (profile!=null) {
ClientSettings.getInstance().GRID_PROFILE_MANAGER.deleteUserProfile(functionId,profile.getId());
ClientSettings.getInstance().getUserGridProfiles(functionId).remove(profile.getId());
// ClientSettings.getInstance().getGridProfileDescriptions(functionId).remove(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
}
profile = (GridProfile)defaultProfile.clone();
Object id = ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeUserProfile(profile);
profile.setId(id);
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridProfileId(functionId, profile.getId());
applyProfile(columnProperties, profile, true);
if (profile!=null) {
ClientSettings.getInstance().getUserGridProfiles(functionId).put(profile.getId(),profile);
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId,profile.getId());
// ClientSettings.getInstance().getGridProfileDescriptions(functionId).add(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
}
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "Error while storing grid profile: "+ex.getMessage(),ex);
return;
}
}
});
profileMenu.add(restoreMenu);
JMenuItem newMenu = new JMenuItem(ClientSettings.getInstance().getResources().getResource("create new grid profile"));
newMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String desc = OptionPane.showInputDialog(
GridControl.this,
"profile description",
"create new grid profile",
JOptionPane.QUESTION_MESSAGE
);
if (desc==null)
return;
GridProfile profile = (GridProfile)defaultProfile.clone();
profile.setId(null);
profile.setDefaultProfile(false);
profile.setDescription(desc);
try {
Object id = ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeUserProfile(profile);
profile.setId(id);
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridProfileId(functionId, profile.getId());
applyProfile(columnProperties, profile, true);
ClientSettings.getInstance().getUserGridProfiles(functionId).put(profile.getId(),profile);
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId,profile.getId());
ClientSettings.getInstance().getGridProfileDescriptions(functionId).add(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "Error while storing grid profile: "+ex.getMessage(),ex);
return;
}
final Object id = profile.getId();
for(int i=0;i<profilesMenu.getMenuComponentCount();i++)
((JCheckBoxMenuItem)profilesMenu.getMenuComponent(i)).setSelected(false);
final JCheckBoxMenuItem item = new JCheckBoxMenuItem(profile.getDescription(),true);
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
for(int i=0;i<profilesMenu.getMenuComponentCount();i++)
((JCheckBoxMenuItem)profilesMenu.getMenuComponent(i)).setSelected(false);
item.setSelected(true);
maybeStoreProfile(columnProperties);
GridControl.this.profile = (GridProfile)ClientSettings.getInstance().getUserGridProfiles(functionId).get(id);
if (GridControl.this.profile==null) {
GridControl.this.profile = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getUserProfile(functionId,id);
if (GridControl.this.profile!=null) {
ClientSettings.getInstance().getUserGridProfiles(functionId).put(id,GridControl.this.profile);
}
}
applyProfile(columnProperties,GridControl.this.profile,true);
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId, GridControl.this.profile.getId());
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "Error while fetching grid profile: "+ex.getMessage(),ex);
}
}
});
if (profilesMenu.getComponentCount()==0) {
profileMenu.add(profilesMenu);
profileMenu.revalidate();
}
profilesMenu.add(item);
}
});
profileMenu.add(newMenu);
JMenuItem removeMenu = new JMenuItem(ClientSettings.getInstance().getResources().getResource("remove current grid profile"));
removeMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
if (profile.getId().equals(defaultProfile.getId())) // this test should be unuseful...
return;
for(int i=0;i<profilesMenu.getMenuComponentCount();i++)
((JCheckBoxMenuItem)profilesMenu.getMenuComponent(i)).setSelected(false);
String descriptionToRemove = profile.getDescription();
ClientSettings.getInstance().GRID_PROFILE_MANAGER.deleteUserProfile(functionId,profile.getId());
ClientSettings.getInstance().getUserGridProfiles(functionId).remove(profile.getId());
ClientSettings.getInstance().getGridProfileDescriptions(functionId).remove(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
profile = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getDefaultProfile(functionId);
if (profile==null) {
profile = (GridProfile)defaultProfile.clone();
Object id = ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeUserProfile(profile);
profile.setId(id);
ClientSettings.getInstance().getUserGridProfiles(functionId).put(profile.getId(),profile);
ClientSettings.getInstance().getGridProfileDescriptions(functionId).add(new GridProfileDescription(profile.getId(),profile.getDescription(),profile.isDefaultProfile()));
}
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridProfileId(functionId,profile.getId());
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId,profile.getId());
applyProfile(columnProperties,profile,true);
for(int i=0;i<profilesMenu.getMenuComponentCount();i++)
if (((JMenuItem)profilesMenu.getMenuComponent(i)).getText().equals(descriptionToRemove)) {
profilesMenu.remove(i);
profilesMenu.revalidate();
if (profileMenu.getComponentCount()==0)
profileMenu.getParent().remove(profileMenu);
break;
}
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "Error while removing grid profile: "+ex.getMessage(),ex);
}
}
});
profileMenu.add(removeMenu);
profileMenu.addSeparator();
try {
ArrayList list = ClientSettings.getInstance().getGridProfileDescriptions(functionId);
if (list.size()==0) {
list = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getUserProfiles(functionId);
ClientSettings.getInstance().getGridProfileDescriptions(functionId).addAll(list);
}
// Arrays.sort(list,new Comparator() {
//
// public boolean equals(Object obj) {
// return obj.equals(this);
// }
//
// public int compare(Object o1, Object o2) {
// GridProfileDescription p1 = (GridProfileDescription)o1;
// GridProfileDescription p2 = (GridProfileDescription)o2;
// return p1.getDescription().compareTo(p2.getDescription());
// }
//
// });
for(int i=0;i<list.size();i++) {
final GridProfileDescription desc = (GridProfileDescription)list.get(i);
if (((GridProfileDescription)list.get(i)).isDefaultProfile())
continue;
final JCheckBoxMenuItem item = new JCheckBoxMenuItem(desc.getDescription());
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int i=0;i<profilesMenu.getMenuComponentCount();i++)
((JCheckBoxMenuItem)profilesMenu.getMenuComponent(i)).setSelected(false);
item.setSelected(true);
Object id = desc.getId();
try {
maybeStoreProfile(columnProperties);
profile = (GridProfile)ClientSettings.getInstance().getUserGridProfiles(functionId).get(id);
if (profile==null) {
profile = ClientSettings.getInstance().GRID_PROFILE_MANAGER.getUserProfile(functionId,id);
ClientSettings.getInstance().getUserGridProfiles(functionId).put(id,profile);
}
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridProfileId(functionId,id);
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId,id);
applyProfile(columnProperties,profile,true);
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "Error while fetching grid profile: "+ex.getMessage(),ex);
}
}
});
if (profile.getId().equals(desc.getId()))
item.setSelected(true);
profilesMenu.add(item);
}
if (profilesMenu.getMenuComponentCount()>0)
profileMenu.add(profilesMenu);
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "commitColumnContainer", "Error while fetching grid profiles: "+ex.getMessage(),ex);
}
// add a "dispose grid" listener...
this.addAncestorListener(new AncestorListener() {
public void ancestorAdded(AncestorEvent event) {
}
public void ancestorMoved(AncestorEvent event) {
}
public void ancestorRemoved(AncestorEvent event) {
maybeStoreProfile(columnProperties);
}
});
}
catch (Throwable ex) {
ex.printStackTrace();
profile = null;
}
} // end if on GRID_PROFILE_MANAGER usage
else if ( ClientSettings.getInstance().GRID_PROFILE_MANAGER!=null &&
functionId!=null &&
!functionId.trim().equals("") &&
allowColumnsProfile)
Logger.warn(this.getClass().getName(), "commitColumnContainer", "Grid profile not enabled because no 'functionId' property setted on GridControl");
table.setReorderingAllowed(reorderingAllowed);
table.setSelectionMode(selectionMode);
table.setMaxSortedColumns(maxSortedColumns);
if (insertButton != null)
table.setInsertButton(insertButton);
if (exportButton != null)
table.setExportButton(exportButton);
if (importButton != null)
table.setImportButton(importButton);
if (filterButton != null)
table.setFilterButton(filterButton);
if (copyButton != null)
table.setCopyButton(copyButton);
if (editButton != null)
table.setEditButton(editButton);
if (reloadButton != null)
table.setReloadButton(reloadButton);
if (deleteButton != null)
table.setDeleteButton(deleteButton);
if (saveButton != null)
table.setSaveButton(saveButton);
if (navBar != null)
table.setNavBar(navBar);
GenericButton button = null;
for (int i = 0; i < genericButtons.size(); i++) {
button = (GenericButton) genericButtons.get(i);
table.getGenericButtons().add(button);
button.addDataController(this.table);
}
table.setFunctionId(functionId);
// add buttons disabilitation policies...
Object[] policy = null;
for (int i = 0; i < buttonsNotEnabled.size(); i++) {
policy = (Object[]) buttonsNotEnabled.get(i);
table.addButtonsNotEnabled( (HashSet) policy[0],
(GenericButtonController) policy[1]);
}
if (gridId != null)
table.enableDrag(gridId);
if (spacing != null)
table.setIntercellSpacing(spacing);
if (rowMargin != -1)
table.setRowMargin(rowMargin);
// add top grid (optionally)...
if (lockedRowsOnTop>0) {
topTable = new Grids(
this,
lockedColumns,
anchorLockedColumnsToLeft,
valueObjectClassName,
columnProperties,
topGridController,
labelPanel,
topGridDataLocator,
otherGridParams,
colorsInReadOnlyMode,
new ArrayList(),
anchorLastColumn,
0,
false,
false,
null,
listFilters,
headerHeight,
searchAdditionalRows,
allowColumnsSortingInEdit,
Grid.TOP_GRID
);
topTable.setEditOnSingleRow(editOnSingleRow);
topTable.setReorderingAllowed(reorderingAllowed);
topTable.setResizingAllowed(resizingAllowed);
topTable.setSelectionMode(selectionMode);
topTable.setMaxSortedColumns(maxSortedColumns);
// table.setFunctionId(functionId);
topTable.getVOListTableModel().setMode(Consts.READONLY);
topTable.getGrid().addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (parentFrame==null) {
parentFrame = ClientUtils.getParentInternalFrame(GridControl.this);
}
if (parentFrame!=null && !parentFrame.isSelected()) {
if (parentFrame.getDesktopPane().getSelectedFrame()!=null)
parentFrame.getDesktopPane().getSelectedFrame().requestFocus();
return;
}
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_FOCUS_BORDER,1));
dropFocusFromAllForms();
}
public void focusLost(FocusEvent e) {
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_NO_FOCUS_BORDER,1));
}
});
if (lockedColumns>0)
topTable.getLockedGrid().addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (parentFrame==null) {
parentFrame = ClientUtils.getParentInternalFrame(GridControl.this);
}
if (parentFrame!=null && !parentFrame.isSelected()) {
if (parentFrame.getDesktopPane().getSelectedFrame()!=null)
parentFrame.getDesktopPane().getSelectedFrame().requestFocus();
return;
}
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_FOCUS_BORDER,1));
dropFocusFromAllForms();
}
public void focusLost(FocusEvent e) {
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_NO_FOCUS_BORDER,1));
}
});
if (spacing!=null)
topTable.setIntercellSpacing(spacing);
if (rowMargin!=-1)
topTable.setRowMargin(rowMargin);
} // end top grid...
// add bottom grid (optionally)...
if (lockedRowsOnBottom>0) {
bottomTable = new Grids(
this,
lockedColumns,
anchorLockedColumnsToLeft,
valueObjectClassName,
columnProperties,
bottomGridController,
labelPanel,
bottomGridDataLocator,
otherGridParams,
colorsInReadOnlyMode,
new ArrayList(),
anchorLastColumn,
0,
false,
false,
null,
new HashMap(),
headerHeight,
searchAdditionalRows,
allowColumnsSortingInEdit,
Grid.BOTTOM_GRID
);
bottomTable.setEditOnSingleRow(editOnSingleRow);
bottomTable.setReorderingAllowed(reorderingAllowed);
bottomTable.setResizingAllowed(resizingAllowed);
bottomTable.setSelectionMode(selectionMode);
bottomTable.setMaxSortedColumns(maxSortedColumns);
// table.setFunctionId(functionId);
bottomTable.getVOListTableModel().setMode(Consts.READONLY);
bottomTable.getGrid().addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (parentFrame==null) {
parentFrame = ClientUtils.getParentInternalFrame(GridControl.this);
}
if (parentFrame!=null && !parentFrame.isSelected()) {
if (parentFrame.getDesktopPane().getSelectedFrame()!=null)
parentFrame.getDesktopPane().getSelectedFrame().requestFocus();
return;
}
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_FOCUS_BORDER,1));
dropFocusFromAllForms();
}
public void focusLost(FocusEvent e) {
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_NO_FOCUS_BORDER,1));
}
});
if (lockedColumns>0)
bottomTable.getLockedGrid().addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (parentFrame==null) {
parentFrame = ClientUtils.getParentInternalFrame(GridControl.this);
}
if (parentFrame!=null && !parentFrame.isSelected()) {
if (parentFrame.getDesktopPane().getSelectedFrame()!=null)
parentFrame.getDesktopPane().getSelectedFrame().requestFocus();
return;
}
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_FOCUS_BORDER,1));
dropFocusFromAllForms();
}
public void focusLost(FocusEvent e) {
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_NO_FOCUS_BORDER,1));
}
});
if (spacing!=null)
bottomTable.setIntercellSpacing(spacing);
if (rowMargin!=-1)
bottomTable.setRowMargin(rowMargin);
} // end bottom grid...
tmpPanel.setLayout(new GridBagLayout());
if (topTable!=null) {
topTable.setMinimumSize(new Dimension(getWidth(),lockedRowsOnTop*rowHeight));
tmpPanel.add(topTable,
new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
, GridBagConstraints.WEST,
GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, lockedRowsOnTop*rowHeight));
}
tmpPanel.add(table,
new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0
, GridBagConstraints.WEST,
GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
if (bottomTable!=null) {
bottomTable.setMinimumSize(new Dimension(getWidth(),lockedRowsOnBottom*rowHeight));
tmpPanel.add(bottomTable,
new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0
, GridBagConstraints.WEST,
GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, lockedRowsOnBottom*rowHeight));
}
table.getGrid().addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (parentFrame==null) {
parentFrame = ClientUtils.getParentInternalFrame(GridControl.this);
}
if (parentFrame!=null && !parentFrame.isSelected()) {
if (parentFrame.getDesktopPane().getSelectedFrame()!=null)
parentFrame.getDesktopPane().getSelectedFrame().requestFocus();
return;
}
if (table.getCurrentNestedComponent()!=null) {
Container cont = (Container)table.getCurrentNestedComponent();
while(cont!=null && !(cont instanceof Form) && !cont.equals(table.getGrid()))
cont = cont.getParent();
if (cont!=null && cont instanceof Form) {
((Form)cont).setFocusOnForm();
return;
}
}
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_FOCUS_BORDER,1));
dropFocusFromAllForms();
}
public void focusLost(FocusEvent e) {
// if (e.getSource()!=null && e.getSource() instanceof Component) {
// Component c = (Component)e.getSource();
// while(c!=null && !Consts.EXPANDED_COMPONENT.equals(c.getName()))
// c = c.getParent();
// if (c!=null && Consts.EXPANDED_COMPONENT.equals(c.getName())) {
// table.dispatchEvent(new FocusEvent(c,FocusEvent.FOCUS_GAINED,false));
// throw new RuntimeException("");
// }
//
// }
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_NO_FOCUS_BORDER,1));
// if (table.getCurrentNestedComponent()!=null)
// throw new RuntimeException("");
}
});
if (lockedColumns>0)
table.getLockedGrid().addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (parentFrame==null) {
parentFrame = ClientUtils.getParentInternalFrame(GridControl.this);
}
if (parentFrame!=null && !parentFrame.isSelected()) {
if (parentFrame.getDesktopPane().getSelectedFrame()!=null)
parentFrame.getDesktopPane().getSelectedFrame().requestFocus();
return;
}
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_FOCUS_BORDER,1));
dropFocusFromAllForms();
}
public void focusLost(FocusEvent e) {
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_NO_FOCUS_BORDER,1));
}
});
gridStatusPanel.add(tmpPanel,BorderLayout.CENTER);
if (visibleStatusPanel)
gridStatusPanel.add(labelPanel,BorderLayout.SOUTH);
if (showFilterPanelOnGrid) {
filterPanel = new FilterPanel(columnProperties,table,filterPanelOnGridPolicy);
split.setOrientation(split.HORIZONTAL_SPLIT);
split.setDividerSize(1);
split.add(gridStatusPanel,split.LEFT);
split.add(filterPanel,split.RIGHT);
super.add(split, BorderLayout.CENTER);
split.setDividerLocation(2048);
table.getGrid().addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
if (filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_CLOSE_ON_EXIT ||
filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_USE_PADLOCK_PRESSED && !filterPanel.isLocked() ||
filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_USE_PADLOCK_UNPRESSED && !filterPanel.isLocked())
split.setDividerLocation(split.getWidth()-10);
}
});
if (filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_USE_CLOSE_BUTTON) {
filterPanel.getClosePanel().addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
split.setDividerLocation(split.getWidth()-10);
}
});
}
if (table.getLockedGrid()!=null)
table.getLockedGrid().addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
split.setDividerLocation(split.getWidth()-10);
}
});
filterPanel.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
if (split.getDividerLocation()<=split.getWidth()-(int)filterPanel.getPreferredSize().getWidth()-20)
return;
if (!(filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_USE_PADLOCK_PRESSED && filterPanel.isLocked()) &&
!(filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_USE_PADLOCK_UNPRESSED && filterPanel.isLocked()))
filterPanel.init();
if (split.getLastDividerLocation()>0 &&
split.getLastDividerLocation()<filterPanel.getPreferredSize().getWidth() &&
filterPanel.getPreferredSize().getWidth()<300)
split.setDividerLocation(split.getLastDividerLocation());
else
split.setDividerLocation(split.getWidth()-(int)filterPanel.getPreferredSize().getWidth()-20);
}
public void mouseExited(MouseEvent e) {
if (filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_CLOSE_ON_EXIT ||
filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_USE_PADLOCK_PRESSED && !filterPanel.isLocked() ||
filterPanelOnGridPolicy==Consts.FILTER_PANEL_ON_GRID_USE_PADLOCK_UNPRESSED && !filterPanel.isLocked()) {
if (e.getX()<=0 || e.getY()<=0 || e.getX()>=filterPanel.getWidth() || e.getY()>=filterPanel.getHeight())
split.setDividerLocation(split.getWidth()-10);
}
}
});
}
gridStatusPanel.revalidate();
gridStatusPanel.repaint();
itsColumnContainer = null;
tmpPanel.setBorder(BorderFactory.createLineBorder(ClientSettings.GRID_NO_FOCUS_BORDER,1));
table.getVOListTableModel().setMode(mode);
table.setMaxNumberOfRowsOnInsert(maxNumberOfRowsOnInsert);
table.setAllowInsertInEdit(allowInsertInEdit);
table.setInsertRowsOnTop(insertRowsOnTop);
if (mode==Consts.READONLY && autoLoadData)
table.reload();
for(int i=0;i<loadDataCompletedListeners.size();i++)
table.addLoadDataCompletedListener((ActionListener)loadDataCompletedListeners.get(i));
table.addLoadDataCompletedListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int i=0;i<mergedCells.size();i++)
table.mergeCells(
(int[])((Object[])mergedCells.get(i))[0],
(int[])((Object[])mergedCells.get(i))[1]
);
}
});
if (topTable!=null)
topTable.addLoadDataCompletedListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int i=0;i<topTableMergedCells.size();i++)
topTable.mergeCells(
(int[])((Object[])topTableMergedCells.get(i))[0],
(int[])((Object[])topTableMergedCells.get(i))[1]
);
}
});
if (bottomTable!=null)
bottomTable.addLoadDataCompletedListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int i=0;i<bottomTableMergedCells.size();i++)
bottomTable.mergeCells(
(int[])((Object[])bottomTableMergedCells.get(i))[0],
(int[])((Object[])bottomTableMergedCells.get(i))[1]
);
}
});
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// if (!table.getGrid().hasFocus())
// table.getGrid().requestFocus();
}
});
if (rowHeightFixed) {
table.getGrid().setRowHeight(rowHeight);
if (topTable!=null)
topTable.getGrid().setRowHeight(rowHeight);
if (bottomTable!=null)
bottomTable.getGrid().setRowHeight(rowHeight);
if (table.getLockedGrid()!=null)
table.getLockedGrid().setRowHeight(rowHeight);
if (topTable!=null && topTable.getLockedGrid()!=null)
topTable.getLockedGrid().setRowHeight(rowHeight);
if (bottomTable!=null && bottomTable.getLockedGrid()!=null)
bottomTable.getLockedGrid().setRowHeight(rowHeight);
}
else {
table.getGrid().setRowHeightFixed(false);
if (table.getLockedGrid()!=null)
table.getLockedGrid().setRowHeightFixed(false);
if (topTable!=null) {
topTable.getGrid().setRowHeightFixed(false);
if (topTable.getLockedGrid()!=null)
topTable.getLockedGrid().setRowHeightFixed(false);
}
if (bottomTable!=null) {
bottomTable.getGrid().setRowHeightFixed(false);
if (bottomTable.getLockedGrid()!=null)
bottomTable.getLockedGrid().setRowHeightFixed(false);
}
}
table.getGrid().setOrderWithLoadData(orderWithLoadData,orderPolicy);
if (table.getLockedGrid()!=null)
table.getLockedGrid().setOrderWithLoadData(orderWithLoadData,orderPolicy);
// apply the profile (e.g. reorder column properties, etc)...
if (ClientSettings.getInstance().GRID_PROFILE_MANAGER!=null &&
functionId!=null &&
!functionId.trim().equals("") &&
allowColumnsProfile &&
profile!=null)
applyProfile(columnProperties,profile,false);
}
catch (Throwable ex) {
ex.printStackTrace();
}
}
/**
* @return column container
*/
public final ColumnContainer getColumnContainer() {
return itsColumnContainer;
}
/**
* @return value object class name
*/
public final String getValueObjectClassName() {
try {
AttributeNameEditor.setDesignVOClass(Class.forName(valueObjectClassName));
}
catch (Throwable ex) {
}
return valueObjectClassName;
}
/**
* Set the value object class name.
* @param valueObjectClassName value object class name
*/
public final void setValueObjectClassName(String valueObjectClassName) {
this.valueObjectClassName = valueObjectClassName;
try {
AttributeNameEditor.setDesignVOClass(Class.forName(valueObjectClassName));
}
catch (Throwable ex) {
}
}
/**
* @return allows column reordering
*/
public final boolean isReorderingAllowed() {
return reorderingAllowed;
}
/**
* Define if column reordering is allowed.
* @param reorderingAllowed allows column reordering
*/
public final void setReorderingAllowed(boolean reorderingAllowed) {
this.reorderingAllowed = reorderingAllowed;
}
/**
* @return allows column resizing
*/
public final boolean isResizingAllowed() {
return resizingAllowed;
}
/**
* Define if column resizing is allowed.
* @param resizingAllowed allows column resizing
*/
public final void setResizingAllowed(boolean resizingAllowed) {
this.resizingAllowed = resizingAllowed;
}
/**
* @return current grid mode
*/
public final int getMode() {
if (table==null)
return mode;
else
return table.getMode();
}
/**
* Set grid mode.
* @param mode grid mode; possibile values: READONLY, INSERT, EDIT
*/
public final void setMode(int mode) {
this.mode = mode;
if (table!=null)
table.getVOListTableModel().setMode(mode);
}
/**
* @return grid container
*/
public final GridController getController() {
return controller;
}
/**
* Set grid container. This method is callable ONLY before the grid is set to visible.
* @param container grid container
*/
public final void setController(GridController controller) {
this.controller = controller;
}
/**
* Set status panel visibility.
* @param visibleStatusPanel <code>true</code> to show the status panel, <code>false</code> to hide the status panel
*/
public final void setVisibleStatusPanel(boolean visibleStatusPanel) {
this.visibleStatusPanel = visibleStatusPanel;
if (visibleStatusPanel)
gridStatusPanel.add(labelPanel,BorderLayout.SOUTH);
else
gridStatusPanel.remove(labelPanel);
}
/**
* @return status panel visibility
*/
public final boolean isVisibleStatusPanel() {
return visibleStatusPanel;
}
/**
* @return grid data model
*/
public final VOListTableModel getVOListTableModel() {
if (table!=null)
return table.getVOListTableModel();
else
return null;
}
/**
* @return grid selection mode
*/
public final int getSelectionMode() {
return selectionMode;
}
/**
* Set grid selection mode.
* @param selectionMode grid selection mode
*/
public final void setSelectionMode(int selectionMode) {
this.selectionMode = selectionMode;
}
/**
* @return insert button
*/
public final InsertButton getInsertButton() {
return insertButton;
}
/**
* @return export button
*/
public final ExportButton getExportButton() {
return exportButton;
}
/**
* @return import button
*/
public final ImportButton getImportButton() {
return importButton;
}
/**
* @return filter button
*/
public final FilterButton getFilterButton() {
return filterButton;
}
/**
* @return copy button
*/
public final CopyButton getCopyButton() {
return copyButton;
}
/**
* @return edit button
*/
public final EditButton getEditButton() {
return editButton;
}
/**
* Set the edit button.
* @param editButton edit button
*/
public final void setEditButton(EditButton editButton) {
if (editButton!=null)
editButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Edit record (CTRL+E)"));
this.editButton = editButton;
if (this.table!=null)
this.table.setEditButton(editButton);
}
/**
* Set the insert button.
* @param insertButton insert button
*/
public final void setInsertButton(InsertButton insertButton) {
if (insertButton!=null)
insertButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("New record (CTRL+I)"));
this.insertButton = insertButton;
if (this.table!=null)
this.table.setInsertButton(insertButton);
}
/**
* Set the export button.
* @param exportButton export button
*/
public final void setExportButton(ExportButton exportButton) {
if (exportButton!=null)
exportButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Export record (CTRL+X)"));
this.exportButton = exportButton;
if (this.table!=null)
this.table.setExportButton(exportButton);
}
/**
* Set the import button.
* @param importButton import button
*/
public final void setImportButton(ImportButton importButton) {
if (importButton!=null)
importButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Import records (CTRL+M)"));
this.importButton = importButton;
if (this.table!=null)
this.table.setImportButton(importButton);
}
/**
* Set the copy button.
* @param copyButton insert button
*/
public final void setCopyButton(CopyButton copyButton) {
if (copyButton!=null)
copyButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Copy record (CTRL+C)"));
this.copyButton = copyButton;
if (this.table!=null)
this.table.setCopyButton(copyButton);
}
/**
* @return reload/cancel button
*/
public final ReloadButton getReloadButton() {
return reloadButton;
}
/**
* Set reload/cancel button.
* @param reloadButton reload/cancel button
*/
public final void setReloadButton(ReloadButton reloadButton) {
if (reloadButton!=null)
reloadButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Reload record/Cancel current operation (CTRL+Z)"));
this.reloadButton = reloadButton;
if (this.table!=null)
this.table.setReloadButton(reloadButton);
}
/**
* @return delete button
*/
public final DeleteButton getDeleteButton() {
return deleteButton;
}
/**
* Set the delete button.
* @param deleteButton delete button
*/
public final void setDeleteButton(DeleteButton deleteButton) {
if (deleteButton!=null)
deleteButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Delete record (CTRL+D)"));
this.deleteButton = deleteButton;
if (this.table!=null)
this.table.setDeleteButton(deleteButton);
}
/**
* Set the filter button.
* @param filterButton filter button
*/
public final void setFilterButton(FilterButton filterButton) {
if (filterButton!=null)
filterButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Filtering/Sorting data (CTRL+F)"));
this.filterButton = filterButton;
if (this.table!=null)
this.table.setFilterButton(filterButton);
}
/**
* @return save button
*/
public final SaveButton getSaveButton() {
return saveButton;
}
/**
* Set the save button.
* @param saveButton save button
*/
public final void setSaveButton(SaveButton saveButton) {
if (saveButton!=null)
saveButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Save record (CTRL+S)"));
this.saveButton = saveButton;
if (this.table!=null)
this.table.setSaveButton(saveButton);
}
/**
* Add an optional button.
* @param button generic button
*/
public final void addGenericButton(GenericButton button) {
if (button!=null) {
if (table==null)
genericButtons.add(button);
else {
this.table.getGenericButtons().add(button);
button.addDataController(this.table);
}
}
}
/**
* Remove an optional button.
* @param button generic button
*/
public final void removeGenericButton(GenericButton button) {
if (button!=null) {
if (table==null)
genericButtons.remove(button);
else
this.table.getGenericButtons().remove(button);
}
}
/**
* @return <code>true</code> to automatically load data when the grid is showed, <code>false</code> otherwise
*/
public final boolean isAutoLoadData() {
return this.autoLoadData;
}
/**
* Define if grid must be automatically loaded when it is showed.
* @param autoLoadData <code>true</code> to automatically load data when the grid is showed, <code>false</code> otherwise
*/
public final void setAutoLoadData(boolean autoLoadData) {
this.autoLoadData = autoLoadData;
}
/**
* Sets READONLY mode and reloads current block of data.
* Data Loading is executed in a separated thread.
* After data loading, the old selected row is selected again.
* Note: This method can be called ONLY when the grid is already visibile.
*/
public final void reloadCurrentBlockOfData() {
if (this.table!=null)
this.table.reload();
}
/**
* Sets READONLY mode and reloads the first block of data.
* Data Loading is executed in a separated thread.
* After data loading, the first row is automatically selected.
* Note: This method can be called ONLY when the grid is already visibile.
*/
public final void reloadData() {
if (this.table!=null)
this.table.reloadDataFromStart();
}
/**
* Save data and sets grid in READONLY mode (if saving task was successfully completed).
*/
public final boolean save() {
if (this.table!=null)
return this.table.save();
else
return false;
}
/**
* Set the functionId identifier, associated to the container
* @param functionId identifier associated to the container
*/
public final void setFunctionId(String functionId) {
this.functionId = functionId;
}
/**
* @return identifier (functionId) associated to the container
*/
public final String getFunctionId() {
return functionId;
}
/**
* @return grid data locator; can be set to "ClientGridDataLocator" or to "ServerGridDataLocator"
*/
public final GridDataLocator getGridDataLocator() {
return gridDataLocator;
}
/**
* Set the grid data locator.
* @param gridDataLocator grid data locator; can be set to "ClientGridDataLocator" or to "ServerGridDataLocator"
*/
public final void setGridDataLocator(GridDataLocator gridDataLocator) {
this.gridDataLocator = gridDataLocator;
}
/**
* @return navigation bar (optional)
*/
public final NavigatorBar getNavBar() {
return navBar;
}
/**
* Set navigation bar.
* @param navBar navigation bar
*/
public final void setNavBar(NavigatorBar navBar) {
this.navBar = navBar;
if (this.table!=null)
this.table.setNavBar(navBar);
}
/**
* @return other grid parameters
*/
public final Map getOtherGridParams() {
if (this.table!=null)
return this.table.getOtherGridParams();
return otherGridParams;
}
/**
* Set other grid parameters.
* @param otherGridParams other grid parameters
*/
public final void setOtherGridParams(Map otherGridParams) {
this.otherGridParams = otherGridParams;
if (this.table!=null)
this.table.setOtherGridParams(otherGridParams);
}
/**
* Set maximum number of sorted columns.
* @param maxSortedColumns maximum number of sorted columns
*/
public final void setMaxSortedColumns(int maxSortedColumns) {
this.maxSortedColumns = maxSortedColumns;
}
/**
* Set maximum number of sorted columns.
* @param maxSortedColumns maximum number of sorted columns
*/
public final int getMaxSortedColumns() {
return this.maxSortedColumns;
}
/**
* Clear grid content.
*/
public final void clearData() {
if (this.table!=null)
this.table.clearData();
}
/**
* Clean up cells content for the specified row.
* Note: this method can be invoked only in INSERT/EDIT modes.
*/
public final void cleanUp(int row) {
cleanUp(row,true);
}
/**
* Clean up cells content for the specified row, for each field or editable only cells.
* Note: this method can be invoked only in INSERT/EDIT modes.
* @param cleanUpAlsoNotEditableCells define if all cells must be clean up
*/
public final void cleanUp(int row,boolean cleanUpAlsoNotEditableCells) {
if (table==null)
Logger.error(this.getClass().getName(), "cleanUp", "You are not allowed to invoke this method before showing grid.", null);
else
table.cleanUp(row,cleanUpAlsoNotEditableCells);
}
/**
* @return number of locked columns, i.e. columns anchored to the left side of the grid
*/
public final int getLockedColumns() {
return lockedColumns;
}
/**
* Set the number of locked columns, i.e. columns anchored to the left side of the grid.
* @param lockedColumns number of locked columns, i.e. columns anchored to the left side of the grid
*/
public final void setLockedColumns(int lockedColumns) {
this.lockedColumns = lockedColumns;
}
/**
* @param rowNumber TableModel row index
* @param attributeName attribute name that identifies a grid column
* @return <code>true</code> means that the cell having the specified row and column index is editable, <code>false</code> otherwise
*/
public final boolean isFieldEditable(int rowNumber,String attributeName) {
return table.isFieldEditable(rowNumber,attributeName);
}
/**
* Returns the indices of all selected rows.
*
* @return an array of integers containing the indices of all selected rows,
* or an empty array if no row is selected
* @see #getSelectedRow
*/
public int[] getSelectedRows() {
if (table==null)
return new int[0];
else
return table.getSelectedRows();
}
/**
* Returns the index of the first selected row, -1 if no row is selected.
* @return the index of the first selected row
*/
public int getSelectedRow() {
if (table==null)
return -1;
else
return table.getSelectedRow();
}
/**
* Returns the index of the first selected column,
* -1 if no column is selected.
* @return the index of the first selected column
*/
public int getSelectedColumn() {
if (table==null)
return -1;
else
return table.getSelectedColumn();
}
/**
* @return <code>true</code> if current editing cell is in valid state, <code>false</code> otherwise
*/
public final boolean stopCellEditing() {
if (table!=null)
return table.getGrid().stopCellEditing();
return false;
}
/**
* Enable drag onto the grid.
* @param gridId grid identifier
*/
public final void enableDrag(String gridId) {
if (table!=null)
table.enableDrag(gridId);
else
this.gridId = gridId;
}
/**
* Define GenericButton objects linked to this that will be disabled (independently from the grid mode)
* when the specified attribute will be set to the specified value.
* @param buttons collections GenericButton objects linked to this that have to be disabled
* @param buttonController interface that defines button disabilitation, according to some custom policy
*/
public final void addButtonsNotEnabled(HashSet buttons,GenericButtonController buttonController) {
if (table!=null)
table.addButtonsNotEnabled(buttons,buttonController);
else
buttonsNotEnabled.add(new Object[]{buttons,buttonController});
}
/**
* Method called by GenericButton.setEnabled method to check if the button must be disabled.
* @param button button whose abilitation must be checked
* @return <code>true</code> if no policy is defined in the grid for the specified button, <code>false</code> if there exists a disabilitation policy for the specified button (through addButtonsNotEnabledOnState grid method)
*/
public final boolean isButtonDisabled(GenericButton button) {
if (table!=null)
return table.isButtonDisabled(button);
else
return false;
}
/**
* Method automatically called by the Grid to check buttons disabilitation.
*/
public final void resetButtonsState() {
if (table!=null)
table.resetButtonsState();
}
/**
* Remove cell editing, if needed.
*/
public final void transferFocus() {
try {
if (table!=null)
table.transferFocus();
}
catch (Exception ex) {
}
}
/**
* @return maximum number of rows to insert by pressing "down" key; default value: 1
*/
public final int getMaxNumberOfRowsOnInsert() {
if (table==null)
return maxNumberOfRowsOnInsert;
else
return table.getMaxNumberOfRowsOnInsert();
}
/**
* Set the maximum number of rows to insert by pressing "down" key; default value: 1.
* @param maxNumberOfRowsOnInsert maximum number of rows to insert by pressing "down" key
*/
public final void setMaxNumberOfRowsOnInsert(int maxNumberOfRowsOnInsert) {
if (table==null)
this.maxNumberOfRowsOnInsert = maxNumberOfRowsOnInsert;
else
table.setMaxNumberOfRowsOnInsert(maxNumberOfRowsOnInsert);
}
/**
* @return collection of pairs < attribute name,new FilterWhereClause[2] > related to filters currently applied to grid
*/
public final Map getQuickFilterValues() {
if (table==null)
return new HashMap();
return table.getQuickFilterValues();
}
/**
* Method invoked by UI designers (e.g. JDeveloper) that does not correctly use the "containerDelegate" property defined in GridControlBeanInfo
* @param comp Component to add
* @param constraint contraint to use for the component to add
*/
public final void add(Component comp,Object constraint) {
itsColumnContainer.add(comp,constraint);
}
/**
* Method invoked by UI designers (e.g. Eclipse + Window Builder plugin) that does not correctly use the "containerDelegate" property defined in GridControlBeanInfo
* @param comp Component to add
* @param constraint contraint to use for the component to add
*/
public final Component add(Component comp) {
itsColumnContainer.add(comp,null);
return comp;
}
public final void paint(Graphics g) {
if (Beans.isDesignTime()) {
// show "itsColumnContainer" children components...
if (getColumnContainer().getComponents().length>0)
// JBuilder/NetBeans...
super.paint(g);
else {
// JDeveloper UI designer...
Component[] comps = itsColumnContainer.getComponents();
ArrayList tmp = new ArrayList(Arrays.asList(comps));
tmp.addAll(components);
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(Color.GRAY);
Column comp = null;
int width = 0;
boolean b = false;
for(int i=0;i<tmp.size();i++) {
comp = (Column)tmp.get(i);
b = true;
if (width<getWidth()) {
g.setColor(Color.GRAY);
g.drawRect(width,0,comp.getPreferredSize().width,19);
g.setColor(Color.WHITE);
g.drawLine(width+1,1,width+comp.getPreferredSize().width-1,1);
g.drawLine(width+1,1,width+1,19);
g.setColor(new Color(100,100,100));
g.drawLine(width+1,19,width+comp.getPreferredSize().width-1,19);
g.drawLine(width+comp.getPreferredSize().width-1,1,width+comp.getPreferredSize().width-1,18);
g.setColor(Color.BLACK);
g.drawString(comp.getHeaderColumnName(),width+3,15);
g.setColor(Color.WHITE);
g.fillRect(width+1,21,comp.getPreferredSize().width-1,18);
}
width += comp.getPreferredSize().width;
}
if (b) {
g.drawRect(0,getHeight()-20,getWidth()-1,19);
g.setColor(new Color(100,100,100));
g.drawLine(1,getHeight()-19,getWidth()-2,getHeight()-19);
g.drawLine(1,getHeight()-19,1,getHeight()-1);
g.setColor(Color.WHITE);
g.drawLine(1,getHeight()-1,getWidth()-1,getHeight()-1);
g.drawLine(getWidth()-1,getHeight()-19,getWidth()-1,getHeight()-1);
}
}
}
else
super.paint(g);
}
public LayoutManager getLayout() {
return flowLayout1;
}
/**
* @return row height of the grid control
*/
public final int getRowHeight() {
return rowHeight;
}
/**
* Set the row height of the grid control.
* @param rowHeight row height of the grid control
*/
public final void setRowHeight(int rowHeight) {
this.rowHeight = rowHeight;
}
/**
* @return define if row height can change for each row, according to image height included in a cell of grid; default value: <code>true</code>
*/
public final boolean isRowHeightFixed() {
return rowHeightFixed;
}
/**
* @param rowHeightFixed define if row height can change for each row, according to image height included in a cell of grid; default value: <code>true</code>
*/
public final void setRowHeightFixed(boolean rowHeightFixed) {
this.rowHeightFixed = rowHeightFixed;
}
/**
* @return flag used to define if grid sorting operation must always invoke loadData method to retrieve a new list of v.o. or the grid must sort the current v.o. list without invoking loadData (only with the whole result set loaded)
*/
public final boolean isOrderWithLoadData() {
return orderWithLoadData;
}
/**
* Used to define if grid sorting operation must always invoke loadData method to retrieve a new list of v.o. or
* the grid must sort the current v.o. list without invoking loadData (only with the whole result set loaded).
* @param orderWithLoadData flag used to define if grid sorting operation must always invoke loadData method to retrieve a new list of v.o. or the grid must sort the current v.o. list without invoking loadData (only with the whole result set loaded)
*/
public final void setOrderWithLoadData(boolean orderWithLoadData) {
this.orderWithLoadData = orderWithLoadData;
}
/**
* Used to define the sorting algorithm to use to sort columns.
* Note that this method is used by grid control ONLY IF <code>orderWithLoadData</code> property has been set to <code>false</code>,
* otherwise this setting will be ignored.
* @param orderPolicy interface that must be implemented in order to sort columns
*/
public final void setOrderPolicy(OrderPolicy orderPolicy) {
this.orderPolicy = orderPolicy;
}
/**
* @return <code>true</code> to automatically show a filter panel when moving mouse at right of the grid; <code>false</code> to do not show it
*/
public final boolean isShowFilterPanelOnGrid() {
return showFilterPanelOnGrid;
}
/**
* Set a <code>true</code> value to automatically show a filter panel when moving mouse at right of the grid; <code>false</code> to do not show it
* @param showFilterPanelOnGrid <code>true</code> to automatically show a filter panel when moving mouse at right of the grid; <code>false</code> to do not show it
*/
public final void setShowFilterPanelOnGrid(boolean showFilterPanelOnGrid) {
this.showFilterPanelOnGrid = showFilterPanelOnGrid;
}
/**
* @return number of rows locked (anchored) on the bottom of the grid
*/
public final int getLockedRowsOnBottom() {
return lockedRowsOnBottom;
}
/**
* @return number of rows locked (anchored) on the top of the grid; default value: 0
*/
public final int getLockedRowsOnTop() {
return lockedRowsOnTop;
}
/**
* Set the number of rows locked (anchored) on the top of the grid.
* @param lockedRowsOnBottom number of rows locked (anchored) on the top of the grid
*/
public final void setLockedRowsOnBottom(int lockedRowsOnBottom) {
this.lockedRowsOnBottom = lockedRowsOnBottom;
}
/**
* Set the number of rows locked (anchored) on the bottom of the grid.
* @param lockedRowsOnTop number of rows locked (anchored) on the top of the grid
*/
public final void setLockedRowsOnTop(int lockedRowsOnTop) {
this.lockedRowsOnTop = lockedRowsOnTop;
}
/**
* @return top grid controller
*/
public final GridController getTopGridController() {
return topGridController;
}
/**
* @return top grid data locator
*/
public final GridDataLocator getTopGridDataLocator() {
return topGridDataLocator;
}
/**
* Set the top grid data locator.
* @param topGridDataLocator top grid data locator
*/
public final void setTopGridDataLocator(GridDataLocator topGridDataLocator) {
this.topGridDataLocator = topGridDataLocator;
}
/**
* Set the top grid controller.
* @param topGridController top grid controller
*/
public final void setTopGridController(GridController topGridController) {
this.topGridController = topGridController;
}
/**
* @return top grid containepd in this panel (optional); it will be created only on run-time
*/
public final Grids getTopTable() {
return topTable;
}
/**
* @return bottom grid contained in this panel (optional); it will be created only on run-time
*/
public final Grids getBottomTable() {
return bottomTable;
}
/**
* @return std grid contained in this panel; it will be created only on run-time
* DO NOT USE THIS HOOK TO ACCESS TO INTERNAL JTABLE CLASS AND CHANGE SOME SETTINGS!
*/
public final Grids getTable() {
return table;
}
/**
* @return bottom grid data locator
*/
public final GridDataLocator getBottomGridDataLocator() {
return bottomGridDataLocator;
}
/**
* @return bottom grid controller
*/
public final GridController getBottomGridController() {
return bottomGridController;
}
/**
* Set the bottom grid controller.
* @param bottomGridController bottom grid controller
*/
public final void setBottomGridController(GridController bottomGridController) {
this.bottomGridController = bottomGridController;
}
/**
* Set the bottomgrid data locator.
* @param bottomGridDataLocator bottom grid data locator
*/
public final void setBottomGridDataLocator(GridDataLocator bottomGridDataLocator) {
this.bottomGridDataLocator = bottomGridDataLocator;
}
/**
* @return default value that could be set in the quick filter criteria; values allowed: Consts.EQUALS,Consts.CONTAINS,Consts.STARTS_WITH,Consts.ENDS_WITH
*/
public final int getDefaultQuickFilterCriteria() {
return defaultQuickFilterCriteria;
}
/**
* Set default value that could be set in the quick filter criteria; values allowed: Consts.EQUALS,Consts.CONTAINS,Consts.STARTS_WITH,Consts.ENDS_WITH.
* @param defaultQuickFilterCriteria values allowed: Consts.EQUALS,Consts.CONTAINS,Consts.STARTS_WITH,Consts.ENDS_WITH
*/
public final void setDefaultQuickFilterCriteria(int defaultQuickFilterCriteria) {
this.defaultQuickFilterCriteria = defaultQuickFilterCriteria;
}
/**
* Set row selection interval.
* @param startRow first selected row index
* @param endRow last selected row index
*/
public final void setRowSelectionInterval(int startRow,int endRow) {
if (table!=null) {
table.setRowSelectionInterval(startRow,endRow);
}
}
/**
* Adds the rows from <code>index0</code> to <code>index1</code>, inclusive, to
* the current selection.
*
* @exception IllegalArgumentException if <code>index0</code> or <code>index1</code>
* lie outside [0, <code>getRowCount()</code>-1]
* @param index0 one end of the interval
* @param index1 the other end of the interval
*/
public final void addRowSelectionInterval(int index0, int index1) {
if (table!=null)
table.addRowSelectionInterval(index0,index1);
}
/**
* Deselects the rows from <code>index0</code> to <code>index1</code>, inclusive.
*
* @exception IllegalArgumentException if <code>index0</code> or
* <code>index1</code> lie outside
* [0, <code>getRowCount()</code>-1]
* @param index0 one end of the interval
* @param index1 the other end of the interval
*/
public final void removeRowSelectionInterval(int index0, int index1) {
if (table!=null)
table.removeRowSelectionInterval(index0,index1);
}
/**
* Deselects all selected columns and rows.
*/
public final void clearSelection() {
if (table!=null)
table.clearSelection();
}
/**
* Set editing to the specified cell.
* This method is ignored if the grid control is in READONY mode.
* @param row row index
* @param attributeName attribute name that identify the grid column
*/
public final void editCellAt(final int row,String attributeName) {
try {
if (getMode() == Consts.READONLY) {
return;
}
int colIndex = table.getVOListTableModel().findColumn(attributeName);
if (colIndex==-1)
Logger.error(this.getClass().getName(), "editCellAt", "The specified attribute '"+attributeName+"' does not exist.",null);
else {
colIndex = table.getGrid().convertColumnIndexToView(colIndex);
if (colIndex==-1) {
if (table.getLockedGrid()!=null) {
colIndex = table.getLockedGrid().convertColumnIndexToView(colIndex);
if (colIndex!=-1) {
editCellAt(row,colIndex);
}
else
Logger.error(this.getClass().getName(), "editCellAt", "The specified attribute '"+attributeName+"' has not a visible column associated.",null);
}
else
Logger.error(this.getClass().getName(), "editCellAt", "The specified attribute '"+attributeName+"' has not a visible column associated.",null);
}
else {
editCellAt(row,colIndex);
}
}
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "editCellAt", "Error while setting cell editing",ex);
}
}
/**
* Method called by editCellAt public method.
* @param row row index
* @param colIndex column index (related to the JTable)
*/
private void editCellAt(final int row,final int colIndex) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setRowSelectionInterval(row,row);
table.getGrid().editCellAt(row,colIndex);
}
});
}
/**
* Sets the <code>rowMargin</code> and the <code>columnMargin</code> --
* the height and width of the space between cells -- to
* <code>intercellSpacing</code>.
*
* @param intercellSpacing a <code>Dimension</code>
* specifying the new width
* and height between cells
* @see #getIntercellSpacing
* @beaninfo
* description: The spacing between the cells,
* drawn in the background color of the JTable.
*
* NOTE: there is a bug in JDK1.4.x: do not use this property with java 1.4!!!
*/
public final void setIntercellSpacing(Dimension spacing) {
this.spacing = spacing;
if (table!=null)
table.setIntercellSpacing(spacing);
}
/**
* Sets the amount of empty space between cells in adjacent rows.
*
* @param rowMargin the number of pixels between cells in a row
* @see #getRowMargin
* @beaninfo
* bound: true
* description: The amount of space between cells.
*/
public final void setRowMargin(int rowMargin) {
this.rowMargin = rowMargin;
if (table!=null)
table.setRowMargin(rowMargin);
}
/**
* @return a <code>Dimension</code> specifying the new width and height between cells
*/
public final Dimension getIntercellSpacing() {
return this.spacing;
}
/**
* @return the number of pixels between cells in a row
*/
public final int getRowMargin() {
return this.rowMargin;
}
/**
* @return define if an inner v.o. must be automatically instantiated when a setter method is invoked
*/
public final boolean isCreateInnerVO() {
return createInnerVO;
}
/**
* Define if an inner v.o. must be automatically instantiated when a setter method is invoked.
* @param createInnerVO define if an inner v.o. must be automatically instantiated when a setter method is invoked
*/
public final void setCreateInnerVO(boolean createInnerVO) {
this.createInnerVO = createInnerVO;
}
/**
* Set the cell span for the specified range of cells.
* @param rows row indexes that identify the cells to merge
* @param columns column indexes that identify the cells to merge
* @return <code>true</code> if merge operation is allowed, <code>false</code> if the cells range is invalid
*/
public final boolean mergeCells(int[] rows,int[] columns) {
if (table!=null)
return table.mergeCells(rows,columns);
else {
mergedCells.add(new Object[]{rows,columns});
return true;
}
}
/**
* Set the cell span for the specified range of cells in the locked rows on the top of the table.
* @param rows row indexes that identify the cells to merge
* @param columns column indexes that identify the cells to merge
* @return <code>true</code> if merge operation is allowed, <code>false</code> if the cells range is invalid
*/
public final boolean mergeCellsOnTop(int[] rows,int[] columns) {
if (topTable!=null)
return topTable.mergeCells(rows,columns);
else {
topTableMergedCells.add(new Object[]{rows,columns});
return true;
}
}
/**
* Set the cell span for the specified range of cells in the locked rows at the bottom of the table.
* @param rows row indexes that identify the cells to merge
* @param columns column indexes that identify the cells to merge
* @return <code>true</code> if merge operation is allowed, <code>false</code> if the cells range is invalid
*/
public final boolean mergeCellsOnBottom(int[] rows,int[] columns) {
if (bottomTable!=null)
return bottomTable.mergeCells(rows,columns);
else {
bottomTableMergedCells.add(new Object[]{rows,columns});
return true;
}
}
/**
* @return define if background and foreground colors must be setted according to GridController definition only in READONLY mode
*/
public final boolean isColorsInReadOnlyMode() {
return colorsInReadOnlyMode;
}
/**
* Define if background and foreground colors must be setted according to GridController definition only in READONLY mode.
* @param colorsInReadOnlyMode <code>false</code> to enable background and foreground colors to be setted according to GridController definition in all grid modes; <code>true</code> to enable background and foreground colors to be setted according to GridController definition only in READONLY mode
*/
public final void setColorsInReadOnlyMode(boolean colorsInReadOnlyMode) {
this.colorsInReadOnlyMode = colorsInReadOnlyMode;
if (table!=null)
table.setColorsInReadOnlyMode(colorsInReadOnlyMode);
if (topTable!=null)
topTable.setColorsInReadOnlyMode(colorsInReadOnlyMode);
if (bottomTable!=null)
bottomTable.setColorsInReadOnlyMode(colorsInReadOnlyMode);
}
/**
* Add a "load data completed" listener.
*/
public final void addLoadDataCompletedListener(ActionListener listener) {
loadDataCompletedListeners.add(listener);
if (table!=null)
table.addLoadDataCompletedListener(listener);
}
/**
* Remove a "load data completed" listener.
*/
public final void removeLoadDataCompletedListener(ActionListener listener) {
loadDataCompletedListeners.remove(listener);
if (table!=null)
table.removeLoadDataCompletedListener(listener);
}
/**
* Add a menu item to the popup menu accessed through the right mouse click onto the grid.
* @param command menu item to add
*/
public final void addPopupCommand(JMenuItem command) {
popupCommands.add(command);
}
/**
* Add a menu item to the popup menu accessed through the right mouse click onto the grid.
* @param command menu item text (this text will be translated according to internationalization settings)
* @param listener ActionListener linked to this menu item
* @param enabled flag used to initially enable/disable the menu item
*/
public final void addPopupCommand(String command,ActionListener listener,boolean enabled) {
JMenuItem menu = new JMenuItem(ClientSettings.getInstance().getResources().getResource(command));
menu.setEnabled(enabled);
menu.addActionListener(listener);
popupCommands.add(menu);
}
/**
* Add a menu item to the popup menu accessed through the right mouse click onto the grid.
* @param command menu item text (this text will be translated according to internationalization settings)
* @param enabled flag used to initially enable/disable the menu item
* @param icon icon image associated to this menu item
* @param listener ActionListener linked to this menu item
*/
public final void addPopupCommand(String command,ActionListener listener,boolean enabled,Icon icon) {
JMenuItem menu = new JMenuItem(ClientSettings.getInstance().getResources().getResource(command),icon);
menu.setEnabled(enabled);
menu.addActionListener(listener);
popupCommands.add(menu);
}
/**
* Add a menu item to the popup menu accessed through the right mouse click onto the grid.
* @param command menu item text (this text will be translated according to internationalization settings)
* @param listener ActionListener linked to this menu item
* @param enabled flag used to initially enable/disable the menu item
* @param mnemonic ALT+char key combination that fires the item selection event
*/
public final void addPopupCommand(String command,ActionListener listener,boolean enabled,int mnemonic) {
JMenuItem menu = new JMenuItem(ClientSettings.getInstance().getResources().getResource(command),mnemonic);
menu.setEnabled(enabled);
menu.addActionListener(listener);
popupCommands.add(menu);
}
/**
* Add a menu item to the popup menu accessed through the right mouse click onto the grid.
* @param command menu item text (this text will be translated according to internationalization settings)
* @param mnemonic mnemonic char associated to this menu item
* @param listener ActionListener linked to this menu item
* @param enabled flag used to initially enable/disable the menu item
* @param mnemonic ALT+char key combination that fires the item selection event
* @param accelerator key combination (e.g. CTRL+key, etc.) that fires the item selection event
*/
public final void addPopupCommand(String command,ActionListener listener,boolean enabled,int mnemonic,KeyStroke accelerator) {
JMenuItem menu = new JMenuItem(ClientSettings.getInstance().getResources().getResource(command),mnemonic);
menu.setAccelerator(accelerator);
menu.setEnabled(enabled);
menu.addActionListener(listener);
popupCommands.add(menu);
}
/**
* Rename a menu item added to the popup menu and accessed through the right mouse click onto the grid.
* @param oldCommand old menu item text (this text will be translated according to internationalization settings)
* @param newCommand new menu item text (this text will be translated according to internationalization settings)
*/
public final void renamePopupCommand(String oldCommand,String newCommand) {
if (table!=null) {
ArrayList list = table.getPopupCommands();
String text = ClientSettings.getInstance().getResources().getResource(oldCommand);
JMenuItem menu = null;
for(int i=0;i<list.size();i++) {
menu = (JMenuItem)list.get(i);
if (menu.getText().equals(text)) {
menu.setText(ClientSettings.getInstance().getResources().getResource(newCommand));
return;
}
}
}
}
/**
* Enable/disable a menu item added to the popup menu and accessed through the right mouse click onto the grid.
* @param command menu item text (this text will be translated according to internationalization settings)
* @param enabled flag used to define if enable or disable the specified menu item
*/
public final void setEnablePopupCommand(String command,boolean enabled) {
if (table!=null) {
ArrayList list = table.getPopupCommands();
String text = ClientSettings.getInstance().getResources().getResource(command);
JMenuItem menu = null;
for(int i=0;i<list.size();i++) {
menu = (JMenuItem)list.get(i);
if (menu.getText().equals(text)) {
menu.setEnabled(enabled);
return;
}
}
}
}
/**
* Apply the specified profile to the grid.
*/
private void applyProfile(Column[] columnProperties,GridProfile profile,boolean reloadGrid) {
this.profile = profile;
labelPanel.setProfile(profile.getDescription());
for(int i=0;i<profile.getColumnsAttribute().length;i++) {
if (this.permissions==null ||
this.permissions!=null && this.permissions.getColumnsVisibility()[i])
columnProperties[i].setColumnVisible(profile.getColumnsVisibility()[i]);
columnProperties[i].setPreferredWidth(profile.getColumnsWidth()[i]);
}
Grid g = null;
if (table.getLockedGrid()!=null) {
// remove all columns...
g = table.getLockedGrid();
g.resetColumns(profile);
}
// remove all columns...
g = table.getGrid();
g.resetColumns(profile);
if (table!=null) {
table.getCurrentSortedColumns().clear();
table.getCurrentSortedColumns().addAll(profile.getCurrentSortedColumns());
table.getCurrentSortedVersusColumns().clear();
table.getCurrentSortedVersusColumns().addAll(profile.getCurrentSortedVersusColumns());
table.getQuickFilterValues().clear();
for (int i = 0; i < columnProperties.length; i++) {
if (columnProperties[i].getDefaultFilterValues()!=null)
table.getQuickFilterValues().put(
columnProperties[i].getColumnName(),
columnProperties[i].getDefaultFilterValues()
);
}
table.getQuickFilterValues().putAll(profile.getQuickFilterValues());
}
if (topTable!=null) {
g = topTable.getGrid();
g.resetColumns(profile);
topTable.getCurrentSortedColumns().clear();
topTable.getCurrentSortedColumns().addAll(profile.getCurrentSortedColumns());
topTable.getCurrentSortedVersusColumns().clear();
topTable.getCurrentSortedVersusColumns().addAll(profile.getCurrentSortedVersusColumns());
topTable.getQuickFilterValues().clear();
topTable.getQuickFilterValues().putAll(profile.getQuickFilterValues());
}
if (bottomTable!=null) {
g = bottomTable.getGrid();
g.resetColumns(profile);
bottomTable.getCurrentSortedColumns().clear();
bottomTable.getCurrentSortedColumns().addAll(profile.getCurrentSortedColumns());
bottomTable.getCurrentSortedVersusColumns().clear();
bottomTable.getCurrentSortedVersusColumns().addAll(profile.getCurrentSortedVersusColumns());
bottomTable.getQuickFilterValues().clear();
bottomTable.getQuickFilterValues().putAll(profile.getQuickFilterValues());
}
if (reloadGrid)
table.reload();
}
/**
* Apply grid permissions to grid.
*/
private void applyGridPermissions(String[] columnsAttribute,boolean[] columnsVisibility,boolean[] columnsEditableInIns,boolean[] columnsEditableInEdit,boolean[] columnsMandatory) throws Throwable {
if (this.permissions==null) {
this.permissions = (GridPermissions)ClientSettings.getInstance().getGridPermissions().get(functionId);
if (this.permissions==null) {
this.permissions = ClientSettings.getInstance().GRID_PERMISSION_MANAGER.getUserGridPermissions(
functionId,
ClientSettings.getInstance().GRID_PERMISSION_MANAGER.getUserRoles(),
columnsAttribute,
columnsVisibility,
columnsEditableInIns,
columnsEditableInEdit,
columnsMandatory
);
if (this.permissions!=null)
ClientSettings.getInstance().getGridPermissions().put(functionId,this.permissions);
}
}
for(int i=0;i<permissions.getColumnsAttribute().length;i++) {
columnProperties[i].setColumnVisible(permissions.getColumnsVisibility()[i]);
if (!permissions.getColumnsVisibility()[i])
columnProperties[i].setColumnSelectable(false);
columnProperties[i].setEditableOnInsert(permissions.getColumnsEditabilityInInsert()[i]);
columnProperties[i].setEditableOnEdit(permissions.getColumnsEditabilityInEdit()[i]);
columnProperties[i].setColumnRequired(permissions.getColumnsMandatory()[i]);
}
}
private void setDefaultProfile(Column[] columnProperties) {
String[] columnsAttribute = new String[columnProperties.length];
boolean[] columnsVisibility = new boolean[columnProperties.length];
int[] columnsWidth = new int[columnProperties.length];
ArrayList currentSortedColumns = new ArrayList();
ArrayList currentSortedVersusColumns = new ArrayList();
HashMap filters = new HashMap();
int[] aux = new int[columnProperties.length+1];
for(int i=0;i<aux.length;i++)
aux[i] = -1;
for(int i=0;i<columnProperties.length;i++) {
columnsAttribute[i] = columnProperties[i].getColumnName();
columnsVisibility[i] = columnProperties[i].isColumnVisible();
columnsWidth[i] = columnProperties[i].getPreferredWidth();
if (!columnProperties[i].getSortVersus().equals(Consts.NO_SORTED)) {
aux[columnProperties[i].getSortingOrder()] = i;
}
if (columnProperties[i].getDefaultFilterValues()!=null)
filters.put(columnProperties[i].getColumnName(),columnProperties[i].getDefaultFilterValues());
}
for(int i=0;i<aux.length;i++)
if (aux[i]>=0) {
currentSortedColumns.add(columnProperties[aux[i]].getColumnName());
currentSortedVersusColumns.add(columnProperties[aux[i]].getSortVersus());
}
defaultProfile = new GridProfile(
ClientSettings.getInstance().getResources().getResource("default profile"),
functionId,
ClientSettings.getInstance().GRID_PROFILE_MANAGER.getUsername(),
currentSortedColumns,
currentSortedVersusColumns,
filters,
columnsAttribute,
columnsVisibility,
columnsWidth,
true
);
}
/**
* @return current grid profile
*/
public final GridProfile getProfile() {
return profile;
}
/**
* Store profile if changed.
*/
private void maybeStoreProfile(Column[] columnProperties) {
if (table==null)
return;
try {
boolean changed = false;
// check for changes in column reordering, visibility, width...
String[] attributesName = new String[profile.getColumnsAttribute().length];
boolean[] visibility = new boolean[profile.getColumnsVisibility().length];
int[] width = new int[profile.getColumnsWidth().length];
ArrayList sortedCols = new ArrayList();
ArrayList sortedColVersus = new ArrayList();
HashMap filters = new HashMap();
Grid g = table.getLockedGrid();
if (g!=null) {
TableColumnModel model = g.getColumnModel();
for(int i=0;i<model.getColumnCount();i++) {
attributesName[i] = columnProperties[g.convertColumnIndexToModel(i)].getColumnName();
visibility[g.convertColumnIndexToModel(i)] = columnProperties[g.convertColumnIndexToModel(i)].isColumnVisible();
width[g.convertColumnIndexToModel(i)] = model.getColumn(i).getWidth();
}
}
g = table.getGrid();
TableColumnModel model = g.getColumnModel();
for(int i=0;i<model.getColumnCount();i++) {
attributesName[i+lockedColumns] = columnProperties[g.convertColumnIndexToModel(i)].getColumnName();
visibility[g.convertColumnIndexToModel(i)] = columnProperties[g.convertColumnIndexToModel(i)].isColumnVisible();
width[g.convertColumnIndexToModel(i)] = model.getColumn(i).getWidth();
}
// retrieve sorting conditions and set not visible attributes...
int k = attributesName.length-1;
Hashtable sortingVersus = new Hashtable(columnProperties.length);
for(int i=0;i<columnProperties.length;i++) {
if (!columnProperties[i].isColumnVisible())
attributesName[k--] = columnProperties[i].getColumnName();
if (!columnProperties[i].getSortVersus().equals(Consts.NO_SORTED)) {
sortingVersus.put(new Integer(columnProperties[i].getSortingOrder()),new Integer(i));
}
}
Integer index = null;
for(int i=0;i<columnProperties.length;i++) {
index = (Integer)sortingVersus.get(new Integer(i));
if (index!=null) {
sortedCols.add(columnProperties[index.intValue()].getColumnName());
sortedColVersus.add(columnProperties[index.intValue()].getSortVersus());
}
}
// retrieve filtering conditions...
if (table!=null) {
filters.putAll( table.getQuickFilterValues() );
}
if (topTable!=null) {
filters.putAll( topTable.getQuickFilterValues() );
}
if (bottomTable!=null) {
filters.putAll( bottomTable.getQuickFilterValues() );
}
if (!Utils.equals(attributesName,profile.getColumnsAttribute())) {
profile.setColumnsAttribute(attributesName);
changed = true;
}
if (!Utils.equals(visibility,profile.getColumnsVisibility())) {
profile.setColumnsVisibility(visibility);
changed = true;
}
if (!Utils.equals(width,profile.getColumnsWidth())) {
profile.setColumnsWidth(width);
changed = true;
}
if (!Utils.equals(sortedCols,profile.getCurrentSortedColumns())) {
profile.setCurrentSortedColumns(sortedCols);
changed = true;
}
if (!Utils.equals(sortedColVersus,profile.getCurrentSortedVersusColumns())) {
profile.setCurrentSortedVersusColumns(sortedColVersus);
changed = true;
}
if (!Utils.equals(filters,profile.getQuickFilterValues())) {
profile.setQuickFilterValues(filters);
changed = true;
}
if (changed) {
Object id = ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeUserProfile(profile);
profile.setId(id);
ClientSettings.getInstance().GRID_PROFILE_MANAGER.storeGridProfileId(functionId, profile.getId());
ClientSettings.getInstance().getLastUserGridProfileIds().put(functionId, profile.getId());
}
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(), "maybeStoreProfile", "Error while saving grid profile: "+ex.getMessage(),ex);
}
}
/**
* @return used only when "showFilterPanelOnGrid" is set to <code>true</code>; define filter panel policy for hiding it; allowed values: Consts.FILTER_PANEL_ON_GRID_xxx; default value: ClientSettings.FILTER_PANEL_ON_GRID_POLICY
*/
public final int getFilterPanelOnGridPolicy() {
return filterPanelOnGridPolicy;
}
/**
* Define filter panel policy for hiding it; allowed values: Consts.FILTER_PANEL_ON_GRID_xxx; default value: ClientSettings.FILTER_PANEL_ON_GRID_POLICY
* @param filterPanelOnGridPolicy used only when "showFilterPanelOnGrid" is set to <code>true</code>; define filter panel policy for hiding it; allowed values: Consts.FILTER_PANEL_ON_GRID_xxx
*/
public final void setFilterPanelOnGridPolicy(int filterPanelOnGridPolicy) {
this.filterPanelOnGridPolicy = filterPanelOnGridPolicy;
}
/**
* @return define if the last column must be to anchored on the right margin of the grid, only when all columns width is lesser than grid width
*/
public boolean isAnchorLastColumn() {
return anchorLastColumn;
}
/**
* Define if the last column must be anchored on the right margin of the grid, only when all columns width is lesser than grid width.
* @param anchorLastColumn flag used to anchor the last column on the right margin of the grid, only when all columns width is lesser than grid width
*/
public void setAnchorLastColumn(boolean anchorLastColumn) {
this.anchorLastColumn = anchorLastColumn;
}
/**
* @return column index declared as expandable, i.e. user can click on it to expand cell to show an inner component
*/
public final int getExpandableColumn() {
return expandableColumn;
}
/**
* Define which column index declared as expandable, i.e. user can click on it to expand cell to show an inner component.
* @param expandableColumn column index declared as expandable, i.e. user can click on it to expand cell to show an inner component
*/
public final void setExpandableColumn(int expandableColumn) {
this.expandableColumn = expandableColumn;
}
/**
* Collapse all expanded rows.
* This command will be performed only if "expandableRowController" property is setted and row is not yet collapsed
* @param row row number
*/
public final void collapseAllRows() {
if (table!=null)
table.collapseAllRows();
}
/**
* @return define whether expanded rows in the past must be collapsed when expanding the current one; used only when "expandableColumn" property is not null
*/
public final boolean isSingleExpandableRow() {
return singleExpandableRow;
}
/**
* Define whether expanded rows in the past must be collapsed when expanding the current one; used only when "expandableColumn" property is not null.
* @param singleExpandableRow define whether expanded rows in the past must be collapsed when expanding the current one; used only when "expandableColumn" property is not null
*/
public final void setSingleExpandableRow(boolean singleExpandableRow) {
this.singleExpandableRow = singleExpandableRow;
}
/**
* @return controller that manages row expansion
*/
public final ExpandableRowController getExpandableRowController() {
return expandableRowController;
}
/**
* Define the controller that manages row expansion.
* @param expandableRowController controller that manages row expansion
*/
public final void setExpandableRowController(ExpandableRowController expandableRowController) {
this.expandableRowController = expandableRowController;
}
/**
* @return define whether the row to show, when expanding the current one, must be showed over the current one on in a new row below it; used only when "overwriteRowWhenExpanding" property is not null
*/
public final boolean isOverwriteRowWhenExpanding() {
return overwriteRowWhenExpanding;
}
/**
* Define whether the row to show, when expanding the current one, must be showed over the current one on in a new row below it; used only when "overwriteRowWhenExpanding" property is not null.
* @param overwriteRowWhenExpanding define whether the row to show, when expanding the current one, must be showed over the current one on in a new row below it
*/
public final void setOverwriteRowWhenExpanding(boolean overwriteRowWhenExpanding) {
this.overwriteRowWhenExpanding = overwriteRowWhenExpanding;
}
public final void finalize() {
try {
if (table==null)
return;
if (ClientSettings.getInstance().GRID_PROFILE_MANAGER!=null &&
functionId!=null &&
!functionId.trim().equals("") &&
allowColumnsProfile)
maybeStoreProfile(columnProperties);
table.finalize();
table = null;
if (topTable!=null)
topTable.finalize();
topTable = null;
if (bottomTable!=null)
bottomTable.finalize();
bottomTable = null;
FocusListener[] fl = getFocusListeners();
for (int i = 0; i < fl.length; i++) {
this.removeFocusListener(fl[i]);
}
MouseListener[] ml = getMouseListeners();
for (int i = 0; i < ml.length; i++) {
this.removeMouseListener(ml[i]);
}
KeyListener[] ll = getKeyListeners();
for (int i = 0; i < ll.length; i++) {
this.removeKeyListener(ll[i]);
}
controller = null;
gridDataLocator = null;
if (this.getParent()!=null)
this.getParent().remove(this);
if (itsColumnContainer!=null)
ClientUtils.disposeComponents(itsColumnContainer.getComponents());
ClientUtils.disposeComponents(getComponents());
}
catch (Exception ex) {
ex.printStackTrace();
}
insertButton = null;
exportButton = null;
importButton = null;
filterButton = null;
copyButton = null;
editButton = null;
reloadButton = null;
deleteButton = null;
saveButton = null;
navBar = null;
buttonsNotEnabled = null;
genericButtons = null;
components = null;
filterPanel = null;
topGridController = null;
bottomGridController = null;
topGridDataLocator = null;
bottomGridDataLocator = null;
tmpPanel = null;
mergedCells = null;
topTableMergedCells = null;
bottomTableMergedCells = null;
loadDataCompletedListeners = null;
popupCommands = null;
profile = null;
defaultProfile = null;
profileMenu = null;
profilesMenu = null;
expandableRowController = null;
itsColumnContainer = null;
}
public final void requestFocus() {
if (table!=null)
table.getGrid().requestFocus();
else
super.requestFocus();
}
/**
* @return define if a warning message must be showed when reloading data in grid and grid is in EDIT/INSERT mode
*/
public final boolean isShowWarnMessageBeforeReloading() {
return showWarnMessageBeforeReloading;
}
/**
* Define if a warning message must be showed when reloading data in grid and grid is in EDIT/INSERT mode.
* @param showWarnMessageBeforeReloading flag used to define if a warning message must be showed when reloading data in grid and grid is in EDIT/INSERT mode
*/
public final void setShowWarnMessageBeforeReloading(boolean showWarnMessageBeforeReloading) {
this.showWarnMessageBeforeReloading = showWarnMessageBeforeReloading;
}
/**
* @return allow insert row (using DOWN key) in edit mode too; default value: <code>false</code>
*/
public final boolean isAllowInsertInEdit() {
if (table==null)
return allowInsertInEdit;
else
return table.isAllowInsertInEdit();
}
/**
* Allow insert row (using DOWN key) in edit mode too; default value: <code>false</code>
* @param allowInsertInEdit allow insert row (using DOWN key) in edit mode too
*/
public final void setAllowInsertInEdit(boolean allowInsertInEdit) {
if (table==null)
this.allowInsertInEdit = allowInsertInEdit;
else
table.setAllowInsertInEdit(allowInsertInEdit);
}
/**
* @return define where new rows must be added: <code>true</code> at the top of the grid or <code>false</code> at the bottom
*/
public final boolean isInsertRowsOnTop() {
if (table==null)
return insertRowsOnTop;
else
return table.isInsertRowsOnTop();
}
/**
* Define where new rows must be added: <code>true</code> at the top of the grid or <code>false</code> at the bottom; default value: <code>true</code>
* @param insertRowsOnTop define where new rows must be added: <code>true</code> at the top of the grid or <code>false</code> at the bottom
*/
public final void setInsertRowsOnTop(boolean insertRowsOnTop) {
if (table==null)
this.insertRowsOnTop = insertRowsOnTop;
else
table.setInsertRowsOnTop(insertRowsOnTop);
}
/**
* @return header height
*/
public final int getHeaderHeight() {
return headerHeight;
}
/**
* Set the header height.
* This method can be invoked only before grid control is visible.
* @param headerHeight header height
*/
public final void setHeaderHeight(int headerHeight) {
if (table==null)
this.headerHeight = headerHeight;
}
/**
* @return force the editing of one row only: the current selected row: <code>false</code> all rows are editable, <code>true</code> edit is allowed only on current selected row
*/
public final boolean isEditOnSingleRow() {
return editOnSingleRow;
}
/**
* Define if cell editing is allows on one row only or on all rows: <code>false</code> all rows are editable, <code>true</code> edit is allowed only on current selected row
* @param editOnSingleRow <code>false</code> all rows are editable, <code>true</code> edit is allowed only on current selected row
*/
public final void setEditOnSingleRow(boolean editOnSingleRow) {
this.editOnSingleRow = editOnSingleRow;
}
/**
* @return GridExportOptions object created, starting from current visible columns
*/
public final GridExportOptions getDefaultGridExportOptions() {
if (table!=null)
return table.getDefaultGridExportOptions();
else
return null;
}
/**
* @param attributesToExport attributes to export
* @return GridExportOptions object created, starting from specified attributes to export
*/
public final GridExportOptions getDefaultGridExportOptions(HashSet attributesToExport) {
if (table!=null)
return table.getDefaultGridExportOptions(attributesToExport);
else
return null;
}
/**
* Add a list-filter for the specified column, showed in the quick filter panel.
* @param attributeName attribute name that identifies the column having a list-filter to remove
*/
public final void addListFilter(String attributeName,ListFilterController filter) {
listFilters.put(attributeName,filter);
}
/**
* Remove a list-filter for the specified column.
* @param attributeName attribute name that identifies the column having a filter to remove
*/
public final void removeComboFilter(String attributeName) {
listFilters.remove(attributeName);
}
/**
* Remove global key listeners related to Form panels.
*/
private void dropFocusFromAllForms() {
try {
KeyListener[] ll = ApplicationEventQueue.getInstance().getKeyListeners();
for(int i=0;i<ll.length;i++)
if (ll[i] instanceof FormShortcutsListener)
((FormShortcutsListener)ll[i]).getForm().dropFocusFromForm();
}
catch (Exception ex1) {
}
}
/**
* @return show current page number in grid
*/
public final boolean isShowPageNumber() {
return showPageNumber;
}
/**
* Show/hide current page number in grid.
* @param showPageNumber flag used to show current page number in grid
*/
public final void setShowPageNumber(boolean showPageNumber) {
this.showPageNumber = showPageNumber;
}
/**
* Show/hide a column.
* Do not invoke this method before grid is being visible.
* @param attributeName attribute name that identities the column
* @param visible <code>true</code> to show column; <code>false</code> to hide it
*/
public final void setVisibleColumn(String attributeName,boolean visible) {
if (table!=null) {
table.setVisibleColumn(attributeName,visible);
}
}
/**
* @return current sorted columns
*/
public final ArrayList getCurrentSortedColumns() {
if (topTable!=null)
return topTable.getCurrentSortedColumns();
else if (table!=null)
return table.getCurrentSortedColumns();
else
return null;
}
/**
* @return current sorted columns versus (Ascending/Descending)
*/
public final ArrayList getCurrentSortedVersusColumns() {
if (topTable!=null)
return topTable.getCurrentSortedVersusColumns();
else if (table!=null)
return table.getCurrentSortedVersusColumns();
else
return null;
}
/**
* Remove the sorting condition currently applied to the specified column.
* Do not invoke this method before grid is being visible.
* @param attributeName attribute name that identities the column
* @param reloadGrid <code>true</code> to force grid reloading; <code>false</code> to do not reload grid (for instance when sorting conditions for other columns must be removed too)
*/
public final void removeSortedColumn(String attributeName,boolean reloadGrid) {
if (topTable!=null) {
int colIndex = topTable.getCurrentSortedColumns().indexOf(attributeName);
if (colIndex==-1) {
Logger.error(this.getClass().getName(), "removeSortedColumn", "The specified attribute name '"+attributeName+"' does not exists", null);
return;
}
topTable.getCurrentSortedColumns().remove(colIndex);
topTable.getCurrentSortedVersusColumns().remove(colIndex);
topTable.repaint();
if (reloadGrid)
reloadData();
else if (!orderWithLoadData && table!=null) {
table.getGrid().internalSorting();
if (table.getLockedGrid()!=null)
table.getLockedGrid().internalSorting();
}
}
else if (table!=null) {
int colIndex = table.getCurrentSortedColumns().indexOf(attributeName);
if (colIndex==-1) {
Logger.error(this.getClass().getName(), "removeSortedColumn", "The specified attribute name '"+attributeName+"' does not exists", null);
return;
}
table.getCurrentSortedColumns().remove(colIndex);
table.getCurrentSortedVersusColumns().remove(colIndex);
table.repaint();
if (reloadGrid)
reloadData();
else if (!orderWithLoadData && table!=null) {
table.getGrid().internalSorting();
if (table.getLockedGrid()!=null)
table.getLockedGrid().internalSorting();
}
}
}
/**
* Add the specified sorting condition to the column identified by the attribute name (as last sorting condition).
* Do not invoke this method before grid is being visible.
* @param attributeName attribute name that identities the column
* @param sortingVersus sorting versus; possible values: Consts.ASC_SORTED,Consts.DESC_SORTED
* @param reloadGrid <code>true</code> to force grid reloading; <code>false</code> to do not reload grid (for instance when sorting conditions for other columns must be add too)
*/
public final void addSortedColumn(String attributeName,String sortingVersus,boolean reloadGrid) {
if (!sortingVersus.equals(Consts.ASC_SORTED) &&
!sortingVersus.equals(Consts.DESC_SORTED)) {
Logger.error(this.getClass().getName(), "addSortedColumn", "Invalid sorting versus. Allowed values: Consts.ASC_SORTED,Consts.DESC_SORTED", null);
return;
}
if (topTable!=null) {
int colIndex = topTable.getCurrentSortedColumns().indexOf(attributeName);
if (colIndex!=-1) {
topTable.getCurrentSortedColumns().remove(colIndex);
topTable.getCurrentSortedVersusColumns().remove(colIndex);
}
topTable.getCurrentSortedColumns().add(attributeName);
topTable.getCurrentSortedVersusColumns().add(sortingVersus);
topTable.repaint();
if (reloadGrid)
reloadData();
else if (!orderWithLoadData && table!=null) {
table.getGrid().internalSorting();
if (table.getLockedGrid()!=null)
table.getLockedGrid().internalSorting();
}
}
else if (table!=null) {
int colIndex = table.getCurrentSortedColumns().indexOf(attributeName);
if (colIndex!=-1) {
table.getCurrentSortedColumns().remove(colIndex);
table.getCurrentSortedVersusColumns().remove(colIndex);
}
table.getCurrentSortedColumns().add(attributeName);
table.getCurrentSortedVersusColumns().add(sortingVersus);
table.repaint();
if (reloadGrid)
reloadData();
else if (!orderWithLoadData && table!=null) {
table.getGrid().internalSorting();
if (table.getLockedGrid()!=null)
table.getLockedGrid().internalSorting();
}
}
}
/**
* @return <code>true</code> means that grid has to automatically retrieve additional rows in fast search, when search criteria fails
*/
public final boolean isSearchAdditionalRows() {
return searchAdditionalRows;
}
/**
* Define whether enabling the retrieval of additional rows in fast search, when search criteria fails.
* Default value: ClientSettings.SEARCH_ADDITION_ROWS
* @param searchAdditionalRows flag used in grid to enable the retrieval of additional rows in fast search, when search criteria fails
*/
public final void setSearchAdditionalRows(boolean searchAdditionalRows) {
this.searchAdditionalRows = searchAdditionalRows;
}
/**
* @return height of status panel (expressed in pixels)
*/
public final int getStatusPanelHeight() {
return labelPanel.getSize().height;
}
/**
* @return allows the columns sorting in edit mode too; note that this setting is used only when <code>orderWithLoadData</code> property is set to <code>false</code> */
public final boolean isAllowColumnsSortingInEdit() {
return allowColumnsSortingInEdit;
}
/**
* Define whether columns sorting is enabled also in edit mode.
* Note that this setting is used only when <code>orderWithLoadData</code> property is set to <code>false</code>
* @param allowColumnsSortingInEdit allows the columns sorting in edit mode too
*/
public final void setAllowColumnsSortingInEdit(boolean allowColumnsSortingInEdit) {
this.allowColumnsSortingInEdit = allowColumnsSortingInEdit;
}
/**
* @return define where to anchor locked columns: to the left or to the right of the grid; default value: <code>true</code> i.e. to the left
*/
public final boolean isAnchorLockedColumnsToLeft() {
return anchorLockedColumnsToLeft;
}
/**
* Define where to anchor locked columns: to the left or to the right of the grid.
* @param anchorLockedColumnsToLeft <code>true</code> to anchor locked columns the left of the grid
*/
public final void setAnchorLockedColumnsToLeft(boolean anchorLockedColumnsToLeft) {
this.anchorLockedColumnsToLeft = anchorLockedColumnsToLeft;
}
public boolean isAllowColumnsPermission() {
return allowColumnsPermission;
}
public boolean isAllowColumnsProfile() {
return allowColumnsProfile;
}
public void setAllowColumnsPermission(boolean allowColumnsPermission) {
this.allowColumnsPermission = allowColumnsPermission;
}
public void setAllowColumnsProfile(boolean allowColumnsProfile) {
this.allowColumnsProfile = allowColumnsProfile;
}
/**
* Find (starting from the first row) in grid the specified value within the column identified by
* the specified attribute name, using "equalsIgnoreCase" as matching criteria.
* @param attributeName attribute used to identify the column where restricting the search
* @param value value to search
* @return row index having the specified value or -1 in case of search without a result
*/
public final int findNextValue(String attributeName,Object value) {
return findNextValue(attributeName,value,0);
}
/**
* Find in grid the specified value within the column identified by the specified attribute name,
* using "equalsIgnoreCase" as matching criteria.
* @param attributeName attribute used to identify the column where restricting the search
* @param value value to search
* @param startingFromRow row index in grid to use to start the search
* @param findCritera criteria to use with findNextValue method; allowed values: <code>GridControl.FIND_CRITERIA_EQUALS</code>, <code>GridControl.FIND_CRITERIA_EQUALS_IGNORE_CASE</code>, <code>GridControl.FIND_CRITERIA_STARTS_WITH</code>, <code>GridControl.FIND_CRITERIA_STARTS_WITH_IGNORE_CASE</code>, <code>GridControl.FIND_CRITERIA_CONTAINS</code>, <code>GridControl.FIND_CRITERIA_CONTAINS_IGNORE_CASE</code>
* @return row index having the specified value or -1 in case of search without a result
*/
public final int findNextValue(String attributeName,Object value,int startingFromRow) {
return findNextValue(attributeName,value,startingFromRow,GridControl.FIND_CRITERIA_EQUALS_IGNORE_CASE);
}
/**
* Find in grid the specified value within the column identified by the specified attribute name,
* using the matching criteria specified as argument.
* @param attributeName attribute used to identify the column where restricting the search
* @param value value to search
* @param startingFromRow row index in grid to use to start the search
* @param findCritera criteria to use with findNextValue method; allowed values: <code>GridControl.FIND_CRITERIA_EQUALS</code>, <code>GridControl.FIND_CRITERIA_EQUALS_IGNORE_CASE</code>, <code>GridControl.FIND_CRITERIA_STARTS_WITH</code>, <code>GridControl.FIND_CRITERIA_STARTS_WITH_IGNORE_CASE</code>, <code>GridControl.FIND_CRITERIA_CONTAINS</code>, <code>GridControl.FIND_CRITERIA_CONTAINS_IGNORE_CASE</code>
* @return row index having the specified value or -1 in case of search without a result
*/
public final int findNextValue(String attributeName,Object value,int startingFromRow,int findCritera) {
if (startingFromRow>table.getVOListTableModel().getRowCount())
return -1;
int col = table.getVOListTableModel().findColumn(attributeName);
Object obj = null;
for(int i=startingFromRow;i<table.getVOListTableModel().getRowCount();i++) {
obj = table.getVOListTableModel().getValueAt(i, col);
if (obj==null && value==null)
return i;
else if (obj!=null && matchValue(obj.toString(),value.toString(),findCritera))
return i;
}
return -1;
}
private boolean matchValue(String o1,String o2,int findCritera) {
if (findCritera==GridControl.FIND_CRITERIA_EQUALS)
return o1.equals(o2);
else if (findCritera==GridControl.FIND_CRITERIA_EQUALS_IGNORE_CASE)
return o1.equalsIgnoreCase(o2);
else if (findCritera==GridControl.FIND_CRITERIA_STARTS_WITH)
return o1.startsWith(o2);
else if (findCritera==GridControl.FIND_CRITERIA_STARTS_WITH_IGNORE_CASE)
return o1.toUpperCase().startsWith(o2.toUpperCase());
else if (findCritera==GridControl.FIND_CRITERIA_CONTAINS)
return o1.indexOf(o2)!=-1;
else if (findCritera==GridControl.FIND_CRITERIA_CONTAINS_IGNORE_CASE)
return o1.toUpperCase().indexOf(o2.toUpperCase())!=-1;
else {
Logger.error(this.getClass().getName(), "matchValue", "Unsopported search criteria", null);
return false;
}
}
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Inner class used inside GridControl to add column to the columns container.
* Moreover, it add the column to components list (used by JDeveloper UI Designer).</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
* @version 1.0
*/
public class ColumnContainer extends JPanel { /** columns container; used only in design-time */
/**
* Method invoked by UI designers (e.g. NetBeans and Swing Designer in Eclipse) that adds a column via "containerDelegate" property defined in GridControlBeanInfo
* @param comp Component to add, WITHOUT contraint
*/
public final Component add(Component comp) {
super.add(comp,null);
components.add(comp);
return comp;
}
/**
* Method invoked by UI designers (e.g. JDeveloper) that does not correctly use the "containerDelegate" property defined in GridControlBeanInfo
* @param comp Component to add
* @param constraint contraint to use for the component to add
*/
public final void add(Component comp,Object constraint) {
super.add(comp,constraint);
components.add(comp);
}
}
}