+#ifdef ECERE_STATIC
+import static "ecere"
+#else
import "ecere"
+#endif
class CheckListBoxButton : Button
{
class CheckListBox : ListBox
{
- Map<int, CheckListBoxButton> buttonMaps { };
+ Map<uintptr, CheckListBoxButton> buttonMaps { };
AVLTree<DataRow> rowChecks { };
+ AVLTree<DataRow> rowDisabled { };
int checkIndent;
checkIndent = 20;
{
if(collapsed)
{
- MapIterator<int, Button> it { map = listBox.buttonMaps };
- if(it.Index((int)r, false))
+ MapIterator<uintptr, Button> it { map = listBox.buttonMaps };
+ if(it.Index((uintptr)r, false))
{
Button checkBox = it.data;
if(checkBox)
}
for(r = row.GetNextRow(); r; r = r.GetNextRow())
{
- Button checkBox = listBox.buttonMaps[(int)r];
- checkBox.position.y = 1 + (r.index + listBox.hasHeader) * listBox.rowHeight;
+ Button checkBox = listBox.buttonMaps[(uintptr)r];
+ if(checkBox)
+ checkBox.position.y = 1 + (r.index + listBox.hasHeader) * listBox.rowHeight;
}
return true;
}
int indent = checkIndent;
for(parent = row.parent; parent; parent = parent.parent) indent += 20;
- button = buttonMaps[(int)row];
+ button = buttonMaps[(uintptr)row];
if(!button) button = CheckListBoxButton { this };
button.position = { 2 + indent, 1+(row.index + hasHeader) * rowHeight };
- button.id = (int)row;
+ button.id = (uintptr)row;
for(parent = row; parent; parent = parent.parent) if(rowChecks.Find(parent)) break;
if(parent)
button.checked = CheckPartialChecks(row);
button.buttonState = button.checked ? down : up;
}
+ if(rowDisabled.Find(row))
+ button.disabled = true;
button.Create();
- buttonMaps[(int)row] = button;
+ buttonMaps[(uintptr)row] = button;
if(recurse && !row.collapsed)
{
DataRow r;
void ToggleCheck(DataRow row)
{
- CheckListBoxButton checkBox = buttonMaps[(int)row];
- if(checkBox)
+ CheckListBoxButton checkBox = buttonMaps[(uintptr)row];
+ if(checkBox && !checkBox.disabled)
{
bool checked = false;
DataRow r;
void UncheckBoxes(DataRow row)
{
- CheckListBoxButton button = buttonMaps[(int)row];
- if(button)
+ if(!row.parent || !row.parent.collapsed)
{
- bool wasChecked = button.checked;
- button.checked = false;
- button.buttonState = up;
- if(wasChecked) NotifyChanged(master, this, row);
+ CheckListBoxButton button = buttonMaps[(uintptr)row];
+ if(button)
+ {
+ bool wasChecked = button.checked;
+ button.checked = false;
+ button.buttonState = up;
+ }
}
- if(!row.collapsed)
+ // if(!row.collapsed)
{
DataRow r;
for(r = row.firstRow; r; r = r.next)
UncheckBoxes(r);
}
+ NotifyChecked(master, this, row);
}
void UnsetChildren(DataRow row)
{
DataRow r;
- CheckListBoxButton button = buttonMaps[(int)row];
+ CheckListBoxButton button = buttonMaps[(uintptr)row];
if(button)
{
- bool wasChecked = button.checked;
button.checked = true;
button.buttonState = up;
- if(!wasChecked) NotifyChanged(master, this, row);
}
for(r = row.firstRow; r; r = r.next)
{
Iterator<DataRow> it { rowChecks };
+
if(it.Find(r))
it.Remove();
UnsetChildren(r);
+ NotifyChecked(master, this, r);
}
}
if(checked != wasChecked)
{
modifiedDocument = true;
- // NotifyChanged(master, this, row);
+ // NotifyChecked(master, this, row);
if(checked)
{
DataRow rr = row;
if(r != rr && !rowChecks.Find(r))
break;
}
- if(r || !row.parent) break;
+ if(r || !rr.parent) break;
rr = rr.parent;
}
+ rowChecks.Add(rr);
+
// Take out all children from rowChecks, checking them all
- UnsetChildren(row);
+ UnsetChildren(rr);
- rowChecks.Add(row);
+ NotifyChecked(master, this, row);
- for(parent = row.parent; parent; parent = parent.parent)
+ for(parent = rr.parent; parent; parent = parent.parent)
{
- DataRow r;
- CheckListBoxButton button = buttonMaps[(int)parent];
+ CheckListBoxButton button = buttonMaps[(uintptr)parent];
if(button)
{
button.checked = true;
button.buttonState = down;
+
+ NotifyChecked(master, this, parent);
}
}
}
else
{
DataRow rr = row;
- UncheckBoxes(row);
- parent = row.parent;
+ parent = rr.parent;
while(rr)
{
Iterator<DataRow> it { rowChecks };
else
{
DataRow r;
- for(r = row.parent.firstRow; r; r = r.next)
+ for(r = rr.parent.firstRow; r; r = r.next)
{
if(r != rr)
rowChecks.Add(r);
}
}
+ UncheckBoxes(row);
+
for(; parent; parent = parent.parent)
{
- CheckListBoxButton button = buttonMaps[(int)parent];
+ CheckListBoxButton button = buttonMaps[(uintptr)parent];
if(button)
{
if(CheckPartialChecks(parent))
button.checked = false;
button.buttonState = up;
}
+
+ NotifyChecked(master, this, parent);
}
}
}
-
- NotifyChanged(master, this, row);
}
}
return true;
}
- // virtual void Window::NotifyChecked(CheckListBox listBox, DataRow row);
+public:
+ bool IsChecked(DataRow row)
+ {
+ CheckListBoxButton button = buttonMaps[(uintptr)row];
+ DataRow parent;
+ for(parent = row; parent; parent = parent.parent) if(rowChecks.Find(parent)) return true;
+ // For partially checked because of children:
+ if(button && button.checked)
+ return true;
+ return false;
+ }
+
+ virtual void Window::NotifyChecked(CheckListBox listBox, DataRow row);
+
+ void SetDisabled(DataRow row, bool disabled)
+ {
+ CheckListBoxButton checkBox = buttonMaps[(uintptr)row];
+ if(checkBox)
+ checkBox.disabled = disabled;
+
+ if(rowDisabled.Find(row))
+ {
+ if(!disabled)
+ rowDisabled.TakeOut(row);
+ }
+ else
+ {
+ if(disabled)
+ rowDisabled.Add(row);
+ }
+ }
};