-import "ecere"
+#ifdef ECERE_STATIC
+public import static "ecere"
+#else
+public 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;
- fullRowSelect = false, collapseControl = true, treeBranches = true, rootCollapseButton = true,
+ fullRowSelect = false, collapseControl = true, treeBranches = true, rootCollapseButton = true,
noDragging = true;
// rowHeight = 18;
{
buttonMaps.RemoveAll();
}
-
+
bool NotifyCollapse(CheckListBox listBox, DataRow row, bool collapsed)
{
DataRow r;
{
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)
{
listBox.SetupButtons(r, false);
}
- if(r.firstRow && !r.collapsed)
+ if(r.firstRow && !r.collapsed)
r = r.firstRow;
- else
+ else
for(; r != row; r = r.parent)
if(r.next) { r = r.next; break; }
}
for(r = row.GetNextRow(); r; r = r.GetNextRow())
{
- Button checkBox = listBox.buttonMaps[(int)r];
+ Button checkBox = listBox.buttonMaps[(uintptr)r];
if(checkBox)
checkBox.position.y = 1 + (r.index + listBox.hasHeader) * listBox.rowHeight;
}
}
return false;
}
-
+
void SetupButtons(DataRow row, bool recurse)
{
DataRow parent;
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;
if(ListBox::OnCreate())
{
DataRow row;
-
+
buttonMaps.RemoveAll();
for(row = firstRow; row; row = row.next)
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;
for(r = row; r; r = r.parent)
if(rowChecks.Find(r))
- {
+ {
checked = true;
break;
- }
+ }
SetCheck(row, !checked);
}
}
{
if(!row.parent || !row.parent.collapsed)
{
- CheckListBoxButton button = buttonMaps[(int)row];
+ CheckListBoxButton button = buttonMaps[(uintptr)row];
if(button)
{
- bool wasChecked = button.checked;
button.checked = false;
button.buttonState = up;
}
for(r = row.firstRow; r; r = r.next)
UncheckBoxes(r);
}
- NotifyChanged(master, this, row);
+ 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(it.Find(r))
it.Remove();
UnsetChildren(r);
- NotifyChanged(master, this, r);
- }
+ NotifyChecked(master, this, r);
+ }
}
-
+
void SetCheck(DataRow row, bool checked)
{
DataRow parent;
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(row);
+ rowChecks.Add(rr);
// Take out all children from rowChecks, checking them all
- UnsetChildren(row);
+ UnsetChildren(rr);
+
+ NotifyChecked(master, this, rr);
- for(parent = row.parent; parent; parent = parent.parent)
+ for(parent = rr.parent; parent; parent = parent.parent)
{
- CheckListBoxButton button = buttonMaps[(int)parent];
+ CheckListBoxButton button = buttonMaps[(uintptr)parent];
if(button)
{
- // Partial Check
button.checked = true;
button.buttonState = down;
- NotifyChanged(master, this, parent);
+ NotifyChecked(master, this, parent);
}
}
}
{
DataRow rr = row;
+ 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);
rr = rr.parent;
}
}
+
UncheckBoxes(row);
- for(parent = row.parent; parent; parent = parent.parent)
+ for(; parent; parent = parent.parent)
{
- CheckListBoxButton button = buttonMaps[(int)parent];
+ CheckListBoxButton button = buttonMaps[(uintptr)parent];
if(button)
{
if(CheckPartialChecks(parent))
button.buttonState = up;
}
- NotifyChanged(master, this, parent);
+ NotifyChecked(master, this, parent);
}
}
}
-
- NotifyChanged(master, this, row);
}
}
-
+
bool NotifyKeyDown(CheckListBox listBox, DataRow row, Key key, unichar ch)
{
if(key == space)
public:
bool IsChecked(DataRow row)
{
- CheckListBoxButton button = buttonMaps[(int)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:
return false;
}
- // virtual void Window::NotifyChecked(CheckListBox listBox, DataRow row);
+ 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);
+ }
+ }
};