+ private void addTagBar(List<SearchableTag> tags,
+ final SearchableTag selected) {
+ tags.add(0, null);
+
+ final JComboBox<SearchableTag> combo = new JComboBox<SearchableTag>(
+ tags.toArray(new SearchableTag[] {}));
+ combo.setSelectedItem(selected);
+
+ // We want to pass it a String
+ @SuppressWarnings({ "rawtypes" })
+ final ListCellRenderer basic = combo.getRenderer();
+
+ combo.setRenderer(new ListCellRenderer<SearchableTag>() {
+ @Override
+ public Component getListCellRendererComponent(
+ JList<? extends SearchableTag> list, SearchableTag value,
+ int index, boolean isSelected, boolean cellHasFocus) {
+
+ Object displayValue = value;
+ if (value == null) {
+ displayValue = "Select a tag...";
+ cellHasFocus = false;
+ isSelected = false;
+ } else {
+ displayValue = value.getName();
+ }
+
+ // We willingly pass a String here
+ @SuppressWarnings("unchecked")
+ Component rep = basic.getListCellRendererComponent(list,
+ displayValue, index, isSelected, cellHasFocus);
+
+ if (value == null) {
+ rep.setForeground(Color.GRAY);
+ }
+
+ return rep;
+ }
+ });
+
+ combo.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ final SearchableTag tag = (SearchableTag) combo
+ .getSelectedItem();
+ if (tag != null) {
+ addTagBar(tag, new Runnable() {
+ @Override
+ public void run() {
+ // TODO: stories if needed
+ setWaitingScreen(false);
+ }
+ });
+ }
+ }
+ });
+
+ tagBars.add(combo);
+ }
+
+ // async, add children of tag, NULL = base tags
+ private void addTagBar(final SearchableTag tag, final Runnable inUi) {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ BasicSearchable searchable = BasicSearchable
+ .getSearchable(supportType);
+
+ List<SearchableTag> children = new ArrayList<SearchableTag>();
+ if (tag == null) {
+ try {
+ List<SearchableTag> baseTags = searchable.getTags();
+ children = baseTags;
+ } catch (IOException e) {
+ error(e);
+ }
+ } else {
+ try {
+ searchable.fillTag(tag);
+ } catch (IOException e) {
+ error(e);
+ }
+
+ if (!tag.isLeaf()) {
+ children = tag.getChildren();
+ } else {
+ children = null;
+ // TODO: stories
+ }
+ }
+
+ final List<SearchableTag> fchildren = children;
+ inUi(new Runnable() {
+ @Override
+ public void run() {
+ if (fchildren != null) {
+ addTagBar(fchildren, tag);
+ }
+
+ if (inUi != null) {
+ inUi.run();
+ }
+ }
+ });
+ }
+ }).start();
+ }
+