1
// $Id: scroller_factory.cxx,v 1.10 2002/09/28 19:31:06 torangan Exp $
3
// Pingus - A free Lemmings clone
4
// Copyright (C) 2000 Ingo Ruhnke <grumbel@gmx.de>
6
// This program is free software; you can redistribute it and/or
7
// modify it under the terms of the GNU General Public License
8
// as published by the Free Software Foundation; either version 2
9
// of the License, or (at your option) any later version.
11
// This program is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
// GNU General Public License for more details.
16
// You should have received a copy of the GNU General Public License
17
// along with this program; if not, write to the Free Software
18
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
#include "../xml_helper.hxx"
22
#include "../pingus_error.hxx"
24
#include "axis_factory.hxx"
26
#include "button_factory.hxx"
27
#include "pointer.hxx"
28
#include "pointer_factory.hxx"
29
#include "scroller_factory.hxx"
30
#include "scrollers/axis_scroller.hxx"
31
#include "scrollers/inverted_scroller.hxx"
32
#include "scrollers/joystick_scroller.hxx"
33
#include "scrollers/mouse_scroller.hxx"
34
#include "scrollers/multiple_scroller.hxx"
35
#include "scrollers/pointer_scroller.hxx"
40
using namespace Scrollers;
43
ScrollerFactory::create(xmlNodePtr cur)
46
PingusError::raise("ScrollerFactory called without an element");
48
if (XMLhelper::equal_str(cur->name, "axis-scroller"))
49
return axis_scroller(cur);
51
else if (XMLhelper::equal_str(cur->name, "inverted-scroller"))
52
return inverted_scroller(cur);
54
else if (XMLhelper::equal_str(cur->name, "joystick-scroller"))
55
return joystick_scroller(cur);
57
else if (XMLhelper::equal_str(cur->name, "mouse-scroller"))
58
return mouse_scroller(cur);
60
else if (XMLhelper::equal_str(cur->name, "multiple-scroller"))
61
return multiple_scroller(cur->children);
63
else if (XMLhelper::equal_str(cur->name, "pointer-scroller"))
64
return pointer_scroller(XMLhelper::skip_blank(cur->children));
67
PingusError::raise(std::string("Unknown scroller type: ") + ((cur->name) ? reinterpret_cast<const char*>(cur->name) : ""));
69
return 0; // never reached
73
ScrollerFactory::axis_scroller (xmlNodePtr cur)
76
if (!XMLhelper::get_prop(cur, "speed", speed))
77
PingusError::raise("AxisScroller without speed parameter");
79
std::vector<Axis*> axes;
84
if (xmlIsBlankNode(cur))
90
axes.push_back(AxisFactory::create(cur));
94
return new AxisScroller(axes, speed);
98
ScrollerFactory::inverted_scroller (xmlNodePtr cur)
101
if (!XMLhelper::get_prop(cur, "invert-x", invert_x))
102
PingusError::raise("InvertedScroller without invert X parameter");
105
if (!XMLhelper::get_prop(cur, "invert-y", invert_y))
106
PingusError::raise("InvertedScroller without invert Y parameter");
109
cur = XMLhelper::skip_blank(cur->children);
110
scroller = create(cur);
112
return new InvertedScroller(scroller, invert_x, invert_y);
116
ScrollerFactory::joystick_scroller (xmlNodePtr cur)
119
if (!XMLhelper::get_prop(cur, "id", id))
120
PingusError::raise("JoystickScroller without id parameter");
123
if (!XMLhelper::get_prop(cur, "speed", speed))
124
PingusError::raise("JoystickScroller without speed parameter");
126
return new JoystickScroller(id, speed);
130
ScrollerFactory::mouse_scroller (xmlNodePtr)
132
return new MouseScroller;
136
ScrollerFactory::multiple_scroller (xmlNodePtr cur)
138
std::vector<Scroller*> scrollers;
142
if (xmlIsBlankNode(cur))
145
scrollers.push_back(create(cur));
149
return new MultipleScroller(scrollers);
153
ScrollerFactory::pointer_scroller (xmlNodePtr cur)
158
pointer = PointerFactory::create(cur);
160
cur = XMLhelper::skip_blank(cur->next);
161
button = ButtonFactory::create(cur);
163
return new PointerScroller(pointer, button);