private void SetViewMode(ListView view, View newViewMode)
        {
            // Keep the old column states if we go away from details mode.
              // They will be restored later when we go back to details view and have
              // added the columns again.
              if (view.View == View.Details)
            SaveColumnStates(view);

              if (view.View != newViewMode)
              {
            switch (newViewMode)
            {
              case View.Tile:
            view.View = newViewMode;
            view.TileSize = new Size(140, 17);
            view.LargeImageList = IconManagerWrapper.ImageList16;
            break;
              case View.LargeIcon:
            view.View = newViewMode;
            view.LargeImageList = IconManagerWrapper.ImageList48;
            break;
              case View.Details:
            // This call will make the scrollbars visible for a moment but works around a more serious problem.
            // When the listview is switched to report mode without scrollbars being visible then it will not adjust
            // its client area for the header and parts of the first items are hidden behind the header.
            view.Scrollable = true;
            view.View = newViewMode;
            view.Scrollable = false;
            break;
            }

            // Adjust item image indices, as they might not be the same for large and small icons.
            for (int i = 0; i < view.Items.Count; i++)
            {
              NodeIdWrapper id = (view.Items[i].Tag as Identifier).id;
              view.Items[i].ImageIndex = FindImageIndex(id, view.View);
            }
            view.PerformLayout();
              }
        }
        private void PopulateListView(NodeIdWrapper parentNodeId, ListView listView)
        {
            listView.BeginUpdate();
              try
              {
            int itemCount = wbOverview.count_children(parentNodeId);
            ListViewItem[] items = new ListViewItem[itemCount];

            int detail_fields_count = wbOverview.get_details_field_count(parentNodeId);

            for (int i = 0; i < itemCount; i++)
            {
              NodeIdWrapper itemNodeId = wbOverview.get_child(parentNodeId, i);
              string caption;

              wbOverview.get_field(itemNodeId, (int)Overview.Columns.Label, out caption);
              ListViewItem item = new ListViewItem(caption, FindImageIndex(itemNodeId, listView.View));
              item.Tag = CreateIdentifier(itemNodeId);
              item.ToolTipText = caption;

              // Add details for that item, if available.
              for (int counter = 0; counter < detail_fields_count; counter++)
              {
            String detailText;
            wbOverview.get_field(itemNodeId, (int)Overview.Columns.FirstDetailField + counter, out detailText);
            item.SubItems.Add(detailText.Replace(Environment.NewLine, " / "));
              }

              items[i] = item;
            }
            listView.Items.Clear();
            listView.Items.AddRange(items);

            // Setting the sorter also starts sorting.
            listView.ListViewItemSorter = new InsensitiveListviewComparer(0, SortOrder.Ascending);
            Win32.SetSortIcon(listView, 0, SortOrder.Ascending);

            // select stuff
            List<int> selected = wbOverview.get_selected_children(parentNodeId);
            foreach (int i in selected)
              listView.SelectedIndices.Add(i);
              }
              finally
              {
            listView.EndUpdate();
            listView.PerformLayout();
              };
        }