Code

Update copyright notices
[ncmpc.git] / src / list_window.h
index 2c328b6ac37db793618493aa8e96cde334feeca6..a61d24b4e9b3c0cdd0ee7640e673e4dadc2f8966 100644 (file)
@@ -1,27 +1,28 @@
-/*
- * (c) 2004-2008 The Music Player Daemon Project
- * http://www.musicpd.org/
- *
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2010 The Music Player Daemon Project
+ * Project homepage: http://musicpd.org
+
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- *
+
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
 
 #ifndef LIST_WINDOW_H
 #define LIST_WINDOW_H
 
-#include "../config.h"
+#include "config.h"
 #include "command.h"
+#include "colors.h"
 
 #include <glib.h>
 #include <stdbool.h>
 #include <ncurses.h>
 #endif
 
-typedef const char *(*list_window_callback_fn_t)(unsigned index,
-                                                bool *highlight,
-                                                void *data);
+typedef const char *
+(*list_window_callback_fn_t)(unsigned i, void *data);
+
+typedef void
+(*list_window_paint_callback_t)(WINDOW *w, unsigned i,
+                               unsigned y, unsigned width,
+                               bool selected,
+                               void *data);
 
-typedef struct list_window {
+struct list_window {
        WINDOW *w;
        unsigned rows, cols;
 
+       /**
+        * Number of items in this list.
+        */
+       unsigned length;
+
        unsigned start;
        unsigned selected;
-       unsigned xoffset;
+       unsigned range_base;        /* represents the base item. */
+       bool range_selection;       /* range selection activated */
 
        bool hide_cursor;
-} list_window_t;
+};
+
+/**
+ * The bounds of a range selection, see list_window_get_range().
+ */
+struct list_window_range {
+       /**
+        * The index of the first selected item.
+        */
+       unsigned start;
 
+       /**
+        * The index after the last selected item.  The selection is
+        * empty when this is the same as "start".
+        */
+       unsigned end;
+};
 
 /* create a new list window */
 struct list_window *list_window_init(WINDOW *w,
@@ -58,21 +85,32 @@ void list_window_free(struct list_window *lw);
 /* reset a list window (selected=0, start=0) */
 void list_window_reset(struct list_window *lw);
 
+void
+list_window_resize(struct list_window *lw, unsigned width, unsigned height);
+
+void
+list_window_set_length(struct list_window *lw, unsigned length);
+
 /* paint a list window */
-void list_window_paint(struct list_window *lw,
+void list_window_paint(const struct list_window *lw,
                       list_window_callback_fn_t callback,
                       void *callback_data);
 
+void
+list_window_paint2(const struct list_window *lw,
+                  list_window_paint_callback_t paint_callback,
+                  void *callback_data);
+
 /* perform basic list window commands (movement) */
 bool
-list_window_cmd(struct list_window *lw, unsigned rows, command_t cmd);
+list_window_cmd(struct list_window *lw, command_t cmd);
 
 /**
  * Scroll the window.  Returns non-zero if the command has been
  * consumed.
  */
 bool
-list_window_scroll_cmd(struct list_window *lw, unsigned rows, command_t cmd);
+list_window_scroll_cmd(struct list_window *lw, command_t cmd);
 
 #ifdef HAVE_GETMOUSE
 /**
@@ -80,16 +118,40 @@ list_window_scroll_cmd(struct list_window *lw, unsigned rows, command_t cmd);
  * Returns non-zero if the mouse event has been handled.
  */
 bool
-list_window_mouse(struct list_window *lw, unsigned rows,
-                 unsigned long bstate, int y);
+list_window_mouse(struct list_window *lw, unsigned long bstate, int y);
 #endif
 
 void
-list_window_center(struct list_window *lw, unsigned rows, unsigned n);
+list_window_center(struct list_window *lw, unsigned n);
 
-/* select functions */
-void list_window_set_selected(struct list_window *lw, unsigned n);
-void list_window_check_selected(struct list_window *lw, unsigned length);
+/**
+ * Sets the position of the cursor.  Disables range selection.
+ */
+void
+list_window_set_cursor(struct list_window *lw, unsigned i);
+
+/**
+ * Moves the cursor.  Modifies the range if range selection is
+ * enabled.
+ */
+void
+list_window_move_cursor(struct list_window *lw, unsigned n);
+
+/**
+ * Ensures that the cursor is visible on the screen, i.e. it is not
+ * outside the current scrolling range.
+ */
+void
+list_window_fetch_cursor(struct list_window *lw);
+
+/**
+ * Determines the lower and upper bound of the range selection.  If
+ * range selection is disabled, it returns the cursor position (range
+ * length is 1).
+ */
+void
+list_window_get_range(const struct list_window *lw,
+                     struct list_window_range *range);
 
 /* find a string in a list window */
 bool
@@ -97,7 +159,8 @@ list_window_find(struct list_window *lw,
                 list_window_callback_fn_t callback,
                 void *callback_data,
                 const char *str,
-                bool wrap);
+                bool wrap,
+                bool bell_on_wrap);
 
 /* find a string in a list window (reversed) */
 bool
@@ -106,6 +169,13 @@ list_window_rfind(struct list_window *lw,
                  void *callback_data,
                  const char *str,
                  bool wrap,
-                 unsigned rows);
+                 bool bell_on_wrap);
+
+/* find a string in a list window which begins with the given characters in *str */
+bool
+list_window_jump(struct list_window *lw,
+                list_window_callback_fn_t callback,
+                void *callback_data,
+                const char *str);
 
 #endif