+ vector<PropertyObject *> _liveObjects;
+
+ class ConditionalObject : public SGConditional
+ {
+ public:
+ ConditionalObject(const std::string& aName, puObject* aPu) :
+ _name(aName),
+ _pu(aPu)
+ { ; }
+
+ void update(FGDialog* aDlg);
+
+ private:
+ const std::string _name;
+ puObject* _pu;
+ };
+
+ typedef SGSharedPtr<ConditionalObject> ConditionalObjectRef;
+ vector<ConditionalObjectRef> _conditionalObjects;
+};
+
+//
+// Custom subclass of puPopup to implement "draggable" windows in the
+// interface. Note that this is a subclass of puPopup, not
+// puDialogBox. Sadly, PUI (mis)uses subclassing to implement a
+// boolean property: modality. That means that we can't implement
+// dragging of both puPopup windows and puDialogBoxes with the same
+// code. Rather than duplicate code, I've chosen to implement only
+// "non-modal dragability" here. Modal dialog boxes (like the exit
+// confirmation) are not draggable.
+//
+class fgPopup : public puPopup {
+public:
+ fgPopup(int x, int y, bool r = true, bool d = true) :
+ puPopup(x, y), _draggable(d), _resizable(r), _dragging(false)
+ {}
+ int checkHit(int b, int up, int x, int y);
+ int checkKey(int key, int updown);
+ int getHitObjects(puObject *, int x, int y);
+ puObject *getKeyObject(puObject *, int key);
+ puObject *getActiveInputField(puObject *);
+ void applySize(puObject *);
+private:
+ enum { LEFT = 1, RIGHT = 2, TOP = 4, BOTTOM = 8 };
+ bool _draggable;
+ bool _resizable;
+ bool _dragging;
+ int _resizing;
+ int _start_cursor;
+ int _cursor;
+ int _dlgX, _dlgY, _dlgW, _dlgH;
+ int _startX, _startY;
+};