public class DataField
{
+ class_no_expansion;
public:
property Class dataType
{
}
};
property int sortOrder { get { return this ? sortOrder : 0; } };
- property char * header
+ property const char * header
{
set
{
{
if(prev != after)
{
- int position = 0;
- DataField field;
-
listBox.fields.Move(this, after);
// Fix up positions
if(cell && cell.isSet && dataType)
{
static char tempString[4096];
- String string;
+ const String string;
int tw = 0;
if(dataType.type == normalClass || dataType.type == noHeadClass)
- string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetString])(dataType, cell.data[0], tempString, userData, null);
+ string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetString])(dataType, cell.data[0], tempString, userData, null);
else
- string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetString])(dataType, cell.data, tempString, userData, null);
+ string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetString])(dataType, cell.data, tempString, userData, null);
if(string)
display.FontExtent(row.header ? boldFont : font, string, strlen(string), &tw, null);
else
}
DataField prev, next;
- char * header;
+ const char * header;
Class dataType;
int width;
uint index;
bool skipCheck;
#endif
public:
- property int64 tag { set { tag = value; } get { return tag; } };
+ property int64 tag { set { if(this) tag = value; } get { return this ? tag : 0; } };
property DataRow previous { get { return prev; } };
property DataRow next { get { return next; } };
property int index { get { return (this && (!parent || parent.IsExpanded())) ? index : -1; } };
- property char * string
+ property const char * string
{
set { SetData(listBox.fields.first, value); }
get { return GetData(listBox.fields.first); }
};
property bool isHeader { set { header = value; } get { return this ? header : false; } };
- property BitmapResource icon { set { icon = value; } get { return icon; } };
+ property BitmapResource icon { set { if(this) icon = value; } get { return this ? icon : null; } };
property bool collapsed
{
set
{
- if(collapsed != value)
+ if(this && collapsed != value)
{
collapsed = value;
if(parent.IsExpanded())
{
DataRow search;
- int index;
+ int ix;
if(value)
{
}
}
- index = this.index+1;
+ ix = index+1;
for(search = GetNextRow(); search; search = search.GetNextRow())
- search.index = index++;
- listBox.rowCount = index;
+ search.index = ix++;
+ listBox.rowCount = ix;
listBox.HideEditBox(false, false, true);
}
}
#ifdef _DEBUG
- if(!skipCheck)
+ if(this && !skipCheck)
listBox.CheckConsistency();
#endif
}
if(listBox && prev != after)
{
DataRow search;
- int afterIndex = -1;
int headerSize = ((listBox.style.header) ? listBox.rowHeight : 0);
int height = listBox.clientSize.h + 1 - headerSize;
int ixCount = (!collapsed && subRows.count) ? GetLastRow().index - index + 1 : 1;
if(!after || after.index < index)
{
- if(after == listBox.firstRowShown.prev)
+ if((after && after == listBox.firstRowShown.prev) || (!after && !parent /*&& listBox.firstRowShown.prev*/))
listBox.firstRowShown = this;
// All rows between AFTER (exclusive) and ROW (exclusive) are incremented by one
// ROW is equal to AFTER's index + 1
- for(search = after ? after.next : listBox.rows.first; search && search != this; search = search.GetNextRow())
+ for(search = after ? after.next : (parent ? parent.subRows.first : listBox.rows.first); search && search != this; search = search.GetNextRow())
search.index += ixCount;
if(after && after.subRows.first && !after.collapsed)
index = search.index + 1;
}
else
- index = after ? (after.index + 1) : 0;
+ index = after ? (after.index + 1) : parent ? parent.index + 1 : 0;
// Fix indices of sub rows
if(!collapsed)
}
else
{
- DataRow nextRow = GetNextRow();
+ DataRow nextRow;
+ int afterIXCount = 1;
+
+ nextRow = GetNextRow();
if(this == listBox.firstRowShown)
listBox.firstRowShown = nextRow;
- index = after.index;
// All rows between ROW (exclusive) and AFTER (inclusive) are decremented by one
// ROW is equal to AFTER's index
search.index -= ixCount;
if(search == after) break;
}
+
+ // Fix up's after's sub rows
+ if(after && !after.collapsed)
+ {
+ DataRow last = after.GetLastRow();
+ if(last != after)
+ {
+ int ix = after.index+1;
+ for(search = after.GetNextRow(); search; search = search.GetNextRow())
+ {
+ afterIXCount++;
+ search.index = ix++;
+ if(search == last) break;
+ }
+ }
+ }
+ index = after.index + afterIXCount;
+
+ // Fix indices of sub rows
+ if(!collapsed)
+ {
+ int c, ix = index+1;
+ for(c = 1, search = GetNextRow(); search && c < ixCount; c++, search = search.GetNextRow())
+ search.index = ix++;
+ }
}
- listBox.rows.Move(this, after);
+ (parent ? parent.subRows : listBox.rows).Move(this, after);
#ifdef _DEBUG
listBox.CheckConsistency();
if((field.dataType.type == normalClass || field.dataType.type == noHeadClass))
return cell.data[0];
else
- return (void *)cell.data; // Cast for MemoryGuard
+ return cell.data;
}
}
return null;
listBox.modifiedDocument = true;
listBox.Update(null);
if(dataType && (dataType.type == normalClass || dataType.type == noHeadClass))
- return (void *)cell.data; // Cast for MemoryGuard
+ return cell.data;
else
return &cell.data;
}
(sizeof(class ListBoxCell) + field.dataType.typeSize - sizeof(void *)) : sizeof(class ListBoxCell);
ListBoxCell cell = (ListBoxCell)new0 byte[size];
row.cells.Add(cell);
- FillBytes(cell.data, 0, size - (uint)&((ListBoxCell)0).data);
+ FillBytes(cell.data, 0, size - (uint)(uintptr)&((ListBoxCell)0).data);
cell.isSet = false;
}
}
return null;
}
- DataRow AddStringf(char * format, ...)
+ DataRow AddStringf(const char * format, ...)
{
if(this)
{
return null;
}
- DataRow AddString(char * string)
+ DataRow AddString(const char * string)
{
if(this)
{
private:
DataRow()
{
- subRows.offset = (uint)&((DataRow)0).prev;
+ subRows.offset = (uint)(uintptr)&((DataRow)0).prev;
}
~DataRow()
{
DataRow search;
- int index = this.index;
+ int ix = index;
for(search = this; search; search = search.GetNextRow())
- search.index = index++;
+ search.index = ix++;
}
if(scrollToCurrent)
{
public:
// Properties
property bool freeSelect { property_category $"Behavior" set { style.freeSelect = value; } get { return style.freeSelect; } };
- property DataRow currentRow { property_category $"Private" /*"Behavior"*/ set { SetCurrentRow(value, false); } get { return currentRow; } };
+ property DataRow currentRow { property_category $"Private" /*"Behavior"*/ set { if(this) SetCurrentRow(value, false); } get { return this ? currentRow : null; } };
property DataField currentField
{
get { return currentField; }
OnApplyGraphics();
}
}
- get { return rowHeight; }
+ get { return this ? rowHeight : 0; }
};
property Seconds typingTimeout
{
virtual bool Window::NotifyKeyHit(ListBox listBox, DataRow row, Key key, unichar ch);
virtual bool Window::NotifyModified(ListBox listBox, DataRow row);
virtual bool Window::NotifyEditing(ListBox listBox, DataRow row);
+ virtual void Window::NotifyMoved(ListBox listBox, DataRow row, Modifiers mods);
#ifdef _DEBUG
private void CheckConsistency()
stayOnTop = true;
inactive = true;
dontScrollVert = true;
- id = (uint64)addedField;
+ id = (int64)(intptr)addedField;
text = addedField.header;
bevel = (!guiApp.textMode && !style.clearHeader);
ellipsis = true;
(sizeof(class ListBoxCell) + field.dataType.typeSize - sizeof(void *)) : sizeof(class ListBoxCell);
ListBoxCell cell = (ListBoxCell)new0 byte[size];
row.cells.Add(cell);
- FillBytes(cell.data, 0, size - (uint)&((ListBoxCell)0).data);
+ FillBytes(cell.data, 0, size - (uint)(uintptr)&((ListBoxCell)0).data);
cell.isSet = false;
if(row.subRows.first)
if(row)
{
DataRow search;
- DataField field;
- int c;
row.index = 0;
rows.Insert(null, row);
for(search = row.GetNextRow(); search; search = search.GetNextRow())
search.index++;
- this.rowCount++;
+ rowCount++;
row.cells.Clear();
firstRowShown = row;
// Find very last row
{
DataRow lastRow;
- for(lastRow = rows.last; lastRow && !lastRow.collapsed && lastRow.subRows.last; lastRow)
- lastRow = lastRow.subRows.last;
+ for(lastRow = rows.last; lastRow && !lastRow.collapsed && lastRow.subRows.last; lastRow = lastRow.subRows.last);
row.index = lastRow ? (lastRow.index + 1) : 0;
}
(sizeof(class ListBoxCell) + field.dataType.typeSize - sizeof(void *)) : sizeof(class ListBoxCell);
ListBoxCell cell = (ListBoxCell) new0 byte[size];
row.cells.Add(cell);
- FillBytes(cell.data, 0, size - (uint)&((ListBoxCell)0).data);
+ FillBytes(cell.data, 0, size - (uint)(uintptr)&((ListBoxCell)0).data);
cell.isSet = false;
}
}
for(search = row.GetNextRow(); search; search = search.GetNextRow())
search.index++;
- this.rowCount++;
+ rowCount++;
row.cells.Clear();
for(c = 0; c<fields.count; c++)
{
(sizeof(class ListBoxCell) + field.dataType.typeSize - sizeof(void *)) : sizeof(class ListBoxCell);
ListBoxCell cell = (ListBoxCell) new0 byte[size];
row.cells.Add(cell);
- FillBytes(cell.data, 0, size - (uint)&((ListBoxCell)0).data);
+ FillBytes(cell.data, 0, size - (uint)(uintptr)&((ListBoxCell)0).data);
cell.isSet = false;
}
}
return null;
}
- DataRow AddStringf(char * format, ...)
+ DataRow AddStringf(const char * format, ...)
{
if(this)
{
return null;
}
- DataRow AddString(char * string)
+ DataRow AddString(const char * string)
{
if(this)
{
{
for(search = row.GetNextRow(); search; search = search.GetNextRow())
search.index--;
- this.rowCount--;
+ rowCount--;
}
HideEditBox(false, false, true);
//HideEditBox(false, false, true);
SetScrollArea(
- this.width,
- (this.rowCount * rowHeight) +
+ width,
+ (rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((!((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
return null;
}
- DataRow FindString(char * searchedString)
+ DataRow FindString(const char * searchedString)
{
DataField field;
bool checkNextField = true;
- int len = searchedString ? strlen(searchedString) : 0;
for(field = fields.first; field; field = field.next)
{
void * data = row.GetData(field);
char tempString[1024] = "";
bool needClass = false;
- char * string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
+ const char * string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
if(string && string[0])
checkNextField = false;
return null;
}
- DataRow FindSubString(char * subString)
+ DataRow FindSubString(const char * subString)
{
DataField field;
bool checkNextField = true;
void * data = row.GetData(field);
char tempString[1024] = "";
bool needClass = false;
- char * string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
+ const char * string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
if(string && string[0])
checkNextField = false;
return null;
}
- DataRow FindSubStringi(char * subString)
+ DataRow FindSubStringi(const char * subString)
{
DataField field;
bool checkNextField = true;
int len = subString ? strlen(subString) : 0;
DataRow result = null;
- char * bestResult = null;
+ const char * bestResult = null;
int bestLen = 0;
if(len)
void * data = row.GetData(field);
char tempString[1024] = "";
bool needClass = false;
- char * string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
+ const char * string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
if(string && string[0])
checkNextField = false;
return result;
}
- DataRow FindSubStringAfter(DataRow after, char * subString)
+ DataRow FindSubStringAfter(DataRow after, const char * subString)
{
DataField field;
bool checkNextField = true;
void * data = row.GetData(field);
char tempString[1024] = "";
bool needClass = false;
- char * string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
+ const char * string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass);
if(string && string[0])
checkNextField = false;
currentRow.Edit(currentField);
- this.rowCount = 0;
+ rowCount = 0;
SetScrollArea(
- this.width,
- (this.rowCount * rowHeight) +
+ width,
+ (rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((rowHeight && !((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
Update(null);
ListBox()
{
DataField defaultField { };
- rows.offset = (uint)&((DataRow)0).prev;
- fields.offset = (uint)&((DataField)0).prev;
+ rows.offset = (uint)(uintptr)&((DataRow)0).prev;
+ fields.offset = (uint)(uintptr)&((DataField)0).prev;
style.fullRowSelect = true;
style.fillLastField = true;
style.expandOnAdd = true;
{
if(editData && editData.visible)
{
- Class dataType = currentField.dataType;
if(save)
editData.SaveData();
*/
PopupEditBox(currentField, repositionOnly);
}
- else
- printf("");
/*else
currentField = null;*/
void SetCurrentRow(DataRow row, bool notify)
{
- if(currentRow != row || (currentRow && currentRow.selectedFlag == unselected))
+ if(this && (currentRow != row || (currentRow && currentRow.selectedFlag == unselected)))
{
int headerSize = ((style.header) ? rowHeight : 0);
int height = clientSize.h + 1 - headerSize;
int height = rowHeight - (style.alwaysEdit ? 1 : 0);
int x = 0;
int y = currentRow.index * rowHeight + (style.header ? rowHeight : 0);
- int width;
+ int width = 0;
DataField field;
if(style.collapse && !(style.treeBranch))
int height = rowHeight - (style.alwaysEdit ? 1 : 0);
int x = 0;
int y = currentRow.index * rowHeight + (style.header ? rowHeight : 0);
- int width;
+ int width = 0;
//void * data = currentRow.GetData(whichField);
DataField field;
DataRow row = null;
background = dataBoxBackground;
foreground = dataBoxForeground;
- bool NotifyChanged(bool closingDropDown)
+ bool NotifyChanged(DataBox dataBox, bool closingDropDown)
{
DataRow row = null;
DataField field = null;
Font font = fontObject;
Font boldFont = this.boldFont.font;
-
// Draw gray grid
if(style.alwaysEdit && style.fullRowSelect)
{
int indent = 0;
DataRow parent;
Bitmap icon = row.icon ? row.icon.bitmap : null;
- int collapseRowStart;
+ int collapseRowStart = 0;
bool lastWasHeader = row.header;
for(parent = row.parent; parent; parent = parent.parent)
Color colors[] = { formColor, azure, mistyRose, linen, floralWhite, lavender, lavenderBlush, lemonChiffon };
int level = 0;
DataRow p = row;
- while(p = p.parent) level++;
- background = colors[(level % (sizeof(colors)/sizeof(colors[0]))];
+ while((p = p.parent)) level++;
+ background = colors[level % (sizeof(colors)/sizeof(colors[0]))];
surface.SetBackground(background);
surface.Area(rowStart, y, clientSize.w, (y + rowHeight) - 1);
foreground = branchesColor;
surface.SetForeground(foreground);
surface.SetBackground(background);
- ((void (*)(void *, void *, void *, int, int, int, void *, uint, uint))(void *)class(String)._vTbl[__ecereVMethodID_class_OnDisplay])(class(String), "(none)", surface, x, y - 1 + (rowHeight - fontH)/2, width - EXTRA_SPACE/2, null, Alignment::left, dataDisplayFlags);
+ ((void (*)(void *, const void *, void *, int, int, int, void *, uint, uint))(void *)class(String)._vTbl[__ecereVMethodID_class_OnDisplay])(class(String), "(none)", surface, x, y - 1 + (rowHeight - fontH)/2, width - EXTRA_SPACE/2, null, Alignment::left, dataDisplayFlags);
}
else
{
- if(!opacity) surface.TextOpacity(false);
+ if(opacity < 1) surface.TextOpacity(false);
// Draw the rows
for(field = fields.first; field; field = field.next)
{
foreground = this.background;
}
+#ifdef _DEBUG
+ // surface.WriteTextf(x + 100, y, "ix: %d", row.index);
+#endif
+
x += width;// + EXTRA_SPACE;
if(row.header) break;
break;
}
if(firstRowShown) surface.Clip(null);
- if(this.dragRow && this.dropIndex != -1)
+ if(dragRow && dropIndex != -1)
{
- int dropIndex = this.dropIndex;
+ int ix = dropIndex;
int y;
- if(!style.multiSelect && currentRow.index < this.dropIndex)
- dropIndex++;
+ if(!style.multiSelect && currentRow.index < dropIndex)
+ ix++;
surface.DrawingChar(223);
y = style.header ? rowHeight : 0;
- y += dropIndex * rowHeight - scroll.y;
+ y += ix * rowHeight - scroll.y;
surface.SetForeground(Color { 85, 85, 255 });
surface.HLine(0, clientSize.w-1, y);
void OnDrawOverChildren(Surface surface)
{
- if(draggingField && this.dropField)
+ if(draggingField && dropField)
{
- int position = this.dropField.x;
+ int position = dropField.x;
if(draggingField.x < position)
- position += this.dropField.width + EXTRA_SPACE;
+ position += dropField.width + EXTRA_SPACE;
surface.SetForeground(Color { 85, 85, 255 });
surface.VLine(0, rowHeight - 1, position - scroll.x - 2);
bool HeaderPushed(Button control, int x, int y, Modifiers mods)
{
- DataField field = (DataField)control.id;
+ DataField field = (DataField)(intptr)control.id;
// false: dont destroy edit box
HideEditBox(true, false, true);
if(style.resizable && ((!field && x < RESIZE_BORDER && fields.last) ||
if(field.fixed) return false;
resizingField = field;
- this.resizeX = x + control.position.x;
- this.startWidth = field.width;
- this.oldX = x - scroll.x;
+ resizeX = x + control.position.x;
+ startWidth = field.width;
+ oldX = x - scroll.x;
return false;
}
else if(field)
x += control.position.x;
// Tweak to prevent shrinking field if we're actually moving right
- if(x - scroll.x > this.oldX &&
- this.startWidth + x - this.resizeX < field.width)
+ if(x - scroll.x > oldX &&
+ startWidth + x - resizeX < field.width)
{
- this.oldX = x - scroll.x;
+ oldX = x - scroll.x;
return true;
}
- this.oldX = x - scroll.x;
+ oldX = x - scroll.x;
- field.width = this.startWidth + x - this.resizeX;
+ field.width = startWidth + x - resizeX;
field.width = Max(field.width, - EXTRA_SPACE);
AdaptToFieldWidth(field, true);
SetScrollPosition(field.x, scroll.y);
field = null;
}
- if(this.dropField != field)
+ if(dropField != field)
{
- this.dropField = field;
+ dropField = field;
if(field)
{
int position = field.x;
SetScrollPosition(position, scroll.y);
}
- this.movingFields = true;
+ movingFields = true;
}
Update(null);
}
}
else if(style.resizable)
{
- DataField field = (DataField)control.id;
+ DataField field = (DataField)(intptr)control.id;
if(field)
{
if(x < RESIZE_BORDER && field.prev)
break;
}
}
- if(switchField && draggingField != switchField && this.dropField)
+ if(switchField && draggingField != switchField && dropField)
{
for(field = fields.first; field; field = field.next)
{
bool HeaderClicked(Button control, int x, int y, Modifiers mods)
{
- if(style.header && !this.dropField && style.sortable)
+ if(style.header && !dropField && style.sortable)
{
- DataField field = (DataField)control.id;
+ DataField field = (DataField)(intptr)control.id;
if(sortField == field)
field.sortOrder *= -1;
else
{
if(style.resizable)
{
- DataField field = (DataField)control.id;
+ DataField field = (DataField)(intptr)control.id;
if(field)
{
if(x < RESIZE_BORDER && field.prev)
if(!visible)
{
ReleaseCapture();
- this.rolledOver = this.dragging = false;
+ rolledOver = dragging = false;
}
/*else
Capture();*/
if(cell && cell.isSet && field.dataType)
{
static char tempString[4096];
- char * string;
+ const char * string;
int tw, th;
if(field.dataType.type == normalClass || field.dataType.type == noHeadClass)
- string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, cell.data[0], tempString, field.userData, null);
+ string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, cell.data[0], tempString, field.userData, null);
else
- string = ((char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, cell.data, tempString, field.userData, null);
+ string = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, cell.data, tempString, field.userData, null);
/* GCC-4.4 Bug!
if(!string) string = "";
display.FontExtent(row.header ? boldFont : font, string, strlen(string), &tw, &th);
}
if(!*h)
{
- *h = Min(this.maxShown, this.rowCount) * rowHeight;
+ *h = Min(maxShown, rowCount) * rowHeight;
}
}
else
{
// Resize left
DataField field = resizingField;
- field.width = this.startWidth + x - this.resizeX;
+ field.width = startWidth + x - resizeX;
field.width = Max(field.width, - EXTRA_SPACE);
AdaptToFieldWidth(field, true);
if(x == MAXINT && y == MAXINT)
{
- x = this.mouseX;
- y = this.mouseY;
+ x = mouseX;
+ y = mouseY;
isTimer = true;
}
// ADDED THIS CHECK FOR FieldDropBox LEAKS
- if(/*!mods.isSideEffect && */(this.rolledOver || !this.dragging))
+ if(/*!mods.isSideEffect && */(rolledOver || !dragging))
{
int rowY = (style.header) ? rowHeight : 0;
- DataRow row = null;
+ DataRow row = null, nextRow;
int rowIndex;
mouseX = x;
mouseY = y;
- if(this.dragging &&
+ if(dragging &&
((vertScroll && vertScroll.visible &&
(y < 0 || y >= clientSize.h)) ||
(horzScroll && horzScroll.visible &&
// This must be done after the scrolling took place
rowIndex = firstRowShown ? firstRowShown.index : -1;
y = Max(y, 0);
- y = Min(y, clientSize.h-1);
- for(row = firstRowShown; row; row = row.GetNextRow(), rowIndex ++)
+ y = Min(y, clientSize.h-rowHeight-1);
+ for(row = firstRowShown; row; row = nextRow, rowIndex ++)
{
+ nextRow = row.GetNextRow();
rowY += rowHeight;
- if(rowY > y)
+ if(rowY > y || !nextRow)
{
break;
}
}
+ if(dragRow && style.moveRows)
+ {
+ if(row && row == currentRow)
+ row = row.GetNextRow();
+
+ if(row && row.parent == currentRow)
+ row = row.GetNextRow();
+ }
+
if(row && currentRow != row)
{
- if(this.dragRow && style.moveRows)
+ if(dragRow && style.moveRows)
{
if(row.selectedFlag == selected || row.selectedFlag == tempSelected)
rowIndex = -1;
if(thisRow != row)
rowIndex++;
}
- if(this.dropIndex != rowIndex)
+ if(dropIndex != rowIndex)
{
- this.dropIndex = rowIndex;
- this.editRow = null;
+ dropIndex = rowIndex;
+ editRow = null;
Update(null);
- this.movedRow = true;
+ movedRow = true;
}
}
- else if((style.freeSelect || this.dragging) && ((realX>= 0 && realY >= 0 && realX< clientSize.w && realY < clientSize.h) || this.rolledOver))
+ else if((style.freeSelect || dragging) && ((realX>= 0 && realY >= 0 && realX< clientSize.w && realY < clientSize.h) || rolledOver))
{
if(!(style.multiSelect))
{
bool OnMouseOver(int x, int y, Modifiers mods)
{
- if(this.dragging)
- this.rolledOver = true;
+ if(dragging)
+ rolledOver = true;
return true;
}
if(Abs(x - vx) < 2)
{
resizingField = field.prev;
- this.resizeX = x;
- this.startWidth = resizingField.width;
+ resizeX = x;
+ startWidth = resizingField.width;
Capture();
SetMouseRangeToClient();
break;
int rowIndex = firstRowShown ? firstRowShown.index : -1;
DataRow previousRow = currentRow;
DataRow newCurrentRow = null;
- DataField newCurrentField = null;
bool moveMultiple = false;
int numSelected = 0;
int rowStart = -scroll.x;
for(selRow = rows.first; selRow; selRow = selRow.GetNextRow())
selRow.selectedFlag = unselected;
clickedRow = row;
- //this.clickedRowIndex = rowIndex;
+ //clickedRowIndex = rowIndex;
}
else if(style.moveRows && !(mods.shift) &&
(row.selectedFlag == selected || row.selectedFlag == tempSelected) &&
row.selectedFlag = selected;
}
clickedRow = row;
- //this.clickedRowIndex = rowIndex;
+ //clickedRowIndex = rowIndex;
}
else
{
else
row.selectedFlag = tempSelected;
clickedRow = row;
- //this.clickedRowIndex = rowIndex;
+ //clickedRowIndex = rowIndex;
}
}
}
{
if(style.moveRows)
{
- this.dragRow = currentRow;
- this.dropIndex = -1;
- this.movedRow = false;
+ dragRow = currentRow;
+ dropIndex = -1;
+ movedRow = false;
+
+ Capture();
}
if(editData && editData.visible && style.alwaysEdit)
{
}
}
else if(!(mods.ctrl) && numSelected <= 1)
- this.editRow = currentRow;
+ editRow = currentRow;
if(style.noDragging && newCurrentRow)
NotifyReclick(master, this, newCurrentRow, mods);
// activate it
if(editData && editData.visible && newCurrentRow)
{
- DataField field, whichField;
+ DataField field;
int sx = -scroll.x;
int indent = 0;
if(style.collapse && !(style.treeBranch))
sx += 15;
- whichField = currentField;
-
{
DataRow parent;
for(parent = newCurrentRow.parent; parent; parent = parent.parent)
{
if(!style.noDragging)
{
- this.dragging = true;
+ dragging = true;
Capture();
}
if(x >= 0 && y >= 0 && x < clientSize.w && y < clientSize.h)
- this.rolledOver = true;
+ rolledOver = true;
Update(null);
}
else
{
- this.dragging = false;
+ dragging = false;
OnLeftButtonUp(x, y, mods);
}
return result;
{
DataRow row, switchRow = rows.last;
int rowY = (style.header) ? rowHeight : 0;
+ while(switchRow.lastRow) switchRow = switchRow.lastRow;
for(row = firstRowShown; row; row = row.GetNextRow())
{
rowY += rowHeight;
break;
}
}
- if(this.editRow == switchRow && y >= 0)
+ if(editRow == switchRow && y >= 0)
{
// Find which field
DataField field;
}
else if(style.moveRows && switchRow)
{
- if(this.dragRow == switchRow && this.movedRow == false)
+ if(dragRow == switchRow && movedRow == false)
{
- DataRow row = this.dragRow;
+ DataRow row = dragRow;
DataRow selRow;
if(!(mods.ctrl))
{
{
for(row = rows.first; row; row = row.GetNextRow())
{
- if(row == switchRow || row == this.dragRow)
+ if(row == switchRow || row == dragRow)
break;
}
// Switch row first: move before
if(row == switchRow)
{
- if(NotifyMove(master, this, switchRow.prev, mods))
- dragRow.Move(switchRow.prev);
+ DataRow actualMoveRow;
+
+ if(!switchRow.prev && switchRow.parent == dragRow.parent)
+ actualMoveRow = null;
+ else
+ {
+ actualMoveRow = switchRow.prev ? switchRow.prev : switchRow;
+ while(actualMoveRow && actualMoveRow.parent != dragRow.parent && actualMoveRow.parent)
+ actualMoveRow = actualMoveRow.parent;
+ }
+
+ if(!actualMoveRow || (actualMoveRow && actualMoveRow.parent == dragRow.parent))
+ if(NotifyMove(master, this, actualMoveRow, mods))
+ {
+ dragRow.Move(actualMoveRow);
+ NotifyMoved(master, this, actualMoveRow, mods);
+ }
}
// Dragged row first: move after
else
{
- if(NotifyMove(master, this, switchRow, mods))
- dragRow.Move(switchRow);
+ DataRow actualMoveRow = switchRow;
+ DataRow nextRow = switchRow.GetNextRow();
+
+ while(nextRow && nextRow.parent != dragRow.parent)
+ nextRow = nextRow.parent ? nextRow.parent.next : null;
+ if(nextRow)
+ actualMoveRow = nextRow.prev;
+
+ if(!nextRow)
+ actualMoveRow = dragRow.parent ? dragRow.parent.subRows.last : rows.last;
+
+ if(!actualMoveRow || (actualMoveRow != dragRow && actualMoveRow.parent == dragRow.parent))
+ if(NotifyMove(master, this, actualMoveRow, mods))
+ {
+ dragRow.Move(actualMoveRow);
+ NotifyMoved(master, this, actualMoveRow, mods);
+ }
}
}
}
}
+ if(dragRow)
+ ReleaseCapture();
dragRow = null;
editRow = null;
movedRow = false;
}
timer.Stop();
- if(this.dragging || style.freeSelect)
+ if(dragging || style.freeSelect)
{
- if(this.dragging)
+ if(dragging)
{
- this.rolledOver = this.dragging = false;
+ rolledOver = dragging = false;
}
if(x >= 0 && y >= 0 && x < clientSize.w && y < clientSize.h && currentRow && style.freeSelect)
{
void * data = row.GetData(field);
char tempString[1024] = "";
bool needClass = false;
- char * string = data ? ((char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass) : null;
+ const char * string = data ? ((const char *(*)(void *, void *, char *, void *, bool *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString])(field.dataType, data, tempString, null, &needClass) : null;
if(string && string[0])
checkNextField = false;
if(style.multiSelect)
{
DataRow selRow;
- bool foundRow = false;
- //this.clickedRowIndex = 0;
clickedRow = row;
for(selRow = rows.first; selRow; selRow = selRow.GetNextRow())
- {
- if(selRow == row) foundRow = true;
selRow.selectedFlag = unselected;
- //if(!foundRow) this.clickedRowIndex++;
- }
row.selectedFlag = selected;
}
SetCurrentRow(row, true);
looped = true;
}
typingTimer.Stop();
- if(this.typingTimeOut && !keyHit)
+ if(typingTimeOut && !keyHit)
typingTimer.Start();
- if(!result || !this.typingTimeOut || keyHit)
+ if(!result || !typingTimeOut || keyHit)
typedString[len-1] = '\0';
}
if(!checkNextField || result) break;
}
else if(key == escape)
{
- if(resizingField || this.movingFields || (editData && editData.visible) || this.dragRow)
+ if(resizingField || movingFields || (editData && editData.visible) || dragRow)
{
if(editData && editData.visible && style.alwaysEdit && !editData.active)
return true;
HideEditBox(false, false, false);
if(resizingField)
{
- resizingField.width = this.startWidth;
+ resizingField.width = startWidth;
AdaptToFieldWidth(resizingField, true);
resizingField = null;
ReleaseCapture();
}
- this.dragRow = null;
- if(this.dragging)
+ if(dragRow)
+ ReleaseCapture();
+
+ dragRow = null;
+ if(dragging)
{
- this.dragging = false;
+ dragging = false;
ReleaseCapture();
}
- this.movingFields = false;
+ movingFields = false;
draggingField = null;
Update(null);
return false;