Curl Global Community
ListBox のアイテムをソートするには? - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: ListBox のアイテムをソートするには? (/showthread.php?tid=1027)



ListBox のアイテムをソートするには? - umemura - 01-09-2014

ListBoxで表示されているアイテムの順番をソートしたいです。

ListBox.list-items はIterator のため、ソートが出来ません。

ListBox.data-model を DefaultDataModel にキャストしてソートすると、
表示内容がおかしくなってしまいました。

一度、ListBox.clear-items でクリアして、
ソートしたアイテムを追加しなおすしかないのでしょうか。

DropdownList でも同様の処理をしたいと思っています。
簡単にソートする方法があれば教えてください。




RE: ListBox のアイテムをソートするには? - dyoshida - 02-02-2014

ちょうど同じようなことを試していたのでご参考までですが

ListBox.data-model にDefaultListModelが設定されている前提でDefaultListModel.sortメソッドを
使ってソートしたところ、表示内容も意図通りにソートされているように見えます。

(すでにお試しの方法で表示がおかしくなる条件があるのかもしれませんが ・・・)
下記のコードで試しています。

Code:
{define-proc {sort-string-data
                 lm:ListModel,
                 ascending?:bool = true
             }:void
    {type-switch lm
     case dlm:DefaultListModel do
        {dlm.sort
            comparison-proc =
                {proc {v1:any, v2:any}:bool
                    def s1 = v1 asa String
                    def s2 = v2 asa String
                    
                    def res = ({s1.compare s2} < 0)
                    
                    {if not ascending? then
                        {return (not res)}
                    }
                    {return res}
                }
        }
    }
}

{value
    def items = {new {Array-of String},
                    "Aardvark", "Cat", "Dog", "Elephant", "Gnu", "Zebra"
                }
    
    def lb =
        {ListBox
            selection-policy = "single",
            height = 30mm,
            width = 30mm,
            {splice items}
        }
    
    def lb-asc-cb = {CommandButton
                     label = "asc",
                     {on Action do
                         {sort-string-data
                             lb.data-model
                         }
                     }
                 }
    def lb-desc-cb = {CommandButton
                      label = "desc",
                      {on Action do
                          {sort-string-data
                              lb.data-model,
                              ascending? = false
                          }
                      }
                  }
    
    def dl =
        {DropdownList
            width = 30mm,
            {splice items}
        }
    
    def dl-asc-cb = {CommandButton
                     label = "asc",
                     {on Action do
                         {sort-string-data
                             dl.data-model
                         }
                     }
                 }
    def dl-desc-cb = {CommandButton
                      label = "desc",
                      {on Action do
                          {sort-string-data
                              dl.data-model,
                              ascending? = false
                          }
                      }
                  }
    
    {VBox
        spacing = 5mm,
        {VBox
            lb,
            {HBox
                spacing = 1mm,
                lb-asc-cb, lb-desc-cb
            }
        },
        {VBox
            dl,
            {HBox
                spacing = 1mm,
                dl-asc-cb, dl-desc-cb
            }
        }
    }
}