Well a while ago I posted a thread on the Infragistics forums and didn't even get a peep from any Infragistics people. So I took it upon myself to fix the issue. I tracked down the suspect client-side code and modified it so that the Apple key could be used for multi-selecting rows in an UltraWebGrid.
I use jQuery's $(document).ready to apply the fix, but use your own favorite client-side framework to apply the fix. I didn't bother trying to recompile the Infragistics assemblies with the updated client-side embedded resource. This just seemed easier.
Here's the fix.
window["igtbl_cellClickDown"] = function(evnt, gn)
{
var gs = igtbl_getGridById(gn);
if (!gs || gs.isDisabled())
return;
gs.event = evnt;
igtbl_lastActiveGrid = gn;
gs._mouseDown = 1;
gs.Element.setAttribute("mouseDown", "1");
var se = igtbl_srcElement(evnt);
if (!se || se.tagName == "IMG" && se.getAttribute("imgType") == "expand")
return;
if ('' + se.contentEditable == 'true')
return;
igtbl_filterMouseUpDocument();
if (!se || se == gs._editorCurrent) return;
if ((se.id == gn + "_vl") || (se.parentNode && se.parentNode.id == gn + "_vl")) { if (gs._focusElem) ig_cancelEvent(evnt); return; }
if (se.id == gn + "_tb" || se.id == gn + "_ta")
return;
var sel = igtbl_getElementById(gn + "_vl");
if (sel && sel.style.display == "" && sel.getAttribute("noOnBlur"))
return igtbl_cancelEvent(evnt);
var parentCell = igtbl_getParentCell(se);
if (!ig_csom.IsNetscape6 || !((se.tagName == "INPUT" && se.type == "text" || se.tagName == "TEXTAREA") && parentCell && (parentCell.Column.TemplatedColumn & 2)))
ig_cancelEvent(evnt);
var se = igtbl_dom.find.parentByTag(se, ["TD", "TH"]);
if (!se)
return;
var row;
var cell = igtbl_getCellByElement(se);
var id = gs._mouseID = se.id;
if (cell)
{
row = cell.Row;
id = cell.Element.id;
}
else row = igtbl_getRowById(id);
if (!row && !cell) return;
var fac = row.Band.firstActiveCell;
if (igtbl_fireEvent(gn, gs.Events.MouseDown, "(\"" + gn + "\",\"" + id + "\"," + igtbl_button(gn, evnt) + ")") == true)
{
igtbl_cancelEvent(evnt);
return true;
}
var band = row.Band;
var bandNo = band.Index;
if (igtbl_hideEdit(gn) && !((band.getSelectTypeCell() == 2 || band.getSelectTypeCell() == 3) && band.getCellClickAction() == 1 && cell && !cell.getSelected())) return;
if (igtbl_button(gn, evnt) == 0 && !cell && igtbl_getOffsetY(evnt, se) > igtbl_clientHeight(se) - 4 && igtbl_getRowSizing(gn, bandNo, row.Element) == 2 && !se.getAttribute("groupRow"))
{
gs.Element.setAttribute("elementMode", "resize");
gs.Element.setAttribute("resizeRow", row.Element.id);
row.Element.style.height = row.Element.offsetHeight;
ig_csom.addEventListener(document, "mousemove", igtbl_resizeRowMouseMove);
ig_csom.addEventListener(document, "mouseup", igtbl_resizeRowMouseUp);
}
else
{
var te = gs.Element;
var workTableId;
if (
(row.IsAddNewRow
|| row.IsFilterRow
) && row.Band.Index == 0)
workTableId = gs.Element.id;
else
if (se.getAttribute("groupRow"))
workTableId = se.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;
else
workTableId = row.Element.parentNode.parentNode.id;
if (igtbl_button(gn, evnt) != 0)
return;
if (workTableId == "")
return;
te.removeAttribute("lastSelectedCell");
var prevSelRow = gs.SelectedRows[igtbl_getWorkRow(row.Element, gn).id];
if (prevSelRow && igtbl_getLength(gs.SelectedRows) > 1)
prevSelRow = false;
var selPresent = (igtbl_getLength(gs.SelectedCells) > 0 ? 1 : 0) | (igtbl_getLength(gs.SelectedRows) > 0 ? 2 : 0) | (igtbl_getLength(gs.SelectedCols) > 0 ? 4 : 0);
if (se.getAttribute("groupRow") || !cell || igtbl_getCellClickAction(gn, bandNo) == 2)
{
if (!(igtbl_getSelectTypeRow(gn, bandNo) == 3 && (evnt.ctrlKey || evnt.metaKey)) && !(row.getSelected() && igtbl_getLength(gs.SelectedRows) == 1))
igtbl_clearSelectionAll(gn);
}
else
{
if (!(igtbl_getSelectTypeCell(gn, bandNo) == 3 && (evnt.ctrlKey || evnt.metaKey)) && !(cell.getSelected() && igtbl_getLength(gs.SelectedCells) == 1))
igtbl_clearSelectionAll(gn);
}
gs.Element.setAttribute("elementMode", "select");
if (se.getAttribute("groupRow"))
{
te.setAttribute("selectTable", se.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id);
te.setAttribute("selectMethod", "row");
}
else
{
te.setAttribute("selectTable", workTableId);
if (!cell || igtbl_getCellClickAction(gn, bandNo) == 2)
te.setAttribute("selectMethod", "row");
else
te.setAttribute("selectMethod", "cell");
}
if (te.getAttribute("shiftSelect") && evnt.shiftKey)
igtbl_selectRegion(gn, se);
else
{
if (!cell || igtbl_getCellClickAction(gn, bandNo) == 2 || se.getAttribute("groupRow"))
{
var seRow = igtbl_getRowById(row.Element.id);
if (gs.SelectedRows[row.Element.id] && (evnt.ctrlKey || evnt.metaKey))
{
igtbl_selectRow(gn, seRow, false);
gs.setActiveRow(seRow);
}
else
{
var showEdit = true;
if (!gs._exitEditCancel)
{
if (gs.Activation.AllowActivation)
{
var ar = gs.oActiveRow;
if (ar != seRow)
{
gs.setActiveRow(seRow);
showEdit = false;
}
else
showEdit = true;
}
if (igtbl_getSelectTypeRow(gn, bandNo) > 1)
igtbl_selectRow(gn, seRow, true, !prevSelRow);
if (showEdit && !se.getAttribute("groupRow") && row)
row.editRow();
}
}
}
else
{
if (cell.getSelected() && (evnt.ctrlKey || evnt.metaKey))
{
cell.select(false);
cell.activate();
}
else
{
if (band.getSelectTypeCell() > 1 && band.getCellClickAction() >= 1 && !gs._exitEditCancel)
cell.select();
else if (selPresent)
{
var gsNPB = gs.NeedPostBack;
igtbl_fireEvent(gn, gs.Events.AfterSelectChange, "(\"" + gn + "\",\"" + id + "\");");
if (!gsNPB && !(gs.Events.AfterSelectChange[1] & selPresent))
gs.NeedPostBack = false;
}
cell.activate();
}
}
if (se.getAttribute("groupRow"))
te.setAttribute("startPointRow", se.parentNode.parentNode.parentNode.parentNode.parentNode.id);
else
te.setAttribute("startPointRow", row.Element.id);
te.setAttribute("startPointCell", id);
te.removeAttribute("shiftSelect");
if ((!evnt.ctrlKey && !evnt.metaKey))
te.setAttribute("shiftSelect", true);
}
}
if (typeof (igtbl_currentEditTempl) != "undefined" && igtbl_currentEditTempl != null)
igtbl_gRowEditMouseDown(evnt);
if (typeof (igcmbo_currentDropped) != "undefined" && igcmbo_currentDropped != null)
igcmbo_mouseDown(evnt);
}
});