📄 main_viewer.cpp
字号:
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <libintl.h>
#include <locale.h>
#include <sys/types.h>
#include <unistd.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#define _(x) gettext(x)
#define PACKAGE "Viewer"
#define PACKAGE_LOCALE_DIR "/usr/local/share/locale"
#define FILE_TESTPROJECT "/data/bin/testproject"
int matchindex = 0;
GtkTextBuffer *g_buffer;
char *path = "/data/bin/helpdir";
/*
* Convenience function for clearing the specified GtkTextBuffer.
*/
static void
clear_text_buffer(GtkTextBuffer * buffer)
{
GtkTextIter start;
GtkTextIter end;
gtk_text_buffer_get_bounds (buffer, &start, &end);
gtk_text_buffer_delete (buffer, &start, &end);
}
/*
* append the specified buf into the text buffer.
*/
static void
append_text_buffer(GtkTextBuffer *text_buffer, gchar *buf)
{
GtkTextMark * mark;
GtkTextIter start, end;
gtk_text_buffer_get_end_iter (text_buffer, &end);
mark = gtk_text_buffer_create_mark (text_buffer, "blah", &end, TRUE);
gtk_text_buffer_insert (text_buffer, &end, buf, -1);
gtk_text_buffer_get_iter_at_mark (text_buffer, &start, mark);
gtk_text_buffer_delete_mark (text_buffer, mark);
}
void
show_file_content(const char* filename)
{
if(strlen(filename) == 0)
return;
const int arr_size = 2048;
clear_text_buffer(g_buffer);
char filepath[arr_size] = {0};
strcpy(filepath, path);
filepath[strlen(filepath)] = '/';
strcpy(filepath + strlen(path) + 1, filename);
FILE *fh = fopen(filepath, "r");
if(fh == NULL)
{
append_text_buffer(g_buffer, _("Open File Error!"));
return;
}
char ptr[arr_size] = {0};
int re = 0;
re = fread(ptr, 1, sizeof(ptr), fh);
if(re >= 0)
{
char *ptr_utf8 = g_locale_to_utf8(ptr, -1, NULL, NULL, NULL);
append_text_buffer(g_buffer, ptr_utf8);
g_free(ptr_utf8);
}
fclose(fh);
}
void tree_view_row_activated( GtkWidget *clist,
gint row,
gint column,
GdkEventButton *event,
gpointer data )
{
char *title = NULL;
int ret = gtk_clist_get_text(GTK_CLIST(clist), row, column, &title);
if (ret) {
char *filename_locale = g_locale_from_utf8(title, -1, NULL, NULL, NULL);
if(strlen(filename_locale) == 0)
return;
show_file_content((const char*)filename_locale);
g_free(filename_locale);
}
}
/* create an list */
GtkWidget *create_list( void )
{
GtkWidget *scrolled_window;
GtkWidget *item_clist;
char *titles = _("Help Topic");
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
item_clist = gtk_clist_new_with_titles (1, &titles);
g_signal_connect (G_OBJECT (item_clist), "select_row",
G_CALLBACK (tree_view_row_activated),
NULL);
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), item_clist);
gtk_widget_show(item_clist);
DIR * dir = NULL;
struct dirent *pdirent = NULL;
if((dir = opendir((const char *)path) ) == NULL) {
return scrolled_window;
}
while ((pdirent = readdir(dir)) != NULL) {
if (!strcmp(pdirent->d_name, ".") || !strcmp(pdirent->d_name, ".."))
continue; /* ignore dot and dot-dot */
char *name_utf8 = g_locale_to_utf8(pdirent->d_name, -1, NULL, NULL, NULL);
gtk_clist_append ((GtkCList *)item_clist, &name_utf8);
g_free(name_utf8);
}
closedir(dir);
return scrolled_window;
}
void
init_text (GtkTextBuffer *buffer)
{
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
gtk_text_buffer_insert(buffer, &iter,
_("Select an item above to show the related help contents."),
-1);
}
GtkWidget *create_text( void )
{
GtkWidget *scrolled_window;
GtkWidget *view;
view = gtk_text_view_new ();
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view), FALSE);
g_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scrolled_window), view);
init_text (g_buffer);
gtk_widget_show_all (scrolled_window);
return scrolled_window;
}
int
main( int argc, char *argv[] )
{
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
bind_textdomain_codeset (PACKAGE, "UTF-8");
textdomain (PACKAGE);
gtk_init (&argc, &argv);
GtkWidget *window;
GtkWidget *vpaned;
GtkWidget *list;
GtkWidget *text;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), _("Viewer"));
g_signal_connect (G_OBJECT (window), "destroy",
G_CALLBACK (gtk_main_quit), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
gtk_widget_set_size_request (GTK_WIDGET (window), 450, 400);
vpaned = gtk_vpaned_new ();
gtk_container_add (GTK_CONTAINER (window), vpaned);
gtk_widget_show (vpaned);
list = create_list ();
gtk_paned_add1 (GTK_PANED (vpaned), list);
gtk_widget_show (list);
text = create_text ();
gtk_paned_add2 (GTK_PANED (vpaned), text);
gtk_widget_show (text);
//Sets the position of the divider between the two panes.
gtk_paned_set_position(GTK_PANED(vpaned), 100);
gtk_widget_show (window);
gtk_main ();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -