/*	WebDownloader for X-Window
 *	Copyright (C) 1999-2002 Koshelev Maxim
 *	This Program is free but not GPL!!! You can't modify it
 *	without agreement with author. You can't distribute modified
 *	program but you can distribute unmodified program.
 *
 *	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.
 */

#include <gtk/gtk.h>
#include "themes.h"
#include "list.h"
#include "saveload.h"
#include "addd.h"
#include "prefs.h"
#include "buttons.h"
#include "about.h"
#include "misc.h"
#include "colors.h"
#include "dndtrash.h"
#include "lod.h"
#include "../var.h"
#include "../savelog.h"
#include "../ntlocale.h"
#include "../config.h"
#include "../xml.h"
#include <gdk-pixbuf/gdk-pixbuf.h>



enum BUTTONS_BITS{
	BBIT_ADD = 1,
	BBIT_ADD_CLIPBOARD = 1<<1,
	BBIT_DEL = 1<<2,
	BBIT_STOP = 1<<3,
	BBIT_CONTINUE = 1<<4,
	BBIT_DEL_COMPLETED = 1<<5,
	BBIT_UP = 1<<6,
	BBIT_DOWN = 1<<7,
	BBIT_LOG = 1<<8,
	BBIT_SPEED1 = 1<<9,
	BBIT_SPEED2 = 1<<10,
	BBIT_SPEED3 = 1<<11,
	BBIT_OPTIONS = 1<<12,
	BBIT_DEL_ALL = 1<<13,
	BBIT_SAVE = 1<<14,
	BBIT_LOAD = 1<<15,
	BBIT_DND_TRASH = 1<<16
};

char *BUTTONS_TEXT[]={
	N_(" Add new download "),
	N_(" Paste from clipboard "),
	N_(" Del downloads "),
	N_(" Stop downloads "),
	N_(" Continue/restart downloads "),
	N_(" Del Completed downloads "),
	N_(" Move up "),
	N_(" Move down "),
	N_(" View log "),
	N_(" Speed level one "),
	N_(" Speed level two "),
	N_(" Unlimited speed "),
	N_(" Options "),
	N_(" Delete all downloads "),
	N_(" Save list "),
	N_(" Load list "),
	N_(" DnD basket "),
	N_(" Switch percentage mode to"),
	N_(" Configure buttons ")
};

GtkWidget *ButtonsBar;
GtkWidget *buttons_array[BUTTON_LAST];
GtkWidget *pixmaps_array[BUTTON_LAST];
GdkPixmap *progress_pixmap[3]={NULL,NULL,NULL};
GdkBitmap *progress_bitmap[3]={NULL,NULL,NULL};
GdkPixbuf *progress_pixbuf[3]={NULL,NULL,NULL};

d4x::Theme::SlaveImage *D4X_PROGRESS_MODE_BUTTON;

GtkWidget *BConfigWindow=(GtkWidget *)NULL;
GtkWidget *BConfigButtons[BUTTON_LAST];


tConfirmedDialog *AskDeleteAll=(tConfirmedDialog *)NULL;

void buttons_pixmaps_init(){
	
};

void buttons_configure_close(){
	if (BConfigWindow)
		gtk_widget_destroy(BConfigWindow);
	BConfigWindow=(GtkWidget *)NULL;
};

void buttons_cfg_init(){
	int none_visible=1;
	for (int i=0;i<BUTTON_CONFIGURE;i++){
		if (CFG.BUTTONS_FLAGS & (1<<i)){
			none_visible=0;
			gtk_widget_show(buttons_array[i]);
		}else{
			gtk_widget_hide(buttons_array[i]);
		};
	};
	if (none_visible){
		gtk_widget_hide(ButtonsBar);
	}else{
		gtk_widget_show(ButtonsBar);
	};
};

void buttons_configure_apply(){
	int old_flags=CFG.BUTTONS_FLAGS;
	CFG.BUTTONS_FLAGS=0x0FFFFFF;
	for (int i=0;i<BUTTON_CONFIGURE;i++){
		if (!(GTK_TOGGLE_BUTTON(BConfigButtons[i])->active)){
			CFG.BUTTONS_FLAGS^=(1<<i);
		};
	};
	buttons_cfg_init();
	if (old_flags!=CFG.BUTTONS_FLAGS)
		save_config();
};

void buttons_configure_ok(){
	buttons_configure_apply();
	buttons_configure_close();
};

void buttons_configure(){
	/* configure ALL buttons here */
	if (BConfigWindow) {
		gdk_window_show(BConfigWindow->window);
		return;
	};
	GtkWidget *vbox=gtk_vbox_new(FALSE,0);
	for (int i=BUTTON_ADD;i<BUTTON_CONFIGURE;i++){
		BConfigButtons[i]=gtk_check_button_new_with_label(_(BUTTONS_TEXT[i]));
		gtk_box_pack_start(GTK_BOX(vbox),
				   BConfigButtons[i],
				   FALSE,FALSE,0);
		GTK_TOGGLE_BUTTON(BConfigButtons[i])->active= (CFG.BUTTONS_FLAGS & (1<<i)?TRUE:FALSE);
			
	};
	BConfigWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_wmclass(GTK_WINDOW(BConfigWindow),
			       "D4X_Buttons","D4X");
	gtk_window_set_title(GTK_WINDOW (BConfigWindow),
			     _(BUTTONS_TEXT[BUTTON_CONFIGURE]));
	gtk_window_set_position(GTK_WINDOW(BConfigWindow),
				GTK_WIN_POS_CENTER);
	gtk_window_set_resizable(GTK_WINDOW(BConfigWindow), FALSE);
	gtk_widget_set_size_request(BConfigWindow,-1,400);
	gtk_container_set_border_width(GTK_CONTAINER(BConfigWindow),5);

	GtkWidget *scroll_window=gtk_scrolled_window_new((GtkAdjustment *)NULL,
							 (GtkAdjustment *)NULL);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window),
	                                GTK_POLICY_AUTOMATIC,
					GTK_POLICY_AUTOMATIC);
	GtkWidget *viewport=gtk_viewport_new((GtkAdjustment *)NULL,
					     (GtkAdjustment *)NULL);
	gtk_container_add(GTK_CONTAINER(viewport),vbox);
	gtk_container_add(GTK_CONTAINER(scroll_window),viewport);

	vbox=gtk_vbox_new(FALSE,0);
	gtk_box_pack_start(GTK_BOX(vbox),scroll_window,TRUE,TRUE,0);

	GtkWidget *hbox=gtk_hbutton_box_new();
	gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0);
	GtkWidget *ok_button=gtk_button_new_from_stock(GTK_STOCK_OK);
	GtkWidget *apply_button=gtk_button_new_from_stock(GTK_STOCK_APPLY);
	GtkWidget *cancel_button=gtk_button_new_from_stock(GTK_STOCK_CANCEL);
	GTK_WIDGET_SET_FLAGS(ok_button,GTK_CAN_DEFAULT);
	GTK_WIDGET_SET_FLAGS(apply_button,GTK_CAN_DEFAULT);
	GTK_WIDGET_SET_FLAGS(cancel_button,GTK_CAN_DEFAULT);
	gtk_box_pack_end(GTK_BOX(hbox),ok_button,FALSE,FALSE,0);
	gtk_box_pack_end(GTK_BOX(hbox),apply_button,FALSE,FALSE,0);
	gtk_box_pack_end(GTK_BOX(hbox),cancel_button,FALSE,FALSE,0);
	g_signal_connect(G_OBJECT(cancel_button),
			   "clicked",
			   G_CALLBACK(buttons_configure_close), NULL);
	g_signal_connect(G_OBJECT(ok_button),
			   "clicked",
			   G_CALLBACK(buttons_configure_ok), NULL);
	g_signal_connect(G_OBJECT(apply_button),
			   "clicked",
			   G_CALLBACK(buttons_configure_apply), NULL);

	gtk_container_add(GTK_CONTAINER(BConfigWindow),vbox);
	gtk_window_set_default(GTK_WINDOW(BConfigWindow),cancel_button);
	g_signal_connect(G_OBJECT(BConfigWindow),
			   "delete_event",
			   G_CALLBACK(buttons_configure_close), NULL);
	d4x_eschandler_init(BConfigWindow,NULL);
	gtk_widget_show_all(BConfigWindow);
};

GtkWidget *new_pixmap(char **xpm, char *themename) {
	char *path=sum_strings("buttonsbar ",themename,">file",NULL);
	GtkWidget *rval=gtk_image_new_from_pixbuf(pixbuf_from_theme(path,(const char**)xpm));
	delete[] path;
	return (rval);
};

GtkWidget *new_pixmap_mon(char **xpm, const std::string &themename) {
	d4x::Theme::Image *img=new d4x::Theme::Image(xpm,std::string("buttonsbar ")+themename+">file");
	d4x::CUR_THEME->monitor(img);
	return (GTK_WIDGET(img->img));
};

void del_all_downloads(){
	_aa_.del_all();
	if (AskDeleteAll)
		AskDeleteAll->done();
};

static void _ask_delete_all_check_(GtkWidget *widget, tConfirmedDialog *parent){
	CFG.CONFIRM_DELETE_ALL=!(GTK_TOGGLE_BUTTON(parent->check)->active);
	del_all_downloads();
};

void ask_delete_all(...) {
	if (!AskDeleteAll) AskDeleteAll=new tConfirmedDialog;
	if (CFG.CONFIRM_DELETE_ALL){
		if (AskDeleteAll->init(_("Delete ALL downloads?"),_("Delete all?")))
			g_signal_connect(G_OBJECT(AskDeleteAll->ok_button),
					   "clicked",
					   G_CALLBACK(_ask_delete_all_check_),
					   AskDeleteAll);
	}else
		del_all_downloads();
};

void buttons_speed_set_text(){
	char text[MAX_LEN];
	sprintf(text,"%s (%i B/s)",_(" Speed level one "),CFG.SPEED_LIMIT_1);
	gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(buttons_array[BUTTON_SPEED1]),
				  GTK_TOOLBAR(ButtonsBar)->tooltips,text,NULL);
	sprintf(text,"%s (%i B/s)",_(" Speed level two "),CFG.SPEED_LIMIT_2);
	gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(buttons_array[BUTTON_SPEED2]),
				  GTK_TOOLBAR(ButtonsBar)->tooltips,text,NULL);
};


void set_speed_buttons() {
	if (CFG.WITHOUT_FACE) return;
	switch (CFG.SPEED_LIMIT) {
	case 1:	{
		gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_SPEED1]),TRUE);
		break;
	};
	case 2:	{
		gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_SPEED2]),TRUE);
		break;
	};
	case 3:
	default:{
		gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_SPEED3]),TRUE);
		break;
	};
	};
	dnd_trash_menu_prepare();
};

static void set_speed_limit() {
	if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_SPEED1])))
		CFG.SPEED_LIMIT=1;
	else {
		if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_SPEED2])))
			CFG.SPEED_LIMIT=2;
		else
			CFG.SPEED_LIMIT=3;
	};
	main_menu_speed_prepare();
	dnd_trash_menu_prepare();
};

static void dnd_trash_toggle(){
//	if (GTK_TOGGLE_BUTTON(buttons_array[BUTTON_DND_TRASH])->active)
	if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_DND_TRASH])))
		dnd_trash_init();
	else
		dnd_trash_destroy();
};

void set_dndtrash_button(){
	if (CFG.DND_TRASH) {
		if (!gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_DND_TRASH]))){
			gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_DND_TRASH]),TRUE);
		};
	}else{
		if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_DND_TRASH]))){
			gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttons_array[BUTTON_DND_TRASH]),FALSE);
		};
	};
};

gint buttons_save_press(GtkWidget *widget,GdkEventButton *event, gint code){
	if (event->button==3){
		g_signal_emit_by_name(G_OBJECT(widget),"pressed",NULL);
		return TRUE;
	};
	return FALSE;
};

gint buttons_save_release(GtkButton *button,GdkEventButton *event,gint code){
	if (event->button==3){
		button->button_down=FALSE;		
		GtkStateType new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL);
		if (GTK_WIDGET_STATE(button)!=new_state){
			gtk_widget_set_state(GTK_WIDGET(button),new_state);
			gtk_widget_queue_draw(GTK_WIDGET(button));
		};
		switch (code){
		case BUTTON_SAVE:
			save_list();
			break;
		case BUTTON_OPTIONS:
			open_edit_for_selected();
			break;
		};
		return TRUE;
	};
	return FALSE;
};

void buttons_progress_set_text(){
	char data[10];
	*data=0;
	sprintf(data,"%i ",CFG.PROGRESS_MODE>=2?1:CFG.PROGRESS_MODE+2);
	char *text=sum_strings(_(BUTTONS_TEXT[BUTTON_PROGRESS])," ",data,NULL);
	gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(buttons_array[BUTTON_PROGRESS]),
				  GTK_TOOLBAR(ButtonsBar)->tooltips,text,NULL);
	D4X_PROGRESS_MODE_BUTTON->reinit(d4x::PBM_ONLY_TEXT+CFG.PROGRESS_MODE);
	
	delete[] text;
};

void buttons_progress_toggle(){
	CFG.PROGRESS_MODE+=1;
	if (CFG.PROGRESS_MODE>2)
		CFG.PROGRESS_MODE=0;
	gtk_widget_queue_draw(D4X_QUEUE->qv.ListOfDownloads);
	buttons_progress_set_text();
};

static void bb_move_up(){
	D4X_QUEUE->qv.move_up();
};

static void bb_move_down(){
	D4X_QUEUE->qv.move_down();
};

static void bb_open_logs(){
	D4X_QUEUE->qv.open_logs();
};


GtkWidget *d4x_gtk_toolbar_append_button(GtkWidget *toolbar,GtkWidget *icon,gchar *text,GCallback handler){
	GtkWidget *button=GTK_WIDGET(gtk_tool_button_new(icon,text));
	gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(button),-1);
	gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(button),GTK_TOOLBAR(ButtonsBar)->tooltips,text,NULL);
	g_signal_connect(G_OBJECT(button),"clicked",handler, NULL);
	return(button);
};

GtkWidget *d4x_gtk_toolbar_append_radio_button(GtkWidget *toolbar,GtkWidget *icon,gchar *text,GCallback handler,GtkWidget *group){
	GtkWidget *button = group==NULL?GTK_WIDGET(gtk_radio_tool_button_new(NULL)):GTK_WIDGET(gtk_radio_tool_button_new_from_widget(GTK_RADIO_TOOL_BUTTON(group)));
	gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(button),icon);
	gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(button),GTK_TOOLBAR(ButtonsBar)->tooltips,text,NULL);
	gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(button),-1);
	g_signal_connect(G_OBJECT(button),"clicked",handler, NULL);
	return(button);
};

GtkWidget *d4x_gtk_toolbar_append_toggle_button(GtkWidget *toolbar,GtkWidget *icon,gchar *text,GCallback handler){
	GtkWidget *button = GTK_WIDGET(gtk_toggle_tool_button_new());
	gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(button),GTK_TOOLBAR(ButtonsBar)->tooltips,text,NULL);
	gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(button),icon);
	gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(button),-1);
	g_signal_connect(G_OBJECT(button),"clicked",handler, NULL);
	return(button);
};

void init_buttons_bar() {
#include "pixmaps/add.xpm"
#include "pixmaps/add_clipboard.xpm"
#include "pixmaps/del.xpm"
#include "pixmaps/stop_bar.xpm"
#include "pixmaps/continue.xpm"
#include "pixmaps/del_com.xpm"
#include "pixmaps/prefs.xpm"
#include "pixmaps/openlog.xpm"
#include "pixmaps/del_all.xpm"
#include "pixmaps/up_bar.xpm"
#include "pixmaps/down_bar.xpm"
#include "pixmaps/speed1.xpm"
#include "pixmaps/speed2.xpm"
#include "pixmaps/speed3.xpm"
#include "pixmaps/save.xpm"
#include "pixmaps/dndtrash_bar.xpm"
#include "pixmaps/cfgbt.xpm"
#include "pixmaps/load.xpm"
	ButtonsBar=gtk_toolbar_new ();
	gtk_toolbar_set_orientation(GTK_TOOLBAR(ButtonsBar),GTK_ORIENTATION_HORIZONTAL);
	gtk_toolbar_set_style(GTK_TOOLBAR(ButtonsBar),GTK_TOOLBAR_ICONS);
	gtk_container_set_border_width(GTK_CONTAINER(ButtonsBar),0);
	gtk_toolbar_set_tooltips(GTK_TOOLBAR(ButtonsBar),TRUE);
	gtk_toolbar_set_show_arrow (GTK_TOOLBAR(ButtonsBar),FALSE);
//	gtk_toolbar_set_space_style(GTK_TOOLBAR(ButtonsBar), GTK_TOOLBAR_SPACE_LINE);
//	gtk_toolbar_set_button_relief(GTK_TOOLBAR(ButtonsBar), GTK_RELIEF_NONE);

	pixmaps_array[BUTTON_ADD]=new_pixmap_mon(add_xpm,"add");
	buttons_array[BUTTON_ADD]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_ADD],_(BUTTONS_TEXT[BUTTON_ADD]),G_CALLBACK(init_add_window));
	
	pixmaps_array[BUTTON_ADD_CLIPBOARD]=new_pixmap_mon(add_clipboard_xpm,"clipboardadd");
	buttons_array[BUTTON_ADD_CLIPBOARD]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_ADD_CLIPBOARD],_(BUTTONS_TEXT[BUTTON_ADD_CLIPBOARD]),G_CALLBACK(init_add_clipboard_window));
	
	pixmaps_array[BUTTON_DEL]=new_pixmap_mon(del_xpm,"del");
	buttons_array[BUTTON_DEL]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_DEL],_(BUTTONS_TEXT[BUTTON_DEL]),G_CALLBACK(ask_delete_download));
	
	gtk_toolbar_insert(GTK_TOOLBAR(ButtonsBar),gtk_separator_tool_item_new(),-1);
	
	pixmaps_array[BUTTON_CONTINUE]=new_pixmap_mon(continue_xpm,"continue");
	buttons_array[BUTTON_CONTINUE]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_CONTINUE],_(BUTTONS_TEXT[BUTTON_CONTINUE]),G_CALLBACK(continue_downloads));
	
	pixmaps_array[BUTTON_STOP]=new_pixmap_mon(stop_bar_xpm,"stop");
	buttons_array[BUTTON_STOP]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_STOP],_(BUTTONS_TEXT[BUTTON_STOP]),G_CALLBACK(stop_downloads));
	
	pixmaps_array[BUTTON_DEL_COMPLETED]=new_pixmap_mon(del_com_xpm,"delcompleted");
	buttons_array[BUTTON_DEL_COMPLETED]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_DEL_COMPLETED],_(BUTTONS_TEXT[BUTTON_DEL_COMPLETED]),G_CALLBACK(ask_delete_completed_downloads));
	
	pixmaps_array[BUTTON_UP]=new_pixmap_mon(up_bar_xpm,"moveup");
	buttons_array[BUTTON_UP]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_UP],_(BUTTONS_TEXT[BUTTON_UP]),G_CALLBACK(bb_move_up));
	
	pixmaps_array[BUTTON_DOWN]=new_pixmap_mon(down_bar_xpm,"movedown");
	buttons_array[BUTTON_DOWN]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_DOWN],_(BUTTONS_TEXT[BUTTON_DOWN]),G_CALLBACK(bb_move_down));
	
	pixmaps_array[BUTTON_LOG]=new_pixmap_mon(openlog_xpm,"openlog");
	buttons_array[BUTTON_LOG]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_LOG],_(BUTTONS_TEXT[BUTTON_LOG]),G_CALLBACK(bb_open_logs));
	
	gtk_toolbar_insert(GTK_TOOLBAR(ButtonsBar),gtk_separator_tool_item_new(),-1);
	
	pixmaps_array[BUTTON_OPTIONS]=new_pixmap_mon(prefs_xpm,"preferences");
	buttons_array[BUTTON_OPTIONS]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_OPTIONS],_(BUTTONS_TEXT[BUTTON_OPTIONS]),G_CALLBACK(d4x_prefs_init));
	
	gtk_toolbar_insert(GTK_TOOLBAR(ButtonsBar),gtk_separator_tool_item_new(),-1);
	
	pixmaps_array[BUTTON_SPEED1]=new_pixmap_mon(speed1_xpm,"speedlow");
	pixmaps_array[BUTTON_SPEED2]=new_pixmap_mon(speed2_xpm,"speedmedium");
	pixmaps_array[BUTTON_SPEED3]=new_pixmap_mon(speed3_xpm,"speedhigh");
//	buttons_array[BUTTON_]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_],_(BUTTONS_TEXT[BUTTON_]),G_CALLBACK());
	buttons_array[BUTTON_SPEED1]=d4x_gtk_toolbar_append_radio_button(ButtonsBar,pixmaps_array[BUTTON_SPEED1],_(BUTTONS_TEXT[BUTTON_SPEED1]),
									 G_CALLBACK(set_speed_limit),NULL);
	buttons_array[BUTTON_SPEED2]=d4x_gtk_toolbar_append_radio_button(ButtonsBar,pixmaps_array[BUTTON_SPEED2],_(BUTTONS_TEXT[BUTTON_SPEED2]),
									 G_CALLBACK(set_speed_limit),buttons_array[BUTTON_SPEED1]);
	buttons_array[BUTTON_SPEED3]=d4x_gtk_toolbar_append_radio_button(ButtonsBar,pixmaps_array[BUTTON_SPEED3],_(BUTTONS_TEXT[BUTTON_SPEED3]),
									 G_CALLBACK(set_speed_limit),buttons_array[BUTTON_SPEED2]);

	gtk_toolbar_insert(GTK_TOOLBAR(ButtonsBar),gtk_separator_tool_item_new(),-1);
	
	pixmaps_array[BUTTON_DEL_ALL]=new_pixmap_mon(del_all_xpm,"clearlist");
	buttons_array[BUTTON_DEL_ALL]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_DEL_ALL],_(BUTTONS_TEXT[BUTTON_DEL_ALL]),G_CALLBACK(ask_delete_all));

	pixmaps_array[BUTTON_SAVE]=new_pixmap_mon(save_xpm,"save");
	buttons_array[BUTTON_SAVE]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_SAVE],_(BUTTONS_TEXT[BUTTON_SAVE]),G_CALLBACK(init_save_list));

	pixmaps_array[BUTTON_LOAD]=new_pixmap_mon(load_xpm,"load");
	buttons_array[BUTTON_LOAD]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_LOAD],_(BUTTONS_TEXT[BUTTON_LOAD]),G_CALLBACK(init_load_list));

	D4X_PROGRESS_MODE_BUTTON=new d4x::Theme::SlaveImage(d4x::PBM_ONLY_TEXT);
	d4x::CUR_THEME->monitor(D4X_PROGRESS_MODE_BUTTON);
	
	pixmaps_array[BUTTON_PROGRESS]=GTK_WIDGET(D4X_PROGRESS_MODE_BUTTON->img);
	buttons_array[BUTTON_PROGRESS]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_PROGRESS],
								     _(BUTTONS_TEXT[BUTTON_PROGRESS]),G_CALLBACK(buttons_progress_toggle));
	pixmaps_array[BUTTON_DND_TRASH]=new_pixmap_mon (dndtrash_bar_xpm,"dnd");
	buttons_array[BUTTON_DND_TRASH]=d4x_gtk_toolbar_append_toggle_button(ButtonsBar,pixmaps_array[BUTTON_DND_TRASH],
									     _(BUTTONS_TEXT[BUTTON_DND_TRASH]),G_CALLBACK(dnd_trash_toggle));
	pixmaps_array[BUTTON_CONFIGURE] = new_pixmap (cfgbt_xpm,NULL);
	buttons_array[BUTTON_CONFIGURE]=d4x_gtk_toolbar_append_button(ButtonsBar,pixmaps_array[BUTTON_CONFIGURE],
								      _(BUTTONS_TEXT[BUTTON_CONFIGURE]),G_CALLBACK(buttons_configure));
	gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(buttons_array[BUTTON_CONFIGURE]),FALSE);
/*

	g_signal_connect(G_OBJECT (buttons_array[BUTTON_SAVE]), "button_press_event",
			   G_CALLBACK (buttons_save_press), GINT_TO_POINTER(BUTTON_SAVE));
	g_signal_connect(G_OBJECT (buttons_array[BUTTON_SAVE]), "button_release_event",
			   G_CALLBACK (buttons_save_release),GINT_TO_POINTER(BUTTON_SAVE));
	g_signal_connect(G_OBJECT (buttons_array[BUTTON_OPTIONS]), "button_press_event",
			   G_CALLBACK (buttons_save_press), GINT_TO_POINTER(BUTTON_OPTIONS));
	g_signal_connect(G_OBJECT (buttons_array[BUTTON_OPTIONS]), "button_release_event",
			   G_CALLBACK (buttons_save_release),GINT_TO_POINTER(BUTTON_OPTIONS));
*/
	set_speed_buttons();
	set_dndtrash_button();
	
	GtkTooltips *tooltips=((GtkToolbar *)(ButtonsBar))->tooltips;
	gtk_tooltips_force_window(tooltips);
	GtkStyle *current_style =gtk_style_copy(gtk_widget_get_style(tooltips->tip_window));
	char *tcolor=d4x_xml_find_obj_value(D4X_THEME_DATA,"buttonsbar tipcolor");
	if (tcolor){
		gdk_color_parse(tcolor,&(current_style->bg[GTK_STATE_NORMAL]));
	}else{
		current_style->bg[GTK_STATE_NORMAL] = LYELLOW;
	};
	
	gtk_widget_set_style(tooltips->tip_window, current_style);
	gtk_widget_show(ButtonsBar);
	buttons_speed_set_text();
	buttons_progress_set_text();
};

void buttons_theme_changed(){
	GtkTooltips *tooltips=((GtkToolbar *)(ButtonsBar))->tooltips;
	GtkStyle *current_style =gtk_style_copy(gtk_widget_get_style(tooltips->tip_window));
	char *tcolor=d4x_xml_find_obj_value(D4X_THEME_DATA,"buttonsbar tipcolor");
	if (tcolor){
		gdk_color_parse(tcolor,&(current_style->bg[GTK_STATE_NORMAL]));
	}else{
		current_style->bg[GTK_STATE_NORMAL] = LYELLOW;
	};
	gtk_widget_set_style(tooltips->tip_window, current_style);
};

void prepare_buttons() {
	if (!D4X_QUEUE) return;
	if (D4X_QUEUE->count())
		gtk_widget_set_sensitive(buttons_array[BUTTON_DEL_ALL],TRUE);
	else
		gtk_widget_set_sensitive(buttons_array[BUTTON_DEL_ALL],FALSE);
	if (D4X_QUEUE->qv.last_selected==NULL) {
		gtk_widget_set_sensitive(buttons_array[BUTTON_DEL],FALSE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_STOP],FALSE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_CONTINUE],FALSE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_LOG],FALSE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_UP],FALSE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_DOWN],FALSE);
	} else {
		gtk_widget_set_sensitive(buttons_array[BUTTON_DEL],TRUE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_STOP],TRUE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_CONTINUE],TRUE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_LOG],TRUE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_UP],TRUE);
		gtk_widget_set_sensitive(buttons_array[BUTTON_DOWN],TRUE);
	};
};


syntax highlighted by Code2HTML, v. 0.9.1