#ifndef PROPERTY_EDITOR_H #define PROPERTY_EDITOR_H class Property : public QObject { Q_OBJECT public: Property(Property *parent, const QString &name); ~Property(); QString name() const { return name_; } void setName(const QString &name); virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); Property *parent() const { return parent_; } virtual bool hasValue() const { return true; } bool readOnly() const { return readOnly_; } void setReadOnly(bool value); QList children() const { return children_; } void addChild(Property *child); void insertChild(int index, Property *child); void removeChild(Property *child); void clear(); int childCount() const { return children_.size(); } virtual bool hasStaticText(int column) const { return false; } virtual QString staticText(int column) const { return QString(); } virtual QColor staticColor(int column) const { return QColor(); } QString toolTip() const { return toolTip_; } void setToolTip(const QString &value) { toolTip_ = value; } signals: void destroyed(Property *prop); void changed(Property *prop); private: Property *parent_; QString name_; bool readOnly_; QList children_; QString toolTip_; }; class StringProperty : public Property { Q_OBJECT public: StringProperty(Property *parent, const QString &name, const QString &value); virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); QString value() const { return value_; } void setValue(const QString &value); signals: void valueChanged(const QString &value); private slots: void editorChanged(const QString &value); private: QString value_; }; class BoolProperty : public Property { Q_OBJECT public: BoolProperty(Property *parent, const QString &name, bool value); virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); bool value() const { return value_; } void setValue(bool value); signals: void valueChanged(bool value); private slots: void editorChanged(bool value); private: bool value_; }; class DateProperty : public Property { Q_OBJECT public: DateProperty(Property *parent, const QString &name, const QDate &value); virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); QDate value() const { return value_; } void setValue(const QDate &value); signals: void valueChanged(const QDate &value); private slots: void editorChanged(const QDate &value); private: QDate value_; }; class StringListProperty : public StringProperty { public: StringListProperty(Property *parent, const QString &name, const QString &value); virtual QWidget *createEditor(QWidget *parent); }; class GroupProperty : public Property { Q_OBJECT public: GroupProperty(Property *parent, const QString &name); virtual bool hasValue() const { return false; } }; class CommandProperty : public Property { Q_OBJECT public: CommandProperty(Property *parent, ICommand *value); virtual QString valueText() const; ICommand *value() const { return value_; } virtual bool hasStaticText(int column) const; virtual QString staticText(int column) const; virtual QColor staticColor(int column) const; private: ICommand *value_; QString text_; }; class EnumProperty : public Property { Q_OBJECT public: EnumProperty(Property *parent, const QString &name, const QStringList &items, int value); int value() const { return value_; } void setValue(int value); void setItems(const QStringList &items) { items_ = items; } virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); void setText(int index, const QString &text) { items_[index] = text; } signals: void valueChanged(int value); private slots: void editorChanged(int value); private: QStringList items_; int value_; }; class CompilationTypeProperty : public Property { Q_OBJECT public: CompilationTypeProperty(Property *parent, const QString &name, CompilationType value); CompilationType value() const { return value_; } void setValue(CompilationType value); virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); void setDefaultValue(CompilationType value) { defaultValue_ = value; } void setText(int index, const QString &text) { items_[index] = text; } signals: void valueChanged(CompilationType value); private slots: void editorChanged(int value); private: QStringList items_; CompilationType value_; CompilationType defaultValue_; }; class FileNameProperty : public Property { Q_OBJECT public: FileNameProperty(Property *parent, const QString &name, const QString &filter, const QString &value, bool saveMode = false); QString value() const { return value_; } void setValue(const QString &value); void setRelativePath(const QString &relativePath) { relativePath_ = relativePath; } virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); void setFilter(const QString &filter) { filter_ = filter; } signals: void valueChanged(const QString &value); private slots: void editorChanged(const QString &value); private: QString filter_; QString value_; QString relativePath_; bool saveMode_; }; class WatermarkProperty : public Property { Q_OBJECT public: WatermarkProperty(Property *parent, const QString &name, const QString &value); QString value() const { return value_; } void setValue(const QString &value); virtual QString valueText() const; virtual QWidget *createEditor(QWidget *parent); signals: void valueChanged(const QString &value); private slots: void editorChanged(const QString &value); private: QString value_; }; class PropertyManager : public QAbstractItemModel { Q_OBJECT public: PropertyManager(QObject *parent = 0); ~PropertyManager(); void clear(); virtual QModelIndex index(int row, int column, const QModelIndex &parent) const; virtual QModelIndex parent(const QModelIndex &index) const; virtual int rowCount(const QModelIndex &parent) const; virtual int columnCount(const QModelIndex &parent) const; virtual QVariant data(const QModelIndex &index, int role) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; virtual Qt::ItemFlags flags(const QModelIndex &index) const; BoolProperty *addBoolProperty(Property *parent, const QString &name, bool value); StringProperty *addStringProperty(Property *parent, const QString &name, const QString &value); GroupProperty *addGroupProperty(Property *parent, const QString &name); DateProperty *addDateProperty(Property *parent, const QString &name, const QDate &value); StringListProperty *addStringListProperty(Property *parent, const QString &name, const QString &value); EnumProperty *addEnumProperty(Property *parent, const QString &name, const QStringList &items, int value); FileNameProperty *addFileNameProperty(Property *parent, const QString &name, const QString &filter, const QString &value, bool saveMode = false); CommandProperty *addCommandProperty(Property *parent, ICommand *value); WatermarkProperty *addWatermarkProperty(Property *parent, const QString &name, const QString &value); CompilationTypeProperty *addCompilationTypeProperty(Property *parent, const QString &name, CompilationType value); QModelIndex propertyToIndex(Property *prop) const; Property *indexToProperty(const QModelIndex &index) const; GroupProperty *root() const { return root_; } private slots: void slotPropertyChanged(Property *prop); void slotPropertyDestroyed(Property *prop); private: void addProperty(Property *prop); GroupProperty *root_; }; class PropertyEditorDelegate : public TreeViewItemDelegate { Q_OBJECT public: PropertyEditorDelegate(QObject *parent = 0); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const; private: void setEditorData(QWidget * /*widget*/, const QModelIndex &) const; Property *indexToProperty(const QModelIndex &index) const; }; class TreePropertyEditor : public TreeView { Q_OBJECT public: TreePropertyEditor(QWidget *parent = NULL); protected: void keyPressEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event); Property *indexToProperty(const QModelIndex &index) const; protected slots: virtual void dataChanged (const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector &roles = QVector()); }; class License; class InternalFile; class LicensePropertyManager : public PropertyManager { Q_OBJECT public: LicensePropertyManager(QObject *parent = 0); License *value() const { return value_; } void setValue(License *value); void update(); virtual QVariant data(const QModelIndex &index, int role) const; void localize(); StringProperty *serialNumber() const { return licenseSerialNumber_; } private slots: void nameChanged(const QString &value); void emailChanged(const QString &value); void orderChanged(const QString &value); void dateChanged(const QDate &value); void commentsChanged(const QString &value); void blockedChanged(bool value); private: License *value_; bool lock_; GroupProperty *details_; StringProperty *licenseName_; StringProperty *licenseEmail_; DateProperty *licenseDate_; StringProperty *licenseOrder_; StringListProperty *licenseComments_; StringProperty *licenseSerialNumber_; BoolProperty *licenseBlocked_; GroupProperty *contents_; StringProperty *serialName_; StringProperty *serialEmail_; StringProperty *serialHWID_; StringProperty *serialTimeLimit_; DateProperty *serialExpirationDate_; DateProperty *serialMaxBuildDate_; StringProperty *serialUserData_; }; class InternalFilePropertyManager : public PropertyManager { Q_OBJECT public: InternalFilePropertyManager(QObject *parent = 0); InternalFile *value() const { return value_; } void setValue(InternalFile *value); void update(); void localize(); QModelIndex fileNameIndex() const { return propertyToIndex(fileName_); } private slots: void nameChanged(const QString &value); void fileNameChanged(const QString &value); void actionChanged(int value); private: InternalFile *value_; bool lock_; GroupProperty *details_; StringProperty *name_; FileNameProperty *fileName_; EnumProperty *action_; }; class AssemblyPropertyManager : public PropertyManager { Q_OBJECT public: AssemblyPropertyManager(QObject *parent = 0); InternalFile *value() const { return value_; } void setValue(InternalFile *value); void update(); void localize(); QModelIndex fileNameIndex() const { return propertyToIndex(fileName_); } private slots: void nameChanged(const QString &value); void fileNameChanged(const QString &value); private: InternalFile *value_; bool lock_; GroupProperty *details_; StringProperty *name_; FileNameProperty *fileName_; }; class FunctionPropertyManager : public PropertyManager { Q_OBJECT public: FunctionPropertyManager(QObject *parent = 0); FunctionBundle *value() const { return value_; } void setValue(FunctionBundle *value); void update(); void localize(); void addFunction(IFunction *func); void updateFunction(IFunction *func); bool removeFunction(IFunction *func); virtual QVariant data(const QModelIndex &index, int role) const; QModelIndex commandToIndex(ICommand *command) const; ICommand *indexToCommand(const QModelIndex &index) const; IFunction *indexToFunction(const QModelIndex &index) const; private slots: void compilationTypeChanged(CompilationType value); void lockToKeyChanged(bool value); private: void createCommands(IFunction *func, Property *code); bool internalAddFunction(IFunction *func); bool internalRemoveFunction(IFunction *func); struct ArchInfo { StringProperty *code; QMap map; ArchInfo() : code(NULL) {} }; FunctionBundle *value_; bool lock_; GroupProperty *protection_; CompilationTypeProperty *compilationType_; BoolProperty *lockToKey_; GroupProperty *details_; StringProperty *name_; StringProperty *address_; StringProperty *type_; QMap map_; }; class SectionPropertyManager : public PropertyManager { Q_OBJECT public: SectionPropertyManager(QObject *parent = 0); ISection *value() const { return value_; } void setValue(ISection *value); void update(); void localize(); private: ISection *value_; GroupProperty *details_; StringProperty *name_; StringProperty *address_; StringProperty *virtual_size_; StringProperty *physical_offset_; StringProperty *physical_size_; StringProperty *flags_; }; class SegmentPropertyManager : public PropertyManager { Q_OBJECT public: SegmentPropertyManager(QObject *parent = 0); ISection *value() const { return value_; } void setValue(ISection *value); void update(); void localize(); private slots: void excludedFromPackingChanged(bool value); void excludedFromMemoryProtectionChanged(bool value); private: ISection *value_; bool lock_; GroupProperty *options_; GroupProperty *details_; BoolProperty *excluded_from_packing_; BoolProperty *excluded_from_memory_protection_; StringProperty *name_; StringProperty *address_; StringProperty *virtual_size_; StringProperty *physical_offset_; StringProperty *physical_size_; StringProperty *flags_; BoolProperty *flag_readable_; BoolProperty *flag_writable_; BoolProperty *flag_executable_; BoolProperty *flag_shared_; BoolProperty *flag_discardable_; BoolProperty *flag_notpaged_; }; class ImportPropertyManager : public PropertyManager { Q_OBJECT public: ImportPropertyManager(QObject *parent = 0); ~ImportPropertyManager(); virtual QVariant data(const QModelIndex &index, int role) const; IImportFunction *value() const { return value_; } void setValue(IImportFunction *value); void update(); void localize(); private: IImportFunction *value_; GroupProperty *details_; StringProperty *name_; StringProperty *address_; StringProperty *references_; IFunction *func_; }; class ExportPropertyManager : public PropertyManager { Q_OBJECT public: ExportPropertyManager(QObject *parent = 0); IExport *value() const { return value_; } void setValue(IExport *value); void update(); void localize(); private: IExport *value_; GroupProperty *details_; StringProperty *name_; StringProperty *forwarded_; StringProperty *address_; }; class ResourcePropertyManager : public PropertyManager { Q_OBJECT public: ResourcePropertyManager(QObject *parent = 0); IResource *value() const { return value_; } void setValue(IResource *value); void update(); void localize(); private slots: void excludedFromPackingChanged(bool value); private: IResource *value_; bool lock_; GroupProperty *options_; BoolProperty *excluded_from_packing_; GroupProperty *details_; StringProperty *name_; StringProperty *address_; StringProperty *size_; }; class LoadCommandPropertyManager : public PropertyManager { Q_OBJECT public: LoadCommandPropertyManager(QObject *parent = 0); ILoadCommand *value() const { return value_; } void setValue(ILoadCommand *value); void update(); void localize(); private: ILoadCommand *value_; GroupProperty *details_; StringProperty *name_; StringProperty *address_; StringProperty *size_; StringProperty *segment_; }; class CorePropertyManager : public PropertyManager { Q_OBJECT public: CorePropertyManager(QObject *parent = 0); Core *core() const { return core_; } void setCore(Core *core); void update(); virtual QVariant data(const QModelIndex &index, int role) const; void localize(); #ifndef LITE QModelIndex watermarkNameIndex() const { return propertyToIndex(watermarkName_); } #endif private slots: void memoryProtectionChanged(bool value); void importProtectionChanged(bool value); void resourceProtectionChanged(bool value); void packOutputFileChanged(bool value); void watermarkNameChanged(const QString &value); void hwidChanged(const QString &value); void outputFileChanged(const QString &value); void detectionDebuggerChanged(int value); void detectioncpVMToolsChanged(bool value); void vmSectionNameChanged(const QString &value); void stripDebugInfoChanged(bool value); void stripRelocationsChanged(bool value); void debugModeChanged(bool value); void messageDebuggerFoundChanged(const QString &value); void messageVMToolsFoundChanged(const QString &value); void messageFileCorruptedChanged(const QString &value); void messageSerialNumberRequiredChanged(const QString &value); void messageHWIDMismatchedChanged(const QString &value); void licenseDataFileNameChanged(const QString &value); void activationServerChanged(const QString &value); private: Core *core_; bool lock_; GroupProperty *file_; BoolProperty *memoryProtection_; BoolProperty *importProtection_; BoolProperty *resourceProtection_; BoolProperty *packOutputFile_; #ifndef LITE WatermarkProperty *watermarkName_; #endif #ifdef ULTIMATE StringProperty *hwid_; #endif FileNameProperty *outputFileName_; GroupProperty *detection_; EnumProperty *detectionDebugger_; BoolProperty *detectionVMTools_; #ifndef LITE GroupProperty *messages_; StringListProperty *messageDebuggerFound_; StringListProperty *messageVMToolsFound_; StringListProperty *messageFileCorrupted_; StringListProperty *messageSerialNumberRequired_; StringListProperty *messageHWIDMismatched_; #endif GroupProperty *additional_; StringProperty *vmSectionName_; BoolProperty *stripDebugInfo_; BoolProperty *stripRelocations_; #ifdef ULTIMATE GroupProperty *licensingParameters_; FileNameProperty *licenseDataFileName_; StringProperty *keyPairAlgorithm_; StringProperty *activationServer_; #endif }; class WatermarkPropertyManager : public PropertyManager { Q_OBJECT public: WatermarkPropertyManager(QObject *parent = 0); void setWatermark(Watermark *watermark); Watermark *value() const { return watermark_; } void update(); private slots: void nameChanged(const QString &value); void blockedChanged(bool value); private: bool lock_; StringProperty *name_; BoolProperty *blocked_; StringProperty *useCount_; Watermark *watermark_; }; class AddressCalculator : public PropertyManager { Q_OBJECT public: AddressCalculator(QObject *parent = 0); void setValue(IArchitecture *file); void localize(); private slots: void addressChanged(const QString &value); void offsetChanged(const QString &value); void segmentChanged(int value); private: IArchitecture *file_; bool lock_; StringProperty *address_; StringProperty *offset_; EnumProperty *segment_; }; #endif