- // update and reset the tagsbar
- // can be NULL, for base tags
- private void updateTags(final SearchableTag tag) {
- final List<SearchableTag> parents = new ArrayList<SearchableTag>();
- SearchableTag parent = (tag == null) ? null : tag;
- while (parent != null) {
- parents.add(parent);
- parent = parent.getParent();
- }
-
- List<SearchableTag> rootTags = null;
- SearchableTag selectedRootTag = null;
- selectedRootTag = parents.isEmpty() ? null : parents
- .get(parents.size() - 1);
-
- try {
- rootTags = searchable.getTags();
- } catch (IOException e) {
- GuiReaderSearchFrame.error(e);
- }
-
- final List<SearchableTag> rootTagsF = rootTags;
- final SearchableTag selectedRootTagF = selectedRootTag;
-
- GuiReaderSearchFrame.inUi(new Runnable() {
- @Override
- public void run() {
- tagBars.invalidate();
- tagBars.removeAll();
-
- addTagBar(rootTagsF, selectedRootTagF);
-
- for (int i = parents.size() - 1; i >= 0; i--) {
- SearchableTag selectedChild = null;
- if (i > 0) {
- selectedChild = parents.get(i - 1);
- }
-
- SearchableTag parent = parents.get(i);
- addTagBar(parent.getChildren(), selectedChild);
- }
-
- tagBars.validate();
- }
- });
- }
-
- // must be quick and no thread change
- private void addTagBar(List<SearchableTag> tags,
- final SearchableTag selected) {
- tags.add(0, null);
-
- final int comboIndex = combos.size();
-
- final JComboBox combo = new JComboBox(
- tags.toArray(new SearchableTag[] {}));
- combo.setSelectedItem(selected);
-
- final ListCellRenderer basic = combo.getRenderer();
-
- combo.setRenderer(new ListCellRenderer() {
- @Override
- public Component getListCellRendererComponent(JList list,
- Object value, int index, boolean isSelected,
- boolean cellHasFocus) {
-
- Object displayValue = value;
- if (value instanceof SearchableTag) {
- displayValue = ((SearchableTag) value).getName();
- } else {
- displayValue = "Select a tag...";
- cellHasFocus = false;
- isSelected = false;
- }
-
- Component rep = basic.getListCellRendererComponent(list,
- displayValue, index, isSelected, cellHasFocus);
-
- if (value == null) {
- rep.setForeground(Color.GRAY);
- }
-
- return rep;
- }
- });
-
- combo.addActionListener(createComboTagAction(comboIndex));
-
- combos.add(combo);
- tagBars.add(combo);
- }
-
- private ActionListener createComboTagAction(final int comboIndex) {
- return new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent ae) {
- List<JComboBox> combos = GuiReaderSearchByNamePanel.this.combos;
- if (combos == null || comboIndex < 0
- || comboIndex >= combos.size()) {
- return;
- }
-
- // Tag can be NULL
- final SearchableTag tag = (SearchableTag) combos
- .get(comboIndex).getSelectedItem();
-
- while (comboIndex + 1 < combos.size()) {
- JComboBox combo = combos.remove(comboIndex + 1);
- tagBars.remove(combo);
- }
-
- new Thread(new Runnable() {
- @Override
- public void run() {
- final List<SearchableTag> children = getChildrenForTag(tag);
- if (children != null) {
- GuiReaderSearchFrame.inUi(new Runnable() {
- @Override
- public void run() {
- addTagBar(children, tag);
- }
- });
- }
-
- if (tag != null && tag.isLeaf()) {
- try {
- GuiReaderSearchByNamePanel.this.page = 1;
- stories = searchable.search(tag, 1);
- } catch (IOException e) {
- GuiReaderSearchFrame.error(e);
- GuiReaderSearchByNamePanel.this.page = 0;
- stories = new ArrayList<MetaData>();
- }
-
- fireAction(null);
- }
- }
- }).start();
- }
- };
- }
-
- // sync, add children of tag, NULL = base tags
- // return children of the tag or base tags or NULL
- private List<SearchableTag> getChildrenForTag(final SearchableTag tag) {
- List<SearchableTag> children = new ArrayList<SearchableTag>();
- if (tag == null) {
- try {
- List<SearchableTag> baseTags = searchable.getTags();
- children = baseTags;
- } catch (IOException e) {
- GuiReaderSearchFrame.error(e);
- }
- } else {
- try {
- searchable.fillTag(tag);
- } catch (IOException e) {
- GuiReaderSearchFrame.error(e);
- }
-
- if (!tag.isLeaf()) {
- children = tag.getChildren();
- } else {
- children = null;
- }
- }
-
- return children;
- }
-
- // item 0 = no selection, else = default selection
- // throw if page > max
- public void search(String keywords, int page, int item, Runnable inUi) {