GTK+ Forums

Discussion forum for GTK+ and Programming. Ask questions, troubleshoot problems, view and post example code, or express your opinions.
It is currently Thu Nov 27, 2014 8:13 am

All times are UTC




Post new topic Reply to topic  [ 6 posts ] 
Author Message
 Post subject: [SOLVED] gtk_entry_buffer_set_text for loading file content
PostPosted: Mon Jan 07, 2013 8:24 pm 
Offline
Familiar Face

Joined: Wed Jan 02, 2013 6:04 pm
Posts: 14
Hello all,

I want to use the function
Code:
gtk_entry_buffer_set_text ((GtkEntryBuffer *buffer, const gchar * -, gint - ))

for viewing the content of a file in a 'notebook' or 'textview'. Subsequently, i want to load the content of a complete file into the 'buffer', so that the content can be shown using an aprropriate widget.
Iam aware of FILE* in c, concerning GtkEntryBuffer* iam not sure how to go about. Any help would be greatly appreciated. Thank you.


Last edited by janarbio on Mon Jan 14, 2013 12:12 am, edited 1 time in total.

Top
 Profile  
 
 Post subject: Re: RE: gtk_entry_buffer_set_text for loading a file content
PostPosted: Wed Jan 09, 2013 9:38 am 
Offline
Never Seen the Sunlight

Joined: Mon Apr 28, 2008 5:52 am
Posts: 781
Location: UK
Hi,

This function would set the whole text buffer.
Code:
gtk_entry_buffer_set_text ((GtkEntryBuffer *buffer, const gchar * -, gint - ))

There is also this function which inserts text at a given position
Code:
guint               gtk_entry_buffer_insert_text        (GtkEntryBuffer *buffer,
                                                         guint position,
                                                         const gchar *chars,
                                                         gint n_chars);


How you read or parse your file is up to you. There are Glib and standard C functions to do this. The very basic steps are if read the whole file into memory in one go is

1 - Read file into temporary memory buffer.
2 - Call gtk_entry_buffer_set_text() using your temporary memory buffer as the source.

You can also read in blocks of data at a time and use gtk_entry_buffer_insert_text() if this is better.

Things to note is that GTK+ expects that strings are in UTF8. If they are in any other character encoding (except ASCII) then it would need to be converted from that encoding.

_________________
E.


Top
 Profile  
 
 Post subject: Re: RE: gtk_entry_buffer_set_text for loading a file content
PostPosted: Sun Jan 13, 2013 2:25 am 
Offline
Familiar Face

Joined: Wed Jan 02, 2013 6:04 pm
Posts: 14
Dear Errol,
Thanks for your previous reply. I tried to use the function "gtk_entry_buffer_set_text" to load a file in the textview. I was sucessful in viewing the file (by following the discussion viewtopic.php?f=3&t=178380 ) but actually, i wanted to open the notebook and its associated pages by clicking a new menu (which i wanted to create in future with the name "show_files"). To acheive this, i had to pass the "Gtkwidget *grid" as a member of a struture and display the files selected in the "File->Open" step. If i do so Iam getting segmentation fault even on the first step i.e. after "file selection", when i include a grid as a member. Iam not sure why this happens.

Additionally, if you have any suggestions on dynamically allocating the memory for FILE ** pointers, i would be glad to use it. Any help on the above issues would be greatly appreciated.


I have pasted the working code, but the segmentation causing section of grid usage and its initialization has been commented. Also the section of code, which i wanted to be a call back for "Show_file" menu activation is placed within comment (begin, end). Thank you,
Code:
/* testmenubars.c -- test different packing directions Copyright (C) 2005  Red Hat, Inc. Author: Matthias Clasen */

#include <gtk/gtk.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <glib/gprintf.h>
#include <glib.h>
#include <glib/gstdio.h>
#define MAXCHAR 300
#define FILE_MAX 100
#define INSTRUCT "info"
static GtkFileChooserAction action;

typedef struct
{
   GSList *f_names;
   FILE **infile;
   //GtkWidget *grid;
   
}File_ptr;

static void response_cb (GtkDialog *dialog,int response_id, File_ptr * user_data)
{
      GSList *list;
      *user_data->f_names = *gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER (dialog));
       if (user_data->f_names)
        {
          GSList *l;
          g_print ("Selected files:\n");
          for (l = user_data->f_names; l; l= l->next)
            { g_print ("Open: %s\n", (gchar *) l->data);}   
          g_slist_free_full (l,g_free);
        }
        gtk_widget_destroy (GTK_WIDGET (dialog));
}

void file_name_retrieve (File_ptr * user_data)
{
     GSList *l;
     int i;
     char line[300],c;
          gchar file_n[300];
     i=0;
           for (l = user_data->f_names; l; l = l->next)
       {
              g_print ("Run: %s\n", (gchar *) l->data);
              strcpy(file_n,(gchar *) l->data);
              i++;
            }
          g_slist_free_full (l, g_free);        
}

void file_open_dialog(File_ptr *f_names)
{
  gboolean multiple=TRUE;
  action = GTK_FILE_CHOOSER_ACTION_OPEN;
  GtkWidget *dialog;
  dialog = gtk_file_chooser_dialog_new("Select a file",NULL,GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
  gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog),multiple);
  g_signal_connect (dialog, "response", G_CALLBACK (response_cb), f_names);
  gtk_widget_show_all (dialog);
}

int main (int argc, char **argv)
{
  static GtkWidget *window;
  GtkWidget *grid;
  GtkWidget *menuitem,*sub_menuitem;
  GtkWidget *menu;
  GtkWidget *menubar;
  GtkWidget *note_book,*page_1,*page_2,*title_1,*title_2,*text_1,*text_2;
  gboolean  opt_true=TRUE;
  File_ptr *f_names=g_slice_new (File_ptr);
  gchar *file_name_ptr = NULL;
  GtkTextBuffer *buffer=NULL;
  GtkTextIter start, end;
  GtkTextIter iter;
  gint nchars;
  gchar line[MAXCHAR];
  gchar file_buff[MAXCHAR];

  int i;
  FILE *infile,*outfile[FILE_MAX];

  f_names->infile=&outfile[0];
  //f_names->grid = gtk_grid_new ();

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(window),500,500);
  g_signal_connect (window,"delete-event",G_CALLBACK (gtk_main_quit), NULL);
  gtk_window_set_title (GTK_WINDOW (window), "Automex");
  grid = gtk_grid_new ();

  // Creating menubar
  menubar = gtk_menu_bar_new ();

  // Creating menuitem: File
  menuitem = gtk_image_menu_item_new_from_stock ("File", NULL);
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  menu = gtk_menu_new ();

  // Creating submenuitem: Open
  sub_menuitem = gtk_menu_item_new_with_label ("Open");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_open_dialog), f_names);

  // Creating submenuitem: Run
  sub_menuitem = gtk_menu_item_new_with_label ("Run");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_name_retrieve), f_names );

  // Create a notebook and open two files
  // Should go inside a callback function for "show_file" menu
  //---- cb for "show_file" begins here ----
  note_book=gtk_notebook_new();
  page_1 = gtk_text_view_new();
  title_1 = gtk_label_new ("File_1");
  page_2 = gtk_text_view_new();
  title_2 = gtk_label_new ("File_2");

  gtk_text_view_set_editable(GTK_TEXT_VIEW (page_1),opt_true);
  gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW (page_1),GTK_WRAP_WORD_CHAR);
  gtk_notebook_append_page(GTK_NOTEBOOK(note_book),page_1,title_1);
  gtk_notebook_append_page(GTK_NOTEBOOK(note_book),page_2,title_2);
  gtk_widget_set_hexpand(note_book,opt_true);
  gtk_widget_set_vexpand(note_book,opt_true);

  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page_1));
  gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);

  infile = fopen (INSTRUCT, "r");
   if (infile)
    {
   fgets(file_buff,sizeof(file_buff),infile);
   while(!(feof(infile)))
   {
    nchars=strlen(file_buff);
    gtk_text_buffer_insert (buffer, &iter, file_buff, nchars);
    fgets(file_buff,sizeof(file_buff),infile);
   }   
   }

  fclose (infile);
  gtk_grid_attach (GTK_GRID (grid),note_book, 0, 1, 200, 200);

  // ---- cb for "show_file" ends here ----

  // Attaching a menubar
  gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET(menubar), 0, 0, 1, 1);

  // Adding submenuitems to the menuitem
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), GTK_WIDGET(menu));
  gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (grid));
  gtk_widget_show_all (window);
  gtk_main ();
  return 0;
}


Top
 Profile  
 
 Post subject: Re: RE: gtk_entry_buffer_set_text for loading a file content
PostPosted: Sun Jan 13, 2013 6:44 am 
Offline
Familiar Face

Joined: Wed Jan 02, 2013 6:04 pm
Posts: 14
Dear Errol,

I managed to load the selected files in the textview mode. But the windows looks so rigid without any scroll bar and spans two vertical screen length. Any help to change this window behaviour would be appreciated.

The segmentation fault occured last time because of not initializing "f_names->f_names=&f_list;". Iam putting the current working code for your suggestions and corrections. Thank you.

Code:
/* testmenubars.c -- test different packing directions Copyright (C) 2005  Red Hat, Inc. Author: Matthias Clasen */

#include <gtk/gtk.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <glib/gprintf.h>
#include <glib.h>
#include <glib/gstdio.h>
#define MAXCHAR 300
#define FILE_MAX 100
static GtkFileChooserAction action;

typedef struct
{
   GSList *f_names;
   FILE **infile;
   GtkWidget *grid;
   
}File_ptr;

static void response_cb (GtkDialog *dialog,int response_id, File_ptr * user_data)
{
      GSList *list;
      *user_data->f_names = *gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER (dialog));
       if (user_data->f_names)
        {
          GSList *l;
          g_print ("Selected files:\n");
          for (l = user_data->f_names; l; l= l->next)
            { g_print ("Open: %s\n", (gchar *) l->data);}   
          g_slist_free_full (l,g_free);
        }
        gtk_widget_destroy (GTK_WIDGET (dialog));
}

void file_name_retrieve (File_ptr * user_data)
{
     GSList *l;
     int i;
     char line[300],c;
          gchar file_n[300];
     i=0;
           for (l = user_data->f_names; l; l = l->next)
       {
              g_print ("Run: %s\n", (gchar *) l->data);
              strcpy(file_n,(gchar *) l->data);
              i++;
            }
          g_slist_free_full (l, g_free);        
}

void file_load (File_ptr * user_data)
{
  GtkWidget *note_book,*page,*title;
  gboolean  opt_true=TRUE;
  GtkTextBuffer *buffer=NULL;
  GtkTextIter start, end;
  GtkTextIter iter;
  gint nchars;
  gchar file_buff[MAXCHAR];
  FILE *infile;
          note_book=gtk_notebook_new();
     GSList *l;
     int i,j;
     char line[300],buf[5],names[100];
          gchar file_n[300];
     i=0;
           for (l = user_data->f_names; l; l = l->next)
       {
         strcpy(names,"File_");
         sprintf(buf,"%d",i+1);
         strcat(names,buf);
              strcpy(file_n,(gchar *) l->data);
                           
         page = gtk_text_view_new();
         title = gtk_label_new (names);
              gtk_text_view_set_editable(GTK_TEXT_VIEW (page),opt_true);
              gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW (page),GTK_WRAP_WORD_CHAR);
              gtk_notebook_append_page(GTK_NOTEBOOK(note_book),page,title);
         buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page));
         gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);

         infile = fopen (file_n, "r");
         if (infile)
          {
         fgets(file_buff,sizeof(file_buff),infile);
         while(!(feof(infile)))
         {
          nchars=strlen(file_buff);
          gtk_text_buffer_insert (buffer, &iter, file_buff, nchars);
          fgets(file_buff,sizeof(file_buff),infile);
         }   
         }
      fclose (infile);
                i++;
            }
          g_slist_free_full (l, g_free);        
  gtk_widget_set_hexpand(note_book,opt_true);
  gtk_widget_set_vexpand(note_book,opt_true);
  gtk_grid_attach (GTK_GRID (user_data->grid),note_book, 0, 1, 50, 50);
  gtk_widget_show_all (note_book);
     
}



void file_open_dialog(File_ptr *f_names)
{
  gboolean multiple=TRUE;
  action = GTK_FILE_CHOOSER_ACTION_OPEN;
  GtkWidget *dialog;
  dialog = gtk_file_chooser_dialog_new("Select a file",NULL,GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
  gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog),multiple);
  g_signal_connect (dialog, "response", G_CALLBACK (response_cb), f_names);
  gtk_widget_show_all (dialog);
}


int main (int argc, char **argv)
{
  static GtkWidget *window;
  GtkWidget *grid;
  GtkWidget *menuitem,*sub_menuitem;
  GtkWidget *menu;
  GtkWidget *menubar;
  GtkWidget *note_book;
  File_ptr *f_names=g_slice_new (File_ptr);
  GSList f_list;
  int i;
  FILE *infile,*outfile[FILE_MAX];

  gtk_init (&argc, &argv);
  f_names->f_names=&f_list;
  f_names->infile=&outfile[0];
  f_names->grid = gtk_grid_new ();
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(window),500,500);
  g_signal_connect (window,"delete-event",G_CALLBACK (gtk_main_quit), NULL);
  gtk_window_set_title (GTK_WINDOW (window), "Automex");

  // Creating menubar
  menubar = gtk_menu_bar_new ();

  // Creating menuitem: File
  menuitem = gtk_image_menu_item_new_from_stock ("File", NULL);
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  menu = gtk_menu_new ();

  // Creating submenuitem: Open
  sub_menuitem = gtk_menu_item_new_with_label ("Open");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_open_dialog), f_names);

  // Creating submenuitem: Run
  sub_menuitem = gtk_menu_item_new_with_label ("Run");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_name_retrieve), f_names );

  // Creating submenuitem: Show_files
  sub_menuitem = gtk_menu_item_new_with_label ("Show_files");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_load), f_names );

  // Attaching a menubar
  gtk_grid_attach (GTK_GRID (f_names->grid), GTK_WIDGET(menubar), 0, 0, 1, 1);

  // Adding submenuitems to the menuitem
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), GTK_WIDGET(menu));
  gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (f_names->grid));
  gtk_widget_show_all (window);
  gtk_main ();
  g_slice_free (File_ptr,f_names);
  return 0;
}


Top
 Profile  
 
 Post subject: Re: RE: gtk_entry_buffer_set_text for loading a file content
PostPosted: Sun Jan 13, 2013 9:56 pm 
Offline
Never Seen the Sunlight

Joined: Mon Apr 28, 2008 5:52 am
Posts: 781
Location: UK
Below is a rewrite of your latest example. It is not perfect as there is still a problem in the function file_load(). In this function it is possible to add more than one GtkNotebook to the same place in the GtkGrid with out removing the old one. The documentation says this has undefined behaviour so it may break at some point.

To fix the problem of no scroll bars for your GtkTextView all you need to do is place the GtkTextView into a GtkScolledWindow.

Your crash is caused by the GSList not being initialised correctly. You are initialising it with a pointer to an area of allocated memory. This area of memory is not correctly set with any data and the contents are random. To correctly initialise a GSList all you need to do is assign a NULL pointer to it. Also note how I am doing memory management with the GSList. All I am doing is passing pointers around with out the need for a deep copy. If I need to replace the stored list with a new one only then do I free the old one.

Code:
/* testmenubars.c -- test different packing directions Copyright (C) 2005  Red Hat, Inc. Author: Matthias Clasen */

#include <gtk/gtk.h>
#include <stdio.h>
#include <glib.h>
#include <glib/gprintf.h>
#include <glib/gstdio.h>

#define MAXCHAR 1024

static GtkFileChooserAction action;

typedef struct
{
   GSList *f_names;
   GtkWidget *grid;
} File_ptr;

static void response_cb (GtkDialog *dialog, int response_id, File_ptr * user_data)
{
  GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER (dialog));
  if (response_id == GTK_RESPONSE_OK && list)
    {
      GSList *l;
      g_slist_free_full (user_data->f_names, g_free);
      user_data->f_names = list;
      g_print ("Selected files:\n");
      for (l = user_data->f_names; l; l= l->next)
        {
          g_print ("Open: %s\n", (gchar *) l->data);
        }
    }
  gtk_widget_destroy (GTK_WIDGET (dialog));
}

void file_name_retrieve (File_ptr * user_data)
{
  GSList *l;

  for (l = user_data->f_names; l; l = l->next)
    {
      g_print ("Run: %s\n", (gchar *) l->data);
    }
}

void file_load (File_ptr * user_data)
{
  GtkWidget *note_book, *page, *title;
  GtkWidget *scrolled_win;
  GtkTextBuffer *buffer;
  GtkTextIter iter;
  gchar file_buff[MAXCHAR];
  FILE *infile;

  note_book = gtk_notebook_new();
  GSList *l;
  int i = 0;

  for (l = user_data->f_names; l; l = l->next)
    {
      gchar *names = g_strdup_printf ("File_%d", i + 1);

      scrolled_win = gtk_scrolled_window_new(NULL, NULL);
      page = gtk_text_view_new();
      gtk_container_add(GTK_CONTAINER(scrolled_win), page);
      title = gtk_label_new (names);
      g_free (names);

      gtk_text_view_set_editable(GTK_TEXT_VIEW (page), opt_true);
      gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW (page), GTK_WRAP_WORD_CHAR);
      gtk_notebook_append_page(GTK_NOTEBOOK(note_book), scrolled_win, title);
      buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page));
      gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);

      infile = g_fopen ((gchar *) l->data, "r");
      if (infile)
        {
          size_t len;
          while ((len = fread (file_buff, 1, sizeof(file_buff), infile)))
            {
              gtk_text_buffer_insert (buffer, &iter, file_buff, len);
            }   
        }
      fclose (infile);
      i++;
    }

  gtk_widget_set_hexpand(note_book, TRUE);
  gtk_widget_set_vexpand(note_book, TRUE);
  gtk_grid_attach (GTK_GRID (user_data->grid), note_book, 0, 1, 50, 50);
  gtk_widget_show_all (note_book);
}



void file_open_dialog(File_ptr *f_names)
{
  action = GTK_FILE_CHOOSER_ACTION_OPEN;
  GtkWidget *dialog = gtk_file_chooser_dialog_new("Select a file",
    NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
  gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
  g_signal_connect (dialog, "response", G_CALLBACK (response_cb), f_names);
  gtk_widget_show_all (dialog);
}


int main (int argc, char **argv)
{
  GtkWidget *window;
  GtkWidget *menuitem, *sub_menuitem;
  GtkWidget *menu;
  GtkWidget *menubar;
  File_ptr *f_names = g_slice_new (File_ptr);

  gtk_init (&argc, &argv);
  f_names->f_names = NULL;
  f_names->grid = gtk_grid_new ();
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(window),500,500);
  g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
  gtk_window_set_title (GTK_WINDOW (window), "Automex");

  // Creating menubar
  menubar = gtk_menu_bar_new ();

  // Creating menuitem: File
  menuitem = gtk_image_menu_item_new_from_stock ("File", NULL);
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  menu = gtk_menu_new ();

  // Creating submenuitem: Open
  sub_menuitem = gtk_menu_item_new_with_label ("Open");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_open_dialog), f_names);

  // Creating submenuitem: Run
  sub_menuitem = gtk_menu_item_new_with_label ("Run");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_name_retrieve), f_names );

  // Creating submenuitem: Show_files
  sub_menuitem = gtk_menu_item_new_with_label ("Show_files");
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), sub_menuitem);
  g_signal_connect_swapped (sub_menuitem,"activate",G_CALLBACK (file_load), f_names );

  // Attaching a menubar
  gtk_grid_attach (GTK_GRID (f_names->grid), GTK_WIDGET(menubar), 0, 0, 1, 1);

  // Adding submenuitems to the menuitem
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), GTK_WIDGET(menu));
  gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (f_names->grid));

  gtk_widget_show_all (window);

  gtk_main ();

  g_slist_free_full (f_names->f_names, g_free);
  g_slice_free (File_ptr, f_names);

  return 0;
}

_________________
E.


Top
 Profile  
 
 Post subject: Re: RE: gtk_entry_buffer_set_text for loading a file content
PostPosted: Sun Jan 13, 2013 10:37 pm 
Offline
Familiar Face

Joined: Wed Jan 02, 2013 6:04 pm
Posts: 14
Perfect... this is what i needed.
Thank you very much Errol!


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 6 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 8 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group