private:
-public class DataField
+public class DataField
{
public:
property Class dataType
get { return dataType; }
}
property bool editable { set { editable = value; } };
+ property bool fixed { set { fixed = value; } get { return fixed; } };
property Alignment alignment
{
set
}
};
property int sortOrder { get { return this ? sortOrder : 0; } };
- property char * header
+ property const char * header
{
set
{
set
{
userData = value;
- }
+ }
get
{
return this ? userData : null;
};
property bool freeData
{
- set { freeData = value; } get { return freeData; }
+ set { freeData = value; } get { return freeData; }
};
property DataField prev { get { return prev; } };
property DataField next { get { return next; } };
{
if(prev != after)
{
- int position = 0;
- DataField field;
-
listBox.fields.Move(this, after);
// Fix up positions
Font font = listBox.fontObject;
DataRow row;
int width = 0;
+ if(header)
+ display.FontExtent(boldFont, header, strlen(header), &width, null);
+ width += EXTRA_SPACE;
for(row = listBox.firstRow; row; row = row.GetNextRow())
{
ListBoxCell cell;
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 *)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 *)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
listBox.fields.Remove(this);
for(field = listBox.fields.first; field; field = field.next)
{
- if(field.index >= index)
+ if(field.index >= index)
field.index--;
}
if(listBox.currentField == this)
- listBox.currentField = null;
+ listBox.currentField = null;
listBox.numFields--;
listBox.OnResize(listBox.clientSize.w, listBox.clientSize.h);
listBox = null;
}
DataField prev, next;
- char * header;
+ const char * header;
Class dataType;
int width;
uint index;
bool defaultField;
void * userData;
bool freeData;
+ bool fixed;
};
public class DataRow
bool skipCheck;
#endif
public:
- property int 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())
if(!listBox.clickedRow)
listBox.clickedRow = this;
}
- if(listBox.currentRow && !listBox.currentRow.parent.IsExpanded())
+ if(listBox.currentRow && !listBox.currentRow.parent.IsExpanded())
{
listBox.SetCurrentRow(this, true);
}
- if(listBox.firstRowShown && !listBox.firstRowShown.parent.IsExpanded())
+ if(listBox.firstRowShown && !listBox.firstRowShown.parent.IsExpanded())
{
listBox.firstRowShown = GetPrevRow();
if(!listBox.firstRowShown)
listBox.SetScrollArea(
listBox.width,
- (listBox.rowCount * listBox.rowHeight) +
+ (listBox.rowCount * listBox.rowHeight) +
((listBox.style.header) ? listBox.rowHeight : 0) -
((!((listBox.clientSize.h+1) % listBox.rowHeight)) ? listBox.rowHeight : 0), true);
listBox.Update(null);
}
}
#ifdef _DEBUG
- if(!skipCheck)
+ if(this && !skipCheck)
listBox.CheckConsistency();
#endif
}
listBox.HideEditBox(false, false, true);
/*
- if(this == listBox.clickedRow)
+ if(this == listBox.clickedRow)
{
listBox.clickedRow = GetNextRow();
if(!listBox.clickedRow)
listBox.clickedRow = GetPrevRow();
}
- if(this == listBox.currentRow)
+ if(this == listBox.currentRow)
{
DataRow newCurrentRow = GetNextRow();
if(!listBox.newCurrentRow)
listBox.SetCurrentRow(newCurrentRow, true);
}
- if(this == listBox.firstRowShown)
+ if(this == listBox.firstRowShown)
{
listBox.firstRowShown = GetPrevRow();
if(!listBox.firstRowShown)
#endif
}
- if(value.IsExpanded(this))
+ if(value.IsExpanded())
{
DataRow search;
listBox.SetScrollArea(
listBox.width,
- (listBox.rowCount * listBox.rowHeight) +
+ (listBox.rowCount * listBox.rowHeight) +
((listBox.style.header) ? listBox.rowHeight : 0) -
((!((listBox.clientSize.h+1) % listBox.rowHeight)) ? listBox.rowHeight : 0), true);
if(listBox.style.autoScroll)
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 ? (after.index + 1) : 0;
- }
// 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;
if(dataType.type == normalClass || dataType.type == noHeadClass)
{
if(cell.data[0] && field.freeData)
- dataType._vTbl[__ecereVMethodID_class_OnFree](dataType, cell.data[0]);
+ ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType, cell.data[0]);
if(eClass_IsDerived(dataType, class(char *)) && field.freeData)
- dataType._vTbl[__ecereVMethodID_class_OnCopy](dataType, cell.data, newData);
+ ((void (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCopy])(dataType, cell.data, newData);
else
cell.data[0] = (void *)newData;
}
else
{
// Free old data first
- dataType._vTbl[__ecereVMethodID_class_OnFree](dataType, cell.data);
- dataType._vTbl[__ecereVMethodID_class_OnCopy](dataType, cell.data, newData);
+ ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType, cell.data);
+ ((void (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCopy])(dataType, cell.data, newData);
}
}
cell.isSet = true;
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;
}
if(dataType.type == normalClass || dataType.type == noHeadClass)
{
if(cell.data[0] && field.freeData)
- dataType._vTbl[__ecereVMethodID_class_OnFree](dataType, cell.data[0]);
+ ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType, cell.data[0]);
cell.data[0] = null;
}
else
{
// Free old data first
- dataType._vTbl[__ecereVMethodID_class_OnFree](dataType, cell.data);
+ ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType, cell.data);
}
}
cell.isSet = false;
}
}
- DataRow FindRow(int tag)
+ DataRow FindRow(int64 tag)
{
DataRow row = null;
for(row = subRows.first; row; row = row.next)
return row;
}
- DataRow FindSubRow(int tag)
+ DataRow FindSubRow(int64 tag)
{
DataRow row = null;
for(row = subRows.first; row; row = row.next)
break;
if(field)
{
- int size = (field.dataType && field.dataType.typeSize) ?
+ int size = (field.dataType && field.dataType.typeSize) ?
(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(IsExpanded(this))
+ if(IsExpanded())
{
DataRow search;
listBox.rowCount++;
for(search = row.GetNextRow(); search; search = search.GetNextRow())
- search.index++;
+ search.index++;
listBox.SetScrollArea(
listBox.width,
- (listBox.rowCount * listBox.rowHeight) +
+ (listBox.rowCount * listBox.rowHeight) +
((listBox.style.header) ? listBox.rowHeight : 0) -
((!((listBox.clientSize.h+1) % listBox.rowHeight)) ? listBox.rowHeight : 0), true);
if(listBox.style.autoScroll)
return null;
}
- DataRow AddStringf(char * format, ...)
+ DataRow AddStringf(const char * format, ...)
{
if(this)
{
DataRow row;
char string[MAX_F_STRING];
va_list args;
-
va_start(args, format);
- vsprintf(string, format, args);
+ vsnprintf(string, sizeof(string), format, args);
+ string[sizeof(string)-1] = 0;
va_end(args);
row = AddRow();
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()
{
DataField field;
for(field = listBox.fields.first; field && field.index != cellIndex; field = field.next);
- if(field.dataType)
+ if(field && field.dataType)
{
// TOCHECK: Is this check good? Will need incref/decref sometime?
if(field.dataType.type == normalClass || field.dataType.type == noHeadClass)
{
if(cell.data[0] && field.freeData)
- field.dataType._vTbl[__ecereVMethodID_class_OnFree](field.dataType, cell.data[0]);
+ ((void (*)(void *, void *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnFree])(field.dataType, cell.data[0]);
}
else
- field.dataType._vTbl[__ecereVMethodID_class_OnFree](field.dataType, cell.data);
+ ((void (*)(void *, void *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnFree])(field.dataType, cell.data);
}
}
next = cell.next;
int result = 0;
ListBoxCell cell1, cell2;
uint index;
- for(index = 0, cell1 = cells.first, cell2 = b.cells.first;
- index != sortField.index;
+ for(index = 0, cell1 = cells.first, cell2 = b.cells.first;
+ index != sortField.index;
index++, cell1 = cell1.next, cell2 = cell2.next);
/*
if(!cell1.isSet && !cell2.isSet)
{
if(sortField.dataType.type == normalClass || sortField.dataType.type == noHeadClass)
{
- result = sortField.dataType._vTbl[__ecereVMethodID_class_OnCompare](sortField.dataType,
- (cell1.isSet && cell1.data) ? cell1.data[0] : null,
+ result = ((int (*)(void *, void *, void *))(void *)sortField.dataType._vTbl[__ecereVMethodID_class_OnCompare])(sortField.dataType,
+ (cell1.isSet && cell1.data) ? cell1.data[0] : null,
(cell2.isSet && cell2.data) ? cell2.data[0] : null);
}
else
{
- result = sortField.dataType._vTbl[__ecereVMethodID_class_OnCompare](sortField.dataType,
- cell1.isSet ? cell1.data : null,
+ result = ((int (*)(void *, void *, void *))(void *)sortField.dataType._vTbl[__ecereVMethodID_class_OnCompare])(sortField.dataType,
+ cell1.isSet ? cell1.data : null,
cell2.isSet ? cell2.data : null);
}
}
{
DataRow row;
// Find Next row
- if(subRows.first && !collapsed)
+ if(subRows.first && !collapsed)
row = subRows.first;
- else
+ else
{
for(row = this; row; row = row.parent)
{
DataRow prev, next;
OldList cells;
- int tag;
+ int64 tag;
SelectedFlag selectedFlag;
ListBox listBox;
bool header;
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; }
property int rowHeight
{
- property_category $"Appearance"
+ property_category $"Appearance"
isset { return style.heightSet; }
set
{
OnApplyGraphics();
}
}
- get { return rowHeight; }
+ get { return this ? rowHeight : 0; }
};
property Seconds typingTimeout
{
- property_category $"Behavior"
+ property_category $"Behavior"
set
{
typedString[0] = '\0';
property bool hasClearHeader { property_category $"Appearance" set { style.clearHeader = value; if(value) property::hasHeader = true; } get { return style.clearHeader; } };
property bool hasHeader
{
- property_category $"Appearance"
+ property_category $"Appearance"
set
{
if(value && !style.header)
style.header = value;
}
get { return style.header; }
- };
+ };
property bool multiSelect { property_category $"Behavior" set { style.multiSelect = value; } get { return style.multiSelect; } };
property bool alwaysEdit { property_category $"Behavior" set { style.alwaysEdit = value; } get { return style.alwaysEdit; } };
property bool fullRowSelect { property_category $"Appearance" set { style.fullRowSelect = value; } get { return style.fullRowSelect; } };
property bool noDragging { property_category $"Behavior" set { style.noDragging = value; } get { return style.noDragging; } };
property bool fillLastField
{
- property_category $"Behavior"
+ property_category $"Behavior"
set
{
style.fillLastField = value;
virtual bool Window::NotifyResized(ListBox listBox, DataField field, Modifiers mods);
virtual bool Window::NotifyCollapse(ListBox listBox, DataRow row, bool collapsed);
virtual bool Window::NotifyKeyHit(ListBox listBox, DataRow row, Key key, unichar ch);
- virtual bool Window::NotifyModified(ListBox listBox, DataRow row);
+ 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()
incref addedField;
addedField.listBox = this;
fields.Add(addedField);
-
+
addedField.sortOrder = 1;
addedField.index = numFields;
numFields++;
stayOnTop = true;
inactive = true;
dontScrollVert = true;
- id = (uint)addedField;
+ id = (int64)(intptr)addedField;
text = addedField.header;
bevel = (!guiApp.textMode && !style.clearHeader);
ellipsis = true;
field = addedField;
for(row = rows.first; row; )
{
- int size = (field.dataType && field.dataType.typeSize) ?
+ int size = (field.dataType && field.dataType.typeSize) ?
(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.subRows.first)
row = row.subRows.first;
- else
+ else
{
for(; row; row = row.parent)
{
if(this)
{
DataField field;
+ Clear(); // Ensure data is cleared first
while((field = fields.first))
{
- //delete field;
field.Free();
delete field;
}
if(field.dataType.type == normalClass || field.dataType.type == noHeadClass)
{
if(cell.data[0] && field.freeData)
- field.dataType._vTbl[__ecereVMethodID_class_OnFree](field.dataType, cell.data[0]);
+ ((void (*)(void *, void *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnFree])(field.dataType, cell.data[0]);
}
else
- field.dataType._vTbl[__ecereVMethodID_class_OnFree](field.dataType, cell.data);
+ ((void (*)(void *, void *))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnFree])(field.dataType, cell.data);
}
row.cells.Remove(cell);
delete cell;
}
- if(row.subRows.first)
+ if(row.subRows.first)
row = row.subRows.first;
- else
+ else
{
for(; row; row = row.parent)
{
if(row)
{
DataRow search;
- DataField field;
- int c;
row.index = 0;
rows.Insert(null, row);
row.listBox = this;
for(search = row.GetNextRow(); search; search = search.GetNextRow())
- search.index++;
+ search.index++;
this.rowCount++;
row.cells.Clear();
-
+
firstRowShown = row;
SetScrollArea(
width,
- (rowCount * rowHeight) +
+ (rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((!((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
if(style.autoScroll)
// 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;
}
break;
if(field)
{
- int size = (field.dataType && field.dataType.typeSize) ?
+ int size = (field.dataType && field.dataType.typeSize) ?
(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(rowHeight)
SetScrollArea(
width,
- (rowCount * rowHeight) +
+ (rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((!((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
if(style.autoScroll)
row.listBox = this;
for(search = row.GetNextRow(); search; search = search.GetNextRow())
- search.index++;
+ search.index++;
this.rowCount++;
row.cells.Clear();
break;
if(field)
{
- int size = (field.dataType && field.dataType.typeSize) ?
+ int size = (field.dataType && field.dataType.typeSize) ?
(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;
}
}
SetScrollArea(
width,
- (rowCount * rowHeight) +
+ (rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((!((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
if(style.autoScroll)
return null;
}
- DataRow AddStringf(char * format, ...)
+ DataRow AddStringf(const char * format, ...)
{
if(this)
{
va_list args;
va_start(args, format);
- vsprintf(string, format ? format : "", args);
+ vsnprintf(string, sizeof(string), format ? format : "", args);
+ string[sizeof(string)-1] = 0;
va_end(args);
row = AddRow();
return null;
}
- DataRow AddString(char * string)
+ DataRow AddString(const char * string)
{
if(this)
{
if(row.parent.IsExpanded())
{
for(search = row.GetNextRow(); search; search = search.GetNextRow())
- search.index--;
+ search.index--;
this.rowCount--;
}
HideEditBox(false, false, true);
- if(row == clickedRow)
+ if(row == clickedRow)
{
clickedRow = row.GetNextRow();
if(!clickedRow)
clickedRow = row.GetPrevRow();
}
- if(row == currentRow)
+ if(row == currentRow)
{
DataRow newCurrentRow = row.GetNextRow();
if(!newCurrentRow)
SetCurrentRow(newCurrentRow, true);
}
- if(row == firstRowShown)
+ if(row == firstRowShown)
{
firstRowShown = row.GetPrevRow();
if(!firstRowShown)
SetScrollArea(
this.width,
- (this.rowCount * rowHeight) +
+ (this.rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((!((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
}
}
- DataRow FindRow(int tag)
+ DataRow FindRow(int64 tag)
{
if(this)
{
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 *)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 *)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 *)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 *)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 FindSubRow(int tag)
+ DataRow FindSubRow(int64 tag)
{
if(this)
{
DataRow row = null;
-
+
for(row = rows.first; row; row = row.next)
{
if(!row.noneRow && row.tag == tag)
HideEditBox(false, true, false);
editData.Destroy(0);
-
+
firstRowShown = currentRow = null;
ClearEx();
-
+
if(master)
{
if(style.freeSelect)
if(style.alwaysEdit && currentRow)
currentRow.Edit(currentField);
-
+
this.rowCount = 0;
-
+
SetScrollArea(
this.width,
- (this.rowCount * rowHeight) +
+ (this.rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((rowHeight && !((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
Update(null);
return (void *)currentRow.GetData(field);
}
- int GetTag()
+ int64 GetTag()
{
return currentRow ? currentRow.tag : 0;
}
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(*row)
{
if(!*field) *field = this ? currentField : null;
- if(!*field && this)
+ if(!*field && this)
{
for(*field = fields.first; (*field).index != 0; *field = (*field).next);
}
{
if(editData && editData.visible)
{
- Class dataType = currentField.dataType;
- if(save)
+ if(save)
editData.SaveData();
-
+
editData.visible = false;
NotifyEditDone(master, this, currentRow);
int height = rowHeight - (style.alwaysEdit ? 1 : 0);
int y = currentRow.index * rowHeight + (style.header ? rowHeight : 0);
int x = currentField.x;
- int width = (!currentField.next && style.fillLastField && (!hasHorzScroll || clientSize.w - currentField.x > currentField.width + EXTRA_SPACE)) ?
+ int width = (!currentField.next && style.fillLastField && (!hasHorzScroll || clientSize.w - currentField.x > currentField.width + EXTRA_SPACE)) ?
clientSize.w - currentField.x : (currentField.width + EXTRA_SPACE);
if(!style.alwaysEdit)
*/
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;
}
}
+ void RepositionFieldEditor()
+ {
+ if(editData && editData.visible)
+ {
+ int height = rowHeight - (style.alwaysEdit ? 1 : 0);
+ int x = 0;
+ int y = currentRow.index * rowHeight + (style.header ? rowHeight : 0);
+ int width = 0;
+ DataField field;
+
+ if(style.collapse && !(style.treeBranch))
+ x += 15;
+ for(field = fields.first; field; field = field.next)
+ {
+ width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ clientSize.w - field.x : (field.width + EXTRA_SPACE);
+ if(field == currentField) break;
+ x += width;
+ }
+ if(!style.alwaysEdit)
+ {
+ editData.position = { x, y - editData.clientStart.y };
+ editData.size = { width, height + editData.clientStart.y * 2 };
+ }
+ else
+ {
+ editData.position = { x, y };
+ editData.size = { width, height };
+ }
+ }
+ }
+
void PopupEditBox(DataField whichField, bool repositionOnly)
{
if((!editData || !editData.visible || currentField != whichField) && currentRow)
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;
for(field = fields.first; field; field = field.next)
{
- width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(field == whichField) break;
x += width;
background = dataBoxBackground;
foreground = dataBoxForeground;
- bool NotifyChanged(bool closingDropDown)
+ bool NotifyChanged(DataBox dataBox, bool closingDropDown)
{
DataRow row = null;
DataField field = null;
bool result = DataBox::OnKeyDown(key, ch);
if(visible && active) // Added this check here, because we will not use enter/escape otherwise, and lose DataBox's result
{
- if((SmartKey)key == enter || (SmartKey)key == escape)
+ if((SmartKey)key == enter || (SmartKey)key == escape)
return true;
}
return result;
DataField field;
// Fill out indent column
- if(style.collapse && !(style.treeBranch) && rows.first)
+ if(style.collapse && !(style.treeBranch) && (style.header || rows.first))
{
x += 15;
surface.SetBackground(formColor);
// Vertical lines
for(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(field.prev && y > 0)
surface.VLine(0, y-1, x);
int y1 = y + PLUSY + 4;
int y2;
DataRow child;
-
+
for(child = row.collapsed ? null : row.subRows.first; child && child != row; )
{
numRows++;
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);
- 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)
{
uint index;
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = ((!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) || row.header) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
// Box clip = { x, y+1, x + field.width - EXTRA_SPACE - 1, y + rowHeight - 2 };
surface.SetBackground(background);
if(field.dataType.type == noHeadClass || field.dataType.type == normalClass)
- field.dataType._vTbl[__ecereVMethodID_class_OnDisplay](field.dataType, cell.data[0], surface, x, y - 1 + (rowHeight - fontH)/2, width - EXTRA_SPACE/2, field.userData, field.alignment, dataDisplayFlags);
+ ((void (*)(void *, void *, void *, int, int, int, void *, uint, uint))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnDisplay])(field.dataType, cell.data[0], surface, x, y - 1 + (rowHeight - fontH)/2, width - EXTRA_SPACE/2, field.userData, field.alignment, dataDisplayFlags);
else
- field.dataType._vTbl[__ecereVMethodID_class_OnDisplay](field.dataType, cell.data, surface, x, y - 1 + (rowHeight - fontH)/2, width - EXTRA_SPACE/2, field.userData, field.alignment, dataDisplayFlags);
+ ((void (*)(void *, void *, void *, int, int, int, void *, uint, uint))(void *)field.dataType._vTbl[__ecereVMethodID_class_OnDisplay])(field.dataType, cell.data, surface, x, y - 1 + (rowHeight - fontH)/2, width - EXTRA_SPACE/2, field.userData, field.alignment, dataDisplayFlags);
}
if(!isActive && dataDisplayFlags.selected && style.alwaysEdit && field.editable)
foreground = this.background;
}
+#ifdef _DEBUG
+ // surface.WriteTextf(x + 100, y, "ix: %d", row.index);
+#endif
+
x += width;// + EXTRA_SPACE;
if(row.header) break;
if(sortField && !style.clearHeader && style.header)
{
DataField field = sortField;
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
int tw = 0, th = 0;
if(field.header)
{
bool up = field.sortOrder == 1;
int x = 4, y = 4;
- Box clip =
- {
- field.x + 2 - scroll.x, 0,
+ Box clip =
+ {
+ field.x + 2 - scroll.x, 0,
field.x + width + EXTRA_SPACE - 1 - scroll.x, rowHeight
};
surface.Clip(&clip);
x = field.x + (width + EXTRA_SPACE - tw) / 2 + tw + EXTRA_SPACE + 4;
else
x = field.x + tw + EXTRA_SPACE + 4;
-
+
x = Min(x, field.x + width - 4);
}
else if(field.alignment == right)
{
- x = field.x + width - tw - EXTRA_SPACE - 4;
+ x = field.x + width - tw - 2*EXTRA_SPACE - 4;
x = Max(x, field.x + 2);
}
x -= scroll.x;
surface.PutPixel(x + 1, y + 5);
surface.PutPixel(x + 1, y + 3);
surface.PutPixel(x + 2, y + 1);
-
+
surface.SetForeground(white);
surface.DrawLine(x + 4, y, x + 7, y + 5);
surface.PutPixel(x + 6, y + 5);
surface.PutPixel(x + 1, y+1);
surface.PutPixel(x + 1, y+3);
surface.PutPixel(x + 2, y+5);
-
+
surface.SetForeground(white);
surface.DrawLine(x + 4, y+6, x + 7, y+1);
surface.PutPixel(x + 6, y+1);
SetScrollArea(
width,
- (rowCount * rowHeight) +
+ (rowCount * rowHeight) +
((style.header) ? rowHeight : 0) -
((!((clientSize.h+1) % rowHeight)) ? rowHeight : 0), true);
for(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(style.header && field.headButton)
{
{
HideEditBox(true, false, true);
}
+ else if(editData && editData.visible)
+ RepositionFieldEditor();
}
void AdaptToFieldWidth(DataField field, bool doScroll)
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) ||
- (field && x < RESIZE_BORDER && field.prev) ||
+ (field && x < RESIZE_BORDER && field.prev) ||
(field && x >= control.clientSize.w - RESIZE_BORDER)))
{
if(!field)
else if(x < RESIZE_BORDER && field.prev)
field = field.prev;
+ if(field.fixed) return false;
resizingField = field;
this.resizeX = x + control.position.x;
this.startWidth = field.width;
}
else if(field)
{
+ if(field.fixed) return false;
draggingField = field;
if(style.moveFields)
field.headButton.stayDown = true;
x += control.position.x;
// Tweak to prevent shrinking field if we're actually moving right
- if(x - scroll.x > this.oldX &&
+ if(x - scroll.x > this.oldX &&
this.startWidth + x - this.resizeX < field.width)
{
this.oldX = x - scroll.x;
int fieldX = 0;
for(field = fields.first; field; field = field.next)
{
- fieldX += ((field.width || style.resizable) ?
+ fieldX += ((field.width || style.resizable) ?
field.width : clientSize.w) + EXTRA_SPACE;
- if(fieldX > x)
+ if(fieldX > x)
break;
}
if(draggingField == field)
field.x >= field.x + field.width + EXTRA_SPACE - clientSize.w)
{
SetScrollPosition(
- field.x + field.width + EXTRA_SPACE - clientSize.w,
+ field.x + field.width + EXTRA_SPACE - clientSize.w,
scroll.y);
}
else if(field.x + field.width + EXTRA_SPACE - clientSize.w > scroll.x ||
}
else if(style.resizable)
{
- DataField field = (DataField)control.id;
+ DataField field = (DataField)(intptr)control.id;
if(field)
{
if(x < RESIZE_BORDER && field.prev)
- control.cursor = guiApp.GetCursor(sizeWE);
+ {
+ if(!field.prev.fixed)
+ control.cursor = guiApp.GetCursor(sizeWE);
+ }
else if(x >= control.clientSize.w - RESIZE_BORDER)
control.cursor = guiApp.GetCursor(sizeWE);
else
if(draggingField)
{
bool result = true;
-
+
if(style.moveFields)
{
if(dropField)
x += draggingField.x;
for(field = fields.first; field; field = field.next)
{
- fieldX += ((field.width || style.resizable) ?
+ fieldX += ((field.width || style.resizable) ?
field.width : clientSize.w) + EXTRA_SPACE;
- if(fieldX > x)
+ if(fieldX > x)
{
switchField = field;
break;
{
if(style.header && !this.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)
bool OnLoadGraphics()
{
- display.FontExtent(fontObject, "W", 1, null, &fontH);
+ display.FontExtent(fontObject, "W", 1, null, &fontH);
if(!style.heightSet)
{
rowHeight = Max(fontH + 2, 16) + (style.alwaysEdit ? 1 : 0);
{
if(rows.first)
{
- if(!initSize.w && (!anchor.left.type || !anchor.right.type) /**w*/)
+ if(!initSize.w && (!anchor.left.type || !anchor.right.type) && !*w)
{
// Use widest item
DataRow row;
Font font = fontObject;
Font boldFont = this.boldFont.font;
Display display = this.display;
-
+
for(row = rows.first; row; row = row.GetNextRow())
{
Bitmap icon = row.icon ? row.icon.bitmap : null;
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 *)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 *)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);
for(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(field.prev)
if((editData && editData.visible) || (style.alwaysEdit))
return true;
-
+
if(x == MAXINT && y == MAXINT)
{
x = this.mouseX;
mouseY = y;
if(this.dragging &&
- ((vertScroll && vertScroll.visible &&
+ ((vertScroll && vertScroll.visible &&
(y < 0 || y >= clientSize.h)) ||
- (horzScroll && horzScroll.visible &&
+ (horzScroll && horzScroll.visible &&
(x < 0 || x >= clientSize.w))))
{
timer.Start();
if(isTimer)
{
- if(vertScroll && vertScroll.visible &&
+ if(vertScroll && vertScroll.visible &&
(y < 0 || y >= clientSize.h))
vertScroll.Action((y<0)?up:down, 0, 0);
- if(horzScroll && horzScroll.visible &&
+ if(horzScroll && horzScroll.visible &&
(x < 0 || x >= clientSize.w))
horzScroll.Action((x<0)?up:down, 0, 0);
}
{
DataRow thisRow;
for(thisRow = rows.first; thisRow; thisRow = thisRow.GetNextRow())
- if((thisRow.selectedFlag == selected || thisRow.selectedFlag == tempSelected) ||
+ if((thisRow.selectedFlag == selected || thisRow.selectedFlag == tempSelected) ||
thisRow == row)
break;
if(thisRow != row)
for(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(field.prev)
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(row = firstRowShown; row; row = row.GetNextRow(), rowIndex ++)
{
rowY += rowHeight;
- if(rowY > y || (style.multiSelect && !row.GetNextRow()))
+ if(rowY > y || (style.multiSelect && !row.GetNextRow()))
{
int plusIndent = 0;
if(style.treeBranch)
if(style.collapse && row.subRows.first && (row.parent || !(style.treeBranch) || (style.rootCollapse)) &&
(x >= rowStart + 3 + plusIndent && y >= rowY - rowHeight + PLUSY && x <= rowStart + 11 + plusIndent && y <= rowY - rowHeight + PLUSY + 8))
*/
- if(style.collapse &&
+ if(style.collapse &&
(x >= rowStart && y >= rowY - rowHeight && x <= rowStart + 18 + plusIndent && y <= rowY + rowHeight-1))
{
if(row.subRows.first && (row.parent || !(style.treeBranch) || (style.rootCollapse)) && x >= plusIndent)
clickedRow = row;
//this.clickedRowIndex = rowIndex;
}
- else if(style.moveRows && !(mods.shift) &&
+ else if(style.moveRows && !(mods.shift) &&
(row.selectedFlag == selected || row.selectedFlag == tempSelected) &&
!right && !(mods.isActivate))
moveMultiple = true;
{
if(selRow != clickedRow)
{
- if(selRow.selectedFlag)
+ if(selRow.selectedFlag)
selRow.selectedFlag = tempUnselected;
else
selRow.selectedFlag = tempSelected;
if(style.freeSelect)
NotifyHighlight(master, this, currentRow, mods);
- else if((moveMultiple || (!(style.multiSelect) && previousRow == currentRow)) &&
+ else if((moveMultiple || (!(style.multiSelect) && previousRow == currentRow)) &&
newCurrentRow && !(mods.shift))
{
if(!right)
for(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(!field.prev) width -= indent;
if(x >= sx && x < sx + width)
- break;
+ break;
sx += width;
}
if(field == currentField)
editData.Deactivate();
else
{
- currentRow.Edit(field);
+ currentRow.Edit(field);
editData.Activate();
}
}
// 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(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(!field.prev) width -= indent;
if(x >= sx && x < sx + width && newCurrentRow)
}
else
{
- result = NotifySelect(master, this,
- currentRow ? currentRow : null, mods);
+ DataField f = null;
if(result && style.alwaysEdit && currentRow)
{
if(newCurrentRow)
for(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
if(!field.prev) width -= indent;
if(x >= sx && x < sx + width)
{
- currentField = field;
+ f = currentField = field;
break;
}
sx += width;
}
}
- currentRow.Edit(currentField);
+ }
+ // Moved NotifySelect after setting currentField for the NotifySelect implementation to be aware of which field is now selected (e.g. WatchesView)
+ result = NotifySelect(master, this, currentRow, mods);
+ if(result && style.alwaysEdit && currentRow)
+ {
+ // In case the user specifically clicked on a field (f is set), override any change to currentField that NotifySelect could have done
+ currentRow.Edit(f ? f : currentField);
// If the user clicked exactly on the edited field,
// activate it
for(row = firstRowShown; row; row = row.GetNextRow())
{
rowY += rowHeight;
- if(rowY > y)
+ if(rowY > y)
{
switchRow = row;
break;
int fieldX = 0;
for(field = fields.first; field; field = field.next)
{
- int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
+ int width = (!field.next && style.fillLastField && (!hasHorzScroll || clientSize.w - field.x > field.width + EXTRA_SPACE)) ?
clientSize.w - field.x : (field.width + EXTRA_SPACE);
fieldX += width;
- if(fieldX > x + scroll.x)
+ if(fieldX > x + scroll.x)
break;
}
-
+
if(field && field.editable)
{
// true: destroy edit box
clickedRow = row;
}
else
- {
+ {
if(style.multiSelect)
{
if(!switchRow.selectedFlag)
// 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);
+ }
}
}
}
for(row = firstRowShown; row; row = row.GetNextRow())
{
rowY += rowHeight;
- if(rowY > y || (style.multiSelect && !row.GetNextRow()))
+ if(rowY > y || (style.multiSelect && !row.GetNextRow()))
{
if(style.treeBranch)
{
bool looped = false;
if(len == 1 && currentRow)
startRow = (next = startRow.GetNextRow(), (next ? next : rows.first));
-
+
for(row = startRow; row != startRow || !looped; next = row.GetNextRow(), row = next ? next : rows.first)
{
void * data = row.GetData(field);
char tempString[1024] = "";
bool needClass = false;
- char * string = data ? (char *)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);
draggingField = null;
Update(null);
return false;
- }
+ }
}
- if(!currentField || !currentField.editable)
+ if(!currentField || !currentField.editable)
for(field = fields.first; field; field = field.next)
{
if(field.editable)
break;
}
}
- if(key == f2 && currentField && currentField.editable)
+ if((key == f2 || (style.alwaysEdit && (key == ctrlV || key == ctrlC || key == ctrlX || key == shiftInsert || key == ctrlInsert || key == shiftDel))) &&
+ currentField && currentField.editable)
{
PopupEditBox(currentField, false);
if(editData && editData.visible)
{
if(style.alwaysEdit)
+ {
editData.Activate();
+ if(key == ctrlV || key == ctrlC || key == ctrlX || key == shiftInsert || key == ctrlInsert || key == shiftDel)
+ {
+ editData.OnKeyHit(key, ch);
+ StopEditing(true);
+ }
+ else
+ // For Installer to pop up file dialog
+ NotifyKeyDown(master, this, currentRow, key, ch);
+ }
return false;
}
}
-
+
if(!NotifyKeyDown(master, this, currentRow, key, ch))
return false;
return editData.OnKeyDown(key, ch);
return true; // We want to pick up the OnKeyHit to replace contents, but skip GoToLetter
}
-
- if(ch != 128 && !key.alt && !key.ctrl && GoToLetter(ch, false))
+
+ if(ch >=32 && ch != 128 && !key.alt && !key.ctrl && GoToLetter(ch, false))
{
/*if(inactive && window.state != Hidden)
NotifyHighlight(master, this, currentRow, 0);
bool OnKeyHit(Key key, unichar ch)
{
- if(key.code == up && key.alt == true && key.ctrl == false && key.shift == false)
- return true;
-
if(!ch && !key.alt && !key.ctrl)
{
key.code = (SmartKey)key.code;
}
}
- if(!(style.multiSelect) && (key.ctrl))
- return true;
-
- if(editData && editData.visible && ch && !key.alt && !key.ctrl && editData.active)
+ if(editData && editData.visible && ch && !key.alt && !key.ctrl && editData.active && (key.code != tab || (editData._class == class(EditBox) && ((EditBox)editData).tabKey)))
return false;
- switch(key.code)
+ if(!key.alt && (style.multiSelect || !key.ctrl))
{
- case left:
- if(style.alwaysEdit)
- {
- if(currentField)
+ switch(key.code)
+ {
+ case left:
+ if(style.alwaysEdit)
{
- DataField field;
- for(field = currentField.prev; field; field = field.prev)
+ if(currentField)
{
- if(field.editable)
+ DataField field;
+ for(field = currentField.prev; field; field = field.prev)
{
- currentField = field;
- HideEditBox(true, true, false);
- PopupEditBox(currentField, false);
- return false;
- }
+ if(field.editable)
+ {
+ currentField = field;
+ HideEditBox(true, true, false);
+ PopupEditBox(currentField, false);
+ return false;
+ }
+ }
}
}
- }
- if(style.collapse && currentRow /*&& !currentField*/) // THIS PREVENTED COLLAPSING THE PROPERTY SHEET
- {
- if(currentRow.subRows.first && !currentRow.collapsed)
+ if(style.collapse && currentRow /*&& !currentField*/) // THIS PREVENTED COLLAPSING THE PROPERTY SHEET
{
- currentRow.collapsed = true;
+ if(currentRow.subRows.first && !currentRow.collapsed)
+ {
+ currentRow.collapsed = true;
+ }
+ else if(currentRow.parent)
+ SetCurrentRow(currentRow.parent, true);
+ return false;
}
- else if(currentRow.parent)
- SetCurrentRow(currentRow.parent, true);
- return false;
- }
- break;
- case right:
- if(style.collapse && currentRow && currentRow.subRows.first)
- {
- if(currentRow.collapsed)
- currentRow.collapsed = false;
- else
- SetCurrentRow(currentRow.subRows.first, true);
- return false;
- }
- else if(style.alwaysEdit)
- {
- if(currentField)
+ break;
+ case right:
+ if(style.collapse && currentRow && currentRow.subRows.first)
{
- DataField field;
- for(field = currentField.next; field; field = field.next)
+ if(currentRow.collapsed)
+ currentRow.collapsed = false;
+ else
+ SetCurrentRow(currentRow.subRows.first, true);
+ return false;
+ }
+ else if(style.alwaysEdit)
+ {
+ if(currentField)
{
- if(field.editable)
+ DataField field;
+ for(field = currentField.next; field; field = field.next)
{
- currentField = field;
- HideEditBox(true, true, false);
- PopupEditBox(currentField, false);
- break;
- }
+ if(field.editable)
+ {
+ currentField = field;
+ HideEditBox(true, true, false);
+ PopupEditBox(currentField, false);
+ break;
+ }
+ }
}
}
- }
- break;
- case down: case up:
- case pageDown: case pageUp:
- case end: case home:
- {
- int headerSize = ((style.header) ? rowHeight : 0);
- int height = clientSize.h + 1 - headerSize;
- DataRow oldRow;
+ break;
+ case down: case up:
+ case pageDown: case pageUp:
+ case end: case home:
+ {
+ int headerSize = ((style.header) ? rowHeight : 0);
+ int height = clientSize.h + 1 - headerSize;
+ DataRow oldRow;
- // true: destroy edit box
- // !!! TESTING true HERE !!!
- HideEditBox(true, true, false);
- // HideEditBox(false, true, false);
-
- oldRow = currentRow;
+ // true: destroy edit box
+ // !!! TESTING true HERE !!!
+ HideEditBox(true, true, false);
+ // HideEditBox(false, true, false);
- SNAPDOWN(height, rowHeight);
- if((!currentRow || key.code == home) && key.code != end)
- {
- currentRow = rows.first;
- }
- else
- {
- DataRow next;
- switch(key.code)
+ oldRow = currentRow;
+
+ SNAPDOWN(height, rowHeight);
+ if((!currentRow || key.code == home) && key.code != end)
{
- case down:
- if(!(style.multiSelect) && currentRow && !currentRow.selectedFlag)
- next = currentRow;
- else
- next = currentRow.GetNextRow();
- if(next)
+ currentRow = rows.first;
+ }
+ else
+ {
+ DataRow next;
+ switch(key.code)
+ {
+ case down:
+ if(!(style.multiSelect) && currentRow && !currentRow.selectedFlag)
+ next = currentRow;
+ else
+ next = currentRow.GetNextRow();
+ if(next)
+ {
+ currentRow = next;
+ }
+ break;
+ case up:
+ if(!(style.multiSelect) && currentRow && !currentRow.selectedFlag)
+ next = currentRow;
+ else
+ next = currentRow.GetPrevRow();
+
+ if(next)
+ {
+ currentRow = next;
+ }
+ break;
+ case end:
+ currentRow = lastRow.GetLastRow();
+ break;
+ case pageUp:
{
- currentRow = next;
+ int c;
+ for(c = 0;
+ currentRow && (next = currentRow.GetPrevRow()) && c < height / rowHeight;
+ c++, currentRow = next);
+ break;
}
- break;
- case up:
- if(!(style.multiSelect) && currentRow && !currentRow.selectedFlag)
- next = currentRow;
- else
- next = currentRow.GetPrevRow();
-
- if(next)
+ case pageDown:
{
- currentRow = next;
+ int c;
+ for(c = 0;
+ currentRow && (next = currentRow.GetNextRow()) && c < height / rowHeight;
+ c++, currentRow = next);
+ break;
}
- break;
- case end:
- currentRow = lastRow.GetLastRow();
- break;
- case pageUp:
- {
- int c;
- for(c = 0;
- currentRow && (next = currentRow.GetPrevRow()) && c < height / rowHeight;
- c++, currentRow = next);
- break;
- }
- case pageDown:
- {
- int c;
- for(c = 0;
- currentRow && (next = currentRow.GetNextRow()) && c < height / rowHeight;
- c++, currentRow = next);
- break;
}
}
- }
- if(currentRow && currentRow.index * rowHeight > scroll.y + height - rowHeight)
- SetScrollPosition(scroll.x, currentRow.index * rowHeight - height + rowHeight);
- else if(!currentRow || currentRow.index * rowHeight < scroll.y)
- SetScrollPosition(scroll.x, currentRow ? currentRow.index * rowHeight : 0);
-
- if(style.multiSelect)
- {
- DataRow selRow;
+ if(currentRow && currentRow.index * rowHeight > scroll.y + height - rowHeight)
+ SetScrollPosition(scroll.x, currentRow.index * rowHeight - height + rowHeight);
+ else if(!currentRow || currentRow.index * rowHeight < scroll.y)
+ SetScrollPosition(scroll.x, currentRow ? currentRow.index * rowHeight : 0);
- if(!(key.shift) && (key.ctrl))
+ if(style.multiSelect)
{
- DataRow row;
- for(row = rows.first; row; row = row.GetNextRow())
+ DataRow selRow;
+
+ if(!(key.shift) && (key.ctrl))
{
- if(row.selectedFlag == tempSelected)
- row.selectedFlag = selected;
- else if(row.selectedFlag == tempUnselected)
- row.selectedFlag = unselected;
+ DataRow row;
+ for(row = rows.first; row; row = row.GetNextRow())
+ {
+ if(row.selectedFlag == tempSelected)
+ row.selectedFlag = selected;
+ else if(row.selectedFlag == tempUnselected)
+ row.selectedFlag = unselected;
+ }
}
- }
- if(!(key.ctrl))
- {
- for(selRow = rows.first; selRow; selRow = selRow.GetNextRow())
- selRow.selectedFlag = unselected;
- }
- else
- {
- for(selRow = rows.first; selRow; selRow = selRow.GetNextRow())
+ if(!(key.ctrl))
{
- if(selRow.selectedFlag == tempUnselected) selRow.selectedFlag = selected;
- else if(selRow.selectedFlag == tempSelected) selRow.selectedFlag = unselected;
+ for(selRow = rows.first; selRow; selRow = selRow.GetNextRow())
+ selRow.selectedFlag = unselected;
+ }
+ else
+ {
+ for(selRow = rows.first; selRow; selRow = selRow.GetNextRow())
+ {
+ if(selRow.selectedFlag == tempUnselected) selRow.selectedFlag = selected;
+ else if(selRow.selectedFlag == tempSelected) selRow.selectedFlag = unselected;
+ }
}
- }
- if(key.shift)
- {
- if(currentRow.index >= clickedRow.index)
+ if(key.shift)
{
- for(selRow = clickedRow; selRow; selRow = selRow.GetNextRow())
+ if(currentRow.index >= clickedRow.index)
{
- if(key.ctrl)
+ for(selRow = clickedRow; selRow; selRow = selRow.GetNextRow())
{
- if(selRow.selectedFlag) selRow.selectedFlag = tempUnselected; else selRow.selectedFlag = tempSelected;
+ if(key.ctrl)
+ {
+ if(selRow.selectedFlag) selRow.selectedFlag = tempUnselected; else selRow.selectedFlag = tempSelected;
+ }
+ else
+ selRow.selectedFlag = selected;
+ if(selRow == currentRow)
+ break;
+ }
+ }
+ else
+ {
+ for(selRow = currentRow; selRow; selRow = selRow.GetNextRow())
+ {
+ if(key.ctrl)
+ {
+ if(selRow.selectedFlag) selRow.selectedFlag = tempUnselected; else selRow.selectedFlag = tempSelected;
+ }
+ else
+ selRow.selectedFlag = selected;
+ if(selRow == clickedRow)
+ break;
}
- else
- selRow.selectedFlag = selected;
- if(selRow == currentRow)
- break;
}
}
else
{
- for(selRow = currentRow; selRow; selRow = selRow.GetNextRow())
+ if(!(key.ctrl) && currentRow)
{
- if(key.ctrl)
- {
- if(selRow.selectedFlag) selRow.selectedFlag = tempUnselected; else selRow.selectedFlag = tempSelected;
- }
- else
- selRow.selectedFlag = selected;
- if(selRow == clickedRow)
- break;
+ currentRow.selectedFlag = selected;
}
+
+ clickedRow = currentRow;
}
}
else
{
- if(!(key.ctrl) && currentRow)
- {
- currentRow.selectedFlag = selected;
- }
-
- clickedRow = currentRow;
+ if(oldRow) oldRow.selectedFlag = unselected;
+ if(currentRow) currentRow.selectedFlag = selected;
}
- }
- else
- {
- if(oldRow) oldRow.selectedFlag = unselected;
- if(currentRow) currentRow.selectedFlag = selected;
- }
- if(currentRow)
- {
- if(style.freeSelect)
- NotifyHighlight(master, this, currentRow, 0);
- else
- NotifySelect(master, this, currentRow, 0);
+ if(currentRow)
+ {
+ if(style.freeSelect)
+ NotifyHighlight(master, this, currentRow, 0);
+ else
+ NotifySelect(master, this, currentRow, 0);
- if(style.alwaysEdit && currentRow)
- currentRow.Edit(currentField /*null*/);
+ if(style.alwaysEdit && currentRow)
+ currentRow.Edit(currentField /*null*/);
+ }
+ Update(null);
+ return false;
}
- Update(null);
- return false;
- }
- case space:
- {
- if(style.multiSelect && currentRow)
+ case space:
{
- if(currentRow.selectedFlag)
+ if(style.multiSelect && currentRow)
{
- if(key.ctrl)
- currentRow.selectedFlag = unselected;
- }
- else
- currentRow.selectedFlag = selected;
- Update(null);
+ if(currentRow.selectedFlag)
+ {
+ if(key.ctrl)
+ currentRow.selectedFlag = unselected;
+ }
+ else
+ currentRow.selectedFlag = selected;
+ Update(null);
- if(style.freeSelect)
- NotifyHighlight(master, this, currentRow, 0);
- else
- NotifySelect(master, this, currentRow, 0);
+ if(style.freeSelect)
+ NotifyHighlight(master, this, currentRow, 0);
+ else
+ NotifySelect(master, this, currentRow, 0);
+ }
+ break;
}
- break;
}
}
-
+
if(!NotifyKeyHit(master, this, currentRow, key, ch))
return false;
- if(ch != 128 && !key.alt && !key.ctrl && GoToLetter(ch, true))
+ if(ch >=32 && ch != 128 && !key.alt && !key.ctrl && GoToLetter(ch, true))
{
/*if(inactive && window.state != Hidden)
return NotifyHighlight(master, this, currentRow, 0);
return true;
}
-
void OnHScroll(ScrollBarAction action, int position, Key key)
{
Update(null);
int rowCount;
int rowHeight;
int fontH;
- double typingTimeOut;
+ public double typingTimeOut;
char * typedString;
int mouseX, mouseY;
{
delay = 0.5; // typingTimeOut
userData = this;
-
+
bool DelayExpired()
{
typedString[0] = '\0';
// Only used for OnMouseMove so far, for avoiding problems with consequential mouse moves
bool insideNotifySelect;
- Color selectionColor, selectionText, stippleColor;
+ ColorAlpha selectionColor, selectionText, stippleColor;
stippleColor = 0xFFFFFF80;
};