Commit 43e3d3dd by Herman Ounas

Merge branch 'Karl' into Herman

parents 607fda03 3879d569
#include "ceditor.h"
#include "ui.h"
/* TODO
Klahvikombinatsioonid
*/
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
......
......@@ -4,9 +4,7 @@
#include <gtk/gtk.h>
#ifdef SOURCEVIEW
#include <gtksourceview/gtksource.h>
#endif
typedef struct
{
......@@ -14,11 +12,15 @@ typedef struct
char *FailiNimi; // Viit faili nimele, 0 kui nime veel pole
GtkWidget *Pealkiri; // Vahekaardi pealkiri
char *PealkiriTekst; // Originaalne pealkirja tekst
GtkWidget *Box; // Vahekaardi box
GtkWidget *TextView; // Vahekaardi tekstiaken
GtkTextView *Puhver; // Vahekaardi tekstipuhver
GtkWidget *ScrollWindow; // Tekstiakna scroll
GtkWidget *StatusBar; // Status bar
GtkSourceLanguageManager *LangManager;
GtkSourceLanguage *Language;
} tab;
typedef struct
......@@ -28,6 +30,7 @@ typedef struct
GtkWidget *MenuBar; // Ülaosa menüü
GtkWidget *Notebook; // Notebook vahekaartidega
GtkWidget *ToolBar; //Tool bar
GtkWidget *AccelGroup; // Accel group nuppude jaoks
// Viited nuppudele nende sisse/välja lülitamiseks
GtkWidget *FailMenuAva;
......@@ -42,6 +45,9 @@ typedef struct
//toolbari nupud
GtkToolItem *Undo; //undo nupp
GtkToolItem *Redo; //redo nupp
GKeyFile *Seaded; // Seadete fail
char *SeadedNimi; // Seadete faili nimi
} ui;
#endif // CEDITOR_H
#include "compiler.h"
// Salvesta kompilaatori seaded ja sulge aken
void SalvestaSeaded(GtkWidget *Nupp, gpointer Data)
{
puhvrid *Puhvrid = (puhvrid *)Data;
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "nimi", gtk_entry_buffer_get_text(Puhvrid->PuhverNimi));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "seaded", gtk_entry_buffer_get_text(Puhvrid->PuhverSeaded));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "asukoht", gtk_entry_buffer_get_text(Puhvrid->PuhverAsukoht));
g_key_file_save_to_file(Puhvrid->Seaded, Puhvrid->SeadedNimi, 0);
gtk_widget_destroy(GTK_WIDGET(Puhvrid->Aken));
g_free(Puhvrid);
}
// Sulge aken
void SulgeSeaded(GtkWidget *Nupp, gpointer Data)
{
puhvrid *Puhvrid = (puhvrid *)Data;
gtk_widget_destroy(GTK_WIDGET(Puhvrid->Aken));
g_free(Puhvrid);
}
// Kompilaatori seadete aken
void KompilaatoriSeaded(GtkWidget *Nupp, gpointer Data)
{
ui *UI = (ui *)Data;
GtkWindow *Aken = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(Aken, 400, 180); // Akna suurus
gtk_window_set_title(Aken, "Kompilaatori seaded"); // Pealkiri
gtk_window_set_type_hint(Aken, GDK_WINDOW_TYPE_HINT_DIALOG);
GtkBox *Box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(Aken), Box); // Pane box aknasse
GtkBox *HBox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkBox *HBox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkBox *HBox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkBox *HBox4 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkLabel *LabelNimi = gtk_label_new("Nimi");
GtkLabel *LabelSeaded = gtk_label_new("Seaded");
GtkLabel *LabelAsukoht = gtk_label_new("Asukoht");
GtkEntry *EntryNimi = gtk_entry_new();
gtk_entry_set_width_chars(EntryNimi, 40);
GtkEntry *EntrySeaded = gtk_entry_new();
gtk_entry_set_width_chars(EntrySeaded, 40);
GtkEntry *EntryAsukoht = gtk_entry_new();
gtk_entry_set_width_chars(EntryAsukoht, 40);
GtkEntryBuffer *PuhverNimi = gtk_entry_get_buffer(EntryNimi);
GtkEntryBuffer *PuhverSeaded = gtk_entry_get_buffer(EntrySeaded);
GtkEntryBuffer *PuhverAsukoht = gtk_entry_get_buffer(EntryAsukoht);
gtk_box_pack_start(HBox1, GTK_WIDGET(LabelNimi), FALSE, FALSE, 8);
gtk_box_pack_start(HBox1, GTK_WIDGET(EntryNimi), FALSE, FALSE, 33);
gtk_box_pack_start(HBox2, GTK_WIDGET(LabelSeaded), FALSE, FALSE, 8);
gtk_box_pack_start(HBox2, GTK_WIDGET(EntrySeaded), FALSE, FALSE, 11);
gtk_box_pack_start(HBox3, GTK_WIDGET(LabelAsukoht), FALSE, FALSE, 8);
gtk_box_pack_start(HBox3, GTK_WIDGET(EntryAsukoht), FALSE, FALSE, 4);
char *Nimi = g_key_file_get_string(UI->Seaded, "Kompilaator", "nimi", NULL);
if(Nimi) gtk_entry_buffer_set_text(PuhverNimi, Nimi, -1);
char *Seaded = g_key_file_get_string(UI->Seaded, "Kompilaator", "seaded", NULL);
if(Seaded) gtk_entry_buffer_set_text(PuhverSeaded, Seaded, -1);
char *Asukoht = g_key_file_get_string(UI->Seaded, "Kompilaator", "asukoht", NULL);
if(Asukoht) gtk_entry_buffer_set_text(PuhverAsukoht, Asukoht, -1);
puhvrid *Puhvrid = malloc(sizeof(puhvrid));
Puhvrid->Aken = Aken;
Puhvrid->Seaded = UI->Seaded;
Puhvrid->SeadedNimi = UI->SeadedNimi;
Puhvrid->PuhverNimi = PuhverNimi;
Puhvrid->PuhverSeaded = PuhverSeaded;
Puhvrid->PuhverAsukoht = PuhverAsukoht;
GtkButton *NuppSalvesta = gtk_button_new_with_label("Salvesta");
GtkButton *NuppValju = gtk_button_new_with_label("Välju");
g_signal_connect(NuppSalvesta, "clicked", G_CALLBACK(SalvestaSeaded), Puhvrid);
g_signal_connect(NuppValju, "clicked", G_CALLBACK(SulgeSeaded), Puhvrid);
gtk_box_pack_start(HBox4, GTK_WIDGET(NuppSalvesta), FALSE, FALSE, 100);
gtk_box_pack_start(HBox4, GTK_WIDGET(NuppValju), FALSE, FALSE, 8);
gtk_box_pack_start(Box, GTK_WIDGET(HBox1), FALSE, FALSE, 4);
gtk_box_pack_start(Box, GTK_WIDGET(HBox2), FALSE, FALSE, 4);
gtk_box_pack_start(Box, GTK_WIDGET(HBox3), FALSE, FALSE, 4);
gtk_box_pack_start(Box, GTK_WIDGET(HBox4), FALSE, FALSE, 8);
gtk_widget_show_all(Aken);
}
#ifndef COMPILER_H
#define COMPILER_H
#include "ceditor.h"
typedef struct
{
GtkWindow *Aken;
GKeyFile *Seaded;
char *SeadedNimi;
GtkEntryBuffer *PuhverNimi;
GtkEntryBuffer *PuhverSeaded;
GtkEntryBuffer *PuhverAsukoht;
} puhvrid;
void KompilaatoriSeaded(GtkWidget *Nupp, gpointer Data);
#endif // COMPILER_H
......@@ -44,6 +44,7 @@ void Ava(GtkWidget *Nupp, gpointer Data)
gtk_text_buffer_set_modified(Tab->Puhver, FALSE); // Tekst on muutmata
Tab->FailiNimi = Nimi;
UuendaTabiPealkirja(Tab, Nimi);
UuendaTabMuudetud(Tab);
}
else
{
......@@ -72,6 +73,7 @@ int SalvestaFail(ui *UI, tab *Tab)
GtkWidget *Dialog = 0;
if(Tab->FailiNimi) // Fail on juba olemas
{
if(gtk_text_buffer_get_modified(Puhver) == 0) return; // Ära salvesta, kui midagi pole muudetud
Nimi = Tab->FailiNimi;
}
else // Salvestame uue faili
......@@ -107,7 +109,9 @@ int SalvestaFail(ui *UI, tab *Tab)
Tab->FailiNimi = Nimi;
UuendaTabiPealkirja(Tab, Nimi);
}
else g_free(Nimi);
UuendaTabMuudetud(Tab);
g_free(Sisu);
if(Dialog) gtk_widget_destroy(Dialog);
......@@ -170,7 +174,8 @@ void SalvestaNimega(GtkWidget *Nupp, gpointer Data)
Tab->FailiNimi = Nimi;
UuendaTabiPealkirja(Tab, Nimi);
}
else g_free(Nimi);
UuendaTabMuudetud(Tab);
}
else
{
......
......@@ -20,12 +20,9 @@ void LisaTab(ui *UI)
Tab->Aken = UI->Aken;
// Tekstiaken
#ifdef SOURCEVIEW
Tab->TextView = gtk_source_view_new(); // Loo tekstiaken
#else
Tab->TextView = gtk_text_view_new(); // Loo tekstiaken
#endif
Tab->Puhver = gtk_text_view_get_buffer(GTK_TEXT_VIEW(Tab->TextView)); // Tekstiakna teksti puhver
Tab->OnMuudetud = 0;
// Scroll window
Tab->ScrollWindow = gtk_scrolled_window_new(NULL, NULL); // Loo scroll aken
......@@ -34,8 +31,10 @@ void LisaTab(ui *UI)
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(Tab->ScrollWindow), GTK_SHADOW_ETCHED_IN);
// Status bar
Tab->StatusBar = gtk_statusbar_new();
// Teksti muutuse callback, uuendab rida/veergu
g_signal_connect(Tab->Puhver, "changed", G_CALLBACK(UuendaRidaVeerg), Tab->StatusBar);
// Teksti muutuse callback
g_signal_connect(Tab->Puhver, "changed", G_CALLBACK(TekstMuudetud), Tab);
// Modified callback
g_signal_connect(Tab->Puhver, "modified-changed", G_CALLBACK(TekstModified), Tab);
// Copy/paste lohistamise callback, uuendab samuti
g_signal_connect_object(Tab->Puhver, "mark_set", G_CALLBACK(TekstMarkSet), Tab->StatusBar, 0);
......@@ -46,6 +45,11 @@ void LisaTab(ui *UI)
// Pealkiri
Tab->Pealkiri = gtk_label_new("(uus)");
Tab->PealkiriTekst = "(uus)";
Tab->LangManager = gtk_source_language_manager_get_default();
Tab->Language = gtk_source_language_manager_get_language(Tab->LangManager, "c");
gtk_source_buffer_set_language(Tab->Puhver, Tab->Language);
// Lisa loodud tab notebook'i
gtk_notebook_append_page(GTK_NOTEBOOK(UI->Notebook), Tab->Box, Tab->Pealkiri);
......@@ -84,13 +88,27 @@ void KustutaTab(ui *UI, int Indeks)
// Uuenda vahekaardi pealkirja (faili nime)
void UuendaTabiPealkirja(tab *Tab, char *Nimi)
{
char *Tekst = g_path_get_basename(Nimi); // Eralda faili nimi
gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tekst);
g_free(Tekst);
Tab->PealkiriTekst = g_path_get_basename(Nimi); // Eralda faili nimi
gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tab->PealkiriTekst);
// Terve faili nimi tooltip'is
gtk_widget_set_tooltip_text(Tab->Pealkiri, Nimi);
}
void UuendaTabMuudetud(tab *Tab)
{
if(gtk_text_buffer_get_modified(Tab->Puhver))
{
char *Tekst = g_strdup_printf("%s *", gtk_label_get_text(Tab->Pealkiri));
gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tekst);
g_free(Tekst);
}
else
{
gtk_label_set_label(GTK_LABEL(Tab->Pealkiri), Tab->PealkiriTekst);
}
}
// Kutsutakse igal vahekaardi muutmisel
void TabMuudetud(GtkWidget *Notebook, GtkWidget *Tab, guint Indeks, gpointer Data)
{
......
#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
void TekstMarkSet(GtkTextBuffer *Puhver, const GtkTextIter *new_location, GtkTextMark *Mark, gpointer Data)
{
......
......@@ -3,6 +3,8 @@
#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);
#endif // TEXTVIEW_H
......@@ -38,6 +38,14 @@ void Valju(GtkWidget *Nupp, gpointer Data)
if(Sulge(UI)) gtk_main_quit();;
}
// Lisa menüüsse menu item
void LisaMenuItem(ui *UI, GtkWidget *Menu, GtkWidget *MenuItem, void *Callback, guint Nupp, GdkModifierType NuppMask)
{
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_signal_connect(MenuItem, "activate", G_CALLBACK(Callback), UI);
if(Nupp) gtk_widget_add_accelerator(MenuItem, "activate", UI->AccelGroup, Nupp, NuppMask, GTK_ACCEL_VISIBLE);
}
// Loo programmi kasutajaliides
ui *LooUI()
{
......@@ -63,11 +71,16 @@ ui *LooUI()
LisaTab(UI);
UI->PraeguneTab = 0;
// Accel group
UI->AccelGroup = gtk_accel_group_new();
gtk_window_add_accel_group(UI->Aken, UI->AccelGroup);
// Menu bar
UI->MenuBar = gtk_menu_bar_new(); // Loo menu bar
GtkWidget *FailMenuNupp = gtk_menu_item_new_with_label("Fail"); // Fail
GtkWidget *AboutMenuNupp = gtk_menu_item_new_with_label("About"); // About
GtkWidget *FailMenu = gtk_menu_new(); // Fail menüü
GtkWidget *KompMenuNupp = gtk_menu_item_new_with_label("Kompileeri"); // Kompileeri
// Fail menüü
GtkWidget *FailMenu = gtk_menu_new();
GtkWidget *FailMenuUus = gtk_menu_item_new_with_label("Uus vahekaart"); // Fail->Uus vahekaart
GtkWidget *FailMenuAva = gtk_menu_item_new_with_label("Ava"); // Fail->Ava
UI->FailMenuAva = FailMenuAva;
......@@ -78,27 +91,33 @@ ui *LooUI()
GtkWidget *FailMenuSulgeV = gtk_menu_item_new_with_label("Sulge vahekaart"); // Fail->Sulge vahekaart
UI->FailMenuSulgeV = FailMenuSulgeV;
GtkWidget *FailMenuValju = gtk_menu_item_new_with_label("Välju"); // Fail->Välju
// Kompileeri menüü
GtkWidget *KompMenu = gtk_menu_new();
GtkWidget *KompMenuSeaded = gtk_menu_item_new_with_label("Seaded"); // Kompileeri->Seaded
GtkWidget *KompMenuKompileeri = gtk_menu_item_new_with_label("Kompileeri"); // Kompileeri->Kompileeri
GtkWidget *KompMenuKaivita = gtk_menu_item_new_with_label("Käivita"); // Kompileeri->Käivita
// Menüü nupud menu bar'i
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), KompMenuNupp);
// Menüüd nuppudesse
gtk_menu_item_set_submenu(GTK_MENU_ITEM(FailMenuNupp), FailMenu);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(KompMenuNupp), KompMenu);
// Fail menüü
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), FailMenuUus); // Fail->Uus vahekaart
g_signal_connect(FailMenuUus, "activate", G_CALLBACK(Uus), UI);
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), gtk_separator_menu_item_new());
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), FailMenuAva); // Fail->Ava
g_signal_connect(FailMenuAva, "activate", G_CALLBACK(Ava), UI);
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), FailMenuSalvesta); // Fail->Salvesta
g_signal_connect(FailMenuSalvesta, "activate", G_CALLBACK(Salvesta), UI);
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), FailMenuSalvestaN); // Fail->Salvesta nimega
g_signal_connect(FailMenuSalvestaN, "activate", G_CALLBACK(SalvestaNimega), UI);
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), gtk_separator_menu_item_new());
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), FailMenuSulgeV); // Fail->Sulge vahekaart
g_signal_connect(FailMenuSulgeV, "activate", G_CALLBACK(SulgeVahekaart), UI);
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), gtk_separator_menu_item_new());
gtk_menu_shell_append(GTK_MENU_SHELL(FailMenu), FailMenuValju); // Fail->Välju
g_signal_connect(FailMenuValju, "activate", G_CALLBACK(Valju), UI);
LisaMenuItem(UI, FailMenu, FailMenuUus, Uus, GDK_KEY_N, GDK_CONTROL_MASK); // Fail->Uus vahekaart
MenuSeparator(FailMenu);
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, FailMenuSalvestaN, SalvestaNimega, GDK_KEY_S, GDK_CONTROL_MASK|GDK_MOD1_MASK); // Fail->Salvesta nimega
MenuSeparator(FailMenu);
LisaMenuItem(UI, FailMenu, FailMenuSulgeV, SulgeVahekaart, GDK_KEY_W, GDK_CONTROL_MASK); // Fail->Sulge vahekaart
MenuSeparator(FailMenu);
LisaMenuItem(UI, FailMenu, FailMenuValju, Valju, GDK_KEY_Q, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Fail->Välju
// Kompileeri menüü
LisaMenuItem(UI, KompMenu, KompMenuSeaded, KompilaatoriSeaded, 0, 0); // Kompileeri->Seaded
MenuSeparator(KompMenu);
LisaMenuItem(UI, KompMenu, KompMenuKompileeri, NULL, GDK_KEY_C, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Kompileeri->Kompileeri
LisaMenuItem(UI, KompMenu, KompMenuKaivita, NULL, GDK_KEY_R, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Kompileeri->Käivita
//ToolBar
UI->ToolBar = gtk_toolbar_new();
......@@ -118,5 +137,28 @@ ui *LooUI()
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);
// Seadete fail
UI->Seaded = g_key_file_new();
char *SeadedKaust = g_build_filename(g_get_home_dir(), "ceditor", NULL);
char *SeadedNimi = g_build_filename(SeadedKaust, "settings.ini", NULL);
UI->SeadedNimi = strdup(SeadedNimi);
GError *Viga = NULL;
// Ava seadete fail
if(!g_key_file_load_from_file(UI->Seaded, SeadedNimi, G_KEY_FILE_NONE, &Viga))
{
// Ei õnnestunud avada
if(Viga->code == G_FILE_ERROR_NOENT) // Faili pole olemas, loo see
{
g_mkdir_with_parents(SeadedKaust, 0700);
g_key_file_save_to_file(UI->Seaded, SeadedNimi, NULL);
}
else
{
printf("Viga settings.ini avamisel: %s\n", Viga->message);
}
g_error_free(Viga);
}
return UI;
}
......@@ -4,12 +4,11 @@
#include "ceditor.h"
#include "tab.h"
#include "menubar.h"
#include "compiler.h"
#ifdef SOURCEVIEW
#define PEALKIRI "CEditor SourceView"
#else
#define PEALKIRI "CEditor TextView"
#endif
#define PEALKIRI "CEditor"
#define MenuSeparator(M) gtk_menu_shell_append(GTK_MENU_SHELL(M), gtk_separator_menu_item_new())
ui *LooUI();
......
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