zoomedit: Use toolbox for polygon adder.

This commit is contained in:
neoraider 2007-12-05 18:34:01 +00:00
parent d389dce3ef
commit 19690f0304
12 changed files with 193 additions and 80 deletions

View file

@ -41,23 +41,30 @@ EditManager::EditManager(Window *window) {
} }
void EditManager::addRoom() { void EditManager::addRoom() {
newRoom = Room(idManager.generate("room")); if(mode == VIEW) {
mode = ADD; newRoom = Room(idManager.generate("room"));
mode = ADD;
activeRoom = &newRoom; activeRoom = &newRoom;
window->update(); window->update();
}
} }
void EditManager::finishRoom() { void EditManager::finishRoom() {
mode = VIEW; if(mode == ADD) {
mode = VIEW;
if(newRoom.size() > 2 && polygonOk(newRoom)) { if(newRoom.size() > 2 && polygonOk(newRoom)) {
window->getLevel().push_back(newRoom); window->getLevel().push_back(newRoom);
activeRoom = &window->getLevel().back(); activeRoom = &window->getLevel().back();
}
else {
activeRoom = NULL;
}
window->update();
} }
window->update();
} }
void EditManager::addVertex(const Vertex &v) { void EditManager::addVertex(const Vertex &v) {

View file

@ -4,6 +4,6 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
IdManager.cpp WindowManager.cpp SidebarManager.cpp \ IdManager.cpp WindowManager.cpp SidebarManager.cpp \
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \ Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \ EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolAddPolygon.cpp ToolSelector.cpp ToolAddPolygon.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@ zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@ zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@

View file

@ -59,6 +59,7 @@ am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
zoomedit-Drawer.$(OBJEXT) zoomedit-EditManager.$(OBJEXT) \ zoomedit-Drawer.$(OBJEXT) zoomedit-EditManager.$(OBJEXT) \
zoomedit-FileManager.$(OBJEXT) \ zoomedit-FileManager.$(OBJEXT) \
zoomedit-SidebarToolbox.$(OBJEXT) \ zoomedit-SidebarToolbox.$(OBJEXT) \
zoomedit-ToolSelector.$(OBJEXT) \
zoomedit-ToolAddPolygon.$(OBJEXT) zoomedit-ToolAddPolygon.$(OBJEXT)
zoomedit_OBJECTS = $(am_zoomedit_OBJECTS) zoomedit_OBJECTS = $(am_zoomedit_OBJECTS)
zoomedit_DEPENDENCIES = zoomedit_DEPENDENCIES =
@ -186,7 +187,7 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
IdManager.cpp WindowManager.cpp SidebarManager.cpp \ IdManager.cpp WindowManager.cpp SidebarManager.cpp \
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \ Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \ EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolAddPolygon.cpp ToolSelector.cpp ToolAddPolygon.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@ zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@ zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@
@ -292,6 +293,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarView.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolAddPolygon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolAddPolygon.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolSelector.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Triangle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Triangle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-UIManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-UIManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Vertex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Vertex.Po@am__quote@
@ -579,6 +581,20 @@ zoomedit-SidebarToolbox.obj: SidebarToolbox.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-SidebarToolbox.obj `if test -f 'SidebarToolbox.cpp'; then $(CYGPATH_W) 'SidebarToolbox.cpp'; else $(CYGPATH_W) '$(srcdir)/SidebarToolbox.cpp'; fi` @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-SidebarToolbox.obj `if test -f 'SidebarToolbox.cpp'; then $(CYGPATH_W) 'SidebarToolbox.cpp'; else $(CYGPATH_W) '$(srcdir)/SidebarToolbox.cpp'; fi`
zoomedit-ToolSelector.o: ToolSelector.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolSelector.o -MD -MP -MF $(DEPDIR)/zoomedit-ToolSelector.Tpo -c -o zoomedit-ToolSelector.o `test -f 'ToolSelector.cpp' || echo '$(srcdir)/'`ToolSelector.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolSelector.Tpo $(DEPDIR)/zoomedit-ToolSelector.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ToolSelector.cpp' object='zoomedit-ToolSelector.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolSelector.o `test -f 'ToolSelector.cpp' || echo '$(srcdir)/'`ToolSelector.cpp
zoomedit-ToolSelector.obj: ToolSelector.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolSelector.obj -MD -MP -MF $(DEPDIR)/zoomedit-ToolSelector.Tpo -c -o zoomedit-ToolSelector.obj `if test -f 'ToolSelector.cpp'; then $(CYGPATH_W) 'ToolSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolSelector.cpp'; fi`
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolSelector.Tpo $(DEPDIR)/zoomedit-ToolSelector.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ToolSelector.cpp' object='zoomedit-ToolSelector.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolSelector.obj `if test -f 'ToolSelector.cpp'; then $(CYGPATH_W) 'ToolSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolSelector.cpp'; fi`
zoomedit-ToolAddPolygon.o: ToolAddPolygon.cpp zoomedit-ToolAddPolygon.o: ToolAddPolygon.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolAddPolygon.o -MD -MP -MF $(DEPDIR)/zoomedit-ToolAddPolygon.Tpo -c -o zoomedit-ToolAddPolygon.o `test -f 'ToolAddPolygon.cpp' || echo '$(srcdir)/'`ToolAddPolygon.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolAddPolygon.o -MD -MP -MF $(DEPDIR)/zoomedit-ToolAddPolygon.Tpo -c -o zoomedit-ToolAddPolygon.o `test -f 'ToolAddPolygon.cpp' || echo '$(srcdir)/'`ToolAddPolygon.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolAddPolygon.Tpo $(DEPDIR)/zoomedit-ToolAddPolygon.Po @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolAddPolygon.Tpo $(DEPDIR)/zoomedit-ToolAddPolygon.Po

View file

@ -2,7 +2,7 @@
SidebarManager::SidebarManager(EditManager *editor) SidebarManager::SidebarManager(EditManager *editor)
: sidebarView(editor), sidebarAdd(editor), tool(editor) : sidebarToolbox(editor), sidebarView(editor), sidebarAdd(editor), toolAddPolygon(editor)
{ {
this->editor = editor; this->editor = editor;
activeSidebar = NULL; activeSidebar = NULL;
@ -21,7 +21,7 @@ SidebarManager::SidebarManager(EditManager *editor)
gtk_container_add(GTK_CONTAINER(scrolledWindow), viewport); gtk_container_add(GTK_CONTAINER(scrolledWindow), viewport);
gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE); gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
sidebarToolbox.addTool(&tool); sidebarToolbox.addTool(&toolAddPolygon);
gtk_widget_show(sidebar); gtk_widget_show(sidebar);
} }

View file

@ -7,6 +7,7 @@
#include "SidebarView.h" #include "SidebarView.h"
#include "SidebarAdd.h" #include "SidebarAdd.h"
#include "EditManager.h" #include "EditManager.h"
#include "ToolSelector.h"
#include "ToolAddPolygon.h" #include "ToolAddPolygon.h"
@ -23,7 +24,7 @@ class SidebarManager {
EditManager *editor; EditManager *editor;
ToolAddPolygon tool; ToolAddPolygon toolAddPolygon;
// prevent shallow copy // prevent shallow copy
SidebarManager(const SidebarManager &w); SidebarManager(const SidebarManager &w);

View file

@ -1,73 +1,27 @@
#include "SidebarToolbox.h" #include "SidebarToolbox.h"
void SidebarToolbox::toolAction(GtkWidget *button, Tool *tool) { void SidebarToolbox::buttonToggled(GtkWidget *button, SidebarToolbox *toolbox) {
tool->action(); if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
return;
toolbox->activateTool(toolbox->buttonsRev[button]);
} }
void SidebarToolbox::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation, SidebarToolbox *toolbox) { void SidebarToolbox::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation, SidebarToolbox *toolbox) {
toolbox->updateRows(false); toolbox->updateRows(false);
} }
SidebarToolbox::SidebarToolbox() {
cols = 1; rows = 0;
widget = gtk_table_new(1, 1, TRUE);
g_object_ref_sink(G_OBJECT(widget));
g_signal_connect(G_OBJECT(widget), "size-allocate", G_CALLBACK(sizeAllocate), this);
gtk_widget_show(widget);
}
SidebarToolbox::~SidebarToolbox() {
for(std::map<Tool*, GtkWidget*>::iterator button = buttons.begin(); button != buttons.end(); button++) {
g_object_unref(G_OBJECT(button->second));
}
g_object_unref(G_OBJECT(widget));
}
void SidebarToolbox::addTool(Tool *tool) {
tools.push_back(tool);
GtkWidget *button = gtk_button_new();
g_object_ref_sink(G_OBJECT(button));
gtk_button_set_image(GTK_BUTTON(button), tool->getImage());
gtk_widget_show(button);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toolAction), tool);
buttons.insert(std::pair<Tool*, GtkWidget*>(tool, button));
updateRows(true);
update();
}
void SidebarToolbox::removeTool(Tool *tool) {
tools.remove(tool);
g_object_unref(G_OBJECT(buttons[tool]));
buttons.erase(tool);
updateRows(true);
}
void SidebarToolbox::updateRows(bool changed) { void SidebarToolbox::updateRows(bool changed) {
int cols, rows; GtkRequisition requisition;
GtkRequisition requisition = {0, 0};
if(tools.empty()) { gtk_widget_size_request(buttons[tools.front()], &requisition);
cols = 1; rows = 0;
}
else {
gtk_widget_size_request(buttons[tools.front()], &requisition);
cols = MAX(1, widget->allocation.width/requisition.width); int cols = MAX(1, widget->allocation.width/requisition.width);
rows = (tools.size()+cols-1)/cols; int rows = (tools.size()+cols-1)/cols;
}
if(this->cols != cols || this->rows != rows || changed) { if(changed || this->cols != cols || this->rows != rows) {
this->cols = cols; this->cols = cols;
this->rows = rows; this->rows = rows;
@ -93,6 +47,74 @@ void SidebarToolbox::updateRows(bool changed) {
} }
} }
void SidebarToolbox::activateTool(Tool *tool) {
if(activeTool == tool)
return;
if(activeTool)
activeTool->deactivate();
activeTool = tool;
tool->activate();
}
SidebarToolbox::SidebarToolbox(EditManager *editManager) : toolSelector(editManager) {
widget = gtk_table_new(1, 1, TRUE);
g_object_ref_sink(G_OBJECT(widget));
g_signal_connect(G_OBJECT(widget), "size-allocate", G_CALLBACK(sizeAllocate), this);
addTool(&toolSelector);
activeTool = NULL;
activateTool(&toolSelector);
gtk_widget_show(widget);
}
SidebarToolbox::~SidebarToolbox() {
for(std::map<Tool*, GtkWidget*>::iterator button = buttons.begin(); button != buttons.end(); button++) {
g_object_unref(G_OBJECT(button->second));
}
g_object_unref(G_OBJECT(widget));
}
void SidebarToolbox::addTool(Tool *tool) {
GtkWidget *button;
if(tools.empty())
button = gtk_radio_button_new(NULL);
else
button = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(buttons[tools.front()]));
g_object_ref_sink(G_OBJECT(button));
gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE);
gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
gtk_button_set_image(GTK_BUTTON(button), tool->getImage());
gtk_widget_show(button);
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(buttonToggled), this);
tools.push_back(tool);
buttons.insert(std::pair<Tool*, GtkWidget*>(tool, button));
buttonsRev.insert(std::pair<GtkWidget*, Tool*>(button, tool));
updateRows(true);
update();
}
void SidebarToolbox::removeTool(Tool *tool) {
if(tool == activeTool) {
activateTool(&toolSelector);
}
tools.remove(tool);
buttonsRev.erase(buttons[tool]);
g_object_unref(G_OBJECT(buttons[tool]));
buttons.erase(tool);
updateRows(true);
}
void SidebarToolbox::update() { void SidebarToolbox::update() {
for(std::list<Tool*>::iterator tool = tools.begin(); tool != tools.end(); tool++) { for(std::list<Tool*>::iterator tool = tools.begin(); tool != tools.end(); tool++) {
gtk_widget_set_tooltip_text(buttons[*tool], (*tool)->getName()); gtk_widget_set_tooltip_text(buttons[*tool], (*tool)->getName());

View file

@ -7,6 +7,7 @@
#include "EditManager.h" #include "EditManager.h"
#include "Sidebar.h" #include "Sidebar.h"
#include "Tool.h" #include "Tool.h"
#include "ToolSelector.h"
class SidebarToolbox : Sidebar { class SidebarToolbox : Sidebar {
private: private:
@ -14,20 +15,26 @@ class SidebarToolbox : Sidebar {
std::list<Tool*> tools; std::list<Tool*> tools;
std::map<Tool*, GtkWidget*> buttons; std::map<Tool*, GtkWidget*> buttons;
std::map<GtkWidget*, Tool*> buttonsRev;
Tool *activeTool;
ToolSelector toolSelector;
int cols, rows; int cols, rows;
void updateRows(bool changed); void updateRows(bool changed);
void activateTool(Tool *tool);
// prevent shallow copy // prevent shallow copy
SidebarToolbox(const SidebarToolbox &w); SidebarToolbox(const SidebarToolbox &w);
const SidebarToolbox& operator=(const SidebarToolbox &w); const SidebarToolbox& operator=(const SidebarToolbox &w);
static void toolAction(GtkWidget *button, Tool *tool); static void buttonToggled(GtkWidget *button, SidebarToolbox *toolbox);
static void sizeAllocate(GtkWidget *widget, GtkAllocation *allocation, SidebarToolbox *toolbox); static void sizeAllocate(GtkWidget *widget, GtkAllocation *allocation, SidebarToolbox *toolbox);
public: public:
SidebarToolbox(); SidebarToolbox(EditManager *editManager);
virtual ~SidebarToolbox(); virtual ~SidebarToolbox();
GtkWidget* getWidget() { GtkWidget* getWidget() {

3
Tool.h
View file

@ -8,7 +8,8 @@ class Tool {
public: public:
virtual ~Tool() {} virtual ~Tool() {}
virtual void action() = 0; virtual void activate() {};
virtual void deactivate() {};
virtual const gchar *getName() = 0; virtual const gchar *getName() = 0;
virtual GtkWidget *getImage() = 0; virtual GtkWidget *getImage() = 0;

View file

@ -15,10 +15,14 @@ ToolAddPolygon::~ToolAddPolygon() {
g_object_unref(G_OBJECT(image)); g_object_unref(G_OBJECT(image));
} }
void ToolAddPolygon::action() { void ToolAddPolygon::activate() {
editManager->addRoom(); editManager->addRoom();
} }
void ToolAddPolygon::deactivate() {
editManager->finishRoom();
}
GtkWidget *ToolAddPolygon::getImage() { GtkWidget *ToolAddPolygon::getImage() {
return image; return image;
} }

View file

@ -20,14 +20,15 @@ class ToolAddPolygon : public Tool {
ToolAddPolygon(EditManager *editManager); ToolAddPolygon(EditManager *editManager);
virtual ~ToolAddPolygon(); virtual ~ToolAddPolygon();
virtual void action(); virtual void activate();
virtual void deactivate();
virtual const gchar *getName() { virtual const gchar *getName() {
return name; return name;
} }
bool isSensitive() { bool isSensitive() {
return (editManager->getMode() != EditManager::ADD); return TRUE;
} }
virtual GtkWidget *getImage(); virtual GtkWidget *getImage();

20
ToolSelector.cpp Normal file
View file

@ -0,0 +1,20 @@
#include "ToolSelector.h"
const gchar *ToolSelector::name = (const gchar*)"Select";
ToolSelector::ToolSelector(EditManager *editManager) {
this->editManager = editManager;
image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON);
g_object_ref_sink(G_OBJECT(image));
}
ToolSelector::~ToolSelector() {
g_object_unref(G_OBJECT(image));
}
GtkWidget *ToolSelector::getImage() {
return image;
}

34
ToolSelector.h Normal file
View file

@ -0,0 +1,34 @@
#ifndef TOOLSELECTOR_H_
#define TOOLSELECTOR_H_
#include "Tool.h"
#include "EditManager.h"
class ToolSelector : public Tool {
private:
GtkWidget *image;
EditManager *editManager;
static const gchar* name;
// prevent shallow copy
ToolSelector(const ToolSelector &t);
const ToolSelector& operator=(const ToolSelector &t);
public:
ToolSelector(EditManager *editManager);
virtual ~ToolSelector();
virtual const gchar *getName() {
return name;
}
bool isSensitive() {
return TRUE;
}
virtual GtkWidget *getImage();
};
#endif /*TOOLSELECTOR_H_*/