eliot-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Eliot-dev] Changes to eliot/wxwin/searchpanel.cc [antoine-1]


From: eliot-dev
Subject: [Eliot-dev] Changes to eliot/wxwin/searchpanel.cc [antoine-1]
Date: Sun, 23 Oct 2005 13:11:03 -0400

Index: eliot/wxwin/searchpanel.cc
diff -u /dev/null eliot/wxwin/searchpanel.cc:1.10.2.1
--- /dev/null   Sun Oct 23 17:11:03 2005
+++ eliot/wxwin/searchpanel.cc  Sun Oct 23 17:10:47 2005
@@ -0,0 +1,366 @@
+/* Eliot                                                                     */
+/* Copyright (C) 1999  Antoine Fraboulet                                     */
+/*                                                                           */
+/* This file is part of Eliot.                                               */
+/*                                                                           */
+/* Eliot is free software; you can redistribute it and/or modify             */
+/* it under the terms of the GNU General Public License as published by      */
+/* the Free Software Foundation; either version 2 of the License, or         */
+/* (at your option) any later version.                                       */
+/*                                                                           */
+/* Eliot is distributed in the hope that it will be useful,                  */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
+/* GNU General Public License for more details.                              */
+/*                                                                           */
+/* You should have received a copy of the GNU General Public License         */
+/* along with this program; if not, write to the Free Software               */
+/* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
*/
+
+/* $Id: searchpanel.cc,v 1.10.2.1 2005/10/23 17:10:47 afrab Exp $ */
+
+#include <string.h>
+#include "wx/wx.h"
+
+#include "ewx.h"
+#include "dic.h"
+#include "dic_search.h"
+#include "regexp.h"
+#include "searchpanel.h"
+#include "tile.h"
+#include "configdb.h"
+
+enum {
+  ID_PANEL_CROSS,
+  ID_PANEL_PLUS1,
+  ID_PANEL_REGEXP,
+
+  ID_LIST,
+  ID_TEXT,
+  ID_OPTION1,
+  ID_OPTION2,
+  ID_OPTION3
+};
+
+// ************************************************************
+// ************************************************************
+// ************************************************************
+
+class SimpleSearchPanel : public wxPanel
+{
+protected:
+    ConfigDB config;
+    Dictionary dic;
+    wxTextCtrl* t;
+    wxListBox*  l;
+    wxBoxSizer *sizer;
+
+    int  check_dic();
+    void check_end();
+    void panel_build();
+    virtual void panel_options() = 0;
+public:
+  SimpleSearchPanel(wxWindow* parent, int id, Dictionary d) : 
wxPanel(parent,id) { dic = d; };
+  virtual void compute_char(wxCommandEvent&) {};
+  virtual void compute_enter(wxCommandEvent&) {};
+  DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(SimpleSearchPanel, wxPanel)
+  EVT_TEXT      (ID_TEXT   , SimpleSearchPanel::compute_char)
+  EVT_TEXT_ENTER(ID_TEXT   , SimpleSearchPanel::compute_enter)
+  EVT_TEXT_ENTER(ID_OPTION1, SimpleSearchPanel::compute_enter)
+  EVT_TEXT_ENTER(ID_OPTION2, SimpleSearchPanel::compute_enter)
+  EVT_TEXT_ENTER(ID_OPTION3, SimpleSearchPanel::compute_enter)
+END_EVENT_TABLE()
+
+void SimpleSearchPanel::panel_build()
+{
+  t = new 
wxTextCtrl(this,ID_TEXT,wxT(""),wxPoint(0,0),wxSize(-1,-1),wxTE_PROCESS_ENTER);
+  t->SetFont(config.getFont(LISTFONT));
+  l = new wxListBox(this,ID_LIST);
+  l->SetFont(config.getFont(LISTFONT));
+  l->Show(TRUE);
+
+  sizer = new wxBoxSizer( wxVERTICAL );
+  sizer->Add(t, 0, wxEXPAND | wxALL, 0);
+  panel_options();
+  sizer->Add(l, 1, wxEXPAND | wxALL, 0);
+
+  SetAutoLayout(TRUE);
+  SetSizer(sizer);
+  sizer->Fit(this);
+  sizer->SetSizeHints(this);
+}
+
+int
+SimpleSearchPanel::check_dic()
+{
+  wxString msg = wxT("");
+  if (dic == NULL)
+    {
+      l->Clear();
+      msg << wxT("Pas de dictionnaire");
+      l->Append(msg);
+      return 0;
+    }
+  return 1;
+}
+
+void
+SimpleSearchPanel::check_end()
+{
+  if (l->GetCount() == 0)
+    {
+      l->Append(wxT("Aucun resultat"));
+    }
+}
+
+// ************************************************************
+// ************************************************************
+// ************************************************************
+
+class PCross : public SimpleSearchPanel
+{
+protected:
+  virtual void panel_options() {};
+public:
+  void compute_char(wxCommandEvent&) { };
+  void compute_enter(wxCommandEvent&);
+  PCross(wxWindow* parent, int id, Dictionary dic) : 
SimpleSearchPanel(parent,id,dic) { panel_build(); };
+};
+
+void
+PCross::compute_enter(wxCommandEvent&)
+{
+  int  i;
+  char rack[DIC_WORD_MAX];
+  char buff[RES_CROS_MAX][DIC_WORD_MAX];
+
+  if (!check_dic())
+    return;
+
+  if (t->GetValue().Len() >= DIC_WORD_MAX)
+    {
+      wxString msg = wxT("");
+      msg << wxT("La recherche est limitee a ") << DIC_WORD_MAX - 1 << wxT(" 
lettres");
+      l->Append(msg);
+      return;
+    }
+
+  strncpy(rack, t->GetValue().mb_str(), DIC_WORD_MAX);
+  Dic_search_Cros(dic,rack,buff);
+
+  int resnum = 0;
+  wxString res[RES_CROS_MAX];
+  for(i=0; i < RES_CROS_MAX && buff[i][0]; i++)
+    res[resnum++] =  wxU(buff[i]);
+  l->Set(resnum,res);
+  check_end();
+}
+
+// ************************************************************
+// ************************************************************
+// ************************************************************
+
+class PPlus1 : public SimpleSearchPanel
+{
+protected:
+  virtual void panel_options() {};
+public:
+  void compute_char(wxCommandEvent&) { };
+  void compute_enter(wxCommandEvent&);
+  PPlus1(wxWindow* parent, int id, Dictionary dic) : 
SimpleSearchPanel(parent,id,dic) { panel_build(); };
+};
+
+void
+PPlus1::compute_enter(wxCommandEvent&)
+{
+  int  i,j;
+  char rack[DIC_WORD_MAX];
+  char buff[DIC_LETTERS][RES_7PL1_MAX][DIC_WORD_MAX];
+
+  if (!check_dic())
+    return;
+
+  if (t->GetValue().Len() >= DIC_WORD_MAX)
+    {
+      wxString msg = wxT("");
+      msg << wxT("La recherche est limitee a ") << DIC_WORD_MAX - 1 << wxT(" 
lettres");
+      l->Append(msg);
+      return;
+    }
+
+  strncpy(rack, t->GetValue().mb_str(), DIC_WORD_MAX);
+  Dic_search_7pl1(dic,rack,buff,TRUE);
+
+  int resnum = 0;
+  wxString res[DIC_LETTERS*(RES_7PL1_MAX+1)];
+  for(i=0; i < DIC_LETTERS; i++)
+    {
+      if (i && buff[i][0][0])
+          res[resnum++] = wxString(wxT("+")) + (wxChar)(i+'A'-1);
+      for(j=0; j < RES_7PL1_MAX && buff[i][j][0]; j++)
+          res[resnum++] = wxString(wxT("  ")) + wxU(buff[i][j]);
+    }
+  l->Set(resnum,res);
+  check_end();
+}
+
+// ************************************************************
+// ************************************************************
+// ************************************************************
+
+class PRegExp : public SimpleSearchPanel
+{
+protected:
+  wxTextCtrl* omin;
+  wxTextCtrl* omax;
+  struct search_RegE_list_t llist;
+  virtual void build_letter_lists();
+  virtual void panel_options();
+public:
+  void compute_char(wxCommandEvent&) { };
+  void compute_enter(wxCommandEvent&);
+  PRegExp(wxWindow* parent, int id, Dictionary dic) : 
SimpleSearchPanel(parent,id,dic) { panel_build(); };
+};
+
+void
+PRegExp::build_letter_lists()
+{
+  int i;
+  std::list<Tile> all_tiles;
+
+  memset (&llist,0,sizeof(llist));
+
+  llist.minlength = 1;
+  llist.maxlength = 15;
+
+  llist.symbl[0] = RE_ALL_MATCH;
+  llist.symbl[1] = RE_VOWL_MATCH;
+  llist.symbl[2] = RE_CONS_MATCH;
+  llist.symbl[3] = RE_USR1_MATCH;
+  llist.symbl[5] = RE_USR2_MATCH;
+
+  llist.valid[0] = 1; // all letters
+  llist.valid[1] = 1; // vowels
+  llist.valid[2] = 1; // consonants
+  llist.valid[3] = 0; // user defined list 1
+  llist.valid[4] = 0; // user defined list 2
+
+  for(i=0; i < DIC_SEARCH_REGE_LIST; i++)
+    {
+      memset(llist.letters[i],0,sizeof(llist.letters[i]));
+    }
+
+  const std::list<Tile>& allTiles = Tile::getAllTiles();
+  std::list<Tile>::const_iterator it;
+  for (it = allTiles.begin(); it != allTiles.end(); it++)
+    {
+      if (! it->isJoker() && ! it->isEmpty())
+       {
+         // all tiles
+         llist.letters[0][it->toCode()] = 1;
+         // vowels
+         if (it->isVowel())
+           {
+             llist.letters[1][it->toCode()] = 1;
+           }
+         // consonants
+         if (it->isConsonant())
+           {
+             llist.letters[2][it->toCode()] = 1;
+           }
+       }
+    }
+}
+
+
+void
+PRegExp::panel_options()
+{
+  wxStaticText *otmin;
+  wxStaticText *otmax;
+
+  otmin = new wxStaticText(this,wxID_ANY,wxT("Longueur min."));
+  omin  = new wxTextCtrl(this,ID_OPTION1,wxT( 
"1"),wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER);
+  otmax = new wxStaticText(this,wxID_ANY,wxT("max."));
+  omax  = new 
wxTextCtrl(this,ID_OPTION2,wxT("15"),wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER);
 
+
+  wxBoxSizer *s = new wxBoxSizer( wxHORIZONTAL );
+  s->Add(otmin, 0, wxALIGN_CENTRE_VERTICAL | wxLEFT | wxRIGHT, 4);
+  s->Add(omin , 1, wxALIGN_CENTRE_VERTICAL, 0);
+  s->Add(otmax, 0, wxALIGN_CENTRE_VERTICAL | wxLEFT | wxRIGHT, 4);
+  s->Add(omax , 1, wxALIGN_CENTRE_VERTICAL, 0);
+  sizer->Add(s, 0, wxEXPAND | wxALL, 1);
+}
+
+
+#define DIC_RE_MAX (3*DIC_WORD_MAX) // yes, it's 3 
+
+void
+PRegExp::compute_enter(wxCommandEvent&)
+{
+  char re[DIC_RE_MAX];
+  char buff[RES_REGE_MAX][DIC_WORD_MAX];
+
+  if (!check_dic())
+    return;
+
+  build_letter_lists();
+  strncpy(re, t->GetValue().mb_str(),DIC_RE_MAX);
+  debug("PRegExp::compute_enter for %s",re);
+
+  int lmin = atoi((const char*)omin->GetValue().mb_str());
+  int lmax = atoi((const char*)omax->GetValue().mb_str());
+  if (lmax <= (DIC_WORD_MAX - 1) && lmin >= 1 && lmin <= lmax)
+    {
+      llist.minlength = lmin;
+      llist.maxlength = lmax;
+      debug(" length %d,%d",lmin,lmax);
+    }
+  else
+    {
+      debug(" bad length -%s,%s-",
+           (const char*)omin->GetValue().mb_str(),
+           (const char*)omax->GetValue().mb_str());
+    }
+  debug("\n");
+
+  Dic_search_RegE(dic,re,buff,&llist);
+
+  int resnum = 0;
+  wxString res[RES_REGE_MAX];
+  for(int i=0; i < RES_REGE_MAX && buff[i][0]; i++)
+    res[resnum++] =  wxU(buff[i]);
+
+  l->Set(resnum,res);
+  check_end();
+}
+
+// ************************************************************
+// ************************************************************
+// ************************************************************
+
+SearchPanel::SearchPanel(wxFrame *parent, Dictionary dic) :
+  wxNotebook(parent, -1)
+{
+  AddPage(new PCross (this,ID_PANEL_CROSS ,dic),wxT("Mots croises"));
+  AddPage(new PPlus1 (this,ID_PANEL_PLUS1 ,dic),wxT("Plus 1"));
+  AddPage(new PRegExp(this,ID_PANEL_REGEXP,dic),wxT("Exp. Rationnelle"));
+  SetSelection(2);
+}
+
+SearchPanel::~SearchPanel()
+{
+}
+
+// ************************************************************
+// ************************************************************
+// ************************************************************
+
+
+/// Local Variables:
+/// mode: hs-minor
+/// c-basic-offset: 4
+/// End:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]