mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
396 lines
11 KiB
C++
396 lines
11 KiB
C++
|
// Copyright (c) 2000. - 2005. EDE Authors
|
||
|
// This program is licenced under terms of the
|
||
|
// GNU General Public Licence version 2 or newer.
|
||
|
// See COPYING for details.
|
||
|
|
||
|
#include <efltk/Fl_Util.h>
|
||
|
#include <efltk/Fl_Main_Window.h>
|
||
|
#include <efltk/Fl_Images.h>
|
||
|
#include <edeconf.h>
|
||
|
|
||
|
#include "icons/up.xpm"
|
||
|
#include "icons/folder.xpm"
|
||
|
#include "icons/item.xpm"
|
||
|
|
||
|
#include "emenueditor.h"
|
||
|
|
||
|
static Fl_Image item_pix = *Fl_Image::read_xpm(0, (const char**)item_xpm);
|
||
|
static Fl_Image folder_pix = *Fl_Image::read_xpm(0, (const char**)folder_xpm);
|
||
|
|
||
|
Fl_Window *edit_window = 0;
|
||
|
Fl_FileBrowser *programs_browser;
|
||
|
Fl_Input *filename_field, *name_field, *command_field, *icon_field;
|
||
|
int selected, submenu_selected = 0;
|
||
|
Fl_Input *filename_field_e, *name_field_e, *command_field_e,*icon_field_e;
|
||
|
|
||
|
void cb_change_dir(Fl_Widget *, void*);
|
||
|
void cb_directory_up(Fl_Button *, void*);
|
||
|
void cb_new_submenu(Fl_Button *, void*);
|
||
|
void cb_delete_submenu(Fl_Button *, void*);
|
||
|
void cb_new_item(Fl_Button *, void*);
|
||
|
void cb_delete_item(Fl_Button *, void*);
|
||
|
void cb_edit_item(Fl_Button *, void*);
|
||
|
void cb_about_menu_editor(Fl_Widget*, void*);
|
||
|
void cbCloseWindow(Fl_Widget*, Fl_Window*);
|
||
|
void Exit_Editor(Fl_Widget*, void*);
|
||
|
int SomethingInDir(char *);
|
||
|
|
||
|
void cb_browse(Fl_Widget *, Fl_Input *input)
|
||
|
{
|
||
|
char *file_types = _("Executables (*.*), *, All files (*.*), *");
|
||
|
const char *f = fl_select_file(input->value(), file_types, _("File selection ..."));
|
||
|
if (f) input->value(f);
|
||
|
}
|
||
|
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
Fl_String m_programsdir = fl_homedir() + "/.ede/programs";
|
||
|
fl_init_locale_support("emenueditor", PREFIX"/share/locale");
|
||
|
fl_init_images_lib();
|
||
|
|
||
|
Fl_Main_Window *menu_edit_window = new Fl_Main_Window(480, 370, _("Menu editor"));
|
||
|
|
||
|
Fl_Menu_Bar *menubar = new Fl_Menu_Bar(0, 0, 480, 25);
|
||
|
menubar->begin();
|
||
|
Fl_Item_Group *file = new Fl_Item_Group(_("&File"));
|
||
|
Fl_Item *quit_item = new Fl_Item(_("&Quit"));
|
||
|
quit_item->shortcut(0x40071);
|
||
|
quit_item->x_offset(18);
|
||
|
quit_item->callback(Exit_Editor, menu_edit_window);
|
||
|
|
||
|
file->end();
|
||
|
menubar->end();
|
||
|
|
||
|
programs_browser = new Fl_FileBrowser(5, 40, 275, 313, _("Programs:"));
|
||
|
programs_browser->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
|
||
|
programs_browser->tooltip(_("Click on the submenu or on the item you want"));
|
||
|
programs_browser->callback(cb_change_dir);
|
||
|
programs_browser->end();
|
||
|
programs_browser->directory(m_programsdir);
|
||
|
|
||
|
Fl_Button *new_submenu = new Fl_Button(315, 50, 125, 23, _("New submenu"));
|
||
|
new_submenu->callback( (Fl_Callback*) cb_new_submenu );
|
||
|
|
||
|
Fl_Button *del_submenu = new Fl_Button(315, 80, 125, 23, _("Delete submenu"));
|
||
|
del_submenu->callback( (Fl_Callback*) cb_delete_submenu );
|
||
|
|
||
|
Fl_Button *new_item = new Fl_Button(315, 125, 125, 23, _("New item"));
|
||
|
new_item->callback( (Fl_Callback*) cb_new_item );
|
||
|
|
||
|
Fl_Button *del_item = new Fl_Button(315, 185, 125, 23, _("Delete item"));
|
||
|
del_item->callback( (Fl_Callback*) cb_delete_item );
|
||
|
|
||
|
Fl_Button *edit_item = new Fl_Button(315, 155, 125, 23, _("Edit Item"));
|
||
|
edit_item->callback( (Fl_Callback*) cb_edit_item );
|
||
|
|
||
|
menu_edit_window->menu(menubar);
|
||
|
menu_edit_window->resizable(menu_edit_window);
|
||
|
menu_edit_window->end();
|
||
|
menu_edit_window->show();
|
||
|
|
||
|
Fl::run();
|
||
|
|
||
|
if(edit_window)
|
||
|
delete edit_window;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
char* get_localized_name(char *cfg)
|
||
|
{
|
||
|
char *icon_name = 0;
|
||
|
Fl_Config iconConfig(cfg);
|
||
|
iconConfig.set_section("Desktop Entry");
|
||
|
|
||
|
char *alocale = strdup(setlocale(LC_ALL, NULL));
|
||
|
char *tmp = strrchr(alocale, '_');
|
||
|
if(tmp)
|
||
|
{
|
||
|
*tmp = '\0';
|
||
|
}
|
||
|
char localName[1024];
|
||
|
snprintf(localName, sizeof(localName)-1, "Name[%s]", alocale);
|
||
|
iconConfig.read((const char *)localName, icon_name);
|
||
|
delete [] alocale;
|
||
|
|
||
|
if (!icon_name)
|
||
|
{
|
||
|
iconConfig.read("Name", icon_name, "None");
|
||
|
}
|
||
|
|
||
|
return icon_name;
|
||
|
|
||
|
}
|
||
|
|
||
|
char* get_localized_string()
|
||
|
{
|
||
|
char *localname = 0;
|
||
|
char *alocale = strdup(setlocale(LC_MESSAGES, NULL));
|
||
|
// -- language_country is perfectly valid according to FD.o
|
||
|
/* char *tmp = strrchr(alocale, '_');
|
||
|
if(tmp)
|
||
|
{
|
||
|
*tmp = '\0';
|
||
|
} */
|
||
|
localname = fl_strdup_printf("Name[%s]", alocale);
|
||
|
delete [] alocale;
|
||
|
|
||
|
if (!localname) localname = strdup("Name");
|
||
|
return localname;
|
||
|
}
|
||
|
|
||
|
|
||
|
void cb_save_item_e(Fl_Widget *, Fl_Window *w)
|
||
|
{
|
||
|
Fl_String item;
|
||
|
Fl_String dir = programs_browser->directory();
|
||
|
|
||
|
Fl_String name = name_field_e->value();
|
||
|
if (name.empty())
|
||
|
{
|
||
|
fl_alert(_("Please, enter the name of the menu item."));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Fl_String filename = filename_field_e->value();
|
||
|
if (!filename.empty())
|
||
|
item = filename;
|
||
|
else
|
||
|
item = name + ".desktop";
|
||
|
|
||
|
Fl_String path_and_item = dir + slash + item;
|
||
|
char *lname = get_localized_string();
|
||
|
|
||
|
Fl_Config flconfig(path_and_item);
|
||
|
flconfig.set_section("Desktop Entry");
|
||
|
flconfig.write(lname, name_field_e->value());
|
||
|
flconfig.write("Name", name_field_e->value()); // fallback
|
||
|
flconfig.write("Exec", command_field_e->value());
|
||
|
flconfig.write("Icon", fl_file_filename(icon_field_e->value()));
|
||
|
|
||
|
delete [] lname;
|
||
|
|
||
|
programs_browser->directory(dir);
|
||
|
programs_browser->relayout();
|
||
|
w->hide();
|
||
|
}
|
||
|
|
||
|
|
||
|
void cb_browse_icon(Fl_Widget *, Fl_Input *input)
|
||
|
{
|
||
|
char *file_types = _("Icons (*.png), *.png, All files (*.*), *");
|
||
|
const char *f = fl_select_file(PREFIX"/share/ede/icons/16x16", file_types, _("Choose icon file..."));
|
||
|
if (f)
|
||
|
{
|
||
|
input->value(f);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void Menu_Edit_Dialog(int edit)
|
||
|
{
|
||
|
if(!edit_window)
|
||
|
{
|
||
|
edit_window = new Fl_Window(370, 250, _("Edit item"));
|
||
|
|
||
|
filename_field_e = new Fl_Output(5, 25, 195, 23, _("Filename:"));
|
||
|
filename_field_e->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
|
||
|
|
||
|
name_field_e = new Fl_Input(5, 80, 195, 23, _("Name in the menu:"));
|
||
|
name_field_e->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
|
||
|
|
||
|
command_field_e = new Fl_Input(5, 125, 195, 23, _("Command to execute:"));
|
||
|
command_field_e->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
|
||
|
|
||
|
{
|
||
|
Fl_Button *browse_button_c = new Fl_Button(210, 125, 80, 23, _("Bro&wse..."));
|
||
|
browse_button_c->callback( (Fl_Callback*) cb_browse, command_field_e );
|
||
|
}
|
||
|
|
||
|
icon_field_e = new Fl_Input(5, 215, 195, 23, _("Icon filename:"));
|
||
|
icon_field_e->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
|
||
|
|
||
|
{
|
||
|
Fl_Button *save_button = new Fl_Button(285, 25, 80, 23, _("&Save"));
|
||
|
save_button->callback( (Fl_Callback*) cb_save_item_e, edit_window );
|
||
|
}
|
||
|
{
|
||
|
Fl_Button *cancel_button = new Fl_Button(285, 60, 80, 23, _("&Cancel"));
|
||
|
cancel_button->callback( (Fl_Callback*) cbCloseWindow, edit_window );
|
||
|
}
|
||
|
{
|
||
|
Fl_Button *browse_button_i = new Fl_Button(210, 215, 80, 23, _("&Browse..."));
|
||
|
browse_button_i->callback( (Fl_Callback*) cb_browse_icon, icon_field_e );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
filename_field_e->value("");
|
||
|
command_field_e->value("xterm");
|
||
|
name_field_e->value(_("New folder"));
|
||
|
icon_field_e->value("item.png");
|
||
|
|
||
|
if (edit)
|
||
|
{
|
||
|
Fl_String c_file = programs_browser->filename_full();
|
||
|
Fl_String name = programs_browser->filename();
|
||
|
|
||
|
if (!name.empty())
|
||
|
{
|
||
|
char *this_value = 0;
|
||
|
filename_field_e->value(name);
|
||
|
|
||
|
const char *tfield = filename_field_e->value();
|
||
|
|
||
|
Fl_Config flconfig(c_file);
|
||
|
flconfig.set_section("Desktop Entry");
|
||
|
|
||
|
this_value = get_localized_name(c_file);
|
||
|
if(!flconfig.error() && this_value)
|
||
|
{
|
||
|
name_field_e->value(this_value);
|
||
|
delete [] this_value;
|
||
|
}
|
||
|
flconfig.read("Exec", this_value);
|
||
|
if(!flconfig.error() && this_value)
|
||
|
{
|
||
|
command_field_e->value(this_value);
|
||
|
delete [] this_value;
|
||
|
}
|
||
|
flconfig.read("Icon", this_value);
|
||
|
if (!flconfig.error() && this_value)
|
||
|
{
|
||
|
icon_field_e->value(this_value);
|
||
|
delete [] this_value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
edit_window->end();
|
||
|
edit_window->exec();
|
||
|
}
|
||
|
|
||
|
void cb_new_submenu(Fl_Button *, void *)
|
||
|
{
|
||
|
Fl_String m_progdir = programs_browser->directory();
|
||
|
Fl_String m_submenu = fl_input(_("Please enter name of the new submenu:"));
|
||
|
|
||
|
if (!m_submenu.empty())
|
||
|
{
|
||
|
Fl_String path = m_progdir + slash + m_submenu;
|
||
|
if (mkdir(path, S_IRUSR | S_IWUSR | S_IXUSR))
|
||
|
{
|
||
|
fl_alert(_("Cannot create submenu!"));
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
programs_browser->directory(m_progdir);
|
||
|
programs_browser->relayout();
|
||
|
programs_browser->redraw();
|
||
|
}
|
||
|
|
||
|
void cb_change_dir(Fl_Widget *w, void *)
|
||
|
{
|
||
|
if(Fl::event_clicks() || Fl::event_key() == FL_Enter) {
|
||
|
Fl_String path_name(programs_browser->filename_full());
|
||
|
|
||
|
if(path_name.empty()) {
|
||
|
programs_browser->up();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if(fl_is_dir(path_name)) {
|
||
|
|
||
|
programs_browser->load(path_name);
|
||
|
programs_browser->redraw();
|
||
|
|
||
|
} else {
|
||
|
|
||
|
Menu_Edit_Dialog(1);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cb_directory_up(Fl_Button *, void *)
|
||
|
{
|
||
|
programs_browser->up();
|
||
|
}
|
||
|
|
||
|
int SomethingInDir(char *path)
|
||
|
{
|
||
|
dirent **files;
|
||
|
int numberOfFiles = 0;
|
||
|
|
||
|
numberOfFiles = fl_filename_list(path, &files);
|
||
|
|
||
|
if (numberOfFiles > 2) // . | .. | +
|
||
|
{
|
||
|
for (int i = 0; i < numberOfFiles; i ++)
|
||
|
{
|
||
|
free(files[i]);
|
||
|
}
|
||
|
free(files);
|
||
|
return numberOfFiles;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cb_delete_submenu(Fl_Button *, void*)
|
||
|
{
|
||
|
Fl_String submenu_path(programs_browser->filename_full());
|
||
|
if (fl_file_exists(submenu_path) && fl_is_dir(submenu_path))
|
||
|
{
|
||
|
if (SomethingInDir(submenu_path))
|
||
|
{
|
||
|
fl_alert(_("You should delete all the items from the submenu, before you can delete it!"));
|
||
|
return;
|
||
|
}
|
||
|
rmdir(submenu_path);
|
||
|
programs_browser->directory(programs_browser->directory());
|
||
|
programs_browser->redraw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cb_delete_item(Fl_Button *, void *)
|
||
|
{
|
||
|
Fl_String submenu_path(programs_browser->filename_full());
|
||
|
if(fl_file_exists(submenu_path) && !fl_is_dir(submenu_path))
|
||
|
{
|
||
|
unlink(submenu_path);
|
||
|
programs_browser->directory(programs_browser->directory());
|
||
|
programs_browser->redraw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cb_new_item(Fl_Button *, void *)
|
||
|
{
|
||
|
Menu_Edit_Dialog(0);
|
||
|
programs_browser->redraw();
|
||
|
}
|
||
|
|
||
|
void cb_edit_item(Fl_Button *, void *)
|
||
|
{
|
||
|
Fl_String submenu_path(programs_browser->filename_full());
|
||
|
if(!fl_is_dir(submenu_path))
|
||
|
{
|
||
|
Menu_Edit_Dialog(1);
|
||
|
programs_browser->redraw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cbCloseWindow(Fl_Widget *, Fl_Window *windowToClose)
|
||
|
{
|
||
|
windowToClose->hide();
|
||
|
}
|
||
|
|
||
|
void Exit_Editor(Fl_Widget *w, void *d)
|
||
|
{
|
||
|
Fl_Window *t = (Fl_Window*) d;
|
||
|
t->hide();
|
||
|
}
|