* all: brand new skins interface ( still _experimental_) for x11 and
authorCyril Deguet <asmax@videolan.org>
Sat, 3 Jan 2004 23:31:34 +0000 (23:31 +0000)
committerCyril Deguet <asmax@videolan.org>
Sat, 3 Jan 2004 23:31:34 +0000 (23:31 +0000)
  win32, by ipkiss and myself...
 Among the features:
 - framework rewritten from scratch, heavily based on design patterns
  => new controls can be (hopefully) created more easily, portability
  to other OS is better, and the interface is less dependant from
  the vlc core
 - new concept of "layout", to provide a window with several different
  views (as in winamp3 skins)
 - controls can now be placed at a relative position to the edges of
  a window, which allow controls and layouts to be resizable (e.g
  for the playlist window)
 - Use of libpng and libfreetype2 for better portability between x11 and
   win32 => ttf fonts and antialiasing
 - New DTD for the xml theme ( *it will probably change again* )
 - Very very beginning of scripting in the xml file
 - And many things I miss
 - And probably many bugs ;)

175 files changed:
modules/gui/skins2/Modules.am [new file with mode: 0644]
modules/gui/skins2/commands/async_queue.cpp [new file with mode: 0644]
modules/gui/skins2/commands/async_queue.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_add_item.cpp [new file with mode: 0755]
modules/gui/skins2/commands/cmd_add_item.hpp [new file with mode: 0755]
modules/gui/skins2/commands/cmd_change_skin.cpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_change_skin.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_dialogs.hpp [new file with mode: 0755]
modules/gui/skins2/commands/cmd_dummy.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_generic.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_input.cpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_input.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_layout.cpp [new file with mode: 0755]
modules/gui/skins2/commands/cmd_layout.hpp [new file with mode: 0755]
modules/gui/skins2/commands/cmd_notify_playlist.cpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_notify_playlist.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_on_top.cpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_on_top.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_playlist.cpp [new file with mode: 0755]
modules/gui/skins2/commands/cmd_playlist.hpp [new file with mode: 0755]
modules/gui/skins2/commands/cmd_quit.cpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_quit.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_resize.cpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_resize.hpp [new file with mode: 0644]
modules/gui/skins2/commands/cmd_show_window.hpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_button.cpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_button.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_checkbox.cpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_checkbox.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_flat.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_generic.cpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_generic.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_image.cpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_image.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_list.cpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_list.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_move.cpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_move.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_radialslider.cpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_radialslider.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_resize.cpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_resize.hpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_slider.cpp [new file with mode: 0644]
modules/gui/skins2/controls/ctrl_slider.hpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_text.cpp [new file with mode: 0755]
modules/gui/skins2/controls/ctrl_text.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_enter.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_focus.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_generic.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_input.cpp [new file with mode: 0644]
modules/gui/skins2/events/evt_input.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_key.cpp [new file with mode: 0755]
modules/gui/skins2/events/evt_key.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_leave.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_motion.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_mouse.cpp [new file with mode: 0755]
modules/gui/skins2/events/evt_mouse.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_refresh.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_scroll.cpp [new file with mode: 0755]
modules/gui/skins2/events/evt_scroll.hpp [new file with mode: 0644]
modules/gui/skins2/events/evt_special.cpp [new file with mode: 0755]
modules/gui/skins2/events/evt_special.hpp [new file with mode: 0644]
modules/gui/skins2/parser/builder.cpp [new file with mode: 0755]
modules/gui/skins2/parser/builder.hpp [new file with mode: 0644]
modules/gui/skins2/parser/builder_data.hpp [new file with mode: 0644]
modules/gui/skins2/parser/flex.c [new file with mode: 0644]
modules/gui/skins2/parser/gen.sh [new file with mode: 0755]
modules/gui/skins2/parser/gen_builder.py [new file with mode: 0755]
modules/gui/skins2/parser/interpreter.cpp [new file with mode: 0644]
modules/gui/skins2/parser/interpreter.hpp [new file with mode: 0644]
modules/gui/skins2/parser/parser_context.hpp [new file with mode: 0644]
modules/gui/skins2/parser/skin.act [new file with mode: 0644]
modules/gui/skins2/parser/skin.dtd [new file with mode: 0644]
modules/gui/skins2/parser/skin.h [new file with mode: 0644]
modules/gui/skins2/parser/skin.l [new file with mode: 0644]
modules/gui/skins2/parser/wrappers.cpp [new file with mode: 0644]
modules/gui/skins2/parser/wrappers.h [new file with mode: 0644]
modules/gui/skins2/src/anchor.cpp [new file with mode: 0755]
modules/gui/skins2/src/anchor.hpp [new file with mode: 0644]
modules/gui/skins2/src/dialogs.cpp [new file with mode: 0644]
modules/gui/skins2/src/dialogs.hpp [new file with mode: 0644]
modules/gui/skins2/src/ft2_bitmap.cpp [new file with mode: 0644]
modules/gui/skins2/src/ft2_bitmap.hpp [new file with mode: 0644]
modules/gui/skins2/src/ft2_font.cpp [new file with mode: 0644]
modules/gui/skins2/src/ft2_font.hpp [new file with mode: 0644]
modules/gui/skins2/src/generic_bitmap.hpp [new file with mode: 0644]
modules/gui/skins2/src/generic_font.hpp [new file with mode: 0644]
modules/gui/skins2/src/generic_layout.cpp [new file with mode: 0644]
modules/gui/skins2/src/generic_layout.hpp [new file with mode: 0644]
modules/gui/skins2/src/generic_window.cpp [new file with mode: 0644]
modules/gui/skins2/src/generic_window.hpp [new file with mode: 0644]
modules/gui/skins2/src/logger.cpp [new file with mode: 0644]
modules/gui/skins2/src/logger.hpp [new file with mode: 0644]
modules/gui/skins2/src/os_factory.cpp [new file with mode: 0644]
modules/gui/skins2/src/os_factory.hpp [new file with mode: 0644]
modules/gui/skins2/src/os_graphics.hpp [new file with mode: 0644]
modules/gui/skins2/src/os_loop.hpp [new file with mode: 0644]
modules/gui/skins2/src/os_timer.hpp [new file with mode: 0644]
modules/gui/skins2/src/os_tooltip.hpp [new file with mode: 0644]
modules/gui/skins2/src/os_window.hpp [new file with mode: 0644]
modules/gui/skins2/src/png_bitmap.cpp [new file with mode: 0644]
modules/gui/skins2/src/png_bitmap.hpp [new file with mode: 0644]
modules/gui/skins2/src/scaled_bitmap.cpp [new file with mode: 0644]
modules/gui/skins2/src/scaled_bitmap.hpp [new file with mode: 0644]
modules/gui/skins2/src/skin_common.hpp [new file with mode: 0644]
modules/gui/skins2/src/skin_main.cpp [new file with mode: 0644]
modules/gui/skins2/src/theme.cpp [new file with mode: 0755]
modules/gui/skins2/src/theme.hpp [new file with mode: 0755]
modules/gui/skins2/src/theme_loader.cpp [new file with mode: 0755]
modules/gui/skins2/src/theme_loader.hpp [new file with mode: 0755]
modules/gui/skins2/src/tooltip.cpp [new file with mode: 0644]
modules/gui/skins2/src/tooltip.hpp [new file with mode: 0644]
modules/gui/skins2/src/var_manager.cpp [new file with mode: 0644]
modules/gui/skins2/src/var_manager.hpp [new file with mode: 0644]
modules/gui/skins2/src/vlcproc.cpp [new file with mode: 0755]
modules/gui/skins2/src/vlcproc.hpp [new file with mode: 0755]
modules/gui/skins2/src/window_manager.cpp [new file with mode: 0755]
modules/gui/skins2/src/window_manager.hpp [new file with mode: 0644]
modules/gui/skins2/utils/bezier.cpp [new file with mode: 0644]
modules/gui/skins2/utils/bezier.hpp [new file with mode: 0644]
modules/gui/skins2/utils/fsm.cpp [new file with mode: 0755]
modules/gui/skins2/utils/fsm.hpp [new file with mode: 0644]
modules/gui/skins2/utils/observer.hpp [new file with mode: 0644]
modules/gui/skins2/utils/pointer.hpp [new file with mode: 0644]
modules/gui/skins2/utils/position.cpp [new file with mode: 0644]
modules/gui/skins2/utils/position.hpp [new file with mode: 0644]
modules/gui/skins2/utils/ustring.cpp [new file with mode: 0644]
modules/gui/skins2/utils/ustring.hpp [new file with mode: 0644]
modules/gui/skins2/utils/var_bool.cpp [new file with mode: 0755]
modules/gui/skins2/utils/var_bool.hpp [new file with mode: 0755]
modules/gui/skins2/utils/var_list.cpp [new file with mode: 0644]
modules/gui/skins2/utils/var_list.hpp [new file with mode: 0644]
modules/gui/skins2/utils/var_percent.cpp [new file with mode: 0644]
modules/gui/skins2/utils/var_percent.hpp [new file with mode: 0644]
modules/gui/skins2/utils/var_text.cpp [new file with mode: 0755]
modules/gui/skins2/utils/var_text.hpp [new file with mode: 0755]
modules/gui/skins2/utils/variable.hpp [new file with mode: 0644]
modules/gui/skins2/vars/playlist.cpp [new file with mode: 0644]
modules/gui/skins2/vars/playlist.hpp [new file with mode: 0644]
modules/gui/skins2/vars/time.cpp [new file with mode: 0755]
modules/gui/skins2/vars/time.hpp [new file with mode: 0755]
modules/gui/skins2/vars/vlcvars.cpp [new file with mode: 0644]
modules/gui/skins2/vars/vlcvars.hpp [new file with mode: 0644]
modules/gui/skins2/vars/volume.cpp [new file with mode: 0644]
modules/gui/skins2/vars/volume.hpp [new file with mode: 0755]
modules/gui/skins2/win32/win32_dragdrop.cpp [new file with mode: 0755]
modules/gui/skins2/win32/win32_dragdrop.hpp [new file with mode: 0755]
modules/gui/skins2/win32/win32_factory.cpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_factory.hpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_graphics.cpp [new file with mode: 0755]
modules/gui/skins2/win32/win32_graphics.hpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_loop.cpp [new file with mode: 0755]
modules/gui/skins2/win32/win32_loop.hpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_timer.cpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_timer.hpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_tooltip.cpp [new file with mode: 0755]
modules/gui/skins2/win32/win32_tooltip.hpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_window.cpp [new file with mode: 0644]
modules/gui/skins2/win32/win32_window.hpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_display.cpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_display.hpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_dragdrop.cpp [new file with mode: 0755]
modules/gui/skins2/x11/x11_dragdrop.hpp [new file with mode: 0755]
modules/gui/skins2/x11/x11_factory.cpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_factory.hpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_graphics.cpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_graphics.hpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_loop.cpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_loop.hpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_timer.cpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_timer.hpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_tooltip.cpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_tooltip.hpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_window.cpp [new file with mode: 0644]
modules/gui/skins2/x11/x11_window.hpp [new file with mode: 0644]

diff --git a/modules/gui/skins2/Modules.am b/modules/gui/skins2/Modules.am
new file mode 100644 (file)
index 0000000..3e631d4
--- /dev/null
@@ -0,0 +1,179 @@
+SOURCES_skins = \
+       commands/async_queue.cpp \
+       commands/async_queue.hpp \
+       commands/cmd_add_item.cpp \
+       commands/cmd_add_item.hpp \
+       commands/cmd_generic.hpp \
+       commands/cmd_change_skin.cpp \
+       commands/cmd_change_skin.hpp \
+       commands/cmd_dialogs.hpp \
+       commands/cmd_input.cpp \
+       commands/cmd_input.hpp \
+       commands/cmd_layout.cpp \
+       commands/cmd_layout.hpp \
+       commands/cmd_notify_playlist.cpp \
+       commands/cmd_notify_playlist.hpp \
+       commands/cmd_on_top.cpp \
+       commands/cmd_on_top.hpp \
+       commands/cmd_playlist.cpp \
+       commands/cmd_playlist.hpp \
+       commands/cmd_quit.cpp \
+       commands/cmd_quit.hpp \
+       commands/cmd_resize.cpp \
+       commands/cmd_resize.hpp \
+       commands/cmd_show_window.hpp \
+       \
+       controls/ctrl_button.cpp \
+       controls/ctrl_button.hpp \
+       controls/ctrl_checkbox.cpp \
+       controls/ctrl_checkbox.hpp \
+       controls/ctrl_flat.hpp \
+       controls/ctrl_generic.cpp \
+       controls/ctrl_generic.hpp \
+       controls/ctrl_image.cpp \
+       controls/ctrl_image.hpp \
+       controls/ctrl_list.cpp \
+       controls/ctrl_list.hpp \
+       controls/ctrl_move.cpp \
+       controls/ctrl_move.hpp \
+       controls/ctrl_resize.cpp \
+       controls/ctrl_resize.hpp \
+       controls/ctrl_slider.cpp \
+       controls/ctrl_slider.hpp \
+       controls/ctrl_radialslider.cpp \
+       controls/ctrl_radialslider.hpp \
+       controls/ctrl_text.hpp \
+       controls/ctrl_text.cpp \
+       \
+       events/evt_enter.hpp \
+       events/evt_generic.hpp \
+       events/evt_focus.hpp \
+       events/evt_input.cpp \
+       events/evt_input.hpp \
+       events/evt_key.cpp \
+       events/evt_key.hpp \
+       events/evt_leave.hpp \
+       events/evt_motion.hpp \
+       events/evt_mouse.cpp \
+       events/evt_mouse.hpp \
+       events/evt_refresh.hpp \
+       events/evt_special.cpp \
+       events/evt_special.hpp \
+       events/evt_scroll.cpp \
+       events/evt_scroll.hpp \
+       \
+       parser/builder.cpp \
+       parser/builder.hpp \
+       parser/builder_data.hpp \
+       parser/flex.c \
+       parser/interpreter.cpp \
+       parser/interpreter.hpp \
+       parser/parser_context.hpp \
+       parser/skin.c \
+       parser/skin.h \
+       parser/wrappers.cpp \
+       parser/wrappers.h \
+       \
+       src/anchor.cpp \
+       src/anchor.hpp \
+       src/dialogs.cpp \
+       src/dialogs.hpp \
+       src/ft2_bitmap.cpp \
+       src/ft2_bitmap.hpp \
+       src/ft2_font.cpp \
+       src/ft2_font.hpp \
+       src/generic_bitmap.hpp \
+       src/generic_font.hpp \
+       src/generic_layout.cpp \
+       src/generic_layout.hpp \
+       src/generic_window.cpp \
+       src/generic_window.hpp \
+       src/logger.cpp \
+       src/logger.hpp \
+       src/os_factory.cpp \
+       src/os_factory.hpp \
+       src/os_graphics.hpp \
+       src/os_loop.hpp \
+       src/os_timer.hpp \
+       src/os_window.hpp \
+       src/os_tooltip.hpp \
+       src/png_bitmap.cpp \
+       src/png_bitmap.hpp \
+       src/scaled_bitmap.cpp \
+       src/scaled_bitmap.hpp \
+       src/skin_main.cpp \
+       src/skin_common.hpp \
+       src/theme.cpp \
+       src/theme.hpp \
+       src/theme_loader.cpp \
+       src/theme_loader.hpp \
+       src/tooltip.cpp \
+       src/tooltip.hpp \
+       src/var_manager.cpp \
+       src/var_manager.hpp \
+       src/vlcproc.cpp \
+       src/vlcproc.hpp \
+       src/window_manager.cpp \
+       src/window_manager.hpp \
+       \
+       utils/bezier.cpp \
+       utils/bezier.hpp \
+       utils/fsm.cpp \
+       utils/fsm.hpp \
+       utils/observer.hpp \
+       utils/pointer.hpp \
+       utils/position.cpp \
+       utils/position.hpp \
+       utils/ustring.cpp \
+       utils/ustring.hpp \
+       utils/variable.hpp \
+       utils/var_bool.cpp \
+       utils/var_bool.hpp \
+       utils/var_list.cpp \
+       utils/var_list.hpp \
+       utils/var_percent.cpp \
+       utils/var_percent.hpp \
+       utils/var_text.cpp \
+       utils/var_text.hpp \
+\
+       vars/playlist.cpp \
+       vars/playlist.hpp \
+       vars/time.cpp \
+       vars/time.hpp \
+       vars/volume.cpp \
+       vars/volume.hpp \
+       vars/vlcvars.cpp \
+       vars/vlcvars.hpp \
+\
+       win32/win32_dragdrop.cpp \
+       win32/win32_dragdrop.hpp \
+       win32/win32_factory.cpp \
+       win32/win32_factory.hpp \
+       win32/win32_graphics.cpp \
+       win32/win32_graphics.hpp \
+       win32/win32_loop.cpp \
+       win32/win32_loop.hpp \
+       win32/win32_timer.cpp \
+       win32/win32_timer.hpp \
+       win32/win32_tooltip.cpp \
+       win32/win32_tooltip.hpp \
+       win32/win32_window.cpp \
+       win32/win32_window.hpp \
+       \
+       x11/x11_display.cpp \
+       x11/x11_display.hpp \
+       x11/x11_dragdrop.cpp \
+       x11/x11_dragdrop.hpp \
+       x11/x11_factory.cpp \
+       x11/x11_factory.hpp \
+       x11/x11_graphics.cpp \
+       x11/x11_graphics.hpp \
+       x11/x11_loop.cpp \
+       x11/x11_loop.hpp \
+       x11/x11_timer.cpp \
+       x11/x11_timer.hpp \
+       x11/x11_window.cpp \
+       x11/x11_window.hpp \
+       x11/x11_tooltip.cpp \
+       x11/x11_tooltip.hpp \
+       $(NULL)
diff --git a/modules/gui/skins2/commands/async_queue.cpp b/modules/gui/skins2/commands/async_queue.cpp
new file mode 100644 (file)
index 0000000..364ad56
--- /dev/null
@@ -0,0 +1,113 @@
+/*****************************************************************************
+ * async_queue.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: async_queue.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "async_queue.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_timer.hpp"
+
+
+AsyncQueue::AsyncQueue( intf_thread_t *pIntf ): SkinObject( pIntf )
+{
+    // Create a timer
+    OSFactory *pOsFactory = OSFactory::instance( pIntf );
+    m_pTimer = pOsFactory->createOSTimer( Callback( this, &doFlush ) );
+
+    // Flush the queue every 10 ms
+    m_pTimer->start( 10, false );
+}
+
+
+AsyncQueue::~AsyncQueue()
+{
+}
+
+
+AsyncQueue *AsyncQueue::instance( intf_thread_t *pIntf )
+{
+    if( ! pIntf->p_sys->p_queue )
+    {
+        AsyncQueue *pQueue;
+        pQueue = new AsyncQueue( pIntf );
+        if( pQueue )
+        {
+             // Initialization succeeded
+             pIntf->p_sys->p_queue = pQueue;
+        }
+     }
+     return pIntf->p_sys->p_queue;
+}
+
+
+void AsyncQueue::destroy( intf_thread_t *pIntf )
+{
+    if( pIntf->p_sys->p_queue )
+    {
+        delete pIntf->p_sys->p_queue;
+        pIntf->p_sys->p_queue = NULL;
+    }
+}
+
+
+void AsyncQueue::push( const CmdGenericPtr &rcCommand )
+{
+    m_cmdList.push_back( rcCommand );
+}
+
+
+void AsyncQueue::remove( const string &rType )
+{
+    list<CmdGenericPtr>::iterator it;
+    for( it = m_cmdList.begin(); it != m_cmdList.end(); it++ )
+    {
+        // Remove the command if it is of the given type
+        if( (*it).get()->getType() == rType )
+        {
+            list<CmdGenericPtr>::iterator itNew = it;
+            itNew++;
+            m_cmdList.erase( it );
+            it = itNew;
+        }
+    }
+}
+
+
+void AsyncQueue::flush()
+{
+    while( m_cmdList.size() > 0 )
+    {
+        // Execute the first command in the queue
+        CmdGenericPtr &rcCommand = m_cmdList.front();
+        rcCommand.get()->execute();
+        // And remove it
+        m_cmdList.pop_front();
+    }
+}
+
+
+void AsyncQueue::doFlush( SkinObject *pObj )
+{
+    AsyncQueue *pThis = (AsyncQueue*)pObj;
+    // Flush the queue
+    pThis->flush();
+}
diff --git a/modules/gui/skins2/commands/async_queue.hpp b/modules/gui/skins2/commands/async_queue.hpp
new file mode 100644 (file)
index 0000000..8c78530
--- /dev/null
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * async_queue.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: async_queue.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef ASYNC_QUEUE_HPP
+#define ASYNC_QUEUE_HPP
+
+#include "cmd_generic.hpp"
+
+#include <list>
+#include <string>
+
+class OSTimer;
+
+
+/// Asynchronous queue for commands
+class AsyncQueue: public SkinObject
+{
+    public:
+        /// Get the instance of AsyncQueue
+        /// Returns NULL if initialization failed.
+        static AsyncQueue *instance( intf_thread_t *pIntf );
+
+        /// Destroy the instance of AsyncQueue
+        static void destroy( intf_thread_t *pIntf );
+
+        /// Add a command in the queue
+        void push( const CmdGenericPtr &rcCommand );
+
+        /// Remove the commands of the given type
+        void remove( const string &rType );
+
+        /// Flush the queue and execute the commands
+        void flush();
+
+    private:
+        /// Command queue
+        list<CmdGenericPtr> m_cmdList;
+        /// Timer
+        OSTimer *m_pTimer;
+
+        // Private because it is a singleton
+        AsyncQueue( intf_thread_t *pIntf );
+        virtual ~AsyncQueue();
+
+        /// Callback for the timer
+        static void doFlush( SkinObject *pObj );
+};
+
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_add_item.cpp b/modules/gui/skins2/commands/cmd_add_item.cpp
new file mode 100755 (executable)
index 0000000..b26c452
--- /dev/null
@@ -0,0 +1,49 @@
+/*****************************************************************************
+ * cmd_add_item.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_add_item.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include <vlc/vlc.h>
+#include "cmd_add_item.hpp"
+
+
+void CmdAddItem::execute()
+{
+    playlist_t *pPlaylist = getIntf()->p_sys->p_playlist;
+    if( pPlaylist == NULL )
+    {
+        return;
+    }
+
+    if( m_playNow )
+    {
+        // Enqueue and play the item
+        playlist_Add( pPlaylist, m_name.c_str(), 0, 0,
+                      PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
+    }
+    else
+    {
+        // Enqueue the item only
+        playlist_Add( pPlaylist, m_name.c_str(), 0, 0,
+                      PLAYLIST_APPEND, PLAYLIST_END );
+    }
+}
diff --git a/modules/gui/skins2/commands/cmd_add_item.hpp b/modules/gui/skins2/commands/cmd_add_item.hpp
new file mode 100755 (executable)
index 0000000..1409fe7
--- /dev/null
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * cmd_add_item.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_add_item.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_ADD_ITEM_HPP
+#define CMD_ADD_ITEM_HPP
+
+#include "cmd_generic.hpp"
+#include <string>
+
+
+/// "Add item" command
+class CmdAddItem: public CmdGeneric
+{
+    public:
+        CmdAddItem( intf_thread_t *pIntf, const string &rName, bool playNow ):
+            CmdGeneric( pIntf ), m_name( rName ), m_playNow( playNow ) {}
+        virtual ~CmdAddItem() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "add item"; }
+
+    private:
+        /// Name of the item to enqueue
+        string m_name;
+        /// Should we play the item immediately?
+        bool m_playNow;
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_change_skin.cpp b/modules/gui/skins2/commands/cmd_change_skin.cpp
new file mode 100644 (file)
index 0000000..65a4872
--- /dev/null
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * cmd_change_skin.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_change_skin.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_change_skin.hpp"
+#include "cmd_quit.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_loop.hpp"
+#include "../src/theme.hpp"
+#include "../src/theme_loader.hpp"
+
+
+void CmdChangeSkin::execute()
+{
+    // Save the old theme to restore it in case of problem
+    Theme *pOldTheme = getIntf()->p_sys->p_theme;
+
+    if( pOldTheme )
+    {
+        pOldTheme->getWindowManager().hideAll();
+    }
+
+    ThemeLoader loader( getIntf() );
+    if( loader.load( m_file ) )
+    {
+        // Everything went well
+        msg_Dbg( getIntf(), "New theme successfully loaded (%s)",
+                 m_file.c_str() );
+        if( pOldTheme )
+        {
+            delete pOldTheme;
+        }
+    }
+    else if( pOldTheme )
+    {
+        msg_Err( getIntf(), "A problem occurred when loading the new theme,"
+                  " restoring the previous one" );
+        getIntf()->p_sys->p_theme = pOldTheme;
+        pOldTheme->getWindowManager().showAll();
+    }
+    else
+    {
+        msg_Err( getIntf(), "Cannot load the theme, aborting" );
+        // Quit
+        CmdQuit cmd( getIntf() );
+        cmd.execute();
+    }
+}
+
diff --git a/modules/gui/skins2/commands/cmd_change_skin.hpp b/modules/gui/skins2/commands/cmd_change_skin.hpp
new file mode 100644 (file)
index 0000000..8be56c3
--- /dev/null
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * cmd_change_skin.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_change_skin.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_CHANGE_SKIN_HPP
+#define CMD_CHANGE_SKIN_HPP
+
+#include "cmd_generic.hpp"
+
+
+class WindowManager;
+
+
+/// "Change Skin" command
+class CmdChangeSkin: public CmdGeneric
+{
+    public:
+        CmdChangeSkin( intf_thread_t *pIntf, const string &rFile ):
+            CmdGeneric( pIntf ), m_file( rFile ) {}
+        virtual ~CmdChangeSkin() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "change skin"; }
+
+    private:
+        /// Skin file to load
+        string m_file;
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_dialogs.hpp b/modules/gui/skins2/commands/cmd_dialogs.hpp
new file mode 100755 (executable)
index 0000000..60b08bd
--- /dev/null
@@ -0,0 +1,109 @@
+/*****************************************************************************
+ * cmd_dialogs.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_dialogs.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_DIALOGS_HPP
+#define CMD_DIALOGS_HPP
+
+#include "cmd_generic.hpp"
+#include "../src/dialogs.hpp"
+#include "cmd_change_skin.hpp"
+
+
+template<int TYPE = 0> class CmdDialogs;
+
+// XXX use an enum instead
+typedef CmdDialogs<1> CmdDlgChangeSkin;
+typedef CmdDialogs<2> CmdDlgFileSimple;
+typedef CmdDialogs<3> CmdDlgFile;
+typedef CmdDialogs<4> CmdDlgDisc;
+typedef CmdDialogs<5> CmdDlgNet;
+typedef CmdDialogs<6> CmdDlgMessages;
+typedef CmdDialogs<7> CmdDlgPrefs;
+typedef CmdDialogs<8> CmdDlgFileInfo;
+typedef CmdDialogs<9> CmdDlgPopupMenu;
+typedef CmdDialogs<10> CmdDlgAdd;
+
+
+/// Generic "Open dialog" command
+template<int TYPE>
+class CmdDialogs: public CmdGeneric
+{
+    public:
+        CmdDialogs( intf_thread_t *pIntf ): CmdGeneric( pIntf ) {}
+        virtual ~CmdDialogs() {}
+
+        /// This method does the real job of the command
+        virtual void execute()
+        {
+            /// Get the dialogs provider
+            Dialogs *pDialogs = Dialogs::instance( getIntf() );
+            if( pDialogs == NULL )
+            {
+                return;
+            }
+
+            switch( TYPE )
+            {
+                case 1:
+                    pDialogs->showChangeSkin();
+                    break;
+                case 2:
+                    pDialogs->showFileSimple( true );
+                    break;
+                case 3:
+                    pDialogs->showFile( true );
+                    break;
+                case 4:
+                    pDialogs->showDisc( true );
+                    break;
+                case 5:
+                    pDialogs->showNet( true );
+                    break;
+                case 6:
+                    pDialogs->showMessages();
+                    break;
+                case 7:
+                    pDialogs->showPrefs();
+                    break;
+                case 8:
+                    pDialogs->showFileInfo();
+                    break;
+                case 9:
+                    pDialogs->showPopupMenu( true );
+                    break;
+                case 10:
+                    pDialogs->showFile( false );
+                    break;
+                default:
+                    msg_Warn( getIntf(), "Unknown dialog type" );
+                    break;
+            }
+        }
+
+        /// Return the type of the command
+        virtual string getType() const { return "dialog"; }
+};
+
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_dummy.hpp b/modules/gui/skins2/commands/cmd_dummy.hpp
new file mode 100644 (file)
index 0000000..47e18ac
--- /dev/null
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * cmd_dummy.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_dummy.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_DUMMY_HPP
+#define CMD_DUMMY_HPP
+
+#include "cmd_generic.hpp"
+
+
+/// Dummy command
+class CmdDummy: public CmdGeneric
+{
+    public:
+        CmdDummy( intf_thread_t *pIntf ): CmdGeneric( pIntf ) {}
+        virtual ~CmdDummy() {}
+
+        /// This method does the real job of the command
+        virtual void execute() {}
+
+        /// Return the type of the command
+        virtual string getType() const { return "dummy"; }
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_generic.hpp b/modules/gui/skins2/commands/cmd_generic.hpp
new file mode 100644 (file)
index 0000000..d399df5
--- /dev/null
@@ -0,0 +1,67 @@
+/*****************************************************************************
+ * cmd_generic.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_generic.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_GENERIC_HPP
+#define CMD_GENERIC_HPP
+
+#include "../src/skin_common.hpp"
+#include "../utils/pointer.hpp"
+
+#include <string>
+
+
+/// Macro to define the prototype of simple commands
+#define DEFINE_COMMAND( name, type ) \
+class Cmd##name: public CmdGeneric \
+{ \
+    public: \
+        Cmd##name( intf_thread_t *pIntf ): CmdGeneric( pIntf ) {} \
+        virtual ~Cmd##name() {} \
+        virtual void execute(); \
+        virtual string getType() const { return type; } \
+\
+};
+
+
+/// Base class for skins commands
+class CmdGeneric: public SkinObject
+{
+    public:
+        virtual ~CmdGeneric() {}
+
+        /// This method does the real job of the command
+        virtual void execute() = 0;
+
+        /// Return the type of the command
+        virtual string getType() const { return ""; }
+
+    protected:
+        CmdGeneric( intf_thread_t *pIntf ): SkinObject( pIntf ) {}
+};
+
+
+typedef CountedPtr<CmdGeneric> CmdGenericPtr;
+
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_input.cpp b/modules/gui/skins2/commands/cmd_input.cpp
new file mode 100644 (file)
index 0000000..54a55ce
--- /dev/null
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * cmd_input.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_input.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_input.hpp"
+
+
+void CmdStop::execute()
+{
+    playlist_t *pPlaylist = getIntf()->p_sys->p_playlist;
+    if( pPlaylist == NULL )
+    {
+        return;
+    }
+
+    playlist_Stop( pPlaylist );
+}
+
+
+void CmdSlower::execute()
+{
+    input_thread_t *pInput =
+        (input_thread_t *)vlc_object_find( getIntf(), VLC_OBJECT_INPUT,
+                                           FIND_ANYWHERE );
+    if( pInput )
+    {
+        vlc_value_t val;
+        val.b_bool = VLC_TRUE;
+
+        var_Set( pInput, "rate-slower", val );
+        vlc_object_release( pInput );
+    }
+}
+
+
+void CmdFaster::execute()
+{
+    input_thread_t *pInput =
+        (input_thread_t *)vlc_object_find( getIntf(), VLC_OBJECT_INPUT,
+                                           FIND_ANYWHERE );
+    if( pInput )
+    {
+        vlc_value_t val;
+        val.b_bool = VLC_TRUE;
+
+        var_Set( pInput, "rate-faster", val );
+        vlc_object_release( pInput );
+    }
+}
+
diff --git a/modules/gui/skins2/commands/cmd_input.hpp b/modules/gui/skins2/commands/cmd_input.hpp
new file mode 100644 (file)
index 0000000..d6bd2b6
--- /dev/null
@@ -0,0 +1,36 @@
+/*****************************************************************************
+ * cmd_input.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_input.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_INPUT_HPP
+#define CMD_INPUT_HPP
+
+#include "cmd_generic.hpp"
+
+/// Commands to control the input
+DEFINE_COMMAND( Stop, "stop" )
+DEFINE_COMMAND( Slower, "slower" )
+DEFINE_COMMAND( Faster, "faster" )
+
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_layout.cpp b/modules/gui/skins2/commands/cmd_layout.cpp
new file mode 100755 (executable)
index 0000000..fe049dd
--- /dev/null
@@ -0,0 +1,59 @@
+/*****************************************************************************
+ * cmd_layout.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_layout.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_layout.hpp"
+#include "../src/generic_window.hpp"
+#include "../src/generic_layout.hpp"
+#include "../src/theme.hpp"
+
+
+CmdLayout::CmdLayout( intf_thread_t *pIntf, const string &windowId,
+                      const string &layoutId ):
+    CmdGeneric( pIntf ), m_windowId( windowId ), m_layoutId( layoutId )
+{
+}
+
+
+void CmdLayout::execute()
+{
+    // Get the window and the layout
+    if( !getIntf()->p_sys->p_theme )
+    {
+        return;
+    }
+    GenericWindow *pWindow =
+        getIntf()->p_sys->p_theme->getWindowById( m_windowId );
+    GenericLayout *pLayout =
+        getIntf()->p_sys->p_theme->getLayoutById( m_layoutId );
+    if( !pWindow || !pLayout )
+    {
+        msg_Err( getIntf(), "Cannot change layout (%s, %s)",
+                 m_windowId.c_str(), m_layoutId.c_str() );
+        return;
+    }
+
+    // XXX TODO: check that the layout isn't a layout of another window
+
+    pWindow->setActiveLayout( pLayout );
+}
diff --git a/modules/gui/skins2/commands/cmd_layout.hpp b/modules/gui/skins2/commands/cmd_layout.hpp
new file mode 100755 (executable)
index 0000000..cc30ec3
--- /dev/null
@@ -0,0 +1,51 @@
+/*****************************************************************************
+ * cmd_layout.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_layout.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_LAYOUT_HPP
+#define CMD_LAYOUT_HPP
+
+#include "cmd_generic.hpp"
+#include <string>
+
+
+/// "Change layout" command
+class CmdLayout: public CmdGeneric
+{
+    public:
+        CmdLayout( intf_thread_t *pIntf, const string &windowId,
+                   const string &layoutId );
+        virtual ~CmdLayout() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "change layout"; }
+
+    private:
+        string m_windowId;
+        string m_layoutId;
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_notify_playlist.cpp b/modules/gui/skins2/commands/cmd_notify_playlist.cpp
new file mode 100644 (file)
index 0000000..92c1b17
--- /dev/null
@@ -0,0 +1,35 @@
+/*****************************************************************************
+ * cmd_notify_playlist.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_notify_playlist.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_notify_playlist.hpp"
+#include "../src/vlcproc.hpp"
+#include "../vars/playlist.hpp"
+
+
+void CmdNotifyPlaylist::execute()
+{
+    // Notify the playlist variable
+    Playlist &rVar = VlcProc::instance( getIntf() )->getPlaylistVar();
+    rVar.onChange();
+}
diff --git a/modules/gui/skins2/commands/cmd_notify_playlist.hpp b/modules/gui/skins2/commands/cmd_notify_playlist.hpp
new file mode 100644 (file)
index 0000000..576b9e6
--- /dev/null
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * cmd_notify_playlist.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_notify_playlist.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_NOTIFY_PLAYLIST_HPP
+#define CMD_NOTIFY_PLAYLIST_HPP
+
+#include "cmd_generic.hpp"
+
+
+/// Command to notify the playlist of a change
+class CmdNotifyPlaylist: public CmdGeneric
+{
+    public:
+        CmdNotifyPlaylist( intf_thread_t *pIntf ): CmdGeneric( pIntf ) {}
+        virtual ~CmdNotifyPlaylist() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "notify playlist"; }
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_on_top.cpp b/modules/gui/skins2/commands/cmd_on_top.cpp
new file mode 100644 (file)
index 0000000..d6cdfa8
--- /dev/null
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * cmd_on_top.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_on_top.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_on_top.hpp"
+#include "../src/theme.hpp"
+#include "../src/window_manager.hpp"
+
+
+void CmdOnTop::execute()
+{
+    getIntf()->p_sys->p_theme->getWindowManager().toggleOnTop();
+}
diff --git a/modules/gui/skins2/commands/cmd_on_top.hpp b/modules/gui/skins2/commands/cmd_on_top.hpp
new file mode 100644 (file)
index 0000000..3a17f6c
--- /dev/null
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * cmd_on_top.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_on_top.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_ON_TOP_HPP
+#define CMD_ON_TOP_HPP
+
+#include "cmd_generic.hpp"
+
+
+/// "Always on top" command
+class CmdOnTop: public CmdGeneric
+{
+    public:
+        CmdOnTop( intf_thread_t *pIntf ): CmdGeneric( pIntf ) {}
+        virtual ~CmdOnTop() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "always on top"; }
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_playlist.cpp b/modules/gui/skins2/commands/cmd_playlist.cpp
new file mode 100755 (executable)
index 0000000..599e789
--- /dev/null
@@ -0,0 +1,63 @@
+/*****************************************************************************
+ * cmd_playlist.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_playlist.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_playlist.hpp"
+
+
+void CmdPlaylistDel::execute()
+{
+    m_rList.delSelected();
+}
+
+
+void CmdPlaylistSort::execute()
+{
+    // XXX add the mode and type
+    playlist_t *pPlaylist = getIntf()->p_sys->p_playlist;
+    if( pPlaylist != NULL )
+    {
+        playlist_Sort( pPlaylist, SORT_TITLE, SORT_NORMAL );
+    }
+
+}
+
+
+void CmdPlaylistNext::execute()
+{
+    playlist_t *pPlaylist = getIntf()->p_sys->p_playlist;
+    if( pPlaylist != NULL )
+    {
+        playlist_Next( pPlaylist );
+    }
+}
+
+
+void CmdPlaylistPrevious::execute()
+{
+    playlist_t *pPlaylist = getIntf()->p_sys->p_playlist;
+    if( pPlaylist != NULL )
+    {
+        playlist_Prev( pPlaylist );
+    }
+}
diff --git a/modules/gui/skins2/commands/cmd_playlist.hpp b/modules/gui/skins2/commands/cmd_playlist.hpp
new file mode 100755 (executable)
index 0000000..9a68c65
--- /dev/null
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ * cmd_playlist.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_playlist.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_PLAYLIST_HPP
+#define CMD_PLAYLIST_HPP
+
+#include "cmd_generic.hpp"
+#include "../utils/var_list.hpp"
+
+
+/// Command to delete the selected items from a list
+class CmdPlaylistDel: public CmdGeneric
+{
+    public:
+        CmdPlaylistDel( intf_thread_t *pIntf, VarList &rList ):
+            CmdGeneric( pIntf ), m_rList( rList ) {}
+        virtual ~CmdPlaylistDel() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "playlist del"; }
+
+    private:
+        /// List
+        VarList &m_rList;
+};
+
+
+/// Command to sort the playlist
+DEFINE_COMMAND( PlaylistSort, "playlist sort" )
+
+/// Command to jump to the next item
+DEFINE_COMMAND( PlaylistNext, "playlist next" )
+
+/// Command to jump to the previous item
+DEFINE_COMMAND( PlaylistPrevious, "playlist previous" )
+
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_quit.cpp b/modules/gui/skins2/commands/cmd_quit.cpp
new file mode 100644 (file)
index 0000000..a0aec39
--- /dev/null
@@ -0,0 +1,37 @@
+/*****************************************************************************
+ * cmd_quit.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_quit.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_quit.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_loop.hpp"
+
+
+void CmdQuit::execute()
+{
+    // Get the instance of OSFactory
+    OSFactory *pOsFactory = OSFactory::instance( getIntf() );
+
+    // Exit the main OS loop
+    pOsFactory->getOSLoop()->exit();
+}
diff --git a/modules/gui/skins2/commands/cmd_quit.hpp b/modules/gui/skins2/commands/cmd_quit.hpp
new file mode 100644 (file)
index 0000000..0055bf4
--- /dev/null
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * cmd_quit.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_quit.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_QUIT_HPP
+#define CMD_QUIT_HPP
+
+#include "cmd_generic.hpp"
+
+
+/// "Quit" command
+class CmdQuit: public CmdGeneric
+{
+    public:
+        CmdQuit( intf_thread_t *pIntf ): CmdGeneric( pIntf ) {}
+        virtual ~CmdQuit() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "quit"; }
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_resize.cpp b/modules/gui/skins2/commands/cmd_resize.cpp
new file mode 100644 (file)
index 0000000..1be6a25
--- /dev/null
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * cmd_resize.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_resize.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "cmd_resize.hpp"
+#include "../src/generic_layout.hpp"
+
+
+CmdResize::CmdResize( intf_thread_t *pIntf, GenericLayout &rLayout, int width,
+                      int height ):
+    CmdGeneric( pIntf ), m_rLayout( rLayout ), m_width( width ),
+    m_height( height )
+{
+}
+
+
+void CmdResize::execute()
+{
+    // Resize the layout
+    m_rLayout.resize( m_width, m_height );
+}
diff --git a/modules/gui/skins2/commands/cmd_resize.hpp b/modules/gui/skins2/commands/cmd_resize.hpp
new file mode 100644 (file)
index 0000000..04fbfbe
--- /dev/null
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * cmd_resize.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_resize.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_RESIZE_HPP
+#define CMD_RESIZE_HPP
+
+#include "cmd_generic.hpp"
+
+class GenericLayout;
+
+
+/// Command to resize a layout
+class CmdResize: public CmdGeneric
+{
+    public:
+        /// Resize the given layout
+        CmdResize( intf_thread_t *pIntf, GenericLayout &rLayout, int width,
+                   int height );
+        virtual ~CmdResize() {}
+
+        /// This method does the real job of the command
+        virtual void execute();
+
+        /// Return the type of the command
+        virtual string getType() const { return "resize"; }
+
+    private:
+        GenericLayout &m_rLayout;
+        int m_width, m_height;
+};
+
+#endif
diff --git a/modules/gui/skins2/commands/cmd_show_window.hpp b/modules/gui/skins2/commands/cmd_show_window.hpp
new file mode 100755 (executable)
index 0000000..1696340
--- /dev/null
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * cmd_show_window.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: cmd_show_window.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CMD_SHOW_WINDOW_HPP
+#define CMD_SHOW_WINDOW_HPP
+
+#include "cmd_generic.hpp"
+#include "../utils/var_bool.hpp"
+
+
+template<bool newValue> class CmdShowHideWindow;
+
+typedef CmdShowHideWindow<true> CmdShowWindow;
+typedef CmdShowHideWindow<false> CmdHideWindow;
+
+
+/// "Show/Hide window" command
+template<bool newValue>
+class CmdShowHideWindow: public CmdGeneric
+{
+    public:
+        CmdShowHideWindow( intf_thread_t *pIntf, VarBool &rVariable ):
+            CmdGeneric( pIntf ), m_rVariable( rVariable ) {}
+        virtual ~CmdShowHideWindow() {}
+
+        /// This method does the real job of the command
+        virtual void execute() { m_rVariable.set( newValue ); }
+
+        /// Return the type of the command
+        virtual string getType() const { return "show/hide window"; }
+
+    private:
+        /// Reference to the observed variable
+        VarBool &m_rVariable;
+};
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_button.cpp b/modules/gui/skins2/controls/ctrl_button.cpp
new file mode 100755 (executable)
index 0000000..7ef3a35
--- /dev/null
@@ -0,0 +1,202 @@
+/*****************************************************************************
+ * ctrl_button.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_button.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_button.hpp"
+#include "../events/evt_generic.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_graphics.hpp"
+#include "../commands/cmd_generic.hpp"
+
+
+CtrlButton::CtrlButton( intf_thread_t *pIntf, const GenericBitmap &rBmpUp,
+                        const GenericBitmap &rBmpOver,
+                        const GenericBitmap &rBmpDown, CmdGeneric &rCommand,
+                        const UString &rTooltip, const UString &rHelp ):
+    CtrlGeneric( pIntf, rHelp ), m_fsm( pIntf ), m_rCommand( rCommand ),
+    m_tooltip( rTooltip ),
+    m_cmdUpOverDownOver( this, &transUpOverDownOver ),
+    m_cmdDownOverUpOver( this, &transDownOverUpOver ),
+    m_cmdDownOverDown( this, &transDownOverDown ),
+    m_cmdDownDownOver( this, &transDownDownOver ),
+    m_cmdUpOverUp( this, &transUpOverUp ),
+    m_cmdUpUpOver( this, &transUpUpOver ),
+    m_cmdDownUp( this, &transDownUp ),
+    m_cmdUpHidden( this, &transUpHidden ),
+    m_cmdHiddenUp( this, &transHiddenUp )
+{
+    // Build the images of the button
+    OSFactory *pOsFactory = OSFactory::instance( pIntf );
+    m_pImgUp = pOsFactory->createOSGraphics( rBmpUp.getWidth(),
+                                             rBmpUp.getHeight() );
+    m_pImgUp->drawBitmap( rBmpUp, 0, 0 );
+    m_pImgDown = pOsFactory->createOSGraphics( rBmpDown.getWidth(),
+                                               rBmpDown.getHeight() );
+    m_pImgDown->drawBitmap( rBmpDown, 0, 0 );
+    m_pImgOver = pOsFactory->createOSGraphics( rBmpOver.getWidth(),
+                                               rBmpOver.getHeight() );
+    m_pImgOver->drawBitmap( rBmpOver, 0, 0 );
+
+    // States
+    m_fsm.addState( "up" );
+    m_fsm.addState( "down" );
+    m_fsm.addState( "upOver" );
+    m_fsm.addState( "downOver" );
+    m_fsm.addState( "hidden" );
+
+    // Transitions
+    m_fsm.addTransition( "upOver", "mouse:left:down", "downOver",
+                         &m_cmdUpOverDownOver );
+    m_fsm.addTransition( "downOver", "mouse:left:up", "upOver",
+                         &m_cmdDownOverUpOver );
+    m_fsm.addTransition( "downOver", "leave", "down", &m_cmdDownOverDown );
+    m_fsm.addTransition( "down", "enter", "downOver", &m_cmdDownDownOver );
+    m_fsm.addTransition( "upOver", "leave", "up", &m_cmdUpOverUp );
+    m_fsm.addTransition( "up", "enter", "upOver", &m_cmdUpUpOver );
+    m_fsm.addTransition( "down", "mouse:left:up", "up", &m_cmdDownUp );
+    // XXX: It would be easy to use a "ANY" initial state to handle these
+    // four lines in only one. But till now it isn't worthwhile...
+    m_fsm.addTransition( "up", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "down", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "upOver", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "downOver", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "hidden", "special:show", "up", &m_cmdHiddenUp );
+
+    // Initial state
+    m_fsm.setState( "up" );
+    m_pImg = m_pImgUp;
+}
+
+
+CtrlButton::~CtrlButton()
+{
+    SKINS_DELETE( m_pImgUp );
+    SKINS_DELETE( m_pImgDown );
+    SKINS_DELETE( m_pImgOver );
+}
+
+
+void CtrlButton::handleEvent( EvtGeneric &rEvent )
+{
+    m_fsm.handleTransition( rEvent.getAsString() );
+}
+
+
+bool CtrlButton::mouseOver( int x, int y ) const
+{
+    if( m_pImg )
+    {
+        return m_pImg->hit( x, y );
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+void CtrlButton::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    if( m_pImg )
+    {
+        // Draw the current image
+        rImage.drawGraphics( *m_pImg, 0, 0, xDest, yDest );
+    }
+}
+
+
+void CtrlButton::transUpOverDownOver( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->captureMouse();
+    pThis->m_pImg = pThis->m_pImgDown;
+    pThis->notifyLayout();
+}
+
+
+void CtrlButton::transDownOverUpOver( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->releaseMouse();
+    pThis->m_pImg = pThis->m_pImgUp;
+    pThis->notifyLayout();
+    // Execute the command associated to this button
+    pThis->m_rCommand.execute();
+}
+
+
+void CtrlButton::transDownOverDown( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->m_pImg = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
+
+void CtrlButton::transDownDownOver( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->m_pImg = pThis->m_pImgDown;
+    pThis->notifyLayout();
+}
+
+
+void CtrlButton::transUpUpOver( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->m_pImg = pThis->m_pImgOver;
+    pThis->notifyLayout();
+}
+
+
+void CtrlButton::transUpOverUp( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->m_pImg = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
+
+void CtrlButton::transDownUp( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->releaseMouse();
+}
+
+
+void CtrlButton::transUpHidden( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->m_pImg = NULL;
+    pThis->notifyLayout();
+}
+
+
+void CtrlButton::transHiddenUp( SkinObject *pCtrl )
+{
+    CtrlButton *pThis = (CtrlButton*)pCtrl;
+    pThis->m_pImg = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_button.hpp b/modules/gui/skins2/controls/ctrl_button.hpp
new file mode 100644 (file)
index 0000000..bf605a8
--- /dev/null
@@ -0,0 +1,96 @@
+/*****************************************************************************
+ * ctrl_button.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_button.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_BUTTON_HPP
+#define CTRL_BUTTON_HPP
+
+#include "ctrl_generic.hpp"
+#include "../utils/fsm.hpp"
+
+class GenericBitmap;
+class OSGraphics;
+class CmdGeneric;
+
+
+/// Base class for button controls
+class CtrlButton: public CtrlGeneric
+{
+    public:
+        /// Create a button with 3 images
+        CtrlButton( intf_thread_t *pIntf, const GenericBitmap &rBmpUp,
+                    const GenericBitmap &rBmpOver,
+                    const GenericBitmap &rBmpDown,
+                    CmdGeneric &rCommand, const UString &rTooltip,
+                    const UString &rHelp );
+
+        virtual ~CtrlButton();
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+        /// Get the text of the tooltip
+        virtual UString getTooltipText() const { return m_tooltip; }
+
+    private:
+        /// Finite state machine of the control
+        FSM m_fsm;
+        /// Command triggered by the button
+        CmdGeneric &m_rCommand;
+        /// Tooltip text
+        const UString m_tooltip;
+        /// Callbacks objects
+        Callback m_cmdUpOverDownOver;
+        Callback m_cmdDownOverUpOver;
+        Callback m_cmdDownOverDown;
+        Callback m_cmdDownDownOver;
+        Callback m_cmdUpOverUp;
+        Callback m_cmdUpUpOver;
+        Callback m_cmdDownUp;
+        Callback m_cmdUpHidden;
+        Callback m_cmdHiddenUp;
+        /// Images of the button in the different states
+        OSGraphics *m_pImgUp, *m_pImgOver, *m_pImgDown;
+        /// Current image
+        OSGraphics *m_pImg;
+
+        /// Callback functions
+        static void transUpOverDownOver( SkinObject *pCtrl );
+        static void transDownOverUpOver( SkinObject *pCtrl );
+        static void transDownOverDown( SkinObject *pCtrl );
+        static void transDownDownOver( SkinObject *pCtrl );
+        static void transUpOverUp( SkinObject *pCtrl );
+        static void transUpUpOver( SkinObject *pCtrl );
+        static void transDownUp( SkinObject *pCtrl );
+        static void transUpHidden( SkinObject *pCtrl );
+        static void transHiddenUp( SkinObject *pCtrl );
+};
+
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_checkbox.cpp b/modules/gui/skins2/controls/ctrl_checkbox.cpp
new file mode 100755 (executable)
index 0000000..088bcf7
--- /dev/null
@@ -0,0 +1,284 @@
+/*****************************************************************************
+ * ctrl_checkbox.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_checkbox.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_checkbox.hpp"
+#include "../events/evt_generic.hpp"
+#include "../commands/cmd_generic.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_graphics.hpp"
+#include "../utils/var_bool.hpp"
+
+
+CtrlCheckbox::CtrlCheckbox( intf_thread_t *pIntf,
+                            const GenericBitmap &rBmpUp1,
+                            const GenericBitmap &rBmpOver1,
+                            const GenericBitmap &rBmpDown1,
+                            const GenericBitmap &rBmpUp2,
+                            const GenericBitmap &rBmpOver2,
+                            const GenericBitmap &rBmpDown2,
+                            CmdGeneric &rCommand1, CmdGeneric &rCommand2,
+                            const UString &rTooltip1,
+                            const UString &rTooltip2,
+                            VarBool &rVariable, const UString &rHelp ):
+    CtrlGeneric( pIntf, rHelp ), m_fsm( pIntf ), m_rVariable( rVariable ),
+    m_rCommand1( rCommand1 ), m_rCommand2( rCommand2 ),
+    m_tooltip1( rTooltip1 ), m_tooltip2( rTooltip2 ),
+    m_cmdUpOverDownOver( this, &transUpOverDownOver ),
+    m_cmdDownOverUpOver( this, &transDownOverUpOver ),
+    m_cmdDownOverDown( this, &transDownOverDown ),
+    m_cmdDownDownOver( this, &transDownDownOver ),
+    m_cmdUpOverUp( this, &transUpOverUp ),
+    m_cmdUpUpOver( this, &transUpUpOver ),
+    m_cmdDownUp( this, &transDownUp ),
+    m_cmdUpHidden( this, &transUpHidden ),
+    m_cmdHiddenUp( this, &transHiddenUp )
+{
+    // Build the images of the checkbox
+    OSFactory *pOsFactory = OSFactory::instance( pIntf );
+    m_pImgUp1 = pOsFactory->createOSGraphics( rBmpUp1.getWidth(),
+                                              rBmpUp1.getHeight() );
+    m_pImgUp1->drawBitmap( rBmpUp1, 0, 0 );
+    m_pImgDown1 = pOsFactory->createOSGraphics( rBmpDown1.getWidth(),
+                                                rBmpDown1.getHeight() );
+    m_pImgDown1->drawBitmap( rBmpDown1, 0, 0 );
+    m_pImgOver1 = pOsFactory->createOSGraphics( rBmpOver1.getWidth(),
+                                                rBmpOver1.getHeight() );
+    m_pImgOver1->drawBitmap( rBmpOver1, 0, 0 );
+
+    m_pImgUp2 = pOsFactory->createOSGraphics( rBmpUp2.getWidth(),
+                                              rBmpUp2.getHeight() );
+    m_pImgUp2->drawBitmap( rBmpUp2, 0, 0 );
+    m_pImgDown2 = pOsFactory->createOSGraphics( rBmpDown2.getWidth(),
+                                                rBmpDown2.getHeight() );
+    m_pImgDown2->drawBitmap( rBmpDown2, 0, 0 );
+    m_pImgOver2 = pOsFactory->createOSGraphics( rBmpOver2.getWidth(),
+                                                rBmpOver2.getHeight() );
+    m_pImgOver2->drawBitmap( rBmpOver2, 0, 0 );
+
+    // States
+    m_fsm.addState( "up" );
+    m_fsm.addState( "down" );
+    m_fsm.addState( "upOver" );
+    m_fsm.addState( "downOver" );
+    m_fsm.addState( "hidden" );
+
+    // Transitions
+    m_fsm.addTransition( "upOver", "mouse:left:down", "downOver",
+                         &m_cmdUpOverDownOver );
+    m_fsm.addTransition( "downOver", "mouse:left:up", "upOver",
+                         &m_cmdDownOverUpOver );
+    m_fsm.addTransition( "downOver", "leave", "down", &m_cmdDownOverDown );
+    m_fsm.addTransition( "down", "enter", "downOver", &m_cmdDownDownOver );
+    m_fsm.addTransition( "upOver", "leave", "up", &m_cmdUpOverUp );
+    m_fsm.addTransition( "up", "enter", "upOver", &m_cmdUpUpOver );
+    m_fsm.addTransition( "down", "mouse:left:up", "up", &m_cmdDownUp );
+    // XXX: It would be easy to use a "ANY" initial state to handle these
+    // four lines in only one. But till now it isn't worthwhile...
+    m_fsm.addTransition( "up", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "down", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "upOver", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "downOver", "special:hide", "hidden", &m_cmdUpHidden );
+    m_fsm.addTransition( "hidden", "special:show", "up", &m_cmdHiddenUp );
+
+    // Observe the variable
+    m_rVariable.addObserver( this );
+
+    // Initial state
+    m_fsm.setState( "up" );
+    if( !m_rVariable.get() )
+    {
+        m_pImgUp = m_pImgUp1;
+        m_pImgOver = m_pImgOver1;
+        m_pImgDown = m_pImgDown1;
+        m_pImgCurrent = m_pImgUp;
+        m_pCommand = &m_rCommand1;
+        m_pTooltip = &m_tooltip1;
+    }
+    else
+    {
+        m_pImgUp = m_pImgUp2;
+        m_pImgOver = m_pImgOver2;
+        m_pImgDown = m_pImgDown2;
+        m_pImgCurrent = m_pImgDown;
+        m_pCommand = &m_rCommand2;
+        m_pTooltip = &m_tooltip2;
+    }
+}
+
+
+CtrlCheckbox::~CtrlCheckbox()
+{
+    m_rVariable.delObserver( this );
+    SKINS_DELETE( m_pImgUp1 );
+    SKINS_DELETE( m_pImgDown1 );
+    SKINS_DELETE( m_pImgOver1 );
+    SKINS_DELETE( m_pImgUp2 );
+    SKINS_DELETE( m_pImgDown2 );
+    SKINS_DELETE( m_pImgOver2 );
+}
+
+
+void CtrlCheckbox::handleEvent( EvtGeneric &rEvent )
+{
+    m_fsm.handleTransition( rEvent.getAsString() );
+}
+
+
+bool CtrlCheckbox::mouseOver( int x, int y ) const
+{
+    if( m_pImgCurrent )
+    {
+        return m_pImgCurrent->hit( x, y );
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+void CtrlCheckbox::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    if( m_pImgCurrent )
+    {
+        // Draw the current image
+        rImage.drawGraphics( *m_pImgCurrent, 0, 0, xDest, yDest );
+    }
+}
+
+
+void CtrlCheckbox::transUpOverDownOver( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->captureMouse();
+    pThis->m_pImgCurrent = pThis->m_pImgDown;
+    pThis->notifyLayout();
+}
+
+
+void CtrlCheckbox::transDownOverUpOver( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->releaseMouse();
+
+    // Invert the state variable
+    pThis->m_rVariable.set( !pThis->m_rVariable.get() );
+    pThis->m_pImgCurrent = pThis->m_pImgUp;
+    pThis->notifyLayout();
+
+    // Execute the command
+    pThis->m_pCommand->execute();
+}
+
+
+void CtrlCheckbox::transDownOverDown( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->m_pImgCurrent = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
+
+void CtrlCheckbox::transDownDownOver( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->m_pImgCurrent = pThis->m_pImgDown;
+    pThis->notifyLayout();
+}
+
+
+void CtrlCheckbox::transUpUpOver( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->m_pImgCurrent = pThis->m_pImgOver;
+    pThis->notifyLayout();
+}
+
+
+void CtrlCheckbox::transUpOverUp( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->m_pImgCurrent = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
+
+void CtrlCheckbox::transDownUp( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->releaseMouse();
+}
+
+
+void CtrlCheckbox::transUpHidden( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->m_pImgCurrent = NULL;
+    pThis->notifyLayout();
+}
+
+
+void CtrlCheckbox::transHiddenUp( SkinObject *pCtrl )
+{
+    CtrlCheckbox *pThis = (CtrlCheckbox*)pCtrl;
+    pThis->m_pImgCurrent = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
+
+void CtrlCheckbox::onUpdate( Subject<VarBool> &rVariable )
+{
+    changeButton();
+}
+
+
+void CtrlCheckbox::changeButton()
+{
+    // Are we using the first set of images or the second one?
+    if( m_pImgUp == m_pImgUp1 )
+    {
+        m_pImgUp = m_pImgUp2;
+        m_pImgOver = m_pImgOver2;
+        m_pImgDown = m_pImgDown2;
+        m_pTooltip = &m_tooltip2;
+        m_pCommand = &m_rCommand2;
+    }
+    else
+    {
+        m_pImgUp = m_pImgUp1;
+        m_pImgOver = m_pImgOver1;
+        m_pImgDown = m_pImgDown1;
+        m_pTooltip = &m_tooltip1;
+        m_pCommand = &m_rCommand1;
+    }
+    // XXX: We assume that the checkbox is up
+    m_pImgCurrent = m_pImgUp;
+
+    // Notify the window the tooltip has changed
+    notifyTooltipChange();
+    // Refresh
+    notifyLayout();
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_checkbox.hpp b/modules/gui/skins2/controls/ctrl_checkbox.hpp
new file mode 100644 (file)
index 0000000..7dbd244
--- /dev/null
@@ -0,0 +1,122 @@
+/*****************************************************************************
+ * ctrl_checkbox.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_checkbox.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_CHECKBOX_HPP
+#define CTRL_CHECKBOX_HPP
+
+#include "ctrl_generic.hpp"
+#include "../utils/fsm.hpp"
+#include "../utils/observer.hpp"
+
+class GenericBitmap;
+class OSGraphics;
+class CmdGeneric;
+class VarBool;
+
+
+/// Base class for checkbox controls
+class CtrlCheckbox: public CtrlGeneric, public Observer<VarBool>
+{
+    public:
+        /// Create a checkbox with 6 images
+        CtrlCheckbox( intf_thread_t *pIntf,
+                      const GenericBitmap &rBmpUp1,
+                      const GenericBitmap &rBmpOver1,
+                      const GenericBitmap &rBmpDown1,
+                      const GenericBitmap &rBmpUp2,
+                      const GenericBitmap &rBmpOver2,
+                      const GenericBitmap &rBmpDown2,
+                      CmdGeneric &rCommand1, CmdGeneric &rCommand2,
+                      const UString &rTooltip1, const UString &rTooltip2,
+                      VarBool &rVariable, const UString &rHelp );
+
+        virtual ~CtrlCheckbox();
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+        /// Get the text of the tooltip XXX
+        virtual UString getTooltipText() const { return *m_pTooltip; }
+
+    private:
+        /// Finite state machine of the control
+        FSM m_fsm;
+        /// Observed variable
+        VarBool &m_rVariable;
+        /// Commands for the 2 states
+        CmdGeneric &m_rCommand1, &m_rCommand2;
+        /// Current command
+        CmdGeneric *m_pCommand;
+        /// Tooltip texts for the 2 states
+        const UString m_tooltip1, m_tooltip2;
+        /// Current tooltip
+        const UString *m_pTooltip;
+        /// Callbacks objects
+        Callback m_cmdUpOverDownOver;
+        Callback m_cmdDownOverUpOver;
+        Callback m_cmdDownOverDown;
+        Callback m_cmdDownDownOver;
+        Callback m_cmdUpOverUp;
+        Callback m_cmdUpUpOver;
+        Callback m_cmdDownUp;
+        Callback m_cmdUpHidden;
+        Callback m_cmdHiddenUp;
+        /// Images of the checkbox in the different states
+        OSGraphics *m_pImgUp1, *m_pImgOver1, *m_pImgDown1;
+        OSGraphics *m_pImgUp2, *m_pImgOver2, *m_pImgDown2;
+        /// Current set of images (pointing to 1 or 2)
+        /// In fact, we consider here that a checkbox acts like 2 buttons, in a
+        /// symetric way; this is a small trick to avoid multiplicating the
+        /// callbacks (and it could be extended easily to support 3 buttons or
+        /// more...)
+        OSGraphics *m_pImgUp, *m_pImgOver, *m_pImgDown;
+        /// Current image
+        OSGraphics *m_pImgCurrent;
+
+        /// Callback functions
+        static void transUpOverDownOver( SkinObject *pCtrl );
+        static void transDownOverUpOver( SkinObject *pCtrl );
+        static void transDownOverDown( SkinObject *pCtrl );
+        static void transDownDownOver( SkinObject *pCtrl );
+        static void transUpOverUp( SkinObject *pCtrl );
+        static void transUpUpOver( SkinObject *pCtrl );
+        static void transDownUp( SkinObject *pCtrl );
+        static void transUpHidden( SkinObject *pCtrl );
+        static void transHiddenUp( SkinObject *pCtrl );
+
+        /// Method called when the observed variable is modified
+        virtual void onUpdate( Subject<VarBool> &rVariable );
+
+        /// Helper function to update the current state of images
+        void changeButton();
+};
+
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_flat.hpp b/modules/gui/skins2/controls/ctrl_flat.hpp
new file mode 100644 (file)
index 0000000..f113e26
--- /dev/null
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ * ctrl_flat.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_flat.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_FLAT_HPP
+#define CTRL_FLAT_HPP
+
+#include "ctrl_generic.hpp"
+
+
+/// Base class for "mover controls" and images
+class CtrlFlat: public CtrlGeneric
+{
+    protected:
+        CtrlFlat( intf_thread_t *pIntf, const UString &rHelp ):
+            CtrlGeneric( pIntf, rHelp ) {}
+        virtual ~CtrlFlat() {}
+};
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_generic.cpp b/modules/gui/skins2/controls/ctrl_generic.cpp
new file mode 100755 (executable)
index 0000000..d6dabfa
--- /dev/null
@@ -0,0 +1,110 @@
+/*****************************************************************************
+ * ctrl_generic.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_generic.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_generic.hpp"
+#include "../src/generic_layout.hpp"
+#include "../src/generic_window.hpp"
+#include "../src/os_graphics.hpp"
+#include "../utils/position.hpp"
+
+
+CtrlGeneric::CtrlGeneric( intf_thread_t *pIntf, const UString &rHelp ):
+    SkinObject( pIntf ), m_pLayout( NULL ), m_pPosition( NULL ),
+    m_help( rHelp )
+{
+}
+
+
+CtrlGeneric::~CtrlGeneric()
+{
+    if( m_pPosition )
+    {
+        delete m_pPosition;
+    }
+}
+
+
+void CtrlGeneric::setLayout( GenericLayout *pLayout,
+                             const Position &rPosition )
+{
+    m_pLayout = pLayout;
+    if( m_pPosition )
+    {
+        delete m_pPosition;
+    }
+    m_pPosition = new Position( rPosition );
+    onPositionChange();
+}
+
+
+void CtrlGeneric::notifyLayout() const
+{
+    // Notify the layout
+    if( m_pLayout )
+    {
+        m_pLayout->onControlUpdate( *this );
+    }
+}
+
+
+void CtrlGeneric::captureMouse() const
+{
+    // Tell the layout we want to capture the mouse
+    if( m_pLayout )
+    {
+        m_pLayout->onControlCapture( *this );
+    }
+}
+
+
+void CtrlGeneric::releaseMouse() const
+{
+    // Tell the layout we want to release the mouse
+    if( m_pLayout )
+    {
+        m_pLayout->onControlRelease( *this );
+    }
+}
+
+
+void CtrlGeneric::notifyTooltipChange() const
+{
+    GenericWindow *pWin = getWindow();
+    if( pWin )
+    {
+        // Notify the window
+        pWin->onTooltipChange( *this );
+    }
+}
+
+
+GenericWindow *CtrlGeneric::getWindow() const
+{
+    if( m_pLayout )
+    {
+        return m_pLayout->getWindow();
+    }
+    return NULL;
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_generic.hpp b/modules/gui/skins2/controls/ctrl_generic.hpp
new file mode 100644 (file)
index 0000000..447417c
--- /dev/null
@@ -0,0 +1,110 @@
+/*****************************************************************************
+ * ctrl_generic.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_generic.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_GENERIC_HPP
+#define CTRL_GENERIC_HPP
+
+#include "../src/skin_common.hpp"
+#include "../utils/pointer.hpp"
+#include "../utils/fsm.hpp"
+#include "../utils/ustring.hpp"
+
+class EvtGeneric;
+class OSGraphics;
+class GenericLayout;
+class Position;
+class GenericWindow;
+
+
+/// Base class for controls
+class CtrlGeneric: public SkinObject
+{
+    public:
+        virtual ~CtrlGeneric();
+
+        /// Handle an event on the control
+        virtual void handleEvent( EvtGeneric &rEvent ) {}
+
+        /// Check whether coordinates are inside the control
+        virtual bool mouseOver( int x, int y ) const { return false; }
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest ) {}
+
+        /// Set the position and the associated layout of the control
+        virtual void setLayout( GenericLayout *pLayout,
+                                const Position &rPosition );
+
+        /// Get the position of the control in the layout, if any
+        virtual const Position *getPosition() const { return m_pPosition; }
+
+        /// Get the text of the tooltip
+        virtual UString getTooltipText() const
+            { return UString( getIntf(), "" ); }
+
+        /// Overload this method if you want to do something special when
+        /// the layout is resized
+        virtual void onResize() {}
+
+        /// Get the help text
+        virtual const UString &getHelpText() const { return m_help; }
+
+        /// Return true if the control can gain the focus
+        virtual bool isFocusable() const { return false; }
+
+    protected:
+        CtrlGeneric( intf_thread_t *pIntf, const UString &rHelp );
+
+        /// Tell the layout when the image has changed
+        virtual void notifyLayout() const;
+
+        /// Ask the layout to capture the mouse
+        virtual void captureMouse() const;
+
+        /// Ask the layout to release the mouse
+        virtual void releaseMouse() const;
+
+        /// Notify the window the tooltip has changed
+        virtual void notifyTooltipChange() const;
+
+        /// Get the associated window, if any
+        virtual GenericWindow *getWindow() const;
+
+        /// Overload this method if you want to do something special when
+        /// the Position object is set
+        virtual void onPositionChange() {}
+
+    private:
+        /// Associated layout
+        GenericLayout *m_pLayout;
+        /// Position in the layout
+        Position *m_pPosition;
+        /// Help text
+        UString m_help;
+};
+
+typedef CountedPtr<CtrlGeneric> CtrlGenericPtr;
+
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_image.cpp b/modules/gui/skins2/controls/ctrl_image.cpp
new file mode 100755 (executable)
index 0000000..4871b86
--- /dev/null
@@ -0,0 +1,88 @@
+/*****************************************************************************
+ * ctrl_image.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_image.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_image.hpp"
+#include "../commands/cmd_dialogs.hpp"
+#include "../events/evt_generic.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_graphics.hpp"
+#include "../src/scaled_bitmap.hpp"
+#include "../utils/position.hpp"
+
+
+CtrlImage::CtrlImage( intf_thread_t *pIntf, const GenericBitmap &rBitmap,
+                      const UString &rHelp ):
+    CtrlFlat( pIntf, rHelp ), m_rBitmap( rBitmap )
+{
+    OSFactory *pOsFactory = OSFactory::instance( pIntf );
+    // Create an initial unscaled image in the buffer
+    m_pImage = pOsFactory->createOSGraphics( rBitmap.getWidth(),
+                                             rBitmap.getHeight() );
+    m_pImage->drawBitmap( m_rBitmap );
+}
+
+
+CtrlImage::~CtrlImage()
+{
+    SKINS_DELETE( m_pImage );
+}
+
+
+void CtrlImage::handleEvent( EvtGeneric &rEvent )
+{
+    // No FSM for this simple transition
+    if( rEvent.getAsString() == "mouse:right:down:none" )
+    {
+        CmdDlgPopupMenu cmd( getIntf() );
+        cmd.execute();
+    }
+}
+
+
+bool CtrlImage::mouseOver( int x, int y ) const
+{
+    return m_pImage->hit( x, y );
+}
+
+
+void CtrlImage::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    const Position *pPos = getPosition();
+    if( pPos )
+    {
+        int width = pPos->getWidth();
+        int height = pPos->getHeight();
+        if( width != m_pImage->getWidth() || height != m_pImage->getHeight() )
+        {
+            OSFactory *pOsFactory = OSFactory::instance( getIntf() );
+            // Rescale the image with the actual size of the control
+            ScaledBitmap bmp( getIntf(), m_rBitmap, width, height );
+            SKINS_DELETE( m_pImage );
+            m_pImage = pOsFactory->createOSGraphics( width, height );
+            m_pImage->drawBitmap( bmp, 0, 0 );
+        }
+        rImage.drawGraphics( *m_pImage, 0, 0, xDest, yDest );
+    }
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_image.hpp b/modules/gui/skins2/controls/ctrl_image.hpp
new file mode 100644 (file)
index 0000000..705d477
--- /dev/null
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ * ctrl_image.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_image.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_IMAGE_HPP
+#define CTRL_IMAGE_HPP
+
+#include "../commands/cmd_generic.hpp"
+#include "ctrl_flat.hpp"
+
+class GenericBitmap;
+class OSGraphics;
+
+
+/// Control image
+class CtrlImage: public CtrlFlat
+{
+    public:
+        // Create an image with the given bitmap (which is NOT copied)
+        CtrlImage( intf_thread_t *pIntf, const GenericBitmap &rBitmap,
+                   const UString &rHelp );
+        virtual ~CtrlImage();
+
+        /// Handle an event on the control
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+    private:
+        /// Bitmap
+        const GenericBitmap &m_rBitmap;
+        /// Buffer to stored the rendered bitmap
+        OSGraphics *m_pImage;
+};
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_list.cpp b/modules/gui/skins2/controls/ctrl_list.cpp
new file mode 100644 (file)
index 0000000..6b0dc72
--- /dev/null
@@ -0,0 +1,387 @@
+/*****************************************************************************
+ * ctrl_list.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_list.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include <math.h>
+#include "ctrl_list.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_graphics.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/generic_font.hpp"
+#include "../utils/position.hpp"
+#include "../utils/ustring.hpp"
+#include "../events/evt_key.hpp"
+#include "../events/evt_mouse.hpp"
+#include "../events/evt_scroll.hpp"
+#include "vlc_keys.h"
+
+#define SCROLL_STEP 0.05
+
+
+CtrlList::CtrlList( intf_thread_t *pIntf, VarList &rList, GenericFont &rFont,
+                    uint32_t fgColor, uint32_t playColor, uint32_t bgColor1,
+                    uint32_t bgColor2, uint32_t selColor,
+                    const UString &rHelp ):
+    CtrlGeneric( pIntf, rHelp ), m_rList( rList ), m_rFont( rFont ),
+    m_fgColor( fgColor ), m_playColor( playColor ), m_bgColor1( bgColor1 ),
+    m_bgColor2( bgColor2 ), m_selColor( selColor ), m_pLastSelected( NULL ),
+    m_pImage( NULL ), m_lastPos( 0 )
+{
+    // Observe the list and position variables
+    m_rList.addObserver( this );
+    m_rList.getPositionVar().addObserver( this );
+
+    makeImage();
+}
+
+
+CtrlList::~CtrlList()
+{
+    m_rList.getPositionVar().delObserver( this );
+    m_rList.delObserver( this );
+    if( m_pImage )
+    {
+        delete m_pImage;
+    }
+}
+
+
+void CtrlList::onUpdate( Subject<VarList> &rList )
+{
+    makeImage();
+    notifyLayout();
+    m_pLastSelected = NULL;
+}
+
+
+void CtrlList::onUpdate( Subject<VarPercent> &rPercent )
+{
+    // Get the size of the control
+    const Position *pPos = getPosition();
+    if( !pPos )
+    {
+        return;
+    }
+    int height = pPos->getHeight();
+
+    // How many lines can be displayed ?
+    int itemHeight = m_rFont.getSize();
+    int maxItems = height / itemHeight;
+
+    // Determine what is the first item to display
+    VarPercent &rVarPos = m_rList.getPositionVar();
+    int firstItem = 0;
+    int excessItems = m_rList.size() - maxItems;
+    if( excessItems > 0 )
+    {
+        // a simple (int)(...) causes rounding errors !
+        firstItem = lrint( (1.0 - rVarPos.get()) * (double)excessItems );
+    }
+    if( m_lastPos != firstItem )
+    {
+        // Redraw the control if the position has changed
+        m_lastPos = firstItem;
+        makeImage();
+        notifyLayout();
+    }
+}
+
+
+void CtrlList::onResize()
+{
+    // Get the size of the control
+    const Position *pPos = getPosition();
+    if( !pPos )
+    {
+        return;
+    }
+    int height = pPos->getHeight();
+
+    // How many lines can be displayed ?
+    int itemHeight = m_rFont.getSize();
+    int maxItems = height / itemHeight;
+
+    // Update the position variable
+    VarPercent &rVarPos = m_rList.getPositionVar();
+    int excessItems = m_rList.size() - maxItems;
+    if( excessItems > 0 )
+    {
+        double newVal = 1.0 - (double)m_lastPos / excessItems;
+        if( newVal >= 0 )
+        {
+            // Change the position to keep the same first displayed item
+            rVarPos.set( 1.0 - (double)m_lastPos / excessItems );
+        }
+        else
+        {
+            // We cannot keep the current first item
+            m_lastPos = excessItems;
+        }
+    }
+
+    makeImage();
+    notifyLayout();
+}
+
+
+void CtrlList::onPositionChange()
+{
+    makeImage();
+    notifyLayout();
+}
+
+
+void CtrlList::handleEvent( EvtGeneric &rEvent )
+{
+    if( rEvent.getAsString().find( "key:down" ) != string::npos )
+    {
+        char key = ((EvtKey&)rEvent).getKey();
+    }
+
+    else if( rEvent.getAsString().find( "mouse:left" ) != string::npos )
+    {
+        EvtMouse &rEvtMouse = (EvtMouse&)rEvent;
+        const Position *pos = getPosition();
+        int yPos = m_lastPos +
+                ( rEvtMouse.getYPos() - pos->getTop() ) / m_rFont.getSize();
+        VarList::Iterator it;
+        int index = 0;
+
+        if( rEvent.getAsString().find( "mouse:left:down:ctrl,shift" ) !=
+                 string::npos )
+        {
+            // Flag to know if the current item must be selected
+            bool select = false;
+            for( it = m_rList.begin(); it != m_rList.end(); it++ )
+            {
+                bool nextSelect = select;
+                if( index == yPos || &*it == m_pLastSelected )
+                {
+                    if( select )
+                    {
+                        nextSelect = false;
+                    }
+                    else
+                    {
+                        select = true;
+                        nextSelect = true;
+                    }
+                }
+                (*it).m_selected = (*it).m_selected || select;
+                select = nextSelect;
+                index++;
+            }
+        }
+
+        else if( rEvent.getAsString().find( "mouse:left:down:ctrl" ) !=
+                 string::npos )
+        {
+            for( it = m_rList.begin(); it != m_rList.end(); it++ )
+            {
+                if( index == yPos )
+                {
+                    (*it).m_selected = ! (*it).m_selected;
+                    m_pLastSelected = &*it;
+                    break;
+                }
+                index++;
+            }
+        }
+
+        else if( rEvent.getAsString().find( "mouse:left:down:shift" ) !=
+                 string::npos )
+        {
+            // Flag to know if the current item must be selected
+            bool select = false;
+            for( it = m_rList.begin(); it != m_rList.end(); it++ )
+            {
+                bool nextSelect = select;
+                if( index == yPos ||  &*it == m_pLastSelected )
+                {
+                    if( select )
+                    {
+                        nextSelect = false;
+                    }
+                    else
+                    {
+                        select = true;
+                        nextSelect = true;
+                    }
+                }
+                (*it).m_selected = select;
+                select = nextSelect;
+                index++;
+            }
+        }
+
+        else if( rEvent.getAsString().find( "mouse:left:down" ) !=
+                 string::npos )
+        {
+            for( it = m_rList.begin(); it != m_rList.end(); it++ )
+            {
+                if( index == yPos )
+                {
+                    (*it).m_selected = true;
+                    m_pLastSelected = &*it;
+                }
+                else
+                {
+                    (*it).m_selected = false;
+                }
+                index++;
+            }
+        }
+
+        else if( rEvent.getAsString().find( "mouse:left:dblclick" ) !=
+                 string::npos )
+        {
+            for( it = m_rList.begin(); it != m_rList.end(); it++ )
+            {
+                if( index == yPos )
+                {
+                    (*it).m_selected = true;
+                    m_pLastSelected = &*it;
+                    // Execute the action associated to this item
+                    m_rList.action( &*it );
+                }
+                else
+                {
+                    (*it).m_selected = false;
+                }
+                index++;
+            }
+        }
+
+        // Redraw the control
+        makeImage();
+        notifyLayout();
+    }
+
+    else if( rEvent.getAsString().find( "scroll" ) != string::npos )
+    {
+        int direction = ((EvtScroll&)rEvent).getDirection();
+
+        double percentage = m_rList.getPositionVar().get();
+        if( direction == EvtScroll::kUp )
+        {
+            percentage += SCROLL_STEP;
+        }
+        else
+        {
+            percentage -= SCROLL_STEP;
+        }
+        m_rList.getPositionVar().set( percentage );
+    }
+}
+
+
+bool CtrlList::mouseOver( int x, int y ) const
+{
+    const Position *pPos = getPosition();
+    if( pPos )
+    {
+        int width = pPos->getWidth();
+        int height = pPos->getHeight();
+        return ( x >= 0 && x <= width && y >= 0 && y <= height );
+    }
+    return false;
+}
+
+
+void CtrlList::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    if( m_pImage )
+    {
+        rImage.drawGraphics( *m_pImage, 0, 0, xDest, yDest );
+    }
+}
+
+
+void CtrlList::makeImage()
+{
+    if( m_pImage )
+    {
+        delete m_pImage;
+    }
+
+    // Get the size of the control
+    const Position *pPos = getPosition();
+    if( !pPos )
+    {
+        return;
+    }
+    int width = pPos->getWidth();
+    int height = pPos->getHeight();
+    int itemHeight = m_rFont.getSize();
+
+    // Create an image
+    OSFactory *pOsFactory = OSFactory::instance( getIntf() );
+    m_pImage = pOsFactory->createOSGraphics( width, height );
+
+    // Current background color
+    uint32_t bgColor = m_bgColor1;
+
+    // Draw the background
+    VarList::ConstIterator it = m_rList[m_lastPos];
+    for( int yPos = 0; yPos < height; yPos += itemHeight )
+    {
+        int rectHeight = __MIN( itemHeight, height - yPos );
+        if( it != m_rList.end() )
+        {
+            uint32_t color = ( (*it).m_selected ? m_selColor : bgColor );
+            m_pImage->fillRect( 0, yPos, width, rectHeight, color );
+            it++;
+        }
+        else
+        {
+            m_pImage->fillRect( 0, yPos, width, rectHeight, bgColor );
+        }
+        // Flip the background color
+        bgColor = ( bgColor == m_bgColor1 ? m_bgColor2 : m_bgColor1 );
+    }
+
+    // Draw the items
+    int yPos = 0;
+    for( it = m_rList[m_lastPos]; it != m_rList.end() && yPos < height; it++ )
+    {
+        UString *pStr = (UString*)((*it).m_cString.get());
+        uint32_t color = ( (*it).m_playing ? m_playColor : m_fgColor );
+
+        // Draw the text
+        GenericBitmap *pText = m_rFont.drawString( *pStr, color, width );
+        yPos += itemHeight - pText->getHeight();
+        int ySrc = 0;
+        if( yPos < 0 )
+        {
+            ySrc = - yPos;
+            yPos = 0;
+        }
+        int lineHeight = __MIN( pText->getHeight() - ySrc, height - yPos );
+        m_pImage->drawBitmap( *pText, 0, ySrc, 0, yPos, pText->getWidth(),
+                              lineHeight );
+        yPos += (pText->getHeight() - ySrc );
+        delete pText;
+
+    }
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_list.hpp b/modules/gui/skins2/controls/ctrl_list.hpp
new file mode 100644 (file)
index 0000000..bfbc1f7
--- /dev/null
@@ -0,0 +1,95 @@
+/*****************************************************************************
+ * ctrl_list.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_list.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_LIST_HPP
+#define CTRL_LIST_HPP
+
+#include "ctrl_generic.hpp"
+#include "../utils/observer.hpp"
+#include "../utils/var_list.hpp"
+
+class OSGraphics;
+class GenericFont;
+
+
+/// Class for control list
+class CtrlList: public CtrlGeneric, public Observer<VarList>,
+    public Observer<VarPercent>
+{
+    public:
+        CtrlList( intf_thread_t *pIntf, VarList &rList, GenericFont &rFont,
+                  uint32_t fgcolor, uint32_t playcolor, uint32_t bgcolor1,
+                  uint32_t bgcolor2, uint32_t selColor,
+                  const UString &rHelp );
+        virtual ~CtrlList();
+
+        /// Handle an event on the control.
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the control.
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+        /// Called when the layout is resized
+        virtual void onResize();
+
+        /// Return true if the control can gain the focus
+        virtual bool isFocusable() const { return true; }
+
+    private:
+        /// List associated to the control
+        VarList &m_rList;
+        /// Font
+        GenericFont &m_rFont;
+        /// Color of normal text
+        uint32_t m_fgColor;
+        /// Color of the playing item
+        uint32_t m_playColor;
+        /// Background colors
+        uint32_t m_bgColor1, m_bgColor2;
+        /// Background of selected items
+        uint32_t m_selColor;
+        /// Pointer on the last selected item in the list
+        VarList::Elem_t *m_pLastSelected;
+        /// Image of the control
+        OSGraphics *m_pImage;
+        /// Last position
+        int m_lastPos;
+
+        /// Method called when the list variable is modified
+        virtual void onUpdate( Subject<VarList> &rList );
+
+        /// Method called when the position variable of the list is modified
+        virtual void onUpdate( Subject<VarPercent> &rPercent );
+
+        /// Called when the position is set
+        virtual void onPositionChange();
+
+        /// Draw the image of the control
+        void makeImage();
+};
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_move.cpp b/modules/gui/skins2/controls/ctrl_move.cpp
new file mode 100755 (executable)
index 0000000..901f200
--- /dev/null
@@ -0,0 +1,134 @@
+/*****************************************************************************
+ * ctrl_move.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_move.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_move.hpp"
+#include "../events/evt_generic.hpp"
+#include "../events/evt_mouse.hpp"
+#include "../events/evt_motion.hpp"
+#include "../src/generic_window.hpp"
+#include "../src/window_manager.hpp"
+#include "../utils/position.hpp"
+
+
+CtrlMove::CtrlMove( intf_thread_t *pIntf, WindowManager &rWindowManager,
+                    CtrlFlat &rCtrl, GenericWindow &rWindow,
+                    const UString &rHelp ):
+    CtrlFlat( pIntf, rHelp ), m_fsm( pIntf ),
+    m_rWindowManager( rWindowManager ),
+    m_rCtrl( rCtrl ), m_rWindow( rWindow ),
+    m_cmdMovingMoving( this, &transMovingMoving ),
+    m_cmdStillMoving( this, &transStillMoving ),
+    m_cmdMovingStill( this, &transMovingStill )
+{
+    m_pEvt = NULL;
+    m_xPos = 0;
+    m_yPos = 0;
+
+    // States
+    m_fsm.addState( "moving" );
+    m_fsm.addState( "still" );
+
+    // Transitions
+    m_fsm.addTransition( "moving", "mouse:left:up:none", "still",
+                         &m_cmdMovingStill );
+    m_fsm.addTransition( "still", "mouse:left:down:none", "moving",
+                         &m_cmdStillMoving );
+    m_fsm.addTransition( "moving", "motion", "moving", &m_cmdMovingMoving );
+
+    m_fsm.setState( "still" );
+}
+
+
+bool CtrlMove::mouseOver( int x, int y ) const
+{
+    return m_rCtrl.mouseOver( x, y );
+}
+
+
+void CtrlMove::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    m_rCtrl.draw( rImage, xDest, yDest );
+}
+
+
+void CtrlMove::setLayout( GenericLayout *pLayout, const Position &rPosition )
+{
+    CtrlGeneric::setLayout( pLayout, rPosition );
+    // Set the layout of the decorated control as well
+    m_rCtrl.setLayout( pLayout, rPosition );
+}
+
+
+const Position *CtrlMove::getPosition() const
+{
+    return m_rCtrl.getPosition();
+}
+
+
+void CtrlMove::handleEvent( EvtGeneric &rEvent )
+{
+    m_pEvt = &rEvent;
+    m_fsm.handleTransition( rEvent.getAsString() );
+    // Transmit the event to the decorated control
+    // XXX: Is it really a good idea?
+    m_rCtrl.handleEvent( rEvent );
+}
+
+
+void CtrlMove::transStillMoving( SkinObject *pCtrl )
+{
+    CtrlMove *pThis = (CtrlMove*)pCtrl;
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    pThis->m_xPos = pEvtMouse->getXPos();
+    pThis->m_yPos = pEvtMouse->getYPos();
+
+    pThis->captureMouse();
+
+    pThis->m_rWindowManager.startMove( &pThis->m_rWindow );
+}
+
+
+void CtrlMove::transMovingMoving( SkinObject *pCtrl )
+{
+    CtrlMove *pThis = (CtrlMove*)pCtrl;
+    EvtMotion *pEvtMotion = (EvtMotion*)pThis->m_pEvt;
+
+    int xNewLeft = pEvtMotion->getXPos() - pThis->m_xPos +
+                   pThis->m_rWindow.getLeft();
+    int yNewTop = pEvtMotion->getYPos() - pThis->m_yPos +
+                  pThis->m_rWindow.getTop();
+
+    pThis->m_rWindowManager.move( &pThis->m_rWindow, xNewLeft, yNewTop );
+}
+
+
+void CtrlMove::transMovingStill( SkinObject *pCtrl )
+{
+    CtrlMove *pThis = (CtrlMove*)pCtrl;
+
+    pThis->releaseMouse();
+
+    pThis->m_rWindowManager.stopMove();
+}
diff --git a/modules/gui/skins2/controls/ctrl_move.hpp b/modules/gui/skins2/controls/ctrl_move.hpp
new file mode 100644 (file)
index 0000000..47dabb3
--- /dev/null
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ * ctrl_move.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_move.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_MOVE_HPP
+#define CTRL_MOVE_HPP
+
+#include "../commands/cmd_generic.hpp"
+#include "../utils/fsm.hpp"
+#include "ctrl_flat.hpp"
+
+class GenericWindow;
+class WindowManager;
+
+
+/// Control for moving windows
+class CtrlMove: public CtrlFlat
+{
+    public:
+        CtrlMove( intf_thread_t *pIntf, WindowManager &rWindowManager,
+                  CtrlFlat &rCtrl, GenericWindow &rWindow,
+                  const UString &rHelp );
+        virtual ~CtrlMove() {}
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the decorated control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+        /// Set the position and the associated layout of the decorated control
+        virtual void setLayout( GenericLayout *pLayout,
+                                const Position &rPosition );
+
+        /// Get the position of the decorated control in the layout, if any
+        virtual const Position *getPosition() const;
+
+        static void transMovingMoving( SkinObject *pCtrl );
+        static void transStillMoving( SkinObject *pCtrl );
+        static void transMovingStill( SkinObject *pCtrl );
+
+    private:
+        FSM m_fsm;
+        /// Window manager
+        WindowManager &m_rWindowManager;
+        /// Decorated CtrlFlat
+        CtrlFlat &m_rCtrl;
+        /// The window moved by this control
+        GenericWindow &m_rWindow;
+        /// The last received event
+        EvtGeneric *m_pEvt;
+        /// Position of the click that started the move
+        int m_xPos, m_yPos;
+        /// Callbacks
+        Callback m_cmdMovingMoving;
+        Callback m_cmdStillMoving;
+        Callback m_cmdMovingStill;
+};
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_radialslider.cpp b/modules/gui/skins2/controls/ctrl_radialslider.cpp
new file mode 100644 (file)
index 0000000..4431900
--- /dev/null
@@ -0,0 +1,174 @@
+/*****************************************************************************
+ * ctrl_radialslider.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_radialslider.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include <math.h>
+#include "ctrl_radialslider.hpp"
+#include "../events/evt_mouse.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/generic_window.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_graphics.hpp"
+#include "../utils/position.hpp"
+#include "../utils/var_percent.hpp"
+
+
+CtrlRadialSlider::CtrlRadialSlider( intf_thread_t *pIntf,
+                                    const GenericBitmap &rBmpSeq, int numImg,
+                                    VarPercent &rVariable, double minAngle,
+                                    double maxAngle, const UString &rHelp ):
+    CtrlGeneric( pIntf, rHelp ), m_fsm( pIntf ), m_numImg( numImg ),
+    m_rVariable( rVariable ), m_minAngle( minAngle ), m_maxAngle( maxAngle ),
+    m_cmdUpDown( this, &transUpDown ), m_cmdDownUp( this, &transDownUp ),
+    m_cmdMove( this, &transMove ), m_position( 0 ), m_lastPos( 0 )
+{
+    // Build the images of the sequence
+    OSFactory *pOsFactory = OSFactory::instance( getIntf() );
+    m_pImgSeq = pOsFactory->createOSGraphics( rBmpSeq.getWidth(),
+                                              rBmpSeq.getHeight() );
+    m_pImgSeq->drawBitmap( rBmpSeq, 0, 0 );
+
+    m_width = rBmpSeq.getWidth();
+    m_height = rBmpSeq.getHeight() / numImg;
+
+    // States
+    m_fsm.addState( "up" );
+    m_fsm.addState( "down" );
+
+    // Transitions
+    m_fsm.addTransition( "up", "mouse:left:down", "down", &m_cmdUpDown );
+    m_fsm.addTransition( "down", "mouse:left:up", "up", &m_cmdDownUp );
+    m_fsm.addTransition( "down", "motion", "down", &m_cmdMove );
+
+    // Initial state
+    m_fsm.setState( "up" );
+
+    // Observe the variable
+    m_rVariable.addObserver( this );
+}
+
+
+CtrlRadialSlider::~CtrlRadialSlider()
+{
+    m_rVariable.delObserver( this );
+    SKINS_DELETE( m_pImgSeq );
+}
+
+
+void CtrlRadialSlider::handleEvent( EvtGeneric &rEvent )
+{
+    // Save the event to use it in callbacks
+    m_pEvt = &rEvent;
+
+    m_fsm.handleTransition( rEvent.getAsString() );
+}
+
+
+bool CtrlRadialSlider::mouseOver( int x, int y ) const
+{
+    return m_pImgSeq->hit( x, y + m_position * m_height );
+}
+
+
+void CtrlRadialSlider::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    rImage.drawGraphics( *m_pImgSeq, 0, m_position * m_height, xDest, yDest,
+                         m_width, m_height );
+}
+
+
+void CtrlRadialSlider::onUpdate( Subject<VarPercent> &rVariable )
+{
+    m_position = (int)( m_rVariable.get() * m_numImg );
+    notifyLayout();
+}
+
+
+void CtrlRadialSlider::transUpDown( SkinObject *pCtrl )
+{
+    CtrlRadialSlider *pThis = (CtrlRadialSlider*)pCtrl;
+
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    // Change the position of the cursor, in non-blocking mode
+    pThis->setCursor( pEvtMouse->getXPos(), pEvtMouse->getYPos(), false );
+
+    pThis->captureMouse();
+}
+
+
+void CtrlRadialSlider::transDownUp( SkinObject *pCtrl )
+{
+    CtrlRadialSlider *pThis = (CtrlRadialSlider*)pCtrl;
+
+    pThis->releaseMouse();
+}
+
+
+void CtrlRadialSlider::transMove( SkinObject *pCtrl )
+{
+    CtrlRadialSlider *pThis = (CtrlRadialSlider*)pCtrl;
+
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    // Change the position of the cursor, in blocking mode
+    pThis->setCursor( pEvtMouse->getXPos(), pEvtMouse->getYPos(), true );
+}
+
+
+void CtrlRadialSlider::setCursor( int posX, int posY, bool blocking )
+{
+    // Get the position of the control
+    const Position *pPos = getPosition();
+    if( !pPos )
+    {
+        return;
+    }
+
+    // Compute the position relative to the center
+    int x = posX - pPos->getLeft() - m_width / 2;
+    int y = posY - pPos->getTop() - m_width / 2;
+
+    // Compute the polar coordinates. angle is -(-j,OM)
+    double r = sqrt(x*x + y*y);
+    if( r == 0 )
+    {
+        return;
+    }
+    double angle = acos(y/r);
+    if( x > 0 )
+    {
+        angle = 2*M_PI - angle;
+    }
+
+    if( angle >= m_minAngle && angle <= m_maxAngle )
+    {
+        double newVal = (angle - m_minAngle) / (m_maxAngle - m_minAngle);
+        // Avoid too fast moves of the cursor if blocking mode
+        if( !blocking || fabs( m_rVariable.get() - newVal ) < 0.5 )
+        {
+            m_rVariable.set( newVal );
+        }
+    }
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_radialslider.hpp b/modules/gui/skins2/controls/ctrl_radialslider.hpp
new file mode 100644 (file)
index 0000000..3083720
--- /dev/null
@@ -0,0 +1,98 @@
+/*****************************************************************************
+ * ctrl_radialslider.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_radialslider.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_RADIALSLIDER_HPP
+#define CTRL_RADIALSLIDER_HPP
+
+#include "ctrl_generic.hpp"
+#include "../utils/fsm.hpp"
+#include "../utils/observer.hpp"
+
+
+class GenericBitmap;
+class OSGraphics;
+class VarPercent;
+
+
+/// Radial slider
+class CtrlRadialSlider: public CtrlGeneric, public Observer<VarPercent>
+{
+    public:
+        /// Create a radial slider with the given image, which must be
+        /// composed of numImg subimages of the same size
+        CtrlRadialSlider( intf_thread_t *pIntf, const GenericBitmap &rBmpSeq,
+                          int numImg, VarPercent &rVariable, double minAngle,
+                          double maxAngle, const UString &rHelp );
+
+        virtual ~CtrlRadialSlider();
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+    private:
+        /// Finite state machine of the control
+        FSM m_fsm;
+        /// Number of sub-images in the slider image
+        int m_numImg;
+        /// Variable associated to the slider
+        VarPercent &m_rVariable;
+        /// Min and max angles of the button
+        double m_minAngle, m_maxAngle;
+        /// Callbacks objects
+        Callback m_cmdUpDown;
+        Callback m_cmdDownUp;
+        Callback m_cmdMove;
+        /// Position of the cursor
+        int m_position;
+        /// Size of an image
+        int m_width, m_height;
+        /// The last received event
+        EvtGeneric *m_pEvt;
+        /// Sequence of images
+        OSGraphics *m_pImgSeq;
+        /// Last saved position
+        int m_lastPos;
+
+        /// Callback functions
+        static void transUpDown( SkinObject *pCtrl );
+        static void transDownUp( SkinObject *pCtrl );
+        static void transMove( SkinObject *pCtrl );
+
+        /// Method called when the observed variable is modified
+        virtual void onUpdate( Subject<VarPercent> &rVariable );
+
+        /// Change the position of the cursor, with the given position of
+        /// the mouse (relative to the layout). Is blocking is true, the
+        /// the cursor cannot do more than a half turn
+        void setCursor( int posX, int posY, bool blocking );
+};
+
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_resize.cpp b/modules/gui/skins2/controls/ctrl_resize.cpp
new file mode 100755 (executable)
index 0000000..3cb5512
--- /dev/null
@@ -0,0 +1,154 @@
+/*****************************************************************************
+ * ctrl_resize.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_resize.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_resize.hpp"
+#include "../events/evt_generic.hpp"
+#include "../events/evt_mouse.hpp"
+#include "../events/evt_motion.hpp"
+#include "../src/generic_layout.hpp"
+#include "../utils/position.hpp"
+#include "../commands/async_queue.hpp"
+#include "../commands/cmd_resize.hpp"
+
+
+CtrlResize::CtrlResize( intf_thread_t *pIntf, CtrlFlat &rCtrl,
+                        GenericLayout &rLayout, const UString &rHelp ):
+    CtrlFlat( pIntf, rHelp ), m_fsm( pIntf ), m_rCtrl( rCtrl ),
+    m_rLayout( rLayout ), m_cmdResizeResize( this, &transResizeResize ),
+    m_cmdStillResize( this, &transStillResize ),
+    m_cmdResizeStill( this, &transResizeStill )
+{
+    m_pEvt = NULL;
+    m_xPos = 0;
+    m_yPos = 0;
+
+    // States
+    m_fsm.addState( "resize" );
+    m_fsm.addState( "still" );
+
+    // Transitions
+    m_fsm.addTransition( "resize", "mouse:left:up:none", "still",
+                         &m_cmdResizeStill );
+    m_fsm.addTransition( "still", "mouse:left:down:none", "resize",
+                         &m_cmdStillResize );
+    m_fsm.addTransition( "resize", "motion", "resize", &m_cmdResizeResize );
+
+    m_fsm.setState( "still" );
+}
+
+
+bool CtrlResize::mouseOver( int x, int y ) const
+{
+    return m_rCtrl.mouseOver( x, y );
+}
+
+
+void CtrlResize::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    m_rCtrl.draw( rImage, xDest, yDest );
+}
+
+
+void CtrlResize::setLayout( GenericLayout *pLayout, const Position &rPosition )
+{
+    CtrlGeneric::setLayout( pLayout, rPosition );
+    // Set the layout of the decorated control as well
+    m_rCtrl.setLayout( pLayout, rPosition );
+}
+
+
+const Position *CtrlResize::getPosition() const
+{
+    return m_rCtrl.getPosition();
+}
+
+
+void CtrlResize::handleEvent( EvtGeneric &rEvent )
+{
+    m_pEvt = &rEvent;
+    m_fsm.handleTransition( rEvent.getAsString() );
+    // Transmit the event to the decorated control
+    // XXX: Is it really a good idea?
+    m_rCtrl.handleEvent( rEvent );
+}
+
+
+void CtrlResize::transStillResize( SkinObject *pCtrl )
+{
+    CtrlResize *pThis = (CtrlResize*)pCtrl;
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    pThis->m_xPos = pEvtMouse->getXPos();
+    pThis->m_yPos = pEvtMouse->getYPos();
+
+    pThis->captureMouse();
+
+    pThis->m_width = pThis->m_rLayout.getWidth();
+    pThis->m_height = pThis->m_rLayout.getHeight();
+}
+
+
+void CtrlResize::transResizeResize( SkinObject *pCtrl )
+{
+    CtrlResize *pThis = (CtrlResize*)pCtrl;
+    EvtMotion *pEvtMotion = (EvtMotion*)pThis->m_pEvt;
+
+    int newWidth = pEvtMotion->getXPos() - pThis->m_xPos + pThis->m_width;
+    int newHeight = pEvtMotion->getYPos() - pThis->m_yPos + pThis->m_height;
+
+    // Check boundaries
+    if( newWidth < pThis->m_rLayout.getMinWidth() )
+    {
+        newWidth = pThis->m_rLayout.getMinWidth();
+    }
+    if( newWidth > pThis->m_rLayout.getMaxWidth() )
+    {
+        newWidth = pThis->m_rLayout.getMaxWidth();
+    }
+    if( newHeight < pThis->m_rLayout.getMinHeight() )
+    {
+        newHeight = pThis->m_rLayout.getMinHeight();
+    }
+    if( newHeight > pThis->m_rLayout.getMaxHeight() )
+    {
+        newHeight = pThis->m_rLayout.getMaxHeight();
+    }
+
+    // Create a resize command
+    CmdGeneric *pCmd = new CmdResize( pThis->getIntf(), pThis->m_rLayout,
+                                      newWidth, newHeight );
+    // Push the command in the asynchronous command queue
+    AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() );
+    pQueue->remove( "resize" );
+    pQueue->push( CmdGenericPtr( pCmd ) );
+}
+
+
+void CtrlResize::transResizeStill( SkinObject *pCtrl )
+{
+    CtrlResize *pThis = (CtrlResize*)pCtrl;
+
+    pThis->releaseMouse();
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_resize.hpp b/modules/gui/skins2/controls/ctrl_resize.hpp
new file mode 100644 (file)
index 0000000..93e093e
--- /dev/null
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ * ctrl_resize.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_resize.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_RESIZE_HPP
+#define CTRL_RESIZE_HPP
+
+#include "ctrl_flat.hpp"
+#include "../commands/cmd_generic.hpp"
+#include "../utils/fsm.hpp"
+
+class GenericLayout;
+
+
+/// Control decorator for resizing windows
+class CtrlResize: public CtrlFlat
+{
+    public:
+        CtrlResize( intf_thread_t *pIntf, CtrlFlat &rCtrl,
+                    GenericLayout &rLayout, const UString &rHelp );
+        virtual ~CtrlResize() {}
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the decorated control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+        /// Set the position and the associated layout of the decorated control
+        virtual void setLayout( GenericLayout *pLayout,
+                                const Position &rPosition );
+
+        /// Get the position of the decorated control in the layout, if any
+        virtual const Position *getPosition() const;
+
+        static void transResizeResize( SkinObject *pCtrl );
+        static void transStillResize( SkinObject *pCtrl );
+        static void transResizeStill( SkinObject *pCtrl );
+
+    private:
+        FSM m_fsm;
+        /// Decorated CtrlFlat
+        CtrlFlat &m_rCtrl;
+        /// The layout resized by this control
+        GenericLayout &m_rLayout;
+        /// The last received event
+        EvtGeneric *m_pEvt;
+        /// Position of the click that started the resizing
+        int m_xPos, m_yPos;
+        /// Callbacks
+        Callback m_cmdResizeResize;
+        Callback m_cmdStillResize;
+        Callback m_cmdResizeStill;
+
+        // Size of the layout, before resizing
+        int m_width, m_height;
+};
+
+#endif
+
diff --git a/modules/gui/skins2/controls/ctrl_slider.cpp b/modules/gui/skins2/controls/ctrl_slider.cpp
new file mode 100644 (file)
index 0000000..9564d39
--- /dev/null
@@ -0,0 +1,411 @@
+/*****************************************************************************
+ * ctrl_slider.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_slider.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_slider.hpp"
+#include "../events/evt_enter.hpp"
+#include "../events/evt_mouse.hpp"
+#include "../events/evt_scroll.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/generic_window.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_graphics.hpp"
+#include "../utils/position.hpp"
+#include "../utils/var_percent.hpp"
+
+
+#define RANGE 40
+#define SCROLL_STEP 0.05
+
+
+CtrlSliderCursor::CtrlSliderCursor( intf_thread_t *pIntf,
+                                    const GenericBitmap &rBmpUp,
+                                    const GenericBitmap &rBmpOver,
+                                    const GenericBitmap &rBmpDown,
+                                    const Bezier &rCurve,
+                                    VarPercent &rVariable,
+                                    VarBool *pVisible,
+                                    const UString &rTooltip,
+                                    const UString &rHelp ):
+    CtrlGeneric( pIntf, rHelp ), m_fsm( pIntf ), m_rVariable( rVariable ),
+    m_pVisible( pVisible ), m_tooltip( rTooltip ),
+    m_width( rCurve.getWidth() ), m_height( rCurve.getHeight() ),
+    m_cmdOverDown( this, &transOverDown ),
+    m_cmdDownOver( this, &transDownOver ), m_cmdOverUp( this, &transOverUp ),
+    m_cmdUpOver( this, &transUpOver ), m_cmdMove( this, &transMove ),
+    m_cmdScroll( this, &transScroll ),
+    m_lastPercentage( 0 ), m_xOffset( 0 ), m_yOffset( 0 ),
+    m_pEvt( NULL ), m_curve( rCurve )
+{
+    // Build the images of the cursor
+    OSFactory *pOsFactory = OSFactory::instance( getIntf() );
+    m_pImgUp = pOsFactory->createOSGraphics( rBmpUp.getWidth(),
+                                             rBmpUp.getHeight() );
+    m_pImgUp->drawBitmap( rBmpUp, 0, 0 );
+    m_pImgDown = pOsFactory->createOSGraphics( rBmpDown.getWidth(),
+                                               rBmpDown.getHeight() );
+    m_pImgDown->drawBitmap( rBmpDown, 0, 0 );
+    m_pImgOver = pOsFactory->createOSGraphics( rBmpOver.getWidth(),
+                                               rBmpOver.getHeight() );
+    m_pImgOver->drawBitmap( rBmpOver, 0, 0 );
+
+    // States
+    m_fsm.addState( "up" );
+    m_fsm.addState( "over" );
+    m_fsm.addState( "down" );
+
+    // Transitions
+    m_fsm.addTransition( "over", "mouse:left:down", "down",
+                         &m_cmdOverDown );
+    m_fsm.addTransition( "down", "mouse:left:up", "over",
+                         &m_cmdDownOver );
+    m_fsm.addTransition( "over", "leave", "up", &m_cmdOverUp );
+    m_fsm.addTransition( "up", "enter", "over", &m_cmdUpOver );
+    m_fsm.addTransition( "down", "motion", "down", &m_cmdMove );
+    m_fsm.addTransition( "over", "scroll", "over", &m_cmdScroll );
+
+    // Initial state
+    m_fsm.setState( "up" );
+    m_pImg = m_pImgUp;
+
+    // Observe the position variable
+    m_rVariable.addObserver( this );
+
+    // Observe the visibility variable
+    if( m_pVisible )
+    {
+        m_pVisible->addObserver( this );
+    }
+
+    // Initial position of the cursor
+    m_lastPercentage = m_rVariable.get();
+}
+
+
+CtrlSliderCursor::~CtrlSliderCursor()
+{
+    m_rVariable.delObserver( this );
+    if( m_pVisible )
+    {
+        m_pVisible->delObserver( this );
+    }
+    SKINS_DELETE( m_pImgUp );
+    SKINS_DELETE( m_pImgDown );
+    SKINS_DELETE( m_pImgOver );
+}
+
+
+void CtrlSliderCursor::handleEvent( EvtGeneric &rEvent )
+{
+    // Save the event to use it in callbacks
+    m_pEvt = &rEvent;
+
+    m_fsm.handleTransition( rEvent.getAsString() );
+}
+
+
+bool CtrlSliderCursor::mouseOver( int x, int y ) const
+{
+    if( m_pImg )
+    {
+        // Compute the position of the cursor
+        int xPos, yPos;
+        m_curve.getPoint( m_rVariable.get(), xPos, yPos );
+
+        // Compute the resize factors
+        double factorX = 0, factorY = 0;
+        getResizeFactors( factorX, factorY );
+        xPos = (int)(xPos * factorX);
+        yPos = (int)(yPos * factorY);
+
+        return m_pImg->hit( x - xPos + m_pImg->getWidth() / 2,
+                            y - yPos + m_pImg->getHeight() / 2 );
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+void CtrlSliderCursor::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    if( m_pImg && (!m_pVisible || m_pVisible->get()) )
+    {
+        // Compute the position of the cursor
+        int xPos, yPos;
+        m_curve.getPoint( m_rVariable.get(), xPos, yPos );
+
+        // Compute the resize factors
+        double factorX = 0, factorY = 0;
+        getResizeFactors( factorX, factorY );
+        xPos = (int)(xPos * factorX);
+        yPos = (int)(yPos * factorY);
+
+        // Draw the current image
+        rImage.drawGraphics( *m_pImg, 0, 0,
+                             xDest + xPos - m_pImg->getWidth() / 2,
+                             yDest + yPos - m_pImg->getHeight() / 2 );
+    }
+}
+
+
+void CtrlSliderCursor::onUpdate( Subject<VarPercent> &rVariable )
+{
+    // The position has changed
+    notifyLayout();
+}
+
+
+void CtrlSliderCursor::onUpdate( Subject<VarBool> &rVariable )
+{
+    // The visibility variable has changed
+    notifyLayout();
+}
+
+
+void CtrlSliderCursor::transOverDown( SkinObject *pCtrl )
+{
+    CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    // Compute the resize factors
+    double factorX = 0, factorY = 0;
+    pThis->getResizeFactors( factorX, factorY );
+
+    // Compute the offset
+    int tempX, tempY;
+    pThis->m_curve.getPoint( pThis->m_rVariable.get(), tempX, tempY );
+    pThis->m_xOffset = pEvtMouse->getXPos() - (int)(tempX * factorX);
+    pThis->m_yOffset = pEvtMouse->getYPos() - (int)(tempY * factorY);
+
+    pThis->captureMouse();
+    pThis->m_pImg = pThis->m_pImgDown;
+    pThis->notifyLayout();
+}
+
+
+void CtrlSliderCursor::transDownOver( SkinObject *pCtrl )
+{
+    CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
+
+    // Save the position
+    pThis->m_lastPercentage = pThis->m_rVariable.get();
+
+    pThis->releaseMouse();
+    pThis->m_pImg = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
+
+void CtrlSliderCursor::transUpOver( SkinObject *pCtrl )
+{
+    CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
+
+    pThis->m_pImg = pThis->m_pImgOver;
+    pThis->notifyLayout();
+}
+
+
+void CtrlSliderCursor::transOverUp( SkinObject *pCtrl )
+{
+    CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
+
+    pThis->m_pImg = pThis->m_pImgUp;
+    pThis->notifyLayout();
+}
+
+
+void CtrlSliderCursor::transMove( SkinObject *pCtrl )
+{
+    CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    // Get the position of the control
+    const Position *pPos = pThis->getPosition();
+
+    // Compute the resize factors
+    double factorX = 0, factorY = 0;
+    pThis->getResizeFactors( factorX, factorY );
+
+    // XXX: This could be optimized a little bit
+    if( pThis->m_curve.getMinDist(
+        (int)((pEvtMouse->getXPos() - pPos->getLeft()) / factorX),
+        (int)((pEvtMouse->getYPos() - pPos->getTop()) / factorY) ) < RANGE )
+    {
+        double percentage = pThis->m_curve.getNearestPercent(
+            (int)((pEvtMouse->getXPos() - pThis->m_xOffset) / factorX),
+            (int)((pEvtMouse->getYPos() - pThis->m_yOffset) / factorY) );
+        pThis->m_rVariable.set( percentage );
+    }
+    else
+    {
+        pThis->m_rVariable.set( pThis->m_lastPercentage );
+    }
+}
+
+void CtrlSliderCursor::transScroll( SkinObject *pCtrl )
+{
+    CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
+    EvtScroll *pEvtScroll = (EvtScroll*)pThis->m_pEvt;
+
+    int direction = pEvtScroll->getDirection();
+
+    double percentage = pThis->m_rVariable.get();
+    if( direction == EvtScroll::kUp )
+    {
+        percentage += SCROLL_STEP;
+    }
+    else
+    {
+        percentage -= SCROLL_STEP;
+    }
+
+    pThis->m_rVariable.set( percentage );
+}
+
+
+void CtrlSliderCursor::getResizeFactors( double &rFactorX,
+                                         double &rFactorY ) const
+{
+    // Get the position of the control
+    const Position *pPos = getPosition();
+
+    rFactorX = 1.0;
+    rFactorY = 1.0;
+
+    // Compute the resize factors
+    if( m_width > 0 )
+    {
+        rFactorX = (double)pPos->getWidth() / (double)m_width;
+    }
+    if( m_height > 0 )
+    {
+        rFactorY = (double)pPos->getHeight() / (double)m_height;
+    }
+}
+
+
+
+CtrlSliderBg::CtrlSliderBg( intf_thread_t *pIntf, CtrlSliderCursor &rCursor,
+                            const Bezier &rCurve, VarPercent &rVariable,
+                            int thickness, VarBool *pVisible,
+                            const UString &rHelp ):
+    CtrlGeneric( pIntf, rHelp ), m_rCursor( rCursor ), m_rVariable( rVariable ),
+    m_thickness( thickness ), m_pVisible( pVisible ), m_curve( rCurve ),
+    m_width( rCurve.getWidth() ), m_height( rCurve.getHeight() )
+{
+}
+
+
+bool CtrlSliderBg::mouseOver( int x, int y ) const
+{
+    if( m_pVisible && !m_pVisible->get() )
+    {
+        return false;
+    }
+
+    // Compute the resize factors
+    double factorX = 0, factorY = 1.0;
+    getResizeFactors( factorX, factorY );
+
+    return (m_curve.getMinDist( (int)(x / factorY),
+                                (int)(y / factorY) ) < m_thickness );
+}
+
+
+void CtrlSliderBg::handleEvent( EvtGeneric &rEvent )
+{
+    if( rEvent.getAsString().find( "mouse:left:down" ) != string::npos )
+    {
+        // Compute the resize factors
+        double factorX = 0, factorY = 1.0;
+        getResizeFactors( factorX, factorY );
+
+        // Get the position of the control
+        const Position *pPos = getPosition();
+
+        // Get the value corresponding to the position of the mouse
+        EvtMouse &rEvtMouse = (EvtMouse&)rEvent;
+        int x = rEvtMouse.getXPos();
+        int y = rEvtMouse.getYPos();
+        m_rVariable.set( m_curve.getNearestPercent(
+                            (int)((x - pPos->getLeft()) / factorX),
+                            (int)((y - pPos->getTop()) / factorY) ) );
+
+        // Forward the clic to the cursor
+        EvtMouse evt( getIntf(), x, y, EvtMouse::kLeft, EvtMouse::kDown );
+        GenericWindow *pWin = getWindow();
+        if( pWin )
+        {
+            EvtEnter evtEnter( getIntf() );
+            // XXX It was not supposed to be implemented like that !!
+            pWin->forwardEvent( evtEnter, m_rCursor );
+            pWin->forwardEvent( evt, m_rCursor );
+        }
+    }
+    else if( rEvent.getAsString().find( "scroll" ) != string::npos )
+    {
+        int direction = ((EvtScroll&)rEvent).getDirection();
+
+        double percentage = m_rVariable.get();
+        if( direction == EvtScroll::kUp )
+        {
+            percentage += SCROLL_STEP;
+        }
+        else
+        {
+            percentage -= SCROLL_STEP;
+        }
+
+        m_rVariable.set( percentage );
+    }
+}
+
+
+void CtrlSliderBg::onUpdate( Subject<VarBool> &rVariable )
+{
+    // The visibility variable has changed
+    notifyLayout();
+}
+
+
+void CtrlSliderBg::getResizeFactors( double &rFactorX, double &rFactorY ) const
+{
+    // Get the position of the control
+    const Position *pPos = getPosition();
+
+    rFactorX = 1.0;
+    rFactorY = 1.0;
+
+    // Compute the resize factors
+    if( m_width > 0 )
+    {
+        rFactorX = (double)pPos->getWidth() / (double)m_width;
+    }
+    if( m_height > 0 )
+    {
+        rFactorY = (double)pPos->getHeight() / (double)m_height;
+    }
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_slider.hpp b/modules/gui/skins2/controls/ctrl_slider.hpp
new file mode 100755 (executable)
index 0000000..13ed4c5
--- /dev/null
@@ -0,0 +1,158 @@
+/*****************************************************************************
+ * ctrl_slider.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_slider.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_SLIDER_HPP
+#define CTRL_SLIDER_HPP
+
+#include "ctrl_generic.hpp"
+#include "../utils/bezier.hpp"
+#include "../utils/fsm.hpp"
+#include "../utils/observer.hpp"
+
+
+class GenericBitmap;
+class OSGraphics;
+class VarPercent;
+class VarBool;
+
+
+/// Cursor of a slider
+class CtrlSliderCursor: public CtrlGeneric, public Observer<VarPercent>,
+    public Observer<VarBool>
+{
+    public:
+        /// Create a cursor with 3 images (which are NOT copied, be careful)
+        /// If pVisible is NULL, the control is always visible
+        CtrlSliderCursor( intf_thread_t *pIntf, const GenericBitmap &rBmpUp,
+                          const GenericBitmap &rBmpOver,
+                          const GenericBitmap &rBmpDown,
+                          const Bezier &rCurve, VarPercent &rVariable,
+                          VarBool *pVisible, const UString &rTooltip,
+                          const UString &rHelp );
+
+        virtual ~CtrlSliderCursor();
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+        /// Get the text of the tooltip
+        virtual UString getTooltipText() const { return m_tooltip; }
+
+    private:
+        /// Finite state machine of the control
+        FSM m_fsm;
+        /// Variable associated to the cursor
+        VarPercent &m_rVariable;
+        /// Visibility variable
+        VarBool *m_pVisible;
+        /// Tooltip text
+        const UString m_tooltip;
+        /// Initial size of the control
+        int m_width, m_height;
+        /// Callback objects
+        Callback m_cmdOverDown;
+        Callback m_cmdDownOver;
+        Callback m_cmdOverUp;
+        Callback m_cmdUpOver;
+        Callback m_cmdMove;
+        Callback m_cmdScroll;
+        /// Position of the cursor
+        int m_xPosition, m_yPosition;
+        /// Last saved position of the cursor (stored as a percentage)
+        double m_lastPercentage;
+        /// Offset between the mouse pointer and the center of the cursor
+        int m_xOffset, m_yOffset;
+        /// The last received event
+        EvtGeneric *m_pEvt;
+        /// Images of the cursor in the differents states
+        OSGraphics *m_pImgUp, *m_pImgOver, *m_pImgDown;
+        /// Current image
+        OSGraphics *m_pImg;
+        /// Bezier curve of the slider
+        const Bezier m_curve;
+
+        /// Callback functions
+        static void transOverDown( SkinObject *pCtrl );
+        static void transDownOver( SkinObject *pCtrl );
+        static void transOverUp( SkinObject *pCtrl );
+        static void transUpOver( SkinObject *pCtrl );
+        static void transMove( SkinObject *pCtrl );
+        static void transScroll( SkinObject *pCtrl );
+
+        /// Method called when the position variable is modified
+        virtual void onUpdate( Subject<VarPercent> &rVariable );
+
+        /// Method called when the visibility variable is modified
+        virtual void onUpdate( Subject<VarBool> &rVariable );
+
+        /// Methode to compute the resize factors
+        void getResizeFactors( double &rFactorX, double &rFactorY ) const;
+};
+
+
+/// Slider background
+class CtrlSliderBg: public CtrlGeneric
+{
+    public:
+        /// If pVisible is NULL, the control is always visible
+        CtrlSliderBg( intf_thread_t *pIntf, CtrlSliderCursor &rCursor,
+                      const Bezier &rCurve, VarPercent &rVariable,
+                      int thickness, VarBool *pVisible, const UString &rHelp );
+        virtual ~CtrlSliderBg() {}
+
+        /// Tell whether the mouse is over the control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+    private:
+        /// Cursor of the slider
+        CtrlSliderCursor &m_rCursor;
+        /// Variable associated to the slider
+        VarPercent &m_rVariable;
+        /// Thickness of the curve
+        int m_thickness;
+        /// Visibility variable
+        VarBool *m_pVisible;
+        /// Bezier curve of the slider
+        const Bezier m_curve;
+        /// Initial size of the control
+        int m_width, m_height;
+
+        /// Methode to compute the resize factors
+        void getResizeFactors( double &rFactorX, double &rFactorY ) const;
+
+        /// Method called when the visibility variable is modified
+        virtual void onUpdate( Subject<VarBool> &rVariable );
+};
+
+
+#endif
diff --git a/modules/gui/skins2/controls/ctrl_text.cpp b/modules/gui/skins2/controls/ctrl_text.cpp
new file mode 100755 (executable)
index 0000000..6c1cae8
--- /dev/null
@@ -0,0 +1,317 @@
+/*****************************************************************************
+ * ctrl_text.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_text.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "ctrl_text.hpp"
+#include "../events/evt_generic.hpp"
+#include "../events/evt_mouse.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/generic_font.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/os_graphics.hpp"
+#include "../src/os_timer.hpp"
+#include "../utils/position.hpp"
+#include "../utils/ustring.hpp"
+#include "../utils/var_text.hpp"
+
+
+#define MOVING_TEXT_STEP 3
+#define MOVING_TEXT_DELAY 200
+#define SEPARATOR_STRING "   "
+
+
+CtrlText::CtrlText( intf_thread_t *pIntf, VarText &rVariable,
+                    const GenericFont &rFont, const UString &rHelp,
+                    uint32_t color ):
+    CtrlGeneric( pIntf, rHelp ), m_fsm( pIntf ), m_rVariable( rVariable ),
+    m_cmdToManual( this, &transToManual ),
+    m_cmdManualMoving( this, &transManualMoving ),
+    m_cmdManualStill( this, &transManualStill ),
+    m_cmdMove( this, &transMove ),
+    m_pEvt( NULL ), m_rFont( rFont ), m_color( color ),
+    m_pImg( NULL ), m_pImgDouble( NULL ), m_pCurrImg( NULL ),
+    m_xPos( 0 ), m_xOffset( 0 )
+{
+    m_pTimer = OSFactory::instance( getIntf() )->createOSTimer(
+        Callback( this, &updateText ) );
+
+    // States
+    m_fsm.addState( "still" );
+    m_fsm.addState( "moving" );
+    m_fsm.addState( "manual1" );
+    m_fsm.addState( "manual2" );
+    m_fsm.addState( "outStill" );
+    m_fsm.addState( "outMoving" );
+
+    // Transitions
+    m_fsm.addTransition( "still", "mouse:left:down", "manual1",
+                         &m_cmdToManual );
+    m_fsm.addTransition( "manual1", "mouse:left:up", "moving",
+                         &m_cmdManualMoving );
+    m_fsm.addTransition( "moving", "mouse:left:down", "manual2",
+                         &m_cmdToManual );
+    m_fsm.addTransition( "manual2", "mouse:left:up", "still",
+                         &m_cmdManualStill );
+    m_fsm.addTransition( "manual1", "motion", "manual1", &m_cmdMove );
+    m_fsm.addTransition( "manual2", "motion", "manual2", &m_cmdMove );
+    m_fsm.addTransition( "still", "leave", "outStill" );
+    m_fsm.addTransition( "outStill", "enter", "still" );
+    m_fsm.addTransition( "moving", "leave", "outMoving" );
+    m_fsm.addTransition( "outMoving", "enter", "moving" );
+
+    // Initial state
+    m_fsm.setState( "outStill" );
+
+    // Observe the variable
+    m_rVariable.addObserver( this );
+
+    // Set the text
+    displayText( m_rVariable.get() );
+}
+
+
+CtrlText::~CtrlText()
+{
+    m_rVariable.delObserver( this );
+    if( m_pTimer )
+    {
+        delete m_pTimer;
+    }
+    if( m_pImg )
+    {
+        delete m_pImg;
+    }
+    if( m_pImgDouble )
+    {
+        delete m_pImgDouble;
+    }
+}
+
+
+void CtrlText::handleEvent( EvtGeneric &rEvent )
+{
+    // Save the event to use it in callbacks
+    m_pEvt = &rEvent;
+
+    m_fsm.handleTransition( rEvent.getAsString() );
+}
+
+
+bool CtrlText::mouseOver( int x, int y ) const
+{
+    if( m_pCurrImg )
+    {
+        // We have 3 different ways of deciding when to return true here:
+        //  1) the mouse is exactly over the text (so if you click between two
+        //     letters, the text control doesn't catch the event)
+        //  2) the mouse is over the rectangle of the control
+        //  3) the mouse is over the rectangle of the visible text
+        // I don't know which one is the best...
+#if 0
+        return( x >= 0 && x < getPosition()->getWidth()
+             && m_pCurrImg->hit( x - m_xPos, y ) );
+#endif
+#if 1
+        return( x >= 0 && x < getPosition()->getWidth()
+             && y >= 0 && y < getPosition()->getHeight() );
+#endif
+#if 0
+        return( x >= 0 && x < getPosition()->getWidth()
+             && y >= 0 && y < getPosition()->getHeight()
+             && x < m_pCurrImg->getWidth() && x < m_pCurrImg->getHeight() );
+#endif
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+void CtrlText::draw( OSGraphics &rImage, int xDest, int yDest )
+{
+    if( m_pCurrImg )
+    {
+        // Compute the dimensions to draw
+        int width = min( m_pCurrImg->getWidth() + m_xPos,
+                         getPosition()->getWidth() );
+        int height = min( m_pCurrImg->getHeight(), getPosition()->getHeight() );
+        // Draw the current image
+        rImage.drawBitmap( *m_pCurrImg, -m_xPos, 0, xDest, yDest,
+                           width, height );
+    }
+}
+
+
+void CtrlText::setText( const UString &rText, uint32_t color )
+{
+    // Change the color
+    if( color != 0xFFFFFFFF )
+    {
+        m_color = color;
+    }
+
+    // Change the text
+    m_rVariable.set( rText );
+}
+
+
+void CtrlText::onUpdate( Subject<VarText> &rVariable )
+{
+    displayText( m_rVariable.get() );
+}
+
+
+void CtrlText::displayText( const UString &rText )
+{
+    m_pTimer->stop();
+
+    // Create the images ('normal' and 'double') from the text
+    // 'Normal' image
+    if( m_pImg )
+    {
+        delete m_pImg;
+    }
+    m_pImg = m_rFont.drawString( rText, m_color );
+    // 'Double' image
+    const UString doubleStringWithSep = rText + SEPARATOR_STRING + rText;
+    if( m_pImgDouble )
+    {
+        delete m_pImgDouble;
+    }
+    m_pImgDouble = m_rFont.drawString( doubleStringWithSep, m_color );
+
+    // Update the current image used, as if the control size had changed
+    onChangePosition();
+
+    // XXX: will this always work?
+    m_fsm.setState( "outStill" );
+    notifyLayout();
+}
+
+
+void CtrlText::onChangePosition()
+{
+    if( getPosition() )
+    {
+        if( m_pImg->getWidth() < getPosition()->getWidth() )
+        {
+            m_pCurrImg = m_pImg;
+        }
+        else
+        {
+            m_pCurrImg = m_pImgDouble;
+        }
+    }
+    else
+    {
+        // m_pImg is a better default value than m_pImgDouble, but anyway we
+        // don't care because the control is never drawn without position :)
+        m_pCurrImg = m_pImg;
+    }
+}
+
+
+void CtrlText::transToManual( SkinObject *pCtrl )
+{
+    CtrlText *pThis = (CtrlText*)pCtrl;
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    // Compute the offset
+    pThis->m_xOffset = pEvtMouse->getXPos() - pThis->m_xPos;
+
+    pThis->m_pTimer->stop();
+    pThis->captureMouse();
+}
+
+
+void CtrlText::transManualMoving( SkinObject *pCtrl )
+{
+    CtrlText *pThis = (CtrlText*)pCtrl;
+    pThis->releaseMouse();
+
+    // Start the automatic movement, but only if the text is wider than the
+    // control
+    if( pThis->m_pImg->getWidth() >= pThis->getPosition()->getWidth() )
+    {
+        // The current image may have been set incorrectly in displayText(), so
+        // set the correct value
+        pThis->m_pCurrImg = pThis->m_pImgDouble;
+
+        pThis->m_pTimer->start( MOVING_TEXT_DELAY, false );
+    }
+}
+
+
+void CtrlText::transManualStill( SkinObject *pCtrl )
+{
+    CtrlText *pThis = (CtrlText*)pCtrl;
+    pThis->releaseMouse();
+}
+
+
+void CtrlText::transMove( SkinObject *pCtrl )
+{
+    CtrlText *pThis = (CtrlText*)pCtrl;
+    EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
+
+    // Do nothing if the text fits in the control
+    if( pThis->m_pImg->getWidth() >= pThis->getPosition()->getWidth() )
+    {
+        // The current image may have been set incorrectly in displayText(), so
+        // we set the correct value
+        pThis->m_pCurrImg = pThis->m_pImgDouble;
+
+        // Compute the new position of the left side, and make sure it is
+        // in the correct range
+        pThis->m_xPos = (pEvtMouse->getXPos() - pThis->m_xOffset);
+        pThis->adjust( pThis->m_xPos );
+
+        pThis->notifyLayout();
+    }
+}
+
+
+void CtrlText::updateText( SkinObject *pCtrl )
+{
+    CtrlText *pThis = (CtrlText*)pCtrl;
+
+    pThis->m_xPos -= MOVING_TEXT_STEP;
+    pThis->adjust( pThis->m_xPos );
+
+    pThis->notifyLayout();
+}
+
+
+void CtrlText::adjust( int &position )
+{
+    // {m_pImgDouble->getWidth()  - m_pImg->getWidth()} is the period of the
+    // bitmap; remember that the string used to generate m_pImgDouble is of the
+    // form: "foo  foo", the number of spaces being a parameter
+    position %= m_pImgDouble->getWidth()  - m_pImg->getWidth();
+    if( position > 0 )
+    {
+        position -= m_pImgDouble->getWidth()  - m_pImg->getWidth();
+    }
+}
+
diff --git a/modules/gui/skins2/controls/ctrl_text.hpp b/modules/gui/skins2/controls/ctrl_text.hpp
new file mode 100644 (file)
index 0000000..1302549
--- /dev/null
@@ -0,0 +1,116 @@
+/*****************************************************************************
+ * ctrl_text.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: ctrl_text.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef CTRL_TEXT_HPP
+#define CTRL_TEXT_HPP
+
+#include "ctrl_generic.hpp"
+#include "../utils/fsm.hpp"
+#include "../utils/observer.hpp"
+#include <string>
+
+class GenericFont;
+class GenericBitmap;
+class OSTimer;
+class UString;
+class VarText;
+
+
+/// Class for control text
+class CtrlText: public CtrlGeneric, public Observer<VarText>
+{
+    public:
+        /// Create a text control with the optional given color
+        CtrlText( intf_thread_t *pIntf, VarText &rVariable,
+                  const GenericFont &rFont, const UString &rHelp,
+                  uint32_t color = 0 );
+        virtual ~CtrlText();
+
+        /// Handle an event
+        virtual void handleEvent( EvtGeneric &rEvent );
+
+        /// Check whether coordinates are inside the control
+        virtual bool mouseOver( int x, int y ) const;
+
+        /// Draw the control on the given graphics
+        virtual void draw( OSGraphics &rImage, int xDest, int yDest );
+
+        /// Set the text of the control, with an optional color
+        /// This takes effect immediatly
+        void setText( const UString &rText, uint32_t color = 0xFFFFFFFF );
+
+    private:
+        /// Finite state machine of the control
+        FSM m_fsm;
+        /// Variable associated to the control
+        VarText &m_rVariable;
+        /// Callback objects
+        Callback m_cmdToManual;
+        Callback m_cmdManualMoving;
+        Callback m_cmdManualStill;
+        Callback m_cmdMove;
+        /// The last received event
+        EvtGeneric *m_pEvt;
+        /// Font used to render the text
+        const GenericFont &m_rFont;
+        /// Color of the text
+        uint32_t m_color;
+        /// Image of the text
+        GenericBitmap *m_pImg;
+        /// Image of the text, repeated twice and with some blank between;
+        /// useful to display a 'circular' moving text...
+        GenericBitmap *m_pImgDouble;
+        /// Current image (should always be equal to m_pImg or m_pImgDouble)
+        GenericBitmap *m_pCurrImg;
+        /// Position of the left side of the moving text
+        int m_xPos;
+        /// Offset between the mouse pointer and the left side of the
+        /// moving text
+        int m_xOffset;
+         /// Timer to move the text
+        OSTimer *m_pTimer;
+
+        /// Callback functions
+        static void transToManual( SkinObject *pCtrl );
+        static void transManualMoving( SkinObject *pCtrl );
+        static void transManualStill( SkinObject *pCtrl );
+        static void transMove( SkinObject *pCtrl );
+        /// Callback for the timer
+        static void updateText( SkinObject *pCtrl );
+
+        /// Method called when the observed variable is modified
+        virtual void onUpdate( Subject<VarText> &rVariable );
+
+        /// Display the text on the control
+        void displayText( const UString &rText );
+
+        /// Helper function to set the position in the correct interval
+        void adjust( int &position );
+
+        /// Update the behaviour of the text whenever the control size changes
+        virtual void onChangePosition();
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_enter.hpp b/modules/gui/skins2/events/evt_enter.hpp
new file mode 100644 (file)
index 0000000..3f30c54
--- /dev/null
@@ -0,0 +1,43 @@
+/*****************************************************************************
+ * evt_enter.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_enter.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_ENTER_HPP
+#define EVT_ENTER_HPP
+
+#include "evt_input.hpp"
+
+
+/// Mouse enter event
+class EvtEnter: public EvtInput
+{
+    public:
+        EvtEnter( intf_thread_t *pIntf ): EvtInput( pIntf ) {}
+        virtual ~EvtEnter() {}
+
+        /// Return the type of event
+        virtual const string getAsString() const { return "enter"; }
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_focus.hpp b/modules/gui/skins2/events/evt_focus.hpp
new file mode 100644 (file)
index 0000000..ca45ad9
--- /dev/null
@@ -0,0 +1,51 @@
+/*****************************************************************************
+ * evt_focus.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_focus.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_FOCUS_HPP
+#define EVT_FOCUS_HPP
+
+#include "evt_generic.hpp"
+
+
+/// Focus change event
+class EvtFocus: public EvtGeneric
+{
+    public:
+        EvtFocus( intf_thread_t *pIntf, bool focus ): EvtGeneric( pIntf ),
+            m_focus( focus ) {}
+        virtual ~EvtFocus() {}
+
+        /// Return the type of event
+        virtual const string getAsString() const
+        {
+            return ( m_focus ? "focus:in" : "focus:out" );
+        }
+
+    private:
+        /// true for a focus in, and false for a focus out
+        bool m_focus;
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_generic.hpp b/modules/gui/skins2/events/evt_generic.hpp
new file mode 100644 (file)
index 0000000..1c235f1
--- /dev/null
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ * evt_generic.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_generic.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_GENERIC_HPP
+#define EVT_GENERIC_HPP
+
+#include "../src/skin_common.hpp"
+#include <string>
+
+
+/// Base class for OS events
+class EvtGeneric: public SkinObject
+{
+    public:
+        virtual ~EvtGeneric() {}
+
+        /// Return the type of the event
+        virtual const string getAsString() const = 0;
+
+    protected:
+        EvtGeneric( intf_thread_t *pIntf ): SkinObject( pIntf ) {}
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_input.cpp b/modules/gui/skins2/events/evt_input.cpp
new file mode 100644 (file)
index 0000000..f545ac5
--- /dev/null
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ * evt_input.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_input.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "evt_input.hpp"
+
+const int EvtInput::kModNone  = 0;
+const int EvtInput::kModAlt   = 1;
+const int EvtInput::kModCtrl  = 2;
+const int EvtInput::kModShift = 4;
+
+
+EvtInput::EvtInput( intf_thread_t *pIntf, int mod ):
+    EvtGeneric( pIntf), m_mod( mod )
+{
+}
+
+
+void EvtInput::addModifier( string &rEvtString ) const
+{
+    if( m_mod == kModNone )
+    {
+        rEvtString += ":none";
+    }
+    else
+    {
+        string modList = ":";
+        if( m_mod & kModAlt )
+        {
+            modList += "alt,";
+        }
+        if( m_mod & kModCtrl )
+        {
+            modList += "ctrl,";
+        }
+        if( m_mod & kModShift )
+        {
+            modList += "shift,";
+        }
+        // Remove the last ','
+        modList = modList.substr( 0, modList.size() - 1 );
+        rEvtString += modList;
+    }
+}
diff --git a/modules/gui/skins2/events/evt_input.hpp b/modules/gui/skins2/events/evt_input.hpp
new file mode 100644 (file)
index 0000000..59e0267
--- /dev/null
@@ -0,0 +1,57 @@
+/*****************************************************************************
+ * evt_input.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_input.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_INPUT_HPP
+#define EVT_INPUT_HPP
+
+#include "evt_generic.hpp"
+
+
+/// Base class for mouse and key events
+class EvtInput: public EvtGeneric
+{
+    public:
+        virtual ~EvtInput() {}
+
+        /// Masks for modifier keys
+        static const int kModNone;
+        static const int kModAlt;
+        static const int kModCtrl;
+        static const int kModShift;
+
+        /// Get the modifiers
+        virtual int getMod() const { return m_mod; }
+
+    protected:
+        EvtInput( intf_thread_t *pIntf, int mod = kModNone );
+
+        /// Add the modifier to the event string
+        virtual void addModifier( string &rEvtString ) const;
+
+    private:
+        /// Modifiers (special key(s) pressed during the mouse event)
+        int m_mod;
+};
+
+#endif
diff --git a/modules/gui/skins2/events/evt_key.cpp b/modules/gui/skins2/events/evt_key.cpp
new file mode 100755 (executable)
index 0000000..76f71b8
--- /dev/null
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * evt_key.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_key.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "evt_key.hpp"
+#include "vlc_keys.h"
+
+
+const string EvtKey::getAsString() const
+{
+    string event = "key";
+
+    // Add the action
+    if( m_action == kDown )
+        event += ":down";
+    else if( m_action == kUp )
+        event += ":up";
+    else
+        msg_Warn( getIntf(), "Unknown action type" );
+
+    // Add the key
+    char *keyName = KeyToString( m_key );
+    if( keyName )
+        event += (string)":" + keyName;
+    else
+        msg_Warn( getIntf(), "Unknown key: %d", m_key );
+
+    // Add the modifier
+    addModifier( event );
+
+    return event;
+}
+
diff --git a/modules/gui/skins2/events/evt_key.hpp b/modules/gui/skins2/events/evt_key.hpp
new file mode 100644 (file)
index 0000000..1997d0b
--- /dev/null
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ * evt_key.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_key.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_KEY_HPP
+#define EVT_KEY_HPP
+
+#include "evt_input.hpp"
+
+
+/// Class for keyboard events
+class EvtKey: public EvtInput
+{
+    public:
+        typedef enum
+        {
+            kDown,
+            kUp
+        } ActionType_t;
+
+        EvtKey( intf_thread_t *pIntf, int key, ActionType_t action,
+                int mod = kModNone ):
+            EvtInput( pIntf, mod ), m_key( key ), m_action( action ) {}
+        virtual ~EvtKey() {}
+
+        /// Return the type of event
+        virtual const string getAsString() const;
+
+        int getKey() const { return m_key; }
+
+    private:
+        /// The concerned key, stored according to the '#define's in vlc_keys.h
+        /// but without the modifiers (which are stored in EvtInput)
+        int m_key;
+        /// Type of action
+        ActionType_t m_action;
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_leave.hpp b/modules/gui/skins2/events/evt_leave.hpp
new file mode 100644 (file)
index 0000000..0717846
--- /dev/null
@@ -0,0 +1,43 @@
+/*****************************************************************************
+ * evt_leave.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_leave.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_LEAVE_HPP
+#define EVT_LEAVE_HPP
+
+#include "evt_input.hpp"
+
+
+/// Mouse leave event
+class EvtLeave: public EvtInput
+{
+    public:
+        EvtLeave( intf_thread_t *pIntf ): EvtInput( pIntf ) {}
+        virtual ~EvtLeave() {}
+
+        /// Return the type of event
+        virtual const string getAsString() const { return "leave"; }
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_motion.hpp b/modules/gui/skins2/events/evt_motion.hpp
new file mode 100644 (file)
index 0000000..b32cf69
--- /dev/null
@@ -0,0 +1,55 @@
+/*****************************************************************************
+ * evt_motion.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_motion.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_MOTION_HPP
+#define EVT_MOTION_HPP
+
+#include "evt_input.hpp"
+
+
+/// Mouse move event
+class EvtMotion: public EvtInput
+{
+    public:
+        EvtMotion( intf_thread_t *pIntf, int xPos, int yPos ):
+            EvtInput( pIntf ), m_xPos( xPos ), m_yPos( yPos ) {}
+        virtual ~EvtMotion() {}
+
+        /// Return the type of event
+        virtual const string getAsString() const { return "motion"; }
+
+        // Getters
+        int getXPos() const { return m_xPos; }
+        int getYPos() const { return m_yPos; }
+
+    private:
+        /// Coordinates of the mouse (absolute or relative)
+        /// The coordinates are absolute when the event is sent to the
+        /// GenericWindow, but are relative to the window when the event is
+        /// forwarded to the controls
+        int m_xPos, m_yPos;
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_mouse.cpp b/modules/gui/skins2/events/evt_mouse.cpp
new file mode 100755 (executable)
index 0000000..cb1725f
--- /dev/null
@@ -0,0 +1,57 @@
+/*****************************************************************************
+ * evt_mouse.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_mouse.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "evt_mouse.hpp"
+
+
+const string EvtMouse::getAsString() const
+{
+    string event = "mouse";
+
+    // Add the button
+    if( m_button == kLeft )
+        event += ":left";
+    else if( m_button == kMiddle )
+        event += ":middle";
+    else if( m_button == kRight )
+        event += ":right";
+    else
+        msg_Warn( getIntf(), "Unknown button type" );
+
+    // Add the action
+    if( m_action == kDown )
+        event += ":down";
+    else if( m_action == kUp )
+        event += ":up";
+    else if( m_action == kDblClick )
+        event += ":dblclick";
+    else
+        msg_Warn( getIntf(), "Unknown action type" );
+
+    // Add the modifier
+    addModifier( event );
+
+    return event;
+}
+
diff --git a/modules/gui/skins2/events/evt_mouse.hpp b/modules/gui/skins2/events/evt_mouse.hpp
new file mode 100644 (file)
index 0000000..e9d73a0
--- /dev/null
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * evt_mouse.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_mouse.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_MOUSE_HPP
+#define EVT_MOUSE_HPP
+
+#include "evt_input.hpp"
+
+
+/// Class for mouse button events
+class EvtMouse: public EvtInput
+{
+    public:
+        typedef enum
+        {
+            kLeft,
+            kMiddle,
+            kRight
+        } ButtonType_t;
+
+        typedef enum
+        {
+            kDown,
+            kUp,
+            kDblClick
+        } ActionType_t;
+
+        EvtMouse( intf_thread_t *pIntf, int xPos, int yPos, ButtonType_t button,
+                  ActionType_t action, int mod = kModNone ):
+            EvtInput( pIntf, mod ), m_xPos( xPos ), m_yPos( yPos ),
+            m_button( button ), m_action( action ) {}
+        virtual ~EvtMouse() {}
+
+        // Return the event coordinates
+        int getXPos() const { return m_xPos; }
+        int getYPos() const { return m_yPos; }
+
+        // Return the button and the action
+        ButtonType_t getButton() const { return m_button; }
+        ActionType_t getAction() const { return m_action; }
+
+        virtual const string getAsString() const;
+
+    private:
+        /// Coordinates of the mouse relative to the window
+        int m_xPos, m_yPos;
+        /// Mouse button involved in the event
+        ButtonType_t m_button;
+        /// Type of action
+        ActionType_t m_action;
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_refresh.hpp b/modules/gui/skins2/events/evt_refresh.hpp
new file mode 100644 (file)
index 0000000..4a04700
--- /dev/null
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * evt_refresh.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_refresh.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_REFRESH_HPP
+#define EVT_REFRESH_HPP
+
+#include "evt_generic.hpp"
+
+
+/// Refresh window event
+class EvtRefresh: public EvtGeneric
+{
+    public:
+        /// Constructor with the coordinates of the area to refresh
+        EvtRefresh( intf_thread_t *pIntf, int xStart, int yStart, int width,
+                    int height ):
+            EvtGeneric( pIntf ), m_xStart( xStart ), m_yStart( yStart ),
+            m_width( width ), m_height( height ) {}
+
+        virtual ~EvtRefresh() {}
+
+        /// Return the type of event
+        virtual const string getAsString() const { return "refresh"; }
+
+        /// Getters
+        int getXStart() const { return m_xStart; }
+        int getYStart() const { return m_yStart; }
+        int getWidth()  const { return m_width; }
+        int getHeight() const { return m_height; }
+
+    private:
+        /// Coordinates and size of the area to refresh
+        int m_xStart, m_yStart, m_width, m_height;
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_scroll.cpp b/modules/gui/skins2/events/evt_scroll.cpp
new file mode 100755 (executable)
index 0000000..555d8d8
--- /dev/null
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * evt_scroll.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_scroll.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "evt_scroll.hpp"
+
+
+const string EvtScroll::getAsString() const
+{
+    string event = "scroll";
+
+    // Add the direction
+    if( m_direction == kUp )
+        event += ":up";
+    else if( m_direction == kDown )
+        event += ":down";
+    else
+        msg_Warn( getIntf(), "Unknown scrolling direction" );
+
+    // Add the modifier
+    addModifier( event );
+
+    return event;
+}
+
diff --git a/modules/gui/skins2/events/evt_scroll.hpp b/modules/gui/skins2/events/evt_scroll.hpp
new file mode 100644 (file)
index 0000000..0043916
--- /dev/null
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ * evt_scroll.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_scroll.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_SCROLL_HPP
+#define EVT_SCROLL_HPP
+
+#include "evt_input.hpp"
+
+
+/// Class for mouse scroll events
+class EvtScroll: public EvtInput
+{
+    public:
+        typedef enum
+        {
+            kUp,
+            kDown,
+        } Direction_t;
+
+        EvtScroll( intf_thread_t *pIntf, int xPos, int yPos,
+                   Direction_t direction, int mod = kModNone ):
+            EvtInput( pIntf, mod ), m_xPos( xPos ), m_yPos( yPos ),
+            m_direction( direction ) {}
+        virtual ~EvtScroll() {}
+
+        // Return the event coordinates
+        int getXPos() const { return m_xPos; }
+        int getYPos() const { return m_yPos; }
+
+        // Return the direction
+        Direction_t getDirection() const { return m_direction; }
+
+        virtual const string getAsString() const;
+
+    private:
+        /// Coordinates of the mouse relative to the window
+        int m_xPos, m_yPos;
+        /// Scroll direction
+        Direction_t m_direction;
+};
+
+
+#endif
diff --git a/modules/gui/skins2/events/evt_special.cpp b/modules/gui/skins2/events/evt_special.cpp
new file mode 100755 (executable)
index 0000000..c4673e1
--- /dev/null
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ * evt_special.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_special.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include "evt_special.hpp"
+
+
+const string EvtSpecial::getAsString() const
+{
+    string event = "special";
+
+    // Add the action
+    if( m_action == kShow )
+        event += ":show";
+    else if( m_action == kHide )
+        event += ":hide";
+    else if( m_action == kEnable )
+        event += ":enable";
+    else if( m_action == kDisable )
+        event += ":disable";
+    else
+        msg_Warn( getIntf(), "Unknown action type" );
+
+    return event;
+}
+
diff --git a/modules/gui/skins2/events/evt_special.hpp b/modules/gui/skins2/events/evt_special.hpp
new file mode 100644 (file)
index 0000000..c75f1d2
--- /dev/null
@@ -0,0 +1,56 @@
+/*****************************************************************************
+ * evt_special.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: evt_special.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef EVT_SPECIAL_HPP
+#define EVT_SPECIAL_HPP
+
+#include "evt_generic.hpp"
+
+
+/// Class for non-genuine events
+class EvtSpecial: public EvtGeneric
+{
+    public:
+        typedef enum
+        {
+            kShow,
+            kHide,
+            kEnable,
+            kDisable
+        } ActionType_t;
+
+        EvtSpecial( intf_thread_t *pIntf, ActionType_t action ):
+            EvtGeneric( pIntf ), m_action( action ) {}
+        virtual ~EvtSpecial() {}
+
+        /// Return the type of event
+        virtual const string getAsString() const;
+
+    private:
+        /// Type of action
+        ActionType_t m_action;
+};
+
+
+#endif
diff --git a/modules/gui/skins2/parser/builder.cpp b/modules/gui/skins2/parser/builder.cpp
new file mode 100755 (executable)
index 0000000..372d166
--- /dev/null
@@ -0,0 +1,678 @@
+/*****************************************************************************
+ * builder.cpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: builder.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#include <string.h>
+#include "builder.hpp"
+#include "builder_data.hpp"
+#include "interpreter.hpp"
+#include "../src/png_bitmap.hpp"
+#include "../src/os_factory.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/generic_window.hpp"
+#include "../src/anchor.hpp"
+#include "../src/ft2_font.hpp"
+#include "../src/theme.hpp"
+#include "../controls/ctrl_button.hpp"
+#include "../controls/ctrl_checkbox.hpp"
+#include "../controls/ctrl_image.hpp"
+#include "../controls/ctrl_list.hpp"
+#include "../controls/ctrl_move.hpp"
+#include "../controls/ctrl_resize.hpp"
+#include "../controls/ctrl_slider.hpp"
+#include "../controls/ctrl_radialslider.hpp"
+#include "../controls/ctrl_text.hpp"
+#include "../utils/position.hpp"
+#include "../utils/var_bool.hpp"
+#include "../utils/var_text.hpp"
+
+
+Builder::Builder( intf_thread_t *pIntf, BuilderData &rData):
+    SkinObject( pIntf ), m_rData( rData ), m_interpreter( pIntf ),
+    m_pTheme( NULL )
+{
+}
+
+
+CmdGeneric *Builder::parseAction( const string &rAction )
+{
+    return m_interpreter.parseAction( rAction, m_pTheme );
+}
+
+
+// Useful macro
+#define ADD_OBJECTS( type ) \
+    list<BuilderData::type>::const_iterator it##type; \
+    for( it##type = m_rData.m_list##type.begin(); \
+         it##type != m_rData.m_list##type.end(); it##type++ ) \
+    { \
+        add##type( *it##type ); \
+    }
+
+
+Theme *Builder::build()
+{
+    m_pTheme = new Theme( getIntf() );
+    if( m_pTheme == NULL )
+    {
+        return NULL;
+    }
+
+    // Create everything from the data in the XML
+    ADD_OBJECTS( Theme );
+    ADD_OBJECTS( Bitmap );
+    ADD_OBJECTS( Font );
+    ADD_OBJECTS( Window );
+    ADD_OBJECTS( Layout );
+    ADD_OBJECTS( Anchor );
+    ADD_OBJECTS( Button );
+    ADD_OBJECTS( Checkbox );
+    ADD_OBJECTS( Image );
+    ADD_OBJECTS( Text );
+    ADD_OBJECTS( RadialSlider );
+    ADD_OBJECTS( Slider );
+    ADD_OBJECTS( List );
+
+    return m_pTheme;
+}
+
+
+// Macro to get a bitmap by its ID in the builder
+#define GET_BMP( pBmp, id ) \
+    if( id != "none" ) \
+    { \
+        pBmp = m_pTheme->m_bitmaps[id].get(); \
+        if( pBmp == NULL ) \
+        { \
+            msg_Err( getIntf(), "Unknown Bitmap id: %s", id.c_str() ); \
+            return; \
+        } \
+    }
+
+void Builder::addTheme( const BuilderData::Theme &rData )
+{
+    m_pTheme->getWindowManager().setMagnetValue( rData.m_magnet );
+    m_pTheme->getWindowManager().setAlphaValue( rData.m_alpha );
+    m_pTheme->getWindowManager().setMoveAlphaValue( rData.m_moveAlpha );
+}
+
+
+void Builder::addBitmap( const BuilderData::Bitmap &rData )
+{
+    GenericBitmap *pBmp = new PngBitmap( getIntf(), rData.m_fileName,
+                                         rData.m_alphaColor );
+    m_pTheme->m_bitmaps[rData.m_id] = GenericBitmapPtr( pBmp );
+}
+
+
+void Builder::addFont( const BuilderData::Font &rData )
+{
+    GenericFont *pFont = new FT2Font( getIntf(), rData.m_fontName,
+                                      rData.m_size );
+    pFont->init();
+    m_pTheme->m_fonts[rData.m_id] = GenericFontPtr( pFont );
+}
+
+
+void Builder::addWindow( const BuilderData::Window &rData )
+{
+    // XXX:  font to fix
+    GenericFont *pFont = new FT2Font( getIntf(), "FreeSans.ttf", 12 );
+    pFont->init();
+    GenericWindow *pWin =
+        new GenericWindow( getIntf(), rData.m_xPos, rData.m_yPos,
+                           m_pTheme->getWindowManager(), *pFont,
+                           rData.m_dragDrop, rData.m_playOnDrop );
+
+    m_pTheme->m_windows[uniqueId( rData.m_id) ] = GenericWindowPtr( pWin );
+}
+
+
+void Builder::addLayout( const BuilderData::Layout &rData )
+{
+    GenericWindow *pWin = m_pTheme->m_windows[rData.m_windowId].get();
+    if( pWin == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Window id: %s", rData.m_windowId.c_str() );
+        return;
+    }
+
+    int minWidth = rData.m_minWidth != -1 ? rData.m_minWidth : rData.m_width;
+    int maxWidth = rData.m_maxWidth != -1 ? rData.m_maxWidth : rData.m_width;
+    int minHeight = rData.m_minHeight != -1 ? rData.m_minHeight :
+                    rData.m_height;
+    int maxHeight = rData.m_maxHeight != -1 ? rData.m_maxHeight :
+                    rData.m_height;
+    GenericLayout *pLayout = new GenericLayout( getIntf(), rData.m_width,
+                                                rData.m_height,
+                                                minWidth, maxWidth, minHeight,
+                                                maxHeight );
+    m_pTheme->m_layouts[uniqueId( rData.m_id) ] = GenericLayoutPtr( pLayout );
+
+    // Attach the layout to its window
+    pWin->setActiveLayout( pLayout );
+}
+
+
+void Builder::addAnchor( const BuilderData::Anchor &rData )
+{
+    GenericWindow *pWin = m_pTheme->m_windows[rData.m_windowId].get();
+    if( pWin == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Window id: %s", rData.m_windowId.c_str() );
+        return;
+    }
+
+    Anchor *pAnc = new Anchor( getIntf(), rData.m_xPos, rData.m_yPos,
+                               rData.m_range, rData.m_priority, *pWin );
+    pWin->addAnchor( pAnc );
+}
+
+
+void Builder::addButton( const BuilderData::Button &rData )
+{
+    // Get the bitmaps of the button
+    GenericBitmap *pBmpUp = NULL;
+    GET_BMP( pBmpUp, rData.m_upId );
+
+    GenericBitmap *pBmpDown = pBmpUp;
+    GET_BMP( pBmpDown, rData.m_downId );
+
+    GenericBitmap *pBmpOver = pBmpUp;
+    GET_BMP( pBmpOver, rData.m_overId );
+
+    GenericLayout *pLayout = m_pTheme->m_layouts[rData.m_layoutId].get();
+    if( pLayout == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Layout id: %s", rData.m_layoutId.c_str() );
+        return;
+    }
+
+    CmdGeneric *pCommand = parseAction( rData.m_actionId );
+    if( pCommand == NULL )
+    {
+        msg_Err( getIntf(), "Invalid action: %s", rData.m_actionId.c_str() );
+        return;
+    }
+
+    CtrlButton *pButton = new CtrlButton( getIntf(), *pBmpUp, *pBmpOver,
+        *pBmpDown, *pCommand, UString( getIntf(), rData.m_tooltip.c_str() ),
+        UString( getIntf(), rData.m_help.c_str() ) );
+
+    // Compute the position of the control
+    // XXX (we suppose all the images have the same size...)
+    const Position pos = makePosition( rData.m_leftTop, rData.m_rightBottom,
+                                       rData.m_xPos, rData.m_yPos,
+                                       pBmpUp->getWidth(),
+                                       pBmpUp->getHeight(), *pLayout );
+
+    pLayout->addControl( pButton, pos, rData.m_layer );
+
+    m_pTheme->m_controls[uniqueId( rData.m_id) ] = CtrlGenericPtr( pButton );
+}
+
+
+void Builder::addCheckbox( const BuilderData::Checkbox &rData )
+{
+    // Get the bitmaps of the checkbox
+    GenericBitmap *pBmpUp1 = NULL;
+    GET_BMP( pBmpUp1, rData.m_up1Id );
+
+    GenericBitmap *pBmpDown1 = pBmpUp1;
+    GET_BMP( pBmpDown1, rData.m_down1Id );
+
+    GenericBitmap *pBmpOver1 = pBmpUp1;
+    GET_BMP( pBmpOver1, rData.m_over1Id );
+
+    GenericBitmap *pBmpUp2 = NULL;
+    GET_BMP( pBmpUp2, rData.m_up2Id );
+
+    GenericBitmap *pBmpDown2 = pBmpUp2;
+    GET_BMP( pBmpDown2, rData.m_down2Id );
+
+    GenericBitmap *pBmpOver2 = pBmpUp2;
+    GET_BMP( pBmpOver2, rData.m_over2Id );
+
+    GenericLayout *pLayout = m_pTheme->m_layouts[rData.m_layoutId].get();
+    if( pLayout == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Layout id: %s", rData.m_layoutId.c_str() );
+        return;
+    }
+
+    CmdGeneric *pCommand1 = parseAction( rData.m_action1 );
+    if( pCommand1 == NULL )
+    {
+        msg_Err( getIntf(), "Invalid action: %s", rData.m_action1.c_str() );
+        return;
+    }
+
+    CmdGeneric *pCommand2 = parseAction( rData.m_action2 );
+    if( pCommand2 == NULL )
+    {
+        msg_Err( getIntf(), "Invalid action: %s", rData.m_action2.c_str() );
+        return;
+    }
+
+    // Get the state variable
+    VarBool *pVar = m_interpreter.getVarBool( rData.m_state, m_pTheme );
+    if( pVar == NULL )
+    {
+        // TODO: default state
+        return;
+    }
+
+    // Create the control
+    CtrlCheckbox *pCheckbox = new CtrlCheckbox( getIntf(), *pBmpUp1,
+        *pBmpOver1, *pBmpDown1, *pBmpUp2, *pBmpOver2, *pBmpDown2, *pCommand1,
+        *pCommand2, UString( getIntf(), rData.m_tooltip1.c_str() ),
+        UString( getIntf(), rData.m_tooltip2.c_str() ), *pVar,
+        UString( getIntf(), rData.m_help.c_str() ) );
+
+    // Compute the position of the control
+    // XXX (we suppose all the images have the same size...)
+    const Position pos = makePosition( rData.m_leftTop, rData.m_rightBottom,
+                                       rData.m_xPos, rData.m_yPos,
+                                       pBmpUp1->getWidth(),
+                                       pBmpUp1->getHeight(), *pLayout );
+
+    pLayout->addControl( pCheckbox, pos, rData.m_layer );
+
+    m_pTheme->m_controls[uniqueId( rData.m_id) ] = CtrlGenericPtr( pCheckbox );
+}
+
+
+void Builder::addImage( const BuilderData::Image &rData )
+{
+    GenericBitmap *pBmp = NULL;
+    GET_BMP( pBmp, rData.m_bmpId );
+
+    GenericLayout *pLayout = m_pTheme->m_layouts[rData.m_layoutId].get();
+    if( pLayout == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Layout id: %s", rData.m_layoutId.c_str() );
+        return;
+    }
+
+    GenericWindow *pWindow = m_pTheme->m_windows[rData.m_windowId].get();
+    if( pWindow == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Window id: %s", rData.m_windowId.c_str() );
+        return;
+    }
+
+    CtrlImage *pImage = new CtrlImage( getIntf(), *pBmp,
+                                UString( getIntf(), rData.m_help.c_str() ) );
+
+    // Compute the position of the control
+    const Position pos = makePosition( rData.m_leftTop, rData.m_rightBottom,
+                                       rData.m_xPos,
+                                       rData.m_yPos, pBmp->getWidth(),
+                                       pBmp->getHeight(), *pLayout );
+
+    // XXX: test to be changed! XXX
+    if( rData.m_onclickId == "move" )
+    {
+        CtrlMove *pMove = new CtrlMove( getIntf(), m_pTheme->getWindowManager(),
+             *pImage, *pWindow, UString( getIntf(), rData.m_help.c_str() ) );
+        pLayout->addControl( pMove, pos, rData.m_layer );
+    }
+    else if( rData.m_onclickId == "resize" )
+    {
+        CtrlResize *pResize = new CtrlResize( getIntf(), *pImage, *pLayout,
+                UString( getIntf(), rData.m_help.c_str() ) );
+        pLayout->addControl( pResize, pos, rData.m_layer );
+    }
+    else
+    {
+        pLayout->addControl( pImage, pos, rData.m_layer );
+    }
+
+    m_pTheme->m_controls[uniqueId( rData.m_id) ] = CtrlGenericPtr( pImage );
+}
+
+
+void Builder::addText( const BuilderData::Text &rData )
+{
+    GenericLayout *pLayout = m_pTheme->m_layouts[rData.m_layoutId].get();
+    if( pLayout == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Layout id: %s", rData.m_layoutId.c_str() );
+        return;
+    }
+
+    GenericFont *pFont = m_pTheme->m_fonts[rData.m_fontId].get();
+    if( pFont == NULL )
+    {
+        msg_Err( getIntf(), "Unknown font id: %s", rData.m_fontId.c_str() );
+        return;
+    }
+
+    // Create a text variable
+    VarText *pVar = new VarText( getIntf() );
+    UString msg( getIntf(), rData.m_text.c_str() );
+    pVar->set( msg );
+    m_pTheme->m_vars.push_back( VariablePtr( pVar ) );
+
+    CtrlText *pText = new CtrlText( getIntf(), *pVar, *pFont,
+            UString( getIntf(), rData.m_help.c_str() ) );
+
+    int height = pFont->getSize();
+
+    pLayout->addControl( pText, Position( rData.m_xPos, rData.m_yPos,
+                                          rData.m_xPos + rData.m_width,
+                                          rData.m_yPos + height, *pLayout ),
+                         rData.m_layer );
+
+    m_pTheme->m_controls[uniqueId( rData.m_id) ] = CtrlGenericPtr( pText );
+}
+
+
+void Builder::addRadialSlider( const BuilderData::RadialSlider &rData )
+{
+    // Get the bitmaps of the slider
+    GenericBitmap *pSeq = NULL;
+    GET_BMP( pSeq, rData.m_sequence );
+
+    GenericLayout *pLayout = m_pTheme->m_layouts[rData.m_layoutId].get();
+    if( pLayout == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Layout id: %s", rData.m_layoutId.c_str() );
+        return;
+    }
+
+    // Get the variable associated to the slider
+    VarPercent *pVar = m_interpreter.getVarPercent( rData.m_value, m_pTheme );
+    if( pVar == NULL )
+    {
+        msg_Err( getIntf(), "Unknown slider value: %s", rData.m_value.c_str() );
+        return;
+    }
+
+    // Create the control
+    CtrlRadialSlider *pRadial =
+        new CtrlRadialSlider( getIntf(), *pSeq, rData.m_nbImages, *pVar,
+                              rData.m_minAngle, rData.m_maxAngle,
+                              UString( getIntf(), rData.m_help.c_str() ) );
+
+    // XXX: resizing is not supported
+    // Compute the position of the control
+    const Position pos =
+        makePosition( rData.m_leftTop, rData.m_rightBottom, rData.m_xPos,
+                      rData.m_yPos, pSeq->getWidth(),
+                      pSeq->getHeight() / rData.m_nbImages, *pLayout );
+
+    pLayout->addControl( pRadial, pos, rData.m_layer );
+
+    m_pTheme->m_controls[uniqueId( rData.m_id) ] = CtrlGenericPtr( pRadial );
+}
+
+
+void Builder::addSlider( const BuilderData::Slider &rData )
+{
+    // Get the bitmaps of the slider
+    GenericBitmap *pBmpUp = NULL;
+    GET_BMP( pBmpUp, rData.m_upId );
+
+    GenericBitmap *pBmpDown = pBmpUp;
+    GET_BMP( pBmpDown, rData.m_downId );
+
+    GenericBitmap *pBmpOver = pBmpUp;
+    GET_BMP( pBmpOver, rData.m_overId );
+
+    GenericLayout *pLayout = m_pTheme->m_layouts[rData.m_layoutId].get();
+    if( pLayout == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Layout id: %s", rData.m_layoutId.c_str() );
+        return;
+    }
+
+    // XXX: memory leak!
+    Bezier *pCurve = getPoints( rData.m_points.c_str() );
+    if( pCurve == NULL )
+    {
+        msg_Err( getIntf(), "Invalid format in tag points=\"%s\"",
+                 rData.m_points.c_str() );
+        return;
+    }
+
+    // Get the visibility variable
+    // XXX check when it is null
+    VarBool *pVisible = m_interpreter.getVarBool( rData.m_visible, m_pTheme );
+
+    // Get the variable associated to the slider
+    VarPercent *pVar = m_interpreter.getVarPercent( rData.m_value, m_pTheme );
+    if( pVar == NULL )
+    {
+        msg_Err( getIntf(), "Unknown slider value: %s", rData.m_value.c_str() );
+        return;
+    }
+
+    // Create the cursor and background controls
+    CtrlSliderCursor *pCursor = new CtrlSliderCursor( getIntf(), *pBmpUp,
+        *pBmpOver, *pBmpDown, *pCurve, *pVar, pVisible,
+        UString( getIntf(), rData.m_tooltip.c_str() ),
+        UString( getIntf(), rData.m_help.c_str() ) );
+
+    CtrlSliderBg *pBackground = new CtrlSliderBg( getIntf(), *pCursor,
+        *pCurve, *pVar, rData.m_thickness, pVisible,
+        UString( getIntf(), rData.m_help.c_str() ) );
+
+    // Compute the position of the control
+    const Position pos = makePosition( rData.m_leftTop, rData.m_rightBottom,
+                                       rData.m_xPos, rData.m_yPos,
+                                       pCurve->getWidth(), pCurve->getHeight(),
+                                       *pLayout );
+
+    pLayout->addControl( pBackground, pos, rData.m_layer );
+    pLayout->addControl( pCursor, pos, rData.m_layer );
+
+    string newId = uniqueId( rData.m_id );
+    m_pTheme->m_controls[newId] = CtrlGenericPtr( pCursor );
+    m_pTheme->m_controls[newId + "_bg"] = CtrlGenericPtr( pBackground );
+}
+
+
+void Builder::addList( const BuilderData::List &rData )
+{
+    GenericLayout *pLayout = m_pTheme->m_layouts[rData.m_layoutId].get();
+    if( pLayout == NULL )
+    {
+        msg_Err( getIntf(), "Unknown Layout id: %s", rData.m_layoutId.c_str() );
+        return;
+    }
+
+    GenericFont *pFont = m_pTheme->m_fonts[rData.m_fontId].get();
+    if( pFont == NULL )
+    {
+        msg_Err( getIntf(), "Unknown font id: %s", rData.m_fontId.c_str() );
+        return;
+    }
+
+    // Get the list variable
+    VarList *pVar = m_interpreter.getVarList( rData.m_var, m_pTheme );
+    if( pVar == NULL )
+    {
+        msg_Err( getIntf(), "No such list variable: %s", rData.m_var.c_str() );
+        return;
+    }
+
+    // Create the list control
+    CtrlList *pList = new CtrlList( getIntf(), *pVar, *pFont,
+       rData.m_fgColor, rData.m_playColor, rData.m_bgColor1,
+       rData.m_bgColor2, rData.m_selColor,
+       UString( getIntf(), rData.m_help.c_str() ) );
+
+    // Compute the position of the control
+    const Position pos = makePosition( rData.m_leftTop, rData.m_rightBottom,
+                                       rData.m_xPos, rData.m_yPos,
+                                       rData.m_width, rData.m_height,
+                                       *pLayout );
+
+    pLayout->addControl( pList, pos, rData.m_layer );
+
+    m_pTheme->m_controls[uniqueId( rData.m_id) ] = CtrlGenericPtr( pList );
+}
+
+
+const string Builder::generateId() const
+{
+    static int i = 1;
+
+    const string base = "_ReservedId_";
+    char genId[base.size() + 4];
+    snprintf( genId, base.size() + 4, "%s%i", base.c_str(), i );
+    i++;
+    return genId;
+}
+
+
+const string Builder::uniqueId( const string &id )
+{
+    string newId;
+
+    if( m_idSet.find( id ) != m_idSet.end() )
+    {
+        // The id was already used
+        if( id != "none" )
+        {
+            msg_Warn( getIntf(), "Non unique id: %s", id.c_str() );
+        }
+        newId = generateId();
+    }
+    else
+    {
+        // OK, this is a new id
+        newId = id;
+    }
+
+    // Add the id to the set
+    m_idSet.insert( newId );
+
+    return newId;
+}
+
+
+
+const Position Builder::makePosition( const string &rLeftTop,
+                                      const string &rRightBottom,
+                                      int xPos, int yPos, int width,
+                                      int height, const Box &rBox ) const
+{
+    int left = 0, top = 0, right = 0, bottom = 0;
+    Position::Ref_t refLeftTop = Position::kLeftTop;
+    Position::Ref_t refRightBottom = Position::kLeftTop;
+
+    int boxWidth = rBox.getWidth();
+    int boxHeight = rBox.getHeight();
+
+    // Position of the left top corner
+    if( rLeftTop == "lefttop" )
+    {
+        left = xPos;
+        top = yPos;
+        refLeftTop = Position::kLeftTop;
+    }
+    else if( rLeftTop == "righttop" )
+    {
+        left = xPos - boxWidth + 1;
+        top = yPos;
+        refLeftTop = Position::kRightTop;
+    }
+    else if( rLeftTop == "leftbottom" )
+    {
+        left = xPos;
+        top = yPos - boxHeight + 1;
+        refLeftTop = Position::kLeftBottom;
+    }
+    else if( rLeftTop == "rightbottom" )
+    {
+        left = xPos - boxWidth + 1;
+        top = yPos - boxHeight + 1;
+        refLeftTop = Position::kRightBottom;
+    }
+
+    // Position of the right bottom corner
+    if( rRightBottom == "lefttop" )
+    {
+        right = xPos + width - 1;
+        bottom = yPos + height - 1;
+        refRightBottom = Position::kLeftTop;
+    }
+    else if( rRightBottom == "righttop" )
+    {
+        right = xPos + width - boxWidth;
+        bottom = yPos + height - 1;
+        refRightBottom = Position::kRightTop;
+    }
+    else if( rRightBottom == "leftbottom" )
+    {
+        right = xPos + width - 1;
+        bottom = yPos + height - boxHeight;
+        refRightBottom = Position::kLeftBottom;
+    }
+    else if( rRightBottom == "rightbottom" )
+    {
+        right = xPos + width - boxWidth;
+        bottom = yPos + height - boxHeight;
+        refRightBottom = Position::kRightBottom;
+    }
+
+    return Position( left, top, right, bottom, rBox, refLeftTop,
+                     refRightBottom );
+}
+
+
+Bezier *Builder::getPoints( const char *pTag ) const
+{
+    vector<double> xBez, yBez;
+    int x, y, n;
+    while( 1 )
+    {
+        if( sscanf( pTag, "(%d,%d)%n", &x, &y, &n ) < 2 )
+        {
+            return NULL;
+        }
+        if( x < 0 || y < 0 )
+        {
+            msg_Err( getIntf(),
+                     "Slider points cannot have negative coordinates!" );
+            return NULL;
+        }
+        xBez.push_back( x );
+        yBez.push_back( y );
+        pTag += n;
+        if( *pTag == '\0' )
+        {
+            break;
+        }
+        if( *(pTag++) != ',' )
+        {
+            return NULL;
+        }
+    }
+
+    // Create the Bezier curve
+    return new Bezier( getIntf(), xBez, yBez );
+}
+
diff --git a/modules/gui/skins2/parser/builder.hpp b/modules/gui/skins2/parser/builder.hpp
new file mode 100644 (file)
index 0000000..67fa3fd
--- /dev/null
@@ -0,0 +1,105 @@
+/*****************************************************************************
+ * builder.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: builder.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+#ifndef BUILDER_HPP
+#define BUILDER_HPP
+
+#include "builder_data.hpp"
+#include "interpreter.hpp"
+#include "../src/os_graphics.hpp"
+#include "../src/generic_window.hpp"
+#include "../src/generic_layout.hpp"
+#include "../src/generic_bitmap.hpp"
+#include "../src/generic_font.hpp"
+#include "../commands/cmd_generic.hpp"
+#include "../controls/ctrl_generic.hpp"
+#include "../utils/bezier.hpp"
+
+#include <string>
+#include <list>
+#include <set>
+#include <map>
+
+class Theme;
+
+
+/// Class for skin construction
+class Builder: public SkinObject
+{
+    public:
+        Builder( intf_thread_t *pIntf, BuilderData &rData );
+        virtual ~Builder() {}
+
+        /// Create a Theme object, ready to use.
+        /// Return NULL in case of problem
+        Theme *build();
+
+        /// Parse an action tag and returns a command
+        CmdGeneric *parseAction( const string &rAction );
+
+    private:
+        /// Data from the XML
+        BuilderData &m_rData;
+
+        /// Script interpreter
+        Interpreter m_interpreter;
+
+        /// Theme under construction
+        Theme *m_pTheme;
+
+        /// Set of used id
+        set<string> m_idSet;
+
+        void addTheme( const BuilderData::Theme &rData );
+        void addBitmap( const BuilderData::Bitmap &rData );
+        void addFont( const BuilderData::Font &rData );
+        void addWindow( const BuilderData::Window &rData );
+        void addLayout( const BuilderData::Layout &rData );
+        void addAnchor( const BuilderData::Anchor &rData );
+        void addButton( const BuilderData::Button &rData );
+        void addCheckbox( const BuilderData::Checkbox &rData );
+        void addImage( const BuilderData::Image &rData );
+        void addText( const BuilderData::Text &rData );
+        void addRadialSlider( const BuilderData::RadialSlider &rData );
+        void addSlider( const BuilderData::Slider &rData );
+        void addList( const BuilderData::List &rData );
+
+        /// Generate a new id
+        const string generateId() const;
+
+        /// Check if the id is unique, and if not generate a new one
+        const string uniqueId( const string &id );
+
+        /// Compute the position of a control
+        const Position makePosition( const string &rLeftTop,
+                                     const string &rRightBottom,
+                                     int xPos, int yPos, int width, int height,
+                                     const Box &rBox ) const;
+
+        /// Function to parse "points" tags
+        Bezier *getPoints( const char *pTag ) const;
+};
+
+#endif
+
diff --git a/modules/gui/skins2/parser/builder_data.hpp b/modules/gui/skins2/parser/builder_data.hpp
new file mode 100644 (file)
index 0000000..d20a423
--- /dev/null
@@ -0,0 +1,311 @@
+/*****************************************************************************
+ * builder_data.hpp
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: builder_data.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ *
+ * Authors: Cyril Deguet     <asmax@via.ecp.fr>
+ *          Olivier Teulière <ipkiss@via.ecp.fr>
+ *
+ * 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, USA.
+ *****************************************************************************/
+
+//File generated by gen_builder.py
+//DO NOT EDIT BY HAND !
+
+#ifndef BUILDER_DATA_HPP
+#define BUILDER_DATA_HPP
+
+using namespace std;
+
+#include <vlc/vlc.h>
+#include <list>
+#include <map>
+#include <string>
+
+/// Structure for mapping data from XML file
+struct BuilderData
+{
+
+    /// Type definition
+    struct Theme
+    {
+        Theme( int magnet, uint32_t alpha, uint32_t moveAlpha, uint32_t fadeTime ):
+m_magnet( magnet ), m_alpha( alpha ), m_moveAlpha( moveAlpha ), m_fadeTime( fadeTime ) {}
+
+        int m_magnet;
+        uint32_t m_alpha;
+        uint32_t m_moveAlpha;
+        uint32_t m_fadeTime;
+    };
+    /// List
+    list<Theme> m_listTheme;
+
+    /// Type definition
+    struct Bitmap
+    {
+        Bitmap( const string & id, const string & fileName, uint32_t alphaColor ):
+m_id( id ), m_fileName( fileName ), m_alphaColor( alphaColor ) {}
+
+        const string m_id;
+        const string m_fileName;
+        uint32_t m_alphaColor;
+    };
+    /// List
+    list<Bitmap> m_listBitmap;
+
+    /// Type definition
+    struct Font
+    {
+        Font( const string & id, const string & fontName, int size ):
+m_id( id ), m_fontName( fontName ), m_size( size ) {}
+
+        const string m_id;
+        const string m_fontName;
+        int m_size;
+    };
+    /// List
+    list<Font> m_listFont;
+
+    /// Type definition
+    struct Window
+    {
+        Window( const string & id, int xPos, int yPos, bool visible, bool dragDrop, bool playOnDrop ):
+m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_visible( visible ), m_dragDrop( dragDrop ), m_playOnDrop( playOnDrop ) {}
+
+        const string m_id;
+        int m_xPos;
+        int m_yPos;
+        bool m_visible;
+        bool m_dragDrop;
+        bool m_playOnDrop;
+    };
+    /// List
+    list<Window> m_listWindow;
+
+    /// Type definition
+    struct Layout
+    {
+        Layout( const string & id, int width, int height, int minWidth, int maxWidth, int minHeight, int maxHeight, const string & windowId ):
+m_id( id ), m_width( width ), m_height( height ), m_minWidth( minWidth ), m_maxWidth( maxWidth ), m_minHeight( minHeight ), m_maxHeight( maxHeight ), m_windowId( windowId ) {}
+
+        const string m_id;
+        int m_width;
+        int m_height;
+        int m_minWidth;
+        int m_maxWidth;
+        int m_minHeight;
+        int m_maxHeight;
+        const string m_windowId;
+    };
+    /// List
+    list<Layout> m_listLayout;
+
+    /// Type definition
+    struct Anchor
+    {
+        Anchor( int xPos, int yPos, int range, int priority, const string & windowId ):
+m_xPos( xPos ), m_yPos( yPos ), m_range( range ), m_priority( priority ), m_windowId( windowId ) {}
+
+        int m_xPos;
+        int m_yPos;
+        int m_range;
+        int m_priority;
+        const string m_windowId;
+    };
+    /// List
+    list<Anchor> m_listAnchor;
+
+    /// Type definition
+    struct Button
+    {
+        Button( const string & id, int xPos, int yPos, const string & leftTop, const string & rightBottom, const string & upId, const string & downId, const string & overId, const string & actionId, const string & tooltip, const string & help, int layer, const string & windowId, const string & layoutId ):
+m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_upId( upId ), m_downId( downId ), m_overId( overId ), m_actionId( actionId ), m_tooltip( tooltip ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {}
+
+        const string m_id;
+        int m_xPos;
+        int m_yPos;
+        const string m_leftTop;
+        const string m_rightBottom;
+        const string m_upId;
+        const string m_downId;
+        const string m_overId;
+        const string m_actionId;
+        const string m_tooltip;
+        const string m_help;
+        int m_layer;
+        const string m_windowId;
+        const string m_layoutId;
+    };
+    /// List
+    list<Button> m_listButton;
+
+    /// Type definition
+    struct Checkbox
+    {
+        Checkbox( const string & id, int xPos, int yPos, const string & leftTop, const string & rightBottom, const string & up1Id, const string & down1Id, const string & over1Id, const string & up2Id, const string & down2Id, const string & over2Id, const string & state, const string & action1, const string & action2, const string & tooltip1, const string & tooltip2, const string & help, int layer, const string & windowId, const string & layoutId ):
+m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_up1Id( up1Id ), m_down1Id( down1Id ), m_over1Id( over1Id ), m_up2Id( up2Id ), m_down2Id( down2Id ), m_over2Id( over2Id ), m_state( state ), m_action1( action1 ), m_action2( action2 ), m_tooltip1( tooltip1 ), m_tooltip2( tooltip2 ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {}
+
+        const string m_id;
+        int m_xPos;
+        int m_yPos;
+        const string m_leftTop;
+        const string m_rightBottom;
+        const string m_up1Id;
+        const string m_down1Id;
+        const string m_over1Id;
+        const string m_up2Id;
+        const string m_down2Id;
+        const string m_over2Id;
+        const string m_state;
+        const string m_action1;
+        const string m_action2;
+        const string m_tooltip1;
+        const string m_tooltip2;
+        const string m_help;
+        int m_layer;
+        const string m_windowId;
+        const string m_layoutId;
+    };
+    /// List
+    list<Checkbox> m_listCheckbox;
+
+    /// Type definition
+    struct Image
+    {
+        Image( const string & id, int xPos, int yPos, const string & leftTop, const string & rightBottom, bool visible, const string & bmpId, const string & onclickId, const string & help, int layer, const string & windowId, const string & layoutId ):
+m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_visible( visible ), m_bmpId( bmpId ), m_onclickId( onclickId ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {}
+
+        const string m_id;
+        int m_xPos;
+        int m_yPos;
+        const string m_leftTop;
+        const string m_rightBottom;
+        bool m_visible;
+        const string m_bmpId;
+        const string m_onclickId;
+        const string m_help;
+        int m_layer;
+        const string m_windowId;
+        const string m_layoutId;
+    };
+    /// List
+    list<Image> m_listImage;
+
+    /// Type definition
+    struct Text
+    {
+        Text( const string & id, int xPos, int yPos, const string & fontId, const string & text, int width, const string & help, int layer, const string & windowId, const string & layoutId ):
+m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_fontId( fontId ), m_text( text ), m_width( width ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {}
+
+        const string m_id;
+        int m_xPos;
+        int m_yPos;
+        const string m_fontId;
+        const string m_text;
+        int m_width;
+        const string m_help;
+        int m_layer;
+        const string m_windowId;
+        const string m_layoutId;
+    };
+    /// List
+    list<Text> m_listText;
+
+    /// Type definition
+    struct RadialSlider
+    {
+        RadialSlider( const string & id, const string & visible, int xPos, int yPos, const string & leftTop, const string & rightBottom, const string & sequence, int nbImages, double minAngle, double maxAngle, const string & value, const string & tooltip, const string & help, int layer, const string & windowId, const string & layoutId ):
+m_id( id ), m_visible( visible ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_sequence( sequence ), m_nbImages( nbImages ), m_minAngle( minAngle ), m_maxAngle( maxAngle ), m_value( value ), m_tooltip( tooltip ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {}
+
+        const string m_id;
+        const string m_visible;
+        int m_xPos;
+        int m_yPos;
+        const string m_leftTop;
+        const string m_rightBottom;
+        const string m_sequence;
+        int m_nbImages;
+        double m_minAngle;
+        double m_maxAngle;
+        const string m_value;
+        const string m_tooltip;
+        const string m_help;
+        int m_layer;
+        const string m_windowId;
+        const string m_layoutId;
+    };
+    /// List
+    list<RadialSlider> m_listRadialSlider;
+
+    /// Type definition
+    struct Slider
+    {
+        Slider( const string & id, const string & visible, int xPos, int yPos, const string & leftTop, const string & rightBottom, const string & upId, const string & downId, const string & overId, const string & points, int thickness, const string & value, const string & tooltip, const string & help, int layer, const string & windowId, const string & layoutId ):
+m_id( id ), m_visible( visible ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_upId( upId ), m_downId( downId ), m_overId( overId ), m_points( points ), m_thickness( thickness ), m_value( value ), m_tooltip( tooltip ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {}
+
+        const string m_id;
+        const string m_visible;
+        int m_xPos;
+        int m_yPos;
+        const string m_leftTop;
+        const string m_rightBottom;
+        const string m_upId;
+        const string m_downId;
+        const string m_overId;
+        const string m_points;
+        int m_thickness;
+        const string m_value;
+        const string m_tooltip;
+        const string m_help;
+        int m_layer;
+        const string m_windowId;
+        const string m_layoutId;
+    };
+    /// List
+    list<Slider> m_listSlider;
+
+    /// Type definition
+    struct List
+    {
+        List( const string & id, int xPos, int yPos, int width, int height, const string & leftTop, const string & rightBottom, const string & fontId, const string & var, uint32_t fgColor, uint32_t playColor, uint32_t bgColor1, uint32_t bgColor2, uint32_t selColor, const string & help, int layer, const string & windowId, const string & layoutId ):
+m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_width( width ), m_height( height ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_fontId( fontId ), m_var( var ), m_fgColor( fgColor ), m_playColor( playColor ), m_bgColor1( bgColor1 ), m_bgColor2( bgColor2 ), m_selColor( selColor ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {}
+
+        const string m_id;
+        int m_xPos;
+        int m_yPos;
+        int m_width;
+        int m_height;
+        const string m_leftTop;
+        const string m_rightBottom;
+        const string m_fontId;
+        const string m_var;
+        uint32_t m_fgColor;
+        uint32_t m_playColor;
+        uint32_t m_bgColor1;
+        uint32_t m_bgColor2;
+        uint32_t m_selColor;
+        const string m_help;
+        int m_layer;
+        const string m_windowId;
+        const string m_layoutId;
+    };
+    /// List
+    list<List> m_listList;
+
+
+};
+
+#endif
diff --git a/modules/gui/skins2/parser/flex.c b/modules/gui/skins2/parser/flex.c
new file mode 100644 (file)
index 0000000..6605519
--- /dev/null
@@ -0,0 +1,7916 @@
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /root/vlc-cvs/modules/gui/skins2/parser/Attic/flex.c,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <errno.h>
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+#endif
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yyleng = (int) (yy_cp - yy_bp); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 472
+#define YY_END_OF_BUFFER 473
+static yyconst short int yy_accept[2803] =
+    {   0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  473,  471,   31,   10,
+       10,   31,   31,  450,   10,  450,    5,    6,    5,    8,
+        9,    8,  466,  458,  459,  467,  464,  467,  465,  470,
+      458,  459,  470,  472,  472,   45,   10,   45,   45,   45,
+       43,   45,   45,   45,   45,  472,   49,   10,   49,  472,
+       49,  472,   59,   10,   59,   59,   59,   57,   59,   59,
+
+       59,   63,   10,   63,  472,   73,   10,   73,   73,   73,
+       71,   73,   73,   73,   77,   10,   77,  472,   93,   10,
+       93,   93,   93,   91,   93,   93,   93,   93,   93,   97,
+       10,   97,  109,   10,  109,  109,  109,  107,  109,  109,
+      109,  109,  113,   10,  113,  472,  129,   10,  129,  129,
+      129,  127,  129,  129,  129,  129,  129,  129,  472,  133,
+       10,  133,  133,  151,   10,  151,  151,  151,  149,  151,
+      151,  151,  151,  472,  155,   10,  155,  163,   10,  163,
+      163,  163,  161,  163,  163,  472,  167,   10,  167,  167,
+      472,  179,   10,  179,  179,  179,  177,  179,  179,  179,
+
+      179,  183,   10,  183,  472,  205,   10,  205,  205,  205,
+      203,  205,  205,  205,  205,  205,  205,  205,  205,  209,
+       10,  209,  472,  231,   10,  231,  231,  231,  229,  231,
+      231,  231,  231,  231,  231,  231,  231,  235,   10,  235,
+      472,  261,   10,  261,  261,  261,  259,  261,  261,  261,
+      261,  261,  261,  261,  261,  261,  261,  261,  265,   10,
+      265,  472,  303,   10,  303,  303,  303,  301,  303,  303,
+      303,  303,  303,  303,  303,  303,  303,  303,  303,  303,
+      307,   10,  307,  472,  339,   10,  339,  339,  339,  337,
+      339,  339,  339,  339,  339,  339,  339,  339,  339,  339,
+
+      339,  339,  343,   10,  343,  472,  373,   10,  373,  373,
+      373,  371,  373,  373,  373,  373,  373,  373,  373,  373,
+      373,  373,  373,  377,   10,  377,  472,  405,   10,  405,
+      405,  405,  403,  405,  405,  405,  405,  405,  405,  405,
+      405,  405,  405,  405,  409,   10,  409,  472,  445,   10,
+      445,  445,  445,  443,  445,  445,  445,  445,  445,  445,
+      445,  445,  445,  445,  445,  445,  449,   10,  449,  466,
+      458,  459,  467,  467,  466,   10,    0,    2,    2,    0,
+        4,    7,  461,  460,    0,    0,    0,    0,    0,  469,
+        0,   44,   46,   46,   46,   46,   46,   46,    0,    0,
+
+        0,    0,    0,    0,   58,   60,   60,   60,   60,    0,
+       72,   74,   74,   74,   74,    0,   92,   94,   94,   94,
+       94,   94,   94,   94,    0,  108,  110,  110,  110,  110,
+      110,    0,  128,  130,  130,  130,  130,  130,    0,    0,
+        0,    0,    0,    0,  150,  152,  152,  152,  152,  152,
+      152,    0,    0,  162,  164,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  178,  180,
+      180,  180,    0,    0,    0,    0,    0,  204,  206,  206,
+      206,  206,  206,  206,  206,  206,    0,    0,    0,    0,
+        0,    0,  230,  232,  232,    0,    0,  232,  232,  232,
+
+      232,    0,    0,    0,    0,    0,    0,    0,  260,  262,
+      262,  262,  262,  262,  262,  262,  262,  262,  262,    0,
+        0,    0,    0,    0,  302,  304,  304,  304,  304,  304,
+      304,  304,  304,  304,  304,  304,    0,    0,    0,    0,
+        0,  338,  340,  340,  340,  340,  340,  340,  340,  340,
+      340,  340,  340,  340,  340,    0,    0,    0,    0,    0,
+        0,  372,  374,  374,  374,  374,  374,  374,  374,  374,
+      374,  374,  374,  374,    0,    0,    0,    0,    0,  404,
+      406,  406,  406,  406,  406,  406,  406,  406,  406,  406,
+        0,    0,    0,    0,    0,  444,  446,  446,  446,  446,
+
+      446,  446,  446,  446,  446,  446,  446,  446,  446,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        3,    0,    0,    0,    0,    0,    0,    0,  468,    0,
+       46,   46,   46,   46,   46,    0,    0,    0,    0,    0,
+        0,    0,   60,   60,    0,    0,    0,    0,   74,    0,
+        0,   74,    0,    0,   94,   94,    0,    0,   94,   94,
+       94,    0,    0,  110,  110,  110,  110,    0,    0,  130,
+        0,    0,  130,  130,    0,  120,  119,    0,  122,  121,
+        0,    0,    0,  152,    0,    0,  152,  152,  152,    0,
+        0,    0,    0,  158,  157,    0,  160,  159,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  180,
+      180,    0,  170,  169,    0,  172,  171,    0,    0,  206,
+        0,    0,  206,  206,  206,  206,  206,    0,  190,  189,
+        0,  192,  191,    0,    0,  232,    0,  222,  221,  232,
+        0,    0,  232,  232,    0,  220,  219,    0,  216,  215,
+        0,  218,  217,    0,    0,  262,  262,  262,    0,    0,
+      262,  262,  262,  262,    0,    0,    0,  240,  239,    0,
+      242,  241,    0,    0,  304,  304,  304,    0,    0,  304,
+      304,  304,  304,  304,  304,  304,    0,  270,  269,    0,
+      272,  271,    0,    0,  340,  340,    0,    0,  340,  340,
+
+      340,  340,  340,  340,    0,    0,  340,  340,    0,  314,
+      313,    0,  316,  315,    0,    0,  374,    0,    0,  374,
+      374,  374,  374,  374,  374,  374,  374,  374,    0,  350,
+      349,    0,  352,  351,    0,    0,  406,  406,  406,  406,
+        0,    0,  406,  406,  406,  406,    0,  384,  383,    0,
+      386,  385,    0,    0,  446,  446,  446,  446,  446,    0,
+        0,  446,  446,  446,  446,  446,  446,  446,    0,  416,
+      415,    0,  418,  417,    0,    0,    0,  463,    0,   30,
+        1,    0,    0,  456,    0,    0,    0,  453,  452,    0,
+        0,   46,   46,   46,   46,   46,    0,    0,    0,   48,
+
+        0,    0,    0,    0,    0,   60,   60,    0,   52,   51,
+        0,    0,   62,    0,   74,    0,   66,   65,    0,    0,
+        0,    0,   76,    0,   94,   94,    0,   80,   79,   94,
+       94,   94,    0,    0,   96,    0,  110,  110,  110,  110,
+        0,    0,  112,    0,  130,    0,  116,  115,  130,  130,
+        0,    0,    0,  132,    0,  152,    0,  136,  135,  152,
+      152,  152,  152,  152,    0,    0,    0,  154,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      166,    0,  180,  180,    0,    0,  182,    0,  206,    0,
+      186,  185,  206,  206,  206,  206,  206,    0,    0,  208,
+
+        0,  232,  232,    0,  212,  211,  232,  232,    0,    0,
+      234,    0,  262,  262,  262,    0,  238,  237,  262,  262,
+      262,  262,    0,  248,  247,    0,    0,  264,    0,  304,
+      304,  304,    0,  268,  267,  304,  304,  304,  304,  304,
+        0,    0,    0,    0,    0,    0,  306,    0,  340,  340,
+        0,  310,  309,  340,  340,  340,  340,  340,  340,    0,
+      322,  321,  340,  340,    0,    0,  342,    0,  374,    0,
+      346,  345,  374,  374,  374,  374,  374,  374,  374,  374,
+      374,    0,    0,  376,    0,  406,  406,  406,  406,    0,
+      380,  379,  406,  406,  406,  406,    0,    0,  408,    0,
+
+      446,  446,  446,  446,  446,    0,  412,  411,  446,  446,
+      446,  446,    0,    0,  446,  446,    0,    0,  448,    0,
+        0,    0,    0,  457,  451,    0,    0,    0,   46,   46,
+       46,   46,   46,    0,    0,    0,    0,   78,    0,   60,
+        0,    0,    0,   74,    0,   70,   69,    0,   94,    0,
+        0,   94,    0,    0,   94,    0,  110,  110,    0,    0,
+      110,    0,  130,  130,  130,    0,    0,  152,  152,  152,
+      152,  152,  152,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  378,    0,  180,  180,    0,    0,    0,
+      206,  206,  206,  206,  206,    0,  232,    0,    0,  232,
+
+      232,    0,  262,    0,    0,    0,    0,  262,    0,    0,
+      262,  262,    0,  304,  304,  304,    0,    0,  304,  304,
+      304,  304,  304,  304,    0,  278,  277,    0,  284,  283,
+        0,    0,    0,    0,    0,  340,    0,    0,  340,  340,
+      340,  340,  340,  340,    0,    0,    0,  374,  374,  374,
+      374,  374,  374,  374,  374,  374,    0,  406,  406,    0,
+        0,    0,    0,  406,    0,    0,  406,  406,    0,  446,
+      446,    0,    0,  446,    0,    0,  446,  446,  446,  446,
+        0,  430,  429,  446,  446,    0,    0,    0,    0,    0,
+       12,    0,  454,  455,   32,    0,    0,   46,   46,   46,
+
+       46,    0,    0,    0,   64,   78,    0,   60,    0,   54,
+       53,    0,    0,    0,    0,    0,    0,    0,   82,   81,
+       94,    0,   84,   83,   94,    0,  110,    0,    0,    0,
+      100,   99,  110,    0,  130,  130,  130,    0,    0,  152,
+      152,  152,  152,  152,    0,    0,  156,    0,    0,    0,
+        0,  184,    0,    0,    0,    0,  378,    0,  180,    0,
+        0,    0,    0,  202,  201,    0,    0,  206,  206,  206,
+      206,    0,    0,    0,    0,  228,  227,  232,  232,    0,
+      262,    0,  250,  249,    0,  258,  257,  262,    0,  252,
+      251,  262,  262,    0,  304,    0,    0,    0,    0,    0,
+
+      300,  299,  304,    0,    0,    0,    0,  304,    0,    0,
+      304,    0,    0,  324,  323,    0,  336,  335,  340,    0,
+      326,  325,  340,  340,  340,  340,    0,    0,  340,    0,
+        0,  370,  369,  374,  374,  374,  374,  374,  374,  374,
+        0,    0,  374,    0,    0,    0,  406,    0,  390,  389,
+        0,  402,  401,  406,    0,  388,  387,  406,    0,    0,
+        0,  446,  446,    0,  428,  427,  446,    0,  442,  441,
+      446,  446,  446,  446,  446,    0,    0,    0,    0,    0,
+        0,   11,   32,    0,   38,   37,   46,    0,    0,   46,
+       46,    0,    0,   50,   64,  114,   60,    0,    0,   68,
+
+       67,    0,    0,   86,   85,    0,    0,   94,    0,   95,
+        0,    0,    0,  104,  103,  110,    0,  130,  130,  130,
+      134,    0,    0,    0,  152,  152,  152,  152,    0,  138,
+      137,  156,    0,  168,  236,    0,  184,    0,    0,    0,
+      308,    0,  180,    0,  176,  175,    0,    0,  198,  197,
+      206,  206,  206,  206,    0,    0,  224,  223,  232,  232,
+        0,    0,    0,  262,  262,  262,    0,  304,  304,    0,
+      280,  279,    0,  286,  285,  304,    0,  282,  281,    0,
+      288,  287,  304,    0,  290,  289,  304,    0,  340,    0,
+        0,  340,  340,  340,    0,  332,  331,  340,    0,  374,
+
+      374,  374,  374,  374,  374,  374,    0,  366,  365,  374,
+        0,    0,  392,  391,  406,    0,    0,  406,  406,    0,
+      394,  393,    0,  407,  446,  446,    0,    0,  446,  446,
+      446,  446,  446,    0,  420,  419,    0,    0,    0,    0,
+       46,    0,   36,   35,   46,    0,    0,    0,    0,   47,
+       50,  114,   60,    0,    0,   75,    0,   88,   87,   94,
+        0,  102,  101,    0,    0,    0,  130,  130,    0,    0,
+      134,    0,    0,  140,  139,  152,  152,  152,  152,    0,
+      168,  236,    0,    0,    0,    0,  308,    0,  165,  180,
+        0,    0,    0,    0,    0,  206,    0,    0,    0,  207,
+
+        0,    0,    0,    0,    0,    0,  254,  253,    0,    0,
+      262,  262,    0,    0,    0,    0,    0,    0,    0,  304,
+      304,    0,    0,    0,    0,  328,  327,  340,  340,  340,
+        0,    0,    0,    0,    0,  374,  374,  374,  374,  374,
+      374,    0,    0,    0,    0,    0,    0,  398,  397,  406,
+        0,    0,  446,  446,    0,    0,    0,  422,  421,    0,
+        0,  446,  446,  446,    0,    0,    0,    0,    0,    0,
+        0,    0,   46,    0,   34,   33,    0,   60,    0,   61,
+       94,    0,  106,  105,    0,    0,    0,  130,    0,  118,
+      117,    0,  131,  152,    0,    0,  152,    0,    0,    0,
+
+      153,  266,  410,    0,    0,    0,    0,    0,  181,    0,
+      194,  193,    0,  200,  199,  206,    0,  188,  187,    0,
+      226,  225,    0,  214,  213,    0,    0,  244,  243,  262,
+      262,    0,  263,    0,  292,  291,    0,  294,  293,    0,
+      274,  273,  304,  304,    0,    0,  318,  317,  340,  340,
+      340,    0,  312,  311,    0,  341,    0,  354,  353,    0,
+        0,    0,    0,    0,    0,  374,    0,    0,  374,    0,
+      348,  347,    0,    0,  396,  395,  406,    0,  382,  381,
+        0,    0,    0,    0,    0,  432,  431,    0,  424,  423,
+      446,  446,    0,    0,    0,  414,  413,    0,  462,    0,
+
+        0,    0,   42,   41,    0,    0,   98,   60,    0,    0,
+        0,    0,  124,  123,  130,    0,    0,    0,  144,  143,
+        0,    0,    0,  142,  141,  266,  410,    0,  210,    0,
+      174,  173,  206,    0,  262,  262,  304,  304,    0,  340,
+        0,    0,  340,    0,  364,  363,    0,  362,  361,    0,
+      360,  359,  374,    0,  358,  357,  374,    0,  406,    0,
+      436,  435,    0,  438,  437,    0,    0,  446,    0,  440,
+      439,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   40,   39,   98,
+        0,    0,    0,   90,   89,    0,    0,    0,    0,  148,
+
+      147,    0,  146,  145,    0,  210,  206,    0,  262,  262,
+      304,  304,    0,  305,  340,    0,  330,  329,  340,  374,
+      374,    0,  406,    0,  434,  433,  446,    0,  447,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   56,   55,    0,
+      111,    0,  126,  125,    0,    0,    0,    0,  233,    0,
+        0,    0,    0,    0,    0,  304,  304,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  344,    0,  196,
+
+      195,    0,  246,  245,    0,  256,  255,    0,  276,  275,
+        0,    0,    0,    0,    0,  320,  319,    0,  334,  333,
+        0,  356,  355,    0,  368,  367,    0,    0,  400,  399,
+        0,  426,  425,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  344,    0,  296,  295,    0,  298,  297,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  375,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,   22,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   17,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   14,    0,   20,    0,   15,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   21,    0,
+        0,    0,    0,   19,    0,   28,    0,   27,    0,    0,
+        0,   13,    0,    0,    0,    0,    0,    0,    0,   25,
+        0,    0,    0,   29,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   26,    0,   16,    0,    0,    0,    0,
+        0,    0,    0,   18,    0,   24,    0,    0,    0,    0,
+
+       23,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    2,    4,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    5,    6,    7,    1,    1,    8,    9,    1,
+        1,    1,    1,    1,   10,   11,   12,   13,   14,   15,
+       13,   13,   13,   13,   13,   13,   13,   16,   17,   18,
+       19,   20,   21,    1,   22,   23,   24,   25,   26,   27,
+       28,   16,   29,   16,   16,   30,   31,   16,   32,   33,
+       16,   34,   35,   36,   16,   16,   37,   16,   38,   16,
+       39,    1,   40,    1,   16,    1,   41,   42,   43,   44,
+
+       45,   46,   47,   48,   49,   16,   50,   51,   52,   53,
+       54,   55,   56,   57,   58,   59,   60,   61,   62,   63,
+       64,   65,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[66] =
+    {   0,
+        1,    2,    2,    2,    1,    1,    1,    1,    1,    3,
+        3,    1,    4,    4,    4,    5,    6,    1,    7,    8,
+        1,    9,    9,    9,    9,    9,    9,    5,    5,    5,
+        5,    5,    5,    5,    5,    5,    5,    5,    1,    1,
+        9,    9,    9,    9,    9,    9,    5,    5,    5,    5,
+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
+        5,    5,    5,    5,    5
+    } ;
+
+static yyconst short int yy_base[3053] =
+    {   0,
+        0,    0,    0,    3,    6,    9,   12,   29,   16,   19,
+       14,   17,   33,   36,   49,   55,   45,   61,   66,   72,
+      101,  162,   75,   78,  121,  125,  128,  131,  134,  182,
+      186,  189,  192,  195,  223,  272,  243,  247,  250,  253,
+      321,  371,  292,  296,  299,  302,  421,    0,  341,  344,
+      347,  350,  486,  548,  391,  394,  397,  400,  610,    0,
+      506,  510,  514,  517,  568,  572,  576,  579,  674,  677,
+      695,  757,  715,  718,  721,  724,  727,  777,  819,  883,
+      780,  783,  786,  789,  839,  842,  845,  848,  851,  903,
+      947, 1011,  906,  909,  912,  915, 1075,    0,  967,  970,
+
+      973,  976, 1140,    0,  979, 1031, 1034, 1037, 1205,    0,
+     1040, 1043, 1269, 1272, 1290,    0, 1354, 1357, 1360, 1363,
+     1381,    0, 1445, 1448, 1451, 1454, 1472,    0, 1536, 1539,
+     1542, 1545, 1563,    0, 1627, 1630, 1633, 1636, 1654,    0,
+     1718, 1721, 1724, 1727, 1729, 1740, 7513, 9896, 9896,   84,
+       95,   29,   41, 9896,  152,   51, 9896, 9896, 7501, 9896,
+     9896, 7490, 9896, 7505, 7489, 1727, 9896, 9896, 9896, 9896,
+     7487, 7487, 7448, 9896, 1730, 9896,  155, 7467,    0,  139,
+     9896, 7434, 7443,  107, 7438, 1735, 9896,  213, 1749, 1736,
+      200,  517, 9896,  216, 7452,    0,  201, 9896, 7408, 7402,
+
+     7406, 9896,  256,  524,  579, 9896,  305, 7429,    0,  525,
+     9896, 7387, 7403, 7400, 9896,  353,  586,  727, 9896,  403,
+     7424,    0,  587, 9896, 7389, 7383,  693, 7383, 7367, 9896,
+      539,  856, 9896,  600, 7399,    0,  735, 9896, 7357, 7364,
+     7371, 7366, 9896,  680,  859, 1744, 9896,  683, 7390,    0,
+      789, 9896, 7352, 7364, 7356, 7356, 1785, 1788,  851, 9896,
+      686, 1772,  920, 9896,  747, 7384,    0,  794, 9896, 7358,
+     7354,   42, 7348,  915, 9896,  809,  923, 9896,  814, 7375,
+        0,  857, 9896, 1792, 1795, 1810, 9896,  871, 7381,  984,
+      979, 9896,  935, 7372,    0,  921, 9896, 7329, 7344, 1806,
+
+     1816, 9896, 1004, 1048, 1043, 9896, 1275, 7363,    0,  924,
+     9896, 7337,   48, 7326, 7317, 7320, 7313, 1838, 1845, 9896,
+     1278, 1800, 1795, 9896, 1281, 7331,    0,  988, 9896, 7284,
+     1848, 7286, 7276, 7279, 1851, 1856, 1859, 9896, 1366, 1801,
+     1780, 9896, 1457, 7307,    0, 1049, 9896, 7283, 7271, 7279,
+     7279, 7277, 7255, 7262, 7245, 7243, 1869, 1877, 9896, 1548,
+     1864, 1863, 9896, 1639, 7276,    0, 1052, 9896, 7252, 7236,
+     7244, 7244, 7240, 7223, 7233, 7218, 7222, 7216, 1887, 1895,
+     9896, 1824, 1889, 1881, 9896, 1901, 7250,    0, 1861, 9896,
+     7214, 7222, 7221, 7219, 7201, 7207, 7210,   12, 7203,  474,
+
+     1905, 1909, 9896, 1915, 1910, 1915, 9896, 1923, 7217,    0,
+     1916, 9896, 7191, 7190, 7184,  536, 7186, 7173, 7172, 7162,
+      697, 1931, 1936, 9896, 1939, 1939, 1925, 9896, 1950, 7193,
+        0, 1924, 9896, 7160, 7161, 7154, 7161, 7161, 7160, 7143,
+     7137, 7133, 1954, 1960, 9896, 1963, 1963, 1964, 9896, 1968,
+     7160,    0, 1927, 9896, 7132,  490, 7132, 7125, 7123, 7115,
+     7112, 7115,  759, 7109, 1974, 1979, 9896, 1984, 1984, 9896,
+     7149, 7149, 1967, 7145, 7104, 1988,   18, 7079, 9896, 7127,
+     7116, 9896, 9896, 9896, 1986,  215, 7067, 7066, 7063, 7095,
+     7066, 9896,    0, 7057, 7063, 7059, 7043, 7042, 7050, 7060,
+
+     7041, 7026, 7031, 7032, 9896,    0, 7017, 7020, 2000, 7046,
+     9896,    0, 7019, 2007, 6994, 7031, 9896,    0, 7004, 6990,
+     2013, 7001, 6967, 6987, 6994, 9896,    0, 6961, 6977, 6958,
+     6967, 6971, 9896,    0, 6965, 2018, 6962, 6943, 2025, 2032,
+     2043, 2048, 6956, 6948, 9896,    0, 6935, 2056, 6919, 6924,
+     6932, 6914, 6940, 9896,    0, 2061, 2064, 2074, 2079, 6915,
+     6899, 6910, 6904, 6904,  274, 6902, 6900, 6912, 9896,    0,
+     6890, 6884, 2087, 2092, 2100, 2105, 6910, 9896,    0, 6876,
+     2113, 6885, 6878, 6875, 6866, 6854, 2118, 2121, 2131, 2136,
+     6881, 6864, 9896,    0, 6856, 2144, 2149, 6844, 2157, 6851,
+
+     6833, 2162, 2165, 2175, 2180, 2188, 2193, 6847, 9896,    0,
+     6811, 6807, 6812, 2201, 6816, 6815, 6799, 6791, 2206, 2209,
+     2212, 2220, 2227, 6820, 9896,    0, 6783, 6778, 6783, 2238,
+     6787, 6768, 6765, 6769, 6751,   80, 2241, 2244, 2252, 2259,
+     6774, 9896,    0, 6734, 6744, 2270, 6747, 6736, 6730, 6727,
+     6724, 6717, 2273, 6708, 6700, 2276, 2279, 2294, 2297, 6717,
+     6708, 9896,    0, 6692, 2305, 6695, 6672, 6680, 6676, 6671,
+     6659, 6659, 6651, 6639, 2308, 2312, 2326, 2329, 6662, 9896,
+        0, 6645, 6631, 6631, 6632, 2337, 6624, 6612, 6615, 6624,
+     2340, 2344, 2358, 2361, 6631, 9896,    0, 6618, 6616, 6605,
+
+      160, 2369, 6605, 6608, 6601, 6594, 6587, 6584, 6597, 2372,
+     2376, 2390, 2393, 6606, 6598, 6609, 6604, 6613,  721, 6566,
+     9896, 2390,    0, 6562, 6561, 6597, 6595, 6552, 9896, 6560,
+     6540, 6542, 6532, 6526, 6512, 6523, 2408, 2411, 6504, 6517,
+     6507, 6502, 6506, 6507, 2414, 2417, 2432, 2435, 6494, 2438,
+     2441, 2458, 2461, 2465, 6492, 6485, 2468, 2486, 6488, 6487,
+     6481, 2471, 2476, 6474, 6471, 6474, 6458, 2495, 2498, 6463,
+     2501, 2504, 6437, 6444, 2519, 9896, 9896, 2529, 9896, 9896,
+     6428, 2537, 2540, 6439, 2545, 2549,  485,  547, 6426, 6429,
+     2559, 2563, 2566, 9896, 9896, 2578, 9896, 9896, 6429, 6412,
+
+     6421, 6424, 6418, 6410, 6410, 6402, 6379, 2574, 2588, 6381,
+     6387, 2593, 9896, 9896, 2603, 9896, 9896, 2611, 2614, 6377,
+     2617, 2620, 6374, 6361, 6367, 6365, 6363, 2635, 9896, 9896,
+     2644, 9896, 9896, 2652, 2655, 6356, 2659, 9896, 9896, 6350,
+     2667, 2674, 6353, 6353, 2685, 9896, 9896, 2693, 9896, 9896,
+     2702, 9896, 9896, 2710, 2713, 6352, 6339, 6332, 2716, 2719,
+     6327, 6327, 6329, 6325, 2734, 2737, 2745, 9896, 9896, 2753,
+     9896, 9896, 2761, 2764, 6324, 6317, 6310, 2767, 2770, 6303,
+     6304, 6307, 6294, 6292, 2785, 2788, 2791, 9896, 9896, 2799,
+     9896, 9896, 2807, 2810, 6277, 6272, 2813, 2816, 6258, 6255,
+
+     6214, 6218, 6221, 6203, 2831, 2834, 6172, 6158, 2842, 9896,
+     9896, 2850, 9896, 9896, 2858, 2861, 6147, 2864, 2867, 6130,
+     6145, 6135, 6077, 6054, 6029, 6011, 6001, 5987, 2882, 9896,
+     9896, 2890, 9896, 9896, 2898, 2901, 5986, 5960, 5943, 5937,
+     2904, 2907, 5936, 5928, 5935, 5906, 2922, 9896, 9896, 2930,
+     9896, 9896, 2941, 2944, 5910, 5905, 5887, 5855, 5846, 2947,
+     2950, 5840, 5834, 5823, 5818, 2965, 5784, 5746, 2968, 9896,
+     9896, 2976, 9896, 9896, 2984, 2988, 5776, 9896, 5778, 9896,
+     9896,  343, 5744, 9896, 5750, 5745, 5684, 9896, 9896, 5680,
+     5684, 5676, 5652, 5653, 5650, 5616, 5612, 2991, 2994, 9896,
+
+     2997, 5594, 5549, 5525, 5533, 5499, 3003, 3017, 9896, 9896,
+     3025, 3028, 9896, 3031, 5461, 3034, 9896, 9896, 3050, 3053,
+     3061, 3064, 9896, 3068, 5462, 3072, 3076, 9896, 9896, 5405,
+     3090, 5394, 3094, 3097, 9896, 3100, 5359, 5337, 3103, 5341,
+     3108, 3121, 9896, 3127, 5296, 3130, 9896, 9896, 5284, 5295,
+     5281, 3140, 3146, 9896, 3153, 5249, 3159, 9896, 9896, 5244,
+     5217, 5218, 5186, 5166, 5139, 3167, 3172, 9896, 3175, 5107,
+     5095, 5086, 5025, 4973, 4985, 4925, 4934, 4907, 3178, 3181,
+     9896, 3187, 4890, 4876, 3200, 3206, 9896, 3209, 3212, 3215,
+     9896, 9896, 3230, 3234, 3240, 3243, 3252, 3261, 3264, 9896,
+
+     3270, 4863, 3276, 3294, 9896, 9896, 4802, 4772, 3284, 3303,
+     9896, 3306, 4674, 3310, 3313, 3316, 9896, 9896, 4653, 3331,
+     4625, 4619, 3334, 9896, 9896, 3342, 3349, 9896, 3352, 4612,
+      136, 3355, 3361, 9896, 9896, 4600,  399, 4599, 4562, 4540,
+     3373, 3376, 3384, 3387, 3395, 3398, 9896, 3402, 3405, 3410,
+     3417, 9896, 9896, 3429, 3432, 3435, 3438, 3441, 3459, 3462,
+     9896, 9896, 3470, 3477, 3473, 3480, 9896, 3483, 3502, 3505,
+     9896, 9896, 3520, 3523, 3527, 3531, 3534, 3541, 3545, 3552,
+     3559, 3555, 3563, 9896, 3585, 4523, 4506, 3566, 3588, 3606,
+     9896, 9896, 4485, 3592, 4412, 4388, 3596, 3615, 9896, 3618,
+
+     4372, 4331, 3621, 4307, 3624, 3628, 9896, 9896, 4191, 4197,
+     4155, 4143, 3642, 3645, 4145, 4118, 3653, 3656, 9896, 3660,
+     4128, 2004, 3663, 9896, 9896, 4078, 4070, 4038, 3666, 3675,
+     3684, 3687, 3693, 3998, 3696, 3952, 3931, 3705, 3926, 3934,
+     3711, 3716, 3724, 3730, 3733, 9896, 9896, 3748, 3751, 3754,
+     3757, 3775, 3778, 3781, 3789, 3796, 3880, 3800, 3803, 3808,
+     3864, 3821, 3846, 3835, 3835, 3782, 3824, 3730, 3720, 3720,
+     3655, 3598, 3827, 3526, 3830, 3466, 3441, 3419, 3405, 3398,
+     3340, 3283, 3237, 3833, 3845, 3151, 3850, 3854, 3857, 3876,
+     3868, 3887, 3890, 3893, 3896, 3914, 3917, 3920, 3923, 3940,
+
+     3946, 3949, 3143, 3952, 3964, 3960, 3972, 3110, 3982, 3985,
+     3117, 3069, 3996, 3033, 4000, 4003, 4007, 4011, 2961, 4021,
+     4025, 2941, 4028, 2914, 4032, 9896, 9896, 4047, 9896, 9896,
+     4055, 4058, 4061, 4069, 4076, 2883, 4087, 4090, 2869, 2878,
+     2824, 2782, 4098, 2777, 4101, 4105, 4109, 2726, 2653, 2651,
+     2583, 2585, 2533, 2407, 4123, 2349, 4126, 4129, 4132, 4135,
+     4153, 4161, 4165, 4174, 4179, 4182, 4192, 4197, 4200, 2329,
+     2268, 4203, 4206, 2258, 4215, 4224, 2133, 2131, 2089, 2005,
+     4233, 9896, 9896, 1908, 4242, 4245, 1925,   51, 1816, 4249,
+     9896, 1759, 9896, 9896, 3860, 4252, 4264,   65, 4260,   71,
+
+       92,  149, 4272,  132, 4278, 4281,  177,  194, 4284, 9896,
+     9896, 4292, 4295, 4298, 4316, 4319, 4322, 4337, 9896, 9896,
+     4345, 4348, 9896, 9896, 4357, 4363, 4366, 4369, 4375, 4387,
+     9896, 9896, 4395, 4398,  212,  244,  252,  257, 4401, 4405,
+     4409, 4413, 4423, 4427, 4431, 4435, 4445, 4449,  280,  305,
+      341, 4455,  320,  336,  355,  360, 4458, 4461,  360, 4464,
+     4471, 4485, 4488, 9896, 9896, 4496, 4504,  447,  461,  480,
+      519, 4499, 4518, 4521, 4529, 9896, 9896,  523,  551, 4538,
+     4543, 4546, 9896, 9896, 4557, 9896, 9896, 4565, 4568, 9896,
+     9896, 4578, 4583, 4586,  679, 4589, 4592, 4607, 4610, 4619,
+
+     9896, 9896,  544, 4627, 4633, 4641, 4645,  552, 4653, 4659,
+      636, 4667, 4671, 9896, 9896, 4679, 9896, 9896,  656, 4687,
+     9896, 9896, 4695,  701,  728,  747, 4699, 4702,  758, 4717,
+     4720, 9896, 9896,  759,  784,  814,  822,  816,  833,  824,
+     4728, 4732,  854, 4740, 4746, 4749,  867, 4764, 9896, 9896,
+     4773, 9896, 9896, 4781, 4784, 9896, 9896,  889, 4792, 4795,
+     4803,  883,  906, 4806, 9896, 9896, 4814, 4818, 9896, 9896,
+      935,  941,  941,  944,  954, 4826, 4832, 4840,  967, 1797,
+     1986, 9896, 4601, 4844, 9896, 9896,  982, 4852, 4855, 1008,
+     4863, 1006, 4866, 4870, 4873, 4876, 1011, 4881, 4886, 9896,
+
+     9896, 4894, 4900, 9896, 9896, 4908, 4913, 1010, 4921, 9896,
+     4926, 4929, 4940, 9896, 9896, 4948, 4951, 1010, 1010, 4954,
+     4957, 4961, 4966, 4973, 1023, 1238, 1240, 1241, 4984, 9896,
+     9896, 4992, 4995, 4998, 5001, 1317, 5004, 1315, 1339, 1329,
+     5007, 5010, 1313, 5015, 9896, 9896, 5023, 5029, 9896, 9896,
+     5037, 5042, 5045, 5048, 5055, 5067, 9896, 9896, 5075, 5079,
+     5082, 5086, 5097, 5089, 5093, 5107, 5111, 5114, 5117, 5121,
+     9896, 9896, 5135, 9896, 9896, 5143, 5147, 9896, 9896, 5165,
+     9896, 9896, 5156, 5174, 9896, 9896, 5182, 5185, 5188, 5191,
+     5194, 5209, 5214, 5217, 5220, 9896, 9896, 5228, 5235, 5240,
+
+     5246, 5250, 5254, 5258, 5277, 5280, 5284, 9896, 9896, 5299,
+     5303, 5307, 9896, 9896, 5317, 5322, 5325, 5340, 5343, 5346,
+     9896, 9896, 5354, 9896, 1365, 5361, 5364, 5367, 5375, 1408,
+     1405, 1408, 5382, 5387, 9896, 9896, 5395, 1445, 1533, 1817,
+     5400, 5403, 9896, 9896, 5414, 5418, 5421, 1422, 5432, 9896,
+     5436, 5439, 1416, 5443, 5446, 9896, 5455, 9896, 9896, 1426,
+     5465, 9896, 9896, 5473, 5476, 5484, 5487, 1501, 5491, 5494,
+     5505, 5509, 5512, 9896, 9896, 1497, 5520, 1499, 5523, 5528,
+     5531, 5541, 1498, 1503, 1593, 1595, 5547, 5550, 9896, 5553,
+     5556, 5559, 5562, 5571, 5577, 5585, 5589, 5592, 5603, 9896,
+
+     5607, 5610, 5618, 5625, 5636, 5639, 9896, 9896, 5647, 5651,
+     5659, 5665, 5668, 5671, 5683, 5677, 5691, 5700, 5703, 5711,
+     5718, 5721, 5724, 5729, 5742, 9896, 9896, 5750, 5753, 5757,
+     5762, 5776, 5784, 5787, 5790, 5810, 5813, 5816, 5819, 5822,
+     5840, 5843, 5846, 5854, 5861, 5864, 5873, 9896, 9896, 5884,
+     5888, 5891, 5902, 5907, 5910, 5913, 5928, 9896, 9896, 5936,
+     5939, 1590, 1590, 5947, 5950, 5954, 5968, 1611, 5971, 1975,
+     5974, 5977, 5992, 5995, 9896, 9896, 1598, 1596, 6003, 9896,
+     6006, 6010, 9896, 9896, 6018, 6025, 6028, 1683, 6037, 9896,
+     9896, 6045, 9896, 6048, 6051, 6054, 6069, 6072, 6075, 6083,
+
+     9896, 6090, 6093, 1697, 1705, 6096, 6102, 6110, 9896, 6114,
+     9896, 9896, 6122, 9896, 9896, 6130, 6133, 9896, 9896, 6141,
+     9896, 9896, 6149, 9896, 9896, 6157, 6160, 9896, 9896, 6168,
+     6171, 6176, 9896, 6179, 9896, 9896, 6189, 9896, 9896, 6197,
+     9896, 9896, 6207, 6210, 6213, 6221, 9896, 9896, 6216, 6234,
+     6237, 6240, 9896, 9896, 6248, 9896, 6256, 9896, 9896, 6275,
+     6278, 6286, 6289, 6299, 6304, 6312, 6317, 6320, 6330, 6335,
+     9896, 9896, 6343, 6348, 9896, 9896, 6356, 6365, 9896, 9896,
+     6376, 6379, 6387, 6394, 6405, 9896, 9896, 6413, 9896, 9896,
+     6421, 1698, 6424, 6427, 6435, 9896, 9896, 6443, 9896, 6501,
+
+     1733, 6446, 9896, 9896, 6454, 6458, 6466, 6472, 6475, 6478,
+     6486, 6505, 9896, 9896, 6493, 6496, 6539, 6547, 9896, 9896,
+     6514, 6555, 6563, 9896, 9896, 6571, 6574, 1711, 6577, 6580,
+     9896, 9896, 6588, 6591, 6594, 6597, 6600, 6606, 6618, 6624,
+     6628, 6651, 6631, 6660, 9896, 9896, 6668, 9896, 9896, 6676,
+     9896, 9896, 6684, 6689, 9896, 9896, 6697, 6702, 6705, 6708,
+     9896, 9896, 6717, 9896, 9896, 6725, 6728, 1708, 6736, 9896,
+     9896, 6744, 1803, 1993, 1875, 1804, 2051, 2035, 1960, 2028,
+     1974, 2246, 2010, 2052, 2064, 2090, 6751, 9896, 9896, 6759,
+     6763, 6766, 6774, 9896, 9896, 6782, 6785, 6788, 6797, 9896,
+
+     9896, 6805, 9896, 9896, 1719, 6813, 6816, 6819, 6822, 6825,
+     6828, 6834, 6848, 9896, 6852, 6855, 9896, 9896, 6863, 6870,
+     6873, 6876, 6881, 6884, 9896, 9896, 6895, 6899, 9896, 1857,
+     2059, 2067, 2054, 2109, 2153, 2108, 2116, 2092, 2129, 2173,
+     2155, 2123, 2023, 2181, 2199, 2214, 6902, 9896, 9896, 6913,
+     9896, 6919, 9896, 9896, 1710, 6927, 6932, 6940, 9896, 6945,
+     6948, 6959, 6963, 6971, 6977, 6985, 6989, 6992, 6996, 7010,
+     7013, 7021, 7024, 7032, 7035, 7043, 7046, 7050, 7058, 7064,
+     2238, 1987, 2121, 2250, 2231, 2168, 2244, 2212, 2215, 2270,
+     2274, 2299, 2282, 2331, 2285, 2305, 7072, 7076, 7080, 9896,
+
+     9896, 7091, 9896, 9896, 7099, 9896, 9896, 7107, 9896, 9896,
+     7115, 7118, 7126, 7129, 7137, 9896, 9896, 7145, 9896, 9896,
+     7153, 9896, 9896, 7161, 9896, 9896, 7169, 7172, 9896, 9896,
+     7181, 9896, 9896, 2300, 2316, 2332, 2348, 2349, 7189, 2346,
+     2361, 2364, 2402, 2405, 2407, 2409, 7192, 2431, 2335, 7195,
+     7198, 7217, 7221, 9896, 9896, 7229, 9896, 9896, 7237, 2180,
+     2438, 2429, 2463, 7240, 7243, 7246, 7249, 2491, 2496, 2534,
+     2474, 2499, 7252, 7271, 2497, 7277, 7300, 7340, 7290, 9896,
+     7311, 7330, 7333, 2412, 7352, 2573, 7361, 7364, 7371, 2516,
+     2489, 2551, 7374, 2590, 7386, 2580, 7398, 7421, 7461, 7411,
+
+     7451, 7454, 2367, 2605, 2494, 2622, 2644, 7473, 2514, 2581,
+     2615, 7492, 2568, 2654, 2664, 7495, 2631, 2665, 2689, 2704,
+     7432, 2709, 2714, 2725, 2763, 2758, 7500, 2712, 2492, 2801,
+     2806, 2837, 2821, 2809, 2854, 2860, 2862, 7503, 2878, 2653,
+     2899, 2902, 2895, 7514, 2755, 7522, 2920, 2829, 2921, 7533,
+     2938, 2940, 2945, 2982, 3057, 2983, 2218, 2990, 3021, 3024,
+     3088, 2681, 7537, 3053, 2859, 3095, 7541, 3099, 3120, 3125,
+     3132, 3026, 2993, 7544, 3096, 3166, 3168, 3205, 2955, 3185,
+     3173, 7548, 3230, 3210, 3202, 3238, 3308, 3310, 3118, 7563,
+     7571, 7567, 7582, 3311, 3215, 7586, 3250, 3340, 7590, 7601,
+
+     3256, 3353, 7605, 7609, 7612, 3257, 7624, 2673, 2765, 7632,
+     7644, 7620, 3301, 7652, 3374, 7655, 3029, 3397, 7659, 3410,
+     7674, 7679, 7687, 7699, 3396, 3432, 3482, 2732, 2867, 3493,
+     3583, 3594, 3613, 7707, 3436, 3328, 3433, 7719, 3117, 3207,
+     3616, 3652, 3472, 7727, 3673, 3682, 3709, 3751, 3755, 3819,
+     7738, 3375, 3408, 2757, 3450, 3532, 3655, 3691, 3745, 3823,
+     3825, 7741, 3348, 3481, 3846, 3855, 3553, 3557, 3801, 3881,
+     3497, 3887, 3888, 3890, 3908, 3910, 3962, 3998, 4019, 7746,
+     3564, 3633, 2909, 3005, 3672, 3697, 3725, 3766, 4026, 4034,
+     7761, 3752, 7769, 4066, 4090, 3030, 3521, 3818, 3972, 7772,
+
+     4094, 4099, 4017, 4025, 4032, 4048, 4103, 4121, 3937, 4100,
+     4170, 4204, 1872, 2629, 4238, 4252, 4258, 4309, 4123, 4130,
+     4102, 4257, 3490, 7776, 4172, 4211, 2670, 3281, 4310, 4333,
+     7784, 4283, 4286, 4367, 4425, 4451, 4459, 4464, 4465, 4324,
+     4360, 4022, 4218, 3776, 3894, 4221, 4523, 4545, 4553, 4473,
+     4475, 4372, 4533, 3619, 4269, 4336, 4476, 4580, 3952, 4169,
+     4604, 4607, 4456, 4621, 4597, 4614, 4675, 4689, 4696, 4734,
+     4752, 4758, 4288, 4293, 4314, 4375, 3240, 3703, 4531, 4534,
+     4632, 4695, 4760, 4820, 4296, 4462, 7795, 4644, 4690, 4888,
+     4928, 4633, 4705, 4713, 4769, 4741, 4782, 4963, 5009, 4805,
+
+     4843, 4861, 4874, 4893, 4972, 4693, 4739, 4969, 5048, 5016,
+     5022, 5102, 5114, 5120, 5122, 5043, 5128, 4799, 4873, 7799,
+     4707, 4754, 5162, 5207, 5220, 5226, 5143, 5145, 4942, 5108,
+     5254, 5288, 5150, 5255, 5274, 5333, 5341, 5352, 5042, 5054,
+     5331, 5388, 3341, 4817, 5409, 5440, 5461, 5497, 5367, 5411,
+     5214, 5445, 4842, 4914, 4887, 5002, 5442, 5479, 4141, 5123,
+     5580, 5615, 5225, 5247, 5508, 5526, 5632, 5638, 5657, 5696,
+     5714, 5727, 5729, 5730, 5265, 5295, 7807, 5408, 5463, 5597,
+     5527, 5757, 5763, 5764, 5783, 5310, 5549, 5688, 5817, 5790,
+     5810, 7810, 5612, 5616, 5820, 5840, 5852, 5864, 5627, 5915,
+
+     5833, 5924, 5863, 5927, 5709, 5777, 7814, 7818, 9896, 7821,
+     7829, 5962, 5980, 5861, 5903, 5361, 5453, 5941, 5998, 5997,
+     6015, 7833, 9896, 7840, 6025, 6039, 6060, 6081, 7843, 7848,
+     7852, 6102, 6121, 7855, 9896, 7862, 9896, 7867, 9896, 7874,
+     6177, 6184, 5562, 5577, 5908, 6048, 7877, 7881, 9896, 6062,
+     6089, 7886, 7889, 9896, 7896, 9896, 7900, 9896, 6134, 6118,
+     7908, 9896, 6225, 6147, 5907, 6099, 6227, 6228, 7911, 9896,
+     6255, 6265, 7915, 9896, 7919, 7922, 6284, 6291, 6249, 6148,
+     6277, 6185, 7930, 9896, 7934, 9896, 6237, 6266, 7941, 7944,
+     6320, 6328, 7949, 9896, 7953, 9896, 6336, 6254, 7956, 7963,
+
+     9896, 9896, 7983, 7992, 8001, 8010, 8019, 8028, 8037, 8046,
+     8055, 8064, 8073, 8082, 8091, 8100, 8109, 8118, 8127, 8136,
+     8145, 8154, 8163, 8172, 8181, 8190, 8199, 8208, 8217, 8226,
+     8235, 8244, 8253, 8262, 8271, 8278, 8285, 8292, 8299, 8306,
+     8313, 8320, 8327, 8334, 8341, 8348, 8355, 8362, 8369, 8376,
+     8383, 8390, 8399, 8404, 8409, 8414, 8419, 8424, 8429, 8434,
+     8439, 8444, 8449, 8454, 8459, 8464, 8471, 8476, 8483, 8488,
+     8495, 8500, 8507, 8512, 8521, 8527, 8534, 8542, 8549, 8557,
+     8564, 8572, 8579, 8587, 8594, 8602, 8609, 8617, 8624, 8632,
+     8640, 8647, 8655, 8662, 8670, 8677, 8685, 8692, 8700, 8707,
+
+     8715, 8722, 8730, 8737, 8745, 8752, 8760, 8767, 8775, 8784,
+     8790, 8797, 8805, 8812, 8820, 8827, 8835, 8842, 8850, 8857,
+     8865, 8872, 8880, 8887, 8895, 8903, 8910, 8918, 8926, 8934,
+     8941, 8949, 8956, 8964, 8971, 8979, 8987, 8995, 9003, 9011,
+     9018, 9026, 9033, 9041, 9050, 9059, 9067, 9075, 9082, 9090,
+     9098, 9106, 9114, 9122, 9129, 9137, 9144, 9152, 9159, 9167,
+     9175, 9182, 9190, 9198, 9206, 9214, 9222, 9229, 9237, 9244,
+     9252, 9259, 9267, 9274, 9282, 9290, 9298, 9305, 9313, 9322,
+     9331, 9338, 9346, 9353, 9361, 9369, 9377, 9385, 9393, 9401,
+     9408, 9416, 9424, 9432, 9440, 9447, 9455, 9462, 9470, 9477,
+
+     9485, 9493, 9501, 9508, 9516, 9523, 9531, 9538, 9546, 9553,
+     9561, 9568, 9576, 9585, 9594, 9601, 9609, 9616, 9624, 9632,
+     9639, 9647, 9655, 9662, 9670, 9677, 9685, 9693, 9700, 9708,
+     9716, 9724, 9732, 9740, 9748, 9756, 9764, 9772, 9780, 9788,
+     9796, 9804, 9812, 9819, 9827, 9836, 9845, 9853, 9860, 9868,
+     9877, 9886
+    } ;
+
+static yyconst short int yy_def[3053] =
+    {   0,