Commit 28835234 by karudu

SourceView süntaksi värvimine, faili muutmisel näidatakse *

parent cb6b509a
#include "ceditor.h" #include "ceditor.h"
#include "ui.h" #include "ui.h"
/* TODO
Klahvikombinatsioonid
*/
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
gtk_init(&argc, &argv); gtk_init(&argc, &argv);
ui *UI = LooUI(); ui *UI = LooUI();
gtk_widget_show_all(UI->Aken); // Näita akent gtk_widget_show_all(UI->Aken); // Näita akent
gtk_main(); gtk_main();
return 0; return 0;
} }
#ifndef CEDITOR_H #ifndef CEDITOR_H
#define CEDITOR_H #define CEDITOR_H
#define SOURCEVIEW
#include <gtk/gtk.h> #include <gtk/gtk.h>
#ifdef SOURCEVIEW
#include <gtksourceview/gtksource.h> #include <gtksourceview/gtksource.h>
#endif
typedef struct typedef struct
{ {
GtkWidget *Aken; // Programmi aken GtkWidget *Aken; // Programmi aken
char *FailiNimi; // Viit faili nimele, 0 kui nime veel pole char *FailiNimi; // Viit faili nimele, 0 kui nime veel pole
int OnMuudetud; // Kas teksti on muudetud
GtkWidget *Pealkiri; // Vahekaardi pealkiri
GtkWidget *Box; // Vahekaardi box GtkWidget *Pealkiri; // Vahekaardi pealkiri
GtkWidget *TextView; // Vahekaardi tekstiaken char *PealkiriTekst; // Originaalne pealkirja tekst
GtkTextView *Puhver; // Vahekaardi tekstipuhver GtkWidget *Box; // Vahekaardi box
GtkWidget *ScrollWindow; // Tekstiakna scroll GtkWidget *TextView; // Vahekaardi tekstiaken
GtkWidget *StatusBar; // Status bar GtkTextView *Puhver; // Vahekaardi tekstipuhver
GtkWidget *ScrollWindow; // Tekstiakna scroll
GtkWidget *StatusBar; // Status bar
GtkSourceLanguageManager *LangManager;
GtkSourceLanguage *Language;
} tab; } tab;
typedef struct typedef struct
{ {
GtkWidget *Aken; // Programmi aken GtkWidget *Aken; // Programmi aken
GtkWidget *Box; // Akna box GtkWidget *Box; // Akna box
GtkWidget *MenuBar; // Ülaosa menüü GtkWidget *MenuBar; // Ülaosa menüü
GtkWidget *Notebook; // Notebook vahekaartidega GtkWidget *Notebook; // Notebook vahekaartidega
GtkWidget *ToolBar; //Tool bar GtkWidget *ToolBar; //Tool bar
GtkWidget *AccelGroup; // Accel group nuppude jaoks GtkWidget *AccelGroup; // Accel group nuppude jaoks
// Viited nuppudele nende sisse/välja lülitamiseks // Viited nuppudele nende sisse/välja lülitamiseks
GtkWidget *FailMenuAva; GtkWidget *FailMenuAva;
GtkWidget *FailMenuSalvesta; GtkWidget *FailMenuSalvesta;
GtkWidget *FailMenuSalvestaN; GtkWidget *FailMenuSalvestaN;
GtkWidget *FailMenuSulgeV; GtkWidget *FailMenuSulgeV;
tab *Tabid; // Vahekaartide massiiv tab *Tabid; // Vahekaartide massiiv
int PraeguneTab; // Praegune valitud vahekaart int PraeguneTab; // Praegune valitud vahekaart
int TabidN; // Mitu vahekaarti on avatud int TabidN; // Mitu vahekaarti on avatud
//toolbari nupud //toolbari nupud
GtkToolItem *Undo; //undo nupp GtkToolItem *Undo; //undo nupp
GtkToolItem *Redo; //redo nupp GtkToolItem *Redo; //redo nupp
} ui; } ui;
#endif // CEDITOR_H #endif // CEDITOR_H
...@@ -3,200 +3,205 @@ ...@@ -3,200 +3,205 @@
// Loob uue vahekaardi // Loob uue vahekaardi
void Uus(GtkWidget *Nupp, gpointer Data) void Uus(GtkWidget *Nupp, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
// Loo uus vahekaart // Loo uus vahekaart
LisaTab(UI); LisaTab(UI);
tab *Tab = &UI->Tabid[UI->TabidN - 1]; tab *Tab = &UI->Tabid[UI->TabidN - 1];
Tab->FailiNimi = 0; Tab->FailiNimi = 0;
gtk_notebook_set_current_page(UI->Notebook, UI->TabidN - 1); // Näita uut vahekaarti gtk_notebook_set_current_page(UI->Notebook, UI->TabidN - 1); // Näita uut vahekaarti
// Muuda need uuesti vajutatavaks, kui ennem polnud // Muuda need uuesti vajutatavaks, kui ennem polnud
gtk_widget_set_sensitive(UI->FailMenuAva, TRUE); gtk_widget_set_sensitive(UI->FailMenuAva, TRUE);
gtk_widget_set_sensitive(UI->FailMenuSalvesta, TRUE); gtk_widget_set_sensitive(UI->FailMenuSalvesta, TRUE);
gtk_widget_set_sensitive(UI->FailMenuSalvestaN, TRUE); gtk_widget_set_sensitive(UI->FailMenuSalvestaN, TRUE);
gtk_widget_set_sensitive(UI->FailMenuSulgeV, TRUE); gtk_widget_set_sensitive(UI->FailMenuSulgeV, TRUE);
} }
// Avab faili ja loeb selle teksti vahekaarti // Avab faili ja loeb selle teksti vahekaarti
void Ava(GtkWidget *Nupp, gpointer Data) void Ava(GtkWidget *Nupp, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
tab *Tab = &UI->Tabid[UI->PraeguneTab]; tab *Tab = &UI->Tabid[UI->PraeguneTab];
GtkTextBuffer *Puhver = Tab->Puhver; GtkTextBuffer *Puhver = Tab->Puhver;
GtkWidget *Dialog = gtk_file_chooser_dialog_new("Ava fail", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GtkWidget *Dialog = gtk_file_chooser_dialog_new("Ava fail", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
"Tühista", GTK_RESPONSE_CANCEL, "Tühista", GTK_RESPONSE_CANCEL,
"Ava", GTK_RESPONSE_ACCEPT, NULL); "Ava", GTK_RESPONSE_ACCEPT, NULL);
gint Vastus = gtk_dialog_run(GTK_DIALOG(Dialog)); gint Vastus = gtk_dialog_run(GTK_DIALOG(Dialog));
if(Vastus == GTK_RESPONSE_ACCEPT) // Ava, kui vajutati accept if(Vastus == GTK_RESPONSE_ACCEPT) // Ava, kui vajutati accept
{ {
char *Nimi = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(Dialog)); char *Nimi = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(Dialog));
gchar *Sisu; gchar *Sisu;
GError *Viga = NULL; GError *Viga = NULL;
// TODO paremad veateated // TODO paremad veateated
if(g_file_get_contents(Nimi, &Sisu, NULL, &Viga)) // Proovi faili sisu lugeda if(g_file_get_contents(Nimi, &Sisu, NULL, &Viga)) // Proovi faili sisu lugeda
{ {
if(g_utf8_validate(Sisu, -1, NULL)) if(g_utf8_validate(Sisu, -1, NULL))
{ {
gtk_text_buffer_set_text(Puhver, Sisu, -1); // Kopeeri fail puhvrisse gtk_text_buffer_set_text(Puhver, Sisu, -1); // Kopeeri fail puhvrisse
gtk_text_buffer_set_modified(Tab->Puhver, FALSE); // Tekst on muutmata gtk_text_buffer_set_modified(Tab->Puhver, FALSE); // Tekst on muutmata
Tab->FailiNimi = Nimi; Tab->FailiNimi = Nimi;
UuendaTabiPealkirja(Tab, Nimi); UuendaTabiPealkirja(Tab, Nimi);
} UuendaTabMuudetud(Tab);
else }
{ else
printf("g_utf8_validate viga\n"); {
g_free(Nimi); printf("g_utf8_validate viga\n");
} g_free(Nimi);
g_free(Sisu); }
} g_free(Sisu);
else }
{ else
// Faili ei saanud lugeda {
printf("Viga faili avamisel: %s\n", Viga->message); // Faili ei saanud lugeda
g_error_free(Viga); printf("Viga faili avamisel: %s\n", Viga->message);
g_free(Nimi); g_error_free(Viga);
} g_free(Nimi);
} }
gtk_widget_destroy(Dialog); }
gtk_widget_destroy(Dialog);
} }
// Salvesta fail, tagastab 1 kui edukas // Salvesta fail, tagastab 1 kui edukas
int SalvestaFail(ui *UI, tab *Tab) int SalvestaFail(ui *UI, tab *Tab)
{ {
GtkTextBuffer *Puhver = Tab->Puhver; GtkTextBuffer *Puhver = Tab->Puhver;
char *Nimi; char *Nimi;
GtkWidget *Dialog = 0; GtkWidget *Dialog = 0;
if(Tab->FailiNimi) // Fail on juba olemas if(Tab->FailiNimi) // Fail on juba olemas
{ {
Nimi = Tab->FailiNimi; if(gtk_text_buffer_get_modified(Puhver) == 0) return; // Ära salvesta, kui midagi pole muudetud
} Nimi = Tab->FailiNimi;
else // Salvestame uue faili }
{ else // Salvestame uue faili
Dialog = gtk_file_chooser_dialog_new("Salvesta fail", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, {
"Tühista", GTK_RESPONSE_CANCEL, Dialog = gtk_file_chooser_dialog_new("Salvesta fail", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
"Salvesta", GTK_RESPONSE_ACCEPT, NULL); "Tühista", GTK_RESPONSE_CANCEL,
gint Vastus = gtk_dialog_run(GTK_DIALOG(Dialog)); "Salvesta", GTK_RESPONSE_ACCEPT, NULL);
if(Vastus == GTK_RESPONSE_ACCEPT) gint Vastus = gtk_dialog_run(GTK_DIALOG(Dialog));
{ if(Vastus == GTK_RESPONSE_ACCEPT)
Nimi = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(Dialog)); {
} Nimi = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(Dialog));
else }
{ else
gtk_widget_destroy(Dialog); {
return 0; gtk_widget_destroy(Dialog);
} return 0;
} }
}
GtkTextIter TekstA, TekstL;
gtk_text_buffer_get_start_iter(Puhver, &TekstA); GtkTextIter TekstA, TekstL;
gtk_text_buffer_get_end_iter(Puhver, &TekstL); gtk_text_buffer_get_start_iter(Puhver, &TekstA);
gchar *Sisu = gtk_text_buffer_get_text(Puhver, &TekstA, &TekstL, TRUE); gtk_text_buffer_get_end_iter(Puhver, &TekstL);
gchar *Sisu = gtk_text_buffer_get_text(Puhver, &TekstA, &TekstL, TRUE);
GError *Viga = NULL;
if(g_file_set_contents(Nimi, Sisu, -1, &Viga) == TRUE) GError *Viga = NULL;
{ if(g_file_set_contents(Nimi, Sisu, -1, &Viga) == TRUE)
gtk_text_buffer_set_modified(Tab->Puhver, FALSE); // Tekst on muutmata {
gtk_text_buffer_set_modified(Tab->Puhver, FALSE); // Tekst on muutmata
// Kui enne salvestamist failinime polńud, siis kasuta praegust
if(!Tab->FailiNimi) // Kui enne salvestamist failinime polńud, siis kasuta praegust
{ if(!Tab->FailiNimi)
Tab->FailiNimi = Nimi; {
UuendaTabiPealkirja(Tab, Nimi); Tab->FailiNimi = Nimi;
} UuendaTabiPealkirja(Tab, Nimi);
else g_free(Nimi); }
g_free(Sisu);
if(Dialog) gtk_widget_destroy(Dialog); UuendaTabMuudetud(Tab);
return 1; g_free(Sisu);
} if(Dialog) gtk_widget_destroy(Dialog);
else
{ return 1;
printf("Viga faili salvestamisel: %s\n", Viga->message); }
g_error_free(Viga); else
g_free(Nimi); {
g_free(Sisu); printf("Viga faili salvestamisel: %s\n", Viga->message);
if(Dialog) gtk_widget_destroy(Dialog); g_error_free(Viga);
g_free(Nimi);
return 0; g_free(Sisu);
} if(Dialog) gtk_widget_destroy(Dialog);
return 0;
}
} }
// Salvestab vahekaardi teksti praegusesse faili // Salvestab vahekaardi teksti praegusesse faili
void Salvesta(GtkWidget *Nupp, gpointer Data) void Salvesta(GtkWidget *Nupp, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
tab *Tab = &UI->Tabid[UI->PraeguneTab]; tab *Tab = &UI->Tabid[UI->PraeguneTab];
SalvestaFail(UI, Tab); SalvestaFail(UI, Tab);
} }
// Salvestab vahekaardi teksti vabalt valitud faili // Salvestab vahekaardi teksti vabalt valitud faili
void SalvestaNimega(GtkWidget *Nupp, gpointer Data) void SalvestaNimega(GtkWidget *Nupp, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
tab *Tab = &UI->Tabid[UI->PraeguneTab]; tab *Tab = &UI->Tabid[UI->PraeguneTab];
GtkTextBuffer *Puhver = Tab->Puhver; GtkTextBuffer *Puhver = Tab->Puhver;
GtkWidget *Dialog = gtk_file_chooser_dialog_new("Salvesta fail", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GtkWidget *Dialog = gtk_file_chooser_dialog_new("Salvesta fail", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
"Tühista", GTK_RESPONSE_CANCEL, "Tühista", GTK_RESPONSE_CANCEL,
"Salvesta", GTK_RESPONSE_ACCEPT, NULL); "Salvesta", GTK_RESPONSE_ACCEPT, NULL);
gint Vastus = gtk_dialog_run(GTK_DIALOG(Dialog)); gint Vastus = gtk_dialog_run(GTK_DIALOG(Dialog));
if(Vastus == GTK_RESPONSE_ACCEPT) if(Vastus == GTK_RESPONSE_ACCEPT)
{ {
char *Nimi = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(Dialog)); char *Nimi = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(Dialog));
GtkTextIter TekstA, TekstL; GtkTextIter TekstA, TekstL;
gtk_text_buffer_get_start_iter(Puhver, &TekstA); gtk_text_buffer_get_start_iter(Puhver, &TekstA);
gtk_text_buffer_get_end_iter(Puhver, &TekstL); gtk_text_buffer_get_end_iter(Puhver, &TekstL);
gchar *Sisu = gtk_text_buffer_get_text(Puhver, &TekstA, &TekstL, TRUE); gchar *Sisu = gtk_text_buffer_get_text(Puhver, &TekstA, &TekstL, TRUE);
gtk_text_buffer_set_modified(Puhver, FALSE); gtk_text_buffer_set_modified(Puhver, FALSE);
GError *Viga = NULL; GError *Viga = NULL;
if(g_file_set_contents(Nimi, Sisu, -1, &Viga) == TRUE) if(g_file_set_contents(Nimi, Sisu, -1, &Viga) == TRUE)
{ {
if(g_strcmp0(Nimi, Tab->FailiNimi) == 0) if(g_strcmp0(Nimi, Tab->FailiNimi) == 0)
{ {
printf("Sama fail\n"); printf("Sama fail\n");
} }
// Kui enne salvestamist failinime polńud, siis kasuta praegust // Kui enne salvestamist failinime polńud, siis kasuta praegust
if(!Tab->FailiNimi) if(!Tab->FailiNimi)
{ {
Tab->FailiNimi = Nimi; Tab->FailiNimi = Nimi;
UuendaTabiPealkirja(Tab, Nimi); UuendaTabiPealkirja(Tab, Nimi);
} }
else g_free(Nimi);
} UuendaTabMuudetud(Tab);
else }
{ else
printf("Viga faili salvestamisel: %s\n", Viga->message); {
g_error_free(Viga); printf("Viga faili salvestamisel: %s\n", Viga->message);
g_free(Nimi); g_error_free(Viga);
} g_free(Nimi);
}
g_free(Sisu);
} g_free(Sisu);
}
gtk_widget_destroy(Dialog);
gtk_widget_destroy(Dialog);
} }
// Sulgeb praeguse vahekaardi // Sulgeb praeguse vahekaardi
void SulgeVahekaart(GtkWidget *Nupp, gpointer Data) void SulgeVahekaart(GtkWidget *Nupp, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
SulgeTab(UI, UI->PraeguneTab); SulgeTab(UI, UI->PraeguneTab);
if(UI->TabidN == 0) if(UI->TabidN == 0)
{ {
gtk_widget_set_sensitive(UI->FailMenuAva, FALSE); gtk_widget_set_sensitive(UI->FailMenuAva, FALSE);
gtk_widget_set_sensitive(UI->FailMenuSalvesta, FALSE); gtk_widget_set_sensitive(UI->FailMenuSalvesta, FALSE);
gtk_widget_set_sensitive(UI->FailMenuSalvestaN, FALSE); gtk_widget_set_sensitive(UI->FailMenuSalvestaN, FALSE);
gtk_widget_set_sensitive(UI->FailMenuSulgeV, FALSE); gtk_widget_set_sensitive(UI->FailMenuSulgeV, FALSE);
} }
} }
...@@ -3,16 +3,16 @@ ...@@ -3,16 +3,16 @@
// Uuenda näidatud rida ja veergu kursori asukoha järgi // Uuenda näidatud rida ja veergu kursori asukoha järgi
void UuendaRidaVeerg(GtkTextBuffer *Puhver, GtkStatusbar *StatusBar) void UuendaRidaVeerg(GtkTextBuffer *Puhver, GtkStatusbar *StatusBar)
{ {
GtkTextIter Iter; GtkTextIter Iter;
// Leia kursori asukoht // Leia kursori asukoht
gtk_text_buffer_get_iter_at_mark(Puhver, &Iter, gtk_text_buffer_get_insert(Puhver)); gtk_text_buffer_get_iter_at_mark(Puhver, &Iter, gtk_text_buffer_get_insert(Puhver));
// Võta selle rida ja veerg // Võta selle rida ja veerg
gint Rida = gtk_text_iter_get_line(&Iter); gint Rida = gtk_text_iter_get_line(&Iter);
gint Veerg = gtk_text_iter_get_line_offset(&Iter); gint Veerg = gtk_text_iter_get_line_offset(&Iter);
gtk_statusbar_pop(StatusBar, 0); // Võta eelmine tekst ära gtk_statusbar_pop(StatusBar, 0); // Võta eelmine tekst ära
gchar *Tekst = g_strdup_printf("%d:%d", Rida + 1, Veerg + 1); // Loo string rea ja veeruga gchar *Tekst = g_strdup_printf("%d:%d", Rida + 1, Veerg + 1); // Loo string rea ja veeruga
gtk_statusbar_push(StatusBar, 0, Tekst); // Näita teksti gtk_statusbar_push(StatusBar, 0, Tekst); // Näita teksti
g_free(Tekst); g_free(Tekst);
} }
...@@ -3,128 +3,150 @@ ...@@ -3,128 +3,150 @@
// Loo uus vahekaart ja pane see lõppu // Loo uus vahekaart ja pane see lõppu
void LisaTab(ui *UI) void LisaTab(ui *UI)
{ {
int TabidN = UI->TabidN; int TabidN = UI->TabidN;
if(TabidN == 0) if(TabidN == 0)
{ {
UI->Tabid = g_malloc(sizeof(tab)); // Loo massiiv, kui see pole olemas UI->Tabid = g_malloc(sizeof(tab)); // Loo massiiv, kui see pole olemas
} }
else else
{ {
UI->Tabid = g_realloc(UI->Tabid, sizeof(tab) * (TabidN + 1)); // Lisa vahekaart massiivi UI->Tabid = g_realloc(UI->Tabid, sizeof(tab) * (TabidN + 1)); // Lisa vahekaart massiivi
} }
tab *Tab = &UI->Tabid[TabidN]; tab *Tab = &UI->Tabid[TabidN];
UI->TabidN++; UI->TabidN++;
Tab->FailiNimi = 0; // Faili veel pole Tab->FailiNimi = 0; // Faili veel pole
Tab->Aken = UI->Aken; Tab->Aken = UI->Aken;
// Tekstiaken // Tekstiaken
#ifdef SOURCEVIEW Tab->TextView = gtk_source_view_new(); // Loo tekstiaken
Tab->TextView = gtk_source_view_new(); // Loo tekstiaken Tab->Puhver = gtk_text_view_get_buffer(GTK_TEXT_VIEW(Tab->TextView)); // Tekstiakna teksti puhver
#else Tab->OnMuudetud = 0;
Tab->TextView = gtk_text_view_new(); // Loo tekstiaken
#endif // Scroll window
Tab->Puhver = gtk_text_view_get_buffer(GTK_TEXT_VIEW(Tab->TextView)); // Tekstiakna teksti puhver Tab->ScrollWindow = gtk_scrolled_window_new(NULL, NULL); // Loo scroll aken
gtk_container_add(GTK_CONTAINER(Tab->ScrollWindow), Tab->TextView); // Scroll aknasse läheb tekstiaken
// Scroll window gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(Tab->ScrollWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); // Konfigureerimine
Tab->ScrollWindow = gtk_scrolled_window_new(NULL, NULL); // Loo scroll aken gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(Tab->ScrollWindow), GTK_SHADOW_ETCHED_IN);
gtk_container_add(GTK_CONTAINER(Tab->ScrollWindow), Tab->TextView); // Scroll aknasse läheb tekstiaken // Status bar
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(Tab->ScrollWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); // Konfigureerimine Tab->StatusBar = gtk_statusbar_new();
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(Tab->ScrollWindow), GTK_SHADOW_ETCHED_IN); // Teksti muutuse callback
// Status bar g_signal_connect(Tab->Puhver, "changed", G_CALLBACK(TekstMuudetud), Tab);
Tab->StatusBar = gtk_statusbar_new(); // Modified callback
// Teksti muutuse callback, uuendab rida/veergu g_signal_connect(Tab->Puhver, "modified-changed", G_CALLBACK(TekstModified), Tab);
g_signal_connect(Tab->Puhver, "changed", G_CALLBACK(UuendaRidaVeerg), Tab->StatusBar); // Copy/paste lohistamise callback, uuendab samuti
// Copy/paste lohistamise callback, uuendab samuti g_signal_connect_object(Tab->Puhver, "mark_set", G_CALLBACK(TekstMarkSet), Tab->StatusBar, 0);
g_signal_connect_object(Tab->Puhver, "mark_set", G_CALLBACK(TekstMarkSet), Tab->StatusBar, 0);
// Box
// Box Tab->Box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); // Vertikaalne box, 0px vahe
Tab->Box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); // Vertikaalne box, 0px vahe gtk_box_pack_start(GTK_BOX(Tab->Box), Tab->ScrollWindow, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(Tab->Box), Tab->ScrollWindow, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(Tab->Box), Tab->StatusBar, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(Tab->Box), Tab->StatusBar, FALSE, FALSE, 0);
// Pealkiri
// Pealkiri Tab->Pealkiri = gtk_label_new("(uus)");
Tab->Pealkiri = gtk_label_new("(uus)"); Tab->PealkiriTekst = "(uus)";
// Lisa loodud tab notebook'i Tab->LangManager = gtk_source_language_manager_get_default();
gtk_notebook_append_page(GTK_NOTEBOOK(UI->Notebook), Tab->Box, Tab->Pealkiri); Tab->Language = gtk_source_language_manager_get_language(Tab->LangManager, "c");
gtk_widget_show_all(UI->Notebook); // Värskenda, et näha oleks gtk_source_buffer_set_language(Tab->Puhver, Tab->Language);
UuendaRidaVeerg(GTK_TEXT_BUFFER(Tab->Puhver), GTK_STATUSBAR(Tab->StatusBar)); // Uuenda status bar'i, et seal midagi oleks // Lisa loodud tab notebook'i
gtk_notebook_append_page(GTK_NOTEBOOK(UI->Notebook), Tab->Box, Tab->Pealkiri);
gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW(Tab->TextView), TRUE); //naita reanumbrid gtk_widget_show_all(UI->Notebook); // Värskenda, et näha oleks
UuendaRidaVeerg(GTK_TEXT_BUFFER(Tab->Puhver), GTK_STATUSBAR(Tab->StatusBar)); // Uuenda status bar'i, et seal midagi oleks
gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW(Tab->TextView), TRUE); //naita reanumbrid
} }
// Kustuta vahekaarti indeksil // Kustuta vahekaarti indeksil
void KustutaTab(ui *UI, int Indeks) void KustutaTab(ui *UI, int Indeks)
{ {
// Kustuta vahekaart // Kustuta vahekaart
gtk_notebook_remove_page(GTK_NOTEBOOK(UI->Notebook), Indeks); gtk_notebook_remove_page(GTK_NOTEBOOK(UI->Notebook), Indeks);
int TabidN = UI->TabidN; int TabidN = UI->TabidN;
// Kui massiivis on pärast kustutatud vahekaarti neid veel, // Kui massiivis on pärast kustutatud vahekaarti neid veel,
// siis nihuta need õigele kohale // siis nihuta need õigele kohale
for(int i = Indeks; i < TabidN - 1; i++) for(int i = Indeks; i < TabidN - 1; i++)
{ {
UI->Tabid[i] = UI->Tabid[i + 1]; UI->Tabid[i] = UI->Tabid[i + 1];
} }
if(TabidN == 1) if(TabidN == 1)
{ {
g_free(UI->Tabid); // Vabasta massiiv, kui see on nüüd tühi g_free(UI->Tabid); // Vabasta massiiv, kui see on nüüd tühi
} }
else else
{ {
UI->Tabid = g_realloc(UI->Tabid, sizeof(tab) * (TabidN - 1)); // Eemalda vahekaart massiivist UI->Tabid = g_realloc(UI->Tabid, sizeof(tab) * (TabidN - 1)); // Eemalda vahekaart massiivist
} }
UI->TabidN--; UI->TabidN--;
} }
// Uuenda vahekaardi pealkirja (faili nime) // Uuenda vahekaardi pealkirja (faili nime)
void UuendaTabiPealkirja(tab *Tab, char *Nimi) void UuendaTabiPealkirja(tab *Tab, char *Nimi)
{ {
char *Tekst = g_path_get_basename(Nimi); // Eralda faili nimi Tab->PealkiriTekst = g_path_get_basename(Nimi); // Eralda faili nimi
gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tekst); gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tab->PealkiriTekst);
g_free(Tekst);
// Terve faili nimi tooltip'is // Terve faili nimi tooltip'is
gtk_widget_set_tooltip_text(Tab->Pealkiri, Nimi); gtk_widget_set_tooltip_text(Tab->Pealkiri, Nimi);
}
void UuendaTabMuudetud(tab *Tab)
{
int Muudetud = gtk_text_buffer_get_modified(Tab->Puhver);
if(Tab->OnMuudetud == 0)
{
char *Tekst = g_strdup_printf("%s *", gtk_label_get_text(Tab->Pealkiri));
gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tekst);
g_free(Tekst);
Tab->OnMuudetud = 1;
}
else if(!Muudetud)
{
gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tab->PealkiriTekst);
Tab->OnMuudetud = 0;
}
} }
// Kutsutakse igal vahekaardi muutmisel // Kutsutakse igal vahekaardi muutmisel
void TabMuudetud(GtkWidget *Notebook, GtkWidget *Tab, guint Indeks, gpointer Data) void TabMuudetud(GtkWidget *Notebook, GtkWidget *Tab, guint Indeks, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
UI->PraeguneTab = Indeks; UI->PraeguneTab = Indeks;
} }
// Sulge praegune vahekaart, väljastab 1, kui vahekaart suleti, 0 kui mitte // Sulge praegune vahekaart, väljastab 1, kui vahekaart suleti, 0 kui mitte
int SulgeTab(ui *UI, int Indeks) int SulgeTab(ui *UI, int Indeks)
{ {
tab *Tab = &UI->Tabid[Indeks]; tab *Tab = &UI->Tabid[Indeks];
// Kui tekst on muudetud, siis küsi üle, kas salvestada // Kui tekst on muudetud, siis küsi üle, kas salvestada
if(gtk_text_buffer_get_modified(Tab->Puhver)) if(gtk_text_buffer_get_modified(Tab->Puhver))
{ {
GtkWidget *MsgDialog = gtk_message_dialog_new(UI->Aken, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GtkWidget *MsgDialog = gtk_message_dialog_new(UI->Aken, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION,
GTK_BUTTONS_NONE, GTK_BUTTONS_NONE,
"Salvesta fail enne sulgemist?"); "Salvesta fail enne sulgemist?");
gtk_dialog_add_buttons(MsgDialog, "Jah", 0, "Ei", 1, "Loobu", 2, NULL); gtk_dialog_add_buttons(MsgDialog, "Jah", 0, "Ei", 1, "Loobu", 2, NULL);
gint Vastus = gtk_dialog_run(GTK_DIALOG(MsgDialog)); gint Vastus = gtk_dialog_run(GTK_DIALOG(MsgDialog));
gtk_widget_destroy(MsgDialog); gtk_widget_destroy(MsgDialog);
if(Vastus == 0) // Jah if(Vastus == 0) // Jah
{ {
// Kui fail salvestati, siis jätka, muidu ära tee midagi // Kui fail salvestati, siis jätka, muidu ära tee midagi
if(SalvestaFail(UI, Tab)) {} if(SalvestaFail(UI, Tab)) {}
else return 0; else return 0;
} }
else if(Vastus == 1) {} // Ei else if(Vastus == 1) {} // Ei
else return 0; else return 0;
} }
KustutaTab(UI, Indeks); KustutaTab(UI, Indeks);
return 1; return 1;
} }
#include "textview.h" #include "textview.h"
// Teksti muutmise callback
void TekstMuudetud(GtkTextBuffer *Puhver, tab *Tab)
{
UuendaRidaVeerg(Tab->Puhver, Tab->StatusBar);
}
// Teksti modified olek muutus
void TekstModified(GtkTextBuffer *Puhver, tab *Tab)
{
UuendaTabMuudetud(Tab);
}
// Kutsutakse copy/paste lohistamise korral, praegu lihtsalt uuendab rida/veergu // Kutsutakse copy/paste lohistamise korral, praegu lihtsalt uuendab rida/veergu
void TekstMarkSet(GtkTextBuffer *Puhver, const GtkTextIter *new_location, GtkTextMark *Mark, gpointer Data) void TekstMarkSet(GtkTextBuffer *Puhver, const GtkTextIter *new_location, GtkTextMark *Mark, gpointer Data)
{ {
UuendaRidaVeerg(Puhver, GTK_STATUSBAR(Data)); UuendaRidaVeerg(Puhver, GTK_STATUSBAR(Data));
} }
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
#include "ceditor.h" #include "ceditor.h"
void TekstMuudetud(GtkTextBuffer *Puhver, tab *Tab);
void TekstModified(GtkTextBuffer *Puhver, tab *Tab);
void TekstMarkSet(GtkTextBuffer *Puhver, const GtkTextIter *new_location, GtkTextMark *Mark, gpointer Data); void TekstMarkSet(GtkTextBuffer *Puhver, const GtkTextIter *new_location, GtkTextMark *Mark, gpointer Data);
#endif // TEXTVIEW_H #endif // TEXTVIEW_H
...@@ -3,126 +3,126 @@ ...@@ -3,126 +3,126 @@
// Sulge programm, tagastab 1 kui kõik vahekaardid sulgeti, 0 kui mitte // Sulge programm, tagastab 1 kui kõik vahekaardid sulgeti, 0 kui mitte
int Sulge(ui *UI) int Sulge(ui *UI)
{ {
for(int i = UI->TabidN - 1; i > -1; i--) for(int i = UI->TabidN - 1; i > -1; i--)
{ {
gtk_notebook_set_current_page(UI->Notebook, i); gtk_notebook_set_current_page(UI->Notebook, i);
if(SulgeTab(UI, i)) if(SulgeTab(UI, i))
{ {
continue; continue;
} }
else else
{ {
gtk_notebook_set_current_page(UI->Notebook, UI->PraeguneTab); gtk_notebook_set_current_page(UI->Notebook, UI->PraeguneTab);
return 0; return 0;
} }
} }
return 1; return 1;
} }
gboolean SulgeAken(GtkWidget *Nupp, GdkEvent *Event, gpointer Data) gboolean SulgeAken(GtkWidget *Nupp, GdkEvent *Event, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
if(Sulge(UI)) if(Sulge(UI))
{ {
gtk_main_quit(); gtk_main_quit();
return FALSE; return FALSE;
} else return TRUE; } else return TRUE;
} }
// Väljub rakendusest // Väljub rakendusest
void Valju(GtkWidget *Nupp, gpointer Data) void Valju(GtkWidget *Nupp, gpointer Data)
{ {
ui *UI = (ui *)Data; ui *UI = (ui *)Data;
if(Sulge(UI)) gtk_main_quit();; if(Sulge(UI)) gtk_main_quit();;
} }
// Lisa menüüsse menu item // Lisa menüüsse menu item
void LisaMenuItem(ui *UI, GtkWidget *Menu, GtkWidget *MenuItem, void *Callback, guint Nupp, GdkModifierType NuppMask) void LisaMenuItem(ui *UI, GtkWidget *Menu, GtkWidget *MenuItem, void *Callback, guint Nupp, GdkModifierType NuppMask)
{ {
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_signal_connect(MenuItem, "activate", G_CALLBACK(Callback), UI); g_signal_connect(MenuItem, "activate", G_CALLBACK(Callback), UI);
if(Nupp) gtk_widget_add_accelerator(MenuItem, "activate", UI->AccelGroup, Nupp, NuppMask, GTK_ACCEL_VISIBLE); if(Nupp) gtk_widget_add_accelerator(MenuItem, "activate", UI->AccelGroup, Nupp, NuppMask, GTK_ACCEL_VISIBLE);
} }
// Loo programmi kasutajaliides // Loo programmi kasutajaliides
ui *LooUI() ui *LooUI()
{ {
ui *UI = g_malloc(sizeof(ui)); ui *UI = g_malloc(sizeof(ui));
// Aken // Aken
UI->Aken = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Loo aken UI->Aken = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Loo aken
gtk_window_set_position(GTK_WINDOW(UI->Aken), GTK_WIN_POS_CENTER); // Aken ekraani keskel gtk_window_set_position(GTK_WINDOW(UI->Aken), GTK_WIN_POS_CENTER); // Aken ekraani keskel
gtk_window_set_default_size(GTK_WINDOW(UI->Aken), 800, 600); // Akna suurus gtk_window_set_default_size(GTK_WINDOW(UI->Aken), 800, 600); // Akna suurus
gtk_window_set_title(GTK_WINDOW(UI->Aken), PEALKIRI); // Pealkiri gtk_window_set_title(GTK_WINDOW(UI->Aken), PEALKIRI); // Pealkiri
g_signal_connect(UI->Aken, "delete-event", G_CALLBACK(SulgeAken), UI); // Close nupu callback g_signal_connect(UI->Aken, "delete-event", G_CALLBACK(SulgeAken), UI); // Close nupu callback
// Box // Box
UI->Box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); // Vertikaalne box, 0px vahe UI->Box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); // Vertikaalne box, 0px vahe
gtk_container_add(GTK_CONTAINER(UI->Aken), UI->Box); // Pane box aknasse gtk_container_add(GTK_CONTAINER(UI->Aken), UI->Box); // Pane box aknasse
// Notebook // Notebook
UI->Notebook = gtk_notebook_new(); UI->Notebook = gtk_notebook_new();
g_signal_connect(UI->Notebook, "switch-page", G_CALLBACK(TabMuudetud), UI); // Tab'i muutmise callback g_signal_connect(UI->Notebook, "switch-page", G_CALLBACK(TabMuudetud), UI); // Tab'i muutmise callback
// Loo esimene tab // Loo esimene tab
UI->TabidN = 0; UI->TabidN = 0;
LisaTab(UI); LisaTab(UI);
UI->PraeguneTab = 0; UI->PraeguneTab = 0;
// Accel group // Accel group
UI->AccelGroup = gtk_accel_group_new(); UI->AccelGroup = gtk_accel_group_new();
gtk_window_add_accel_group(UI->Aken, UI->AccelGroup); gtk_window_add_accel_group(UI->Aken, UI->AccelGroup);
// Menu bar // Menu bar
UI->MenuBar = gtk_menu_bar_new(); // Loo menu bar UI->MenuBar = gtk_menu_bar_new(); // Loo menu bar
GtkWidget *FailMenuNupp = gtk_menu_item_new_with_label("Fail"); // Fail GtkWidget *FailMenuNupp = gtk_menu_item_new_with_label("Fail"); // Fail
GtkWidget *AboutMenuNupp = gtk_menu_item_new_with_label("About"); // About GtkWidget *AboutMenuNupp = gtk_menu_item_new_with_label("About"); // About
GtkWidget *FailMenu = gtk_menu_new(); // Fail menüü GtkWidget *FailMenu = gtk_menu_new(); // Fail menüü
GtkWidget *FailMenuUus = gtk_menu_item_new_with_label("Uus vahekaart"); // Fail->Uus vahekaart GtkWidget *FailMenuUus = gtk_menu_item_new_with_label("Uus vahekaart"); // Fail->Uus vahekaart
GtkWidget *FailMenuAva = gtk_menu_item_new_with_label("Ava"); // Fail->Ava GtkWidget *FailMenuAva = gtk_menu_item_new_with_label("Ava"); // Fail->Ava
UI->FailMenuAva = FailMenuAva; UI->FailMenuAva = FailMenuAva;
GtkWidget *FailMenuSalvesta = gtk_menu_item_new_with_label("Salvesta"); // Fail->Salvesta GtkWidget *FailMenuSalvesta = gtk_menu_item_new_with_label("Salvesta"); // Fail->Salvesta
UI->FailMenuSalvesta = FailMenuSalvesta; UI->FailMenuSalvesta = FailMenuSalvesta;
GtkWidget *FailMenuSalvestaN = gtk_menu_item_new_with_label("Salvesta nimega"); // Fail->Salvesta nimega GtkWidget *FailMenuSalvestaN = gtk_menu_item_new_with_label("Salvesta nimega"); // Fail->Salvesta nimega
UI->FailMenuSalvestaN = FailMenuSalvestaN; UI->FailMenuSalvestaN = FailMenuSalvestaN;
GtkWidget *FailMenuSulgeV = gtk_menu_item_new_with_label("Sulge vahekaart"); // Fail->Sulge vahekaart GtkWidget *FailMenuSulgeV = gtk_menu_item_new_with_label("Sulge vahekaart"); // Fail->Sulge vahekaart
UI->FailMenuSulgeV = FailMenuSulgeV; UI->FailMenuSulgeV = FailMenuSulgeV;
GtkWidget *FailMenuValju = gtk_menu_item_new_with_label("Välju"); // Fail->Välju GtkWidget *FailMenuValju = gtk_menu_item_new_with_label("Välju"); // Fail->Välju
// Menüü nupud menu bar'i // Menüü nupud menu bar'i
gtk_menu_shell_append(GTK_MENU_SHELL(UI->MenuBar), FailMenuNupp); gtk_menu_shell_append(GTK_MENU_SHELL(UI->MenuBar), FailMenuNupp);
gtk_menu_shell_append(GTK_MENU_SHELL(UI->MenuBar), AboutMenuNupp); gtk_menu_shell_append(GTK_MENU_SHELL(UI->MenuBar), AboutMenuNupp);
// Menüüd nuppudesse // Menüüd nuppudesse
gtk_menu_item_set_submenu(GTK_MENU_ITEM(FailMenuNupp), FailMenu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(FailMenuNupp), FailMenu);
// Fail menüü // Fail menüü
LisaMenuItem(UI, FailMenu, FailMenuUus, Uus, GDK_KEY_N, GDK_CONTROL_MASK); // Fail->Uus vahekaart LisaMenuItem(UI, FailMenu, FailMenuUus, Uus, GDK_KEY_N, GDK_CONTROL_MASK); // Fail->Uus vahekaart
MenuSeparator(FailMenu); MenuSeparator(FailMenu);
LisaMenuItem(UI, FailMenu, FailMenuAva, Ava, GDK_KEY_O, GDK_CONTROL_MASK); // Fail->Ava LisaMenuItem(UI, FailMenu, FailMenuAva, Ava, GDK_KEY_O, GDK_CONTROL_MASK); // Fail->Ava
LisaMenuItem(UI, FailMenu, FailMenuSalvesta, Salvesta, GDK_KEY_S, GDK_CONTROL_MASK); // Fail->Salvesta LisaMenuItem(UI, FailMenu, FailMenuSalvesta, Salvesta, GDK_KEY_S, GDK_CONTROL_MASK); // Fail->Salvesta
LisaMenuItem(UI, FailMenu, FailMenuSalvestaN, SalvestaNimega, GDK_KEY_S, GDK_CONTROL_MASK|GDK_MOD1_MASK); // Fail->Salvesta nimega LisaMenuItem(UI, FailMenu, FailMenuSalvestaN, SalvestaNimega, GDK_KEY_S, GDK_CONTROL_MASK|GDK_MOD1_MASK); // Fail->Salvesta nimega
MenuSeparator(FailMenu); MenuSeparator(FailMenu);
LisaMenuItem(UI, FailMenu, FailMenuSulgeV, SulgeVahekaart, GDK_KEY_W, GDK_CONTROL_MASK); // Fail->Sulge vahekaart LisaMenuItem(UI, FailMenu, FailMenuSulgeV, SulgeVahekaart, GDK_KEY_W, GDK_CONTROL_MASK); // Fail->Sulge vahekaart
MenuSeparator(FailMenu); MenuSeparator(FailMenu);
LisaMenuItem(UI, FailMenu, FailMenuValju, Valju, GDK_KEY_Q, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Fail->Välju LisaMenuItem(UI, FailMenu, FailMenuValju, Valju, GDK_KEY_Q, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Fail->Välju
//ToolBar //ToolBar
UI->ToolBar = gtk_toolbar_new(); UI->ToolBar = gtk_toolbar_new();
gtk_toolbar_set_style(GTK_TOOLBAR(UI->ToolBar), GTK_TOOLBAR_ICONS); gtk_toolbar_set_style(GTK_TOOLBAR(UI->ToolBar), GTK_TOOLBAR_ICONS);
GtkWidget *UndoIcon = gtk_image_new_from_icon_name(GTK_STOCK_UNDO, 5); GtkWidget *UndoIcon = gtk_image_new_from_icon_name(GTK_STOCK_UNDO, 5);
UI->Undo = gtk_tool_button_new(UndoIcon, "undo"); UI->Undo = gtk_tool_button_new(UndoIcon, "undo");
GtkWidget *RedoIcon = gtk_image_new_from_icon_name(GTK_STOCK_REDO, 5); GtkWidget *RedoIcon = gtk_image_new_from_icon_name(GTK_STOCK_REDO, 5);
UI->Redo = gtk_tool_button_new(RedoIcon, "redo"); UI->Redo = gtk_tool_button_new(RedoIcon, "redo");
//nupud toolbarile //nupud toolbarile
gtk_toolbar_insert(GTK_TOOLBAR(UI->ToolBar), UI->Undo, -1); gtk_toolbar_insert(GTK_TOOLBAR(UI->ToolBar), UI->Undo, -1);
gtk_toolbar_insert(GTK_TOOLBAR(UI->ToolBar), UI->Redo, -1); gtk_toolbar_insert(GTK_TOOLBAR(UI->ToolBar), UI->Redo, -1);
// Pane kõik õiges järjekorras box'i // Pane kõik õiges järjekorras box'i
gtk_box_pack_start(GTK_BOX(UI->Box), UI->MenuBar, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(UI->Box), UI->MenuBar, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(UI->Box), UI->ToolBar, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(UI->Box), UI->ToolBar, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(UI->Box), UI->Notebook, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(UI->Box), UI->Notebook, TRUE, TRUE, 0);
return UI; return UI;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment