ecere:ListBox; fixed OnKeyHit to let alt key and ctrl key (only if multiSelect is...
authorRejean Loyer <rejean.loyer@gmail.com>
Mon, 22 Oct 2012 08:57:51 +0000 (04:57 -0400)
committerRejean Loyer <rejean.loyer@gmail.com>
Mon, 22 Oct 2012 09:44:34 +0000 (05:44 -0400)
ecere/src/gui/controls/ListBox.ec

index 5def02b..e18edca 100644 (file)
@@ -4184,254 +4184,254 @@ private:
          }
       }
 
-      if(!(style.multiSelect) && (key.ctrl))
-         return true;
-
       if(editData && editData.visible && ch && !key.alt && !key.ctrl && editData.active)
          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)
+               {
+                  if(currentRow.collapsed)
+                     currentRow.collapsed = false;
+                  else
+                     SetCurrentRow(currentRow.subRows.first, true);
+                  return false;
+               }
+               else if(style.alwaysEdit)
                {
-                  DataField field;
-                  for(field = currentField.next; field; field = field.next)
+                  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)
+                     {
+                        for(selRow = clickedRow; selRow; selRow = selRow.GetNextRow())
+                        {
+                           if(key.ctrl)
+                           {
+                              if(selRow.selectedFlag) selRow.selectedFlag = tempUnselected; else selRow.selectedFlag = tempSelected;
+                           }
+                           else
+                              selRow.selectedFlag = selected;
+                           if(selRow == currentRow)
+                              break;
+                        }
+                     }
+                     else
                      {
-                        if(key.ctrl)
+                        for(selRow = currentRow; 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 == 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;
 
@@ -4448,7 +4448,6 @@ private:
       return true;
    }
 
-
    void OnHScroll(ScrollBarAction action, int position, Key key)
    {
       Update(null);