#include "simpleEditor.h"
#include "ProcessFunction.h"
#include "CreateFindWindow.h"
gboolean WindowDeleteEvent(GtkWidget *widget,GdkEvent *event,gpointer data)
{
CloseTheApp(widget,data);
return TRUE;
}
void MenuFind(GtkWidget *widget,gpointer data)
{
GtkWidget *ProcessWindow;
ProcessWindow=CreateFindWindow();
gtk_widget_show(ProcessWindow);
}
void CloseTheApp(GtkWidget *widget,gpointer data)
{
GtkDialog *dialog;
GtkWidget *label;
/* if file have been modified,
* save file at first
*/
if( gtk_text_buffer_get_modified(TextArea->buffer)==TRUE )
MenuSaveItem(widget,data);
dialog=gtk_dialog_new_with_buttons("Do you want to quit?",
MainWindow,
GTK_DIALOG_MODAL,
GTK_STOCK_YES,GTK_RESPONSE_ACCEPT,
GTK_STOCK_NO,GTK_RESPONSE_CANCEL,
NULL);
label=gtk_label_new("Do you want to quit?");
gtk_widget_show(label);
gtk_box_pack_start( GTK_BOX(dialog->vbox),
label,
TRUE,TRUE,3);
/* confirm that user want to quit or not */
if( gtk_dialog_run(dialog)==GTK_RESPONSE_ACCEPT )
gtk_main_quit();
gtk_widget_destroy(dialog);
}
void MenuNewItem(GtkWidget *widget,gpointer data)
{
/* a new file that donnot have name but have been modified,
* or an exist file modified , save it firstly.
*/
if( gtk_text_buffer_get_modified(TextArea->buffer)==TRUE || pFileName!=NULL )
MenuSaveItem(widget,data);
g_free(pFileName);
pFileName=NULL;
/* destroy TextView::buffer */
TextArea->buffer=NULL;
}
void MenuOpenItem(GtkWidget *widget,gpointer data)
{
gchar *temp;
GtkTextBuffer* buffer;
if( gtk_text_buffer_get_modified(TextArea->buffer)==TRUE || pFileName!=NULL )
MenuSaveItem(widget,data);
temp=GetFullPathName(GTK_FILE_CHOOSER_ACTION_OPEN);
if( temp!=NULL )
{
if( !CanRead(temp) )
gnome_dialog_run_and_close(
gnome_error_dialog_parented(
"ERROR : cann't open file",
GTK_WINDOW(MainWindow)));
else
{
buffer=GetTextBuffer(temp);
g_free(pFileName);
pFileName=temp;
gtk_text_view_set_buffer(TextArea,buffer);
}
}
}
void MenuSaveItem(GtkWidget *widget,gpointer data)
{
GtkWidget* dialog;
if( gtk_text_buffer_get_modified(TextArea->buffer)==FALSE )
return ;
if( pFileName==NULL )
{
pFileName=GetFullPathName(GTK_FILE_CHOOSER_ACTION_SAVE);
}
if( pFileName!=NULL )
{
if( CanWrite(pFileName) )
{
SaveTextBuffer(TextArea->buffer,pFileName);
}
else
{
gnome_dialog_run_and_close( GTK_DIALOG(
gnome_error_dialog_parented(
"ERROR : can write file",
MainWindow)));
pFileName=NULL;
}
}
}
void MenuSaveAsItem(GtkWidget *widget,gpointer data)
{
pFileName=NULL;
MenuSaveItem(widget,data);
}
gboolean CanRead(gchar *fileName)
{
if( fileName!=NULL && (access(fileName,F_OK|R_OK)==0) )
return TRUE;
return FALSE;
}
gboolean CanWrite(gchar *fileName)
{
if( fileName==NULL )
return FALSE;
if( access(fileName,F_OK)==0 )
{
if( access(fileName,W_OK)==0 )
return TRUE;
else
return FALSE;
}
else
{
int fd;
fd=open(fileName,O_WRONLY|O_CREAT,0644);
if( fd==-1 )
return FALSE;
else
{
close(fd);
return TRUE;
}
}
}
gchar *GetFullPathName(GtkFileChooserAction action)
{
GtkDialog *dialog;
gchar *filename;
if( action==GTK_FILE_CHOOSER_ACTION_OPEN )
{
dialog=gtk_file_chooser_dialog_new(
"Open File",
GTK_WINDOW(MainWindow),
action,
GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,
NULL);
switch( gtk_dialog_run(dialog) )
{
case GTK_RESPONSE_ACCEPT:
filename=gtk_file_chooser_get_filename(
GTK_FILE_CHOOSER(dialog));
break;
default:
filename=NULL;
break;
}
gtk_widget_destroy(dialog);
}
else if( action==GTK_FILE_CHOOSER_ACTION_SAVE )
{
dialog=gtk_file_chooser_dialog_new(
"Save As..",
GTK_WINDOW(MainWindow),
action,
GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE,GTK_RESPONSE_ACCEPT,
NULL);
switch( gtk_dialog_run(dialog) )
{
case GTK_RESPONSE_ACCEPT:
filename=gtk_file_chooser_get_filename(
GTK_FILE_CHOOSER(dialog));
break;
default:
filename=NULL;
break;
}
gtk_widget_destroy(dialog);
}
return filename;
}
#define STRLEN 256
GtkTextBuffer* GetTextBuffer(gchar *filename)
{
int fd;
GtkTextBuffer *buffer;
char strBuffer[STRLEN];
GtkTextIter iter;
int readLen;
buffer=gtk_text_buffer_new(NULL);
fd=open(filename,O_RDONLY);
while( (readLen=read(fd,strBuffer,STRLEN))!=0 )
{
gtk_text_buffer_get_end_iter(buffer,&iter);
gtk_text_buffer_insert(buffer,&iter,strBuffer,readLen);
}
close(fd);
return buffer;
}
#undef STRLEN
void SaveTextBuffer(GtkTextBuffer *buffer,gchar *filename)
{
gchar *contents;
int fd;
size_t contentLen;
GtkTextIter begin,end;
fd=open(filename,O_WRONLY);
gtk_text_buffer_get_start_iter(buffer,&begin);
gtk_text_buffer_get_end_iter(buffer,&end);
contents=gtk_text_buffer_get_text(buffer,&begin,&end,TRUE);
contentLen=strlen(contents);
write(fd,contents,contentLen);
close(fd);
}
评论0