Fix the tab order of the control toolbox.

[DEVELOPMENT ENVIRONMENT]
* BUG: Fix the tab order of the control toolbox.

[GB.WEB.GUI]
* NEW: WebListBox is a new listbox control.
This commit is contained in:
gambas 2020-04-09 10:53:31 +02:00
parent 812cd85c9d
commit d6cf0e8fb4
13 changed files with 499 additions and 138 deletions

View file

@ -1,7 +1,6 @@
# Gambas Project File 3.0
Title=Gambas 3
Startup=Project
Profiling=1
Icon=img/logo/logo-ide.png
Version=3.14.90
VersionFile=1

View file

@ -23,7 +23,7 @@ End
Public Sub Form_Open()
$aOrder = ["Form", "View", "Report", "WebForm", "TermForm", "Dialog", "Chooser", "Container", "Data", "Network", "Special"]
$aOrder = ["Form", "WebForm", "TermForm", "View", "Report", "Dialog", "Chooser", "Container", "Data", "Network", "Special"]
ReadConfig
SetTool

View file

@ -7,48 +7,18 @@ Private $bInvert As Boolean
Event _Fake
' Private Sub Dump()
'
' Dim I As Integer
' '
' ' Print System.Backtrace.Join(" ")
' '
' Print "Selection = ";
' For I = 0 To $aSel.Max Step 2
' Print "["; $aSel[I]; ","; $aSel[I + 1]; "] ";
' Next
' Print
'
' End
'
Private Sub GetTable() As WebTable
Return Object.Parent(Me)
Public Sub GetItemCount() As Integer
Return Object.Parent(Me).Count
End
Public Sub Refresh()
GetTable().Refresh
Object.Parent(Me).Refresh
End
Public Sub SetSelection(aSel As Integer[], bInvert As Boolean)
$aSel = aSel
$bInvert = bInvert
End
Public Sub Copy() As WebTableSelection
Dim hSel As WebTableSelection = New WebTableSelection
hSel.SetSelection($aSel.Copy(), $bInvert)
Return hSel
End
Private Sub Add(iStart As Integer, Optional iLength As Integer = 1)
@ -177,7 +147,7 @@ Public Function GetSelectedRows() As Integer[]
If $bInvert Then
For I = 0 To GetTable().Max
For I = 0 To GetItemCount() - 1
If IsSelected(I) Then aRet.Add(I)
Next
@ -198,8 +168,8 @@ Public Function GetSelectedRows() As Integer[]
End
Private Sub Count_Read() As Integer
Private Function Count_Read() As Integer
Dim I, N As Integer
For I = 0 To $aSel.Max Step 2
@ -208,79 +178,22 @@ Private Sub Count_Read() As Integer
If $bInvert Then
Return GetTable().Count - N
Return GetItemCount() - N
Else
Return N
Endif
End
Public Sub IsEverythingSelected() As Boolean
If $bInvert And $aSel.Count = 0 Then Return True
End
' Public Sub InsertRows(iStart As Integer, iLength As Integer)
'
' Dim I, S, L As Integer
'
' For I = 0 To $aSel.Max Step 2
'
' S = $aSel[i]
' L = $aSel[I + 1]
'
' If iStart <= S Then
' $aSel[I] += iLength
' Else If iStart <= (S + L) Then
' $aSel[I + 1] = iStart - S
' $aSel.Add(iStart + iLength)
' $aSel.Add(L - (iStart - S))
' Endif
'
' Next
'
' 'Dump
'
' End
'
' Public Sub RemoveRows(iStart As Integer, iLength As Integer)
'
' Dim I, S, L As Integer
'
' I = 0
' While I < $aSel.Count
'
' S = $aSel[I]
' L = $aSel[I + 1]
'
' If (iStart + iLength) <= S Then
' $aSel[I] -= iLength
' Else If iStart >= (S + L) Then
' Else
' If iStart < S Then
' iLength -= (S - iStart)
' $aSel[I] = iStart
' Endif
' $aSel[I + 1] -= iLength - (iStart - S)
' Endif
'
' If $aSel[I + 1] <= 0 Then
' $aSel.Remove(I, 2)
' Else
' I += 2
' Endif
'
' Wend
'
' 'Dump
'
' End
Public Sub GetCurrent() As Integer
@ -288,8 +201,56 @@ Public Sub GetCurrent() As Integer
If $aSel.Count = 2 Then
iCurrent = $aSel[0]
If iCurrent < GetTable().Count Then Return iCurrent
If iCurrent < GetItemCount() Then Return iCurrent
Endif
Return -1
End
Public Sub InsertRow(iRow As Integer)
Dim I As Integer
Dim S As Integer
Dim L As Integer
For I = 0 To $aSel.Max Step 2
S = $aSel[I]
L = $aSel[I + 1]
If iRow <= S Then
Inc $aSel[I]
Else If iRow < (S + L) Then
Inc $aSel[I + 1]
Endif
Next
End
Public Sub RemoveRow(iRow As Integer)
Dim I As Integer
Dim S As Integer
Dim L As Integer
I = 0
While I < $aSel.Count
S = $aSel[I]
L = $aSel[I + 1]
If iRow <= S Then
Dec $aSel[I]
Else If iRow < (S + L) Then
Dec $aSel[I + 1]
If $aSel[I + 1] = 0 Then
$aSel.Remove(I, 2)
Continue
Endif
Endif
I += 2
Wend
End

View file

@ -4,6 +4,7 @@ Export
Inherits WebControl
Public Const _Properties As String = "*,Border=True,Mode{Select.*}=None,ShowCheck=True,ShowHeader=True,Sortable"
Public Const _Group As String = "View"
Public Const _DrawWith As String = "GridView"
Public Const _DefaultSize As String = "24,24"
Public Const _DefaultEvent As String = "Data"
@ -34,7 +35,7 @@ Property SortOrder As Integer
Private $hColumns As _WebTableColumns
Private $iCount As Integer
Private $iMode As Integer
Private $hSelection As WebTableSelection
Private $hSelection As CSelection
Private $iStep As Integer = 100
Private $iDisplay As Integer = 100
@ -138,7 +139,7 @@ Private Sub PrintBody(iStart As Integer, iEnd As Integer)
If $bNoCheck Then
Print " id=\""; Me.Name & ":" & CStr(iRow); "\""
If IsSelected(iRow) Then Print " class=\"gw-table-row-selected\";"
If IsSelected(iRow) Then Print " class=\"gw-selected\";"
'Print Me._GetUpdateJS("onclick", "$" & CStr(iRow));
Print " onmousedown=\"gw.table.select("; JS(Me.Name); ","; iRow;
Else
@ -244,12 +245,11 @@ Private Sub SetSelection()
If $iMode = Select.None Then
$hSelection = Null
Else
If Not $hSelection Then $hSelection = New WebTableSelection As "TableSelection"
If Not $hSelection Then $hSelection = New CSelection As "Selection"
Endif
End
Public Sub SelectAll()
If $hSelection Then

View file

@ -190,3 +190,17 @@ Public Sub WebButton7_Click()
WebFileButton1.Abort()
End
Public Sub WebListBox1_Activate()
Message(WebListBox1.Text)
End
Public Sub WebListBox1_Select()
Dim aSel As String[] = WebListBox1.Selection
WebTextArea1.Text = aSel.Join()
End

View file

@ -132,8 +132,36 @@
}
Index = 1
Text = ("Tab 2")
{ WebVBox1 WebVBox
#MoveScaled(1,1,133.75,12)
{ WebRadioButton1 WebRadioButton
#MoveScaled(1,1,131.75,3)
Text = ("Alpha")
}
{ WebRadioButton2 WebRadioButton
#MoveScaled(1,4,131.75,3)
Text = ("Beta")
}
{ WebRadioButton3 WebRadioButton
#MoveScaled(1,7,131.75,3)
Text = ("Gamma")
}
}
{ WebListBox1 WebListBox
#MoveScaled(1,14,133.75,31)
Height = "14em"
List = [("Élément 1"), ("Élément 2"), ("Élément 3"), ("Élément 4"), ("<i>Élément 5</i>"), ("Élément 6"), ("Élément 7"), ("Élément 8"), ("<span style=\"color:red;\">Élément 9</span>"), ("Élément 10"), ("Élément 11"), ("Élément 12")]
Mode = Select.Multiple
UseHTML = True
}
{ WebTextArea1 WebTextArea
#MoveScaled(1,46,133.75,16)
Height = "8em"
}
Index = 2
Text = ("Tab 3")
{ WebHBox2 WebHBox
#MoveScaled(1,1,85.75,6)
#MoveScaled(1,1,133.75,6)
Spacing = True
{ WebCheckBox1 WebCheckBox
#MoveScaled(1,1,18,4)
@ -153,30 +181,13 @@
}
}
{ WebImage1 WebImage
#MoveScaled(1,8,85.75,6)
#MoveScaled(1,8,133.75,6)
Image = "favicon.png"
}
{ lblTime WebLabel
#MoveScaled(1,15,85.75,4)
#MoveScaled(1,15,133.75,4)
Font = "4em"
}
Index = 2
Text = ("Tab 3")
{ WebVBox1 WebVBox
#MoveScaled(1,1,85.75,14)
{ WebRadioButton1 WebRadioButton
#MoveScaled(1,1,83.75,4)
Text = ("Alpha")
}
{ WebRadioButton2 WebRadioButton
#MoveScaled(1,5,83.75,4)
Text = ("Beta")
}
{ WebRadioButton3 WebRadioButton
#MoveScaled(1,9,83.75,4)
Text = ("Gamma")
}
}
Index = 0
}
{ WebTimer1 WebTimer

View file

@ -0,0 +1,4 @@
' Gambas class file
Export

View file

@ -0,0 +1,9 @@
# Gambas Form File 3.0
{ WebForm WebForm
#MoveScaled(0,0,64,91)
{ WebListBox1 WebListBox
#MoveScaled(6,5,24,39)
List = [("Élément 1"), ("Élément 2"), ("Élément 3"), ("Élément 4"), ("Élément 5"), ("Élément 6"), ("Élément 7"), ("Élément 8"), ("Élément 9"), ("Élément 10"), ("Élément 11"), ("Élément 12")]
}
}

View file

@ -120,7 +120,7 @@ Public Sub _new(Optional Parent As WebContainer)
_NoRefresh = 1
Inc $iCount
WebForm.PrintLog("==== " & $iCount & " controls")
'WebForm.PrintLog("==== " & $iCount & " controls")
Inc $iLastId
$iId = $iLastId
@ -864,7 +864,7 @@ Public Sub Delete()
$cFromId[$iId] = Null
_Invalid = True
Dec $iCount
WebForm.PrintLog("==== " & $iCount & " controls")
'WebForm.PrintLog("==== " & $iCount & " controls")
'Debug $sName;; $iId;; System.Backtrace.Join(" ")
End

View file

@ -145,7 +145,6 @@ End
Static Private Sub Upload(sKey As String) As Boolean
Dim sErr As String
Dim sPath As String
Dim sTarget As String
@ -192,8 +191,6 @@ Static Public Sub Main()
Dim sRead As String
Dim sWrite As String
Dim sTemp As String
Dim sKey As String
Dim cEnv As Collection
Dim sPath As String
Dim aLib As String[]
Dim sFile As String

View file

@ -0,0 +1,297 @@
' Gambas class file
Export
Inherits WebControl
Public Const _Properties As String = "*,Border=True,List,Text,Mode{Select.*}=Single,UseHTML"
Public Const _Group As String = "View"
Public Const _DrawWith As String = "ListBox"
Public Const _DefaultSize As String = "24,4"
Public Const _Similar As String = "WebTextBox"
Public Const _DefaultEvent As String = "Click"
'' This event is raised when an item is clicked in the list box.
Event Click
'' This event is raised when an item is clicked twice.
Event Activate
'' This event is raised when the selection changes.
Event Select
'' Return the listbox selection mode.
Property Mode As Integer
'' Return or set the text of the current selected item.
Property Text As String
'' Return the number of items in the combo-box popup.
Property Read Count As Integer
'' Return or set the index of the current selected item.
Property Index, Current As Integer
'' Return or set the contents of the combo-box popup as a string array.
Property List As String[]
'' Return the list of selected items.
Property Read Selection As Integer[]
'' Return or set if the items are HTML or plain text.
Property UseHTML As Boolean
Private $aList As New String[]
Private $iMode As Integer
Private $hSelection As CSelection
Private $bHTml As Boolean
Public Sub _new()
Mode_Write(Select.Single)
End
Public Sub _RenderStyleSheet()
Me._StartStyleSheet
Super._RenderStyleSheet()
If $iMode = Select.None Then Me._AddStyleSheet("pointer-events: none;")
Me._EndStyleSheet
End
Public Sub _Render()
Dim I As Integer
For I = 0 To $aList.Max
Print "<div";
If IsSelected(I) Then Print " class=\"gw-selected\"";
If $iMode Then
Print " onmousedown=\"gw.listbox.select("; JS(Me.Name); ","; I;
If $iMode = Select.Multiple Then Print ",event";
Print ");\"";
Endif
If Object.CanRaise(Me, "Activate") Then Print Me._GetEventJS("ondblclick", "Activate");
Print ">";
If $bHtml Then
Print $aList[I];
Else
Print Html($aList[I]);
Endif
Print "</div>";
Next
If $iMode = Select.Single Then WebForm._AddJavascript("$(" & JS(Me.Name) & ").gw_current = " & Index_Read())
End
Public Sub _UpdateProperty(sProp As String, vValue As Variant)
Select Case sProp
Case "+"
Inc Me._NoRefresh
Try Select(vValue[0], vValue[1])
Dec Me._NoRefresh
Case "-"
Inc Me._NoRefresh
Try Unselect(vValue[0], vValue[1])
Dec Me._NoRefresh
Case "$"
Inc Me._NoRefresh
Try Select(vValue)
Dec Me._NoRefresh
End Select
End
Private Function Text_Read() As String
Try Return $aList[Index_Read()]
End
Private Sub Text_Write(Value As String)
Me.Index = $aList.Find(Value)
End
Private Function Count_Read() As Integer
Return $aList.Count
End
Private Function Index_Read() As Integer
If $iMode <> Select.None Then
Return $hSelection.GetCurrent()
Else
Return -1
Endif
End
Private Sub Index_Write(Value As Integer)
If $iMode = Select.None Then Return
UnselectAll
Select(Value)
End
Private Function List_Read() As String[]
Return $aList.Copy()
End
Private Sub List_Write(Value As String[])
UnselectAll
If Not Value Then
$aList.Clear
Else
$aList = Value.Copy()
Endif
Me.Refresh
End
Private Function Mode_Read() As Integer
Return $iMode
End
Private Sub SetSelection()
If $iMode = Select.None Then
$hSelection = Null
Else
If Not $hSelection Then $hSelection = New CSelection As "Selection"
Endif
End
Private Sub Mode_Write(Value As Integer)
If $iMode = Value Then Return
$iMode = Value
SetSelection
Me.Refresh
End
Public Sub Clear()
UnselectAll
$aList.Clear
Me.Refresh
End
Public Sub SelectAll()
If $hSelection Then
$hSelection.SelectAll
Raise Select
Endif
End
Public Sub UnselectAll()
If $hSelection Then
$hSelection.UnselectAll
Raise Select
Endif
End
Public Sub Select(Row As Integer, Optional Length As Integer = 1)
If $hSelection Then
If $iMode = Select.Single Then
$hSelection.UnselectAll
$hSelection.Select(Row)
Else
$hSelection.Select(Row, Length)
Endif
Raise Select
Endif
End
Public Sub Unselect(Row As Integer, Optional Length As Integer = 1)
If $hSelection Then
$hSelection.Unselect(Row, Length)
Raise Select
Endif
End
Public Sub IsSelected(Row As Integer) As Boolean
If $hSelection Then Return $hSelection.IsSelected(Row)
End
Private Function Selection_Read() As Integer[]
If $hSelection Then Return $hSelection.GetSelectedRows()
End
'' Add an item to the list.
''
'' - ~Item~ is the text of the item to add.
'' - ~Index~ is the position the item will be inserted from. If not specified, the item is added at the end of the popup list.
Public Sub Add(Item As String, Optional Index As Integer = -1)
$aList.Add(Item, Index)
If $hSelection Then $hSelection.InsertRow(Index)
Me.Refresh
End
'' Remove an item from the list.
''
'' - ~Index~ is the index of the item to remove, between 0 and [../count] - 1.
Public Sub Remove(Index As Integer)
$aList.Remove(Index)
If $hSelection Then $hSelection.RemoveRow(Index)
Me.Refresh
End
Private Function UseHtml_Read() As Boolean
Return $bHtml
End
Private Sub UseHtml_Write(Value As Boolean)
If $bHtml = Value Then Return
$bHtml = Value
Me.Refresh
End

View file

@ -1093,9 +1093,9 @@ gw = {
{
tr = $(id + ':' + i);
if (checked)
tr.addClass('gw-table-row-selected');
tr.addClass('gw-selected');
else
tr.removeClass('gw-table-row-selected');
tr.removeClass('gw-selected');
}
gw.update(id, '!' + start + ':' + (end - start + 1), checked);
@ -1105,7 +1105,7 @@ gw = {
{
var elt = $(id + ':' + row);
var last = $(id).gw_current;
var selected = !elt.hasClass('gw-table-row-selected');
var selected = !elt.hasClass('gw-selected');
if (event)
{
@ -1117,8 +1117,8 @@ gw = {
else
{
if (last != undefined)
$(id + ':' + last) && $(id + ':' + last).removeClass('gw-table-row-selected');
elt.addClass('gw-table-row-selected');
$(id + ':' + last) && $(id + ':' + last).removeClass('gw-selected');
elt.addClass('gw-selected');
gw.update(id, '$' + row, null);
}
@ -1282,7 +1282,7 @@ gw = {
child = $(child);
gw.table.scroll(id, child.offsetLeft - (sw.clientWidth - child.offsetWidth) / 2, child.offsetTop - (sw.clientHeight - child.offsetHeight) / 2);
}
},
},
file:
{
@ -1474,7 +1474,62 @@ gw = {
{
$(id).lastElementChild.innerHTML = text;
}
}
},
listbox:
{
selectRange: function(id, start, end, checked)
{
var items = $(id).children;
var i;
var elt;
if (end < start)
{
i = start;
start = end;
end = i;
}
for (i = start; i <= end; i++)
{
elt = items[i];
if (checked)
elt.addClass('gw-selected');
else
elt.removeClass('gw-selected');
}
gw.update(id, checked ? '+' : '-', [start, end - start + 1]);
},
select: function(id, row, event)
{
var items = $(id).children;
var elt = items[row];
var last = $(id).gw_current;
var selected = !elt.hasClass('gw-selected');
if (event)
{
if (event.shiftKey && last)
gw.listbox.selectRange(id, last, row, selected);
else
gw.listbox.selectRange(id, row, row, selected);
}
else
{
if (last != undefined)
items[last] && items[last].removeClass('gw-selected');
elt.addClass('gw-selected');
gw.update(id, '$', row);
}
$(id).gw_current = row;
/*$(id).addClass('gw-unselectable');
setTimeout(function() { $(id).removeClass('gw-unselectable'); }, 0);*/
}
}
}

View file

@ -813,7 +813,6 @@ TABLE.gw-calendar > TBODY > TR > TD.gw-date-current {
position: relative;
border: solid 1px #C0C0C0;
min-height: 0.5em;
border-radius: 0.25em;
}
.gw-progressbar.gw-noborder {
@ -825,7 +824,6 @@ TABLE.gw-calendar > TBODY > TR > TD.gw-date-current {
height: 100%;
background: #C0C0C0;
border: solid 1px white;
border-radius: 0.25em;
z-index: -1;
}
@ -853,7 +851,7 @@ TABLE.gw-calendar > TBODY > TR > TD.gw-date-current {
border: none;
}
.gw-table-row-selected {
.gw-selected {
background-color: #2980B9 !important;
color: white !important;
}
@ -924,3 +922,19 @@ TABLE.gw-calendar > TBODY > TR > TD.gw-date-current {
left: -2000px;
}
.gw-listbox {
display: flex;
flex-direction: column;
border: solid 1px #C0C0C0;
user-select: none;
cursor: pointer;
overflow: auto;
}
.gw-listbox.gw-noborder {
border: none;
}
.gw-listbox > DIV {
padding: 0.25em 0.5em;
}