public static TableColumnCore[] createIncompleteDM(String tableID) {
    final String[] defaultVisibleOrder = {
      HealthItem.COLUMN_ID,
      RankItem.COLUMN_ID,
      NameItem.COLUMN_ID,
      "TorrentStream",
      "azsubs.ui.column.subs",
      "RatingColumn",
      "Info",
      CommentIconItem.COLUMN_ID,
      SizeItem.COLUMN_ID,
      DownItem.COLUMN_ID,
      DoneItem.COLUMN_ID,
      StatusItem.COLUMN_ID,
      SeedsItem.COLUMN_ID,
      PeersItem.COLUMN_ID,
      DownSpeedItem.COLUMN_ID,
      UpSpeedItem.COLUMN_ID,
      ETAItem.COLUMN_ID,
      ShareRatioItem.COLUMN_ID,
      TrackerStatusItem.COLUMN_ID,
    };

    TableColumnManager tcManager = TableColumnManager.getInstance();
    Map mapTCs = tcManager.getTableColumnsAsMap(DownloadTypeIncomplete.class, tableID);

    tcManager.setDefaultColumnNames(tableID, defaultVisibleOrder);

    if (!tcManager.loadTableColumnSettings(DownloadTypeIncomplete.class, tableID)
        || areNoneVisible(mapTCs)) {
      setVisibility(mapTCs, defaultVisibleOrder);
      RankItem tc = (RankItem) mapTCs.get(RankItem.COLUMN_ID);
      if (tc != null) {
        tcManager.setDefaultSortColumnName(tableID, RankItem.COLUMN_ID);
        tc.setSortAscending(true);
      }
    }

    return (TableColumnCore[]) mapTCs.values().toArray(new TableColumnCore[0]);
  }
  /** @since 3.1.1.1 */
  public static void initCoreColumns() {
    // short variable names to reduce wrapping
    final Map<String, cInfo> c = new LightHashMap(50);
    final Class tc = TableColumn.class;

    c.put(RankItem.COLUMN_ID, new cInfo(RankItem.class, RankItem.DATASOURCE_TYPE));
    c.put(NameItem.COLUMN_ID, new cInfo(NameItem.class, NameItem.DATASOURCE_TYPE));
    c.put(SizeItem.COLUMN_ID, new cInfo(SizeItem.class, SizeItem.DATASOURCE_TYPE));
    c.put(DoneItem.COLUMN_ID, new cInfo(DoneItem.class, DoneItem.DATASOURCE_TYPE));
    c.put(StatusItem.COLUMN_ID, new cInfo(StatusItem.class, StatusItem.DATASOURCE_TYPE));
    c.put(ETAItem.COLUMN_ID, new cInfo(ETAItem.class, ETAItem.DATASOURCE_TYPE));
    c.put(HealthItem.COLUMN_ID, new cInfo(HealthItem.class, HealthItem.DATASOURCE_TYPE));
    c.put(
        CommentIconItem.COLUMN_ID,
        new cInfo(CommentIconItem.class, CommentIconItem.DATASOURCE_TYPE));
    c.put(DownItem.COLUMN_ID, new cInfo(DownItem.class, DownItem.DATASOURCE_TYPE));
    c.put(SeedsItem.COLUMN_ID, new cInfo(SeedsItem.class, SeedsItem.DATASOURCE_TYPE));
    c.put(PeersItem.COLUMN_ID, new cInfo(PeersItem.class, PeersItem.DATASOURCE_TYPE));
    c.put(DownSpeedItem.COLUMN_ID, new cInfo(DownSpeedItem.class, DownSpeedItem.DATASOURCE_TYPE));
    c.put(UpSpeedItem.COLUMN_ID, new cInfo(UpSpeedItem.class, UpSpeedItem.DATASOURCE_TYPE));
    c.put(
        UpSpeedLimitItem.COLUMN_ID,
        new cInfo(UpSpeedLimitItem.class, UpSpeedLimitItem.DATASOURCE_TYPE));
    c.put(
        TrackerStatusItem.COLUMN_ID,
        new cInfo(TrackerStatusItem.class, TrackerStatusItem.DATASOURCE_TYPE));
    c.put(CompletedItem.COLUMN_ID, new cInfo(CompletedItem.class, CompletedItem.DATASOURCE_TYPE));
    c.put(
        ShareRatioItem.COLUMN_ID, new cInfo(ShareRatioItem.class, ShareRatioItem.DATASOURCE_TYPE));
    c.put(
        ShareRatioProgressItem.COLUMN_ID,
        new cInfo(ShareRatioProgressItem.class, ShareRatioProgressItem.DATASOURCE_TYPE));
    c.put(UpItem.COLUMN_ID, new cInfo(UpItem.class, UpItem.DATASOURCE_TYPE));
    c.put(RemainingItem.COLUMN_ID, new cInfo(RemainingItem.class, RemainingItem.DATASOURCE_TYPE));
    c.put(PiecesItem.COLUMN_ID, new cInfo(PiecesItem.class, PiecesItem.DATASOURCE_TYPE));
    c.put(
        CompletionItem.COLUMN_ID, new cInfo(CompletionItem.class, CompletionItem.DATASOURCE_TYPE));
    c.put(CommentItem.COLUMN_ID, new cInfo(CommentItem.class, CommentItem.DATASOURCE_TYPE));
    c.put(
        MaxUploadsItem.COLUMN_ID, new cInfo(MaxUploadsItem.class, MaxUploadsItem.DATASOURCE_TYPE));
    c.put(
        TotalSpeedItem.COLUMN_ID, new cInfo(TotalSpeedItem.class, TotalSpeedItem.DATASOURCE_TYPE));
    c.put(FilesDoneItem.COLUMN_ID, new cInfo(FilesDoneItem.class, FilesDoneItem.DATASOURCE_TYPE));
    c.put(
        FileExtensionItem.COLUMN_ID,
        new cInfo(FileExtensionItem.class, FileExtensionItem.DATASOURCE_TYPE));
    c.put(SavePathItem.COLUMN_ID, new cInfo(SavePathItem.class, SavePathItem.DATASOURCE_TYPE));
    c.put(
        TorrentPathItem.COLUMN_ID,
        new cInfo(TorrentPathItem.class, TorrentPathItem.DATASOURCE_TYPE));
    c.put(CategoryItem.COLUMN_ID, new cInfo(CategoryItem.class, CategoryItem.DATASOURCE_TYPE));
    c.put(TagsItem.COLUMN_ID, new cInfo(TagsItem.class, TagsItem.DATASOURCE_TYPE));
    c.put(TagColorsItem.COLUMN_ID, new cInfo(TagColorsItem.class, TagColorsItem.DATASOURCE_TYPE));
    c.put(NetworksItem.COLUMN_ID, new cInfo(NetworksItem.class, NetworksItem.DATASOURCE_TYPE));
    c.put(
        PeerSourcesItem.COLUMN_ID,
        new cInfo(PeerSourcesItem.class, PeerSourcesItem.DATASOURCE_TYPE));
    c.put(
        AvailabilityItem.COLUMN_ID,
        new cInfo(AvailabilityItem.class, AvailabilityItem.DATASOURCE_TYPE));
    c.put(AvgAvailItem.COLUMN_ID, new cInfo(AvgAvailItem.class, AvgAvailItem.DATASOURCE_TYPE));
    c.put(
        SecondsSeedingItem.COLUMN_ID,
        new cInfo(SecondsSeedingItem.class, SecondsSeedingItem.DATASOURCE_TYPE));
    c.put(
        SecondsDownloadingItem.COLUMN_ID,
        new cInfo(SecondsDownloadingItem.class, SecondsDownloadingItem.DATASOURCE_TYPE));
    c.put(
        TimeSinceDownloadItem.COLUMN_ID,
        new cInfo(TimeSinceDownloadItem.class, TimeSinceDownloadItem.DATASOURCE_TYPE));
    c.put(
        TimeSinceUploadItem.COLUMN_ID,
        new cInfo(TimeSinceUploadItem.class, TimeSinceUploadItem.DATASOURCE_TYPE));
    c.put(
        OnlyCDing4Item.COLUMN_ID, new cInfo(OnlyCDing4Item.class, OnlyCDing4Item.DATASOURCE_TYPE));
    c.put(
        TrackerNextAccessItem.COLUMN_ID,
        new cInfo(TrackerNextAccessItem.class, TrackerNextAccessItem.DATASOURCE_TYPE));
    c.put(
        TrackerNameItem.COLUMN_ID,
        new cInfo(TrackerNameItem.class, TrackerNameItem.DATASOURCE_TYPE));
    c.put(
        SeedToPeerRatioItem.COLUMN_ID,
        new cInfo(SeedToPeerRatioItem.class, SeedToPeerRatioItem.DATASOURCE_TYPE));
    c.put(
        DownSpeedLimitItem.COLUMN_ID,
        new cInfo(DownSpeedLimitItem.class, DownSpeedLimitItem.DATASOURCE_TYPE));
    c.put(
        SwarmAverageSpeed.COLUMN_ID,
        new cInfo(SwarmAverageSpeed.class, SwarmAverageSpeed.DATASOURCE_TYPE));
    c.put(
        SwarmAverageCompletion.COLUMN_ID,
        new cInfo(SwarmAverageCompletion.class, SwarmAverageCompletion.DATASOURCE_TYPE));
    c.put(
        BadAvailTimeItem.COLUMN_ID,
        new cInfo(BadAvailTimeItem.class, BadAvailTimeItem.DATASOURCE_TYPE));
    c.put(
        ColumnFileCount.COLUMN_ID,
        new cInfo(ColumnFileCount.class, ColumnFileCount.DATASOURCE_TYPE));
    c.put(
        ColumnTorrentSpeed.COLUMN_ID,
        new cInfo(ColumnTorrentSpeed.class, ColumnTorrentSpeed.DATASOURCE_TYPE));

    c.put(
        DateCompletedItem.COLUMN_ID,
        new cInfo(DateCompletedItem.class, DateCompletedItem.DATASOURCE_TYPE));
    c.put(
        DateFileCompletedItem.COLUMN_ID,
        new cInfo(DateFileCompletedItem.class, DateFileCompletedItem.DATASOURCE_TYPE));
    c.put(DateAddedItem.COLUMN_ID, new cInfo(DateAddedItem.class, DateAddedItem.DATASOURCE_TYPE));
    c.put(IPFilterItem.COLUMN_ID, new cInfo(IPFilterItem.class, IPFilterItem.DATASOURCE_TYPE));
    c.put(AlertsItem.COLUMN_ID, new cInfo(AlertsItem.class, AlertsItem.DATASOURCE_TYPE));
    c.put(
        TorrentCreateDateItem.COLUMN_ID,
        new cInfo(TorrentCreateDateItem.class, TorrentCreateDateItem.DATASOURCE_TYPE));

    c.put(ColumnTC_NameInfo.COLUMN_ID, new cInfo(ColumnTC_NameInfo.class, tc));
    c.put(ColumnTC_Sample.COLUMN_ID, new cInfo(ColumnTC_Sample.class, tc));
    c.put(ColumnTC_ChosenColumn.COLUMN_ID, new cInfo(ColumnTC_ChosenColumn.class, tc));

    c.put(PeakUpItem.COLUMN_ID, new cInfo(PeakUpItem.class, PeakUpItem.DATASOURCE_TYPE));
    c.put(PeakDownItem.COLUMN_ID, new cInfo(PeakDownItem.class, PeakDownItem.DATASOURCE_TYPE));
    c.put(
        SmoothedUpItem.COLUMN_ID, new cInfo(SmoothedUpItem.class, SmoothedUpItem.DATASOURCE_TYPE));
    c.put(
        SmoothedDownItem.COLUMN_ID,
        new cInfo(SmoothedDownItem.class, SmoothedDownItem.DATASOURCE_TYPE));
    c.put(
        SmoothedETAItem.COLUMN_ID,
        new cInfo(SmoothedETAItem.class, SmoothedETAItem.DATASOURCE_TYPE));
    c.put(MinSRItem.COLUMN_ID, new cInfo(MinSRItem.class, MinSRItem.DATASOURCE_TYPE));
    c.put(MaxSRItem.COLUMN_ID, new cInfo(MaxSRItem.class, MaxSRItem.DATASOURCE_TYPE));

    c.put(SessionUpItem.COLUMN_ID, new cInfo(SessionUpItem.class, SessionUpItem.DATASOURCE_TYPE));
    c.put(
        SessionDownItem.COLUMN_ID,
        new cInfo(SessionDownItem.class, SessionDownItem.DATASOURCE_TYPE));

    // Core columns are implementors of TableColumn to save one class creation
    // Otherwise, we'd have to create a generic TableColumnImpl class, pass it
    // to another class so that it could manipulate it and act upon changes.

    TableColumnManager tcManager = TableColumnManager.getInstance();

    TableColumnCoreCreationListener tcCreator =
        new TableColumnCoreCreationListener() {
          // @see
          // org.gudy.azureus2.ui.swt.views.table.TableColumnCoreCreationListener#createTableColumnCore(java.lang.Class, java.lang.String, java.lang.String)
          public TableColumnCore createTableColumnCore(
              Class forDataSourceType, String tableID, String columnID) {
            cInfo info = (cInfo) c.get(columnID);

            try {
              Constructor constructor = info.cla.getDeclaredConstructor(new Class[] {String.class});
              TableColumnCore column =
                  (TableColumnCore) constructor.newInstance(new Object[] {tableID});
              return column;
            } catch (Exception e) {
              Debug.out(e);
            }

            return null;
          }

          public void tableColumnCreated(TableColumn column) {}
        };

    for (Iterator iter = c.keySet().iterator(); iter.hasNext(); ) {
      String id = (String) iter.next();
      cInfo info = (cInfo) c.get(id);

      tcManager.registerColumn(info.forDataSourceType, id, tcCreator);
    }
  }