Develop and Download Open Source Software

Browse CVS Repository

Diff of /shiki/shiki/buffer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.6 by aloha, Sun Nov 26 18:41:43 2006 UTC revision 1.7 by aloha, Mon Nov 27 12:01:50 2006 UTC
# Line 28  Line 28 
28   */   */
29  #include"shiki.h"  #include"shiki.h"
30    
31  gchar *Shiki_buffer_substring(gint start, gint end) {  /* GtkTextBuffer から,対応する ShikiBuffer 構造体を逆引き */
32    if(start >= end)  static gint compBuffer(gconstpointer a, gconstpointer b) {
33      return NULL;    return ((ShikiBuffer *)a)->text_buffer == b ? 0 : b - a;
34    else {  }
     GtkTextIter s, e;  
     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &s, start);  
     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &e, end);  
35    
36      return gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &s, &e, FALSE);  static GList *get_ShikiBufferListElement_By_GtkTextBuffer(GtkTextBuffer *b) {
37    }    return g_list_find_custom(Shiki_EDITOR_BUFFER_LIST, b, compBuffer);
38  }  }
39    
40  void Shiki_delete_region(gint start, gint end) {  void Shiki_delete_buffer(GtkTextBuffer *buffer) {
41    if(start >= end)    /* バッファリストから,リストの要素,バッファ,バッファの番号を逆引き */
42      /* 効率が悪いが,Scheme の世界になるべく Gtk のオブジェクトを持ち込まないため */
43      GList *bufListElem = get_ShikiBufferListElement_By_GtkTextBuffer(buffer);
44      ShikiBuffer *tabInfo  = bufListElem->data;
45      gint bufNum = g_list_position(Shiki_EDITOR_BUFFER_LIST, bufListElem);
46    
47      /* タブが 1 つしか残っていなかったら消させない */
48      if(g_list_length(Shiki_EDITOR_BUFFER_LIST) == 1)
49      return;      return;
50    else {    /* デリートハンドラをエディタトップレベルのウィジットから取り除く */
51      GtkTextIter s, e;    g_signal_handler_disconnect(Shiki_EDITOR_WINDOW, tabInfo->delete_handler_id);
52      gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &s, start);    Shiki_EDITOR_BUFFER_LIST = g_list_delete_link(Shiki_EDITOR_BUFFER_LIST, bufListElem);  
53      gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &e, end);    gtk_widget_destroy(GTK_WIDGET(tabInfo->tabpage));
54      g_free(tabInfo->tabpage_label);
55      g_free(tabInfo->name);
56      g_free(tabInfo->filename);
57      g_free(tabInfo);
58      gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, bufNum);
59      /* 強制再描画 */
60      gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK));
61    }
62    
63    GtkTextBuffer *Shiki_find_buffer(const gchar *name) {
64      GList *l;
65      for(l = Shiki_EDITOR_BUFFER_LIST; l != NULL; l = l->next)
66        if(strcmp(((ShikiBuffer *)l->data)->name, name) == 0)
67          return ((ShikiBuffer *)l->data)->text_buffer;
68      return NULL;
69    }
70    
71      gchar *Shiki_buffer_substring(gint start, gint end) {
72        if(start >= end)
73          return NULL;
74        else {
75          GtkTextIter s, e;
76          gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &s, start);
77          gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &e, end);
78    
79      return gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &s, &e);        return gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &s, &e, FALSE);
80        }
81      }
82    
83      void Shiki_delete_region(gint start, gint end) {
84        if(start >= end)
85          return;
86        else {
87          GtkTextIter s, e;
88          gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &s, start);
89          gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &e, end);
90    
91          return gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &s, &e);
92        }
93    }    }
 }  
94    
95  gint Shiki_point() {  gint Shiki_point() {
96    GtkTextIter p;    GtkTextIter p;
# Line 109  void Shiki_goto_eol() { Line 149  void Shiki_goto_eol() {
149    gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);    gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
150  }  }
151    
152  static gint compBuffer(gconstpointer a, gconstpointer b) {  void Shiki_forward_line(gint count) {
153    return ((ShikiBuffer *)a)->text_buffer == b ? 0 : b - a;    GtkTextIter p;
154  }    gint i;
155      gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
156  static GList *get_ShikiBufferListElement_By_GtkTextBuffer(GtkTextBuffer *b) {    
157    return g_list_find_custom(Shiki_EDITOR_BUFFER_LIST, b, compBuffer);    if(count >= 0) {
158        for(i = count; i != 0; i--)
159          gtk_text_view_forward_display_line(Shiki_CURRENT_TEXT_VIEW, &p);
160      } else {
161        for(i = count; i != 0; i++)
162          gtk_text_view_backward_display_line(Shiki_CURRENT_TEXT_VIEW, &p);
163      }
164      gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
165  }  }
166    
167  const char *Shiki_buffer_name(GtkTextBuffer *buffer) {  const char *Shiki_buffer_name(GtkTextBuffer *buffer) {
# Line 160  ScmObj Shiki_buffer_list() { Line 207  ScmObj Shiki_buffer_list() {
207    }    }
208    return bl;    return bl;
209  }  }
210    
211    void Shiki_erase_buffer(GtkTextBuffer *buffer) {
212      GtkTextIter start, end;
213      gtk_text_buffer_get_start_iter(buffer, &start);
214      gtk_text_buffer_get_end_iter(buffer, &end);
215      gtk_text_buffer_delete(buffer, &start, &end);
216    }
217    
218    const gchar *Shiki_file_name_dialog(const gchar *msg) {
219    
220      GtkWidget *dialog = gtk_file_selection_new(msg);
221      gint resp = gtk_dialog_run(GTK_DIALOG(dialog));
222      const gchar *filename = NULL;
223    
224      if(resp == GTK_RESPONSE_OK)
225        filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog));
226    
227      gtk_widget_destroy(dialog);
228      return filename;
229    }
230    
231    gboolean Shiki_yes_or_no_p(const gchar *msg) {
232      GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW),
233                   GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
234                   GTK_BUTTONS_YES_NO, msg);
235      
236      gint resp = gtk_dialog_run(GTK_DIALOG(dialog));
237      gtk_widget_destroy(dialog);
238      if(GTK_RESPONSE_YES == resp)
239        return TRUE;
240      return FALSE;
241    }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26