You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
4.2 KiB
212 lines
4.2 KiB
#include "AbstractItem.h" |
|
|
|
AbstractItem::AbstractItem(string id, ActionHandler* handler, ActionType action, GtkWidget* menuitem) |
|
: action(action), |
|
id(id), |
|
handler(handler) |
|
{ |
|
XOJ_INIT_TYPE(AbstractItem); |
|
|
|
ActionEnabledListener::registerListener(handler); |
|
ActionSelectionListener::registerListener(handler); |
|
|
|
if (menuitem) |
|
{ |
|
setMenuItem(menuitem); |
|
} |
|
} |
|
|
|
AbstractItem::~AbstractItem() |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
if (this->menuitem) |
|
{ |
|
g_signal_handler_disconnect(this->menuitem, menuSignalHandler); |
|
g_object_unref(G_OBJECT(this->menuitem)); |
|
} |
|
|
|
XOJ_RELEASE_TYPE(AbstractItem); |
|
} |
|
|
|
/** |
|
* Register a menu item. If there is already one registered, the new one will be ignored |
|
*/ |
|
void AbstractItem::setMenuItem(GtkWidget* menuitem) |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
if (this->menuitem != NULL) |
|
{ |
|
g_warning("The menu item %i / %s has already a menu item registered!", action, ActionType_toString(action).c_str()); |
|
return; |
|
} |
|
|
|
menuSignalHandler = g_signal_connect(menuitem, "activate", G_CALLBACK( |
|
+[](GtkMenuItem* menuitem, AbstractItem* self) |
|
{ |
|
XOJ_CHECK_TYPE_OBJ(self, AbstractItem); |
|
self->activated(NULL, menuitem, NULL); |
|
}), this); |
|
|
|
g_object_ref(G_OBJECT(menuitem)); |
|
this->menuitem = menuitem; |
|
|
|
if (GTK_IS_CHECK_MENU_ITEM(menuitem)) |
|
{ |
|
checkMenuItem = !gtk_check_menu_item_get_draw_as_radio(GTK_CHECK_MENU_ITEM(menuitem)); |
|
} |
|
} |
|
|
|
void AbstractItem::actionSelected(ActionGroup group, ActionType action) |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
if (this->group != group) |
|
{ |
|
return; |
|
} |
|
|
|
itemActive = this->action == action; |
|
|
|
if (this->menuitem && GTK_IS_CHECK_MENU_ITEM(this->menuitem)) |
|
{ |
|
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(this->menuitem)) != itemActive) |
|
{ |
|
if (checkMenuItem) |
|
{ |
|
ignoreNextCheckMenuEvent = true; |
|
} |
|
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(this->menuitem), itemActive); |
|
} |
|
} |
|
selected(group, action); |
|
} |
|
|
|
/** |
|
* Override this method |
|
*/ |
|
void AbstractItem::selected(ActionGroup group, ActionType action) |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
} |
|
|
|
void AbstractItem::actionEnabledAction(ActionType action, bool enabled) |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
if (this->action != action) |
|
{ |
|
return; |
|
} |
|
|
|
this->enabled = enabled; |
|
enable(enabled); |
|
if (this->menuitem) |
|
{ |
|
gtk_widget_set_sensitive(GTK_WIDGET(this->menuitem), enabled); |
|
} |
|
} |
|
|
|
void AbstractItem::activated(GdkEvent* event, GtkMenuItem* menuitem, GtkToolButton* toolbutton) |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
bool selected = true; |
|
|
|
if (menuitem) |
|
{ |
|
if (GTK_IS_CHECK_MENU_ITEM(menuitem)) |
|
{ |
|
selected = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); |
|
|
|
if (gtk_check_menu_item_get_draw_as_radio(GTK_CHECK_MENU_ITEM(menuitem))) |
|
{ |
|
if (itemActive && !selected) |
|
{ |
|
// Unselect radio menu item, select again |
|
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(this->menuitem), true); |
|
return; |
|
} |
|
|
|
if (itemActive == selected) |
|
{ |
|
// State not changed, this event is probably from GTK generated |
|
return; |
|
} |
|
|
|
if (!selected) |
|
{ |
|
// Unselect radio menu item |
|
return; |
|
} |
|
} |
|
} |
|
} |
|
else if (toolbutton && GTK_IS_TOGGLE_TOOL_BUTTON(toolbutton)) |
|
{ |
|
selected = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(toolbutton)); |
|
} |
|
|
|
if (checkMenuItem && ignoreNextCheckMenuEvent) |
|
{ |
|
ignoreNextCheckMenuEvent = false; |
|
return; |
|
} |
|
|
|
actionPerformed(action, group, event, menuitem, toolbutton, selected); |
|
} |
|
|
|
void AbstractItem::actionPerformed(ActionType action, ActionGroup group, |
|
GdkEvent* event, GtkMenuItem* menuitem, |
|
GtkToolButton* toolbutton, bool selected) |
|
{ |
|
handler->actionPerformed(action, group, event, menuitem, toolbutton, selected); |
|
} |
|
|
|
string AbstractItem::getId() |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
return id; |
|
} |
|
|
|
void AbstractItem::setTmpDisabled(bool disabled) |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
bool ena = false; |
|
if (disabled) |
|
{ |
|
ena = false; |
|
} |
|
else |
|
{ |
|
ena = this->enabled; |
|
} |
|
|
|
enable(ena); |
|
if (this->menuitem) |
|
{ |
|
gtk_widget_set_sensitive(GTK_WIDGET(this->menuitem), ena); |
|
} |
|
} |
|
|
|
void AbstractItem::enable(bool enabled) |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
} |
|
|
|
bool AbstractItem::isEnabled() |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
return this->enabled; |
|
} |
|
|
|
ActionType AbstractItem::getActionType() |
|
{ |
|
XOJ_CHECK_TYPE(AbstractItem); |
|
|
|
return this->action; |
|
}
|
|
|