[poppler] poppler/Form.cc poppler/Form.h qt4/src

Albert Astals Cid aacid at kemper.freedesktop.org
Sun Sep 16 08:54:58 PDT 2012


 poppler/Form.cc         |   45 +++++++++++++++++++++++++--------------------
 poppler/Form.h          |   24 +++++++++++++-----------
 qt4/src/poppler-form.cc |   13 ++++++++++---
 3 files changed, 48 insertions(+), 34 deletions(-)

New commits:
commit 3794916572a0531b10ee57c9f189497489b90bc8
Author: Albert Astals Cid <aacid at kde.org>
Date:   Sun Sep 16 17:53:47 2012 +0200

    Fix the siblings field correctly
    
    Fixes KDE bug #302334

diff --git a/poppler/Form.cc b/poppler/Form.cc
index 7d32ae0..309b065 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -165,8 +165,6 @@ FormWidgetButton::FormWidgetButton (PDFDoc *docA, Object *aobj, unsigned num, Re
   type = formButton;
   parent = static_cast<FormFieldButton*>(field);
   onStr = NULL;
-  siblingsID = NULL;
-  numSiblingsID = 0;
 
   Object obj1, obj2;
 
@@ -199,8 +197,6 @@ char *FormWidgetButton::getOnStr() {
 
 FormWidgetButton::~FormWidgetButton ()
 {
-  if (siblingsID)
-    gfree(siblingsID);
   delete onStr;
 }
 
@@ -234,12 +230,6 @@ GBool FormWidgetButton::getState ()
   return onStr ? parent->getState(onStr->getCString()) : gFalse;
 }
 
-void FormWidgetButton::setNumSiblingsID (int i)
-{ 
-  numSiblingsID = i; 
-  siblingsID = (unsigned*)greallocn(siblingsID, numSiblingsID, sizeof(unsigned));
-}
-
 
 FormWidgetText::FormWidgetText (PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) :
 	FormWidget(docA, aobj, num, ref, p)
@@ -777,6 +767,8 @@ FormFieldButton::FormFieldButton(PDFDoc *docA, Object *aobj, const Ref& ref, For
   Dict* dict = obj.getDict();
   active_child = -1;
   noAllOff = false;
+  siblings = NULL;
+  numSiblings = 0;
   appearanceState.initNull();
 
   Object obj1;
@@ -827,20 +819,31 @@ void FormFieldButton::print(int indent)
 }
 #endif
 
+void FormFieldButton::setNumSiblings (int num)
+{ 
+  numSiblings = num; 
+  siblings = (FormFieldButton**)greallocn(siblings, numSiblings, sizeof(FormFieldButton*));
+}
+
 void FormFieldButton::fillChildrenSiblingsID()
 {
   if (!terminal) {
     for(int i=0; i<numChildren; i++) {
-      children[i]->fillChildrenSiblingsID();
-    }
-  } else {
-    for(int i=0; i<numChildren; i++) {
-      FormWidgetButton *btn = static_cast<FormWidgetButton*>(widgets[i]);
-      btn->setNumSiblingsID(numChildren-1);
-      for(int j=0, counter=0; j<numChildren; j++) {
-        if (i == j) continue;
-        btn->setSiblingsID(counter, widgets[j]->getID());
-        counter++;
+      FormFieldButton *child = dynamic_cast<FormFieldButton*>(children[i]);
+      if (child != NULL) {
+        // Fill the siblings of this node childs
+        child->setNumSiblings(numChildren-1);
+        for(int j=0, counter=0; j<numChildren; j++) {
+          FormFieldButton *otherChild = dynamic_cast<FormFieldButton*>(children[j]);
+          if (i == j) continue;
+          if (child == otherChild) continue;
+          child->setSibling(counter, otherChild);
+          counter++;
+        }
+
+        // now call ourselves on the child
+        // to fill its children data
+        child->fillChildrenSiblingsID();
       }
     }
   }
@@ -933,6 +936,8 @@ void FormFieldButton::updateState(char *state) {
 FormFieldButton::~FormFieldButton()
 {
   appearanceState.free();
+  if (siblings)
+    gfree(siblings);
 }
 
 //------------------------------------------------------------------------
diff --git a/poppler/Form.h b/poppler/Form.h
index fa3c718..303936a 100644
--- a/poppler/Form.h
+++ b/poppler/Form.h
@@ -6,7 +6,7 @@
 //
 // Copyright 2006 Julien Rebetez <julienr at svn.gnome.org>
 // Copyright 2007, 2008, 2011 Carlos Garcia Campos <carlosgc at gnome.org>
-// Copyright 2007-2010 Albert Astals Cid <aacid at kde.org>
+// Copyright 2007-2010, 2012 Albert Astals Cid <aacid at kde.org>
 // Copyright 2010 Mark Riedesel <mark at klowner.com>
 // Copyright 2011 Pino Toscano <pino at kde.org>
 //
@@ -155,17 +155,7 @@ public:
   char* getOnStr();
   void setAppearanceState(const char *state);
 
-  void setNumSiblingsID (int i);
-  void setSiblingsID (int i, unsigned id) { siblingsID[i] = id; }
-
-  //For radio buttons, return the IDs of the other radio buttons in the same group
-  unsigned* getSiblingsID () const { return siblingsID; }
-  int getNumSiblingsID () const { return numSiblingsID; }
-
 protected:
-  unsigned* siblingsID; // IDs of dependent buttons (each button of a radio field has all the others buttons
-                        // of the same field in this array)
-  int numSiblingsID;
   GooString *onStr;
   FormFieldButton *parent;
 };
@@ -281,6 +271,7 @@ public:
   GooString *getFullyQualifiedName();
 
   FormWidget* findWidgetByRef (Ref aref);
+  int getNumWidgets() { return terminal ? numChildren : 0; }
   FormWidget *getWidget(int i) { return terminal ? widgets[i] : NULL; }
 
   // only implemented in FormFieldButton
@@ -345,6 +336,13 @@ public:
   char *getAppearanceState() { return appearanceState.isName() ? appearanceState.getName() : NULL; }
 
   void fillChildrenSiblingsID ();
+  
+  void setNumSiblings (int num);
+  void setSibling (int i, FormFieldButton *id) { siblings[i] = id; }
+
+  //For radio buttons, return the fields of the other radio buttons in the same group
+  FormFieldButton* getSibling (int i) const { return siblings[i]; }
+  int getNumSiblings () const { return numSiblings; }
 
 #ifdef DEBUG_FORMS
   void print(int indent = 0);
@@ -354,6 +352,10 @@ public:
 protected:
   void updateState(char *state);
 
+  FormFieldButton** siblings; // IDs of dependent buttons (each button of a radio field has all the others buttons
+                               // of the same field in this array)
+  int numSiblings;
+
   FormButtonType btype;
   int size;
   int active_child; //only used for combo box
diff --git a/qt4/src/poppler-form.cc b/qt4/src/poppler-form.cc
index 82309ff..f072356 100644
--- a/qt4/src/poppler-form.cc
+++ b/qt4/src/poppler-form.cc
@@ -226,13 +226,20 @@ void FormFieldButton::setState( bool state )
 QList<int> FormFieldButton::siblings() const
 {
   FormWidgetButton* fwb = static_cast<FormWidgetButton*>(m_formData->fm);
+  ::FormFieldButton* ffb = static_cast< ::FormFieldButton* >(fwb->getField());
   if (fwb->getButtonType() == formButtonPush)
     return QList<int>();
 
   QList<int> ret;
-  unsigned *sibls = fwb->getSiblingsID();
-  for (int i = 0; i < fwb->getNumSiblingsID(); ++i)
-    ret.append(sibls[i]);
+  for (int i = 0; i < ffb->getNumSiblings(); ++i)
+  {
+    ::FormFieldButton* sibling = static_cast< ::FormFieldButton* >(ffb->getSibling(i));
+    for (int j = 0; j < sibling->getNumWidgets(); ++j)
+    {
+        FormWidget *w = sibling->getWidget(j);
+        if (w) ret.append(w->getID());
+    }
+  }
 
   return ret;
 }


More information about the poppler mailing list