private void updateItems(final FileInfo parent) {
   if (fDisplay == null) return;
   assert Thread.currentThread() == fDisplay.getThread();
   TreeItem[] items = null;
   boolean expanded = true;
   if (parent.children == null || parent.children_error != null) {
     if (parent == fRootInfo) {
       fileTree.setItemCount(1);
       items = fileTree.getItems();
     } else {
       TreeItem item = findItem(parent);
       if (item == null) return;
       expanded = item.getExpanded();
       item.setItemCount(1);
       items = item.getItems();
     }
     assert items.length == 1;
     items[0].removeAll();
     if (parent.children_pending) {
       items[0].setForeground(fDisplay.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
       items[0].setText("Pending...");
     } else if (parent.children_error != null) {
       String msg = parent.children_error.getMessage();
       if (msg == null) msg = parent.children_error.getClass().getName();
       else msg = msg.replace('\n', ' ');
       items[0].setForeground(fDisplay.getSystemColor(SWT.COLOR_RED));
       items[0].setText(msg);
       items[0].setImage((Image) null);
     } else if (expanded) {
       loadChildren(parent);
       items[0].setForeground(fDisplay.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
       items[0].setText("Pending...");
     } else {
       items[0].setText("");
     }
   } else {
     FileInfo[] arr = parent.children;
     if (parent == fRootInfo) {
       fileTree.setItemCount(arr.length);
       items = fileTree.getItems();
     } else {
       TreeItem item = findItem(parent);
       if (item == null) return;
       expanded = item.getExpanded();
       item.setItemCount(expanded ? arr.length : 1);
       items = item.getItems();
     }
     if (expanded) {
       assert items.length == arr.length;
       for (int i = 0; i < items.length; i++) fillItem(items[i], arr[i]);
       expandSelect();
     } else {
       items[0].setText("");
     }
   }
 }
 private void fillItem(TreeItem item, FileInfo info) {
   assert Thread.currentThread() == fDisplay.getThread();
   Object data = item.getData("TCFContextInfo");
   if (data != null && data != info) item.removeAll();
   item.setData("TCFContextInfo", info);
   String text = info.name != null ? info.name : info.fullname;
   item.setText(text);
   item.setForeground(fDisplay.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
   item.setImage(getImage(info));
   if (!canHaveChildren(info)) item.setItemCount(0);
   else if (info.children == null || info.children_error != null) item.setItemCount(1);
   else item.setItemCount(info.children.length);
 }
 private void fillItem(TreeItem item, ContactInfo info) {
   item.setText(1, Integer.toString(info.getContactId()));
   item.setText(2, info.getNumber());
   item.setText(3, info.getName());
   item.setText(4, info.getSex());
   item.setText(5, info.getJob());
   item.setText(6, info.getPostTimeBegin() + " 至 " + info.getPostTimeEnd());
   item.setText(7, info.getCardId());
   item.setText(8, info.getPhoto());
   item.setText(9, info.getPhone());
   item.setText(10, info.getFax());
   item.setText(11, info.getEmail());
   item.setData(info);
   item.setItemCount(0);
 }