edi/src/bin/edi_content.c

250 lines
7.4 KiB
C

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "language/edi_language_provider.h"
#include "editor/edi_editor.h"
#include "edi_content.h"
#include "mainview/edi_mainview.h"
#include "edi_config.h"
#include "edi_private.h"
static Eina_Bool
_edi_content_diff_config_changed(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
{
Evas_Object *diff;
diff = (Evas_Object*) data;
elm_code_diff_widget_font_set(diff, _edi_project_config->font.name, _edi_project_config->font.size);
return ECORE_CALLBACK_RENEW;
}
Evas_Object *
edi_content_diff_add(Evas_Object *parent, Edi_Mainview_Item *item)
{
Elm_Code *code;
Evas_Object *diff;
code = elm_code_create();
elm_code_file_open(code, item->path);
diff = elm_code_diff_widget_add(parent, code);
elm_code_diff_widget_font_set(diff, _edi_project_config->font.name, _edi_project_config->font.size);
ecore_event_handler_add(EDI_EVENT_CONFIG_CHANGED, _edi_content_diff_config_changed, diff);
return diff;
}
static const char *_image_path = NULL;
static void
_item_menu_edit_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
const char *program = data;
const char *path = _image_path;
if (path)
ecore_exe_run(eina_slstr_printf("%s %s", program, path), NULL);
_image_path = NULL;
}
static Evas_Object *
_image_menu_create(const char *path)
{
Elm_Object_Item *menu_it;
Evas_Object *menu;
_image_path = path;
menu = elm_menu_add(edi_main_win_get());
menu_it = elm_menu_item_add(menu, NULL, "edit", _("Edit with..."), NULL, NULL);
if (ecore_file_app_installed("gimp"))
elm_menu_item_add(menu, menu_it, "gimp", _("Gimp"), _item_menu_edit_cb, "gimp");
if (ecore_file_app_installed("inkscape"))
elm_menu_item_add(menu, menu_it, "inkscape", _("Inkscape"), _item_menu_edit_cb, "inkscape");
return menu;
}
static void
_image_secondary_clicked_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info)
{
Evas_Object *menu;
Evas_Event_Mouse_Up *ev;
const char *path = data;
ev = event_info;
if (ev->button != 3) return;
menu = _image_menu_create(path);
if (!menu) return;
elm_menu_move(menu, ev->canvas.x, ev->canvas.y);
evas_object_show(menu);
}
Evas_Object *
edi_content_image_add(Evas_Object *parent, Edi_Mainview_Item *item)
{
Evas_Object *vbox, *box, *searchbar, *statusbar, *scroll, *img;
Evas_Coord w, h;
vbox = elm_box_add(parent);
evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(vbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(vbox);
searchbar = elm_box_add(vbox);
evas_object_size_hint_weight_set(searchbar, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(searchbar, EVAS_HINT_FILL, 0.0);
elm_box_pack_end(vbox, searchbar);
box = elm_box_add(vbox);
elm_box_horizontal_set(box, EINA_TRUE);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(vbox, box);
evas_object_show(box);
statusbar = elm_box_add(vbox);
evas_object_size_hint_weight_set(statusbar, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(statusbar, EVAS_HINT_FILL, 0.0);
elm_box_pack_end(vbox, statusbar);
evas_object_show(statusbar);
scroll = elm_scroller_add(parent);
evas_object_size_hint_weight_set(scroll, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(scroll, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(scroll);
elm_box_pack_end(box, scroll);
img = evas_object_image_filled_add(vbox);
evas_object_image_file_set(img, item->path, NULL);
evas_object_image_size_get(img, &w, &h);
evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_aspect_set(img, EVAS_ASPECT_CONTROL_BOTH, w, h);
evas_object_size_hint_max_set(img, w, h);
evas_object_show(img);
evas_object_event_callback_add(img, EVAS_CALLBACK_MOUSE_UP, _image_secondary_clicked_cb, item->path);
elm_object_content_set(scroll, img);
edi_content_statusbar_add(statusbar, item);
edi_content_statusbar_position_set(item->pos, 0, 0);
return vbox;
}
void
edi_content_statusbar_position_set(Evas_Object *position, unsigned int line, unsigned int pos)
{
char buf[64];
char text[128];
int i;
if (!position) return;
if (line && pos)
{
snprintf(buf, sizeof(buf), _("Line: %d, Position: %d"), line, pos);
}
else
{
buf[0] = 0x00;
}
text[0] = 0x00;
for (i = strlen(buf); i < 24; i++)
{
strcat(text, " ");
}
strcat(text, buf);
elm_object_text_set(position, text);
}
void
edi_content_statusbar_add(Evas_Object *panel, Edi_Mainview_Item *item)
{
Edi_Language_Provider *provider;
Evas_Object *table, *rect, *tb, *position, *mime;
Elm_Code *code;
char text[256];
const char *format = "", *spaces = " ";
const char *mimename = NULL;
elm_box_horizontal_set(panel, EINA_TRUE);
table = elm_table_add(panel);
evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(table);
elm_box_pack_end(panel, table);
if (!strcmp(item->editortype, "code"))
{
code = elm_code_create();
code->file = elm_code_file_open(code, item->path);
if (elm_code_file_line_ending_get(code->file) == ELM_CODE_FILE_LINE_ENDING_WINDOWS)
format = "WIN";
else
format = "UNIX";
elm_code_free(code);
}
mime = elm_entry_add(panel);
elm_entry_editable_set(mime, EINA_FALSE);
elm_entry_scrollable_set(mime, EINA_FALSE);
elm_entry_single_line_set(mime, EINA_TRUE);
if (item->mimetype)
{
provider = edi_language_provider_for_mime_get(item->mimetype);
if (provider)
mimename = provider->mime_name(item->mimetype);
if (mimename)
snprintf(text, sizeof(text), "%s (%s)%s%s", mimename, item->mimetype, spaces, format);
else
snprintf(text, sizeof(text), "%s%s%s", item->mimetype, spaces, format);
}
else
{
snprintf(text, sizeof(text), "%s%s%s", item->editortype, spaces, format);
}
elm_object_text_set(mime, text);
rect = evas_object_rectangle_add(panel);
evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(rect, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_move(rect, 0, 0);
evas_object_resize(rect, 220, 1);
evas_object_color_set(rect, 0, 0, 0, 0);
evas_object_show(rect);
tb = elm_entry_textblock_get(mime);
evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_resize(tb, 220, 1);
evas_object_show(tb);
elm_table_pack(table, tb, 0, 0, 1, 1);
elm_table_pack(table, rect, 0, 0, 1, 1);
item->pos = position = elm_entry_add(panel);
elm_entry_single_line_set(position, EINA_TRUE);
elm_entry_editable_set(position, EINA_FALSE);
evas_object_size_hint_align_set(position, 1.0, 0.5);
evas_object_size_hint_weight_set(position, EVAS_HINT_EXPAND, 0.0);
elm_table_pack(table, position, 1, 0, 1, 1);
evas_object_show(position);
}