This email list is read-only.  Emails sent to this list will be discarded
----------------------------------
 libprojgen/projgen.cpp                   |   79 +++++++++++++++++
 libprojgen/projgen.h                     |   12 +++-
 libprojgen/templates/template_config.xml |   18 ++++
 src/AddLibraryDlg.cpp                    |  140 ++++++++++++++++++++++++++++--
 src/AddLibraryDlg.h                      |    9 ++-
 src/glade/projgen.glade                  |  103 ++++++++++++----------
 src/glade/projgen.xml                    |  125 ++++++++++++++------------
 7 files changed, 373 insertions(+), 113 deletions(-)

New commits:
commit 2d2e8591642afa28fb4239710e46ba448bdec996
Author: Bob Spencer <[email protected]>
Date:   Tue Feb 24 08:18:09 2009 -0800

    Intermediate projgen version.
    Working on library dependencies and AddLibraryDlg.  Still incomplete.


Diff in this email is a maximum of 400 lines.
diff --git a/libprojgen/projgen.cpp b/libprojgen/projgen.cpp
index b089cc1..d209490 100644
--- a/libprojgen/projgen.cpp
+++ b/libprojgen/projgen.cpp
@@ -14,6 +14,9 @@
 #include "TemplateMgr.h"
 #include "ProjectCreator.h"
 #include "Project.h"
+#include <dirent.h>
+
+static int add_libs_in_dir (string dir, vector<string>*libArray);
 
 int pg_create(int override_if_exists, const char *title,
              const char *name,      const char *description,
@@ -109,3 +112,79 @@ char *pg_get_template_config_path()
    return cfg;
 }
 
+//-------------------------------------------------------
+
+int pg_get_filter_ids (char ***pStrArr)
+{
+   //get list of templates
+   TemplateMgr *tm = TemplateMgr::getInstance();
+   vector<string> ids = tm->getTemplateIds("lib_filter");
+
+   //create enough char* to hold all id's
+   *pStrArr = new char*[ids.size()];
+   for (int i=0; i<ids.size(); i++) {
+      (*pStrArr)[i] = new char [ids[i].length()+1];
+      strcpy ((*pStrArr)[i], ids[i].c_str());
+   }
+   return ids.size();
+}
+
+char *pg_get_lib_filter_display (const char *id)
+{
+   TemplateMgr *tm = TemplateMgr::getInstance();
+   string val = tm->getTemplateData (id, T_DESC);
+   if (val == "err") {
+      return NULL;
+   } else if (val.empty()) {
+      return NULL; //found field, nothing there
+   }
+   char *buf = new char[val.length()+1];
+   strcpy (buf, val.c_str());
+   return buf;
+}
+
+int pg_get_lib_filter_libs (const char *id, char ***pStrArr)
+{
+   //get all libs currently on system
+   vector<string> libs;
+   add_libs_in_dir ("/usr/lib/pkgconfig", &libs);
+   add_libs_in_dir ("/usr/local/lib/pkgconfig", &libs);
+
+   sort (libs.begin(), libs.end());
+
+   //create enough char* to hold all libs
+   *pStrArr = new char*[libs.size()];
+   for (int i=0; i<libs.size(); i++) {
+      (*pStrArr)[i] = new char [libs[i].length()+1];
+      strcpy ((*pStrArr)[i], libs[i].c_str());
+   }
+   return libs.size();
+}
+
+static int add_libs_in_dir (string dir, vector<string>*libArray)
+{
+   if (dir.empty() || !libArray) {
+      return -1;
+   }
+   struct dirent *ep;
+   DIR *dp = opendir (dir.c_str());
+   if (!dp) {
+      return -1;
+   }
+   string srcFile, destFile;
+   while (ep = readdir (dp)) {
+      string srcName = ep->d_name;
+      if (ep->d_type==DT_DIR || srcName == ".." || srcName == ".") {
+        continue;
+      }
+      //cout << "srcName: " << srcName << endl;
+      string::size_type pos = srcName.length()-3;
+      if (srcName.substr(pos, 3) != ".pc") {
+        continue;
+      }
+      //cout << "pushing srcName: " << srcName.substr(0,pos) << endl;
+      libArray->push_back(srcName.substr(0,pos));
+   }
+   closedir (dp);
+   return 0;
+}
diff --git a/libprojgen/projgen.h b/libprojgen/projgen.h
index d35cb78..4732ba1 100644
--- a/libprojgen/projgen.h
+++ b/libprojgen/projgen.h
@@ -25,7 +25,7 @@ int pg_create(int override_if_exists, const char *title,
              int enable_pkgconfig,  const char *doc_type,
              int enable_i18n);
 
-int pg_get_license_ids (char ***pStrArray);
+int pg_get_license_ids (char ***str_array);
 
 int pg_is_licenseid_valid(const char *id);
 
@@ -34,4 +34,14 @@ char *pg_get_template_data (const char *id, int field);
 
 char *pg_get_template_config_path();
 
+int pg_get_libs (char ***str_array);
+
+//------
+
+int pg_get_filter_ids (char ***pStrArr);
+
+char *pg_get_lib_filter_display (const char *id);
+
+int pg_get_lib_filter_libs (const char *id, char ***pStrArr);
+
 #endif //__PROJGEN_H__
diff --git a/libprojgen/templates/template_config.xml 
b/libprojgen/templates/template_config.xml
index f712fd4..296fd54 100644
--- a/libprojgen/templates/template_config.xml
+++ b/libprojgen/templates/template_config.xml
@@ -44,6 +44,24 @@
   </licenses>
   <samples>
   </samples>
+  <lib_filters>
+    <f1 id="Installed" type="lib_filter" name="Installed Libs" 
+       description="Installed development libraries" />
+    <f2 id="Moblin v2" type="lib_filter" name="Moblin v2 Libs" 
+       description="Moblin v2 DRAFT compliant libraries">
+      <m2 id="gtk2" name="gtk+-2.0" description="gtk+-2.0 >= 2.14.4" />
+      <m2 id="clutter" name="clutter-0.9" description="clutter-0.9 >= 0.9" />
+      <m2 id="pango" name="pango" description="pango >= 1.22" />
+      <m2 id="cairo" name="cairo" description="cairo >= 1.8" />
+      <m2 id="python" name="python" description="python >= 2.6" />
+      <m2 id="atk" name="atk" description="atk >= 1.24" />
+      <m2 id="qt" name="qt" description="atk >= 1.24" />
+      <m2 id="atk" name="atk" description="atk >= 1.24" />
+      <m2 id="atk" name="atk" description="atk >= 1.24" />
+    </f2>
+    <f3 id="Moblin v1.5" type="lib_filter" name="Moblin v1.5 Libs" 
+       description="Moblin v1.5 compliant libraries" />
+  </lib_filters>
 
 </templates>
 
diff --git a/src/AddLibraryDlg.cpp b/src/AddLibraryDlg.cpp
index 2ac5dc1..aada26b 100644
--- a/src/AddLibraryDlg.cpp
+++ b/src/AddLibraryDlg.cpp
@@ -9,6 +9,7 @@
  */
 
 #include "AddLibraryDlg.h"
+#include <../libprojgen/projgen.h>
 #include <string>
 
 using namespace std;
@@ -16,6 +17,11 @@ using namespace std;
 const char DLG_ADD_TITLE[] =  "Add Library Dependency";
 const char DLG_EDIT_TITLE[] = "Edit Library Dependency";
 
+void on_filterComboBox_change (GtkComboBox *cb, gpointer data)
+{
+   ((AddLibraryDlg*)data)->onFilterComboBoxChange(cb);
+}
+
 gboolean on_libNameEntry_changed(GtkWidget *w, GdkEventKey *event, gpointer 
data)
 {
    if (event->type==GDK_KEY_RELEASE && !(event->is_modifier)) {
@@ -31,20 +37,88 @@ bool AddLibraryDlg::init(GtkBuilder *builder)
       cout << "Error: AddLibraryDlg initialized without GtkBuilder\n";
       return false;
    }
-   m_nameEntry = GTK_ENTRY(gtk_builder_get_object (builder, "libNameEntry"));
+   m_filterComboBox = 
+      GTK_COMBO_BOX(gtk_builder_get_object (builder, "libFilterComboBox"));
+
+   m_libComboBoxEntry = 
+      GTK_COMBO_BOX_ENTRY(gtk_builder_get_object (builder, 
"libComboBoxEntry"));
+
+   GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
+   gtk_combo_box_set_model (GTK_COMBO_BOX(m_libComboBoxEntry), 
+                           GTK_TREE_MODEL(store));
+   g_object_unref (store);
+
+   cout << "foo0\n";
+   gtk_cell_layout_clear (GTK_CELL_LAYOUT (m_libComboBoxEntry));
+   GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
+   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (m_libComboBoxEntry), 
+                              cell, TRUE);
+   cout << "foo1\n";
+   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (m_libComboBoxEntry), cell,
+                                  "text", 0, NULL);
+   cout << "foo2\n";
+   gtk_combo_box_entry_set_text_column (m_libComboBoxEntry, 0);
+
+
+   cout << "foo2.1\n";
+   gtk_list_store_clear (GTK_LIST_STORE (
+              gtk_combo_box_get_model (GTK_COMBO_BOX(m_libComboBoxEntry))));
+
+
+   cout << "foo2.5\n";
+
+   m_libNameEntry = GTK_ENTRY(gtk_builder_get_object (builder, 
"libNameEntry"));
+
+   cout << "foo2.6\n";
+
    m_opComboBox = 
       GTK_COMBO_BOX(gtk_builder_get_object (builder, "libOpComboBox"));
    m_versionEntry = 
       GTK_ENTRY(gtk_builder_get_object (builder, "libVersionEntry"));
+
+   cout << "foo2.7\n";
+
    m_okBtn = GTK_BUTTON(gtk_builder_get_object (builder, "libOkBtn"));
 
    m_dlg = GTK_WIDGET(gtk_builder_get_object (builder, "addLibraryDlg"));
 
+   cout << "foo3\n";
+
+   //load filters combobox
+   gtk_list_store_clear (GTK_LIST_STORE (
+              gtk_combo_box_get_model (m_filterComboBox)));
+   //load avail filters into array (index matters)
+   char *buf;
+   char **pFilterIdArray;
+   int numFilters = pg_get_filter_ids (&pFilterIdArray);
+   for (int i=0; i<numFilters; i++) {
+      m_filterIds.push_back (pFilterIdArray[i]);
+      buf = pg_get_lib_filter_display (pFilterIdArray[i]); //allocs buf
+
+      gtk_combo_box_insert_text (m_filterComboBox, i, buf);
+      cout << "inserted: " << buf << endl;
+      delete buf;
+   }
+   //cleanup filterArray
+   for (int i=0; i<numFilters; i++) {
+      delete (char*)pFilterIdArray[i];
+   }
+   delete [] pFilterIdArray;
+
+   cout << "foo4\n";
+
    //watch changes on edit field for OKBtn enable
-   g_signal_connect(m_nameEntry, "key-release-event",
+   g_signal_connect(m_libNameEntry, "key-release-event",
                     G_CALLBACK (on_libNameEntry_changed), this);
+   //set callback for filter changed
+   g_signal_connect(m_filterComboBox, "changed",
+                   G_CALLBACK (on_filterComboBox_change), this);
+   gtk_combo_box_set_active (m_filterComboBox, 0);
+
 
-   return (m_nameEntry && m_opComboBox && m_versionEntry && m_dlg);
+   cout << "foo5\n";
+
+   return (m_libNameEntry && m_opComboBox && m_versionEntry && m_dlg);
 }
 
 int AddLibraryDlg::run(gboolean firstTime, string name, string version)
@@ -55,7 +129,7 @@ int AddLibraryDlg::run(gboolean firstTime, string name, 
string version)
    }
 
    //set defaults
-   gtk_entry_set_text (m_nameEntry, name.c_str());
+   gtk_entry_set_text (m_libNameEntry, name.c_str());
    //strip op from version
    string op = "=";
    string::size_type pos = version.find_first_not_of("<>=");
@@ -76,7 +150,7 @@ int AddLibraryDlg::run(gboolean firstTime, string name, 
string version)
    } 
    gtk_combo_box_set_active (m_opComboBox, index);
    gtk_entry_set_text (m_versionEntry, version.c_str());
-   gtk_widget_grab_focus (GTK_WIDGET(m_nameEntry));
+   gtk_widget_grab_focus (GTK_WIDGET(m_libNameEntry));
 
    //launch dialog
    gtk_window_set_title (GTK_WINDOW(m_dlg), 
@@ -89,11 +163,11 @@ int AddLibraryDlg::run(gboolean firstTime, string name, 
string version)
 
 string AddLibraryDlg::getName()
 {
-   if (!m_dlg || !m_nameEntry) {
+   if (!m_dlg || !m_libNameEntry) {
       cout << "Error: AddLibraryDlg::init has not been run\n";
       return "";
    }
-   return gtk_entry_get_text (m_nameEntry);
+   return gtk_entry_get_text (m_libNameEntry);
 }
 
 string AddLibraryDlg::getVersion()
@@ -116,6 +190,56 @@ string AddLibraryDlg::getVersion()
 
 void AddLibraryDlg::onNameChanged()
 {
-   string val = gtk_entry_get_text(m_nameEntry);
+   //validate name and update infoLabel and infoImg (and "OK" btn)
+   string val = gtk_entry_get_text(m_libNameEntry);
    gtk_widget_set_sensitive(GTK_WIDGET(m_okBtn), val!="");
+
+   /*   if (val.find_first_of (" ") != string::npos) {
+      m_ui->addInfoText(TAB_MAIN, nameEntry, INFO_ERROR, 
+                        "Short name can not have spaces.  " \
+                       "Use '-' or '_'");
+
+   } else if (val.find_first_of ("~...@#$%^&*\\|/") != string::npos) {
+      m_ui->addInfoText(TAB_MAIN, nameEntry, INFO_ERROR,
+                        "Short name has invalid characters " \
+                       "(~...@#$%^&*|\\/)");
+   } else {
+      m_ui->delInfoText(nameEntry);
+   }
+   */
+}
+
+
+void AddLibraryDlg::onFilterComboBoxChange(GtkComboBox *cb)
+{
+   gint index = gtk_combo_box_get_active (cb);
+   if (index==-1) {
+      return;
+   }
+   cout << "foo7\n";
+
+   //load language combobox
+   gtk_list_store_clear (GTK_LIST_STORE (
+           gtk_combo_box_get_model (GTK_COMBO_BOX(m_libComboBoxEntry))));
+
+   /*   gtk_combo_box_append_text (GTK_COMBO_BOX(m_libComboBoxEntry), 
+                             m_filterIds[index].c_str());
+   */
+   cout << "foo8\n";
+
+   //load avail filters into array (index matters)
+   char *buf;
+   char **pLibArr;
+   int numLibs = pg_get_lib_filter_libs (m_filterIds[index].c_str(), &pLibArr);
+   for (int i=0; i<numLibs; i++) {
+      gtk_combo_box_append_text (GTK_COMBO_BOX(m_libComboBoxEntry), 
+                                      pLibArr[i]);
+   }
+   //cleanup filterArray
+   for (int i=0; i<numLibs; i++) {
+      delete (char*)pLibArr[i];
+   }
+   delete [] pLibArr;
 }
+
+
diff --git a/src/AddLibraryDlg.h b/src/AddLibraryDlg.h
index ad3d75d..8d2ed2a 100644
--- a/src/AddLibraryDlg.h
+++ b/src/AddLibraryDlg.h
@@ -14,6 +14,7 @@
 #include <gtk/gtk.h>
 #include <iostream>
 #include <string>
+#include <vector>
 
 using namespace std;
 
@@ -22,8 +23,13 @@ using namespace std;
 
 class AddLibraryDlg
 {
+   vector<string> m_filterIds;
+
    GtkWidget *m_dlg;
-   GtkEntry *m_nameEntry;
+   GtkComboBox *m_filterComboBox;
+   GtkComboBoxEntry *m_libComboBoxEntry;
+   GtkEntry *m_libNameEntry;
+
    GtkComboBox *m_opComboBox;
    GtkEntry *m_versionEntry;
    GtkButton *m_okBtn;
@@ -38,6 +44,7 @@ class AddLibraryDlg
    
    //callback
    void onNameChanged();
+   void onFilterComboBoxChange(GtkComboBox *cb);
 };
 
 #endif // __ADDLIBRARYDLG_H__
diff --git a/src/glade/projgen.glade b/src/glade/projgen.glade
index 04ca798..b016ff9 100644
--- a/src/glade/projgen.glade
+++ b/src/glade/projgen.glade
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.4.5 on Thu Jan 15 22:02:22 2009 -->
_______________________________________________
Commits mailing list
[email protected]
https://lists.moblin.org/mailman/listinfo/commits

Reply via email to