tui: resize + src selection
[fanfix.git] / src / be / nikiroo / fanfix / reader / tui / TuiReaderMainWindow.java
index 18a1223bbe70ea49a2ce9b5bddc244b0fe6c1da8..126cee58071c5105c0bdda3959338d2cf114ac47 100644 (file)
@@ -5,11 +5,19 @@ import java.util.ArrayList;
 import java.util.List;
 
 import jexer.TAction;
+import jexer.TComboBox;
+import jexer.TCommand;
+import jexer.TField;
 import jexer.TFileOpenBox.Type;
+import jexer.TKeypress;
+import jexer.TLabel;
 import jexer.TList;
+import jexer.TStatusBar;
 import jexer.TWindow;
 import jexer.event.TCommandEvent;
+import jexer.event.TKeypressEvent;
 import jexer.event.TMenuEvent;
+import jexer.event.TResizeEvent;
 import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.fanfix.library.BasicLibrary;
@@ -23,11 +31,20 @@ import be.nikiroo.fanfix.reader.Reader;
  * @author niki
  */
 class TuiReaderMainWindow extends TWindow {
+       public static final int MENU_SEARCH = 1100;
+       public static final TCommand CMD_SEARCH = new TCommand(MENU_SEARCH) {
+       };
+
        private TList list;
        private List<MetaData> listKeys;
        private List<String> listItems;
        private Reader reader;
        private String source;
+       private String filter = "";
+       private List<TSizeConstraint> sizeConstraints = new ArrayList<TSizeConstraint>();
+
+       // TODO: because no way to find out the current index!!
+       private TComboBox select;
 
        /**
         * Create a new {@link TuiReaderMainWindow} without any stories in the list.
@@ -42,22 +59,17 @@ class TuiReaderMainWindow extends TWindow {
 
                this.reader = reader;
 
-               maximize();
-
                listKeys = new ArrayList<MetaData>();
                listItems = new ArrayList<String>();
-               list = addList(listItems, 0, 0, getWidth(), getHeight(), new TAction() {
-                       @Override
-                       public void DO() {
-                               MetaData meta = getSelectedMeta();
-                               if (meta != null) {
-                                       readStory(meta);
-                               }
-                       }
-               });
 
-               // TODO: add the current "source/type" or filter
-               reader.setStatusBar(this, "Library");
+               addSearch();
+               addList();
+               addSelect(); // TODO: last so it can draw over the rest
+
+               TStatusBar statusBar = reader.setStatusBar(this, "Library");
+               statusBar.addShortcutKeypress(TKeypress.kbCtrlF, CMD_SEARCH, "Search");
+
+               TSizeConstraint.resize(sizeConstraints);
 
                // TODO: remove when not used anymore
 
@@ -84,6 +96,103 @@ class TuiReaderMainWindow extends TWindow {
                // root.addChild("child 2").addChild("sub child");
        }
 
+       private void addSearch() {
+               TLabel lblSearch = addLabel("Search: ", 0, 0);
+
+               TField search = new TField(this, 0, 0, 1, true) {
+                       @Override
+                       public void onKeypress(TKeypressEvent keypress) {
+                               super.onKeypress(keypress);
+                               TKeypress key = keypress.getKey();
+                               if (key.isFnKey() && key.getKeyCode() == TKeypress.ENTER) {
+                                       TuiReaderMainWindow.this.filter = getText();
+                                       TuiReaderMainWindow.this.refreshStories();
+                               }
+                       }
+               };
+
+               TSizeConstraint.setSize(sizeConstraints, lblSearch, 5, 1, null, null);
+               TSizeConstraint.setSize(sizeConstraints, search, 15, 1, -5, null);
+       }
+
+       private void addList() {
+               list = addList(listItems, 0, 0, 10, 10, new TAction() {
+                       @Override
+                       public void DO() {
+                               MetaData meta = getSelectedMeta();
+                               if (meta != null) {
+                                       readStory(meta);
+                               }
+                       }
+               });
+
+               TSizeConstraint.setSize(sizeConstraints, list, 0, 7, 0, 0);
+       }
+
+       private void addSelect() {
+               // TODO: make a full list
+               final List<String> options = new ArrayList<String>();
+               options.add("(all opt)");
+               options.add("Sources");
+               options.add("Author");
+
+               // TODO
+               final List<String> sources = new ArrayList<String>();
+               sources.add("(show all)");
+               for (String source : reader.getLibrary().getSources()) {
+                       sources.add(source);
+               }
+
+               TLabel lblSelect = addLabel("Select: ", 0, 0);
+
+               // TODO: why must be last so to be able to draw over the rest
+               // TODO: make it so we cannot add manual entries
+               // TODO: how to select the item via keyboard? why double-click via
+               // mouse?
+               // TODO: how to change the values size on resize?
+               // TODO: setWidth() does not impact the display width, only the control
+               // and the down arrow on the right
+               // TODO: width 1 +resize + click on down arrow = bad format exception
+               select = addComboBox(0, 0, 10, sources, 0,
+                               Math.min(sources.size() + 1, getHeight() - 1 - 1),
+                               new TAction() {
+                                       @Override
+                                       public void DO() {
+                                               // TODO: wut?
+                                               if (select.getText().equals("(show all)")) {
+                                                       setSource(null);
+                                               } else {
+                                                       setSource(select.getText());
+                                               }
+                                               refreshStories();
+                                       }
+                               });
+
+               final TComboBox option = addComboBox(0, 0, 10, options, 0,
+                               Math.min(sources.size() + 1, getHeight() - 1 - 1),
+                               new TAction() {
+                                       @Override
+                                       public void DO() {
+                                               // TODO Not working:
+                                               sources.clear();
+                                               sources.add("(show all)");
+                                               for (String source : reader.getLibrary().getSources()) {
+                                                       sources.add(source);
+                                               }
+                                       }
+                               });
+
+               TSizeConstraint.setSize(sizeConstraints, lblSelect, 5, 3, null, null);
+               TSizeConstraint.setSize(sizeConstraints, option, 15, 3, -5, null);
+               TSizeConstraint.setSize(sizeConstraints, select, 15, 4, -5, null);
+       }
+
+       @Override
+       public void onResize(TResizeEvent resize) {
+               super.onResize(resize);
+               TSizeConstraint.resize(sizeConstraints);
+       }
+
        @Override
        public void onClose() {
                setVisible(false);
@@ -91,38 +200,31 @@ class TuiReaderMainWindow extends TWindow {
        }
 
        /**
-        * Change the source filter and display all stories matching this source.
-        * 
-        * @param source
-        *            the new source or NULL for all sources
+        * Refresh the list of stories displayed in this library.
+        * <p>
+        * Will take the current settings into account (filter, source...).
         */
-       public void setSource(String source) {
-               this.source = source;
-               refreshStories();
-       }
-
        public void refreshStories() {
                List<MetaData> metas = reader.getLibrary().getListBySource(source);
                setMetas(metas);
        }
 
        /**
-        * Update the list of stories displayed in this {@link TWindow}.
+        * Change the source filter and display all stories matching this source.
         * 
-        * @param meta
-        *            the new (unique) story to display
+        * @param source
+        *            the new source or NULL for all sources
         */
-       public void setMeta(MetaData meta) {
-               List<MetaData> metas = new ArrayList<MetaData>();
-               if (meta != null) {
-                       metas.add(meta);
-               }
-
-               setMetas(metas);
+       public void setSource(String source) {
+               this.source = source;
+               refreshStories();
        }
 
        /**
         * Update the list of stories displayed in this {@link TWindow}.
+        * <p>
+        * If a filter is set, only the stories which pass the filter will be
+        * displayed.
         * 
         * @param metas
         *            the new list of stories to display
@@ -133,8 +235,12 @@ class TuiReaderMainWindow extends TWindow {
 
                if (metas != null) {
                        for (MetaData meta : metas) {
-                               listKeys.add(meta);
-                               listItems.add(desc(meta));
+                               String desc = desc(meta);
+                               if (filter.isEmpty()
+                                               || desc.toLowerCase().contains(filter.toLowerCase())) {
+                                       listKeys.add(meta);
+                                       listItems.add(desc);
+                               }
                        }
                }
 
@@ -196,6 +302,7 @@ class TuiReaderMainWindow extends TWindow {
                                }
 
                                return;
+
                        case -1:
                                try {
                                        reader.getLibrary().delete(meta.getLuid());