From: Andrey Paskal Date: Fri, 19 Dec 2008 12:37:54 +0000 (+0300) Subject: First import X-Git-Url: https://gitweb.ananas.su/?a=commitdiff_plain;h=264eaf99139025ee306917d2d69fe1fcfdd4e223;p=projects%2Fananas-labs-qt4.git First import --- 264eaf99139025ee306917d2d69fe1fcfdd4e223 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3376b79 --- /dev/null +++ b/Makefile @@ -0,0 +1,66 @@ +NAME = ananas4 +VERSION = $(shell cat VERSION) +NAMEV = $(NAME)-$(VERSION) +MAKE = make +QMAKE = qmake +MAKEFILE = Makefile +LIBDIR = $(INSTALL_ROOT)/usr/lib +BINDIR = $(INSTALL_ROOT)/usr/bin +DOCDIR = $(INSTALL_ROOT)/usr/share/doc/$(NAMEV) +INCLUDEDIR = $(INSTALL_ROOT)/usr/include/ananas + +log = ~/.ananas/tests.log +#BINDIR = /usr/bin +#MANDIR = /usr/man/man8 +#VARDIR = /usr/share/$(NAME) +TAR = $(HOME)/tmp/$(NAMEV) +TARGET = i586 + + +first: all + +all: Makefile + cd src && $(QMAKE) && $(MAKE) +clean: + rm -fr rpm + rm -f $(NAME).spec + rm -fr *~ + rm -f translations/*.qm + cd src && $(QMAKE) && $(MAKE) clean + +tr: + lrelease translations/*.ts + +install: + find src doc -name Makefile -delete + $(QMAKE) src/src.pro -o src/$(MAKEFILE) + cd src && $(MAKE) install LIBDIR=$(LIBDIR) BINDIR=$(BINDIR) INCLUDEDIR=$(INCLUDEDIR) && cd ../doc && $(QMAKE) doc.pro -o $(MAKEFILE) && $(MAKE) install DOCDIR=$(DOCDIR) + +uninstall: + cd src && $(MAKE) uninstall + +tgz: dummy + mkdir -p rpm + mkdir -p $(TAR) + cp -r -f * $(TAR) +# cd $(TAR) && make clean +# cd $(TAR) && find src doc -name Makefile -delete + cd $(HOME)/tmp && tar cf - "$(NAMEV)/" | bzip2 -f9 > "$(HOME)/RPM/SOURCES/$(NAMEV).tar.bz2" + rm -f -r $(TAR) +srpm: tgz + if [ -e /etc/altlinux-release ] ; then\ + iconv -f UTF-8 -t KOI8-R $(NAME).spec.in |\ + sed s/ru_RU.UTF8/ru_RU.KOI8-R/>$(NAME).spec;\ + else \ + cp $(NAME).spec.in $(NAME).spec; \ + fi + rpmbuild --target=$(TARGET) -bs $(NAME).spec + mv -f $(HOME)/RPM/SRPMS/$(NAME)* rpm +rpm: srpm + rpmbuild --target=$(TARGET) -bb $(NAME).spec + mv -f $(HOME)/RPM/RPMS/$(TARGET)/$(NAME)* rpm + +tests: all + ./tests.begin -log=$(log) + +dummy: diff --git a/README b/README new file mode 100644 index 0000000..1a13849 --- /dev/null +++ b/README @@ -0,0 +1,122 @@ +_Об Ананасе_ + +Ананас - программная платформа автоматизации учета для Linux и Windows. +Ананас является программным обеспечением автоматизации учета, +предназначенным для использования на небольших и средних +предприятиях. Ананас позволяет автоматизировать основные +учетные операции. Ананас умеет работать на операционных +системамах Windows и GNU/Linux. + +Программное обеспечение распространяется на условиях +открытой лицензии, позволяющих копировать Ананас бесплатно +и также бесплатно использовать его для ведения +автоматизированного учета на любом количестве рабочих мест. + +Получить исходники Ананаса можно с сайта http://ananas.lrn.ru +Там же можно скачать rpm для Alt Linux или Fedora Core. + +Ниже описывается процесс сборки из исходных кодов. +Чтобы все собралось, необходимо наличие в системе Qt и QSA (Qt Script for Applications) + +_Компиляция_ + +Сборка стандартная +Распаковываем архив в каталоге /usr/src или в другом каталоге, сделав после +распаковки симлинк в /usr/src, +и переходим в каталог проекта +cd /usr/src/ananas-engine-qt + +Запускаем +make +и, если собралось без ошибок, +make install + +После успешного выполнения компиляции в некоторых подкаталогах появятся +исполняемые файлы готовые к запуску. +Первым делом необходимо запустить Анана.Дизайнер... +смотри раздел _Использование_ ниже + +_Использование_ + +И так сказу после успешной компиляции запускаем Ананас.Дизайнер +cd /usr/src/ananas-engine/src/designer +./ananas-designer + + +В нем нужно выбрать конфигурацию (в диалоге выбора конфигурации +есть возможность задать параметры доступа к серверу баз данных) +и создать базу данных на сервере, воспользовавшись пунктом меню +"Бизнес схема" -> "Сохранить". +Иногда этот процесс занимает довольно продолжительное время, +поэтому лучше не нажимать кнопочку "Сохранить" несколько раз подряд. + +Теперь ваш Ананас готов к работе. +Сначала, стоит еще немного времени уделить Ананас.Дизайнеру +В нем есть много интересного ;) +Чтобы увидеть дерево бизнес схемы, воспользуйтесь меню +"Бизнес схема" -> "Открыть" +Откроется окно с объектами бизнес схемы, организованными в виде дерева. + +Во-первых, вы можете менять бизнес схему по своему усмотрению. +Добавлять/удалять документы, поля документов, табличные части документов. +Работать с другими объектами. +После изменения бизнес схемы ее можно сохранить, а также обновить структуру +базы данных тем же способом, которым мы ее создали выше. + +Двойной щелчек по корню дерева откроет доступ к параметрам бизнес схемы и... +- Внимание!- редактору глобального модуля Ananas.Script - месту, где определяются +общедоступные функции на встроенном в Ананас интерпретируемом языке +программирования. +Сдесь можно увидеть определение функций +on_systemstart() +on_systemstop() +Это зарезервированные названия функций, через которые осуществляется +обработка события запуска Ананаса и события выхода из Ананаса соответственно. + +Уже сейчас есть возможность создавать/настраивать экранные формы (диалоги) +документов, и определять обработку событий нажатия на кнопки диалога. +Для того, чтобы форма работала, нужно определить обработчики событий. +Что осуществляется на закладке "Модуль" редактора свойств диалога. + +Вдоволь набаловавшись с Ананас.Дизайнером, можно пойти и проверить, как работает +то, что мы "наконфигурировали" :) +Для этого нужно запустить сам Ананас +cd /usr/src/ananas-engine/src/engine +./ananas-engine +И выбрать именно ту бизнес схему, с которой мы работали +в Ананас.Дизайнере + +Во время запуска Ананаса отработает код функции +on_systemstart(), упомянутой выше. +Вот пожалуй и все, что хотелось сказать об использовании. + + +_Использование с PostgreSQL_ + +Для работы системы с сервером postgres необходимо: + +1. Перед началом работы надо установить сервер postgres из вашего +дистрибутива. Желательна версия больше 7.3 + +2. Настроить сервер БД для работы с TCP/IP соединением. Для этого из под +пользователя root в файле postgresql.conf вашей системы (например, для +ALT Linux Master 2.2 он находтится в каталоге /var/lib/pgsql/data) нужно +прописать строку: + +tcpip_socket=true + +или найти и раскоментировать соответствующий параметр. Порт 5432 +используется postgres по умолчанию, но при необходимости его можно +изменить, добавив или изменив параметр: + +port=5432 + +Затем следует перезапустить сервер БД командой: + +service postgresql restart + + + + + + diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..b0bb878 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.9.5 diff --git a/applications/ananas-cfg.dtd b/applications/ananas-cfg.dtd new file mode 100644 index 0000000..a53fb76 --- /dev/null +++ b/applications/ananas-cfg.dtd @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/applications/money/money.cfg b/applications/money/money.cfg new file mode 100644 index 0000000..f6ef05c --- /dev/null +++ b/applications/money/money.cfg @@ -0,0 +1,170 @@ + + + + + Ananas-money + 130 + Valery Grazdankin + 2007-01-11 + + + + + + + + + Платежи + + + + + + + + + +function on_systemstart() +{ + debug("system started"); + d = MetaData.documents(); +// i = MetaData.info; + System.println( d.name ); + System.println( MetaData.test() ); + debug( MetaData.test() ); +// System.println( MetaData.info.name ); + +} + + + + + + + + 0 + + + + + + + + + + + + 0 + + + +
+ + + 0 + <ui version="4.0" > + <class>Catalogue</class> + <widget class="wCatalogue" name="Catalogue" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>500</width> + <height>381</height> + </rect> + </property> + <property name="Id" > + <number>0</number> + </property> + <property name="Name" stdset="0" > + <string/> + </property> + <property name="caption" stdset="0" > + <string>Статьи расходов</string> + </property> + <widget class="QPushButton" name="pushButton" > + <property name="geometry" > + <rect> + <x>20</x> + <y>330</y> + <width>83</width> + <height>28</height> + </rect> + </property> + <property name="text" > + <string>OK</string> + </property> + </widget> + <widget class="QPushButton" name="pushButton_2" > + <property name="geometry" > + <rect> + <x>20</x> + <y>290</y> + <width>83</width> + <height>28</height> + </rect> + </property> + <property name="text" > + <string>Жми</string> + </property> + </widget> + <widget class="QRadioButton" name="radioButton" > + <property name="geometry" > + <rect> + <x>20</x> + <y>250</y> + <width>101</width> + <height>24</height> + </rect> + </property> + <property name="text" > + <string>RadioButton</string> + </property> + </widget> + </widget> + <layoutdefault spacing="5" margin="5" /> + <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <customwidgets> + <customwidget> + <class>wCatalogue</class> + <extends>QWidget</extends> + <header>wcatalogue.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <includes> + <include location="local" >wcatalogue.h</include> + </includes> + <resources/> + <connections/> +</ui> + + +
+ + +
+
+ + + + + + + +
+ + + + + + 2 + 102 + 0 + + + + + + +
diff --git a/applications/money/money.rc b/applications/money/money.rc new file mode 100644 index 0000000..6906350 --- /dev/null +++ b/applications/money/money.rc @@ -0,0 +1,9 @@ +dbpass=111111 +workdir=/usr/share/ananas4/applications/money/ +dbhost=localhost +dbtitle=Ananas-money +dbtype=mysql +dbuser=root +dbname=ananas_money +configfile=/usr/share/ananas4/applications/money/money.cfg +dbport=0 diff --git a/build/altlinux/altlinux.spec b/build/altlinux/altlinux.spec new file mode 100644 index 0000000..989610c --- /dev/null +++ b/build/altlinux/altlinux.spec @@ -0,0 +1,407 @@ +# ananas project +# Spec file for building rpm and rpms under ALT Linux and Fedora +# $Id: altlinux.spec,v 1.1 2008/11/27 20:20:54 leader Exp $ +# $Name: $ +# + +%define ShortName ananas +%define _qtdir %(echo $QTDIR) +#%define OSDISTR %(OSVENDOR=REDHAT; echo $OSVENDOR) +%define OSDISTR %(if [ -e /etc/altlinux-release ] ; then OSVENDOR=ALT; fi ; echo $OSVENDOR ) + +Name: ananas +Version: 0.9.5 +Release: %(if [ -e /etc/altlinux-release ] ; then echo "alt2"; else echo f`grep -o "[0-9|\.]\+" /etc/redhat-release` ; fi) +Buildroot: %{_tmppath}/%{name}-%{version}-root + +Summary: Runtime and development environment of Finance Applications +Summary(ru_RU.KOI8-R): Среда разработки и исполнения прикладных решений автоматизации оперативного, бухгалтерского и других видов учета. + +License: GPL +Url: http://ananas.lrn.ru/ +Vendor: Project Ananas + +Group(ru): %(if [ -e /etc/altlinux-release ] ; then echo "Офис"; else echo "Приложения/Повышение уровня производительности"; fi) +Group: %(if [ -e /etc/altlinux-release ] ; then echo "Office"; else echo "Applications/Productivity"; fi) + +Source: %name-%version.tar.bz2 + + +#Requires: %(if [ -e /etc/altlinux-release ] ; then echo "MySQL-server >= 4.1 "; else echo "mysql-server >= 4.1 "; fi) +Requires: %(if [ -e /etc/altlinux-release ] ; then echo "MySQL-client"; else echo "mysql"; fi) +#Requires: %(if [ -e /etc/altlinux-release ] ; then echo "MySQL-client >= 4.1 "; else echo "mysql >= 4.1 "; fi) +Requires: %(if [ -e /etc/altlinux-release ] ; then echo "libpq3"; else echo "postgresql"; fi) +Requires: %(if [ -e /etc/altlinux-release ] ; then echo "libqt3 >= 3.2"; else echo "qt >= 3.2.0"; fi) +Requires: %(if [ -e /etc/altlinux-release ] ; then echo "libqt3-qsa >= 3.2"; else echo "qt-qsa >= 1.1"; fi) +#Requires: %(if [ -e /etc/altlinux-release ] ; then echo "qt3-designer >= 3.2"; else echo "qt-designer >= 3.2" ;fi) +#Requires: tradeequip +Requires: libqt3-qdataschema + +BuildRequires: gcc-c++ libstdc++-devel +#BuildRequires: tradeequip-devel +#tradeequip + +#BuildRequires: %(if [ -e /etc/altlinux-release ] ; then echo "libMySQL-devel >= 4.1"; else echo "mysql-devel >= 4.1"; fi) +BuildRequires: %(if [ -e /etc/altlinux-release ] ; then echo "libMySQL-devel"; else echo "mysql-devel"; fi) +BuildRequires: %(if [ -e /etc/altlinux-release ] ; then echo "libqt3-devel"; else echo "qt-devel"; fi) +BuildRequires: %(if [ -e /etc/altlinux-release ] ; then echo "libqt3-qsa-devel"; else echo "qt-qsa-devel"; fi) +#BuildRequires: %(if [ -e /etc/altlinux-release ] ; then echo "libqt3-mysql"; else echo "qt-MySQL"; fi) +#BuildRequires: %(if [ -e /etc/altlinux-release ] ; then echo "libqt3-postgresql"; else echo "qt-PostgreSQL"; fi) +#BuildRequires: %(if [ -e /etc/altlinux-release ] ; then echo "libqt3-sqlite"; else echo "sqlite-devel"; fi) +BuildRequires: libqt3-qdataschema-devel + + +%description -l ru_RU.KOI8-R +Платформа Ананас предназначена для автомматизации малых и средних предприятий. +Обеспечивает автоматизацию ведения оперативного и бухгалтерского учета. +Платформа позволяет создавать приложения, поддерживающие многопользовательский +режим работы, сопровождается документацией на русском языке +имеет русифицированный графический интерфейс пользователя. Для ее +использования необходимо иметь установленную систему X Window System, +графическую среду KDE и сервер баз данных с поддержкой транзакций MySQL. +Пакет ananas необходимо установить, если вы собираетесь использовать +прикладное решение на платформе Ананас. + +Разработчики +--------------- +Валерий Гражданкин +Андрей Паскаль +Андрей Стрельников +Павел Миколайчук +Александр Ковалёв +Григорий Панов + +%description +Ananas is an Accounting Application Framework for Small Businesses. + +Developers +--------------- +Valery Grazhdankin +Andrey Paskal +Andrey Strelnikov +Pavel Mikolaychuk +Alexander Kovalyov +Grigory Panov + + +%package -n ananas-devel +Summary(ru_RU.KOI8-R): Статические библиотеки и файлы определений на языке Cи. +Summary: Ananas development library. Static libs and C header files. +Group(ru_RU.KOI8-R): Разработка/Библиотеки +Group: Development/Other + +%description -l ru_RU.KOI8-R -n ananas-devel +Статические библиотеки и файлы определений на языке C++. +ananas-devel необходимо установить, если вы планируете использовать библиотеки +Ананаса в своей C/C++ программе. Если вы планируете использовать прикладное +решение на платформе Ананас, то пакет не нужно устанавливать. + +Разработчики +--------------- +Валерий Гражданкин +Андрей Паскаль +Андрей Стрельников +Павел Миколайчук +Александр Ковалёв +Григорий Панов + +%description -n ananas-devel +Ananas development library. Static libs and C header files. + +Developers +--------------- +Valery Grazhdankin +Andrey Paskal +Andrey Strelnikov +Pavel Mikolaychuk +Alexander Kovalyov +Grigory Panov + +%package -n ananas-inventory +Summary(ru_RU.KOI8-R): Прикладная настройка для ведения простого складского учета. +Summary: Scripts, Documents and Reports templates of Inventory system. +Group: Office +Group(ru_RU.KOI8-R): Приложения/Учет и Финансы + +Requires: ananas >= %version +Requires: zip +Requires: unzip + +%description -l ru_RU.KOI8-R -n ananas-inventory +Прикладная настройка для ведения простого складского учета. + +Разработчики +--------------- +Валерий Гражданкин +Андрей Паскаль +Андрей Стрельников +Павел Миколайчук +Александр Ковалёв +Григорий Панов + +%description -n ananas-inventory +Scripts, Documents and Reports templates of Inventory Accounting system. + +Developers +--------------- +Valery Grazhdankin +Andrey Paskal +Andrey Strelnikov +Pavel Mikolaychuk +Alexander Kovalyov +Grigory Panov + +%package -n ananas-extensions +Summary(ru_RU.KOI8-R): Набор плагинов для Ананаса. +Summary: Ananas plugins collection. +Group: Office +Group(ru_RU.KOI8-R): Приложения/Учет и Финансы + +Requires: ananas >= %version + +%description -l ru_RU.KOI8-R -n ananas-extensions +Набор плагинов для Ананаса. + +Разработчики +--------------- +Валерий Гражданкин +Андрей Паскаль +Андрей Стрельников +Павел Миколайчук +Александр Ковалёв +Григорий Панов + +%description -n ananas-extensions +Ananas plugins collection. + +Developers +--------------- +Valery Grazhdankin +Andrey Paskal +Andrey Strelnikov +Pavel Mikolaychuk +Alexander Kovalyov +Grigory Panov + + +%prep +%setup + +%build +#export QTDIR=/usr/lib/qt3 +export PATH=${PATH}:$QTDIR/bin +./configure +make +make tr + +%install +export PATH=${PATH}:$QTDIR/bin + +if [ -e /etc/altlinux-release ] ; then + +# пока libMySQL >=4.1 нет в Sisyphus, чтобы не пересобирать MySQL-devel :-( +%set_verify_elf_method textrel=relaxed + + make install INSTALL_ROOT="$RPM_BUILD_ROOT" LIBDIR=%_libdir BINDIR=%_bindir DOCDIR=%_docdir/%name-%version INCLUDEDIR=%_includedir/ananas + %__mkdir_p %buildroot%_sysconfdir/ananas + %__mkdir_p %buildroot%_datadir/ananas/translations + %__mkdir_p %buildroot%_datadir/ananas/templates + %__mkdir_p %buildroot%_datadir/ananas/inventory + %__mkdir_p %buildroot%_datadir/pixmaps + %__mkdir_p %buildroot%_menudir + %__mkdir_p %buildroot%_datadir/applications/kde + +else + + rm -f `find src doc -name Makefile` + qmake src/src.pro -o src/Makefile + cd src && make install INSTALL_ROOT="$RPM_BUILD_ROOT" LIBDIR=%_libdir BINDIR=%_bindir INCLUDEDIR=%_includedir/ananas && cd ../doc && qmake doc.pro -o Makefile && make install INSTALL_ROOT="$RPM_BUILD_ROOT" DOCDIR=%_docdir/%name-%version + + mkdir -p %buildroot%_sysconfdir/ananas + mkdir -p %buildroot%_datadir/ananas/translations + mkdir -p %buildroot%_datadir/ananas/templates + mkdir -p %buildroot%_datadir/ananas/inventory + mkdir -p %buildroot%_datadir/applications/kde + mkdir -p %buildroot%_datadir/pixmaps + mkdir -p %buildroot/usr/lib/menu +fi + +#clear debug info +strip %buildroot%_bindir/ananas +strip %buildroot%_bindir/ananas-designer +strip %buildroot%_libdir/libananas.so* +strip %buildroot%_libdir/ananas/qt3plugins/designer/libananasplugin.so +strip %buildroot%_libdir/ananas/qt3plugins/sqldrivers/libqsqlmysqlu.so +strip %buildroot%_libdir/ananas/*.so + +cp -f %_builddir/%name-%version/translations/*.qm %buildroot%_datadir/ananas/translations +cp -f %_builddir/%name-%version/src/designer/templates/*.* %buildroot%_datadir/ananas/templates + +cp -f %_builddir/%name-%version/applications/inventory/inventory.cfg %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory.rc %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.cfg %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.rc %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory_pgsql.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory_grouprc %buildroot%_sysconfdir/ananas +cp -f %_builddir/%name-%version/applications/inventory/templ_*.odt %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/templ_*.ods %buildroot%_datadir/ananas/inventory + + +cp -f %_builddir/%name-%version/build/kde/images/*.png %buildroot%_datadir/pixmaps/ + +#if [ -e /etc/altlinux-release ] ; then + + cp -f %_builddir/%name-%version/build/kde/ananas %buildroot/usr/lib/menu + cp -f %_builddir/%name-%version/build/kde/ananas-designer %buildroot/usr/lib/menu + +#else + + cp -f %_builddir/%name-%version/build/kde/ananas.desktop %buildroot%_datadir/applications/kde + cp -f %_builddir/%name-%version/build/kde/ananas-designer.desktop %buildroot%_datadir/applications/kde +#fi + +%post +ln -fs %_libdir/ananas/qt3plugins/designer/libananasplugin.so %_libdir/libananasplugin.so + +#starts mysql server +[ -e /etc/init.d/mysqld ] && /etc/init.d/mysqld status|grep -v pid > /dev/null && /etc/init.d/mysqld start > /dev/null || : +#creates system base for mysql +mysqlshow -u root| grep ananas_system > /dev/null || mysqladmin -u root create ananas_system || : +#touch %buildroot%_sysconfdir/ananas/groupsrc + +if [ -e /etc/altlinux-release ] ; then + rm -f %_datadir/applications/kde/ananas.desktop + rm -f %_datadir/applications/kde/ananas-designer.desktop + %update_menus +else + rm -f /usr/lib/menu/ananas + rm -f /usr/lib/menu/ananas-designer +fi + + +%post -n ananas-inventory +#cat %_datadir/ananas/inventory/groupsrc >> %_sysconfdir/ananas/groupsrc +#starts mysql server +[ -e /etc/init.d/mysqld ] && /etc/init.d/mysqld status|grep -v pid > /dev/null && /etc/init.d/mysqld start > /dev/null || : +#creates databases +mysql -u root -e "create database ananas_inventory character set utf8" > /dev/null 2>&1 && mysql -u root ananas_inventory < %_datadir/ananas/inventory/inventory.sql || : +mysql -u root -e "create database ananas_inventory_demo character set utf8" > /dev/null 2>&1 && mysql -u root ananas_inventory_demo < %_datadir/ananas/inventory/inventory-demo.sql || : + +%postun + +if [ -e /etc/altlinux-release ] ; then +%clean_menus +fi +rm -f %_datadir/ananas/translations/*.qm +rm -f %_datadir/ananas/templates/*.* + +rmdir --ignore-fail-on-non-empty %_datadir/ananas/translations +rmdir --ignore-fail-on-non-empty %_datadir/ananas/templates +rmdir --ignore-fail-on-non-empty %_datadir/ananas + +%postun -n ananas-extensions +rmdir --ignore-fail-on-non-empty %_libdir/ananas +rmdir --ignore-fail-on-non-empty %_datadir/ananas + + +%postun -n ananas-inventory +rm -f %_sysconfdir/ananas/inventory.* +rm -f %_sysconfdir/ananas/inventory-demo.* +rm -f %_sysconfdir/ananas/inventory_grouprc +rmdir --ignore-fail-on-non-empty %_sysconfdir/ananas +rm -f %_datadir/ananas/inventory/templ_*.odt +rm -f %_datadir/ananas/inventory/templ_*.ods +rmdir --ignore-fail-on-non-empty %_datadir/ananas/inventory +rmdir --ignore-fail-on-non-empty %_datadir/ananas + + +%clean + +%files +%_bindir/ananas +%_bindir/ananas-designer +%_libdir/libananas.so* +%_libdir/ananas/qt3plugins/designer/libananasplugin.so +%_libdir/ananas/qt3plugins/sqldrivers/libqsqlmysqlu.so +%_docdir/%name-%version/ananas-*.sxw +%_datadir/ananas/translations/*.qm +%_datadir/ananas/templates/*.* +%_datadir/pixmaps/*.png +# files menu for ALT +/usr/lib/menu/ananas +/usr/lib/menu/ananas-designer +# files desktop for Fedora +%_datadir/applications/kde/ananas.desktop +%_datadir/applications/kde/ananas-designer.desktop + + +%files -n ananas-devel +%_includedir/ananas/*.h +%_docdir/%name-%version/*.tex + +%files -n ananas-inventory +%_sysconfdir/ananas/inventory.* +%_sysconfdir/ananas/inventory-demo.* + +%_datadir/ananas/inventory/inventory.sql +%_datadir/ananas/inventory/inventory-demo.sql +%_datadir/ananas/inventory/inventory_pgsql.sql + +%_datadir/ananas/inventory/templ_*.odt +%_datadir/ananas/inventory/templ_*.ods +%_sysconfdir/ananas/inventory_grouprc + +%files -n ananas-extensions +%_libdir/ananas/*.so + +%changelog +* Sun Dec 30 2007 Andrey Paskal 0.9.5 + + Please look at ChangeLog file of Ananas Project + +* Fri Sep 08 2006 Andrey Paskal + + Meta extention has been added + +* Sun Jul 02 2006 Valery Grazdankin 0.9.3-alt2 + + Trade equipment extension added + +* Tue Jun 20 2006 Grigory Panov 0.9.3-alt1 + + Added extensions + +* Mon Mar 27 2006 Valery Grazdankin 0.9.3-alt1 + - Automatic generated cvs build + +* Tue Feb 21 2006 Valery Grazdankin 0.9.2-alt1 + + Add ananas extensions plugin system. + +* Thu Jan 05 2006 Grigory Panov 0.9.1-alt1 + + Merge with st05 branch + +* Wed Jun 06 2005 Valery Grazdankin 0.4.2-alt1 + + Files list was changed in the inventory package + +* Fri May 06 2005 Valery Grazdankin 0.4.2-alt1 + + Added support some configuration files + +* Thu May 05 2005 Andrey Paskal 0.4.2-alt1 + + rpm build procedure was changed. After install ananas-inventory.*rpm + we can immediately to work with "Deport accouning" configuration , + by running ananas-engine. + + Debugged (by gr) report procession in OpenOffice format under Linux. + +* Sat Mar 19 2005 Grigory Panov 0.4.2-alt1 + + Added template in OpenOffice format for ananas-inventory + + Added section for remove files and directories after deinstallation + + Added ananas-engine-qt requires to ananas-inventory package + +* Tue Mar 15 2005 Valery Grazdankin 0.4.2-alt1 + + File name ananasrc changed to groupsrc + + groupsrc have Unix file format now + +* Sun Nov 21 2004 Valery Grazdankin 0.4.2-alt1 + + Correct installation procedure + +* Fri Nov 05 2004 Valery Grazdankin 0.4.2-alt1 + + Added spec file for build ALT Linux packages. + + win32 version build completed. Ananas - is multitarget application now diff --git a/build/fedora/fedora.spec b/build/fedora/fedora.spec new file mode 100644 index 0000000..00ccf30 --- /dev/null +++ b/build/fedora/fedora.spec @@ -0,0 +1,231 @@ +# ananas project +# Spec file for building single rpm package of Ananas for Fedora Linux +# $Id: fedora.spec,v 1.1 2008/11/27 20:20:54 leader Exp $ +# $Name: $ +# + +%define ShortName ananas +%define _qtdir %(echo $QTDIR) + +Name: ananas +Version: 0.9.5 +Release: %( echo f`grep -o "[0-9|\.]\+" /etc/redhat-release`) +Buildroot: %{_tmppath}/%{name}-%{version}-root + +Summary: Runtime and development environment of Finance Applications. +Summary(ru_RU.UTF8): Среда разработки и исполнения прикладных решений автоматизации оперативного, бухгалтерского и других видов учета. + +License: GPL +Url: http://ananas.lrn.ru/ +Vendor: Project Ananas +Group: Applications/Productivity + +Source: %name-%version.tar.bz2 + +Requires: mysql-server >= 4.1 +Requires: mysql >= 4.1 +Requires: qt >= 3.2.0 +Requires: qt-qsa >= 1.1 +Requires: bluecurve.so +Requires: zip +Requires: unzip + + +BuildRequires: gcc-c++ libstdc++-devel +BuildRequires: mysql-devel +BuildRequires: qt-devel +BuildRequires: qt-qsa-devel + + +%description -l ru_RU.UTF8 +Платформа Ананас предназначена для автомматизации малых и средних предприятий. +Обеспечивает автоматизацию ведения оперативного и бухгалтерского учета. +Платформа позволяет создавать приложения, поддерживающие многопользовательский +режим работы, сопровождается документацией на русском языке +имеет русифицированный графический интерфейс пользователя. Для ее +использования необходимо иметь установленную систему X Window System, +графическую среду KDE и сервер баз данных с поддержкой транзакций MySQL. +Пакет ananas необходимо установить, если вы собираетесь использовать +прикладное решение на платформе Ананас. + +Разработчики +--------------- +Валерий Гражданкин +Андрей Паскаль +Андрей Стрельников +Павел Миколайчук +Александр Ковалёв +Григорий Панов + +%description +Ananas is an Accounting Application Framework for Small Businesses. + +Developers +--------------- +Valery Grazhdankin +Andrey Paskal +Andrey Strelnikov +Pavel Mikolaychuk +Alexander Kovalyov +Grigory Panov + + +%prep +%setup + +%build +export PATH=${PATH}:$QTDIR/bin +./configure +make +make tr + +%install +export PATH=${PATH}:$QTDIR/bin + + +rm -f `find src doc -name Makefile` +qmake src/src.pro -o src/Makefile +cd src && make install \ + INSTALL_ROOT="$RPM_BUILD_ROOT" \ + LIBDIR=%_libdir BINDIR=%_bindir \ + INCLUDEDIR=%_includedir/ananas && \ + cd ../doc && qmake doc.pro -o Makefile && make install INSTALL_ROOT="$RPM_BUILD_ROOT" DOCDIR=%_docdir/%name-%version + +mkdir -p %buildroot%_sysconfdir/ananas +mkdir -p %buildroot%_datadir/ananas/translations +mkdir -p %buildroot%_datadir/ananas/templates +mkdir -p %buildroot%_datadir/ananas/inventory +mkdir -p %buildroot%_datadir/applications/kde +mkdir -p %buildroot%_datadir/pixmaps +mkdir -p %buildroot/usr/lib/menu + +#clear debug info +strip %buildroot%_bindir/ananas +strip %buildroot%_bindir/ananas-designer +strip %buildroot%_libdir/libananas.so* +strip %buildroot%_libdir/ananas/qt3plugins/designer/libananasplugin.so +strip %buildroot%_libdir/ananas/qt3plugins/sqldrivers/libqsqlmysqlu.so +strip %buildroot%_libdir/ananas/*.so + +mv %buildroot%_libdir/ananas/qt3plugins/designer/libananasplugin.so %buildroot%_libdir/ +ln -fs ../../../libananasplugin.so %buildroot%_libdir/ananas/qt3plugins/designer/libananasplugin.so + +cp -f %_builddir/%name-%version/translations/*.qm %buildroot%_datadir/ananas/translations +cp -f %_builddir/%name-%version/src/designer/templates/*.* %buildroot%_datadir/ananas/templates + +cp -f %_builddir/%name-%version/applications/inventory/inventory.cfg %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory.rc %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.cfg %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.rc %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory_pgsql.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory_grouprc %buildroot%_sysconfdir/ananas +cp -f %_builddir/%name-%version/applications/inventory/templ_*.odt %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/templ_*.ods %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/build/kde/images/*.png %buildroot%_datadir/pixmaps/ +cp -f %_builddir/%name-%version/build/kde/ananas.desktop %buildroot%_datadir/applications/kde +cp -f %_builddir/%name-%version/build/kde/ananas-designer.desktop %buildroot%_datadir/applications/kde +cp -f %_builddir/%name-%version/build/fedora/qtrc %buildroot%_datadir/ananas/ + +%post + +# Fedora 8 does not provides %_libdir/qt-3.3/etc/settings/qtrc +# So we install them manualy +if ! [ -e %_libdir/qt-3.3/etc/settings/qtrc ]; then + if ! [ -e %_libdir/qt-3.3/etc/settings ] ;then + mkdir -p %_libdir/qt-3.3/etc/settings + fi + cp %_datadir/ananas/qtrc %_libdir/qt-3.3/etc/settings/ +fi + +#starts mysql server +[ -e /etc/init.d/mysqld ] && /etc/init.d/mysqld status|grep -v pid > /dev/null && /etc/init.d/mysqld start > /dev/null || : +#creates system base for mysql +mysqlshow -u root| grep ananas_system > /dev/null || mysqladmin -u root create ananas_system || : +#touch %buildroot%_sysconfdir/ananas/groupsrc + +rm -f /usr/lib/menu/ananas +rm -f /usr/lib/menu/ananas-designer + + +##%post -n ananas-inventory +#starts mysql server +[ -e /etc/init.d/mysqld ] && /etc/init.d/mysqld status|grep -v pid > /dev/null && /etc/init.d/mysqld start > /dev/null || : +#creates databases +mysql -u root -e "create database ananas_inventory character set utf8" > /dev/null 2>&1 && mysql -u root ananas_inventory < %_datadir/ananas/inventory/inventory.sql || : +mysql -u root -e "create database ananas_inventory_demo character set utf8" > /dev/null 2>&1 && mysql -u root ananas_inventory_demo < %_datadir/ananas/inventory/inventory-demo.sql || : + +%postun +# Если %_libdir/qt-3.3/etc/settings/qtrc не принадлежит ни одному пакету, +# значит это мы его поставили и должны удалить при деинсталляции. +rpm -qf %_libdir/qt-3.3/etc/settings/qtrc > /dev/null 2>&1 || rm -f %_libdir/qt-3.3/etc/settings/qtrc \ +&& rmdir %_libdir/qt-3.3/etc/settings 2>/dev/null && rmdir --ignore-fail-on-non-empty %_libdir/qt-3.3/etc + +rm -f %_datadir/ananas/translations/*.qm +rm -f %_datadir/ananas/templates/*.* + +rmdir --ignore-fail-on-non-empty %_datadir/ananas/translations +rmdir --ignore-fail-on-non-empty %_datadir/ananas/templates +rmdir --ignore-fail-on-non-empty %_datadir/ananas + +##%postun -n ananas-extensions +rmdir --ignore-fail-on-non-empty %_libdir/ananas +rmdir --ignore-fail-on-non-empty %_datadir/ananas + + +##%postun -n ananas-inventory +rm -f %_sysconfdir/ananas/inventory.* +rm -f %_sysconfdir/ananas/inventory-demo.* +rm -f %_sysconfdir/ananas/inventory_grouprc +rmdir --ignore-fail-on-non-empty %_sysconfdir/ananas +rm -f %_datadir/ananas/inventory/templ_*.odt +rm -f %_datadir/ananas/inventory/templ_*.ods +rmdir --ignore-fail-on-non-empty %_datadir/ananas/inventory +rmdir --ignore-fail-on-non-empty %_datadir/ananas + + +%clean + +%files +%_bindir/ananas +%_bindir/ananas-designer +%_libdir/libananas.so* +%_libdir/libananasplugin.so +%_libdir/ananas/qt3plugins/designer/libananasplugin.so +%_libdir/ananas/qt3plugins/sqldrivers/libqsqlmysqlu.so +%_docdir/%name-%version/ananas-*.sxw +%_datadir/ananas/translations/*.qm +%_datadir/ananas/templates/*.* +%_datadir/pixmaps/*.png +# files menu for ALT +##/usr/lib/menu/ananas +##/usr/lib/menu/ananas-designer +# files desktop for Fedora +%_datadir/applications/kde/ananas.desktop +%_datadir/applications/kde/ananas-designer.desktop +%_datadir/ananas/qtrc + +##%files -n ananas-devel +%_includedir/ananas/*.h +%_docdir/%name-%version/*.tex + +##%files -n ananas-inventory +%_sysconfdir/ananas/inventory.* +%_sysconfdir/ananas/inventory-demo.* + +%_datadir/ananas/inventory/inventory.sql +%_datadir/ananas/inventory/inventory-demo.sql +%_datadir/ananas/inventory/inventory_pgsql.sql + +%_datadir/ananas/inventory/templ_*.odt +%_datadir/ananas/inventory/templ_*.ods +%_sysconfdir/ananas/inventory_grouprc + +##%files -n ananas-extensions +%_libdir/ananas/*.so + +%changelog +* Sun Dec 30 2007 Andrey Paskal 0.9.5 + + Please look at ChangeLog file of Ananas Project + diff --git a/build/icons/a-system.ico b/build/icons/a-system.ico new file mode 100644 index 0000000..f8fcdbd Binary files /dev/null and b/build/icons/a-system.ico differ diff --git a/build/icons/a-system.png b/build/icons/a-system.png new file mode 100644 index 0000000..6638dff Binary files /dev/null and b/build/icons/a-system.png differ diff --git a/build/icons/ananas-16x16.png b/build/icons/ananas-16x16.png new file mode 100644 index 0000000..80b93a5 Binary files /dev/null and b/build/icons/ananas-16x16.png differ diff --git a/build/icons/ananas-32x32.png b/build/icons/ananas-32x32.png new file mode 100644 index 0000000..2e79aae Binary files /dev/null and b/build/icons/ananas-32x32.png differ diff --git a/build/icons/ananas-designer.ico b/build/icons/ananas-designer.ico new file mode 100644 index 0000000..9e815ab Binary files /dev/null and b/build/icons/ananas-designer.ico differ diff --git a/build/icons/ananas-designer.png b/build/icons/ananas-designer.png new file mode 100644 index 0000000..1debdfa Binary files /dev/null and b/build/icons/ananas-designer.png differ diff --git a/build/icons/manual.ico b/build/icons/manual.ico new file mode 100644 index 0000000..8e91fe5 Binary files /dev/null and b/build/icons/manual.ico differ diff --git a/build/mandriva/mandriva.spec b/build/mandriva/mandriva.spec new file mode 100644 index 0000000..947b24e --- /dev/null +++ b/build/mandriva/mandriva.spec @@ -0,0 +1,219 @@ +# ananas project +# Spec file for building single rpm package of Ananas for Mandriva 2008 Linux +# $Id: ananas.spec.mandriva,v 1.0 2008/02/18 +# $Name: $ +# Created by Victor Abrosimov from Ananas spec file for Fedora Linux +# + +%define ShortName ananas +%define _qtdir %(echo $QTDIR) +%define rel 5 +%define release %mkrel %rel + +Name: ananas +Version: 0.9.5 +Release: %{release} +Buildroot: %{_tmppath}/%{name}-%{version}-root + +Summary: Runtime and development environment of Finance Applications. +Summary(ru_RU.UTF8): Среда разработки и исполнения прикладных решений автоматизации оперативного, бухгалтерского и других видов учета. + +License: GPL +Url: http://ananas.lrn.ru/ +Vendor: Project Ananas +Group: Applications/Productivity + +Source: %name-%version.tar.bz2 +Requires: MySQL-server >= 4.1 +Requires: MySQL-client >= 4.1 +#Requires: postgresql TODO: Для postrges нужен код создающий БД при установке или первом запуске Ананаса +Requires: libqt3 >= 3.2 +Requires: qsa >= 1.1 +Requires: zip +Requires: unzip + + +BuildRequires: gcc-c++ libstdc++-devel +BuildRequires: libmysql-devel +BuildRequires: libqt3-devel +BuildRequires: qsa-devel +BuildRequires: postgresql-devel +BuildRequires: libpq-devel +BuildRequires: postgresql8.2-devel + + +%description -l ru_RU.UTF8 +Платформа Ананас предназначена для автомматизации малых и средних предприятий. +Обеспечивает автоматизацию ведения оперативного и бухгалтерского учета. +Платформа позволяет создавать приложения, поддерживающие многопользовательский +режим работы, сопровождается документацией на русском языке +имеет русифицированный графический интерфейс пользователя. Для ее +использования необходимо иметь установленную систему X Window System, +графическую среду KDE и сервер баз данных с поддержкой транзакций MySQL. +Пакет ananas необходимо установить, если вы собираетесь использовать +прикладное решение на платформе Ананас. + +Разработчики +--------------- +Валерий Гражданкин +Андрей Паскаль +Андрей Стрельников +Павел Миколайчук +Александр Ковалёв +Григорий Панов + +%description +Ananas is an Accounting Application Framework for Small Businesses. + +Developers +--------------- +Valery Grazhdankin +Andrey Paskal +Andrey Strelnikov +Pavel Mikolaychuk +Alexander Kovalyov +Grigory Panov + + +%prep +%setup + +%build +export PATH=${PATH}:$QTDIR/bin +./configure +make +make tr + +%install +export PATH=${PATH}:$QTDIR/bin + + +rm -f `find src doc -name Makefile` +qmake src/src.pro -o src/Makefile +cd src && make install \ + INSTALL_ROOT="$RPM_BUILD_ROOT" \ + LIBDIR=%_libdir BINDIR=%_bindir \ + INCLUDEDIR=%_includedir/ananas && \ + cd ../doc && qmake doc.pro -o Makefile && make install INSTALL_ROOT="$RPM_BUILD_ROOT" DOCDIR=%_docdir/%name-%version + +mkdir -p %buildroot%_sysconfdir/ananas +mkdir -p %buildroot%_datadir/ananas/translations +mkdir -p %buildroot%_datadir/ananas/templates +mkdir -p %buildroot%_datadir/ananas/inventory +mkdir -p %buildroot%_datadir/applications/kde +mkdir -p %buildroot%_datadir/pixmaps +mkdir -p %buildroot/usr/lib/menu + +#clear debug info +strip %buildroot%_bindir/ananas +strip %buildroot%_bindir/ananas-designer +strip %buildroot%_libdir/libananas.so* +strip %buildroot%_libdir/ananas/qt3plugins/designer/libananasplugin.so +strip %buildroot%_libdir/ananas/qt3plugins/sqldrivers/libqsqlmysqlu.so +strip %buildroot%_libdir/ananas/*.so + +mv %buildroot%_libdir/ananas/qt3plugins/designer/libananasplugin.so %buildroot%_libdir/ +ln -fs ../../../libananasplugin.so %buildroot%_libdir/ananas/qt3plugins/designer/libananasplugin.so + +cp -f %_builddir/%name-%version/translations/*.qm %buildroot%_datadir/ananas/translations +cp -f %_builddir/%name-%version/src/designer/templates/*.* %buildroot%_datadir/ananas/templates + +cp -f %_builddir/%name-%version/applications/inventory/inventory.cfg %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory.rc %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.cfg %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.rc %buildroot%_sysconfdir/ananas/ +cp -f %_builddir/%name-%version/applications/inventory/inventory-demo.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory_pgsql.sql %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/inventory_grouprc %buildroot%_sysconfdir/ananas +cp -f %_builddir/%name-%version/applications/inventory/templ_*.odt %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/applications/inventory/templ_*.ods %buildroot%_datadir/ananas/inventory +cp -f %_builddir/%name-%version/build/kde/images/*.png %buildroot%_datadir/pixmaps/ +cp -f %_builddir/%name-%version/build/kde/ananas.desktop %buildroot%_datadir/applications/kde +cp -f %_builddir/%name-%version/build/kde/ananas-designer.desktop %buildroot%_datadir/applications/kde +cp -f %_builddir/%name-%version/build/fedora/qtrc %buildroot%_datadir/ananas/ + +%post + +#starts mysql server +[ -e /etc/init.d/mysqld ] && /etc/init.d/mysqld status|grep -v pid > /dev/null && /etc/init.d/mysqld start > /dev/null || : +#creates system base for mysql +mysqlshow -u root| grep ananas_system > /dev/null || mysqladmin -u root create ananas_system || : +#touch %buildroot%_sysconfdir/ananas/groupsrc + +rm -f /usr/lib/menu/ananas +rm -f /usr/lib/menu/ananas-designer + + +#starts mysql server +[ -e /etc/init.d/mysqld ] && /etc/init.d/mysqld status|grep -v pid > /dev/null && /etc/init.d/mysqld start > /dev/null || : +#creates databases +mysql -u root -e "create database ananas_inventory character set utf8" > /dev/null 2>&1 && mysql -u root ananas_inventory < %_datadir/ananas/inventory/inventory.sql || : +mysql -u root -e "create database ananas_inventory_demo character set utf8" > /dev/null 2>&1 && mysql -u root ananas_inventory_demo < %_datadir/ananas/inventory/inventory-demo.sql || : + +%postun + +rm -f %_datadir/ananas/translations/*.qm +rm -f %_datadir/ananas/templates/*.* + +rmdir --ignore-fail-on-non-empty %_datadir/ananas/translations +rmdir --ignore-fail-on-non-empty %_datadir/ananas/templates +rmdir --ignore-fail-on-non-empty %_datadir/ananas + +##%postun -n ananas-extensions +rmdir --ignore-fail-on-non-empty %_libdir/ananas +rmdir --ignore-fail-on-non-empty %_datadir/ananas + + +##%postun -n ananas-inventory +rm -f %_sysconfdir/ananas/inventory.* +rm -f %_sysconfdir/ananas/inventory-demo.* +rm -f %_sysconfdir/ananas/inventory_grouprc +rmdir --ignore-fail-on-non-empty %_sysconfdir/ananas +rm -f %_datadir/ananas/inventory/templ_*.odt +rm -f %_datadir/ananas/inventory/templ_*.ods +rmdir --ignore-fail-on-non-empty %_datadir/ananas/inventory +rmdir --ignore-fail-on-non-empty %_datadir/ananas + + +%clean + +%files +%_bindir/ananas +%_bindir/ananas-designer +%_libdir/libananas.so* +%_libdir/libananasplugin.so +%_libdir/ananas/qt3plugins/designer/libananasplugin.so +%_libdir/ananas/qt3plugins/sqldrivers/libqsqlmysqlu.so +%_docdir/%name-%version/ananas-*.sxw +%_datadir/ananas/translations/*.qm +%_datadir/ananas/templates/*.* +%_datadir/pixmaps/*.png +# files desktop for Fedora +%_datadir/applications/kde/ananas.desktop +%_datadir/applications/kde/ananas-designer.desktop +%_datadir/ananas/qtrc + +##%files -n ananas-devel +%_includedir/ananas/*.h +%_docdir/%name-%version/*.tex + +##%files -n ananas-inventory +%_sysconfdir/ananas/inventory.* +%_sysconfdir/ananas/inventory-demo.* + +%_datadir/ananas/inventory/inventory.sql +%_datadir/ananas/inventory/inventory-demo.sql +%_datadir/ananas/inventory/inventory_pgsql.sql + +%_datadir/ananas/inventory/templ_*.odt +%_datadir/ananas/inventory/templ_*.ods +%_sysconfdir/ananas/inventory_grouprc + +##%files -n ananas-extensions +%_libdir/ananas/*.so + +%changelog +* Sun Dec 30 2007 Andrey Paskal 0.9.5 + + Please look at ChangeLog file of Ananas Project + diff --git a/build/menus/kde/README b/build/menus/kde/README new file mode 100644 index 0000000..b406cec --- /dev/null +++ b/build/menus/kde/README @@ -0,0 +1,4 @@ +Каталог предназначен для файлов и скриптов, обеспечивающих +интеграцию Ананаса со средой KDE +хотя бы на уровне включения Ананаса после его установки +в меню запуска KDE. diff --git a/build/menus/kde/ananas b/build/menus/kde/ananas new file mode 100644 index 0000000..6d0047d --- /dev/null +++ b/build/menus/kde/ananas @@ -0,0 +1,5 @@ +?package(ananas):command="ananas"\ +needs="x11" section="Office" title="Ananas.Inventory"\ +longtitle="Inventory management and accounting system" \ +icon="ananas-32x32.png"\ +extra_opt="\\nName[ru]=Ананас.Оперативный учет\\nComment[ru]=Складской и бухгалтерсий учет" diff --git a/build/menus/kde/ananas-designer b/build/menus/kde/ananas-designer new file mode 100644 index 0000000..32100fe --- /dev/null +++ b/build/menus/kde/ananas-designer @@ -0,0 +1,6 @@ +?package(ananas):command="ananas-designer"\ +needs="x11" section="Applications/Development/Development environments"\ +title="Ananas.Designer"\ +longtitle="Design and develop Ananas applications"\ +icon="ananas-designer.png"\ +extra_opt="\\nName[ru]=Ананас.Дизайнер\\nComment[ru]=Разработка и настройка бизнес схем для Ананаса" diff --git a/build/menus/kde/ananas-designer.desktop b/build/menus/kde/ananas-designer.desktop new file mode 100644 index 0000000..3444fe0 --- /dev/null +++ b/build/menus/kde/ananas-designer.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Дизайнер для Ананаса +Name[ru]=Дизайнер для Ананаса +Comment=Design and develop Ananas applications +Comment[ru]=Разработка и настройка бизнес схем для Ананаса +Exec=ananas-designer +Icon=ananas-designer.png +Terminal=false +Type=Application +Categories=Application;Development;X-Red-Hat; diff --git a/build/menus/kde/ananas.desktop b/build/menus/kde/ananas.desktop new file mode 100644 index 0000000..94fae8f --- /dev/null +++ b/build/menus/kde/ananas.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Ананас.Оперативный учет +Name[ru]=Ананас.Оперативный учет +Comment=Inventory management and accounting system +Comment[ru]=Складской и бухгалтерсий учет +Exec=ananas +Icon=ananas-32x32.png +Terminal=false +Type=Application +Categories=Application;Office;X-Fedora; diff --git a/build/win32/AnanasInstall.iss b/build/win32/AnanasInstall.iss new file mode 100644 index 0000000..2560b1f --- /dev/null +++ b/build/win32/AnanasInstall.iss @@ -0,0 +1,247 @@ +; Inno Setup Installation Script. +; Version 5+ of Inno Setup required +; (c) Leader InfoTech, 2004 +; (c) Valery Grazdankin ( leader ), 2004 +; (c) patched by Andrey Paskal, 2005 +; (c) patched by Grigory Panov, 2005-2007 + +[Languages] +Name: Russian; MessagesFile: "compiler:languages\Russian.isl" +Name: English; MessagesFile: "compiler:default.isl" + +[Setup] +SourceDir=..\..\ +AppName=Ananas +AppVersion=0.9.5 +AppVerName=Ananas 0.9.5 + +AppPublisher=Ananas Team +AppPublisherURL=http://ananas.lrn.ru, http://www.leaderit.ru/page=ananas +AppSupportURL=http://ananas.lrn.ru, http://www.leaderit.ru/page=ananas +AppUpdatesURL=http://ananas.lrn.ru, http://www.leaderit.ru/page=ananas +DefaultDirName={pf}\Ananas +DefaultGroupName=Ananas +AppCopyright=Copyright c 2002-2007 Leader InfoTech, Ananas Team +DisableProgramGroupPage=yes +AllowNoIcons=yes +LicenseFile=COPYING.RU.cp1251 +InfoBeforeFile=build\win32\secondstep.txt +Compression=lzma +SolidCompression=yes +OutputDir=.\ +OutputBaseFilename=Ananas-Setup-0.9.5 + +[Components] +Name: "designer"; Description: "Äèçàéíåð"; Types: full compact custom +Name: "runtime"; Description: "Àíàíàñ"; Types: full compact custom +;Name: "webengine"; Description: "Âåá ñëóæáà"; Types: full compact custom +Name: "doc"; Description: "Äîêóìåíòàöèÿ"; Types: full custom +;Name: "doc\user"; Description: "Ðóêîâîäñòâî ïîëüçîâàòåëÿ"; Types: full custom +;Name: "doc\designer"; Description: "Îïèñàíèå äèçàéíåðà"; Types: full custom +;Name: "doc\script"; Description: "Îïèñàíèå âñòðîåííîãî ÿçûêà"; Types: full custom +;Name: "sources"; Description: "Source code"; Types: full custom +;;Name: "sqlservers"; Description: "Database SQL servers"; Types: full custom +;;Name: "sqlservers\mysql"; Description: "MySQL Database servers"; Types: full custom +;;Name: "sqlservers\postgres"; Description: "PostgreSQL Database servers"; Types: full custom +;Name: "acrobat"; Description: "Ïðîãðàììà ïðîñìîòðà äîêóìåíòàöèè Acrobat Reader 6.0"; Types: full custom +Name: "applications"; Description: "Áèçíåñ-ñõåìû ïðîåêòà Àíàíàñ"; Types: full custom + +Name: "applications\inventory"; Description: "Îïåðàòèâíûé ó÷åò"; Types: full compact custom +Name: "applications\inventory_demo"; Description: "Îïåðàòèâíûé ó÷åò. Äåìî."; Types: full custom +Name: "extensions"; Description: "Ðàñøèðåíèÿ (ïëàãèíû)"; Types: full custom +Name: "extensions\text"; Description: "Äëÿ ðàáîòû ñ òåêñòîâûìè ôàéëàìè"; Types: full custom +Name: "extensions\xml"; Description: "Äëÿ ðàáîòû ñ XML"; Types: full custom +Name: "extensions\meta"; Description: "Äëÿ äîñòóïà ê ìåòàäàííûì"; Types: full custom +Name: "extensions\sql"; Description: "Äëÿ âûïîëíåíèÿ SQL çàïðîñîâ â îò÷åòàõ"; Types: full custom +Name: "extensions\service"; Description: "Äëÿ äîñòóïà ê ðàçëè÷íûì ñëóæåáíûì ôóíêöèÿì"; Types: full custom +Name: "extensions\dateservice"; Description: "Äëÿ ðàáîòû ñ äàòàìè"; Types: full custom +Name: "extensions\minicalc"; Description: "Êàëüêóëÿòîð"; Types: full custom +Name: "mysql"; Description: "Ñåðâåð áàç äàííûõ MySQL"; Types: full compact custom; Flags: fixed +Name: "office"; Description: "Ïîäñèñòåìà îò÷åòîâ"; Types: full compact custom; Flags: fixed +Name: "office\ooo"; Description: "Èñïîëüçîâàòü OpenOffice.org"; Types: full compact custom; Flags: exclusive; +Name: "office\mso"; Description: "Èñïîëüçîâàòü Microsoft Office"; Types: full compact custom; Flags: exclusive; + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; +Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; + +[Files] +Source: "build\win32\setuplogo.bmp"; DestDir: {tmp}; Flags: dontcopy +;Source: "doc\*"; DestDir: "{app}\doc"; Components: doc; Flags: ignoreversion +Source: "src\designer\ananas-designer.exe"; DestDir: "{app}"; Components: designer; Flags: ignoreversion +;Source: "src\designer\testwrite.cfg"; DestDir: "{app}\applications\test"; Flags: ignoreversion +Source: "src\ananas\ananas.exe"; DestDir: "{app}"; Components: runtime; Flags: ignoreversion +;Source: "src\administrator\ananas-administrator.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "src\plugins\ananasplugin.dll"; DestDir: "{app}\designer"; Flags: ignoreversion +;Source: "src\plugins\rcplugin.dll"; DestDir: "{app}\designer"; Flags: ignoreversion +;Source: "src\webengine\ananas-webengine.exe"; DestDir: "{app}"; Flags: ignoreversion +;Source: "src\ananas\bkground.jpg"; DestDir: "{app}"; Flags: ignoreversion +;Source: "src\designer\my.rc"; DestDir: "{app}"; Flags: ignoreversion +Source: "src\lib\ananas.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "COPYING.RU.cp1251"; DestDir: "{app}"; Flags: ignoreversion +Source: "build\win32\README.CP1251"; DestDir: "{app}"; Flags: ignoreversion +Source: "translations\*.qm"; DestDir: "{app}\translations"; Flags: ignoreversion +Source: "src\designer\templates\*.*"; DestDir: "{app}\templates"; Components: designer; Flags: ignoreversion +;Source: "src\webengine\tpl\*.*"; DestDir: "{app}\tpl"; Flags: ignoreversion +;;;Source: "*"; Excludes:"*.exe,*.dll,*.lib,*.~*,.qmake.cache,*.tds,*.obj,CVS\*,tmp\*"; DestDir: "{app}\sources"; Flags: ignoreversion recursesubdirs +;Source: "c:\mysql\*"; DestDir: "{app}\mysql\"; Flags: ignoreversion recursesubdirs + +Source: "applications\inventory\*.*"; DestDir: "{app}\applications\inventory"; Components: applications; Flags: ignoreversion + +Source: "src\extensions\aexttext.dll"; DestDir: "{app}\extensions"; Components: extensions\text; Flags: ignoreversion; +Source: "src\extensions\aexttext.lib"; DestDir: "{app}\extensions"; Components: extensions\text; Flags: ignoreversion; +Source: "src\extensions\aextxml.dll"; DestDir: "{app}\extensions"; Components: extensions\xml; Flags: ignoreversion; +Source: "src\extensions\aextxml.lib"; DestDir: "{app}\extensions"; Components: extensions\xml; Flags: ignoreversion; +Source: "src\extensions\aext_meta.dll"; DestDir: "{app}\extensions"; Components: extensions\meta; Flags: ignoreversion; +Source: "src\extensions\aext_meta.lib"; DestDir: "{app}\extensions"; Components: extensions\meta; Flags: ignoreversion; +Source: "src\extensions\aextsql.dll"; DestDir: "{app}\extensions"; Components: extensions\sql; Flags: ignoreversion; +Source: "src\extensions\aextsql.lib"; DestDir: "{app}\extensions"; Components: extensions\sql; Flags: ignoreversion; +Source: "src\extensions\aextservice.dll"; DestDir: "{app}\extensions"; Components: extensions\service; Flags: ignoreversion; +Source: "src\extensions\aextservice.lib"; DestDir: "{app}\extensions"; Components: extensions\service; Flags: ignoreversion; +Source: "src\extensions\aextdateservice.dll"; DestDir: "{app}\extensions"; Components: extensions\dateservice; Flags: ignoreversion; +Source: "src\extensions\aextdateservice.lib"; DestDir: "{app}\extensions"; Components: extensions\dateservice; Flags: ignoreversion; +Source: "src\extensions\aextminicalc.dll"; DestDir: "{app}\extensions"; Components: extensions\minicalc; Flags: ignoreversion; +Source: "src\extensions\aextminicalc.lib"; DestDir: "{app}\extensions"; Components: extensions\minicalc; Flags: ignoreversion; +Source: "c:\Qt\lib\qtmtnc321.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "c:\Qt\lib\qsa110.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "c:\Qt\plugins\designer\qseditorplugin.dll"; DestDir: "{app}\designer"; Flags: ignoreversion + +Source: "c:\Qt\plugins\sqldrivers\*.dll"; DestDir: "{app}\sqldrivers"; Flags: ignoreversion +;if qsqlmysqlu exist in c:\Qt\3.2.1noncommercial\plugins\sqldrivers, replaced it with src\plugins\mysql +Source: "src\plugins\mysql\qsqlmysqlu.dll"; DestDir: "{app}\sqldrivers"; Flags: ignoreversion + +Source: "..\MySQL\MySQL Server 4.1\bin\libmysql.dll"; DestDir: "{app}"; Flags: ignoreversion +;Source: "c:\qt\3.2.1noncommercial\bin\pq.dll"; DestDir: "{app}"; Flags: ignoreversion +;Source: "c:\qt\3.2.1noncommercial\bin\cc3250.dll"; DestDir: "{app}"; Flags: ignoreversion +;Source: "c:\qt\3.2.1noncommercial\bin\cc3250mt.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "c:\Borland\bcc55\Bin\cc3250.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "c:\Borland\bcc55\Bin\cc3250mt.dll"; DestDir: "{app}"; Flags: ignoreversion +;Source: "c:\qt\bin\linguist.exe"; DestDir: "{app}"; Flags: ignoreversion + +Source: "icons\a-system.ico"; DestDir: "{app}"; Flags: ignoreversion; +Source: "icons\ananas-designer.ico"; DestDir: "{app}"; Flags: ignoreversion; +Source: "icons\manual.ico"; DestDir: "{app}"; Flags: ignoreversion; + +Source: "build\win32\makerc.bat"; DestDir: "{app}"; Flags: ignoreversion; +Source: "build\win32\makemysqlini.bat"; DestDir: "{app}"; Flags: ignoreversion; +Source: "applications\inventory\wininstall.bat"; DestDir: "{app}"; Components: applications\inventory; Flags: ignoreversion; +Source: "applications\inventory\demowininstall.bat"; DestDir: "{app}"; Components: applications\inventory_demo; Flags: ignoreversion; + + +Source: "..\MySQL\*"; DestDir: {app}; Flags: ignoreversion recursesubdirs; Components: mysql + +Source: "..\7-zip\7z.exe"; DestDir: {app}; Flags: ignoreversion recursesubdirs; +Source: "..\7-zip\Codecs\copy.dll"; DestDir: "{app}\Codecs"; Flags: ignoreversion recursesubdirs; +Source: "..\7-zip\Codecs\deflate.dll"; DestDir: "{app}\Codecs"; Flags: ignoreversion recursesubdirs; +Source: "..\7-zip\Formats\zip.dll"; DestDir: "{app}\Formats"; Flags: ignoreversion recursesubdirs; + +Source: "..\doc\*.pdf"; DestDir: "{app}\doc"; Flags: ignoreversion recursesubdirs; Components: doc + +; NOTE: Don't use "Flags: ignoreversion" on any shared system files +[INI] +Filename: "{app}\lit.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://ananas.lrn.ru" + +[Icons] +Name: "{group}\Àíàíàñ.Îïåðàòèâíûé ó÷åò"; Components: runtime; Filename: "{app}\ananas.exe"; IconFilename: "{app}\a-system.ico" +Name: "{group}\Àíàíàñ.Äèçàéíåð"; Components: designer; Filename: "{app}\ananas-designer.exe"; IconFilename: "{app}\ananas-designer.ico" +Name: "{group}\Àíàíàñ.Ðóêîâîäñòâî ïîëüçîâàòåëÿ"; Components: doc; Filename: "{app}\doc\ananas-inventory-user-manual.pdf"; IconFilename: "{app}\manual.ico" +Name: "{group}\Àíàíàñ.Ðóêîâîäñòâî ïðîãðàììèñòà"; Components: doc; Filename: "{app}\doc\ananas-designer-quick-start.pdf"; IconFilename: "{app}\manual.ico" +Name: "{group}\{cm:UninstallProgram,Ananas}"; Filename: "{uninstallexe}"; AfterInstall: ananasAfterInstall +Name: "{userdesktop}\Àíàíàñ.Îïåðàòèâíûé ó÷åò"; Components: runtime; Filename: "{app}\ananas.exe"; Tasks: desktopicon; IconFilename: "{app}\a-system.ico" +Name: "{userdesktop}\Àíàíàñ.Äèçàéíåð"; Components: designer; Filename: "{app}\ananas-designer.exe"; Tasks: desktopicon; IconFilename: "{app}\ananas-designer.ico" +Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Ananas"; Filename: "{app}\ananas.exe"; Tasks: quicklaunchicon; IconFilename: "{app}\a-system.ico" +Name: "{group}\Àíàíàñ â èíòåðíåòå"; Filename: "{app}\lit.url" + +[Registry] +Root: HKLM; Subkey: "Software\ananasgroup"; Flags: uninsdeletekeyifempty +Root: HKLM; Subkey: "Software\ananasgroup\ananas"; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\ananasgroup"; Flags: uninsdeletekeyifempty +Root: HKCU; Subkey: "Software\ananasgroup\ananas"; Flags: uninsdeletekey +Root: HKLM; Subkey: "Software\ananasgroup\ananas\groups"; ValueType: string; ValueName: "0"; ValueData: "Áèçíåñ-ñõåìû ïðîåêòà Àíàíàñ" +Root: HKLM; Subkey: "Software\ananasgroup\ananas\groups\0"; Components: applications\inventory; ValueType: string; ValueName: "0"; ValueData: "{app}\applications\inventory\inventorywin.rc" +Root: HKCU; Subkey: "Software\ananasgroup\ananas\groups"; ValueType: string; ValueName: "0"; ValueData: "Áèçíåñ-ñõåìû ïðîåêòà Àíàíàñ" +Root: HKCU; Subkey: "Software\ananasgroup\ananas\groups\0"; Components: applications\inventory; ValueType: string; ValueName: "0"; ValueData: "{app}\applications\inventory\inventorywin.rc" +Root: HKLM; Subkey: "Software\ananasgroup\ananas\groups\0"; Components: applications\inventory_demo; ValueType: string; ValueName: "1"; ValueData: "{app}\applications\inventory\inventory-demowin.rc" +Root: HKCU; Subkey: "Software\ananasgroup\ananas\groups\0"; Components: applications\inventory_demo; ValueType: string; ValueName: "1"; ValueData: "{app}\applications\inventory\inventory-demowin.rc" +Root: HKCU; Subkey: "Software\ananasgroup\ananas\config\variables"; Components: office\mso; ValueType: string; ValueName: "defaultOffice"; ValueData: "MSO" +Root: HKCU; Subkey: "Software\ananasgroup\ananas\config\variables"; Components: office\ooo; ValueType: string; ValueName: "defaultOffice"; ValueData: "OOO" + + +[Run] +Filename: "{app}\ananas.exe"; Components: runtime; Description: "{cm:LaunchProgram,Àíàíàñ.Îïåðàòèâíûé ó÷åò}"; Flags: nowait postinstall skipifsilent +FileName: "{app}\MySQL Server 4.1\bin\mysqld-nt.exe"; Parameters: "--install MySQLAnanas ""--defaults-file={app}\mysqls~1.1\my.ini"" "; Components: mysql; Flags: runhidden; StatusMsg: "Óñòàíîâêà MySQL..." +FileName: "net"; Parameters: "start MySQLAnanas"; Components: mysql; Flags: shellexec runhidden + +;FileName: "{app}\MySQL Server 4.1\bin\mysqladmin.exe"; Parameters: "-u root create ananas_system"; Components: mysql; Flags: runhidden; StatusMsg: "Óñòàíîâêà MySQL... Ñîçäàíèå ÁÄ ananas_system" + +FileName: "{app}\MySQL Server 4.1\bin\mysqladmin.exe"; Parameters: "-u root create ananas_inventory"; Components: mysql applications\inventory; Flags: runhidden; StatusMsg: "Ñîçäàíèå ÁÄ ananas_inventory" +FileName: "{app}\wininstall.bat"; Components: applications\inventory; Parameters: """{app}\MySQL Server 4.1\bin"" ""{app}\applications\inventory\"""; Flags: shellexec runhidden; +FileName: "{app}\makerc.bat"; Components: applications\inventory; Parameters: """{app}\applications\inventory"" ""{app}\applications\inventory\inventory.cfg"" ""{app}\applications\inventory\inventorywin.rc"""; Flags: shellexec runhidden; + +FileName: "{app}\MySQL Server 4.1\bin\mysqladmin.exe"; Parameters: "-u root create ananas_inventory_demo"; Components: mysql applications\inventory_demo; Flags: runhidden; StatusMsg: "Ñîçäàíèå ÁÄ ananas_inventory_demo" +FileName: "{app}\demowininstall.bat"; Components: applications\inventory_demo; Parameters: """{app}\MySQL Server 4.1\bin"" ""{app}\applications\inventory\"""; Flags: shellexec runhidden; +FileName: "{app}\makerc.bat"; Components: applications\inventory_demo; Parameters: """{app}\applications\inventory"" ""{app}\applications\inventory\inventory-demo.cfg"" ""{app}\applications\inventory\inventory-demowin.rc"""; Flags: shellexec runhidden; + + +FileName: "{app}\makemysqlini.bat"; Parameters: """{app}\MySQL Server 4.1\"" ""{app}\MySQL Server 4.1\Data\"" ""{app}\MySQL Server 4.1/my.ini"""; Flags: shellexec runhidden; + + +[UninstallRun] +FileName: "net"; Parameters: "stop MySQLAnanas"; Components: mysql; Flags: runhidden; StatusMsg: "Îñòàíîâêà MySQL..." +FileName: "{app}\MySQL Server 4.1\bin\mysqld-nt.exe"; Parameters: "--remove MySQLAnanas"; Components: mysql; Flags: runhidden; StatusMsg: "Óäàëåíèå MySQL..." + +[UninstallDelete] +Type: files; Name: "{app}\lit.url" +Type: files; Name: "{app}\ananasplugin.dll" +Type: filesandordirs; Name: "{app}\MySQL"; Components: mysql + +[Code] +// +procedure InitializeWizard(); +var + SplashImage: TBitmapImage; + SplashForm: TForm; + SplashFileName: String; +begin + + SplashFileName := ExpandConstant('{tmp}\setuplogo.bmp'); + ExtractTemporaryFile(ExtractFileName(SplashFileName)); + + SplashForm := TForm.create(nil); + with SplashForm do + begin + BorderStyle := bsNone; + Position := poScreenCenter; + // Adjust the height and width of the SplashForm + // to the size of our splash image + ClientWidth := 400; + ClientHeight := 244; + end; + + SplashImage := TBitmapImage.Create(SplashForm); + with SplashImage do + begin + Bitmap.LoadFromFile(SplashFileName); + Stretch := true; + Align := alClient; + Parent := SplashForm; + end; + + with SplashForm do + begin + Show; + Repaint; + Sleep(1000); + Close; + Free; + end; +end; + + +procedure ananasAfterInstall(); +begin + { copy files } + FileCopy( ExpandConstant('{app}\designer\ananasplugin.dll'), ExpandConstant('{app}\ananasplugin.dll'), false); + +end; + diff --git a/build/win32/AnanasUpgrade.iss b/build/win32/AnanasUpgrade.iss new file mode 100644 index 0000000..00db3cf --- /dev/null +++ b/build/win32/AnanasUpgrade.iss @@ -0,0 +1,135 @@ +; Inno Setup Installation Script. +; Version 5+ of Inno Setup required +; (c) Leader InfoTech, 2004 +; (c) Valery Grazdankin ( leader ), 2004 +; (c) patched by Andrey Paskal, 2005 +; (c) patched by Grigory Panov, 2005 +; (c) patched by Alexey Chernov, 2006 + +[Languages] +Name: Russian; MessagesFile: "compiler:languages\Russian.isl" +Name: English; MessagesFile: "compiler:default.isl" + +[Setup] +SourceDir=..\..\ +AppName=Îáíîâëåíèÿ Ananas +AppVersion=0.9.3 +AppVerName=Îáíîâëåíèå Ananas 0.9.3 +AppPublisher=Ananas Team +AppPublisherURL=http://ananas.lrn.ru, http://www.leaderit.ru/page=ananas +AppSupportURL=http://ananas.lrn.ru, http://www.leaderit.ru/page=ananas +AppUpdatesURL=http://ananas.lrn.ru, http://www.leaderit.ru/page=ananas +DefaultDirName={pf}\Ananas +DefaultGroupName=Ananas +DirExistsWarning=No +AppCopyright=Copyright c 2002-2006 Leader InfoTech, Ananas Project Team +DisableProgramGroupPage=yes +AllowNoIcons=yes +LicenseFile=COPYING.RU.cp1251 +Compression=lzma +SolidCompression=yes +OutputDir=.\ +OutputBaseFilename=Ananas-Update-0.9.3 + +[Files] +Source: "build\win32\setuplogo.bmp"; DestDir: {tmp}; Flags: dontcopy +Source: "src\designer\ananas-designer.exe"; DestDir: "{app}"; +Source: "src\ananas\ananas.exe"; DestDir: "{app}"; +Source: "src\plugins\ananasplugin.dll"; DestDir: "{app}\designer"; Flags: ignoreversion +Source: "src\plugins\ananasplugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "src\lib\ananas.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "COPYING.RU.cp1251"; DestDir: "{app}";DestName:"License.txt" ; Flags: ignoreversion +Source: "translations\*.qm"; DestDir: "{app}\translations"; Flags: ignoreversion +Source: "c:\Qt\3.2.1noncommercial\lib\qsa110.dll"; DestDir: "{app}"; Flags: ignoreversion + +[Code] +// +var +ananas_path:string; + function InitializeSetup(): Boolean; + begin + if RegKeyExists(HKLM,'Software\ananasgroup\ananas')=false + then + begin + Result := MsgBox('Íå íàéäåíà óñòàíîâëåííàÿ âåðñèÿ Ananas. Ïðîäîëæèòü?', mbConfirmation, MB_YESNO) = idYes; + if Result = False + then + MsgBox('Óñòàíîâêà îòìåíåíà', mbInformation, MB_OK); + end + else + Result:=True; + end; +procedure InitializeWizard(); +var + SplashImage: TBitmapImage; + SplashForm: TForm; + SplashFileName: String; + uninsPath:string; + + ErrorCode:integer; + +begin +{ if RegValueExists(HKLM,'Software\ananasgroup\ananas','UninstallString')=true + then + begin + if MsgBox('Íàéäåíà óñòàíîâëåííàÿ âåðñèÿ Ananas. Óäàëèòü?', mbConfirmation, MB_YESNO)= idYes then + begin + RegQueryStringValue(HKLM,'Software\ananasgroup\ananas', 'UninstallString',UninsPath); + if not InstExec(ExpandConstant(UninsPath), '', '', True, False, SW_SHOWNORMAL, ErrorCode) + then + MsgBox('Script.NextButtonClick:' #13#13 'The file could not be executed. ' + SysErrorMessage(ErrorCode) + '.', mbError, MB_OK); + end; + end; } + + { if RegKeyExists(HKLM,'Software\ananasgroup\ananas')=false + then + if MsgBox('Íå íàéäåíà óñòàíîâëåííàÿ âåðñèÿ Ananas. Ïðîäîëæèòü?', mbConfirmation, MB_YESNO)= idYes then + else ; } + + SplashFileName := ExpandConstant('{tmp}\setuplogo.bmp'); + ExtractTemporaryFile(ExtractFileName(SplashFileName)); + SplashForm := TForm.create(nil); + with SplashForm do + begin + BorderStyle := bsNone; + Position := poScreenCenter; + // Adjust the height and width of the SplashForm + // to the size of our splash image + ClientWidth := 400; + ClientHeight := 244; + end; + SplashImage := TBitmapImage.Create(SplashForm); + with SplashImage do + begin + Bitmap.LoadFromFile(SplashFileName); + Stretch := true; + Align := alClient; + Parent := SplashForm; + end; + with SplashForm do + begin + Show; + Repaint; + Sleep(1000); + Close; + Free; + end; +end; +Procedure CurPageChanged(CurPage: Integer); +begin + Case CurPage of wpFinished: + begin + if FileExists(WizardDirValue+'\unins001.exe') + then + DeleteFile(WizardDirValue+'\unins001.exe'); + if FileExists(WizardDirValue+'\unins001.dat') + then + DeleteFile(WizardDirValue+'\unins001.dat'); + end; + end; +end; +//procedure ananasAfterInstall(); +//begin + { copy files } +// FileCopy( WizardDirValue+'\designer\ananasplugin.dll', WizardDirValue+'\ananasplugin.dll', false); +//end; diff --git a/build/win32/setuplogo.bmp b/build/win32/setuplogo.bmp new file mode 100644 index 0000000..a0053c6 Binary files /dev/null and b/build/win32/setuplogo.bmp differ diff --git a/icons/a-system.ico b/icons/a-system.ico new file mode 100644 index 0000000..f8fcdbd Binary files /dev/null and b/icons/a-system.ico differ diff --git a/icons/a-system.png b/icons/a-system.png new file mode 100644 index 0000000..6638dff Binary files /dev/null and b/icons/a-system.png differ diff --git a/icons/ananas-16x16.png b/icons/ananas-16x16.png new file mode 100644 index 0000000..80b93a5 Binary files /dev/null and b/icons/ananas-16x16.png differ diff --git a/icons/ananas-32x32.png b/icons/ananas-32x32.png new file mode 100644 index 0000000..2e79aae Binary files /dev/null and b/icons/ananas-32x32.png differ diff --git a/icons/ananas-designer.ico b/icons/ananas-designer.ico new file mode 100644 index 0000000..9e815ab Binary files /dev/null and b/icons/ananas-designer.ico differ diff --git a/icons/ananas_splach.cdr b/icons/ananas_splach.cdr new file mode 100644 index 0000000..919f597 Binary files /dev/null and b/icons/ananas_splach.cdr differ diff --git a/icons/lit.png b/icons/lit.png new file mode 100644 index 0000000..f389f0a Binary files /dev/null and b/icons/lit.png differ diff --git a/icons/manual.ico b/icons/manual.ico new file mode 100644 index 0000000..8e91fe5 Binary files /dev/null and b/icons/manual.ico differ diff --git a/src/admin/admin.pro b/src/admin/admin.pro new file mode 100644 index 0000000..6276148 --- /dev/null +++ b/src/admin/admin.pro @@ -0,0 +1,59 @@ +#project for Administrator application from Ananas automation accounting system +TARGET = ananas4-administrator +include ( ../lib/lib.pri ) +include ( ../plugins/plugins.pri ) +include ( ../ananas.pri ) + + +TEMPLATE = app +LANGUAGE = C++ +DESTDIR = ../../bin + +LIBS += -L../../lib -lananas4 +LIBS += -L../../lib/designer -lananasplugin4 -lqt4-qdataschema -L$(QTDIR)/lib -lqsa + +INCLUDEPATH += ../lib ../lib/tmp/ui ../lib/.ui + +HEADERS += atreeitems.h \ + mdtree.h \ + mainform.h \ + usersform.h \ + rolesform.h \ + deditpermissions.h \ + dselectuser.h \ + deditrole.h \ + dedituser.h \ + dselectrole.h + +SOURCES += main.cpp \ + atreeitems.cpp \ + mdtree.cpp \ + mainform.cpp \ + usersform.cpp \ + rolesform.cpp \ + deditpermissions.cpp \ + dselectuser.cpp \ + deditrole.cpp \ + dedituser.cpp \ + dselectrole.cpp + + +FORMS = \ + mainform.ui \ + usersform.ui \ + rolesform.ui \ + deditpermissions.ui \ + dselectuser.ui \ + deditrole.ui \ + dedituser.ui \ + dselectrole.ui + +RESOURCES +=admin.qrc + + + + +TRANSLATIONS = \ + ../../translations/ananas-administrator-en.ts \ + ../../translations/ananas-administrator-ru.ts + diff --git a/src/admin/admin.qrc b/src/admin/admin.qrc new file mode 100644 index 0000000..50d84f8 --- /dev/null +++ b/src/admin/admin.qrc @@ -0,0 +1,22 @@ + + + ../../icons/a-system.png + images/administrator-splash-en.png + images/administrator-splash-ru.png + images/cat.png + images/cat_g.png + images/doc.png + images/doc_g.png + images/journ.png + images/journ_g.png + images/reg_g.png + images/reg.png + images/user.png + images/users.png + images/metadata.png + images/role.png + images/regs.png + images/report.png + images/report_g.png + + \ No newline at end of file diff --git a/src/admin/atreeitems.cpp b/src/admin/atreeitems.cpp new file mode 100644 index 0000000..d91b055 --- /dev/null +++ b/src/admin/atreeitems.cpp @@ -0,0 +1,157 @@ +/**************************************************************************** +** $Id: atreeitems.cpp,v 1.2 2008/12/05 21:11:54 leader Exp $ +** +** Header file of the Ananas visual tree object +** of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +//#include +//#include +//#include +#include +#include + +#include "atreeitems.h" + +ananasListViewItem::ananasListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, + const QString &name ) +: Q3ListViewItem( parent ) +{ + obj = cfgobj; + md = cfgmd; + if ( name.isNull() ) setText( 0, md->attr( obj, mda_name ) ); + else setText( 0, name ); + id = md->id(obj); +} + +ananasListViewItem::ananasListViewItem( ananasListViewItem *parent, ananasListViewItem *after, + aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: Q3ListViewItem( parent, after ) +{ + obj = cfgobj; + md = cfgmd; + if ( name.isNull() ) setText( 0, md->attr( obj, mda_name ) ); + else setText( 0, name ); + id = md->id(obj); +} + +ananasListViewItem::ananasListViewItem( Q3ListView *parent, Q3ListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: Q3ListViewItem( parent, after ) +{ + obj = cfgobj; + md = cfgmd; + if ( name.isNull() ) setText( 0, md->attr( obj, mda_name ) ); + else setText( 0, name ); + id = md->id(obj); +} + +void +ananasListViewItem::clearTree() +{ + QListViewItem *item, *nextitem; + + // clear tree + item = firstChild(); + while( item ) + { + nextitem = item->nextSibling(); + delete item; + item = nextitem; + } +} + +/* +void +ananasListViewItem::moveItem ( QListViewItem * after ) +{ +CHECK_POINT + aCfgItem temp = obj, temp2 = ((ananasListViewItem*)after)->obj; + QListViewItem::moveItem( after ); + obj = temp; + ((ananasListViewItem*)after)->obj = temp2; +} +*/ + +ananasListViewItem * +ananasListViewItem::previousSibling() +{ + if ( !this ) return 0; + QListViewItem *parent, *item; + parent = this->parent(); + item = parent->firstChild(); + while ( item ) + if ( (ananasListViewItem *)item->nextSibling() == this ) + return (ananasListViewItem *) item; + else item = item->nextSibling(); + return 0; +} + +ananasListViewItem* +ananasListViewItem::nextSibling() +{ + return (ananasListViewItem *)QListViewItem::nextSibling(); +} + + + + +ananasListViewItem* +ananasListViewItem::getLastChild() +{ + QListViewItem *item, *nextitem; + item = firstChild(); + while( item ) + { + nextitem = item->nextSibling(); + if ( nextitem ) + item = nextitem; + else + return (ananasListViewItem*) item; + } + return 0; +}; + + +ananasTreeView::ananasTreeView ( QWidget *parent, aCfg *cfgmd ) +:Q3ListView ( parent ) +{ + md = cfgmd; + addColumn( "" ); + header()->hide(); + setSorting ( -1 ); + setSelectionMode( Single ); +}; + + +void +ananasTreeView::ContextMenuAdd( QPopupMenu * m ) +{ + //m->insertSeparator(); +}; + + + + diff --git a/src/admin/atreeitems.h b/src/admin/atreeitems.h new file mode 100644 index 0000000..1d8dc15 --- /dev/null +++ b/src/admin/atreeitems.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** $Id: atreeitems.h,v 1.2 2008/12/05 21:11:54 leader Exp $ +** +** Header file of the Ananas visual tree object +** of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ATREEITEMS_H +#define ATREEITEMS_H +#include +//#include +#include +//#include +#include "acfg.h" + +#define QListView Q3ListView +#define QListViewItem Q3ListViewItem +#define QPopupMenu Q3PopupMenu +#define QHeader Q3Header + +class QWidget; + +class ananasListViewItem : public Q3ListViewItem +{ +public: + int id; + aCfgItem obj; + QWidget *editor; + aCfg *md; + + ananasListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + ananasListViewItem( Q3ListView *parent, Q3ListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + ananasListViewItem( ananasListViewItem *parent, ananasListViewItem *after, aCfg * cfgmd, + aCfgItem cfgobj, const QString &name = QString::null ); + + void clearTree(); +// void moveUp (); +// void moveDown (); + + ananasListViewItem *previousSibling(); + ananasListViewItem *nextSibling(); +// ananasListViewItem *getLastChild( QListViewItem * parent ); + ananasListViewItem *getLastChild(); +protected: +// virtual void okRename( int col ); +}; + +class ananasTreeView +: public Q3ListView +{ + Q_OBJECT +public: + aCfg *md; + + ananasTreeView( QWidget *parent, aCfg *cfgmd ); + + void ContextMenuAdd( QPopupMenu * m ); +// void deleteItem(); +// void moveUpItem (); +// void moveDownItem (); +// void renameItem(); +}; + + +#endif diff --git a/src/admin/deditpermissions.cpp b/src/admin/deditpermissions.cpp new file mode 100644 index 0000000..9693997 --- /dev/null +++ b/src/admin/deditpermissions.cpp @@ -0,0 +1,82 @@ +#include "deditpermissions.h" + +#include +#include +#include + +//#include "deditpermissions.ui.h" +/* + * Constructs a dEditPermissions as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dEditPermissions::dEditPermissions(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditPermissions::~dEditPermissions() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditPermissions::languageChange() +{ + retranslateUi(this); +} + + +void dEditPermissions::setData( int pm ) +{ + int r,i; + r = 1; + QCheckBox *c; + for (i=1;i<=7;i++) + { + c = (QCheckBox*) child( (const char*) QString("checkBox%1").arg(i),"QCheckBox"); + if ( c ) { + c->setChecked( (pm & r ) !=0 ); + } + r = r << 1; + } +} + + +int dEditPermissions::getData() +{ + int r,i, res=0; + r = 1; + QCheckBox *c; + for (i=1;i<=7;i++) + { + c = (QCheckBox*) child( (const char*) QString("checkBox%1").arg(i),"QCheckBox"); + if ( c ) { + if (c->isChecked()) res |= r; + } + r = r << 1; + } + return res; +} + + +void dEditPermissions::setAll( bool v ) +{ + int i; + QCheckBox *c; + for (i=1;i<=7;i++) + { + c = (QCheckBox*) child( (const char*) QString("checkBox%1").arg(i),"QCheckBox"); + if ( c ) c->setChecked( v ); + } +} diff --git a/src/admin/deditpermissions.h b/src/admin/deditpermissions.h new file mode 100644 index 0000000..61274d1 --- /dev/null +++ b/src/admin/deditpermissions.h @@ -0,0 +1,25 @@ +#ifndef DEDITPERMISSIONS_H +#define DEDITPERMISSIONS_H + +#include +//#include + +class dEditPermissions : public QDialog, public Ui::dEditPermissions +{ + Q_OBJECT + +public: + dEditPermissions(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dEditPermissions(); + +public slots: + virtual void setData( int pm ); + virtual int getData(); + void setAll( bool b ); + +protected slots: + virtual void languageChange(); + +}; + +#endif // DEDITPERMISSIONS_H diff --git a/src/admin/deditpermissions.ui b/src/admin/deditpermissions.ui new file mode 100644 index 0000000..d7c05d4 --- /dev/null +++ b/src/admin/deditpermissions.ui @@ -0,0 +1,218 @@ + + dEditPermissions + + + + 0 + 0 + 331 + 204 + + + + Edit permissions + + + + + + + 0 + 0 + + + + Permissions + + + + + 10 + 140 + 84 + 23 + + + + turn off + + + + + + 10 + 160 + 84 + 23 + + + + all + + + + + + 10 + 20 + 73 + 23 + + + + view + + + + + + 10 + 40 + 73 + 23 + + + + update + + + + + + 10 + 60 + 73 + 23 + + + + insert + + + + + + 10 + 80 + 73 + 23 + + + + delete + + + + + + 10 + 100 + 73 + 23 + + + + execute + + + + + + 10 + 120 + 73 + 23 + + + + turn on + + + + + + + + + + Ok + + + + + + + Cancel + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 51 + 114 + + + + + + + + qPixmapFromMimeSource + + + Q3ButtonGroup + Q3GroupBox +
Qt3Support/Q3ButtonGroup
+ 1 +
+
+ + acfg.h + qmap.h + + + + + pushButton1 + clicked() + dEditPermissions + accept() + + + 190 + 30 + + + 20 + 20 + + + + + pushButton2 + clicked() + dEditPermissions + reject() + + + 190 + 67 + + + 20 + 20 + + + + +
diff --git a/src/admin/deditrole.cpp b/src/admin/deditrole.cpp new file mode 100644 index 0000000..679bd5c --- /dev/null +++ b/src/admin/deditrole.cpp @@ -0,0 +1,50 @@ +#include "deditrole.h" + +#include +#include +#include + +/* + * Constructs a dEditRole as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dEditRole::dEditRole(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditRole::~dEditRole() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditRole::languageChange() +{ + retranslateUi(this); +} + + +void +dEditRole::setData( const QString &s ) +{ + lineEdit1->setText(s); +} + + +QString +dEditRole::getData() +{ + return lineEdit1->text(); +} diff --git a/src/admin/deditrole.h b/src/admin/deditrole.h new file mode 100644 index 0000000..2d94e37 --- /dev/null +++ b/src/admin/deditrole.h @@ -0,0 +1,22 @@ +#ifndef DEDITROLE_H +#define DEDITROLE_H + +#include "ui_deditrole.h" + +class dEditRole : public QDialog, public Ui::dEditRole +{ + Q_OBJECT + +public: + dEditRole(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dEditRole(); + + virtual void setData( const QString & s ); + virtual QString getData(); + +protected slots: + virtual void languageChange(); + +}; + +#endif // DEDITROLE_H diff --git a/src/admin/deditrole.ui b/src/admin/deditrole.ui new file mode 100644 index 0000000..1283988 --- /dev/null +++ b/src/admin/deditrole.ui @@ -0,0 +1,72 @@ + + + + + dEditRole + + + + 0 + 0 + 394 + 99 + + + + Role name + + + + + + + + Ok + + + + + + + Cancel + + + + + + + + + + + Role name + + + false + + + + + + + + + + + + qPixmapFromMimeSource + + + bOk + clicked() + dEditRole + accept() + + + bCancel + clicked() + dEditRole + reject() + + + diff --git a/src/admin/dedituser.cpp b/src/admin/dedituser.cpp new file mode 100644 index 0000000..8c86bae --- /dev/null +++ b/src/admin/dedituser.cpp @@ -0,0 +1,90 @@ +#include "dedituser.h" + +#include +#include +#include + +/* + * Constructs a dEditUser as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dEditUser::dEditUser(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditUser::~dEditUser() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditUser::languageChange() +{ + retranslateUi(this); +} + + +bool +dEditUser::check( const QString &login ) +{ + if(usr->sysValue("login").toString()==login) + { + return false; + } + return true; +} + + +aUser * dEditUser::getData() +{ + return usr; + +} + + +void dEditUser::setData( aUser *user, bool isNew ) +{ + usr = user; + newUser = isNew; + //usr->Select(); + if(!isNew) + { + lineEdit1->setText(usr->sysValue("login").toString()); + lineEdit2->setText(usr->sysValue("password").toString()); + lineEdit3->setText(usr->sysValue("fname").toString()); + lineEdit4->setText(usr->sysValue("lname").toString()); +} +} + + +void dEditUser::onOk() +{ + if(check(lineEdit1->text())) + { + if(newUser) + { + usr->New(lineEdit1->text(), lineEdit2->text(),lineEdit3->text(),lineEdit4->text()); + } + else + { + usr->setSysValue("login",lineEdit1->text()); + usr->setSysValue("password",lineEdit2->text()); + usr->setSysValue("fname",lineEdit3->text()); + usr->setSysValue("lname",lineEdit4->text()); + usr->Update(); +} + this->accept(); + } +} diff --git a/src/admin/dedituser.h b/src/admin/dedituser.h new file mode 100644 index 0000000..e7ecd4e --- /dev/null +++ b/src/admin/dedituser.h @@ -0,0 +1,29 @@ +#ifndef DEDITUSER_H +#define DEDITUSER_H +#include "ui_dedituser.h" + +class dEditUser : public QDialog, public Ui::dEditUser +{ + Q_OBJECT + +public: + dEditUser(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dEditUser(); + + virtual aUser * getData(); + +public slots: + virtual bool check( const QString & login ); + virtual void setData( aUser * user, bool isNew ); + virtual void onOk(); + +protected slots: + virtual void languageChange(); + +private: + aUser *usr; + bool newUser; + +}; + +#endif // DEDITUSER_H diff --git a/src/admin/dedituser.ui b/src/admin/dedituser.ui new file mode 100644 index 0000000..b7a15f6 --- /dev/null +++ b/src/admin/dedituser.ui @@ -0,0 +1,135 @@ + + + + + dEditUser + + + + 0 + 0 + 414 + 246 + + + + User + + + + + + + + Login + + + false + + + + + + + + + + Password + + + false + + + + + + + QLineEdit::Password + + + + + + + First name + + + false + + + + + + + + + + Last Name + + + false + + + + + + + + + + + + + + Ok + + + + + + + Cancel + + + + + + + + 20 + 141 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + qPixmapFromMimeSource + + auser.h + mdtree.h + + + + pushButton1 + clicked() + dEditUser + onOk() + + + pushButton2 + clicked() + dEditUser + reject() + + + diff --git a/src/admin/dselectrole.cpp b/src/admin/dselectrole.cpp new file mode 100644 index 0000000..3bfd312 --- /dev/null +++ b/src/admin/dselectrole.cpp @@ -0,0 +1,80 @@ +#include "dselectrole.h" + +#include +#include +#include + +/* + * Constructs a dSelectRole as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dSelectRole::dSelectRole(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + +} + +/* + * Destroys the object and frees any allocated resources + */ +dSelectRole::~dSelectRole() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dSelectRole::languageChange() +{ + retranslateUi(this); +} + +void +dSelectRole::setData( aUser *user ) +{ + usr = user; + listBox1->clear(); + listId.clear(); + Q3ValueList list = user->getRoles(false); + Q3ValueList::iterator it; + for ( it = list.begin(); it != list.end(); ++it ) + { + listBox1->insertItem( (*it)->sysValue("name").toString() ); + listId.append((*it)->sysValue("id").toString()); + delete (*it); + } +// delete list; +} + + +void +dSelectRole::onSelect() +{ + if(listBox1->currentItem()!=-1) + { + printf("add role\n"); + + //emit( addRole(listId[listBox1->currentItem()].toULongLong()) ); + roleId = listId[listBox1->currentItem()].toULongLong(); + usr->addRole(roleId); + listBox1->removeItem(listBox1->currentItem()); + accept(); + // new aListViewItem(p_item, + } + else + { + printf("not selected\n"); + } +} + + +Q_ULLONG dSelectRole::getData() +{ + return roleId; +} diff --git a/src/admin/dselectrole.h b/src/admin/dselectrole.h new file mode 100644 index 0000000..63a0652 --- /dev/null +++ b/src/admin/dselectrole.h @@ -0,0 +1,29 @@ +#ifndef DSELECTROLE_H +#define DSELECTROLE_H + +#include "ui_dselectrole.h" + +class dSelectRole : public QDialog, public Ui::dSelectRole +{ + Q_OBJECT + +public: + dSelectRole(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dSelectRole(); + +public slots: + virtual void setData( aUser * user ); + virtual void onSelect(); + virtual Q_ULLONG getData(); + +protected slots: + virtual void languageChange(); + +private: + Q_ULLONG roleId; + aUser *usr; + QStringList listId; + +}; + +#endif // DSELECTROLE_H diff --git a/src/admin/dselectrole.ui b/src/admin/dselectrole.ui new file mode 100644 index 0000000..567fbb3 --- /dev/null +++ b/src/admin/dselectrole.ui @@ -0,0 +1,71 @@ + + + + + dSelectRole + + + + 0 + 0 + 445 + 312 + + + + Select role + + + + + + + New Item + + + + + + + + + + Select + + + + + + + + 20 + 201 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + qPixmapFromMimeSource + + auser.h + arole.h + + + + bSelect + clicked() + dSelectRole + onSelect() + + + diff --git a/src/admin/dselectuser.cpp b/src/admin/dselectuser.cpp new file mode 100644 index 0000000..a1d7917 --- /dev/null +++ b/src/admin/dselectuser.cpp @@ -0,0 +1,89 @@ +#include "dselectuser.h" + +#include +#include +#include + +/* + * Constructs a dSelectUser as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dSelectUser::dSelectUser(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + +} + +/* + * Destroys the object and frees any allocated resources + */ +dSelectUser::~dSelectUser() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dSelectUser::languageChange() +{ + retranslateUi(this); +} + +void +dSelectUser::setData( aRole *i ) +{ + Q_ULLONG id = i->sysValue("id").toULongLong(); + listBox1->clear(); + listId.clear(); + role = i; + aUser *user = new aUser(i->db); + user->Select(); + if(user->First()) + { + do + { + if(!user->hasRole(id)) + { + listBox1->insertItem(user->sysValue("login").toString()); + listId.append(user->sysValue("id").toString()); + } + }while(user->Next()); + } + + +} + + +Q_ULLONG +dSelectUser::getData( ) +{ + return userId; +} + + +void dSelectUser::onSelect() +{ + if(listBox1->currentItem()!=-1) + { + printf("add user\n"); + + //emit( addRole(listId[listBox1->currentItem()].toULongLong()) ); + userId = listId[listBox1->currentItem()].toULongLong(); +printf("addUser()\n"); + role->addUser(userId); + printf("user added\n"); + listBox1->removeItem(listBox1->currentItem()); + accept(); + // new aListViewItem(p_item, + } + else + { + printf("not selected\n"); + } +} diff --git a/src/admin/dselectuser.h b/src/admin/dselectuser.h new file mode 100644 index 0000000..e4c7f3d --- /dev/null +++ b/src/admin/dselectuser.h @@ -0,0 +1,31 @@ +#ifndef DSELECTUSER_H +#define DSELECTUSER_H + +#include "ui_dselectuser.h" + +class dSelectUser : public QDialog, public Ui::dSelectUser +{ + Q_OBJECT + +public: + dSelectUser(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dSelectUser(); + +public slots: + virtual void setData( aRole * i ); + virtual Q_ULLONG getData(); + +protected slots: + virtual void languageChange(); + +private: + Q_ULLONG userId; + QStringList listId; + aRole *role; + +private slots: + virtual void onSelect(); + +}; + +#endif // DSELECTUSER_H diff --git a/src/admin/dselectuser.ui b/src/admin/dselectuser.ui new file mode 100644 index 0000000..9e7cd99 --- /dev/null +++ b/src/admin/dselectuser.ui @@ -0,0 +1,75 @@ + + + + + dSelectUser + + + + 0 + 0 + 602 + 348 + + + + Select user + + + + + + + New Item + + + + + + + + + + + + Select + + + + + + + + + + 20 + 200 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + qPixmapFromMimeSource + + mdtree.h + arole.h + + + + bSelect + clicked() + dSelectUser + onSelect() + + + diff --git a/src/admin/images/administrator-splash-en.png b/src/admin/images/administrator-splash-en.png new file mode 100644 index 0000000..5f1d49b Binary files /dev/null and b/src/admin/images/administrator-splash-en.png differ diff --git a/src/admin/images/administrator-splash-ru.png b/src/admin/images/administrator-splash-ru.png new file mode 100644 index 0000000..63d2009 Binary files /dev/null and b/src/admin/images/administrator-splash-ru.png differ diff --git a/src/admin/images/cat.png b/src/admin/images/cat.png new file mode 100644 index 0000000..3c1ae0f Binary files /dev/null and b/src/admin/images/cat.png differ diff --git a/src/admin/images/cat_g.png b/src/admin/images/cat_g.png new file mode 100644 index 0000000..9e6bc8e Binary files /dev/null and b/src/admin/images/cat_g.png differ diff --git a/src/admin/images/doc.png b/src/admin/images/doc.png new file mode 100644 index 0000000..61334f2 Binary files /dev/null and b/src/admin/images/doc.png differ diff --git a/src/admin/images/doc_g.png b/src/admin/images/doc_g.png new file mode 100644 index 0000000..fa0639b Binary files /dev/null and b/src/admin/images/doc_g.png differ diff --git a/src/admin/images/journ.png b/src/admin/images/journ.png new file mode 100644 index 0000000..4d92109 Binary files /dev/null and b/src/admin/images/journ.png differ diff --git a/src/admin/images/journ_g.png b/src/admin/images/journ_g.png new file mode 100644 index 0000000..8739e8d Binary files /dev/null and b/src/admin/images/journ_g.png differ diff --git a/src/admin/images/metadata.png b/src/admin/images/metadata.png new file mode 100644 index 0000000..b5c8949 Binary files /dev/null and b/src/admin/images/metadata.png differ diff --git a/src/admin/images/reg.png b/src/admin/images/reg.png new file mode 100644 index 0000000..bab93ce Binary files /dev/null and b/src/admin/images/reg.png differ diff --git a/src/admin/images/reg_g.png b/src/admin/images/reg_g.png new file mode 100644 index 0000000..da52b84 Binary files /dev/null and b/src/admin/images/reg_g.png differ diff --git a/src/admin/images/regs.png b/src/admin/images/regs.png new file mode 100644 index 0000000..cbc4419 Binary files /dev/null and b/src/admin/images/regs.png differ diff --git a/src/admin/images/report.png b/src/admin/images/report.png new file mode 100644 index 0000000..0c4bb0c Binary files /dev/null and b/src/admin/images/report.png differ diff --git a/src/admin/images/report_g.png b/src/admin/images/report_g.png new file mode 100644 index 0000000..04a49b1 Binary files /dev/null and b/src/admin/images/report_g.png differ diff --git a/src/admin/images/role.png b/src/admin/images/role.png new file mode 100644 index 0000000..eb4da7f Binary files /dev/null and b/src/admin/images/role.png differ diff --git a/src/admin/images/user.png b/src/admin/images/user.png new file mode 100644 index 0000000..ccb0df5 Binary files /dev/null and b/src/admin/images/user.png differ diff --git a/src/admin/images/users.png b/src/admin/images/users.png new file mode 100644 index 0000000..211f7a9 Binary files /dev/null and b/src/admin/images/users.png differ diff --git a/src/admin/main.cpp b/src/admin/main.cpp new file mode 100644 index 0000000..db9ae79 --- /dev/null +++ b/src/admin/main.cpp @@ -0,0 +1,165 @@ +/**************************************************************************** +** $Id: main.cpp,v 1.4 2008/12/05 21:11:54 leader Exp $ +** +** Main file of Ananas Administrator application +** +** Created : 20040823 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Engine application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include "mainform.h" +#include "ananas.h" + +//QApplication *application = 0; +//MainForm *mainform = 0; +//QTranslator *translator = 0, tr_app(0), tr_lib(0), tr_plugins(0); +QString lang="en", + rcfile="", + username="", + userpassword=""; + +int setTranslator(QString lang) +{ + QString langdir; +#ifdef _Windows + langdir = qApp->applicationDirPath()+"/"; +#else + langdir = "/usr/share/ananas/translations/"; +#endif +// tr_app.load( langdir+"ananas-administrator-"+lang+".qm","."); +// tr_lib.load( langdir+"ananas-lib-"+lang+".qm","."); +// tr_plugins.load( langdir+"ananas-plugins-"+lang+".qm","."); + return 0; +} + +int +parseCommandLine( int argc, char **argv ) +{ + QString param, name, value; + int i; + char *s, locale[50]="en"; + + strncpy( locale, QTextCodec::locale(), sizeof( locale ) ); + s = strchr( locale, '_' ); + if ( s ) { + *s = 0; + } + lang = locale; + setTranslator( lang ); +// printf("locale=%s\n", locale ); + QString str_ru=QString::null, str_en=QString::null; + bool lang_setted = false; + bool help_setted = false; + for ( i=1; iaddLibraryPath( qApp->applicationDirPath() ); + if ( parseCommandLine( argc, argv ) ) return 1; +// qApp->installTranslator( &tr_app ); +// qApp->installTranslator( &tr_lib ); +// qApp->installTranslator( &tr_plugins ); + pixmap = QPixmap(":/images/administrator-splash-"+lang+".png" ); + if ( pixmap.isNull() ) +#ifdef _Windows + pixmap = QPixmap( qApp->applicationDirPath()+"/administrator-splash-"+lang+".png" ); +#else + pixmap = QPixmap( "/usr/share/ananas/administrator/locale/administrator-splash-"+lang+".png" ); +#endif + if ( pixmap.isNull() ) pixmap = QPixmap(":/images/administrator-splash-en.png" ); + QSplashScreen *splash = new QSplashScreen( pixmap ); + if ( ananas_login( rcfile, username, userpassword, 0, AApplication::Administrator ) ){ + splash->show(); + splash->message( QObject::tr("Init application"), Qt::AlignBottom, Qt::white ); + MainForm *w = new MainForm( 0, "MainForm"); + //mainform = w; +// mainformws = mainform->ws; +// mainformwl = mainform->wl; + qApp->setMainWidget( w ); + w->rcfile = rcfile; +// printf( "rcfile = %s\n", rcfile.ascii() ); + w->show(); + ok = w->init(); + splash->clear(); + splash->finish( w ); + delete splash; + if ( ok ) { + a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); + rc = a.exec(); + } else { + QMessageBox::critical(0, "error","Error init Ananas engine"); + } + ananas_logout(); + return rc; + } else return 0; +} diff --git a/src/admin/mainform.cpp b/src/admin/mainform.cpp new file mode 100644 index 0000000..c981cad --- /dev/null +++ b/src/admin/mainform.cpp @@ -0,0 +1,131 @@ +#include "mainform.h" + +#include +#include +#include + +/* + * Constructs a MainForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +MainForm::MainForm(QWidget* parent, const char* name, Qt::WindowFlags fl) + : QMainWindow(parent, fl) +{ + setupUi(this); + setObjectName( name ); + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +MainForm::~MainForm() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void MainForm::languageChange() +{ + retranslateUi(this); +} + +#include "usersform.h" +#include "rolesform.h" + +void MainForm::fileNew() +{ + +} + + +void MainForm::fileOpen() +{ + +} + + +void MainForm::fileSave() +{ + +} + + +void MainForm::fileSaveAs() +{ + +} + + +void MainForm::filePrint() +{ + +} + + +void MainForm::fileExit() +{ + close(); +} + + +/*! + * Users functions. + */ +void MainForm::adminUsers() +{ + + + if( usersForm ) usersForm->show();//->isHidden()) + else { + usersForm = new UsersForm( this ); +// usersForm->init(db); +// usersForm->createTree(); + ws->addSubWindow( usersForm ); + usersForm->show(); + } +} + + + +bool MainForm::init() +{ + ws = new QMdiArea; + setCentralWidget( ws ); + db = aDatabase::database(); +// usersForm = new UsersForm; +// usersForm->hide(); +// rolesForm = new RolesForm; +// rolesForm->init(db); +// rolesForm->createTree(); +// rolesForm->hide(); +// ws->addSubWindow( usersForm ); +// ws->addSubWindow( rolesForm ); + QSqlTableModel *t = new QSqlTableModel( this, *db->db() ); + t->setTable( db_users ); + t->setEditStrategy(QSqlTableModel::OnFieldChange ); + t->select(); + QTableView *dt = new QTableView; + dt->setModel( t ); + ws->addSubWindow( dt ); + dt->show(); + return true; +} + + + +void MainForm::adminRoles() +{ + if ( rolesForm ) rolesForm->show(); + else { + rolesForm = new RolesForm( this ); +// rolesForm->init(db); +// rolesForm->createTree(); + ws->addSubWindow( rolesForm ); + } +} diff --git a/src/admin/mainform.h b/src/admin/mainform.h new file mode 100644 index 0000000..fd0660c --- /dev/null +++ b/src/admin/mainform.h @@ -0,0 +1,41 @@ +#ifndef MAINFORM_H +#define MAINFORM_H + +#include +#include + +#include "ui_mainform.h" + +class MainForm : public QMainWindow, public Ui::MainForm +{ + Q_OBJECT + +public: + MainForm(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~MainForm(); + + aWindowsList *wl; + QMdiArea *ws; + QString rcfile; + QPointer usersForm; + QPointer rolesForm; + aDatabase *db; + aCfg cfg; + +public slots: + virtual void fileNew(); + virtual void fileOpen(); + virtual void fileSave(); + virtual void fileSaveAs(); + virtual void filePrint(); + virtual void fileExit(); + virtual void adminUsers(); + virtual bool init(); + virtual void adminRoles(); + +protected slots: + virtual void languageChange(); + +}; + +#endif // MAINFORM_H diff --git a/src/admin/mainform.ui b/src/admin/mainform.ui new file mode 100644 index 0000000..926f17c --- /dev/null +++ b/src/admin/mainform.ui @@ -0,0 +1,127 @@ + + + + + MainForm + + + + 0 + 0 + 724 + 599 + + + + Ananas: Administrator + + + a-system.png + + + + + Tools + + + + + + + 0 + 0 + 724 + 28 + + + + + &File + + + + + + + + &Administrator + + + + + + + + + + fileExitAction + + + Exit + + + E&xit + + + + + + + + administratorUsersAction + + + &Users + + + &Users + + + + + administratorRolesAction + + + Roles + + + Roles + + + + + qPixmapFromMimeSource + + ananas.h + qworkspace.h + awindowslist.h + q3vbox.h + usersform.h + + + + fileExitAction + activated() + MainForm + fileExit() + + + administratorUsersAction + activated() + MainForm + adminUsers() + + + fileExitAction + activated() + MainForm + fileExit() + + + administratorRolesAction + activated() + MainForm + adminRoles() + + + diff --git a/src/admin/mdtree.cpp b/src/admin/mdtree.cpp new file mode 100644 index 0000000..62d8ded --- /dev/null +++ b/src/admin/mdtree.cpp @@ -0,0 +1,962 @@ +/**************************************************************************** +** $Id: mdtree.cpp,v 1.3 2008/12/05 21:11:54 leader Exp $ +** +** Code file of the Metadata Tree of Ananas Administrator applications +** +** Created : 20050609 +** +** Copyright (C) 2003-2005 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +#include +//#include + +#include "adatabase.h" +#include "mainform.h" +#include "deditpermissions.h" +#include "dselectuser.h" +#include "deditrole.h" +#include "dedituser.h" +#include "dselectrole.h" +//#include "deditcat.h" +//#include "deditireg.h" +//#include "deditareg.h" +//#include "deditjournal.h" +//#include "deditwebform.h" +//#include "deditcolumns.h" +#include "awindowslist.h" + +//#include "acfg.h" +#include "acfgrc.h" + +#include "mdtree.h" +#include "usersform.h" +#include "rolesform.h" + +//extern MainForm *mainform; +//extern QPixmap rcIcon(const char *name); +//extern void set_Icon(QListViewItem *item, const char *name); + + + +aListViewItem::aListViewItem( ananasListViewItem *parent, + ananasListViewItem *after, + aCfg *cfgmd, + aCfgItem cfgobj, + const QString &name, + aUser *usr, + aRole *rl + ): ananasListViewItem( parent, after, cfgmd, cfgobj, name ) +{ + adb = aDatabase::database(); + if(usr) + { +// printf("new user\n"); + user = new aUser(usr->db); + user->Select(usr->sysValue("id").toULongLong()); + } + else + { + user=NULL; + } +// user = usr; + if(rl) + { +// printf("new role\n"); + role = new aRole(rl->db); + role->Select(rl->sysValue("id").toULongLong()); + } + else + { + role=NULL; + } + loadTree(); +} + + + +aListViewItem::aListViewItem(QListView *parent, aCfg *cfgmd, aCfgItem cfgobj, const QString &name ) +: ananasListViewItem( parent, cfgmd, cfgobj, name ) +{ + adb = aDatabase::database(); + role=NULL; + user=NULL; + loadTree(); +} + + +aListViewItem::~aListViewItem() +{ + + if(role) + { +// printf("delete role\n"); + delete role; + role = NULL; + } + if(user) + { +// printf("delete user\n"); + delete user; + user = NULL; + } +} + + +QString +aListViewItem::text( int column ) const +{ + return Q3ListViewItem::text( column ); +// if ( obj.isNull() ) return QObject::tr("Unknown object context"); + if ( !id ) return Q3ListViewItem::text( column ); + switch ( column ) { + case 0: return md->attr( obj, mda_name ); + default: + return ""; + } +} + + + +int +aListViewItem::compare( Q3ListViewItem *i, int col, bool accending ) const +{ + int id1 = 0, id2 = 0; + aListViewItem *ai = (aListViewItem *) i; + id1 = md->order( obj ); + id2 = ai->md->order( ai->obj ); + if ( md == ai->md && md->parent( obj ) == ai->md->parent( ai->obj ) && col ==0 && accending ) { + if ( id1 < id2 ) return -1; + if ( id1 == id2 ) return 0; + return 1; + } + return 1; +} + + + +void +aListViewItem::setup() +{ + Q3ListViewItem::setup(); +} + + + +/*! +Update metadata tree for the object context. +*/ +void +aListViewItem::update() +{ + QString oclass = md->objClass( obj ); + printf("remove !\n"); + if( oclass == md_user ) + { + if(user->First()) + { + setText(0,user->sysValue("login").toString()); + } + } + if( oclass == md_role) + { + if(role->First()) + { + setText(0,role->sysValue("name").toString()); + } + + } + if( oclass == md_rl_user) + { + + } + if( oclass == md_rl_user) + { + + } + if( oclass == md_rl_user) + { + + } + if( oclass == md_rl_user) + { + + } + + +} + + +void +aListViewItem::loadTree() +{ +//printf("load tree\n"); + aListViewItem *item, *nextitem; + QString oclass, ldclass=""; + int i, n; + aCfgItem cobj; + + // clear tree +// item = (aListViewItem *) firstChild(); +// while( item ) { +// nextitem = (aListViewItem *) item->nextSibling(); +// delete item; +// item = nextitem; + // } + if ( !md ) return; + if (id) setRenameEnabled(0, true); + oclass = md->objClass( obj ); +// printf("oclass=`%s'\n",oclass.ascii()); + if ( oclass == md_roles ) + { + loadRoles(this); + + } + if ( oclass == md_role ) + { + cobj = md->find ( mdc_metadata ); +// cobj.setTagName("eqwe"); + new aListViewItem(this, getLastChild(), md, cobj, QObject::tr("Metadata Objects"),NULL,role ); + // cobj.clear(); + cobj = cobj.cloneNode(false).toElement(); + cobj.setTagName( md_rl_users ); // change type to users +// cobj.setTagName("eqwe"); + + aUser *usr = new aUser(adb); + new aListViewItem(this, getLastChild(), md, cobj, QObject::tr("Users"),usr,role); + } + if ( oclass == md_users ) + { + loadUsers(this); + } + if ( oclass == md_user ) + { + loadUsrRoles(this); + } + if ( oclass == md_metadata ) + { + cobj = md->find ( mdc_metadata ); + setPixmap(0, QPixmap(":/images/metadata.png")); + // setOpen(true); + cobj = md->find ( obj, md_catalogues, 0 ); + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Catalogues"),NULL,role ); + cobj = md->find ( obj, md_documents, 0 ); + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Documents"),NULL,role ); + cobj = md->find ( obj, md_reports, 0 ); + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Reports"),NULL,role ); + cobj = md->find ( obj, md_journals, 0 ); + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Journals"),NULL,role ); + cobj = md->find ( obj, md_iregisters, 0 ); + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Information registers"),NULL,role ); + cobj = md->find ( obj, md_aregisters, 0 ); + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Accumulation registers"),NULL,role ); + + } + if ( oclass == md_catalogues ){ + QPixmap pixmap = QPixmap(":/images/cat_g.png"); + if(pixmap.isNull()) printf("image not loaded\n"); + setPixmap(0, pixmap ); + ldclass = md_catalogue; + } + if ( oclass == md_documents ){ + setPixmap(0, QPixmap(":/images/doc_g.png")); + ldclass = md_document; + } + if ( oclass == md_reports ){ + setPixmap(0, QPixmap(":/images/report_g.png")); + ldclass = md_report; + } + if ( oclass == md_journals ){ + setPixmap(0, QPixmap(":/images/journ_g.png")); + ldclass = md_journal; + } + if ( oclass == md_iregisters ){ + setPixmap(0, QPixmap(":/images/reg_g.png")); + ldclass = md_iregister; + } + if ( oclass == md_aregisters ){ + setPixmap(0, QPixmap(":/images/regs_g.png")); + ldclass = md_aregister; + } + if ( oclass == md_rl_users ){ + setPixmap(0, QPixmap(":/images/users.png")); + loadRlUsers(this); + // ldclass = md_rl_user; + } + if ( oclass == md_users ){ + setPixmap(0, QPixmap(":/images/users.png")); + // ldclass = md_rl_user; + } + if ( oclass == md_roles ){ + setPixmap(0, QPixmap(":/images/roles.png")); + // ldclass = md_role; + } + if ( oclass == md_user || oclass == md_rl_user){ + setPixmap(0, QPixmap(":/images/user.png")); + // ldclass = md_document; + } + if ( oclass == md_role || oclass == md_usr_role){ + setPixmap(0, QPixmap(":/images/role.png")); + // ldclass = md_document; + } + if ( !ldclass.isEmpty() ) { + + if(ldclass==md_rl_user) + { + } +// printf("%s\n",(const char *) ldclass.local8Bit() ); + n = md->count( obj, ldclass ); +// printf(" objclass=%s ldclass = %s count = %d\n", (const char *) oclass, (const char *) ldclass, n); + for ( i = 0; ifind( obj, ldclass, i ); + if ( !cobj.isNull() ) { +// printf("%d ok\n", i); +// new aListViewItem( this, md, md->find( obj, ldclass, i ), QString::null ); + new aListViewItem( this, getLastChild(), md, cobj, QString::null, NULL ,role ); + } + } + } + + +// elements +} + + +void +aListViewItem::loadUsrRoles ( aListViewItem *parent ) +{ + QValueList list = user->getRoles(true); + aCfgItem cobj; + //listId.clear(); +// QValueList list = user->getRoles(false); + QValueList::iterator it; + for ( it = list.begin(); it != list.end(); ++it ) + { + cobj = md->find ( mdc_metadata ); + cobj = cobj.cloneNode(false).toElement(); + cobj.setTagName( md_usr_role ); // change type to users + new aListViewItem(parent, getLastChild(), md, cobj, (*it)->sysValue("name").toString(),user,(*it)); +// listBox1->insertItem( (*it)->sysValue("name").toString() ); + delete (*it); + } +} + + + +void +aListViewItem::loadRoles (aListViewItem *parent) +{ + aCfgItem cobj; + if( adb ) + { + role = new aRole( adb ); + + cobj = md->find ( mdc_metadata ); + cobj = cobj.cloneNode(false).toElement(); + cobj.setTagName( md_role ); // change type to users + role->Select(); + if(role->First()) + { +// printf("role first!!!\n"); + do + { +// printf("role next\n"); + new aListViewItem(parent, getLastChild(), md, cobj, role->sysValue("name").toString(),NULL,role); + }while(role->Next()); + } + } +} + + + +void +aListViewItem::loadUsers (aListViewItem *parent) +{ + aCfgItem cobj; + if( adb ) + { + user = new aUser(adb); + + cobj = md->find ( mdc_metadata ); + cobj = cobj.cloneNode(false).toElement(); + cobj.setTagName( md_user ); // change type to role + user->Select(); + if(user->First()) + { +// printf("user first!!!\n"); + do + { +// printf("user next\n"); + new aListViewItem(parent, getLastChild(), md, cobj, user->sysValue("login").toString(),user); + + }while(user->Next()); + } + } +} + + + +void +aListViewItem::loadRlUsers ( aListViewItem *parent ) +{ +//printf("load users!\n"); +// aUser *usr = new aUser(adb); + if(!user) + { + printf("user=NULL\n"); + return; + } + + //user->Select(); + aCfgItem l; + l = md->find( mdc_metadata ); + l = l.cloneNode(false).toElement(); + l.setTagName(md_rl_user); + user->Select(); + if(user->First()) + { +// printf("user first\n"); + do + { + if(role->hasUser(user->sysValue("id").toULongLong())) + { + new aListViewItem(parent, getLastChild(),md, l, user->sysValue("login").toString(),user,role); + } +// printf("user next\n"); + }while (user->Next()); + } +// printf("end\n"); +} + + + +void +aListViewItem::deleteRole () +{ + printf("delete role!\n"); + role->Delete(); +// removeItem(this); +} + + + +void +aListViewItem::deleteUser () +{ + printf("delete user!\n"); + user->Delete(); +// removeItem(this); +} + + + +void +aListViewItem::remove () +{ + QString oclass = md->objClass( obj ); + printf("remove !\n"); + if( oclass == md_usr_role ) + { + user->delRole(role->sysValue("id").toULongLong()); + } + if( oclass == md_rl_user) + { + role->delUser(user->sysValue("id").toULongLong()); + } +// removeItem(this); +} + + +/* +*edit selected object +*/ + + + +void +aListViewItem::editRole( bool isNew) +{ + QString oclass = md->objClass( obj ); + if(oclass == md_role || oclass == md_roles ) + { + dEditRole *e = new dEditRole( qApp->mainWidget()); + // wl->insert( objid, e ); + editor = e; + // QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + if(isNew) + { + printf("new role\n"); + e->setData("New Role"); + } + else + { + printf("edit role `%s'\n",role->sysValue("name").toString().ascii()); + e->setData(role->sysValue("name").toString()); + } + if(e->exec() == QDialog::Accepted) + { + if(isNew) + { + role->New(e->getData()); + aCfgItem l; + l = md->find( mdc_metadata ); + l = l.cloneNode(false).toElement(); + l.setTagName(md_role); + new aListViewItem(this,getLastChild(),md,l,role->sysValue("name").toString(),NULL,role); + role->Select(); + } + else + { + role->setSysValue("name",e->getData()); + role->Update(); + setText(0,e->getData()); + } + } + delete e; + } +} + + + +void +aListViewItem::editPermission() +{ + QString oclass = md->objClass( obj ); + dEditPermissions *e = new dEditPermissions( qApp->mainWidget()); +// wl->insert( objid, e ); + editor = e; + + int role_id, obj_id; + role_id = role->sysValue ( "id" ).toULongLong(); + obj_id = md->id( obj ); + printf("role = %i, obj=%i id=%i\n", role_id, obj_id, id ); + int perm = adb->rolePermission( role_id, obj_id ); + + e->setData ( perm ); + if ( e->exec() == QDialog::Accepted ) + { + perm = e->getData (); + adb->setRolePermission( role_id, obj_id, perm ); + } + delete e; + +// QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); +/* QMap m; + m [perm_read] = true; + m [perm_execute] = false; + m [perm_turn_on] = false; + m [perm_turn_off] = false; + m [perm_create] = false; + m [perm_delete] = false; + + e->setData( m ); + if(e->exec() == QDialog::Accepted) + { + e->getData( m ); + //TODO: add logic here! + } + delete e; +*/ +// mainform->addTab(++mainform->lastTabId,e->name()); +// e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), +// e->parentWidget()->frameSize().height()); + +// printf("oclass = %s\n",( const char *) oclass ); + //if ( oclass == md_documents ) newDocument(); +// if ( oclass == md_columns ) newColumn(); +} + + + +void +aListViewItem::editUser(bool isNew) +{ + QString oclass = md->objClass( obj ); + if ( oclass == md_users || oclass == md_user) + { + + dEditUser *e = new dEditUser( qApp->mainWidget() ); + editor = e; + e->setData( user, isNew ); + if(e->exec()==QDialog::Accepted) + { + if(isNew) + { + aCfgItem l; + l = md->find( mdc_metadata ); + l = l.cloneNode(false).toElement(); + l.setTagName(md_user); + new aListViewItem(this,getLastChild(),md,l,user->sysValue("login").toString(),user,NULL); + user->Select(); + } + else + { + update(); + } + } + delete e; + + } +} + + + +void +aListViewItem::addUser() +{ + QString oclass = md->objClass( obj ); + if ( oclass == md_rl_users) + { + + dSelectUser *e = new dSelectUser( qApp->mainWidget() ); + editor = e; + e->setData( role ); + if(e->exec() == QDialog::Accepted) + { + aCfgItem l; + l = md->find( mdc_metadata ); + l = l.cloneNode(false).toElement(); + l.setTagName(md_rl_user); + aUser *usr = new aUser(e->getData(),role->db); + new aListViewItem(this,getLastChild(),md,l,usr->sysValue("login").toString(),usr,role); + delete usr; + usr = NULL; + } + delete e; + + } +} + + + +void +aListViewItem::addRole() +{ + QString oclass = md->objClass( obj ); + if ( oclass == md_user) + { + + dSelectRole *e = new dSelectRole( qApp->mainWidget() ); + editor = e; + e->setData( user ); + if(e->exec() == QDialog::Accepted) + { + aCfgItem l; + l = md->find( mdc_metadata ); + l = l.cloneNode(false).toElement(); + l.setTagName(md_usr_role); + aRole *rl = new aRole(e->getData(),user->db); + new aListViewItem(this,getLastChild(),md,l,rl->sysValue("name").toString(),user,rl); + delete rl; + rl = NULL; + } + delete e; + + } +} + + + +aMetadataTreeView::aMetadataTreeView( QWidget *parent, aCfg *cfgmd ) +:ananasTreeView( parent, cfgmd ) +{ + aListViewItem *conf; + + if ( !md ) return; + +// aCfgItem it = md->find( mdc_metadata ); +// it = it.cloneNode(false).toElement(); +// it.setTagName(md_roles); + +// conf = new aListViewItem( this, md, it, tr(QString("Roles"))); +// conf->setOpen( TRUE ); + connect( this, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), this, SLOT(ContextMenu() ) ); +// connect( this, SIGNAL( returnPressed( QListViewItem* ) ), this, SLOT( itemEdit() ) ); +// connect( this, SIGNAL( doubleClicked( QListViewItem* ) ), this, SLOT( itemEdit() ) ); +// connect( this, SIGNAL( collapsed( QListViewItem* ) ), this, SLOT( on_collapsed( QListViewItem* ) ) ); +} + + +aMetadataTreeView::aMetadataTreeView( UsersForm *parent, aCfg *cfgmd ) +:ananasTreeView( parent, cfgmd ) +{ + aListViewItem *conf; + + if ( !md ) return; + + aCfgItem it = md->find( mdc_metadata ); + it = it.cloneNode(false).toElement(); + it.setTagName(md_users); + + conf = new aListViewItem( this, md, it, tr(QString("Users"))); + conf->setOpen( TRUE ); + connect( this, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), this, SLOT(ContextMenu() ) ); +// connect( this, SIGNAL( doubleClicked( QListViewItem* ) ), this, SLOT( itemEdit() ) ); + connect( this, SIGNAL( collapsed( QListViewItem* ) ), this, SLOT( on_collapsed( QListViewItem* ) ) ); +} + + +aMetadataTreeView::aMetadataTreeView( RolesForm *parent, aCfg *cfgmd ) +:ananasTreeView( parent, cfgmd ) +{ + aListViewItem *conf; + + if ( !md ) return; + + aCfgItem it = md->find( mdc_metadata ); + it = it.cloneNode(false).toElement(); + it.setTagName(md_roles); + + conf = new aListViewItem( this, md, it, tr(QString("Roles"))); + conf->setOpen( TRUE ); + connect( this, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), this, SLOT(ContextMenu() ) ); +// connect( this, SIGNAL( returnPressed( QListViewItem* ) ), this, SLOT( itemEdit() ) ); +// connect( this, SIGNAL( doubleClicked( QListViewItem* ) ), this, SLOT( itemEdit() ) ); + connect( this, SIGNAL( collapsed( Q3ListViewItem* ) ), this, SLOT( on_collapsed( Q3ListViewItem* ) ) ); +} + + + +void +aMetadataTreeView::on_collapsed( Q3ListViewItem * item ) +{ + aListViewItem *i = (aListViewItem *) item; + if ( i ) + { + QString oclass = md->objClass( i->obj ); + if ( oclass == md_roles ) setOpen( i, true ); + } +} + + +void +aMetadataTreeView::ContextMenu() +{ + + QPopupMenu *m=new QPopupMenu( this, "PopupMenu" ); + Q_CHECK_PTR(m); + +/* QLabel *caption = new QLabel( "" + "Context Menu", this ); + caption->setAlignment( Qt::AlignCenter ); + m->insertItem( caption ); + m->insertItem( "&New", this, SLOT( itemNew() ), CTRL+Key_N ); + m->insertItem( "&Rename", this, SLOT( itemRename() ), CTRL+Key_O); + m->insertItem( "&Edit", this, SLOT( itemEdit() ), CTRL+Key_N ); + m->insertItem( "&Delete", this, SLOT( itemDelete() ), CTRL+Key_O );*/ + + aListViewItem *i = (aListViewItem *) selectedItem(); + if(!i) return; + + QLabel *caption = new QLabel( tr("" "Context Menu"), this ); + caption->setAlignment( Qt::AlignCenter ); +// m->insertItem( caption ); + + QString oclass = md->objClass(i->obj); + printf("popup oclass==`%s'\n",oclass.ascii()); + + if(oclass == md_user) + { + + m->insertItem( tr("&Add Role"), this, SLOT( addRole() ), Qt::CTRL+Qt::Key_A ); + } + if(oclass == md_roles) + { + m->insertItem( tr("&New Role"), this, SLOT( newRole() ), Qt::CTRL+Qt::Key_N ); + } + if( oclass == md_role) + { + + m->insertItem( tr("&Edit Role"), this, SLOT( editRole() ), Qt::CTRL+Qt::Key_E ); + m->insertItem( tr("&Delete Role"), this, SLOT( delRole() ), Qt::CTRL+Qt::Key_D ); + } + + if(oclass==md_rl_users) + { + m->insertItem( tr("&Add User"), this, SLOT( addUser() ), Qt::CTRL+Qt::Key_A ); + } + if(oclass==md_users ) + { + m->insertItem( tr("&New User"), this, SLOT( newUser() ), Qt::CTRL+Qt::Key_N ); + } + + if(oclass==md_user) + { + m->insertItem( tr("&Edit User "), this, SLOT( editUser() ), Qt::CTRL+Qt::Key_E ); + m->insertItem( tr("&Delete User"), this, SLOT( delUser() ), Qt::CTRL+Qt::Key_D ); + } + if(oclass==md_usr_role || oclass==md_rl_user) + { + m->insertItem( tr("&Remove"), this, SLOT( itemDelete() ), Qt::CTRL+Qt::Key_R ); + } + if( oclass == md_catalogue + || oclass == md_document + || oclass == md_journal + || oclass == md_aregister + || oclass == md_iregister + || oclass == md_report ) + { + m->insertItem( tr("&Set permissions"), this, SLOT( itemSetPermission() ), Qt::CTRL+Qt::Key_S ); + } + + ContextMenuAdd(m); +// m->insertItem( tr("&New"), this, SLOT( itemNew() ), CTRL+Key_N ); + m->exec( QCursor::pos() ); + delete m; +} + + +/*void +aMetadataTreeView::itemRename() +{ + renameItem(); +} +*/ +void +aMetadataTreeView::newUser() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->editUser(true); + } +} + +void +aMetadataTreeView::newRole() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->editRole(true); + } +} + +void +aMetadataTreeView::editUser() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->editUser(false); +// emit (updateRoles()); + } +} + +void +aMetadataTreeView::editRole() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->editRole(false); + + //emit(updateUsers()); + } +} + +void +aMetadataTreeView::delRole() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->deleteRole(); + delete i; + //emit(updateUsers()); + } +} +void +aMetadataTreeView::delUser() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->deleteUser(); + delete i; + //emit (updateRoles()); + } +} + +void +aMetadataTreeView::addRole() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->addRole(); + //i->update(); + //emit(updateUsers()); + //emit (updateRoles()); + } +} +void +aMetadataTreeView::addUser() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->addUser(); + //i->update(); + //emit (updateRoles()); + } +} + +void +aMetadataTreeView::itemSetPermission() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + //if ( i->id == 0 ) + i->editPermission(); + } +} + + +void +aMetadataTreeView::itemDelete() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->remove(); + delete i; + } +// deleteItem(); +} + + + diff --git a/src/admin/mdtree.h b/src/admin/mdtree.h new file mode 100644 index 0000000..a5b3b6a --- /dev/null +++ b/src/admin/mdtree.h @@ -0,0 +1,158 @@ +/**************************************************************************** +** $Id: mdtree.h,v 1.3 2008/12/05 21:11:54 leader Exp $ +** +** Header file of the Metadata Tree of Ananas Administrator applications +** +** Created : 20050609 +** +** Copyright (C) 2003-2005 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef MDTREE_H +#define MDTREE_H +#include +//#include +//#include +#include "acfg.h" +#include "atreeitems.h" +#include "auser.h" +#include "arole.h" + +#define QIntDict Q3IntDict +#define QValueList Q3ValueList + +//#include "usersform.h" +//#include "rolesform.h" + +//extern aFormDesigner *formdesigner; +//#include "cfg.h" +class QWidget; +class UsersForm; +class RolesForm; + +class aListViewItem : public ananasListViewItem +{ + +public: +/* int id; + aCfgItem obj; + QWidget *editor; + aCfg *md; +*/ + aDatabase *adb; + + aListViewItem( ananasListViewItem *parent, + ananasListViewItem *after, + aCfg * cfgmd, + aCfgItem cfgobj, + const QString &name = QString::null, + aUser *usr = NULL, + aRole *rl = NULL); +// aListViewItem(QListViewItem *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + aListViewItem( QListView *parent, + aCfg * cfgmd, + aCfgItem obj, + const QString &name = QString::null); + + ~aListViewItem(); + QString text( int column ) const; + + aUser *user; + aRole *role; + + void loadTree(); + void setup(); + void update(); + void deleteUser(); + void deleteRole(); + void editUser(bool isNew); + void editRole(bool isNew); + void addUser(); + void addRole(); + void remove(); + + void editPermission(); +// void newDocument(); +// void newCatalogue(); +// void newJournal(); +// void newIRegister(); +// void newARegister(); +// void newReport(); +// void newForm(); +// void newWebForm(); +// void newTable(); + void newColumn(); + +protected: +// virtual void okRename( int col ); + virtual int compare( Q3ListViewItem *i, int col, bool accending ) const; +private: +// void loadDocument (); +// void loadJournal (); +// void loadIRegister (); +// void loadARegister (); +// void loadCatalogue (); +// void loadReport (); + void loadRoles (aListViewItem *a); + void loadUsers ( aListViewItem *a ); + void loadRlUsers ( aListViewItem *a ); + void loadUsrRoles (aListViewItem *a); +// void loadForms (aListViewItem *parent); +// void loadWebForms (aListViewItem *parent); +// void loadColumns ( aListViewItem *parent ); +}; + + +class aMetadataTreeView : public ananasTreeView +{ + Q_OBJECT +public: +// aCfg *md; + + aMetadataTreeView( QWidget *parent, aCfg *cfgmd ); + aMetadataTreeView( UsersForm *parent, aCfg *cfgmd ); + aMetadataTreeView( RolesForm *parent, aCfg *cfgmd ); + +signals: + void updateUsers(); + void updateRoles(); + +public slots: + void ContextMenu(); + void newUser(); + void editUser(); + void delUser(); + void addUser(); + void newRole(); + void editRole(); + void delRole(); + void addRole(); + + void itemDelete(); + void itemSetPermission(); +private slots: + void on_collapsed( Q3ListViewItem *item ); +private: + QIntDict editors; +}; + +#endif diff --git a/src/admin/rolesform.cpp b/src/admin/rolesform.cpp new file mode 100644 index 0000000..51f0d3c --- /dev/null +++ b/src/admin/rolesform.cpp @@ -0,0 +1,36 @@ +#include "rolesform.h" + +#include +#include +#include + +/* + * Constructs a RolesForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +RolesForm::RolesForm(QWidget* parent, const char* name, Qt::WindowFlags fl) + : QWidget(parent, name, fl) +{ + setupUi(this); + new QVBoxLayout( this ); + mdtree = new aMetadataTreeView( this, &aDatabase::database()->cfg ); // metadata tree creation + mdtree->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); + layout()->add( mdtree ); + updateGeometry(); +} + +/* + * Destroys the object and frees any allocated resources + */ +RolesForm::~RolesForm() +{ +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void RolesForm::languageChange() +{ + retranslateUi(this); +} diff --git a/src/admin/rolesform.h b/src/admin/rolesform.h new file mode 100644 index 0000000..b05f0a4 --- /dev/null +++ b/src/admin/rolesform.h @@ -0,0 +1,26 @@ +#ifndef ROLESFORM_H +#define ROLESFORM_H + +#include "ui_rolesform.h" + +class RolesForm : public QWidget, public Ui::RolesForm +{ + Q_OBJECT + +public: + RolesForm(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = 0); + ~RolesForm(); + + QString rcfile; + aMetadataTreeView *mdtree; +// aCfg *cfg; + +signals: + void updateUsers(); + +protected slots: + virtual void languageChange(); + +}; + +#endif // ROLESFORM_H diff --git a/src/admin/rolesform.ui b/src/admin/rolesform.ui new file mode 100644 index 0000000..009b5b3 --- /dev/null +++ b/src/admin/rolesform.ui @@ -0,0 +1,26 @@ + + + + + RolesForm + + + + 0 + 0 + 398 + 400 + + + + Ananas: Roles + + + + + qPixmapFromMimeSource + + mdtree.h + acfg.h + + diff --git a/src/admin/usersform.cpp b/src/admin/usersform.cpp new file mode 100644 index 0000000..c5f36c0 --- /dev/null +++ b/src/admin/usersform.cpp @@ -0,0 +1,39 @@ +#include "usersform.h" + +#include +#include +#include + +/* + * Constructs a UsersForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +UsersForm::UsersForm(QWidget* parent, Qt::WindowFlags fl) + : QWidget(parent, fl) +{ + setupUi(this); + new QVBoxLayout( this ); + mdtree = new aMetadataTreeView( this, &aDatabase::database()->cfg ); // metadata tree creation + mdtree->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); + layout()->add( mdtree ); + updateGeometry(); +} + +/* + * Destroys the object and frees any allocated resources + */ +UsersForm::~UsersForm() +{ + +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void UsersForm::languageChange() +{ + retranslateUi(this); +} + + diff --git a/src/admin/usersform.h b/src/admin/usersform.h new file mode 100644 index 0000000..24ebec8 --- /dev/null +++ b/src/admin/usersform.h @@ -0,0 +1,28 @@ +#ifndef USERSFORM_H +#define USERSFORM_H +#include + +#include "ui_usersform.h" + +class UsersForm : public QWidget, public Ui::UsersForm +{ + Q_OBJECT + +public: + UsersForm(QWidget* parent = 0, Qt::WindowFlags fl = 0); + ~UsersForm(); + +signals: + void updateRoles(); + +protected: + aCfg *cfg; + QPointer mdtree; + QString rcfile; + +protected slots: + virtual void languageChange(); + +}; + +#endif // USERSFORM_H diff --git a/src/admin/usersform.ui b/src/admin/usersform.ui new file mode 100644 index 0000000..da45988 --- /dev/null +++ b/src/admin/usersform.ui @@ -0,0 +1,24 @@ + + UsersForm + + + + 0 + 0 + 330 + 291 + + + + Ananas: Users + + + + qPixmapFromMimeSource + + mdtree.h + acfg.h + + + + diff --git a/src/ananas.pri b/src/ananas.pri new file mode 100644 index 0000000..fbf64d0 --- /dev/null +++ b/src/ananas.pri @@ -0,0 +1,24 @@ +#QMAKE_CLEAN += $(TARGET) Makefile +CONFIG += qt warn_on release thread +#LANGUAGE = C++ + +QT += qt3support sql xml +CONFIG += warn_on designer + +unix { + UI_DIR = .ui + MOC_DIR = .moc + OBJECTS_DIR = .obj + INCLUDEPATH +=.ui ../lib ../../lib ../../plugins ../plugins ../lib/.ui ../../lib/.ui +} +win32 { + UI_DIR = tmp\ui + MOC_DIR = tmp\moc + OBJECTS_DIR = obj + debug:CONFIG += console + INCLUDEPATH +=tmp\ui ..\lib ..\..\lib ..\..\plugins ..\lib\tmp\ui ..\..\lib\tmp\ui ..\plugins + INCLUDEPATH += ..\..\plugins +# LIBS += -L..\..\plugins -lananasplugin +} + +INCLUDEPATH +=$(QTDIR)/include/qdataschema diff --git a/src/ananas/ananas.pro b/src/ananas/ananas.pro new file mode 100644 index 0000000..0571384 --- /dev/null +++ b/src/ananas/ananas.pro @@ -0,0 +1,46 @@ +include (../plugins/plugins.pri) +include (../lib/lib.pri) +include (../ananas.pri) +load(qsa) + +TARGET = ananas4 +TEMPLATE = app + +DESTDIR = ../../bin + +INCLUDEPATH += ../lib ../../tmp/ui/ananas ../plugins +LIBS += -L../../lib -lananas4 -L../../lib/designer -lananasplugin4 -lqt4-qdataschema +#-L$(QTDIR)/lib -lqsa1 +#LIBS += -L$(QTDIR)/lib -lqsa1 -L../lib -lananas -L../plugins -lananasplugin # -lqui + +#MOC_DIR = ../../tmp/moc/$$TARGET +#OBJECTS_DIR = ../../tmp/obj/$$TARGET +#UI_DIR = ../../tmp/ui/$$TARGET + + +HEADERS = \ + mainform.h + +SOURCES = \ + main.cpp \ + mainform.cpp + +#FORMS = qadocjournal.ui + +RESOURCE = \ + ananas.qrc + +TRANSLATIONS = \ + ../../translations/ananas-engine-en.ts \ + ../../translations/ananas-engine-ru.ts + +unix { + ananas.path = $(BINDIR) + ananas.files = ananas4 +} +win32{ +# ananas.path =. +# ananas.extra = CALL create_base.bat +} + +#INSTALLS += ananas diff --git a/src/ananas/ananas.qrc b/src/ananas/ananas.qrc new file mode 100644 index 0000000..8e02144 --- /dev/null +++ b/src/ananas/ananas.qrc @@ -0,0 +1,34 @@ + + + images/a-system.png + images/cat.png + images/d_document_turned.png + images/document_turned.png + images/editdelete.png + images/editdelete2.png + images/engine-splash-en.png + images/engine-splash-ru.png + images/field.png + images/field2.png + images/group.png + images/group2.png + images/lib_database.png + images/lib_dbgroup.png + images/msg_error.png + images/msg_fatal.png + images/msg_info.png + images/msg_warning.png + images/object_markdeleted.png + images/t_cat_e.png + images/t_cat_ed.png + images/t_cat_g.png + images/t_cat_gd.png + images/t_doc.png + images/t_doc_d.png + images/t_doc_m.png + images/t_doc_t.png + images/t_doc_tm.png + images/t_doc_to.png + images/t_doc_tom.png + + diff --git a/src/ananas/bkground.jpg b/src/ananas/bkground.jpg new file mode 100644 index 0000000..06a9ee8 Binary files /dev/null and b/src/ananas/bkground.jpg differ diff --git a/src/ananas/images/a-system.png b/src/ananas/images/a-system.png new file mode 100644 index 0000000..6638dff Binary files /dev/null and b/src/ananas/images/a-system.png differ diff --git a/src/ananas/images/cat.png b/src/ananas/images/cat.png new file mode 100644 index 0000000..3c1ae0f Binary files /dev/null and b/src/ananas/images/cat.png differ diff --git a/src/ananas/images/d_document_turned.png b/src/ananas/images/d_document_turned.png new file mode 100644 index 0000000..dd4b1d3 Binary files /dev/null and b/src/ananas/images/d_document_turned.png differ diff --git a/src/ananas/images/document_turned.png b/src/ananas/images/document_turned.png new file mode 100644 index 0000000..101ac7d Binary files /dev/null and b/src/ananas/images/document_turned.png differ diff --git a/src/ananas/images/editdelete.png b/src/ananas/images/editdelete.png new file mode 100644 index 0000000..feb3242 Binary files /dev/null and b/src/ananas/images/editdelete.png differ diff --git a/src/ananas/images/editdelete2.png b/src/ananas/images/editdelete2.png new file mode 100644 index 0000000..7ef9058 Binary files /dev/null and b/src/ananas/images/editdelete2.png differ diff --git a/src/ananas/images/engine-splash-en.png b/src/ananas/images/engine-splash-en.png new file mode 100644 index 0000000..af654ed Binary files /dev/null and b/src/ananas/images/engine-splash-en.png differ diff --git a/src/ananas/images/engine-splash-ru.png b/src/ananas/images/engine-splash-ru.png new file mode 100644 index 0000000..9d7cf5b Binary files /dev/null and b/src/ananas/images/engine-splash-ru.png differ diff --git a/src/ananas/images/field.png b/src/ananas/images/field.png new file mode 100644 index 0000000..efa2405 Binary files /dev/null and b/src/ananas/images/field.png differ diff --git a/src/ananas/images/field2.png b/src/ananas/images/field2.png new file mode 100644 index 0000000..4d0d9db Binary files /dev/null and b/src/ananas/images/field2.png differ diff --git a/src/ananas/images/group.png b/src/ananas/images/group.png new file mode 100644 index 0000000..52d6fda Binary files /dev/null and b/src/ananas/images/group.png differ diff --git a/src/ananas/images/group2.png b/src/ananas/images/group2.png new file mode 100644 index 0000000..5c6e955 Binary files /dev/null and b/src/ananas/images/group2.png differ diff --git a/src/ananas/images/lib_database.png b/src/ananas/images/lib_database.png new file mode 100644 index 0000000..5f6aad3 Binary files /dev/null and b/src/ananas/images/lib_database.png differ diff --git a/src/ananas/images/lib_dbgroup.png b/src/ananas/images/lib_dbgroup.png new file mode 100644 index 0000000..3005290 Binary files /dev/null and b/src/ananas/images/lib_dbgroup.png differ diff --git a/src/ananas/images/msg_error.png b/src/ananas/images/msg_error.png new file mode 100644 index 0000000..901b8b6 Binary files /dev/null and b/src/ananas/images/msg_error.png differ diff --git a/src/ananas/images/msg_fatal.png b/src/ananas/images/msg_fatal.png new file mode 100644 index 0000000..901b8b6 Binary files /dev/null and b/src/ananas/images/msg_fatal.png differ diff --git a/src/ananas/images/msg_info.png b/src/ananas/images/msg_info.png new file mode 100644 index 0000000..f3c275f Binary files /dev/null and b/src/ananas/images/msg_info.png differ diff --git a/src/ananas/images/msg_warning.png b/src/ananas/images/msg_warning.png new file mode 100644 index 0000000..901b8b6 Binary files /dev/null and b/src/ananas/images/msg_warning.png differ diff --git a/src/ananas/images/object_markdeleted.png b/src/ananas/images/object_markdeleted.png new file mode 100644 index 0000000..feb3242 Binary files /dev/null and b/src/ananas/images/object_markdeleted.png differ diff --git a/src/ananas/images/t_cat_e.png b/src/ananas/images/t_cat_e.png new file mode 100644 index 0000000..1c93745 Binary files /dev/null and b/src/ananas/images/t_cat_e.png differ diff --git a/src/ananas/images/t_cat_ed.png b/src/ananas/images/t_cat_ed.png new file mode 100644 index 0000000..64ddd63 Binary files /dev/null and b/src/ananas/images/t_cat_ed.png differ diff --git a/src/ananas/images/t_cat_g.png b/src/ananas/images/t_cat_g.png new file mode 100644 index 0000000..99e052e Binary files /dev/null and b/src/ananas/images/t_cat_g.png differ diff --git a/src/ananas/images/t_cat_gd.png b/src/ananas/images/t_cat_gd.png new file mode 100644 index 0000000..c69799c Binary files /dev/null and b/src/ananas/images/t_cat_gd.png differ diff --git a/src/ananas/images/t_doc.png b/src/ananas/images/t_doc.png new file mode 100644 index 0000000..6b3b0da Binary files /dev/null and b/src/ananas/images/t_doc.png differ diff --git a/src/ananas/images/t_doc_d.png b/src/ananas/images/t_doc_d.png new file mode 100644 index 0000000..1eea2f2 Binary files /dev/null and b/src/ananas/images/t_doc_d.png differ diff --git a/src/ananas/images/t_doc_m.png b/src/ananas/images/t_doc_m.png new file mode 100644 index 0000000..69ad25e Binary files /dev/null and b/src/ananas/images/t_doc_m.png differ diff --git a/src/ananas/images/t_doc_t.png b/src/ananas/images/t_doc_t.png new file mode 100644 index 0000000..fda5f3e Binary files /dev/null and b/src/ananas/images/t_doc_t.png differ diff --git a/src/ananas/images/t_doc_tm.png b/src/ananas/images/t_doc_tm.png new file mode 100644 index 0000000..b8dd0cb Binary files /dev/null and b/src/ananas/images/t_doc_tm.png differ diff --git a/src/ananas/images/t_doc_to.png b/src/ananas/images/t_doc_to.png new file mode 100644 index 0000000..dd4b1d3 Binary files /dev/null and b/src/ananas/images/t_doc_to.png differ diff --git a/src/ananas/images/t_doc_tom.png b/src/ananas/images/t_doc_tom.png new file mode 100644 index 0000000..32596cd Binary files /dev/null and b/src/ananas/images/t_doc_tom.png differ diff --git a/src/ananas/main.cpp b/src/ananas/main.cpp new file mode 100644 index 0000000..84b0b96 --- /dev/null +++ b/src/ananas/main.cpp @@ -0,0 +1,198 @@ +/**************************************************************************** +** $Id: main.cpp,v 1.5 2008/12/10 21:05:14 leader Exp $ +** +** Main file of Ananas Engine application +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Engine application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include "mainform.h" +#include "dselectdb.h" +#include "dlogin.h" +#include "ananas.h" +#include "alog.h" +#include "aextensionfactory.h" + +//QApplication *application = 0; +QTranslator *translator = 0, tr_app(0), tr_lib(0), tr_plugins(0); +QString lang="en", + rcfile="", + username="", + userpassword=""; + +int setTranslator(QString lang) +{ + QString langdir; +#ifdef _Windows + langdir = qApp->applicationDirPath()+"/translations/"; +#else + langdir = "/usr/share/ananas/translations/"; +#endif + tr_app.load( langdir+"ananas-engine-"+lang.lower()+".qm","."); + tr_lib.load( langdir+"ananas-lib-"+lang.lower()+".qm","."); + tr_plugins.load( langdir+"ananas-plugins-"+lang.lower()+".qm","."); + return 0; +} + +int +parseCommandLine( int argc, char **argv ) +{ + QString param, name, value; + int i; + char *s, locale[50]="ru"; + + strncpy( locale, QTextCodec::locale(), sizeof( locale ) ); + s = strchr( locale, '_' ); + if ( s ) { + *s = 0; + } + lang = locale; + setTranslator( lang ); +// printf("locale=%s\n", locale ); + QString str_ru=QString::null, str_en=QString::null; + bool lang_setted = false; + bool help_setted = false; + for ( i=1; iargc(), qApp->argv() ) ) return 1; + qApp->installTranslator( &tr_app ); + qApp->installTranslator( &tr_lib ); + qApp->installTranslator( &tr_plugins ); + //--pixmap = QPixmap::fromMimeSource( "engine-splash-"+lang+".png" ); + pixmap = QPixmap( ":/images/engine-splash-"+lang+".png" ); + if ( pixmap.isNull() ) +#ifdef Q_OS_WIN32 + pixmap = QPixmap( qApp->applicationDirPath()+"/engine-splash-"+lang+".png" ); + qApp->addLibraryPath( qApp->applicationDirPath() ); +#else + pixmap = QPixmap( "/usr/share/ananas/designer/locale/engine-splash-"+lang+".png" ); + qApp->addLibraryPath( "/usr/lib/ananas/" ); +#endif + //--printf("extensions: \n%s\n",( const char *) AExtensionFactory::keys().join("\n") ); +// Test create extension +// AExtension *e = AExtensionFactory::create("AExtTest"); +// if (e) printf("EXT OK\n"); else printf("NO EXT OK\n"); + + if ( pixmap.isNull() ) + //--pixmap = QPixmap::fromMimeSource( "engine-splash-en.png" ); + pixmap = QPixmap( ":/images/engine-splash-en.png" ); + QSplashScreen *splash = new QSplashScreen( pixmap ); + +// printf("Keys:\n%s\n",( const char *) AExtensionFactory::keys().join("\n").toUtf8().data()); + + if ( ananas_login( rcfile, username, userpassword, 0, AApplication::Ananas ) ){ + splash->show(); + splash->message( QObject::tr("Init application"), Qt::AlignBottom, Qt::white ); + MainForm *w = new MainForm( 0, "MainForm"); + mainform = w; + mainformws = mainform->ws; + mainformwl = mainform->wl; + qApp->setMainWidget( w ); + w->rcfile = rcfile; +// printf( "rcfile = %s\n", rcfile.ascii() ); + w->show(); + ok = w->init(); + splash->clear(); + splash->finish( w ); + delete splash; + if ( ok ) { + qApp->connect( qApp, SIGNAL( lastWindowClosed() ), qApp, SLOT( quit() ) ); + rc = qApp->exec(); + ananas_logout( w->engine.db ); + if( w ) delete w; + w=0; + } else { + QMessageBox::critical(0, "error","Error init Ananas engine"); + } + aLog::close(); + return rc; + } + else + { + aLog::close(); + return 0; + } +} diff --git a/src/ananas/mainform.cpp b/src/ananas/mainform.cpp new file mode 100644 index 0000000..9993de2 --- /dev/null +++ b/src/ananas/mainform.cpp @@ -0,0 +1,314 @@ +/**************************************************************************** +** $Id: mainform.cpp,v 1.2 2008/12/06 22:56:39 leader Exp $ +** +** Code file of the Main form of Ananas Engine application +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Engine application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/**************************************************************************** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include + +#include "mainform.h" + +#include "ananas.h" + +MainForm *mainform=NULL; +QWorkspace *mainformws=NULL; +aWindowsList *mainformwl=NULL; +//extern void messageproc(int n, const char *msg); + +/* + * Constructs a AnanasMainWindow as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +MainForm::MainForm( QWidget* parent, const char* name, Qt::WFlags fl ) + : Q3MainWindow( parent, name, fl ) +{ +// QApopupmenu *popup; + Q3VBox *vb = new Q3VBox(this); + + setIcon( rcIcon("a-system.png")); + vb->setFrameStyle( Q3Frame::StyledPanel | Q3Frame::Sunken ); + ws = new QWorkspace( vb ); + wl = new aWindowsList(); + ws->setScrollBarsEnabled( TRUE ); + setCentralWidget( vb ); + statusBar()->setName("statusbar"); + if ( !name ) setName( "mainwindow" ); + //--engine_settings.insertSearchPath( QSettings::Unix, QString(QDir::homeDirPath())+QString("/.ananas")); + //--engine_settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas" ); + +// QStringList lst = settings.entryList("/engine"); + engine_settings.beginGroup("/engine"); + bool maximize = engine_settings.readBoolEntry( "/maximize", 0 ); + int width = engine_settings.readNumEntry( "/geometry/width", 600 ); + int height = engine_settings.readNumEntry( "/geometry/height", 480 ); + int offset_x = engine_settings.readNumEntry( "/geometry/x", 0 ); + int offset_y = engine_settings.readNumEntry( "/geometry/y", 0 ); + engine_settings.endGroup(); + resize( QSize(width, height) );// .expandedTo(minimumSizeHint()) ); + move(offset_x,offset_y); + if(maximize) + { +// setWindowState(windowState() ^ WindowMaximized); + } + rcfile=""; +} + +bool +MainForm::init() +{ + MessagesWindow *msgWindow = new MessagesWindow( this );// , WDestructiveClose ); + moveDockWindow( msgWindow, Qt::DockBottom ); + setMessageHandler( true ); + msgWindow->hide(); + if ( !initEngine() ) return false; + connect( menubar, SIGNAL(activated(int)), &engine, SLOT(on_MenuBar(int)) ); + languageChange(); + engine.project.addObject(menubar); + engine.project.addObject(this); + engine.project.addObject(statusBar()); + languageChange(); + engine.on_systemstart(); + return true; +} + +bool +MainForm::initEngine() +{ + if (rcfile.isEmpty()) return false; + if ( !engine.init( rcfile ) ) return false; + engine.ws = ws; + engine.wl = wl; + connect( &engine, SIGNAL( statusMessage( const QString & ) ), this, SLOT( statusMessage( const QString & ) ) ); + md = engine.md; + if ( !md ) return false; + initMenuBar(); + initStatusBar(); + initActionBar(); + return true; +} + +void +MainForm::initMenuBar() +{ + Q3PopupMenu *m; + m = new Q3PopupMenu(); + windowsMenu = new Q3PopupMenu(); + connect( windowsMenu, SIGNAL( aboutToShow() ), + this, SLOT( windowsMenuAboutToShow() ) ); + m->insertItem(rcIcon("a-system.png"), tr( "About" ), this, SLOT( helpAbout() )); + //windowsMenu->insertItem(rcIcon("a-system.png"), tr( "Windows" ), this, SLOT( windowsMenuAboutToShow() )); + menubar = new AMenuBar( md, this, "menubar"); + InsertMainMenu( tr("&Help"), m ); + InsertMainMenu( tr("&Windows"), windowsMenu ); + menuBar()->show(); +} + +void +MainForm::initStatusBar() +{ +} + +void +MainForm::initActionBar() +{ + aCfgItem obj, item; + + obj = md->find( md->find( mdc_interface ), md_toolbars ); // look for md_toolbars + item = md->firstChild( obj ); + while ( !item.isNull() ) { // foreach md_toolbar + new aToolBar( md, item, &engine, this, md->attr( item, mda_name ) ); // create toolbar + item = md->nextSibling( item ); // next md_toolbar + } +} + +void +MainForm::helpAbout() +{ + QMessageBox::about( this, tr("About Ananas.Engine program"), + tr("

Ananas.Engin %1

is a programm " + "for executing application of accounting automation system

" + "Copyright 2003-2008 Leader Infotech, Valery Grazdankin, " + "Copyright 2003-2008 Project Ananas, Andrey Paskal, Grigory Panov, Andrey Strelnikov
" + "License: GPL

" + "technical support:
" + "lider-infotech@narod.ru
" + "app@linux.ru.net
" + "Web sites:
" + "http://ananas.lrn.ru
" + "http://www.leaderit.ru" + "
Avalable extensions:

%2


" + ).arg(ananas_libversion()).arg( AExtensionFactory::keys().join(", ") ) ); +} + +void MainForm::InsertMainMenu(QString text, QObject *pop){ + menubar->insertItem(text, (Q3PopupMenu *) pop); + +} + + +void +MainForm::Exit(int code) +{ + + qApp->exit(code); +} +void +MainForm::close() +{ + engine_settings.beginGroup("/engine"); +// engine_settings.writeEntry( "/maximize", windowState()&WindowMaximized ? true: false); + engine_settings.writeEntry( "/geometry/width", width() ); + engine_settings.writeEntry( "/geometry/height", height() ); + engine_settings.writeEntry( "/geometry/x", pos().x() ); + engine_settings.writeEntry( "/geometry/y", pos().y() ); + engine_settings.endGroup(); + printf("exit\n" ); +//MainWindow::close(); +} + +void +MainForm::statusMessage( const QString &msg ) +{ + statusBar()->message( msg ); +} + +void +MainForm::setBackground( const QPixmap &pix ){ + ws->setBackgroundPixmap( pix ); +} + +/* + * Destroys the object and frees any allocated resources + */ +MainForm::~MainForm() +{ + engine.on_systemstop(); + close(); +// printf("Mainform destructor\n"); + if(ws) delete ws; + ws = 0; + if(wl) delete wl; + wl=0; + if(menubar) delete menubar; + menubar=0; +// printf("delete mainform\n"); +// cfg->on_systemstop(); +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void MainForm::languageChange() +{ + setCaption(QString( tr("Ananas")+" "+ananas_libversion() )+": "+md->info( md_info_name ) ); +// setCaption( tr( "Ananas VERSION" ) ); +} + +void MainForm::windowsMenuAboutToShow() +{ + windowsMenu->clear(); + int cascadeId = windowsMenu->insertItem(tr("&Cascade"), ws, SLOT(cascade() ) ); + int tileId = windowsMenu->insertItem(tr("&Tile"), ws, SLOT(tile() ) ); + int horTileId = windowsMenu->insertItem(tr("Tile &horizontal"), this, SLOT(tileHorizontal() ) ); + if ( ws->windowList().isEmpty() ) { + windowsMenu->setItemEnabled( cascadeId, FALSE ); + windowsMenu->setItemEnabled( tileId, FALSE ); + windowsMenu->setItemEnabled( horTileId, FALSE ); + } + windowsMenu->insertSeparator(); + QWidgetList windows = ws->windowList(); + if(windows.count()==0) return; + int i=0, count = windows.count(); + + do + { + int id=0; + if(windows.at(i) && windows.at(i)->isHidden()) + { + ++i; + continue; + } + id = windowsMenu->insertItem(windows.at(i)->caption(), this, SLOT( windowsMenuActivated( int ) ) ); + windowsMenu->setItemParameter( id, i ); + windowsMenu->setItemChecked( id, ws->activeWindow() == windows.at(i) ); + ++i; + }while( i < count ); +} + +void MainForm::tileHorizontal() +{ + // primitive horizontal tiling + QWidgetList windows = ws->windowList(); + int count =0; + for ( int i = 0; i < int(windows.count()); ++i ) + { + QWidget *window = windows.at(i); + if( !window ) continue; + if(!window->isHidden()) count++; + } + if ( !count ) return; + + int heightForEach = ws->height() / count; + int y = 0; + for ( int i = 0; i < windows.count(); ++i ) + { + QWidget *window = windows.at(i); + if ( !window ) continue; + if ( window->isHidden() ) continue; + if ( window->windowState() == Qt::WindowMaximized ) + { + // prevent flicker + window->hide(); + window->showNormal(); + } + int preferredHeight = window->minimumHeight()+window->parentWidget()->baseSize().height(); + int actHeight = QMAX(heightForEach, preferredHeight); + + window->parentWidget()->setGeometry( 0, y, ws->width(), actHeight ); + y += actHeight; + } +} + +void MainForm::windowsMenuActivated( int id ) +{ + QWidget* w = ws->windowList().at( id ); + if ( w ) w->showNormal(); + w->setFocus(); +} diff --git a/src/ananas/mainform.h b/src/ananas/mainform.h new file mode 100644 index 0000000..9f0d7ec --- /dev/null +++ b/src/ananas/mainform.h @@ -0,0 +1,116 @@ +/**************************************************************************** +** $Id: mainform.h,v 1.1 2008/11/05 21:16:26 leader Exp $ +** +** Header file of the Main form of Ananas Engine application +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Engine application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/**************************************************************************** +****************************************************************************/ + +#ifndef ANANASMAINFORM_H +#define ANANASMAINFORM_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include +#include +#include +#include +#include "ananas.h" +#include "amenubar.h" +#include "atoolbar.h" +#include "awindowslist.h" +#include "engine.h" + + +class Q3VBoxLayout; +class Q3HBoxLayout; +class Q3GridLayout; +class QAction; +class Q3ActionGroup; +class Q3ToolBar; +class Q3PopupMenu; + +/*! + * \ru + * Главное окно приложения Ананас, запускаемого пользователем. + * + * \_ru + */ + +class MainForm : public Q3MainWindow { + Q_OBJECT + +public: + MainForm( QWidget* parent = 0, const char* name = 0, Qt::WFlags fl = Qt::WType_TopLevel ); + ~MainForm(); + aEngine engine; + aCfg *md; + + AMenuBar* menubar; + Q3PopupMenu *windowsMenu; + QWorkspace* ws; + aWindowsList* wl; + QString rcfile; + +public slots: + bool init(); + bool initEngine(); + void initMenuBar(); + void initStatusBar(); + void initActionBar(); + void InsertMainMenu(QString text, QObject *pop); + void Exit(int code); + void close(); + void helpAbout(); + void statusMessage( const QString &msg ); + void windowsMenuAboutToShow(); + void windowsMenuActivated( int id ); + void tileHorizontal(); + void setBackground( const QPixmap &pix ); + +protected: + protected slots: + virtual void languageChange(); + +private: + QSettings engine_settings; +}; + +extern MainForm *mainform; +extern QWorkspace *mainformws; +extern aWindowsList *mainformwl; + +#endif // ANANASMAINFORM_H diff --git a/src/ananas/report.sxw b/src/ananas/report.sxw new file mode 100644 index 0000000..1fdc4e1 Binary files /dev/null and b/src/ananas/report.sxw differ diff --git a/src/ananas/report.tpl b/src/ananas/report.tpl new file mode 100644 index 0000000..25a88a0 --- /dev/null +++ b/src/ananas/report.tpl @@ -0,0 +1,21 @@ +<#section main#> + +
+Ananas HTTP Server +
+ +<#title#> + +<#endsection#> + +<#section endmain#> +
+ +<#endsection#> + +<#section trow#><#value#>)<#endsection#> + +<#section endrow#> +<#endsection#> + +<#section col#><#value#><#endsection#> diff --git a/src/designer/actiontree.cpp b/src/designer/actiontree.cpp new file mode 100644 index 0000000..f77e77b --- /dev/null +++ b/src/designer/actiontree.cpp @@ -0,0 +1,257 @@ +/**************************************************************************** +** $Id: actiontree.cpp,v 1.1 2008/11/05 21:16:26 leader Exp $ +** +** Code file of the Action Tree of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +//Added by qt3to4: +#include + +#include "acfg.h" +#include "actiontree.h" +#include "mainform.h" +#include "deditaction.h" +#include "awindowslist.h" + +extern MainForm *mainform; +extern QPixmap ANANAS_EXPORT rcIcon(const char *name); +extern void set_Icon(Q3ListViewItem *item, const char *name); + + +ActionListViewItem::ActionListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: ananasListViewItem( parent, cfgmd, cfgobj, name ) +{ + if (id) setRenameEnabled(0, true); +}; + +ActionListViewItem::ActionListViewItem( ananasListViewItem *parent, ananasListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: ananasListViewItem( parent, after, cfgmd, cfgobj, name ) +{ + aCfgItem active; + QPixmap pix; + if (id) setRenameEnabled(0, true); + active = md->findChild( obj, md_active_picture, 0 ); + if ( !active.isNull() ) { + pix.loadFromData( md->binary( active ) ); + setPixmap( 0, pix ); + } +}; + +void +ActionListViewItem::loadTree() +{ + QString oclass; + aCfgItem cobj; + + // clear tree + clearTree(); + if ( !md ) return; + setPixmap(0, rcIcon("actions.png")); + cobj = md->firstChild ( obj ); + while ( !cobj.isNull() ) + { + oclass = md->objClass ( cobj ); + if ( oclass == md_actiongroup ) + loadGroup ( this, cobj ); + oclass = md->objClass ( cobj ); + if ( oclass == md_action ) + new ActionListViewItem( this, getLastChild(), md, cobj, QString::null ); + cobj = md->nextSibling ( cobj ); + } +}; + +void +ActionListViewItem::loadGroup( ananasListViewItem * parent, aCfgItem child ) +{ + ActionListViewItem * gparent; + QString oclass; + aCfgItem cobj; + + gparent = new ActionListViewItem( parent, getLastChild(), md, child, QString::null ); + gparent->setPixmap(0, rcIcon("action_g.png")); + cobj = md->firstChild ( gparent->obj ); + while ( !cobj.isNull() ) + { + oclass = md->objClass ( cobj ); + if ( oclass == md_actiongroup ) + loadGroup ( gparent, cobj ); + oclass = md->objClass ( cobj ); + if ( oclass == md_action ) + new ActionListViewItem( gparent, getLastChild(), md, cobj, QString::null ); + cobj = md->nextSibling ( cobj ); + } +}; + +void +ActionListViewItem::newActionGroup () +{ + aCfgItem newobj; + ActionListViewItem *newitem; + QString oclass = md->objClass( obj ); + + if ( oclass == md_actiongroup || oclass == md_actions ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_actiongroup, QObject::tr("New Action Group") ); + newitem = new ActionListViewItem( this, getLastChild(), md, newobj ); + newitem->setSelected( TRUE ); + newitem->setPixmap(0, rcIcon("action_g.png")); + newitem->edit(); + }; + +} + +void +ActionListViewItem::newAction () +{ + aCfgItem newobj; + ActionListViewItem *newitem; + QString oclass = md->objClass( obj ); + + if ( oclass == md_actiongroup || oclass == md_actions ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_action, QObject::tr("New Action") ); + newitem = new ActionListViewItem( this, getLastChild(), md, newobj ); + newitem->setSelected( TRUE ); + newitem->edit(); + }; +} + +void +ActionListViewItem::edit () +{ + QWorkspace *ws = mainform->ws; + aWindowsList *wl = mainform->wl; + QString oclass = md->objClass( obj ); + int objid = md->id( obj ); + if ( wl->find( objid ) ) { + wl->get( objid )->setFocus(); + return; + } + + if ( oclass == md_action ) + { + dEditAction * e = new dEditAction ( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + return; + } +} + +aActionTreeView::aActionTreeView ( QWidget *parent, aCfg *cfgmd ) +: ananasTreeView( parent, cfgmd ) +{ + ActionListViewItem *actions; + aCfgItem item; + item = md->find ( mdc_actions ); + if ( item.isNull() ) + { + item = md->insert( md->find ( mdc_root ), md_actions, QString::null, -1 ); + } + actions = new ActionListViewItem ( this, md, item, QObject::tr ( "Actions" ) ); + actions->loadTree(); + actions->setOpen ( TRUE ); + connect( this, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), this, SLOT(ContextMenu() ) ); + connect( this, SIGNAL( returnPressed( Q3ListViewItem*) ), this, SLOT( itemEdit() ) ); + connect( this, SIGNAL( doubleClicked( Q3ListViewItem*) ), this, SLOT( itemEdit() ) ); +}; + + +void +aActionTreeView::ContextMenu() +{ + Q3PopupMenu *m=new Q3PopupMenu( this, "PopupMenu" ); + Q_CHECK_PTR(m); + + ContextMenuAdd( m ); + m->insertItem( QObject::tr("New &Group"), this, SLOT( itemNewGroup() ), Qt::CTRL+Qt::Key_G ); + m->insertItem( QObject::tr("New &Action"), this, SLOT( itemNewAction() ), Qt::CTRL+Qt::Key_A ); +// m->insertItem( QObject::tr("&Rename"), this, SLOT( itemRename() ), CTRL+Key_R); +// m->insertItem( QObject::tr("&Edit"), this, SLOT( itemEdit() ), CTRL+Key_E ); +// m->insertItem( QObject::tr("&Delete"), this, SLOT( itemDelete() ), CTRL+Key_D ); + m->exec( QCursor::pos() ); + delete m; +}; + +void +aActionTreeView::itemNewGroup() +{ + ActionListViewItem *i = (ActionListViewItem *) selectedItem(); + if ( i ) + i->newActionGroup(); +}; + +void +aActionTreeView::itemNewAction() +{ + ActionListViewItem *i = (ActionListViewItem *) selectedItem(); + if ( i ) + i->newAction(); +}; + +void +aActionTreeView::itemDelete() +{ + deleteItem(); +}; + +void +aActionTreeView::itemMoveUp() +{ + moveUpItem(); + +}; + +void +aActionTreeView::itemMoveDown() +{ + moveDownItem(); +}; + +void +aActionTreeView::itemEdit() +{ + ActionListViewItem *i = (ActionListViewItem *) selectedItem(); + if ( i ) i->edit(); +}; + +void +aActionTreeView::itemRename() +{ + renameItem(); +} diff --git a/src/designer/actiontree.h b/src/designer/actiontree.h new file mode 100644 index 0000000..90abd14 --- /dev/null +++ b/src/designer/actiontree.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** $Id: actiontree.h,v 1.1 2008/11/05 21:16:26 leader Exp $ +** +** Header file of the Action Tree of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACTIONTREE_H +#define ACTIONTREE_H +#include +#include +//#include "acfg.h" +#include "atreeitems.h" + +class QWidget; + +class ActionListViewItem : public ananasListViewItem +{ +public: +/* int id; + aCfgItem obj; + QWidget *editor; + aCfg *md; +*/ + ActionListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + ActionListViewItem( ananasListViewItem *parent, ananasListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, + const QString &name = QString::null ); + void loadTree(); + void loadGroup ( ananasListViewItem * parent, aCfgItem child ); + void newActionGroup (); + void newAction (); + void edit (); +}; + +class aActionTreeView : public ananasTreeView +{ + Q_OBJECT +public: + + aActionTreeView( QWidget *parent, aCfg *cfgmd ); + +public slots: + void ContextMenu(); + void itemNewGroup(); + void itemNewAction(); + void itemMoveUp(); + void itemMoveDown(); + void itemDelete(); + void itemEdit(); + void itemRename(); + +}; +#endif //ACTIONTREE_H diff --git a/src/designer/aliaseditor.cpp b/src/designer/aliaseditor.cpp new file mode 100644 index 0000000..55f4108 --- /dev/null +++ b/src/designer/aliaseditor.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** $Id: aliaseditor.cpp,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Code file of the Alias editor of Ananas +** Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include "aliaseditor.h" +#include "acfg.h" + + +aAliasEditor::aAliasEditor( aCfg *c, aCfgItem o, Q3Table *t ) +{ + ac = c; + obj = o; + tAliases = t; + tAliases->setNumRows( 0 ); + tAliases->setNumCols( 1 ); + tAliases->horizontalHeader()->setLabel( 0, tr("Name") ); +} + +aAliasEditor::~aAliasEditor() +{ +} + +void aAliasEditor::setData() +{ + int i, j, n; + aCfgItem alias, langs, lang; + QString langtag; + + langs = ac->find( ac->find( mdc_root ), md_languages, 0 ); + langCount = ac->count( langs, md_language ); + n = ac->countChild( obj, md_alias ); + tAliases->setNumRows( langCount ); + for ( i = 0; i < langCount; i++ ) { + lang = ac->findChild( langs, md_language, i ); + langtag = ac->attr( lang, mda_tag ); + tAliases->verticalHeader()->setLabel( i, langtag ); + for ( j = 0; j < n; j++) { + alias = ac->findChild( obj, md_alias, j ); + if ( langtag == ac->attr( alias, mda_tag ) ) { + tAliases->setText( i, 0, ac->attr( alias, mda_name ) ); + } + } + } +} + +void aAliasEditor::updateMD() +{ + int i; + aCfgItem alias; + + do { + alias = ac->findChild( obj, md_alias, 0 ) ; + if ( !alias.isNull() ) ac->remove( alias ); + } while ( !alias.isNull() ); + for (i = 0; i < tAliases->numRows(); i++ ) { + if ( tAliases->text( i, 0 ) != "" ) { + alias = ac->insert( obj, md_alias, tAliases->text( i, 0 ), -1 ); + ac->setAttr( alias, mda_tag, tAliases->verticalHeader()->label( i )); + } + } +} + diff --git a/src/designer/aliaseditor.h b/src/designer/aliaseditor.h new file mode 100644 index 0000000..92cd06c --- /dev/null +++ b/src/designer/aliaseditor.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** $Id: aliaseditor.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Header file of the Alias editor of Ananas +** Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ALIASEDITOR_H +#define ALIASEDITOR_H + +#include +#include +#include "acfg.h" + + +class aAliasEditor : public QObject +{ + Q_OBJECT +public: + aCfg *ac; + aCfgItem obj; + Q3Table *tAliases; + int langCount; + + aAliasEditor( aCfg *c, aCfgItem o, Q3Table *tAliases ); + ~aAliasEditor(); + + void setData(); + void updateMD( );//aCfgItem o ); +}; + +#endif diff --git a/src/designer/atreeitems.cpp b/src/designer/atreeitems.cpp new file mode 100644 index 0000000..7915bc9 --- /dev/null +++ b/src/designer/atreeitems.cpp @@ -0,0 +1,274 @@ +/**************************************************************************** +** $Id: atreeitems.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Header file of the Ananas visual tree object +** of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include + +#include "atreeitems.h" +#include "alog.h" + +ananasListViewItem::ananasListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, + const QString &name ) +: Q3ListViewItem( parent ) +{ + obj = cfgobj; + md = cfgmd; + if ( name.isNull() ) setText( 0, md->attr( obj, mda_name ) ); + else setText( 0, name ); + id = md->id(obj); +} + +ananasListViewItem::ananasListViewItem( ananasListViewItem *parent, ananasListViewItem *after, + aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: Q3ListViewItem( parent, after ) +{ + obj = cfgobj; + md = cfgmd; + if ( name.isNull() ) setText( 0, md->attr( obj, mda_name ) ); + else setText( 0, name ); + id = md->id(obj); +} + +ananasListViewItem::ananasListViewItem( Q3ListView *parent, Q3ListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: Q3ListViewItem( parent, after ) +{ + obj = cfgobj; + md = cfgmd; + if ( name.isNull() ) setText( 0, md->attr( obj, mda_name ) ); + else setText( 0, name ); + id = md->id(obj); +} + +void +ananasListViewItem::clearTree() +{ + Q3ListViewItem *item, *nextitem; + + // clear tree + item = firstChild(); + while( item ) + { + nextitem = item->nextSibling(); + delete item; + item = nextitem; + } +} + +/* +void +ananasListViewItem::moveItem ( QListViewItem * after ) +{ +CHECK_POINT + aCfgItem temp = obj, temp2 = ((ananasListViewItem*)after)->obj; + QListViewItem::moveItem( after ); + obj = temp; + ((ananasListViewItem*)after)->obj = temp2; +} +*/ +void +ananasListViewItem::moveUp () +{ + if(!previousSibling()) return; // not previous item! - no changes + aCfgItem item = previousSibling()->obj; + + if ( obj.isNull() ) + { + aLog::print(aLog::Error, QObject::tr(" Ananas List View Item %1 is null").arg(md->attr(obj,mda_name))); + return; + } + if( md->swap( obj, item ) ) + { + previousSibling()->moveItem( this ); + aLog::print(aLog::Debug, QObject::tr("Ananas List View Item swaping")); + } + else + { + aLog::print(aLog::Error, QObject::tr("Ananas List View Item swaping")); + } +} + +void +ananasListViewItem::moveDown () +{ + if(!nextSibling()) return; // not next item! - no changes + aCfgItem item = nextSibling()->obj; + if ( item.isNull() ) + { + aLog::print(aLog::Error, QObject::tr(" Ananas List View Item %1 is null").arg(md->attr(obj,mda_name))); + return; + } + if( md->swap( obj, item ) ) + { + moveItem( nextSibling() ); + aLog::print(aLog::Debug, QObject::tr("Ananas List View Item swaping")); + } + else + { + aLog::print(aLog::Error, QObject::tr("Ananas List View Item swaping")); + } +} + +ananasListViewItem * +ananasListViewItem::previousSibling() // becose QListViewItem not have function previousSibling(); +{ + Q3ListViewItem *parent, *item; + parent = this->parent(); + item = parent->firstChild(); + while ( item ) + if ( (ananasListViewItem *)item->nextSibling() == this ) + return (ananasListViewItem *) item; + else item = item->nextSibling(); + return 0; +} + +ananasListViewItem* +ananasListViewItem::nextSibling() +{ + return (ananasListViewItem *)Q3ListViewItem::nextSibling(); +} + + +void +ananasListViewItem::okRename( int col ) +{ + Q3ListViewItem::okRename( col ); + if ( id && !obj.isNull() && col == 0 ) { + setText( 0, text( 0 ).stripWhiteSpace() ); + md->setAttr( obj, mda_name, text( 0 ) ); + } +} + +/* +ananasListViewItem* +ananasListViewItem::getLastChild( QListViewItem * parent ) +{ + QListViewItem *item, *nextitem; + item = parent->firstChild(); + while( item ) + { + nextitem = item->nextSibling(); + if ( nextitem ) + item = nextitem; + else + return (ananasListViewItem*) item; + } + return 0; +}; +*/ + +ananasListViewItem* +ananasListViewItem::getLastChild() +{ + Q3ListViewItem *item, *nextitem; + item = firstChild(); + while( item ) + { + nextitem = item->nextSibling(); + if ( nextitem ) + item = nextitem; + else + return (ananasListViewItem*) item; + } + return 0; +}; + + +ananasTreeView::ananasTreeView ( QWidget *parent, aCfg *cfgmd ) +:Q3ListView ( parent ) +{ + md = cfgmd; + addColumn( "" ); + header()->hide(); + setSorting ( -1 ); + setSelectionMode( Single ); +}; + + +void +ananasTreeView::ContextMenuAdd( Q3PopupMenu * m ) +{ + //--QLabel *caption = new QLabel( tr("" "Context Menu"), this ); + //--caption->setAlignment( Qt::AlignCenter ); + //--m->insertItem( caption ); + m->insertItem( tr("&Rename"), this, SLOT( itemRename() ), Qt::CTRL+Qt::Key_R); + m->insertItem( tr("&Edit"), this, SLOT( itemEdit() ), Qt::CTRL+Qt::Key_E ); + m->insertItem( tr("&Delete"), this, SLOT( itemDelete() ), Qt::CTRL+Qt::Key_D ); + m->insertItem( tr("&MoveUp"), this, SLOT( itemMoveUp() ), Qt::CTRL+Qt::Key_U ); + m->insertItem( tr("&MoveDown"), this, SLOT( itemMoveDown() ), Qt::CTRL+Qt::Key_M ); + m->insertItem( tr("&SaveItem"), this, SLOT( itemSave() ) ); + m->insertItem( tr("&LoadItem"), this, SLOT( itemLoad() ) ); + m->insertSeparator(); +}; + +void +ananasTreeView::deleteItem() +{ + ananasListViewItem *i = (ananasListViewItem *) selectedItem(); + if ( i ) + { + if ( i->id ) { + md->remove( i->obj ); + delete i; + } + } +}; + +void +ananasTreeView::moveUpItem() +{ + ananasListViewItem *i = (ananasListViewItem *) selectedItem(); + if ( i ) + { + if ( i->id ) { + i->moveUp(); + } + } +} + +void +ananasTreeView::moveDownItem() +{ + ananasListViewItem *i = (ananasListViewItem *) selectedItem(); + if ( i ) + { + if ( i->id ) { + i->moveDown(); + } + } +} + +void +ananasTreeView::renameItem() +{ + if ( selectedItem() ) selectedItem()->startRename( 0 ); +} + diff --git a/src/designer/atreeitems.h b/src/designer/atreeitems.h new file mode 100644 index 0000000..90f7741 --- /dev/null +++ b/src/designer/atreeitems.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** $Id: atreeitems.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Header file of the Ananas visual tree object +** of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ATREEITEMS_H +#define ATREEITEMS_H +#include +#include +#include +#include "acfg.h" + +class QWidget; + +class ananasListViewItem : public Q3ListViewItem +{ +public: + int id; + aCfgItem obj; + QWidget *editor; + aCfg *md; + + ananasListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + ananasListViewItem( Q3ListView *parent, Q3ListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + ananasListViewItem( ananasListViewItem *parent, ananasListViewItem *after, aCfg * cfgmd, + aCfgItem cfgobj, const QString &name = QString::null ); + + void clearTree(); + void moveUp (); + void moveDown (); + + ananasListViewItem *previousSibling(); + ananasListViewItem *nextSibling(); +// ananasListViewItem *getLastChild( QListViewItem * parent ); + ananasListViewItem *getLastChild(); +protected: + virtual void okRename( int col ); +}; + +class ananasTreeView +: public Q3ListView +{ + Q_OBJECT +public: + aCfg *md; + + ananasTreeView( QWidget *parent, aCfg *cfgmd ); + + void ContextMenuAdd( Q3PopupMenu * m ); + void deleteItem(); + void moveUpItem (); + void moveDownItem (); + void renameItem(); + void saveItem(); + void loadItem(); +}; + + +#endif diff --git a/src/designer/cfgform.cpp b/src/designer/cfgform.cpp new file mode 100644 index 0000000..78347af --- /dev/null +++ b/src/designer/cfgform.cpp @@ -0,0 +1,860 @@ +#include "cfgform.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +//#include + +#include "ananas.h" +#include "mainform.h" +#include "deditfield.h" +#include "deditcfg.h" +#include "deditdoc.h" +#include "deditrole.h" +#include "deditreport.h" +#include "deditdialog.h" +#include "deditcat.h" +#include "deditlang.h" +#include "mdtree.h" +#include "actiontree.h" +#include "alog.h" + +/* + * Constructs a CfgForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +CfgForm::CfgForm(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); +} + +/* + * Destroys the object and frees any allocated resources + */ +CfgForm::~CfgForm() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void CfgForm::languageChange() +{ + retranslateUi(this); +} + +extern MainForm *mainform; + +void +set_Icon(Q3ListViewItem *item, const char *name) +{ + char in[200]; + strcpy(in, name); + strcat(in,".png"); + item->setPixmap(0, rcIcon(in)); +} + + +/*class ObjEditing { + public: + ObjEditing(){item=NULL; widget=NULL;} + ObjEditing(QListViewItem *aitem, QWidget *awidget) {item=aitem;widget=awidget;} + + QListViewItem *item; + QWidget *widget; +}; +*/ +//typedef QValueList ObjEditingList; +//ObjEditingList ObjEdList; + +CfgForm *configform=NULL; + + +void CfgForm::fileNew() +{ + +} + +void CfgForm::fileOpen() +{ + +} + +void CfgForm::fileSave() +{ + +} + +void CfgForm::fileSaveAs() +{ + +} + +void CfgForm::filePrint() +{ + +} + +void CfgForm::fileExit() +{ +} + + +void +CfgForm::init( QString &rcf, bool flagNew ) // flagNew shows if it needs to create new configuration +{ + statusBar()->hide(); + configform=this; + rcfile = rcf; // resource file + setIcon( rcIcon("a-system.png")); + if ( !flagNew ) { // read rcfile + if ( cfg.readrc( rcfile ) ) { + aLog::print(aLog::Error,tr("CfgForm readrc error")); + return; + } + } +// globalCfg = &cfg; + setCaption(tr("Business scheme: ")+cfg.info( mda_name )); +// QWidget *tab_0 = new QWidget( tabWidget, "tab" ); + Q3GridLayout *l = new Q3GridLayout( tabWidget->page(0), 1, 1, 1, 2, "tablayout" ); + mdtree = new aMetadataTreeView( tabWidget->page(0), &cfg ); // metadata tree creation + l->addWidget( mdtree, 0, 0); +// tabWidget->insertTab( tab_0, tr( "Business scheme" ), 0 ); +// tabWidget->setCurrentPage( 0 ); + initLang(); // languages tab initialization + initRoles(); // rights tab initialization + initImageCollection(); // image collection tab initialization + mainform->TBToolbar->setShown( TRUE ); // show edit toolbar + mainform->configSaveAction->setVisible( TRUE ); // show save button + + actiontree = new aActionTreeView ( tabWidget->page(1), &cfg ); // action tree creation + Q3GridLayout *j = new Q3GridLayout( tabWidget->page(1), 1, 1, 1, 2, "atablayout" ); + j->addWidget( actiontree, 0, 0); + + interfacetree = new InterfaceTreeView ( tabWidget->page(2), &cfg ); // interface tree creation + Q3GridLayout *k = new Q3GridLayout( tabWidget->page(2), 1, 1, 1, 2, "itablayout" ); + k->addWidget( interfacetree, 0, 0); + // connection toolbar actions + connect(mainform->objMetadataNewAction, SIGNAL(activated()), mdtree, SLOT( itemNew() ) ); + connect(mainform->objMetadataEditAction, SIGNAL(activated()), mdtree, SLOT( itemEdit() ) ); + connect(mainform->objActionsNewAction, SIGNAL(activated()), actiontree, SLOT( itemNewAction() ) ); + connect(mainform->objActionsNewGroupAction, SIGNAL(activated()), actiontree, SLOT( itemNewGroup() ) ); + connect(mainform->objActionsEditAction, SIGNAL(activated()), actiontree, SLOT( itemEdit() ) ); + connect(mainform->objInterfaceNewCommandAction, SIGNAL(activated()), interfacetree, SLOT( itemNewCommand() ) ); + connect(mainform->objInterfaceNewSubmenuAction, SIGNAL(activated()), interfacetree, SLOT( itemNewSubmenu() ) ); + connect(mainform->objInterfaceNewSeparatorAction, SIGNAL(activated()), interfacetree, SLOT( itemNewSeparator() ) ); + connect(mainform->objInterfaceEditAction, SIGNAL(activated()), interfacetree, SLOT( itemEdit() ) ); + connect(mainform->objImageCollectionAddAction, SIGNAL(activated()), this, SLOT( bAddImage_clicked() ) ); + connect(mainform->objLanguagesNewAction, SIGNAL(activated()), this, SLOT( bAdd_clicked() ) ); + connect(mainform->objLanguagesEditAction, SIGNAL(activated()), this, SLOT( bEdit_clicked() ) ); + connect(mainform->objLanguagesClearAction, SIGNAL(activated()), this, SLOT( bKill_clicked() ) ); + connect(mainform->objRoleNewAction, SIGNAL(activated()), this, SLOT( bAddRole_clicked() ) ); + connect(mainform->objRoleEditAction, SIGNAL(activated()), this, SLOT( bEditRole_clicked() ) ); + connect(mainform->objRoleClearAction, SIGNAL(activated()), this, SLOT( bKillRole_clicked() ) ); +} + +/* + * Image collection initialization + */ +void CfgForm::initImageCollection() +{ + aCfgItem oroot, image_collection, image; + int i, n; + QPixmap pix; + QString name; + + oroot = cfg.find( mdc_root ); // get root + image_collection = cfg.find( oroot, md_image_collection, 0 ); // get image col part + if ( image_collection.isNull() ) cfg.insert( oroot, md_image_collection, QString::null, -1 ); + n = cfg.countChild( image_collection, md_image ); // count images + for ( i = 0; i < n; i++ ) { + image = cfg.findChild( image_collection, md_image, i ); // foreach + name = cfg.attr( image, mda_name ); // get name + pix.loadFromData( cfg.binary( image ) ); // load binary + Q3IconViewItem *item = new Q3IconViewItem( vImageCollection, name, pix ); // create image + item->setRenameEnabled( TRUE ); // set rename enabled + vImageCollection->insertItem( item, 0 ); // insert image + idList.insert( cfg.id( image ), item ); // add image into dict + } + if ( vImageCollection->count() ) bRemoveImage->setEnabled( TRUE ); // enable remove button +} + +/* + * Add image into collection + */ +void CfgForm::bAddImage_clicked() +{ + QPixmap pix; + Q3FileDialog *fd = new Q3FileDialog( "", "Images (*.png *.xpm *.jpg *.jpeg *.bmp)", 0, 0, TRUE ); + QByteArray ba; + QString name; + QStringList names; + aCfgItem image_collection, image; + QFile f; + PixmapPreview *p = new PixmapPreview; + + fd->setContentsPreview( p, p ); + fd->setPreviewMode( Q3FileDialog::Contents ); + fd->setContentsPreviewEnabled( TRUE ); + fd->setCaption( tr("Open image dialog" ) ); + fd->setMode( Q3FileDialog::ExistingFiles ); // tune file dialogue + if ( fd->exec() == QDialog::Accepted ) { // if accepted + names = fd->selectedFiles(); // get selected filenames + QStringList::Iterator it = names.begin(); + while( it != names.end() ) { // trough the names + name = *it; + ++it; + if ( !name.isEmpty() ) { // if not empty + f.setName( name ); + if ( f.open( QIODevice::ReadOnly ) ){ // open r\o mode + ba = f.readAll(); // get binary + f.close(); + pix.loadFromData( ba ); // load pixmap from binary + } else continue; + } + QFileInfo fi( name ); + name = fi.baseName(); + Q3IconViewItem *item = new Q3IconViewItem( vImageCollection, name, pix ); + item->setRenameEnabled( TRUE ); // set rename enabled + vImageCollection->insertItem( item, 0 ); // insert image + image_collection = cfg.findChild( cfg.find( mdc_root ), md_image_collection, 0 ); + image = cfg.insert( image_collection, md_image, name ); // insert image metaitem + cfg.setBinary( image, ba ); // set binary + idList.insert( cfg.id( image ), item ); // add image into dict + } + delete fd; // delete file dialogue + bRemoveImage->setEnabled( TRUE ); // remove button enable + mainform->objTBDeleteAction->setEnabled( TRUE ); // toolbar button enable + } +} + +/* + * Remove image from collection + */ +void CfgForm::bRemoveImage_clicked() +{ + Q3IconViewItem *current; + aCfgItem image_collection, image; + int i, n, id; + + image_collection = cfg.findChild( cfg.find( mdc_root ), md_image_collection, 0 ); + n = cfg.countChild( image_collection, md_image ); // count image in collection + current = vImageCollection->currentItem(); // get current selected image + for ( i = 0; i < n; i++ ) { + image = cfg.findChild( image_collection, md_image, i ); // get metaitem + id = cfg.id( image ); // get id + if ( current == idList.find( id ) ) { // if corresponds + cfg.remove( image ); + idList.remove( id ); // rmove from metadata and from dict + delete current; + break; + } + } + if ( !vImageCollection->count() ) { // if last image removed + bRemoveImage->setEnabled( FALSE ); // disable remove button and toolbar button + mainform->objTBDeleteAction->setEnabled( FALSE ); + } + vImageCollection->sort( TRUE ); // turn image sorting on +} + +/* + * Image rename event handler + */ +void CfgForm::vImageCollection_itemRenamed( Q3IconViewItem *item, const QString &name ) +{ + aCfgItem image_collection, image; + int i, n; + + image_collection = cfg.findChild( cfg.find( mdc_root ), md_image_collection, 0 ); + n = cfg.countChild( image_collection, md_image ); // count images + for ( i = 0; i < n; i++ ) { + image = cfg.findChild( image_collection, md_image, i ); // get timage + if ( item == idList.find( cfg.id( image ) ) ) { // if corresponds + cfg.setAttr( image, mda_name, name ); // rename metaitem + break; + } + } +} + +/* + * Languages initialization + */ +void CfgForm::initLang() +{ + aCfgItem oroot; + aCfgItem lang, obj; + int i, n; + + tLang->setNumRows( 0 ); + oroot = cfg.find( mdc_root ); // get root + if ( oroot.isNull() ) { + aLog::print(aLog::Info,tr("CfgForm metadata root is null")); + } + lang = cfg.findChild( oroot, md_languages, 0 ); // get lang part + if ( lang.isNull() ) { + aLog::print(aLog::Info,tr("CfgForm metadata lang is null")); + } + if ( lang.isNull() ) lang = cfg.insert( oroot, md_languages, QString::null, -1 ); + n = cfg.count( lang, md_language ); // count languages + aLog::print(aLog::Debug,QString(tr("lang = %1")).arg(n)); + for ( i = 0; i < n; i++ ) { // foreach + obj = cfg.find( lang, md_language, i); // get lang + if ( obj.isNull() ) aLog::print(aLog::Debug,QString(tr("CfgForm %1 metadata lang is null")).arg(i)); + tLang->insertRows( tLang->numRows(), 1 ); // insert into table + tLang->setText( tLang->numRows()-1, 0, cfg.attr( obj, mda_tag ) ); + tLang->setText( tLang->numRows()-1, 1, cfg.attr( obj, mda_name ) ); + tLang->setText( tLang->numRows()-1, 2, cfg.attr( obj, mda_trfile ) ); // fill cols + } + if ( !tLang->numRows() ) { // turn buttons off + bDelete->setEnabled( FALSE ); + bEdit->setEnabled( FALSE ); + bKill->setEnabled( FALSE); + mainform->objLanguagesClearAction->setEnabled( FALSE ); + mainform->objLanguagesEditAction->setEnabled( FALSE ); + } +} + +/* + * Roles initialization + */ +void CfgForm::initRoles() +{ + aCfgItem oroot; + aCfgItem role, obj; + int i, n; + QString rd; + + tRole->setNumRows( 0 ); // no rows + oroot = cfg.find( mdc_root ); // get root + role = cfg.find( oroot, md_roles, 0 ); // get role part + if ( role.isNull() ) role = cfg.insert( oroot, md_roles, QString::null, -1 ); + n = cfg.count( role, md_role ); // count roles + for ( i = 0; i < n; i++ ) { + obj = cfg.find( role, md_role, i); // get role + tRole->insertRows( tRole->numRows(), 1 ); // insert this + tRole->setText( tRole->numRows()-1, 0, cfg.attr( obj, mda_name ) ); + rd = cfg.sText( obj, md_description ); + rd.replace( QChar('\n'), " " ); // remove \n symbol for good perception + tRole->setText( tRole->numRows()-1, 1, rd ); // fill cols + } + if ( !tRole->numRows() ) { // turn unneccessary buttons off + bDeleteRole->setEnabled( FALSE ); + bEditRole->setEnabled( FALSE ); + bKillRole->setEnabled( FALSE); + mainform->objRoleClearAction->setEnabled( FALSE ); + mainform->objRoleEditAction->setEnabled( FALSE ); + } +} + +/* + * Destroy configuration form + */ +void CfgForm::destroy() +{ + configform = 0; +// globalCfg = 0; // clear pointers + mainform->cfgform = NULL; + mainform->removeTab(name()); +} + +/* + * Save metadata on disk + */ +void CfgForm::save() +{ +// int i, n; +// aCfgItem oroot, lang, obj; + aDatabase *database = aDatabase::database(); + + if ( cfg.writerc( rcfile ) ) cfg_message(0, tr("Unable to write rc file.")); + else { +// if ( database.init( rcfile ) ){ + database->update(); +// database.done(); +// } + } +} + +/* + * Add new language + */ +void CfgForm::bAdd_clicked() +{ + aCfgItem lang, obj; + + tLang->insertRows( tLang->numRows(), 1 ); // insert new row + tLang->setCurrentCell( tLang->numRows()-1, 0 ); // focus on new role + lang = cfg.find( cfg.find( mdc_root ), md_languages, 0 ); // get lang part + obj = cfg.insert( lang, md_language, tr("New language") ); // insert new metaitem + dEditLang *e = new dEditLang( ws, 0, Qt::WDestructiveClose ); + e->setData( configform, obj ); + e->show(); // create editor, set its data and show this one + bDelete->setEnabled( TRUE ); + bEdit->setEnabled( TRUE ); + bKill->setEnabled( TRUE ); // enable control buttons and toolbar actions + mainform->objLanguagesClearAction->setEnabled( TRUE ); + mainform->objLanguagesEditAction->setEnabled( TRUE ); + mainform->objTBDeleteAction->setEnabled( TRUE ); +} + +/* + * Delete language + */ +void CfgForm::bDelete_clicked() +{ + if ( ! QMessageBox::warning( this, tr("Deleting row"), tr("Delete '%1'?").arg( tLang->text( tLang->currentRow(), 1 ) ), tr("Yes"), tr("No") ) ) { +// request for delete + aCfgItem lang, obj, alias; + int i, n; + + lang = cfg.find( cfg.find( mdc_root ), md_languages, 0 ); // get lang part + n = cfg.count( lang, md_language ); // count langs + for ( i = 0; i < n; i++ ) { + obj = cfg.find( lang, md_language, i ); // foreach lang + if ( cfg.attr( obj, mda_tag ) == tLang->text( tLang->currentRow(), 0 ) ) { + cfg.remove( obj ); // if tags corresponding remove metaitem + break; + } + } + tLang->removeRow( tLang->currentRow() ); // remove row + if ( !tLang->numRows() ) { + bDelete->setEnabled( FALSE ); + bEdit->setEnabled( FALSE ); + bKill->setEnabled( FALSE ); // if last row removed then buttons and actions are disabled + mainform->objLanguagesClearAction->setEnabled( FALSE ); + mainform->objLanguagesEditAction->setEnabled( FALSE ); + mainform->objTBDeleteAction->setEnabled( FALSE ); + } + } +} + +/* + * Language editing + */ +void CfgForm::bEdit_clicked() +{ + aCfgItem obj; + + obj = cfg.find( cfg.find( cfg.find( mdc_root ), md_languages, 0 ), md_language, tLang->currentRow() ); + // get lang metaitem + dEditLang *e = new dEditLang( ws, 0, Qt::WDestructiveClose ); + e->setData( configform, obj ); + e->show(); // create editor, set its data and show this one +} + +/* + * Double-click table event + */ +void CfgForm::tLang_doubleClicked( int, int, int, const QPoint & ) +{ + bEdit_clicked(); // call edit button click event +} + +/* + * Kill dead aliases througout metadata + */ +void CfgForm::bKill_clicked() +{ + aCfgItem oroot, alias; + int i = 0, s, n, ac, killed = 0; + + oroot = cfg.find( mdc_root ); // get root + n = cfg.count( oroot, md_alias ); // count aliases + while ( i < n ) { // foreach + ac = 0; // unset counter + alias = cfg.find( oroot, md_alias, i ); // get alias + for ( s = 0; s < tLang->numRows(); s++ ) // check aliase tag on existing in lang list + if ( cfg.attr( alias, mda_tag ) == tLang->text( s, 0 ) ) ac++; + if ( !ac ) { + cfg.remove( alias ); + killed++; + n--; // if dead then delete this and change counters + } else i++; + } + QMessageBox::warning( this, tr("Clearing dead aliases"), tr("%1 dead aliases killed.").arg( killed ), tr("OK") ); + // information message box +} + +void CfgForm::newObj() +{ +} + + +void CfgForm::listCfg_onItem( Q3ListViewItem * ) +{ + +} + + + +void CfgForm::newField() +{ +} + + + +void CfgForm::newForm() +{ +} + + +void CfgForm::newTable() +{ +} + +/* + * Cofiguration form close event + */ +void CfgForm::closeEvent( QCloseEvent *e ) +{ + + if ( !cfg.modified() ) { // if data didn't modify send event further + Q3MainWindow::closeEvent( e ); + return; + } + switch( QMessageBox::warning( this, tr("Saving changes"), + tr("Save changes %1?").arg( caption() ), + tr("Yes"), tr("No"), tr("Cancel") ) ) { + // request for saving before exit + case 0: // yes + { + mainform->closeChildWindows(); + save(); // save data and send event further + Q3MainWindow::closeEvent( e ); +/* + cancelupdate=0; + if (closeSubWindows()) e->ignore(); + else { + if (mainform) mainform->configSave(); + QMainWindow::closeEvent( e ); + } +*/ + } + break; + case 1: // no +// if (closeSubWindows()) {//e->ignore(); +// } +// else { +//// cancelupdate=1; +// //e->accept(); +// } // send event further + mainform->closeChildWindows(); + Q3MainWindow::closeEvent(e); + break; + default: + e->ignore(); // ignore event by default + break; + mainform->TBToolbar->setShown( FALSE ); + mainform->configSaveAction->setVisible( FALSE ); + mainform->tbMetadata->setShown( FALSE ); + mainform->tbActions->setShown( FALSE ); + mainform->tbInterface->setShown( FALSE ); // disable toolbars anyway + mainform->tbRights->setShown( FALSE ); + mainform->tbLanguages->setShown( FALSE ); + mainform->tbImageCollection->setShown( FALSE ); +// closeSubWindows(); + } + // } else { + // e->accept(); + // } +} + +/* + * Subwindow close event + */ +int +CfgForm::closeSubWindows() +{ + QWidgetList windows = ws->windowList(); // workspace windows list + if ( windows.count() ) { // if there're opened windows + for ( int i = 0; i < int(windows.count()); ++i ) { // foreach + QWidget *window = windows.at( i ); + if (window!=this) { // if not this + if ( window->className() == tr ( "messageswindow" ) ) { + delete window; // if messageswindow remove it + continue; + } + if ( !window->close() ) return 1; // if cannot close return error + else delete window; // else delete window + } + } + } + return 0; +} + + + +/* +int CfgForm::activateExist( QListViewItem *item ) +{ + QWidget *window; + + window=findOpened(item); + if (window) { + window->setFocus(); + return 1; + } + return 0; +} +*/ + +//QWidget * +//CfgForm::findOpened( QListViewItem *item ) +//{ +/* + ObjEditingList::iterator it; + QWidgetList windows = ws->windowList(); + QWidget *window, *res=NULL; + int f; + + if ( windows.count() ) { + it = ObjEdList.begin(); + while ( it != ObjEdList.end()) { + f=0; + for ( int i = 0; i < int(windows.count()); ++i ) { + window = windows.at( i ); + if (window==(*it).widget) { + f=1; break; + } + } + if (!f) { + it=ObjEdList.remove(it); + } else it++; + } + for ( it = ObjEdList.begin(); it != ObjEdList.end(); ++it ) { + if (item==(*it).item) { + res=(*it).widget; + break; + } + } + } + return res; +*/ +// return NULL; +//} + +/* + * When tab switches some actions reconnect to corresponding toolbar buttons and toolbars recombinate + */ +void CfgForm::tabWidget_selected( const QString &tab ) +{ + bool fM, fA, fI, fR, fL, fIC; + + if ( tab == tr("Metadata") ) { + connect(mainform->objTBDeleteAction, SIGNAL(activated()), mdtree, SLOT( itemDelete() ) ); + connect(mainform->objTBRenameAction, SIGNAL(activated()), mdtree, SLOT( itemRename() ) ); + connect(mainform->objTBMoveUpAction, SIGNAL(activated()), mdtree, SLOT( itemMoveUp() ) ); + connect(mainform->objTBMoveDownAction, SIGNAL(activated()), mdtree, SLOT( itemMoveDown() ) ); + fM = TRUE; + } else { + disconnect(mainform->objTBDeleteAction, SIGNAL(activated()), mdtree, SLOT( itemDelete() ) ); + disconnect(mainform->objTBRenameAction, SIGNAL(activated()), mdtree, SLOT( itemRename() ) ); + disconnect(mainform->objTBMoveUpAction, SIGNAL(activated()), mdtree, SLOT( itemMoveUp() ) ); + disconnect(mainform->objTBMoveDownAction, SIGNAL(activated()), mdtree, SLOT( itemMoveDown() ) ); + fM= FALSE; + } + if ( tab == tr("Actions") ) { + connect(mainform->objTBDeleteAction, SIGNAL(activated()), actiontree, SLOT( itemDelete() ) ); + connect(mainform->objTBRenameAction, SIGNAL(activated()), actiontree, SLOT( itemRename() ) ); + connect(mainform->objTBMoveUpAction, SIGNAL(activated()), actiontree, SLOT( itemMoveUp() ) ); + connect(mainform->objTBMoveDownAction, SIGNAL(activated()), actiontree, SLOT( itemMoveDown() ) ); + fA = TRUE; + } else { + disconnect(mainform->objTBDeleteAction, SIGNAL(activated()), actiontree, SLOT( itemDelete() ) ); + disconnect(mainform->objTBRenameAction, SIGNAL(activated()), actiontree, SLOT( itemRename() ) ); + disconnect(mainform->objTBMoveUpAction, SIGNAL(activated()), actiontree, SLOT( itemMoveUp() ) ); + disconnect(mainform->objTBMoveDownAction, SIGNAL(activated()), actiontree, SLOT( itemMoveDown() ) ); + fA = FALSE; + } + if ( tab == tr("Interface") ) { + connect(mainform->objTBDeleteAction, SIGNAL(activated()), interfacetree, SLOT( itemDelete() ) ); + connect(mainform->objTBRenameAction, SIGNAL(activated()), interfacetree, SLOT( itemRename() ) ); + connect(mainform->objTBMoveUpAction, SIGNAL(activated()), interfacetree, SLOT( itemMoveUp() ) ); + connect(mainform->objTBMoveDownAction, SIGNAL(activated()), interfacetree, SLOT( itemMoveDown() ) ); + fI = TRUE; + } else { + disconnect(mainform->objTBDeleteAction, SIGNAL(activated()), interfacetree, SLOT( itemDelete() ) ); + disconnect(mainform->objTBRenameAction, SIGNAL(activated()), interfacetree, SLOT( itemRename() ) ); + disconnect(mainform->objTBMoveUpAction, SIGNAL(activated()), interfacetree, SLOT( itemMoveUp() ) ); + disconnect(mainform->objTBMoveDownAction, SIGNAL(activated()), interfacetree, SLOT( itemMoveDown() ) ); + fI = FALSE; + } + if ( tab == tr("Rights") ) + { + connect(mainform->objTBDeleteAction, SIGNAL(activated()), this, SLOT( bDeleteRole_clicked() ) ); + fR = TRUE; + if ( !tRole->numRows() ) mainform->objTBDeleteAction->setEnabled( FALSE ); + else mainform->objTBDeleteAction->setEnabled( TRUE ); + } else { + disconnect(mainform->objTBDeleteAction, SIGNAL(activated()), this, SLOT( bDeleteRole_clicked() ) ); + fR = FALSE; + } + if ( tab == tr("Languages") ) { + connect(mainform->objTBDeleteAction, SIGNAL(activated()), this, SLOT( bDelete_clicked() ) ); + fL = TRUE; + if ( !tLang->numRows() ) mainform->objTBDeleteAction->setEnabled( FALSE ); + else mainform->objTBDeleteAction->setEnabled( TRUE ); + } else { + disconnect(mainform->objTBDeleteAction, SIGNAL(activated()), this, SLOT( bDelete_clicked() ) ); + fL = FALSE; + } + if ( tab == tr("Image collection") ) { + connect(mainform->objTBDeleteAction, SIGNAL(activated()), this, SLOT( bRemoveImage_clicked() ) ); + fIC = TRUE; + if ( !vImageCollection->count() ) mainform->objTBDeleteAction->setEnabled( FALSE ); + else mainform->objTBDeleteAction->setEnabled( TRUE ); + } else { + disconnect(mainform->objTBDeleteAction, SIGNAL(activated()), this, SLOT( bRemoveImage_clicked() ) ); + fIC = FALSE; + } + if ( tab == tr("Image collection") || tab == tr("Languages") || tab == tr("Rights") ) { + mainform->objTBRenameAction->setVisible( FALSE ); + mainform->objTBMoveUpAction->setVisible( FALSE ); + mainform->objTBMoveDownAction->setVisible( FALSE ); + } else { + mainform->objTBRenameAction->setVisible( TRUE ); + mainform->objTBMoveUpAction->setVisible( TRUE ); + mainform->objTBMoveDownAction->setVisible( TRUE ); + mainform->objTBDeleteAction->setEnabled( TRUE ); + } + mainform->tbMetadata->setShown( fM ); + mainform->tbActions->setShown( fA ); + mainform->tbInterface->setShown( fI ); + mainform->tbRights->setShown( fR ); + mainform->tbLanguages->setShown( fL ); + mainform->tbImageCollection->setShown( fIC ); +} + +/* + * Adds new role + */ +void CfgForm::bAddRole_clicked() +{ + aCfgItem role, obj, roles; + + tRole->insertRows( tRole->numRows(), 1 ); // insert row into table + tRole->setCurrentCell( tRole->numRows()-1, 0 ); // focus on new cell + roles = cfg.find( cfg.find( mdc_root ), md_roles, 0 ); // get role part of configuration + obj = cfg.insert( roles, md_role, tr("New role") ); // insert new role into part + dEditRole *e = new dEditRole( ws, 0, Qt::WDestructiveClose ); + e->setData( configform, obj ); + e->show(); // create role editor, set its data and show this one + bDeleteRole->setEnabled( TRUE ); + bEditRole->setEnabled( TRUE ); + bKillRole->setEnabled( TRUE ); + mainform->objRoleClearAction->setEnabled( TRUE ); + mainform->objRoleEditAction->setEnabled( TRUE ); + mainform->objTBDeleteAction->setEnabled( TRUE ); // enable buttons and actions +} + +/* + * Delete role + */ +void CfgForm::bDeleteRole_clicked() +{ + if ( ! QMessageBox::warning( this, tr("Deleting row"), tr("Delete '%1'?").arg( tRole->text( tRole->currentRow(), 0 ) ), tr("Yes"), tr("No") ) ) { +// request for deleting + aCfgItem roles, obj, role; + int i, n; + + roles = cfg.find( cfg.find( mdc_root ), md_roles, 0 ); // get role part of configuration + n = cfg.count( roles, md_role ); // count roles + for ( i = 0; i < n; i++ ) { // foreach role + obj = cfg.find( roles, md_role, i ); // get this one + if ( cfg.attr( obj, mda_name ) == tRole->text( tRole->currentRow(), 0 ) ) { + cfg.remove( obj ); + break; // if found delete and break the cycle + } + } + tRole->removeRow( tRole->currentRow() ); // remove row from table + if ( !tRole->numRows() ) { // if there're no rows disable buttons and actions + bDeleteRole->setEnabled( FALSE ); + bEditRole->setEnabled( FALSE ); + bKillRole->setEnabled( FALSE ); + mainform->objRoleClearAction->setEnabled( FALSE ); + mainform->objRoleEditAction->setEnabled( FALSE ); + mainform->objTBDeleteAction->setEnabled( FALSE ); + } + } +} + +/* + * Edit curren role + */ +void CfgForm::bEditRole_clicked() +{ + int objid; + aCfgItem obj; + + obj = cfg.find( cfg.find( cfg.find( mdc_root ), md_roles, 0 ), md_role, tRole->currentRow() ); + // get role +/* printf( "name = %s\n", cfg.attr( obj, mda_name ).ascii() ); + objid = cfg.id( obj ); + if ( wl->find( objid ) ) { + wl->get( objid )->setFocus(); + return; + } +*/ + dEditRole *e = new dEditRole( ws, 0, Qt::WDestructiveClose ); + e->setData( configform, obj ); + e->show(); // create role editor, set its data and show this one +} + +/* + * Kill dead roles throughout the configuration + */ +void CfgForm::bKillRole_clicked() +{ + aCfgItem oroot, roles, role; + int i = 0, s, n, ac, killed = 0; + + oroot = cfg.find( mdc_root ); // get configuration root + n = cfg.count( oroot, md_role ); // count roles throughout configuration + while ( i < n ) { // foreach role + ac = 0; // unset counter + role = cfg.find( oroot, md_role, i ); // get this one + for ( s = 0; s < tRole->numRows(); s++ ) // look through role table for correspondence + if ( cfg.attr( role, mda_name ) == tRole->text( s, 0 ) ) ac++; // inc counter + if ( !ac ) { + cfg.remove( role ); + killed++; + n--; // if counter then remove role, inc kill-counter and dec main counter + } else i++; // else inc current role number + } + QMessageBox::warning( this, tr("Clearing dead roles"), tr("%1 dead roles killed.").arg( killed ), tr("OK") ); + // display count of killed roles +} + + +void CfgForm::tRole_doubleClicked( int, int, int, const QPoint & ) +{ + bEditRole_clicked(); // call role edit method +} + diff --git a/src/designer/cfgform.h b/src/designer/cfgform.h new file mode 100644 index 0000000..ad954d4 --- /dev/null +++ b/src/designer/cfgform.h @@ -0,0 +1,71 @@ +#ifndef CFGFORM_H +#define CFGFORM_H + +#include "ui_cfgform.h" + + +class CfgForm : public Q3MainWindow, public Ui::CfgForm +{ + Q_OBJECT + +public: + CfgForm(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~CfgForm(); + + Q3IntDict idList; + InterfaceTreeView *interfacetree; + aActionTreeView *actiontree; + aCfg cfg; + QWorkspace *ws; + aMetadataTreeView *mdtree; + InterfaceTreeView *toolbartree; + QString rcfile; + aWindowsList *wl; + +public slots: + virtual void fileNew(); + virtual void fileOpen(); + virtual void fileSave(); + virtual void fileSaveAs(); + virtual void filePrint(); + virtual void fileExit(); + virtual void init( QString & rcf, bool flagNew ); + virtual void initImageCollection(); + virtual void bAddImage_clicked(); + virtual void bRemoveImage_clicked(); + virtual void vImageCollection_itemRenamed( Q3IconViewItem * item, const QString & name ); + virtual void initLang(); + virtual void initRoles(); + virtual void save(); + virtual void bAdd_clicked(); + virtual void bDelete_clicked(); + virtual void bEdit_clicked(); + virtual void tLang_doubleClicked( int, int, int, const QPoint & ); + virtual void bKill_clicked(); + virtual void newObj(); + virtual void listCfg_onItem( Q3ListViewItem * ); + virtual void newField(); + virtual void newForm(); + virtual void newTable(); + virtual void tabWidget_selected( const QString & tab ); + virtual void bAddRole_clicked(); + virtual void bDeleteRole_clicked(); + virtual void bEditRole_clicked(); + virtual void bKillRole_clicked(); + virtual void tRole_doubleClicked( int, int, int, const QPoint & ); + +signals: + void wActivate(); + void wDeactivate(); + +protected slots: + virtual void languageChange(); + +private: + void destroy(); + virtual void closeEvent( QCloseEvent * e ); + virtual int closeSubWindows(); + +}; + +#endif // CFGFORM_H diff --git a/src/designer/cfgform.ui b/src/designer/cfgform.ui new file mode 100644 index 0000000..6ec1649 --- /dev/null +++ b/src/designer/cfgform.ui @@ -0,0 +1,775 @@ + + Leader + CfgForm + + + + 0 + 0 + 482 + 412 + + + + + 0 + 0 + + + + CfgForm + + + + + 0 + 0 + 482 + 412 + + + + + + + + 10 + + + + + Metadata + + + + + Actions + + + + + Interface + + + + + Rights + + + + + + 0 + + + 2 + + + true + + + Q3Table::Multi + + + + Role name + + + + + Description + + + + + + + + + + Add + + + + + + + Remove + + + + + + + Edit + + + + + + + Clear dead roles + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 250 + + + + + + + + + + + Languages + + + + + + + + Add + + + + + + + Remove + + + + + + + Edit + + + + + + + Clear dead aliases + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 250 + + + + + + + + + + 0 + + + 3 + + + true + + + Q3Table::Multi + + + + Tag + + + + + Name + + + + + Translation file + + + + + + + + + Image collection + + + + + + 50 + + + 50 + + + false + + + + + + + + + Add + + + + + + + false + + + Remove + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 240 + + + + + + + + + + + + + + + + &New + + + New + + + Ctrl+N + + + fileNewAction + + + + + + + + &Open... + + + Open + + + Ctrl+O + + + fileOpenAction + + + + + + + + &Save + + + Save + + + Ctrl+S + + + fileSaveAction + + + + + Save &As... + + + Save As + + + + + + fileSaveAsAction + + + + + + + + &Print... + + + Print + + + Ctrl+P + + + filePrintAction + + + + + E&xit + + + Exit + + + + + + fileExitAction + + + + + + + + + Action + + + objEdit + + + + + + + + Action + + + objNew + + + + + editdelete.png + + + Action + + + objDelete + + + + objGroup + + + + + rcIcon + + + Q3IconView + Q3Frame +
q3iconview.h
+
+ + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+
+ + tabWidget + + + acfg.h + qworkspace.h + q3socket.h + q3serversocket.h + acfgrc.h + mdtree.h + actiontree.h + interfacetree.h + pixmappreview.h + awindowslist.h + + + + + fileExitAction + activated() + CfgForm + fileExit() + + + -1 + -1 + + + 20 + 20 + + + + + filePrintAction + activated() + CfgForm + filePrint() + + + -1 + -1 + + + 20 + 20 + + + + + fileSaveAsAction + activated() + CfgForm + fileSaveAs() + + + -1 + -1 + + + 20 + 20 + + + + + fileSaveAction + activated() + CfgForm + fileSave() + + + -1 + -1 + + + 20 + 20 + + + + + fileOpenAction + activated() + CfgForm + fileOpen() + + + -1 + -1 + + + 20 + 20 + + + + + fileNewAction + activated() + CfgForm + fileNew() + + + -1 + -1 + + + 20 + 20 + + + + + bAdd + clicked() + CfgForm + bAdd_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bDelete + clicked() + CfgForm + bDelete_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bEdit + clicked() + CfgForm + bEdit_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + tLang + doubleClicked(int,int,int,QPoint) + CfgForm + tLang_doubleClicked(int,int,int,QPoint) + + + 20 + 20 + + + 20 + 20 + + + + + bKill + clicked() + CfgForm + bKill_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bAddImage + clicked() + CfgForm + bAddImage_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bRemoveImage + clicked() + CfgForm + bRemoveImage_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + vImageCollection + itemRenamed(Q3IconViewItem*,QString) + CfgForm + vImageCollection_itemRenamed(Q3IconViewItem*,QString) + + + 20 + 20 + + + 20 + 20 + + + + + tabWidget + selected(QString) + CfgForm + tabWidget_selected(QString) + + + 20 + 20 + + + 20 + 20 + + + + + bAddRole + clicked() + CfgForm + bAddRole_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bEditRole + clicked() + CfgForm + bEditRole_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + tRole + doubleClicked(int,int,int,QPoint) + CfgForm + tRole_doubleClicked(int,int,int,QPoint) + + + 20 + 20 + + + 20 + 20 + + + + + bDeleteRole + clicked() + CfgForm + bDeleteRole_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bKillRole + clicked() + CfgForm + bKillRole_clicked() + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditaction.cpp b/src/designer/deditaction.cpp new file mode 100644 index 0000000..337b344 --- /dev/null +++ b/src/designer/deditaction.cpp @@ -0,0 +1,366 @@ +#include "deditaction.h" + +#include +#include +#include + +#include +//Added by qt3to4: +#include +#include "acfg.h" +#include +#include +#include + +/* + * Constructs a dEditAction as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditAction::dEditAction(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditAction::~dEditAction() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditAction::languageChange() +{ + retranslateUi(this); +} + +void dEditAction::setData( ActionListViewItem * o ) +{ + item = o; + md = o->md; + obj = o->obj; + aCfgItem active, passive; + QString st; + QPixmap pix, pix1; + static const char *empty[] = { + "1 1 1 1", + ". c None", + "."}; + dp = new QPixmap( empty ); + + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); // alias table init + + pActive->setPixmap( *dp ); // set empty pixmaps + pPassive->setPixmap( *dp ); + eName->setText( md->attr( obj, mda_name ) ); + setCaption( tr("Action:") + md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); + eParams->setText( md->sText( obj, md_argument ) ); // set atributes + st = md->attr ( obj, mda_type); + if ( st == "0" ) cbType->setCurrentItem( 0 ); + else if ( st == "1" ) cbType->setCurrentItem( 1 ); + eModule->setText( md->sText( obj, md_sourcecode ) ); + active = md->findChild( obj, md_active_picture, 0 ); + if ( !active.isNull() ) { // set active mode picture if exists + bRemoveActive->setEnabled( TRUE ); + pix.loadFromData( md->binary( active ) ); + pActive->setPixmap( pix ); + setIcon( pix ); + } + passive = md->findChild( obj, md_passive_picture, 0 ); + if ( !passive.isNull() ) { // set passive mode picture if exists + bRemovePassive->setEnabled( TRUE ); + pix1.loadFromData( md->binary( passive ) ); + pPassive->setPixmap( pix1 ); + } + + QStringList tlist = md->ObjectTypes(); + otypes.clear(); + cbObject->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) + { + otypes.append( (*it).section( "\t", 0, 0 ).section(" ", 1, 1 ) ); + cbObject->insertItem( (*it).section("\t", 1, 1 )); + } + QString oid = md->sText( obj, md_objectid ); + uint n = otypes.count(); + for ( uint i = 0; i < n; i++ ) + if ( otypes[i] == oid ) + { + cbObject->setCurrentItem( i ); + break; + } + cbObjectChange(); + n = formslist.count(); + oid = md->sText( obj, md_formid ); + for ( uint i = 0; i < n; i++ ){ + if ( formslist[i] == oid ) + { + cbForm->setCurrentItem( i ); + break; + } + + } + int type = md->sText( obj, md_actiontype ).toInt(); + switch ( type ) + { + case 0 : + cbAction->setCurrentItem(md_action_new); + break; + case 1 : + cbAction->setCurrentItem(md_action_edit); + break; + case 2 : + cbAction->setCurrentItem(md_action_view); + break; + case 3 : + cbAction->setCurrentItem(md_action_execute); + break; + } + + + cbTypeChange(); +} + +void dEditAction::updateMD() +{ + al->updateMD( ); + char sid[50]=""; + int id = 0; + + item->setText( 0, eName->text() ); + md->setAttr( obj, mda_name, eName->text() ); + md->setSText( obj, md_description, eDescription->text() ); + md->setSText( obj, md_argument, eParams->text() ); + if ( cbType->currentItem() == 0 ) + { + md->setAttr( obj, mda_type, "0" ); + id=cbAction->currentItem(); + switch ( id ) + { + case 0 : + sprintf(sid, "%i", md_action_new); + md->setSText( obj, md_actiontype, sid ); + break; + case 1 : + sprintf(sid, "%i", md_action_edit ); + md->setSText( obj, md_actiontype, sid ); + break; + case 2 : + sprintf(sid, "%i", md_action_view); + md->setSText( obj, md_actiontype, sid ); + break; + case 3 : + sprintf(sid, "%i", md_action_execute); + md->setSText( obj, md_actiontype, sid ); + break; + } + id=cbObject->currentItem(); + md->setSText( obj, md_objectid, otypes[id] ); + id=cbForm->currentItem(); + md->setSText( obj, md_formid, formslist[id] ); + } + + if ( cbType->currentItem() == 1 ) + { + md->setAttr( obj, mda_type, "1" ); + md->setSText( obj, md_sourcecode, eModule->text() ); + } +} + + +void dEditAction::init() +{ + + delete statusBar(); + eModule->setInterpreter(new QSInterpreter()); +// tabWidget2->page(1)->hide() ; +// tabWidget2->setTabEnabled ( tabWidget2->page(1), FALSE ); +} + + +void dEditAction::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + + +void dEditAction::cbTypeChange () +{ +// if ( cbType->currentItem() == 0 ) +// selectStandart(); + // if ( cbType->currentItem() == 1 ) +// selectUser(); +// if ( cbType->currentItem() == 2 ) wStack->raiseWidget( 2 ); + wStack->raiseWidget( cbType->currentItem() ); +} + +void dEditAction::selectStandart() +{ + lAction->show(); + lObject->show(); + lParams->show(); + cbAction->show(); + cbObject->show(); + cbForm->show(); + eParams->show(); +// tabWidget2->page(1)->hide() ; + eModule->hide() ; +// tabWidget2->setTabEnabled ( tabWidget2->page(1), FALSE ); +} + + + +void dEditAction::selectUser() +{ + + lAction->hide(); + lObject->hide(); + lParams->hide(); + cbAction->hide(); + cbObject->hide(); + cbForm->hide(); + eParams->hide(); + eModule->show() ; +// tabWidget2->setTabEnabled ( tabWidget2->page(1), TRUE ); +} + + +void dEditAction::bSetActive_clicked() +{ + QString st; + QPixmap pix; +// QFileDialog *fd = new QFileDialog( "", "Images (*.png *.xpm *.jpg *.jpeg *.bmp)", 0, 0, TRUE ); + QByteArray ba; + QString name; + QFile f; +// PixmapPreview *p = new PixmapPreview; + aCfgItem active; + +// fd->setContentsPreview( p, p ); +// fd->setPreviewMode( QFileDialog::Contents ); +// fd->setContentsPreviewEnabled( TRUE ); // prepair file dialog +// fd->setCaption( tr("Open image dialog" ) ); +// fd->setMode( QFileDialog::ExistingFiles ); + name= Q3FileDialog::getOpenFileName("", "Images (*.png *.xpm *.jpg *.jpeg *.bmp)", this, + tr("Open image dialog"), + tr("Choose an image") ); +// if ( fd->exec() == QDialog::Accepted ) { // if accepted +// name = fd->selectedFile(); // get filename + if ( !name.isEmpty() ) { // if not empty + f.setName( name ); + if ( f.open( QIODevice::ReadOnly ) ){ // open file + ba = f.readAll(); // read data + f.close(); // close file + pix.loadFromData( ba ); // load data into pixmap + active = item->md->findChild( item->obj, md_active_picture, 0 ); + if ( active.isNull() ) active = item->md->insert( item->obj, md_active_picture, QString::null, -1 ); + item->md->setBinary( active, ba ); // save data into cfg + item->setPixmap( 0, pix ); + setIcon( pix ); // put on caption + } + } +// delete fd; // remove filedialog + pActive->setPixmap( pix ); // put on form + bRemoveActive->setEnabled( TRUE ); // enable remove button +// } +} + + +void dEditAction::bSetPassive_clicked() +{ + QString st; + QPixmap pix; + Q3FileDialog *fd = new Q3FileDialog( "", "Images (*.png *.xpm *.jpg *.jpeg *.bmp)", 0, 0, TRUE ); + QByteArray ba; + QString name; + QFile f; + PixmapPreview *p = new PixmapPreview; + aCfgItem passive; + + fd->setContentsPreview( p, p ); + fd->setPreviewMode( Q3FileDialog::Contents ); + fd->setContentsPreviewEnabled( TRUE ); + fd->setCaption( tr("Open image dialog" ) ); + fd->setMode( Q3FileDialog::ExistingFiles ); + if ( fd->exec() == QDialog::Accepted ) { + name = fd->selectedFile(); + if ( !name.isEmpty() ) { + f.setName( name ); + if ( f.open( QIODevice::ReadOnly ) ){ + ba = f.readAll(); + f.close(); + pix.loadFromData( ba ); + passive = item->md->findChild( item->obj, md_passive_picture, 0 ); + if ( passive.isNull() ) passive = item->md->insert( item->obj, md_passive_picture, QString::null, -1 ); + item->md->setBinary( passive, ba ); + } + } + delete fd; + pPassive->setPixmap( pix ); + bRemovePassive->setEnabled( TRUE ); + } +} + + +void dEditAction::bRemoveActive_clicked() +{ + item->md->remove( item->md->findChild( item->obj, md_active_picture, 0 ) ); + bRemoveActive->setEnabled( FALSE ); + pActive->clear(); + item->setPixmap( 0, 0 ); + setIcon( *dp ); + pActive->setPixmap( *dp ); +} + + +void dEditAction::bRemovePassive_clicked() +{ + item->md->remove( item->md->findChild( item->obj, md_passive_picture, 0 ) ); + bRemovePassive->setEnabled( FALSE ); + pPassive->clear(); + pPassive->setPixmap( *dp ); +} + + +void dEditAction::cbObjectChange() +{ + aCfgItem cobj, fobj; + long id = otypes[cbObject->currentItem()].toLong(); + uint n; + cobj=md->find(id); + + cbForm->clear(); + formslist.clear(); + + cbForm->insertItem( QObject::tr("default") ); + formslist.append( "0" ); + if ( md->objClass( cobj ) == md_catalogue ) + { + cbForm->insertItem( QObject::tr("embedded editor") ); + formslist.append( "1" ); + } + n = md->count( cobj, md_form ); + for ( uint i = 0; i < n; i++ ) + { + fobj = md->find( cobj, md_form, i); + if ( fobj.isNull() ) + continue; + cbForm->insertItem( md->attr(fobj, mda_name) ); + formslist.append(md->attr(fobj, mda_id)); + } +} diff --git a/src/designer/deditaction.h b/src/designer/deditaction.h new file mode 100644 index 0000000..d110475 --- /dev/null +++ b/src/designer/deditaction.h @@ -0,0 +1,48 @@ +#ifndef DEDITACTION_H +#define DEDITACTION_H + +#include "ui_deditaction.h" + + +class dEditAction : public Q3MainWindow, public Ui::dEditAction +{ + Q_OBJECT + +public: + dEditAction(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditAction(); + + ActionListViewItem * item; + aAliasEditor *al; + QStringList otypes; + QStringList formslist; + aCfg * md; + aCfgItem obj; + QPixmap *dp; + +public slots: + virtual void setData( ActionListViewItem * o ); + virtual void updateMD(); + virtual void bSetActive_clicked(); + virtual void bSetPassive_clicked(); + virtual void bRemoveActive_clicked(); + virtual void bRemovePassive_clicked(); + +protected: + virtual void selectStandart(); + virtual void selectUser(); + +protected slots: + virtual void languageChange(); + + virtual void init(); + virtual void destroy(); + + +private slots: + virtual void cbTypeChange(); + virtual void cbObjectChange(); + +}; + +#endif // DEDITACTION_H diff --git a/src/designer/deditaction.ui b/src/designer/deditaction.ui new file mode 100644 index 0000000..9465248 --- /dev/null +++ b/src/designer/deditaction.ui @@ -0,0 +1,663 @@ + + dEditAction + + + + 0 + 0 + 500 + 355 + + + + Action + + + + + 0 + 0 + 500 + 355 + + + + + + + true + + + + + + QTabWidget::Rounded + + + + Common + + + + + + Description: + + + false + + + + + + + + + Name + + + false + + + + + + + Type + + + false + + + + + + + + 0 + 0 + + + + + standart command + + + + + user script + + + + + external script + + + + + + + + true + + + + 0 + 22 + + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 91 + 20 + + + + + + + + Enabled icon + + + + + + + 20 + 24 + + + + ... + + + + + + + true + + + false + + + + + + + false + + + + 20 + 32767 + + + + X + + + + + + + + + + Disabled icon + + + + + + true + + + false + + + + + + + + 0 + 0 + + + + + 20 + 32767 + + + + ... + + + + + + + false + + + + 0 + 0 + + + + + 20 + 32767 + + + + X + + + + + + + + + + + + + Execute + + + + + + + + 0 + 0 + 100 + 30 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 130 + + + + + + + + + + + 0 + 0 + + + + + + + + + + + Action + + + false + + + + + + + Object + + + false + + + + + + + Form + + + false + + + + + + + true + + + + 0 + 22 + + + + + + + + + 0 + 0 + + + + + new + + + + + edit + + + + + view + + + + + execute + + + + + + + + Params + + + false + + + + + + + + + + + + + 0 + 0 + 100 + 30 + + + + + + + true + + + + + + + + + 0 + 0 + 100 + 30 + + + + + + + + + File name + + + false + + + + + + + + + + + 20 + 32767 + + + + ... + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 170 + + + + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + Action + + + Action + + + Action + + + + + Action_2 + + + Action_2 + + + Action_2 + + + + + rcIcon + + + Q3GroupBox + QGroupBox +
Qt3Support/Q3GroupBox
+ 1 +
+ + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3WidgetStack + Q3WidgetStack +
q3widgetstack.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + QSEditor + QWidget +
qseditor.h
+
+
+ + actiontree.h + aliaseditor.h + pixmappreview.h + mainform.h + qseditor.h + + + + + cbType + activated(int) + dEditAction + cbTypeChange() + + + 20 + 20 + + + 20 + 20 + + + + + bSetActive + clicked() + dEditAction + bSetActive_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bRemoveActive + clicked() + dEditAction + bRemoveActive_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bSetPassive + clicked() + dEditAction + bSetPassive_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bRemovePassive + clicked() + dEditAction + bRemovePassive_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + cbObject + activated(int) + dEditAction + cbObjectChange() + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditareg.cpp b/src/designer/deditareg.cpp new file mode 100644 index 0000000..b92b82e --- /dev/null +++ b/src/designer/deditareg.cpp @@ -0,0 +1,76 @@ +#include "deditareg.h" + +#include +#include +#include + +#include +#include "acfg.h" + +/* + * Constructs a dEditAReg as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditAReg::dEditAReg(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditAReg::~dEditAReg() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditAReg::languageChange() +{ + retranslateUi(this); +} + +void dEditAReg::init() +{ + delete statusBar(); +} + +void dEditAReg::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + +void dEditAReg::setData( aListViewItem *o ) +{ + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj; + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + setCaption( tr("Accumulation register:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); +} + +void dEditAReg::updateMD() +{ + aCfg *md = item->md; + aCfgItem obj = item->obj; + + al->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace()); + md->setSText( obj, md_description, eDescription->text() ); +} diff --git a/src/designer/deditareg.h b/src/designer/deditareg.h new file mode 100644 index 0000000..02fc4db --- /dev/null +++ b/src/designer/deditareg.h @@ -0,0 +1,31 @@ +#ifndef DEDITAREG_H +#define DEDITAREG_H + +#include "ui_deditareg.h" + + +class dEditAReg : public Q3MainWindow, public Ui::dEditAReg +{ + Q_OBJECT + +public: + dEditAReg(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditAReg(); + + aListViewItem *item; + aAliasEditor *al; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +private: + void init(); + void destroy(); + +}; + +#endif // DEDITAREG_H diff --git a/src/designer/deditareg.ui b/src/designer/deditareg.ui new file mode 100644 index 0000000..42e8535 --- /dev/null +++ b/src/designer/deditareg.ui @@ -0,0 +1,123 @@ + + dEditAReg + + + + 0 + 0 + 445 + 317 + + + + Accumulating register + + + + + 0 + 0 + 445 + 317 + + + + + + + + Common + + + + + + + + Name: + + + false + + + + + + + + + + + + Description: + + + false + + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+
+ + mdtree.h + aliaseditor.h + mainform.h + + + +
diff --git a/src/designer/deditcat.cpp b/src/designer/deditcat.cpp new file mode 100644 index 0000000..3c99a5e --- /dev/null +++ b/src/designer/deditcat.cpp @@ -0,0 +1,174 @@ +#include "deditcat.h" + +#include +#include +#include + +#include +#include +#include +#include "acfg.h" + +/* + * Constructs a dEditCat as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditCat::dEditCat(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditCat::~dEditCat() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditCat::languageChange() +{ + retranslateUi(this); +} + +void dEditCat::setData( aListViewItem *o ) +{ + long int i; + int fid, fcount, fieldid, stdf; + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj, sv, g, e, field; + + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + aRoleEditor *r = new aRoleEditor( md, obj, tRoles, md_catalogue ); + re = r; + re->setData(); + setCaption( tr("Catalogue:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); + g = md->find( obj, md_group ); // Find group context + e = md->find( obj, md_element ); // Find Element context + sv = md->find( g, md_string_view ); // Group string view +//==================================== + eStrViewFG->setText( md->sText( sv, md_svfunction ) ); + eSvG->insertItem( "[ standart function ]" ); + eSvG->insertItem( "[ user function ]" ); + fid = md->sText( sv, md_fieldid ).toInt(); + stdf = md->attr( sv, mda_stdf ).toInt(); + eSvG->setCurrentItem( 0 ); + for ( i = 0; i < md->count( g, md_field ); i++ ) { + field = md->find( g, md_field, i ); + eSvG->insertItem( QString("%1").arg( md->attr( field, mda_name ) ) ); + fieldid = md->id( field ); + fieldsg.insert( i, new int( fieldid ) ); + if ( fid == fieldid && !stdf ) { + eSvG->setCurrentItem( i + 2 ); + eStrViewFG->setEnabled( FALSE ); + } + } + if ( !fid && !stdf ) { + eStrViewFG->setEnabled( TRUE ); + eSvG->setCurrentItem( 1 ); + } + +//==================================== + sv = md->find( e, md_string_view ); + eStrViewF->setText( md->sText( sv, md_svfunction ) ); + eSv->insertItem( "[ standart function ]" ); + eSv->insertItem( "[ user function ]" ); + fid = md->sText( sv, md_fieldid ).toInt(); + stdf = md->attr( sv, mda_stdf ).toInt(); + eSv->setCurrentItem( 0 ); + for ( i = 0; i < md->count( e, md_field ); i++ ) { + field = md->find( e, md_field, i ); + eSv->insertItem( QString("%1").arg( md->attr( field, mda_name ) ) ); + fieldid = md->id( field ); + fields.insert( i, new int( fieldid ) ); + if ( fid == fieldid && !stdf ) { + eSv->setCurrentItem( i + 2 ); + eStrViewF->setEnabled( FALSE ); + } + } + if ( !fid && !stdf ) { + eStrViewF->setEnabled( TRUE ); + eSv->setCurrentItem( 1 ); + } +} + + +void dEditCat::init() +{ + delete statusBar(); + eStrViewF->setInterpreter( new QSInterpreter() ); + eStrViewF->setEnabled( FALSE ); +} + + +void dEditCat::updateMD() +{ + aCfg *md = item->md; + aCfgItem obj = item->obj, sv, g, e; + + al->updateMD(); + re->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); + g = md->find( obj, md_group ); // Find group context + e= md->find( obj, md_element ); // Find Element context + //======== Element view save + sv = md->find( e, md_string_view ); + if ( sv.isNull() ) sv = md->insert( e, md_string_view ); + md->setSText( sv, md_svfunction, eStrViewF->text() ); + if ( eSv->currentItem() == 0 ) md->setAttr( sv, mda_stdf, "1" ); + else { + md->setAttr( sv, mda_stdf, "0" ); + if ( eSv->currentItem() == 1 ) md->setSText( sv, md_fieldid, "0" ); + else md->setSText( sv, md_fieldid, QString("%1").arg( *(fields.find( eSv->currentItem() - 2 ) ) ) ); + } + //======== Group view save + sv = md->find( g, md_string_view ); + if ( sv.isNull() ) sv = md->insert( g, md_string_view ); + md->setSText( sv, md_svfunction, eStrViewFG->text() ); + if ( eSvG->currentItem() == 0 ) md->setAttr( sv, mda_stdf, "1" ); + else { + md->setAttr( sv, mda_stdf, "0" ); + if ( eSvG->currentItem() == 1 ) md->setSText( sv, md_fieldid, "0" ); + else md->setSText( sv, md_fieldid, QString("%1").arg( *(fieldsg.find( eSvG->currentItem() - 2 ) ) ) ); + } + +} + +void dEditCat::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + + + + +void dEditCat::eSv_activated( int index ) +{ + if ( index == 1 ) eStrViewF->setEnabled( TRUE ); + else eStrViewF->setEnabled( FALSE ); +} + +void dEditCat::eSvG_activated( int index ) +{ + if ( index == 1 ) eStrViewFG->setEnabled( TRUE ); + else eStrViewFG->setEnabled( FALSE ); +} diff --git a/src/designer/deditcat.h b/src/designer/deditcat.h new file mode 100644 index 0000000..6943d7e --- /dev/null +++ b/src/designer/deditcat.h @@ -0,0 +1,38 @@ +#ifndef DEDITCAT_H +#define DEDITCAT_H + +#include "ui_deditcat.h" + + +class dEditCat : public Q3MainWindow, public Ui::dEditCat +{ + Q_OBJECT + +public: + dEditCat(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditCat(); + + aRoleEditor *re; + Q3IntDict fields, fieldsg; + aAliasEditor *al; + aListViewItem *item; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + virtual void eSv_activated( int index ); + virtual void eSvG_activated( int index ); + +protected: + int newVariable; + +protected slots: + virtual void languageChange(); + +private: + void init(); + void destroy(); + +}; + +#endif // DEDITCAT_H diff --git a/src/designer/deditcat.ui b/src/designer/deditcat.ui new file mode 100644 index 0000000..f2cf761 --- /dev/null +++ b/src/designer/deditcat.ui @@ -0,0 +1,266 @@ + + dEditCat + + + + 0 + 0 + 465 + 297 + + + + Catalogue + + + + + 0 + 0 + 465 + 297 + + + + + + + + + + + Common + + + + + + + + Name: + + + false + + + + + + + + + + + + Description: + + + false + + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + Element string view + + + + + + true + + + + + + + + + + + Group string view + + + + + + true + + + + + + + + + + + Access + + + + + + 0 + + + 2 + + + false + + + Q3Table::Multi + + + + Read + + + + + Write + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + QSEditor + QWidget +
qseditor.h
+
+
+ + mdtree.h + aliaseditor.h + mainform.h + roleeditor.h + qseditor.h + qseditor.h + + + + + eSv + activated(int) + dEditCat + eSv_activated(int) + + + 20 + 20 + + + 20 + 20 + + + + + eSv + highlighted(int) + dEditCat + eSv_activated(int) + + + 20 + 20 + + + 20 + 20 + + + + + eSvG + activated(int) + dEditCat + eSvG_activated(int) + + + 20 + 20 + + + 20 + 20 + + + + + eSvG + highlighted(int) + dEditCat + eSvG_activated(int) + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditcfg.cpp b/src/designer/deditcfg.cpp new file mode 100644 index 0000000..223bc1d --- /dev/null +++ b/src/designer/deditcfg.cpp @@ -0,0 +1,171 @@ +#include "deditcfg.h" + +#include +#include +#include + +#include "acfg.h" +#include "qlayout.h" +#include "qsproject.h" +#include "qsscript.h" +//#include "qseditor.h" +#include +#include + +#ifndef QSA_NO_IDE +#include "qsworkbench.h" +#endif + +/* + * Constructs a dEditCfg as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditCfg::dEditCfg(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditCfg::~dEditCfg() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditCfg::languageChange() +{ + retranslateUi(this); +} + +void dEditCfg::init() +{ + delete statusBar(); + + eDBType->clear(); + eDBType->insertItem(trUtf8("Unknown"), 0); + eDBType->insertItem(trUtf8("MySQL"), 1); + eDBType->insertItem(trUtf8("Postgres"), 2); +// QGridLayout *l=new QGridLayout(tabWidget->page(2)); +// eModule=NULL; +// eModule = new QSEditor(tabWidget->page(2), "global module"); +// l->addWidget(eModule, 5, 5, 0); + eModule->setInterpreter(new QSInterpreter()); +} + + + +void dEditCfg::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); + // item->editor = 0; +} + + +void dEditCfg::setData( aListViewItem *o ) +{ +// int n; +// char to[100]=""; +// cfg_objptr code, remark, context=NULL; +// char *id0; + item = o; + aCfg *md = item->md; + aCfgItem obj = item->obj; + + QString v; +// int rc=0; + + setCaption( tr("Business scheme parameters: ") + md->info( md_info_name ) ); + v = md->rc.value("dbtype"); + eDBType->setCurrentItem(0); + if ( v == "postgres" ) eDBType->setCurrentItem(2); + if ( v == "mysql" ) eDBType->setCurrentItem(1); + + eCfgName->setText( md->rc.value("configfile") ); + eWorkDir->setText( md->rc.value("workdir") ); + eDBHost->setText( md->rc.value("dbhost") ); + eDBName->setText( md->rc.value("dbname") ); + eDBHeader->setText( md->rc.value("dbtitle") ); + eDBPass->setText( md->rc.value("dbpass") ); + eDBUserName->setText( md->rc.value("dbuser") ); + eName->setText( md->info( md_info_name ) ); + eAuthor->setText( md->info( md_info_author ) ); + eDate->setText( md->info( md_info_date ) ); + eDescription->setText( md->info( md_info_remark ) ); + globals = md->find( obj, md_globals, 0 ); + eModule->setText( md->sText( globals, md_sourcecode ) ); + +/* + n=cfgobj_count(context, aot_remark); + if (n) { + id0=cfgobj_idn(context, aot_remark, 1, &remark); + if (remark) eRemark->setText(trUtf8(cfgobj_text(remark))); + } + n=cfgobj_count(context, aot_sourcecode); + if (n) { + id0=cfgobj_idn(context, aot_sourcecode, 1, &code); + if (code) eModule->setText(trUtf8(cfgobj_text(code))); + } +*/ +} + + + +void dEditCfg::updateMD() +{ +// int n; +// char to[100]=""; +// cfg_objptr code, remark, context=NULL; +// char *id; +// cfg_objptr o; + aCfg *md = item->md; + aCfgItem obj = item->obj; + + md->setInfo( md_info_name, eName->text() ); + md->setInfo( md_info_remark, eDescription->text() ); + md->setInfo( md_info_author, eAuthor->text() ); + md->setInfo( md_info_date, eDate->text() ); + md->rc.setValue( "configfile", eCfgName->text().stripWhiteSpace() ); + md->rc.setValue( "workdir", eWorkDir->text().stripWhiteSpace() ); + md->rc.setValue( "dbhost", eDBHost->text().stripWhiteSpace() ); + md->rc.setValue( "dbtitle", eDBHeader->text().stripWhiteSpace() ); + md->rc.setValue( "dbname", eDBName->text().stripWhiteSpace() ); + md->rc.setValue( "dbpass", eDBPass->text().stripWhiteSpace() ); + md->rc.setValue( "dbuser", eDBUserName->text().stripWhiteSpace() ); + if (eDBType->currentItem()==1) md->rc.setValue( "dbtype", "mysql" ); + if (eDBType->currentItem()==2) md->rc.setValue( "dbtype", "postgres" ); + globals = md->find( obj, md_globals, 0 ); + md->setSText( globals, md_sourcecode, eModule->text() ); + +/* + if (cancelupdate) return; + item->setText(0, eName->text()); +// item->setText(1, eID->text()); +// item->setText(2, eType->text()); +// o=cfgobj_find(eID->text()); +// if (o) { +// printf("founded id=%s!\n", cfgobj_attr(o,"id")); + cfg_setinfo("name", eName->text().utf8()); + n=cfgobj_count(context, aot_remark); + if (!n) remark=cfgobj_new(context, aot_remark, trUtf8("Комментарий"), NULL); + else id=cfgobj_idn(context, aot_remark, 1, &remark); + if (remark) cfgobj_settext(remark, eRemark->text().utf8()); + n=cfgobj_count(context, aot_sourcecode); + if (!n) code=cfgobj_new(context, aot_sourcecode, trUtf8("Глобальный модуль"), NULL); + else id=cfgobj_idn(context, aot_sourcecode, 1, &code); + if (code) cfgobj_settext(code, eModule->text().utf8()); + +*/ +} diff --git a/src/designer/deditcfg.h b/src/designer/deditcfg.h new file mode 100644 index 0000000..129d83e --- /dev/null +++ b/src/designer/deditcfg.h @@ -0,0 +1,29 @@ +#ifndef DEDITCFG_H +#define DEDITCFG_H + +#include "ui_deditcfg.h" + + +class dEditCfg : public Q3MainWindow, public Ui::dEditCfg +{ + Q_OBJECT + +public: + dEditCfg(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditCfg(); + + aListViewItem *item; + aCfgItem globals; + +public slots: + virtual void init(); + virtual void destroy(); + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +}; + +#endif // DEDITCFG_H diff --git a/src/designer/deditcfg.ui b/src/designer/deditcfg.ui new file mode 100644 index 0000000..6c0d3e7 --- /dev/null +++ b/src/designer/deditcfg.ui @@ -0,0 +1,449 @@ + + dEditCfg + + + + 0 + 0 + 461 + 364 + + + + + 400 + 364 + + + + Business scheme parameters + + + + + 0 + 0 + 461 + 364 + + + + + + + + 10 + + + + + Common + + + + + + + + + 80 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + Name + + + false + + + + + + + + + + + + + + + 80 + 0 + + + + Author + + + false + + + + + + + + + + + + + + + 80 + 0 + + + + Date + + + false + + + + + + + + + + + + + + Description + + + false + + + + + + + + + + + + + User + + + + + + + 160 + 0 + + + + Data base server user + + + false + + + + + + + + + + + + + 160 + 0 + + + + Data base password + + + false + + + + + + + QLineEdit::Password + + + + + + + + + + + + 160 + 0 + + + + + 160 + 32767 + + + + Data base type + + + false + + + + + + + false + + + false + + + + Unknown + + + + + mysql + + + + + postgres + + + + + + + + + + + + + 160 + 0 + + + + Data base server address + + + false + + + + + + + + + + + + + + + 160 + 0 + + + + Data base name + + + false + + + + + + + + + + + + + + + + + 160 + 0 + + + + Data base server port + + + false + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 130 + 21 + + + + + + + + + + + + + 160 + 0 + + + + Work directory + + + false + + + + + + + + + + + + + + + 160 + 0 + + + + Configuration file name + + + false + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Data base header + + + false + + + + + + + + + + + Global module + + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + QSEditor + QWidget +
qseditor.h
+
+
+ + mdtree.h + acfg.h + qseditor.h + mainform.h + qseditor.h + + + +
diff --git a/src/designer/deditcolumns.cpp b/src/designer/deditcolumns.cpp new file mode 100644 index 0000000..e78c624 --- /dev/null +++ b/src/designer/deditcolumns.cpp @@ -0,0 +1,266 @@ +#include "deditcolumns.h" + +#include +#include +#include + +#include +#include +//Added by qt3to4: +#include +#include +#include "acfg.h" + +/* + * Constructs a dEditColumns as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditColumns::dEditColumns(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditColumns::~dEditColumns() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditColumns::languageChange() +{ + retranslateUi(this); +} + +void dEditColumns::setData( ananasListViewItem * o ) +{ + item = o; + md = o->md; + obj = o->obj; + aCfgItem com_action, apix; + QPixmap pix; + + + usedFields = new ananasTreeView( gbFields, md ); + Q3GridLayout *l = new Q3GridLayout( gbFields ); + l->addWidget( usedFields, 0, 0); + availableFields = new ananasTreeView( frmFields, md ); + l = new Q3GridLayout( frmFields ); + l->addWidget( availableFields, 0, 0); + + aCfgItem cobj, fobj, dobj, pobj, tobj; + + uint n, fCount, tCount, addfields, addtables; + long id; + QString dName, fName; + cobj = md->parent(md->parent(obj)); + setCaption( tr("Column:") + md->attr( cobj, mda_name ) + "." + md->attr( obj, mda_name )); + eName->setText( md->attr( obj, mda_name ) ); + ananasListViewItem *fitem, *ditem, *titem, *tparent, *docs; + QStringList docsId = md->getJournalDocuments(cobj); + docs = new ananasListViewItem( availableFields, availableFields->lastItem(), md, md->find(md->find(mdc_metadata),md_documents,0), QObject::tr("Documents") ); + docs->setPixmap(0, rcIcon("doc_g.png")); + docs->setOpen(true); + n = docsId.count(); + for ( uint i = 0; i < n; i++ ) + { + id = docsId[i].toInt(); + dobj = md->find(id); + if ( dobj.isNull() ) + continue; + ditem = new ananasListViewItem( docs, docs->getLastChild(), md, dobj ); + ditem->setPixmap(0, rcIcon("doc.png")); + tobj = md->find(dobj,md_header,0); + tparent = new ananasListViewItem( ditem, ditem->getLastChild(), md, tobj, QObject::tr("Header") ); + tparent->setPixmap(0, rcIcon("doc_h.png")); + fCount = md->count(tobj,md_field); + for ( uint k = 0; k < fCount; k++ ) + { + fobj = md->find(tobj,md_field,k); + if ( fobj.isNull()) + continue; + fitem = new ananasListViewItem ( tparent, tparent->getLastChild(), md, fobj ); + fitem->setPixmap(0, rcIcon("field.png")); + } + pobj = md->find(ditem->obj, md_tables, 0); + if ( !pobj.isNull() ) + { + tparent = new ananasListViewItem( ditem, ditem->getLastChild(), md, pobj, QObject::tr("Tables") ); + tparent->setPixmap(0, rcIcon("table_g.png")); + addtables = 0; + tCount = md->count(pobj,md_table); + for ( uint j = 0; j < tCount; j++ ) + { + tobj = md->find ( pobj, md_table, j ); + if ( tobj.isNull() ) + continue; + titem = new ananasListViewItem( tparent, tparent->getLastChild(), md, tobj ); + titem->setPixmap(0, rcIcon("table.png")); + fCount = md->count(tobj,md_field); + addfields = 0; + for ( uint k = 0; k < fCount; k++ ) + { + fobj = md->find(tobj,md_field,k); + if ( fobj.isNull()) + continue; + QString sum = md->attr(fobj,mda_sum); + if ( sum != "1" ) + continue; + addfields++; + fitem = new ananasListViewItem ( titem, titem->getLastChild(), md, fobj ); + fitem->setPixmap(0, rcIcon("field.png")); + } + if ( !addfields ) + delete titem; + else + addtables++; + } + if ( !addtables ) + delete tparent; + } + } + fieldsList.clear(); + n = md->count(obj,md_fieldid); + for (uint i = 0; i < n; i++) + { + fobj = md->find( obj, md_fieldid, i ); + if ( fobj.isNull() ) + continue; + id = md->text(fobj).toLong(); + aCfgItem testitem = md->find(id); + if (testitem.isNull()) + md->remove( testitem ); + else + addField( testitem ); + } +} + + +void dEditColumns::updateMD() +{ + aCfgItem field; + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr(obj, mda_name, eName->text().stripWhiteSpace()); + do + { + field = md->findChild( obj, md_fieldid, 0 ); + if ( !field.isNull() ) + md->remove( field ); + } while ( !field.isNull() ); + ananasListViewItem *aitem = (ananasListViewItem *)usedFields->firstChild(); + if (!aitem) + return; + while ( aitem ) + { + field = md->insert( obj, md_fieldid, QString::null, -1 ); + md->setText( field, QString( "%1" ).arg( aitem->id ) ); + aitem = (ananasListViewItem *)aitem->nextSibling(); + } +} + +void dEditColumns::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + +void dEditColumns::init() +{ + statusBar()->hide(); +} + + +void +dEditColumns::bAddAction_clicked() +{ + ananasListViewItem *cur = (ananasListViewItem *)availableFields->selectedItem(); + if (!cur) + return; + if ( md->objClass( cur->obj ) != md_field ) + return; + eName->setText( md->attr( cur->obj, mda_name ) ); + addField( cur->obj ); +} + + +void dEditColumns::bRemoveAction_clicked() +{ + ananasListViewItem *rmItem = (ananasListViewItem*)usedFields->selectedItem(); + if ( !rmItem ) + return; + aCfgItem cobj = md->find(md->id(rmItem->obj)); + aCfgItem doc, parent = md->parent(cobj); + if ( md->objClass (parent) == md_header ) + doc = md->parent(parent); + else + doc = md->parent(md->parent(parent)); + fieldsList.remove(md->attr(doc,mda_id)); + usedFields->removeItem( rmItem ); +} + + +void dEditColumns::bMoveUp_clicked() +{ + Q3ListViewItem *aitem, *after; + + aitem = usedFields->selectedItem(); + if ( aitem ) + { + after = aitem->itemAbove(); + if ( after ) + after->moveItem( aitem ); + } +} + + +void dEditColumns::bMoveDown_clicked() +{ + Q3ListViewItem *aitem, *after; + aitem = usedFields->selectedItem(); + if ( aitem ) + { + after = aitem->itemBelow(); + if ( after ) + aitem->moveItem( after ); + } +} + + + +void dEditColumns::addField( aCfgItem addItem ) +{ + aCfgItem fparent, parent; + fparent = md->parent(addItem); + QString fName; + if ( md->objClass( fparent ) == md_header ) + { + fName = QObject::tr("header"); + parent = md->parent(fparent); + } + else + { + fName = md->attr( fparent, mda_name ); + parent = md->parent(md->parent(fparent)); + } + QString fId = md->attr( parent, mda_id ); + if ( fieldsList.findIndex(fId) != -1 ) + return; + fName = md->attr(parent,mda_name)+"."+fName+"."+md->attr(addItem,mda_name); + ananasListViewItem *aitem = new ananasListViewItem(usedFields, usedFields->lastItem(), md, addItem,fName ); + aitem->setPixmap(0, rcIcon("field.png")); + aitem->setRenameEnabled(0,false); + fieldsList.append(fId); +} + diff --git a/src/designer/deditcolumns.h b/src/designer/deditcolumns.h new file mode 100644 index 0000000..8e7478c --- /dev/null +++ b/src/designer/deditcolumns.h @@ -0,0 +1,41 @@ +#ifndef DEDITCOLUMNS_H +#define DEDITCOLUMNS_H + +#include "ui_deditcolumns.h" + + +class dEditColumns : public Q3MainWindow, public Ui::dEditColumns +{ + Q_OBJECT + +public: + dEditColumns(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditColumns(); + +public slots: + virtual void setData( ananasListViewItem * o ); + virtual void updateMD(); + virtual void bAddAction_clicked(); + virtual void bRemoveAction_clicked(); + virtual void bMoveUp_clicked(); + virtual void bMoveDown_clicked(); + +protected slots: + virtual void languageChange(); + +private: + aCfgItem obj; + aCfg *md; + aAliasEditor *al; + ananasListViewItem * item; + ananasTreeView *availableFields; + ananasTreeView *usedFields; + QStringList fieldsList; + + void destroy(); + void init(); + virtual void addField( aCfgItem addItem ); + +}; + +#endif // DEDITCOLUMNS_H diff --git a/src/designer/deditcolumns.ui b/src/designer/deditcolumns.ui new file mode 100644 index 0000000..f618475 --- /dev/null +++ b/src/designer/deditcolumns.ui @@ -0,0 +1,293 @@ + + dEditColumns + + + + 0 + 0 + 495 + 361 + + + + Columns + + + + + 0 + 0 + 495 + 361 + + + + + + + + + Name: + + + false + + + + + + + true + + + + 0 + 22 + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 44 + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 35 + + + + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + + + + 0 + 0 + + + + Columns + + + 0 + + + 0 + + + + + + + + Action + + + Action + + + + + rcIcon + + + Q3GroupBox + QGroupBox +
Qt3Support/Q3GroupBox
+ 1 +
+ + Q3Frame + QFrame +
Qt3Support/Q3Frame
+ 1 +
+ + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+
+ + atreeitems.h + aliaseditor.h + mdtree.h + mainform.h + + + + + bAddAction + clicked() + dEditColumns + bAddAction_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bRemoveAction + clicked() + dEditColumns + bRemoveAction_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bMoveUp + clicked() + dEditColumns + bMoveUp_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bMoveDown + clicked() + dEditColumns + bMoveDown_clicked() + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditcommand.cpp b/src/designer/deditcommand.cpp new file mode 100644 index 0000000..5423ecb --- /dev/null +++ b/src/designer/deditcommand.cpp @@ -0,0 +1,241 @@ +#include "deditcommand.h" + +#include +#include +#include + +#include +#include +//Added by qt3to4: +#include +#include "acfg.h" + +//extern aCfg cfg; + +/* + * Constructs a dEditCommand as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditCommand::dEditCommand(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditCommand::~dEditCommand() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditCommand::languageChange() +{ + retranslateUi(this); +} + +void dEditCommand::updateMD() +{ + aCfgItem com_action, apix; + al->updateMD( ); + QPixmap pix; + + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); + md->setSText( obj, md_menutext, eMenuText->text() ); + + QString sKey = ""; + if ( cbKey-> currentText () != "" ) + { + if ( cbCTRL->isChecked() ) + sKey += md_km_ctrl; + if ( cbALT->isChecked() ) + sKey += md_km_alt; + if ( cbShift->isChecked() ) + sKey += md_km_shift; + sKey += cbKey->currentText (); + } + md->setSText( obj, md_key, sKey ); + + do + { + com_action = md->findChild( obj, md_comaction, 0 ); + if ( !com_action.isNull() ) + md->remove( com_action ); + } while ( !com_action.isNull() ); + ananasListViewItem *aitem = (ananasListViewItem *)vComActions->firstChild(); + if (!aitem) + return; + while ( aitem ) + { + com_action = md->insert( obj, md_comaction, QString::null, -1 ); + md->setText( com_action, QString( "%1" ).arg( aitem->id ) ); + aitem = (ananasListViewItem *)aitem->nextSibling(); + } + aitem = (ananasListViewItem *)vComActions->firstChild(); + apix = md->findChild( md->find( aitem->id ), md_active_picture, 0 ); + if ( apix.isNull() ) + return; + pix.loadFromData( md->binary( apix ) ); + item->setPixmap( 0, pix ); +} + +void dEditCommand::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + +void dEditCommand::init() +{ + statusBar()->hide(); +} + +void dEditCommand::setData( InterfaceListViewItem * o ) +{ + int i, j, n, k, id; + item = o; + md = o->md; + obj = o->obj; + aCfgItem com_action, apix; + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + QPixmap pix; + + vComActions = new ananasTreeView( tabWidget2->page(1), md ); + vComActions->setSorting( -1 ); + // TODO Fixme!!! + //--layout28->addWidget( vComActions, 0, 0 ); + actiontree = new aActionTreeView ( tabWidget2->page(1), md ); + disconnect( actiontree, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), actiontree, SLOT(ContextMenu() ) ); + disconnect( actiontree, SIGNAL( returnPressed( Q3ListViewItem*) ), actiontree, SLOT( itemEdit() ) ); + disconnect( actiontree, SIGNAL( doubleClicked( Q3ListViewItem*) ), actiontree, SLOT( itemEdit() ) ); + // TODO Fixme!!! + //--layout29->addWidget( actiontree, 0, 0 ); + + al = a; + al->setData(); + + setCaption( tr("Command:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + eMenuText->setText( md->sText( obj, md_menutext ) ); + eDescription->setText( md->sText( obj, md_description ) ); + + QString sKey = md->sText( obj, md_key ); + if ( ( sKey.find (md_km_ctrl) ) >= 0 ) + { + cbCTRL->setChecked ( TRUE ); + sKey.remove(md_km_ctrl); + } + if ( ( sKey.find (md_km_alt) ) >= 0 ) + { + cbALT->setChecked ( TRUE ); + sKey.remove(md_km_alt); + } + if ( ( sKey.find (md_km_shift) ) >= 0 ) + { + cbShift->setChecked ( TRUE ); + sKey.remove(md_km_shift); + } + + + n = cbKey->count(); + for ( i = 0; i < n; i++ ) + if ( sKey == cbKey->text( i ) ) + { + cbKey->setCurrentItem( i ); + break; + } + n = md->countChild( obj, md_comaction ); + k = md->count( md->find ( mdc_actions ), md_action ); + ananasListViewItem *aitem; + aCfgItem actionObj; + for ( i = 0; i < n; i++ ) + { + actionObj = md->find (obj, md_comaction, i); + id = md->text(actionObj).toLong(); + if ( actionObj.isNull() ) + md->remove(actionObj); + com_action = md->find(id); + aitem = new ananasListViewItem (vComActions, vComActions->lastItem(), md, com_action); + aitem->setRenameEnabled( 0, FALSE ); + apix = md->findChild( com_action, md_active_picture, 0 ); + if ( apix.isNull() ) + break; + pix.loadFromData( md->binary( apix ) ); + aitem->setPixmap( 0, pix ); +/* for ( j = 0; j < k; j++) + { + com_action = md->find ( md->find( mdc_actions ), md_action, j ); + if ( md->id(com_action) == id ) + { + aitem = new ananasListViewItem (vComActions, vComActions->lastItem(), md, com_action); + aitem->setRenameEnabled( 0, FALSE ); + apix = md->findChild( com_action, md_active_picture, 0 ); + if ( apix.isNull() ) + break; + pix.loadFromData( md->binary( apix ) ); + aitem->setPixmap( 0, pix ); + } + }*/ + } +} + + +void +dEditCommand::bAddAction_clicked() +{ + aCfgItem apix; + QPixmap pix; + + ananasListViewItem *cur = (ananasListViewItem *)actiontree->selectedItem(); + if (!cur) + return; + if ( md->objClass( cur->obj ) != md_action ) + return; + ananasListViewItem *aitem = new ananasListViewItem(vComActions, vComActions->lastItem(), md, cur->obj ); + apix = md->findChild( md->find( aitem->id ), md_active_picture, 0 ); + pix.loadFromData( md->binary( apix ) ); + aitem->setPixmap( 0, pix ); +} + + +void dEditCommand::bRemoveAction_clicked() +{ + vComActions->removeItem( vComActions->selectedItem() ); +} + + +void dEditCommand::bMoveUp_clicked() +{ + ananasListViewItem *aitem, *after; + + aitem = (ananasListViewItem *) vComActions->selectedItem(); + if ( aitem ) { + after = (ananasListViewItem *)aitem->itemAbove(); + if ( after ) after->moveItem( aitem ); + } + +} + + +void dEditCommand::bMoveDown_clicked() +{ + ananasListViewItem *aitem, *after; + aitem = (ananasListViewItem *)vComActions->selectedItem(); + if ( aitem ) { + after = (ananasListViewItem *)aitem->itemBelow(); + if ( after ) aitem->moveItem( after ); + } +} diff --git a/src/designer/deditcommand.h b/src/designer/deditcommand.h new file mode 100644 index 0000000..3b22e6c --- /dev/null +++ b/src/designer/deditcommand.h @@ -0,0 +1,39 @@ +#ifndef DEDITCOMMAND_H +#define DEDITCOMMAND_H + +#include "ui_deditcommand.h" + + +class dEditCommand : public Q3MainWindow, public Ui::dEditCommand +{ + Q_OBJECT + +public: + dEditCommand(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditCommand(); + + ananasTreeView *vComActions; + aActionTreeView *actiontree; + InterfaceListViewItem * item; + aAliasEditor *al; + aCfg *md; + aCfgItem obj; + +public slots: + virtual void updateMD(); + virtual void setData( InterfaceListViewItem * o ); + virtual void bAddAction_clicked(); + virtual void bRemoveAction_clicked(); + virtual void bMoveUp_clicked(); + virtual void bMoveDown_clicked(); + +protected slots: + virtual void languageChange(); + +private: + void destroy(); + void init(); + +}; + +#endif // DEDITCOMMAND_H diff --git a/src/designer/deditcommand.ui b/src/designer/deditcommand.ui new file mode 100644 index 0000000..9320388 --- /dev/null +++ b/src/designer/deditcommand.ui @@ -0,0 +1,577 @@ + + dEditCommand + + + + 0 + 0 + 569 + 371 + + + + Command + + + + + 0 + 0 + 569 + 371 + + + + + + + + + + QTabWidget::Rounded + + + + Common + + + + + + + + Description: + + + false + + + + + + + + + + + + + + Hot Key: + + + false + + + + + + + Ctrl + + + + + + + Alt + + + + + + + Shift + + + + + + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 0 + + + + + A + + + + + B + + + + + C + + + + + D + + + + + E + + + + + F + + + + + G + + + + + H + + + + + I + + + + + J + + + + + K + + + + + L + + + + + M + + + + + N + + + + + O + + + + + P + + + + + Q + + + + + R + + + + + S + + + + + T + + + + + U + + + + + V + + + + + W + + + + + X + + + + + Y + + + + + Z + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 71 + 20 + + + + + + + + + + Type: + + + false + + + + + + + Menu text + + + false + + + + + + + + + + true + + + + 0 + 22 + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 360 + 20 + + + + + + + + + + + Name: + + + false + + + + + + + + Actions + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 44 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 44 + + + + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+
+ + interfacetree.h + aliaseditor.h + actiontree.h + mainform.h + + + + + bAddAction + clicked() + dEditCommand + bAddAction_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bRemoveAction + clicked() + dEditCommand + bRemoveAction_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bMoveUp + clicked() + dEditCommand + bMoveUp_clicked() + + + 20 + 20 + + + 20 + 20 + + + + + bMoveDown + clicked() + dEditCommand + bMoveDown_clicked() + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditdialog.cpp b/src/designer/deditdialog.cpp new file mode 100644 index 0000000..9580d6a --- /dev/null +++ b/src/designer/deditdialog.cpp @@ -0,0 +1,337 @@ +#include "deditdialog.h" + +#include +#include +#include + +#include "qtextcodec.h" + +#include +#include +#include +#include "acfg.h" +#include "qsproject.h" +#include "qsscript.h" +#include +#include +//--#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "formdesigner.h" +#include "mainform.h" +#include "alog.h" + +//#include "qananastable.h" +//#include + +//extern QApplication *application; + +/* + * Constructs a dEditDialog as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditDialog::dEditDialog(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditDialog::~dEditDialog() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditDialog::languageChange() +{ + retranslateUi(this); +} + +void dEditDialog::init() +{ + delete statusBar(); + eModule->setInterpreter(new QSInterpreter()); +// fd = new aFormDesigner(); +} + + +void dEditDialog::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + + +void dEditDialog::setData( aListViewItem *o ) +{ + item=NULL; + QString parentClass; + if (o) { + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj; + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + eName->setText( md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); + eModule->setText( md->sText( obj, md_sourcecode ) ); + eFormFile->setText( QString("inputform_")+QString::number(item->id)+QString(".ui")); + setCaption( tr("Form:") + eName->text() ); + parentClass = md->objClass( md->parent ( md->parent( obj ) ) ); + if ( parentClass == md_document ) { +// cbFormMode->insertItem(QObject::tr("Document")); + } + if ( parentClass == md_catalogue ) { +// cbDefault->insertItem(QObject::tr("selection")); + cbFormMode->clear(); + cbFormMode->insertItem(QObject::tr("Elements list dialog")); + cbFormMode->insertItem(QObject::tr("Element dialog")); + cbFormMode->insertItem(QObject::tr("Group dialog")); + } + else cbSelect->setHidden( true ); + int i = md->sText(obj, md_defaultmod).toInt(); + cbNew->setChecked( (i>>md_form_new)%2 ); + cbView->setChecked( (i>>md_form_view)%2 ); + cbEdit->setChecked( (i>>md_form_edit)%2 ); + cbSelect->setChecked( (i>>md_form_select)%2 ); + i = md->attr( obj, mda_type ).toInt(); + cbFormMode->setCurrentItem( i ); + i = md->attr( obj, mda_readonly ).toInt(); + cbReadOnly->setChecked( i ); + QString ui= md->sText( obj, md_formdesign ); +// bPreview->setDisabled(ui.isEmpty()); + } +} + +//#include "mainform.h" +//#include +//extern MainForm *mainform; + +void dEditDialog::EditForm() +{ + + aCfg *md = item->md; + aCfgItem obj = item->obj, o; + QString ui, s, tpl_name = "inputform.ui.tpl", tpldir; + QFile f( eFormFile->text() ); +// char* arg; +// int rc; + aLog::print(aLog::Debug,tr("dEditDialog edit form")); + //MainForm *mw = (MainForm*) topLevelWidget(); + //printf("end getting pointer to Main form\n"); + QStringList env; +// QProcess proc( this ); + +#ifdef Q_OS_WIN32 + tpldir = qApp->applicationDirPath()+"/templates/"; +#else + tpldir = "/usr/share/ananas/templates/"; +#endif + tpldir = ":/designer/templates/"; + +/* + int rc; + char* arg; + QFile f; + QString s; + const char *ui; + int fc=0; + + if (cfg_rcfile()) { + setenv("ANANASRCFILE",cfg_rcfile(),1); + } else { + cfg_message(1, "Ошибка! Не удалось получить значение для записи в ANANASRCFILE\n"); + } +*/ + + if (!f.exists()) + { + aLog::print(aLog::Debug,tr("dEditDialog form file does not exists")); + ui= md->sText( obj, md_formdesign ); + if (!ui.isEmpty()) + { + + aLog::print(aLog::Debug, tr("dEditDialog create form file from metadata")); + QFile f1(eFormFile->text()); + f1.open(QIODevice::WriteOnly); + f1.writeBlock(ui, strlen(ui)); + f1.close(); + + } + else + { + aLog::print(aLog::Debug, tr("dEditDialog create new form file from template")); + o = md->parent( md->parent( obj ) ); + if ( md->objClass( o ) == md_document ) tpl_name = "inputformdoc.tpl"; + if ( md->objClass( o ) == md_catalogue ) tpl_name = "inputformcat.tpl"; + if ( md->objClass( o ) == md_journal ) tpl_name = "inputformjourn.tpl"; + if ( md->objClass( o ) == md_report ) tpl_name = "inputformrep.tpl"; + QFile fi( tpldir+tpl_name ); + if ( fi.open( QIODevice::ReadOnly )) + { + if(f.open( QIODevice::WriteOnly )) + { + Q3TextStream tso( &f ); + tso.setEncoding( Q3TextStream::UnicodeUTF8 ); + QString form = fi.readAll(); +// printf("obj id = %i\n", md->id( o ) ); + form.replace( QString("$$$id$$$"), QString("%1").arg( md->id( o ) ) ); + form.replace( QString("$$$name$$$"), QString("") ); + form.replace( QString("$$$caption$$$"), md->attr( o, mda_name ) ); + tso << form; //tsi.read(); + fi.close(); + f.close(); + } + else + { + aLog::print(aLog::Error, tr("dEditDialog open file %1 for write").arg(f.name())); + } + } + else + { + aLog::print(aLog::Error,tr("dEditDialog open file %1 for read from templates directory %2").arg(tpl_name).arg(tpldir)); + } +// s=QString("cp inputform.ui.tpl ")+ eFormFile->text(); +// system((const char *)s); + } + } + + if(!QFile(eFormFile->text()).exists()) + { + + aLog::print(aLog::Error, tr("dEditDialog file %1 not exists").arg(eFormFile->text())); + } + formdesigner->fileOpen( eFormFile->text() ); + aLog::print(aLog::Debug, tr("dEditDialog show formdesigner")); + formdesigner->show(); + +// } + + +// +// if (!proc.start()) { +// printf("Error running qt designer\n"); +// } +//CHECK_POINT +/* + if ((rc=fork())==0) { + arg = strdup( (const char *) eFormFile->text() ); + execlp("designer","designer","-client",arg,0); + printf("Error running qt designer: errno=%d\terror=%s\n", + errno,strerror(errno)); + } else if (rc==-1) { + printf("Error while fork: errno=%d\terror=%s\n", + errno,strerror(errno)); + } +*/ +} + + +void dEditDialog::EditModule() +{ +// cfgobj_editcode(objectptr); +} + + +void dEditDialog::updateMD() +{ + + formdesigner->fileSaveAll(); + aCfg *md = item->md; + aCfgItem obj = item->obj; + QString ui; + QFile f(eFormFile->text()); +//if (cancelupdate) return; + al->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_type, cbFormMode->currentItem() ); + md->setAttr( obj, mda_readonly, cbReadOnly->isChecked() ); + md->setSText( obj, md_description, eDescription->text() ); + md->setSText( obj, md_sourcecode, eModule->text() ); +// ui.arg(cbDefault->currentItem()); +// md->setSText( obj, md_defaultmod, QString( "%1" ).arg( cbDefault->currentItem() ) ); + int i = (1<isChecked() + \ + (1<isChecked() + \ + (1<isChecked() +\ + (1<isChecked(); + md->setSText( obj, md_defaultmod, QString( "%1" ).arg( i ) ); + if (f.open(QIODevice::ReadOnly)){ + Q3TextStream ts(&f); + ts.setEncoding(Q3TextStream::UnicodeUTF8); + ui=ts.read(); + md->setSText( obj, md_formdesign, ui ); + f.close(); + f.remove(); + } + +} + + + +void dEditDialog::formPreview() +{ +// if ( !QFile::exists(eFormFile->text())) return; + + aCfg *md = item->md; + aCfgItem obj = item->obj; + QString ui, s; + QFile f(eFormFile->text()); + + if (!f.exists()){ + ui= md->sText( obj, md_formdesign ); + if (!ui.isEmpty()) { + f.open(QIODevice::WriteOnly); + f.writeBlock(ui, strlen(ui)); + f.close(); + } else { + return; + QFile fi("inputform.ui.tpl"); + if ( fi.open( QIODevice::ReadOnly ) && f.open( QIODevice::WriteOnly ) ){ + Q3TextStream tsi( &fi ), tso( &f ); + tso << tsi.read(); + fi.close(); + f.close(); + } + } + } + + QIODevice *d; + d= &f; + d->open(QIODevice::ReadOnly); + //--QWidget *form = QWidgetFactory::create(d); + QFormBuilder fb; + QWidget *form = fb.load(d); + d->close(); + if (form) form->show(); + else printf("Error create form\n"); + +} + + + + +int dEditDialog::getDocId() +{ + return docId; +} diff --git a/src/designer/deditdialog.h b/src/designer/deditdialog.h new file mode 100644 index 0000000..8010dce --- /dev/null +++ b/src/designer/deditdialog.h @@ -0,0 +1,38 @@ +#ifndef DEDITDIALOG_H +#define DEDITDIALOG_H + +#include "ui_deditdialog.h" + + +class dEditDialog : public Q3MainWindow, public Ui::dEditDialog +{ + Q_OBJECT + +public: + dEditDialog(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditDialog(); + + int docId; + aAliasEditor *al; + aFormDesigner *fd; + aListViewItem *item; + + virtual int getDocId(); + +public slots: + virtual void init(); + virtual void destroy(); + virtual void setData( aListViewItem * o ); + virtual void EditForm(); + virtual void EditModule(); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +private slots: + virtual void formPreview(); + +}; + +#endif // DEDITDIALOG_H diff --git a/src/designer/deditdialog.ui b/src/designer/deditdialog.ui new file mode 100644 index 0000000..6b1a01d --- /dev/null +++ b/src/designer/deditdialog.ui @@ -0,0 +1,374 @@ + + dEditDialog + + + + 0 + 0 + 436 + 336 + + + + Form + + + + + 0 + 0 + 436 + 336 + + + + + + + 1 + + + + Common + + + + + + + + Description: + + + false + + + + + + + + + + + + + 100 + 0 + + + + Module file + + + false + + + + + + + Form mode: + + + false + + + + + + + + + + + 100 + 0 + + + + Name + + + false + + + + + + + Use for: + + + false + + + + + + + true + + + + + + + + Dialog + + + + + + + + false + + + + + + + + 100 + 0 + + + + Form file + + + false + + + + + + + New + + + + + + + View + + + + + + + Edit + + + + + + + Selection + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 30 + 21 + + + + + + + + Read only + + + + + + + + Design + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 151 + 171 + + + + + + + + Designer + + + + + + + Preview + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + Module + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + rcIcon + + + Q3Frame + QFrame +
Qt3Support/Q3Frame
+ 1 +
+ + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + QSEditor + QWidget +
qseditor.h
+
+
+ + mdtree.h + formdesigner.h + aliaseditor.h + mainform.h + qseditor.h + + + + + bPreview + clicked() + dEditDialog + formPreview() + + + 20 + 20 + + + 20 + 20 + + + + + pbDesigner + clicked() + dEditDialog + EditForm() + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditdoc.cpp b/src/designer/deditdoc.cpp new file mode 100644 index 0000000..a1a383e --- /dev/null +++ b/src/designer/deditdoc.cpp @@ -0,0 +1,131 @@ +#include "deditdoc.h" + +#include +#include +#include + +#include +#include "acfg.h" +#include +#include + +/* + * Constructs a dEditDoc as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditDoc::dEditDoc(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditDoc::~dEditDoc() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditDoc::languageChange() +{ + retranslateUi(this); +} + +void dEditDoc::init() +{ + delete statusBar(); + eModule->setInterpreter( new QSInterpreter() ); + eStrViewF->setInterpreter( new QSInterpreter() ); + eStrViewF->setEnabled( FALSE ); +} + + +void dEditDoc::destroy() +{ + updateMD(); + item->editor = 0; + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + + +void dEditDoc::setData( aListViewItem *o ) +{ + long int i; + int fid, fcount, fieldid, stdf; + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj, sv, field; + + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + aRoleEditor *r = new aRoleEditor( md, obj, tRoles, md_document ); + re = r; + re->setData(); + setCaption( tr("Document:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); + eModule->setText( md->sText( obj, md_sourcecode ) ); + sv = md->find( obj, md_string_view ); + eStrViewF->setText( md->sText( sv, md_svfunction ) ); + eSv->insertItem( "[ standart function ]" ); + eSv->insertItem( "[ user function ]" ); + fid = md->sText( sv, md_fieldid ).toInt(); + stdf = md->attr( sv, mda_stdf ).toInt(); + eSv->setCurrentItem( 0 ); + for ( i = 0; i < md->count( obj, md_field ); i++ ) { + field = md->find( obj, md_field, i ); + eSv->insertItem( QString("%1").arg( md->attr( field, mda_name ) ) ); + fieldid = md->id( field ); + fields.insert( i, new int( fieldid ) ); + if ( fid == fieldid && !stdf ) { + eSv->setCurrentItem( i + 2 ); + eStrViewF->setEnabled( FALSE ); + } + } + if ( !fid & !stdf ) { + eStrViewF->setEnabled( TRUE ); + eSv->setCurrentItem( 1 ); + } +} + +void dEditDoc::updateMD() +{ + aCfg *md = item->md; + aCfgItem obj = item->obj, sv; + + al->updateMD(); + re->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); + md->setSText( obj, md_sourcecode, eModule->text() ); + sv = md->find( obj, md_string_view ); + if ( sv.isNull() ) sv = md->insert( obj, md_string_view ); + md->setSText( sv, md_svfunction, eStrViewF->text() ); + if ( eSv->currentItem() == 0 ) md->setAttr( sv, mda_stdf, "1" ); + else { + md->setAttr( sv, mda_stdf, "0" ); + if ( eSv->currentItem() == 1 ) md->setSText( sv, md_fieldid, "0" ); + else md->setSText( sv, md_fieldid, QString("%1").arg( *(fields.find( eSv->currentItem() - 2 ) ) ) ); + } +} + + + +void dEditDoc::eSv_activated( int index ) +{ + if ( index == 1 ) eStrViewF->setEnabled( TRUE ); + else eStrViewF->setEnabled( FALSE ); +} diff --git a/src/designer/deditdoc.h b/src/designer/deditdoc.h new file mode 100644 index 0000000..ac1437b --- /dev/null +++ b/src/designer/deditdoc.h @@ -0,0 +1,34 @@ +#ifndef DEDITDOC_H +#define DEDITDOC_H + +#include "ui_deditdoc.h" + + +class dEditDoc : public Q3MainWindow, public Ui::dEditDoc +{ + Q_OBJECT + +public: + dEditDoc(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditDoc(); + + aListViewItem *item; + aAliasEditor *al; + Q3IntDict fields; + aRoleEditor *re; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + virtual void eSv_activated( int index ); + +protected slots: + virtual void languageChange(); + + virtual void init(); + virtual void destroy(); + + +}; + +#endif // DEDITDOC_H diff --git a/src/designer/deditdoc.ui b/src/designer/deditdoc.ui new file mode 100644 index 0000000..4444461 --- /dev/null +++ b/src/designer/deditdoc.ui @@ -0,0 +1,225 @@ + + dEditDoc + + + + 0 + 0 + 446 + 322 + + + + Document + + + + + 0 + 0 + 446 + 322 + + + + + + + + + + QTabWidget::Rounded + + + + Common + + + + + + + + Name + + + false + + + + + + + + + + + + Description: + + + false + + + + + + + + + + + Module + + + + + + + + + + Aliases + + + + + + 0 + + + 1 + + + + Name + + + + + + + + + String view + + + + + + + + + false + + + + + + + + Access + + + + + + 0 + + + 2 + + + false + + + Q3Table::Multi + + + + Read + + + + + Write + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + QSEditor + QWidget +
qseditor.h
+
+
+ + mdtree.h + aliaseditor.h + mainform.h + roleeditor.h + qseditor.h + qseditor.h + + + + + eSv + activated(int) + dEditDoc + eSv_activated(int) + + + 20 + 20 + + + 20 + 20 + + + + + eSv + highlighted(int) + dEditDoc + eSv_activated(int) + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditfield.cpp b/src/designer/deditfield.cpp new file mode 100644 index 0000000..cd575de --- /dev/null +++ b/src/designer/deditfield.cpp @@ -0,0 +1,326 @@ +#include "deditfield.h" + +#include +#include +#include + +#include "acfg.h" +#include "acfgrc.h" +#include +#include "alog.h" + +/* +#include +#include +#include +#include +*/ + +/* + * Constructs a dEditField as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditField::dEditField(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditField::~dEditField() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditField::languageChange() +{ + retranslateUi(this); +} + +void +setText(){ + +} + + +void dEditField::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + + + +void dEditField::init() +{ +// eModule->setInterpreter(new QSInterpreter()); + delete statusBar(); + otypes.clear(); + artypes.clear(); + eType->clear(); + otypes.append(" "); + eType->insertItem(tr("Unknown"), 0); + +} + + +void dEditField::setData( aListViewItem *o ) +{ + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj; + + QString ts; + char t=' '; + int w=0, d=0, oid, idx=0; + unsigned int i; + + + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + // setCaption( tr("Field:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + nameChanged(); + // eID->setText( md->attr( obj, mda_id ) ); + ts = md->attr( obj, mda_type ); + if(md->objClass(md->parent(obj))==md_element) + { + saldoTextLabel->show(); + comboBox2->show(); +// updateGeometry(); + } + else + { + saldoTextLabel->hide(); + comboBox2->hide(); +// layout()->remove(comboBox2); +// layout()->remove(saldoTextLabel); + +// updateGeometry(); + } + // eType0->setText( ts ); + // eModule->setText( md->sText( obj, md_sourcecode ) ); + eDescription->setText( md->sText( obj, md_description ) ); + + if( md->attr( obj, mda_sort ) == "1" ) efSort->setChecked( true ); + else efSort->setChecked( false ); + if( md->attr( obj, mda_plus ) == "1" ) efPlus->setChecked( true ); + else efPlus->setChecked( false ); + if( md->attr( obj, mda_nz ) == "1" ) efNZ->setChecked( true ); + else efNZ->setChecked( false ); + efSum->setChecked(md->attr( obj, mda_sum ) == "1"); + + QStringList tlist; + if(md->objClass(md->parent(obj))==md_resources) + { + tlist.append("\t"+QObject::tr("Unknown")); + tlist.append("N %d %d\t"+QObject::tr("Numberic")); + } + else + { + tlist = md->types(); + } + otypes.clear(); + + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + + if ( !ts.isEmpty() ) + { + sscanf( ts, "%c %d %d", &t, &w, &d ); + } + else + { + t = 'N'; + w = 10; + } + if ( t=='O' ) { + for( i = 0 ; i < otypes.count(); i++ ) { + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == w ) { + eType->setCurrentItem( i ); + break; + } + } + } + } else { + if ( t == ' ' ) eType->setCurrentItem( 0 ); + if ( t == 'N' ) + { + eWidth->setMaxValue(20); + eDec->setMaxValue(99); + eType->setCurrentItem( 1 ); + } + if ( t == 'C' ) + { + + eWidth->setMaxValue(254); + eDec->setMaxValue(99); + eType->setCurrentItem( 2 ); + } + if ( t == 'D' ) eType->setCurrentItem( 3 ); + if ( t == 'B' ) eType->setCurrentItem( 4 ); + eWidth->setValue( w ); + eDec->setValue( d ); + } + aCfgItem obj2; + int n, n1,aregid, aregfid; + QString str; + QStringList l_name; + //long oid; + aCfgItem context = md->findChild(md->find(mdc_metadata),md_registers); + comboBox2->clear(); + comboBox2->insertItem(" "); + artypes.clear(); + artypes.append(" "); + n = md->count( context, md_aregister ); +// printf("n=%d name = %s\n",n, md->attr(context,mda_name).ascii()); + for (i=0; ifind( context, md_aregister, i); + if ( !obj.isNull() ) + { + aregid=md->attr(obj,mda_id).toInt(); + str = tr(QString("AccumulationRegister."))+md->attr( obj, mda_name ); + //printf("`%s'\n",str.ascii()); + obj = md->findChild(obj,md_resources); + n1 = md->count( obj, md_field); +// printf("n=%d name = %s\n",n, md->attr(obj,mda_name).ascii()); + for (uint j=0; jfind( obj, md_field, j); + if ( !obj2.isNull() ) + { + aregfid = md->attr(obj2, mda_id).toInt(); + artypes.append(QString(" %1 %2").arg(aregid).arg(aregfid)); + comboBox2->insertItem(str+"."+md->attr( obj2, mda_name )); + if(w==aregid && d==aregfid) comboBox2->setCurrentItem(comboBox2->count()-1); + } + } + } + } + typeSelect( eType->currentItem() ); +} + +void dEditField::updateMD() +{ + QString st; + + aCfg *md = item->md; + aCfgItem obj = item->obj; + + al->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); +// md->setSText( obj, md_sourcecode, eModule->text() ); + + if ( md->objClass(md->parent(obj)) == md_resources ) + efSort->setChecked( true ); + if( efSort->isChecked() ) md->setAttr( obj, mda_sort, "1" ); + else md->setAttr( obj, mda_sort, "0" ); + if( efPlus->isChecked() ) md->setAttr( obj, mda_plus, "1" ); + else md->setAttr( obj, mda_plus, "0" ); + if( efNZ->isChecked() ) md->setAttr( obj, mda_nz, "1" ); + else md->setAttr( obj, mda_nz, "0" ); + if( efSum->isChecked() ) + md->setAttr( obj, mda_sum, "1" ); + else + md->setAttr( obj, mda_sum, "0" ); + if(eType->currentItem()==0) + { + st.sprintf(artypes[comboBox2->currentItem()]); + } + else + { + st.sprintf( otypes[ eType->currentItem() ], eWidth->value(), eDec->value() ); + printf("type is %s\n",st.ascii()); + if ( efSort->isChecked() ) + st.append(" I"); + } + //printf("%s\n",st.ascii()); + md->setAttr( obj, mda_type, st ); +} + + +void dEditField::typeSelect( int idx ) +{ + if ( otypes[ idx ][0] == 'N' ) + { + eWidth->setMaxValue(20); + eWidth->show(); + eDec->setMaxValue(99); + eDec->show(); + tWidth->show(); + tDec->show(); + efSum->show(); + comboBox2->setEnabled(false); + } + else + { + if ( otypes[ idx ][0] == 'C' ) + { + eWidth->setMaxValue(254); + eWidth->show(); + eDec->hide(); + tWidth->show(); + tDec->hide(); + efSum->hide(); + efSum->setChecked(false); + comboBox2->setEnabled(false); + } + else + { + if( idx == 0) + { + comboBox2->setEnabled(true); + eWidth->hide(); + eDec->hide(); + tWidth->hide(); + tDec->hide(); + efSum->hide(); + efSum->setChecked(false); + } + else + { + comboBox2->setEnabled(false); + eWidth->hide(); + eDec->hide(); + tWidth->hide(); + tDec->hide(); + efSum->hide(); + efSum->setChecked(false); + // comboBox2->setEnabled(false); + } + } + } +} + + +void dEditField::nameChanged() +{ + setCaption( tr("Field:") + eName->text() ); +} + + +void dEditField::AARegSelect( int i ) +{ + +} diff --git a/src/designer/deditfield.h b/src/designer/deditfield.h new file mode 100644 index 0000000..05eed74 --- /dev/null +++ b/src/designer/deditfield.h @@ -0,0 +1,38 @@ +#ifndef DEDITFIELD_H +#define DEDITFIELD_H + +#include "ui_deditfield.h" + + +class dEditField : public Q3MainWindow, public Ui::dEditField +{ + Q_OBJECT + +public: + dEditField(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditField(); + + QStringList otypes; + QStringList artypes; + aListViewItem *item; + aAliasEditor *al; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + virtual void typeSelect( int idx ); + virtual void nameChanged(); + virtual void AARegSelect( int i ); + +protected slots: + virtual void languageChange(); + +private: + QString capt; + + void destroy(); + void init(); + +}; + +#endif // DEDITFIELD_H diff --git a/src/designer/deditfield.ui b/src/designer/deditfield.ui new file mode 100644 index 0000000..94b4872 --- /dev/null +++ b/src/designer/deditfield.ui @@ -0,0 +1,355 @@ + + dEditField + + + + 0 + 0 + 521 + 403 + + + + + 521 + 343 + + + + Field + + + + + 0 + 0 + 521 + 403 + + + + + + + + 10 + + + + + Common + + + + + + + 0 + 0 + + + + Width + + + false + + + + + + + + + 1 + + + 254 + + + 10 + + + + + + + + 0 + 0 + + + + Decimals + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 230 + 20 + + + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + 80 + 32767 + + + + Type + + + false + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + Name + + + false + + + + + + + + + + Flags + + + + + + Sort + + + + + + + Positive + + + + + + + Not null + + + + + + + Sum + + + + + + + + + + false + + + + + + + + 0 + 0 + + + + Saldo source + + + false + + + + + + + + + + + Description + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + rcIcon + + + Q3GroupBox + QGroupBox +
Qt3Support/Q3GroupBox
+ 1 +
+ + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+
+ + acfg.h + mdtree.h + qseditor.h + aliaseditor.h + mainform.h + + + + + eType + activated(int) + dEditField + typeSelect(int) + + + 20 + 20 + + + 20 + 20 + + + + + eName + textChanged(QString) + dEditField + nameChanged() + + + 20 + 20 + + + 20 + 20 + + + + + comboBox2 + activated(int) + dEditField + AARegSelect(int) + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditimagecollection.cpp b/src/designer/deditimagecollection.cpp new file mode 100644 index 0000000..2ecebb0 --- /dev/null +++ b/src/designer/deditimagecollection.cpp @@ -0,0 +1,49 @@ +#include "deditimagecollection.h" + +#include +#include +#include + +#include + +/* + * Constructs a dEditImageCollection as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditImageCollection::dEditImageCollection(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditImageCollection::~dEditImageCollection() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditImageCollection::languageChange() +{ + retranslateUi(this); +} + +void dEditImageCollection::init() +{ + delete statusBar(); +} + +void dEditImageCollection::setData( ) +{ + //--obj = o; + +} diff --git a/src/designer/deditimagecollection.h b/src/designer/deditimagecollection.h new file mode 100644 index 0000000..4a58390 --- /dev/null +++ b/src/designer/deditimagecollection.h @@ -0,0 +1,28 @@ +#ifndef DEDITIMAGECOLLECTION_H +#define DEDITIMAGECOLLECTION_H + +#include "ui_deditimagecollection.h" + + +class dEditImageCollection : public Q3MainWindow, public Ui::dEditImageCollection +{ + Q_OBJECT + +public: + dEditImageCollection(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditImageCollection(); + + aCfgItem obj; + +public slots: + virtual void setData(); + +protected slots: + virtual void languageChange(); + +private: + void init(); + +}; + +#endif // DEDITIMAGECOLLECTION_H diff --git a/src/designer/deditimagecollection.ui b/src/designer/deditimagecollection.ui new file mode 100644 index 0000000..b8c0591 --- /dev/null +++ b/src/designer/deditimagecollection.ui @@ -0,0 +1,84 @@ + + dEditImageCollection + + + + 0 + 0 + 523 + 320 + + + + Image Collection + + + + + 0 + 0 + 523 + 320 + + + + + + + + + Add + + + + + + + Rename + + + + + + + Remove + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 31 + 81 + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+
+ + acfg.h + + + +
diff --git a/src/designer/deditireg.cpp b/src/designer/deditireg.cpp new file mode 100644 index 0000000..f36fd36 --- /dev/null +++ b/src/designer/deditireg.cpp @@ -0,0 +1,85 @@ +#include "deditireg.h" + +#include +#include +#include + +#include +#include "acfg.h" + +/* + * Constructs a dEditIReg as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditIReg::dEditIReg(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditIReg::~dEditIReg() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditIReg::languageChange() +{ + retranslateUi(this); +} + +void dEditIReg::init() +{ + delete statusBar(); +} + +void dEditIReg::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + +void dEditIReg::setData( aListViewItem *o ) +{ + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj; + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + setCaption( tr("Information register:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + if(md->attr(obj, mda_no_unconduct)=="1") + { + checkBox1->setChecked(true); + } + else + { + checkBox1->setChecked(false); + } + eDescription->setText( md->sText( obj, md_description ) ); +} + +void dEditIReg::updateMD() +{ + aCfg *md = item->md; + aCfgItem obj = item->obj; + + al->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_no_unconduct, checkBox1->isChecked()?"1":"0"); + md->setSText( obj, md_description, eDescription->text() ); +} diff --git a/src/designer/deditireg.h b/src/designer/deditireg.h new file mode 100644 index 0000000..5fe49c8 --- /dev/null +++ b/src/designer/deditireg.h @@ -0,0 +1,31 @@ +#ifndef DEDITIREG_H +#define DEDITIREG_H + +#include "ui_deditireg.h" + + +class dEditIReg : public Q3MainWindow, public Ui::dEditIReg +{ + Q_OBJECT + +public: + dEditIReg(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditIReg(); + + aListViewItem *item; + aAliasEditor *al; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +private: + void init(); + void destroy(); + +}; + +#endif // DEDITIREG_H diff --git a/src/designer/deditireg.ui b/src/designer/deditireg.ui new file mode 100644 index 0000000..05c2538 --- /dev/null +++ b/src/designer/deditireg.ui @@ -0,0 +1,130 @@ + + dEditIReg + + + + 0 + 0 + 447 + 314 + + + + Information register + + + + + 0 + 0 + 447 + 314 + + + + + + + + Common + + + + + + + + Name: + + + false + + + + + + + + + + + + + + + Description: + + + false + + + + + + + Don't delete record in unconduct + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+
+ + mdtree.h + aliaseditor.h + mainform.h + + + +
diff --git a/src/designer/deditjournal.cpp b/src/designer/deditjournal.cpp new file mode 100644 index 0000000..75a4c71 --- /dev/null +++ b/src/designer/deditjournal.cpp @@ -0,0 +1,197 @@ +#include "deditjournal.h" + +#include +#include +#include + +#include +#include "acfg.h" + +/* + * Constructs a dEditJournal as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditJournal::dEditJournal(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditJournal::~dEditJournal() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditJournal::languageChange() +{ + retranslateUi(this); +} + +void dEditJournal::setData( aListViewItem *o ) +{ + item = o; + md = o->md; + obj = o->obj; + aCfgItem cobj, doc, docs; + int i, j, n; + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + aRoleEditor *r = new aRoleEditor( md, obj, tRoles, md_journal ); + re = r; + re->setData(); + setCaption( tr("Journal:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); + + i = md->attr ( obj, mda_type ).toInt(); + cbType-> setCurrentItem(i); + + journalDocs = new ananasTreeView( tabWidget18->page(2), md ); + journalDocs->setSorting( -1 ); + // TODO Fix me!!! + //--layout28->addWidget( journalDocs, 0, 0 ); + n = md->count( obj, md_used_doc ); + for ( j = 0; j < n; j++ ) + { + cobj = md->find( obj, md_used_doc, j ); + if ( cobj.isNull() ) + continue; +// did = md->text(cobj).toLong(); + doc = md->find(md->text(cobj).toLong()); + if ( doc.isNull() ) + md->remove(cobj); + else + new ananasListViewItem( journalDocs, journalDocs->lastItem(), md, doc ); + } + + allDocs = new ananasTreeView( tabWidget18->page(2), md ); + allDocs->setSorting( -1 ); + // TODO Fix me!!! + //--layout29->add( allDocs ); + docs = md->find(md->find(mdc_metadata),md_documents,0); + n = md->count( docs, md_document ); + for ( j = 0; j < n; j++ ) + { + cobj = md->find( docs, md_document, j ); + if ( cobj.isNull() ) + return; + // did = md->id(cobj); + doc = md->find(md->id(cobj)); + new ananasListViewItem( allDocs, allDocs->lastItem(), md, doc ); + } + docPage = tabWidget18->page(2); + if ( cbType->currentItem() != 1 ) + typeChange(); +} + + +void dEditJournal::init() +{ + statusBar()->hide(); +} + + +void dEditJournal::updateMD() +{ + aCfgItem doc, docs; + int i; + + al->updateMD(); + re->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); + md->setAttr( obj, mda_type, cbType->currentItem() ); + docs = md->find(obj,md_columns,0); + do + { + doc = md->findChild( docs, md_used_doc, 0 ); + if ( !doc.isNull() ) + md->remove( doc ); + } while ( !doc.isNull() ); + if ( cbType->currentItem() != 1 ) + return; + ananasListViewItem *aitem = (ananasListViewItem *)journalDocs->firstChild(); + for ( i = 0; i < journalDocs->childCount(); i++ ) + { + doc = md->insert( docs, md_used_doc, QString::null, -1 ); + md->setText( doc, QString( "%1" ).arg( aitem->id ) ); + aitem = (ananasListViewItem *)aitem->nextSibling(); + } + +} + +void dEditJournal::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + + + + +void dEditJournal::typeChange() +{ + if ( cbType->currentItem() != 1 ) + tabWidget18->removePage(tabWidget18->page(2)); + else + tabWidget18->insertTab(docPage,QObject::tr("Documents")); +} + + +void dEditJournal::addDoc() +{ + ananasListViewItem *cur = (ananasListViewItem *)allDocs->selectedItem(); + if (!cur) + return; + if ( md->objClass( cur->obj ) != md_document ) + return; + new ananasListViewItem(journalDocs, journalDocs->lastItem(), md, cur->obj ); +} + + +void dEditJournal::removeDoc() +{ + journalDocs->removeItem( journalDocs->selectedItem() ); +} + + +void dEditJournal::moveUp() +{ + ananasListViewItem *aitem, *after; + + aitem = (ananasListViewItem *) journalDocs->selectedItem(); + if ( aitem ) + { + after = (ananasListViewItem *)aitem->itemAbove(); + if ( after ) + after->moveItem( aitem ); + } +} + + +void dEditJournal::moveDown() +{ + ananasListViewItem *aitem, *after; + aitem = (ananasListViewItem *)journalDocs->selectedItem(); + if ( aitem ) + { + after = (ananasListViewItem *)aitem->itemBelow(); + if ( after ) + aitem->moveItem( after ); + } +} diff --git a/src/designer/deditjournal.h b/src/designer/deditjournal.h new file mode 100644 index 0000000..15c4b1a --- /dev/null +++ b/src/designer/deditjournal.h @@ -0,0 +1,44 @@ +#ifndef DEDITJOURNAL_H +#define DEDITJOURNAL_H + +#include "ui_deditjournal.h" + + +class dEditJournal : public Q3MainWindow, public Ui::dEditJournal +{ + Q_OBJECT + +public: + dEditJournal(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditJournal(); + + aListViewItem *item; + aAliasEditor *al; + ananasTreeView * journalDocs; + ananasTreeView * allDocs; + aCfg *md; + aCfgItem obj; + QWidget * docPage; + aRoleEditor *re; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +private: + void init(); + void destroy(); + +private slots: + virtual void typeChange(); + virtual void addDoc(); + virtual void removeDoc(); + virtual void moveUp(); + virtual void moveDown(); + +}; + +#endif // DEDITJOURNAL_H diff --git a/src/designer/deditjournal.ui b/src/designer/deditjournal.ui new file mode 100644 index 0000000..4f02d90 --- /dev/null +++ b/src/designer/deditjournal.ui @@ -0,0 +1,398 @@ + + dEditJournal + + + + 0 + 0 + 503 + 328 + + + + Journal + + + + + 0 + 0 + 503 + 328 + + + + + + + + 0 + 0 + + + + + Common + + + + + + + + Name: + + + false + + + + + + + + + + + + + + + + + Type: + + + false + + + + + + + + Common + + + + + Special + + + + + Othes + + + + + + + + + + Description: + + + false + + + + + + + + Aliases + + + + + + 0 + + + 0 + + + + + + + + Documents + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 56 + + + + + + + + + + + + + Access + + + + + + 0 + + + 2 + + + false + + + Q3Table::Multi + + + + Read + + + + + Write + + + + + + + + + + + + + Action + + + Action + + + + + Action_2 + + + Action_2 + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+
+ + mdtree.h + atreeitems.h + aliaseditor.h + mainform.h + roleeditor.h + + + + + cbType + activated(int) + dEditJournal + typeChange() + + + 20 + 20 + + + 20 + 20 + + + + + bAddDoc + clicked() + dEditJournal + addDoc() + + + 20 + 20 + + + 20 + 20 + + + + + bRemoveDoc + clicked() + dEditJournal + removeDoc() + + + 20 + 20 + + + 20 + 20 + + + + + bMoveUp + clicked() + dEditJournal + moveUp() + + + 20 + 20 + + + 20 + 20 + + + + + bMoveDown + clicked() + dEditJournal + moveDown() + + + 20 + 20 + + + 20 + 20 + + + + +
diff --git a/src/designer/deditlang.cpp b/src/designer/deditlang.cpp new file mode 100644 index 0000000..5d63ef3 --- /dev/null +++ b/src/designer/deditlang.cpp @@ -0,0 +1,78 @@ +#include "deditlang.h" + +#include +#include +#include + +#include "acfg.h" +#include +#include + +/* + * Constructs a dEditLang as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditLang::dEditLang(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditLang::~dEditLang() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditLang::languageChange() +{ + retranslateUi(this); +} + +extern aCfg cfg; + +void dEditLang::setData( CfgForm *c, aCfgItem o ) +{ +// aCfgItem alias; +// int i, n, count; + + cf = c; + obj = o; + + setCaption( tr("Language:") + cf->cfg.attr( obj, mda_name ) ); + eTag->setText( cf->cfg.attr( obj, mda_tag ) ); + eName->setText( cf->cfg.attr( obj, mda_name ) ); + eTrFile->setText( cf->cfg.attr( obj, mda_trfile ) ); +} + +void dEditLang::init() +{ + delete statusBar(); +} + +void dEditLang::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} +void +dEditLang::updateMD() +{ + cf->cfg.setAttr( obj, mda_tag, eTag->text() ); + cf->cfg.setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + cf->cfg.setAttr( obj, mda_trfile, eTrFile->text() ); + cf->initLang(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); +} + diff --git a/src/designer/deditlang.h b/src/designer/deditlang.h new file mode 100644 index 0000000..27c5ec2 --- /dev/null +++ b/src/designer/deditlang.h @@ -0,0 +1,32 @@ +#ifndef DEDITLANG_H +#define DEDITLANG_H + +#include "ui_deditlang.h" + + +class dEditLang : public Q3MainWindow, public Ui::dEditLang +{ + Q_OBJECT + +public: + dEditLang(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditLang(); + +public slots: + virtual void setData( CfgForm * c, aCfgItem o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +private: + aCfgItem obj; + int langCount; + CfgForm *cf; + + void init(); + void destroy(); + +}; + +#endif // DEDITLANG_H diff --git a/src/designer/deditlang.ui b/src/designer/deditlang.ui new file mode 100644 index 0000000..11e1753 --- /dev/null +++ b/src/designer/deditlang.ui @@ -0,0 +1,123 @@ + + dEditLang + + + + 0 + 0 + 299 + 185 + + + + Language + + + + + 0 + 0 + 299 + 185 + + + + + + + + Common + + + + + + + + + + Tag: + + + false + + + + + + + Name: + + + false + + + + + + + Translation file: + + + false + + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 141 + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+
+ + mdtree.h + cfgform.h + mainform.h + + + +
diff --git a/src/designer/deditreport.cpp b/src/designer/deditreport.cpp new file mode 100644 index 0000000..d500557 --- /dev/null +++ b/src/designer/deditreport.cpp @@ -0,0 +1,83 @@ +#include "deditreport.h" + +#include +#include +#include + +#include +#include "acfg.h" +#include +#include + +/* + * Constructs a dEditReport as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditReport::dEditReport(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditReport::~dEditReport() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditReport::languageChange() +{ + retranslateUi(this); +} + +void dEditReport::setData( aListViewItem *o ) +{ + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj; + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + setCaption( tr("Report:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); + eModule->setText( md->sText( obj, md_sourcecode ) ); +} + + +void dEditReport::init() +{ + delete statusBar(); + eModule->setInterpreter(new QSInterpreter()); +} + + +void dEditReport::updateMD() +{ + aCfg *md = item->md; + aCfgItem obj = item->obj; + + al->updateMD(); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); + md->setSText( obj, md_sourcecode, eModule->text() ); +} + +void dEditReport::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} diff --git a/src/designer/deditreport.h b/src/designer/deditreport.h new file mode 100644 index 0000000..e4a5103 --- /dev/null +++ b/src/designer/deditreport.h @@ -0,0 +1,31 @@ +#ifndef DEDITREPORT_H +#define DEDITREPORT_H + +#include "ui_deditreport.h" + + +class dEditReport : public Q3MainWindow, public Ui::dEditReport +{ + Q_OBJECT + +public: + dEditReport(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditReport(); + + aListViewItem *item; + aAliasEditor *al; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + + virtual void init(); + virtual void destroy(); + + +}; + +#endif // DEDITREPORT_H diff --git a/src/designer/deditreport.ui b/src/designer/deditreport.ui new file mode 100644 index 0000000..646975f --- /dev/null +++ b/src/designer/deditreport.ui @@ -0,0 +1,142 @@ + + dEditReport + + + + 0 + 0 + 447 + 313 + + + + Report + + + + + 0 + 0 + 447 + 313 + + + + + + + + + + + Common + + + + + + + + Name: + + + false + + + + + + + + + + + + Description: + + + false + + + + + + + + + + + Module + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + QSEditor + QWidget +
qseditor.h
+
+
+ + mdtree.h + aliaseditor.h + mainform.h + qseditor.h + + + +
diff --git a/src/designer/deditrole.cpp b/src/designer/deditrole.cpp new file mode 100644 index 0000000..6c350e9 --- /dev/null +++ b/src/designer/deditrole.cpp @@ -0,0 +1,76 @@ +#include "deditrole.h" + +#include +#include +#include + +#include "acfg.h" +#include +#include + +/* + * Constructs a dEditRole as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditRole::dEditRole(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditRole::~dEditRole() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditRole::languageChange() +{ + retranslateUi(this); +} + +extern aCfg cfg; + +void dEditRole::setData( CfgForm *c, aCfgItem o ) +{ +// aCfgItem alias; +// int i, n, count; + + cf = c; + obj = o; + + setCaption( tr("Role:") + cf->cfg.attr( obj, mda_name ) ); + eName->setText( cf->cfg.attr( obj, mda_name ) ); + eDescription->setText( cf->cfg.sText( obj, md_description ) ); +} + +void dEditRole::init() +{ + delete statusBar(); +} + +void dEditRole::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} +void +dEditRole::updateMD() +{ + cf->cfg.setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + cf->cfg.setSText( obj, md_description, eDescription->text() ); + cf->initRoles(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); +} + diff --git a/src/designer/deditrole.h b/src/designer/deditrole.h new file mode 100644 index 0000000..50d2c7e --- /dev/null +++ b/src/designer/deditrole.h @@ -0,0 +1,32 @@ +#ifndef DEDITROLE_H +#define DEDITROLE_H + +#include "ui_deditrole.h" + + +class dEditRole : public Q3MainWindow, public Ui::dEditRole +{ + Q_OBJECT + +public: + dEditRole(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditRole(); + +public slots: + virtual void setData( CfgForm * c, aCfgItem o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +private: + aCfgItem obj; + CfgForm *cf; + int roleCount; + + void init(); + void destroy(); + +}; + +#endif // DEDITROLE_H diff --git a/src/designer/deditrole.ui b/src/designer/deditrole.ui new file mode 100644 index 0000000..0c53f93 --- /dev/null +++ b/src/designer/deditrole.ui @@ -0,0 +1,91 @@ + + dEditRole + + + + 0 + 0 + 365 + 198 + + + + Role + + + + + 0 + 0 + 365 + 198 + + + + + + + + Common + + + + + + Description: + + + false + + + + + + + + + Name: + + + false + + + + + + + + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+
+ + mdtree.h + cfgform.h + mainform.h + + + +
diff --git a/src/designer/dedittoolbar.cpp b/src/designer/dedittoolbar.cpp new file mode 100644 index 0000000..7fe2e26 --- /dev/null +++ b/src/designer/dedittoolbar.cpp @@ -0,0 +1,228 @@ +#include "dedittoolbar.h" + +#include +#include +#include + +#include +#include +//Added by qt3to4: +#include +#include "acfg.h" + +//extern aCfg cfg; + +/* + * Constructs a dEditToolbar as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditToolbar::dEditToolbar(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditToolbar::~dEditToolbar() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditToolbar::languageChange() +{ + retranslateUi(this); +} + +void dEditToolbar::updateMD() +{ + int i; + aCfgItem com_action, apix; + al->updateMD( ); + QPixmap pix; + + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); +// md->setSText( obj, md_menutext, eMenuText->text() ); + + QString sKey = ""; + if ( cbKey-> currentText () != "" ) + { + if ( cbCTRL->isChecked() ) + sKey += md_km_ctrl; + if ( cbALT->isChecked() ) + sKey += md_km_alt; + if ( cbShift->isChecked() ) + sKey += md_km_shift; + sKey += cbKey->currentText (); + } + md->setSText( obj, md_key, sKey ); + + do + { + com_action = md->findChild( obj, md_comaction, 0 ); + if ( !com_action.isNull() ) + md->remove( com_action ); + } while ( !com_action.isNull() ); + ananasListViewItem *aitem = (ananasListViewItem *)vComActions->firstChild(); + for ( i = 0; i < vComActions->childCount(); i++ ) + { + com_action = md->insert( obj, md_comaction, QString::null, -1 ); + md->setText( com_action, QString( "%1" ).arg( aitem->id ) ); + aitem = (ananasListViewItem *)aitem->nextSibling(); + } + aitem = (ananasListViewItem *)vComActions->firstChild(); + apix = md->findChild( md->find( aitem->id ), md_active_picture, 0 ); + if ( apix.isNull() ) + return; + pix.loadFromData( md->binary( apix ) ); + item->setPixmap( 0, pix ); +} + +void dEditToolbar::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); +} + +void dEditToolbar::init() +{ + statusBar()->hide(); +} + +void dEditToolbar::setData( InterfaceListViewItem * o ) +{ + int i, j, n, k, id; + item = o; + md = o->md; + obj = o->obj; + aCfgItem com_action, apix; + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + QPixmap pix; + + vComActions = new ananasTreeView( tabWidget2->page(1), md ); + vComActions->setSorting( -1 ); + // TODO Fix me!!! + //--layout28->addWidget( vComActions, 0, 0 ); + actiontree = new aActionTreeView ( tabWidget2->page(1), md ); + disconnect( actiontree, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), actiontree, SLOT(ContextMenu() ) ); + disconnect( actiontree, SIGNAL( returnPressed( Q3ListViewItem*) ), actiontree, SLOT( itemEdit() ) ); + disconnect( actiontree, SIGNAL( doubleClicked( Q3ListViewItem*) ), actiontree, SLOT( itemEdit() ) ); + // TODO Fix me!!! + //--layout29->addWidget( actiontree, 0, 0 ); + + al = a; + al->setData(); + + setCaption( tr("Command:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); +// eMenuText->setText( md->sText( obj, md_menutext ) ); + eDescription->setText( md->sText( obj, md_description ) ); + + QString sKey = md->sText( obj, md_key ); + if ( ( sKey.find (md_km_ctrl) ) >= 0 ) + { + cbCTRL->setChecked ( TRUE ); + sKey.remove(md_km_ctrl); + } + if ( ( sKey.find (md_km_alt) ) >= 0 ) + { + cbALT->setChecked ( TRUE ); + sKey.remove(md_km_alt); + } + if ( ( sKey.find (md_km_shift) ) >= 0 ) + { + cbShift->setChecked ( TRUE ); + sKey.remove(md_km_shift); + } + + + n = cbKey->count(); + for ( i = 0; i < n; i++ ) + if ( sKey == cbKey->text( i ) ) + { + cbKey->setCurrentItem( i ); + break; + } + n = md->countChild( obj, md_comaction ); + k = md->count( md->find ( mdc_actions ), md_action ); + ananasListViewItem *aitem; + for ( i = 0; i < n; i++ ) + { + id = md->text(( md->find (obj, md_comaction, i))).toInt(); + for ( j = 0; j < k; j++) + { + com_action = md->find ( md->find( mdc_actions ), md_action, j ); + if ( md->id(com_action) == id ) + { + aitem = new ananasListViewItem (vComActions, vComActions->lastItem(), md, com_action); + aitem->setRenameEnabled( 0, FALSE ); + apix = md->findChild( md->find( aitem->id ), md_active_picture, 0 ); + if ( apix.isNull() ) + break; + pix.loadFromData( md->binary( apix ) ); + aitem->setPixmap( 0, pix ); + } + } + } +} + + +void +dEditToolbar::bAddAction_clicked() +{ + aCfgItem apix; + QPixmap pix; + + ananasListViewItem *cur = (ananasListViewItem *)actiontree->selectedItem(); + if (!cur) + return; + if ( md->objClass( cur->obj ) != md_action ) + return; + ananasListViewItem *aitem = new ananasListViewItem(vComActions, vComActions->lastItem(), md, cur->obj ); + apix = md->findChild( md->find( aitem->id ), md_active_picture, 0 ); + pix.loadFromData( md->binary( apix ) ); + aitem->setPixmap( 0, pix ); +} + + +void dEditToolbar::bRemoveAction_clicked() +{ + vComActions->removeItem( vComActions->selectedItem() ); +} + + +void dEditToolbar::bMoveUp_clicked() +{ + ananasListViewItem *aitem, *after; + + aitem = (ananasListViewItem *) vComActions->selectedItem(); + if ( aitem ) { + after = (ananasListViewItem *)aitem->itemAbove(); + if ( after ) after->moveItem( aitem ); + } + +} + + +void dEditToolbar::bMoveDown_clicked() +{ + ananasListViewItem *aitem, *after; + aitem = (ananasListViewItem *)vComActions->selectedItem(); + if ( aitem ) { + after = (ananasListViewItem *)aitem->itemBelow(); + if ( after ) aitem->moveItem( after ); + } +} diff --git a/src/designer/dedittoolbar.h b/src/designer/dedittoolbar.h new file mode 100644 index 0000000..fb65eab --- /dev/null +++ b/src/designer/dedittoolbar.h @@ -0,0 +1,39 @@ +#ifndef DEDITTOOLBAR_H +#define DEDITTOOLBAR_H + +#include "ui_dedittoolbar.h" + + +class dEditToolbar : public Q3MainWindow, public Ui::dEditToolbar +{ + Q_OBJECT + +public: + dEditToolbar(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditToolbar(); + + ananasTreeView *vComActions; + aAliasEditor *al; + InterfaceListViewItem *item; + aActionTreeView *actiontree; + aCfg *md; + aCfgItem obj; + +public slots: + virtual void updateMD(); + virtual void setData( InterfaceListViewItem * o ); + virtual void bAddAction_clicked(); + virtual void bRemoveAction_clicked(); + virtual void bMoveUp_clicked(); + virtual void bMoveDown_clicked(); + +protected slots: + virtual void languageChange(); + +private: + void destroy(); + void init(); + +}; + +#endif // DEDITTOOLBAR_H diff --git a/src/designer/dedittoolbar.ui b/src/designer/dedittoolbar.ui new file mode 100644 index 0000000..5726b59 --- /dev/null +++ b/src/designer/dedittoolbar.ui @@ -0,0 +1,503 @@ + + dEditToolbar + + + + 0 + 0 + 570 + 321 + + + + Form1 + + + + + 0 + 0 + 570 + 321 + + + + + + + + + + QTabWidget::Rounded + + + + Common + + + + + + + + Description: + + + false + + + + + + + + + + + + + + Hot Key: + + + false + + + + + + + Ctrl + + + + + + + Alt + + + + + + + Shift + + + + + + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 0 + + + + + A + + + + + B + + + + + C + + + + + D + + + + + E + + + + + F + + + + + G + + + + + H + + + + + I + + + + + J + + + + + K + + + + + L + + + + + M + + + + + N + + + + + O + + + + + P + + + + + Q + + + + + R + + + + + S + + + + + T + + + + + U + + + + + V + + + + + W + + + + + X + + + + + Y + + + + + Z + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 71 + 20 + + + + + + + + + + + + Type: + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 51 + 20 + + + + + + + + Name: + + + false + + + + + + + true + + + + 0 + 22 + + + + + + + + + + + Actions + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 44 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 44 + + + + + + + + + + + + + Aliases + + + + + + 0 + + + 2 + + + + Lang + + + + + Name + + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+
+ + actiontree.h + interfacetree.h + aliaseditor.h + mainform.h + + + +
diff --git a/src/designer/deditwebform.cpp b/src/designer/deditwebform.cpp new file mode 100644 index 0000000..5339192 --- /dev/null +++ b/src/designer/deditwebform.cpp @@ -0,0 +1,89 @@ +#include "deditwebform.h" + +#include +#include +#include + +#include +#include "acfg.h" +#include +#include + +/* + * Constructs a dEditWebForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +dEditWebForm::dEditWebForm(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditWebForm::~dEditWebForm() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditWebForm::languageChange() +{ + retranslateUi(this); +} + +void dEditWebForm::init() +{ + delete statusBar(); + eServerModule->setInterpreter(new QSInterpreter()); + eClientModule->setInterpreter(new QSInterpreter()); +} + +void dEditWebForm::destroy() +{ + updateMD(); + ( (MainForm*)this->topLevelWidget() )->wl->remove( this ); + ( (MainForm*)this->topLevelWidget() )->removeTab(name()); + item->editor = 0; +} + + +void dEditWebForm::setData( aListViewItem *o ) +{ + item = o; + aCfg *md = o->md; + aCfgItem obj = o->obj; + + aAliasEditor *a = new aAliasEditor( md, obj, tAliases ); + al = a; + al->setData(); + setCaption( tr("Web form:") + md->attr( obj, mda_name ) ); + eName->setText( md->attr( obj, mda_name ) ); + eDescription->setText( md->sText( obj, md_description ) ); + eServerModule->setText( md->sText( obj, md_servermodule ) ); + eClientModule->setText( md->sText( obj, md_clientmodule ) ); + eFormSource->setText( md->sText( obj, md_formsource ) ); +} + +void dEditWebForm::updateMD() +{ + aCfg *md = item->md; + aCfgItem obj = item->obj; + + al->updateMD( ); + item->setText( 0, eName->text().stripWhiteSpace() ); + md->setAttr( obj, mda_name, eName->text().stripWhiteSpace() ); + md->setSText( obj, md_description, eDescription->text() ); + md->setSText( obj, md_servermodule, eServerModule->text() ); + md->setSText( obj, md_clientmodule, eClientModule->text() ); + md->setSText( obj, md_formsource, eFormSource->text() ); +} diff --git a/src/designer/deditwebform.h b/src/designer/deditwebform.h new file mode 100644 index 0000000..7a3000e --- /dev/null +++ b/src/designer/deditwebform.h @@ -0,0 +1,31 @@ +#ifndef DEDITWEBFORM_H +#define DEDITWEBFORM_H + +#include "ui_deditwebform.h" + + +class dEditWebForm : public Q3MainWindow, public Ui::dEditWebForm +{ + Q_OBJECT + +public: + dEditWebForm(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~dEditWebForm(); + + aAliasEditor *al; + aListViewItem *item; + +public slots: + virtual void setData( aListViewItem * o ); + virtual void updateMD(); + +protected slots: + virtual void languageChange(); + +private: + void init(); + void destroy(); + +}; + +#endif // DEDITWEBFORM_H diff --git a/src/designer/deditwebform.ui b/src/designer/deditwebform.ui new file mode 100644 index 0000000..b95aaaa --- /dev/null +++ b/src/designer/deditwebform.ui @@ -0,0 +1,154 @@ + + dEditWebForm + + + + 0 + 0 + 445 + 328 + + + + Web Form + + + + + 0 + 0 + 445 + 328 + + + + + + + + Common + + + + + + Description + + + false + + + + + + + + + + + + Name: + + + false + + + + + + + + + + + + + Form editor + + + + + + Qt::PlainText + + + + + + + + Client module + + + + + + + + + + Server module + + + + + + + + + + Aliases + + + + + + 0 + + + 0 + + + + + + + + + + + + rcIcon + + + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+ + Q3Table + Q3Frame +
q3table.h
+
+ + Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + QSEditor + QWidget +
qseditor.h
+
+
+ + aliaseditor.h + mdtree.h + mainform.h + qseditor.h + qseditor.h + + + +
diff --git a/src/designer/designer.pro b/src/designer/designer.pro new file mode 100644 index 0000000..ca9006f --- /dev/null +++ b/src/designer/designer.pro @@ -0,0 +1,182 @@ +include(../plugins/plugins.pri) +include(../lib/lib.pri) +TARGET = ananas4-designer +TEMPLATE = app + +CONFIG += designer + +DESTDIR = ../../bin + +INCLUDEPATH += . ./formdesigner ../lib ../../tmp/ui/ananas ../plugins +LIBS += -L../../lib -lananas4 -L../../lib/designer -lananasplugin4 -lqt4-qdataschema +unix { + #LIBS += -L$(QTINC)/QtDesigner + LIBS += -lQtDesignerComponents +# LIBS += -lqt4designer +} +win32{ + LIBS += -lQtDesignerComponents4 +} + +MOC_DIR = ../../tmp/moc/$$TARGET +OBJECTS_DIR = ../../tmp/obj/$$TARGET +UI_DIR = ../../tmp/ui/$$TARGET + +#LIBS += -L../lib -L../plugins -lananas -lananasplugin -lqsa -ldesignercore -lqassistantclient +#LIBS += -L. -L../lib -L../plugins -lananas -lananasplugin -lqsa -lformdesigner -lqassistantclient +#INCLUDEPATH += ../lib ../lib/tmp/ui ../lib/.ui $(QTDIR)/tools/designer/designer ../../qt-headers/tools/designer/designer /usr/lib +#INCLUDEPATH += ../lib ../lib/tmp/ui ../lib/.ui ./formdesigner /usr/lib + +include ( ../ananas.pri ) +load(qsa) + +HEADERS = \ + actiontree.h \ + aliaseditor.h \ + atreeitems.h \ + cfgform.h \ +# cfgform.ui.h \ + deditaction.h \ +# deditaction.ui.h \ + deditareg.h \ +# deditareg.ui.h \ + deditcat.h \ +# deditcat.ui.h \ + deditcfg.h \ +# deditcfg.ui.h \ + deditcolumns.h \ +# deditcolumns.ui.h \ + deditcommand.h \ +# deditcommand.ui.h \ + deditdialog.h \ +# deditdialog.ui.h \ + deditdoc.h \ +# deditdoc.ui.h \ + deditfield.h \ +# deditfield.ui.h \ + deditimagecollection.h \ +# deditimagecollection.ui.h \ + deditireg.h \ +# deditireg.ui.h \ + deditjournal.h \ +# deditjournal.ui.h \ + deditlang.h \ +# deditlang.ui.h \ + deditreport.h \ +# deditreport.ui.h \ + deditrole.h \ +# deditrole.ui.h \ + dedittoolbar.h \ +# dedittoolbar.ui.h \ + deditwebform.h \ +# deditwebform.ui.h \ + formdesigner.h \ + interfacetree.h \ + mainform.h \ +# mainform.ui.h \ + mdtree.h \ + pixmappreview.h \ + roleeditor.h \ + formdesigner/formwindowsettings.h \ + formdesigner/newform.h \ + formdesigner/plugindialog.h \ + formdesigner/qdesigner_actioneditor.h \ + formdesigner/qdesigner_actions.h \ + formdesigner/qdesigner_formwindow.h \ + formdesigner/qdesigner_objectinspector.h \ + formdesigner/qdesigner_pch.h \ + formdesigner/qdesigner_propertyeditor.h \ + formdesigner/qdesigner_resourceeditor.h \ + formdesigner/qdesigner_settings.h \ + formdesigner/qdesigner_signalsloteditor.h \ + formdesigner/qdesigner_toolwindow.h \ + formdesigner/qdesigner_widgetbox.h \ + formdesigner/qdesigner_workbench.h \ + formdesigner/saveformastemplate.h + +SOURCES = \ + actiontree.cpp \ + aliaseditor.cpp \ + atreeitems.cpp \ + cfgform.cpp \ + deditaction.cpp \ + deditareg.cpp \ + deditcat.cpp \ + deditcfg.cpp \ + deditcolumns.cpp \ + deditcommand.cpp \ + deditdialog.cpp \ + deditdoc.cpp \ + deditfield.cpp \ + deditimagecollection.cpp \ + deditireg.cpp \ + deditjournal.cpp \ + deditlang.cpp \ + deditreport.cpp \ + deditrole.cpp \ + dedittoolbar.cpp \ + deditwebform.cpp \ + formdesigner.cpp \ + interfacetree.cpp \ + main.cpp \ + mainform.cpp \ + mdtree.cpp \ + roleeditor.cpp \ + formdesigner/formwindowsettings.cpp \ + formdesigner/newform.cpp \ + formdesigner/plugindialog.cpp \ + formdesigner/qdesigner_actioneditor.cpp \ + formdesigner/qdesigner_actions.cpp \ + formdesigner/qdesigner_formwindow.cpp \ + formdesigner/qdesigner_objectinspector.cpp \ + formdesigner/qdesigner_propertyeditor.cpp \ + formdesigner/qdesigner_resourceeditor.cpp \ + formdesigner/qdesigner_settings.cpp \ + formdesigner/qdesigner_signalsloteditor.cpp \ + formdesigner/qdesigner_toolwindow.cpp \ + formdesigner/qdesigner_widgetbox.cpp \ + formdesigner/qdesigner_workbench.cpp \ + formdesigner/saveformastemplate.cpp + +FORMS = \ + cfgform.ui \ + deditaction.ui \ + deditareg.ui \ + deditcat.ui \ + deditcfg.ui \ + deditcolumns.ui \ + deditcommand.ui \ + deditdialog.ui \ + deditdoc.ui \ + deditfield.ui \ + deditimagecollection.ui \ + deditireg.ui \ + deditjournal.ui \ + deditlang.ui \ + deditreport.ui \ + deditrole.ui \ + dedittoolbar.ui \ + deditwebform.ui \ + mainform.ui \ + formdesigner/formwindowsettings.ui \ + formdesigner/newform.ui \ + formdesigner/plugindialog.ui \ + formdesigner/saveformastemplate.ui + +RESOURCES = \ + designer.qrc +# formdesigner/designer.qrc + +TRANSLATIONS = \ + ../../translations/ananas-designer-en.ts \ + ../../translations/ananas-designer-ru.ts + +unix { + adesigner.path = $(BINDIR) + adesigner.files = ananas-designer +# acfg.path = /etc/ananas +# acfg.files= testwrite.cfg + } + +#INSTALLS += adesigner + diff --git a/src/designer/designer.qrc b/src/designer/designer.qrc new file mode 100644 index 0000000..665da14 --- /dev/null +++ b/src/designer/designer.qrc @@ -0,0 +1,82 @@ + + + images/a-system.png + images/action_g.png + images/actions.png + images/arrow_down.png + images/arrow_left.png + images/arrow_right.png + images/arrow_up.png + images/cat.png + images/cat_g.png + images/columns.png + images/d_editdelete.png + images/designer-splash-en.png + images/designer-splash-ru.png + images/dimensions.png + images/doc.png + images/doc_g.png + images/doc_h.png + images/editcopy.png + images/editcut.png + images/editdelete.png + images/editedit.png + images/editpaste.png + images/editrename.png + images/editsep.png + images/element.png + images/field.png + images/filenew.png + images/fileopen.png + images/filesave.png + images/form.png + images/form_g.png + images/function.png + images/group.png + images/help.png + images/hi22-action-project_open.png + images/hi22-action-run.png + images/information.png + images/journ.png + images/journ_g.png + images/m_menu.png + images/msg_error.png + images/msg_fatal.png + images/msg_info.png + images/msg_warning.png + images/object.png + images/p_menus.png + images/play.png + images/playprev.png + images/print.png + images/project.png + images/qsa.png + images/redo.png + images/reg.png + images/reg_g.png + images/regs.png + images/regs_g.png + images/report.png + images/report_g.png + images/resourses.png + images/script.png + images/scriptnew.png + images/scriptobject.png + images/searchfind.png + images/separator.png + images/submenu.png + images/table.png + images/table_g.png + images/toolbar.png + images/undo.png + images/webform.png + images/webform_g.png + + + templates/inputform.tpl + templates/inputformcat.tpl + templates/inputformdoc.tpl + templates/inputformjourn.tpl + templates/inputformrep.tpl + + diff --git a/src/designer/embed.cpp b/src/designer/embed.cpp new file mode 100644 index 0000000..b5f7cd1 --- /dev/null +++ b/src/designer/embed.cpp @@ -0,0 +1,312 @@ +/********************************************************************** +** Copyright (C) 2000-2003 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "uic.h" +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include + +// on embedded, we do not compress image data. Rationale: by mapping +// the ready-only data directly into memory we are both faster and +// more memory efficient +#if defined(Q_WS_QWS) && !defined(QT_NO_IMAGE_COLLECTION_COMPRESSION) +#define QT_NO_IMAGE_COLLECTION_COMPRESSION +#endif + +struct EmbedImage +{ + ~EmbedImage() { delete[] colorTable; } + int width, height, depth; + int numColors; + QRgb* colorTable; + QString name; + QString cname; + bool alpha; +#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION + ulong compressed; +#endif +}; + +static QString convertToCIdentifier( const char *s ) +{ + QString r = s; + int len = r.length(); + if ( len > 0 && !isalpha( (char)r[0].latin1() ) ) + r[0] = '_'; + for ( int i=1; i> 4) & 15]; + s += hexdigits[v & 15]; + if ( i < (int)len-1 ) + s += ','; + } + if ( s.length() ) + out << (const char*)s; + return len; +} + +static void embedData( Q3TextStream& out, const QRgb* input, int n ) +{ + out << hex; + const QRgb *v = input; + for ( int i=0; i\n"; + out << "#include \n"; + out << "#include \n"; + out << "#include \n"; + out << "\n"; + + Q3PtrList list_image; + list_image.setAutoDelete( TRUE ); + int image_count = 0; + for ( it = images.begin(); it != images.end(); ++it ) { + QImage img; + if ( !img.load( *it ) ) { + fprintf( stderr, "uic: cannot load image file %s\n", (*it).latin1() ); + continue; + } + EmbedImage *e = new EmbedImage; + e->width = img.width(); + e->height = img.height(); + e->depth = img.depth(); + e->numColors = img.numColors(); + e->colorTable = new QRgb[e->numColors]; + e->alpha = img.hasAlphaBuffer(); + memcpy(e->colorTable, img.colorTable(), e->numColors*sizeof(QRgb)); + QFileInfo fi( *it ); + e->name = fi.fileName(); + e->cname = QString("image_%1").arg( image_count++); + list_image.append( e ); + out << "// " << *it << "\n"; + QString s; + if ( e->depth == 1 ) + img = img.convertBitOrder(QImage::BigEndian); + out << s.sprintf( "static const unsigned char %s_data[] = {", + (const char *)e->cname ); +#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION + e->compressed = +#endif + embedData( out, img.bits(), img.numBytes() ); + out << "\n};\n\n"; + if ( e->numColors ) { + out << s.sprintf( "static const QRgb %s_ctable[] = {", + (const char *)e->cname ); + embedData( out, e->colorTable, e->numColors ); + out << "\n};\n\n"; + } + } + + if ( !list_image.isEmpty() ) { + out << "static struct EmbedImage {\n" + " int width, height, depth;\n" + " const unsigned char *data;\n" +#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION + " ulong compressed;\n" +#endif + " int numColors;\n" + " const QRgb *colorTable;\n" + " bool alpha;\n" + " const char *name;\n" + "} embed_image_vec[] = {\n"; + EmbedImage *e = list_image.first(); + while ( e ) { + out << " { " + << e->width << ", " + << e->height << ", " + << e->depth << ", " + << "(const unsigned char*)" << e->cname << "_data, " +#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION + << e->compressed << ", " +#endif + << e->numColors << ", "; + if ( e->numColors ) + out << e->cname << "_ctable, "; + else + out << "0, "; + if ( e->alpha ) + out << "TRUE, "; + else + out << "FALSE, "; + out << "\"" << e->name << "\" },\n"; + e = list_image.next(); + } +#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION + out << " { 0, 0, 0, 0, 0, 0, 0, 0, 0 }\n};\n"; +#else + out << " { 0, 0, 0, 0, 0, 0, 0, 0 }\n};\n"; +#endif + + out << "\n" + "static QImage uic_findImage( const QString& name )\n" + "{\n" + " for ( int i=0; embed_image_vec[i].data; i++ ) {\n" + " if ( QString::fromUtf8(embed_image_vec[i].name) == name ) {\n" +#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION + " QByteArray baunzip;\n" + " baunzip = qUncompress( embed_image_vec[i].data, \n" + " embed_image_vec[i].compressed );\n" + " QImage img((uchar*)baunzip.data(),\n" + " embed_image_vec[i].width,\n" + " embed_image_vec[i].height,\n" + " embed_image_vec[i].depth,\n" + " (QRgb*)embed_image_vec[i].colorTable,\n" + " embed_image_vec[i].numColors,\n" + " QImage::BigEndian\n" + " );\n" + " img = img.copy();\n" +#else + " QImage img((uchar*)embed_image_vec[i].data,\n" + " embed_image_vec[i].width,\n" + " embed_image_vec[i].height,\n" + " embed_image_vec[i].depth,\n" + " (QRgb*)embed_image_vec[i].colorTable,\n" + " embed_image_vec[i].numColors,\n" + " QImage::BigEndian\n" + " );\n" +#endif + " if ( embed_image_vec[i].alpha )\n" + " img.setAlphaBuffer(TRUE);\n" + " return img;\n" + " }\n" + " }\n" + " return QImage();\n" + "}\n\n"; + + out << "class MimeSourceFactory_" << cProject << " : public QMimeSourceFactory\n"; + out << "{\n"; + out << "public:\n"; + out << " MimeSourceFactory_" << cProject << "() {}\n"; + out << " ~MimeSourceFactory_" << cProject << "() {}\n"; + out << " const QMimeSource* data( const QString& abs_name ) const {\n"; + out << "\tconst QMimeSource* d = QMimeSourceFactory::data( abs_name );\n"; + out << "\tif ( d || abs_name.isNull() ) return d;\n"; + out << "\tQImage img = uic_findImage( abs_name );\n"; + out << "\tif ( !img.isNull() )\n"; + out << "\t ((QMimeSourceFactory*)this)->setImage( abs_name, img );\n"; + out << "\treturn QMimeSourceFactory::data( abs_name );\n"; + out << " };\n"; + out << "};\n\n"; + + out << "static QMimeSourceFactory* factory = 0;\n"; + out << "\n"; + + out << "void qInitImages_" << cProject << "()\n"; + out << "{\n"; + out << " if ( !factory ) {\n"; + out << "\tfactory = new MimeSourceFactory_" << cProject << ";\n"; + out << "\tQMimeSourceFactory::defaultFactory()->addFactory( factory );\n"; + out << " }\n"; + out << "}\n\n"; + + out << "void qCleanupImages_" << cProject << "()\n"; + out << "{\n"; + out << " if ( factory ) {\n"; + out << "\tQMimeSourceFactory::defaultFactory()->removeFactory( factory );\n"; + out << "\tdelete factory;\n"; + out << "\tfactory = 0;\n"; + out << " }\n"; + out << "}\n\n"; + + out << "class StaticInitImages_" << cProject << "\n"; + out << "{\n"; + out << "public:\n"; + out << " StaticInitImages_" << cProject << "() { qInitImages_" << cProject << "(); }\n"; + out << "#if defined(Q_OS_SCO) || defined(Q_OS_UNIXWARE)\n"; + out << " ~StaticInitImages_" << cProject << "() { }\n"; + out << "#else\n"; + out << " ~StaticInitImages_" << cProject << "() { qCleanupImages_" << cProject << "(); }\n"; + out << "#endif\n"; + out << "};\n\n"; + + out << "static StaticInitImages_" << cProject << " staticImages;\n"; + } +} diff --git a/src/designer/embed.h b/src/designer/embed.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/designer/embed.h @@ -0,0 +1 @@ + diff --git a/src/designer/formdesigner.cpp b/src/designer/formdesigner.cpp new file mode 100644 index 0000000..bf9c067 --- /dev/null +++ b/src/designer/formdesigner.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** $Id: formdesigner.cpp,v 1.2 2008/11/27 20:20:55 leader Exp $ +** +** Code file of the Form designer of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "formdesigner.h" + +#include +//#include +#include "formdesigner/qdesigner_workbench.h" +#include "formdesigner/qdesigner_formwindow.h" +//#include + +//--aFormDesigner* aFormDesigner::m_designer = 0; + +aFormDesigner::aFormDesigner() +{ + m_workbench = new QDesignerWorkbench(); + setCentralWidget( m_workbench->mainWindow() ); +// resize( ); +/* + designerInterface = QDesignerComponents::createFormEditor( this ); + //new QDesignerFormEditorInterface( 0 ); + + QWidget *w = designerInterface->topLevel(); + if (w) w->show(); + else printf("no designer widget\n"); + + QDesignerWidgetBoxInterface *widgetBox = 0; + widgetBox = designerInterface->widgetBox(); + if ( widgetBox ) widgetBox->show(); +// designerInterface->show(); +*/ +} + + +aFormDesigner::~aFormDesigner() +{ +} + + +/*aFormDesigner* aFormDesigner::designer() +{ + if (!m_designer) + m_designer = new aFormDesigner(); + return m_designer; +}*/ + + +/*QWidget* aFormDesigner::mainWindow() +{ + return m_workbench->mainWindow(); +}*/ + + +void aFormDesigner::fileOpen(const QString& fileName) +{ + //m_guibuilder->openFile(fileName); + m_workbench->readInForm(fileName); +} + + +void aFormDesigner::closeEvent( QCloseEvent *e ) +{ +//CHECK_POINT + fileSaveAll(); + e->accept(); +// deleteLater(); + // ( (MainForm*)this->topLevelWidget() )->removeTab(caption()); +// e->ignore(); +} + + +void aFormDesigner::show() +{ + QMainWindow::show(); +/*CHECK_POINT + MainWindow::show(); +CHECK_POINT +// actioneditor()->hide(); + propertyeditor()->removePage( propertyeditor()->page( 1 ) ); //eventList()->hide(); + objectHierarchy()->parentWidget()->close(); + if(outputWindow() != NULL && outputWindow()->parentWidget()!=NULL) + { + +#ifndef _Windows + outputWindow()->parentWidget()->close(); +#endif + } + workspace()->parentWidget()->parentWidget()->close();*/ + //--mainWindow()->show(); +} + + +void aFormDesigner::hide() +{ + QMainWindow::hide(); + //--fileSaveAll(); + //--fileClose(); + // ( (MainForm*)this->topLevelWidget() )->removeTab(caption()); +} + + +void aFormDesigner::mouseDoubleClickEvent ( QMouseEvent * e ) +{ +//CHECK_POINT + +// MainWindow::mouseDoubleClickEvent ( e ); +} + + +/*GuiBuilderPart *aFormDesigner::guibuilder() const +{ + return m_guibuilder; +}*/ + +QDesignerWorkbench * +aFormDesigner::workbench() +{ + return m_workbench; +} + + +void +aFormDesigner::fileSaveAll() +{ + int i; + QDesignerFormWindow *w; + + for (i=0; i< workbench()->formWindowCount(); i++){ + w = workbench()->formWindow( i ); + workbench()->saveForm(w->editor()); + printf("w=%s\n", w->windowTitle().toUtf8().data()); + } +} + diff --git a/src/designer/formdesigner.h b/src/designer/formdesigner.h new file mode 100644 index 0000000..b3398b5 --- /dev/null +++ b/src/designer/formdesigner.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** $Id: formdesigner.h,v 1.3 2008/11/27 20:20:55 leader Exp $ +** +** Header file of the Form designer of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef FORMDESIGNER_H +#define FORMDESIGNER_H + +#include +#include +#include + + +class QDesignerWorkbench; + +class aFormDesigner : public QMainWindow +{ +public: + aFormDesigner(); + virtual ~aFormDesigner(); + void show(); + void hide(); + void fileOpen(const QString&); + void fileSaveAll(); + QDesignerWorkbench *workbench(); + +protected: + virtual void closeEvent( QCloseEvent *e ); + virtual void mouseDoubleClickEvent ( QMouseEvent * e ); + +private: + QDesignerWorkbench *m_workbench; +}; + +#endif diff --git a/src/designer/formdesigner/designer.qrc b/src/designer/formdesigner/designer.qrc new file mode 100644 index 0000000..11a3b0f --- /dev/null +++ b/src/designer/formdesigner/designer.qrc @@ -0,0 +1,9 @@ + + +images/designer.png +templates/forms/Dialog_with_Buttons_Bottom.ui +templates/forms/Dialog_with_Buttons_Right.ui +templates/forms/Widget.ui +templates/forms/Main_Window.ui + + diff --git a/src/designer/formdesigner/formwindowsettings.cpp b/src/designer/formdesigner/formwindowsettings.cpp new file mode 100644 index 0000000..c9c018a --- /dev/null +++ b/src/designer/formdesigner/formwindowsettings.cpp @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include "formwindowsettings.h" +#include +#include + +FormWindowSettings::FormWindowSettings(QDesignerFormWindowInterface *parent) + : QDialog(parent), m_formWindow(parent) +{ + ui.setupUi(this); + + int defaultMargin = INT_MIN, defaultSpacing = INT_MIN; + formWindow()->layoutDefault(&defaultMargin, &defaultSpacing); + + QStyle *style = formWindow()->style(); + ui.defaultMarginSpinBox->setValue(style->pixelMetric(QStyle::PM_DefaultChildMargin, 0)); + ui.defaultSpacingSpinBox->setValue(style->pixelMetric(QStyle::PM_DefaultLayoutSpacing, 0)); + + if (defaultMargin != INT_MIN || defaultMargin != INT_MIN) { + ui.layoutDefaultGroupBox->setChecked(true); + + if (defaultMargin != INT_MIN) + ui.defaultMarginSpinBox->setValue(defaultMargin); + + if (defaultSpacing != INT_MIN) + ui.defaultSpacingSpinBox->setValue(defaultSpacing); + } else { + ui.layoutDefaultGroupBox->setChecked(false); + } + + QString marginFunction, spacingFunction; + formWindow()->layoutFunction(&marginFunction, &spacingFunction); + if (!marginFunction.isEmpty() || !spacingFunction.isEmpty()) { + ui.layoutFunctionGroupBox->setChecked(true); + ui.marginFunctionLineEdit->setText(marginFunction); + ui.spacingFunctionLineEdit->setText(spacingFunction); + } else { + ui.layoutFunctionGroupBox->setChecked(false); + } + + QString pixFunction = formWindow()->pixmapFunction(); + ui.pixmapFunctionGroupBox->setChecked(!pixFunction.isEmpty()); + ui.pixmapFunctionLineEdit->setText(pixFunction); + + ui.authorLineEdit->setText(formWindow()->author()); + + foreach (QString includeHint, formWindow()->includeHints()) { + if (includeHint.isEmpty()) + continue; + + ui.includeHintsTextEdit->append(includeHint); + } +} + +FormWindowSettings::~FormWindowSettings() +{ +} + +QDesignerFormWindowInterface *FormWindowSettings::formWindow() const +{ + return m_formWindow; +} + +void FormWindowSettings::accept() +{ + formWindow()->setAuthor(ui.authorLineEdit->text()); + + if (ui.pixmapFunctionGroupBox->isChecked()) + formWindow()->setPixmapFunction(ui.pixmapFunctionLineEdit->text()); + + if (ui.layoutDefaultGroupBox->isChecked()) + formWindow()->setLayoutDefault(ui.defaultMarginSpinBox->value(), ui.defaultSpacingSpinBox->value()); + + if (ui.layoutFunctionGroupBox->isChecked()) + formWindow()->setLayoutFunction(ui.marginFunctionLineEdit->text(), ui.spacingFunctionLineEdit->text()); + + formWindow()->setIncludeHints(ui.includeHintsTextEdit->toPlainText().split(QLatin1String("\n"))); + + formWindow()->setDirty(true); + + QDialog::accept(); +} diff --git a/src/designer/formdesigner/formwindowsettings.h b/src/designer/formdesigner/formwindowsettings.h new file mode 100644 index 0000000..4d08d3d --- /dev/null +++ b/src/designer/formdesigner/formwindowsettings.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef FORMWINDOWSETTINGS_H +#define FORMWINDOWSETTINGS_H + +#include "ui_formwindowsettings.h" + +class QDesignerFormWindowInterface; + +class FormWindowSettings: public QDialog +{ + Q_OBJECT +public: + FormWindowSettings(QDesignerFormWindowInterface *formWindow); + virtual ~FormWindowSettings(); + + QDesignerFormWindowInterface *formWindow() const; + + virtual void accept(); + +private: + Ui::FormWindowSettings ui; + QDesignerFormWindowInterface *m_formWindow; +}; + +#endif // FORMWINDOWSETTINGS_H + diff --git a/src/designer/formdesigner/formwindowsettings.ui b/src/designer/formdesigner/formwindowsettings.ui new file mode 100644 index 0000000..18342f5 --- /dev/null +++ b/src/designer/formdesigner/formwindowsettings.ui @@ -0,0 +1,319 @@ + + + ********************************************************************* +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +********************************************************************* + + FormWindowSettings + + + + 0 + 0 + 433 + 465 + + + + Form Settings + + + + 8 + + + 6 + + + + + Qt::Vertical + + + + 111 + 115 + + + + + + + + 0 + + + 6 + + + + + &Pixmap Function + + + true + + + + 8 + + + 6 + + + + + + + + + + + + + &Include Hints + + + + 8 + + + 6 + + + + + + + + + + + &Author + + + + 8 + + + 6 + + + + + + + + + + + 0 + + + 6 + + + + + Layout &Default + + + true + + + + 8 + + + 6 + + + + + &Spacing: + + + defaultSpacingSpinBox + + + + + + + &Margin: + + + defaultMarginSpinBox + + + + + + + + + + + + + + + + &Layout Function + + + true + + + + 8 + + + 6 + + + + + + + + + + + Ma&rgin: + + + marginFunctionLineEdit + + + + + + + Spa&cing: + + + spacingFunctionLineEdit + + + + + + + + + + + + Qt::Horizontal + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + + + authorLineEdit + defaultMarginSpinBox + defaultSpacingSpinBox + marginFunctionLineEdit + spacingFunctionLineEdit + pixmapFunctionLineEdit + okButton + cancelButton + + + + + okButton + clicked() + FormWindowSettings + accept() + + + 351 + 38 + + + 233 + 29 + + + + + cancelButton + clicked() + FormWindowSettings + reject() + + + 330 + 66 + + + 197 + 125 + + + + + diff --git a/src/designer/formdesigner/images/designer.png b/src/designer/formdesigner/images/designer.png new file mode 100644 index 0000000..1014a9c Binary files /dev/null and b/src/designer/formdesigner/images/designer.png differ diff --git a/src/designer/formdesigner/images/mdi.png b/src/designer/formdesigner/images/mdi.png new file mode 100644 index 0000000..5012ab3 Binary files /dev/null and b/src/designer/formdesigner/images/mdi.png differ diff --git a/src/designer/formdesigner/images/sdi.png b/src/designer/formdesigner/images/sdi.png new file mode 100644 index 0000000..7fff6e8 Binary files /dev/null and b/src/designer/formdesigner/images/sdi.png differ diff --git a/src/designer/formdesigner/images/workbench.png b/src/designer/formdesigner/images/workbench.png new file mode 100644 index 0000000..b4397fb Binary files /dev/null and b/src/designer/formdesigner/images/workbench.png differ diff --git a/src/designer/formdesigner/newform.cpp b/src/designer/formdesigner/newform.cpp new file mode 100644 index 0000000..dae9841 --- /dev/null +++ b/src/designer/formdesigner/newform.cpp @@ -0,0 +1,244 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include "newform.h" +//#include "qdesigner.h" +#include "qdesigner_workbench.h" +#include "qdesigner_actions.h" +#include "qdesigner_formwindow.h" +#include "qdesigner_settings.h" + +#include "private/qdesigner_formbuilder_p.h" +#include "private/sheet_delegate_p.h" + +#include + +#include +#include +#include +#include +#include + +#include + +enum NewForm_CustomRole +{ + TemplateNameRole = Qt::UserRole + 100 +}; + +NewForm::NewForm(QDesignerWorkbench *workbench, QWidget *parentWidget) + : QDialog(parentWidget, +#ifdef Q_WS_MAC + Qt::Tool | +#endif + Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + m_workbench(workbench) +{ + ui.setupUi(this); + ui.treeWidget->setItemDelegate(new qdesigner_internal::SheetDelegate(ui.treeWidget, this)); + ui.treeWidget->header()->hide(); + ui.treeWidget->header()->setStretchLastSection(true); + ui.lblPreview->setBackgroundRole(QPalette::Base); + ui.chkShowOnStartup->setChecked(QDesignerSettings().showNewFormOnStartup()); + + loadFrom(QLatin1String(":/trolltech/designer/templates/forms"), true); + + QDesignerSettings settings; + foreach(QString path, settings.formTemplatePaths()) + loadFrom(path, false); +} + +NewForm::~NewForm() +{ + QDesignerSettings().setShowNewFormOnStartup(ui.chkShowOnStartup->isChecked()); +} + +void NewForm::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *) +{ + if (current && current->parent()) { + QIcon icon = formPreviewIcon(current->data(0, TemplateNameRole).toString()); + if (icon.isNull()) { + ui.createButton->setEnabled(false); + ui.lblPreview->setText(tr("Error loading form")); + } else { + ui.createButton->setEnabled(true); + ui.createButton->setDefault(true); + ui.lblPreview->setPixmap(icon.pixmap(QSize(256, 256))); + } + } else { + ui.createButton->setEnabled(false); + ui.lblPreview->setText(tr("Choose a template for a preview")); + } +} + +void NewForm::on_treeWidget_itemActivated(QTreeWidgetItem *item) +{ + if (item->data(0, TemplateNameRole).isValid()) + ui.createButton->animateClick(0); +} + +void NewForm::on_createButton_clicked() +{ + if (QTreeWidgetItem *item = ui.treeWidget->currentItem()) { + close(); + + int maxUntitled = 0; + int totalWindows = m_workbench->formWindowCount(); + // This will cause some problems with i18n, but for now I need the string to be "static" + QRegExp rx(QLatin1String("untitled( (\\d+))?")); + for (int i = 0; i < totalWindows; ++i) { + QString title = m_workbench->formWindow(i)->windowTitle(); + title = title.replace(QLatin1String("[*]"), QLatin1String("")); + if (rx.indexIn(title) != 1) { + if (maxUntitled == 0) + ++maxUntitled; + if (rx.numCaptures() > 1) + maxUntitled = qMax(rx.cap(2).toInt(), maxUntitled); + } + } + + QDesignerFormWindow *formWindow = workbench()->createFormWindow(); + if (QDesignerFormWindowInterface *editor = formWindow->editor()) { + QString formTemplateName = item->data(0, TemplateNameRole).toString(); + QFile f(formTemplateName); + if (f.open(QFile::ReadOnly)) { + editor->setContents(&f); + f.close(); + } else { + editor->setContents(QString()); + } + + if (QWidget *container = editor->mainContainer()) + formWindow->resize(container->size()); + } + QString newTitle = QLatin1String("untitled"); + if (maxUntitled) + newTitle += QLatin1String(" ") + QString::number(maxUntitled + 1); + + newTitle.append(QLatin1String("[*]")); + formWindow->setWindowTitle(newTitle); + formWindow->editor()->setFileName(""); + formWindow->show(); + } +} + +void NewForm::on_closeButton_clicked() +{ + close(); +} + +QDesignerWorkbench *NewForm::workbench() const +{ + return m_workbench; +} + +QIcon NewForm::formPreviewIcon(const QString &fileName) +{ + QIcon result; + + QFile f(fileName); + if (f.open(QFile::ReadOnly)) { + qdesigner_internal::QDesignerFormBuilder formBuilder(workbench()->core(),qdesigner_internal::QDesignerFormBuilder::DisableScripts); + + QWidget *fake = new QWidget(0); + fake->setAttribute(Qt::WA_WState_Visible); + + if (QWidget *widget = formBuilder.load(&f, fake)) { + widget->setParent(fake, 0); + widget->show(); + f.close(); + + QPixmap pix = QPixmap::grabWidget(widget); + QImage image = pix.toImage(); + image = image.scaled(256, 256, Qt::KeepAspectRatio, Qt::SmoothTransformation); + result = QPixmap::fromImage(image); + } + + fake->deleteLater(); + } + + return result; +} + +void NewForm::loadFrom(const QString &path, bool resourceFile) +{ + QDir dir(path); + + if (!dir.exists()) + return; + + // Iterate through the directory and add the templates + QFileInfoList list = dir.entryInfoList(QStringList() << "*.ui", QDir::Files); + + if (list.isEmpty()) + return; + + QChar separator = resourceFile ? QChar(QLatin1Char('/')) + : QChar(QDir::separator()); + QTreeWidgetItem *root = new QTreeWidgetItem(ui.treeWidget); + // Try to get something that is easy to read. + QString visiblePath = path; + int index = visiblePath.lastIndexOf(separator); + if (index != -1) { + // try to find a second slash, just to be a bit better. + int index2 = visiblePath.lastIndexOf(separator, index - 1); + if (index2 != -1) + index = index2; + visiblePath = visiblePath.mid(index + 1); + visiblePath = QDir::convertSeparators(visiblePath); + } + + root->setText(0, visiblePath.replace(QLatin1String("_"), QLatin1String(" "))); + root->setToolTip(0, path); + + foreach(QFileInfo fi, list) { + if (!fi.isFile()) + continue; + + QTreeWidgetItem *item = new QTreeWidgetItem(root); + item->setText(0, fi.baseName().replace(QLatin1String("_"), QLatin1String(" "))); + item->setData(0, TemplateNameRole, fi.absoluteFilePath()); + + QTreeWidgetItem *i = ui.treeWidget->currentItem(); + if (i == 0) { + ui.treeWidget->setCurrentItem(item); + ui.treeWidget->setItemSelected(item, true); + } + } + ui.treeWidget->setItemExpanded(root, true); +} + +void NewForm::on_openButton_clicked() +{ + hide(); + if (m_workbench->actionManager()->openForm()) + close(); + else + show(); +} + +void NewForm::on_treeWidget_itemPressed(QTreeWidgetItem *item) +{ + if (item && !item->parent()) + ui.treeWidget->setItemExpanded(item, !ui.treeWidget->isItemExpanded(item)); +} diff --git a/src/designer/formdesigner/newform.h b/src/designer/formdesigner/newform.h new file mode 100644 index 0000000..bdc9b7f --- /dev/null +++ b/src/designer/formdesigner/newform.h @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef NEWFORM_H +#define NEWFORM_H + +#include "ui_newform.h" + +#include + +class QDesignerWorkbench; + +class NewForm: public QDialog +{ + Q_OBJECT +public: + NewForm(QDesignerWorkbench *workbench, QWidget *parentWidget); + virtual ~NewForm(); + + QDesignerWorkbench *workbench() const; + +private slots: + void on_createButton_clicked(); + void on_closeButton_clicked(); + void on_openButton_clicked(); + void on_treeWidget_itemActivated(QTreeWidgetItem *item); + void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *); + void on_treeWidget_itemPressed(QTreeWidgetItem *item); + +private: + QIcon formPreviewIcon(const QString &fileName); + void loadFrom(const QString &path, bool resourceFile); + +private: + QDesignerWorkbench *m_workbench; + Ui::NewForm ui; +}; + +#endif // NEWFORM_H diff --git a/src/designer/formdesigner/newform.ui b/src/designer/formdesigner/newform.ui new file mode 100644 index 0000000..b513748 --- /dev/null +++ b/src/designer/formdesigner/newform.ui @@ -0,0 +1,254 @@ + + + ********************************************************************* +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +********************************************************************* + + NewForm + + + + 0 + 0 + 494 + 300 + + + + New Form + + + + 9 + + + 6 + + + + + 1 + + + 6 + + + + + + 1 + 1 + 256 + 205 + + + + + 1 + 7 + 0 + 0 + + + + + 128 + 128 + + + + false + + + 1 + + + + 0 + + + + + + + + + 263 + 1 + 212 + 205 + + + + + 7 + 5 + 0 + 0 + + + + 1 + + + Choose a template for a preview + + + Qt::AlignCenter + + + 5 + + + + + + + + + + 9 + 222 + 476 + 3 + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + 1 + + + 6 + + + + + + 1 + 27 + 103 + 32 + + + + &Open... + + + + + + + + 110 + 27 + 147 + 32 + + + + Qt::Horizontal + + + + 61 + 32 + + + + + + + + false + + + + 263 + 27 + 103 + 32 + + + + C&reate + + + false + + + true + + + + + + + + 372 + 27 + 103 + 32 + + + + &Close + + + false + + + false + + + + + + + + 1 + 1 + 256 + 20 + + + + Show this Dialog on Startup + + + + + + + + + + + diff --git a/src/designer/formdesigner/plugindialog.cpp b/src/designer/formdesigner/plugindialog.cpp new file mode 100644 index 0000000..c57f097 --- /dev/null +++ b/src/designer/formdesigner/plugindialog.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include +#include "private/pluginmanager_p.h" + +#include + +#include "plugindialog.h" + +PluginDialog::PluginDialog(QDesignerFormEditorInterface *core, QWidget *parent) + : QDialog(parent +#ifdef Q_WS_MAC + , Qt::Tool +#endif + ), m_core(core) +{ + ui.setupUi(this); + + ui.message->hide(); + + QStringList headerLabels; + headerLabels << tr("Components"); + + ui.treeWidget->setAlternatingRowColors(false); + ui.treeWidget->setSelectionMode(QAbstractItemView::NoSelection); + ui.treeWidget->setHeaderLabels(headerLabels); + ui.treeWidget->header()->hide(); + + interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirOpenIcon), + QIcon::Normal, QIcon::On); + interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirClosedIcon), + QIcon::Normal, QIcon::Off); + featureIcon.addPixmap(style()->standardPixmap(QStyle::SP_FileIcon)); + + setWindowTitle(tr("Plugin Information")); + populateTreeWidget(); +} + +QDesignerFormEditorInterface *PluginDialog::core() const +{ + return m_core; +} + +void PluginDialog::populateTreeWidget() +{ + QStringList fileNames = core()->pluginManager()->registeredPlugins(); + + foreach (QString fileName, fileNames) { + QPluginLoader loader(fileName); + QFileInfo fileInfo(fileName); + + QObject *plugin = loader.instance(); + + QTreeWidgetItem *pluginItem = new QTreeWidgetItem(ui.treeWidget); + pluginItem->setText(0, fileInfo.fileName()); + pluginItem->setIcon(0, style()->standardPixmap(QStyle::SP_DirOpenIcon)); + ui.treeWidget->setItemExpanded(pluginItem, true); + + QFont boldFont = pluginItem->font(0); + boldFont.setBold(true); + pluginItem->setFont(0, boldFont); + + if (plugin != 0) { + QDesignerCustomWidgetCollectionInterface *c = qobject_cast(plugin); + if (c != 0) { + foreach (QDesignerCustomWidgetInterface *p, c->customWidgets()) { + QTreeWidgetItem *item = new QTreeWidgetItem(pluginItem); + item->setText(0, p->name()); + item->setIcon(0, pluginIcon(p->icon())); + item->setToolTip(0, p->toolTip()); + item->setWhatsThis(0, p->whatsThis()); + } + } + + QDesignerCustomWidgetInterface *p = qobject_cast(plugin); + if (p != 0) { + QTreeWidgetItem *item = new QTreeWidgetItem(pluginItem); + item->setText(0, p->name()); + item->setIcon(0, pluginIcon(p->icon())); + item->setToolTip(0, p->toolTip()); + item->setWhatsThis(0, p->whatsThis()); + } + } + } + + if (ui.treeWidget->topLevelItemCount() == 0) { + ui.label->setText(tr("Qt Designer couldn't find any plugins")); + ui.treeWidget->hide(); + } else { + ui.label->setText(tr("Qt Designer found the following plugins")); + } +} + +QIcon PluginDialog::pluginIcon(const QIcon &icon) +{ + if (icon.isNull()) + return QIcon(":/trolltech/formeditor/images/qtlogo.png"); + + return icon; +} + diff --git a/src/designer/formdesigner/plugindialog.h b/src/designer/formdesigner/plugindialog.h new file mode 100644 index 0000000..90e95f9 --- /dev/null +++ b/src/designer/formdesigner/plugindialog.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef PLUGINDIALOG_H +#define PLUGINDIALOG_H + +#include "ui_plugindialog.h" + +class QDesignerFormEditorInterface; + +class PluginDialog : public QDialog +{ + Q_OBJECT +public: + PluginDialog(QDesignerFormEditorInterface *core, QWidget *parent = 0); + + QDesignerFormEditorInterface *core() const; + +private: + void populateTreeWidget(); + QIcon pluginIcon(const QIcon &icon); + +private: + QDesignerFormEditorInterface *m_core; + Ui::PluginDialog ui; + QIcon interfaceIcon; + QIcon featureIcon; +}; + +#endif diff --git a/src/designer/formdesigner/plugindialog.ui b/src/designer/formdesigner/plugindialog.ui new file mode 100644 index 0000000..be89004 --- /dev/null +++ b/src/designer/formdesigner/plugindialog.ui @@ -0,0 +1,134 @@ + + + ********************************************************************* +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +********************************************************************* + + PluginDialog + + + + 0 + 0 + 401 + 331 + + + + Plugin Informations + + + + 8 + + + 6 + + + + + TextLabel + + + true + + + + + + + + + + TextLabel + + + true + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + okButton + clicked() + PluginDialog + accept() + + + 278 + 253 + + + 96 + 254 + + + + + diff --git a/src/designer/formdesigner/private/formscriptrunner_p.h b/src/designer/formdesigner/private/formscriptrunner_p.h new file mode 100644 index 0000000..627ee21 --- /dev/null +++ b/src/designer/formdesigner/private/formscriptrunner_p.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef FORMSCRIPTRUNNER_H +#define FORMSCRIPTRUNNER_H + +#include +#include +#include +#include + +class QWidget; + +#ifdef QFORMINTERNAL_NAMESPACE +namespace QFormInternal +{ +#endif + +class DomWidget; + +class QDESIGNER_UILIB_EXPORT QFormScriptRunner +{ +public: + QFormScriptRunner(); + ~QFormScriptRunner(); + + typedef QList WidgetList; + + bool run(const DomWidget *domWidget, + const QString &customWidgetScript, + QWidget *widget, const WidgetList &children, + QString *errorMessage); + + struct Error { + QString objectName; + QString script; + QString errorMessage; + }; + typedef QList Errors; + Errors errors() const; + void clearErrors(); + + enum Option { + NoOptions = 0x0, + DisableWarnings = 0x1, + DisableScripts = 02 + }; + Q_DECLARE_FLAGS(Options, Option) + + Options options() const; + void setOptions(Options options); + +private: + class QFormScriptRunnerPrivate; + QFormScriptRunnerPrivate *m_impl; + + QFormScriptRunner(const QFormScriptRunner &); + void operator = (const QFormScriptRunner &); +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QFormScriptRunner::Options) + +#ifdef QFORMINTERNAL_NAMESPACE +} +#endif + +#endif // FORMSCRIPTRUNNER_H diff --git a/src/designer/formdesigner/private/pluginmanager_p.h b/src/designer/formdesigner/private/pluginmanager_p.h new file mode 100644 index 0000000..e970b04 --- /dev/null +++ b/src/designer/formdesigner/private/pluginmanager_p.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef PLUGINMANAGER_H +#define PLUGINMANAGER_H + +#include "shared_global_p.h" + +#include +#include +#include + +class QDesignerFormEditorInterface; +class QDesignerCustomWidgetInterface; + +class QDESIGNER_SHARED_EXPORT QDesignerPluginManager: public QObject +{ + Q_OBJECT +public: + QDesignerPluginManager(QDesignerFormEditorInterface *core); + virtual ~QDesignerPluginManager(); + + QDesignerFormEditorInterface *core() const; + + QObject *instance(const QString &plugin) const; + + QStringList registeredPlugins() const; + + QStringList findPlugins(const QString &path); + + QStringList pluginPaths() const; + void setPluginPaths(const QStringList &plugin_paths); + + QStringList disabledPlugins() const; + void setDisabledPlugins(const QStringList &disabled_plugins); + + QStringList failedPlugins() const; + QString failureReason(const QString &pluginName) const; + + QList instances() const; + QList registeredCustomWidgets() const; + + bool registerNewPlugins(); + +public slots: + bool syncSettings(); + void ensureInitialized(); + +private: + void updateRegisteredPlugins(); + void registerPath(const QString &path); + void registerPlugin(const QString &plugin); + +private: + QDesignerFormEditorInterface *m_core; + QStringList m_pluginPaths; + QStringList m_registeredPlugins; + QStringList m_disabledPlugins; + + typedef QMap FailedPluginMap; + FailedPluginMap m_failedPlugins; + + typedef QList CustomWidgetList; + CustomWidgetList m_customWidgets; + + QStringList defaultPluginPaths() const; +}; + +#endif // PLUGINMANAGER_H diff --git a/src/designer/formdesigner/private/qdesigner_formbuilder_p.h b/src/designer/formdesigner/private/qdesigner_formbuilder_p.h new file mode 100644 index 0000000..028c595 --- /dev/null +++ b/src/designer/formdesigner/private/qdesigner_formbuilder_p.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QDESIGNER_FORMBUILDER_H +#define QDESIGNER_FORMBUILDER_H + +#include "shared_global_p.h" + +#include +#include + +#include +#include + +class QDesignerFormEditorInterface; +class QDesignerFormWindowInterface; + +namespace qdesigner_internal { + +// Form builder used for previewing forms +class QDESIGNER_SHARED_EXPORT QDesignerFormBuilder: public QFormBuilder +{ +public: + enum Mode { + // Use container extension to populate containers. Disable scripts. + DisableScripts, + // Use container extension to populate containers as well as scripts + UseScriptAndContainerExtension, + // Experimental: Use scripts to populate the container + UseScriptForContainerExtension + }; + + QDesignerFormBuilder(QDesignerFormEditorInterface *core, Mode mode); + + QWidget *createWidgetFromContents(const QString &contents, QWidget *parentWidget = 0); + + virtual QWidget *createWidget(DomWidget *ui_widget, QWidget *parentWidget = 0) + { return QFormBuilder::create(ui_widget, parentWidget); } + + inline QDesignerFormEditorInterface *core() const + { return m_core; } + + typedef QFormScriptRunner::Errors ScriptErrors; + // Create a preview widget (for integrations) or return 0. The widget has to be embedded into a main window. + // Experimental, depending on script support. + static QWidget *createPreview(const QDesignerFormWindowInterface *fw, const QString &styleName /* ="" */, + ScriptErrors *scriptErrors, QString *errorMessage); + // Convenience that pops up message boxes in case of failures. + static QWidget *createPreview(const QDesignerFormWindowInterface *fw, const QString &styleName = QString()); + +protected: + using QFormBuilder::createDom; + using QFormBuilder::create; + + virtual QWidget *create(DomUI *ui, QWidget *parentWidget); + virtual DomWidget *createDom(QWidget *widget, DomWidget *ui_parentWidget, bool recursive = true); + virtual QWidget *create(DomWidget *ui_widget, QWidget *parentWidget); + virtual QLayout *create(DomLayout *ui_layout, QLayout *layout, QWidget *parentWidget); + + virtual QWidget *createWidget(const QString &widgetName, QWidget *parentWidget, const QString &name); + virtual bool addItem(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget); + virtual bool addItem(DomLayoutItem *ui_item, QLayoutItem *item, QLayout *layout); + + virtual QIcon nameToIcon(const QString &filePath, const QString &qrcPath); + virtual QPixmap nameToPixmap(const QString &filePath, const QString &qrcPath); + + virtual void applyProperties(QObject *o, const QList &properties); + + virtual void loadExtraInfo(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget); + +private: + bool addItemContainerExtension(QWidget *widget, QWidget *parentWidget); + QDesignerFormEditorInterface *m_core; + const Mode m_mode; + + typedef QSet WidgetSet; + WidgetSet m_customWidgetsWithScript; +}; + +} // namespace qdesigner_internal + +#endif // QDESIGNER_FORMBUILDER_H diff --git a/src/designer/formdesigner/private/qdesigner_integration_p.h b/src/designer/formdesigner/private/qdesigner_integration_p.h new file mode 100644 index 0000000..3ac94bd --- /dev/null +++ b/src/designer/formdesigner/private/qdesigner_integration_p.h @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QDESIGNER_INTEGRATION_H +#define QDESIGNER_INTEGRATION_H + +#include "shared_global_p.h" +#include "abstractintegration.h" + +#include + +class QDesignerFormEditorInterface; +class QDesignerFormWindowInterface; +class QDesignerFormWindowManagerInterface; + +class QVariant; +class QWidget; + +namespace qdesigner_internal { + +struct Selection; + +class QDESIGNER_SHARED_EXPORT QDesignerIntegration: public QDesignerIntegrationInterface +{ + Q_OBJECT +public: + QDesignerIntegration(QDesignerFormEditorInterface *core, QObject *parent = 0); + virtual ~QDesignerIntegration(); + + virtual QWidget *containerWindow(QWidget *widget) const; + + // Load plugins into widget database and factory. + static void initializePlugins(QDesignerFormEditorInterface *formEditor); + +signals: + void propertyChanged(QDesignerFormWindowInterface *formWindow, const QString &name, const QVariant &value); + +public slots: + virtual void updateProperty(const QString &name, const QVariant &value); + // Additional signals of designer property editor + virtual void updatePropertyComment(const QString &name, const QString &value); + virtual void resetProperty(const QString &name); + virtual void addDynamicProperty(const QString &name, const QVariant &value); + virtual void removeDynamicProperty(const QString &name); + + + virtual void updateActiveFormWindow(QDesignerFormWindowInterface *formWindow); + virtual void setupFormWindow(QDesignerFormWindowInterface *formWindow); + virtual void updateSelection(); + virtual void updateGeometry(); + virtual void activateWidget(QWidget *widget); + + void updateCustomWidgetPlugins(); + +private: + void initialize(); + void getSelection(Selection &s); + QObject *propertyEditorObject(); + + QDesignerFormWindowManagerInterface *m_formWindowManager; +}; + +} // namespace qdesigner_internal + +#endif // QDESIGNER_INTEGRATION_H diff --git a/src/designer/formdesigner/private/qtundo_p.h b/src/designer/formdesigner/private/qtundo_p.h new file mode 100644 index 0000000..0e3e29f --- /dev/null +++ b/src/designer/formdesigner/private/qtundo_p.h @@ -0,0 +1,274 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QTUNDO_H +#define QTUNDO_H + +#include "shared_global_p.h" + +#include +#include +#include +#include +#include + +class QWidget; +class QAction; +class QtUndoStack; + +class QDESIGNER_SHARED_EXPORT QtCommand : public QObject +{ + Q_OBJECT + + friend class QtUndoStack; + + public: + enum Type { Command, MacroBegin, MacroEnd }; + + QtCommand(Type type, const QString &description = QString(), + bool canMerge = false); + QtCommand(const QString &description = QString(), + bool canMerge = true); + + virtual void redo() {}; + virtual void undo() {}; + + QString description() const + { return m_description; } + void setDescription(const QString &s) + { m_description = s; } + bool canMerge() const + { return m_can_merge; } + void setCanMerge(bool b) + { m_can_merge = b; } + Type type() const + { return m_type; } + + bool isMacroBegin() const + { return m_type == MacroBegin; } + bool isMacroEnd() const + { return m_type == MacroEnd; } + bool isCommand() const + { return m_type == Command; } + + protected: + virtual bool mergeMeWith(QtCommand *other); + + private: + void shortenStack(); + + bool m_can_merge; + QString m_description; + Type m_type; +}; + +class QtMultiCommand : public QtCommand +{ +public: + QtMultiCommand(const QString &description = QString()); + QtMultiCommand(const QList &command_list, + const QString &description = QString()); + ~QtMultiCommand(); + virtual void redo(); + virtual void undo(); + + void append(QtCommand *command); + int count() const; + QtCommand *command(int i) const; + +private: + QList m_command_list; +}; + +class QtUndoState; + +class QDESIGNER_SHARED_EXPORT QtUndoStack : public QObject, private QList +{ + Q_OBJECT + + friend class QtUndoManager; + + public: + QtUndoStack(QObject *parent = 0); + void push(QtCommand *command); + bool canUndo() const; + bool canRedo() const; + QString undoDescription() const; + QString redoDescription() const; + QStringList undoList() const; + QStringList redoList() const; + bool isClean() const; + + void setCurrent(); + + QAction *createUndoAction(QObject *parent) const; + QAction *createRedoAction(QObject *parent) const; + + inline int currentIndex() const { return m_current_iter; } + + public slots: + void undo(int count = 1); + void redo(int count = 1); + void clear(); + + void setClean(); + + signals: + void cleanChanged(bool clean); + void commandExecuted(); + + void undoDescriptionChanged(const QString &newDescription); + void redoDescriptionChanged(const QString &newDescription); + void canUndoChanged(bool enabled); + void canRedoChanged(bool enabled); + + private: + typedef int CommandIter; + + void undoMacro(); + void redoMacro(); + CommandIter findMacroBegin(CommandIter it) const; + CommandIter findMacroEnd(CommandIter it) const; + + void beforeChange(QtUndoState &state); + void afterChange(const QtUndoState &state); + + // *m_current_iter == 0 means "one-before-first" + CommandIter m_current_iter; + uint m_num_commands; + int m_macro_nest; + + bool m_have_clean_command; + const QtCommand *m_clean_command; + + QtCommand *commandAt(CommandIter it) const; +}; + +class QDESIGNER_SHARED_EXPORT QtUndoManager : public QObject +{ + Q_OBJECT + + public: + QtUndoManager(); + + QAction *createUndoAction(QObject *parent) const; + QAction *createRedoAction(QObject *parent) const; + + void associateView(QObject *obj, QtUndoStack *stack); + void disassociateView(QObject *obj); + + bool canUndo() const; + bool canRedo() const; + QString undoDescription() const; + QString redoDescription() const; + void setUndoLimit(uint i); + uint undoLimit() const; + QStringList undoList() const; + QStringList redoList() const; + QtUndoStack *currentStack() const; + void setCurrentStack(QtUndoStack *stack); + + static QtUndoManager *manager(); + + public slots: + void undo(int count = 1); + void redo(int count = 1); + + void updateActions(); + + signals: + void changed(); + + void undoDescriptionChanged(const QString &newDescription); + void redoDescriptionChanged(const QString &newDescription); + void canUndoChanged(bool enabled); + void canRedoChanged(bool enabled); + + private slots: + void stackDestroyed(QObject *stack); + void viewDestroyed(QObject *view); + + private: + typedef QMap StackMap; + + StackMap m_stack_map; + QtUndoStack *m_current_stack; + + static QtUndoManager *m_manager; // singleton + static uint m_undo_limit; + + bool m_can_undo, m_can_redo; + QString m_undo_description, m_redo_description; +}; + +class QDESIGNER_SHARED_EXPORT QtUndoListModel: public QAbstractItemModel +{ + Q_OBJECT +public: + QtUndoListModel(QObject *parent = 0); + virtual ~QtUndoListModel(); + + inline int undoIndex() const { return m_undoIndex; } + + virtual int rowCount(const QModelIndex &parent) const; + virtual int columnCount(const QModelIndex &parent) const; + virtual bool hasChildren(const QModelIndex &parent) const + { return rowCount(parent) > 0; } + + virtual QModelIndex parent(const QModelIndex &index) const; + virtual QModelIndex index(int row, int column, const QModelIndex &parent) const; + virtual QVariant data(const QModelIndex &index, int role) const; + +private slots: + void updateItems(); + +private: + QStringList m_items; + int m_undoIndex; +}; + +class QDESIGNER_SHARED_EXPORT QtUndoListView: public QListView +{ + Q_OBJECT +public: + QtUndoListView(QWidget *parent = 0); + virtual ~QtUndoListView(); + virtual void reset(); +private slots: + void undoOrRedo(); +}; + + + +#endif diff --git a/src/designer/formdesigner/private/shared_global_p.h b/src/designer/formdesigner/private/shared_global_p.h new file mode 100644 index 0000000..32fb525 --- /dev/null +++ b/src/designer/formdesigner/private/shared_global_p.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef SHARED_GLOBAL_H +#define SHARED_GLOBAL_H + +#include + +#ifdef QT_DESIGNER_STATIC +#define QDESIGNER_SHARED_EXTERN +#define QDESIGNER_SHARED_IMPORT +#else +#define QDESIGNER_SHARED_EXTERN Q_DECL_EXPORT +#define QDESIGNER_SHARED_IMPORT Q_DECL_IMPORT +#endif + +#ifndef QT_NO_SHARED_EXPORT +# ifdef QDESIGNER_SHARED_LIBRARY +# define QDESIGNER_SHARED_EXPORT QDESIGNER_SHARED_EXTERN +# else +# define QDESIGNER_SHARED_EXPORT QDESIGNER_SHARED_IMPORT +# endif +#else +# define QDESIGNER_SHARED_EXPORT +#endif + +#endif // SHARED_GLOBAL_H diff --git a/src/designer/formdesigner/private/sheet_delegate_p.h b/src/designer/formdesigner/private/sheet_delegate_p.h new file mode 100644 index 0000000..f260f03 --- /dev/null +++ b/src/designer/formdesigner/private/sheet_delegate_p.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + + +#ifndef SHEET_DELEGATE_H +#define SHEET_DELEGATE_H + +#include "shared_global_p.h" + +#include +#include + +class QTreeView; + +namespace qdesigner_internal { + +class QDESIGNER_SHARED_EXPORT SheetDelegate: public QItemDelegate +{ + Q_OBJECT +public: + SheetDelegate(QTreeView *view, QWidget *parent); + + virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + virtual QSize sizeHint(const QStyleOptionViewItem &opt, const QModelIndex &index) const; + +private: + QTreeView *m_view; +}; + +} // namespace qdesigner_internal + +#endif // SHEET_DELEGATE_H diff --git a/src/designer/formdesigner/qdesigner_actioneditor.cpp b/src/designer/formdesigner/qdesigner_actioneditor.cpp new file mode 100644 index 0000000..fedaaa2 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_actioneditor.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_actioneditor.h" +#include "qdesigner_workbench.h" + +#include +#include + +QDesignerActionEditor::QDesignerActionEditor(QDesignerWorkbench *workbench) + : QDesignerToolWindow(workbench) +{ + setObjectName(QLatin1String("ActionEditor")); + QDesignerActionEditorInterface *widget = QDesignerComponents::createActionEditor(workbench->core(), this); + workbench->core()->setActionEditor(widget); + + setCentralWidget(widget); + + setWindowTitle(tr("Action Editor")); +} + +QDesignerActionEditor::~QDesignerActionEditor() +{ +} + +QRect QDesignerActionEditor::geometryHint() const +{ + QRect g = workbench()->availableGeometry(); + int margin = workbench()->marginHint(); + + QSize sz(g.width() * 1/4, g.height() * 1/6); + + return QRect((g.width() - sz.width() - margin), margin, + sz.width(), sz.height()); +} diff --git a/src/designer/formdesigner/qdesigner_actioneditor.h b/src/designer/formdesigner/qdesigner_actioneditor.h new file mode 100644 index 0000000..a940ccf --- /dev/null +++ b/src/designer/formdesigner/qdesigner_actioneditor.h @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_ACTIONEDITOR_H +#define QDESIGNER_ACTIONEDITOR_H + +#include "qdesigner_toolwindow.h" + +class QDesignerWorkbench; + +class QDesignerActionEditor: public QDesignerToolWindow +{ + Q_OBJECT +public: + QDesignerActionEditor(QDesignerWorkbench *workbench); + virtual ~QDesignerActionEditor(); + + virtual QRect geometryHint() const; +}; + +#endif // QDESIGNER_ACTIONEDITOR_H diff --git a/src/designer/formdesigner/qdesigner_actions.cpp b/src/designer/formdesigner/qdesigner_actions.cpp new file mode 100644 index 0000000..6ff32fd --- /dev/null +++ b/src/designer/formdesigner/qdesigner_actions.cpp @@ -0,0 +1,998 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_toolwindow.h" +#include "qdesigner_actions.h" +#include "qdesigner_workbench.h" +#include "qdesigner_formwindow.h" +#include "qdesigner_settings.h" +#include "newform.h" +//#include "versiondialog.h" +//#include "oublietteview.h" +#include "saveformastemplate.h" +#include "plugindialog.h" +#include "formwindowsettings.h" + +// sdk +#include +#include "private/qdesigner_formbuilder_p.h" +#include "private/qtundo_p.h" +#include "private/pluginmanager_p.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +QDesignerActions::QDesignerActions(QDesignerWorkbench *workbench) + : QObject(workbench), + m_workbench(workbench), m_assistantClient(0), m_openDirectory(QString()) +{ + Q_ASSERT(m_workbench != 0); + + m_core = m_workbench->core(); + Q_ASSERT(m_core != 0); + + QDesignerFormWindowManagerInterface *formWindowManager = m_core->formWindowManager(); + Q_ASSERT(formWindowManager != 0); + + QDesignerSettings settings; + m_fileActions = new QActionGroup(this); + m_fileActions->setExclusive(false); + + m_recentFilesActions = new QActionGroup(this); + m_recentFilesActions->setExclusive(false); + + m_editActions = new QActionGroup(this); + m_editActions->setExclusive(false); + + m_formActions = new QActionGroup(this); + m_formActions->setExclusive(false); + + m_windowActions = new QActionGroup(this); + m_windowActions->setExclusive(false); + + m_toolActions = new QActionGroup(this); + m_toolActions->setExclusive(true); + + m_helpActions = new QActionGroup(this); + m_helpActions->setExclusive(false); + + +// +// file actions +// + m_newFormAction = new QAction(tr("&New Form..."), this); + m_newFormAction->setShortcut(tr("CTRL+N")); + connect(m_newFormAction, SIGNAL(triggered()), this, SLOT(createForm())); + m_fileActions->addAction(m_newFormAction); + + m_openFormAction = new QAction(tr("&Open Form..."), this); + m_openFormAction->setShortcut(tr("CTRL+O")); + connect(m_openFormAction, SIGNAL(triggered()), this, SLOT(openForm())); + m_fileActions->addAction(m_openFormAction); + + QAction *act; + // Need to insert this into the QAction. + for (int i = 0; i < MaxRecentFiles; ++i) { + act = new QAction(this); + act->setVisible(false); + connect(act, SIGNAL(triggered()), this, SLOT(openRecentForm())); + m_recentFilesActions->addAction(act); + } + updateRecentFileActions(); + + act = new QAction(this); + act->setSeparator(true); + m_recentFilesActions->addAction(act); + + act = new QAction(tr("Clear &Menu"), this); + connect(act, SIGNAL(triggered()), this, SLOT(clearRecentFiles())); + m_recentFilesActions->addAction(act); + + QAction *sep = new QAction(this); + sep->setSeparator(true); + m_fileActions->addAction(sep); + + m_saveFormAction = new QAction(tr("&Save Form"), this); + m_saveFormAction->setShortcut(tr("CTRL+S")); + connect(m_saveFormAction, SIGNAL(triggered()), this, SLOT(saveForm())); + m_fileActions->addAction(m_saveFormAction); + + m_saveFormAsAction = new QAction(tr("Save Form &As..."), this); + connect(m_saveFormAsAction, SIGNAL(triggered()), this, SLOT(saveFormAs())); + m_fileActions->addAction(m_saveFormAsAction); + + m_saveFormAsTemplateAction = new QAction(tr("Save Form As &Template..."), this); + connect(m_saveFormAsTemplateAction, SIGNAL(triggered()), this, SLOT(saveFormAsTemplate())); + m_fileActions->addAction(m_saveFormAsTemplateAction); + + sep = new QAction(this); + sep->setSeparator(true); + m_fileActions->addAction(sep); + + m_closeFormAction = new QAction(tr("&Close Form"), this); + m_closeFormAction->setShortcut(tr("CTRL+W")); + connect(m_closeFormAction, SIGNAL(triggered()), this, SLOT(closeForm())); + m_fileActions->addAction(m_closeFormAction); + + sep = new QAction(this); + sep->setSeparator(true); + m_fileActions->addAction(sep); + + m_quitAction = new QAction(tr("&Quit"), this); + m_quitAction->setShortcut(tr("CTRL+Q")); + connect(m_quitAction, SIGNAL(triggered()), + this, SLOT(shutdown())); + m_fileActions->addAction(m_quitAction); + +// +// edit actions +// + m_undoAction = formWindowManager->actionUndo(); + m_undoAction->setShortcut(tr("CTRL+Z")); + m_editActions->addAction(m_undoAction); + + m_redoAction = formWindowManager->actionRedo(); + m_redoAction->setShortcut(tr("CTRL+SHIFT+Z")); + m_editActions->addAction(m_redoAction); + + sep = new QAction(this); + sep->setSeparator(true); + m_editActions->addAction(sep); + + m_cutAction = formWindowManager->actionCut(); + m_editActions->addAction(m_cutAction); + + m_copyAction = formWindowManager->actionCopy(); + m_editActions->addAction(m_copyAction); + + m_pasteAction = formWindowManager->actionPaste(); + m_editActions->addAction(m_pasteAction); + + m_deleteAction = formWindowManager->actionDelete(); + m_editActions->addAction(m_deleteAction); + + m_selectAllAction = formWindowManager->actionSelectAll(); + m_editActions->addAction(m_selectAllAction); + + sep = new QAction(this); + sep->setSeparator(true); + m_editActions->addAction(sep); + + m_sendToBackAction = formWindowManager->actionLower(); + m_editActions->addAction(m_sendToBackAction); + + m_bringToFrontAction = formWindowManager->actionRaise(); + m_editActions->addAction(m_bringToFrontAction); + +// +// edit mode actions +// + + m_editWidgetsAction = new QAction(tr("Edit Widgets"), this); + m_editWidgetsAction->setCheckable(true); + m_editWidgetsAction->setShortcut(tr("F3")); + m_editWidgetsAction->setIcon(QIcon(m_core->resourceLocation() + QLatin1String("/widgettool.png"))); + connect(formWindowManager, SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)), + this, SLOT(activeFormWindowChanged(QDesignerFormWindowInterface*))); + connect(m_editWidgetsAction, SIGNAL(triggered()), this, SLOT(editWidgetsSlot())); + m_toolActions->addAction(m_editWidgetsAction); + m_editWidgetsAction->setChecked(true); + m_editWidgetsAction->setEnabled(false); + QList builtinPlugins = QPluginLoader::staticInstances(); + builtinPlugins += m_core->pluginManager()->instances(); + foreach (QObject *plugin, builtinPlugins) { + if (QDesignerFormEditorPluginInterface *formEditorPlugin = qobject_cast(plugin)) { + m_toolActions->addAction(formEditorPlugin->action()); + formEditorPlugin->action()->setCheckable(true); + } + } + + m_uiMode = new QActionGroup(this); + m_uiMode->setExclusive(true); + + m_sdiAction = m_uiMode->addAction(tr("Multiple Top-Level Windows")); + m_sdiAction->setCheckable(true); + + m_dockedMdiAction = m_uiMode->addAction(tr("Docked Window")); + m_dockedMdiAction->setCheckable(true); + + switch (settings.uiMode()) { + default: Q_ASSERT(0); break; + + case QDesignerWorkbench::TopLevelMode: + m_sdiAction->setChecked(true); + break; + case QDesignerWorkbench::DockedMode: + m_dockedMdiAction->setChecked(true); + break; + } + + connect(m_uiMode, SIGNAL(triggered(QAction*)), this, SLOT(updateUIMode(QAction*))); + +// +// form actions +// + m_layoutHorizontallyAction = formWindowManager->actionHorizontalLayout(); + m_formActions->addAction(m_layoutHorizontallyAction); + + m_layoutVerticallyAction = formWindowManager->actionVerticalLayout(); + m_formActions->addAction(m_layoutVerticallyAction); + + m_layoutHorizontallyInSplitterAction = formWindowManager->actionSplitHorizontal(); + m_formActions->addAction(m_layoutHorizontallyInSplitterAction); + + m_layoutVerticallyInSplitterAction = formWindowManager->actionSplitVertical(); + m_formActions->addAction(m_layoutVerticallyInSplitterAction); + + m_layoutGridAction = formWindowManager->actionGridLayout(); + m_formActions->addAction(m_layoutGridAction); + + m_breakLayoutAction = formWindowManager->actionBreakLayout(); + m_formActions->addAction(m_breakLayoutAction); + + m_adjustSizeAction = formWindowManager->actionAdjustSize(); + m_formActions->addAction(m_adjustSizeAction); + + sep = new QAction(this); + sep->setSeparator(true); + + m_formActions->addAction(sep); + + m_previewFormAction = new QAction(tr("&Preview"), this); + m_previewFormAction->setShortcut(tr("CTRL+R")); + connect(m_previewFormAction, SIGNAL(triggered()), this, SLOT(previewFormLater())); + m_formActions->addAction(m_previewFormAction); + + m_styleActions = new QActionGroup(this); + m_styleActions->setExclusive(true); + connect(m_styleActions, SIGNAL(triggered(QAction*)), this, SLOT(previewForm(QAction*))); + + QAction *sep2 = new QAction(this); + sep2->setSeparator(true); + m_formActions->addAction(sep2); + + m_formSettings = new QAction(tr("Form &Settings..."), this); + m_formSettings->setEnabled(false); + connect(m_formSettings, SIGNAL(triggered()), this, SLOT(showFormSettings())); + m_formActions->addAction(m_formSettings); + + QStringList availableStyleList = QStyleFactory::keys(); + foreach (QString style, availableStyleList) { + QAction *a = new QAction(this); + a->setText(tr("%1 Style").arg(style)); + a->setObjectName(QLatin1String("__qt_action_style_") + style); + + m_styleActions->addAction(a); + } + +// +// window actions +// + m_minimizeAction = new QAction(tr("&Minimize"), this); + m_minimizeAction->setEnabled(false); + m_minimizeAction->setShortcut(tr("CTRL+M")); + connect(m_minimizeAction, SIGNAL(triggered()), this, SLOT(minimizeForm())); + m_windowActions->addAction(m_minimizeAction); + + sep = new QAction(this); + sep->setSeparator(true); + m_windowActions->addAction(sep); + + m_bringToFrontAction = new QAction(tr("Bring All to Front"), this); + connect(m_bringToFrontAction, SIGNAL(triggered()), this, SLOT(bringAllToFront())); + m_windowActions->addAction(m_bringToFrontAction); + +// +// Help actions +// + + m_mainHelpAction = new QAction(tr("Qt Designer &Help"), this); + connect(m_mainHelpAction, SIGNAL(triggered()), this, SLOT(showDesignerHelp())); + m_mainHelpAction->setShortcut(Qt::CTRL + Qt::Key_Question); + m_helpActions->addAction(m_mainHelpAction); + + sep = new QAction(this); + sep->setSeparator(true); + m_helpActions->addAction(sep); + + m_widgetHelp = new QAction(tr("Current Widget Help"), this); + m_widgetHelp->setShortcut(Qt::Key_F1); + connect(m_widgetHelp, SIGNAL(triggered()), this, SLOT(showWidgetSpecificHelp())); + m_helpActions->addAction(m_widgetHelp); + + sep = new QAction(this); + sep->setSeparator(true); + m_helpActions->addAction(sep); + + m_whatsNewAction = new QAction(tr("What's New in Qt Designer?"), this); + connect(m_whatsNewAction, SIGNAL(triggered()), this, SLOT(showWhatsNew())); + m_helpActions->addAction(m_whatsNewAction); + + // On Mac OS X, the about items are merged in so this separator is redundant. +#ifndef Q_WS_MAC + sep = new QAction(this); + sep->setSeparator(true); + m_helpActions->addAction(sep); + m_aboutPluginsAction = new QAction(tr("About Plugins"), this); +#else + m_aboutPluginsAction = new QAction(tr("Plugin Information"), this); +#endif + connect(m_aboutPluginsAction, SIGNAL(triggered()), this, SLOT(aboutPlugins())); + m_helpActions->addAction(m_aboutPluginsAction); + + m_aboutDesignerAction = new QAction(tr("About Qt Designer"), this); + connect(m_aboutDesignerAction, SIGNAL(triggered()), this, SLOT(aboutDesigner())); + m_helpActions->addAction(m_aboutDesignerAction); + + m_aboutQtAction = new QAction(tr("About Qt"), this); + connect(m_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + m_helpActions->addAction(m_aboutQtAction); +// +// connections +// + fixActionContext(); + activeFormWindowChanged(core()->formWindowManager()->activeFormWindow()); +} + +QDesignerActions::~QDesignerActions() +{ +} + +QActionGroup *QDesignerActions::toolActions() const +{ return m_toolActions; } + +QDesignerWorkbench *QDesignerActions::workbench() const +{ return m_workbench; } + +QDesignerFormEditorInterface *QDesignerActions::core() const +{ return m_core; } + +QActionGroup *QDesignerActions::fileActions() const +{ return m_fileActions; } + +QActionGroup *QDesignerActions::editActions() const +{ return m_editActions; } + +QActionGroup *QDesignerActions::formActions() const +{ return m_formActions; } + +QActionGroup *QDesignerActions::windowActions() const +{ return m_windowActions; } + +QActionGroup *QDesignerActions::helpActions() const +{ return m_helpActions; } + +QActionGroup *QDesignerActions::styleActions() const +{ return m_styleActions; } + +QAction *QDesignerActions::newFormAction() const +{ return m_newFormAction; } + +QAction *QDesignerActions::openFormAction() const +{ return m_openFormAction; } + +QAction *QDesignerActions::saveFormAction() const +{ return m_saveFormAction; } + +QAction *QDesignerActions::saveFormAsAction() const +{ return m_saveFormAsAction; } + +QAction *QDesignerActions::saveFormAsTemplateAction() const +{ return m_saveFormAsTemplateAction; } + +QAction *QDesignerActions::closeFormAction() const +{ return m_closeFormAction; } + +QAction *QDesignerActions::quitAction() const +{ return m_quitAction; } + +QAction *QDesignerActions::undoAction() const +{ return m_undoAction; } + +QAction *QDesignerActions::redoAction() const +{ return m_redoAction; } + +QAction *QDesignerActions::cutAction() const +{ return m_cutAction; } + +QAction *QDesignerActions::copyAction() const +{ return m_copyAction; } + +QAction *QDesignerActions::pasteAction() const +{ return m_pasteAction; } + +QAction *QDesignerActions::selectAllAction() const +{ return m_selectAllAction; } + +QAction *QDesignerActions::deleteAction() const +{ return m_deleteAction; } + +QAction *QDesignerActions::sendToBackAction() const +{ return m_sendToBackAction; } + +QAction *QDesignerActions::bringToFrontAction() const +{ return m_bringToFrontAction; } + +QAction *QDesignerActions::mainHelpAction() const +{ return m_mainHelpAction; } + +QAction *QDesignerActions::whatsNewAction() const +{ return m_whatsNewAction; } + +QAction *QDesignerActions::aboutQtAction() const +{ return m_aboutQtAction; } + +QAction *QDesignerActions::aboutDesignerAction() const +{ return m_aboutDesignerAction; } + +QAction *QDesignerActions::layoutHorizontallyAction() const +{ return m_layoutHorizontallyAction; } + +QAction *QDesignerActions::layoutVerticallyAction() const +{ return m_layoutVerticallyAction; } + +QAction *QDesignerActions::layoutHorizontallyInSplitterAction() const +{ return m_layoutHorizontallyInSplitterAction; } + +QAction *QDesignerActions::layoutVerticallyInSplitterAction() const +{ return m_layoutVerticallyInSplitterAction; } + +QAction *QDesignerActions::layoutGridAction() const +{ return m_layoutGridAction; } + +QAction *QDesignerActions::breakLayoutAction() const +{ return m_breakLayoutAction; } + +QAction *QDesignerActions::adjustSizeAction() const +{ return m_adjustSizeAction; } + +QAction *QDesignerActions::previewFormAction() const +{ return m_previewFormAction; } + +QAction *QDesignerActions::formSettings() const +{ return m_formSettings; } + +void QDesignerActions::editWidgetsSlot() +{ + QDesignerFormWindowManagerInterface *formWindowManager = core()->formWindowManager(); + for (int i=0; iformWindowCount(); ++i) { + QDesignerFormWindowInterface *formWindow = formWindowManager->formWindow(i); + formWindow->editWidgets(); + } +} + +void QDesignerActions::createForm() +{ + NewForm *dlg = new NewForm(workbench(), 0); + dlg->setAttribute(Qt::WA_DeleteOnClose); + dlg->setAttribute(Qt::WA_ShowModal); + dlg->show(); +} + +bool QDesignerActions::openForm() +{ + QString fileName = QFileDialog::getOpenFileName( + core()->topLevel(), + tr("Open Form"), m_openDirectory, + tr("Designer UI files (*.ui)"), 0, QFileDialog::DontUseSheet); + + if (!fileName.isEmpty()) { + return readInForm(fileName); + } + return false; +} + +bool QDesignerActions::saveFormAs(QDesignerFormWindowInterface *fw) +{ + QString fileName = fw->fileName().isEmpty() ? QDir::current().absolutePath() + + QLatin1String("/untitled.ui") : fw->fileName(); + QString saveFile = QFileDialog::getSaveFileName(fw, tr("Save form as"), + fileName, + tr("Designer UI files (*.ui)")); + if (saveFile.isEmpty()) + return false; + + if (QFileInfo(saveFile).suffix() != QLatin1String("ui")) + saveFile.append(QLatin1String(".ui")); + + fw->setFileName(saveFile); + return writeOutForm(fw, saveFile); +} + +void QDesignerActions::saveForm() +{ + if (QDesignerFormWindowInterface *fw = core()->formWindowManager()->activeFormWindow()) + saveForm(fw); +} + +bool QDesignerActions::saveForm(QDesignerFormWindowInterface *fw) +{ + bool ret; + if (fw->fileName().isEmpty()) + ret = saveFormAs(fw); + else + ret = writeOutForm(fw, fw->fileName()); + return ret; +} + +void QDesignerActions::closeForm() +{ + if (QDesignerFormWindowInterface *fw = core()->formWindowManager()->activeFormWindow()) + fw->parentWidget()->close(); +} + +void QDesignerActions::saveFormAs() +{ + if (QDesignerFormWindowInterface *fw = core()->formWindowManager()->activeFormWindow()) + saveFormAs(fw); +} + +void QDesignerActions::saveFormAsTemplate() +{ + if (QDesignerFormWindowInterface *fw = core()->formWindowManager()->activeFormWindow()) { + SaveFormAsTemplate dlg(fw, fw->window()); + dlg.exec(); + } +} + +void QDesignerActions::notImplementedYet() +{ + QMessageBox::information(core()->topLevel(), tr("Designer"), tr("Feature not implemented yet!")); +} + +void QDesignerActions::updateUIMode(QAction *act) +{ + QDesignerWorkbench::UIMode mode = QDesignerWorkbench::TopLevelMode; + if (act == m_dockedMdiAction) + mode = QDesignerWorkbench::DockedMode; + + QDesignerSettings settings; + settings.setUIMode(mode); + + m_workbench->setUIMode(QDesignerWorkbench::UIMode(settings.uiMode())); +} + +void QDesignerActions::previewFormLater(QAction *action) +{ + qRegisterMetaType("QAction*"); + QMetaObject::invokeMethod(this, "previewForm", Qt::QueuedConnection, + Q_ARG(QAction*, action)); +} + +void QDesignerActions::previewForm(QAction *action) +{ +//return; + + if (QDesignerFormWindowInterface *fw = core()->formWindowManager()->activeFormWindow()) { + qdesigner_internal::QDesignerFormBuilder builder(core(), qdesigner_internal::QDesignerFormBuilder::DisableScripts); + builder.setWorkingDirectory(fw->absoluteDir()); + + QByteArray bytes = fw->contents().toUtf8(); + QBuffer buffer(&bytes); + + QWidget *widget = builder.load(&buffer, 0); + Q_ASSERT(widget); + + + widget->setParent(fw->window(), Qt::Dialog); + widget->setWindowModality(Qt::ApplicationModal); + widget->setAttribute(Qt::WA_DeleteOnClose, true); + widget->move(fw->mapToGlobal(QPoint(0, 0)) + QPoint(10, 10)); + + QStyle *style = 0; + + if (action != 0 && action->objectName().startsWith(QLatin1String("__qt_action_style_"))) { + QString styleName = action->objectName().mid(QString::fromUtf8("__qt_action_style_").count()); + style = QStyleFactory::create(styleName); + + if (style != 0) { + style->setParent(widget); + widget->setStyle(style); + widget->setPalette(style->standardPalette()); + QList lst = qFindChildren(widget); + foreach (QWidget *w, lst) { + if (w->windowType() == Qt::Popup) + w->setPalette(style->standardPalette()); + w->setStyle(style); + } + } + } + + widget->setWindowTitle(tr("%1 - [Preview]").arg(widget->windowTitle())); + + widget->show(); + } +} + +void QDesignerActions::fixActionContext() +{ + QList actions; + actions += m_fileActions->actions(); + actions += m_editActions->actions(); + actions += m_toolActions->actions(); + actions += m_formActions->actions(); + actions += m_windowActions->actions(); + actions += m_helpActions->actions(); + + foreach (QAction *a, actions) { + a->setShortcutContext(Qt::ApplicationShortcut); + } +} + +bool QDesignerActions::readInForm(const QString &fileName) +{ + // First make sure that we don't have this one open already. + QDesignerFormWindowManagerInterface *formWindowManager = core()->formWindowManager(); + int totalWindows = formWindowManager->formWindowCount(); + for (int i = 0; i < totalWindows; ++i) { + QDesignerFormWindowInterface *w = formWindowManager->formWindow(i); + if (w->fileName() == fileName) { + w->raise(); + formWindowManager->setActiveFormWindow(w); + addRecentFile(fileName); + return true; + } + } + + // Otherwise load it. + QFile f(fileName); + if (!f.open(QFile::ReadOnly)) { + QMessageBox::warning(core()->topLevel(), tr("Read Error"), tr("Couldn't open file: %1\nReason: %2") + .arg(f.fileName()).arg(f.errorString())); + return false; + } + + m_openDirectory = QFileInfo(f).absolutePath(); + + QDesignerFormWindow *formWindow = workbench()->createFormWindow(); + if (QDesignerFormWindowInterface *editor = formWindow->editor()) { + editor->setFileName(fileName); + editor->setContents(&f); + Q_ASSERT(editor->mainContainer() != 0); + formWindow->updateWindowTitle(fileName); + formWindow->resize(editor->mainContainer()->size()); + formWindowManager->setActiveFormWindow(editor); + } + formWindow->show(); + addRecentFile(fileName); + formWindow->editor()->setDirty(false); + return true; +} + +bool QDesignerActions::writeOutForm(QDesignerFormWindowInterface *fw, const QString &saveFile) +{ + Q_ASSERT(fw && !saveFile.isEmpty()); + QFile f(saveFile); + while (!f.open(QFile::WriteOnly)) { + QMessageBox box(tr("Save Form?"), + tr("Could not open file: %1" + "\nReason: %2" + "\nWould you like to retry or change your file?") + .arg(f.fileName()).arg(f.errorString()), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape, fw, Qt::Sheet); + box.setButtonText(QMessageBox::Yes, tr("Retry")); + box.setButtonText(QMessageBox::No, tr("Select New File")); + switch(box.exec()) { + case QMessageBox::Yes: + break; + case QMessageBox::No: { + QString fileName = QFileDialog::getSaveFileName(fw, tr("Save form as"), + QDir::current().absolutePath(), QLatin1String("*.ui")); + if (fileName.isEmpty()) + return false; + f.setFileName(fileName); + fw->setFileName(fileName); + break; } + case QMessageBox::Cancel: + return false; + } + } + QByteArray utf8Array = fw->contents().toUtf8(); + while (f.write(utf8Array, utf8Array.size()) != utf8Array.size()) { + QMessageBox box(tr("Save Form?"), + tr("Could not write file: %1\nReason:%2\nWould you like to retry?") + .arg(f.fileName()).arg(f.errorString()), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, 0, + fw, Qt::Sheet); + box.setButtonText(QMessageBox::Yes, tr("Retry")); + box.setButtonText(QMessageBox::No, tr("Don't Retry")); + switch(box.exec()) { + case QMessageBox::Yes: + f.resize(0); + break; + case QMessageBox::No: + return false; + } + } + addRecentFile(saveFile); + fw->setDirty(false); + fw->parentWidget()->setWindowModified(false); + return true; +} + +void QDesignerActions::shutdown() +{ + + // Follow the idea from the Mac, i.e. send the Application a close event + // and if it's accepted, quit. + /*QCloseEvent ev; + QApplication::sendEvent(qDesigner, &ev); + if (ev.isAccepted()) + qDesigner->quit();*/ +} + +void QDesignerActions::activeFormWindowChanged(QDesignerFormWindowInterface *formWindow) +{ + bool enable = formWindow != 0; + + m_saveFormAction->setEnabled(enable); + m_saveFormAsAction->setEnabled(enable); + m_saveFormAsTemplateAction->setEnabled(enable); + m_closeFormAction->setEnabled(enable); + + m_editWidgetsAction->setEnabled(enable); + m_formSettings->setEnabled(enable); + + m_previewFormAction->setEnabled(enable); + m_styleActions->setEnabled(enable); +} + +void QDesignerActions::updateRecentFileActions() +{ + QDesignerSettings settings; + QStringList files = settings.recentFilesList(); + int originalSize = files.size(); + int numRecentFiles = qMin(files.size(), int(MaxRecentFiles)); + QList recentFilesActs = m_recentFilesActions->actions(); + + for (int i = 0; i < numRecentFiles; ++i) { + QFileInfo fi(files[i]); + // If the file doesn't exist anymore, just remove it from the list so + // people don't get confused. + if (!fi.exists()) { + files.removeAt(i); + --i; + numRecentFiles = qMin(files.size(), int(MaxRecentFiles)); + continue; + } + QString text = fi.fileName(); + recentFilesActs[i]->setText(text); + recentFilesActs[i]->setIconText(files[i]); + recentFilesActs[i]->setVisible(true); + } + + for (int j = numRecentFiles; j < MaxRecentFiles; ++j) + recentFilesActs[j]->setVisible(false); + + // If there's been a change, right it back + if (originalSize != files.size()) + settings.setRecentFilesList(files); +} + +void QDesignerActions::openRecentForm() +{ + if (QAction *action = qobject_cast(sender())) { + if (!readInForm(action->iconText())) + updateRecentFileActions(); // File doesn't exist, remove it from settings + } +} + +void QDesignerActions::clearRecentFiles() +{ + QDesignerSettings settings; + settings.setRecentFilesList(QStringList()); + updateRecentFileActions(); +} + +QActionGroup *QDesignerActions::recentFilesActions() const +{ + return m_recentFilesActions; +} + +void QDesignerActions::addRecentFile(const QString &fileName) +{ + QDesignerSettings settings; + QStringList files = settings.recentFilesList(); + files.removeAll(fileName); + files.prepend(fileName); + while (files.size() > MaxRecentFiles) + files.removeLast(); + + settings.setRecentFilesList(files); + updateRecentFileActions(); +} + +void QDesignerActions::minimizeForm() +{ + if (QDesignerFormWindowInterface *fw = core()->formWindowManager()->activeFormWindow()) { + if (m_workbench->mode() == QDesignerWorkbench::DockedMode) { + // Yuck, I need to get to the QWorkspaceChild::showShaded(), but there is no way + // to do that legally, so I use the QMetaObject as my guide. + QMetaObject::invokeMethod(fw->parentWidget()->parentWidget(), "showShaded"); + } else { + fw->parentWidget()->showMinimized(); + } + } +} + +void QDesignerActions::bringAllToFront() +{ + int i; + for (i = 0; i < m_workbench->formWindowCount(); ++i) + m_workbench->formWindow(i)->raise(); + + for (i = 0; i < m_workbench->toolWindowCount(); ++i) + m_workbench->toolWindow(i)->raise(); +} + +QAction *QDesignerActions::minimizeAction() const +{ + return m_minimizeAction; +} + +QAction *QDesignerActions::bringAllToFront() const +{ + return m_bringToFrontAction; +} + +void QDesignerActions::showDesignerHelp() +{ + showHelp(QLatin1String("designer-manual.html")); +} + +void QDesignerActions::showWhatsNew() +{ + showHelp(QLatin1String("qt4-designer.html")); +} + +void QDesignerActions::showHelp(const QString &url) +{ + /*if (!m_assistantClient) + m_assistantClient + = new QAssistantClient(QLibraryInfo::location(QLibraryInfo::BinariesPath), this); + + QString filePath = QLibraryInfo::location(QLibraryInfo::DocumentationPath) + + QLatin1String("/html/") + url; + + QString cleanFilePath; + int index = filePath.lastIndexOf(QLatin1Char('#')); + if (index != -1) + cleanFilePath = filePath.left(index); + else + cleanFilePath = filePath; + + if (!QFile::exists(cleanFilePath)) { + filePath = QLibraryInfo::location(QLibraryInfo::DocumentationPath) + + QLatin1String("/html/designer-manual.html"); + } + + m_assistantClient->showPage(filePath);*/ +} + +void QDesignerActions::aboutDesigner() +{ + /*VersionDialog mb(core()->topLevel()); + mb.setWindowTitle(tr("About Qt Designer")); + if (mb.exec()) { + OublietteView *oubliette = new OublietteView; + oubliette->setAttribute(Qt::WA_DeleteOnClose); + oubliette->setMinimumSize(800, 600); + oubliette->show(); + }*/ +} + +QActionGroup *QDesignerActions::uiMode() const +{ + return m_uiMode; +} + + +QAction *QDesignerActions::editWidgets() const +{ + return m_editWidgetsAction; +} + +void QDesignerActions::showWidgetSpecificHelp() +{ + QDesignerFormWindowInterface *fw = core()->formWindowManager()->activeFormWindow(); + if (!fw) { + showDesignerHelp(); + return; + } + + QString className; + QString currentPropertyName; + + currentPropertyName = core()->propertyEditor()->currentPropertyName(); + if (!currentPropertyName.isEmpty()) { + QDesignerPropertySheetExtension *ps + = qt_extension(core()->extensionManager(), + core()->propertyEditor()->object()); + if (!ps) + ps = qt_extension(core()->extensionManager(), + fw->cursor()->selectedWidget(0)); + Q_ASSERT(ps); + className = ps->propertyGroup(ps->indexOf(currentPropertyName)); + } else { + QDesignerWidgetDataBaseInterface *db = core()->widgetDataBase(); + QDesignerWidgetDataBaseItemInterface *dbi = db->item(db->indexOfObject(fw->cursor()->selectedWidget(0), true)); + className = dbi->name(); + } + + // ### generalize using the Widget Data Base + if (className == QLatin1String("Line")) + className = QLatin1String("QFrame"); + else if (className == QLatin1String("Spacer")) + className = QLatin1String("QSpacerItem"); + else if (className == QLatin1String("QLayoutWidget")) + className = QLatin1String("QLayout"); + + QString url = className.toLower(); + + // special case + url += QLatin1String(".html"); + + if (!currentPropertyName.isEmpty()) + url += QLatin1Char('#') + currentPropertyName; + + showHelp(url); +} + +QAction *QDesignerActions::widgetHelpAction() const +{ + return m_widgetHelp; +} + +void QDesignerActions::aboutPlugins() +{ + PluginDialog dlg(core(), core()->topLevel()); + dlg.exec(); +} + +void QDesignerActions::showFormSettings() +{ + QDesignerFormWindowInterface *formWindow = core()->formWindowManager()->activeFormWindow(); + QDesignerFormWindow *window = m_workbench->findFormWindow(formWindow); + FormWindowSettings dlg(formWindow); + if (dlg.exec() && window) { + formWindow->setDirty(true); + window->updateChanged(); + } +} diff --git a/src/designer/formdesigner/qdesigner_actions.h b/src/designer/formdesigner/qdesigner_actions.h new file mode 100644 index 0000000..9cbdcee --- /dev/null +++ b/src/designer/formdesigner/qdesigner_actions.h @@ -0,0 +1,223 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_ACTIONS_H +#define QDESIGNER_ACTIONS_H + +#include +#include +#include + +class QDesignerMainWindow; +class QDesignerWorkbench; + +class QAction; +class QActionGroup; +class QDesignerFormEditorInterface; +class QDesignerFormWindowInterface; +class QAssistantClient; + +class QDesignerActions: public QObject +{ + Q_OBJECT +public: + QDesignerActions(QDesignerWorkbench *mainWindow); + virtual ~QDesignerActions(); + + QDesignerWorkbench *workbench() const; + QDesignerFormEditorInterface *core() const; + + bool saveForm(QDesignerFormWindowInterface *fw); + bool readInForm(const QString &fileName); + bool writeOutForm(QDesignerFormWindowInterface *formWindow, const QString &fileName); + + QActionGroup *fileActions() const; + QActionGroup *recentFilesActions() const; + QActionGroup *editActions() const; + QActionGroup *formActions() const; + QActionGroup *windowActions() const; + QActionGroup *toolActions() const; + QActionGroup *helpActions() const; + QActionGroup *uiMode() const; + QActionGroup *styleActions() const; + +// +// file actions +// + QAction *newFormAction() const; + QAction *openFormAction() const; + QAction *saveFormAction() const; + QAction *saveFormAsAction() const; + QAction *saveFormAsTemplateAction() const; + QAction *closeFormAction() const; + QAction *quitAction() const; + +// +// edit actions +// + QAction *undoAction() const; + QAction *redoAction() const; + QAction *cutAction() const; + QAction *copyAction() const; + QAction *pasteAction() const; + QAction *deleteAction() const; + QAction *selectAllAction() const; + QAction *sendToBackAction() const; + QAction *bringToFrontAction() const; + +// +// edit mode actions +// + QAction *editWidgets() const; + QAction *editConnections() const; + QAction *editTabOrders() const; + QAction *editBuddies() const; + +// +// form actions +// + QAction *layoutHorizontallyAction() const; + QAction *layoutVerticallyAction() const; + QAction *layoutHorizontallyInSplitterAction() const; + QAction *layoutVerticallyInSplitterAction() const; + QAction *layoutGridAction() const; + QAction *breakLayoutAction() const; + QAction *adjustSizeAction() const; + QAction *previewFormAction() const; + QAction *formSettings() const; + +// +// window actions +// + QAction *minimizeAction() const; + QAction *bringAllToFront() const; + +// +// help actions +// + QAction *mainHelpAction() const; + QAction *widgetHelpAction() const; + QAction *whatsNewAction() const; + QAction *aboutQtAction() const; + QAction *aboutDesignerAction() const; + +public slots: + void activeFormWindowChanged(QDesignerFormWindowInterface *formWindow); + void createForm(); + bool openForm(); + +signals: + void useBigIcons(bool); + +private slots: + void saveForm(); + void saveFormAs(); + void saveFormAsTemplate(); + void previewForm(QAction *action = 0); + void previewFormLater(QAction *action = 0); + void notImplementedYet(); + void shutdown(); + void editWidgetsSlot(); + void openRecentForm(); + void clearRecentFiles(); + void closeForm(); + void minimizeForm(); + void bringAllToFront(); + void showDesignerHelp(); + void showWhatsNew(); + void aboutPlugins(); + void aboutDesigner(); + void updateUIMode(QAction *act); + void showWidgetSpecificHelp(); + void showFormSettings(); + +private: + bool saveFormAs(QDesignerFormWindowInterface *fw); + void fixActionContext(); + void updateRecentFileActions(); + void addRecentFile(const QString &fileName); + void showHelp(const QString &help); + +private: + enum { MaxRecentFiles = 10 }; + QDesignerWorkbench *m_workbench; + QDesignerFormEditorInterface *m_core; + QAssistantClient *m_assistantClient; + QString m_openDirectory; + + QActionGroup *m_fileActions; + QActionGroup *m_recentFilesActions; + QActionGroup *m_editActions; + QActionGroup *m_formActions; + QActionGroup *m_windowActions; + QActionGroup *m_toolActions; + QActionGroup *m_helpActions; + QActionGroup *m_uiMode; + QActionGroup *m_styleActions; + + QAction *m_editWidgetsAction; + + QAction *m_newFormAction; + QAction *m_openFormAction; + QAction *m_saveFormAction; + QAction *m_saveFormAsAction; + QAction *m_saveFormAsTemplateAction; + QAction *m_closeFormAction; + + QAction *m_quitAction; + QAction *m_undoAction; + QAction *m_redoAction; + QAction *m_cutAction; + QAction *m_copyAction; + QAction *m_pasteAction; + QAction *m_deleteAction; + QAction *m_sendToBackAction; + QAction *m_bringToFrontAction; + QAction *m_selectAllAction; + + + QAction *m_layoutHorizontallyAction; + QAction *m_layoutVerticallyAction; + QAction *m_layoutHorizontallyInSplitterAction; + QAction *m_layoutVerticallyInSplitterAction; + QAction *m_layoutGridAction; + QAction *m_breakLayoutAction; + QAction *m_adjustSizeAction; + QAction *m_previewFormAction; + QAction *m_formSettings; + + QAction *m_minimizeAction; + QAction *m_bringAllToFrontAction; + + QAction *m_mainHelpAction; + QAction *m_widgetHelp; + QAction *m_whatsNewAction; + QAction *m_aboutQtAction; + QAction *m_aboutPluginsAction; + QAction *m_aboutDesignerAction; + QAction *m_sdiAction; + QAction *m_dockedMdiAction; +}; + +#endif // QDESIGNER_ACTIONS_H + diff --git a/src/designer/formdesigner/qdesigner_formwindow.cpp b/src/designer/formdesigner/qdesigner_formwindow.cpp new file mode 100644 index 0000000..0081f49 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_formwindow.cpp @@ -0,0 +1,180 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include "qdesigner_actions.h" +#include "qdesigner_formwindow.h" +#include "qdesigner_workbench.h" +#include "qdesigner_settings.h" + +// sdk +#include + +// shared +#include "private/qtundo_p.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +QDesignerFormWindow::QDesignerFormWindow(QDesignerFormWindowInterface *editor, QDesignerWorkbench *workbench, QWidget *parent, Qt::WindowFlags flags) + : QMainWindow(parent, flags), + m_editor(editor), + m_workbench(workbench) +{ + Q_ASSERT(workbench); + + if (m_editor) { + m_editor->setParent(this); + } else { + m_editor = workbench->core()->formWindowManager()->createFormWindow(this); + } + + setCentralWidget(m_editor); + + m_action = new QAction(this); + m_action->setCheckable(true); + + connect((QObject*)m_editor->commandHistory(), SIGNAL(commandExecuted()), this, SLOT(updateChanged())); + connect(m_editor, SIGNAL(fileNameChanged(QString)), this, SLOT(updateWindowTitle(QString))); +} + +QDesignerFormWindow::~QDesignerFormWindow() +{ + if (workbench()) + workbench()->removeFormWindow(this); +} + +QAction *QDesignerFormWindow::action() const +{ + return m_action; +} + +void QDesignerFormWindow::changeEvent(QEvent *e) +{ + switch (e->type()) { + case QEvent::ActivationChange: { + if (isActiveWindow()) { + m_action->setChecked(true); + // ### raise(); + } + } break; + case QEvent::WindowTitleChange: + m_action->setText(windowTitle().replace(QLatin1String("[*]"), "")); + break; + case QEvent::WindowIconChange: + m_action->setIcon(windowIcon()); + break; + default: + break; + } + QMainWindow::changeEvent(e); +} + +QRect QDesignerFormWindow::geometryHint() const +{ + return QRect(0, 0, 400, 300); +} + +QDesignerFormWindowInterface *QDesignerFormWindow::editor() const +{ + return m_editor; +} + +QDesignerWorkbench *QDesignerFormWindow::workbench() const +{ + return m_workbench; +} + +void QDesignerFormWindow::updateWindowTitle(const QString &fileName) +{ + QString fn = fileName; + + if (fn.isEmpty()) { + // Try to preserve its "untitled" number. + QRegExp rx(QLatin1String("unnamed( (\\d+))?")); + + if (rx.indexIn(windowTitle()) != -1) { + fn = rx.cap(0); + } else { + fn = QLatin1String("untitled"); + } + } + + if (QWidget *mc = m_editor->mainContainer()) { + setWindowIcon(mc->windowIcon()); + setWindowTitle(tr("%1 - %2[*]").arg(mc->windowTitle()).arg(fn)); + } else { + setWindowTitle(fn); + } +} + +void QDesignerFormWindow::closeEvent(QCloseEvent *ev) +{ + if (m_editor->isDirty()) { +// Сохраняем автоматически + bool ok = workbench()->saveForm(m_editor); + ev->setAccepted(ok); + m_editor->setDirty(!ok); + +/* raise(); + QMessageBox box(tr("Save Form?"), + tr("Do you want to save the changes you made to \"%1\" before closing?") + .arg(m_editor->fileName().isEmpty() ? action()->text() : m_editor->fileName()), + QMessageBox::Information, + QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape, m_editor, Qt::Sheet); + box.setButtonText(QMessageBox::Yes, m_editor->fileName().isEmpty() ? tr("Save...") : tr("Save")); + box.setButtonText(QMessageBox::No, tr("Don't Save")); + switch (box.exec()) { + case QMessageBox::Yes: { + bool ok = workbench()->saveForm(m_editor); + ev->setAccepted(ok); + m_editor->setDirty(!ok); + break; + } + case QMessageBox::No: + m_editor->setDirty(false); // Not really necessary, but stops problems if we get close again. + ev->accept(); + break; + case QMessageBox::Cancel: + ev->ignore(); + break; + }*/ + } + + if (m_workbench->core()->formWindowManager()->formWindowCount() == 1 && ev->isAccepted() + && QDesignerSettings().showNewFormOnStartup()) + QTimer::singleShot(200, m_workbench->actionManager(), SLOT(createForm())); // Use timer in case we are quitting. +} + +void QDesignerFormWindow::updateChanged() +{ + setWindowModified(m_editor->isDirty()); + updateWindowTitle(m_editor->fileName()); +} diff --git a/src/designer/formdesigner/qdesigner_formwindow.h b/src/designer/formdesigner/qdesigner_formwindow.h new file mode 100644 index 0000000..61e7af2 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_formwindow.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_FORMWINDOW_H +#define QDESIGNER_FORMWINDOW_H + +#include +#include + +class QDesignerWorkbench; +class QDesignerFormWindowInterface; + +class QDesignerFormWindow: public QMainWindow +{ + Q_OBJECT +public: + QDesignerFormWindow(QDesignerFormWindowInterface *formWindow, QDesignerWorkbench *workbench, + QWidget *parent = 0, Qt::WindowFlags flags = 0); + + virtual ~QDesignerFormWindow(); + + QAction *action() const; + QDesignerWorkbench *workbench() const; + QDesignerFormWindowInterface *editor() const; + + virtual QRect geometryHint() const; + +public slots: + void updateWindowTitle(const QString &fileName); + void updateChanged(); + +protected: + virtual void changeEvent(QEvent *e); + virtual void closeEvent(QCloseEvent *ev); + +private: + QDesignerFormWindowInterface *m_editor; + QPointer m_workbench; + QAction *m_action; +}; + +#endif // QDESIGNER_FORMWINDOW_H diff --git a/src/designer/formdesigner/qdesigner_objectinspector.cpp b/src/designer/formdesigner/qdesigner_objectinspector.cpp new file mode 100644 index 0000000..0a6fa88 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_objectinspector.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_objectinspector.h" +#include "qdesigner_workbench.h" + +#include +#include + +QDesignerObjectInspector::QDesignerObjectInspector(QDesignerWorkbench *workbench) + : QDesignerToolWindow(workbench) +{ + setObjectName(QLatin1String("ObjectInspector")); + QDesignerObjectInspectorInterface *widget = QDesignerComponents::createObjectInspector(workbench->core(), this); + workbench->core()->setObjectInspector(widget); + + setCentralWidget(widget); + + setWindowTitle(tr("Object Inspector")); +} + +QDesignerObjectInspector::~QDesignerObjectInspector() +{ +} + +QRect QDesignerObjectInspector::geometryHint() const +{ + QRect g = workbench()->availableGeometry(); + int margin = workbench()->marginHint(); + + QSize sz(g.width() * 1/4, g.height() * 1/6); + + return QRect((g.width() - sz.width() - margin), margin, + sz.width(), sz.height()); +} diff --git a/src/designer/formdesigner/qdesigner_objectinspector.h b/src/designer/formdesigner/qdesigner_objectinspector.h new file mode 100644 index 0000000..f6f50e8 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_objectinspector.h @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_OBJECTINSPECTOR_H +#define QDESIGNER_OBJECTINSPECTOR_H + +#include "qdesigner_toolwindow.h" + +class QDesignerWorkbench; + +class QDesignerObjectInspector: public QDesignerToolWindow +{ + Q_OBJECT +public: + QDesignerObjectInspector(QDesignerWorkbench *workbench); + virtual ~QDesignerObjectInspector(); + + virtual QRect geometryHint() const; +}; + +#endif // QDESIGNER_OBJECTINSPECTOR_H diff --git a/src/designer/formdesigner/qdesigner_pch.h b/src/designer/formdesigner/qdesigner_pch.h new file mode 100644 index 0000000..397a997 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_pch.h @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#if defined __cplusplus +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdesigner.h" +#include "qdesigner_formwindow.h" +#include "qdesigner_settings.h" +#include "qdesigner_toolwindow.h" +#include "qdesigner_workbench.h" +#endif diff --git a/src/designer/formdesigner/qdesigner_propertyeditor.cpp b/src/designer/formdesigner/qdesigner_propertyeditor.cpp new file mode 100644 index 0000000..dbb4cef --- /dev/null +++ b/src/designer/formdesigner/qdesigner_propertyeditor.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_propertyeditor.h" +#include "qdesigner_workbench.h" + +#include + +#include +#include + +QDesignerPropertyEditor::QDesignerPropertyEditor(QDesignerWorkbench *workbench) + : QDesignerToolWindow(workbench) +{ + setObjectName(QLatin1String("PropertyEditor")); + QDesignerPropertyEditorInterface *widget = QDesignerComponents::createPropertyEditor(workbench->core(), this); + workbench->core()->setPropertyEditor(widget); + + setCentralWidget(widget); + + setWindowTitle(tr("Property Editor")); + action()->setShortcut(tr("Ctrl+I")); +} + +QDesignerPropertyEditor::~QDesignerPropertyEditor() +{ +} + +QRect QDesignerPropertyEditor::geometryHint() const +{ + QRect g = workbench()->availableGeometry(); + int margin = workbench()->marginHint(); + int spacing = 40; + + QSize sz(g.width() * 1/4, g.height() * 4/6); + + return QRect((g.width() - sz.width() - margin), (margin + g.height() * 1/6) + spacing, + sz.width(), sz.height()); +} + +void QDesignerPropertyEditor::showEvent(QShowEvent *event) +{ + if (QDesignerPropertyEditorInterface *e = workbench()->core()->propertyEditor()) { + // workaround to update the propertyeditor when it is not visible! + e->setObject(e->object()); // ### remove me + } + + QDesignerToolWindow::showEvent(event); +} + diff --git a/src/designer/formdesigner/qdesigner_propertyeditor.h b/src/designer/formdesigner/qdesigner_propertyeditor.h new file mode 100644 index 0000000..2629ff9 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_propertyeditor.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_PROPERTYEDITOR_H +#define QDESIGNER_PROPERTYEDITOR_H + +#include "qdesigner_toolwindow.h" + +class QDesignerWorkbench; + +class QDesignerPropertyEditor: public QDesignerToolWindow +{ + Q_OBJECT +public: + QDesignerPropertyEditor(QDesignerWorkbench *workbench); + virtual ~QDesignerPropertyEditor(); + + virtual QRect geometryHint() const; + +protected: + virtual void showEvent(QShowEvent *event); +}; + +#endif // QDESIGNER_PROPERTYEDITOR_H diff --git a/src/designer/formdesigner/qdesigner_resourceeditor.cpp b/src/designer/formdesigner/qdesigner_resourceeditor.cpp new file mode 100644 index 0000000..770e59d --- /dev/null +++ b/src/designer/formdesigner/qdesigner_resourceeditor.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_workbench.h" +#include "qdesigner_resourceeditor.h" +#include "qdesigner_settings.h" + +#include +#include + +#include + + +QDesignerResourceEditor::QDesignerResourceEditor(QDesignerWorkbench *workbench) + : QDesignerToolWindow(workbench) +{ + setObjectName(QLatin1String("ResourceEditor")); + QWidget *widget = QDesignerComponents::createResourceEditor(workbench->core(), this); + + setCentralWidget(widget); + + setWindowTitle(tr("Resource Editor")); +} + +QDesignerResourceEditor::~QDesignerResourceEditor() +{ +} + +QRect QDesignerResourceEditor::geometryHint() const +{ + QRect g = workbench()->availableGeometry(); + int margin = workbench()->marginHint(); + + QSize sz(g.width() * 1/3, g.height() * 1/6); + QRect r(QPoint(0, 0), sz); + r.moveCenter(g.center()); + r.moveBottom(g.bottom() - margin); + + return r; +} + diff --git a/src/designer/formdesigner/qdesigner_resourceeditor.h b/src/designer/formdesigner/qdesigner_resourceeditor.h new file mode 100644 index 0000000..03b9dce --- /dev/null +++ b/src/designer/formdesigner/qdesigner_resourceeditor.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_RESOURCEEDITOR_H +#define QDESIGNER_RESOURCEEDITOR_H + +#include "qdesigner_toolwindow.h" + +class QDesignerWorkbench; +class QDesignerAbstractFormWindowInterface; + +class QDesignerResourceEditor: public QDesignerToolWindow +{ + Q_OBJECT +public: + QDesignerResourceEditor(QDesignerWorkbench *workbench); + virtual ~QDesignerResourceEditor(); + + virtual QRect geometryHint() const; +}; + +#endif // QDESIGNER_RESOURCEEDITOR_H diff --git a/src/designer/formdesigner/qdesigner_settings.cpp b/src/designer/formdesigner/qdesigner_settings.cpp new file mode 100644 index 0000000..643766b --- /dev/null +++ b/src/designer/formdesigner/qdesigner_settings.cpp @@ -0,0 +1,202 @@ +/**************************************************************************** +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_settings.h" +#include "qdesigner_widgetbox.h" +#include "qdesigner_workbench.h" +#include "qdesigner_propertyeditor.h" +#include "qdesigner_objectinspector.h" + +#include +#include + +#include +#include +#include + +#include + +QDesignerSettings::QDesignerSettings() + : QSettings() +{ + m_designerPath = QLatin1String("/.designer"); + + QStringList paths = defaultFormTemplatePaths(); + foreach (QString path, paths) { + if (!QDir::current().exists(path)) + QDir::current().mkpath(path); + } +} + +QDesignerSettings::~QDesignerSettings() +{ +} + +QStringList QDesignerSettings::formTemplatePaths() const +{ + return value(QLatin1String("FormTemplatePaths"), + defaultFormTemplatePaths()).toStringList(); +} + +void QDesignerSettings::setFormTemplatePaths(const QStringList &paths) +{ + setValue(QLatin1String("FormTemplatePaths"), paths); +} + +QString QDesignerSettings::defaultUserWidgetBoxXml() const +{ + return QDir::homePath() + m_designerPath + QLatin1String("/widgetbox.xml"); +} + +QStringList QDesignerSettings::defaultFormTemplatePaths() const +{ + QStringList paths; + + QString templatePath = QLatin1String("/templates"); + + paths.append(QDir::homePath() + m_designerPath + templatePath); + paths.append(QApplication::applicationDirPath() + templatePath); + + return paths; +} + +void QDesignerSettings::saveGeometryFor(const QWidget *w) +{ + Q_ASSERT(w && !w->objectName().isEmpty()); + saveGeometryHelper(w, w->objectName()); +} + +void QDesignerSettings::setGeometryFor(QWidget *w, const QRect &fallBack) const +{ + Q_ASSERT(w && !w->objectName().isEmpty()); + setGeometryHelper(w, w->objectName(), + fallBack.isNull() ? QRect(QPoint(0, 0), w->sizeHint()) : fallBack); +} + +void QDesignerSettings::saveGeometryHelper(const QWidget *w, const QString &key) +{ + beginGroup(key); + QPoint pos = w->pos(); + if (!w->isWindow()) // in workspace + pos = w->parentWidget()->pos(); + + setValue(QLatin1String("screen"), QApplication::desktop()->screenNumber(w)); + setValue(QLatin1String("geometry"), QRect(pos, w->size())); + setValue(QLatin1String("visible"), w->isVisible()); + setValue(QLatin1String("maximized"), w->isMaximized()); + endGroup(); +} + +void QDesignerSettings::setGeometryHelper(QWidget *w, const QString &key, + const QRect &fallBack) const +{ +// beginGroup(); + int screen = value(key + QLatin1String("/screen"), 0).toInt(); + QRect g = value(key + QLatin1String("/geometry"), fallBack).toRect(); + QRect screenRect = QApplication::desktop()->availableGeometry(screen); + + // Do geometry in a couple of steps + // 1) Make sure the rect is within the specified geometry + // 2) Make sure the bottom right and top left fit on the screen, move them in. + // 3) Check again and resize. + + if (w->isWindow() && g.intersect(screenRect).isEmpty()) + g = fallBack; + + // Maybe use center? + if (!screenRect.contains(g.bottomRight())) { + g.moveRight(qMax(0 + g.width(), qMin(screenRect.right(), g.right()))); + g.moveBottom(qMax(0 + g.height(), qMin(screenRect.bottom(), g.bottom()))); + } + + if (!screenRect.contains(g.topLeft())) { + g.moveLeft(qMin(screenRect.right() - g.width(), qMax(screenRect.left(), g.left()))); + g.moveTop(qMin(screenRect.bottom() - g.height(), qMax(screenRect.top(), g.top()))); + } + + if (!screenRect.contains(g.bottomRight())) { + g.setRight(qMin(screenRect.right(), g.right())); + g.moveBottom(qMin(screenRect.bottom(), g.bottom())); + } + + if (!screenRect.contains(g.topLeft())) { + g.setLeft(qMax(0, qMin(screenRect.left(), g.left()))); + g.moveTop(qMax(0, qMin(screenRect.top(), g.top()))); + } + + + if (!w->isWindow()) // in workspace + w->parentWidget()->move(g.topLeft()); + else + w->move(g.topLeft()); + + if (value(key + QLatin1String("/maximized"), false).toBool()) { + w->setWindowState(w->windowState() | Qt::WindowMaximized); + } else { + w->resize(g.size()); + } + + if (value(key + QLatin1String("/visible"), true).toBool()) + w->show(); +// endGroup(); +} + +QStringList QDesignerSettings::recentFilesList() const +{ + return value(QLatin1String("recentFilesList")).toStringList(); +} + +void QDesignerSettings::setRecentFilesList(const QStringList &sl) +{ + setValue(QLatin1String("recentFilesList"), sl); +} + +void QDesignerSettings::setShowNewFormOnStartup(bool showIt) +{ + setValue(QLatin1String("newFormDialog/ShowOnStartup"), showIt); +} + +bool QDesignerSettings::showNewFormOnStartup() const +{ + return value(QLatin1String("newFormDialog/ShowOnStartup"), true).toBool(); +} + +void QDesignerSettings::setUIMode(int mode) +{ + setValue(QLatin1String("UI/currentMode"), mode); +} + +int QDesignerSettings::uiMode() const +{ + return value(QLatin1String("UI/currentMode"), QDesignerWorkbench::TopLevelMode).toInt(); +} + +QByteArray QDesignerSettings::mainWindowState() const +{ + return value(QLatin1String("MainWindowState")).toByteArray(); +} + +void QDesignerSettings::setMainWindowState(const QByteArray &mainWindowState) +{ + setValue(QLatin1String("MainWindowState"), mainWindowState); +} + diff --git a/src/designer/formdesigner/qdesigner_settings.h b/src/designer/formdesigner/qdesigner_settings.h new file mode 100644 index 0000000..1416f11 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_settings.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_SETTINGS_H +#define QDESIGNER_SETTINGS_H + +#include +#include + +class QDesignerSettings : public QSettings +{ +public: + QDesignerSettings(); + virtual ~QDesignerSettings(); + + QStringList formTemplatePaths() const; + void setFormTemplatePaths(const QStringList &paths); + + QString defaultUserWidgetBoxXml() const; + + void setGeometryFor(QWidget *w, const QRect &fallBack = QRect()) const; + void saveGeometryFor(const QWidget *w); + + QStringList recentFilesList() const; + void setRecentFilesList(const QStringList &list); + + void setShowNewFormOnStartup(bool showIt); + bool showNewFormOnStartup() const; + + void setUIMode(int mode); + int uiMode() const; + + QByteArray mainWindowState() const; + void setMainWindowState(const QByteArray &mainWindowState); + +private: + QStringList defaultFormTemplatePaths() const; + + void setGeometryHelper(QWidget *w, const QString &key, const QRect &fallBack) const; + void saveGeometryHelper(const QWidget *w, const QString &key); + +private: + QString m_designerPath; +}; + +#endif // QDESIGNER_SETTINGS_H diff --git a/src/designer/formdesigner/qdesigner_signalsloteditor.cpp b/src/designer/formdesigner/qdesigner_signalsloteditor.cpp new file mode 100644 index 0000000..f2df5fe --- /dev/null +++ b/src/designer/formdesigner/qdesigner_signalsloteditor.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_signalsloteditor.h" +#include "qdesigner_workbench.h" +#include "qdesigner_settings.h" + +#include +#include + +#include + + +QDesignerSignalSlotEditor::QDesignerSignalSlotEditor(QDesignerWorkbench *workbench) + : QDesignerToolWindow(workbench) +{ + setObjectName(QLatin1String("SignalSlotEditorWindow")); + QWidget *widget = QDesignerComponents::createSignalSlotEditor(workbench->core(), this); + + setCentralWidget(widget); + + setWindowTitle(tr("Signal/Slot Editor")); +} + +QDesignerSignalSlotEditor::~QDesignerSignalSlotEditor() +{ +} + +QRect QDesignerSignalSlotEditor::geometryHint() const +{ + QRect g = workbench()->availableGeometry(); + int margin = workbench()->marginHint(); + + QSize sz(g.width() * 1/3, g.height() * 1/6); + QRect r(QPoint(0, 0), sz); + r.moveCenter(g.center()); + r.moveTop(margin); + + return r; +} diff --git a/src/designer/formdesigner/qdesigner_signalsloteditor.h b/src/designer/formdesigner/qdesigner_signalsloteditor.h new file mode 100644 index 0000000..17bcfa3 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_signalsloteditor.h @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_SIGNALSLOTEDITOR_H +#define QDESIGNER_SIGNALSLOTEDITOR_H + +#include "qdesigner_toolwindow.h" + +class QDesignerWorkbench; + +class QDesignerSignalSlotEditor: public QDesignerToolWindow +{ + Q_OBJECT +public: + QDesignerSignalSlotEditor(QDesignerWorkbench *workbench); + virtual ~QDesignerSignalSlotEditor(); + + virtual QRect geometryHint() const; +}; + +#endif // QDESIGNER_SIGNALSLOTEDITOR_H diff --git a/src/designer/formdesigner/qdesigner_toolwindow.cpp b/src/designer/formdesigner/qdesigner_toolwindow.cpp new file mode 100644 index 0000000..1fb8d2e --- /dev/null +++ b/src/designer/formdesigner/qdesigner_toolwindow.cpp @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_toolwindow.h" +#include "qdesigner_settings.h" +#include "qdesigner_workbench.h" + +#include +#include +#include +#include +#include + +QDesignerToolWindow::QDesignerToolWindow(QDesignerWorkbench *workbench, QWidget *parent, Qt::WindowFlags flags) + : QMainWindow(parent, flags), + m_workbench(workbench), + m_saveSettings(false) +{ + Q_ASSERT(workbench != 0); + + m_action = new QAction(this); + m_action->setShortcutContext(Qt::ApplicationShortcut); + m_action->setText(windowTitle()); + m_action->setCheckable(true); + connect(m_action, SIGNAL(triggered(bool)), this, SLOT(showMe(bool))); +} + +QDesignerToolWindow::~QDesignerToolWindow() +{ + if (workbench()) + workbench()->removeToolWindow(this); +} + +void QDesignerToolWindow::showMe(bool v) +{ + QWidget *target = parentWidget() == 0 ? this : parentWidget(); + + if (v) + target->setWindowState(target->windowState() & ~Qt::WindowMinimized); + + target->setVisible(v); +} + +void QDesignerToolWindow::showEvent(QShowEvent *e) +{ + Q_UNUSED(e); + + bool blocked = m_action->blockSignals(true); + m_action->setChecked(true); + m_action->blockSignals(blocked); +} + +void QDesignerToolWindow::hideEvent(QHideEvent *e) +{ + Q_UNUSED(e); + + bool blocked = m_action->blockSignals(true); + m_action->setChecked(false); + m_action->blockSignals(blocked); +} + +QAction *QDesignerToolWindow::action() const +{ + return m_action; +} + +void QDesignerToolWindow::changeEvent(QEvent *e) +{ + switch (e->type()) { + case QEvent::WindowTitleChange: + m_action->setText(windowTitle()); + break; + case QEvent::WindowIconChange: + m_action->setIcon(windowIcon()); + break; + default: + break; + } + QMainWindow::changeEvent(e); +} + +QDesignerWorkbench *QDesignerToolWindow::workbench() const +{ + return m_workbench; +} + +QRect QDesignerToolWindow::geometryHint() const +{ + return QRect(); +} + +void QDesignerToolWindow::closeEvent(QCloseEvent *ev) +{ + if (m_saveSettings) { + ev->setAccepted(workbench()->handleClose()); + /*if (ev->isAccepted() && qDesigner->mainWindow() == this) + QMetaObject::invokeMethod(qDesigner, "quit", Qt::QueuedConnection); // We're going down!*/ + } else { + QMainWindow::closeEvent(ev); + } +} + +bool QDesignerToolWindow::saveSettingsOnClose() const +{ + return m_saveSettings; +} + +void QDesignerToolWindow::setSaveSettingsOnClose(bool save) +{ + m_saveSettings = save; +} + +Qt::DockWidgetArea QDesignerToolWindow::dockWidgetAreaHint() const +{ + return Qt::RightDockWidgetArea; +} + diff --git a/src/designer/formdesigner/qdesigner_toolwindow.h b/src/designer/formdesigner/qdesigner_toolwindow.h new file mode 100644 index 0000000..393e999 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_toolwindow.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_TOOLWINDOW_H +#define QDESIGNER_TOOLWINDOW_H + +#include +#include + +class QDesignerWorkbench; + +class QDesignerToolWindow: public QMainWindow +{ + Q_OBJECT +public: + QDesignerToolWindow(QDesignerWorkbench *workbench, QWidget *parent = 0, Qt::WindowFlags flags = Qt::Window); + virtual ~QDesignerToolWindow(); + + QDesignerWorkbench *workbench() const; + QAction *action() const; + + void setSaveSettingsOnClose(bool save); + bool saveSettingsOnClose() const; + + virtual Qt::DockWidgetArea dockWidgetAreaHint() const; + virtual QRect geometryHint() const; + +private slots: + void showMe(bool); + +protected: + virtual void showEvent(QShowEvent *e); + virtual void hideEvent(QHideEvent *e); + virtual void changeEvent(QEvent *e); + virtual void closeEvent(QCloseEvent *e); + +private: + QDesignerWorkbench *m_workbench; + QAction *m_action; + bool m_saveSettings; +}; + +#endif // QDESIGNER_TOOLWINDOW_H diff --git a/src/designer/formdesigner/qdesigner_widgetbox.cpp b/src/designer/formdesigner/qdesigner_widgetbox.cpp new file mode 100644 index 0000000..eba6c56 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_widgetbox.cpp @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_widgetbox.h" +#include "qdesigner_workbench.h" +#include "qdesigner_settings.h" + +#include +#include + +#include + +QDesignerWidgetBox::QDesignerWidgetBox(QDesignerWorkbench *workbench) + : QDesignerToolWindow(workbench) +{ + setObjectName(QLatin1String("WidgetBox")); + QDesignerWidgetBoxInterface *widget = QDesignerComponents::createWidgetBox(workbench->core(), this); + widget->setFileName(QLatin1String(":/trolltech/widgetbox/widgetbox.xml")); + widget->load(); + widget->setFileName(QDesignerSettings().defaultUserWidgetBoxXml()); + widget->load(); + +/* int g, w; + for ( g=0; g< widget->categoryCount(); g++){ + printf("cat %i=%s\n", g, widget->category( g ).name().toUtf8().data()); + for ( w=0; w < widget->widgetCount( g ); w++ ){ + printf(" w%i=%s\n", w, widget->widget( g, w ).name().toUtf8().data()); + } + } +*/ + // Удалим лишние группы и объекты + widget->removeCategory( 3 ); + + workbench->core()->setWidgetBox(widget); + + setCentralWidget(widget); + + setWindowTitle(tr("Widget Box")); +} + +QDesignerWidgetBox::~QDesignerWidgetBox() +{ +} + +QRect QDesignerWidgetBox::geometryHint() const +{ + QRect g = workbench()->availableGeometry(); + + return QRect(workbench()->marginHint(), workbench()->marginHint(), + g.width() * 1/6, g.height() * 5/6); +} + +Qt::DockWidgetArea QDesignerWidgetBox::dockWidgetAreaHint() const +{ + return Qt::LeftDockWidgetArea; +} diff --git a/src/designer/formdesigner/qdesigner_widgetbox.h b/src/designer/formdesigner/qdesigner_widgetbox.h new file mode 100644 index 0000000..e6a8697 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_widgetbox.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_WIDGETBOX_H +#define QDESIGNER_WIDGETBOX_H + +#include "qdesigner_toolwindow.h" + +class QDesignerWorkbench; + +class QDesignerWidgetBox: public QDesignerToolWindow +{ + Q_OBJECT +public: + QDesignerWidgetBox(QDesignerWorkbench *workbench); + virtual ~QDesignerWidgetBox(); + + virtual Qt::DockWidgetArea dockWidgetAreaHint() const; + virtual QRect geometryHint() const; +}; + +#endif // QDESIGNER_WIDGETBOX_H diff --git a/src/designer/formdesigner/qdesigner_workbench.cpp b/src/designer/formdesigner/qdesigner_workbench.cpp new file mode 100644 index 0000000..48461f2 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_workbench.cpp @@ -0,0 +1,881 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +//#include "qdesigner.h" +#include "qdesigner_workbench.h" +#include "qdesigner_actions.h" +#include "qdesigner_toolwindow.h" +#include "qdesigner_formwindow.h" +#include "qdesigner_settings.h" +#include "qdesigner_widgetbox.h" +#include "qdesigner_propertyeditor.h" +#include "qdesigner_objectinspector.h" +#include "qdesigner_signalsloteditor.h" +#include "qdesigner_actioneditor.h" +#include "qdesigner_resourceeditor.h" + +#include +#include +#include "private/qdesigner_integration_p.h" +#include "private/pluginmanager_p.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +QDesignerWorkbench::QDesignerWorkbench() + : m_mode(QDesignerWorkbench::NeutralMode), m_workspace(0) +{ + m_initializing = true; + initialize(); + + setUIMode(UIMode(/*QDesignerSettings().uiMode()*/DockedMode)); + m_initializing = false; +} + +QDesignerWorkbench::~QDesignerWorkbench() +{ + if (m_mode == DockedMode) { + Q_ASSERT(m_workspace != 0); + QMainWindow *mw = qobject_cast(m_workspace->window()); + Q_ASSERT(mw != 0); + + QDesignerSettings settings; + settings.setMainWindowState(mw->saveState(2)); + } + + while (!m_toolWindows.isEmpty()) + delete m_toolWindows.takeLast(); +} + +QDesignerWorkbench::UIMode QDesignerWorkbench::mode() const +{ + return m_mode; +} + +void QDesignerWorkbench::addToolWindow(QDesignerToolWindow *toolWindow) +{ + Q_ASSERT(m_toolWindowExtras.contains(toolWindow) == false); + Q_ASSERT(toolWindow->windowTitle().isEmpty() == false); + + m_toolWindows.append(toolWindow); + + if (QAction *action = toolWindow->action()) { + Q_ASSERT(m_toolMenu->actions().isEmpty() == false); + + QList lst = m_toolActions->actions(); + QAction *before = lst.count() ? lst.last() : m_toolMenu->actions().first(); + m_toolMenu->insertAction(before, action); + m_toolActions->addAction(action); + } +} + +void QDesignerWorkbench::addFormWindow(QDesignerFormWindow *formWindow) +{ + Q_ASSERT(m_formWindowExtras.contains(formWindow) == false); + // ### Q_ASSERT(formWindow->windowTitle().isEmpty() == false); + + m_formWindows.append(formWindow); + if (m_windowActions->actions().isEmpty()) + m_windowMenu->addSeparator(); + + if (QAction *action = formWindow->action()) { + m_windowActions->addAction(action); + m_windowMenu->addAction(action); + action->setChecked(true); + } + + m_actionManager->minimizeAction()->setEnabled(true); + m_actionManager->editWidgets()->trigger(); +} + +void QDesignerWorkbench::initialize() +{ + /*QObjectList list = QPluginLoader::staticInstances(); + qDebug() << list.size(); + for (int i=0; iobjectName() << list[i]->metaObject()->className(); + qDebug() << qobject_cast(list[i]); + }*/ + + QDesignerSettings settings; + m_core = QDesignerComponents::createFormEditor(this); + + (void) QDesignerComponents::createTaskMenu(core(), this); + + initializeCorePlugins(); + QDesignerComponents::initializePlugins(core()); + + m_toolActions = new QActionGroup(this); + m_toolActions->setExclusive(false); + + m_windowActions = new QActionGroup(this); + m_windowActions->setExclusive(true); + connect(m_windowActions, SIGNAL(triggered(QAction*)), this, SLOT(formWindowActionTriggered(QAction*))); + + m_actionManager = new QDesignerActions(this); + + m_globalMenuBar = new QMenuBar; + +/* + m_fileMenu = m_globalMenuBar->addMenu(tr("&File")); + foreach (QAction *action, m_actionManager->fileActions()->actions()) { + m_fileMenu->addAction(action); + if (action->text() == QDesignerActions::tr("&Open Form...")) { + QMenu *recentFilesMenu = m_fileMenu->addMenu(tr("&Recent Forms")); + // Pop the "Recent Files" stuff in here. + foreach(QAction *recentAction, m_actionManager->recentFilesActions()->actions()) + recentFilesMenu->addAction(recentAction); + } + } +*/ + m_editMenu = m_globalMenuBar->addMenu(tr("&Edit")); + foreach (QAction *action, m_actionManager->editActions()->actions()) { + m_editMenu->addAction(action); + } + + m_editMenu->addSeparator(); + + foreach (QAction *action, m_actionManager->toolActions()->actions()) { + m_editMenu->addAction(action); + } + + m_editMenu->addSeparator(); + QMenu *menu = m_editMenu->addMenu(tr("User Interface &Mode")); + foreach (QAction *action, m_actionManager->uiMode()->actions()) + menu->addAction(action); + + + m_formMenu = m_globalMenuBar->addMenu(tr("F&orm")); + foreach (QAction *action, m_actionManager->formActions()->actions()) { + m_formMenu->addAction(action); + } + +/* + QMenu *previewSubMenu = new QMenu(tr("Preview in"), m_formMenu); + m_formMenu->insertMenu(m_actionManager->previewFormAction(), previewSubMenu); + + foreach (QAction *action, m_actionManager->styleActions()->actions()) { + previewSubMenu->addAction(action); + } +*/ + m_toolMenu = m_globalMenuBar->addMenu(tr("&Tools")); + + m_toolMenu->addSeparator(); + + m_windowMenu = m_globalMenuBar->addMenu(tr("&Window")); + foreach (QAction *action, m_actionManager->windowActions()->actions()) { + m_windowMenu->addAction(action); + } + +/* + m_helpMenu = m_globalMenuBar->addMenu(tr("&Help")); + foreach (QAction *action, m_actionManager->helpActions()->actions()) { + m_helpMenu->addAction(action); + } +*/ + QDesignerToolWindow *tw = new QDesignerWidgetBox(this); + tw->setObjectName(QLatin1String("qt_designer_widgetbox")); + addToolWindow(tw); + tw = new QDesignerObjectInspector(this); + tw->setObjectName(QLatin1String("qt_designer_objectinspector")); + addToolWindow(tw); + tw = new QDesignerPropertyEditor(this); + tw->setObjectName(QLatin1String("qt_designer_propertyeditor")); + addToolWindow(tw); + tw = new QDesignerSignalSlotEditor(this); + tw->setObjectName(QLatin1String("qt_designer_signalsloteditor")); +// addToolWindow(tw); + tw = new QDesignerResourceEditor(this); + tw->setObjectName(QLatin1String("qt_designer_resourceeditor")); +// addToolWindow(tw); + tw = new QDesignerActionEditor(this); + tw->setObjectName(QLatin1String("qt_designer_actioneditor")); +// addToolWindow(tw); + + m_integration = new qdesigner_internal::QDesignerIntegration(core(), this); + + // create the toolbars + m_editToolBar = new QToolBar; + m_editToolBar->setObjectName(QLatin1String("editToolBar")); + m_editToolBar->setWindowTitle(tr("Edit")); + foreach (QAction *action, m_actionManager->editActions()->actions()) { + if (action->icon().isNull() == false) + m_editToolBar->addAction(action); + } + + m_toolToolBar = new QToolBar; + m_toolToolBar->setObjectName(QLatin1String("toolsToolBar")); + m_toolToolBar->setWindowTitle(tr("Tools")); + foreach (QAction *action, m_actionManager->toolActions()->actions()) { + if (action->icon().isNull() == false) + m_toolToolBar->addAction(action); + } + + m_formToolBar = new QToolBar; + m_formToolBar->setObjectName(QLatin1String("formToolBar")); + m_formToolBar->setWindowTitle(tr("Form")); + foreach (QAction *action, m_actionManager->formActions()->actions()) { + if (action->icon().isNull() == false) + m_formToolBar->addAction(action); + } + + QMenu *toolbarMenu = m_toolMenu->addMenu(tr("Toolbars")); + toolbarMenu->addAction(m_editToolBar->toggleViewAction()); + toolbarMenu->addAction(m_toolToolBar->toggleViewAction()); + toolbarMenu->addAction(m_formToolBar->toggleViewAction()); + + m_geometries.clear(); + + emit initialized(); + + connect(m_core->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)), + this, SLOT(updateWindowMenu(QDesignerFormWindowInterface*))); +} + +Qt::WindowFlags QDesignerWorkbench::magicalWindowFlags(const QWidget *widgetForFlags) const +{ + switch (m_mode) { + case TopLevelMode: { +#ifdef Q_WS_MAC + if (qobject_cast(widgetForFlags)) + return Qt::Tool; +#else + Q_UNUSED(widgetForFlags); +#endif + return Qt::Window; + } + case DockedMode: + Q_ASSERT(m_workspace != 0); + return Qt::Window | Qt::WindowShadeButtonHint | Qt::WindowSystemMenuHint | Qt::WindowTitleHint; + case NeutralMode: + return Qt::Window; + default: + Q_ASSERT(0); + return 0; + } +} + +QWidget *QDesignerWorkbench::magicalParent() const +{ + switch (m_mode) { + case TopLevelMode: + return 0; + case DockedMode: + Q_ASSERT(m_workspace != 0); + return m_workspace; + case NeutralMode: + return 0; + default: + Q_ASSERT(0); + return 0; + } +} + +void QDesignerWorkbench::switchToNeutralMode() +{ + if (m_mode == NeutralMode) { + return; + } else if (m_mode == DockedMode) { + Q_ASSERT(m_workspace != 0); + QMainWindow *mw = qobject_cast(m_workspace->window()); + QDesignerSettings settings; + settings.setMainWindowState(mw->saveState(2)); + } + + QPoint desktopOffset = QPoint(0, 0); + QPoint workspaceOffset = QPoint(0, 0); + if (m_mode == TopLevelMode) + desktopOffset = QApplication::desktop()->availableGeometry().topLeft(); + else if (m_mode == DockedMode) + workspaceOffset = m_workspace->mapToGlobal(QPoint(0, 0)); + m_mode = NeutralMode; + + m_geometries.clear(); + m_visibilities.clear(); + + foreach (QDesignerToolWindow *tw, m_toolWindows) { + m_visibilities.insert(tw, tw->isVisible()); + if (tw->isVisible()) { + // use the actual geometry + QPoint pos = tw->window()->pos(); + if (!tw->isWindow()) { + if (const QWidget *pw = tw->parentWidget()) { + pos = pw->mapTo(tw->window(), QPoint(0, 0)); + pos += tw->window()->pos(); + } + + } + m_geometries.insert(tw, QRect(pos - desktopOffset, tw->size())); + } + tw->setSaveSettingsOnClose(false); + + tw->setParent(0); + } + + foreach (QDesignerFormWindow *fw, m_formWindows) { + if (fw->isVisible()) { + // use the actual geometry + QPoint pos = fw->window()->pos(); + if (!fw->isWindow()) + if (QWidget *p = fw->parentWidget()) + pos = p->pos(); // in workspace + + m_geometries.insert(fw, QRect(pos - desktopOffset + workspaceOffset, + fw->size())); + } + + fw->setParent(0); + } + +#ifndef Q_WS_MAC + m_globalMenuBar->setParent(0); +#endif + m_editToolBar->setParent(0); + m_toolToolBar->setParent(0); + m_formToolBar->setParent(0); + m_core->setTopLevel(0); + /*qDesigner->*/setMainWindow(0); + + if (m_workspace) + delete m_workspace->parentWidget(); + + m_workspace = 0; +} + +void QDesignerWorkbench::switchToDockedMode() +{ + bool wasTopLevel = (m_mode == TopLevelMode); + if (m_mode == DockedMode) + return; + + switchToNeutralMode(); + m_mode = DockedMode; + + QDesignerToolWindow *widgetBoxWrapper = 0; + if (0 != (widgetBoxWrapper = findToolWindow(core()->widgetBox()))) { + widgetBoxWrapper->action()->setEnabled(true); + widgetBoxWrapper->setWindowTitle(tr("Widget Box")); + } + + Q_ASSERT(m_workspace == 0); + + QDesignerSettings settings; + QDesignerToolWindow *mw = new QDesignerToolWindow(this); // Just to have a copy of + mw->setSaveSettingsOnClose(true); + mw->setObjectName(QLatin1String("MDIWindow")); + mw->setWindowTitle(tr("Qt Designer")); + m_workspace = new QWorkspace(mw); + m_workspace->setAcceptDrops(true); + m_workspace->installEventFilter(this); + m_workspace->setScrollBarsEnabled(true); + connect(m_workspace, SIGNAL(windowActivated(QWidget*)), + this, SLOT(activateWorkspaceChildWindow(QWidget*))); + mw->setCentralWidget(m_workspace); + m_core->setTopLevel(mw); + (void) mw->statusBar(); + if (m_geometries.isEmpty()) { + settings.setGeometryFor(mw, qApp->desktop()->availableGeometry(0)); + } else { + if (QDesignerToolWindow *widgetBox = findToolWindow(core()->widgetBox())) { + QRect r = m_geometries.value(widgetBox, QRect(0, 0, 200, 200)); + mw->move(r.topLeft()); + } + mw->setWindowState(mw->windowState() | Qt::WindowMaximized); + } + +#ifndef Q_WS_MAC + mw->setMenuBar(m_globalMenuBar); + m_globalMenuBar->show(); +#endif + mw->addToolBar(m_editToolBar); + mw->addToolBar(m_toolToolBar); + mw->addToolBar(m_formToolBar); + m_editToolBar->show(); + m_toolToolBar->show(); + m_formToolBar->show(); + + /*qDesigner->*/setMainWindow(mw); + + foreach (QDesignerToolWindow *tw, m_toolWindows) { + if (wasTopLevel) + settings.saveGeometryFor(tw); + QDockWidget *dockWidget = magicalDockWidget(tw); + if (dockWidget == 0) { + dockWidget = new QDockWidget(mw); + dockWidget->setObjectName(tw->objectName() + QLatin1String("_dock")); + dockWidget->setWindowTitle(tw->windowTitle()); + mw->addDockWidget(tw->dockWidgetAreaHint(), dockWidget); + } + + dockWidget->setWidget(tw); + } + + foreach (QDesignerToolWindow *tw, m_toolWindows) { + QDockWidget *dockWidget = magicalDockWidget(tw); + tw->setVisible(true); + dockWidget->setVisible(m_visibilities.value(tw, true)); + } + + mw->restoreState(settings.mainWindowState(), 2); + + foreach (QDesignerFormWindow *fw, m_formWindows) + m_workspace->addWindow(fw, magicalWindowFlags(fw))->hide(); + // will be shown in adjustFormPositions + + changeBringToFrontVisiblity(false); + + mw->show(); + + if (!m_initializing) + QMetaObject::invokeMethod(this, "adjustFormPositions", Qt::QueuedConnection); +} + +bool QDesignerWorkbench::eventFilter(QObject *object, QEvent *event) +{ + if (object == m_workspace) { + if (event->type() == QEvent::DragEnter) { + QDragEnterEvent *e = static_cast(event); + if (e->mimeData()->hasFormat("text/uri-list")) { + e->acceptProposedAction(); + return true; + } + } else if (event->type() == QEvent::Drop) { + QDropEvent *e = static_cast(event); + if (!e->mimeData()->hasFormat("text/uri-list")) + return false; + foreach (QUrl url, e->mimeData()->urls()) { + QString fileName = url.toLocalFile(); + if (fileName.endsWith(".ui")) + readInForm(url.toLocalFile()); + else + QMessageBox::critical(m_workspace, tr("Opening Form"), + tr("Cannot open file %1!").arg(fileName)); + } + e->acceptProposedAction(); + return true; + } + } + return false; +} + +void QDesignerWorkbench::adjustFormPositions() +{ + if (m_workspace == 0) + return; + + QPoint workspace_tl = m_workspace->mapToGlobal(QPoint(0, 0)); + + foreach (QDesignerFormWindow *fw, m_formWindows) { + QWidget *frame = fw->parentWidget(); + if (frame == 0) + continue; + QRect g = m_geometries.value(fw, fw->geometryHint()); + frame->move(g.topLeft() - workspace_tl); + fw->resize(g.size()); + frame->show(); + } +} + +void QDesignerWorkbench::changeBringToFrontVisiblity(bool visible) +{ + QAction *btf = m_actionManager->bringToFrontAction(); + QList actionList = m_actionManager->windowActions()->actions(); + btf->setVisible(visible); + QAction *sep = actionList.at(actionList.indexOf(btf) - 1); + if (sep->isSeparator()) + sep->setVisible(visible); +} + +void QDesignerWorkbench::switchToTopLevelMode() +{ + if (m_mode == TopLevelMode) + return; + + // make sure that the widgetbox is visible iff it is different from neutrol. + if (m_mode != NeutralMode) { + if (QDesignerToolWindow *widgetbox_tool = findToolWindow(core()->widgetBox())) { + if (!widgetbox_tool->action()->isChecked()) + widgetbox_tool->action()->trigger(); + } + } + + switchToNeutralMode(); + QPoint desktopOffset = QApplication::desktop()->availableGeometry().topLeft(); + m_mode = TopLevelMode; + + // The widget box is special, it gets the menubar and gets to be the main widget. + + QDesignerToolWindow *widgetBoxWrapper = 0; + if (0 != (widgetBoxWrapper = findToolWindow(core()->widgetBox()))) { + m_core->setTopLevel(widgetBoxWrapper); +#ifndef Q_WS_MAC + widgetBoxWrapper->setMenuBar(m_globalMenuBar); + widgetBoxWrapper->action()->setEnabled(false); + widgetBoxWrapper->setSaveSettingsOnClose(true); + /*qDesigner->*/setMainWindow(widgetBoxWrapper); + widgetBoxWrapper->setWindowTitle(tr("Qt Designer")); +#endif + widgetBoxWrapper->addToolBar(m_editToolBar); + widgetBoxWrapper->addToolBar(m_toolToolBar); + widgetBoxWrapper->addToolBar(m_formToolBar); + + widgetBoxWrapper->insertToolBarBreak(m_formToolBar); + } + + QDesignerSettings settings; + bool found_visible_window = false; + foreach (QDesignerToolWindow *tw, m_toolWindows) { + tw->setParent(magicalParent(), magicalWindowFlags(tw)); + settings.setGeometryFor(tw, tw->geometryHint()); + tw->action()->setChecked(tw->isVisible()); + found_visible_window |= tw->isVisible(); + } + + if (!m_toolWindows.isEmpty() && !found_visible_window) + m_toolWindows.first()->show(); + + changeBringToFrontVisiblity(true); + + foreach (QDesignerFormWindow *fw, m_formWindows) { + fw->setParent(magicalParent(), magicalWindowFlags(fw)); + QRect g = m_geometries.value(fw, fw->geometryHint()); + fw->resize(g.size()); + fw->move(g.topLeft() + desktopOffset); + fw->show(); + } +} + +QDesignerFormWindow *QDesignerWorkbench::createFormWindow() +{ + QDesignerFormWindow *formWindow = new QDesignerFormWindow(/*formWindow=*/ 0, this); + + if (m_workspace) { + m_workspace->addWindow(formWindow, magicalWindowFlags(formWindow)); + } else { + formWindow->setParent(magicalParent(), magicalWindowFlags(formWindow)); + } + + formWindow->setAttribute(Qt::WA_DeleteOnClose, true); + + addFormWindow(formWindow); + + QRect g = formWindow->geometryHint(); + formWindow->resize(g.size()); + formWindow->move(availableGeometry().center() - g.center()); + + if (m_workspace) { + m_workspace->setActiveWindow(formWindow); + } + + return formWindow; +} + +QDesignerFormWindowManagerInterface *QDesignerWorkbench::formWindowManager() const +{ + return m_core->formWindowManager(); +} + +QDesignerFormEditorInterface *QDesignerWorkbench::core() const +{ + return m_core; +} + +int QDesignerWorkbench::toolWindowCount() const +{ + return m_toolWindows.count(); +} + +QDesignerToolWindow *QDesignerWorkbench::toolWindow(int index) const +{ + return m_toolWindows.at(index); +} + +int QDesignerWorkbench::formWindowCount() const +{ + return m_formWindows.count(); +} + +QDesignerFormWindow *QDesignerWorkbench::formWindow(int index) const +{ + return m_formWindows.at(index); +} + +QRect QDesignerWorkbench::availableGeometry() const +{ + if (m_workspace) + return m_workspace->geometry(); + + QDesktopWidget *desktop = QApplication::desktop(); + + QWidget *window = findToolWindow(core()->widgetBox()); + if (window) + return desktop->availableGeometry(desktop->screenNumber(window)); + return desktop->availableGeometry(0); +} + +int QDesignerWorkbench::marginHint() const +{ + return 20; +} + +void QDesignerWorkbench::activateWorkspaceChildWindow(QWidget *widget) +{ + if (QDesignerFormWindow *fw = qobject_cast(widget)) { + core()->formWindowManager()->setActiveFormWindow(fw->editor()); + m_workspace->setActiveWindow(widget); + } +} + +void QDesignerWorkbench::removeToolWindow(QDesignerToolWindow *toolWindow) +{ + int index = m_toolWindows.indexOf(toolWindow); + if (index != -1) { + m_toolWindows.removeAt(index); + m_toolWindowExtras.remove(toolWindow); + } + + if (QAction *action = toolWindow->action()) { + m_toolActions->removeAction(action); + //m_toolMenu->removeAction(action); // FIXME Зависает в этом месте при выходе из программы + } +} + +void QDesignerWorkbench::removeFormWindow(QDesignerFormWindow *formWindow) +{ + int index = m_formWindows.indexOf(formWindow); + if (index != -1) { + m_formWindows.removeAt(index); + m_formWindowExtras.remove(formWindow); + } + + if (QAction *action = formWindow->action()) { + m_windowActions->removeAction(action); + m_windowMenu->removeAction(action); + } + + if (formWindowCount() == 0) { + m_actionManager->minimizeAction()->setEnabled(false); + QList actions = m_windowMenu->actions(); + for (int i = actions.size() - 1; i >= 0; --i) { + QAction *act = actions.at(i); + if (act->isSeparator()) { + delete act; + break; + } + } + } +} + +void QDesignerWorkbench::initializeCorePlugins() +{ + QList plugins = QPluginLoader::staticInstances(); + plugins += core()->pluginManager()->instances(); + + foreach (QObject *plugin, plugins) { + if (QDesignerFormEditorPluginInterface *formEditorPlugin = qobject_cast(plugin)) { + if (!formEditorPlugin->isInitialized()) + formEditorPlugin->initialize(core()); + } + } +} + +void QDesignerWorkbench::saveSettings() const +{ + QDesignerSettings settings; + if (m_mode == DockedMode) { + if (qFindChild(/*qDesigner->*/mainWindow())) { + settings.saveGeometryFor(/*qDesigner->*/mainWindow()); + settings.setValue(/*qDesigner->*/mainWindow()->objectName() + QLatin1String("/visible"), false); + } + } else { + foreach (QDesignerToolWindow *tw, m_toolWindows) { + settings.saveGeometryFor(tw); + } + } +} + +bool QDesignerWorkbench::readInForm(const QString &fileName) const +{ + return m_actionManager->readInForm(fileName); +} + +bool QDesignerWorkbench::writeOutForm(QDesignerFormWindowInterface *formWindow, const QString &fileName) const +{ + return m_actionManager->writeOutForm(formWindow, fileName); +} + +bool QDesignerWorkbench::saveForm(QDesignerFormWindowInterface *frm) +{ + return m_actionManager->saveForm(frm); +} + +QDesignerToolWindow *QDesignerWorkbench::findToolWindow(QWidget *widget) const +{ + foreach (QDesignerToolWindow *toolWindow, m_toolWindows) { + if (toolWindow->centralWidget() == widget) + return toolWindow; + } + + return 0; +} + +QDesignerFormWindow *QDesignerWorkbench::findFormWindow(QWidget *widget) const +{ + foreach (QDesignerFormWindow *formWindow, m_formWindows) { + if (formWindow->centralWidget() == widget) + return formWindow; + } + + return 0; +} + +bool QDesignerWorkbench::handleClose() +{ + QList dirtyForms; + foreach (QDesignerFormWindow *w, m_formWindows) { + if (w->editor()->isDirty()) + dirtyForms << w; + } + + if (dirtyForms.size()) { + if (dirtyForms.size() == 1) { + if (!dirtyForms.at(0)->close()) { + return false; + } + } else { + QMessageBox box(tr("Save Forms?"), + tr("There are %1 forms with unsaved changes." + " Do you want to review these changes before quitting?") + .arg(dirtyForms.size()), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape, 0); + box.setButtonText(QMessageBox::Yes, tr("Review Changes")); + box.setButtonText(QMessageBox::No, tr("Discard Changes")); + switch (box.exec()) { + case QMessageBox::Cancel: + return false; + case QMessageBox::Yes: + foreach (QDesignerFormWindow *fw, dirtyForms) { + fw->show(); + fw->raise(); + if (!fw->close()) { + return false; + } + } + break; + case QMessageBox::No: + foreach (QDesignerFormWindow *fw, dirtyForms) { + fw->editor()->setDirty(false); + fw->setWindowModified(false); + } + break; + } + } + } + + foreach (QDesignerFormWindow *fw, m_formWindows) + fw->close(); + + saveSettings(); + return true; +} + +QDesignerActions *QDesignerWorkbench::actionManager() const +{ + return m_actionManager; +} + +void QDesignerWorkbench::setUIMode(UIMode mode) +{ + switch (mode) { + case TopLevelMode: + switchToTopLevelMode(); + break; + case DockedMode: + switchToDockedMode(); + break; + + default: Q_ASSERT(0); + } +} + +void QDesignerWorkbench::updateWindowMenu(QDesignerFormWindowInterface *fw) +{ + if (!fw) + return; + if (QDesignerFormWindow *dfw = qobject_cast(fw->parentWidget())) + dfw->action()->setChecked(true); +} + +void QDesignerWorkbench::formWindowActionTriggered(QAction *a) +{ + QWidget *widget = a->parentWidget(); + Q_ASSERT(widget != 0); + + if (m_mode == DockedMode) { + m_workspace->setActiveWindow(widget); + } else { + widget->setWindowState(widget->windowState() & ~Qt::WindowMinimized); + widget->activateWindow(); + widget->raise(); + } +} + +void QDesignerWorkbench::showToolBars() +{ + m_toolToolBar->show(); + m_formToolBar->show(); + m_editToolBar->show(); +} + +void QDesignerWorkbench::closeAllToolWindows() +{ + foreach (QDesignerToolWindow *tw, m_toolWindows) + tw->hide(); +} + +QDockWidget *QDesignerWorkbench::magicalDockWidget(QWidget *widget) const +{ + if (!m_workspace) + return 0; + + QDockWidget *dockWidget = qFindChild(m_workspace->window(), widget->objectName() + QLatin1String("_dock")); + return dockWidget; +} diff --git a/src/designer/formdesigner/qdesigner_workbench.h b/src/designer/formdesigner/qdesigner_workbench.h new file mode 100644 index 0000000..1b922b6 --- /dev/null +++ b/src/designer/formdesigner/qdesigner_workbench.h @@ -0,0 +1,181 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QDESIGNER_WORKBENCH_H +#define QDESIGNER_WORKBENCH_H + +#include +#include +#include +#include +#include + +#include "qdesigner_toolwindow.h" + +class QDesigner; +class QDesignerActions; +//class QDesignerToolWindow; +class QDesignerFormWindow; + +class QAction; +class QActionGroup; +class QDockWidget; +class QMenu; +class QMenuBar; +class QVariant; +class QToolBar; +class QWorkspace; +class QCloseEvent; + +class QDesignerFormEditorInterface; +class QDesignerFormWindowInterface; +class QDesignerFormWindowManagerInterface; + +namespace qdesigner_internal { +class QDesignerIntegration; +} + +class QDesignerWorkbench: public QObject +{ + Q_OBJECT +public: + enum UIMode + { + NeutralMode, + TopLevelMode, + DockedMode + }; + +public: + QDesignerWorkbench(); + virtual ~QDesignerWorkbench(); + + UIMode mode() const; + + QDesignerFormEditorInterface *core() const; + + QDesignerToolWindow *findToolWindow(QWidget *widget) const; + QDesignerFormWindow *findFormWindow(QWidget *widget) const; + + QDesignerFormWindow *createFormWindow(); + + int toolWindowCount() const; + QDesignerToolWindow *toolWindow(int index) const; + + int formWindowCount() const; + QDesignerFormWindow *formWindow(int index) const; + + QDesignerActions *actionManager() const; + + QActionGroup *modeActionGroup() const; + + QRect availableGeometry() const; + int marginHint() const; + + void saveSettings() const; + + bool readInForm(const QString &fileName) const; + bool writeOutForm(QDesignerFormWindowInterface *formWindow, const QString &fileName) const; + bool saveForm(QDesignerFormWindowInterface *fw); + bool handleClose(); + void closeAllToolWindows(); + // + QDesignerToolWindow *mainWindow() const { return m_mainWindow; }; + void setMainWindow(QDesignerToolWindow *tw) { m_mainWindow = tw; }; + +signals: + void modeChanged(UIMode mode); + void initialized(); + +public slots: + void addToolWindow(QDesignerToolWindow *toolWindow); + void addFormWindow(QDesignerFormWindow *formWindow); + void removeToolWindow(QDesignerToolWindow *toolWindow); + void removeFormWindow(QDesignerFormWindow *formWindow); + void setUIMode(UIMode mode); + +// ### private slots: + void switchToNeutralMode(); + void switchToDockedMode(); + void switchToTopLevelMode(); + + void initializeCorePlugins(); + +private slots: + void initialize(); + void activateWorkspaceChildWindow(QWidget *widget); + void updateWindowMenu(QDesignerFormWindowInterface *fw); + void formWindowActionTriggered(QAction *a); + void showToolBars(); + void adjustFormPositions(); + +private: + QWidget *magicalParent() const; + Qt::WindowFlags magicalWindowFlags(const QWidget *widgetForFlags) const; + QDockWidget *magicalDockWidget(QWidget *widget) const; + + QDesignerFormWindowManagerInterface *formWindowManager() const; + void changeBringToFrontVisiblity(bool visible); + + bool eventFilter(QObject *object, QEvent *event); + +private: + QDesignerFormEditorInterface *m_core; + qdesigner_internal::QDesignerIntegration *m_integration; + + QDesignerActions *m_actionManager; + QActionGroup *m_toolActions; + QActionGroup *m_windowActions; + + QMenu *m_fileMenu; + QMenu *m_editMenu; + QMenu *m_formMenu; + QMenu *m_toolMenu; + QMenu *m_windowMenu; + QMenu *m_helpMenu; + + QMenuBar *m_globalMenuBar; + QToolBar *m_toolToolBar; + QToolBar *m_formToolBar; + QToolBar *m_editToolBar; + + UIMode m_mode; + + QList m_toolWindows; + QList m_formWindows; + + QWorkspace *m_workspace; + QHash m_visibilities; + QHash m_geometries; + + class ToolWindowExtra {}; + class FormWindowExtra {}; + + QHash m_toolWindowExtras; + QHash m_formWindowExtras; + bool m_initializing; + // + QPointer m_mainWindow; +}; + +#endif // QDESIGNER_WORKBENCH_H diff --git a/src/designer/formdesigner/qrc_designer.cpp b/src/designer/formdesigner/qrc_designer.cpp new file mode 100644 index 0000000..c4f3c91 --- /dev/null +++ b/src/designer/formdesigner/qrc_designer.cpp @@ -0,0 +1,1198 @@ +/**************************************************************************** +** Resource object code +** +** Created: Sun Oct 26 23:47:57 2008 +** by: The Resource Compiler for Qt version 4.3.0 +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include + +static const unsigned char qt_resource_data[] = { + // /home/user/src/ananas-qt4/src/designer/formdesigner/images/designer.png + 0x0,0x0,0x39,0xf, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x80,0x0,0x0,0x0,0x80,0x8,0x6,0x0,0x0,0x0,0xc3,0x3e,0x61,0xcb, + 0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13, + 0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x38,0xc1,0x49,0x44,0x41,0x54,0x78,0xda,0xed, + 0xbd,0x79,0x9c,0x1d,0x57,0x79,0x26,0xfc,0x9c,0x53,0x75,0xeb,0xde,0xee,0x56,0x4b, + 0xad,0xc5,0x96,0x2c,0x4b,0x5e,0x24,0x6f,0x78,0x1,0xdb,0xb8,0xd,0x76,0x10,0x18, + 0x8c,0x6d,0x30,0x1,0x87,0xc9,0x78,0x98,0x90,0x30,0x81,0x30,0x64,0x42,0x92,0x1, + 0x9b,0x40,0x42,0x48,0x20,0x13,0x96,0xc,0x1f,0x99,0x2f,0x99,0x90,0x5f,0x2,0x18, + 0x92,0xe1,0x73,0x20,0x33,0x59,0x60,0x62,0xc0,0xd8,0xd8,0xec,0x36,0xde,0xb0,0x65, + 0x2d,0x96,0x6d,0x59,0x6a,0xed,0x4b,0x4b,0xea,0x4d,0xdd,0xf7,0xd6,0x76,0x96,0xf7, + 0xfb,0xe3,0x9c,0x53,0x75,0xaa,0xfa,0xb6,0x36,0xb7,0x6c,0xd9,0xb2,0xfc,0x2b,0xd7, + 0xbd,0xbd,0xdc,0xbe,0xb7,0x9e,0xe7,0x7d,0xde,0xf5,0x9c,0x62,0x44,0x84,0xa3,0xf9, + 0xc7,0x18,0x7b,0x39,0x80,0x57,0x0,0xd8,0x9,0x60,0x17,0x80,0x9d,0x44,0x94,0xe1, + 0xa5,0x7f,0x2f,0xc8,0x7f,0xe1,0xd1,0x82,0xbf,0x68,0x59,0xe3,0xb7,0x7e,0xf3,0xb, + 0xb,0x6f,0xda,0xb7,0x45,0xc,0x6d,0x5f,0x27,0x86,0x56,0xdf,0x19,0xf,0x31,0xc6, + 0xf6,0x59,0x42,0xec,0xb4,0x84,0x98,0x7c,0xe9,0xd2,0xbe,0x8,0x9,0x0,0xe0,0x15, + 0x8b,0xce,0xe4,0x37,0xf5,0x2f,0xc,0x96,0xf6,0x2f,0xc,0x96,0x9e,0x33,0xd8,0x5a, + 0x75,0xed,0x7b,0xfb,0x91,0xb4,0xd5,0xd8,0xc8,0x76,0x35,0xb4,0xf3,0x49,0xb1,0x65, + 0xfd,0xf,0x93,0x21,0xc6,0xd8,0x36,0x4b,0x86,0x3,0x96,0x10,0xfb,0x5f,0xba,0xd4, + 0x2f,0x70,0x2,0x30,0xc6,0x6,0x4f,0x3b,0x37,0x7a,0x4b,0x23,0xe2,0x4b,0xeb,0xdf, + 0xeb,0x99,0x13,0x2c,0x58,0x7e,0x51,0xb0,0x60,0xf9,0x45,0xd1,0xe0,0xd5,0x37,0xf7, + 0x15,0x84,0x18,0xd9,0x29,0xf7,0x6c,0xbc,0x3f,0x1d,0x62,0x8c,0x6d,0xad,0xb9,0x8c, + 0x97,0x8,0xf1,0x42,0x22,0x0,0x63,0xac,0x37,0x6a,0xf1,0x1b,0x6,0x96,0xb0,0xeb, + 0x8e,0xe4,0xe7,0x3d,0x42,0xe0,0xb2,0x37,0xf5,0xe2,0xdf,0xe7,0x3a,0x19,0xdb,0x25, + 0x87,0x76,0x3f,0x23,0x87,0x3c,0x42,0xec,0xf7,0x8,0xb1,0xf3,0x25,0x28,0x4e,0x6c, + 0x5,0xb8,0xfc,0xb4,0x73,0xc3,0x55,0x61,0xc8,0x17,0x1c,0xd3,0x1f,0x89,0x78,0xcf, + 0xa9,0x2b,0xa2,0x8b,0x4f,0x5d,0x11,0x5d,0xec,0x8,0x31,0x79,0x40,0xef,0xd9,0x3b, + 0x24,0x87,0x86,0x1e,0x4b,0x87,0x18,0x63,0x43,0x35,0x85,0x78,0x89,0x10,0x27,0xa, + 0x1,0x18,0x63,0x4b,0xa2,0x16,0xbf,0x66,0xce,0x82,0x60,0xd5,0xac,0xfd,0xd1,0x88, + 0xf7,0x2c,0x38,0x9d,0xaf,0x5c,0x70,0x7a,0xb8,0xf2,0xa2,0xd7,0xb6,0xf0,0xb6,0x5b, + 0x7,0x30,0xb6,0x5b,0xe,0xd5,0x8,0xb1,0xff,0xa5,0x4c,0xe3,0xf8,0xff,0x63,0x87, + 0x4b,0x3,0x19,0x63,0x6f,0x5a,0x79,0x79,0xf4,0xc9,0xde,0x79,0xc1,0xa0,0xfb,0xda, + 0x3b,0x3f,0x53,0xa,0x41,0x2b,0xa,0x20,0x15,0x41,0x2a,0x3d,0xab,0x6f,0x6c,0x6a, + 0x54,0xed,0xf1,0x33,0x8d,0xb1,0x61,0xb9,0xbd,0x16,0x58,0xbe,0x94,0x69,0x1c,0x6f, + 0x2,0x30,0xc6,0xce,0x1f,0x38,0x25,0xf8,0xcd,0xe5,0x17,0x47,0x1f,0xf2,0xbf,0xee, + 0x13,0x0,0x0,0x16,0xcc,0x69,0x42,0x28,0xc2,0x54,0x92,0x1f,0xb7,0x37,0xea,0x8, + 0xb1,0x7f,0x9b,0xda,0xb3,0xfe,0x87,0xc9,0xd0,0xb6,0xb5,0xd9,0xb6,0x97,0x52,0xcf, + 0xe3,0xef,0x2,0x5e,0xb1,0x78,0x45,0xe3,0xa6,0xc3,0xbd,0xc8,0x58,0x3b,0xc3,0xf9, + 0xa7,0x2f,0xc0,0xe2,0x81,0x5e,0x74,0xb2,0x1c,0x52,0x69,0x1c,0xec,0xe4,0xc8,0xa5, + 0x42,0x3b,0x11,0x68,0x67,0x2,0x5a,0xd3,0xb3,0x7a,0xa3,0x65,0xea,0x9,0xf8,0x99, + 0x46,0x2d,0xf5,0xdc,0xff,0x52,0xa6,0x31,0x4b,0x4,0x60,0x8c,0xd,0x2e,0x5a,0xd6, + 0xb8,0x26,0xea,0x65,0x2b,0x8f,0xe4,0x85,0x4e,0x9d,0xdb,0xf,0x6,0x60,0x4e,0xb3, + 0x5,0x80,0x30,0xd0,0xdb,0x3,0x30,0x3,0x3a,0x11,0xa1,0x93,0x9,0x4b,0x8c,0xc, + 0xed,0x54,0x20,0xcd,0x15,0xda,0xa9,0x38,0xe6,0x37,0xde,0x2d,0xf5,0x9c,0xda,0xaf, + 0xf6,0xd4,0x32,0xd,0x17,0x43,0xec,0x7f,0x29,0xb0,0x3c,0xa,0x2,0x30,0xc6,0x2, + 0x0,0x97,0x9e,0x72,0x36,0x7f,0xc7,0x91,0xbc,0xc8,0x40,0x5f,0xf,0x38,0xb,0x81, + 0xc2,0x9d,0x90,0x3d,0xcc,0x63,0x6,0xc2,0x9c,0x26,0x37,0xc4,0xe8,0x6b,0x55,0xbe, + 0x37,0xd1,0xc9,0xd1,0x4e,0x73,0x74,0x52,0x81,0x76,0x22,0x8f,0x99,0x14,0x3d,0x73, + 0x82,0x5,0x3d,0x73,0x82,0x5,0x7e,0xa6,0xe1,0x52,0xcf,0x9d,0x4f,0xe5,0x7b,0x5e, + 0xca,0x34,0x8e,0x4e,0x1,0xae,0x5a,0x76,0x61,0xe3,0x2d,0x47,0x9a,0xf6,0x35,0x1b, + 0xd,0x10,0x71,0x4b,0x1e,0x8f,0x4,0x84,0xa,0xd8,0xd5,0x3,0x5,0x21,0xa6,0x93, + 0xc2,0xa8,0xc4,0xb3,0x21,0x45,0x3d,0xf5,0x9c,0x21,0xd3,0x28,0x14,0xe2,0x64,0xcd, + 0x34,0xc2,0x19,0x8a,0x3e,0xd7,0xcc,0x3b,0x25,0xbc,0xfe,0x48,0x5f,0xa4,0x19,0x36, + 0x0,0xf0,0x42,0xee,0xcb,0x7f,0x74,0x8,0x52,0xd8,0xaf,0x11,0x59,0x57,0x51,0x1e, + 0x3,0x7d,0x3d,0x96,0x14,0xe5,0x6b,0xcc,0x6,0x29,0x16,0x9c,0x1e,0x76,0x4d,0x3d, + 0x87,0x37,0x89,0x3d,0xb6,0xa7,0xb1,0xfd,0x64,0x4b,0x3d,0xbb,0x29,0xc0,0xd5,0xa7, + 0x9d,0x1b,0xae,0xe2,0x1c,0x3d,0x47,0xfa,0x22,0x73,0x5a,0x7d,0x0,0x85,0xd3,0xad, + 0xdd,0x8b,0x1,0x7c,0x52,0x30,0xd6,0x85,0x4,0x38,0x84,0x5a,0x30,0x9f,0x14,0xe5, + 0x6b,0x4d,0x74,0x32,0x1c,0xec,0xe4,0x68,0xa7,0xa2,0x88,0x2b,0x8e,0x95,0x10,0xd7, + 0xbe,0xb7,0x7f,0x5a,0xea,0x79,0x32,0x34,0xb9,0xba,0x11,0xe0,0x15,0x73,0x17,0x5, + 0xd7,0x1f,0xd5,0x8b,0xb0,0xb0,0x70,0x1,0x60,0xee,0xd4,0xc5,0xda,0xed,0x63,0x42, + 0x1d,0xf0,0x9a,0x5a,0xd4,0x9,0x41,0x55,0x42,0x55,0x95,0xa2,0xa7,0x78,0x2e,0x95, + 0x46,0x3b,0x15,0x38,0xd8,0xc9,0xad,0x62,0xc8,0xa3,0xaa,0x4f,0x1c,0x45,0x93,0x6b, + 0x27,0x80,0x3,0x2f,0x86,0x4c,0x23,0x9c,0x9d,0x97,0xe1,0x0,0x82,0x8a,0xc4,0x93, + 0x63,0x2,0xa8,0x20,0x5,0xdc,0x57,0xa9,0x8b,0xa5,0x5b,0x55,0xa0,0x1a,0xf8,0x15, + 0xb5,0xa8,0xc5,0x14,0xac,0xa6,0x14,0x8d,0x80,0x63,0x7e,0x5f,0x88,0xf9,0x9e,0xfb, + 0x48,0x85,0x34,0x81,0x66,0x22,0x6c,0xc0,0x79,0xe4,0xae,0x63,0xa6,0x26,0xd7,0xce, + 0x27,0xc5,0x96,0x1d,0x6b,0xb3,0xdd,0x2f,0x86,0x26,0xd7,0xac,0x10,0xa0,0x19,0xb6, + 0x40,0xc4,0xac,0xf9,0x13,0x18,0x63,0x55,0xcb,0x2e,0x80,0x63,0x16,0x3e,0xf2,0xd4, + 0xe2,0xd0,0xa4,0x20,0x2a,0x15,0x84,0x79,0x44,0x71,0xae,0x85,0x99,0x72,0x56,0x55, + 0x29,0xbc,0xa3,0xd5,0xe0,0x58,0x32,0x10,0x1,0x3,0x34,0x2d,0x9e,0x70,0x84,0x38, + 0x52,0xd7,0x51,0x27,0xc4,0x8b,0xa1,0xc9,0x35,0x6b,0x4,0xb0,0xf8,0x5a,0x2b,0xee, + 0xe6,0xcf,0x19,0x18,0x43,0x4d,0xda,0x9d,0x5a,0x1c,0x9a,0x14,0xc,0x5e,0xa0,0x48, + 0xb5,0xd7,0x60,0x35,0xf2,0xb0,0x9a,0x5b,0xa9,0x90,0x42,0x57,0x82,0xcc,0x65,0xb, + 0xcd,0x5f,0x4f,0x73,0x59,0xb8,0xe,0x47,0x8c,0x63,0xc9,0x34,0xe,0xd1,0xe4,0xda, + 0x40,0x44,0x1b,0x5e,0xb4,0x4,0x20,0x70,0xf,0x1c,0xab,0x2,0xf0,0x54,0x60,0x5a, + 0x30,0xe8,0xc9,0xf8,0xc,0x6a,0x41,0x9e,0xc5,0x53,0xcd,0x93,0x4c,0x73,0xb,0x8c, + 0xe,0x1d,0x77,0x30,0xaa,0x12,0x8d,0x4a,0x32,0x30,0x68,0xf4,0x44,0x1c,0xad,0x28, + 0xc2,0xa2,0xb9,0xbd,0xd3,0x54,0xc2,0xc4,0x13,0xf9,0x11,0xc5,0x12,0x33,0x35,0xb9, + 0x9e,0x7e,0x20,0x7b,0x94,0x31,0xf6,0xa9,0x13,0x91,0x4,0xb3,0x43,0x0,0x62,0x55, + 0xc0,0xdd,0xc5,0x2e,0xa4,0x99,0x95,0x2a,0x50,0xc9,0x39,0xa7,0xab,0x85,0x1,0x9d, + 0x15,0x34,0x61,0x96,0x54,0x8c,0xd5,0x82,0x42,0x56,0x9,0x2d,0xa,0x86,0x30,0xf, + 0x7c,0xb2,0xaf,0x67,0xfe,0x86,0xb6,0x3f,0xaf,0x4b,0xa5,0x2a,0x48,0xa4,0x8b,0xdf, + 0xa3,0x5a,0x2a,0xba,0x6c,0xa1,0x8d,0x25,0x72,0x85,0x89,0x38,0xc3,0xc1,0x4e,0x86, + 0x89,0x4e,0x7e,0xc4,0x6e,0x63,0xc1,0xe9,0xe1,0xca,0xb,0xae,0x6,0xbe,0xfd,0x97, + 0xb8,0x8,0xc0,0x8b,0x8f,0x0,0x21,0xf,0x1,0x62,0x6,0xe3,0x12,0xb6,0x2,0x78, + 0x56,0xd3,0xa,0xf2,0x64,0xbe,0xfc,0x25,0xe7,0xcb,0x51,0x95,0x79,0xc6,0xaa,0xca, + 0xe0,0x81,0xce,0xea,0xcf,0x6b,0x59,0x5,0x2b,0xfe,0x1a,0x79,0xe0,0xea,0x82,0x40, + 0x64,0xad,0xbf,0x42,0x4,0x18,0x22,0x50,0x97,0xfa,0x44,0xab,0x11,0x60,0xc9,0x40, + 0x3,0x4b,0x6,0xfa,0x0,0x0,0x52,0x29,0x4c,0x74,0xf2,0x82,0x10,0xcf,0xa6,0xac, + 0xfd,0x82,0x26,0x40,0x6f,0xb3,0xcf,0xa4,0x80,0x84,0x69,0x92,0xcf,0x3c,0xe1,0xad, + 0x9,0xc4,0x34,0x35,0x20,0x46,0x60,0x15,0xec,0x59,0x19,0x3,0x58,0x22,0xb0,0x42, + 0x1c,0x8c,0x22,0x30,0x54,0xdd,0x42,0x55,0x5d,0xaa,0xe9,0xa3,0xb,0x26,0xc9,0xb3, + 0x74,0x82,0x6,0x15,0xa0,0x57,0xe3,0x84,0x6a,0xfc,0x50,0x8b,0x27,0x18,0x21,0xe4, + 0x1,0x16,0xf5,0x37,0xac,0xdb,0x0,0x84,0x52,0x38,0x70,0x30,0x29,0x8,0x91,0x4b, + 0x75,0x72,0x10,0xc0,0x18,0x67,0xd5,0xce,0x19,0xf9,0xd0,0x33,0xd4,0xf4,0xbc,0xb0, + 0x56,0xf2,0xfd,0x79,0x91,0x45,0x58,0xb9,0x77,0x3e,0x9f,0x95,0x64,0xb1,0xdf,0x9d, + 0x7e,0x66,0x1e,0xc7,0x98,0xa7,0x6,0xbe,0xd4,0x33,0x14,0xa0,0x3b,0x5,0x30,0x4, + 0x30,0x67,0x46,0xe5,0x73,0x56,0xa8,0x85,0xae,0xc4,0xe,0xe5,0x7b,0x9d,0x4e,0x8a, + 0x6,0xf,0xb0,0x74,0x7e,0x3,0x4b,0xe7,0x1b,0x82,0x8c,0x4e,0x26,0x78,0x6a,0xd7, + 0x18,0xd4,0xb3,0xec,0x82,0xbe,0x30,0xea,0x0,0xae,0x8,0x54,0x91,0x79,0x56,0x2b, + 0xf4,0x38,0x97,0xe0,0x11,0x83,0x15,0xee,0x1c,0xcc,0xa,0x75,0x1,0x3e,0x73,0x15, + 0x6,0x6,0x10,0x3,0x67,0xe,0x74,0x6,0xc6,0x3c,0x42,0xb8,0xc7,0x4e,0x25,0xe0, + 0x13,0xa7,0xea,0xeb,0xb,0x15,0x60,0x6,0x60,0xd,0x2,0x91,0x2e,0x94,0xc0,0x29, + 0x0,0x81,0xa,0x42,0x80,0x69,0x2f,0x30,0x9d,0xde,0xcb,0x98,0x89,0x14,0xb,0xfb, + 0x43,0xf4,0xf7,0x74,0x30,0xd1,0x49,0x5f,0xfc,0x4,0xa8,0x54,0x7a,0x19,0xf3,0xea, + 0x3f,0xd3,0x74,0xdf,0xe4,0x7,0x8c,0xaa,0xc9,0x80,0x97,0x9,0x30,0xcf,0xab,0x73, + 0xfb,0x98,0x33,0x3,0x7c,0x71,0x2e,0x80,0x67,0x15,0x2,0xb0,0x9a,0xa7,0x61,0xcc, + 0xb7,0xdf,0xba,0xf4,0x13,0x18,0x69,0x10,0xd3,0xd0,0xf6,0x4c,0x64,0x68,0x1,0x72, + 0x84,0xe0,0x96,0x34,0xba,0x4b,0xc9,0x9a,0xe,0x41,0xa,0xe3,0xcb,0xe6,0xb4,0x5a, + 0x2f,0x7e,0x2,0x18,0xc1,0x64,0x75,0x9c,0xa7,0x1,0xf,0xcf,0x42,0x89,0x58,0x45, + 0xb2,0x41,0xc6,0xfa,0x79,0x45,0xee,0x59,0x41,0x2,0x66,0xcf,0x1c,0x1c,0x8c,0x19, + 0x22,0x70,0x17,0x7,0x30,0x86,0x80,0x31,0x4c,0x1c,0xcc,0x30,0xbc,0x3f,0x41,0x92, + 0xa,0x8c,0x4d,0xa4,0x46,0x59,0x98,0x75,0x33,0x1c,0x68,0x35,0x39,0x6,0xe6,0x36, + 0x31,0x6f,0x6e,0x84,0x53,0x17,0xb5,0x10,0x4,0xc,0x9c,0x69,0x68,0x22,0x30,0xa6, + 0xa0,0x89,0x40,0x4c,0x3,0xa4,0xa0,0x99,0x21,0x1,0xa0,0xad,0x8b,0xd3,0x56,0x19, + 0x6a,0xf5,0xd,0x6,0xb0,0x43,0x90,0x82,0x83,0x9f,0x1c,0x95,0x40,0xa2,0x5a,0xc, + 0x30,0xcd,0x15,0x4c,0x27,0x6,0x63,0x2e,0x2c,0x60,0x35,0xe5,0x60,0x85,0x75,0x73, + 0xc6,0x4b,0x2,0x38,0xe0,0x19,0x7,0xb7,0xa0,0x1f,0x18,0x49,0xb0,0x65,0xeb,0x14, + 0x76,0xec,0x6a,0x23,0x17,0xba,0x7c,0x19,0xe6,0x3a,0x90,0xa5,0xef,0x37,0xf1,0x47, + 0x5c,0x58,0xe8,0xc0,0xbc,0x26,0x56,0x9e,0x35,0xf,0x67,0x2e,0x9b,0x83,0xa0,0x11, + 0x80,0x41,0x43,0x93,0xb2,0x65,0x6d,0x6d,0x95,0x40,0xd9,0x4f,0xc1,0xad,0xa,0xe8, + 0xea,0x7,0x21,0x3a,0x24,0x29,0x9a,0x8d,0xd6,0xc9,0x42,0x80,0xe9,0x36,0xcf,0x66, + 0x0,0xde,0x5,0x69,0x64,0x5d,0x4,0xb1,0x32,0xa0,0x43,0x1,0xb7,0xb3,0x78,0x7, + 0xb8,0x3,0x9d,0x23,0xe0,0xc,0xdb,0xb7,0xb5,0xb1,0x76,0xfd,0x38,0x26,0xdb,0xd2, + 0x2,0x1e,0x80,0x21,0xf4,0xb2,0x46,0xaf,0x40,0x44,0xa8,0xf6,0xc,0x2c,0x31,0x26, + 0xc6,0x14,0x1e,0x1d,0x1f,0xc5,0xea,0x35,0x23,0x38,0xfb,0xcc,0xb9,0xb8,0xe8,0x82, + 0xf9,0x68,0xf5,0x44,0xd0,0xd0,0x50,0xa4,0xc0,0xa0,0xa1,0xc0,0x4d,0xaa,0x48,0xda, + 0x16,0xbb,0xf4,0xc,0xcd,0xac,0x6a,0x2c,0xe0,0xbe,0x1a,0x5,0xd1,0xc9,0x91,0x5, + 0x68,0x9a,0x9e,0x82,0xf9,0xa4,0x60,0x95,0xdc,0x1c,0x95,0x68,0x9f,0x51,0x69,0xb6, + 0xcc,0x4a,0x3c,0xb3,0x80,0x57,0x80,0x67,0xc,0xa3,0xa3,0x19,0x1e,0x79,0x64,0xc, + 0x63,0x63,0xc2,0xb8,0x2,0x1e,0xd9,0x40,0x9f,0x81,0xf1,0x2,0xef,0xb2,0x3f,0x40, + 0xf5,0x4a,0x20,0x15,0x19,0x0,0x40,0x60,0xda,0xf8,0xfc,0xa1,0x2d,0x31,0x76,0xee, + 0x4c,0x70,0xfe,0x79,0x3,0xb8,0xf0,0x82,0x1,0x30,0x28,0x28,0x58,0x35,0x20,0x65, + 0xc3,0x45,0xd,0x10,0xb7,0xbf,0xdb,0xc5,0x1d,0x90,0x9f,0x2,0x93,0x57,0x21,0x7d, + 0x91,0x13,0x80,0x6a,0x9f,0xbf,0x5e,0xb,0xaa,0x25,0x1,0x60,0x64,0xc3,0x38,0x97, + 0x1,0xb0,0x32,0xa9,0xb3,0x5e,0x1e,0xdc,0xfb,0x2f,0x60,0xc,0x21,0xe7,0x78,0xfc, + 0xb1,0x71,0xac,0x5f,0x3f,0x5,0xce,0x39,0x38,0x8b,0xc,0x1,0x88,0x5b,0x45,0x61, + 0x45,0xd6,0xc7,0xfc,0xc2,0x52,0xad,0x1e,0x40,0x15,0x1f,0xad,0x8b,0x33,0x48,0x23, + 0xcf,0x8,0xeb,0xd6,0x1f,0xc4,0xee,0xdd,0x9,0xae,0xbc,0x62,0x11,0xfa,0xe7,0x9a, + 0x29,0x27,0x2,0x7,0x41,0x81,0xd9,0x98,0x80,0x48,0xdb,0x17,0xd5,0x95,0xf,0x49, + 0x5d,0x5a,0xdb,0x44,0xfc,0x24,0x73,0x1,0xb5,0xa0,0x9f,0x55,0xeb,0x3e,0xd6,0xdf, + 0x3b,0xd9,0x47,0x25,0xb3,0x67,0x3e,0xf4,0x8c,0x81,0xb3,0x0,0x1,0xe7,0xc8,0x13, + 0x85,0xbb,0xef,0xd9,0x8f,0xf1,0x31,0x85,0x20,0x68,0x15,0xc4,0x28,0x52,0x42,0xaa, + 0xd5,0x1,0xa8,0x56,0x4,0xb2,0xcf,0xa9,0xa8,0x8,0xc2,0x3,0xdf,0x66,0x5,0x16, + 0x5c,0xd,0x8d,0xd1,0x11,0x85,0xbb,0xee,0xda,0x87,0x57,0xbf,0x7a,0x21,0x96,0x9f, + 0xd1,0xe3,0xd1,0x49,0x41,0xd9,0x92,0xb7,0x26,0xd7,0xee,0xf6,0x7d,0x3f,0xab,0xf4, + 0x43,0x18,0x0,0xce,0x1a,0x27,0x9,0x1,0x66,0xc8,0x0,0xa8,0xc8,0xd5,0x7d,0x16, + 0xb0,0xa2,0x58,0x54,0xa4,0x72,0x1e,0x5,0x18,0x63,0xe0,0x8,0xc0,0x19,0x47,0xfb, + 0xa0,0xc0,0x77,0xef,0x18,0x83,0x14,0xc,0x41,0xd0,0xac,0x28,0x3,0x77,0xe4,0xf1, + 0xdd,0x31,0xab,0x4d,0x18,0x79,0xe9,0x26,0xf7,0xdb,0xc8,0x45,0xb1,0xc7,0x94,0x83, + 0xc9,0xba,0x5,0xe,0x65,0x2,0x3f,0xd2,0x78,0xf0,0x81,0x9,0x8c,0x8d,0xa,0xbc, + 0xfc,0xb2,0x79,0x8,0x48,0xd9,0x56,0x93,0x82,0x32,0x14,0xb0,0x61,0x46,0x17,0x17, + 0x30,0xad,0x7,0x72,0x32,0x54,0x2,0x67,0x28,0x76,0xd9,0xc,0xaf,0x8,0xf8,0x8a, + 0x69,0x21,0x2,0x88,0x55,0xa1,0x37,0x96,0xcf,0x11,0xb0,0x0,0x81,0x3,0xff,0x9b, + 0x63,0x50,0x2a,0x44,0x18,0x86,0xe0,0x2c,0x28,0x2,0xc2,0x92,0x38,0x55,0x3f,0x44, + 0x5e,0x27,0x90,0x6a,0xfd,0x3,0x62,0x54,0x93,0x89,0x32,0x53,0x70,0x75,0x4b,0x22, + 0xd,0x66,0x7d,0x3e,0x48,0xe1,0xe9,0x27,0x53,0x64,0x29,0x70,0xc5,0xab,0xe7,0x19, + 0x67,0x41,0xc,0xc,0xaa,0x8c,0x63,0x48,0xa3,0x32,0xfc,0xe2,0x55,0x35,0x9,0xc0, + 0xdc,0xd6,0xfc,0x93,0x23,0x6,0x38,0xa2,0x4d,0x46,0x18,0x2b,0x9b,0x43,0x8c,0x79, + 0x35,0x3b,0x13,0xf4,0x95,0xc1,0x1f,0x47,0x7b,0x52,0xe0,0xce,0x7f,0x1d,0x87,0x94, + 0xd,0x44,0x8d,0x6,0x2,0x16,0x22,0x60,0x41,0x11,0x1c,0x3a,0x2,0xb8,0xf6,0xb2, + 0x3,0x8f,0x6c,0x4,0x4e,0x5d,0xd2,0xb3,0xa2,0x52,0xc8,0x0,0xc6,0x78,0x25,0x23, + 0x71,0x69,0xa3,0xa9,0xfe,0x85,0x80,0xcd,0x2,0x80,0x0,0x5b,0x37,0xb,0xf4,0xf6, + 0xc6,0xb8,0xf0,0x92,0x3e,0x68,0x26,0x6d,0xb1,0x8,0x36,0x45,0xe4,0x25,0xd1,0xca, + 0x28,0xd0,0x73,0x7d,0x74,0x92,0xb8,0x80,0x2e,0xa9,0x5e,0x25,0x16,0x28,0x93,0x7e, + 0x1b,0x9,0x5a,0x1f,0xe9,0xe5,0xfa,0xdc,0x5a,0x3e,0x29,0xc2,0x8f,0xee,0x9a,0x82, + 0xc8,0x1a,0x8,0xc3,0x8,0x1c,0xd,0x6b,0xfd,0x41,0xe1,0xf3,0x4b,0xc5,0xb5,0xd5, + 0x3b,0x22,0x7b,0xd6,0x96,0x8,0xb6,0xba,0x87,0xfa,0x78,0x19,0x3,0xe3,0x96,0x40, + 0x36,0xcb,0xf0,0x9f,0x33,0xab,0xa,0xc,0xa1,0x51,0x1,0x84,0x0,0x4,0x9e,0x78, + 0x3c,0x45,0x6f,0x6f,0x88,0x33,0x56,0xb4,0x40,0x8c,0x81,0x93,0xb2,0x24,0xd0,0x5e, + 0x89,0xb9,0x1c,0x5c,0x20,0xd6,0xed,0x42,0xbc,0x68,0x9,0x60,0x0,0xa8,0xcb,0x2, + 0x63,0xac,0x9a,0xc,0x54,0x52,0x3e,0x78,0x65,0x5c,0x56,0x54,0xf7,0xc2,0x80,0xe1, + 0x47,0x77,0x4f,0x60,0xfc,0x0,0x43,0xd4,0x68,0xa2,0xc1,0x1b,0x8,0x83,0x46,0x21, + 0xff,0x8c,0x95,0x25,0x26,0xd2,0x1a,0x9a,0x18,0xb4,0xd6,0xc5,0xa1,0xb4,0x82,0xd6, + 0xa,0x9a,0x24,0x16,0x2f,0xd,0xb1,0xe4,0xf4,0x26,0x38,0x27,0xcc,0x5f,0xd0,0xc0, + 0xe8,0x88,0x49,0x1d,0xc7,0x47,0x5,0xf6,0xf,0x4b,0x88,0xc,0xe0,0x3c,0x0,0xe7, + 0x1,0x82,0x80,0x83,0x73,0x6e,0x88,0xc9,0x39,0xb8,0x2d,0x16,0x31,0xa6,0x1,0x16, + 0x80,0x18,0xc7,0xea,0x87,0x12,0xcc,0x9b,0x1f,0xa1,0x7f,0x20,0xb0,0xb5,0xcf,0x72, + 0xc8,0x85,0x48,0x57,0x9a,0x5f,0x27,0x3e,0xec,0xb3,0xec,0x2,0x4c,0x39,0x75,0xba, + 0x2c,0x94,0x80,0x31,0x23,0xaf,0x1e,0xf8,0x3e,0x9,0xb8,0xad,0xf4,0x3d,0xbd,0x26, + 0xc6,0xb6,0x67,0x8,0xcd,0xa8,0x85,0x46,0x10,0x21,0xc,0x1a,0x8,0x59,0x58,0x5, + 0x9f,0xc,0xf8,0xa4,0x1,0xa5,0x34,0x94,0x96,0x90,0x4a,0x42,0x29,0x89,0x53,0x97, + 0x72,0xac,0xbc,0xa0,0x85,0x73,0x2e,0xe8,0x31,0x3f,0xe7,0xf5,0x97,0x4f,0x3b,0xa3, + 0x51,0x29,0x23,0xef,0xdb,0x9b,0x61,0xf3,0xc6,0x14,0x9b,0x9f,0xce,0x10,0x6,0xd, + 0x4,0x21,0x10,0x4,0x1,0xc2,0x80,0x81,0xf1,0xc0,0x66,0x22,0x4,0xce,0x43,0x30, + 0xa,0x20,0x64,0x8e,0x87,0x7f,0xd2,0xc6,0xf5,0xbf,0x34,0x0,0xe,0x6d,0x5d,0x4, + 0xb3,0x75,0x5,0x56,0x19,0x7d,0xa7,0x93,0x89,0x0,0x20,0xe7,0x83,0xfd,0xd4,0xe, + 0xc5,0x40,0xa7,0x9,0xf1,0xc,0xf8,0xac,0xfc,0xa1,0x5a,0x3b,0x97,0x21,0x8b,0x15, + 0x7e,0xfe,0xd3,0x1c,0x8d,0xa0,0x7,0x8d,0xa0,0x89,0x30,0x88,0x10,0xf2,0x10,0x1, + 0xf,0x8c,0x9a,0x10,0x8c,0xb4,0x6b,0x5,0xa5,0x8,0x52,0x29,0xe4,0x22,0x87,0x94, + 0x39,0x6,0x16,0x69,0xc,0xae,0x9a,0x83,0xc5,0xa7,0x87,0xd0,0x44,0x10,0x4a,0x96, + 0x59,0xbf,0xd7,0x56,0xe6,0x5e,0x89,0x79,0xd1,0x92,0x8,0xa7,0x9e,0xd6,0xc4,0x65, + 0x83,0xa,0xf,0xdd,0x37,0x89,0xed,0x43,0x39,0xa2,0x46,0x4,0x44,0x1,0xc2,0x80, + 0x83,0x7,0x36,0xe0,0x84,0x6,0x78,0x8,0xf0,0x0,0x93,0xa3,0x31,0x36,0xac,0x8e, + 0x71,0xc1,0xa5,0x2d,0x30,0xa6,0x6d,0xc9,0xd7,0x4a,0x3f,0x95,0x7d,0xce,0x17,0x12, + 0x3,0x66,0xa9,0x1d,0x4c,0x95,0x7e,0x1f,0x98,0xd7,0xd,0x64,0x7e,0x5d,0x88,0x57, + 0x62,0x42,0x5f,0xfa,0x7f,0xfa,0xfd,0xe,0x94,0x88,0xd0,0x6a,0x19,0xf0,0x3,0x1e, + 0x21,0xe0,0x46,0xfa,0x4d,0xdd,0x45,0x43,0x6b,0x18,0xf0,0x85,0x42,0x2e,0x4,0xb2, + 0x3c,0xc3,0xcb,0x2e,0xb,0x30,0xf8,0xda,0xb9,0xd0,0xa4,0x91,0x2b,0x59,0xc4,0x3, + 0x84,0xfa,0x44,0x2,0x2b,0x2,0x48,0xce,0x74,0x51,0x61,0x6c,0xf6,0x72,0xbc,0xe1, + 0xcd,0xb,0xb0,0xe5,0x99,0xe,0x1e,0xfc,0x51,0x82,0x3c,0xe3,0x60,0x91,0x29,0x2d, + 0x23,0x8,0xc0,0x59,0x68,0x49,0xc0,0x11,0x72,0xc2,0xfa,0x47,0xda,0x38,0xf3,0x9c, + 0x26,0xc2,0x5e,0x6e,0x8b,0x43,0xcc,0xc6,0x1f,0x95,0xf1,0x97,0x17,0x8c,0x1b,0x98, + 0x5,0x17,0x60,0x82,0xaf,0xba,0x2a,0x70,0xc6,0x2a,0xc5,0x5f,0x2a,0x82,0x0,0x42, + 0x35,0x7,0x0,0xe,0xec,0xce,0xb1,0x6d,0x23,0xa1,0xb7,0x27,0xb2,0xd2,0x6f,0xe4, + 0x9f,0x73,0x6e,0xad,0x9f,0x8c,0x8f,0x97,0x6,0xfc,0x4c,0xe4,0xc8,0xb2,0xc,0x57, + 0x5f,0xdf,0xc4,0x8a,0xb,0x1b,0xc8,0x95,0x80,0x22,0xd3,0xd9,0x73,0x47,0x1,0x6, + 0x95,0xad,0x62,0xee,0x95,0x99,0x3,0xce,0xa1,0x19,0x21,0xb0,0xd3,0x42,0x67,0x9f, + 0xdb,0x8b,0xf9,0xb,0x1a,0xb8,0xf3,0x5f,0xa6,0x90,0x67,0x1c,0x1c,0x21,0x2,0x16, + 0x82,0x7,0x1,0xc0,0x3,0x80,0x38,0xa2,0x80,0x20,0xb9,0xc2,0xea,0xfb,0x63,0x5c, + 0x75,0x43,0x2f,0x14,0xe3,0xa5,0xa,0xc0,0x94,0xc4,0x5f,0x68,0x6e,0x60,0x56,0x6a, + 0x95,0x85,0xd5,0x15,0xd6,0x67,0x81,0xa8,0xc,0x5e,0x52,0xd7,0xcb,0x12,0x86,0x84, + 0x47,0x7e,0x9c,0x21,0xe4,0x4d,0x84,0xdc,0x82,0xcf,0x23,0x4,0xcc,0xa4,0x7f,0xc, + 0x1c,0x20,0x6,0xad,0x8,0x52,0x2a,0xe4,0x79,0x8e,0x34,0xcd,0xf0,0xea,0xeb,0x42, + 0x9c,0xf5,0xb2,0x10,0x42,0x29,0x8,0xad,0xcc,0x59,0x49,0x8,0xa5,0x20,0x95,0x82, + 0x50,0x1a,0x52,0x29,0x48,0xd2,0x90,0x5a,0x41,0x6a,0x6d,0x49,0x62,0xe,0x13,0x30, + 0x12,0x94,0xd6,0xf6,0x67,0x34,0xe6,0x2d,0xc,0x71,0xe3,0xbf,0xef,0x87,0xd2,0x19, + 0xb2,0x4c,0x40,0x4a,0xd,0xd2,0x1c,0x8c,0x42,0xfb,0xde,0x5a,0x88,0xc2,0x16,0x76, + 0x6f,0x61,0x98,0x18,0x51,0x45,0x3d,0xd2,0xc5,0x26,0x46,0xd,0x50,0x39,0x4e,0xa, + 0x2,0x90,0x67,0x79,0x4,0x9f,0xc,0xba,0x42,0x8a,0x72,0xfe,0x83,0xc0,0x99,0xa9, + 0xce,0xed,0xdb,0x99,0x61,0xcf,0x56,0x66,0x2c,0x3f,0x6c,0x9a,0x80,0x8c,0x37,0x4c, + 0xf0,0xc5,0x2,0x90,0x66,0x50,0x52,0x1b,0xcb,0x4f,0x73,0x24,0x49,0x86,0x57,0xbf, + 0x91,0xe3,0xec,0x97,0x5,0x6,0x70,0x2d,0xcb,0xb3,0x36,0x24,0x90,0xda,0x1c,0x4a, + 0x2b,0xb,0xb4,0x3,0x9e,0xa,0x2,0xb8,0xb4,0x51,0xc3,0x12,0x82,0x14,0x94,0xd6, + 0x18,0x58,0x18,0xe2,0xc6,0xff,0xd0,0xb,0xa5,0x53,0xe4,0x99,0x84,0x52,0xa6,0x9, + 0xc4,0x59,0x88,0x30,0x88,0x6c,0x8c,0xd2,0x83,0x8d,0x8f,0x8b,0x4a,0xc7,0xd3,0xa8, + 0x94,0xb9,0x6,0x4a,0x9b,0x43,0x9f,0xc,0x4,0x20,0xef,0xa2,0x96,0x17,0x57,0x97, + 0xc5,0x19,0x6f,0x14,0x8b,0xd5,0xc6,0x47,0x38,0x7,0x9e,0x5a,0x2d,0xd0,0x8,0x9b, + 0xf6,0x30,0xa,0x10,0x4,0x21,0x2,0x6e,0xac,0x9f,0xac,0xdf,0x17,0x42,0x22,0x4b, + 0x73,0x9c,0x71,0x9e,0xc4,0xd9,0x17,0x5,0x16,0x70,0xb,0xbe,0x92,0xc6,0xda,0x95, + 0x34,0x59,0x81,0xd6,0xc6,0xb2,0x5d,0x7a,0xe8,0xc6,0xbe,0x2c,0xf0,0xce,0x75,0x4d, + 0x8c,0x8,0x3c,0x78,0xcf,0x54,0x45,0x15,0x24,0x29,0xc,0x2c,0xc,0x71,0xe5,0xeb, + 0x2,0xa4,0x49,0x2,0x91,0x4b,0xbb,0xbb,0x49,0x80,0x80,0x47,0x68,0x4,0x4d,0x34, + 0xc2,0x16,0xb6,0x3d,0x9,0xc4,0x53,0xba,0x92,0xf4,0x51,0xcd,0x18,0xa6,0xb9,0xc6, + 0x17,0xaf,0xb,0x50,0x20,0x5b,0x43,0x27,0x6b,0x69,0xe4,0x5d,0xf4,0x6e,0xe3,0x53, + 0xc,0x4,0x52,0x12,0x1b,0x7e,0xae,0x4d,0xce,0xdf,0x68,0x56,0xfd,0x3f,0xe3,0x0, + 0x38,0xb4,0x26,0x48,0x21,0x91,0xa6,0x39,0x34,0x8b,0x31,0x78,0x6d,0xc3,0x4a,0xbc, + 0x1,0x5c,0x28,0x65,0x25,0x5e,0x9a,0xb3,0xb3,0xe6,0x1a,0x19,0xfd,0xc1,0x24,0x6, + 0x0,0x8a,0x70,0xcf,0x3f,0xc5,0x58,0xff,0x90,0xc4,0x13,0x8f,0xc4,0x5,0x91,0x9d, + 0x6a,0xac,0xbc,0x28,0xc2,0xe2,0xe5,0x39,0xe2,0x4e,0x2,0x91,0x2b,0x90,0x66,0x8, + 0x58,0x88,0x46,0xd8,0x44,0xb3,0xd1,0x83,0x46,0xa3,0x17,0x3b,0x37,0xa9,0xf2,0xf5, + 0xec,0x67,0x2e,0x3e,0x3b,0x19,0xf2,0x9d,0x4,0x4,0xa0,0xa2,0xf2,0xa6,0xa1,0xc, + 0x19,0xa0,0xab,0x6e,0xc0,0xeb,0xbe,0x15,0x4a,0xc0,0x80,0x2d,0x4f,0xe6,0x8,0xb9, + 0x9,0xfc,0x1c,0xf8,0x41,0x10,0xda,0xaa,0x1f,0x7,0x29,0x94,0xd2,0xdf,0x49,0xf0, + 0xca,0x6b,0x38,0x82,0x48,0x43,0x68,0x1,0x69,0x25,0xdf,0xc9,0xbd,0xb4,0xc0,0x29, + 0x6d,0xdf,0x3,0x95,0xc3,0x1b,0x6e,0x20,0x84,0x31,0x3b,0xdb,0x23,0x8,0xdf,0xfe, + 0x6a,0x8c,0x78,0xb2,0x81,0x28,0x6c,0xe1,0xc1,0xbb,0x73,0x8c,0xc,0xe7,0xa5,0xa, + 0x68,0x5,0xa5,0x34,0x5e,0xfd,0xc6,0x8,0x53,0x53,0x1d,0xa4,0x49,0x6,0x25,0x34, + 0x38,0x2,0x4,0x41,0x13,0x8d,0xb0,0x7,0xcd,0xb0,0x7,0x5b,0x9f,0xa0,0xca,0x82, + 0x12,0x22,0xef,0x5a,0xd8,0xe3,0x45,0x4f,0x0,0xe5,0xd,0x4c,0x94,0x3e,0xdf,0x90, + 0xa1,0x18,0xad,0x76,0x83,0x95,0x6e,0xb1,0x5,0x23,0x4,0x81,0xc6,0xa6,0x75,0xd2, + 0x0,0xce,0x3,0xdb,0xf,0xe0,0xb6,0xc6,0x6f,0x82,0x3e,0xa5,0x14,0x44,0x2e,0x90, + 0xa6,0x19,0x1a,0xbd,0x6d,0xac,0x7c,0x39,0x87,0x50,0xc2,0x4a,0xbf,0x80,0x54,0x2, + 0x52,0xb,0x23,0xff,0x5a,0x41,0x59,0xe0,0x8d,0xe5,0x9b,0xc7,0xce,0xed,0x70,0x6, + 0x4,0xc,0x68,0x84,0xc0,0x23,0xf7,0x64,0x38,0xb8,0xbf,0x89,0x56,0xd4,0x8b,0x66, + 0xd4,0x83,0x66,0xa3,0xf,0xdf,0xfb,0x3f,0x9,0xd2,0x54,0xda,0x78,0xc0,0xb8,0x97, + 0x9e,0x39,0x1c,0x2b,0x2e,0x12,0x48,0x93,0x14,0x52,0x9a,0x1,0x91,0x90,0x87,0x88, + 0xc2,0x26,0xa2,0x46,0xb,0x53,0xa3,0x4d,0x74,0xe,0x52,0x2d,0x23,0xa2,0x93,0x8b, + 0x0,0x42,0x25,0x26,0xf8,0xd1,0x54,0x89,0x7,0xaa,0x1,0xa0,0x2e,0xa7,0x6b,0xed, + 0x8a,0xde,0x20,0xd4,0xd8,0xb8,0x46,0xba,0x19,0xdf,0x22,0x9f,0x56,0x36,0xda,0x17, + 0x42,0x22,0xcb,0x72,0x24,0x49,0x8a,0x4e,0xa7,0x83,0x97,0xaf,0x82,0xb5,0x7a,0x53, + 0xf9,0xab,0x58,0x3e,0x49,0x68,0x92,0xd0,0x64,0xac,0xdf,0x65,0x1c,0xa6,0x9c,0x6b, + 0x62,0x8d,0x80,0x3,0x21,0x7,0x1e,0xba,0x3b,0xc5,0xa6,0xb5,0xd,0xf4,0xb4,0xfa, + 0xd0,0x6a,0xf6,0xa2,0x15,0xf5,0xa0,0xd5,0xec,0x41,0xde,0x6e,0xe1,0x7,0xff,0xda, + 0x81,0x26,0x65,0x55,0x40,0x42,0x68,0x81,0x2b,0xae,0x89,0xd0,0x6e,0x77,0x90,0x67, + 0x39,0xb4,0x22,0x70,0x16,0x22,0x8,0x8c,0x72,0x44,0x61,0xb,0x3b,0x36,0x2a,0xdb, + 0x55,0x2c,0xfb,0x10,0xa5,0xa,0xd0,0xc9,0x11,0x3,0x10,0x14,0x34,0x54,0xa9,0x6, + 0xc5,0x85,0x50,0xde,0xcc,0x7d,0x39,0x77,0xf,0x68,0xec,0xdc,0x94,0xd9,0x89,0x19, + 0x6b,0xf1,0x36,0xd8,0x53,0x4a,0x43,0xa,0x69,0xa,0x3d,0x69,0x8e,0x38,0x4e,0x20, + 0x75,0x8c,0x73,0x5f,0xd1,0x28,0x22,0xfb,0xc2,0xdf,0x3b,0xd9,0x27,0x55,0xa4,0xa2, + 0xf0,0xe5,0xde,0x1e,0x1,0x63,0x8,0x38,0xc3,0xd0,0xfa,0xc,0x1b,0x1e,0x6c,0xa0, + 0xaf,0xa7,0xf,0xad,0x66,0xf,0xa2,0x46,0xcb,0xc4,0x1e,0x61,0x13,0x51,0xd4,0xc2, + 0xf6,0xa7,0x19,0x1e,0xba,0xb7,0x3,0xa5,0x65,0x71,0xf4,0xf6,0x33,0x2c,0x3b,0xc7, + 0xbc,0xf,0x21,0x25,0x88,0x80,0x80,0x7,0x8,0x82,0x10,0x8d,0x46,0x84,0x7d,0x3b, + 0x6c,0x53,0xaa,0x70,0x85,0x36,0xfe,0xd0,0xa,0x4a,0xcb,0x93,0x24,0x8,0xb4,0x4d, + 0x18,0x22,0x65,0x9a,0x34,0xe8,0x96,0x15,0x94,0xcb,0xb0,0x0,0x8d,0x1d,0x9b,0xf2, + 0x22,0xc7,0x27,0x82,0xf9,0x3d,0xa5,0xa1,0xa4,0x84,0x90,0x12,0x79,0x66,0x8a,0x3d, + 0x49,0x92,0xe0,0x9c,0x4b,0x7d,0x5f,0xef,0xfc,0xbd,0xb4,0xc0,0xab,0x92,0x6c,0x76, + 0xb2,0xc7,0x58,0xbe,0x95,0x7d,0x6e,0xa4,0x7f,0xe7,0xc6,0xc,0xdf,0xfb,0xba,0x46, + 0xab,0xd5,0x87,0x28,0xea,0x41,0x23,0x6c,0x22,0x8,0x4c,0xaa,0x69,0x66,0xff,0x38, + 0x18,0x42,0x3c,0x74,0x77,0x8e,0x1d,0x9b,0x33,0xf3,0x77,0x6c,0x86,0x71,0xee,0xa5, + 0x84,0xa9,0xc9,0x36,0xd2,0x38,0x45,0x9e,0xe7,0x90,0x52,0xdb,0x36,0x76,0x80,0x7d, + 0xdb,0x5c,0x1e,0xa8,0x40,0x70,0x2e,0xc8,0xbc,0xb7,0x5c,0x25,0x27,0x7c,0x2d,0x60, + 0x56,0x8,0x20,0x49,0x14,0x2a,0xa0,0x21,0x6d,0x20,0xa8,0xca,0xb8,0x0,0xe5,0x9c, + 0x3d,0x31,0xd,0x1e,0x68,0xec,0xd9,0x26,0xad,0xbf,0x7,0xc8,0xba,0x10,0xa5,0x34, + 0xa4,0xd4,0x90,0xb9,0x44,0x9e,0xb,0x64,0x69,0x86,0x24,0x4e,0xb1,0xe4,0x4c,0x66, + 0x3,0x3c,0x63,0x95,0x5a,0x5b,0xb9,0x2f,0x2,0x3e,0x55,0xac,0xec,0x31,0x96,0x4f, + 0x8,0xac,0xcf,0xf,0x18,0x70,0x70,0xbf,0xc0,0xdd,0xff,0x20,0xd0,0xd3,0xea,0x35, + 0x8d,0xa6,0x30,0x42,0x10,0x4,0x45,0x9a,0xa9,0x95,0x86,0x52,0x1a,0x5a,0x6a,0x28, + 0xa9,0xb1,0x71,0x4d,0xe2,0x91,0x4d,0x60,0xe9,0xd9,0x1c,0xed,0xf6,0x14,0x3a,0x71, + 0x62,0xa,0x44,0xc2,0xf4,0x23,0x40,0xc,0x59,0x1c,0x60,0x6a,0x5c,0x16,0x9f,0xd5, + 0xbc,0x2f,0x73,0xce,0x65,0x7a,0xc2,0x2b,0xc0,0xac,0xf4,0x2,0xa4,0x4a,0xc1,0x82, + 0x66,0x31,0xd3,0xcf,0xad,0xad,0x33,0x68,0x10,0xb,0x8a,0x51,0x69,0x53,0x9a,0x35, + 0x99,0xf3,0xc8,0x5e,0x93,0x5f,0x93,0x26,0x13,0xf0,0x49,0xd,0x6,0xb3,0xa0,0x52, + 0x8,0x81,0x2c,0xcb,0x11,0xa7,0x29,0xd2,0x34,0xc1,0xd9,0x17,0x47,0xc8,0x95,0x84, + 0x22,0x59,0x48,0xbe,0xd2,0x54,0x99,0xcd,0xe5,0x6e,0x32,0x18,0xa6,0x8b,0x17,0x70, + 0x42,0xc0,0x1,0x52,0x1a,0xff,0xf8,0x97,0x31,0x9a,0xe1,0x7c,0xb4,0x5a,0xbd,0x88, + 0x22,0x93,0x69,0x0,0x1c,0xa4,0xb5,0x9,0x34,0x6d,0x8d,0x21,0x49,0x52,0x9c,0x7a, + 0xa6,0xc4,0x2f,0xdc,0xd4,0x3,0xa5,0x95,0x59,0x28,0xc2,0x2,0xf4,0x34,0x18,0x4e, + 0x39,0x23,0x45,0x7c,0x30,0x46,0xab,0xd9,0x3,0x6a,0x2,0x5a,0x29,0x68,0x65,0xd2, + 0xcb,0xc9,0x51,0x85,0x5,0x73,0xc,0xd1,0x4d,0x1c,0x62,0xea,0x10,0x4a,0xcb,0x13, + 0xbe,0x26,0x3c,0x6b,0x75,0x0,0x63,0x89,0x12,0xe4,0xc9,0xb2,0xc9,0xe,0x6a,0x59, + 0x2,0x34,0x78,0xa8,0xb0,0x6b,0x8b,0x32,0xd6,0x47,0x30,0xc5,0x1a,0xa5,0xa1,0xa4, + 0x82,0x94,0x12,0x42,0x8,0xe3,0x2,0xd2,0xc,0xf3,0x16,0x49,0xb,0x78,0xe9,0xef, + 0x4b,0xe9,0xb7,0xb2,0x4f,0x9e,0xec,0xf3,0x32,0xe2,0xd7,0x42,0xe1,0xeb,0x7f,0x3e, + 0x5,0xc8,0x5e,0x34,0x9b,0xd6,0xf2,0x79,0x68,0x94,0x47,0x9b,0x25,0xde,0x79,0x26, + 0x6c,0xa0,0x19,0x23,0x6c,0x25,0x78,0xf3,0x6f,0x34,0xa0,0xc8,0x64,0x17,0x26,0xdd, + 0x14,0x90,0x4a,0x62,0xe1,0x69,0x2,0x9d,0x4e,0x8c,0x34,0xc9,0xac,0x1b,0x30,0x55, + 0x42,0x22,0x60,0xdf,0x4e,0xa7,0x0,0xd2,0xcc,0xd,0x16,0xa,0x65,0x62,0x0,0xfd, + 0x62,0x57,0x0,0xb2,0x3e,0xdf,0xc6,0xf2,0xe0,0x60,0x66,0x1,0x26,0x71,0x9b,0x9, + 0xc0,0xdb,0x43,0xc8,0x5c,0xe,0x27,0xfb,0x5a,0x19,0xdf,0xaf,0xb5,0x82,0x84,0x89, + 0x5,0xc,0x9,0x4c,0x1c,0x70,0xfa,0xa,0x6d,0xfd,0xbd,0xac,0x82,0xef,0x5a,0xd0, + 0x76,0xc4,0x8b,0x31,0x20,0xe0,0xc,0x21,0x27,0x84,0x9c,0x10,0x45,0x84,0x6f,0xde, + 0xd6,0xc1,0xd8,0x70,0x2f,0xe6,0xcd,0xeb,0x45,0x33,0x6a,0xa2,0xd1,0x68,0x98,0x71, + 0x30,0x2,0x94,0x36,0x29,0x66,0x92,0x24,0xe8,0xb4,0x3b,0xc8,0xe5,0x14,0x7e,0xe9, + 0xb7,0x2,0x84,0x2d,0x53,0x49,0x24,0x3b,0xcf,0xc0,0x58,0x8,0x49,0xc0,0xc2,0xd3, + 0x8,0x4f,0x24,0x9,0xd2,0x2c,0xb3,0xb1,0x83,0xa9,0x51,0x28,0xa9,0x91,0x76,0x54, + 0x19,0x0,0x6a,0x69,0x2a,0x8f,0x5a,0xd9,0xa9,0xa4,0x13,0xbb,0x33,0x34,0x2b,0x4, + 0x10,0x2a,0x41,0xc0,0x2,0xdb,0xf3,0xb7,0x3b,0x86,0x92,0x6,0x43,0x60,0x67,0xeb, + 0x19,0x8,0xb2,0x58,0x31,0xb7,0x69,0x7d,0xe,0xa5,0x94,0x91,0x51,0x2b,0xc3,0x4a, + 0x2a,0x10,0x37,0xa4,0x10,0xc2,0xaa,0x40,0x2e,0xd0,0x37,0x60,0x82,0x2a,0xe7,0xf7, + 0x5d,0x86,0xe1,0xfc,0xbd,0x1,0xc9,0xb5,0x77,0x8d,0xef,0xf,0x43,0xe0,0x5b,0x5f, + 0x9e,0xc4,0xa6,0x35,0x4d,0xc,0xcc,0xeb,0x41,0xb3,0x11,0x21,0xc,0x4d,0x75,0x91, + 0xc8,0x36,0x80,0xa4,0x44,0x9a,0x66,0xe8,0x74,0x62,0x1c,0x3c,0x38,0x81,0x6b,0x7f, + 0x35,0xc3,0xa2,0x65,0x11,0x72,0x29,0x6d,0x31,0x89,0xec,0x50,0x88,0x86,0xd2,0xc0, + 0xdc,0x5,0x84,0x34,0x49,0x91,0xa7,0x19,0x1a,0xa1,0xe9,0x54,0x2a,0x29,0xcd,0xe7, + 0x20,0xab,0x74,0xd6,0xea,0x49,0x2b,0x28,0x22,0x28,0x92,0xe5,0xbe,0x13,0x2f,0x6e, + 0x5,0x30,0xb9,0xb8,0x1b,0xf5,0x36,0xe3,0xda,0xdc,0xc,0x52,0x13,0x7,0x27,0xd, + 0x4d,0x81,0xa7,0x4,0x12,0x52,0x28,0x48,0xa9,0x20,0x85,0x84,0x94,0xa,0x8c,0x29, + 0x70,0x6e,0xca,0xa7,0x22,0x17,0x10,0xb9,0x71,0x3,0x52,0x8,0xdb,0x59,0x94,0x85, + 0x7f,0x75,0x3b,0x7d,0x14,0xeb,0x89,0x58,0x80,0x80,0x1b,0xf9,0xf,0x3,0xc2,0xa3, + 0xf7,0x76,0xb0,0xf6,0x3e,0x8e,0x81,0x79,0x7d,0x68,0x36,0x5b,0x8,0xc3,0x6,0x18, + 0x98,0x9,0xf4,0x28,0x7,0xc8,0xc4,0x19,0x9d,0x76,0x7,0x63,0x63,0x63,0x18,0xbc, + 0x21,0xc1,0xc5,0x57,0xb5,0x90,0x9,0x9,0x45,0xc2,0x10,0x0,0xe6,0xbd,0x72,0x46, + 0xd0,0x9a,0x43,0x2a,0x81,0x38,0x26,0x24,0x69,0x86,0x46,0x23,0x2,0xe7,0x1c,0x79, + 0x2e,0x20,0x72,0x89,0x2d,0xeb,0x53,0x5c,0x72,0x1d,0x83,0x26,0x61,0x7b,0x11,0x46, + 0xad,0xa4,0x4a,0x8a,0x3a,0xc8,0x8b,0x9a,0x0,0x4a,0xb,0x68,0x2e,0x51,0xe,0x6b, + 0x73,0x1b,0xf5,0x73,0x70,0xe2,0x16,0x7c,0x66,0xab,0x83,0xc,0x9a,0x24,0xa4,0x2c, + 0xf,0x21,0xa5,0x1d,0xd8,0xe4,0x86,0x0,0x52,0x22,0x17,0x39,0x84,0x10,0x68,0xf4, + 0xb8,0xdf,0xf1,0xa3,0x7d,0x5d,0x14,0xf6,0x19,0xe3,0xe0,0x5c,0x83,0x33,0x33,0xb0, + 0xb1,0xee,0x67,0x53,0xf8,0xf6,0xdf,0x33,0xc,0xc,0xcc,0x43,0x23,0x6a,0x98,0x68, + 0x9f,0x99,0xc5,0x1c,0x52,0x96,0x79,0x79,0x2e,0x4,0xd2,0x2c,0xc3,0xd2,0x15,0x9, + 0xae,0xfd,0x77,0xbd,0x88,0xf3,0xdc,0x92,0x4c,0x42,0x41,0x15,0xe9,0x9b,0x22,0xd, + 0x5,0x86,0x81,0x53,0x8,0x69,0x9a,0x21,0xcb,0x52,0xa4,0x91,0xc9,0x22,0x72,0x91, + 0x23,0x17,0x2,0x4c,0xa,0x68,0x62,0x50,0x4a,0x98,0xf8,0x81,0x64,0x31,0xa3,0x78, + 0xa2,0xb7,0x85,0x67,0x85,0x0,0xda,0x46,0xbf,0x8c,0xd9,0xa9,0x5d,0x28,0xd3,0x42, + 0x45,0xe0,0x2f,0xc0,0x2,0x91,0x99,0xad,0xd7,0x24,0xad,0xcc,0x1b,0xf0,0x45,0x2e, + 0xec,0x44,0xae,0x25,0x80,0x10,0xc5,0xf7,0x95,0x92,0x20,0x32,0x8b,0x32,0x0,0x5, + 0x14,0xb5,0x4,0x3b,0x51,0xc4,0x61,0x97,0x8f,0x11,0xc6,0xf6,0xa6,0xf8,0xe6,0x17, + 0x12,0xf4,0x34,0x17,0xd8,0x54,0x2f,0x34,0xe0,0x6b,0x82,0x14,0xd5,0x3d,0x7c,0x84, + 0x90,0x50,0x52,0xe1,0xe9,0x35,0x2,0x1b,0xd7,0x29,0x2c,0xbb,0x80,0x17,0x41,0x9c, + 0x9,0x66,0x1,0xed,0x76,0x15,0x21,0x6e,0x26,0x8e,0x72,0x53,0x9d,0x6c,0x46,0x39, + 0x82,0x30,0x40,0x96,0xe5,0xc8,0xf3,0x1c,0x5c,0x8,0x68,0xed,0x14,0x20,0x87,0x56, + 0x76,0xfe,0x40,0x2b,0x90,0x3e,0x3e,0x31,0x0,0x63,0x6c,0x3e,0x80,0x57,0xc2,0xdc, + 0xc4,0xd3,0xfd,0x9b,0x84,0xd9,0x88,0x6a,0xd,0x11,0xc5,0xcf,0x19,0x1,0x40,0x1a, + 0x8a,0x84,0x91,0x7d,0xe7,0x2,0xb4,0x86,0xe6,0x4,0x4d,0xa6,0xa3,0xa7,0x19,0x41, + 0x73,0x4b,0x0,0x25,0x91,0x65,0x99,0x39,0xac,0x4f,0x25,0x22,0x70,0xce,0xa1,0xb5, + 0x42,0x9e,0xe5,0xe6,0xc8,0x73,0x74,0x26,0x85,0x69,0x20,0x93,0x2c,0xad,0x9f,0x91, + 0xb7,0x64,0x1c,0x8,0x38,0x47,0x67,0x3c,0xc3,0xff,0xbc,0x75,0x12,0x1,0xfa,0x11, + 0xf6,0x86,0x36,0xcf,0xb7,0xe0,0xcb,0xe9,0x15,0x39,0x65,0xe3,0x8f,0x46,0x18,0xe1, + 0xb6,0x4f,0x1e,0xc0,0x7f,0xf9,0x74,0xb,0xb,0xcf,0xe0,0x0,0x49,0x0,0xca,0x36, + 0x91,0x6c,0x9d,0x2,0x12,0x7,0xf6,0x66,0xc8,0x52,0x8d,0x2c,0xcd,0x90,0x36,0x52, + 0x4,0x41,0x80,0x34,0x4d,0x91,0xc4,0x9,0x58,0x5f,0x6,0x45,0x1,0x24,0xe5,0x50, + 0xda,0xf4,0x2a,0x94,0xd2,0x86,0xbc,0x1a,0x50,0x6a,0xd6,0xc1,0x5f,0x2,0xe0,0xd2, + 0x7b,0xbe,0xfa,0x77,0x1f,0xbb,0xf6,0xca,0xc1,0x55,0x24,0x25,0x20,0x5,0xe,0x4e, + 0x4c,0x8c,0xfd,0xf8,0x91,0x47,0x1f,0xfd,0xbd,0xcf,0xff,0xf5,0x7d,0x8c,0xb1,0x1f, + 0x3,0x58,0x7d,0x38,0x22,0xcc,0xda,0xea,0x45,0xa5,0x73,0x68,0x12,0xc6,0xa,0x48, + 0x94,0xf5,0x79,0x2d,0xa1,0x21,0x6c,0xad,0x5e,0x82,0xc8,0xf6,0xf0,0x85,0x40,0x9e, + 0x9b,0x6a,0x5f,0x9e,0xe7,0xde,0x61,0xbe,0x2e,0x84,0x30,0xa9,0x96,0x36,0x80,0x80, + 0x19,0x5,0x60,0xac,0x3c,0x38,0xd3,0x66,0xa4,0x4b,0x48,0x7c,0xe9,0xe3,0x63,0xc8, + 0x93,0x6,0x1a,0xd,0x23,0xcf,0xa6,0x42,0x69,0x82,0xbd,0xea,0xeb,0xe7,0xc5,0xeb, + 0x13,0x11,0xc2,0x30,0x84,0x16,0x4d,0xdc,0xfe,0xb9,0x9,0x1b,0x87,0x28,0x70,0xfb, + 0xfa,0xe6,0xef,0x99,0xbf,0xaf,0xad,0xac,0xbb,0xf7,0x9d,0xa6,0x29,0xd2,0x34,0x45, + 0x96,0x65,0x58,0x7e,0xa1,0x82,0x52,0x19,0x94,0xca,0x21,0x75,0x6e,0xce,0x2a,0xb7, + 0xfd,0x91,0xea,0x8e,0x76,0xb3,0x5,0xfe,0x83,0x5f,0xbf,0xfd,0x93,0x3e,0xf8,0x90, + 0x12,0xf3,0x5a,0xad,0x5,0x6f,0xbb,0xfa,0xd5,0xd7,0xaf,0xff,0xfb,0x2f,0x7f,0xec, + 0x1b,0x7f,0xfa,0xf1,0x8f,0x3,0xf8,0x65,0x7b,0xab,0xdf,0xe3,0xdd,0xb,0x30,0xa9, + 0xa0,0xa2,0x12,0x68,0xe3,0xb,0x73,0x28,0x6b,0x15,0x8e,0x18,0x92,0x72,0x9c,0x77, + 0x39,0x9f,0x1,0xfc,0x12,0x78,0x69,0x23,0xec,0x3,0x7b,0x32,0x80,0x99,0x95,0x3a, + 0x6,0x78,0x6d,0xcb,0xbc,0xe6,0x88,0x22,0x8d,0xdb,0x3f,0x3b,0x8a,0xdd,0x43,0xc, + 0x8d,0x46,0xc3,0xaa,0x88,0x2e,0xc0,0x77,0x80,0xd5,0xf,0x29,0xd,0xa0,0x9c,0x73, + 0x34,0x9b,0x4d,0x1c,0xd8,0xd9,0xc0,0x6d,0x1f,0x1f,0x45,0x18,0x98,0x21,0xd5,0x86, + 0x6d,0x1e,0x5,0xdc,0x54,0x16,0x47,0xf6,0x66,0x5,0xa9,0x94,0x52,0xb6,0x80,0x24, + 0x20,0x84,0x80,0x92,0xc2,0x54,0x3b,0x48,0x17,0xa0,0x93,0x6d,0x7e,0x92,0x26,0x90, + 0x9a,0x65,0xf0,0xbf,0x72,0xdb,0x27,0x7,0x2f,0xb8,0x60,0xd0,0x7,0x1f,0x52,0xc2, + 0x3d,0x6f,0x71,0xd6,0xf3,0xb6,0x2b,0x2e,0xbf,0x7e,0xe7,0xff,0x77,0xdb,0x67,0x57, + 0x5d,0x70,0xc1,0x3b,0x18,0x63,0xaf,0x39,0xee,0xa,0xe0,0xaf,0x10,0xad,0x2f,0x16, + 0x25,0x6f,0x74,0x9c,0xec,0xe6,0xd,0xee,0x22,0x2a,0xa5,0x2a,0x80,0x3b,0x69,0x76, + 0x9d,0xc4,0x5d,0x9b,0x73,0x4,0x8c,0x81,0x73,0x33,0xc8,0xe9,0x76,0x7,0x9,0x38, + 0x43,0xd4,0x60,0xf8,0xc7,0xcf,0x8d,0x63,0xcd,0x4f,0x9,0xcd,0xa6,0xc9,0xf3,0xc3, + 0x30,0x4,0xe7,0x36,0xdd,0x53,0xaa,0x20,0x5a,0x92,0x24,0x48,0xd3,0xd4,0x2b,0xe2, + 0x18,0x54,0x82,0x20,0x40,0xb3,0xd9,0x44,0x5f,0x5f,0x1f,0x9e,0x79,0x34,0xc4,0x5d, + 0x5f,0x9d,0x44,0x83,0x7,0x68,0x4,0x21,0x1a,0x41,0x80,0x6,0xf,0x10,0x72,0x8e, + 0x91,0xbd,0xaa,0x78,0x5d,0xa7,0x4,0x8e,0x60,0x51,0x9f,0xb6,0x25,0x65,0xd8,0xda, + 0x86,0x5b,0xbf,0x60,0x1e,0xcf,0xc6,0x4e,0x61,0x3e,0xf8,0xaf,0x5c,0xb9,0x72,0x46, + 0xf0,0xdd,0x73,0x28,0x81,0xc5,0x73,0xe6,0x2c,0xbd,0xf3,0x8f,0x3e,0x72,0xeb,0xcd, + 0x57,0x5d,0xf9,0xf6,0x99,0x48,0x10,0x1e,0x97,0xd0,0xb2,0x58,0x25,0xed,0x2d,0xce, + 0xa2,0x72,0x26,0x28,0x17,0xc0,0xf2,0x73,0x19,0xc6,0xf7,0xca,0x82,0x0,0x4e,0xb6, + 0xdd,0x5,0x76,0x85,0x98,0xdd,0x43,0xb2,0xd8,0x2c,0x22,0x60,0x64,0x7a,0xbb,0x30, + 0x45,0x9f,0xef,0x7f,0x6d,0x12,0xf7,0x7f,0x5b,0xa2,0xb7,0xb7,0x17,0x8d,0x46,0x63, + 0x9a,0xf4,0x3b,0x2b,0x77,0xc4,0x2,0x80,0x30,0xc,0x6d,0x39,0x38,0x28,0x96,0x84, + 0x85,0x61,0x88,0x56,0xab,0x85,0xbe,0xbe,0x3e,0xdc,0x75,0xfb,0x1,0x9c,0x71,0x5e, + 0x13,0xaf,0x78,0x8d,0x59,0x1a,0x1e,0x30,0x8e,0x46,0xc0,0xf0,0xd4,0xea,0xc,0x41, + 0x30,0xaf,0x12,0x3f,0x38,0x2,0x2c,0x39,0x2b,0x80,0x56,0x76,0x26,0x52,0xc3,0xd6, + 0x1a,0xc,0xf8,0x5a,0xd9,0xa5,0x86,0xb3,0x5,0xfe,0x8a,0x95,0x83,0x3a,0x4d,0xc0, + 0x48,0x21,0x98,0xd3,0x57,0x5,0x5f,0xd8,0xb3,0x92,0x20,0x61,0x88,0xd0,0xe2,0xac, + 0xe7,0xef,0xde,0xfb,0xeb,0xef,0x87,0xd2,0x6e,0xc2,0xfa,0xfe,0xe3,0xa3,0x0,0x33, + 0x28,0x41,0x9,0x7c,0x39,0x35,0xa3,0x35,0xb0,0x68,0x29,0x2b,0x2e,0xa0,0xaf,0x0, + 0x4e,0xbe,0x5d,0x94,0xf,0x4,0x58,0x73,0x7f,0x62,0x54,0xc0,0xee,0x14,0xc2,0x19, + 0xc3,0x86,0xfb,0xdb,0xf8,0xd7,0xbf,0xed,0x20,0x8,0x82,0x2,0x4c,0x47,0x20,0x67, + 0xf9,0x69,0x6a,0x66,0x9,0xe,0x1e,0x3c,0x88,0xb1,0xb1,0x51,0x8c,0x8d,0x8d,0x61, + 0x72,0x72,0x12,0x9d,0x4e,0x7,0x69,0x9a,0x42,0x8,0x1,0xad,0x75,0x85,0x4,0xbd, + 0xbd,0x73,0xf0,0xd5,0x3f,0x1b,0xc7,0xf0,0x16,0x85,0x28,0x8,0x11,0x5,0x1,0x44, + 0xae,0xf1,0xd4,0xa3,0xb2,0xa2,0x2c,0xee,0xbd,0xb,0x91,0x63,0xe0,0x14,0xe,0x69, + 0x7b,0x1a,0x86,0x70,0x46,0xf6,0xd,0x1,0xe8,0x59,0xa5,0x81,0xd3,0xc0,0xcf,0x12, + 0xa8,0x24,0x86,0x18,0x19,0xeb,0x62,0xf9,0xe6,0x4c,0xc2,0x3e,0x57,0x46,0x9,0x9a, + 0x9c,0xf5,0x7c,0xe5,0xdd,0xff,0xf1,0xfd,0x67,0x2d,0x1a,0xb8,0xa6,0x1e,0x13,0xf0, + 0xe3,0x83,0x7f,0xf5,0xff,0xe5,0x98,0xb4,0x21,0x80,0x94,0xc0,0x19,0xe7,0x5,0x95, + 0x5a,0x40,0x9d,0x4,0x4e,0x1,0x82,0x20,0xc0,0xc6,0xd5,0x39,0x2,0x6e,0x64,0xdf, + 0xe4,0xfb,0x1c,0x4a,0x96,0x6f,0xbd,0x58,0x37,0x60,0x81,0x71,0xe0,0xc7,0x71,0x8c, + 0xa9,0xa9,0x29,0x4c,0x4c,0x8c,0xe3,0xa3,0x7f,0xdd,0x83,0x4b,0x5e,0x13,0x63,0x7c, + 0x7c,0x1c,0xed,0x76,0x1b,0x49,0x92,0x20,0xcb,0x32,0x48,0x29,0x8b,0xc,0x24,0x8a, + 0x22,0xf4,0xf6,0xf6,0x82,0x64,0x2f,0x3e,0xff,0xd1,0x7d,0x90,0x9,0x43,0x14,0x86, + 0x78,0x6a,0x75,0x7,0x1c,0xa6,0xf8,0xe3,0x2b,0x8c,0x10,0x2,0x61,0x2b,0xc7,0xdc, + 0x85,0xdc,0x2e,0x53,0x23,0x28,0x85,0xd2,0x1d,0x28,0x32,0x18,0xc8,0x63,0x53,0x80, + 0xba,0xec,0x1b,0xf0,0x13,0xe8,0x4e,0x8c,0x7c,0x62,0x1c,0xba,0xd3,0x29,0xc1,0x17, + 0x2,0x50,0x2,0xe4,0x9e,0x2b,0x1,0x8,0x51,0xc6,0x5,0x60,0x3d,0x3f,0xbd,0xe5, + 0x77,0xde,0xf,0xe0,0x15,0x8c,0xb1,0xde,0xe3,0xa7,0x0,0xf0,0x76,0xcd,0x73,0x7d, + 0x80,0xc2,0xfa,0x51,0x8c,0x4c,0x9d,0x77,0x69,0x54,0x4,0x7d,0xee,0xf0,0x65,0xdb, + 0x11,0x20,0xc,0x43,0x3c,0x78,0x77,0x82,0x80,0x73,0x7b,0x18,0xd9,0xbe,0xe2,0xda, + 0x7e,0xbc,0xeb,0xf7,0xe7,0x16,0xbf,0xeb,0x7c,0x7d,0x9a,0xa6,0xa6,0xbe,0xdf,0xe9, + 0x60,0x72,0x72,0x12,0x13,0x7,0x27,0xf0,0xae,0x8f,0xb4,0xb0,0xf8,0xec,0x0,0xff, + 0xf9,0x63,0xb,0xb1,0x70,0x59,0x1b,0x13,0x13,0x13,0x15,0x25,0x70,0x69,0x62,0x10, + 0x4,0x68,0xb5,0x5a,0xe8,0xef,0xef,0x47,0x67,0xbc,0x7,0x7f,0xf1,0xe1,0x7d,0x68, + 0x4,0x1,0x7e,0x78,0xc7,0x14,0x5a,0xad,0x56,0xe1,0x62,0x7c,0x92,0x9d,0x79,0x21, + 0x83,0x54,0xc6,0xea,0x95,0x34,0x4,0x50,0x52,0x43,0x4b,0x7,0xfe,0xb1,0x5,0x81, + 0x55,0xcb,0x5f,0x31,0xa8,0xd3,0x4,0x2a,0x4e,0xa0,0xe3,0x18,0x22,0x89,0xa1,0xdb, + 0x6d,0x74,0xb6,0x6e,0xb3,0xd2,0x2f,0x40,0x4a,0x58,0xd9,0x17,0x16,0x7c,0x5,0x52, + 0xb2,0x54,0x2,0x29,0xb1,0xb8,0xaf,0x77,0xe9,0x3f,0xbf,0xe7,0x9d,0xbf,0x6,0xe0, + 0xf2,0x59,0x27,0x0,0xcd,0xf0,0xc8,0x5f,0x27,0xa0,0xbd,0xf3,0xf9,0x97,0xb7,0xa0, + 0xb4,0x9c,0x6,0xbe,0x53,0x0,0xe7,0x2,0xc2,0x30,0x44,0x16,0x73,0xfc,0xec,0xbb, + 0x1d,0x4,0xde,0x8e,0x61,0x0,0xc3,0xeb,0xff,0xdd,0x3c,0xbc,0xe6,0x17,0xa3,0x4a, + 0x36,0xe1,0x48,0x10,0xc7,0x31,0x3a,0x9d,0xe,0x5e,0x75,0x3,0xc3,0x95,0xd7,0xf7, + 0x22,0x97,0x12,0x99,0x20,0xfc,0xe1,0xdf,0x9c,0x86,0x53,0x96,0x67,0xe8,0x74,0x3a, + 0x88,0xe3,0xb8,0xf8,0x5d,0xa5,0x54,0x91,0x16,0x46,0x51,0x84,0xbe,0xbe,0x3e,0xc, + 0x6d,0x20,0x7c,0xf6,0xf7,0x76,0x60,0xf5,0x8f,0x25,0x9a,0xcd,0xa6,0x2d,0x2a,0xe9, + 0xc2,0xc5,0xe4,0x79,0x6e,0x9,0x60,0x6e,0x57,0x23,0xed,0x4c,0x83,0x52,0xb0,0x44, + 0x20,0x68,0x9,0x48,0x79,0x74,0x5b,0x85,0x14,0xe0,0xdf,0x71,0x87,0xf5,0xf9,0xa9, + 0xb1,0xfc,0xb8,0x3,0xd1,0xe9,0x40,0xb5,0x3b,0xc8,0xe3,0x36,0xda,0x5b,0xb6,0x22, + 0xdd,0xb7,0xdf,0xf3,0xff,0xf6,0x10,0x12,0xa4,0xbc,0x80,0xd0,0x92,0x80,0x94,0xc2, + 0xf5,0x2b,0xce,0x5e,0x75,0xd6,0x82,0xb9,0xd7,0x30,0xc6,0x9a,0xb3,0xaf,0x0,0xf5, + 0x2d,0x74,0x51,0xae,0x90,0xd1,0x6e,0xf1,0x84,0x1d,0x9c,0xcc,0x32,0xe0,0x8a,0x6b, + 0xa2,0xa,0xf8,0xce,0xfa,0x7d,0x5,0xe0,0x9c,0x23,0xc,0x43,0xdc,0xfb,0xcf,0x53, + 0x65,0x26,0x60,0xb,0xce,0x44,0xc0,0x6f,0xfc,0xf1,0x29,0xb8,0xfa,0xc6,0xb0,0xc8, + 0xcb,0x9d,0x2,0xc4,0x71,0x8c,0xb3,0x2f,0x51,0xf8,0xb5,0x8f,0x2c,0x44,0x26,0x25, + 0x52,0x29,0x91,0x49,0x1,0x1e,0x31,0xbc,0xe7,0x63,0xf3,0x41,0x3c,0x46,0x1c,0xc7, + 0x5,0x9,0xba,0xc5,0x3,0x73,0xe6,0xcc,0xc1,0x13,0xf,0x71,0xf4,0xf7,0xcf,0x43, + 0x14,0x45,0x45,0xc,0xe0,0x2b,0xce,0x5,0x83,0x2d,0x48,0xa9,0x6c,0x3b,0xdb,0x80, + 0xaf,0x3d,0xf0,0x95,0x34,0x81,0xe1,0xd1,0x82,0xff,0xd0,0x43,0xf,0x7d,0x72,0xf0, + 0x92,0x8b,0x7,0x75,0x16,0x43,0x25,0xb1,0x1,0x3f,0xe9,0x40,0xc5,0x6d,0x88,0xb8, + 0xd,0xd5,0xee,0x40,0xc4,0x6d,0xec,0x7f,0xf8,0x11,0xa8,0x38,0xae,0xc6,0x0,0x4a, + 0x56,0xc1,0x97,0x6,0x7c,0x13,0x14,0xa2,0xe7,0x8f,0xdf,0xb0,0xea,0xa,0x0,0x17, + 0x3f,0x27,0x31,0x40,0x25,0xf8,0xf3,0x56,0xcf,0x8,0x49,0x78,0xe5,0xeb,0x9b,0x5d, + 0x5d,0x80,0xb3,0x46,0x27,0xcb,0x61,0x18,0x62,0xe7,0x26,0x85,0x9f,0xdd,0xd9,0x2e, + 0x52,0x42,0x66,0x5a,0x81,0x90,0xa,0xf8,0x8d,0x3f,0x5e,0x84,0xab,0x6f,0xc,0x8a, + 0x54,0x2f,0x4d,0x53,0xf4,0x2f,0x12,0x78,0xdf,0xa7,0x16,0x22,0x57,0x12,0x99,0x94, + 0xc8,0x95,0x44,0xae,0x14,0x72,0xa5,0x70,0xda,0xd9,0xd,0x7c,0xec,0x4b,0xb,0xa, + 0x12,0xb8,0x82,0x8e,0x1f,0xf,0x84,0x61,0x88,0x9e,0x9e,0x1e,0xcc,0x9d,0x3b,0x17, + 0xbd,0xbd,0xbd,0x8,0xc3,0xd0,0xc6,0x2f,0x65,0x6d,0x61,0xd1,0x72,0x8d,0xfe,0x85, + 0xc,0x52,0x12,0xa4,0x20,0xb,0xba,0x19,0x6e,0x51,0x2,0x76,0x2d,0x23,0x41,0x8a, + 0x23,0x53,0x80,0xa,0xf8,0x83,0x83,0x83,0x2a,0xcf,0x4a,0xd9,0x8f,0x63,0xa8,0x76, + 0x6c,0x15,0xc0,0x9c,0x45,0x1c,0x23,0x1e,0x1d,0xc7,0x96,0xef,0xdc,0x55,0x5,0x5f, + 0x78,0xd2,0xaf,0x3c,0x42,0x58,0x76,0xbe,0xf1,0x8c,0x33,0x6,0x1,0x5c,0x78,0x9c, + 0x63,0x80,0x72,0x95,0xae,0xf6,0xd7,0xb,0xda,0x43,0x11,0xe1,0xb2,0xd7,0xf5,0x16, + 0x17,0xb3,0xa8,0xfc,0x75,0xc9,0x4,0xc2,0x30,0x44,0xa3,0xd1,0xc0,0x37,0x6e,0x1b, + 0x47,0xda,0xa1,0x62,0xd7,0x50,0x77,0x55,0xa5,0x4,0x6e,0xfe,0xaf,0xb,0xb0,0x74, + 0x5,0x21,0x4d,0x53,0x4,0x51,0x8e,0xdf,0xfc,0xcc,0x7c,0x34,0x7a,0x8,0xb9,0x94, + 0xc5,0xba,0xc1,0x5c,0xda,0xf5,0x83,0x5a,0x61,0xf1,0x19,0x4d,0xfc,0xca,0x2d,0x73, + 0x10,0xc7,0x71,0xa5,0x46,0xe0,0xc8,0xe7,0x2,0xd0,0x46,0xa3,0x51,0x14,0x98,0xfc, + 0x20,0x33,0xcb,0x32,0xbc,0xf2,0xf5,0x91,0x1,0x5f,0x9a,0x51,0x36,0x25,0x6d,0x1c, + 0x20,0xdc,0x2a,0x66,0xf3,0x58,0xab,0xc3,0x13,0x60,0x1a,0xf8,0xca,0x2c,0x55,0xd3, + 0x9d,0x18,0x22,0xee,0x40,0xb5,0xdb,0x10,0x9d,0x29,0x63,0xf9,0x9d,0x36,0x44,0x1c, + 0x23,0xef,0xc4,0xc8,0x93,0x18,0x7,0x47,0x47,0xb1,0xf9,0x8e,0xef,0x98,0x80,0x4f, + 0x88,0xc2,0xe7,0x97,0x96,0xaf,0xe0,0x49,0x13,0x16,0xf7,0xf5,0x2c,0x5,0x70,0xea, + 0xac,0x13,0x80,0xa6,0x15,0x2,0x50,0xc,0x84,0x54,0x49,0x60,0x2a,0x66,0x3c,0xc, + 0x70,0xcd,0x2f,0x4d,0x57,0x1,0x3f,0x13,0xe0,0x9c,0x17,0x2a,0x30,0xbe,0x1f,0xf8, + 0xda,0x5f,0x1c,0xb0,0xeb,0xf6,0xbd,0x85,0x99,0x0,0x9a,0xbd,0x1c,0x7f,0xf8,0xe5, + 0x25,0x58,0x7e,0x1e,0xc3,0xcd,0xb7,0xf4,0x63,0xc9,0xd9,0xa1,0x5d,0x35,0x64,0x16, + 0x87,0xa,0x55,0x2e,0x12,0x75,0xc7,0x6b,0x6e,0x9c,0x87,0x5f,0xfd,0x50,0x5f,0x11, + 0xc,0xfa,0xae,0xc0,0x77,0x43,0x2e,0xf7,0x77,0xd5,0xbf,0x3c,0xcf,0x91,0x24,0x9, + 0x2e,0x7a,0x55,0xcb,0x82,0x6f,0x82,0x3f,0xa3,0xc2,0x86,0x4,0x32,0x37,0xe0,0xcb, + 0x9c,0xa0,0xf,0xa3,0x0,0xb6,0xb1,0x53,0x1,0x5f,0x8,0x1,0x31,0xa7,0xdf,0xc8, + 0x7e,0xc7,0xfa,0xfe,0xb8,0xb4,0xfc,0x3c,0x8e,0x91,0x27,0x9,0xf2,0x34,0x85,0x88, + 0x13,0xec,0xde,0xbe,0xb,0x8f,0x7e,0xf5,0x6b,0x10,0xed,0xa9,0x8a,0xcf,0xf7,0x2d, + 0x1f,0x4a,0x81,0x54,0xb5,0x39,0x71,0x9c,0x15,0xa0,0xac,0x8,0x4c,0x5b,0x3c,0x49, + 0x1a,0x42,0x6a,0xac,0x7a,0x6b,0x5f,0xa5,0xc,0xec,0x48,0x50,0x8f,0x3,0x1a,0x8d, + 0x6,0x9a,0xcd,0x26,0x7e,0x7a,0x67,0x8c,0xfb,0xbe,0x33,0x59,0x54,0x5,0xfd,0xbd, + 0x8,0x79,0x83,0xe3,0x63,0xff,0x6b,0x29,0xae,0xb8,0xbe,0xcf,0xcc,0xe4,0x91,0xf9, + 0x3b,0xaa,0xb2,0x38,0xb4,0xfa,0x3e,0xde,0xf4,0x8e,0x45,0xf8,0x85,0x1b,0x1b,0xe8, + 0x74,0x3a,0x48,0x92,0x64,0x9a,0x1a,0x95,0xf9,0xbe,0xa8,0xf4,0x1,0x6,0xaf,0x6d, + 0x62,0x60,0x51,0x60,0xfd,0xbe,0xb6,0xd6,0x6e,0xa2,0x7f,0x67,0xf9,0x32,0x37,0x44, + 0x90,0x87,0x48,0x3,0xad,0xe5,0xbf,0xea,0x9e,0xbb,0xbf,0xf1,0x31,0x7,0x7e,0xe1, + 0x66,0x7a,0x7a,0x21,0x7b,0xe7,0x40,0x74,0xda,0x50,0x71,0x7,0xa2,0x6d,0xc1,0x4f, + 0xaa,0xe0,0x9b,0xa6,0x5a,0x8a,0xe1,0x91,0x31,0x7c,0xff,0xb6,0xaf,0x61,0x6c,0x68, + 0x93,0x4d,0xff,0x1c,0xf8,0x12,0x90,0x36,0x2b,0x30,0xe5,0xca,0xe3,0x58,0x9,0xf4, + 0xef,0x18,0xe3,0x6a,0x0,0x76,0x73,0x45,0xb3,0xea,0x86,0x21,0x20,0x56,0x2c,0xde, + 0x3c,0xfb,0xe2,0x16,0xce,0xbf,0x8c,0x63,0xf3,0xba,0xbc,0xd8,0xf,0xc0,0x29,0x87, + 0xb,0xba,0x9c,0xa,0x44,0x51,0x4,0xad,0x35,0xbe,0xf4,0xa7,0x23,0x20,0x2,0x56, + 0xfd,0x62,0xbf,0xd9,0xa9,0xab,0x58,0x1,0xe4,0xd6,0x84,0x50,0xd7,0xbd,0xb,0xfd, + 0xad,0xe3,0xfd,0x25,0xdc,0x1f,0xf8,0xd4,0x32,0xec,0xdf,0xb3,0x5,0x9b,0xd7,0xc6, + 0x85,0xaf,0xf7,0x6f,0x66,0xe5,0xdc,0x91,0xd6,0xba,0xe8,0x62,0x5e,0xfb,0xf6,0x45, + 0xd6,0xfa,0x8d,0xfb,0xd5,0x56,0xfe,0x2b,0xe0,0x1b,0xff,0x6f,0x86,0x47,0xf,0x15, + 0xed,0xdf,0xf3,0x95,0x4f,0x5e,0xf9,0xda,0x6b,0x6,0x7d,0x17,0x63,0x6,0x63,0x33, + 0x88,0x73,0xce,0x45,0xb0,0x61,0x3d,0xe4,0x34,0xcb,0x4f,0x20,0x92,0xb4,0xe8,0xa8, + 0xa6,0x22,0x47,0x96,0xe7,0x48,0x73,0x81,0xff,0xfb,0x4f,0xdf,0xc6,0x99,0xad,0x26, + 0x6,0x6f,0x7c,0x3,0xe6,0x9e,0xb6,0x4,0x90,0x66,0x44,0xcd,0x2c,0xbe,0xd0,0xf8, + 0xe1,0xd0,0xf6,0xfb,0x0,0xac,0x3d,0x2e,0x4,0x28,0x36,0xea,0x74,0xed,0x54,0xef, + 0x82,0x6b,0xeb,0xa,0x94,0x26,0x28,0x66,0x2c,0x33,0xcd,0x3,0xfc,0xf2,0xfb,0xe7, + 0xe2,0x53,0xef,0x1d,0xad,0x54,0xf4,0x1c,0x9,0xdc,0xd9,0x57,0x2,0xa5,0x14,0xbe, + 0xf8,0xdf,0xf6,0x83,0x88,0xf0,0xda,0xb7,0xce,0x5,0x38,0x3,0x69,0xb7,0x7d,0xbc, + 0x1d,0x13,0xb3,0x2b,0x90,0xfc,0xd7,0x73,0xae,0xc3,0x6c,0x14,0xe1,0xdd,0x7e,0x86, + 0x2,0xfc,0xc9,0x5f,0xaf,0xc0,0x1f,0xfc,0xfa,0x10,0x26,0xf6,0xc9,0x69,0x44,0x74, + 0xef,0xc3,0x2f,0x36,0x9,0x41,0x45,0xaa,0x67,0x80,0x7,0x64,0x8e,0x2a,0xf8,0x39, + 0x41,0x66,0x4,0x29,0xa6,0x2b,0x40,0x5,0xfc,0xcb,0xce,0x19,0x54,0x76,0xb5,0x93, + 0xf,0x7e,0x96,0x65,0x48,0xe7,0xe,0x20,0x58,0xb0,0x10,0x6c,0xff,0x7e,0x3,0x7c, + 0x62,0x80,0xaf,0x80,0x9f,0x97,0xe0,0xa7,0x42,0x20,0x93,0x2,0x6b,0x26,0x52,0x3c, + 0x7c,0xfb,0xbf,0xe0,0x4c,0x1e,0xe0,0xbc,0xfe,0x6,0x6,0x96,0x9e,0x6,0x95,0xa5, + 0xf8,0xf9,0xde,0xbd,0x3f,0x7f,0xdf,0x81,0xce,0x9f,0x1,0x78,0xec,0xb8,0xf6,0x2, + 0x9c,0x39,0x16,0x37,0x60,0xb1,0xa0,0x98,0xd9,0x0,0xd,0x45,0xdc,0xca,0xb3,0xc2, + 0x8a,0x4b,0x7a,0x71,0xc1,0x2b,0x27,0xb0,0x69,0x4d,0x5e,0xd4,0xe7,0x5d,0x6,0xe0, + 0xaa,0x6f,0x0,0xcc,0x3e,0xc1,0x96,0x4,0x5a,0x6b,0xfc,0xed,0x27,0x86,0xb1,0x6d, + 0x63,0x82,0xff,0xf4,0xe1,0xc5,0xd6,0x99,0xe9,0xca,0x6,0xcd,0x8c,0xdc,0xde,0x7f, + 0x28,0x76,0x8,0x9,0xec,0xee,0x20,0x26,0x9d,0xe4,0xf6,0x4e,0x24,0xc0,0xc3,0x3f, + 0x19,0xc7,0xfe,0x3d,0x2,0x1,0x8c,0xaf,0x77,0x3b,0x93,0xf8,0xe0,0xbb,0x32,0x30, + 0x0,0x7c,0xee,0x96,0x1d,0xf8,0xe8,0x6d,0xa7,0x43,0x31,0x82,0xb2,0x7e,0x5f,0x49, + 0x40,0x38,0xd9,0xb7,0xe0,0x8b,0x8c,0xa0,0x6b,0x4,0x28,0xc1,0xff,0xf2,0x27,0xaf, + 0xbc,0x6c,0xe5,0x20,0x28,0x87,0x52,0x12,0xb9,0xae,0x82,0x9f,0x65,0x26,0xa5,0x4d, + 0x2f,0x1f,0xc4,0xdc,0x27,0xd6,0x43,0x24,0x9,0x44,0x9a,0x22,0x4f,0x92,0x2,0xfc, + 0xcc,0x82,0x9f,0x59,0xf0,0x53,0x29,0x90,0x4a,0x13,0xf0,0x66,0x52,0x61,0x8d,0x16, + 0x78,0xb8,0xd3,0x41,0xb2,0x77,0x1c,0xc3,0x44,0x3f,0xbf,0x97,0xe8,0x13,0x76,0x60, + 0x64,0xfc,0xb8,0xc5,0x0,0xd3,0x62,0x1,0xcf,0x92,0x5c,0x6,0x60,0x46,0xa6,0xcc, + 0x80,0x66,0x26,0x34,0x7e,0xeb,0x53,0xa7,0xa0,0xd1,0x92,0x5d,0x5b,0xc3,0x2e,0x32, + 0xaf,0x2b,0x41,0x14,0x45,0xf8,0xee,0xd7,0xf,0xe2,0xc3,0x37,0xf,0x61,0xe3,0xea, + 0x4,0xa1,0xed,0xdc,0x85,0x3c,0x28,0x3a,0x79,0x8d,0x20,0x40,0xc4,0x39,0x1a,0x1, + 0x37,0x5f,0xb,0xcc,0xcf,0x4,0x76,0x2f,0xe2,0xb1,0x7d,0x39,0xfe,0xec,0xf7,0x9e, + 0xc1,0x67,0x6f,0xdd,0x85,0xb4,0x53,0xa6,0x7a,0x7e,0x9f,0xa2,0x5e,0xa5,0x64,0x8c, + 0x21,0x8d,0x9,0x7f,0xf3,0x87,0xbb,0x11,0x4f,0xaa,0x22,0xe8,0xab,0x83,0x2f,0x73, + 0xa3,0xa,0x7e,0x1a,0x58,0xb5,0xfc,0x73,0x7,0x41,0x2,0xd0,0x2,0x94,0x8d,0x79, + 0xe0,0xa7,0xb6,0x98,0x65,0xea,0x19,0x53,0x42,0x60,0xdb,0xd5,0xab,0x90,0xa,0x81, + 0xdc,0xf9,0xfc,0x2c,0xb3,0x56,0x6f,0x2c,0x3f,0x11,0x8e,0x0,0x6,0xf8,0x44,0x2a, + 0xc4,0x4a,0x23,0x53,0xa,0x9,0x11,0xf6,0x11,0x3d,0x71,0x2f,0xd1,0x67,0x2c,0xf8, + 0xc3,0xc7,0x3d,0x8,0x74,0xbb,0x87,0xc1,0xeb,0x3,0x68,0x94,0x19,0x80,0x22,0xed, + 0x45,0xe4,0xa,0x7d,0xf3,0x43,0xdc,0xfc,0xdb,0xfd,0x33,0xce,0x6,0xb8,0x8b,0x5f, + 0x57,0x82,0x28,0x8a,0xb0,0x7b,0x48,0xe3,0x4f,0xde,0xb3,0x3,0x9f,0xfa,0xcf,0xdb, + 0xb0,0xfe,0x81,0x4e,0x9,0x76,0x18,0x20,0xa,0x2,0x44,0x61,0x58,0x34,0x76,0xa2, + 0x20,0x44,0x83,0x87,0xd8,0xbb,0x35,0xc5,0x6d,0x9f,0xd9,0x8e,0xf7,0x5e,0xf7,0x24, + 0xee,0xff,0x6e,0x82,0x28,0x6a,0x16,0xb3,0x4,0x7e,0x8b,0xba,0xdb,0xe1,0xe6,0x8, + 0xf6,0x6e,0x15,0xb8,0xfb,0xf6,0xf1,0x2,0x74,0x25,0xc,0xe8,0x86,0x8,0x80,0x70, + 0xa,0x20,0xdd,0x6,0xa9,0x55,0xd9,0x7,0xe5,0x80,0xce,0x1,0x9d,0x81,0xe5,0x43, + 0xa5,0xa4,0xa7,0xa6,0x7d,0xed,0x4a,0xda,0x71,0xa7,0x83,0xf1,0x9e,0x5e,0x3c,0x3d, + 0xf8,0x6a,0xc4,0xc2,0x4c,0x53,0xa5,0x99,0x3,0x3f,0x2f,0x64,0xdf,0x14,0xbb,0x24, + 0x52,0xa9,0x90,0x2a,0x8d,0x4c,0x6b,0x24,0x44,0x18,0xd3,0xb4,0xe7,0x1,0xa2,0x7f, + 0x2,0xb0,0xd6,0x7,0xff,0xf8,0xb9,0x0,0x54,0x3,0xaf,0x22,0x16,0x28,0xea,0x2, + 0x1a,0x4a,0x33,0x4,0x4c,0x43,0x32,0x6,0xae,0xcc,0xf8,0xf5,0x1b,0x6e,0x1e,0xc0, + 0xc3,0xdf,0xef,0xe0,0xe9,0xc7,0xf2,0x4a,0x1c,0xe0,0x7c,0xb2,0x2f,0xcb,0x7e,0x95, + 0xd0,0x91,0xe2,0xa9,0xc7,0x72,0x6c,0xf8,0xf9,0x6e,0xf4,0xcd,0x3,0xce,0xb9,0xb8, + 0x89,0xf3,0x2f,0xeb,0x43,0xd8,0x0,0xce,0xb9,0xa4,0x17,0xdb,0x9e,0x4e,0x10,0x4f, + 0x69,0xec,0xd8,0x9c,0x62,0xd7,0x50,0x8a,0x1d,0x9b,0xa4,0x5d,0xe4,0x19,0x21,0x6c, + 0x84,0x95,0xd,0xa9,0xfc,0x72,0xb4,0x6b,0x34,0xf9,0x6d,0x60,0x3f,0x4d,0x7d,0xea, + 0xe1,0x4,0x2f,0x7f,0x7d,0xb,0xac,0x69,0xc0,0x96,0x1e,0xf8,0x5,0x31,0xca,0x3a, + 0x80,0x95,0xfd,0x73,0x6,0xa1,0x73,0x18,0x2,0x64,0x90,0x2a,0x46,0x3e,0xf2,0x39, + 0xa8,0x9e,0x3f,0x45,0xaa,0xce,0xb7,0xe0,0xc7,0x68,0xb7,0x3b,0xe8,0x74,0x3a,0x45, + 0x5f,0x63,0x2a,0x6a,0x62,0xcf,0x85,0x2f,0xc3,0xb9,0xf,0x3d,0xc,0x95,0x67,0xd6, + 0xe7,0xcb,0xd2,0xf2,0x95,0x42,0xaa,0x14,0x12,0xa5,0x91,0x6a,0x85,0x94,0x8,0x63, + 0x44,0x7b,0x7e,0x2,0xfa,0x42,0x1b,0xf8,0x16,0x11,0x6d,0x7b,0x6e,0xe6,0x1,0x6a, + 0xc1,0x60,0xb1,0x81,0x92,0x5b,0x32,0x66,0xd3,0x33,0x49,0xc,0x4c,0x33,0x48,0xc6, + 0xc0,0x94,0x2,0xcb,0x81,0x5b,0xff,0xf2,0x34,0x7c,0xf4,0xe6,0x1d,0x18,0x1b,0xce, + 0x8a,0x7c,0xdc,0x59,0x7c,0x9d,0x4,0xae,0x50,0xe4,0x82,0x47,0x57,0xac,0x49,0xdb, + 0x1a,0xeb,0x1e,0x10,0x58,0x73,0xff,0x98,0xfd,0xd9,0x11,0xdf,0xff,0x9a,0xce,0x9f, + 0x1d,0xed,0x76,0x87,0x3,0xdb,0x55,0x3,0xfd,0x5a,0x80,0x7f,0xf8,0xf3,0x5,0x5a, + 0x6b,0x5c,0xf5,0xd6,0x39,0x88,0x7a,0x19,0xe2,0x44,0x41,0x66,0xda,0x58,0x7d,0x6a, + 0x5d,0x82,0x25,0x81,0x8d,0x47,0x5f,0xfe,0x57,0x9f,0xbd,0xe5,0x9c,0x2a,0xf8,0x39, + 0xa4,0x8a,0x91,0x8e,0x7c,0xe,0xc8,0x27,0x30,0x27,0xfb,0x34,0xe,0x84,0xb7,0x21, + 0xb6,0x8b,0x55,0x3a,0x9d,0xe,0x3a,0xed,0xe,0xda,0xed,0x29,0x4c,0x4d,0x4d,0xe1, + 0xe0,0xc1,0x83,0x18,0xf,0x22,0x3c,0x75,0xee,0xb9,0xb8,0x78,0xdd,0x7a,0xcc,0xab, + 0x80,0x6f,0x2c,0x3f,0xd1,0xa,0xa9,0xd6,0x6,0x7c,0xad,0xf7,0xfc,0x4,0x70,0xe0, + 0xaf,0x7b,0xee,0x6,0x42,0x6a,0x2c,0x70,0x77,0xe0,0xd2,0x76,0x67,0x4d,0x46,0x0, + 0xd3,0x66,0xd1,0x98,0xdb,0x4e,0xde,0xad,0x1b,0x6a,0x84,0x21,0x7e,0xff,0xaf,0x97, + 0xe0,0xe3,0xef,0xda,0x8d,0x2c,0x36,0x20,0xf8,0x3d,0x7f,0x9f,0x4,0x3e,0xa8,0xe, + 0x58,0xa7,0x6,0x75,0xf0,0xe0,0x65,0x4,0xfe,0xeb,0xf8,0x84,0xf2,0xd3,0xbd,0xba, + 0xa5,0x77,0x6b,0x3d,0x9f,0x7e,0x4e,0x3,0x2f,0x7b,0x75,0xf,0x3a,0xb1,0x34,0xc0, + 0xe7,0x4,0x91,0xe9,0x4a,0x3c,0x20,0x32,0xc2,0xc4,0xb0,0x8c,0xfe,0xe8,0x43,0xbf, + 0xfe,0x86,0xdf,0x7d,0xef,0x4d,0x57,0x19,0x9f,0x6f,0x8,0xa0,0x40,0x5,0xf8,0xa4, + 0x34,0xb8,0x1c,0xc6,0xbc,0xf4,0x2f,0x70,0x20,0x79,0x57,0x5,0xfc,0x83,0x93,0x93, + 0x76,0xa6,0x61,0x1c,0x13,0x13,0xe3,0x18,0x9d,0x6c,0x63,0x7d,0xdf,0x1c,0x2c,0xc9, + 0x5,0x2e,0x4d,0x33,0xf4,0x38,0xf0,0x95,0x7,0x3e,0xd1,0x61,0xc1,0x3f,0xee,0x4, + 0x28,0x55,0x0,0x76,0x63,0x8,0xb3,0x64,0xcc,0xdc,0x62,0xc6,0xd4,0x4,0x98,0x36, + 0x7b,0xf2,0x32,0x7b,0x2f,0x1,0xc6,0x14,0x16,0x2e,0x6f,0xe2,0x53,0xff,0xb0,0xc, + 0x7f,0xfc,0x6b,0x3b,0x91,0xc5,0xa6,0x43,0xa7,0x94,0xaa,0x28,0x41,0xe5,0xef,0xd4, + 0xc8,0xe0,0x48,0xe0,0x83,0xdf,0xed,0x67,0x7c,0xd0,0xfd,0xe7,0x3e,0xf8,0xab,0x6e, + 0x9c,0x87,0xad,0xcf,0xb4,0xb1,0x7d,0x63,0x5e,0xf9,0xbd,0x46,0x93,0x70,0xdd,0x3b, + 0xe7,0x21,0x4f,0x35,0xf2,0xcc,0xdc,0x71,0x24,0x4f,0x6d,0xe4,0x9f,0x97,0xe7,0xd1, + 0x5d,0x12,0x37,0x5e,0x7d,0x7d,0xeb,0x93,0x1f,0x79,0xf7,0x55,0xd0,0xc2,0x58,0x3e, + 0xe5,0x50,0xbc,0x17,0xe9,0xc8,0x5f,0x15,0xe0,0x93,0x24,0x90,0xd2,0x58,0xa0,0x7e, + 0x80,0xfe,0xbc,0x89,0x7d,0x9d,0xd7,0xa1,0xdd,0x69,0x63,0xb2,0xe,0xfe,0xe8,0x28, + 0xf6,0xef,0xdf,0x8f,0x4e,0xa7,0x83,0x27,0xb4,0xc2,0x6a,0x1e,0x40,0x43,0x22,0x22, + 0xc2,0x80,0xd6,0x18,0x23,0xc2,0x88,0xd6,0x7b,0x8,0xf8,0x2,0xe,0x3,0xfe,0x73, + 0x12,0x3,0xf8,0x77,0xec,0x98,0xee,0xa,0x34,0x14,0x99,0x7b,0x33,0xba,0x5d,0x45, + 0x1d,0xb4,0x8b,0x96,0x37,0xf1,0xe9,0xaf,0x2d,0xc3,0x1f,0xfd,0xea,0x4e,0xa4,0x1d, + 0x5d,0x14,0x83,0x7c,0x57,0xe0,0xc0,0xac,0x5b,0x68,0x3d,0x7f,0xef,0x76,0xae,0x3f, + 0xae,0x4b,0xbc,0xd6,0x1a,0xab,0xde,0x3c,0x80,0x77,0xdd,0xba,0x14,0xed,0xa9,0xc, + 0x7f,0xf0,0x2b,0xcf,0x20,0x6e,0x97,0xaa,0xb2,0xea,0x97,0x6,0x10,0xf5,0x31,0x74, + 0x62,0x85,0x3c,0xd5,0x55,0xcb,0x77,0xe0,0xef,0x94,0x78,0xd3,0xab,0xae,0xc3,0xe7, + 0x3e,0x72,0x6b,0x54,0x80,0xaf,0x33,0x28,0xde,0x87,0x74,0xe4,0xf3,0xa0,0xce,0x13, + 0x15,0xf0,0xcd,0x41,0x58,0x11,0x7c,0xf,0x5b,0xd3,0x7e,0x4c,0x1e,0x5c,0x62,0xc1, + 0x1f,0xc3,0xc4,0xc4,0x4,0x46,0x47,0x47,0x70,0x60,0xff,0x81,0xa2,0x74,0x9d,0x67, + 0xb9,0x59,0x40,0x23,0x25,0xa6,0x94,0xc2,0x1,0xad,0xa1,0x89,0xf6,0xe0,0x8,0xc1, + 0x3f,0xee,0x69,0xa0,0x9f,0x11,0xc0,0xeb,0xc,0xea,0x62,0x30,0x84,0xec,0x32,0x6a, + 0x32,0xd9,0x80,0xd2,0x66,0xaf,0x3f,0x7b,0x2c,0x5c,0xde,0xc4,0xff,0xfb,0x7f,0xcf, + 0xc2,0x19,0xe7,0xf1,0x4a,0x29,0xb6,0x5b,0xf7,0xb0,0x3e,0x55,0x54,0xf,0xd8,0xfc, + 0x26,0x53,0x7d,0x18,0xb5,0x5e,0xee,0x95,0x4a,0xe2,0x3d,0x1f,0x3d,0xd,0xef,0xbc, + 0x75,0x9,0xda,0x49,0xe,0x41,0x84,0xdf,0xf9,0xf4,0xe9,0x88,0x5a,0x86,0x20,0xa7, + 0x9f,0x13,0xe1,0xa2,0xab,0x7a,0x91,0xa6,0xa,0x59,0xaa,0xac,0x2,0xe8,0x22,0xea, + 0xf7,0xc1,0xff,0x1f,0x1f,0xfd,0x10,0xfc,0x80,0xcf,0x80,0xff,0x57,0xa0,0xce,0x7a, + 0x90,0x9c,0xe,0x3e,0x49,0x8d,0x50,0xa7,0x78,0xfd,0xc2,0xff,0x8d,0x45,0xec,0x7b, + 0x18,0x1f,0x1b,0xb7,0xe0,0x8f,0x62,0x64,0x64,0xc,0x6d,0xd7,0xb7,0xc8,0xb3,0x62, + 0xf5,0x54,0xd1,0x46,0x3f,0x4a,0xf0,0x9f,0x1b,0x5,0xa8,0x5,0x84,0xe5,0x56,0xf2, + 0xe5,0x46,0x8a,0x4a,0x97,0x6b,0xfd,0xa,0x99,0xb6,0x7b,0x6,0xf5,0x2d,0x8,0xf1, + 0x89,0xff,0x75,0x16,0xbe,0xf9,0xc5,0xfd,0xf8,0xb7,0xbf,0x1b,0x2b,0x14,0xc0,0x77, + 0x5,0x8c,0xcd,0xdc,0x6b,0xe9,0x66,0xe9,0x33,0x59,0x3e,0x11,0x61,0xc1,0xe2,0x10, + 0xbf,0xfb,0x99,0xb3,0x70,0xea,0x19,0xd,0x74,0x52,0x1,0x91,0x6b,0x88,0x5c,0xa3, + 0x67,0x41,0x88,0xb7,0xff,0xe6,0x22,0xfc,0xeb,0x17,0xf6,0xe3,0xda,0xff,0x38,0x80, + 0x38,0x55,0x48,0x13,0x85,0x2c,0xf1,0xc1,0x37,0x2a,0x50,0x5,0xdf,0xf9,0x7c,0x61, + 0xc0,0x3f,0xf0,0x57,0xa0,0xf8,0x9,0x3,0xbe,0x3,0xdd,0x3,0x9f,0x14,0x1,0x4a, + 0xa3,0x1,0x89,0xb7,0xad,0x58,0x8d,0x30,0xd9,0x83,0x7f,0xd8,0xbc,0xc,0xa3,0xa3, + 0xa3,0x98,0x9a,0x9a,0x2a,0xba,0x96,0x22,0xf7,0xfb,0x26,0xa,0x5a,0x1f,0x3d,0xf8, + 0xcf,0x19,0x1,0xa6,0xbb,0x2,0x17,0x14,0x96,0x37,0x71,0xb2,0xf9,0xa1,0xb7,0xd9, + 0xb2,0x4,0x51,0x60,0xa6,0x74,0x9a,0x1,0x7e,0xe5,0x43,0x4b,0x30,0xf8,0x86,0x7e, + 0xfc,0xcf,0xdf,0xdf,0x85,0xfd,0xbb,0x64,0x25,0x88,0x9b,0x89,0x4,0x47,0x23,0xfd, + 0x8c,0x11,0xde,0xfa,0x9e,0x53,0xf0,0xfa,0xb7,0x2f,0x40,0xd0,0x4,0xe2,0x54,0x20, + 0xcf,0x35,0x72,0x4b,0x0,0x91,0x11,0x16,0x9f,0x13,0xe1,0xd7,0x3f,0xb1,0x4,0x1a, + 0x84,0x34,0x91,0x48,0x9d,0xf5,0xa7,0x1a,0x22,0x35,0x96,0x3f,0x52,0x7,0x9f,0xb2, + 0xd2,0xe7,0x3b,0xf0,0xb,0xe0,0xbb,0x83,0xef,0x7f,0xff,0x4d,0xe7,0xee,0xc6,0xd2, + 0x68,0x4,0xff,0xfd,0x1b,0x73,0x70,0x20,0x95,0xc8,0xf2,0x1c,0x22,0xaf,0x59,0xfe, + 0x31,0x82,0xff,0x9c,0x12,0xa0,0xb8,0xa7,0x13,0xb3,0x5,0x5b,0x1b,0xf,0x14,0x24, + 0xd0,0x1a,0x60,0xf5,0x7a,0x81,0x59,0x5a,0xa6,0x88,0xa0,0x34,0xc7,0x59,0x97,0xf4, + 0xe0,0x6f,0xee,0x3d,0x1f,0xf7,0x7d,0x6b,0x1c,0xff,0xfb,0xf3,0xc3,0x18,0xde,0x21, + 0x8e,0x88,0x0,0x87,0x52,0x2,0x80,0xf0,0xba,0x9b,0x16,0xe0,0xc6,0xff,0x74,0xa, + 0xfa,0x17,0x70,0x64,0xb9,0xb5,0xec,0x4c,0x23,0xcb,0x35,0x64,0xee,0x59,0x78,0x6e, + 0xa,0x57,0x59,0xa6,0xcd,0x32,0xb1,0xc4,0x3c,0x76,0xdf,0x2b,0x2d,0xff,0x56,0x5b, + 0xe0,0x71,0x1,0x5f,0xdd,0xf2,0xa7,0xcb,0x7e,0x37,0xf0,0x49,0x99,0x1d,0x34,0x2e, + 0x59,0x1a,0xe3,0xeb,0xbf,0xd3,0xc1,0x57,0xbe,0xdd,0x83,0xdb,0x7e,0x22,0x91,0xd8, + 0x8d,0x34,0x94,0xd2,0x0,0xf4,0x31,0x83,0xff,0xdc,0x2a,0xc0,0x34,0x12,0x68,0x73, + 0xdf,0x3f,0x9f,0x4,0x30,0x1b,0x44,0xb8,0xb2,0x9,0x91,0xe9,0x22,0x6,0x44,0xd0, + 0x3a,0x80,0xe2,0x1a,0x4a,0x73,0x5c,0x75,0xe3,0x0,0x56,0xbd,0x6d,0x3e,0x1e,0xfd, + 0xe1,0x41,0x3c,0xf2,0x83,0x83,0x78,0xe0,0xee,0x83,0x68,0x1f,0x94,0x87,0x24,0x40, + 0x85,0x4,0x20,0xac,0xbc,0xa8,0x17,0xaf,0x79,0xcb,0x7c,0xfc,0xc2,0x9b,0x7,0xc0, + 0x22,0x86,0x3c,0x97,0x88,0x33,0x81,0x3c,0x57,0xc8,0x72,0x65,0xa2,0x7a,0xeb,0xdb, + 0xd,0x9,0x8c,0x7f,0x77,0x16,0xef,0xbe,0x2f,0x52,0x5d,0xf8,0xfc,0x1b,0xa6,0xc9, + 0x7e,0x69,0xf9,0x3a,0x7e,0xc2,0x74,0xe5,0x2a,0x41,0x5f,0xf5,0x8c,0xda,0xd7,0xa0, + 0xed,0x63,0x4d,0xd8,0xbd,0x2b,0xc2,0x6b,0x75,0x7,0xab,0xae,0x36,0x53,0x47,0xd0, + 0x84,0xf1,0x84,0xf6,0x7c,0xe0,0x31,0x7c,0x61,0x38,0x3d,0x36,0xf0,0x9f,0x73,0x2, + 0xd4,0x49,0xe0,0xee,0xc6,0xe9,0x48,0x40,0x64,0x9e,0x12,0xb4,0xdd,0x52,0x90,0x95, + 0x1,0x23,0x23,0x4,0x4e,0xd,0x88,0x20,0x34,0xc3,0xcb,0x57,0xf5,0xe3,0xd2,0xd7, + 0xcd,0xc5,0x6f,0x7f,0xe6,0xc,0x6c,0x78,0xa4,0x8d,0xad,0x4f,0xc5,0x38,0xb0,0x3b, + 0xc7,0xe6,0xf5,0x89,0xd9,0x2a,0x86,0x9b,0x45,0x28,0x20,0xa0,0x6f,0x6e,0x80,0xb3, + 0xce,0x6f,0xe1,0x8c,0xb,0x7a,0x71,0xc1,0xe5,0x7d,0x68,0xf6,0x32,0x8,0xa1,0x91, + 0xe7,0xa,0x69,0xa6,0x4b,0xe0,0x73,0x85,0x2c,0xd5,0x10,0xc2,0x44,0xf6,0x79,0x11, + 0xd8,0x19,0x4b,0x37,0x11,0x3f,0x21,0xf3,0x52,0xbe,0x91,0x5d,0xc2,0x3,0x3f,0xaf, + 0x81,0xff,0xf9,0xc3,0x80,0xaf,0x1,0x67,0xfd,0xd2,0xde,0xd,0xc5,0x7,0x5f,0x11, + 0x76,0xef,0x8e,0xd0,0x79,0x2c,0x5,0x29,0xd3,0x5a,0x26,0x45,0x98,0x48,0x9f,0x3d, + 0xf8,0xcf,0xb,0x1,0x7c,0x12,0x18,0x4b,0xd7,0x66,0x23,0x6,0x70,0x73,0x8b,0x17, + 0x4d,0x45,0x65,0x88,0xdc,0x86,0x53,0x64,0xf6,0xf6,0x2f,0xb2,0x6,0x6e,0x17,0x88, + 0x70,0xe,0xae,0x19,0x84,0x62,0x38,0xe7,0xb2,0x1e,0x9c,0x7b,0x79,0x6f,0x71,0x83, + 0x2a,0x66,0x8b,0x4e,0x6e,0xb5,0x8e,0x22,0xb3,0x1d,0x8d,0x54,0x66,0x84,0x2b,0xce, + 0x34,0x84,0x50,0x10,0x82,0x90,0xb,0xeb,0xcb,0x73,0x85,0x3c,0xf7,0xa5,0xdf,0x59, + 0xbd,0x9,0xf0,0x84,0x2d,0xec,0x8,0xef,0xf9,0xe8,0x2e,0x81,0x1b,0xae,0xbc,0xe, + 0xff,0xe3,0xf,0x6e,0xed,0xa,0x3e,0xd5,0xc1,0xd7,0x75,0x99,0xa7,0xd2,0xf2,0xbb, + 0x80,0xbf,0x6b,0x77,0x84,0xd8,0x7,0x5f,0xce,0x1e,0xf8,0xcf,0x1b,0x1,0xea,0x24, + 0x60,0xb6,0x49,0x64,0xf6,0x15,0x73,0xb7,0x74,0xd4,0xa6,0x95,0xac,0xed,0x7e,0x43, + 0x76,0x93,0x7,0xce,0xcd,0x59,0x31,0x6,0x6e,0x3b,0x73,0xe5,0x9d,0x40,0x58,0x71, + 0x7b,0x7a,0x86,0x72,0xe7,0x6e,0xb2,0x46,0x66,0x8,0xa0,0x21,0x85,0x19,0xe3,0xaa, + 0x10,0x40,0x10,0x44,0xae,0x8c,0xe5,0xe7,0x64,0x83,0xbf,0x32,0xad,0x73,0xa,0x20, + 0x3c,0x45,0x18,0xdd,0xa5,0x70,0x7d,0x1,0xbe,0x28,0x8,0xa0,0x82,0xc3,0x59,0x3e, + 0x55,0x2d,0xdf,0x97,0x7d,0x8f,0x8,0x5,0xf8,0xd2,0xe,0x95,0xe8,0x2,0xfc,0x2f, + 0xe,0xa7,0xf8,0xf6,0xb3,0x5,0xff,0x79,0x25,0xc0,0x74,0x25,0xf0,0xee,0xfc,0x4c, + 0xce,0x25,0x58,0xe0,0xb,0x90,0x9,0x9c,0x18,0x34,0xab,0x2,0xef,0x6e,0x3c,0x55, + 0xdc,0x9e,0xe,0xde,0x48,0xba,0x26,0x3b,0x8,0x43,0x76,0x45,0xf,0x15,0x73,0x7c, + 0x22,0xd7,0x10,0xc2,0xde,0x82,0xc6,0x3e,0xce,0x9d,0xa5,0xbb,0x52,0x6e,0x41,0x4, + 0x5d,0x92,0x41,0x0,0xa3,0xbb,0x14,0x6e,0x18,0x7c,0x23,0xfe,0xdc,0x7,0x9f,0xe, + 0x7,0x7e,0x1d,0xec,0x2e,0x3e,0x5f,0x1b,0x9f,0x5f,0xb7,0x7c,0x68,0xc2,0x58,0x4c, + 0x7b,0x3f,0xb8,0x1a,0xb7,0xd,0xa7,0xf8,0xe,0x80,0x75,0xb3,0x81,0xc1,0xf3,0x4a, + 0x80,0xe9,0x31,0x81,0x7f,0xb,0xd6,0x72,0x9a,0x88,0x79,0x53,0x41,0xda,0x1e,0x66, + 0xb2,0x7,0xde,0xad,0xe7,0x50,0x74,0x1d,0x99,0xbd,0x73,0xa7,0x73,0x1,0x6e,0xd5, + 0xae,0x94,0x1a,0x5a,0xc1,0x10,0x40,0x11,0x84,0x23,0x82,0xd4,0x36,0x1e,0x20,0xab, + 0xc,0x66,0xc6,0x4f,0xb8,0xc3,0x76,0xf8,0xdc,0xd4,0xcf,0xc8,0x4e,0x89,0x1b,0xae, + 0x7c,0x23,0xfe,0xfc,0xf7,0xab,0x96,0xaf,0x49,0x21,0x1d,0x35,0xe0,0x93,0x9c,0x1e, + 0xd4,0x4d,0x3,0xdf,0xf7,0xf9,0x15,0xcb,0x6f,0x94,0xe0,0x4b,0xf3,0x7b,0x63,0x9, + 0xd,0x7f,0xf0,0x31,0x7c,0x65,0x5f,0x86,0x3b,0x1,0xac,0x9f,0xad,0xeb,0xff,0xbc, + 0x13,0xc0,0xaf,0x16,0xba,0x5b,0xbc,0x12,0xc8,0xde,0x65,0x9c,0x55,0x5d,0x85,0x23, + 0x1,0xe0,0xdd,0xe8,0xd1,0x2f,0x9,0xa3,0xb8,0x9d,0xbc,0xb9,0xb7,0xa0,0x21,0x81, + 0x59,0xa9,0x63,0x17,0x6d,0x68,0x3,0xb2,0x19,0xe3,0xaa,0x2,0x2d,0xad,0xfc,0xbb, + 0x71,0x2e,0xbf,0xa5,0x2b,0xec,0xd7,0x46,0x76,0x4a,0xbc,0x69,0xf0,0x8d,0xf8,0x5c, + 0x1,0x7e,0x6,0x68,0x1,0x4d,0xa,0xc9,0xd8,0x97,0xa0,0x93,0x67,0x4a,0xf0,0xbb, + 0x54,0xf9,0x48,0xcf,0x0,0xbe,0x8d,0xf6,0x77,0xed,0x6a,0x20,0x5e,0x9d,0x95,0xb2, + 0x6f,0xc0,0xdf,0xf7,0x81,0xc7,0xf0,0xd5,0xfd,0x19,0xee,0x2,0xf0,0x44,0xd9,0xd2, + 0x60,0x20,0x7a,0x76,0x3b,0x10,0x9d,0x10,0x4,0x98,0x49,0xd,0x1c,0x11,0xca,0x3a, + 0x92,0xed,0x26,0x7a,0x64,0x70,0x4d,0x26,0xb8,0x7b,0x4,0x52,0x75,0x5d,0xa2,0xd6, + 0xb0,0xab,0x76,0xcd,0x4e,0xe4,0x46,0x1,0xc,0x1,0x84,0x37,0xc8,0xe9,0xe6,0xfa, + 0x2b,0xc3,0x9d,0xd2,0x8e,0x7b,0x9,0x82,0xca,0x9,0x23,0x3b,0x24,0x6e,0x28,0xc0, + 0x77,0xc3,0x1c,0x47,0x8,0x7e,0x21,0xf3,0xb5,0x80,0xaf,0x2,0x7e,0x84,0x78,0x75, + 0xe9,0xf3,0x49,0x11,0x46,0x13,0xda,0xff,0x81,0xc7,0xf0,0xf5,0x3,0x19,0xee,0x1, + 0xf0,0x24,0x66,0xf9,0x86,0x64,0x27,0x14,0x1,0xea,0x6a,0x50,0x25,0x82,0xbd,0x1, + 0xa5,0x53,0x5,0x8f,0xc,0x40,0xb9,0xfc,0xaa,0xe0,0x81,0x36,0xf,0xb4,0x25,0x81, + 0x92,0x76,0xb3,0x6,0xab,0x4,0xbe,0x3b,0x50,0x56,0x6a,0xa5,0x1d,0xee,0x54,0x5d, + 0x8e,0x91,0x5d,0x12,0xd7,0x5f,0x79,0x1d,0x3e,0xf7,0xe1,0x5b,0x3c,0xd9,0x3f,0x6, + 0xf0,0xe5,0x21,0xc0,0xaf,0xa5,0x7a,0x23,0x31,0x8d,0x7c,0xe0,0x31,0xfc,0xf3,0x48, + 0x8e,0xef,0x5b,0xf0,0x67,0xfd,0xdf,0x9,0x47,0x80,0xae,0x44,0x40,0x19,0x28,0x3a, + 0x55,0x28,0x63,0x3,0xe6,0x6e,0xe0,0x59,0xfc,0x62,0xb9,0x14,0x1d,0xe5,0x3a,0x7d, + 0x32,0x1b,0x3e,0x6a,0x65,0xa7,0x92,0x95,0x55,0x84,0x72,0x5,0x55,0xb1,0x96,0xaf, + 0x5c,0xe1,0x63,0x48,0x31,0xb2,0x53,0xe0,0xba,0x57,0x3a,0xf0,0x7d,0xcb,0x97,0x48, + 0xc6,0x6e,0x83,0x8e,0x9f,0x29,0xb,0x39,0x3e,0xf8,0xb2,0x4,0x18,0xf5,0xe7,0xba, + 0x8b,0xe5,0x7b,0xe0,0x1f,0x88,0x69,0xf4,0x83,0x8f,0xe1,0x9b,0x23,0x39,0x7e,0x64, + 0xc1,0x27,0xef,0x78,0xf1,0x13,0xa0,0x42,0x84,0x2e,0xaa,0x50,0xba,0x5,0x2a,0xef, + 0x48,0xe7,0xee,0xde,0x49,0xcc,0x58,0x99,0x73,0x1,0xe4,0xb2,0x0,0x5b,0x54,0x92, + 0x86,0x18,0xca,0x6e,0xdf,0xa2,0x25,0x95,0xcb,0xbb,0xa5,0x37,0xe5,0xab,0x8,0x23, + 0x3b,0x4,0xde,0x78,0xf9,0x75,0xf8,0x7f,0x7e,0xcf,0x7,0xdf,0xdc,0x5e,0x66,0x3a, + 0xf8,0x55,0x5f,0x3f,0xcd,0xf2,0xb,0x32,0x78,0xd1,0xbe,0x2f,0xfb,0xd2,0x6c,0x2b, + 0xb3,0xaf,0x4d,0x63,0xb7,0x3c,0x8e,0x6f,0x8d,0x1a,0xf0,0x37,0xc0,0xed,0x8f,0x57, + 0x25,0x0,0x3d,0x5b,0xff,0xff,0x82,0x20,0xc0,0x4c,0xad,0x65,0x7f,0x45,0x50,0x79, + 0xef,0x46,0x37,0x81,0xac,0xad,0x1b,0xb0,0x2b,0x93,0xed,0x46,0x4d,0x64,0x37,0x70, + 0xd0,0xf6,0xb6,0x6e,0xe5,0x2e,0x1e,0xc6,0xfa,0xdd,0xd9,0xa9,0xc1,0xf8,0x5e,0x85, + 0x97,0x2d,0xbd,0xc4,0x3,0x3f,0xf3,0x2c,0xff,0xcb,0x87,0x6,0xdf,0xf,0xf8,0x54, + 0xd,0x7c,0xe5,0xa5,0x7a,0xbe,0xcf,0x2f,0xc1,0xbf,0x63,0x34,0xc7,0xf,0x6d,0xc0, + 0x27,0x0,0xc8,0x19,0x48,0x80,0x93,0x8a,0x0,0x5d,0x95,0xc1,0x23,0x6,0x79,0xf7, + 0xa8,0x2c,0xc0,0x77,0xcf,0x6d,0xbf,0x89,0xdc,0xa1,0xcc,0x2,0x4e,0xd2,0x2e,0x50, + 0xf4,0xf,0x6b,0xfd,0x3b,0x15,0xfd,0xd3,0x7f,0xbb,0x95,0x95,0x96,0x2f,0xad,0xcf, + 0xff,0x72,0x17,0xd9,0xa7,0x43,0xe7,0xf9,0xba,0x7b,0xc0,0xa7,0x25,0xd9,0xb8,0x60, + 0x1a,0xf8,0xeb,0x1,0x64,0x0,0xf2,0xe7,0x9a,0x0,0x6b,0xa7,0xc6,0xd4,0x7d,0xfd, + 0xb,0x82,0x55,0x2f,0x64,0x46,0x50,0x37,0x42,0x68,0x14,0x7b,0x14,0xb9,0xaf,0x69, + 0x45,0x45,0x96,0x30,0xba,0x4b,0xea,0xe1,0x2d,0x42,0x1f,0xd8,0x2a,0xd5,0xc4,0x3e, + 0x45,0x57,0x5d,0xf9,0xda,0x70,0xf9,0x92,0xf9,0x61,0x29,0xfb,0x87,0xb0,0xfc,0x5a, + 0xb5,0x6f,0x5a,0xd,0xc0,0xa9,0x81,0x26,0x6c,0x9d,0xea,0x85,0x78,0xac,0x6d,0x15, + 0xc3,0x7c,0x6f,0x7f,0x87,0x46,0x6f,0x79,0x1c,0xff,0xe6,0x81,0x9f,0xda,0x23,0xb7, + 0x2a,0xe0,0x13,0x0,0xb3,0x21,0xff,0x33,0x11,0xe0,0xb1,0x3d,0x1b,0xe5,0x3d,0xe7, + 0xbe,0x2a,0xb8,0x82,0x73,0xf4,0xbc,0xe0,0x94,0xc1,0x5f,0x17,0xe8,0x9e,0xeb,0xf2, + 0xeb,0x5,0x9,0x14,0x70,0x60,0x87,0xd4,0xbb,0x9f,0x14,0x6a,0xf7,0x26,0xa1,0x86, + 0x37,0xe5,0x32,0x4f,0xc9,0xed,0x47,0xab,0x0,0x4,0x97,0x5f,0x76,0x59,0x2f,0xc0, + 0x43,0x57,0xe4,0xf1,0xc1,0x27,0xa5,0x4d,0xa5,0x4f,0x1e,0x81,0xe5,0x6b,0x6d,0xfd, + 0xbe,0x1,0x3f,0xbb,0xaf,0x63,0x9e,0x5b,0xe5,0xd8,0x1f,0xd3,0xc8,0x2d,0xab,0xf1, + 0x8d,0x51,0x13,0xed,0x6f,0xb0,0x96,0x9f,0x79,0xe0,0xfb,0xa,0xa0,0x8f,0xab,0x2, + 0x10,0xd1,0x38,0x63,0xec,0xc7,0x7,0xf,0xc8,0x2b,0xe6,0x2f,0xe,0x6f,0x3a,0xf1, + 0x1,0x3f,0x2,0x15,0xb0,0x3f,0xb7,0xf3,0x89,0x5c,0x6d,0x7b,0x22,0x97,0x3b,0xd7, + 0xe5,0x72,0xe7,0x53,0xb9,0xbb,0xa8,0xd2,0x5e,0x64,0x51,0x7b,0x85,0xfe,0xf7,0xff, + 0xf6,0xfb,0x23,0xdd,0x98,0x84,0x66,0xd,0x64,0xc3,0x9f,0x86,0x8e,0x37,0x1a,0x80, + 0xfd,0x74,0x4f,0x1f,0x89,0xec,0xd7,0xc0,0x4f,0xca,0xca,0xe0,0x48,0x4c,0x7,0x6e, + 0x59,0x8d,0xff,0x33,0x92,0xe3,0x5e,0xb,0xbe,0xf0,0xe,0xe9,0x81,0xaf,0x66,0x1b, + 0xfc,0x43,0xc5,0x0,0xf,0xee,0x7a,0x52,0xdc,0xd9,0xbf,0x90,0xaf,0xa,0x43,0xbe, + 0xe0,0x85,0x20,0xff,0x95,0xd5,0xc0,0x4,0xa4,0x53,0x9a,0xb6,0xae,0xcd,0xe4,0xde, + 0xcd,0x52,0x6f,0x5d,0x9b,0x89,0xed,0x6b,0x73,0xe1,0x59,0x94,0xb0,0x16,0x86,0x19, + 0xfc,0x6a,0x70,0xf9,0xe5,0x97,0xcd,0x5d,0xbe,0xfc,0x74,0x2e,0xd5,0x62,0x88,0xad, + 0xef,0xb3,0x96,0x4f,0x33,0x94,0x78,0x75,0xa5,0xc1,0xe3,0xc0,0x2f,0x8,0xa1,0x9, + 0x5b,0xa6,0x7a,0x91,0xdf,0x6f,0xc1,0xb7,0xb7,0xca,0x19,0x89,0x69,0xff,0x7,0x1f, + 0xc7,0xd7,0x47,0x72,0xdc,0x6d,0xc1,0xaf,0x3,0xae,0xba,0x59,0xfe,0x6c,0xc9,0xff, + 0x8c,0x4,0x20,0x22,0xc5,0x18,0x5b,0x33,0xba,0x4b,0x7d,0x6b,0xf1,0x59,0xfc,0xdd, + 0x2f,0x4,0xe9,0xcf,0x2c,0xe0,0xdb,0xd6,0xe4,0x72,0xcb,0x63,0x99,0xd8,0xbd,0x49, + 0xb8,0xe0,0x29,0xf3,0xe,0x5d,0xbb,0xa0,0xa8,0x59,0x95,0x4b,0x2e,0xe6,0xbd,0xe7, + 0x3d,0xef,0x8e,0xb4,0x92,0xd0,0x62,0x2,0x7a,0xea,0x81,0xc2,0xda,0x71,0xc8,0x9e, + 0x7e,0x35,0xef,0xf7,0x65,0x3f,0xbf,0xaf,0x3,0x96,0xe8,0x22,0xda,0x1f,0x8d,0x69, + 0xf8,0x96,0xc7,0x71,0xfb,0x81,0xb2,0xbc,0x5b,0x7,0x5b,0xd7,0x80,0xa7,0xd9,0x4a, + 0xfd,0x8e,0x28,0xb,0x20,0xa2,0x9f,0x33,0xc6,0xee,0x9a,0x7f,0x6a,0xb8,0x2a,0xea, + 0x65,0x2b,0x4f,0x34,0xc0,0xc7,0xf7,0x29,0xbd,0x6d,0x75,0x26,0xb7,0xae,0xcd,0xe5, + 0x9e,0x8d,0xb9,0xd8,0xbd,0x51,0xe4,0xd6,0xc2,0x53,0xf,0x70,0xe5,0xc9,0xbc,0xee, + 0x72,0x81,0xeb,0x8e,0x23,0x85,0xd9,0x72,0xfd,0xf4,0x5f,0x7c,0xcb,0x9b,0xce,0xd2, + 0x5a,0x42,0xe5,0x63,0xd3,0x80,0xee,0x6,0xfe,0xf4,0x49,0x9e,0xaa,0xec,0xfb,0xe0, + 0x8f,0xc5,0x34,0x7c,0xcb,0x6a,0xfc,0xbd,0xad,0xed,0xaf,0x9b,0x1,0x6c,0x5d,0x2f, + 0xfe,0xcc,0x36,0xf8,0x47,0x92,0x6,0xae,0xdd,0xb7,0x45,0xdc,0xb1,0xfc,0xe2,0xe8, + 0x43,0xcf,0x37,0xe0,0xc3,0x9b,0x84,0xda,0xbb,0x59,0xa8,0xad,0x6b,0x73,0x31,0xf4, + 0x68,0x96,0x8f,0xed,0x91,0xc2,0x3,0xda,0x81,0x2e,0x3d,0x9f,0xae,0x6b,0x92,0xaa, + 0xbb,0xc8,0x69,0x6,0x20,0x1,0x30,0x5,0x60,0xdc,0x3e,0x1e,0x78,0xef,0x7b,0x7f, + 0x63,0xe5,0xa9,0xa7,0x2e,0xea,0x51,0x52,0x40,0xf1,0x45,0x20,0xbe,0x8,0xa4,0x86, + 0x81,0x69,0x25,0x5e,0x9a,0x6,0x3e,0x79,0x1,0xdf,0x96,0xc9,0x9e,0x42,0xf6,0x1d, + 0xf8,0xe3,0xa6,0xa5,0xeb,0xba,0x7a,0xeb,0x66,0x0,0x1c,0xc7,0x1b,0xf8,0x23,0x22, + 0x0,0x11,0x6d,0x64,0x8c,0xdd,0xbb,0xf0,0xa0,0x5a,0xd5,0x3b,0x2f,0x18,0x7c,0xae, + 0x1,0xdf,0xba,0x36,0x97,0x5b,0x1f,0xcf,0xc5,0xe6,0x9f,0xa7,0x79,0xd2,0xd6,0xce, + 0x7f,0xa7,0x16,0xa8,0xcc,0x3,0x5b,0x75,0x9,0x9c,0xba,0x5,0x50,0x8e,0x2c,0xb1, + 0x5,0xdd,0xbd,0xa6,0x7f,0x5e,0x74,0xd3,0x2f,0xbe,0xf9,0x54,0x25,0x85,0xb9,0x3, + 0x88,0x14,0x50,0x8b,0xff,0x4,0xe1,0xd6,0x5b,0x41,0xaa,0xd3,0xa5,0xad,0xdb,0x1d, + 0xfc,0xad,0x93,0x9e,0xcf,0xb7,0xbf,0x33,0x9e,0xd0,0xde,0xf,0xac,0xc6,0x6d,0xfb, + 0xb2,0xa2,0x9f,0x4f,0x33,0x81,0x7e,0xbc,0x81,0x3f,0x9a,0x42,0xd0,0x9a,0xe1,0x21, + 0x71,0xef,0x59,0x97,0x6,0x17,0x1f,0xcf,0xb4,0x70,0xeb,0xda,0x5c,0x6e,0x5b,0x93, + 0xc9,0xbd,0xcf,0x48,0xe9,0x1,0x9e,0x79,0x80,0xe7,0x35,0xb,0x97,0xde,0xd7,0xea, + 0x91,0xb3,0xff,0x38,0xf3,0x2c,0x3d,0xf7,0x8e,0x7a,0x50,0xe8,0x8e,0x39,0xaf,0xba, + 0x6a,0x70,0xb9,0x52,0x8e,0x0,0x39,0x64,0x78,0xe,0xf2,0xd3,0x3e,0x81,0xe6,0xf6, + 0x8f,0x3,0x2a,0xe9,0x12,0xf1,0xd7,0xc1,0xef,0x41,0xe6,0x83,0x6f,0x7,0x38,0x3f, + 0xf8,0x38,0x6e,0xdb,0x97,0xe1,0x5b,0x28,0x87,0x39,0x68,0x5a,0xc5,0x9b,0x9e,0xdb, + 0x1b,0xcc,0x1c,0x96,0x0,0x44,0x34,0xcc,0x18,0xbb,0xab,0x3d,0xa6,0xae,0x98,0xbb, + 0x28,0xb8,0x7e,0xb6,0xfe,0xf0,0xb6,0x35,0xb9,0xd8,0xba,0x36,0x93,0x43,0x8f,0x65, + 0x62,0xe8,0xd1,0xcc,0x81,0xe2,0x83,0x25,0x6a,0x60,0x77,0x3,0x2c,0xf7,0x88,0xe0, + 0x7f,0xcd,0xbd,0x8e,0xa8,0x1,0x3e,0x13,0xe8,0xee,0xf5,0x4f,0xfb,0xc0,0xef,0xfe, + 0xd6,0x99,0x51,0x23,0x68,0x2a,0x25,0xa0,0x44,0x6,0xa9,0x72,0xc8,0x3c,0x83,0xe4, + 0xe7,0x23,0x3b,0xf5,0xc3,0x98,0xb3,0xe3,0xbf,0x3,0x2a,0xeb,0xe,0xbe,0x22,0x6c, + 0x69,0x1b,0xcb,0x2f,0x7c,0xbe,0x2a,0xc0,0xff,0xd2,0x70,0x8a,0x3b,0x6c,0x91,0xe7, + 0x79,0x3,0xfc,0x58,0x4b,0xc1,0xab,0xf7,0x6e,0x92,0xf7,0xf5,0xe,0xb0,0x2b,0x8e, + 0x25,0x2d,0xcc,0x62,0x52,0xdb,0xd7,0xa7,0xf1,0xf6,0x35,0x22,0x7b,0xe6,0x91,0x54, + 0xec,0x7a,0x4a,0xf8,0xf9,0xb7,0xb3,0x72,0xd5,0x5,0xf0,0x3a,0xd8,0xdd,0x24,0x5b, + 0xd4,0x2c,0x7b,0xa6,0x9f,0x99,0x49,0x29,0x94,0xa7,0x2c,0x97,0xbd,0xfd,0x97,0x6f, + 0x7a,0x59,0x1,0xbe,0x14,0x90,0x22,0x33,0x2a,0x20,0x53,0xe4,0xfc,0x7c,0x24,0xa7, + 0xfc,0x17,0x2c,0xdc,0xf3,0x37,0x60,0x4a,0x55,0x66,0xf7,0x49,0x13,0xb6,0xb4,0x7b, + 0xaa,0xd1,0xbe,0x22,0x8c,0xc7,0xb4,0xe7,0x83,0x6b,0xf0,0xc5,0xe1,0xd4,0x58,0xfe, + 0xf3,0xd,0xf8,0x31,0x11,0x80,0x88,0x62,0xc6,0xd8,0xf7,0x26,0x86,0xe9,0xe2,0x45, + 0xcb,0xf0,0x8e,0xc3,0xfd,0x7c,0x7b,0x5c,0xb7,0xc7,0x76,0x8a,0x83,0xdb,0xd6,0xe4, + 0x13,0x4f,0x3d,0x90,0x76,0xb6,0xad,0xcb,0x5d,0x44,0xe,0x7b,0x26,0x94,0xeb,0x12, + 0xb5,0xe7,0xa7,0x67,0x2,0xfc,0x50,0x20,0xe7,0x87,0x51,0x87,0x43,0xc5,0x6,0x7e, + 0x8c,0x10,0x2c,0x5b,0xb6,0xf4,0xec,0x4b,0x2e,0x3a,0xff,0x3c,0x3,0x7e,0xe,0x77, + 0x96,0x32,0x45,0x2e,0x32,0x48,0x91,0x41,0xe0,0x2,0xec,0x19,0x78,0x27,0x4e,0xdb, + 0x7f,0xbb,0x9d,0xb,0xb0,0x96,0x9f,0xcd,0x41,0x7e,0xdf,0x54,0x3d,0xe0,0xdb,0xf3, + 0xc1,0x35,0x47,0x36,0xbd,0xcb,0xe,0xb5,0xbe,0xed,0xc8,0x30,0xa2,0xe3,0xa9,0x0, + 0x2e,0x2d,0xbc,0x73,0xde,0xa9,0xcd,0x55,0x0,0x96,0xfa,0xdf,0x8b,0x27,0xd5,0xc4, + 0xbe,0x2d,0x72,0xfb,0xb6,0xf5,0x62,0xf7,0x86,0x1f,0x25,0xfb,0x76,0x3f,0x9d,0x8f, + 0xd7,0x4a,0x98,0x1,0x80,0x7e,0x0,0xbd,0x0,0x5a,0xf6,0xef,0x72,0x2f,0xfa,0x55, + 0x33,0x48,0xf9,0xe1,0xc0,0xee,0x26,0xe7,0x75,0xd7,0x51,0x7,0x5b,0xd6,0x48,0xe7, + 0xb2,0x82,0xf3,0xdf,0xf7,0xbe,0x77,0x9f,0xab,0x44,0xe,0xa9,0x4,0xa4,0xaa,0x83, + 0x9f,0x42,0xe4,0x9,0x84,0xc8,0x20,0xe8,0x42,0x6c,0xea,0xff,0x35,0xf4,0x74,0xbe, + 0x3,0xe4,0x19,0xe,0xb0,0xf3,0xa0,0x37,0xad,0x45,0x6f,0x35,0xe0,0xab,0x80,0x5f, + 0x3,0xb8,0xe,0x36,0x9b,0xe1,0x3c,0x53,0xc7,0xa3,0x5e,0xff,0x24,0xf7,0xfa,0x47, + 0x4b,0x84,0xa3,0xed,0x6,0xae,0x1d,0xd9,0xae,0xef,0x98,0x1a,0x55,0x37,0xed,0xdb, + 0x22,0x86,0xf6,0x6d,0x53,0x7b,0xd7,0xff,0x20,0xd9,0xba,0x7d,0x5d,0xb6,0x7,0xc0, + 0x3e,0x0,0xa3,0x36,0x8f,0xe6,0x0,0xe6,0x1,0x98,0xeb,0x9d,0x73,0x1b,0x7d,0x37, + 0xed,0xdf,0x75,0x5b,0x7,0xd4,0xad,0xbf,0x9b,0xac,0xcb,0x2e,0x8a,0x30,0x13,0xd8, + 0x72,0x86,0x8a,0x9a,0xee,0x52,0x52,0xf5,0x53,0xc2,0x95,0xd7,0xbf,0xf1,0x75,0x97, + 0x4a,0x99,0x19,0xf0,0x73,0x3,0xbe,0x74,0x96,0x9f,0x27,0x10,0x79,0x6,0x21,0x52, + 0x88,0x2c,0x86,0x90,0x4b,0x31,0xc1,0xde,0x5,0xc1,0x62,0xa4,0x32,0x85,0x38,0x73, + 0x5,0x54,0xf3,0x27,0xc9,0xe4,0x9a,0x9d,0x43,0x43,0x4f,0xd3,0x86,0xbf,0xdd,0x8c, + 0xef,0xc2,0xec,0xc5,0xb7,0x81,0x31,0x16,0xd6,0xc0,0xe5,0x28,0xf7,0xc4,0x80,0xf7, + 0x98,0x1d,0x2,0xf0,0x23,0x3a,0x18,0x63,0xec,0x68,0x48,0x10,0x1e,0xa5,0xcc,0xac, + 0x63,0x8c,0x7d,0xf1,0xcf,0xde,0x3a,0xfc,0x20,0x80,0x5d,0x16,0xf0,0x3d,0x16,0xd8, + 0xc8,0x5a,0x77,0x2f,0x80,0x3e,0xcf,0xc2,0xc9,0x2,0x94,0x0,0xe8,0xb1,0x3f,0x17, + 0xd4,0x8,0x70,0x38,0x9f,0x2f,0xbb,0xf8,0xf2,0xba,0x75,0x77,0x2b,0xa1,0xaa,0x2e, + 0x45,0x16,0xdd,0xa5,0xc8,0xd2,0x7f,0xc6,0xb2,0x65,0x17,0xcd,0x9f,0x3b,0x67,0x45, + 0x1,0xbe,0x48,0x21,0x65,0x86,0x5c,0x64,0x10,0x79,0x6c,0x2c,0xdf,0x82,0x9f,0xe7, + 0x29,0x84,0x48,0x20,0x44,0x8c,0x76,0x32,0x95,0x6c,0xd9,0xb4,0x6f,0xc3,0xda,0x27, + 0xb7,0x6d,0xf8,0xd6,0x5d,0xdb,0x1f,0x7,0xb0,0x1b,0xc0,0x16,0x0,0x4f,0xdb,0x6b, + 0xe0,0xae,0x45,0xfd,0xe8,0x46,0x84,0x3a,0xd8,0xda,0xbb,0x46,0x74,0x88,0x4a,0xa1, + 0x9e,0xa1,0x23,0x32,0xeb,0xa,0x0,0xeb,0xcb,0xd6,0x59,0xbf,0xe5,0x3e,0x4c,0xe0, + 0x81,0xe4,0x7f,0x28,0x67,0x75,0x2e,0xb2,0x6f,0x2,0x68,0x78,0xfe,0x9f,0x66,0xf0, + 0xff,0x72,0x86,0xa6,0x88,0x98,0x41,0xce,0xe5,0x61,0x2e,0x4e,0xb7,0x8b,0xea,0x5f, + 0xec,0xb3,0x2f,0xbf,0xe4,0x92,0xb,0xef,0xb9,0xe7,0x27,0x78,0xcb,0x5b,0x5e,0x6b, + 0x2c,0xbf,0x2,0x7e,0x6a,0xac,0x3f,0xb3,0x8f,0x45,0x82,0x67,0x86,0x76,0x3d,0xb9, + 0x6e,0xdd,0xd0,0x93,0x77,0xfd,0x60,0xdd,0x53,0xa3,0xa3,0x53,0x6b,0x1,0x6c,0xb7, + 0x87,0x73,0x6f,0xa7,0xd8,0xeb,0xe2,0x3e,0x6f,0xe8,0x5d,0x2b,0xee,0x19,0x8,0xf3, + 0x62,0x21,0x5d,0x73,0x89,0xea,0x10,0xaa,0x26,0xbb,0x90,0xa6,0x88,0x27,0x8e,0x54, + 0x5,0x9e,0xed,0x40,0x88,0xbb,0xa0,0xcc,0xbe,0xa1,0x3a,0x9b,0xb5,0x97,0x8b,0x3b, + 0x95,0xf0,0xe5,0x90,0x6a,0x1f,0x48,0xce,0x20,0xe9,0xea,0x30,0x4d,0x12,0x75,0x18, + 0xb,0xef,0x26,0xa5,0xfe,0x67,0x78,0xd9,0xf2,0xe5,0xcb,0xae,0x58,0xb7,0xf6,0x69, + 0x2c,0x98,0xdf,0x8b,0xcb,0x2e,0x3b,0x17,0xb9,0xf3,0xf9,0x79,0x6a,0xac,0x3f,0x8b, + 0xb1,0x65,0xc7,0xee,0xad,0xf,0x3d,0xfc,0xc4,0xda,0x6f,0xdf,0xf5,0xf0,0x33,0x23, + 0x23,0x53,0xcf,0x58,0x15,0xdc,0x63,0xff,0x5e,0x3,0xc0,0x59,0xde,0x67,0x6c,0xd8, + 0x23,0xb4,0x47,0xd0,0xc5,0xe2,0xeb,0x80,0x77,0x53,0x3f,0x3f,0x9d,0xe5,0xf6,0xec, + 0xf7,0x30,0x98,0xa7,0x26,0x45,0x79,0xfb,0x48,0x49,0xf0,0xac,0x8,0x40,0x44,0x64, + 0x63,0x8f,0x3a,0x9,0xe0,0x45,0xfc,0xee,0x43,0xb8,0xb,0x12,0x1c,0xe2,0x2,0xa8, + 0x2e,0xec,0x57,0x33,0x4,0x6d,0x75,0x59,0x9f,0xc9,0x2f,0x76,0xb,0x9a,0xe0,0x59, + 0xe0,0x69,0x17,0x9c,0x77,0xde,0x2b,0x9b,0xcd,0x68,0xe9,0xc1,0xc9,0x49,0xfc,0xfd, + 0xed,0xff,0x86,0x95,0x3f,0x5d,0x84,0x77,0xdc,0x7c,0x2d,0x7a,0x7a,0x22,0xec,0xd9, + 0x33,0xbc,0xef,0x67,0xf,0xad,0x7d,0xe2,0xbb,0x77,0xff,0x6c,0xcb,0x33,0x9b,0xf7, + 0x6c,0x6,0xb0,0xd3,0xc6,0x3b,0xdc,0x82,0x7d,0x8e,0x55,0xb6,0xc8,0x53,0xb8,0xc8, + 0xfb,0xac,0x3e,0xf0,0xbe,0xd1,0x48,0xcf,0x38,0x44,0xad,0x6,0xe2,0x97,0xb7,0x51, + 0x23,0x76,0x60,0xcf,0x3e,0xe0,0xec,0x58,0xdb,0xc4,0xb3,0x35,0x12,0x46,0x5d,0xfc, + 0x90,0xef,0xdf,0xb3,0x2e,0x56,0x80,0x5a,0x16,0xa0,0xba,0xd4,0xec,0x9f,0x2d,0xe0, + 0xd4,0x85,0xb0,0xbe,0xc5,0x34,0x0,0x5c,0x7e,0xe9,0x85,0x97,0x5c,0x99,0x67,0xb9, + 0xdd,0x7a,0x35,0xc3,0x4f,0x1f,0x58,0x37,0xf9,0x8f,0xff,0x72,0xd7,0xd6,0x25,0x4b, + 0x16,0x6c,0x18,0x1a,0xda,0x39,0xc,0x60,0x2f,0x80,0x9,0xfb,0x7e,0xe6,0x1,0x58, + 0x6c,0xe3,0x1d,0x7,0xba,0x23,0x40,0xe4,0x49,0x7e,0x30,0xc3,0xe7,0x14,0x35,0xc0, + 0x53,0xaf,0x3c,0xed,0xc7,0x4d,0x8e,0x20,0x41,0xcd,0x6d,0x74,0xb,0x1e,0x51,0x23, + 0x2,0x3b,0x52,0x15,0x78,0xd6,0x4,0xa8,0xa9,0x40,0x9d,0x14,0xaa,0xcb,0x87,0x60, + 0xde,0x1b,0xa5,0xda,0xc5,0xa9,0xcb,0xf8,0xb3,0x6,0xbc,0x5b,0xca,0x6d,0x3f,0xb7, + 0xb,0x5a,0x2f,0x3e,0x75,0xd1,0x82,0xb,0xe3,0x38,0xce,0xb6,0xed,0xd8,0xb1,0xe9, + 0xe9,0xcd,0x9b,0xb7,0x1f,0x9c,0x9c,0x1c,0x1,0x30,0x39,0x34,0xd4,0x19,0xb3,0xaf, + 0xb9,0x8,0xc0,0xb2,0x1a,0xe8,0x3e,0xe0,0x61,0xd,0x24,0xd4,0x14,0x4e,0xd6,0x80, + 0x4f,0x6a,0xa9,0xb0,0xb2,0xaf,0x23,0xba,0xbc,0xd6,0x4c,0x19,0xc2,0x8c,0x25,0x85, + 0xa3,0x51,0x83,0x59,0x51,0x80,0x1a,0x9,0xa8,0xb,0xeb,0xf9,0x51,0x44,0xbc,0xb3, + 0xd,0x78,0xb7,0xb,0xe4,0x82,0xb3,0x3e,0x0,0x3b,0xee,0x7b,0xf8,0xa1,0x7,0x1f, + 0x5f,0xbf,0x7e,0x8f,0x6d,0x10,0x25,0xf6,0x7b,0x73,0xac,0xbc,0xf7,0x74,0x1,0xde, + 0x97,0xf7,0xa0,0xcb,0x67,0xf2,0x55,0xcd,0xf7,0xe5,0xac,0x6,0xf6,0xa1,0xb2,0x81, + 0x13,0xaa,0x14,0x7c,0x34,0x24,0x80,0x67,0xcd,0xbc,0x16,0xa4,0xe0,0x10,0x4,0x38, + 0x54,0xb0,0xf6,0x6c,0x0,0xef,0x56,0x6d,0x73,0x24,0x8,0x1,0x6c,0x7e,0x7c,0xfd, + 0xfa,0x6f,0xda,0xf7,0xbc,0x18,0xc0,0x42,0x0,0xf3,0x6d,0xe1,0x6a,0x8e,0x5,0xdd, + 0x27,0x40,0xe0,0x59,0x2f,0xab,0x65,0x34,0xbe,0x7c,0xc3,0xab,0x78,0x1e,0xae,0x8, + 0x44,0xc7,0x92,0xc2,0x9d,0x50,0x4,0xe8,0x42,0x2,0xaa,0xa5,0x39,0x6c,0x6,0x2, + 0x60,0x86,0xc8,0x7c,0xd6,0xbb,0x64,0xde,0xfb,0xab,0xc7,0x27,0x43,0x16,0xf8,0x96, + 0x27,0xcb,0xae,0xa9,0xd4,0xf2,0x2c,0xbf,0xe5,0x45,0xf9,0xc1,0xc,0xb2,0xef,0xe7, + 0xeb,0x7e,0xea,0xaa,0xba,0xc4,0x3b,0xca,0xcb,0xf1,0x8f,0xd4,0xdd,0x1d,0x49,0x3c, + 0xf6,0xfc,0x10,0x60,0x6,0x12,0x1c,0xaa,0xbc,0x39,0xd3,0x48,0xe7,0xf1,0xec,0x92, + 0x91,0x27,0xcd,0x1d,0xcf,0x57,0x27,0xb6,0x8a,0xe9,0x2c,0xbf,0xcf,0x2b,0x5d,0xb7, + 0x6a,0x44,0xf0,0x63,0x80,0x7a,0x9a,0x17,0x78,0x9f,0xc5,0x7,0xdd,0x77,0x5,0xf9, + 0xc,0x45,0x2c,0x7d,0x88,0x34,0x96,0xe,0x37,0x3f,0x50,0x37,0x9c,0xe3,0x9e,0x6, + 0x1e,0x49,0x63,0xa2,0x46,0x86,0x59,0x6f,0x66,0x1c,0x23,0x1,0xa4,0x67,0x6d,0xae, + 0x4a,0x39,0xe1,0x81,0xdc,0xea,0x22,0xfd,0x2d,0x2f,0xe2,0xef,0x46,0x86,0x46,0x4d, + 0x1d,0x78,0xad,0xdf,0x41,0xb5,0x3a,0x47,0xee,0x65,0x0,0x59,0xad,0xec,0x5d,0x27, + 0xc5,0x91,0xa6,0xb6,0xcf,0xaf,0xb,0x78,0x9e,0x81,0x3d,0x9a,0xf7,0xe3,0x54,0xca, + 0x59,0x60,0xea,0x49,0x7a,0xe8,0x9d,0xc3,0x5a,0x51,0xa7,0xe1,0x59,0xbe,0x9f,0xf3, + 0xb7,0xec,0xe3,0x66,0x97,0x2,0x50,0x3d,0xc0,0x9b,0xa9,0xfa,0x59,0x1f,0x6f,0x13, + 0xb5,0x86,0x9a,0xef,0x2e,0xe8,0x10,0xd6,0x7f,0x62,0x11,0xe0,0x44,0xfd,0x47,0x54, + 0xdc,0xcf,0x53,0x7b,0xb5,0x1,0x56,0xb,0x5a,0x59,0xcd,0x9a,0x3,0xaf,0xac,0xdb, + 0xf0,0x88,0xd2,0xf0,0xce,0x51,0xed,0x6b,0x7e,0xd0,0xc8,0xbb,0x4,0x8d,0xdd,0x2a, + 0xa1,0xdd,0x1a,0x5f,0xaa,0x4b,0xba,0x3c,0x23,0xf0,0xcf,0x55,0x29,0xf8,0xc5,0x42, + 0x86,0x69,0x41,0x56,0x2d,0x63,0xe8,0xd6,0xb5,0xe3,0x35,0x62,0x4,0x5d,0x48,0x12, + 0x74,0xe9,0x1,0x4,0xb5,0xec,0x1,0xb5,0xf4,0xb7,0x1e,0x28,0xce,0x54,0x21,0x3d, + 0x54,0xbf,0xe3,0xc8,0x33,0xa3,0x13,0x4c,0xa1,0x5f,0x30,0xff,0x3c,0xd5,0xa8,0x93, + 0x24,0xf0,0x4a,0xcd,0xbc,0xb,0x59,0xd8,0x21,0xea,0x22,0xf5,0x5a,0x2,0x75,0x29, + 0x8c,0xcd,0x4,0xfc,0x31,0x2d,0x1c,0xf9,0xff,0x1,0x1f,0xdc,0x76,0xde,0x36,0x49, + 0xe6,0xd2,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // /home/user/src/ananas-qt4/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Bottom.ui + 0x0,0x0,0x2,0x72, + 0x0, + 0x0,0x8,0xb0,0x78,0x9c,0xb5,0x55,0x4d,0x8f,0xd3,0x30,0x10,0xbd,0x23,0xf1,0x1f, + 0xa2,0x9e,0xe0,0x42,0xda,0xa6,0xfb,0x29,0x37,0x87,0x85,0x43,0x25,0x90,0x60,0x25, + 0x24,0xce,0x5e,0x77,0x48,0xcc,0x26,0x76,0xe4,0x38,0x34,0xd9,0x5f,0x8f,0xbf,0x93, + 0xb8,0xad,0x56,0xb0,0xcb,0x29,0x33,0xcf,0xe3,0x37,0x33,0xcf,0xf6,0x4,0x75,0x34, + 0xf9,0xd,0xa2,0xa5,0x9c,0x6d,0x17,0x9b,0xf,0xcb,0x45,0x92,0xbf,0x7d,0x93,0x20, + 0xdc,0xc9,0x92,0x8b,0x1c,0xa5,0xce,0xd0,0x18,0xe1,0x75,0xd,0x4c,0x2a,0xd0,0x5b, + 0x1a,0x85,0xbe,0xe1,0x42,0xd6,0x98,0x8,0xae,0x56,0xa6,0x9e,0xd9,0x53,0xe1,0xb6, + 0xcd,0x3f,0x51,0x5c,0xf1,0x42,0xed,0x33,0x9e,0xc6,0xf,0x74,0x5f,0x80,0x4c,0xc, + 0xb0,0x5d,0xdc,0xdb,0x80,0x45,0xc2,0x70,0xd,0xdb,0x85,0xf7,0x74,0x64,0x82,0x1a, + 0xc1,0x1b,0x10,0x72,0x70,0x8b,0x5,0xf0,0x1a,0xa4,0x18,0xdc,0x72,0x82,0x4,0x10, + 0x69,0xcd,0x4,0xf5,0xf9,0x12,0xa5,0xbd,0xf7,0x6,0xed,0xd,0xde,0x53,0x29,0x65, + 0x99,0x6f,0x96,0xa,0xb3,0xa6,0xc3,0x4b,0xa0,0x45,0x29,0xf3,0x4c,0x2f,0x38,0xdb, + 0x12,0xa7,0x81,0x19,0xa5,0xbe,0x88,0x93,0x25,0x1d,0x28,0xdb,0xf3,0xc3,0x77,0x2a, + 0x2b,0x8,0x55,0xb5,0x52,0x50,0x56,0x84,0xce,0x9d,0x7b,0x8a,0x2c,0x92,0xe2,0x87, + 0x71,0xbd,0x14,0x15,0x1e,0x78,0x27,0x3d,0xe6,0xb8,0x9f,0x51,0x64,0x26,0x89,0xd6, + 0x64,0x3d,0x11,0x45,0xab,0xb2,0xbe,0x98,0xe8,0xe2,0x85,0xc9,0x2e,0x56,0x73,0x61, + 0x46,0x65,0xb2,0xb9,0x30,0x53,0x65,0xe2,0x6e,0x12,0x64,0x2b,0xe,0xed,0xec,0xee, + 0x78,0xff,0xc5,0x40,0x63,0x79,0x51,0xfd,0x35,0x16,0x5,0x65,0x61,0x39,0x41,0xac, + 0xab,0x1f,0x40,0xe8,0xc3,0x73,0x96,0x4f,0x3b,0x4f,0x75,0x44,0xd4,0x36,0x98,0x28, + 0x95,0x8f,0x99,0x2e,0x9f,0x65,0xa2,0x12,0xea,0xb0,0x4b,0xf3,0x84,0xd8,0xe3,0x34, + 0x5c,0x50,0x75,0xf9,0xb1,0x54,0x4f,0x66,0x4c,0xa5,0xc2,0x40,0xe5,0xc8,0xef,0xe5, + 0xed,0xed,0x4e,0x45,0x3c,0x71,0x15,0x52,0xa9,0x7,0xa1,0xc1,0xc0,0x14,0xe7,0x3d, + 0xd1,0x3,0x7d,0x82,0x1d,0x65,0x72,0xc6,0xac,0xc1,0xd1,0xf5,0x27,0xb6,0xca,0xe2, + 0x13,0x9b,0x1e,0xda,0x2a,0x3a,0x34,0x93,0x7e,0x46,0x74,0x5c,0x8d,0xa,0x98,0xb6, + 0x8e,0xd2,0x89,0x2c,0x73,0x89,0xa2,0x4b,0xfb,0xad,0x6b,0xcb,0xbb,0x4e,0x4a,0xad, + 0x88,0x13,0xe9,0xd1,0xfb,0x67,0x5b,0x95,0xd0,0x47,0x6d,0xda,0x47,0xf2,0xf5,0xf3, + 0xec,0xbd,0x9c,0x2b,0xd5,0x96,0xf0,0xa,0xa5,0x12,0xcc,0x8,0x54,0xff,0x5c,0xee, + 0x47,0xb3,0xfd,0x65,0x25,0xa3,0xd4,0x3e,0x1b,0x37,0x20,0xc6,0xb8,0x99,0xdd,0xd0, + 0xbe,0xc6,0xcd,0xcf,0x8e,0x11,0x7d,0xf7,0xd4,0xb4,0x8d,0x0,0x1d,0x23,0xa0,0xe5, + 0x9d,0x20,0xd0,0xa6,0x6e,0x66,0x33,0x6,0x66,0xb5,0xb5,0xdc,0x23,0xe0,0x7,0x15, + 0xb0,0xbd,0x3a,0x71,0x7f,0x5e,0xaa,0xf,0xb,0xb8,0x55,0x5a,0x30,0x5c,0xe5,0xa4, + 0xa2,0xe4,0x11,0xf6,0xef,0xde,0xeb,0x2b,0x64,0x90,0x30,0x7b,0x81,0xaa,0xdf,0x47, + 0x98,0x73,0x1,0x70,0xdb,0x2b,0x2e,0x73,0x4c,0x8,0x34,0xd2,0xec,0xd5,0xae,0x5d, + 0x29,0xd5,0x1d,0x6f,0xc3,0x8,0x56,0x4e,0x22,0x87,0x46,0xdf,0x7f,0x53,0x7d,0x85, + 0x1f,0xa0,0x9a,0xbc,0x63,0x35,0xc3,0xae,0xae,0xe3,0x21,0x96,0x4d,0x86,0x7b,0xaa, + 0x29,0x4e,0xd0,0xed,0xa1,0x95,0x94,0x99,0xb7,0x7a,0xcc,0x79,0x73,0x19,0x53,0x6e, + 0x4e,0x53,0x5a,0xdb,0x29,0x98,0x46,0x12,0x9e,0x95,0x74,0x7a,0xaf,0xfe,0x83,0xac, + 0x2,0x7e,0xa9,0xac,0x2f,0x94,0x35,0xbb,0xbc,0x79,0x75,0x59,0x57,0x57,0x31,0xe7, + 0xf5,0xfa,0xef,0x75,0x9d,0xfa,0x3a,0x2,0xa5,0x1d,0x55,0x9f,0x3f,0x70,0x8d,0x7e, + 0x64, + // /home/user/src/ananas-qt4/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Right.ui + 0x0,0x0,0x2,0x78, + 0x0, + 0x0,0x8,0xab,0x78,0x9c,0xb5,0x55,0x4d,0x6f,0xd4,0x30,0x10,0xbd,0x23,0xf1,0x1f, + 0xac,0x3d,0xc1,0x85,0xec,0x57,0x77,0x69,0xe5,0xcd,0xa1,0x70,0x40,0x2,0x9,0x2a, + 0x55,0xe5,0xec,0x7a,0x87,0xc4,0x34,0xb1,0x23,0xc7,0x61,0x13,0x7e,0x3d,0xb6,0x63, + 0x7b,0x9d,0x8f,0xaa,0x2a,0x85,0x53,0x66,0xde,0xd8,0xe3,0x37,0x6f,0xec,0x9,0x6e, + 0x18,0xfa,0x5,0xb2,0x66,0x82,0x1f,0x16,0xdb,0x77,0xcb,0x5,0x4a,0x5f,0xbf,0x42, + 0x98,0x34,0x2a,0x17,0x32,0xc5,0x89,0x33,0xc,0x46,0x45,0x59,0x2,0x57,0x1a,0xf4, + 0x96,0x41,0xa1,0xad,0x84,0x54,0x25,0xa1,0x52,0xe8,0x48,0xec,0xd9,0x3d,0x5,0xa9, + 0xeb,0xf4,0x23,0x23,0x85,0xc8,0xf4,0x3e,0xeb,0x19,0xfc,0xc4,0x8e,0x19,0x28,0x64, + 0x81,0xc3,0xe2,0xa6,0x5f,0xb0,0x40,0x9c,0x94,0x70,0x58,0x78,0xcf,0xac,0x44,0xb8, + 0x92,0xa2,0x2,0xa9,0x3a,0x17,0xcc,0x40,0x94,0xa0,0x64,0xe7,0xc2,0x8,0x4b,0xa0, + 0xaa,0x37,0x11,0x6e,0xd3,0x25,0x4e,0x5a,0xef,0x75,0xc6,0xeb,0xbc,0xa7,0x8f,0x54, + 0x79,0xba,0x5d,0x6a,0xac,0x37,0x1d,0x9e,0x3,0xcb,0x72,0x95,0x6e,0x4c,0xc0,0xd9, + 0x7d,0xe2,0x24,0x64,0xc6,0x89,0x27,0x31,0x4b,0xe9,0xc4,0xf8,0x51,0x9c,0x6e,0x99, + 0x2a,0x20,0xb0,0xaa,0x95,0x64,0x3c,0xb,0x95,0x3b,0x77,0x2e,0xd9,0x48,0x8a,0xef, + 0xd6,0xf5,0x52,0x14,0xa4,0x13,0x8d,0xf2,0x98,0xcb,0xfd,0x84,0x22,0x3,0x49,0x8c, + 0x26,0xb6,0xb4,0x36,0x0,0x5d,0xba,0x8e,0x74,0xf1,0xc2,0xec,0xf7,0x43,0x5d,0x82, + 0x30,0xab,0xe5,0x6e,0x28,0x4c,0xac,0xcc,0xb8,0x1a,0x84,0x7b,0xc6,0xa1,0x9c,0xbb, + 0x6b,0xd1,0x7e,0xb1,0xd0,0x99,0xde,0x88,0x7f,0x49,0x64,0xc6,0x78,0x8,0x23,0xcc, + 0x9b,0xf2,0x1e,0xa4,0x69,0x9e,0xb3,0xfc,0xb1,0xc3,0xa3,0x26,0x89,0xea,0x8a,0x50, + 0xad,0xf2,0x34,0xd3,0xee,0xc9,0x4c,0x4c,0x41,0x19,0xb,0x12,0x77,0xe4,0x5b,0x53, + 0xe7,0xd7,0x8d,0x52,0x82,0xfb,0xae,0x88,0x7,0xef,0xfb,0x3d,0x13,0x2e,0xa,0x5a, + 0x15,0x85,0xc3,0x85,0xf8,0xfa,0x79,0x70,0x19,0x66,0xd9,0x20,0xdb,0x9,0x4d,0x21, + 0xd0,0x8d,0xe8,0x3d,0x93,0x2a,0x25,0x9c,0x42,0xf1,0xd7,0x74,0x3f,0xd8,0xed,0xff, + 0x94,0xb2,0xe9,0x52,0xe8,0xc4,0x94,0x89,0x90,0x4c,0x8f,0x16,0xa2,0xd8,0x80,0xaf, + 0x9e,0x33,0xba,0x83,0xe9,0x8d,0xba,0xba,0xba,0xd3,0x8b,0x19,0x25,0x9a,0x94,0x85, + 0x1e,0xa7,0x34,0xbd,0x1f,0xec,0x37,0x7c,0x62,0x7c,0x54,0xa8,0x6,0xcf,0xae,0x7f, + 0xd,0xeb,0xd1,0x94,0x88,0x1f,0xc4,0x76,0x34,0x28,0xfa,0xd3,0x7,0x79,0xe6,0xf4, + 0x19,0xd4,0x1d,0xeb,0x83,0x93,0xfe,0xcd,0xb8,0xe9,0x70,0xd6,0x71,0x60,0x57,0xac, + 0x2d,0x49,0xf5,0xa3,0xe1,0xd4,0x48,0xa3,0x47,0xed,0x8,0x30,0x6b,0x24,0xd4,0xa2, + 0x91,0x14,0xea,0xc4,0xd,0x6c,0xce,0xc1,0x46,0xeb,0x3e,0xf7,0x19,0xf0,0x53,0xa, + 0xf8,0x51,0x73,0xf2,0xf7,0x59,0x93,0xec,0x1,0x17,0x65,0x19,0x27,0x45,0x4a,0xb, + 0x46,0x1f,0xe0,0xf8,0xe6,0xad,0x29,0xd2,0x22,0x61,0xf0,0x2,0xd3,0xff,0x8e,0x30, + 0xe4,0x2,0xe0,0xb6,0x17,0x42,0xa5,0x84,0x52,0xa8,0x94,0xdd,0x6b,0xdc,0x3e,0x92, + 0xeb,0x26,0xd4,0x61,0xfe,0x6a,0x7,0xa9,0xae,0x32,0xd,0xb2,0xec,0xb,0x72,0xf, + 0x45,0xf4,0x88,0xf5,0x0,0xbb,0x58,0xd,0x7,0xd8,0xe6,0x7d,0x34,0xd8,0x13,0x93, + 0x61,0x26,0xdb,0x11,0x6a,0xc5,0xb8,0xbd,0x49,0xd3,0x94,0xeb,0xcd,0x66,0x34,0x13, + 0x2f,0xe7,0x53,0xf6,0xb6,0x13,0x30,0x19,0x29,0xf8,0xa8,0xa2,0xf1,0xb3,0xfb,0xf, + 0xaa,0x4a,0xf8,0xa9,0x4f,0x7d,0xa9,0xaa,0x9b,0xd1,0x6f,0x61,0xb7,0x7b,0xa9,0xaa, + 0xab,0xcb,0xfd,0x30,0xe5,0x6a,0x7d,0xf1,0x7c,0x59,0x63,0xdf,0xac,0xc0,0x49,0xc3, + 0xf4,0xe7,0xf,0xe0,0x1d,0x7c,0xd5, + // /home/user/src/ananas-qt4/src/designer/formdesigner/templates/forms/Main_Window.ui + 0x0,0x0,0x2,0xc7, + 0x3c, + 0x75,0x69,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x34,0x2e,0x30,0x22, + 0x20,0x3e,0xd,0xa,0x20,0x3c,0x61,0x75,0x74,0x68,0x6f,0x72,0x3e,0x3c,0x2f,0x61, + 0x75,0x74,0x68,0x6f,0x72,0x3e,0xd,0xa,0x20,0x3c,0x63,0x6f,0x6d,0x6d,0x65,0x6e, + 0x74,0x3e,0x3c,0x2f,0x63,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x3e,0xd,0xa,0x20,0x3c, + 0x65,0x78,0x70,0x6f,0x72,0x74,0x6d,0x61,0x63,0x72,0x6f,0x3e,0x3c,0x2f,0x65,0x78, + 0x70,0x6f,0x72,0x74,0x6d,0x61,0x63,0x72,0x6f,0x3e,0xd,0xa,0x20,0x3c,0x63,0x6c, + 0x61,0x73,0x73,0x3e,0x4d,0x61,0x69,0x6e,0x57,0x69,0x6e,0x64,0x6f,0x77,0x3c,0x2f, + 0x63,0x6c,0x61,0x73,0x73,0x3e,0xd,0xa,0x20,0x3c,0x77,0x69,0x64,0x67,0x65,0x74, + 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x51,0x4d,0x61,0x69,0x6e,0x57,0x69,0x6e, + 0x64,0x6f,0x77,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x61,0x69,0x6e,0x57, + 0x69,0x6e,0x64,0x6f,0x77,0x22,0x20,0x3e,0xd,0xa,0x20,0x20,0x3c,0x70,0x72,0x6f, + 0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6f,0x62,0x6a,0x65, + 0x63,0x74,0x4e,0x61,0x6d,0x65,0x22,0x20,0x3e,0xd,0xa,0x20,0x20,0x20,0x3c,0x73, + 0x74,0x72,0x69,0x6e,0x67,0x20,0x6e,0x6f,0x74,0x72,0x3d,0x22,0x74,0x72,0x75,0x65, + 0x22,0x20,0x3e,0x4d,0x61,0x69,0x6e,0x57,0x69,0x6e,0x64,0x6f,0x77,0x3c,0x2f,0x73, + 0x74,0x72,0x69,0x6e,0x67,0x3e,0xd,0xa,0x20,0x20,0x3c,0x2f,0x70,0x72,0x6f,0x70, + 0x65,0x72,0x74,0x79,0x3e,0xd,0xa,0x20,0x20,0x3c,0x70,0x72,0x6f,0x70,0x65,0x72, + 0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x67,0x65,0x6f,0x6d,0x65,0x74,0x72, + 0x79,0x22,0x20,0x3e,0xd,0xa,0x20,0x20,0x20,0x3c,0x72,0x65,0x63,0x74,0x3e,0xd, + 0xa,0x20,0x20,0x20,0x20,0x3c,0x78,0x3e,0x30,0x3c,0x2f,0x78,0x3e,0xd,0xa,0x20, + 0x20,0x20,0x20,0x3c,0x79,0x3e,0x30,0x3c,0x2f,0x79,0x3e,0xd,0xa,0x20,0x20,0x20, + 0x20,0x3c,0x77,0x69,0x64,0x74,0x68,0x3e,0x38,0x30,0x30,0x3c,0x2f,0x77,0x69,0x64, + 0x74,0x68,0x3e,0xd,0xa,0x20,0x20,0x20,0x20,0x3c,0x68,0x65,0x69,0x67,0x68,0x74, + 0x3e,0x36,0x30,0x30,0x3c,0x2f,0x68,0x65,0x69,0x67,0x68,0x74,0x3e,0xd,0xa,0x20, + 0x20,0x20,0x3c,0x2f,0x72,0x65,0x63,0x74,0x3e,0xd,0xa,0x20,0x20,0x3c,0x2f,0x70, + 0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3e,0xd,0xa,0x20,0x20,0x3c,0x70,0x72,0x6f, + 0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x77,0x69,0x6e,0x64, + 0x6f,0x77,0x54,0x69,0x74,0x6c,0x65,0x22,0x20,0x3e,0xd,0xa,0x20,0x20,0x20,0x3c, + 0x73,0x74,0x72,0x69,0x6e,0x67,0x3e,0x4d,0x61,0x69,0x6e,0x57,0x69,0x6e,0x64,0x6f, + 0x77,0x3c,0x2f,0x73,0x74,0x72,0x69,0x6e,0x67,0x3e,0xd,0xa,0x20,0x20,0x3c,0x2f, + 0x70,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3e,0xd,0xa,0x20,0x20,0x3c,0x77,0x69, + 0x64,0x67,0x65,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x51,0x4d,0x65,0x6e, + 0x75,0x42,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6d,0x65,0x6e,0x75, + 0x62,0x61,0x72,0x22,0x20,0x2f,0x3e,0xd,0xa,0x20,0x20,0x3c,0x77,0x69,0x64,0x67, + 0x65,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x51,0x57,0x69,0x64,0x67,0x65, + 0x74,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x63,0x65,0x6e,0x74,0x72,0x61,0x6c, + 0x77,0x69,0x64,0x67,0x65,0x74,0x22,0x20,0x2f,0x3e,0xd,0xa,0x20,0x20,0x3c,0x77, + 0x69,0x64,0x67,0x65,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x51,0x53,0x74, + 0x61,0x74,0x75,0x73,0x42,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73, + 0x74,0x61,0x74,0x75,0x73,0x62,0x61,0x72,0x22,0x20,0x2f,0x3e,0xd,0xa,0x20,0x3c, + 0x2f,0x77,0x69,0x64,0x67,0x65,0x74,0x3e,0xd,0xa,0x20,0x3c,0x70,0x69,0x78,0x6d, + 0x61,0x70,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x3c,0x2f,0x70,0x69,0x78, + 0x6d,0x61,0x70,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x3e,0xd,0xa,0x20,0x3c, + 0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x2f,0x3e,0xd,0xa,0x3c, + 0x2f,0x75,0x69,0x3e,0xd,0xa, + // /home/user/src/ananas-qt4/src/designer/formdesigner/templates/forms/Widget.ui + 0x0,0x0,0x2,0x18, + 0x3c, + 0x75,0x69,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x34,0x2e,0x30,0x22, + 0x20,0x3e,0xd,0xa,0x20,0x3c,0x61,0x75,0x74,0x68,0x6f,0x72,0x3e,0x3c,0x2f,0x61, + 0x75,0x74,0x68,0x6f,0x72,0x3e,0xd,0xa,0x20,0x3c,0x63,0x6f,0x6d,0x6d,0x65,0x6e, + 0x74,0x3e,0x3c,0x2f,0x63,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x3e,0xd,0xa,0x20,0x3c, + 0x65,0x78,0x70,0x6f,0x72,0x74,0x6d,0x61,0x63,0x72,0x6f,0x3e,0x3c,0x2f,0x65,0x78, + 0x70,0x6f,0x72,0x74,0x6d,0x61,0x63,0x72,0x6f,0x3e,0xd,0xa,0x20,0x3c,0x63,0x6c, + 0x61,0x73,0x73,0x3e,0x46,0x6f,0x72,0x6d,0x3c,0x2f,0x63,0x6c,0x61,0x73,0x73,0x3e, + 0xd,0xa,0x20,0x3c,0x77,0x69,0x64,0x67,0x65,0x74,0x20,0x63,0x6c,0x61,0x73,0x73, + 0x3d,0x22,0x51,0x57,0x69,0x64,0x67,0x65,0x74,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d, + 0x22,0x46,0x6f,0x72,0x6d,0x22,0x20,0x3e,0xd,0xa,0x20,0x20,0x3c,0x70,0x72,0x6f, + 0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6f,0x62,0x6a,0x65, + 0x63,0x74,0x4e,0x61,0x6d,0x65,0x22,0x20,0x3e,0xd,0xa,0x20,0x20,0x20,0x3c,0x73, + 0x74,0x72,0x69,0x6e,0x67,0x20,0x6e,0x6f,0x74,0x72,0x3d,0x22,0x74,0x72,0x75,0x65, + 0x22,0x20,0x3e,0x46,0x6f,0x72,0x6d,0x3c,0x2f,0x73,0x74,0x72,0x69,0x6e,0x67,0x3e, + 0xd,0xa,0x20,0x20,0x3c,0x2f,0x70,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3e,0xd, + 0xa,0x20,0x20,0x3c,0x70,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d, + 0x65,0x3d,0x22,0x67,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x22,0x20,0x3e,0xd,0xa, + 0x20,0x20,0x20,0x3c,0x72,0x65,0x63,0x74,0x3e,0xd,0xa,0x20,0x20,0x20,0x20,0x3c, + 0x78,0x3e,0x30,0x3c,0x2f,0x78,0x3e,0xd,0xa,0x20,0x20,0x20,0x20,0x3c,0x79,0x3e, + 0x30,0x3c,0x2f,0x79,0x3e,0xd,0xa,0x20,0x20,0x20,0x20,0x3c,0x77,0x69,0x64,0x74, + 0x68,0x3e,0x34,0x30,0x30,0x3c,0x2f,0x77,0x69,0x64,0x74,0x68,0x3e,0xd,0xa,0x20, + 0x20,0x20,0x20,0x3c,0x68,0x65,0x69,0x67,0x68,0x74,0x3e,0x33,0x30,0x30,0x3c,0x2f, + 0x68,0x65,0x69,0x67,0x68,0x74,0x3e,0xd,0xa,0x20,0x20,0x20,0x3c,0x2f,0x72,0x65, + 0x63,0x74,0x3e,0xd,0xa,0x20,0x20,0x3c,0x2f,0x70,0x72,0x6f,0x70,0x65,0x72,0x74, + 0x79,0x3e,0xd,0xa,0x20,0x20,0x3c,0x70,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20, + 0x6e,0x61,0x6d,0x65,0x3d,0x22,0x77,0x69,0x6e,0x64,0x6f,0x77,0x54,0x69,0x74,0x6c, + 0x65,0x22,0x20,0x3e,0xd,0xa,0x20,0x20,0x20,0x3c,0x73,0x74,0x72,0x69,0x6e,0x67, + 0x3e,0x46,0x6f,0x72,0x6d,0x3c,0x2f,0x73,0x74,0x72,0x69,0x6e,0x67,0x3e,0xd,0xa, + 0x20,0x20,0x3c,0x2f,0x70,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3e,0xd,0xa,0x20, + 0x3c,0x2f,0x77,0x69,0x64,0x67,0x65,0x74,0x3e,0xd,0xa,0x20,0x3c,0x70,0x69,0x78, + 0x6d,0x61,0x70,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x3c,0x2f,0x70,0x69, + 0x78,0x6d,0x61,0x70,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x3e,0xd,0xa,0x20, + 0x3c,0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x2f,0x3e,0xd,0xa, + 0x3c,0x2f,0x75,0x69,0x3e,0xd,0xa, + +}; + +static const unsigned char qt_resource_name[] = { + // trolltech + 0x0,0x9, + 0x6,0x33,0x5c,0xb8, + 0x0,0x74, + 0x0,0x72,0x0,0x6f,0x0,0x6c,0x0,0x6c,0x0,0x74,0x0,0x65,0x0,0x63,0x0,0x68, + // designer + 0x0,0x8, + 0xc,0x9f,0xe9,0x82, + 0x0,0x64, + 0x0,0x65,0x0,0x73,0x0,0x69,0x0,0x67,0x0,0x6e,0x0,0x65,0x0,0x72, + // templates + 0x0,0x9, + 0x4,0x72,0x7f,0x43, + 0x0,0x74, + 0x0,0x65,0x0,0x6d,0x0,0x70,0x0,0x6c,0x0,0x61,0x0,0x74,0x0,0x65,0x0,0x73, + // images + 0x0,0x6, + 0x7,0x3,0x7d,0xc3, + 0x0,0x69, + 0x0,0x6d,0x0,0x61,0x0,0x67,0x0,0x65,0x0,0x73, + // designer.png + 0x0,0xc, + 0x9,0x9c,0x68,0x87, + 0x0,0x64, + 0x0,0x65,0x0,0x73,0x0,0x69,0x0,0x67,0x0,0x6e,0x0,0x65,0x0,0x72,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // forms + 0x0,0x5, + 0x0,0x6d,0x69,0x43, + 0x0,0x66, + 0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x73, + // Dialog_with_Buttons_Bottom.ui + 0x0,0x1d, + 0x5,0xfa,0x5f,0xf9, + 0x0,0x44, + 0x0,0x69,0x0,0x61,0x0,0x6c,0x0,0x6f,0x0,0x67,0x0,0x5f,0x0,0x77,0x0,0x69,0x0,0x74,0x0,0x68,0x0,0x5f,0x0,0x42,0x0,0x75,0x0,0x74,0x0,0x74,0x0,0x6f, + 0x0,0x6e,0x0,0x73,0x0,0x5f,0x0,0x42,0x0,0x6f,0x0,0x74,0x0,0x74,0x0,0x6f,0x0,0x6d,0x0,0x2e,0x0,0x75,0x0,0x69, + // Dialog_with_Buttons_Right.ui + 0x0,0x1c, + 0xb,0x3b,0x86,0x39, + 0x0,0x44, + 0x0,0x69,0x0,0x61,0x0,0x6c,0x0,0x6f,0x0,0x67,0x0,0x5f,0x0,0x77,0x0,0x69,0x0,0x74,0x0,0x68,0x0,0x5f,0x0,0x42,0x0,0x75,0x0,0x74,0x0,0x74,0x0,0x6f, + 0x0,0x6e,0x0,0x73,0x0,0x5f,0x0,0x52,0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x74,0x0,0x2e,0x0,0x75,0x0,0x69, + // Main_Window.ui + 0x0,0xe, + 0x4,0xbe,0x2a,0xd9, + 0x0,0x4d, + 0x0,0x61,0x0,0x69,0x0,0x6e,0x0,0x5f,0x0,0x57,0x0,0x69,0x0,0x6e,0x0,0x64,0x0,0x6f,0x0,0x77,0x0,0x2e,0x0,0x75,0x0,0x69, + // Widget.ui + 0x0,0x9, + 0xa,0xdc,0xce,0x59, + 0x0,0x57, + 0x0,0x69,0x0,0x64,0x0,0x67,0x0,0x65,0x0,0x74,0x0,0x2e,0x0,0x75,0x0,0x69, + +}; + +static const unsigned char qt_resource_struct[] = { + // : + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1, + // :/trolltech + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2, + // :/trolltech/designer + 0x0,0x0,0x0,0x18,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x3, + // :/trolltech/designer/templates + 0x0,0x0,0x0,0x2e,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x6, + // :/trolltech/designer/images + 0x0,0x0,0x0,0x46,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x5, + // :/trolltech/designer/images/designer.png + 0x0,0x0,0x0,0x58,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, + // :/trolltech/designer/templates/forms + 0x0,0x0,0x0,0x76,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x7, + // :/trolltech/designer/templates/forms/Main_Window.ui + 0x0,0x0,0x1,0x4,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x3e,0x5, + // :/trolltech/designer/templates/forms/Dialog_with_Buttons_Bottom.ui + 0x0,0x0,0x0,0x86,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x39,0x13, + // :/trolltech/designer/templates/forms/Widget.ui + 0x0,0x0,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x40,0xd0, + // :/trolltech/designer/templates/forms/Dialog_with_Buttons_Right.ui + 0x0,0x0,0x0,0xc6,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x3b,0x89, + +}; + +int qInitResources_designer() +{ + extern bool qRegisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); + qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} +Q_CONSTRUCTOR_FUNCTION(qInitResources_designer) +int qCleanupResources_designer() +{ + extern bool qUnregisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); + qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} +Q_DESTRUCTOR_FUNCTION(qCleanupResources_designer) diff --git a/src/designer/formdesigner/qtdesigner.pri b/src/designer/formdesigner/qtdesigner.pri new file mode 100644 index 0000000..f0a1d3e --- /dev/null +++ b/src/designer/formdesigner/qtdesigner.pri @@ -0,0 +1,44 @@ +###################################################################### +# Automatically generated by qmake (2.00a) ?? 20. ??? 19:33:50 2006 +###################################################################### + +DEPENDPATH += . +INCLUDEPATH += . + +# Input +HEADERS += formwindowsettings.h \ + newform.h \ + plugindialog.h \ + qdesigner_actioneditor.h \ + qdesigner_actions.h \ + qdesigner_formwindow.h \ + qdesigner_objectinspector.h \ + qdesigner_pch.h \ + qdesigner_propertyeditor.h \ + qdesigner_resourceeditor.h \ + qdesigner_settings.h \ + qdesigner_signalsloteditor.h \ + qdesigner_toolwindow.h \ + qdesigner_widgetbox.h \ + qdesigner_workbench.h \ + saveformastemplate.h +FORMS += formwindowsettings.ui \ + newform.ui \ + plugindialog.ui \ + saveformastemplate.ui +SOURCES += formwindowsettings.cpp \ + newform.cpp \ + plugindialog.cpp \ + qdesigner_actioneditor.cpp \ + qdesigner_actions.cpp \ + qdesigner_formwindow.cpp \ + qdesigner_objectinspector.cpp \ + qdesigner_propertyeditor.cpp \ + qdesigner_resourceeditor.cpp \ + qdesigner_settings.cpp \ + qdesigner_signalsloteditor.cpp \ + qdesigner_toolwindow.cpp \ + qdesigner_widgetbox.cpp \ + qdesigner_workbench.cpp \ + saveformastemplate.cpp +RESOURCES += designer.qrc diff --git a/src/designer/formdesigner/qtdesigner.pro b/src/designer/formdesigner/qtdesigner.pro new file mode 100644 index 0000000..680e3da --- /dev/null +++ b/src/designer/formdesigner/qtdesigner.pro @@ -0,0 +1,15 @@ +include ( qtdesigner.pri ) +include ( ../../ananas.pri ) + +TEMPLATE = lib +TARGET = qt4designer + +INCLUDEPATH += + +DEFINES += + +LIBS += -lQtDesignerComponents + + +DESTDIR = ../../../lib +DLLDESTDIR = ../../../bin diff --git a/src/designer/formdesigner/saveformastemplate.cpp b/src/designer/formdesigner/saveformastemplate.cpp new file mode 100644 index 0000000..3cfec23 --- /dev/null +++ b/src/designer/formdesigner/saveformastemplate.cpp @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include "saveformastemplate.h" +#include "qdesigner_settings.h" + +#include +#include +#include + +#include + +SaveFormAsTemplate::SaveFormAsTemplate(QDesignerFormWindowInterface *formWindow, QWidget *parent) + : QDialog(parent, Qt::Sheet), + m_formWindow(formWindow) +{ + ui.setupUi(this); + + ui.templateNameEdit->setText(formWindow->mainContainer()->objectName()); + ui.templateNameEdit->selectAll(); + + ui.templateNameEdit->setFocus(); + + QDesignerSettings settings; + QStringList paths = settings.formTemplatePaths(); + ui.categoryCombo->addItems(paths); + ui.categoryCombo->addItem(tr("Add path...")); + m_addPathIndex = ui.categoryCombo->count() - 1; + connect(ui.templateNameEdit, SIGNAL(textChanged(QString)), + this, SLOT(updateOKButton(QString))); + connect(ui.categoryCombo, SIGNAL(activated(int)), this, SLOT(checkToAddPath(int))); +} + +SaveFormAsTemplate::~SaveFormAsTemplate() +{ +} + +void SaveFormAsTemplate::on_okButton_clicked() +{ + QString templateFileName = ui.categoryCombo->currentText() + QLatin1Char('/') + ui.templateNameEdit->text(); + if (!templateFileName.endsWith(QLatin1String(".ui"))) + templateFileName.append(QLatin1String(".ui")); + QFile file(templateFileName); + + if (file.exists()) { + if (QMessageBox::information(m_formWindow, tr("Template Exists"), + tr("A template with the name %1 already exits\n" + "Do you want overwrite the template?").arg(ui.templateNameEdit->text()), + tr("Overwrite Template"), tr("Cancel"), QString(), 1, 1) == 1) { + return; + } + } + + while (!file.open(QFile::WriteOnly)) { + if (QMessageBox::information(m_formWindow, tr("Open Error"), + tr("There was an error opening template %1 for writing. Reason: %2").arg(ui.templateNameEdit->text()).arg(file.errorString()), + tr("Try again"), tr("Cancel"), QString(), 0, 1) == 1) { + return; + } + } + + QByteArray ba = m_formWindow->contents().toUtf8(); + while (file.write(ba) != ba.size()) { + if (QMessageBox::information(m_formWindow, tr("Write Error"), + tr("There was an error writing the template %1 to disk. Reason: %2").arg(ui.templateNameEdit->text()).arg(file.errorString()), + tr("Try again"), tr("Cancel"), QString(), 0, 1) == 1) { + file.close(); + file.remove(); + return; + } + file.reset(); + } + // update the list of places too... + QStringList sl; + for (int i = 0; i < m_addPathIndex; ++i) + sl << ui.categoryCombo->itemText(i); + + QDesignerSettings().setFormTemplatePaths(sl); + + accept(); +} + +void SaveFormAsTemplate::on_cancelButton_clicked() +{ + reject(); +} + +void SaveFormAsTemplate::updateOKButton(const QString &str) +{ + ui.okButton->setEnabled(!str.isEmpty()); +} + +void SaveFormAsTemplate::checkToAddPath(int itemIndex) +{ + if (itemIndex != m_addPathIndex) + return; + + QString dir = QFileDialog::getExistingDirectory(this, + tr("Pick a directory to save templates in")); + if (dir.isEmpty()) { + ui.categoryCombo->setCurrentIndex(0); + return; + } + + ui.categoryCombo->insertItem(m_addPathIndex, dir); + ui.categoryCombo->setCurrentIndex(m_addPathIndex); + ++m_addPathIndex; +} diff --git a/src/designer/formdesigner/saveformastemplate.h b/src/designer/formdesigner/saveformastemplate.h new file mode 100644 index 0000000..45d0b57 --- /dev/null +++ b/src/designer/formdesigner/saveformastemplate.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef SAVEFORMASTEMPLATE_H +#define SAVEFORMASTEMPLATE_H + +#include "ui_saveformastemplate.h" + +class QDesignerFormWindowInterface; + +class SaveFormAsTemplate: public QDialog +{ + Q_OBJECT +public: + SaveFormAsTemplate(QDesignerFormWindowInterface *formWindow, QWidget *parent = 0); + virtual ~SaveFormAsTemplate(); + +private slots: + void on_okButton_clicked(); + void on_cancelButton_clicked(); + void updateOKButton(const QString &str); + void checkToAddPath(int itemIndex); + +private: + Ui::SaveFormAsTemplate ui; + QDesignerFormWindowInterface *m_formWindow; + int m_addPathIndex; +}; + +#endif // SAVEFORMASTEMPLATE_H diff --git a/src/designer/formdesigner/saveformastemplate.ui b/src/designer/formdesigner/saveformastemplate.ui new file mode 100644 index 0000000..5b30435 --- /dev/null +++ b/src/designer/formdesigner/saveformastemplate.ui @@ -0,0 +1,248 @@ + + + ********************************************************************* +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +********************************************************************* + + SaveFormAsTemplate + + + + 0 + 0 + 391 + 149 + + + + Save Form As Template... + + + + 9 + + + 6 + + + + + 1 + + + 6 + + + + + + 67 + 1 + 285 + 22 + + + + + + + QLineEdit::Normal + + + + + + + + 67 + 29 + 285 + 26 + + + + + + + + + 1 + 29 + 60 + 26 + + + + QFrame::NoFrame + + + QFrame::Plain + + + &Category: + + + Qt::AutoText + + + categoryCombo + + + + + + + + 1 + 1 + 60 + 22 + + + + QFrame::NoFrame + + + QFrame::Plain + + + &Name: + + + Qt::AutoText + + + templateNameEdit + + + + + + + + + + 9 + 71 + 373 + 20 + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 9 + 97 + 373 + 3 + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + 1 + + + 6 + + + + + + 1 + 1 + 197 + 32 + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 204 + 1 + 81 + 32 + + + + OK + + + true + + + + + + + + 291 + 1 + 81 + 32 + + + + Cancel + + + + + + + + + + + diff --git a/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Bottom.ui b/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Bottom.ui new file mode 100644 index 0000000..d7e4572 --- /dev/null +++ b/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Bottom.ui @@ -0,0 +1,100 @@ + + + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 20 + 250 + 351 + 33 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + okButton + clicked() + Dialog + accept() + + + 278 + 253 + + + 96 + 254 + + + + + cancelButton + clicked() + Dialog + reject() + + + 369 + 253 + + + 179 + 282 + + + + + diff --git a/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Right.ui b/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Right.ui new file mode 100644 index 0000000..00e2ca7 --- /dev/null +++ b/src/designer/formdesigner/templates/forms/Dialog_with_Buttons_Right.ui @@ -0,0 +1,100 @@ + + + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 300 + 20 + 77 + 106 + + + + + 0 + + + 6 + + + + + OK + + + + + + + Cancel + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + okButton + clicked() + Dialog + accept() + + + 351 + 38 + + + 233 + 29 + + + + + cancelButton + clicked() + Dialog + reject() + + + 330 + 66 + + + 197 + 125 + + + + + diff --git a/src/designer/formdesigner/templates/forms/Main_Window.ui b/src/designer/formdesigner/templates/forms/Main_Window.ui new file mode 100644 index 0000000..8b85924 --- /dev/null +++ b/src/designer/formdesigner/templates/forms/Main_Window.ui @@ -0,0 +1,27 @@ + + + + + MainWindow + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + + diff --git a/src/designer/formdesigner/templates/forms/Widget.ui b/src/designer/formdesigner/templates/forms/Widget.ui new file mode 100644 index 0000000..c8f4991 --- /dev/null +++ b/src/designer/formdesigner/templates/forms/Widget.ui @@ -0,0 +1,24 @@ + + + + + Form + + + Form + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + diff --git a/src/designer/images/a-system.png b/src/designer/images/a-system.png new file mode 100644 index 0000000..6638dff Binary files /dev/null and b/src/designer/images/a-system.png differ diff --git a/src/designer/images/action_g.png b/src/designer/images/action_g.png new file mode 100644 index 0000000..4a50b3d Binary files /dev/null and b/src/designer/images/action_g.png differ diff --git a/src/designer/images/actions.png b/src/designer/images/actions.png new file mode 100644 index 0000000..6046836 Binary files /dev/null and b/src/designer/images/actions.png differ diff --git a/src/designer/images/arrow_down.png b/src/designer/images/arrow_down.png new file mode 100644 index 0000000..3269dec Binary files /dev/null and b/src/designer/images/arrow_down.png differ diff --git a/src/designer/images/arrow_left.png b/src/designer/images/arrow_left.png new file mode 100644 index 0000000..1529c9b Binary files /dev/null and b/src/designer/images/arrow_left.png differ diff --git a/src/designer/images/arrow_right.png b/src/designer/images/arrow_right.png new file mode 100644 index 0000000..37f489c Binary files /dev/null and b/src/designer/images/arrow_right.png differ diff --git a/src/designer/images/arrow_up.png b/src/designer/images/arrow_up.png new file mode 100644 index 0000000..a124ead Binary files /dev/null and b/src/designer/images/arrow_up.png differ diff --git a/src/designer/images/cat.png b/src/designer/images/cat.png new file mode 100644 index 0000000..3c1ae0f Binary files /dev/null and b/src/designer/images/cat.png differ diff --git a/src/designer/images/cat_g.png b/src/designer/images/cat_g.png new file mode 100644 index 0000000..9e6bc8e Binary files /dev/null and b/src/designer/images/cat_g.png differ diff --git a/src/designer/images/columns.png b/src/designer/images/columns.png new file mode 100644 index 0000000..52d6fda Binary files /dev/null and b/src/designer/images/columns.png differ diff --git a/src/designer/images/d_editdelete.png b/src/designer/images/d_editdelete.png new file mode 100644 index 0000000..7fc2c40 Binary files /dev/null and b/src/designer/images/d_editdelete.png differ diff --git a/src/designer/images/designer-splash-en.png b/src/designer/images/designer-splash-en.png new file mode 100644 index 0000000..0bd4739 Binary files /dev/null and b/src/designer/images/designer-splash-en.png differ diff --git a/src/designer/images/designer-splash-ru.png b/src/designer/images/designer-splash-ru.png new file mode 100644 index 0000000..8c449ea Binary files /dev/null and b/src/designer/images/designer-splash-ru.png differ diff --git a/src/designer/images/dimensions.png b/src/designer/images/dimensions.png new file mode 100644 index 0000000..52d6fda Binary files /dev/null and b/src/designer/images/dimensions.png differ diff --git a/src/designer/images/doc.png b/src/designer/images/doc.png new file mode 100644 index 0000000..61334f2 Binary files /dev/null and b/src/designer/images/doc.png differ diff --git a/src/designer/images/doc_g.png b/src/designer/images/doc_g.png new file mode 100644 index 0000000..fa0639b Binary files /dev/null and b/src/designer/images/doc_g.png differ diff --git a/src/designer/images/doc_h.png b/src/designer/images/doc_h.png new file mode 100644 index 0000000..c304a03 Binary files /dev/null and b/src/designer/images/doc_h.png differ diff --git a/src/designer/images/editcopy.png b/src/designer/images/editcopy.png new file mode 100644 index 0000000..4a7c257 Binary files /dev/null and b/src/designer/images/editcopy.png differ diff --git a/src/designer/images/editcut.png b/src/designer/images/editcut.png new file mode 100644 index 0000000..5690a3c Binary files /dev/null and b/src/designer/images/editcut.png differ diff --git a/src/designer/images/editdelete.png b/src/designer/images/editdelete.png new file mode 100644 index 0000000..feb3242 Binary files /dev/null and b/src/designer/images/editdelete.png differ diff --git a/src/designer/images/editedit.png b/src/designer/images/editedit.png new file mode 100644 index 0000000..bff902d Binary files /dev/null and b/src/designer/images/editedit.png differ diff --git a/src/designer/images/editpaste.png b/src/designer/images/editpaste.png new file mode 100644 index 0000000..059c1f9 Binary files /dev/null and b/src/designer/images/editpaste.png differ diff --git a/src/designer/images/editrename.png b/src/designer/images/editrename.png new file mode 100644 index 0000000..1204738 Binary files /dev/null and b/src/designer/images/editrename.png differ diff --git a/src/designer/images/editsep.png b/src/designer/images/editsep.png new file mode 100644 index 0000000..d311198 Binary files /dev/null and b/src/designer/images/editsep.png differ diff --git a/src/designer/images/element.png b/src/designer/images/element.png new file mode 100644 index 0000000..52d6fda Binary files /dev/null and b/src/designer/images/element.png differ diff --git a/src/designer/images/field.png b/src/designer/images/field.png new file mode 100644 index 0000000..265c4cc Binary files /dev/null and b/src/designer/images/field.png differ diff --git a/src/designer/images/filenew.png b/src/designer/images/filenew.png new file mode 100644 index 0000000..8159fa0 Binary files /dev/null and b/src/designer/images/filenew.png differ diff --git a/src/designer/images/fileopen.png b/src/designer/images/fileopen.png new file mode 100644 index 0000000..8f5e7f3 Binary files /dev/null and b/src/designer/images/fileopen.png differ diff --git a/src/designer/images/filesave.png b/src/designer/images/filesave.png new file mode 100644 index 0000000..78adfbf Binary files /dev/null and b/src/designer/images/filesave.png differ diff --git a/src/designer/images/form.png b/src/designer/images/form.png new file mode 100644 index 0000000..d4e263c Binary files /dev/null and b/src/designer/images/form.png differ diff --git a/src/designer/images/form_g.png b/src/designer/images/form_g.png new file mode 100644 index 0000000..99cfdcb Binary files /dev/null and b/src/designer/images/form_g.png differ diff --git a/src/designer/images/function.png b/src/designer/images/function.png new file mode 100644 index 0000000..c286f9a Binary files /dev/null and b/src/designer/images/function.png differ diff --git a/src/designer/images/group.png b/src/designer/images/group.png new file mode 100644 index 0000000..52d6fda Binary files /dev/null and b/src/designer/images/group.png differ diff --git a/src/designer/images/help.png b/src/designer/images/help.png new file mode 100644 index 0000000..f57e722 Binary files /dev/null and b/src/designer/images/help.png differ diff --git a/src/designer/images/hi22-action-project_open.png b/src/designer/images/hi22-action-project_open.png new file mode 100644 index 0000000..0dfd194 Binary files /dev/null and b/src/designer/images/hi22-action-project_open.png differ diff --git a/src/designer/images/hi22-action-run.png b/src/designer/images/hi22-action-run.png new file mode 100644 index 0000000..70271db Binary files /dev/null and b/src/designer/images/hi22-action-run.png differ diff --git a/src/designer/images/information.png b/src/designer/images/information.png new file mode 100644 index 0000000..06a942b Binary files /dev/null and b/src/designer/images/information.png differ diff --git a/src/designer/images/journ.png b/src/designer/images/journ.png new file mode 100644 index 0000000..4d92109 Binary files /dev/null and b/src/designer/images/journ.png differ diff --git a/src/designer/images/journ_g.png b/src/designer/images/journ_g.png new file mode 100644 index 0000000..8739e8d Binary files /dev/null and b/src/designer/images/journ_g.png differ diff --git a/src/designer/images/m_menu.png b/src/designer/images/m_menu.png new file mode 100644 index 0000000..ba6a690 Binary files /dev/null and b/src/designer/images/m_menu.png differ diff --git a/src/designer/images/msg_error.png b/src/designer/images/msg_error.png new file mode 100644 index 0000000..901b8b6 Binary files /dev/null and b/src/designer/images/msg_error.png differ diff --git a/src/designer/images/msg_fatal.png b/src/designer/images/msg_fatal.png new file mode 100644 index 0000000..901b8b6 Binary files /dev/null and b/src/designer/images/msg_fatal.png differ diff --git a/src/designer/images/msg_info.png b/src/designer/images/msg_info.png new file mode 100644 index 0000000..f3c275f Binary files /dev/null and b/src/designer/images/msg_info.png differ diff --git a/src/designer/images/msg_warning.png b/src/designer/images/msg_warning.png new file mode 100644 index 0000000..901b8b6 Binary files /dev/null and b/src/designer/images/msg_warning.png differ diff --git a/src/designer/images/object.png b/src/designer/images/object.png new file mode 100644 index 0000000..a7d5d9a Binary files /dev/null and b/src/designer/images/object.png differ diff --git a/src/designer/images/p_menus.png b/src/designer/images/p_menus.png new file mode 100644 index 0000000..cd6a360 Binary files /dev/null and b/src/designer/images/p_menus.png differ diff --git a/src/designer/images/play.png b/src/designer/images/play.png new file mode 100644 index 0000000..dfc0048 Binary files /dev/null and b/src/designer/images/play.png differ diff --git a/src/designer/images/playprev.png b/src/designer/images/playprev.png new file mode 100644 index 0000000..d2a72b4 Binary files /dev/null and b/src/designer/images/playprev.png differ diff --git a/src/designer/images/print.png b/src/designer/images/print.png new file mode 100644 index 0000000..b03cafd Binary files /dev/null and b/src/designer/images/print.png differ diff --git a/src/designer/images/project.png b/src/designer/images/project.png new file mode 100644 index 0000000..1837c0a Binary files /dev/null and b/src/designer/images/project.png differ diff --git a/src/designer/images/qsa.png b/src/designer/images/qsa.png new file mode 100644 index 0000000..9f0f797 Binary files /dev/null and b/src/designer/images/qsa.png differ diff --git a/src/designer/images/redo.png b/src/designer/images/redo.png new file mode 100644 index 0000000..05cbcdf Binary files /dev/null and b/src/designer/images/redo.png differ diff --git a/src/designer/images/reg.png b/src/designer/images/reg.png new file mode 100644 index 0000000..bab93ce Binary files /dev/null and b/src/designer/images/reg.png differ diff --git a/src/designer/images/reg_g.png b/src/designer/images/reg_g.png new file mode 100644 index 0000000..da52b84 Binary files /dev/null and b/src/designer/images/reg_g.png differ diff --git a/src/designer/images/regs.png b/src/designer/images/regs.png new file mode 100644 index 0000000..cbc4419 Binary files /dev/null and b/src/designer/images/regs.png differ diff --git a/src/designer/images/regs_g.png b/src/designer/images/regs_g.png new file mode 100644 index 0000000..20b41fd Binary files /dev/null and b/src/designer/images/regs_g.png differ diff --git a/src/designer/images/report.png b/src/designer/images/report.png new file mode 100644 index 0000000..0c4bb0c Binary files /dev/null and b/src/designer/images/report.png differ diff --git a/src/designer/images/report_g.png b/src/designer/images/report_g.png new file mode 100644 index 0000000..04a49b1 Binary files /dev/null and b/src/designer/images/report_g.png differ diff --git a/src/designer/images/resourses.png b/src/designer/images/resourses.png new file mode 100644 index 0000000..52d6fda Binary files /dev/null and b/src/designer/images/resourses.png differ diff --git a/src/designer/images/script.png b/src/designer/images/script.png new file mode 100644 index 0000000..3b46132 Binary files /dev/null and b/src/designer/images/script.png differ diff --git a/src/designer/images/scriptnew.png b/src/designer/images/scriptnew.png new file mode 100644 index 0000000..f9008bf Binary files /dev/null and b/src/designer/images/scriptnew.png differ diff --git a/src/designer/images/scriptobject.png b/src/designer/images/scriptobject.png new file mode 100644 index 0000000..6dfd96b Binary files /dev/null and b/src/designer/images/scriptobject.png differ diff --git a/src/designer/images/searchfind.png b/src/designer/images/searchfind.png new file mode 100644 index 0000000..272aef6 Binary files /dev/null and b/src/designer/images/searchfind.png differ diff --git a/src/designer/images/separator.png b/src/designer/images/separator.png new file mode 100644 index 0000000..ed6f369 Binary files /dev/null and b/src/designer/images/separator.png differ diff --git a/src/designer/images/submenu.png b/src/designer/images/submenu.png new file mode 100644 index 0000000..ac57159 Binary files /dev/null and b/src/designer/images/submenu.png differ diff --git a/src/designer/images/table.png b/src/designer/images/table.png new file mode 100644 index 0000000..3d73517 Binary files /dev/null and b/src/designer/images/table.png differ diff --git a/src/designer/images/table_g.png b/src/designer/images/table_g.png new file mode 100644 index 0000000..b6042e4 Binary files /dev/null and b/src/designer/images/table_g.png differ diff --git a/src/designer/images/toolbar.png b/src/designer/images/toolbar.png new file mode 100644 index 0000000..b47aa63 Binary files /dev/null and b/src/designer/images/toolbar.png differ diff --git a/src/designer/images/undo.png b/src/designer/images/undo.png new file mode 100644 index 0000000..cbcda87 Binary files /dev/null and b/src/designer/images/undo.png differ diff --git a/src/designer/images/webform.png b/src/designer/images/webform.png new file mode 100644 index 0000000..781874a Binary files /dev/null and b/src/designer/images/webform.png differ diff --git a/src/designer/images/webform_g.png b/src/designer/images/webform_g.png new file mode 100644 index 0000000..91c0e21 Binary files /dev/null and b/src/designer/images/webform_g.png differ diff --git a/src/designer/interfacetree.cpp b/src/designer/interfacetree.cpp new file mode 100644 index 0000000..8f47ec8 --- /dev/null +++ b/src/designer/interfacetree.cpp @@ -0,0 +1,359 @@ +/**************************************************************************** +** $Id: interfacetree.cpp,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Code file of the Interface Tree of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +//Added by qt3to4: +#include + +#include "acfg.h" +#include "interfacetree.h" +#include "mainform.h" +#include "deditcommand.h" +#include "dedittoolbar.h" +#include "awindowslist.h" + +extern MainForm *mainform; +extern QPixmap rcIcon(const char *name); +extern void set_Icon(Q3ListViewItem *item, const char *name); + +InterfaceListViewItem::InterfaceListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: ananasListViewItem( parent, cfgmd, cfgobj, name ) +{ + id = md->id(obj); + if ( ( id ) && ( md->objClass(obj) != md_separator ) ) setRenameEnabled(0, true); + aCfgItem comaction, active; + QPixmap pix; + int idd; + + comaction = md->findChild( obj, md_comaction, 0 ); + idd = md->text( comaction ).toInt(); + active = md->findChild( md->find( idd ), md_active_picture, 0 ); + pix.loadFromData( md->binary( active ) ); + setPixmap( 0, pix ); + pix = 0; +}; + +InterfaceListViewItem::InterfaceListViewItem( ananasListViewItem *parent, ananasListViewItem + *after, aCfg * cfgmd, aCfgItem cfgobj, const QString &name ) +: ananasListViewItem( parent, after, cfgmd, cfgobj, name ) +{ + id = md->id( obj ); + if ( ( id ) && ( md->objClass(obj) != md_separator ) ) setRenameEnabled(0, true); + + aCfgItem comaction, active; + int idd; + QPixmap pix; + + comaction = md->findChild( obj, md_comaction, 0 ); + idd = md->text( comaction ).toInt(); + active = md->findChild( md->find( idd ), md_active_picture, 0 ); + pix.loadFromData( md->binary( active ) ); + setPixmap( 0, pix ); + pix = 0; +}; + +void +InterfaceListViewItem::loadTree() +{ + QString oclass; + aCfgItem cobj; + + clearTree(); + + if ( !md ) return; + cobj = md->firstChild ( obj ); + while ( !cobj.isNull() ) + { + oclass = md->objClass ( cobj ); + if ( oclass == md_submenu || oclass == md_popupmenu || oclass == md_toolbar ) + { + loadSubmenu ( this, getLastChild(), cobj ); + } + oclass = md->objClass ( cobj ); + if ( oclass == md_command ) + { + loadCommand ( this, getLastChild(), cobj ); + } + oclass = md->objClass ( cobj ); + if ( oclass == md_separator ) + { + loadSeparator ( this, getLastChild(), cobj ); + } + cobj = md->nextSibling ( cobj ); + } +}; + +void +InterfaceListViewItem::loadSubmenu ( ananasListViewItem * parent, ananasListViewItem *after, aCfgItem child ) +{ + InterfaceListViewItem * mparent; + QString oclass; + aCfgItem cobj; + + mparent = new InterfaceListViewItem( parent, after, md, child, QString::null ); + mparent->setPixmap(0, rcIcon("submenu.png")); + cobj = md->firstChild ( mparent->obj ); + while ( !cobj.isNull() ) + { + oclass = md->objClass ( cobj ); + if ( oclass == md_submenu || oclass == md_toolbar ) + { + loadSubmenu ( mparent, mparent->getLastChild(), cobj ); + } + oclass = md->objClass ( cobj ); + if ( oclass == md_command ) + { + loadCommand ( mparent, mparent->getLastChild(), cobj ); + } + oclass = md->objClass ( cobj ); + if ( oclass == md_separator ) + { + loadSeparator ( mparent, mparent->getLastChild(), cobj ); + } + cobj = md->nextSibling ( cobj ); + } +}; + +void +InterfaceListViewItem::loadCommand ( ananasListViewItem * parent, ananasListViewItem *after, aCfgItem child ) +{ + new InterfaceListViewItem( parent, after, md, child, QString::null ); +}; + +void +InterfaceListViewItem::loadSeparator ( ananasListViewItem * parent, ananasListViewItem *after, aCfgItem child ) +{ + InterfaceListViewItem *newitem; + newitem = new InterfaceListViewItem( parent, after, md,child,QObject::tr("-------------------") ); + newitem->setPixmap(0, rcIcon("separator.png")); + +}; + +void +InterfaceListViewItem::newCommand () +{ + aCfgItem newobj; + InterfaceListViewItem *newitem;//, *par; + QString oclass = md->objClass( obj ); + +/* par = (InterfaceListViewItem *)this->parent(); + if ( par->text( 0 ) != QObject::tr("Interface") ) obj = md->findChild( obj, md_toolbars ); +*/ if ( oclass == md_popupmenu || oclass == md_submenu || + oclass == md_mainmenu || oclass == md_toolbar ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_command, QObject::tr("New Command") ); + newitem = new InterfaceListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->edit(); + }; +} + +void +InterfaceListViewItem::newSubmenu () +{ + aCfgItem newobj; + InterfaceListViewItem *newitem; + QString oclass = md->objClass( obj ); + + if ( oclass == md_submenu || oclass == md_mainmenu || + oclass == md_toolbars || oclass == md_popupmenus || oclass == md_popupmenu ) + { + setSelected( FALSE ); + setOpen( TRUE ); + if ( oclass == md_popupmenus ) newobj = md->insert( obj, md_popupmenu, QObject::tr("New Popup menu") ); + else + if ( oclass == md_toolbars ) newobj = md->insert( obj, md_toolbar, QObject::tr("New tool bar") ); + else + newobj = md->insert( obj, md_submenu, QObject::tr("New Submenu") ); + newitem = new InterfaceListViewItem( this, getLastChild(), md, newobj ); + newitem->setPixmap(0, rcIcon("submenu.png")); +// newitem->setSelected( TRUE ); + }; + +} + +void +InterfaceListViewItem::newSeparator () +{ + aCfgItem newobj; + InterfaceListViewItem *newitem; + QString oclass = md->objClass( obj ); + + if ( oclass == md_submenu || oclass == md_mainmenu || oclass == md_popupmenu ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_separator ); + newitem = new InterfaceListViewItem( this, getLastChild(), md, newobj, QObject::tr("-------------------") ); + newitem->setPixmap(0, rcIcon("separator.png")); +// newitem->setSelected( TRUE ); + + }; +} + +void +InterfaceListViewItem::edit () +{ + QWorkspace *ws = mainform->ws; + aWindowsList *wl = mainform->wl; + QString oclass = md->objClass( obj ); + int objid = md->id( obj ); + if ( wl->find( objid ) ) { + wl->get( objid )->setFocus(); + return; + } + + if ( oclass == md_command ) + { + dEditCommand * e = new dEditCommand ( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + return; + } +} + + +InterfaceTreeView::InterfaceTreeView ( QWidget *parent, aCfg *cfgmd ) +: ananasTreeView ( parent, cfgmd ) +{ + InterfaceListViewItem *mainmenu, *toolbars, *popups; + aCfgItem iface, item; + iface = md->find ( mdc_interface ); + if ( iface.isNull() ) iface = md->insert( md->find ( mdc_root ), md_interface, QString::null, -1 ); + item = md->find ( iface, md_toolbars ); + if ( item.isNull() ) item = md->insert( iface, md_toolbars, QString::null, -1 ); + toolbars = new InterfaceListViewItem ( this, md, item, QObject::tr ( "Toolbars" ) ); + toolbars->setPixmap(0, rcIcon("toolbar.png")); + toolbars->loadTree(); + toolbars->setOpen ( TRUE ); + item = md->find ( iface, md_mainmenu ); + if ( item.isNull() ) item = md->insert( iface, md_mainmenu, QString::null, -1 ); + mainmenu = new InterfaceListViewItem ( this, md, item, QObject::tr ( "Main menu" ) ); + mainmenu->setPixmap(0, rcIcon("m_menu.png")); + mainmenu->loadTree(); + mainmenu->setOpen ( TRUE ); + item = md->find ( iface, md_popupmenus ); + if ( item.isNull() ) item = md->insert( iface, md_popupmenus, QString::null, -1 ); + popups = new InterfaceListViewItem ( this, md, item, QObject::tr ( "Popup menus" ) ); + popups->setPixmap(0, rcIcon("p_menus.png")); + popups->loadTree(); + popups->setOpen ( TRUE ); + connect( this, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), this, SLOT(ContextMenu() ) ); + connect( this, SIGNAL( returnPressed( Q3ListViewItem*) ), this, SLOT( itemEdit() ) ); + connect( this, SIGNAL( doubleClicked( Q3ListViewItem*) ), this, SLOT( itemEdit() ) ); +}; + + +void +InterfaceTreeView::ContextMenu() +{ + Q3PopupMenu *m=new Q3PopupMenu( this, "PopupMenu" ); + Q_CHECK_PTR(m); + +/* QLabel *caption = new QLabel( "" "Context Menu", this ); + caption->setAlignment( Qt::AlignCenter ); + m->insertItem( caption ); + m->insertItem( tr("&Rename"), this, SLOT( itemRename() ), CTRL+Key_R); + m->insertItem( tr("&Edit"), this, SLOT( itemEdit() ), CTRL+Key_E ); + m->insertItem( tr("&Delete"), this, SLOT( itemDelete() ), CTRL+Key_D ); + m->insertItem( tr("&MoveUp"), this, SLOT( itemMoveUp() ), CTRL+Key_U ); + m->insertItem( tr("&MoveDown"), this, SLOT( itemMoveDown() ), CTRL+Key_M ); +*/ + ananasTreeView::ContextMenuAdd( m ); + m->insertItem( tr("&New Submenu"), this, SLOT( itemNewSubmenu() ), Qt::CTRL+Qt::Key_N ); + m->insertItem( tr("New &Command"), this, SLOT( itemNewCommand() ), Qt::CTRL+Qt::Key_C ); + m->insertItem( tr("New &Separator"), this, SLOT( itemNewSeparator() ), Qt::CTRL+Qt::Key_S ); + m->exec( QCursor::pos() ); + delete m; +}; + +void +InterfaceTreeView::itemNewSubmenu() +{ + InterfaceListViewItem *i = (InterfaceListViewItem *) selectedItem(); + if ( i ) + i->newSubmenu(); +}; + +void +InterfaceTreeView::itemNewCommand() +{ + InterfaceListViewItem *i = (InterfaceListViewItem *) selectedItem(); + if ( i ) + i->newCommand(); +}; + +void +InterfaceTreeView::itemNewSeparator() +{ + InterfaceListViewItem *i = (InterfaceListViewItem *) selectedItem(); + if ( i ) + i->newSeparator(); +}; + +void +InterfaceTreeView::itemDelete() +{ + deleteItem(); +}; + +void +InterfaceTreeView::itemMoveUp() +{ + moveUpItem(); +}; + +void +InterfaceTreeView::itemMoveDown() +{ + moveDownItem(); +}; + +void +InterfaceTreeView::itemEdit() +{ + InterfaceListViewItem *i = (InterfaceListViewItem *) selectedItem(); + if ( i ) i->edit(); +}; +void +InterfaceTreeView::itemRename() +{ + renameItem(); +} + diff --git a/src/designer/interfacetree.h b/src/designer/interfacetree.h new file mode 100644 index 0000000..f9e452c --- /dev/null +++ b/src/designer/interfacetree.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** $Id: interfacetree.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Header file of the Interface Tree of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef INTERFACETREE_H +#define INTERFACETREE_H +#include +#include +//#include "acfg.h" +#include "atreeitems.h" + +class QWidget; + +class InterfaceListViewItem : public ananasListViewItem +{ +public: + InterfaceListViewItem( Q3ListView *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + InterfaceListViewItem( ananasListViewItem *parent, ananasListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, + const QString &name = QString::null ); + void loadTree(); + void newCommand (); + void newSubmenu (); + void newSeparator (); + void edit (); +private: + void loadSubmenu ( ananasListViewItem * parent, ananasListViewItem *after, aCfgItem child ); + void loadCommand ( ananasListViewItem * parent, ananasListViewItem *after, aCfgItem child ); + void loadSeparator ( ananasListViewItem * parent, ananasListViewItem *after, aCfgItem child); +}; + +class InterfaceTreeView : public ananasTreeView +{ + Q_OBJECT +public: + InterfaceTreeView( QWidget *parent, aCfg *cfgmd ); + +public slots: + void ContextMenu(); + void itemNewSubmenu(); + void itemNewCommand(); + void itemNewSeparator(); + void itemDelete(); + void itemEdit(); + void itemMoveUp (); + void itemMoveDown (); + void itemRename(); + +}; + +#endif //INTERFACETREE_H diff --git a/src/designer/main.cpp b/src/designer/main.cpp new file mode 100644 index 0000000..97c73fe --- /dev/null +++ b/src/designer/main.cpp @@ -0,0 +1,195 @@ +/**************************************************************************** +** $Id: main.cpp,v 1.5 2008/12/05 21:11:54 leader Exp $ +** +** Main file of Ananas Designer application +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include "alog.h" +#include "ananas.h" +#include "mainform.h" +#include "dselectdb.h" +#include "formdesigner.h" + +MainForm *mainform = 0; +aWindowsList *mainformwl = 0; +QWorkspace *mainformws = 0; +//QApplication *application = 0; +QTranslator *translator = 0, tr_app(0), tr_lib(0), tr_plugins(0); +aFormDesigner *formdesigner = 0; +QString lang="en", + rcfile="", + username="", + userpassword=""; + + +int setTranslator(QString lang) +{ + QString langdir; +#ifdef Q_OS_WIN32 + langdir = qApp->applicationDirPath()+"/translations/"; +#else + langdir = "/usr/share/ananas4/translations/"; +#endif + tr_app.load( langdir+"ananas-designer-"+lang+".qm","."); + tr_lib.load( langdir+"ananas-lib-"+lang+".qm","."); + tr_plugins.load( langdir+"ananas-plugins-"+lang+".qm","."); + return 0; +} + +int +parseCommandLine( int argc, char **argv ) +{ + QString param, name, value; + int i; + char *s, locale[50]="en"; + + strncpy( locale, QTextCodec::locale(), sizeof( locale ) ); + s = strchr( locale, '_' ); + if ( s ) { + *s = 0; + } + lang = locale; + setTranslator( lang ); +// printf("locale=%s\n", locale ); + QString str_ru=QString::null, str_en=QString::null; + bool lang_setted = false; + bool help_setted = false; + for ( i=1; iws; + mainformwl = mainform->wl; +// application = &app; +// dSelectDB dselectdb; + int rc; + QPixmap pixmap; + + if ( parseCommandLine( argc, argv ) ) return 1; + qApp->installTranslator( &tr_lib ); + qApp->installTranslator( &tr_plugins ); + qApp->installTranslator( &tr_app ); + pixmap = QPixmap( ":/images/designer-splash-"+lang+".png" ); + if ( pixmap.isNull() ) +#ifdef Q_OS_WIN32 + pixmap = QPixmap( qApp->applicationDirPath()+"/designer-splash-"+lang+".png" ); + qApp->addLibraryPath( qApp->applicationDirPath() ); +#else + pixmap = QPixmap( "/usr/share/ananas4/designer/locale/designer-splash-"+lang+".png" ); +// qApp->addLibraryPath( "/usr/lib/ananas4/" ); + qApp->setLibraryPaths( QStringList() <<"/usr/lib/ananas4/" ); +#endif + foreach (QString path, app.libraryPaths()) + printf("%s\n", path.toUtf8().data()); + + if ( pixmap.isNull() ) + pixmap = QPixmap( ":/images/designer-splash-en.png" ); + QSplashScreen *splash = new QSplashScreen( pixmap ); + if ( ananas_login( rcfile, username, userpassword, 0, AApplication::Designer ) ){ + splash->show(); + splash->message( QObject::tr("Init application"), Qt::AlignBottom, Qt::white ); + w->rcfile = rcfile; + qApp->setMainWidget( w ); + splash->message( QObject::tr("Init forms designer"), Qt::AlignBottom, Qt::white ); + formdesigner = new aFormDesigner(); + + //--formdesigner->reparent( mainformws, 0, QPoint( 5, 5 ), false ); +// mainformws->addWindow(formdesigner); + formdesigner->setCaption( QObject::tr("Dialog forms designer") ); + formdesigner->hide(); + w->show(); + splash->clear(); + splash->finish( w ); + delete splash; + qApp->connect( qApp, SIGNAL( lastWindowClosed() ), qApp, SLOT( quit() ) ); + mainform->configOpen(); +// QTextCodec::setCodecForCStrings( QTextCodec::codecForName("UTF8") ); + + rc = app.exec(); + if( w ) delete w; + w=0; + aLog::close(); + ananas_logout(); + return rc; + } + aLog::close(); + return 0; +} diff --git a/src/designer/mainform.cpp b/src/designer/mainform.cpp new file mode 100644 index 0000000..ab3be19 --- /dev/null +++ b/src/designer/mainform.cpp @@ -0,0 +1,496 @@ +#include "mainform.h" + +#include +#include +#include + +#include "qtoolbutton.h" + +#include +#include +#include "q3filedialog.h" +#include "qstatusbar.h" +#include "qmessagebox.h" +#include +//Added by qt3to4: +#include +#include +#include + +#include "ananas.h" +//#include "adatabase.h" +//#include "acfgrc.h" +#include "cfgform.h" +//#include "messageswindow.h" +#include "dselectdb.h" +#include "alog.h" + +//#include "qananastable.h" + +extern CfgForm *configform; +//extern QApplication *application; +extern void messageproc(int n, const char *msg); + +/* + * Constructs a MainForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +MainForm::MainForm(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +MainForm::~MainForm() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void MainForm::languageChange() +{ + retranslateUi(this); +} + +void MainForm::filePrint() +{ + +} + +void MainForm::fileExit() +{ +// cfg_done(); +} + +void MainForm::editUndo() +{ + +} + +void MainForm::editRedo() +{ + +} + +void MainForm::editCut() +{ + +} + +void MainForm::editCopy() +{ + +} + +void MainForm::editPaste() +{ + +} + +void MainForm::editFind() +{ + +} + +void MainForm::helpIndex() +{ + +} + +void MainForm::helpContents() +{ + +} + +void MainForm::helpAbout() +{ + QMessageBox::about( this, tr("About Ananas.Designer"), + tr("

Ananas.Designer %1

is a programm
" + "for adjusting accounting automation system

" + "Copyright 2003-2006 Leader Infotech, Valery Grazdankin
" + "Copyright 2003-2006 Project Ananas, Andrey Paskal, Grigory Panov, Andrey Strelnikov
" + "License: GPL

" + "technical support:
" + "lider-infotech@narod.ru
" + "app@linux.ru.net
" + "Web sites:
" + "http://ananas.lrn.ru
" + "http://www.leaderit.ru" + "

Avalable extensions:
%2").arg(ananas_libversion()).arg( ""/*--AExtensionFactory::keys().join(", ")*/) ); +} + + +void MainForm::init() +{ + + + setName("ananas-designer_mainwindow"); + rcfile=""; + windowsMenu = new Q3PopupMenu( this ); + windowsMenu->setCheckable( TRUE ); + connect( windowsMenu, SIGNAL( aboutToShow() ), + this, SLOT( windowsMenuAboutToShow() ) ); + menuBar()->insertItem( tr("&Windows"), windowsMenu ); + + menuBar()->insertSeparator(); + Q3PopupMenu * help = new Q3PopupMenu( this ); + menuBar()->insertItem( tr("&Help"), help ); + + help->insertItem( tr("&About"), this, SLOT(helpAbout()), Qt::Key_F1); + // help->insertItem( tr("&Test"), this, SLOT(helpTest())); + // help->insertItem( "About &Qt", this, SLOT(aboutQt())); + help->insertSeparator(); + // help->insertItem( trUtf8("Что &это"), this, SLOT(whatsThis()), SHIFT+Key_F1); + + + //--designer_settings.insertSearchPath( QSettings::Unix, QString(QDir::homeDirPath())+QString("/.ananas")); + //--designer_settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas" ); + +// QStringList lst = settings.entryList("/engine"); + QSettings designer_settings; + designer_settings.beginGroup("/designer"); + bool maximize = designer_settings.readBoolEntry( "/maximize", 0 ); + int width = designer_settings.readNumEntry( "/geometry/width", 600 ); + int height = designer_settings.readNumEntry( "/geometry/height", 480 ); + int offset_x = designer_settings.readNumEntry( "/geometry/x", 0 ); + int offset_y = designer_settings.readNumEntry( "/geometry/y", 0 ); + designer_settings.endGroup(); + resize( QSize(width, height) );// .expandedTo(minimumSizeHint()) ); + move(offset_x,offset_y); + if(maximize) + { +// setWindowState(windowState() ^ WindowMaximized); + } + + setIcon( rcIcon("a-system.png")); + setCaption(tr("Ananas: Designer")); + Q3VBox* vb = new Q3VBox( this ); + vb->setFrameStyle( Q3Frame::StyledPanel | Q3Frame::Sunken ); + ws = new QWorkspace( vb ); + wl = new aWindowsList(); + ws->setScrollBarsEnabled( TRUE ); + setCentralWidget( vb ); + cfgform=NULL; + + MessagesWindow *msgWindow = new MessagesWindow( this ); // , WDestructiveClose ); + moveDockWindow( msgWindow, Qt::DockBottom ); + setMessageHandler( TRUE ); + msgWindow->hide(); + tbMetadata->setShown( FALSE ); + tbActions->setShown( FALSE ); + tbInterface->setShown( FALSE ); + tbRights->setShown( FALSE ); + tbLanguages->setShown( FALSE ); + tbImageCollection->setShown( FALSE ); + TBToolbar->setShown( FALSE ); + tbTabs->setShown( FALSE ); + lastTabId = 0; + configSaveAction->setVisible( FALSE ); +} + +void MainForm::configNew() +{ + CfgForm *cf = cfgForm(); + if (cf) + { + if ( !cf->close() ) return; // close configuration form if opened + } + cf = new CfgForm(ws, 0, Qt::WDestructiveClose); // create new cfgform + if ( cf ) + { + cf->init( rcfile, TRUE ); // initialization NEW configuration + connectSignals( cf ); + cf->ws=ws; + cf->show(); + ((QWidget*)cf->parent())->move(0,0); + //--addTab(++lastTabId,cf->name()); + addTab(cf); + } +} + +void MainForm::configOpen() +{ + CfgForm *cf = cfgForm(); + if ( cf ) + { + if ( !cf->close() ) return; + } + if ( rcfile.isEmpty()) return; + cf = new CfgForm( ws, 0, Qt::WDestructiveClose); + if ( cf ) + { + cf->init( rcfile, FALSE ); // initialization configuration + connectSignals( cf ); + cf->ws=ws; + cf->show(); + ((QWidget*)cf->parent())->move(0,0); + //--addTab(++lastTabId,cf->name()); + addTab(cf); + } +} + +void MainForm::configSave() +{ + emit tosave(); + CfgForm *cf = cfgForm(); + if ( cf ) cf->save(); // get configuration form and save its data +} + +void MainForm::configSaveAs() +{ +} + + + +void MainForm::fileOpen() +{ + +} + +void MainForm::fileSave() +{ + +} + +void MainForm::fileSaveAs() +{ + +} + +void MainForm::fileNew() +{ + +} + +void MainForm::windowsMenuActivated( int id ) +{ + QWidget* w = ws->windowList().at( id ); + if ( w ) w->showNormal(); + w->setFocus(); +} + + +void MainForm::windowsMenuAboutToShow() +{ + windowsMenu->clear(); + int cascadeId = windowsMenu->insertItem(tr("&Cascade"), ws, SLOT(cascade() ) ); + int tileId = windowsMenu->insertItem(tr("&Tile"), ws, SLOT(tile() ) ); + int horTileId = windowsMenu->insertItem(tr("Tile &horizontal"), this, SLOT(tileHorizontal() ) ); + if ( ws->windowList().isEmpty() ) { + windowsMenu->setItemEnabled( cascadeId, FALSE ); + windowsMenu->setItemEnabled( tileId, FALSE ); + windowsMenu->setItemEnabled( horTileId, FALSE ); + } + windowsMenu->insertSeparator(); + QWidgetList windows = ws->windowList(); + for ( int i = 0; i < int( windows.count() ); ++i ) { + int id = windowsMenu->insertItem(windows.at(i)->caption(), this, SLOT( windowsMenuActivated( int ) ) ); + windowsMenu->setItemParameter( id, i ); + windowsMenu->setItemChecked( id, ws->activeWindow() == windows.at(i) ); + } +} + +void MainForm::tileHorizontal() +{ + // primitive horizontal tiling + QWidgetList windows = ws->windowList(); + if ( !windows.count() ) + return; + + int heightForEach = ws->height() / windows.count(); + int y = 0; + for ( int i = 0; i < int(windows.count()); ++i ) { + QWidget *window = windows.at(i); + if ( window->windowState() == Qt::WindowMaximized ) { + // prevent flicker + window->hide(); + window->showNormal(); + } + int preferredHeight = window->minimumHeight()+window->parentWidget()->baseSize().height(); + int actHeight = QMAX(heightForEach, preferredHeight); + + window->parentWidget()->setGeometry( 0, y, ws->width(), actHeight ); + y += actHeight; + } +} + + +void MainForm::closeEvent( QCloseEvent *e ) +{ + if (configform) + { + if (!configform->close()) + { + e->ignore(); + return; + } + } + + QSettings designer_settings; + designer_settings.beginGroup("/designer"); +// designer_settings.writeEntry( "/maximize", windowState()&WindowMaximized ? true: false); + designer_settings.writeEntry( "/geometry/width", width() ); + designer_settings.writeEntry( "/geometry/height", height() ); + designer_settings.writeEntry( "/geometry/x", pos().x() ); + designer_settings.writeEntry( "/geometry/y", pos().y() ); + designer_settings.endGroup(); + //aLog::print(aLog::Debug,"exit"); + Q3MainWindow::closeEvent( e ); +} + + +void MainForm::connectSignals( CfgForm *cf ) +{ + connect(objNewFormAction, SIGNAL(activated()), cf, SLOT(newForm())); + connect(objNewTableAction, SIGNAL(activated()), cf, SLOT(newTable())); + connect(objNewFieldAction, SIGNAL(activated()), cf, SLOT(newField())); + connect(objRenameAction, SIGNAL(activated()), cf->mdtree, SLOT(itemRename())); + connect(objNewObjAction, SIGNAL(activated()), cf->mdtree, SLOT(itemNew())); + connect(objEditAction, SIGNAL(activated()), cf->mdtree, SLOT(itemEdit())); + connect(objDeleteAction, SIGNAL(activated()), cf->mdtree, SLOT(itemDelete())); +} + + +void MainForm::getMd( aCfg **md ) +{ + CfgForm *cf = cfgForm(); + if ( !cf ) return; + *md = &cf->cfg; +} + +/*! +Get current configuration form +*/ +CfgForm * +MainForm::cfgForm() +{ + CfgForm *res = 0; + QWidgetList windows = ws->windowList(); + for ( int i = 0; i < int( windows.count() ); ++i ) { + if ( strcmp( windows.at(i)->className(),"CfgForm") == 0 ){ + res = ( CfgForm *) windows.at(i); + break; + } + } + return res; +} + + +QWidget * +MainForm::activeWindow() +{ + return ws->activeWindow(); +} + + +int MainForm::getId() +{ + return lastFormId; +} + + +void MainForm::addTab(int uid, const QString& winName ) +{ + QWidgetList windows = ws->windowList(); + QToolButton* bt; + + QString S = winName; + for ( int i = 0; i < int( windows.count() ); i++ ) { + if( !strcmp(windows.at(i)->name(), S.ascii())) + { + windows.at(i)->setName(QString(windows.at(i)->name()+QString("_%1").arg(uid))); + //ixmap pixmap(*windows.at(i)->icon()); + bt = new QToolButton(QIcon(), + windows.at(i)->caption(), + "", + windows.at(i), + SLOT(setFocus( )), + tbTabs, + windows.at(i)->name() ); + + bt->setUsesTextLabel ( true ); +// bt->setAutoRaise ( true ); + // aLog::print(aLog::Debug, QString("button name = %1").arg(bt->name())); + break; + + } +/* if( windows.at(i)->isShown() and !strcmp(windows.at(i)->name(),"designer_mainwindow")) + { + + bt = new QToolButton(QIconSet(), + windows.at(i)->caption(), + "", + windows.at(i), + SLOT(setFocus( )), + tbTabs, + windows.at(i)->name() ); + + bt->setUsesTextLabel ( true ); +// bt->setAutoRaise ( true ); + printf("button name = %s\n",bt->name()); + break; + } + */ + } + // } +// if(windows.count()>1) + if(tbTabs->queryList ("QToolButton").size() > 0) + { + // tbTabs->show(); + + tbTabs->setShown( true ); + } + else + { + // tbTabs->hide(); + tbTabs->setShown( false ); + } +} + + +void MainForm::removeTab(const QString &winName ) +{ +// int ind = winName.findRev("_"); +// printf("winName = %s\n",winName.ascii()); +// QString str = winName; +// str = str.remove(ind,winName.length()-ind); + QObject *button = tbTabs->child( winName ); + if(button) + { + +// printf("deletes tab\n"); + delete button; + button = NULL; + } + +} + + +void MainForm::closeChildWindows() +{ + + QWidgetList windows = ws->windowList(); + for ( int i = 0; i < int( windows.count() ); i++ ) + { + if( windows.at(i)->className() != "CfgForm") + { + windows.at(i)->close(); + } + } +} + + +void MainForm::fileNewAction_activated() +{ + +} diff --git a/src/designer/mainform.h b/src/designer/mainform.h new file mode 100644 index 0000000..aa0937b --- /dev/null +++ b/src/designer/mainform.h @@ -0,0 +1,80 @@ +#ifndef MAINFORM_H +#define MAINFORM_H + +#include "ui_mainform.h" + + +class MainForm : public Q3MainWindow, public Ui::MainForm +{ + Q_OBJECT + +public: + MainForm(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~MainForm(); + + QLabel *msg; + QWorkspace *ws; + CfgForm *cfgform; + QString rcfile; + aCfg *md; + int lastFormId; + int lastTabId; + aWindowsList *wl; + //--QSettings designer_settings; + + virtual CfgForm * cfgForm(); + virtual QWidget * activeWindow(); + +public slots: + virtual void filePrint(); + virtual void fileExit(); + virtual void editUndo(); + virtual void editRedo(); + virtual void editCut(); + virtual void editCopy(); + virtual void editPaste(); + virtual void editFind(); + virtual void helpIndex(); + virtual void helpContents(); + virtual void helpAbout(); + virtual void init(); + virtual void configNew(); + virtual void configOpen(); + virtual void configSave(); + virtual void configSaveAs(); + virtual void fileOpen(); + virtual void fileSave(); + virtual void fileSaveAs(); + virtual void fileNew(); + virtual void connectSignals( CfgForm * cf ); + virtual void getMd( aCfg * * md ); + virtual int getId(); + virtual void addTab( int uid, const QString & winName ); + // -- Help for add to workspace + virtual void addTab(QWidget* window) { + ws->addWindow(window); + window->show(); + addTab(++lastTabId, window->objectName()); + }; + virtual void removeTab( const QString & winName ); + virtual void closeChildWindows(); + virtual void fileNewAction_activated(); + +signals: + void tosave(); + +protected slots: + virtual void languageChange(); + +private: + Q3PopupMenu *windowsMenu; + +private slots: + virtual void windowsMenuActivated( int id ); + virtual void windowsMenuAboutToShow(); + virtual void tileHorizontal(); + virtual void closeEvent( QCloseEvent * e ); + +}; + +#endif // MAINFORM_H diff --git a/src/designer/mainform.ui b/src/designer/mainform.ui new file mode 100644 index 0000000..bc8ef5e --- /dev/null +++ b/src/designer/mainform.ui @@ -0,0 +1,1391 @@ + + MainForm + + + + 0 + 0 + 677 + 570 + + + + + 0 + 0 + + + + + + + Ananas: Designer + + + + + 0 + 54 + 677 + 516 + + + + + + + 0 + 0 + 105 + 30 + + + + + + + + + + + + + 105 + 0 + 135 + 30 + + + + + + + + + + + + + + 240 + 0 + 75 + 30 + + + + + + + + + + + + 315 + 0 + 105 + 30 + + + + + + + + + + + + + 420 + 0 + 105 + 30 + + + + + + + + + + + + + 525 + 0 + 105 + 30 + + + + + + + + + + + + + 630 + 0 + 45 + 30 + + + + + + + + + + + 0 + 30 + 135 + 30 + + + + + + + + + + + + + + 0 + 60 + 19 + 16 + + + + true + + + true + + + Tabs + + + + + true + + + + 0 + 0 + 677 + 21 + + + + false + + + + &File + + + + + + + + + + + + &Edit + + + + + + + + + + + + + Configuration + + + + + + + + + Object + + + + + + + + + + + + + + + + + + + + + &New + + + &New + + + Ctrl+N + + + fileNewAction + + + + + + + + &Open... + + + &Open... + + + Ctrl+O + + + fileOpenAction + + + + + + + + &Save + + + &Save + + + actFileSave + + + Ctrl+S + + + fileSaveAction + + + + + Save &as... + + + Save &as... + + + + + + fileSaveAsAction + + + + + false + + + + + + &Print + + + &Print + + + Ctrl+P + + + filePrintAction + + + + + E&xit + + + E&xit + + + + + + fileExitAction + + + + + false + + + + + + Undo + + + Undo + + + Ctrl+Z + + + editUndoAction + + + + + false + + + + + + Redo + + + Redo + + + Ctrl+Y + + + editRedoAction + + + + + false + + + + + + Cut + + + Cut + + + Вырезать + + + Ctrl+X + + + editCutAction + + + + + false + + + + + + Copy + + + Copy + + + Копировать + + + Ctrl+C + + + editCopyAction + + + + + false + + + + + + Paste + + + Paste + + + Вставить + + + Ctrl+V + + + editPasteAction + + + + + false + + + + + + Find + + + Find + + + Ctrl+F + + + editFindAction + + + + + &Содержание... + + + Содержание + + + + + + helpContentsAction + + + + + &Индекс... + + + Индекс + + + + + + helpIndexAction + + + + + &О программе + + + О программе + + + + + + helpAboutAction + + + + + new item + + + new item + + + new_itemAction + + + + + new item + + + new item + + + new_itemAction_2 + + + + + Image Collection + + + Image Collection + + + configurationnew_itemAction + + + + + + :/images/filenew.png + + + New + + + New + + + Create new configuration + + + configNewAction + + + + + false + + + :/images/hi22-action-project_open.png + + + &Open + + + &Open + + + Open configuration + + + Open configuration + + + configOpenAction + + + + + :/images/filesave.png + + + Save + + + Save + + + Save configuration + + + Ctrl+S + + + configSaveAction + + + + + Создать/обновить БД + + + Создать/обновить БД + + + config_DBCreateAction + + + + configGroup + + + + + + Новая кнопка + + + Новая кнопка + + + NewButtonAction + + + + + Новый атрибут + + + Новый атрибут + + + NewAttributeAction + + + + + Новое поле + + + Новое поле + + + NewFieldAction + + + + formGroup + + + + + + :/images/form.png + + + New form + + + New form + + + objNewFormAction + + + + + Delete + + + Delete + + + objDeleteAction + + + + + :/images/field.png + + + New field + + + New field + + + objNewFieldAction + + + + + :/images/editrename.png + + + Rename + + + Rename + + + objRenameAction + + + + + Edit + + + Edit + + + objEditAction + + + + + :/images/table.png + + + New table + + + New table + + + objNewTableAction + + + + + :/images/object.png + + + New in group + + + New in group + + + objNewObjAction + + + + + :/images/editdelete.png + + + Delete + + + Delete + + + objTBDeleteAction + + + + + :/images/doc.png + + + New + + + New + + + objMetadataNewAction + + + + + :/images/editrename.png + + + Rename + + + Rename + + + objTBRenameAction + + + + + :/images/arrow_up.png + + + Move Up + + + Move Up + + + objTBMoveUpAction + + + + + :/images/arrow_down.png + + + Move Down + + + Move Down + + + objTBMoveDownAction + + + + + :/images/editedit.png + + + Edit + + + Edit + + + objMetadataEditAction + + + + + :/images/function.png + + + New Group + + + New Group + + + objActionsNewGroupAction + + + + + :/images/filenew.png + + + New + + + New + + + objActionsNewAction + + + + + :/images/editedit.png + + + Action + + + Action + + + objActionsEditAction + + + + + :/images/report_g.png + + + New Submenu + + + New Submenu + + + objInterfaceNewSubmenuAction + + + + + :/images/report.png + + + New Command + + + New Command + + + objInterfaceNewCommandAction + + + + + :/images/editsep.png + + + New Separator + + + New Separator + + + objInterfaceNewSeparatorAction + + + + + :/images/editedit.png + + + Edit + + + Edit + + + objInterfaceEditAction + + + + + :/images/editrename.png + + + Rename + + + Rename + + + objInterfaceRenameAction + + + + + :/images/filenew.png + + + New + + + New + + + objLanguagesNewAction + + + + + :/images/editedit.png + + + Edit + + + Edit + + + objLanguagesEditAction + + + + + :/images/editcut.png + + + Clear dead aliases + + + Clear dead aliases + + + objLanguagesClearAction + + + + + :/images/filenew.png + + + Add + + + Add + + + objImageCollectionAddAction + + + + + :/images/doc.png + + + Add new role + + + Add new role + + + objRoleNewAction + + + + + :/images/editcut.png + + + Clear dead roles + + + Clear dead roles + + + objRoleClearAction + + + + + :/images/editedit.png + + + Edit role + + + Edit role + + + objRoleEditAction + + + + objectGroup + + + + + qPixmapFromMimeSource + + + Q3ToolBar + Q3Frame +
q3listview.h
+
+ + Q3MainWindow + QWidget +
q3mainwindow.h
+ 1 +
+
+ + qworkspace.h + q3vbox.h + cfgform.h + q3popupmenu.h + awindowslist.h + qsettings.h + + + + + + + fileSaveAsAction + activated() + MainForm + fileSaveAs() + + + -1 + -1 + + + 20 + 20 + + + + + filePrintAction + activated() + MainForm + filePrint() + + + -1 + -1 + + + 20 + 20 + + + + + fileExitAction + activated() + MainForm + close() + + + -1 + -1 + + + 20 + 20 + + + + + editUndoAction + activated() + MainForm + editUndo() + + + -1 + -1 + + + 20 + 20 + + + + + editRedoAction + activated() + MainForm + editRedo() + + + -1 + -1 + + + 20 + 20 + + + + + editCutAction + activated() + MainForm + editCut() + + + -1 + -1 + + + 20 + 20 + + + + + editCopyAction + activated() + MainForm + editCopy() + + + -1 + -1 + + + 20 + 20 + + + + + editPasteAction + activated() + MainForm + editPaste() + + + -1 + -1 + + + 20 + 20 + + + + + editFindAction + activated() + MainForm + editFind() + + + -1 + -1 + + + 20 + 20 + + + + + helpIndexAction + activated() + MainForm + helpIndex() + + + -1 + -1 + + + 20 + 20 + + + + + helpContentsAction + activated() + MainForm + helpContents() + + + -1 + -1 + + + 20 + 20 + + + + + helpAboutAction + activated() + MainForm + helpAbout() + + + -1 + -1 + + + 20 + 20 + + + + + configNewAction + activated() + MainForm + configNew() + + + -1 + -1 + + + 20 + 20 + + + + + configOpenAction + activated() + MainForm + configOpen() + + + -1 + -1 + + + 20 + 20 + + + + + configSaveAction + activated() + MainForm + configSave() + + + -1 + -1 + + + 20 + 20 + + + + + objTBDeleteAction + activated() + MainForm + fileOpen() + + + -1 + -1 + + + 20 + 20 + + + + + fileNewAction + activated() + MainForm + configNew() + + + -1 + -1 + + + 20 + 20 + + + + + fileOpenAction + activated() + MainForm + configOpen() + + + -1 + -1 + + + 20 + 20 + + + + + fileSaveAction + activated() + MainForm + configSave() + + + -1 + -1 + + + 20 + 20 + + + + +
diff --git a/src/designer/mdtree.cpp b/src/designer/mdtree.cpp new file mode 100644 index 0000000..3650a1d --- /dev/null +++ b/src/designer/mdtree.cpp @@ -0,0 +1,1190 @@ +/**************************************************************************** +** $Id: mdtree.cpp,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Code file of the Metadata Tree of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "adatabase.h" +#include "mainform.h" +#include "deditfield.h" +#include "deditcfg.h" +#include "deditdoc.h" +#include "deditreport.h" +#include "deditdialog.h" +#include "deditcat.h" +#include "deditireg.h" +#include "deditareg.h" +#include "deditjournal.h" +#include "deditwebform.h" +#include "deditcolumns.h" +#include "awindowslist.h" + +//#include "acfg.h" +#include "acfgrc.h" + +#include "mdtree.h" + +extern MainForm *mainform; +extern QPixmap rcIcon(const char *name); +//extern void set_Icon(QListViewItem *item, const char *name); + + + +aListViewItem::aListViewItem(ananasListViewItem *parent, ananasListViewItem *after, aCfg *cfgmd, aCfgItem cfgobj, const QString &name ) +: ananasListViewItem( parent, after, cfgmd, cfgobj, name ) +{ + loadTree(); +} + + + +aListViewItem::aListViewItem(Q3ListView *parent, aCfg *cfgmd, aCfgItem cfgobj, const QString &name ) +: ananasListViewItem( parent, cfgmd, cfgobj, name ) +{ + loadTree(); +} + + +aListViewItem::~aListViewItem() +{ + +} + + +QString +aListViewItem::text( int column ) const +{ + return Q3ListViewItem::text( column ); +// if ( obj.isNull() ) return QObject::tr("Unknown object context"); + if ( !id ) return Q3ListViewItem::text( column ); + switch ( column ) { + case 0: return md->attr( obj, mda_name ); + default: + return ""; + } +} + +int +aListViewItem::compare( Q3ListViewItem *i, int col, bool accending ) const +{ + int id1 = 0, id2 = 0; + aListViewItem *ai = (aListViewItem *) i; + id1 = md->order( obj ); + id2 = ai->md->order( ai->obj ); + if ( md == ai->md && md->parent( obj ) == ai->md->parent( ai->obj ) && col ==0 && accending ) { + if ( id1 < id2 ) return -1; + if ( id1 == id2 ) return 0; + return 1; + } + return 1; +} + + +void +aListViewItem::setup() +{ + Q3ListViewItem::setup(); +} + + +/*! +Update metadata tree for the object context. +*/ +void +aListViewItem::update() +{ + +} + + +void +aListViewItem::loadTree() +{ + aListViewItem *item, *nextitem; + QString oclass, ldclass=""; + int i, n; + aCfgItem cobj; + + // clear tree + item = (aListViewItem *) firstChild(); + while( item ) { + nextitem = (aListViewItem *) item->nextSibling(); + delete item; + item = nextitem; + } + if ( !md ) return; + if (id) setRenameEnabled(0, true); + oclass = md->objClass( obj ); + if ( oclass == md_metadata ){ + cobj = md->find ( mdc_metadata ); + setPixmap(0, rcIcon("project.png")); + setOpen(true); + cobj = md->find ( obj, md_catalogues, 0 ); + if ( cobj.isNull() ) + { + cobj = md->insert( obj, md_catalogues, QString::null, -1 ); + } + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Catalogues") ); + cobj = md->find ( obj, md_documents, 0 ); + if ( cobj.isNull() ) + { + cobj = md->insert( obj, md_documents, QString::null, -1 ); + } + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Documents") ); + cobj = md->find ( obj, md_reports, 0 ); + if ( cobj.isNull() ) + { + cobj = md->insert( obj, md_reports, QString::null, -1 ); + } + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Reports") ); + cobj = md->find ( obj, md_journals, 0 ); + if ( cobj.isNull() ) + { + cobj = md->insert( obj, md_journals, QString::null, -1 ); + } + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Journals") ); + cobj = md->find ( obj, md_registers, 0 ); + if ( cobj.isNull() ) + { + cobj = md->insert( obj, md_registers, QString::null, -1 ); + } + cobj = md->find ( obj, md_iregisters, 0 ); + if ( cobj.isNull() ) + { + cobj = md->insert( md->find (obj, md_registers, 0 ), md_iregisters, QString::null, -1 ); + } + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Information registers") ); + cobj = md->find ( obj, md_aregisters, 0 ); + if ( cobj.isNull() ) + { + cobj = md->insert( md->find (obj, md_registers, 0 ), md_aregisters, QString::null, -1 ); + } + new aListViewItem( this, getLastChild(), md, cobj, QObject::tr("Accumulation registers") ); + } + if ( oclass == md_catalogues ){ + setPixmap(0, rcIcon("cat_g.png") ); + ldclass = md_catalogue; + } + if ( oclass == md_documents ){ + setPixmap(0, rcIcon("doc_g.png")); + ldclass = md_document; + } + if ( oclass == md_reports ){ + setPixmap(0, rcIcon("report_g.png")); + ldclass = md_report; + } + if ( oclass == md_journals ){ + setPixmap(0, rcIcon("journ_g.png")); + ldclass = md_journal; + } + if ( oclass == md_iregisters ){ + setPixmap(0, rcIcon("reg_g.png")); + ldclass = md_iregister; + } + if ( oclass == md_aregisters ){ + setPixmap(0, rcIcon("regs_g.png")); + ldclass = md_aregister; + } + if ( !ldclass.isEmpty() ) { +// printf("%s\n",(const char *) md->toString().local8Bit() ); + n = md->count( obj, ldclass ); +// printf(" objclass=%s ldclass = %s count = %d\n", (const char *) oclass, (const char *) ldclass, n); + for ( i = 0; ifind( obj, ldclass, i ); + if ( !cobj.isNull() ) { +// printf("%d ok\n", i); +// new aListViewItem( this, md, md->find( obj, ldclass, i ), QString::null ); + new aListViewItem( this, getLastChild(), md, cobj, QString::null ); + } + } + } + + if ( oclass == md_tables ){ + setPixmap(0, rcIcon("table_g.png")); + return; + } + if ( oclass == md_forms ){ + setPixmap(0, rcIcon("form_g.png")); + return; + } + if ( oclass == md_form ){ + setPixmap(0, rcIcon("form.png")); + return; + } + if ( oclass == md_webforms ){ + setPixmap(0, rcIcon("webform_g.png")); + return; + } + if ( oclass == md_webform ){ + setPixmap(0, rcIcon("webform.png")); + return; + } + if ( oclass == md_table ) + { + setPixmap(0, rcIcon("table.png")); + return; + } + +// elements + if ( oclass == md_catalogue ){ + setPixmap(0, rcIcon("cat.png")); + loadCatalogue (); + return; + } + if ( oclass == md_document ){ + setPixmap(0, rcIcon("doc.png")); + loadDocument (); + return; + } + if ( oclass == md_aregister ){ + setPixmap(0, rcIcon("regs.png")); + loadARegister (); + return; + } + if ( oclass == md_iregister ){ + setPixmap(0, rcIcon("reg.png")); + loadIRegister (); + return; + } + if ( oclass == md_journal ){ + setPixmap(0, rcIcon("journ.png")); + loadJournal (); + return; + } + if ( oclass == md_report ){ + setPixmap(0, rcIcon("report.png")); + loadReport (); + return; + } + if ( oclass == md_field ){ + setPixmap(0, rcIcon("field.png")); + return; + } + if ( oclass == md_header ) + { + setPixmap(0, rcIcon("doc_h.png")); + return; + } + if ( oclass == md_element) + { + setPixmap(0, rcIcon("element.png")); + return; + } + if( oclass == md_columns ) + { + setPixmap(0, rcIcon("columns.png")); + return; + } + if ( oclass == md_resources ) + { + setPixmap(0, rcIcon("resourses.png")); + return; + } + if ( oclass == md_dimensions ) + { + setPixmap(0, rcIcon("dimensions.png")); + return; + } + if ( oclass == md_information ) + { + setPixmap(0, rcIcon("information.png")); + return; + } + if (oclass == md_group) + { + setPixmap(0, rcIcon("group.png")); + return; + } +} + +void +aListViewItem::loadDocument () +{ + int n, i; + aCfgItem cobj; + aListViewItem *tparent, *fparent; + + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_header, 0), QObject::tr("Header") ); + loadFields ( fparent ); + + tparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_tables, 0), QObject::tr("Tables") ); + n = md->count ( obj, md_table ); + for ( i = 0; i < n; i++ ) + { + cobj = md->find( obj, md_table, i ); + if ( !cobj.isNull() ) + { + fparent = new aListViewItem( tparent, tparent->getLastChild(), md, cobj, QString::null ); + loadFields ( fparent ); + } + } + loadForms ( this ); + loadWebForms ( this ); +} + +/*void +aListViewItem::loadTable () +{ + int n, i; + QString ldclass; + aCfgItem cobj; + +}*/ + +void +aListViewItem::loadFields (aListViewItem *parent) +{ + int n, i; + aCfgItem cobj; + + n = md->count ( parent->obj, md_field ); + for ( i = 0; i < n; i++ ) + { + cobj = md->find( parent->obj, md_field, i ); + if ( !cobj.isNull() ) + { + new aListViewItem( parent, parent->getLastChild(), md, cobj, QString::null ); + } + } +} + +void +aListViewItem::loadForms (aListViewItem *parent) +{ + int n, i; + aCfgItem cobj, gobj; + aListViewItem *fparent; + + gobj = md->find(obj, md_forms, 0); + if ( gobj.isNull() ) gobj = md->insert( obj, md_forms, QString::null, -1 ); + fparent = new aListViewItem( parent, getLastChild(), md, gobj, QObject::tr("Forms") ); + n = md->count ( fparent->obj, md_form ); + for ( i = 0; i < n; i++ ) + { + cobj = md->find( fparent->obj, md_form, i ); + if ( !cobj.isNull() ) + { + new aListViewItem( fparent, getLastChild(), md, cobj, QString::null ); + } + } +} + +void +aListViewItem::loadWebForms (aListViewItem *parent) +{ + int n, i; + aCfgItem cobj, gobj; + aListViewItem *fparent; + + gobj = md->find(obj, md_webforms, 0); + if ( gobj.isNull() ) gobj = md->insert( obj, md_webforms, QString::null, -1 ); + fparent = new aListViewItem( parent, getLastChild(), md, md->find(obj, md_webforms, 0), QObject::tr("Web forms") ); + n = md->count ( fparent->obj, md_webform ); + for ( i = 0; i < n; i++ ) + { + cobj = md->find( fparent->obj, md_webform, i ); + if ( !cobj.isNull() ) + { + new aListViewItem( fparent, getLastChild(), md, cobj, QString::null ); + } + } +} + +void +aListViewItem::loadJournal () +{ + aListViewItem *fparent; + + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_columns, 0), QObject::tr("Columns") ); + loadColumns( fparent ); + loadForms ( this ); + loadWebForms ( this ); +} + +void +aListViewItem::loadIRegister () +{ + aListViewItem *fparent; + + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_resources, 0), QObject::tr("Resources") ); + loadFields ( fparent ); + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_dimensions, 0), QObject::tr("Dimensions") ); + loadFields ( fparent ); + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_information, 0), QObject::tr("Information") ); + loadFields ( fparent ); +} + +void +aListViewItem::loadARegister () +{ + aListViewItem *fparent; + + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_resources, 0), QObject::tr("Resources") ); + loadFields ( fparent ); + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_dimensions, 0), QObject::tr("Dimensions") ); + loadFields ( fparent ); + fparent = new aListViewItem( this, getLastChild(), md, md->find(obj, md_information, 0), QObject::tr("Information") ); + loadFields ( fparent ); +} + +void +aListViewItem::loadCatalogue () +{ + aListViewItem *fparent; + aCfgItem i; + + i = md->find(obj, md_element, 0); + if ( i.isNull() ) i = md->insert( obj, md_element, QString::null, -1 ); + fparent = new aListViewItem( this, getLastChild(), md, i, QObject::tr("Element") ); + loadFields ( fparent ); + i = md->find(obj, md_group, 0); + if ( i.isNull() ) i = md->insert( obj, md_group, QString::null, -1 ); + fparent = new aListViewItem( this, getLastChild(), md, i, QObject::tr("Group") ); + loadFields ( fparent ); + loadForms ( this ); + loadWebForms ( this ); +} + +void aListViewItem::loadReport () +{ + loadForms ( this ); + loadWebForms ( this ); +} + +void +aListViewItem::loadColumns ( aListViewItem *parent ) +{ + int i,n; + aCfgItem cobj; + + n = md->count ( parent->obj, md_column ); + for ( i = 0; i < n; i++) + { + cobj = md->find( parent->obj, md_column, i ); + if ( !cobj.isNull() ) + { + new aListViewItem( parent, getLastChild(), md, cobj, QString::null ); + } + } +} + + +/* +*edit selected object +*/ + +void +aListViewItem::edit() +{ + QWorkspace *ws = mainform->ws; + aWindowsList *wl = mainform->wl; + QString oclass = md->objClass( obj ); + int objid = md->id( obj ); + if ( wl->find( objid ) ) { + wl->get( objid )->setFocus(); + return; + } + + if ( oclass == md_metadata ) + { + dEditCfg *e = new dEditCfg( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + // mainform->addTab(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + } +// if ( !md || !id ) return; + if ( oclass == md_document) + { + dEditDoc *e = new dEditDoc( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_iregister) + { + dEditIReg *e = new dEditIReg( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_aregister) + { + dEditAReg *e = new dEditAReg( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_catalogue) + { + dEditCat *e = new dEditCat( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + // mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_field ) + { + dEditField *e = new dEditField( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_report ) + { + dEditReport *e = new dEditReport( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_journal ) + { + dEditJournal *e = new dEditJournal( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId, e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_form ) + { + dEditDialog *e = new dEditDialog( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + e->setData( this ); + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_webform ) + { + dEditWebForm *e = new dEditWebForm( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + }; + if ( oclass == md_column ) + { + dEditColumns *e = new dEditColumns( ws, 0, Qt::WDestructiveClose ); + wl->insert( objid, e ); + editor = e; + QObject::connect( mainform, SIGNAL( tosave() ), editor, SLOT( updateMD() ) ); + e->setData( this ); + e->show(); + //mainform->updateTabs(); + //--mainform->addTab(++mainform->lastTabId,e->name()); + mainform->addTab(e); + e->parentWidget()->setGeometry(0,0,e->parentWidget()->frameSize().width(), + e->parentWidget()->frameSize().height()); + return; + } +} + +void aListViewItem::newObject() +{ + QString oclass = md->objClass( obj ); +// printf("oclass = %s\n",( const char *) oclass ); + if ( oclass == md_header || oclass == md_table || + oclass == md_element || oclass == md_group || + oclass == md_resources || oclass == md_dimensions || oclass == md_information || + oclass == md_columns ) + newField(); + if ( oclass == md_documents ) newDocument(); + if ( oclass == md_catalogues ) newCatalogue(); + if ( oclass == md_journals ) newJournal(); + if ( oclass == md_iregisters ) newIRegister(); + if ( oclass == md_aregisters ) newARegister(); + if ( oclass == md_reports ) newReport(); + if ( oclass == md_forms ) newForm(); + if ( oclass == md_webforms ) newWebForm(); + if ( oclass == md_tables ) newTable(); + if ( oclass == md_columns ) newColumn(); +} + +void aListViewItem::saveItem() +{ + + //md->saveOneObject() + QString oclass = md->objClass( obj ); + if ( oclass == md_field || + oclass == md_document || + oclass == md_catalogue || + oclass == md_journal || + oclass == md_iregister || + oclass == md_aregister || + oclass == md_report || + oclass == md_webform || + oclass == md_form || + oclass == md_table) + { + + QString fname; + Q3FileDialog fd( QString::null, + QObject::tr("any files (*)"), + 0, 0, TRUE ); + fd.setMode(Q3FileDialog::AnyFile); +// fd.addFilter(tr(" (*.bsa)")); + fd.setSelection( oclass + md->attr(obj,mda_id) ); + if ( fd.exec() == QDialog::Accepted ) + { + fname = QDir::convertSeparators(fd.selectedFile()); + md->saveOneObject(obj,fname); + } + } +} + +void aListViewItem::loadItem() +{ + + QString oclass = md->objClass( obj ); + + if ( oclass == md_header || + oclass == md_table || + oclass == md_element || + oclass == md_group || + oclass == md_resources || + oclass == md_dimensions || + oclass == md_information || + oclass == md_columns || + oclass == md_documents || + oclass == md_catalogues || + oclass == md_journals || + oclass == md_iregisters || + oclass == md_aregisters || + oclass == md_reports || + oclass == md_forms || + oclass == md_webforms || + oclass == md_tables || + oclass == md_columns ) + { + + QString fname; + Q3FileDialog fd( QString::null, + QObject::tr("any files (*)"), + 0, 0, TRUE ); + fd.setMode(Q3FileDialog::ExistingFiles); + aCfgItem loadObj; +// fd.addFilter(tr(" (*.bsa)")); +// fd.setSelection( QDir::convertSeparators(eCfgName->text())); + if ( fd.exec() == QDialog::Accepted ) + { + fname = QDir::convertSeparators(fd.selectedFile()); + // load object from file + // aCfgItem loadObj = c.loadOneObject("catalogue_copy.xml"); + // change name + // c.setAttr(loadObj, mda_name, "CATALOGUE1 COPY!!!"); + // append to cfg + // c.importCfgItem( c.find(c.find(0), md_catalogues) , loadObj); + // + loadObj = md->loadOneObject(fname); + if(loadObj.isNull()) + { + return; + } + else + { + md->setAttr(loadObj, mda_name, QString("%1_copy").arg(md->attr(loadObj, mda_name))); + QString loclass = md->objClass(loadObj); + if ( loclass==md_field && + (oclass == md_header || oclass == md_table || + oclass == md_element || oclass == md_group || + oclass == md_resources || oclass == md_dimensions || + oclass == md_information || oclass == md_columns )) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setOpen( TRUE ); + } + if ( loclass==md_document && oclass == md_documents ) + { + //md->importCfgItem( obj, loadObj ); + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_catalogue && oclass == md_catalogues ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_journal && oclass == md_journals ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_iregister && oclass == md_iregisters ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_aregister && oclass == md_aregisters ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_report && oclass == md_reports ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_form && oclass == md_forms ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_webform && oclass == md_webforms ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + if ( loclass==md_table && oclass == md_tables ) + { + aCfgItem newobj = md->importCfgItem( obj, loadObj ); + aListViewItem *newitem = new aListViewItem( this, getLastChild(), md, newobj ); + } + } + } + } +} + + +void +aListViewItem::newField() +{ + aListViewItem *newitem; + aCfgItem newobj; + + QString oclass = md->objClass( obj ); + if (oclass == md_header || oclass == md_table || + oclass == md_element || oclass == md_group || + oclass == md_resources || oclass == md_dimensions || oclass == md_information) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_field, QObject::tr("New field") ); + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->edit(); + } +} + + +void +aListViewItem::newDocument() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_documents ) { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insertDocument( QObject::tr("New document") ); +/* md->insert( newobj, md_header, QString::null, -1 ); + md->insert( newobj, md_tables, QString::null, -1 ); + md->insert( newobj, md_forms, QString::null, -1 ); + md->insert( newobj, md_webforms, QString::null, -1 ); +*/ newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + + +void +aListViewItem::newCatalogue() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_catalogues ) { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insertCatalogue( QObject::tr("New catalogue") ); +/* md->insert( newobj, md_element, QString::null, -1 ); + md->insert( newobj, md_group, QString::null, -1 ); + md->insert( newobj, md_forms, QString::null, -1 ); + md->insert( newobj, md_webforms, QString::null, -1 );*/ + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newJournal() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_journals ) { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insertJournal( QObject::tr("New journal") ); +/* md->insert( newobj, md_columns, QString::null, -1 ); + md->insert( newobj, md_forms, QString::null, -1 ); + md->insert( newobj, md_webforms, QString::null, -1 );*/ + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newIRegister() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_iregisters ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insertIRegister( QObject::tr("New information register") ); +/* md->insert( newobj, md_resources, QString::null, -1 ); + md->insert( newobj, md_dimensions, QString::null, -1 ); + md->insert( newobj, md_information, QString::null, -1 );*/ + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newARegister() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_aregisters ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insertARegister( QObject::tr("New accumulation register") ); +/* md->insert( newobj, md_resources, QString::null, -1 ); + md->insert( newobj, md_dimensions, QString::null, -1 ); + md->insert( newobj, md_information, QString::null, -1 );*/ + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newReport() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_reports ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_report, QObject::tr("New report") ); + md->insert( newobj, md_forms, QString::null, -1 ); + md->insert( newobj, md_webforms, QString::null, -1 ); + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newForm() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_forms ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_form, QObject::tr("New form") ); + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newWebForm() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_webforms ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_webform, QObject::tr("New web form") ); + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newTable() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_tables ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_table, QObject::tr("New Table") ); + newitem = new aListViewItem( this, getLastChild(), md, newobj ); +// newitem->setSelected( TRUE ); + newitem->setOpen( TRUE ); + newitem->edit(); + } +} + +void +aListViewItem::newColumn() +{ + aListViewItem *newitem; + aCfgItem newobj; + + if ( md->objClass( obj ) == md_columns ) + { + setSelected( FALSE ); + setOpen( TRUE ); + newobj = md->insert( obj, md_column, QObject::tr("New Column") ); + newitem = new aListViewItem( this, getLastChild(), md, newobj ); + newitem->edit(); + } +} + +aMetadataTreeView::aMetadataTreeView( QWidget *parent, aCfg *cfgmd ) +:ananasTreeView( parent, cfgmd ) +{ + aListViewItem *conf; + + if ( !md ) return; + conf = new aListViewItem( this, md, md->find( mdc_metadata ), md->info( mda_name )); + conf->setOpen( TRUE ); + connect( this, SIGNAL( contextMenuRequested( Q3ListViewItem*, const QPoint&, int) ), this, SLOT(ContextMenu() ) ); + connect( this, SIGNAL( returnPressed( Q3ListViewItem* ) ), this, SLOT( itemEdit() ) ); + connect( this, SIGNAL( doubleClicked( Q3ListViewItem* ) ), this, SLOT( itemEdit() ) ); + connect( this, SIGNAL( collapsed( Q3ListViewItem* ) ), this, SLOT( on_collapsed( Q3ListViewItem* ) ) ); +} + +void +aMetadataTreeView::on_collapsed( Q3ListViewItem * item ) +{ + aListViewItem *i = (aListViewItem *) item; + if ( i ) + { + QString oclass = md->objClass( i->obj ); + if ( oclass == md_metadata ) setOpen( i, true ); + } +} + + +void +aMetadataTreeView::ContextMenu() +{ + + Q3PopupMenu *m=new Q3PopupMenu( this, "PopupMenu" ); + Q_CHECK_PTR(m); + +/* QLabel *caption = new QLabel( "" + "Context Menu", this ); + caption->setAlignment( Qt::AlignCenter ); + m->insertItem( caption ); + m->insertItem( "&New", this, SLOT( itemNew() ), CTRL+Key_N ); + m->insertItem( "&Rename", this, SLOT( itemRename() ), CTRL+Key_O); + m->insertItem( "&Edit", this, SLOT( itemEdit() ), CTRL+Key_N ); + m->insertItem( "&Delete", this, SLOT( itemDelete() ), CTRL+Key_O );*/ + + ContextMenuAdd(m); + m->insertItem( tr("&New"), this, SLOT( itemNew() ), Qt::CTRL+Qt::Key_N ); + m->exec( QCursor::pos() ); + delete m; +} + + +void +aMetadataTreeView::itemRename() +{ + renameItem(); +} + +void +aMetadataTreeView::itemNew() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + //if ( i->id == 0 ) + i->newObject(); + } +} + + +void +aMetadataTreeView::itemDelete() +{ + deleteItem(); +} + + +void +aMetadataTreeView::itemEdit() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->edit(); + } +} + +void +aMetadataTreeView::itemSave() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->saveItem(); + } +} + +void +aMetadataTreeView::itemLoad() +{ + aListViewItem *i = (aListViewItem *) selectedItem(); + if ( i ) + { + i->loadItem(); + } +} +void +aMetadataTreeView::itemMoveUp() +{ + moveUpItem(); +} + +void +aMetadataTreeView::itemMoveDown() +{ + + moveDownItem(); +} diff --git a/src/designer/mdtree.h b/src/designer/mdtree.h new file mode 100644 index 0000000..a7efc9f --- /dev/null +++ b/src/designer/mdtree.h @@ -0,0 +1,115 @@ +/**************************************************************************** +** $Id: mdtree.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Header file of the Metadata Tree of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef MDTREE_H +#define MDTREE_H +#include +#include +#include "acfg.h" +#include "formdesigner.h" +#include "atreeitems.h" + +extern aFormDesigner *formdesigner; +//#include "cfg.h" +class QWidget; + +class aListViewItem : public ananasListViewItem +{ +public: +/* int id; + aCfgItem obj; + QWidget *editor; + aCfg *md; +*/ + aListViewItem(ananasListViewItem *parent, ananasListViewItem *after, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); +// aListViewItem(QListViewItem *parent, aCfg * cfgmd, aCfgItem cfgobj, const QString &name = QString::null ); + aListViewItem(Q3ListView *parent, aCfg * cfgmd, aCfgItem obj, const QString &name = QString::null ); + ~aListViewItem(); + QString text( int column ) const; + void loadTree(); + void setup(); + void update(); + void edit(); + void newObject(); + void newField(); + void newDocument(); + void newCatalogue(); + void newJournal(); + void newIRegister(); + void newARegister(); + void newReport(); + void newForm(); + void newWebForm(); + void newTable(); + void newColumn(); + void saveItem(); + void loadItem(); + + +protected: +// virtual void okRename( int col ); + virtual int compare( Q3ListViewItem *i, int col, bool accending ) const; +private: + void loadDocument (); + void loadJournal (); + void loadIRegister (); + void loadARegister (); + void loadCatalogue (); + void loadReport (); + void loadFields (aListViewItem *parent); + void loadForms (aListViewItem *parent); + void loadWebForms (aListViewItem *parent); + void loadColumns ( aListViewItem *parent ); +}; + + +class aMetadataTreeView : public ananasTreeView +{ + Q_OBJECT +public: +// aCfg *md; + + aMetadataTreeView( QWidget *parent, aCfg *cfgmd ); + +public slots: + void ContextMenu(); + void itemNew(); + void itemEdit(); + void itemMoveUp();//не работает, проверить поиск элементов в визуальном дереве + void itemMoveDown();//не работает, проверить поиск элементов в визуальном дереве + void itemDelete(); + void itemRename(); + void itemSave(); + void itemLoad(); +private slots: + void on_collapsed( Q3ListViewItem *item ); +private: + Q3IntDict editors; +}; + +#endif diff --git a/src/designer/pixmappreview.h b/src/designer/pixmappreview.h new file mode 100644 index 0000000..2dd995b --- /dev/null +++ b/src/designer/pixmappreview.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** $Id: pixmappreview.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Ffile of the Pixmap preview of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PIXMAPPREVIEW_H +#define PIXMAPPREVIEW_H + +#include +#include +#include +#include + +class PixmapPreview : public QLabel, public Q3FilePreview +{ + Q_OBJECT +public: + PixmapPreview( QWidget *parent=0 ) : QLabel( parent ) {} + void previewUrl( const Q3Url &u ) + { + QString path = u.path(); + QPixmap pix( path ); + if ( pix.isNull() ) setText( tr("This is not a pixmap") ); + else setPixmap( pix ); + } +}; + +#endif diff --git a/src/designer/roleeditor.cpp b/src/designer/roleeditor.cpp new file mode 100644 index 0000000..4eeb035 --- /dev/null +++ b/src/designer/roleeditor.cpp @@ -0,0 +1,135 @@ +/**************************************************************************** +** $Id: roleeditor.cpp,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Code file of the Alias editor of Ananas +** Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include "roleeditor.h" +#include "acfg.h" + + +aRoleEditor::aRoleEditor( aCfg *c, aCfgItem o, Q3Table *t, const char *p ) +{ + ac = c; + obj = o; + tRoles = t; + tRoles->setNumRows( 0 ); + tRoles->setNumCols( 1 ); + tRoles->horizontalHeader()->setLabel( 0, tr("Read") ); + parent = p; + if ( !strcmp( parent, md_document ) ) { + tRoles->setNumCols( 5 ); + tRoles->horizontalHeader()->setLabel( 1, tr("Write") ); + tRoles->horizontalHeader()->setLabel( 2, tr("Delete") ); + tRoles->horizontalHeader()->setLabel( 3, tr("Turn On") ); + tRoles->horizontalHeader()->setLabel( 4, tr("Turn Off") ); + } + if ( !strcmp( parent, md_catalogue ) ) { + tRoles->setNumCols( 3 ); + tRoles->horizontalHeader()->setLabel( 1, tr("Write") ); + tRoles->horizontalHeader()->setLabel( 2, tr("Delete") ); + } + +} + +aRoleEditor::~aRoleEditor() +{ +} + +void +aRoleEditor::setData() +{ + int i, j, n; + aCfgItem orole, roles, role; + QString rolename, right; + + roles = ac->find( ac->find( mdc_root ), md_roles, 0 ); + roleCount = ac->count( roles, md_role ); + n = ac->countChild( obj, md_role ); + tRoles->setNumRows( roleCount ); + for ( i = 0; i < roleCount; i++ ) { + role = ac->findChild( roles, md_role, i ); + rolename = ac->attr( role, mda_name ); + tRoles->verticalHeader()->setLabel( i, rolename ); + Q3CheckTableItem *r = new Q3CheckTableItem( tRoles, QString::null ); + tRoles->setItem( i, 0, r ); + Q3CheckTableItem *w = new Q3CheckTableItem( tRoles, QString::null ); + Q3CheckTableItem *d = new Q3CheckTableItem( tRoles, QString::null ); + Q3CheckTableItem *on = new Q3CheckTableItem( tRoles, QString::null ); + Q3CheckTableItem *off = new Q3CheckTableItem( tRoles, QString::null ); + if ( !strcmp( parent, md_catalogue ) ) { + tRoles->setItem( i, 1, w ); + tRoles->setItem( i, 2, d ); + } + if ( !strcmp( parent, md_document ) ) { + tRoles->setItem( i, 1, w ); + tRoles->setItem( i, 2, d ); + tRoles->setItem( i, 3, on ); + tRoles->setItem( i, 4, off ); + } + for ( j = 0; j < n; j++) { + orole = ac->findChild( obj, md_role, j ); + if ( rolename == ac->attr( orole, mda_name ) ) { + right = ac->attr( orole, mda_rights ); + if ( right.find( "-r" ) > -1 ) r->setChecked( TRUE ); + if ( right.find( "-w" ) > -1 ) w->setChecked( TRUE ); + if ( right.find( "-d" ) > -1 ) d->setChecked( TRUE ); + if ( right.find( "-on" ) > -1 ) on->setChecked( TRUE ); + if ( right.find( "-off" ) > -1 ) off->setChecked( TRUE ); + } + } + } +} + +void aRoleEditor::updateMD() +{ + int i; + aCfgItem role; + + do { + role = ac->findChild( obj, md_role, 0 ) ; + if ( !role.isNull() ) ac->remove( role ); + } while ( !role.isNull() ); + for ( i = 0; i < tRoles->numRows(); i++ ) { + QString right; + Q3CheckTableItem *q; + role = ac->insert( obj, md_role, tRoles->text( i, 0 ), -1 ); + ac->setAttr( role, mda_name, tRoles->verticalHeader()->label( i )); + q = (Q3CheckTableItem *)tRoles->item( i, 4 ); + if ( q ) if ( q->isChecked() ) right.insert( 0, "-off" ); + q = (Q3CheckTableItem *)tRoles->item( i, 3 ); + if ( q ) if ( q->isChecked() ) right.insert( 0, "-on" ); + q = (Q3CheckTableItem *)tRoles->item( i, 2 ); + if ( q ) if ( q->isChecked() ) right.insert( 0, "-d" ); + q = (Q3CheckTableItem *)tRoles->item( i, 1 ); + if ( q ) if ( q->isChecked() ) right.insert( 0, "-w" ); + q = (Q3CheckTableItem *)tRoles->item( i, 0 ); + if ( q ) if ( q->isChecked() ) right.insert( 0, "-r" ); + ac->setAttr( role, mda_rights, right ); + } +} + diff --git a/src/designer/roleeditor.h b/src/designer/roleeditor.h new file mode 100644 index 0000000..9a65241 --- /dev/null +++ b/src/designer/roleeditor.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** $Id: roleeditor.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Header file of the Alias editor of Ananas +** Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ROLEDITOR_H +#define ROLEDITOR_H + +#include +#include +#include "acfg.h" + +class aRoleEditor : public QObject +{ + Q_OBJECT +public: + aCfg *ac; + aCfgItem obj; + Q3Table *tRoles; + int roleCount; + + aRoleEditor( aCfg *c, aCfgItem o, Q3Table *tRoles, const char *p ); + ~aRoleEditor(); + + void setData(); + void updateMD( );//aCfgItem o ); +private: + const char *parent; +}; + +#endif diff --git a/src/designer/templates/inputform.tpl b/src/designer/templates/inputform.tpl new file mode 100644 index 0000000..df62376 --- /dev/null +++ b/src/designer/templates/inputform.tpl @@ -0,0 +1,22 @@ + + + + + AForm + + + + 0 + 0 + 500 + 381 + + + + New form + + + + + qPixmapFromMimeSource + diff --git a/src/designer/templates/inputform.ui.tpl b/src/designer/templates/inputform.ui.tpl new file mode 100644 index 0000000..1587630 --- /dev/null +++ b/src/designer/templates/inputform.ui.tpl @@ -0,0 +1,22 @@ + +AForm + + + AForm + + + + 0 + 0 + 500 + 381 + + + + New form + + + + + + diff --git a/src/designer/templates/inputformcat.tpl b/src/designer/templates/inputformcat.tpl new file mode 100644 index 0000000..be95ae7 --- /dev/null +++ b/src/designer/templates/inputformcat.tpl @@ -0,0 +1,30 @@ + + + + + Catalogue + + + 0 + + + $$$name$$$ + + + + 0 + 0 + 500 + 381 + + + + $$$caption$$$ + + + + qPixmapFromMimeSource + + wcatalogue.h + + diff --git a/src/designer/templates/inputformcat.ui.tpl b/src/designer/templates/inputformcat.ui.tpl new file mode 100644 index 0000000..7257f82 --- /dev/null +++ b/src/designer/templates/inputformcat.ui.tpl @@ -0,0 +1,31 @@ + +Catalogue + + + Catalogue + + + $$$id$$$ + + + $$$name$$$ + + + + 0 + 0 + 500 + 381 + + + + $$$caption$$$ + + + + + + + wcatalogue.h + + diff --git a/src/designer/templates/inputformdoc.tpl b/src/designer/templates/inputformdoc.tpl new file mode 100644 index 0000000..e7f19c5 --- /dev/null +++ b/src/designer/templates/inputformdoc.tpl @@ -0,0 +1,30 @@ + + + + + Document + + + 0 + + + $$$name$$$ + + + + 0 + 0 + 500 + 378 + + + + $$$caption$$$ + + + + qPixmapFromMimeSource + + wdocument.h + + diff --git a/src/designer/templates/inputformdoc.ui.tpl b/src/designer/templates/inputformdoc.ui.tpl new file mode 100644 index 0000000..ebd70ba --- /dev/null +++ b/src/designer/templates/inputformdoc.ui.tpl @@ -0,0 +1,31 @@ + +Document + + + Document + + + $$$id$$$ + + + $$$name$$$ + + + + 0 + 0 + 500 + 378 + + + + $$$caption$$$ + + + + + + + wdocument.h + + diff --git a/src/designer/templates/inputformjourn.tpl b/src/designer/templates/inputformjourn.tpl new file mode 100644 index 0000000..b0e32e4 --- /dev/null +++ b/src/designer/templates/inputformjourn.tpl @@ -0,0 +1,30 @@ + + + + + Journal + + + 0 + + + $$$name$$$ + + + + 0 + 0 + 500 + 378 + + + + $$$caption$$$ + + + + qPixmapFromMimeSource + + wjournal.h + + diff --git a/src/designer/templates/inputformjourn.ui.tpl b/src/designer/templates/inputformjourn.ui.tpl new file mode 100644 index 0000000..a7ea9a3 --- /dev/null +++ b/src/designer/templates/inputformjourn.ui.tpl @@ -0,0 +1,31 @@ + +Journal + + + Journal + + + $$$id$$$ + + + $$$name$$$ + + + + 0 + 0 + 500 + 378 + + + + $$$caption$$$ + + + + + + + wjournal.h + + diff --git a/src/designer/templates/inputformrep.tpl b/src/designer/templates/inputformrep.tpl new file mode 100644 index 0000000..8007c73 --- /dev/null +++ b/src/designer/templates/inputformrep.tpl @@ -0,0 +1,30 @@ + + + + + Report + + + 0 + + + $$$name$$$ + + + + 0 + 0 + 500 + 378 + + + + $$$caption$$$ + + + + qPixmapFromMimeSource + + wreport.h + + diff --git a/src/designer/templates/inputformrep.ui.tpl b/src/designer/templates/inputformrep.ui.tpl new file mode 100644 index 0000000..a1358b9 --- /dev/null +++ b/src/designer/templates/inputformrep.ui.tpl @@ -0,0 +1,31 @@ + +Report + + + Report + + + $$$id$$$ + + + $$$name$$$ + + + + 0 + 0 + 500 + 378 + + + + $$$caption$$$ + + + + + + + wreport.h + + diff --git a/src/extensions/README b/src/extensions/README new file mode 100644 index 0000000..34a7165 --- /dev/null +++ b/src/extensions/README @@ -0,0 +1,44 @@ +ANANAS EXTENSIONS SYSTEM +author: Valery Grazdankin, Leader InfoTech + +Ananas engine finding extentions +in 'extensions' directory +below application path directory (by default). +For Linux will be moving to /usr/share/ananas/extensions + +SHORT WAY FOR CREATE EXTENSION: + +1. Define object with AExtension parent +2. In constructor of the object call AExtension constructor + with Extension name string parameter. For example: + + AExtensionMy::AExtensionMy() : AExtension("MyExtension") + { + ... + } + This name will be used in Ananas script for 'new' + operator without parameters, for example: + + Ext = new MyExtension(); + +3. Define public slots: + it will be functions, callable from Ananas script. +4. Define Q_PROPERTY ( see demo ) + it will be object variables +5. + At end of extension implementation (*.cpp) file define and export + AnanasExtensionPlugin object for the extension, using template: + + #include + typedef AExtensionPlugin plugin_object_name; + A_EXPORT_PLUGIN( plugin_object_name ) + + For example: + + #include + typedef AExtensionPlugin AExtensionMyPlugin; + A_EXPORT_PLUGIN( AExtensionMyPlugin ) + +6. Compile plugin +7. Move it to Ananas extensions directory. +8. USE IT AND ENJOY diff --git a/src/extensions/example/aextexample.cpp b/src/extensions/example/aextexample.cpp new file mode 100644 index 0000000..cd50b73 --- /dev/null +++ b/src/extensions/example/aextexample.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** $Id: aextexample.cpp,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Extension object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Valery Grazdankin, Orenburg. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "aextexample.h" +#include "acfg.h" + +AExtExample::AExtExample() + : AExtension("AExtExample") +{ + startTimer( 5000 ); +} + + + +AExtExample::~AExtExample() +{ +} + +void +AExtExample::PrintMessage( const QString &msg ) +{ + setLastMessage( msg ); + cfg_message(0, "AExtTest MSG:%s\n", (const char *) msg); +} + +void +AExtExample::timerEvent( QTimerEvent * ) +{ + emit event("10"); +} + +#include +typedef AExtensionPlugin AExtExamplePlugin; +A_EXPORT_PLUGIN( AExtExamplePlugin ) diff --git a/src/extensions/example/aextexample.h b/src/extensions/example/aextexample.h new file mode 100644 index 0000000..752e295 --- /dev/null +++ b/src/extensions/example/aextexample.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** $Id: aextexample.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Extension object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTEXAMPLE_H +#define AEXTEXAMPLE_H + +#include "aextension.h" + +/** + * \en + * Class for work with extensions + * \_en + * \ru + * \_ru + */ +class ANANAS_EXPORT AExtExample : public AExtension +{ + Q_OBJECT + Q_PROPERTY( QString lastMessage READ getLastMessage WRITE setLastMessage ) + +public: + + AExtExample(); + ~AExtExample(); +public: + QString getLastMessage() const { return vMessage;}; + void setLastMessage( const QString &v ){ vMessage = v;}; + +public slots: + void PrintMessage( const QString &msg ); +protected: + void timerEvent( QTimerEvent * ); +private: + QString vMessage; +}; + +#endif //AEXTEXAMPLE_H diff --git a/src/extensions/example/example.pro b/src/extensions/example/example.pro new file mode 100644 index 0000000..adfeb02 --- /dev/null +++ b/src/extensions/example/example.pro @@ -0,0 +1,17 @@ +include(../../lib/lib.pri) +TARGET = aextexample +SOURCES += aextexample.cpp +HEADERS += aextexample.h +include ( ../../ananas.pri ) +shared { +win32:DEFINES+= ANANAS_DLL +} else { +win32:DEFINES += ANANAS_NO_DLL +} +TEMPLATE =lib +LIBS += -L../../../lib -lananas4 +CONFIG += plugin +INCLUDEPATH += ../../lib +LANGUAGE = C++ +DESTDIR = .. +#win32:DLLDESTDIR = .. diff --git a/src/extensions/extensions.pro b/src/extensions/extensions.pro new file mode 100644 index 0000000..bf22596 --- /dev/null +++ b/src/extensions/extensions.pro @@ -0,0 +1,6 @@ +TEMPLATE = subdirs +SUBDIRS = example +SUBDIRS += text +SUBDIRS += xml +SUBDIRS += meta +#unix:SUBDIRS += te diff --git a/src/extensions/meta/aext_meta.cpp b/src/extensions/meta/aext_meta.cpp new file mode 100644 index 0000000..625a9be --- /dev/null +++ b/src/extensions/meta/aext_meta.cpp @@ -0,0 +1,217 @@ +/**************************************************************************** +** $Id: aext_meta.cpp,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Extension object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2006 Andrey Paskal +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +//#include +#include +#include + +#include "aext_meta.h" +#include "adatabase.h" +#include + +/** + *\en + * Create object. + *\_en \ru + * Создает объект. + *\_ru + */ +AExtMeta::AExtMeta() + : AExtension("Meta") +{ +} + + +/** + *\en + * Destroy object. + *\_en \ru + * Уничтожает объект. + *\_ru + */ +AExtMeta::~AExtMeta() +{ +} + +/** + * \en + * \_en + * \ru + * \brief Возвращает имя класса бизнес объекта по идентификатору класса, присвоенному классу в метаданных. + * + * Имя класса может быть например "Справочник товаров", "Справочник счетов". + * \param id - идентификатор класса в метаданных + * \return имя класса в бизнес схеме + * + * Пример использования + * \code + * meta = new Meta(); + * sys.Message(0,"id=129, Class name = "+meta.GetClassName(129)); + * \endcode + * + * \see GetBaseClassName(...) + * \_ru + */ +QString +AExtMeta::GetClassName(const long &id) +{ + return db->cfg.attr(db->cfg.find(id),"name"); +} + + +/** + * \en + * \_en + * \ru + * \brief Возвращает имя базового класса бизнес объекта по идентификатору класса, присвоенному классу в метаданных. + * + * Имя базового класса может быть, например "catalogue", "document", "aregister", "iregister","journal", "report". + * \param id - идентификатор класса в метаданных + * \return имя базового класса в бизнес схеме + * + * Пример использования + * \code + * meta = new Meta(); + * sys.Message(0,"id=129, Base class name = "+meta.GetBaseClassName(129)); + * \endcode + * + * \see GetClassName(...) + * \_ru + */ +QString +AExtMeta::GetBaseClassName(const long &id) +{ + return db->cfg.objClass(id); +} + +/** + * \en + * \_en + * \ru + * \brief Возвращает имя базового класса бизнес объекта по уникальному идентификатору + * бизнес объекта в базе данных. + * + * Имя базового класса может быть, например "catalogue", "document", "aregister", "iregister","journal", "report". + * \param id - уникальный идентификатор бизнес обхъекта в базе данных + * \return имя базового класса в бизнес схеме + * + * Пример использования + * \code + * meta = new Meta(); + * sys.Message(0,"uid=6, base class name ="+meta.GetBaseClassNameByObjectUid(6)); + * \endcode + * \see GetClassNameByObjectUid(...) + * \_ru + */ +QString +AExtMeta::GetBaseClassNameByObjectUid(const long &id) +{ + return db->cfg.objClass(db->uidType(id)); +} + +/** + * \en + * \_en + * \ru + * \brief Возвращает имя класса бизнес объекта по уникальному идентификатору бизнес объекта в базе данных + * + * Имя класса может быть например "Справочник товаров", "Справочник счетов". + * \param id - уникальный идентификатор бизнес объекта в базе данных + * \return имя класса в бизнес схеме + * + * Пример использования + * \code + * meta = new Meta(); + * sys.Message(0,"uid=6, class name ="+meta.GetClassNameByObjectUid(6)); + * \endcode + * \see GetBaseClassNameByObjectUid(...) + * \_ru + */ +QString +AExtMeta::GetClassNameByObjectUid(const long &id) +{ + return db->cfg.attr(db->cfg.find(db->uidType(id)),"name"); +} + +/** + * \en + * \_en + * \ru + * \brief Возвращает количество бизнес объектов указанного класса в бизнес схеме. + * + * Имя класса может быть, например, "catalogue", "document". + * \param className - Имя класса + * \return количество бизнес объектов + * + * Пример использования + * \code + * meta = new Meta(); + * \endcode + * \_ru + */ +int +AExtMeta::CountByClassName(const QString &className) { + return db->cfg.count(db->cfg.find(mdc_root),className); +} + +/** + * \en + * \_en + * \ru + * \brief Возвращает список имен бизнес объектов указанного класса в бизнес схеме. + * + * Имя класса может быть, например, "catalogue", "document". + * TODO: Требуется проверить возможность передачи возвращаемого значения в Скрипт. Возможно списки и не поддерживаются. + * \param className - Имя класса + * \return Список названий + * + * Пример использования + * \code + * meta = new Meta(); + * \endcode + * \_ru + */ +QStringList +AExtMeta::ListByClassName(const QString &className) { + QStringList sList; + QDomNodeList nodeList=db->cfg.find(mdc_root).elementsByTagName(className); + int i,cnt = nodeList.count(); + for (i=0; i AExtMetaPlugin; +A_EXPORT_PLUGIN( AExtMetaPlugin ) diff --git a/src/extensions/meta/aext_meta.h b/src/extensions/meta/aext_meta.h new file mode 100644 index 0000000..187438c --- /dev/null +++ b/src/extensions/meta/aext_meta.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** $Id: aext_meta.h,v 1.1 2008/11/05 21:16:27 leader Exp $ +** +** Extension object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2006 Andrey Paskal +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXT_META_H +#define AEXT_META_H + + + +#include "aextension.h" +#include "acfg.h" + +/** + * \en + * Class for work with meta data API from Ananas Script. + * \_en + * \ru + * \brief Предоставляет доступ к интервейсу метаданных из Ананас скрипта. + * + * Пример использования функций GetBaseClassName, GetClassName, GetBaseClassNameByObjectUid, + * GetClassNameByObjectUid + * \code + * meta = new Meta(); + * sys.Message(0,"class id = 129, base class name ="+meta.GetBaseClassName(129)); + * sys.Message(0,"class id =129, class name ="+meta.GetClassName(129)); + * sys.Message(0,"uid=6, base class name ="+meta.GetBaseClassNameByObjectUid(6)); + * sys.Message(0,"uid=6, class name ="+meta.GetClassNameByObjectUid(6)); + * \endcode + * + * \_ru + */ +class ANANAS_EXPORT AExtMeta : public AExtension +{ + Q_OBJECT + +public: + + AExtMeta(); + ~AExtMeta(); +public: + +public slots: + QString GetBaseClassName(const long &ClassId); + QString GetClassName(const long &ClassId); + QString GetBaseClassNameByObjectUid(const long &ObjectUid); + QString GetClassNameByObjectUid(const long &ObjectUid); + int CountByClassName(const QString &className); + QStringList ListByClassName(const QString &className); +}; + + +#endif //AEXT_META_H diff --git a/src/extensions/meta/meta.pro b/src/extensions/meta/meta.pro new file mode 100644 index 0000000..6a84db6 --- /dev/null +++ b/src/extensions/meta/meta.pro @@ -0,0 +1,16 @@ +include(../../lib/lib.pri) +TARGET = aext_meta +SOURCES += aext_meta.cpp +HEADERS += aext_meta.h +include ( ../../ananas.pri ) +shared { +win32:DEFINES+= ANANAS_DLL +} else { +win32:DEFINES += ANANAS_NO_DLL +} +TEMPLATE =lib +LIBS += -L../../../lib -lananas4 +CONFIG += plugin +INCLUDEPATH += ../../lib +LANGUAGE = C++ +DESTDIR = .. diff --git a/src/extensions/te/README b/src/extensions/te/README new file mode 100644 index 0000000..dfc6489 --- /dev/null +++ b/src/extensions/te/README @@ -0,0 +1,55 @@ +Ananas script examples for trade equipment drivers: +TEDisplayVF2029, TEReaderBarcode + +1.global module: + +var TradeEq = 0; // global trade equipment manager +var TEDisplay = 0; // Display object +var TEReader = 0; // Reader object + +// EVENTS GLOBAL HANDLER +function on_event( src, data ) +{ + sys.Message(1,"Global module: on_event from "+src+" data="+data); +} + +function on_systemstart() +{ + TradeEq = new TradeEquipment(); + TEDisplay = TradeEq.newDriver("TEDisplayVF2029"); + if (TEDisplay) { + TEDisplay.setPortBaudRate(12); //9600 + TEDisplay.setPortNumberAndInit(2); // COM2 + } + TEReader = TradeEq.newDriver("TEReaderBarcode"); + if (TEReader) { + TEReader.PortNumber = 1; + TEReader.PortBaudRate = 9600; + TEReader.startDriver(); + } +} + +2.Document module + +// +function on_formstart(){ + TEReader.clearBuffer(); // clear unprocessed barcodescodes +} + +// DISPLAY TEXT ON ROW CHANGED. +function on_tablerow( name ){ + print("Table "+name+" row changed"); + TEDisplay.showText("ROW CHANGED","line1","scroll/left"); +} + +// EVENTS DOCUMENT HANDLER +function on_event( src, data ) +{ + sys.Message(1,"Document module: on_event from "+src+" data="+data); + if (src=="TradeEquipment") { + // NEED CHECK 'data' VALUE FOR READER EVENT FILTERS + bc = TEReader.text(); + SetValue("Barcode", bc); // SET FIELD VALUE TO BARCODE READED + TEReader.next(); + } +} diff --git a/src/extensions/te/aextte.cpp b/src/extensions/te/aextte.cpp new file mode 100644 index 0000000..fc128a6 --- /dev/null +++ b/src/extensions/te/aextte.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** $Id: aextte.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Valery Grazdankin, Orenburg. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include + +#include "aextte.h" +#include "acfg.h" +#include "teglobal.h" +#include "tebase.h" + +AExtTE::AExtTE() + : AExtension("TradeEquipment") +{ + telib = 0; + te_drivers = 0; + te_driverExists = 0; + te_createDriverObject = 0; + telib = new QLibrary("tradeequip"); + if (telib) { + telib->load(); + te_drivers = (p_te_drivers) telib->resolve( "te_drivers" ); + te_driverExists = (p_te_driverExists) telib->resolve( "te_driverExists" ); + te_createDriverObject = (p_te_createDriverObject) telib->resolve( "te_createDriverObject" ); + } +} + + + +AExtTE::~AExtTE() +{ + if (telib) delete telib; +} + + +QStringList +AExtTE::drivers( const QString &baseclass ) +{ + QStringList l; + if (te_drivers) l = te_drivers( baseclass ); + return l; +} + +bool +AExtTE::driverExists( const QString &name ) +{ + if (te_driverExists) return te_driverExists( name, QString::null ); + return false; +} + + +QObject * +AExtTE::newDriver( const QString &name ) +{ + TEBase *te = 0; + if (te_createDriverObject) { + te = te_createDriverObject( name ); + connect( te, SIGNAL( deviceEvent(int) ), this, SLOT( deviceEvent(int))); + } + return ( QObject *) te; + +} + +void +AExtTE::deviceEvent( int eventCode ) +{ + const QObject *obj = sender(); + emit event(QString(obj->name())+"::"); +} + +#include +typedef AExtensionPlugin ATEPlugin; +A_EXPORT_PLUGIN( ATEPlugin ) diff --git a/src/extensions/te/aextte.h b/src/extensions/te/aextte.h new file mode 100644 index 0000000..bd9d82c --- /dev/null +++ b/src/extensions/te/aextte.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** $Id: aextte.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTTE_H +#define AEXTTE_H + +#include "aextension.h" +class TEBase; +class QLibrary; + +typedef QStringList (*p_te_drivers)( const QString & ); +typedef bool (*p_te_driverExists)( const QString &, const QString & ); +typedef TEBase *(*p_te_createDriverObject)( const QString &className ); + +/** + * \en + * Class for work with Trade Equipment drivers + * \_en + * \ru + * \_ru + */ +class ANANAS_EXPORT AExtTE : public AExtension +{ + Q_OBJECT + +public: + + AExtTE(); + ~AExtTE(); + +public slots: + QStringList drivers( const QString &baseclass ); + bool driverExists( const QString &name ); + QObject *newDriver( const QString &name ); +protected slots: + void deviceEvent( int eventCode ); +private: + QLibrary *telib; + p_te_drivers te_drivers; + p_te_driverExists te_driverExists; + p_te_createDriverObject te_createDriverObject; +}; + +#endif //AEXTTE_H diff --git a/src/extensions/te/te.pro b/src/extensions/te/te.pro new file mode 100644 index 0000000..ffca994 --- /dev/null +++ b/src/extensions/te/te.pro @@ -0,0 +1,27 @@ +TARGET = aextte +SOURCES += aextte.cpp +HEADERS += aextte.h +include ( ../../ananas.pri ) +shared { + win32:DEFINES+= ANANAS_DLL +} else { + win32:DEFINES += ANANAS_NO_DLL +} +TEMPLATE =lib +CONFIG += plugin +INCLUDEPATH += ../../lib +LIBS += -L../../lib -lananas +LANGUAGE = C++ + +unix { + INCLUDEPATH += /usr/include/tradeequip +# LIBS += -L/usr/lib -ltradeequip +} + +win32 { + INCLUDEPATH += d:\src\tradeequip\src\lib +# LIBS += -L/src/tradeequip/lib -ltradeequip +} + +DESTDIR = .. +#win32:DLLDESTDIR = .. diff --git a/src/extensions/text/aexttext.cpp b/src/extensions/text/aexttext.cpp new file mode 100644 index 0000000..95f3cf6 --- /dev/null +++ b/src/extensions/text/aexttext.cpp @@ -0,0 +1,203 @@ +/**************************************************************************** +** $Id: aexttext.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Valery Grazdankin, Orenburg. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include "aexttext.h" +#include "acfg.h" +#include +#include + +/*! +\en + \class AExtText aexttext.h + \brief The AExtText is Ananas extension class for work with text files. +\_en \ru + \class AExtText aexttext.h + \brief Класс расширения Ананас AExtText предназначен для работы с текстовыми файлами. + + Поддерживает работу с файлами в различных кодировках, + режимах: + RO - Только чтение + WO - Только запись + RW - чтение/запись + A - добавление к концу файла. +\_ru +*/ + + +// \param cmd (in) command text. +// \return - result. + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +AExtText::AExtText() + : AExtension("Text") +{ + text = new QTextStream( &file ); + setCodec("UTF-8"); +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +AExtText::~AExtText() +{ + delete text; +} + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +int +AExtText::open( const QString &filename, const QString &mode ) +{ + QIODevice::OpenMode m = QIODevice::ReadOnly; + file.close(); + file.setName( filename ); + if ( mode == "WO" ) m = QIODevice::WriteOnly; + if ( mode == "RW" ) m = QIODevice::ReadWrite; + if ( mode == "A" ) m = QIODevice::Append; + if ( file.open( m ) ) return 0; + return 1; +} + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +void +AExtText::close() +{ + file.close(); +} + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +QString +AExtText::readLine() +{ + return text->readLine(); +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +void +AExtText::writeLine( const QString &l ) +{ + *text << l << "\n"; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtText::atEnd() +{ + return text->atEnd(); +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +QString +AExtText::getCodec() const +{ + QTextCodec *codec = text->codec(); + if ( codec ) return codec->name(); + return ""; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +void +AExtText::setCodec( const QString &codecname ) +{ + QTextCodec *codec = QTextCodec::codecForName( ( const char *) codecname ); + if ( codec ) text->setCodec( codec ); +} + + +#include +typedef AExtensionPlugin AExtTextPlugin; +A_EXPORT_PLUGIN( AExtTextPlugin ) diff --git a/src/extensions/text/aexttext.h b/src/extensions/text/aexttext.h new file mode 100644 index 0000000..e4a31d4 --- /dev/null +++ b/src/extensions/text/aexttext.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** $Id: aexttext.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTTEXT_H +#define AEXTTEXT_H + +#include "aextension.h" +#include + + +/** + * \en + * Class for work with extensions + * \_en + * \ru + * \_ru + */ +class ANANAS_EXPORT AExtText : public AExtension +{ + Q_OBJECT + Q_PROPERTY( QString codec READ getCodec WRITE setCodec ) + +public: + + AExtText(); + ~AExtText(); +public: + + QString getCodec() const ; + void setCodec( const QString &codecname ); + +public slots: + int open( const QString &filename, const QString &mode ); + void close(); + bool atEnd(); + + QString readLine(); + void writeLine( const QString &l ); + +private: + QFile file; + QTextStream *text; +}; + +#endif //AEXTTEXT_H diff --git a/src/extensions/text/text.pro b/src/extensions/text/text.pro new file mode 100644 index 0000000..6b017e3 --- /dev/null +++ b/src/extensions/text/text.pro @@ -0,0 +1,17 @@ +include(../../lib/lib.pri) +TARGET = aexttext +SOURCES += aexttext.cpp +HEADERS += aexttext.h +include ( ../../ananas.pri ) +shared { +win32:DEFINES+= ANANAS_DLL +} else { +win32:DEFINES += ANANAS_NO_DLL +} +TEMPLATE =lib +CONFIG += plugin +LIBS += -L../../../lib -lananas4 +INCLUDEPATH += ../../lib +LANGUAGE = C++ +DESTDIR = .. +#win32:DLLDESTDIR = .. diff --git a/src/extensions/xml/aextxml.cpp b/src/extensions/xml/aextxml.cpp new file mode 100644 index 0000000..24e785d --- /dev/null +++ b/src/extensions/xml/aextxml.cpp @@ -0,0 +1,425 @@ +/**************************************************************************** +** $Id: aextxml.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Valery Grazdankin, Orenburg. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include + +#include "aextxml.h" +#include "acfg.h" +/*! +\en + \class AExtXML aextxml.h + \brief The AExtXML is Ananas extension class for work with XML files. +\_en \ru + \class AExtXML aextxml.h + \brief Класс расширения Ананас AExtXML предназначен для работы с XML файлами. +\_ru +*/ + + + +/*! + *\en + * Create object. + *\_en \ru + * Создает объект. + *\_ru + */ +AExtXML::AExtXML() + : AExtension("XML") +{ +} + + + +/*! + *\en + * Destroy object. + *\_en \ru + * Уничтожает объект. + *\_ru + */ +AExtXML::~AExtXML() +{ +} + + + +/*! + *\en + * Reads XML from file. + * \param fname (in) - name of XML file. + * \return true if OK. + *\_en \ru + * Читает файл XML. + * \param fname (in) - имя файла XML. + * \return true в случае успеха. + *\_ru + */ +bool +AExtXML::read(const QString &fname) +{ + QFile file( fname ); + QByteArray buf; + QString err; + int errLine = 0, errColumn = 0; + if ( !file.open( IO_ReadOnly ) ) return RC_ERROR; + buf = file.readAll(); + file.close(); + xml.setContent( QString("") ); + if ( !xml.setContent( buf, false, &err, &errLine, &errColumn ) ) { + cfg_message( 2, + ( const char *) QObject::tr( + "Error read XML line:%d col:%s %s"), + errLine, errColumn, ( const char *) err ); + return false; + } + rootnode = xml.documentElement(); + current = rootnode; + return true; +} + + + +/*! + *\en + * Writes XML file. + * \param fname (in) - name of XML file. + * \return error code. + *\_en \ru + * Записывает файл XML. + * \param fname (in) - имя файла XML. + * \return Код ошибки. + *\_ru + */ +bool +AExtXML::write(const QString &fname) +{ + QFile file( fname ); + QByteArray buf( xml.toString(4).utf8() ); + if ( file.open( IO_WriteOnly ) ) { + QTextStream ts( &file ); + ts.setEncoding(QTextStream::UnicodeUTF8); + xml.save(ts, 4); + file.close(); + return true; + } + return false; +} + + + +/*! + *\en + * Create new XML document. + * Old document content will be destroyed. + * \param rootnodename (in) - new XML docemrnt root node name. + * \return void. + *\_en \ru + * Создает новый XML документ. + * Старое содержимое документа уничтожается. + * \param rootnodename (in) - имя корневого узла документа XML. + * \return ничего. + *\_ru + */ +void +AExtXML::createNew( const QString &rootnodename ) +{ + xml.setContent(QString("\n")); + rootnode = xml.createElement( rootnodename ); + xml.appendChild( rootnode ); + current = rootnode; +} + + + +/*! + *\en + * Check current node is root node. + * \return true if current node is root. + *\_en \ru + * Проверяет, является ли текущий узел корневым. + * \return true - если текущий узел корневой. + *\_ru + */ +bool +AExtXML::isRoot() +{ + return current == rootnode; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::parent() +{ + QDomNode pn = current.parentNode(); + if ( pn.isNull() ) return false; + current = pn.toElement(); + return true; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::newChild( const QString &childname ) +{ + QDomElement ne = xml.createElement( childname ); + if ( ne.isNull() ) return false; + current.appendChild( ne ); + current = ne; + return true; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +QString +AExtXML::nodeName() +{ + if (current.isNull()) return ""; + else return current.tagName(); +} + + + +/*! + *\en + * Sets text for current node. + * \param text (in) - new text value. + * \return void. + *\_en \ru + * Устанавливает текст текущего узла. + * \param text (in) - Значение нового текста. + * \return ничего. + *\_ru + */ +bool +AExtXML::setText( const QString &text ) +{ + QDomText t; + if (current.isNull()) return false; + while (!current.firstChild().isNull()) { + current.removeChild( current.firstChild() ); + } + t = xml.createTextNode( text ); + if ( t.isNull() ) return false; + current.appendChild( t ); + return true; +} + + + +/*! + *\en + * Returns text of current node. + * \return string. + *\_en \ru + * Возвращает текст текущего узла. + * \return Строка. + *\_ru + */ +QString +AExtXML::text() const +{ + if (current.isNull()) return ""; + return current.firstChild().nodeValue(); +} + + + +/*! + *\en + * Sets current node's attribute value. + * \param name (in) - attribute's name. + * \param value (in) - new value. + * \return void. + *\_en \ru + * Устанавливает значение атрибута текущего узла. + * \param name (in) - иям атрибута. + * \param value (in) - новое значение. + * \return ничего. + *\_ru + */ +bool +AExtXML::setAttr( const QString &name, const QString &value ) +{ + current.setAttribute( name, value ); + return true; +} + + + +/*! + *\en + * Returns current node's attribute value. + * \param name (in) - attribute name. + * \return attribute value. + *\_en \ru + * Возвращает значение атрибута текущего узла. + * \param name (in) - иям атрибута. + * \return значение атрибута. + *\_ru + */ +QString +AExtXML::attr( const QString &name ) const +{ + return current.attribute(name); +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::removeAttr( const QString &name ) +{ + current.removeAttribute( name ); + return true; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::firstChild() +{ + QDomNode n = current.firstChild(); + if ( n.isNull() ) return false; + current = n.toElement(); + return true; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::lastChild() +{ + QDomNode n = current.lastChild(); + if ( n.isNull() ) return false; + current = n.toElement(); + return true; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::next() +{ + QDomNode n = current.nextSibling(); + if ( n.isNull() ) return false; + current = n.toElement(); + return true; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::prev() +{ + QDomNode n = current.previousSibling(); + if ( n.isNull() ) return false; + current = n.toElement(); + return true; +} + + + +/*! + *\en + * + *\_en \ru + * + *\_ru + */ +bool +AExtXML::childExists() +{ + QDomNode n = current.firstChild(); + if ( n.isNull() ) return false; + return true; +} + +#include +typedef AExtensionPlugin AExtXMLPlugin; +A_EXPORT_PLUGIN( AExtXMLPlugin ) diff --git a/src/extensions/xml/aextxml.h b/src/extensions/xml/aextxml.h new file mode 100644 index 0000000..715d33b --- /dev/null +++ b/src/extensions/xml/aextxml.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** $Id: aextxml.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTXML_H +#define AEXTXML_H + +#include +#include "aextension.h" + +/** + * \en + * Class for work with extensions + * \_en + * \ru + * \_ru + */ +class ANANAS_EXPORT AExtXML : public AExtension +{ + Q_OBJECT + +public: + + AExtXML(); + ~AExtXML(); +public: + +public slots: + bool read(const QString &fname); + bool write(const QString &fname); + void createNew( const QString &rootnodename ); + + bool isRoot(); + bool parent(); + bool newChild( const QString &childname ); + QString nodeName(); + bool setText( const QString &text ); + QString text() const; + + bool setAttr( const QString &name, const QString &value ); + QString attr( const QString &name ) const; + bool removeAttr( const QString &name ); + + bool firstChild(); + bool lastChild(); + bool next(); + bool prev(); + bool childExists(); + +private: + QDomDocument xml; + QDomElement rootnode, current; + + +}; + +#endif //AEXTTEXT_H diff --git a/src/extensions/xml/xml.pro b/src/extensions/xml/xml.pro new file mode 100644 index 0000000..5048820 --- /dev/null +++ b/src/extensions/xml/xml.pro @@ -0,0 +1,23 @@ +include(../../lib/lib.pri) +TARGET = aextxml + +SOURCES += aextxml.cpp +HEADERS += aextxml.h + +include ( ../../ananas.pri ) + +shared { +win32:DEFINES+= ANANAS_DLL +} else { +win32:DEFINES += ANANAS_NO_DLL +} + +TEMPLATE =lib +CONFIG += plugin + +INCLUDEPATH += ../../lib +LIBS += -L../../../lib -lananas4 + +LANGUAGE = C++ +DESTDIR = .. +#win32:DLLDESTDIR = .. diff --git a/src/lib/acfg.cpp b/src/lib/acfg.cpp new file mode 100644 index 0000000..6346eeb --- /dev/null +++ b/src/lib/acfg.cpp @@ -0,0 +1,1818 @@ +/**************************************************************************** +** $Id: acfg.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +//--#include +#include + +#include "acfg.h" +#include "alog.h" + +#ifdef _MSC_VER +#define vsnprintf _vsnprintf +#endif + +#define context_startid 100 + +/*! + * Global configuration variable. + */ +//aCfg * ANANAS_EXPORT globalCfg = 0; + + +/* + */ +void (*cfg_messageproc)(int , const char *)=NULL; + +/*! + *\en + * Outputs error messages. + *\_en \ru + * Вывод сообщений об ошибках. + *\_ru + */ +void +cfg_message(int msgtype, const char *msgfmt,...){ + char msg[2048]; + char *ts=(char *)""; + va_list args; + + if (msgfmt) { + va_start(args, msgfmt); + vsnprintf(msg, sizeof(msg)-1, msgfmt, args); + va_end(args); + if (cfg_messageproc) cfg_messageproc(msgtype, msg); + else { + if (msgtype==1) ts=(char *)"- "; + if (msgtype==2) ts=(char *)"! "; + if (msgtype==2) ts=(char *)"!!! "; + printf("%s%s", ts, (const char *) QString::fromUtf8(msg).local8Bit()); + } + } +} + +/*! + *\en + *\_en \ru + * Выводит отладочные сообщения, если определен макрос ANANAS_DEBUG + *\_ru + */ +void +debug_message(const char *msgfmt,...){ +#ifdef ANANAS_DEBUG + char msg[2048]; + va_list args; + + if (msgfmt) { + va_start(args, msgfmt); + vsnprintf(msg, sizeof(msg)-1, msgfmt, args); + va_end(args); + printf("debug"); + printf("> %s", (const char *) QString::fromUtf8(msg).local8Bit()); + } +#endif +} + + +/*! + *\~english + * Ananas configuation object contaner constructor. + *\~russian + * Конструктор контейнера объекта конфигурации Ананас. + *\~ + * \param newid (in) - \~english container's ID.\~russian + * ID контейнера. \~ + * \param newitem (in) - \~english container's item.\~russian + * Элемент контейнера. \~ + */ +aCfgItemContaner::aCfgItemContaner(long newid, aCfgItem newitem) +{ + id = newid; + item = newitem; +} + + + +/*!\~english + * Ananas configuation object constructor. + *\~russian + * Конструктор объекта конфигурации АНАНАС. + *\~ + */ +aCfg::aCfg() : QObject(0, "Metadata"), xml( md_root ) +{ + setCompressed( false ); + setModified( false ); + idcache.setAutoDelete( TRUE ); + createNew(); +} + + + +/*!\en + * Ananas configuation object destructor. + *\_en \ru + * Деструктор объекта конфигурации АНАНАС. + *\_ru +*/ +aCfg::~aCfg() +{ + xml.setContent( QString("") ); +} + + + +/*! + * Reads configuration information (metadata) from file. + * \param fname (in) - name of configuration file. + * \return error code. + */ +int +aCfg::read(const QString &fname){ + QFile file( fname ); + QByteArray buf; + QString err; + int errLine = 0, errColumn = 0; + if ( !file.open( QIODevice::ReadOnly ) ) return RC_ERROR; + buf = file.readAll(); + file.close(); + xml.setContent( QString("") ); + if ( !xml.setContent( buf, false, &err, &errLine, &errColumn ) ) { + emit message( 2, QObject::tr( + "Error read configuration line:%1 col:%2 %3" + ).arg( errLine ).arg( errColumn ).arg( err )); +// cfg_message( 2, QObject::tr( +// ( const char *) QObject::tr( +// "Error read configuration line:%d col:%s %s"), +// errLine, errColumn, ( const char *) err ); + return RC_ERROR; + } + init(); +//CHECK_POINT + setModified( false ); +//CHECK_POINT + return RC_OK; +} + + + +/*!\~english + * helper method. Save current configuration. + *\~russian + * Вспомогательный метод. Сохраняет текущую конфирацию. + *\~ + */ +int +aCfg::write(const QString &fname) +{ + return write(xml, fname); +} + +/*!\~english + * Writes configuration information (metadata) to file. + *\~russian + * Записывает информацию о бизнес схеме ( метаданные ) в файл. + *\~ + * \param doc (in) - \~english xml document to save. \~russian xml для сохранения \~ + * \param fname (in) - \~english name of configuration file. \~russian имя файла для сохранения \~ + * \return \~english error code. \~russian код ошибки \~ + */ +int +aCfg::write(QDomDocument doc, const QString &fname) +{ + QFile file( fname ); + QByteArray buf( xml.toString(4).utf8() ); + if ( file.open( QIODevice::WriteOnly ) ) { + QTextStream ts( &file ); + //--ts.setEncoding(Q3TextStream::UnicodeUTF8); + doc.save(ts, 4); + //ts << toString(4); + file.close(); + return RC_OK; + } + return RC_ERROR; +} + +/*! + * Returns configuration file compression mode. + * \return boolean + */ +bool +aCfg::compressed() +{ + return fCompressed; +} + + +/*! + * Sets compression mode of configuration file. + * \param mode (in) - compression mode. + * \return void + */ +void +aCfg::setCompressed( bool mode ) +{ + fCompressed = mode; +} + + +/*! + * Returns modification status. + * \return boolean + */ +bool +aCfg::modified() +{ + return fModified; +} + + +/*! + * Set modification status. + * \param mode (in) - new value of modification status + * \return void + */ +void +aCfg::setModified( bool mode ) +{ + fModified = mode; +} + + +/*! + * Data structures initialization. Should be run after load metadata from configuration file. + * \return void + */ +void +aCfg::init(){ + QDomNode cur, sub; + long id; + +// QString s = xml.toString(4).local8Bit(); // fake call for trap troble + if ( !xml.isDocument() ) { + aLog::print(aLog::Error, tr("Bad configuration")); + return; + } +//CHECK_POINT + QDomElement rootnode = xml.documentElement(); +//CHECK_POINT +// QDomElement root = rootnode; +//CHECK_POINT + cfginfo = rootnode.namedItem( md_info ).toElement(); + md = rootnode.namedItem( md_metadata ).toElement(); + iface = rootnode.namedItem( md_interface ).toElement(); + actions = rootnode.namedItem( md_actions ).toElement(); + idcache.clear(); + cur = rootnode.firstChild(); + while (!cur.isNull()) { + if ( cur.toElement().hasAttribute( mda_id ) ) { + id = 0; + id = attr(cur.toElement(), mda_id).toInt(); + if (id) { + idcache.insert(id, new aCfgItemContaner( id, cur.toElement() ) ); + } +// printf("cache name=%s id=%ld\n",(const char *)cur.nodeName(), id); + } + sub = cur.firstChild(); + if (!sub.isNull()) cur = sub; + else + { + if (!cur.nextSibling().isNull()) cur = cur.nextSibling(); + else + { + sub = cur; + cur.clear(); + while (cur.isNull()) { + sub = sub.parentNode(); + if (sub.isNull()) break; + else cur = sub.nextSibling(); + } + } + }; + } +//CHECK_POINT +// printf("init ok\n"); +} + + +/*! + * Reads resource file. + * \param fname (in) - rc file name. + * \return error code. + */ +int +aCfg::readrc(const QString &fname) +{ + int r = RC_ERROR; + QString configfile; + + r = rc.read( fname ); + if ( r ) return r; + configfile = rc.value( "configfile" ); + if ( !configfile.isEmpty() ) { + r = read( configfile ); + if ( r ) createNew();//return r; +// init(); + r = RC_OK; + } else r = RC_ERROR; + return r; +} + + +/*! + * Writes resource file. + * \param (in) - rc file name to write to. + * \return int. + */ +int +aCfg::writerc(const QString &fname) +{ + int r = RC_ERROR; + QString configfile; + r = rc.write( fname ); + if ( r ) return r; + configfile = rc.value( "configfile" ); + if ( !configfile.isEmpty() ) { + r = write( configfile ); + } + if ( !r ) setModified( false ); + return r; +} + + + +/*! + * Creates new empty configuration. + * \return void. + */ +void +aCfg::createNew(){ + aCfgItem i; + xml.setContent(QString("\n")); + setModified( true ); + + xml.appendChild( xml.implementation().createDocumentType("ananas_configuration",QString::null,"ananas-cfg.dtd")); + rootnode = xml.createElement( md_root ); + xml.appendChild( rootnode ); + rootnode = xml.documentElement(); + cfginfo = insert( rootnode, md_info, QString::null, -1 ); + iface = insert( rootnode, md_interface, QString::null, -1 ); + md = insert( rootnode, md_metadata, QString::null, -1 ); + actions = insert( rootnode, md_actions, QString::null, -1 ); + init(); + setInfo( md_info_name, "New configuration" ); + setInfo( md_info_lastid, "0" ); + setInfo( md_info_author, "unnamed" ); + setInfo( md_info_date, QDateTime::currentDateTime().date().toString(Qt::ISODate) ); + //setInfo( md_info_dir, "newConfig" ); + insert( md, md_globals, QString::null, -1 ); + insert( md, md_catalogues, QString::null, -1 ); + insert( md, md_documents, QString::null, -1 ); + insert( md, md_journals, QString::null, -1 ); + i = insert( md, md_registers, QString::null, -1 ); + insert( i, md_iregisters, QString::null, -1 ); + insert( i, md_aregisters, QString::null, -1 ); +} + + +/*! + * Returns value of info section field of configuration. + * \param name (in) - name of field to fetch value from. + * \return info field's value. + */ +QString +aCfg::info(const QString &name) +{ + return text(cfginfo.namedItem( name ).toElement()); //.firstChild().nodeValue(); +} + +/*! + * Sets new value to specified field of info section of configuration. + * \param name (in) - field's name. + * \param value (in) - field's value. + * \return void. + */ +void +aCfg::setInfo(const QString &name, const QString &value) +{ + aCfgItem i; + i = cfginfo.namedItem( name ).toElement(); + if (i.isNull()) { + i = xml.createElement( name ); + cfginfo.appendChild( i ); + } + setText(i, value); + setModified( true ); +} + + +/*! + * Generates new unique ID for metadata tree object. + * \return new unique ID. + */ +long +aCfg::nextID() +{ + long id = 0; + id = info( md_info_lastid ).toLong(); + if (id == 0 ) id = context_startid; + ++id; + setInfo( md_info_lastid, QString("%1").arg(id) ); + return id; +} + + + +/*! + * Counts specified objects in metadata tree. + * \param context (in) - parent of objects to count. May be a root + * of metadata tree. + * \param classname (in) - class of objects to count. + * \return number of objects. + */ +int +aCfg::count(aCfgItem context, const QString &classname){ + return context.elementsByTagName( classname ).count(); +} + + +/*! + * Counts specified child objects of object in metadata tree. + * Only child objects will be counted, not subchild objects. + * \param context (in) - parent of objects to count. May be a root + * of metadata tree. + * \param classname (in) - class of objects to count. + * \return number of objects. + */ +int +aCfg::countChild(aCfgItem context, const QString &classname){ + int n = 0; + aCfgItem i = firstChild( context ); + while ( !i.isNull() ) { + if ( classname.isEmpty() ) n++; + else + if ( objClass( i ) == classname ) n++; + i = nextSibling( i ); + } + return n; +} + + +/*! + * \en + * Finds object by its name and number. + * \param context (in) - context to seach in. + * \param name (in) - name of object to search for. + * \param n (in) - number of object in found context. + * \return founded object. + * \_en + * \ru + * Находит элемент метаданных в заданном контексте (поддереве) метаданных по имени тэга + * и порядковому номеру. Порядковый номер имеет смысл, если в контексте может находиться + * более одного элемента с одним и тем же тэгом. Так, например, внутри документа может быть несколько + * полей. Поэтому, делая поиск элемента метаданных, описывающего поле, + * внутри контекста (поддерева), описывающего документ, необходимо задавать порядковый номер поля. + * \param context (in) - контекст (поддерево) метаданных,для сужения пространства поиска. + * \param name (in) - имя тэга, с помощью которого описывается элемент метаданных, который мы ищем. + * Возможные значения для этого параметра смотрите в файле acfg.h под заголовком Metadata tags. + * \param n (in) - порядковый номер объекта, на случай, если таких объектов несколько. + * \return ссылку на найденный элемент метаданных или NULL, если элемент не найден. + * \_ru + */ +aCfgItem +aCfg::find(aCfgItem context, const QString &name, int n) +{ + QDomNodeList l = context.elementsByTagName( name ); + return l.item( n ).toElement(); +} + + +/*! + * \en + * \brief Finds object by unique ID in metadata tree. + * \param id (in) - id to search for. + * \return founded object. + * \_en + * \ru + * \brief Находит описание объекта в метаданных по его уникальному в рамках файла метаданных идентификатору. + * + * \param id - идетнификатор объекта в метаданных + * \return ссылку на элемент метаданных + * \_ru + */ +aCfgItem +aCfg::find(long id) +{ + long idl = id; + aCfgItem i; + aCfgItemContaner *ic; + + if ( id == 0 || id == mdc_metadata ) return md; + if ( id == mdc_root ) return rootnode; + if ( id == mdc_info ) return cfginfo; + if ( id == mdc_interface ) return iface; + if ( id == mdc_actions ) return actions; + + ic = idcache.find( idl ); + if (ic) i = ic->item; +// if (!i.isNull()) printf("!founded id=%li\n", id); +// else printf("!NOT founded id=%li\n", id); + return i; +} + +/*! + *\en + * Finds object by its full name. + * \param name (in) - object's full name. + * \return founded object. + *\_en \ru + * \brief Находит объект в текущей (открытой) конфигурации по его полному имени. + * + * \n Полное имя имеет вид ".[.]" + * \n OType может принимать только одно из следующих значений: + * - Document - для объектов типа Документ + * - Catalog - для объектов типа Каталог (примером каталога является Справочник товаров) + * - DocJournal - для объектов типа журнал документов + * - InfoRegister - для объектов типа Информационный Регистр + * - AccumulationRegister - для объектов типа Накопительный регистр. + * Накопительный регистр отличается от информационного тем, что по его записям выполняется автоматический расчет остатков. + * - Form - для объектов типа Экранная форма. + * + * OName задает имя объекта, которое было присвоено объекту во время редактирования конфигурации в программе Анананс-Дизайнер. + * Для поиска документа "Приходная накладная" нужно вызвать find("Document.Приходная накладная"); + * Для поиска формы с именем "Основная форма" в этом документе надо вызвать find("Document.Приходная накладная.Form.Основная форма"); + * \param name (in) - полное имя объекта. + * \return ссылка на найденный объект в случае успеха или NULL в случае, если объект не найден. + *\_ru + */ +aCfgItem +aCfg::find(const QString &name) +{ + QString oType, oName, omType, extName; + aCfgItem gobj, obj, sobj, item; + + oType = name.section( ".", 0, 0 ); + oName = name.section( ".", 1, 1 ); + extName = name.section( ".", 2 ); + gobj = md; + while ( !oType.isEmpty() && !oName.isEmpty() ) { + if (oType == "Document" || oType == tr("Document") ) { + omType = md_document; + gobj = findChild( gobj, md_documents ); + } + if (oType == "Catalogue" || oType == tr("Catalogue") ) { + omType = md_catalogue; + gobj = findChild( gobj, md_catalogues ); + } + if (oType == "DocJournal" || oType == tr("DocJournal")) { + omType = md_journal; + gobj = findChild( gobj, md_journals ); + } + if (oType == "Report" || oType == tr("Report")) { + omType = md_report; + gobj = findChild( gobj, md_reports ); + } + if (oType == "InfoRegister" || oType == tr("InfoRegister") ) { + omType = md_iregister; + gobj = findChild( find(gobj,md_registers,0),md_iregisters ); + } + if (oType == "AccumulationRegister" || oType == tr("AccumulationRegister") ) + { + omType = md_aregister; + gobj = findChild( find(gobj,md_registers,0),md_aregisters ); + } + if (oType == "Form" || oType == tr("Form")) { + omType = md_form; + gobj = findChild( gobj, md_forms ); + } + if ( !gobj.isNull() ) item = findName( gobj, omType, oName ); + if ( item.isNull() ) break; + gobj = item; + oType = extName.section( ".", 0, 0 ); + oName = extName.section( ".", 1, 1 ); + extName = extName.section( ".", 2 ); + } + return item; +} + +/* + * ??? Parameter classname is what for ??? + */ +aCfgItem +aCfg::findName(aCfgItem context, const QString &classname, const QString &name ) +{ + aCfgItem item; + + if ( !context.isNull() && !classname.isEmpty() ){ + item = firstChild( context ); + while ( !item.isNull() ) { + if ( attr( item, mda_name ) == name ){ + break; + } + item = nextSibling( item ); + } + } + return item; +} + +/* + * Finds child object by its class name and number. + * \param context (in) - parent object. + * \param classname (in) - class name of child to search for. + * \param n (in) - number of child (0..countChild( context, classname )-1). + * \return child number n or Null object. + */ +aCfgItem +aCfg::findChild(aCfgItem context, const QString &classname, int n) +{ + int in = 0; + aCfgItem i = firstChild( context ); + while ( !i.isNull() ) { + if ( classname.isEmpty() ) { + if ( in == n ) break; + in++; + } + else { + if ( objClass( i ) == classname ) { + if ( in == n ) break; + in++; + } + } + i = nextSibling( i ); + } + return i; +} + + + +/*! + * Swaps two items in metadata tree. + * \param item1 (in) - first item to swap. + * \param item2 (in) - second item to swap. + * \return true or false. + */ +bool +aCfg::swap(aCfgItem &item1, aCfgItem &item2) +{ + aCfgItem item, ic1, ic2, p1, p2; + + if ( item1.isNull() || item2.isNull() || ( item1 == item2 ) ) + { + if(item1.isNull()) aLog::print(aLog::Debug, tr("aCfg swap: first element is null")); + else + if(item2.isNull()) aLog::print(aLog::Debug, tr("aCfg swap: second element is null")); + else + aLog::print(aLog::Error, tr("aCfg swap element himself")); + return false; + } + p1 = parent( item1 ); + p2 = parent( item2 ); + if ( p1.isNull() || p2.isNull() || ( p1 != p2 ) ) + { + if(p1.isNull()) aLog::print(aLog::Debug, tr("aCfg swap: first parent null")); + else + if(p2.isNull()) aLog::print(aLog::Debug, tr("aCfg swap: second parent null")); + else + aLog::print(aLog::Error, tr("aCfg swap elements with differernt parents")); + return false; + } + p1.insertBefore( item1, item2 ); + setModified( true ); + return true; +} + +/*! + * Returns onject's order number among siblings. + * \param item (in) - object. + * \return object's order number. + */ +int +aCfg::order( aCfgItem item ) +{ + int i = 0; + aCfgItem current = item; + while ( !current.isNull() ) + { + ++i; + current = previousSibling( current ); + } + return i; +} + + +/*! + * Returns parent object. + * \param context (in) - object. + * \return paren object. +*/ +aCfgItem +aCfg::parent( aCfgItem context ) +{ + return context.parentNode().toElement(); +} + + +/*! + * Returns the first child item of the context. + * If there is no child, a null context is returned. + * Changing the returned item will also change the item + * in the metadata tree. + * \param context (in) - node in metadata tree. + * \return aCfgItem - node in metafata tree if found, NULL if not found. + */ +aCfgItem +aCfg::firstChild( aCfgItem context ) +{ + return context.firstChild().toElement(); +} + + +/*! + * Returns the last child item of the context. + * If there is no child, a null context is returned. + * Changing the returned item will also change the item + * in the metadata tree. + */ +aCfgItem +aCfg::lastChild( aCfgItem context ) +{ + return context.lastChild().toElement(); +} + + +/*! + * Returns the next sibling in the netadata tree. + * Changing the returned item will also change the item in the metadata tree. + */ +aCfgItem +aCfg::nextSibling( aCfgItem context ) +{ + return context.nextSibling().toElement(); +} + + +/*! + * Returns the previous sibling in the netadata tree. + * Changing the returned item will also change the item in the metadata tree. + */ +aCfgItem +aCfg::previousSibling( aCfgItem context ) +{ + return context.previousSibling().toElement(); +} + + +/*! + * Returns text of object. + * \param context (in) - object. + * \return string. + */ +QString +aCfg::text(aCfgItem context) +{ + if (context.isNull()) return ""; + return context.firstChild().nodeValue(); +} + + +/*! + * Sets text for object. + * \param context (in) - object. + * \param value (in) - new value. + * \return void. + */ +void +aCfg::setText(aCfgItem context, const QString &value) +{ + QDomText t; + if (context.isNull()) return; + while (!context.firstChild().isNull()) { + context.removeChild( context.firstChild() ); + } + t = xml.createTextNode( value ); + context.appendChild( t ); + setModified( true ); +} + + +/*! + * Returns binary value of object. + * \param context (in) - object to get value of. + * \return array of bytes. + */ +QByteArray +aCfg::binary( aCfgItem context ) +{ + unsigned int i, d, blen; + bool ok; + QString vs = text( context ); + blen = attr( context, mda_length ).toInt(); + QByteArray b( blen ); + for ( i=0; i < blen; i++ ){ + d = 0xff & vs.mid( i*2, 2 ).toInt( &ok, 16 ); + if ( ok ) b.data()[ i ] = d; + else b.data()[ i ] = 0; + } + return b; +} + + +/*! + * Sets binary value of metadata tree node. + * \param context (in) - metadata tree node. + * \param value (in) - new binary value. + * \param format (in) - format of binary data. + * \return void. + */ +void +aCfg::setBinary( aCfgItem context, const QByteArray &value, const QString &format ) +{ + QString vs ="", s; + unsigned int i, d; + for ( i=0; i= 100 ) setAttr(i, mda_id, id ); + if ( !name.isNull()) setAttr(i, mda_name, name ); + context.appendChild( i ); + if ( id > 0 ) idcache.insert(id, new aCfgItemContaner( id, i ) ); + setModified( true ); + return i; +} + +/*! + *\~english + * Saves configuration object to file. + *\~russian + * Сохраняет объект бизнес схемы в файл. + *\~ + * \param context - \~english object to save \~russian объект для сохранения \~ + * \param fileName - \~english file name \~russian имя файла \~ + * \return - \~english error code \~russian код ошибки \~ + */ +int +aCfg::saveOneObject(aCfgItem context, const QString &fileName) +{ + int res=RC_ERROR; + if(!context.isNull()) + { + QDomDocument doc; + if(context.isDocument()) + { + doc = context.toDocument(); + } + else + { + doc.setContent(QString("\n")); + doc.appendChild(context.cloneNode(true)); + } + res = write(doc,fileName); + if(res==RC_OK) + { + aLog::print(aLog::Info, tr("aCfg saveOneObject: context save to file `%1'").arg(fileName)); + } + } + else + { + aLog::print(aLog::Error, tr("aCfg saveOneObject: context is null")); + } + return res; +} + +/*! + *\~english + * Load configuration object from file. + *\~russian + * Загружает объект бизнес схемы из файла. + *\~ + * \param fileName - \~english file name \~russian имя файла \~ + * \return - \~english object, stored in xml file \~russian объект, хранящийся в xml файле \~ + */ +aCfgItem +aCfg::loadOneObject( const QString &fileName ) +{ + aCfgItem res; + QDomDocument doc; + + if(fileName!="") + { + QFile file( fileName ); + QByteArray buf; + QString err; +// int errLine = 0, errColumn = 0; + if ( file.open( QIODevice::ReadOnly ) ) + { + buf = file.readAll(); + file.close(); + if(doc.setContent( buf, false )) + { + res = doc.documentElement(); + } + else + { + aLog::print(aLog::Error, tr("aCfg loadOneObject: invalid cfg file `%1'").arg(fileName)); + } + + } + else + { + aLog::print(aLog::Error, tr("aCfg loadOneObject: invalid file name or not permission to file `%1'").arg(fileName)); + } + } + return res; +} + +/*! + * Removes metadata object from metadata tree. + * All children objects also removed. + * \param context (in) - metadata object. + * \return nothing. + */ +void +aCfg::remove(aCfgItem context) +{ + long id; + aCfgItem child; + + QDomNode own = context.parentNode(); + if (!own.isNull()) { + id = attr( context, mda_id ).toLong(); + child = firstChild(context); + remove(child); + idcache.remove( id ); + own.removeChild(context); + setModified( true ); + } +} + + +/*! + *\~english + * Import configuration object from another configuration. + *\~russian + * Импортирует объект конфигурации из другой конфигурации в текущую. + * Устанавливает новые Id для всех потомков объекта. + *\~ + * \param context - \~english parent for imported object \~russian родитель для импортируемого объекта \~ + * \param objFromAnotherCfg - \~english imported object \~russian импортируемый объект \~ + */ +aCfgItem +aCfg::importCfgItem(aCfgItem context, aCfgItem objFromAnotherCfg ) +{ + aCfgItem item = xml.importNode(objFromAnotherCfg,true).toElement(); + if(!item.isNull()) + { + context.appendChild( item ); + setupNewId(item); + } + return item; + +} +/*! + *\~english + * Sets new id for all children of object \a obj + *\~russian + * Устанавивает новый id для всех потомков объекта \a obj + *\~ + */ +void +aCfg::setupNewId( aCfgItem obj ) +{ + if(!obj.isNull()) + { + if(attr(obj, mda_id)!="") + { + long id; + aLog::print(aLog::Debug, tr("aLog setup new id for %1").arg(attr(obj, mda_name))); + id = nextID(); + aLog::print(aLog::Debug, tr("aLog next id is %1").arg( id ) ); + setAttr(obj,mda_id,id); + idcache.insert(id, new aCfgItemContaner( id, obj ) ); + } + aCfgItem i = firstChild(obj); + while(!i.isNull()) + { + setupNewId(i); + i = nextSibling(i); + } + } +} + +/*! + * Gets ID for metadata object by complete name. + * Name like "Document.Invoice", "Report.Total", etc. + * \param name (in) - full object's name. + * \return object's ID. + */ +long +aCfg::getId( QString &name ) +{ + QString p1, p2, p3; + p1 = name.section( ".", 0, 0 ); + p2 = name.section( ".", 1, 1 ); + p3 = name.section( ".", 2, 2 ); + + return 0; +} + + +/*! + * Returns configuration object ID. + * \param context (in) - object which ID we looking for. + * \return object's ID. + */ +long +aCfg::id(aCfgItem context) +{ + long i = 0; + QString sid; + + if ( !context.isNull() ) { + sid = attr( context, mda_id ); + if ( !sid.isEmpty() ) i=sid.toLong(); + } + return i; +} + +/* + * ??? + */ +void +aCfg::addTypes( QStringList &list, aCfgItem context, const QString &tobject, const QString &tname) +{ + aCfgItem obj; + int i, n; + long oid; + + if ( context.isNull() ) return; + n = count( context, tobject ); + for (i=0; i>formtype)%2 && attr( fobj, mda_type ).toInt() == mode ) + return id(fobj); + } + return 0; +} + +/*! + * Gets journal's documents list. + * \param journal (in) - journal to get list from. + * \return list of documents IDs. + */ +QStringList +aCfg::getJournalDocuments( aCfgItem journal ) +{ + QStringList l; + l.clear(); + if ( objClass(journal) != md_journal ) + return l; + aCfgItem dobj, pobj, jobj; + uint n, m; + int type = attr(journal,mda_type).toInt(); + switch ( type ) + { + case 0: + pobj = find( find( mdc_metadata ), md_documents, 0 ); + n = count(pobj,md_document); + for ( uint i = 0; i < n; i++ ) + { + dobj = find ( pobj, md_document, i ); + if ( !dobj.isNull()) + l.append( attr( dobj, mda_id )); + } + break; + case 1: + n = count(journal,md_used_doc); + for ( uint j = 0; j < n; j++ ) + { + dobj = find( journal, md_used_doc, j ); + QString id = text(dobj); + if ( !find(id.toLong()).isNull() ) + l.append( text(dobj) ); + else + remove(dobj); + } + break; + case 2 : + pobj = find( find( mdc_metadata ), md_documents, 0 ); + n = count(pobj,md_document); + for ( uint i = 0; i < n; i++ ) + { + jobj = find ( pobj, md_document, i ); + if ( !jobj.isNull()) + l.append ( attr( jobj, mda_id )); + } + pobj = find( find( mdc_metadata ), md_journals, 0 ); + n = count( pobj, md_journal ); + for ( uint i = 0; i < n; i++ ) + { + jobj = find ( pobj, md_journal, i ); + if ( !jobj.isNull()) + { + m = count ( jobj, md_used_doc ); + for ( uint j = 0; j < m; j++ ) + { + dobj = find( jobj, md_used_doc, j ); + QString str = text(dobj); + l.remove ( str ); + } + } + } + break; + } + return l; +} + +/*! + * + */ +aCfgItem +aCfg::findJournal(int jtype, aCfgItem doc) +{ + aCfgItem res; + uint n,m; + aCfgItem js = find( find( mdc_metadata ), md_journals, 0 ); + if(js.isNull()) return res; + + n = count( js, md_journal ); + switch(jtype) + { + case 0: + for ( uint i = 0; i < n; i++ ) + { + aCfgItem jobj = find ( js, md_journal, i ); + if ( !jobj.isNull()) + { + if(attr(jobj, mda_type).toInt()==0) return jobj; + } + } + break; + + case 1: + for ( uint i = 0; i < n; i++ ) + { + aCfgItem jobj = find ( js, md_journal, i ); + if ( !jobj.isNull()) + { + if(attr(jobj, mda_type).toInt()==1) + { + m = count ( jobj, md_used_doc ); + for ( uint j = 0; j < m; j++ ) + { + QString dobj = text(find( jobj, md_used_doc, j )); + if(dobj==attr(doc, mda_id)) return jobj; + + } + } + } + } + break; + + default: + break; + } + return res; +} + + +/*! + * Return list of object database tables. + * Every string in string list stored in format, + * consist of table id, table's human name fields, + * separated by tabulate char. + * This function used by Database tables plugins. + * For example: + * 0\tHeader + * 123\tTable1 + * id = 0 for document header, catalogue element; + * id = 1 for catalogue group; + * id = metadata object id for document table. + * \param obj (in) - metadata object. + * \return list of tables. + */ +QStringList +aCfg::objTables( aCfgItem obj ) +{ + QStringList list; + QString t; + int i, n; + long oid, tid; + aCfgItem objt; + + if ( obj.isNull() ) return list; + t = objClass( obj ); + oid = id( obj ); + if ( t == md_journal ) { + list << QString("0\t")+QObject::tr("Documents"); + } + if ( t == md_catalogue ) { + list << QString("0\t")+QObject::tr("Element"); + list << QString("1\t")+QObject::tr("Group"); + } + if ( t == md_document ) { + list << QString("0\t")+QObject::tr("Header"); + n = count( obj, md_table ); + for (i=0; i, Yoshkar-Ola +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/* +Ananas configuration objects. +(c) 2004 Leader InfoTech +*/ +#ifndef ACFG_H +#define ACFG_H + +#include "ananasglobal.h" + +#include +//#include +#include +#include "acfgrc.h" + +#ifdef __BORLANDC__ +#define CHECK_POINT printf("%s:%i %s()\n",__FILE__,__LINE__,__FUNC__); +#else +#define CHECK_POINT printf("%s:%i %s()\n",__FILE__,__LINE__,__FUNCTION__); +#endif + + +extern void (*cfg_messageproc)(int , const char *); +void ANANAS_EXPORT cfg_message(int msgtype, const char *msgfmt,...); +void ANANAS_EXPORT debug_message(const char *msgfmt,...); + +class QObject; + +/*! + * \~english Metadata object methods return codes. \~russian + * Коды возвратов методов объекта метаданных. \~ + */ +#define RC_OK 0 /**< All right - no errors */ +#define RC_ERROR 1 /**< Error while executing method */ + +/*! +Metadata system contexts id. +*/ +#define mdc_unknown 0 /**< Unknown context */ +#define mdc_root 1 /**< Root context */ +#define mdc_info 2 /**< Info context */ +#define mdc_interface 3 /**< Interface context */ +#define mdc_metadata 4 /**< Metadata context */ +#define mdc_globals 5 /**< Metadata context */ +#define mdc_actions 6 /**< Actions context */ + +//#define mdc_documents 6 /**< Metadata context */ +//#define mdc_catalogues 7 /**< Metadata context */ +//#define mdc_iregisters 8 /**< Metadata context */ +//#define mdc_aregisters 9 /**< Metadata context */ +//#define mdc_reports 10 /**< Metadata context */ +//#define mdc_journals 11 /**< Metadata context */ + +/*! +Metadata tags. +*/ +#define md_root "ananas_configuration" +#define md_interface "interface" + +#define md_info "info" +#define md_info_name "name" +#define md_info_author "author" +#define md_info_date "date" +#define md_info_mdate "mdate" +#define md_info_remark "remark" +#define md_info_lastid "lastid" +//#define md_info_dir "dir" + +#define md_metadata "metadata" /**< Metadata tag */ +#define md_globals "globals" +#define md_languages "languages" +#define md_language "language" +#define md_aliases "aliases" +#define md_alias "alias" +#define md_roles "roles" +#define md_role "role" +#define md_description "description" +#define md_sourcecode "sourcecode" +#define md_servermodule "server_module" +#define md_clientmodule "client_module" +#define md_formsource "form_source" +#define md_menutext "menutext" +#define md_argument "argument" + +#define md_documents "documents" +#define md_document "document" + +#define md_catalogues "catalogues" +#define md_catalogue "catalogue" +#define md_element "element" +#define md_group "group" + +#define md_string_view "string_view" +#define md_svfunction "svfunction" + +#define md_registers "registers" +#define md_iregisters "iregisters" +#define md_iregister "iregister" +#define md_aregisters "aregisters" +#define md_aregister "aregister" + +#define md_reports "reports" +#define md_report "report" + +#define md_journals "journals" +#define md_journal "journal" +#define md_columns "columns" +#define md_column "column" +#define md_used_doc "used_doc" +#define md_fieldid "fieldid" + +#define md_field "field" +#define md_forms "forms" +#define md_form "form" +#define md_defaultmod "defaultmod" +#define md_webforms "webforms" +#define md_webform "webform" +#define md_formdesign "dialogform" + +#define md_tables "tables" +#define md_table "table" +#define md_header "header" + +#define md_resources "resources" +#define md_dimensions "dimensions" +#define md_information "information" + +/*! +Action metadata object items. +*/ +#define md_actions "actions" +#define md_actiongroup "actiongroup" +#define md_action "action" +#define md_objectid "objectid" +#define md_formid "formid" +#define md_actiontype "actiontype" +#define md_active_picture "active_picture" +#define md_passive_picture "passive_picture" + +/*! +Interface metadata object items. +*/ +#define md_interface "interface" +#define md_toolbars "toolbars" +#define md_toolbar "toolbar" +#define md_popupmenus "popupmenus" +#define md_popupmenu "popupmenu" +#define md_mainmenu "mainmenu" +#define md_submenu "submenu" +#define md_command "command" +#define md_comaction "comaction" +#define md_separator "separator" +#define md_key "key" +#define md_menutext "menutext" +//key modifiers +#define md_km_ctrl "Ctrl+" +#define md_km_alt "Alt+" +#define md_km_shift "Shift+" + +#define md_image_collection "image_collection" +#define md_image "image" + + +/*! +Metadata attributes. +*/ +#define mda_name "name" +#define mda_id "id" +#define mda_type "type" +#define mda_readonly "readonly" +#define mda_lang "lang" +#define mda_nz "nz" +#define mda_sort "sort" +#define mda_no_unconduct "no_unconduct" +#define mda_plus "plus" +#define mda_sum "sum" +#define mda_tag "tag" +#define mda_trfile "trfile" +#define mda_length "length" +#define mda_format "format" +#define mda_stdf "stdf" +#define mda_rights "rights" + +/*! +Actions types +*/ + +#define md_action_new 0 +#define md_action_edit 1 +#define md_action_view 2 +#define md_action_execute 3 + +/*! + * Default forms types. + * If bit with some number set in 1 form can use for this action. + */ + +#define md_form_nouse 0 +#define md_form_new 1 +#define md_form_view 2 +#define md_form_edit 3 +#define md_form_select 4 + + +/*! + * Catalogue forms types. + */ + +#define md_form_elem_list 0 +#define md_form_elem 1 +#define md_form_group 2 + + +/*! +System object id +*/ + +#define md_systemjournal 1 +#define md_aregarhive 2 + +//class aCfg; +//extern aCfg cfg; + +#define ERR_Code int + +#define err_unknown -1//some ote error +#define err_noerror 0// result successful +#define err_notable 1// no table with such name +#define err_objnotfound 2// no such object in metadata +#define err_incorrecttype 3// object has othe metadata id +#define err_uidnotfound 4// no such id in unicues +#define err_notselected 5// select return nothing +#define err_nodatabase 6// database is not inited +#define err_selecterror 7// select return some error +#define err_condition 8// error in condition +#define err_noobject 9// aObject didn't init md object +#define err_nosysjournal 10// system journal not inited +#define err_inserterror 11// insert in aSQLTable return false +#define err_execerror 12// exec return false +#define err_updateerror 13// update reutrn false +#define err_abstractobj 14// you need to use hi level object or specimen of object +#define err_fieldnotfound 15// no filed with such name +#define err_copyerror 16// object don't copy +#define err_nocatalogue 17// catalogue not found +#define err_nogroup 18// group not found +#define err_deleteerror 19// object don't deleted or don't mark deleted +#define err_nodocument 20// no such document +#define err_emptyperiod 21// you try close empty period +#define err_noresources 22// the register object have no resources tag in metadata +#define err_incorrectname 23// object have incorrect name +#define err_closeperiod 24// close period error +#define err_conducterror 25// error when document conducting +#define err_docconducted 26// you can't change conducted document or conduct document once more +#define err_docunconducted 27// you can unconduct document if it not conducted +#define err_cyclereparent 28//you have cycle when try reparent +#define err_readonly 29//object is readonly +#define err_invaliddate 30// invalid date or datetime specified +#define err_nodimensions 31// the register object have no dimensions tag in metadata +#define err_nowidgetfound 32// there is no such widget in form + +#define md_user_roles "userroles" +#define md_users "users" +#define md_user "user" +#define md_usr_role "u_role" +#define md_roles "roles" +#define md_role "role" +#define md_rl_users "r_users" +#define md_rl_user "r_user" +#define md_right_roles "rroles" + +#define perm_read 0 +#define perm_execute 1 +#define perm_create 2 +#define perm_delete 3 +#define perm_turn_on 4 +#define perm_turn_off 5 +#define perm_admin 6 + +#define aPermission int + +#define aCfgItem QDomElement + + + +/*! + * \en + * Configuration item container. + * Using for id caching and fast search items by id. + *\_en + *\ru + * \brief Контейнер для элемента метаданных бизнес схемы Ананаса. + * Наследует QObject. + * + * Используется для кэширования id и быстрого поиска элементов по id. + *\_ru + */ +class ANANAS_EXPORT aCfgItemContaner: public QObject +{ +public: + long id; + aCfgItem item; + aCfgItemContaner(long newid, aCfgItem newitem); +}; + +/* +class ANANAS_EXPORT aCfgFieldType: public QObject +{ +public: + QString name, type; + aCfgFieldType( const QString &newname, const QString &newtype); + aCfgFieldType( aCfgItem newitem ); +}; +*/ + + + +/*! + *\en + * Metadata object for metadata script access. + *\_en + *\ru + * \brief Объект метаданных для обеспечения доступа из скриптов. + * Наследует QObject. + *\_ru + */ +class ANANAS_EXPORT AMetadataObject: public QObject +{ +Q_OBJECT +public: + AMetadataObject( aCfgItem newitem ); +public slots: + QString Class(); +private: + aCfgItem item; +}; + + + +/*! \en + * System configuration object. + * + * Using for story and edit accountine + * system configuration. + *\_en \ru + * \brief Класс реализует програмный интерфейс доступа к элементам метаданных системы. + * Наследует QObject. + * + * Взаимосвязанный набор метаданных, записанный в файл, называется конфигурацией + * (прикладной настройкой) системы. Методы класса позволяют загружать конфигурацию из + * файла, записывать её в файл. + *\_ru + */ +class ANANAS_EXPORT aCfg: public QObject //QDomDocument +{ + Q_OBJECT + +public: + enum fieldType { ftUnknown, ftChar, ftNumberic, ftDate, ftObject }; + aCfgRc rc; + + aCfg(); + ~aCfg(); + + int read(const QString &fname); + int write(const QString &fname); + int write(QDomDocument doc, const QString &fname); + int readrc(const QString &fname); + int writerc(const QString &fname); + bool compressed(); + void setCompressed( bool mode ); + bool modified(); + void setModified( bool mode ); +// void print(); + void createNew(); + + QString info(const QString &name); + void setInfo(const QString &name, const QString &value); + + long getId( QString &name ); + long id(aCfgItem context); + + QString objClass( long id ); + QString objClass( aCfgItem context ); + + int count(aCfgItem context, const QString &classname); + int countChild(aCfgItem context, const QString &classname = QString::null ); + + QString attr(aCfgItem context, const QString &name); + void setAttr(aCfgItem context, const QString &name, const QString &value); + void setAttr(aCfgItem context, const QString &name, int value); + + QString text(aCfgItem context); + void setText(aCfgItem context, const QString &value ); + QByteArray binary( aCfgItem context ); + void setBinary( aCfgItem context, const QByteArray &value, const QString &format = QString::null ); + QString binaryFormat( aCfgItem context ); + QString sText(aCfgItem context, const QString & subname ); + void setSText(aCfgItem context, const QString & subname, const QString &value); + + aCfgItem find(aCfgItem context, const QString &name, int n = 0 ); + aCfgItem find(long id); + aCfgItem find(const QString &name); + aCfgItem findChild(aCfgItem context, const QString &classname, int n = 0 ); + aCfgItem findName(aCfgItem context, const QString &classname, const QString &name = QString::null ); + + bool swap( aCfgItem &item1, aCfgItem &item2); + int order( aCfgItem item ); + aCfgItem parent( aCfgItem context ); + aCfgItem firstChild( aCfgItem context ); + aCfgItem lastChild( aCfgItem context ); + aCfgItem nextSibling( aCfgItem context ); + aCfgItem previousSibling( aCfgItem context ); + + aCfgItem insert(aCfgItem context, const QString &otype, const QString &name = QString::null, long id = 0); + int saveOneObject(aCfgItem context, const QString &fileName); + aCfgItem loadOneObject(const QString &fileName); + void remove(aCfgItem context); + + aCfgItem importCfgItem( aCfgItem context, aCfgItem obj ); + void setupNewId( aCfgItem obj ); + + QStringList types( const QString &filter = QString::null, aCfgItem *obj = 0 ); + QStringList ObjectTypes(); + + // Hi level functions. + aCfgItem insertDocument( const QString &name ); + aCfgItem insertDocumentTable(aCfgItem owner, const QString &name ); + aCfgItem insertCatalogue( const QString &name ); + aCfgItem insertIRegister ( const QString &name ); + aCfgItem insertARegister ( const QString &name ); + aCfgItem insertJournal ( const QString &name ); + aCfgItem insertReport ( const QString &name ); + aCfgItem insertField( aCfgItem owner, const QString §ion, const QString &name,const QString &ftype ); + aCfgItem insertForm( aCfgItem owner, const QString &name ); + aCfgItem insertWebForm( aCfgItem owner, const QString &name ); + + long getDefaultFormId( aCfgItem owner, int actiontype, int mode =0 ); + QStringList getJournalDocuments( aCfgItem journal ); + aCfgItem findJournal(int jtype, aCfgItem doc); + QStringList objTables( aCfgItem obj ); + QStringList objTables( int objid ); + aCfgItem objTable( aCfgItem obj, int id ); + aCfgItem objTable( int objid, int id ); + +public slots: + QString Info( QString partname ); + +signals: + void message( int messageType, const QString & messageText ); + +private: + QDomDocument xml; + bool fCompressed, fModified; + // QDomElement root; + aCfgItem rootnode, cfginfo, md, + iface, + actions; + Q3IntDict idcache; + long nextID(); + void init(); + + void addTypes( QStringList &list, aCfgItem context, const QString &tobject, const QString &tname); +}; + +#endif diff --git a/src/lib/acfgrc.cpp b/src/lib/acfgrc.cpp new file mode 100644 index 0000000..4108db9 --- /dev/null +++ b/src/lib/acfgrc.cpp @@ -0,0 +1,266 @@ +/**************************************************************************** +** $Id: acfgrc.cpp,v 1.3 2008/11/27 20:20:55 leader Exp $ +** +** Code file of the recorse work file of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +//#include +#include +#include +#include + +#include "acfg.h" +#include "acfgrc.h" +#include "messageswindow.h" + +QPixmap +rcIcon( const char *name ) +{ +// QString iconname = QString(":/images/%1").arg(name); +//printf("get icon %s ",(const char *) iconname.toUtf8().data()); + QPixmap pm(QString(":/images/%1").arg(name)); +//printf("\n"); + return pm; +} + + + +void +aMessageOutput( QtMsgType type, const char *msg ) +{ + switch ( type ) { + case QtDebugMsg: + cfg_message( 0, "%s\n", msg ); + break; + case QtWarningMsg: + cfg_message( 1, "%s\n", msg ); + break; + case QtFatalMsg: + cfg_message( 2, "%s\n", msg ); + abort(); // deliberately core dump + } +} + +void +setMessageHandler( bool ) // GUI ) +{ +// qInstallMsgHandler( aMessageOutput ); +// if ( GUI ) { +// cfg_messageproc = messageproc; +// cfg_message( 0, ""); +// } +} + +void +unsetMessageHandler() +{ + qInstallMsgHandler( 0 ); + cfg_messageproc = 0; +} + +/*! +Ananas resource file object. +*/ +aCfgRc::aCfgRc() +{ + values.setAutoDelete( TRUE ); + filename = QString::null; +} + + +/** + * \ru + * \brief Читает данные из файла ресурсов указанного в параметре при вызове. + * + * И заполняет объекта класса данными из файла ресурса. + * \param fname имя файла ресурса, включая полный путь. + * \return 0 - в случае успешной загрузки данных из файла ресурсов. + * 1 - если не удалось открыть файл ресурсов для чтения. + * \_ru + */ +int +aCfgRc::read(const QString &fname) +{ + QStringList l; + QFile file( fname ); + + filename = fname; + values.clear(); + if ( file.open( QIODevice::ReadOnly ) ) + { + Q3TextStream stream( &file ); + QString line, k, v; + + stream.setEncoding(Q3TextStream::UnicodeUTF8); + while ( !stream.eof() ) { + line = stream.readLine(); // line of text excluding '\n' + k = line.section("=",0,0); + v = line.section("=",1,100); if ( v.isNull() ) v = ""; + values.insert( k, new QString( v ) ); + } + file.close(); + return 0; + } + return 1; +} + + + +/** + * \ru + * \brief Записывает данные в файл ресурсов, указанный в параметрах вызова. + * + * В файл ресурса записываются данные, хранимые в объекте. + * \param fname - имя файла ресурсов, включая полный путь. + * \return 0, в случе успешной записы данных в файл ресурсов. + * 1, если не удалось открыть файл ресурсов на запись. + * \_ru + */ +int +aCfgRc::write(const QString &fname) +{ + QFile file( fname ); +// int i; + + if ( file.open( QIODevice::WriteOnly ) ) + { + Q3TextStream stream( &file ); + Q3DictIterator it( values ); +// int i, vc; + + stream.setEncoding(Q3TextStream::UnicodeUTF8); + for( ; it.current(); ++it ) + stream << it.currentKey() << "=" << *it.current() << endl; +// cout << endl; +// vc = values.count(); +// for ( i = 0; i< vc; i++) stream << *it << "\n"; + file.close(); + return 0; + } + return 1; +} + + + +/** + * \ru + * \brief Записывает данные объекта в файл ресурсов. + * + * В качестве имени файла ресурсов используется значение, хранящееся + * в поле filename объекта. + * Использует метод aCfgRc::write(const QString &fname) + * \return 0, в случе успешной записы данных в файл ресурсов. + * 1, если не удалось открыть файл ресурсов на запись. + * \_ru + * \see aCfgRc::write(const QString &fname) + */ +int +aCfgRc::write() +{ + return write( filename ); +} + + + +/** + * \ru + * \brief Возвращает значение именованного параметра. + * + * Метод предоставляет доступ к параметрам файла ресурсов, хранимым в объекте. + * \param name - имя параметра, значение которого требуется получить. + * Состав и количество параметров вида ИМЯ=ЗНАЧЕНИЕ не контролируются методом. + * \return строку со значением параметра или пустую строку "", если параметр не + * найден. + * \_ru + */ +QString +aCfgRc::value(const QString &name, const QString &defValue) +{ + QString *s; + s = values.find( name ); + if ( s ) return *s; else return defValue; +} + + + +/** + * \ru + * \brief Задает значение именованного параметра. + * + * Метод предоставляет доступ к параметрам файла ресурсов, хранимым в объекте. + * \param name - имя параметра, значение которого требуется задать. + * \param value - новое значение параметра с именем name. + * Состав и количество параметров вида ИМЯ=ЗНАЧЕНИЕ не контролируются методом. + * Однако, для успешного создания соединения с SQL сервером должны быть заданы + * как минимум приведенные в примере ниже шесть праметров. + * \code + * setValue( "configfile" , "resourses/inventory-demo.cfg"); + * setValue( "dbhost" , "localhost"); + * setValue( "dbname" , "tests_tmp_db"); + * setValue( "dbuser" , "root"); + * setValue( "dbpass" , ""); + * setValue( "dbtype" , "mysql"); + * + * \endcode + * \_ru + */ +void +aCfgRc::setValue(const QString &name, const QString &value) +{ + if (values.find( name )) values.replace( name, new QString( value )); + else values.insert( name, new QString( value )); +} + + +/** + * \ru + * \brief Возвращает количество параметров, информация о которых храниться в объекте. + * + * \return количество параметров, информация о которых храниться в объекте. + * \_ru + */ +int +aCfgRc::count() +{ + return ( int ) values.count(); +} + + + +/** + * \ru + * \brief Возвращает имя используемого rc файла с полным путем. + * \_ru + */ +QString +aCfgRc::getRcFileName() +{ + return filename; +} diff --git a/src/lib/acfgrc.h b/src/lib/acfgrc.h new file mode 100644 index 0000000..db50621 --- /dev/null +++ b/src/lib/acfgrc.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** $Id: acfgrc.h,v 1.2 2008/11/09 21:09:11 leader Exp $ +** +** Header file of the recorse work file of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACFGRC_H +#define ACFGRC_H + +#include "ananasglobal.h" + +#include +#include +//Added by qt3to4: +#include + +QPixmap ANANAS_EXPORT rcIcon(const char *name); +void ANANAS_EXPORT setMessageHandler(bool GUI = false); +void ANANAS_EXPORT unsetMessageHandler(); + + +/** + * \ru + * \brief Класс для работы с файлом ресурсов. + * + * Класс aCfgRc реализует интерфейс управления файлом ресурсов бизнес-схемы Ананаса, + * содержащим параметры соединения с SQL сервером, имя бизнес схемы, + * отображаемое пользователю для выбора при запуске Ананаса, и ссылку на файл метаданных + * бизнес-схемы Ананаса. + * \_ru + */ +class ANANAS_EXPORT aCfgRc: public QObject +{ +public: + aCfgRc(); + int read(const QString &fname); + int write(const QString &fname); + int write(); + QString value(const QString &name, const QString &defValue = QString::null ); + void setValue(const QString &name, const QString &value); + int count(); + QString getRcFileName(); + +private: + QString filename; + Q3Dict values; +}; + +#endif diff --git a/src/lib/acmanifest.cpp b/src/lib/acmanifest.cpp new file mode 100644 index 0000000..e1285e0 --- /dev/null +++ b/src/lib/acmanifest.cpp @@ -0,0 +1,247 @@ +/**************************************************************************** +** $Id: acmanifest.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Work with manifest.xml implementation file of +** Ananas application +** +** Created : 20060927 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "alog.h" +#include "acmanifest.h" +#include +#include + +//#define ERROR true + + +aCManifest::aCManifest():QObject() +{ +} + +aCManifest::~aCManifest() +{ +} + + + // place your castom types before mf_other + // enum type{ mf_metadata, mf_template, mf_dir, mf_script, mf_form, mf_picture, mf_other=100 }; + +void +aCManifest::create() +{ + manifest.setContent(QString("")); + QDomElement root = manifest.createElement("manifest:manifest"); + manifest.appendChild(root); + rootNode = root; + currentNode.clear(); + return; +} + +QString +aCManifest::toString() +{ + return manifest.toString(4); //indent - 4 space +} + +bool +aCManifest::write(const QString& fname) +{ + QFile file(fname); + QByteArray buf( manifest.toString(4).utf8() ); + if ( file.open( QIODevice::WriteOnly ) ) + { + QTextStream ts( &file ); + //--ts.setEncoding(Q3TextStream::UnicodeUTF8); + manifest.save(ts, 4); + file.close(); + } + else + { + aLog::print(aLog::Error, tr("aCManifest save xml %1").arg(fname)); + txtError = QString("aCManifest save xml %1").arg(fname); + return false; + } + return true; +} + + +bool +aCManifest::read(const QString& fname) +{ + QFile file( fname ); + QByteArray buf; + QString err; + int errLine = 0, errColumn = 0; + if ( !file.open( QIODevice::ReadOnly ) ) + { + aLog::print(aLog::Error, tr("aCManifest read file `%1'").arg(fname)); + return false; + } + buf = file.readAll(); + file.close(); + manifest.setContent( QString("") ); + if ( !manifest.setContent( buf, false, &err, &errLine, &errColumn ) ) + { + aLog::print(aLog::Error, tr("aCManifest read line: %1 column: %2").arg(errLine).arg(errColumn)); + txtError = err; + return RC_ERROR; + } + if(!manifest.documentElement().isNull()) + { + rootNode = manifest.documentElement().firstChild().toElement(); + } + currentNode.clear(); + return true; + +} + + +void +aCManifest::clear() +{ + manifest.clear(); + currentNode.clear(); + //manifest.setContent(""); + rootNode.clear(); +} + + +bool +aCManifest::isExists( const QString &fname ) +{ + //TODO implement this! + return isValid(); +} + +bool +aCManifest::addEntry( const QString &fname, int type) +{ + if(isValid()) + { + QDomElement entry = manifest.createElement("manifest:file-entry"); + entry.setAttribute("manifest:full-path",fname); + entry.setAttribute("manifest:type",type); + rootNode.appendChild(entry); + return true; + } + else + { + return false; + } +} + +bool +aCManifest::removeEntry( const QString &fname, bool withChilds ) +{ + + bool res = false; + if(isValid()) + { + QDomElement root = manifest.documentElement().firstChild().toElement(); + QDomElement el = root.firstChild().toElement(); + QString attr; + while(!el.isNull()) + { + printf("element is %s\n",el.nodeName().ascii()); + attr = el.attribute("manifest:full-path"); + if(withChilds) + { + if(attr.find(fname)!=0) // only if attr begining from fname + { + printf("remove entry %s\n",attr.ascii()); + } + } + else + { + if(attr==fname) + { + printf("remove entry %s\n",attr.ascii()); + root.removeChild(el); + res = true; + } + } + el = root.nextSibling().toElement(); + + } + } + return res; +} + +bool +aCManifest::isValid() +{ + if(rootNode.isNull()) + { + aLog::print(aLog::Error, tr("aCManifest invalid manifest")); + txtError = "aCManifest invalid manifest"; + return false; + } + return true; +} + + +aCManifest::record +aCManifest::first() +{ + aCManifest::record rec; + if(isValid()) + { + QDomElement node = rootNode.firstChild().toElement(); + if(!node.isNull()) + { + currentNode = node; + rec.name = node.attribute("manifest:full-path"); + rec.type = node.attribute("manifest:type", "0").toInt(); + } + } + return rec; +} + + +aCManifest::record +aCManifest::next() +{ + aCManifest::record rec; + if(isValid() && !currentNode.isNull()) + { + QDomElement node = currentNode.nextSibling().toElement(); + if(!node.isNull()) + { + currentNode = node; + rec.name = node.attribute("manifest:full-path"); + rec.type = node.attribute("manifest:type", "0").toInt(); + } + } + return rec; + +} + +QString +aCManifest::lastError() const +{ + return txtError; +} + + diff --git a/src/lib/acmanifest.h b/src/lib/acmanifest.h new file mode 100644 index 0000000..5058b60 --- /dev/null +++ b/src/lib/acmanifest.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** $Id: acmanifest.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** manifest.xml function header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACMANIFEST_H +#define ACMANIFEST_H + +#include "qdom.h" +#include "qstringlist.h" +#include "ananas.h" +#include + + + +/** + * \en + * Class for work with manifest.xml + * \_en + * \ru + * \brief Класс aCManifest предназначен для работы с файлом manifest.xml + * Наследует QObject. + * + * \_ru + */ +#define mf_invalid 0 +#define mf_metadata 1 +#define mf_template 2 +#define mf_dir 3 +#define mf_script 4 +#define mf_form 5 +#define mf_picture 6 +#define mf_other 100 + +class ANANAS_EXPORT aCManifest: public QObject +{ + Q_OBJECT +public: + + aCManifest(); + virtual ~aCManifest(); + // enum type{ mf_invalid, mf_metadata, mf_template, mf_dir, mf_script, mf_form, mf_picture, mf_other=100 }; + struct record + { + QString name; + int type; + }; + // place your castom types before mf_other + + virtual void create(); + virtual QString toString(); + virtual bool write(const QString& fname); + virtual bool read(const QString& fname); + virtual void clear(); + virtual bool isValid(); + + virtual aCManifest::record first(); + virtual aCManifest::record next(); + + virtual bool isExists( const QString &fname ); + virtual bool addEntry( const QString &fname, int type); + virtual bool removeEntry( const QString &fname, bool withChilds ); + virtual QString lastError() const; + +private: + QString txtError; + QDomDocument manifest; + QDomElement rootNode, currentNode; + +}; + + +#endif //ACMANIFEST_H diff --git a/src/lib/acontainer.cpp b/src/lib/acontainer.cpp new file mode 100644 index 0000000..4e795fd --- /dev/null +++ b/src/lib/acontainer.cpp @@ -0,0 +1,402 @@ +/**************************************************************************** +** $Id: acontainer.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Data container implementation file of +** Ananas application +** +** Created : 20060209 +** +** Copyright (C) 2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "alog.h" +#include "acontainer.h" +#include "acmanifest.h" +#include "aservice.h" +#include +#include +#include +#include +#include +#include + + +aContainer::aContainer():QObject() +{ +} + +aContainer::aContainer(const QString& name):QObject(0, name) +{ + manifest = new aCManifest(); +} + +aContainer::~aContainer() +{ + delete manifest; + manifest = 0; +} + +bool +aContainer::open() +{ + return open(name()); +} + +bool +aContainer::open(const QString& name) +{ + close(); + generateName4TmpDir(); + if(createTmpDir()) + { + extractManifest(name, manifest); + if(manifest) + { + if(extractData(name)) + { + setName(name); + aLog::print(aLog::Debug, tr("aContainer unzip")); + return true; + } + } + cleanupTmpFiles(); + } + aLog::print(aLog::Error, tr("aContainer unzip")); + return false; +} + + +void +aContainer::create() +{ + generateName4TmpDir(); + createTmpDir(); + manifest->create(); +} + +void +aContainer::close() +{ + cleanupTmpFiles(); +} + +void +aContainer::generateName4TmpDir() +{ + QString temp; +#ifndef _Windows + temp = getenv("TMPDIR"); + if(temp=="" || temp.isEmpty()) + temp = P_tmpdir; +#else + temp = getenv("TEMP"); +#endif + tmpDirName = QString(temp+"/%1").arg(QDateTime::currentDateTime().toTime_t()); + tmpDirName = QDir::convertSeparators(tmpDirName); + +} + +bool +aContainer::createTmpDir() +{ + QDir dir; + if(!dir.mkdir(tmpDirName)) + { + setLastError(tr("Can't create temporary directory")); + aLog::print(aLog::Error, "aContainer create temporary directory %1"); + return false; + } + else + { + aLog::print(aLog::Debug, tr("aContainer create temporary directory %1").arg(tmpDirName)); + return true; + } + +} + +bool +aContainer::save(const QString& name) +{ + setName(name); + if(manifest) + { + aCManifest::record rec; + rec = manifest->first(); + while(rec.type!=mf_invalid) + { + compressFile(rec.name); + rec = manifest->next(); + } + } + else + { + setLastError(tr("No manifest found!")); + aLog::print(aLog::Error, "aContainer save: manifest is null"); + return false; + } + return true; +} + +bool +aContainer::save() +{ + return save(name()); + +} + +bool +aContainer::addFile(const QString& filename, const QString &newname, int type) +{ + bool res = false; + if(!aService::copyFile( QDir::convertSeparators(filename), QDir::convertSeparators(tmpDirName + newname), true)) + { + aLog::print(aLog::Error, tr("aContainer error copy file")); + } + else + { + if(manifest) + { + manifest->addEntry(newname, type); + res = true; + } + else + { + aLog::print(aLog::Error, tr("aContainer manifest is null")); + } + } + return res; +} + +QString +aContainer::realPath(const QString &fname) const +{ + return ""; +} + + +bool +aContainer::extractManifest(const QString& archName, aCManifest *mf) +{ +#ifndef Q_OS_WIN32 + Q3Process process( QString("unzip") ); +// process.setWorkingDirectory (dir); + process.addArgument("-op"); + process.addArgument( archName ); + process.addArgument("/META-INF/manifest.xml"); + process.addArgument( "-d" ); + process.addArgument( tmpDirName ); + +#else + Q3Process process( QString("7z") ); +// process.setWorkingDirectory ( templateDir); +// printf("working dir = `%s'\n", QString(templateDir).ascii()); + process.addArgument( "x" ); + process.addArgument( "-y" ); + process.addArgument( QString("-o%1").arg(tmpDirName) ); + process.addArgument( archName ); + +#endif + + if( !process.start() ) + { + setLastError(tr("Can't start unzip")); + aLog::print(aLog::Error, tr("aContainer start unzip")); + return false; + } + + while( process.isRunning() ); + + if( !process.normalExit() ) + { + setLastError(tr("Unzip ended anormal")); + aLog::print(aLog::Error, tr("aContainer unzip dead")); + return false; + } + else + { + aLog::print(aLog::Debug, tr("aContainer unzip normal")); + } + if( process.exitStatus() ) + { + setLastError(tr("Unzip ended with code %1").arg(process.exitStatus())); + return false; + } + if(mf && mf->read(tmpDirName + QDir::convertSeparators("/META-INF/manifest.xml"))) + { + return true; + } + return false; +} + +bool +aContainer::extractData(const QString& archName) +{ +#ifndef Q_OS_WIN32 + Q3Process process( QString("unzip") ); +// process.setWorkingDirectory (dir); + process.addArgument("-op"); + process.addArgument( archName ); + process.addArgument( "-d" ); + process.addArgument( tmpDirName ); + +#else + Q3Process process( QString("7z") ); +// process.setWorkingDirectory ( templateDir); +// printf("working dir = `%s'\n", QString(templateDir).ascii()); + process.addArgument( "x" ); + process.addArgument( "-y" ); + process.addArgument( QString("-o%1").arg(tmpDirName) ); + process.addArgument( archName ); + +#endif + + if( !process.start() ) + { + setLastError(tr("Can't start unzip")); + aLog::print(aLog::Error, tr("aContainer start unzip")); + return false; + } + + while( process.isRunning() ); + + if( !process.normalExit() ) + { + setLastError(tr("Unzip ended anormal")); + aLog::print(aLog::Error, tr("aContainer unzip dead")); + return false; + } + else + { + aLog::print(aLog::Debug, tr("aContainer unzip normal")); + } + if( process.exitStatus() ) + { + setLastError(tr("Unzip ended with code %1").arg(process.exitStatus())); + return false; + } + return true; +} + +bool +aContainer::compressFile(const QString& fileName) +{ + +#ifndef Q_OS_WIN32 + + Q3Process processUpdate( QString("zip") ); + processUpdate.setWorkingDirectory(tmpDirName); +// processUpdate.addArgument( "-r" ); // recurce into subdirectories +// processUpdate.addArgument( "-0" ); // store only + processUpdate.addArgument( name() ); // cfg name + processUpdate.addArgument("."); + processUpdate.addArgument("-i"); + processUpdate.addArgument(fileName); +#else + Q3Process processUpdate( QString("7z") ); + processUpdate.setWorkingDirectory(tmpDirName); + processUpdate.addArgument( "a" ); + processUpdate.addArgument( "-tzip" ); + processUpdate.addArgument( fileName ); + processUpdate.addArgument( "-r" ); + processUpdate.addArgument("."); +#endif + + if( !processUpdate.start() ) + { + setLastError(tr("Unable to start zip")); + aLog::print(aLog::Error, tr("aContainer zip start error")); + return false; + } + + while( processUpdate.isRunning() ); + + if( !processUpdate.normalExit() ) + { + setLastError(tr("Zip ended with error")); + aLog::print(aLog::Error, tr("aContainer zip dead")); + return false; + } + + if( processUpdate.exitStatus() ) + { + setLastError(tr("Zip ended with code %1").arg(processUpdate.exitStatus())); + return false; + } + + return true; +} + + + + +void +aContainer::setLastError(const QString& errorText) +{ + txtError = errorText; +} + + +QString +aContainer::lastError() const +{ + return txtError; +} + +void +aContainer::cleanupTmpFiles() +{ + QFile file; + QDir dir; + + if(manifest && tmpDirName!="") + { + aCManifest::record rec; + rec = manifest->first(); + while(rec.type!=mf_invalid) + { + if(rec.type!=mf_dir && rec.type!=mf_invalid) + { + file.setName(tmpDirName + QDir::convertSeparators(rec.name)); + if(file.remove()) + aLog::print(aLog::Debug, tr("aContainer delete file %1").arg(rec.name)); + } + rec = manifest->next(); + } + rec = manifest->first(); + while(rec.type!=mf_invalid) + { + if(rec.type==mf_dir) + { + if(dir.rmdir(tmpDirName + QDir::convertSeparators(rec.name) )) + aLog::print(aLog::Debug, tr("aContainer delete directory %1").arg(rec.name)); + } + rec = manifest->next(); + } + } + + + file.setName(QDir::convertSeparators(tmpDirName+"/META-INF/manifest.xml")); + if(file.remove()) aLog::print(aLog::Debug, tr("aContainer delete file %1").arg(file.name())); + if(dir.rmdir(QDir::convertSeparators(tmpDirName))) aLog::print(aLog::Debug, tr("aContainer delete directory %1").arg(tmpDirName + "/META-INF")); + //aLog::print(aLog::Info, tr("aContainer cleanup temporary files")); + +} + diff --git a/src/lib/acontainer.h b/src/lib/acontainer.h new file mode 100644 index 0000000..9ff4a27 --- /dev/null +++ b/src/lib/acontainer.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** $Id: acontainer.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Data container functions header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACONTAINER_H +#define ACONTAINER_H + +#include "qdom.h" +#include "qstringlist.h" +#include "ananas.h" +#include "acmanifest.h" +#include + + +//class aDatabase; + +/** + * \en + * Class for work with data container + * \_en + * \ru + * \brief Класс предназначен для работы с контейнерами данных. + * Наследует QObject. + * + * \_ru + */ +class ANANAS_EXPORT aContainer: public QObject +{ + Q_OBJECT +public: + + aContainer(); + aContainer(const QString& name); + virtual ~aContainer(); + + virtual bool open(); + virtual bool open(const QString &name); + virtual void create(); + virtual void close(); + + virtual bool save(); + virtual bool save(const QString& name); + virtual bool addFile(const QString& filename, const QString &newname, int type); + virtual QString realPath(const QString &fname) const; + + virtual QString lastError() const; + void setLastError(const QString& errorText); + +//signals: + //void progress(int,int); + +protected: + void generateName4TmpDir(); + bool createTmpDir(); + bool extractManifest(const QString& archName, aCManifest *mf); + bool extractData(const QString& archName); + bool compressFile(const QString& fileName); + void cleanupTmpFiles(); + +private: + QString txtError; + aCManifest *manifest; + QString tmpDirName; + +}; + +#endif //ACONTAINER_H diff --git a/src/lib/adataexchange.cpp b/src/lib/adataexchange.cpp new file mode 100644 index 0000000..71c5d17 --- /dev/null +++ b/src/lib/adataexchange.cpp @@ -0,0 +1,631 @@ +/**************************************************************************** +** $Id: adataexchange.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Import/export function implementation file of +** Ananas application +** +** Created : 20060209 +** +** Copyright (C) 2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "alog.h" +#include "adataexchange.h" +#include "aservice.h" +#include +#include +#include +#include +#include +#include +#include + +//#define ERROR true + +aBackup::aBackup():QObject() +{ +} + + +aBackup::~aBackup() +{ +} + +bool +aBackup::importData(const QString& rcfile, const QString &archfile, bool dropBase, bool replaceTemplates) +{ + + + int prg=0; + int totalSteps=10; + QString tmpDirName; + QString filename = archfile; + + QDir dir; + QString temp; + QStringList templatesName; + +#ifndef _Windows + temp = getenv("TMPDIR"); + if(temp=="" || temp.isEmpty()) + temp = P_tmpdir; +#else + temp = getenv("TEMP"); +#endif + tmpDirName = QString(temp+"/%1").arg(QDateTime::currentDateTime().toTime_t()); + tmpDirName = QDir::convertSeparators(tmpDirName); + //printf("tmp dir name = %s\n",tmpDirName.ascii()); + if(!dir.mkdir(tmpDirName)) + { + setLastError(tr("Can't create temporary directory")); + aLog::print(aLog::Error, "aBackup create temporary directory %1"); + return true; + } + else + { + aLog::print(aLog::Debug, tr("aBackup create temporary directory %1").arg(tmpDirName)); + } + if(unzipArchive(archfile, tmpDirName)==true) + { + cleanupTmpFiles(tmpDirName, &templatesName); + + //printf("unzip error!\n"); + aLog::print(aLog::Error, tr("aBackup import data: unzip")); + return true; + } + else + { + aLog::print(aLog::Debug, tr("aBackup unzip")); + } + + + QString srcDirName = QDir::convertSeparators(tmpDirName + "/templates/"); + dir.setPath(srcDirName); + templatesName = dir.entryList("templ_*.odt;templ_*.ods"); + + + qApp->processEvents(); + emit(progress(++prg,totalSteps)); + + filename.truncate( filename.length() - QString(".bsa").length() ); + aLog::print(aLog::Debug, tr("aBackup filename = %1").arg(filename)); + + //printf("filename = %s\n",filename.ascii()); + changeRC(rcfile, tmpDirName + "/busines-schema.cfg"); + + QFile f(tmpDirName+"/content.xml"); + QDomDocument xml; + xml.setContent(&f); +// printf("%s\n",xml.toString(4).ascii()); + aDatabase db; + if(db.init(rcfile)) + { + emit(progress(++prg,totalSteps)); + if(!dropBase) + { + db.done(); + cleanupTmpFiles(tmpDirName, &templatesName); + return false; + } + db.drop(db.cfg.rc.value("dbname")); + emit(progress(++prg,totalSteps)); + db.create(); + + emit(progress(++prg,totalSteps)); + + db.exchangeDataSystables ( xml, true); + emit(progress(++prg,totalSteps)); + db.exchangeDataCatalogues( xml, true ); + emit(progress(++prg,totalSteps)); + db.exchangeDataDocuments ( xml, true ); + emit(progress(++prg,totalSteps)); + db.exchangeDataJournals ( xml, true ); + db.exchangeDataInfoRegisters ( xml, true ); + emit(progress(++prg,totalSteps)); + db.exchangeDataAccumulationRegisters ( xml, true ); + emit(progress(++prg,totalSteps)); + db.exchangeDataUniques ( xml, true ); + } + else + { + setLastError(tr("Can't connect to database")); + cleanupTmpFiles(tmpDirName, &templatesName); + return true; + } + qApp->processEvents(); + + QString destDirName = QDir::convertSeparators(db.cfg.rc.value("workdir")); + + //create template directory + QDir destDir; +// destDir.setPath(destDirName); + if(!destDir.exists(destDirName)) + { + aLog::print(aLog::Debug, tr("aBackup template dir `%1' not exists, try create").arg(destDirName)); + if(!destDir.mkdir(destDirName,true)) + { + aLog::print(aLog::Error, tr("aBackup create template dir `%1' fail").arg(destDirName)); + } + else + { + aLog::print(aLog::Debug, tr("aBackup create template dir `%1'").arg(destDirName)); + } + } + else + { + aLog::print(aLog::Debug, tr("aBackup template dir `%1' exists").arg(destDirName)); + } + + for(uint i=0; iprocessEvents(); + + if(withTemplates) + { + srcDirName = QDir::convertSeparators(cfg.rc.value("workdir")); + aLog::print(aLog::Debug, tr("aBackup workdir=%1").arg(srcDirName)); + dir.setPath(srcDirName); + templatesName = dir.entryList("templ_*.odt;templ_*.ods"); + for(uint i=0; iprocessEvents(); + emit(progress(++prg,totalSteps)); + // create dump + if(dumpBase(rcfile,tmpDirName, prg, totalSteps )==true) + { + cleanupTmpFiles(tmpDirName, &templatesName); + aLog::print(aLog::Error, tr("aBackup dump base error")); + return true; + } + else + { + aLog::print(aLog::Debug, tr("aBackup bump base")); + } + + if(writeXml(QDir::convertSeparators(tmpDirName+"/META-INF/manifest.xml"), createManifest(templatesName))==true) + { + setLastError(tr("Can't write file META-INF/manifest.xml")); + aLog::print(aLog::Error, tr("aBackup write manifest.xml")); + cleanupTmpFiles(tmpDirName, &templatesName); + return true; + } + else + { + aLog::print(aLog::Debug, tr("aBackup write manifest.xml")); + } +// printf("%s\n",(createManifest(templatesName)).toString().ascii()); + if(withTemplates) + { + QString destNamePref = tmpDirName + "/templates"; + dir.mkdir(destNamePref); + bool res = false; + for(uint i=0; i")); + QDomElement root = xml.createElement( "AnanasDump" ); + xml.appendChild( root ); + aDatabase db; + if(db.init(rcfile)) + { + emit (progress(++prg,totalSteps)); + db.exchangeDataSystables ( xml, false ); + emit (progress(++prg,totalSteps)); + db.exchangeDataCatalogues( xml, false ); + emit (progress(++prg,totalSteps)); + db.exchangeDataDocuments ( xml, false ); + emit (progress(++prg,totalSteps)); + db.exchangeDataJournals ( xml, false ); + emit (progress(++prg,totalSteps)); + db.exchangeDataInfoRegisters ( xml, false ); + emit (progress(++prg,totalSteps)); + db.exchangeDataAccumulationRegisters ( xml, false ); + + db.exchangeDataUniques ( xml, true ); + + aLog::print(aLog::Debug, tr("aBackup dump tables ok")); + } + else + { + setLastError(tr("Can't connect to database")); + aLog::print(aLog::Error, tr("aBackup init rc file %1").arg(rcfile)); + db.done(); + return true; + } + qApp->processEvents(); + emit (progress(++prg,totalSteps)); + db.done(); + if(writeXml(tmpDirName+"/content.xml",xml)==true) + { + setLastError(tr("Can't write content.xml")); + aLog::print(aLog::Error, tr("aBackup write content.xml")); + return true; + } + else + { + aLog::print(aLog::Info, tr("aBackup dump base to xml compleet")); + } + return false; +} + +bool +aBackup::writeXml(const QString & name2Save, QDomDocument xml) +{ + QFile file(name2Save); + QByteArray buf( xml.toString(4).utf8() ); + if ( file.open( QIODevice::WriteOnly ) ) + { + QTextStream ts( &file ); + //--ts.setEncoding(Q3TextStream::UnicodeUTF8); + xml.save(ts, 4); + file.close(); + } + else + { + aLog::print(aLog::Error, tr("aBackup save xml %1").arg(name2Save)); + return true; + } + return false; +} + +bool +aBackup::checkStructure() +{ + return false; +} + +QDomDocument +aBackup::createManifest(const QStringList& templates) +{ + QDomDocument manifest; + manifest.setContent(QString("")); + + QDomElement root = manifest.createElement("manifest:manifest"); + manifest.appendChild(root); + + QDomElement entry = manifest.createElement("manifest:file-entry"); + entry.setAttribute("manifest:full-path","business-schema.cfg"); + root.appendChild(entry); + + entry = manifest.createElement("manifest:file-entry"); + entry.setAttribute("manifest:full-path","content.xml"); + root.appendChild(entry); + if(templates.count()>0) + { + QDomElement templatesDir = manifest.createElement("manifest:file-entry"); + templatesDir.setAttribute("manifest:full-path","templates/"); + + for(uint i=0; i cfg; +// QString configFileName; + + cfg = aTests::readConfig(QDir::convertSeparators(nameRC)); + +// configFileName = cfg["configfile"]; +// configFileName.truncate( configFileName.length() - QString(".bsa").length() ); +// cfg["configfile"] = configFileName + ".cfg"; + + cfg["configfile"] = newConfigName; + + aTests::writeConfig(QDir::convertSeparators(nameRC), cfg); +} + + +void +aBackup::setLastError(const QString& errorText) +{ + txtError = errorText; +} + + +QString +aBackup::lastError() const +{ + return txtError; +} + +void +aBackup::cleanupTmpFiles(const QString& tmpDirName, QStringList *files) +{ + QFile file; + QDir dir; + file.setName(QDir::convertSeparators(tmpDirName+"/content.xml")); + aLog::print(aLog::Debug, tr("aBackup delete file %1").arg(file.name())); + file.remove(); + file.setName(QDir::convertSeparators(tmpDirName+"/busines-schema.cfg")); + aLog::print(aLog::Debug, tr("aBackup delete file %1").arg(file.name())); + file.remove(); + file.setName(QDir::convertSeparators(tmpDirName+"/META-INF/manifest.xml")); + aLog::print(aLog::Debug, tr("aBackup delete file %1").arg(file.name())); + file.remove(); + for(uint i=0; icount(); i++) + { + file.setName(QDir::convertSeparators(tmpDirName + "/templates/"+ (*files)[i])); + aLog::print(aLog::Debug, tr("aBackup delete file %1").arg(file.name())); + file.remove(); + } + aLog::print(aLog::Debug, tr("aBackup delete directory %1").arg(tmpDirName + "/META-INF")); + dir.rmdir(QDir::convertSeparators(tmpDirName + "/META-INF")); + aLog::print(aLog::Debug, tr("aBackup delete directory %1").arg(tmpDirName + "/templates")); + dir.rmdir(QDir::convertSeparators(tmpDirName + "/templates")); + aLog::print(aLog::Debug, tr("aBackup delete directory %1").arg(tmpDirName)); + dir.rmdir(QDir::convertSeparators(tmpDirName)); + aLog::print(aLog::Info, tr("aBackup cleanup temporary files")); + +} + diff --git a/src/lib/adataexchange.h b/src/lib/adataexchange.h new file mode 100644 index 0000000..b832704 --- /dev/null +++ b/src/lib/adataexchange.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** $Id: adataexchange.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Import/export data function header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ADATEXCHANGE_H +#define ADATEXCHANGE_H + +#include "qdom.h" +#include "qstringlist.h" +#include "ananas.h" +#include + + +class aDatabase; + +/** + * \en + * Class for work make backup and restore databases + * \_en + * \ru + * \brief Класс aBackup определяет программный интерфейс для бэкапа и востановления базы данных. + * Наследует QObject. + * + * \_ru + */ +class ANANAS_EXPORT aBackup: public QObject +{ + Q_OBJECT +public: + + aBackup(); + virtual ~aBackup(); + + virtual bool importData(const QString& rcfile, const QString &archfile, bool dropDB, bool replaceTemplates=0); + virtual bool exportData(const QString& rcfile, const QString &archfile, bool withTemplates=0 ); + virtual QString lastError() const; + +signals: + void progress(int,int); + +protected: + virtual void setLastError(const QString & errorText); + virtual bool unzipArchive(const QString& archName, const QString& tmpDirName); + virtual bool zipArchive(const QString& archName, const QString& tmpDirName); + virtual bool checkStructure(); + virtual QDomDocument createManifest(const QStringList& templates); + virtual void changeRC(const QString& nameRC, const QString& newConfigName); + virtual bool dumpBase(const QString& rcfile, const QString& tmpDirName, int &progress, int totalSteps); + virtual bool writeXml(const QString & fileName, QDomDocument xml); + void cleanupTmpFiles(const QString& tmpDirName, QStringList *files); + +private: + QString txtError; +// QString tmpDirName; + +}; + +#endif //ADATEXCHANGE_H diff --git a/src/lib/adatafield.cpp b/src/lib/adatafield.cpp new file mode 100644 index 0000000..de9e744 --- /dev/null +++ b/src/lib/adatafield.cpp @@ -0,0 +1,213 @@ +/**************************************************************************** +** $Id: adatafield.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Code file of the Ananas database field of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +//#include +//#include "acfg.h" +#include "adatafield.h" + +/*! +Create Ananas database field contaner. +*/ +/* +aDataField::aDataField(aCfg *newmd, aCfgItem newcontext ) +:QObject( 0, "aField" ) // name ) +{ + md = newmd; + context = newcontext; +// fType = type; + fTName = ""; +// field = new QSqlField( fTName ); + fSys = false; +} +*/ + +/*! + * Create Ananas field contaner. + */ +aDataField::aDataField( QObject *parent, const QString &name, const QString &type ) +:QObject( parent, "aField" ) +{ + init( name, type ); +} + + +/*! + * Create Ananas field contaner. + */ +aDataField::aDataField(const QString &name, const QString &type ) +:QObject( 0, "aField" ) +{ + init( name, type ); +} + + +aDataField::aDataField( const aDataField &field ) +:QObject( 0, "aField" ) +{ + init( field.fieldName(), field.fType ); +} + +/*! + * Destroy object. + */ + +aDataField::~aDataField() +{ +// delete field; +} + +aDataField& +aDataField::operator=( const aDataField& other ) +{ + Type = other.Type; + context = other.context; + id = other.id;; + md = other.md; + fSys = other.fSys; + Width = other.Width; + Dec = other.Dec; + Name = other.Name; + fType = other.fType; + aType = other.aType; + fieldData = other.fieldData; + return *this; +} + +bool +aDataField::operator==( const aDataField& other ) const +{ + return ( + fSys == other.fSys && + Name == other.Name && + fType == other.fType && + id == other.id && + context == other.context + ); +} + + +bool +aDataField::operator!=( const aDataField& other ) const +{ + return !( other == *this ); +} + +void +aDataField::init( const QString &name, const QString &type ) +{ + QString t; + + fSys = true; + Name = name; + fType = type; + Type = QVariant::Invalid; + if ( !type.isNull() ) { + aType = ( (const char *) type.section(" ",0,0).upper() )[0]; + Width = type.section(" ",1,1).toInt(); + Dec = type.section(" ",2,2).toInt(); + switch ( aType ){ + case 'C': + Type = QVariant::String; + fieldData = QString(""); + break; + case 'N': + Type = QVariant::Double; + fieldData = ( double ) 0.0; + default: + Type = QVariant::Invalid; + } + } +} + +/*! +Return pointer to asociated sql field. +*/ +//QSqlField * +//aField::sqlField(){ +// return field; +//} + + +/*! + * + */ +QVariant +aDataField::internalValue() +{ + return fieldData; +} + + +/*! + * + */ +void +aDataField::setInternalValue( const QVariant &value) +{ + fieldData = value; +} + + + +/*! + * Возвращает значение поля данных. + */ +QVariant +aDataField::value() +{ + return fieldData; +} + + +/*! + * Устанавливает значение поля данных. + */ +void +aDataField::setValue( const QVariant &value) +{ + fieldData = value; +} + + + +/*! + * + */ +int +aDataField::ObjectType() +{ + return oType; +} + + +QString +aDataField::fieldName() const +{ + return Name; +} diff --git a/src/lib/adatafield.h b/src/lib/adatafield.h new file mode 100644 index 0000000..c6b6d23 --- /dev/null +++ b/src/lib/adatafield.h @@ -0,0 +1,106 @@ +/**************************************************************************** +** $Id: adatafield.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Ananas data field of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ADATAFIELD_H +#define ADATAFIELD_H +//#include + +#include +#include +#include "ananasglobal.h" +#include "acfg.h" + + +//class aCfg; +//class aCfgItem; +//class QObject; +//#define + +/*! + * \en + * aDataField object unite all ananas types for access them from + * Ananas Script. + * Object translate calls from script to special type object + * with check correct call functions and parameters. + * \_en + * \ru + * \brief Класс определяет программный интерфейс для доступа к полям бизнес объектов Ананаса. + * Наследует QObject. + * + * Позволяет получить и задать значение поля любого типа. Предназначен для использования из Ананас-скрипта. + * \_ru + */ + +class ANANAS_EXPORT aDataField : public QObject +{ + Q_OBJECT +// Q_PROPERTY( Priority priority READ priority WRITE setPriority ) +// Q_ENUMS( Priority ) +// Q_CLASSINFO( "Author", "Oscar Peterson") +public: +// enum fieldType ( Unknown, Numberic, Character, Date, Object ); + aCfgItem context; + long id; + aCfg *md; + bool fSys; + int Width, Dec; + QString Name, fType; + char aType; + QVariant::Type Type; +// QVariant field; + int oType; + + +// aField( aCfg *newmd, aCfgItem newcontext ); + aDataField( QObject *parent, const QString &fname = QString::null, const QString &ftype = QString::null ); + aDataField( const QString &fname = QString::null, const QString &ftype = QString::null ); + aDataField( const aDataField &field ); + ~aDataField(); + + aDataField& operator=( const aDataField& other ); + bool operator==( const aDataField& other ) const; + bool operator!=( const aDataField& other ) const; +// aDataField& operator[]( const int& i ){}; + +// QSqlField *sqlField(); + virtual QVariant internalValue(); + virtual void setInternalValue( const QVariant &value); +public slots: + virtual QString fieldName() const; + virtual int ObjectType(); + virtual QVariant value(); + virtual void setValue( const QVariant &value); +private: + QVariant fieldData; + + void init( const QString &fname = QString::null, const QString &ftype = QString::null ); +}; + + +#endif diff --git a/src/lib/aextension.cpp b/src/lib/aextension.cpp new file mode 100644 index 0000000..2bf1234 --- /dev/null +++ b/src/lib/aextension.cpp @@ -0,0 +1,50 @@ +/**************************************************************************** +** $Id: aextension.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Valery Grazdankin, Orenburg. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "aextension.h" + +AExtension::AExtension( const char *name ) + : QObject( 0, name ) +{ + if (name==0) setName( className() ); +} + + + +AExtension::~AExtension() +{ +} + + +int AExtension::init(aDatabase* dbo){ + db = dbo; + return 0; +} diff --git a/src/lib/aextension.h b/src/lib/aextension.h new file mode 100644 index 0000000..70a05b6 --- /dev/null +++ b/src/lib/aextension.h @@ -0,0 +1,61 @@ +/**************************************************************************** +** $Id: aextension.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTENSION_H +#define AEXTENSION_H + +#include "ananasglobal.h" +#include "adatabase.h" +#include + +/** + * \en + * Class for work with extensions + * \_en + * \ru + * \_ru + */ +class ANANAS_EXPORT AExtension : public QObject +{ + Q_OBJECT + +public: + aDatabase* db; + + AExtension( const char *name = 0 ); + ~AExtension(); + int init(aDatabase* dbo); + +signals: + void event( const QString &data ); + +}; + +#endif //AEXTENSION_H diff --git a/src/lib/aextensionfactory.cpp b/src/lib/aextensionfactory.cpp new file mode 100644 index 0000000..e19b803 --- /dev/null +++ b/src/lib/aextensionfactory.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** $Id: aextensionfactory.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** ... +** +** Created : 20060209 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "aextensionfactory.h" +#include +#include +#include +#include +#include +#include +#include +#include + +class AExtensionFactoryPrivate : public QObject +{ +public: + AExtensionFactoryPrivate(); + ~AExtensionFactoryPrivate(); + + QHash hash; + QStringList extensionKeys; +}; + +static AExtensionFactoryPrivate *instance = 0; + +AExtensionFactoryPrivate::AExtensionFactoryPrivate() +: QObject( qApp ) +{ + QString extensionsDirName; + AExtensionInterface *iface = 0; + QObject *plugin = 0; + QPluginLoader pluginLoader; + +#ifdef Q_OS_WIN32 + extensionsDirName = qApp->applicationDirPath()+"/extensions"; +#else + extensionsDirName = "/usr/share/ananas4/extensions"; +#endif + + hash.clear(); + extensionKeys.clear(); + QDir extensionsDirectory( extensionsDirName ); + QStringList extensionFiles = extensionsDirectory.entryList( QDir::Files ); + QString fileName = extensionFiles.first(); + for (int i=0; i(plugin); + if( iface ) { + extensionKeys.append( iface->key()); + hash[ iface->key()] = iface; + } + } + } +} + +AExtensionFactoryPrivate::~AExtensionFactoryPrivate() +{ +// delete instance; +// instance = 0; +} + +/*! + Creates a AExtension object that matches \a key. This is either a + built-in extensions, or a extension from a extension plugin. + + \sa keys() +*/ +AExtension *AExtensionFactory::create( const QString& key ) +{ + AExtension *ret = 0; + AExtensionInterface *iface = 0; +// QString extension = key; + + if ( !instance ) instance = new AExtensionFactoryPrivate(); + if ( instance->hash.contains( key ) ){ + iface = instance->hash.value( key ); + if ( iface ) ret = iface->create(); + } + if (ret) ret->setName(key); + return ret; +} + + + +QMetaObject *AExtensionFactory::metaObject( const QString &key ) +{ + QMetaObject *ret = 0; + AExtensionInterface *iface = 0; + + if ( !instance ) instance = new AExtensionFactoryPrivate(); + if ( instance->hash.contains( key ) ){ + iface = instance->hash.value( key ); + if ( iface ) ret = iface->metaObject(); + } + return ret; +}; + +/*! + Returns the list of keys this factory can create styles for. + + \sa create() +*/ +QStringList AExtensionFactory::keys() +{ + if ( !instance ) instance = new AExtensionFactoryPrivate(); + return instance->extensionKeys; +} + diff --git a/src/lib/aextensionfactory.h b/src/lib/aextensionfactory.h new file mode 100644 index 0000000..1c742bd --- /dev/null +++ b/src/lib/aextensionfactory.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** $Id: aextensionfactory.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** ... +** +** Created : 20060209 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTENSIONFACTORY_H +#define AEXTENSIONFACTORY_H + +#include "QString" +#include "QStringList" +#include "aextension.h" + +/*! + * \en + * \brief The AExtensionFactory class creates AExtension objects. + * + * The style factory creates a AExtension object for a given key with + * AExtensionFactory::create(key). + * + * The styles are either built-in or dynamically loaded from a style + * plugin (see \l AExtensionPlugin). + * + * AExtensionFactory::keys() returns a list of valid keys, typically + * including "XXXX". + * \_en + * \ru + * \brief Опеределяет интерфейс для создания объектов класса AExtension + * + * + * \_ru + */ + +class AExtensionFactory +{ +public: + static QStringList keys(); + static AExtension *create( const QString &key ); + static QMetaObject *metaObject( const QString &key ); +}; + +#endif //AEXTENSIONFACTORY_H diff --git a/src/lib/aextensioninterface_p.h b/src/lib/aextensioninterface_p.h new file mode 100644 index 0000000..1842fe0 --- /dev/null +++ b/src/lib/aextensioninterface_p.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** $Id: aextensioninterface_p.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Definition of AExtensionInterface class +** +** Created : 20060209 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTENSIONINTERFACE_H +#define AEXTENSIONINTERFACE_H + +#include +#ifndef QT_H +#include +#endif // QT_H + +#ifndef QT_NO_COMPONENT + +// {EDDD5AD8-DF3C-400c-A711-163B72FE5F61} +#ifndef IID_AExtensionFactory +#define IID_AExtensionFactory QUuid(0xeddd5ad8, 0xdf3c, 0x400c, 0xa7, 0x11, 0x16, 0x3b, 0x72, 0xfe, 0x5f, 0x61) +#endif + +class AExtension; + +struct ANANAS_EXPORT AExtensionFactoryInterface : public QFeatureListInterface +{ + virtual AExtension* create( const QString& name ) = 0; +}; + +#endif //QT_NO_COMPONENT +#endif // AEXTENSIONINTERFACE_P_H diff --git a/src/lib/aextensionplugin.cpp b/src/lib/aextensionplugin.cpp new file mode 100644 index 0000000..f204511 --- /dev/null +++ b/src/lib/aextensionplugin.cpp @@ -0,0 +1,126 @@ +/**************************************************************************** +** $Id: aextensionplugin.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension plugin class implementation file of +** +** Created : 20060209 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "aextensionplugin.h" + +//#ifndef QT_NO_COMPONENT + +//#include "aextensioninterface_p.h" + +/*! + \fn QStringList AExtensionPlugin::keys() const + + Returns the list of extensions (keys) this plugin supports. + + These keys are usually the class names of the custom extension that + are implemented in the plugin. + + \sa create() +*/ + +/*! + \fn AExtension* AExtensionPlugin::create( const QString& key ) + + Creates and returns a AExtension object for the driver key \a key. + The driver key is usually the class name of the required driver. + + \sa keys() +*/ +/* +class AExtensionPluginPrivate : public AExtensionFactoryInterface +{ +public: + AExtensionPluginPrivate( AExtensionPluginBase *p ) + : plugin( p ) + { + } + virtual ~AExtensionPluginPrivate(); + + QRESULT queryInterface( const QUuid &iid, QUnknownInterface **iface ); + Q_REFCOUNT; + + QStringList featureList() const; + AExtension *create( const QString &key ); + +private: + AExtensionPluginBase *plugin; +}; + +AExtensionPluginPrivate::~AExtensionPluginPrivate() +{ + delete plugin; +} + +QRESULT AExtensionPluginPrivate::queryInterface( const QUuid &iid, QUnknownInterface **iface ) +{ + *iface = 0; + + if ( iid == IID_QUnknown ) + *iface = this; + else if ( iid == IID_QFeatureList ) + *iface = this; + else if ( iid == IID_AExtensionFactory ) + *iface = this; + else + return QE_NOINTERFACE; + + (*iface)->addRef(); + return QS_OK; +} + +QStringList AExtensionPluginPrivate::featureList() const +{ + return plugin->keys(); +} + +AExtension *AExtensionPluginPrivate::create( const QString &key ) +{ + return plugin->create( key ); +} +*/ +/*! + Constructs a Ananas extension plugin. This is invoked automatically by + the \c Q_EXPORT_PLUGIN macro. +*/ + +AExtensionPluginBase::AExtensionPluginBase() + :QObject()// QGPlugin( d = new AExtensionPluginPrivate( this ) ) +{ +} + +/*! + Destroys the Ananas extension plugin. + + You never have to call this explicitly. Qt destroys a plugin + automatically when it is no longer used. +*/ +AExtensionPluginBase::~AExtensionPluginBase() +{ + // don't delete d, as this is deleted by d +} + diff --git a/src/lib/aextensionplugin.h b/src/lib/aextensionplugin.h new file mode 100644 index 0000000..a7dcd04 --- /dev/null +++ b/src/lib/aextensionplugin.h @@ -0,0 +1,139 @@ +/**************************************************************************** +** $Id: aextensionplugin.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Extension plugin object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AEXTENSIONPLUGIN_H +#define AEXTENSIONPLUGIN_H + +#include +//#ifndef QT_H +//#include "qgplugin.h" +//#include "qstringlist.h" +//#endif // QT_H + +#include "ananasglobal.h" +#include +#include + +class AExtension; +//class AExtensionPluginPrivate; + +//#define A_EXPORT_PLUGIN(pluginobjectname) typedef AExtensionPlugin pluginobjectname##Plugin; Q_EXPORT_PLUGIN(pluginobjectname) +#define A_EXPORT_PLUGIN(pluginobjectname) Q_EXPORT_PLUGIN2(pluginobjectname,pluginobjectname) + +class AExtensionInterface +{ +public: + virtual ~AExtensionInterface(){}; + virtual QString key() const = 0; + virtual AExtension *create() = 0; + virtual QMetaObject *metaObject() = 0; +}; + +Q_DECLARE_INTERFACE(AExtensionInterface,"Ananas.Extensions.AExtensionInterface/1.0") + + +/*! + * \en + * \brief Class for work with extensions + * \_en + * \ru + * \brief Базовый класс в иерархии классов для работы с расширениями. Наследует QGPlugin. + * \_ru + */ +class ANANAS_EXPORT AExtensionPluginBase : public QObject, public AExtensionInterface +{ + Q_OBJECT + Q_INTERFACES(AExtensionInterface) +public: + + AExtensionPluginBase(); + ~AExtensionPluginBase(); + virtual QString key() const = 0; + virtual AExtension *create() = 0; + virtual QMetaObject *metaObject() = 0; + +//private: +// AExtensionPluginPrivate *d; +}; + +/*! + * \en + * \brief The AExtensionPlugin class provides an abstract base for custom AExtension plugins. + * + * \ingroup plugins + * \mainclass + * + * The Ananas Extension plugin is a simple plugin interface that makes it + * easy to create your own Ananas extension plugins that can be loaded + * dynamically by Ananas and Qt. + * + * Writing a Ananas extension plugin is achieved by subclassing this base class, + * reimplementing the pure virtual functions keys() and create(), and + * exporting the class with the \c Q_EXPORT_PLUGIN macro. See the + * Ananas extensions plugins that come with Ananas for example + * implementations (in the + * \c{extensions} subdirectory of the source + * distribution). Read the \link plugins-howto.html plugins + * documentation\endlink for more information on plugins. + * \_en + * \ru + * \brief Базовый класс для создания собственных расширений. Наследует AExtensionPluginBase + * \_ru + */ +template +class ANANAS_EXPORT AExtensionPlugin : public AExtensionPluginBase +{ +// Q_OBJECT +public: + + AExtensionPlugin() + { + type o; + extName = o.name(); + }; + ~AExtensionPlugin(){}; + QString key() const + { + return extName; + }; + AExtension *create() + { + return new type(); + }; + QMetaObject *metaObject() + { + return (QMetaObject *) &type::staticMetaObject; + }; + +private: + QString extName; +}; + +#endif //AEXTENSIONPLUGIN_H diff --git a/src/lib/afilter.cpp b/src/lib/afilter.cpp new file mode 100644 index 0000000..5744712 --- /dev/null +++ b/src/lib/afilter.cpp @@ -0,0 +1,219 @@ +/**************************************************************************** +** $Id: afilter.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Filter implementation file of +** Ananas application library +** +** Created : 20070315 +** +** Copyright (C) 2007 Ananas Project. +** Copyright (C) 2007 Grigory Panov , Moscow +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "afilter.h" +#include +//Added by qt3to4: +#include + +/*! + * \~english + * Constructor + * \~russian + * Конструктор. + * \~ + */ +aFilter::aFilter() +{ +} + +/*! + * \~english + * Destructor + * \~russian + * Деструктор. + * \~ + */ +aFilter::~aFilter() +{ +} + +/*! + * \~english + * Dump filter conditions to stdout + * \~russian + * Выводит содержимое фильтра на stdout. + * \~ + */ +void +aFilter::Dump() const +{ + printf("%s\n", toString().ascii()); +} + +/*! + * \~english + * Converts filter into its sql retpesentation. \a removeFirst give you ability to remove first AND or OR operator + * \~russian + * Переводит фильтр в его sql представление. Параметр \a removeFirst отвечает за удаление ведущего оператора AND или OR + * \~ + */ +QString +aFilter::toString(bool removeFirst) const +{ + QString str = QString::null; + Q3ValueList::const_iterator it; + for ( it = conditions.begin(); it != conditions.end(); ++it ) + { + filterCondition flt = (*it); + if(it != conditions.begin() && removeFirst) + { + str+= flt.AndOr + " "; + } + str+= flt.fname + " "; + str+= flt.operation + " "; + str+= flt.value + " "; + } + return str; +} + + +void +aFilter::Add(const QString& fname, const Q_INT64 value, OperationEnum op, bool AndOp, bool replace) +{ + AddHelper(fname, QString::number(value), op, AndOp, replace); +} +void +aFilter::Add(const QString& fname, const int value, OperationEnum op, bool AndOp, bool replace) +{ + AddHelper(fname, QString::number(value), op, AndOp, replace); +} +void +aFilter::Add(const QString& fname, const double value, OperationEnum op, bool AndOp, bool replace) +{ + AddHelper(fname, QString::number(value), op, AndOp, replace); +} +/* +void +aFilter::Add(const QString& fname, bool value, OperationEnum op, bool AndOp, bool replace) +{ + AddHelper(fname, value?"true":"false", op, AndOp, replace); +} +*/ +void +aFilter::Add(const QString& fname, const QString& value, OperationEnum op, bool AndOp, bool replace) +{ + // need escape string + AddHelper(fname, Escape(value), op, AndOp, replace); +} + +void +aFilter::Add(const QString& fname, const char* value, OperationEnum op, bool AndOp, bool replace) +{ + // need escape string + AddHelper(fname, Escape(QString(value)), op, AndOp, replace); +} + +void +aFilter::Add(const QString& fname, const QDateTime& value, OperationEnum op, bool AndOp, bool replace) +{ + AddHelper(fname, Escape(value.toString(Qt::ISODate)), op, AndOp, replace); +} + +void +aFilter::Add(const QString& fname, const QDate& value, OperationEnum op, bool AndOp, bool replace) +{ + AddHelper(fname, Escape(value.toString(Qt::ISODate)), op, AndOp, replace); +} + + +QString +aFilter::Escape(const QString& val) +{ + QString res = val; + res.replace("\"","\"\""); + res.replace("'","''"); + res.insert(0,"\""); + res.append("\""); + //printf("%s\n",res.ascii()); + return res; +} + +void +aFilter::AddHelper(const QString& fname, const QString& value, OperationEnum op, bool AndOp, bool replace) +{ + filterCondition flt; + flt.AndOr = AndOp?"AND":"OR"; + flt.fname = fname; + flt.value = value; + switch(op) + { + case OperationEnumEquals: + flt.operation = "="; + break; + case OperationEnumNotEquals: + flt.operation = "<>"; + break; + case OperationEnumGreaterThen: + flt.operation = ">"; + break; + case OperationEnumLessThen: + flt.operation = "<"; + break; + case OperationEnumGreaterOrEquals: + flt.operation = ">="; + break; + case OperationEnumLessOrEquals: + flt.operation = "<="; + break; + case OperationEnumLike: + flt.operation = "like"; + break; + default: + printf("boo! operation not exists!"); + break; + + } + if(replace) // replace all entries, append to end list of conditions, if nothing found + { + Q3ValueList::iterator it; + bool isFound = false; + for ( it = conditions.begin(); it != conditions.end(); ++it ) + { + if((*it).fname == fname) + { + (*it) = flt; + isFound = true; + } + } + if(!isFound) conditions.append(flt); + } + else + { + conditions.append(flt); + } + +} + +void +aFilter::Clear() +{ + conditions.clear(); +} diff --git a/src/lib/afilter.h b/src/lib/afilter.h new file mode 100644 index 0000000..7d24a89 --- /dev/null +++ b/src/lib/afilter.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** $Id: afilter.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Filter declaration file of +** Ananas application library +** +** Created : 20070315 +** +** Copyright (C) 2007 Ananas Project. +** Copyright (C) 2007 Grigory Panov , Moscow +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef afilter_h +#define afilter_h + +#include +#include +#include +#include "ananasglobal.h" + +ANANAS_EXPORT enum OperationEnum{ + OperationEnumEquals, + OperationEnumNotEquals, + OperationEnumGreaterThen, + OperationEnumLessThen, + OperationEnumGreaterOrEquals, + OperationEnumLessOrEquals, + OperationEnumLike + }; + +class ANANAS_EXPORT aFilter +{ +public: + aFilter(); + virtual ~aFilter(); + void Dump() const; + + void Add(const QString& fname, const char* value, OperationEnum op, bool AndOp = true, bool replace = true); + void Add(const QString& fname, const Q_INT64 value, OperationEnum op, bool AndOp = true, bool replace = true); + void Add(const QString& fname, const int value, OperationEnum op, bool AndOp = true, bool replace = true); + void Add(const QString& fname, const double value, OperationEnum op, bool AndOp = true, bool replace = true); + //void Add(const QString& fname, bool value, OperationEnum op, bool AndOp = true, bool replace = true); + void Add(const QString& fname, const QString& value, OperationEnum op, bool AndOp = true, bool replace = true); + void Add(const QString& fname, const QDateTime& value, OperationEnum op, bool AndOp = true, bool replace = true); + void Add(const QString& fname, const QDate& value, OperationEnum op, bool AndOp = true, bool replace = true); + QString toString(bool removeFirst = true) const; + void Clear(); +protected: + void AddHelper(const QString& fname, const QString& value, OperationEnum op, bool And, bool replace); + QString Escape(const QString& val); +private: + struct filterCondition + { + QString fname; + QString value; + QString operation; + QString AndOr; + }f; + //typedef struct filterCondition FilterCondition; + Q3ValueList conditions; +}; + +#endif diff --git a/src/lib/alog.cpp b/src/lib/alog.cpp new file mode 100644 index 0000000..07300a2 --- /dev/null +++ b/src/lib/alog.cpp @@ -0,0 +1,169 @@ +/**************************************************************************** +** $Id: alog.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Log functions source file of +** Ananas application library +** +** Created : 20060402 +** +** Copyright (C) 2006 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "alog.h" +#include +#include +#include +#include "aservice.h" + + +QString aLog::logName = ""; +int aLog::logLevel = aLog::Debug; +QFile aLog::f; +bool aLog::msg_was_show = false; +//const int aLog::Error = 0; +//const int aLog::Info = 1; +//const int aLog::Debug = 2; + + +/*! + *\~english + * Writes text to log, if /a status less init status. + * \param status - message status ( aLog::Error, aLog::Info, aLog::Debug ) + * \param text - message + *\~russian + * Пишет текст в лог, если статус сообщения меньше установленного при инициализации. К тексту добавляется дата и статус. + * \param status - статус сообщения ( aLog::Error, aLog::Info, aLog::Debug ). + * \param text - сообщение + *\~ +*/ +void +aLog::print( int status, + const QString &text) +{ + QString st; +// switch(status) +// { +// case aLog::Error: + if(status == aLog::Error) st = "ERROR"; +// break; +// case aLog::Info: + else if(status == aLog::Info) st = "INFO"; +// break; +// default: + else st = "DEBUG"; +// break; +// } + if(status<=logLevel) + { + QString endline; + +#ifdef Q_OS_WIN32 + endline = "\r\n"; +#else + endline = "\n"; +#endif + const QString toWrite = QString("%1 %2 %3%4")\ + .arg(QDateTime::currentDateTime().toString(Qt::ISODate).replace('T',' '))\ + .arg(st)\ + .arg(text)\ + .arg(endline); + aLog::printr(toWrite); + } +} + +/*! + *\~english + * Writes raw text to log. + *\~russian + * Пишет текст в лог без изменения. + *\~ + * \param text - \~english text \~russian текст \~ +*/ +void +aLog::printr( const QString &toWrite) +{ + if(aLog::f.handle () !=-1) + { + aLog::f.writeBlock((const char*)toWrite.local8Bit(),strlen((const char*)toWrite.local8Bit())); + aLog::f.flush(); + } + else + { + if(!aLog::msg_was_show) + { + printf("Log system not initialized!\n"); + aLog::msg_was_show = true; + } + } +} + + +/*! + *\~english + * Inits log system. + *\~russian + * Инициализирует систему логирования. Выполняется один раз при запуске програмы, если параметры не указаны, осуществляется попытка прочитать из из конфигурационного файла. Если это не удается, используются параметры по умолчанию. + *\~ + * \param log_name - \~english logfile name. Default ~/.ananas.ananas.log \~russian Путь к логу. Значение по умолчанию ~/.ananas/ananas.log \~ + * \param status - \~english showing status \~russian статус скрытия сообщений. Все сообщения, имеющие больший статус, не попадут в лог ( ERROR= 0, INFO= 1, DEBUG= 2 ). Значение по умолчанию DEBUG \~ +*/ +void +aLog::init(const QString &log_name, int show_up) +{ + bool ok; + QString log; + if(log_name =="" || logName==QString::null) + { + log = aService::readConfigVariable("log", &ok); + if(!ok) log = QDir::homeDirPath()+"/.ananas/ananas.log"; + } + else + { + log = log_name; + } + + aLog::logLevel = show_up; + const QString logLev = aService::readConfigVariable("logLevel", &ok); + + if(logLev=="ERROR") aLog::logLevel = aLog::Error; + if(logLev=="INFO") aLog::logLevel = aLog::Info; + if(logLev=="DEBUG") aLog::logLevel = aLog::Debug; + + aLog::logName = log; + + if (aLog::f.isOpen()) f.close(); + aLog::f.setName(getLogName()); + aLog::f.open( IO_WriteOnly | IO_Append ); + +} + +QString +aLog::getLogName() +{ + return aLog::logName; +} + +void +aLog::close() +{ + aLog::f.close(); +} + diff --git a/src/lib/alog.h b/src/lib/alog.h new file mode 100644 index 0000000..4e59725 --- /dev/null +++ b/src/lib/alog.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** $Id: alog.h,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Log functions header file of +** Ananas application library +** +** Created : 20051024 +** +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ALOG_H +#define ALOG_H + +//#include "ananas.h" +#include "ananasglobal.h" +#include +#include + + +// for bcc32.exe compatibility +// in file wingdi.h +// #define ERROR 0 + +//#ifdef Q_OS_WIN32 +//#define ERROR IRROR +//#endif + +/*! + * \~english + * Class contain static functions for log system + * \~russian + * \brief Класс содержит статические функции для записи сообщений в лог файл Ананаса. + * \~ +*/ +class ANANAS_EXPORT aLog +{ + public: + enum MessageType { Error, Info, Debug }; +// enum status { + /*! + * \~english Error + * \~russian Сообщение об ошибке + * \~ + */ +/* +#ifdef Q_OS_WIN32 + static const int IRROR;//, +#else + static const int ERROR; +#endif +*/ /*! + * \~english Info + * \~russian Информационное сообщение + * \~ + */ +// static const int INFO;//, + /*! + * \~english Info + * \~russian Отладочное сообщение + * \~ + */ +// static const int DEBUG;// }; + + static void print( int status, const QString &text); + static void printr( const QString &text); + static void init( const QString &logname="", int loglevel=0); + static void close(); + static QString getLogName(); + + + private: + aLog(); + static QString logName; + static int logLevel; + static QFile f; + static bool msg_was_show; + +}; +#endif// ALOG_H diff --git a/src/lib/amenubar.cpp b/src/lib/amenubar.cpp new file mode 100644 index 0000000..2c77c7d --- /dev/null +++ b/src/lib/amenubar.cpp @@ -0,0 +1,183 @@ +/**************************************************************************** +** $Id: amenubar.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Code file of the Ananas Menu bar of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/****************************************************************** + ******************************************************************/ + +#include "amenubar.h" +//Added by qt3to4: +#include +#include + + +AMenuBar::AMenuBar( QWidget* parent , const char* name ) + :QMenuBar( parent, name ) { + +} + +AMenuBar::AMenuBar( aCfg *cfg, QWidget* parent , const char* name ) +:QMenuBar( parent, name ) +{ + md = cfg; + ReadMenu( md->find( md->find( mdc_interface ), md_mainmenu) ); +} + +void +AMenuBar::ReadMenu( aCfgItem obj ) +{ + aCfgItem cobj; + Q3PopupMenu *parent; + QString text, aKey ; + long id; + + if ( !md ) + return; + cobj = md->firstChild ( obj ); + while ( !cobj.isNull() ) + { + id = md->id( cobj ); + if ( md->objClass ( cobj ) == md_submenu ) + { + parent = new Q3PopupMenu (); + insertItem( md->attr( cobj, mda_name ), parent ); + ReadMenu( parent, cobj ); + } + if ( md->objClass ( cobj ) == md_command ) + { + text = md->sText ( cobj, md_menutext ); + if ( text == "" ) text = md->attr( cobj, mda_name ); + aKey = md->sText ( cobj, md_key ); + QMenuBar::insertItem( text, this, SLOT(on_Item()), QKeySequence( aKey ), id ); + } + if ( md->objClass ( cobj ) == md_separator ) + { + insertSeparator(); + } + cobj = md->nextSibling ( cobj ); + } + +} + +void +AMenuBar::ReadMenu( Q3PopupMenu *parent, aCfgItem obj ) +{ + aCfgItem cobj, apix; + Q3PopupMenu *mparent; + QString text, aKey; + long id, pid; + QPixmap pix; + + if ( !md ) + return; + + cobj = md->firstChild ( obj ); + while ( !cobj.isNull() ) + { + id = md->id( cobj ); + if ( md->objClass ( cobj ) == md_submenu ) + { + mparent = new Q3PopupMenu (); + parent->insertItem( md->attr ( cobj, mda_name ), mparent ); + ReadMenu( mparent, cobj ); + } + if ( md->objClass ( cobj ) == md_command ) + { + text = md->sText ( cobj, md_menutext ); + if ( text == "" ) + text = md->attr( cobj, mda_name ); + aKey = md->sText ( cobj, md_key ); + pid = md->text( md->findChild( cobj, md_comaction, 0 ) ).toLong(); + apix = md->findChild( md->find( pid ), md_active_picture, 0 ); + pix.loadFromData( md->binary( apix ) ); + parent->insertItem( pix, text, this, SLOT(on_Item()), QKeySequence( aKey ), id ); + pix = 0; + } + if ( md->objClass ( cobj ) == md_separator ) + { + parent->insertSeparator(); + } + cobj = md->nextSibling ( cobj ); + } + +} + + +AMenuBar::~AMenuBar(){ +} + +int AMenuBar::insertItem ( const QString & text, Q3PopupMenu * popup, int id, int index ) { + return QMenuBar::insertItem ( text, popup, id, index); +}; + +/* +int +AMenuBar::insertItem ( const QString & text, const QObject * receiver, const char * member, const QKeySequence & accel, int id , int index ) { + return QMenuBar::insertItem( text, receiver, member, accel, id, index); +} +int +AMenuBar::insertItem ( const QPixmap & pixmap, const QObject * receiver, const char * member, const QKeySequence & accel , int id , int index ) { + return QMenuBar::insertItem ( pixmap, receiver, member, accel, id, index); +} +int AMenuBar::insertItem ( const QIconSet & icon, const QPixmap & pixmap, const QObject * receiver, const char * member, const QKeySequence & accel , int id , int index ) { + return QMenuBar::insertItem ( icon, pixmap, receiver, member, accel, id, index); +}; +int AMenuBar::insertItem ( const QString & text, int id , int index ) { + return QMenuBar::insertItem( text, id, index ); +}; +int AMenuBar::insertItem ( const QIconSet & icon, const QString & text, int id , int index ) { + return QMenuBar::insertItem ( icon, text, id, index); +}; +int AMenuBar::insertItem ( const QIconSet & icon, const QString & text, QPopupMenu * popup, int id, int index ) { + return QMenuBar::insertItem ( icon, text, popup, id, index); +}; +int AMenuBar::insertItem ( const QPixmap & pixmap, int id , int index ) { + return QMenuBar::insertItem ( pixmap, id, index); +}; +int AMenuBar::insertItem ( const QIconSet & icon, const QPixmap & pixmap, int id , int index ) { + return QMenuBar::insertItem ( icon, pixmap, id, index); +}; +int AMenuBar::insertItem ( const QPixmap & pixmap, QPopupMenu * popup, int id, int index ) { + return QMenuBar::insertItem ( pixmap, popup, id, index); +}; +int AMenuBar::insertItem ( const QIconSet & icon, const QPixmap & pixmap, QPopupMenu * popup, int id , int index ) { + return QMenuBar::insertItem ( icon, pixmap, popup, id, index); +}; +int AMenuBar::insertItem ( QWidget * widget, int id, int index ) { + return QMenuBar::insertItem ( widget, id, index); +}; +int AMenuBar::insertItem ( const QIconSet & icon, QCustomMenuItem * custom, int id , int index ) { + return QMenuBar::insertItem ( icon, custom, id, index); +}; +int AMenuBar::insertItem ( QCustomMenuItem * custom, int id , int index ) { + return QMenuBar::insertItem ( custom, id, index); +}; +int AMenuBar::insertSeparator ( int index ) { + return QMenuBar::insertSeparator ( index); +}; +*/ diff --git a/src/lib/amenubar.h b/src/lib/amenubar.h new file mode 100644 index 0000000..33e617a --- /dev/null +++ b/src/lib/amenubar.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** $Id: amenubar.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Ananas Menu bar of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/**************************************************************************** +****************************************************************************/ + +#ifndef AMENUBAR_H +#define AMENUBAR_H + +#include +//Added by qt3to4: +#include + +#include "acfg.h" + +class ANANAS_EXPORT AMenuBar : public QMenuBar +{ + Q_OBJECT + + private: + aCfg *md; + + public: + AMenuBar( QWidget* parent = 0, const char* name = 0 ); + AMenuBar( aCfg *cfg, QWidget* parent = 0, const char* name = 0 ); + ~AMenuBar(); + + void ReadMenu( aCfgItem obj ); + void ReadMenu( Q3PopupMenu *parent, aCfgItem obj ); + + public slots: + void on_Item(){}; + + int insertItem ( const QString & text, Q3PopupMenu * popup, int id = -1, int index = -1 ); +/* + int insertItem ( const QString & text, const QObject * receiver, const char * member, const QKeySequence & accel = 0, int id = -1, int index = -1 ); + int insertItem ( const QPixmap & pixmap, const QObject * receiver, const char * member, const QKeySequence & accel = 0, int id = -1, int index = -1 ); + int insertItem ( const QIconSet & icon, const QPixmap & pixmap, const QObject * receiver, const char * member, const QKeySequence & accel = 0, int id = -1, int index = -1 ); + int insertItem ( const QString & text, int id = -1, int index = -1 ); + int insertItem ( const QIconSet & icon, const QString & text, int id = -1, int index = -1 ); + int insertItem ( const QIconSet & icon, const QString & text, QPopupMenu * popup, int id = -1, int index = -1 ); + int insertItem ( const QPixmap & pixmap, int id = -1, int index = -1 ); + int insertItem ( const QIconSet & icon, const QPixmap & pixmap, int id = -1, int index = -1 ); + int insertItem ( const QPixmap & pixmap, QPopupMenu * popup, int id = -1, int index = -1 ); + int insertItem ( const QIconSet & icon, const QPixmap & pixmap, QPopupMenu * popup, int id = -1, int index = -1 ); + int insertItem ( QWidget * widget, int id = -1, int index = -1 ); + int insertItem ( const QIconSet & icon, QCustomMenuItem * custom, int id = -1, int index = -1 ); + int insertItem ( QCustomMenuItem * custom, int id = -1, int index = -1 ); + int insertSeparator ( int index = -1 ); +*/ +private: + Q3IntDict cfgItems; +}; + + +#endif // AMENUBAR_H diff --git a/src/lib/amoney.cpp b/src/lib/amoney.cpp new file mode 100644 index 0000000..ddc94fa --- /dev/null +++ b/src/lib/amoney.cpp @@ -0,0 +1,604 @@ +/**************************************************************************** +** $Id: amoney.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Service functions header file of +** Ananas application library +** +** Copyright (C) 2007 Andrey Paskal. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** +**********************************************************************/ + +#include "amoney.h" +#include + + +/** + * \ru + * \brief Конструктор + * \_ru + */ +AMoney::AMoney(){ + this->amount = 0.0; + this->degree = new Degree(); + this->currency = new Currency("RUR"); +} + + +/** + * \ru + * \brief Конструктор + * \param initialValue - первоначальное количество денег + * \param currency - тип валюты. По умолчанию "RUR". Допустимые значения: "RUR" - рубль, "EUR" - евро, "USD" - доллары США + * \_ru + */ +AMoney::AMoney(double initialValue, QString currency){ + this->amount = initialValue; + this->degree = new Degree(); + this->currency = new Currency( currency ); +} + + +/** + * \ru + * \brief Конвертор в строку + * Периводит числовое значение к значению типа QString. Для преобразования числа в текст (пропись) + * используйте метод toText() + * \_ru + */ +QString +AMoney::toString(){ + return QString::number( this->amount ); +} + + +/** + * \ru + * \brief Сравнивает два экземпляра объектов данного класса. + * + * \_ru + */ +bool +AMoney::equal( AMoney &money){ + return this->amount == money.getAmount(); +} + + +/** + * \ru + * \brief Возвращает количество денег. + * + * \_ru + */ +double +AMoney::getAmount() { + return this->amount; +} + +/** + * \ru + * \brief Задает количество денег. + * Валюта не меняется. Если были рубли, то и остаються рубли. + * \_ru + */ +void +AMoney::setAmount(double val) { + this->amount = val; +} + +/** + * \ru + * \brief Задает количество денег в требуемой валюте. + * \param cur - валюта. Допустимые значения смотри в описании конструктора. + * \_ru + */ +void +AMoney::setAmount(double val, QString cur) { + this->amount = val; + this->currency->setId( cur ); +} + +/** + * \ru + * \brief Возвращает валюту хранимой суммы. + * Возможные значения смотри в описании конструктора. + * \_ru + */ +QString +AMoney::getCurrency(){ + return this->currency->getId(); +} + +/** + * \ru + * \brief Задает валюту хранимой суммы. + * Возможные значения смотри в описании конструктора. + * \_ru + */ +void +AMoney::setCurrency(QString cur) { + this->currency->setId( cur ); +} + +/** + * \ru + * \brief Конвертор суммы в пропись. Публичный интерфейс. + * Возвращает значение хранимой суммы прописью с учетом валюты. + * Например, "Сто долларов США 20 центов" + * \_ru + */ +QString +AMoney::toText(){ + + uint integerKopeiki; + qulonglong integerRubli; + + integerRubli = QVariant( this->amount).toULongLong(); + + double decimal = this->amount-integerRubli; + +#ifdef Q_OS_UNIX + integerKopeiki = round( decimal*100.0 ); +#else + integerKopeiki = decimal * 100.0; +#endif + + QString rubliText; + if ( integerRubli > 0 ) { + rubliText = valueToText( integerRubli ); + } else { + rubliText = "Ноль"; + } + + QString kopeikiText; + if ( integerKopeiki > 0 ) { + kopeikiText = decimalValueToText( integerKopeiki ); + } else { + kopeikiText = "ноль"; + } + return this->firstUp( + rubliText + " " + this->integerCurrencyName( rubliText ) + " " + + QString::number( integerKopeiki ) + " " + this->decimalCurrencyName( kopeikiText ) + ); +} + + +/** + * \ru + * \brief Собирает строку из текстовых троек, вставляя между ними слова "сотен", "тысяч", "миллионов", ... + * + * Внутренний метод. Не предназнвчен для внешнего использования. + * \param value - числовое значение целого типа, которое необходимо перевести в пропись. + * \return возвращает пропись для заданного числа без валюты + * \_ru + */ +QString +AMoney::valueToText( qulonglong value ){ + QString sValue = QString::number( value); + QString tripleText; + QString coupleSingleText; + QString degreeText; + QString result; + this->degree->setValue(0); + + while ( sValue.length() >= 3 ) { + if ( !sValue.endsWith("000")) { + tripleText = tripleToText( sValue.right(3) ); + result = tripleText + this->degreeText( tripleText, this->degree->getValue() ) + result ; + } + sValue = sValue.left( sValue.length() - 3); + this->degree->setValue( this->degree->getValue() +1); + + } + if (sValue.length() > 0) { + if (sValue.length() == 2) { + coupleSingleText = coupleToText( sValue ); + } else { + coupleSingleText = singleToText( sValue ); + } + degreeText = this->degreeText( coupleSingleText, this->degree->getValue() ); + if ( result != "" && (coupleSingleText + degreeText) != "") { + result = coupleSingleText + degreeText + " " + result ; + } else { + result = coupleSingleText + degreeText + result ; + } + } + return result; +} + + +/** + * \ru + * \brief Вспомогательная функция для копеек, центов.... + * + * Используется для перевода цифры в пропись для дробной части суммы. + * Эта функция необходима, так как дробная часть может имерь род отличный от целой части суммы. + * Например, рубль - муж.род, копейка - жен.род. + * + * \_ru + */ +QString +AMoney::decimalValueToText( qulonglong value ){ + QString currencyId = this->currency->getId(); + this->currency->setId( "d"+ currencyId); + QString result = valueToText( value ); + this->currency->setId( currencyId ); + return result; +} + +/** + * \ru + * \brief Преобразует однозначное число в текст. + * + * Учитывается род Муж. или Жен. преобразуемого числа + * \param string - строка, содержащая один символ [0-9] + * \return возвращает "один" или "одна" или "два" или "две" или "три" ..."девять". + * + * \_ru + */ +QString +AMoney::singleToText( QString string ) { + + bool male; + + if ( this->degree->getValue() > 0 ) { + male = this->degree->isMale(); + } else { + male = this->currency->isMale(); + } + + if ( male ) { + if (string == "1") return "один"; + if (string == "2") return "два"; + } else { + if (string == "1") return "одна"; + if (string == "2") return "две"; + } + if (string == "0") return ""; + if (string == "3") return "три"; + if (string == "4") return "четыре"; + if (string == "5") return "пять"; + if (string == "6") return "шесть"; + if (string == "7") return "семь"; + if (string == "8") return "восемь"; + if (string == "9") return "девять"; + + return "undefinded"; +} + +/** + * \ru + * \brief Преобразует двузначное число в текст. + * + * \param string - строка, содержащая два символа [0-9][0-9] + * \return возвращает пропись двузначного числа. + * + * \_ru + */ +QString +AMoney::coupleToText( QString string ) { + + QString result = ""; + + if (string.left(1) == "0") return singleToText( string.right(1) ); + + if (string == "10") return "десять"; + if (string == "11") return "одинадцать"; + if (string == "12") return "двенадцать"; + if (string == "13") return "тринадцать"; + if (string == "14") return "четырнадцать"; + if (string == "15") return "пятнадцать"; + if (string == "16") return "шестьнадцать"; + if (string == "17") return "семьнадцать"; + if (string == "18") return "восемьнадцать"; + if (string == "19") return "девятьнадцать"; + + if (string.left(1) == "2" ) result = "двадцать"; + if (string.left(1) == "3" ) result = "тридцать"; + if (string.left(1) == "4" ) result = "сорок"; + if (string.left(1) == "5" ) result = "пятьдесят"; + if (string.left(1) == "6" ) result = "шестьдесят"; + if (string.left(1) == "7" ) result = "семьдесят"; + if (string.left(1) == "8" ) result = "восемьдесят"; + if (string.left(1) == "9" ) result = "девяносто"; + + + if (string.right(1) != "0") { + result += " " + singleToText( string.right(1) ); + } + + return result; +} + +/** + * \ru + * \brief Преобразует трехначное число в текст. + * + * \param string - строка, содержащая три символа [0-9][0-9][0-9] + * \return возвращает пропись трехзначного числа. + * + * \_ru + */ +QString +AMoney::tripleToText( QString string ) { + QString result = ""; + + if ( string.left(1) == "0" ) return coupleToText( string.right(2) ); + + if ( string.left(1) == "1" ) result = "сто"; + if ( string.left(1) == "2" ) result = "двести"; + if ( string.left(1) == "3" ) result = "триста"; + if ( string.left(1) == "4" ) result = "четыреста"; + if ( string.left(1) == "5" ) result = "пятьсот"; + if ( string.left(1) == "6" ) result = "шестьсот"; + if ( string.left(1) == "7" ) result = "семьсот"; + if ( string.left(1) == "8" ) result = "восемьсот"; + if ( string.left(1) == "9" ) result = "девятьсот"; + + return result + coupleToText( string.right(2) ); +} + +/** + * \ru + * \brief Возвращает слово "тысячи", "миллионы", "миллиарды" в нужной численности. + * \param string - пропись числа, для которого нужно вернуть название порядка + * \param degreeLevel - значение порядка. 1 - тысячи, 2 - миллионы, 3 - миллиарды, 4 - триллионы. + * \_ru + */ +QString +AMoney::degreeText( QString string, int degreeLevel) { + QString result = ""; + + if ( degreeLevel < 1 ) return result; + + if (degreeLevel == 1) { + if ( string.endsWith("одна") ) { + result = " тысяча"; + } else if ( string.endsWith("две") || string.endsWith("три") || string.endsWith("четыре") ) { + result = " тысячи"; + } else { + result = " тысяч"; + } + } else if (degreeLevel == 2) { + if ( string.endsWith("один") ) { + result = " миллион"; + } else if ( string.endsWith("два") || string.endsWith("три") || string.endsWith("четыре") ) { + result = " миллиона"; + } else { + result = " миллионов"; + } + } else if (degreeLevel == 3) { + if ( string.endsWith("один") ) { + result = " миллиард"; + } else if ( string.endsWith("два") || string.endsWith("три") || string.endsWith("четыре") ) { + result = " миллиарда"; + } else { + result = " миллиардов"; + } + } else if (degreeLevel == 4) { + if ( string.endsWith("один") ) { + result = " триллион"; + } else if ( string.endsWith("два") || string.endsWith("три") || string.endsWith("четыре") ) { + result = " триллиона"; + } else { + result = " триллионов"; + } + } + + return result; +} + +/** + * \ru + * \brief Возвращает прописью название валюты для целой части числа. + * \param string - пропись числа, для которого нужно вернуть название валюты прописью. + * + * \_ru + */ +QString +AMoney::integerCurrencyName( QString string ){ + QString result = ""; + + if (string == "") return ""; + + if ( this->currency->is("USD") ) { + if ( string.endsWith("один") ) { + result = "доллар США"; + } else if ( string.endsWith("два") || string.endsWith("три") || string.endsWith("четыре") ) { + result = "доллара США"; + } else { + result = "долларов США"; + } + } else if ( this->currency->is("EUR") ) { + result = "евро"; + } else { + if ( string.endsWith("один") ) { + result = "рубль"; + } else if ( string.endsWith("два") || string.endsWith("три") || string.endsWith("четыре") ) { + result = "рубля"; + } else { + result = "рублей"; + } + } + + return result; +} + +/** + * \ru + * \brief Возвращает прописью название валюты для дробной части числа. + * \param string - пропись числа, для которого нужно вернуть название валюты прописью. + * + * \_ru + */ +QString +AMoney::decimalCurrencyName(QString string ){ + QString result = ""; + + if (string == "") return ""; + + if ( this->currency->is("USD") || this->currency->is("EUR") ) { + if ( string.endsWith("один") ) { + result = "цент"; + } else if ( string.endsWith("два") || string.endsWith("три") || string.endsWith("четыре") ) { + result = "цента"; + } else { + result = "центов"; + } + } else { + if ( string.endsWith("одна") ) { + result = "копейка"; + } else if ( string.endsWith("две") || string.endsWith("три") || string.endsWith("четыре") ) { + result = "копейки"; + } else { + result = "копеек"; + } + } + + return result; +} + +/** + * \ru + * \brief Поднимает регистр первой буквы слова, если первой идет одна из букв: о,д,т,ч,п,ш,с,в. + * \param str - строка, первый символ которой нужно перевести в верхний регистр. + * \_ru + */ +QString +AMoney::firstUp( QString str) { + + return str.left(1).upper() + str.right( str.length() - 1); +} + +/** + * \ru + * \brief Конструктор + * \param - значение порядка. 0 - сотни (по умолчанию), 1 - тысячи, 2 - миллионы, 3 - миллиарды, 4 - триллионы. + * \_ru + */ +Degree::Degree( int val) { + this->setValue( val ); +} + + +/** + * \ru + * \brief Возвращает значение порядок. + * Возможные значения смотри в описании конструктора. + * \_ru + */ +int +Degree::getValue() { + return this->value; +} + +/** + * \ru + * \brief Задает значение порядка. + * Допустимые значения смотри в описании конструктора. + * \_ru + */ +void +Degree::setValue( int val ) { + this->value = val; + if (this->value == 1) { + this->male = false; + } else { + this->male = true; + } +} + +/** + * \ru + * \brief Возвращает true, если текущий порядок имеет мужской род. + * + * Например, миллион, миллиард. + * Возвращает false, если текущий порядок имеет женский род + * Например, тысяча + * \_ru + */ +bool +Degree::isMale() { + return this->male; +} + + +/** + * \ru + * \brief Конструктор + * \param - Обозначение валюты. + * Допустимые значения параметра: + * RUR - русский рубль, значение по умолчанию + * dRUR - копейка + * USD - доллар США + * dUSD - цент + * EUR - евро + * dEUR = dUSD + * \_ru + */ +Currency::Currency( QString newId) { + setId( newId ); +} + + +/** + * \ru + * \brief Возвращает истину, если текущая валюта равна значению, указанному в рараметре. + * Допустимые значения параметра смотри в описании конструктора. + * \_ru + */ +bool +Currency::is( QString str ){ + return this->id == str; +} + +/** + * \ru + * \brief Возвращает истину, если текущая валюта имеет мужской род. + * Например, копейка. + * \_ru + */ +bool +Currency::isMale( ){ + return this->male; +} + + +/** + * \ru + * \brief Возвращает символьное обозначение, идентификатор валюты. + * Допустимые значения смотри в описании конструктора. + * \_ru + */ +QString +Currency::getId() { + return this->id; +} + +/** + * \ru + * \brief Установка типа валюты. + * Допустимые значения смотри в описании конструктора. + * \_ru + */ +void +Currency::setId(QString newId) { + + if ( newId == "dRUR") { + this->male = false; + } else { + this->id = newId; + this->male = true; + } +} diff --git a/src/lib/amoney.h b/src/lib/amoney.h new file mode 100644 index 0000000..fd96b1f --- /dev/null +++ b/src/lib/amoney.h @@ -0,0 +1,110 @@ +/**************************************************************************** +** $Id: amoney.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Service functions header file of +** Ananas application library +** +** Copyright (C) 2007 Andrey Paskal. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** +**********************************************************************/ +#ifndef AMONEY_H_ +#define AMONEY_H_ +#include "ananas.h" +#include "qstring.h" + +class Degree; +class Currency; + +/** + * \ru + * \brief Класс для хранения денежных значений в различной валюте и получения их прописного представления. + * \_ru + */ +class ANANAS_EXPORT AMoney{ + public: + AMoney(); + AMoney( double amount, QString currency = "RUR"); + + double getAmount(); + void setAmount( double ); + void setAmount( double, QString currency); + QString getCurrency(); + void setCurrency( QString ); + QString toString(); + QString toText(); + bool equal( AMoney &sum ); + + private: + double amount; + Currency* currency; + Degree* degree; + + QString degreeText( QString , int ); + QString valueToText( qulonglong ); + QString decimalValueToText( qulonglong ); + QString singleToText( QString ); + QString coupleToText( QString ); + QString tripleToText( QString ); + QString integerCurrencyName( QString ); + QString decimalCurrencyName( QString ); + QString firstUp( QString ); + +}; + + + +/** + * \ru + * \brief содержит знания о роде (М/Ж) числовых порядков. + * После задания порядка (сотни, тысячи, миллионы....) можно узнать род + * методом isMale() + * \_ru + */ +class Degree { + public: + Degree( int = 0 ); + int getValue(); + void setValue( int value); + bool isMale(); + + private: + int value; + bool male; +}; + +/** + * \ru + * \brief содержит знания о роде (М/Ж) валюты. + * После задания одного из поддерживаемых типов валюты можно узнать род + * методом isMale() + * Поддерживаемые типы валют можно увидеть в описании конструктора. + * \_ru + */ +class Currency { + public: + Currency( QString currensyId = "RUR"); + + QString getId(); + void setId( QString ); + bool isMale(); + bool is( QString ); + + private: + QString id; + bool male; +}; + + +#endif /*AMONEY_H_*/ diff --git a/src/lib/ananas.cpp b/src/lib/ananas.cpp new file mode 100644 index 0000000..d4db687 --- /dev/null +++ b/src/lib/ananas.cpp @@ -0,0 +1,160 @@ +/**************************************************************************** +** $Id: ananas.cpp,v 1.2 2008/11/09 21:09:11 leader Exp $ +** +** Code file of the Ananas Library of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "ananas.h" +#include "dselectdb.h" +#include "dlogin.h" + + + +/*! + * Library version number. + */ +const char * +ANANAS_EXPORT +ananas_libversion() +{ + static const char libver[]=ANANAS_LIBVERSION; + return libver; +} + + +/*! + * Select database and user login. + */ +bool +ANANAS_EXPORT +ananas_login( QString &rcfile, QString &username, QString &userpassword, aDatabase *db, int appId ) +{ + dSelectDB dselectdb; + dLogin dlogin; + + if ( rcfile.isEmpty() ) { + if (dselectdb.exec()==QDialog::Accepted) rcfile = dselectdb.rcfile; + } + if ( !rcfile.isEmpty() ) { + if (dlogin.exec()==QDialog::Accepted) { + username = dlogin.username; + userpassword = dlogin.password; + if ( !db ) db = aDatabase::database(); + if ( !db->init( rcfile ) ) return false; + return ( db->login( username, userpassword, appId ) ); + } return false; + } + return false; +} + + +/*! + * Select database and user login. + */ +void +ANANAS_EXPORT +ananas_logout( aDatabase *db ) +{ + if ( !db ) db = aDatabase::database(); + db->logout(); +} + + +/*! + * Select database and user login. + */ +/* +bool +ANANAS_EXPORT +ananas_login( QString &rcfile, QString &username, QString &userpassword ) +{ + dSelectDB dselectdb; + //dLogin dlogin; + + if ( rcfile.isEmpty() ) { + if (dselectdb.exec()==QDialog::Accepted) rcfile = dselectdb.rcfile; + } + if ( !rcfile.isEmpty() ) { +// if (dlogin.exec()==QDialog::Accepted) { +// username = dlogin.username; +// userpassword = dlogin.password; + return true; +// } return false; + } + return false; + // return true; +} +*/ + + +/*! + * \en + * \brief Return object string presentation. + * \_en + * \ru + * \brief Возвращает текстовое представление бизнес объекта Ананаса + * + * \param db - база данных бизнес объекта + * \param uid - уникальный идентификатор бизнес объекта + * \param oid - уникальный идентификатор типа данных, соответствующих бизнес объекту, как определено в метаданных. + * \_ru + */ +QString +ANANAS_EXPORT +ananas_objectstr( aDatabase *db, qulonglong uid, int oid ) +{ + QString res = ""; + + //TODO: make this more faster + aCfgItem fto; + QString oclass; + +// printf("objstr uid = %Ld\n", uid ); + if ( !db ) return "<>"; + if ( !oid ) oid = db->uidType( oid ); + fto = db->cfg.find( oid ); + if ( !fto.isNull() ) { + oclass = db->cfg.objClass( fto ); +// printf("oid = %i, oclass = %s\n", oid, ( const char *) oclass ); + if ( oclass == md_catalogue ) { + aCatalogue cat( fto, db ); + cat.select( uid ); + if ( cat.selected() ) { + res = cat.displayString(); + } + }else if ( oclass == md_document ) { + aDocument doc(fto, db); + doc.select( uid ); + if( doc.selected() ){ + res = doc.displayString(); + } + } + } + + return res; +} + + diff --git a/src/lib/ananas.h b/src/lib/ananas.h new file mode 100644 index 0000000..b882181 --- /dev/null +++ b/src/lib/ananas.h @@ -0,0 +1,131 @@ +/**************************************************************************** +** $Id: ananas.h,v 1.3 2008/12/10 21:04:03 leader Exp $ +** +** Header file of the Ananas Library of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/*! \ru + *\mainpage Проект Ананас. Справочное руководство по библиотеке ananaslib + * + * + * В Справочном руководстве приведено описание классов, составляющих ядро системы Ананас. + * Документ предназначен для использования в качестве Справочника по интерфейсу прикладного программирования Ананаса. + * Интерфейс предоставляет доступ к управлению метаданными Ананаса, данными, хранящимися в базе данных, + * прикладными объектами системы. Справочное руководство предназначено для программистов. Пользовательское + * описание системы Ананас содержится в Руководстве пользователя. + * + * \section intro_sec Введение + * Ананас - вольная платформа, обеспечивающая ускоренное создание приложений автоматизации учетной деятельности, + * бизнес процессов организаций и компаний, работающих в различных сферах деятельности. + * Библиотека ananaslib, являясь частью платформы Ананас, обеспечивает удобный и понятный доступ к реализованным + * в системе функциям, для программ на языке программирования С++. Настоящее справочное руководство содержит описание + * методов доступа. + * + * \section main_classes_sec Основные классы + * \subsection adocument_class_sec Класс aDocument + * Один из важных аспектов методологии работы Ананаса с данными - управление первичными учетными документами. + * Для отражения хозяйственных операций Ананас предусматривает их регистрацию с помощью электронных документов. + * Электронные документы могут иметь произвольную структуру, состоящую из набора полей и одной или нескольких + * табличных частей. Информация о структуре документов хранится в системе. Управление документами осуществляется + * через экземпляры класса aDocument. + + * \subsection acatalog_class_sec Класс aCatalogue + * Ананас поддерживает ведение баз данных (картотек) произвольной структуры + * с возможностью классификации/разнесения элементов по иерархически + * организованным группам. Типичным примером использования этой возможности является ведение Каталога товаров, + * Справочника контрагентов, Реестра сотрудников. Унифицированный интерфейс доступа к таким базам данных (картотекам) + * обеспечивает класс aCatalogue. + * + * \subsection adocjournal_class_sec Класс aDocJournal + * Все электронные документы, хранящиеся в базе данных Ананаса, регистрируются системой в момент их создания в + * журнале документов. Для работы с журналом документов используется класс aDocJournal. + * + * + * \subsection airegister_class_sec Класс aIRegister, aARegister + * Ананас поддерживает ведение Регистров. Регисты служат для хронологической записи информации. В системе существует + * два типа регистров: информационные и накопительные. Накопительный, отличается от информационного поддержкой + * автоматически пересчитываемых остатков по разрезам учета. Для работы с информационными регистрами используется + * класс aIRegister. Для работы с накопительными - aARegister. + * + * \subsection acfg_class_sec Класс aCfg + * Ананас разработан с учетом требований адаптируемости к различным сферам учетной деятельности. Для этих целей + * поддерживается работа с произвольно настраиваемыми структурами данных. Такой подход требует хранения информации, + * описывающей структуры данных. Такую информацию принято называть метаданными. Для управления структурами данных и для + * работы с метаданными используется класс aCfg. + * + * \subsection aform_class_sec Класс aForm + * Все бизнес объекты Ананаса, атрибуты которых может редактировать пользователь, имеют хотя бы одну экранную + * форму, работая с которой, пользователь осуществляет изменение значений атрибутов бизнес объектов. + * Класс aForm предоставляет набор методов, предназначенных для использования Ананас.Скриптом модуля экранной формы + * бизнес объекта Ананаса. Проектируя и программируя пользовательский интерфейс (Presentation layer) + * бизнес схемы Ананаса разработчик имеет дело с объектами класса aForm и расположенными в них виджетами. + * \_ru + */ + +#ifndef ANANAS_H +#define ANANAS_H + +#include "acfg.h" +#include "acfgrc.h" +#include "ametadata.h" +#include "adatabase.h" +#include "asqlfield.h" +#include "adatafield.h" +#include "asqltable.h" +#include "aform.h" +#include "engine.h" +#include "aobject.h" +#include "awidget.h" +#include "messageswindow.h" +#include "adocjournal.h" +#include "adocument.h" +#include "acatalogue.h" +#include "airegister.h" +#include "aaregister.h" +#include "atemplate.h" +#include "areport.h" +#include "aextension.h" +#include "aextensionfactory.h" +#include "adataexchange.h" +//#include "dlogin.h" +//#include "deditrc.h" +//#include "dselectdb.h" +#include "atime.h" +#include "auser.h" +#include "arole.h" +#include "aservice.h" +#include "atests.h" +#include "afilter.h" + +#define ANANAS_LIBVERSION "0.9.6" +extern const char ANANAS_EXPORT *ananas_libversion(); +//extern bool ANANAS_EXPORT ananas_login( QString &rcfile, QString &username, QString &userpassword ); +extern bool ANANAS_EXPORT ananas_login( QString &rcfile, QString &username, QString &userpassword, aDatabase *db=0, int appId = 0 ); +extern void ANANAS_EXPORT ananas_logout( aDatabase *db=0 ); +extern QString ANANAS_EXPORT ananas_objectstr( aDatabase *db, qulonglong uid, int oid ); + + +#endif diff --git a/src/lib/ananasglobal.h b/src/lib/ananasglobal.h new file mode 100644 index 0000000..b273646 --- /dev/null +++ b/src/lib/ananasglobal.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** $Id: ananasglobal.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Ananas Library of Ananas +** Designer and Engine applications +** +** Created : 20040901 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Linux Center (Orenburg). All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ANANASGLOBAL_H +#define ANANASGLOBAL_H + +#include + +#define ANANAS_DEBUG + +#define ANANAS_VERSION_STRING "0.4.3" +#define ANANAS_VERSION_MAJOR 0 +#define ANANAS_VERSION_MINOR 4 +#define ANANAS_VERSION_MICRO 3 + +// helper macros +#define ANANAS_MAKE_VERSION(maj, min, mic) (((maj) << 16) | ((min) << 8) | (mic)) +#define ANANAS_VERSION \ + ANANAS_MAKE_VERSION(ANANAS_VERSION_MAJOR, ANANAS_VERSION_MINOR, ANANAS_VERSION_MICRO) + +// evaluate to true if this version is (maj, min, mic) at minimum +#define ANANAS_IS_VERSION(maj, min, mic) \ + (ANANAS_VERSION >= ANANAS_MAKE_VERSION(maj, min, mic)) + +#if defined(Q_OS_WIN32) && !defined(ANANAS_NO_DLL) +# if defined(ANANAS_DLL) +# define ANANAS_EXPORT __declspec(dllexport) +# else +# define ANANAS_EXPORT __declspec(dllimport) +# endif +#else +# define ANANAS_EXPORT +#endif + +#ifdef _MSC_VER +#define LLU_SPEC "%I64u" +#else +#define LLU_SPEC "%llu" +#endif + +#if defined (ANANAS_DLL) +# define ANANAS_TEMPLATE_EXTERN +#elif defined (Q_TEMPLATEDLL) +# define ANANAS_TEMPLATE_EXTERN Q_TEMPLATE_EXTERN +#else +# define ANANAS_TEMPLATE_EXTERN +#endif + + +//#if defined(Q_ULLONG) +# define ANANAS_UID qulonglong +# define ANANAS_UID_VALUE( v ) v.toULongLong() +//#error yes +//#else +//# define ANANAS_UID unsigned int +//# define ANANAS_UID_VALUE( v ) v.toUInt() +//#error no +//#endif + +#endif diff --git a/src/lib/arole.cpp b/src/lib/arole.cpp new file mode 100644 index 0000000..7a0dd07 --- /dev/null +++ b/src/lib/arole.cpp @@ -0,0 +1,423 @@ +/**************************************************************************** +** $Id: arole.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Role object implementation file of +** Ananas application library +** +** Created : 20050527 +** +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "arole.h" +#include "auser.h" +/*! + * \en + * Constructor. + * \_en + * \ru + * Конструктор. Создает экземпляр роли и настраивает его на работу с заданным id. + * \param roleId - идентификатор роли. + * \param adb - ссылка на базу данных. + * \_ru + */ +aRole::aRole( qulonglong roleId, aDatabase * adb ):aObject("",adb) +{ + + initObject(); + Select(roleId); +} + + +/*! + * \en + * Constructor. + * \_en + * \ru + * Конструктор. Создает экземпляр роли. Для работы необходимо выбрать нужную роль с помощью функции Select( Q_ULLONG id ). + * \param adb - ссылка на базу данных. + * \_ru + */ +aRole::aRole( aDatabase * adb ):aObject("",adb) +{ + + initObject(); +} + + + + +ERR_Code +aRole::initObject() +{ + ERR_Code err = aObject::initObject(); + err = tableInsert( db_roles,""); + if(err) return err; + err = tableInsert( db_right_roles, md_right_roles ); + return err; +} + + + +/*! + * \en + * Sets role name. + * \_en + * \ru + * Устанавливает имя роли. + * \_ru + * \param rname - \en role name \_en \ru имя роли \_ru + * \return \en error code \_en \ru код ошибки \_ru +*/ +ERR_Code +aRole::SetName( const QString &rname ) +{ + setSysValue( "name", rname ); + return err_noerror; +} + + +/*! + * \en + * Gets role name. + * \_en + * \ru + * Функция получения имени роли. + * \_ru + * \return \en role name \_en \ru имя роли \_ru +*/ +QString +aRole::GetName( ) +{ + + return sysValue( "name" ).toString(); +} + + +ERR_Code +aRole::Update() +{ + ERR_Code err = aObject::Update(); + if ( !err ){ + err = TableUpdate( md_right_roles ); + } + return err; +} + + + +/*! + * \en + * Sets primary table selected. + * \_en + * \ru + * Устанавливает основную таблицу выбранной. + * \_ru + * \return \en error code \_en \ru код ошибки \_ru +*/ +ERR_Code +aRole::Select( ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + QString flt = ""; + if ( t->select( flt ) ) + if ( t->first() ) + { + setSelected(true); + } + else return err_notselected; + else return err_selecterror; + return err_noerror; +} + + +/*! + * \en + * Select role. + * \_en + * \ru + * Выбирает роль с заданным идентификатором. + * \_ru + * \param id - \en role id \_en \ru id роли \_ru + * \return \en error code \_en \ru код ошибки \_ru +*/ +ERR_Code +aRole::Select( qulonglong id ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + QString flt; + flt = QString("id=%1").arg(id); + if ( t->select( flt ) ) + if ( t->first() ) + { + setSelected(true); + } + else return err_notselected; + else return err_selecterror; + return err_noerror; +} + + +/*! + * \en + * Adds permission to role + * \_en + * \ru + * Добавляет к роли право \a p + * \_ru + * \param p - \en permission \_en \ru право \_ru + * \return \en error code \_en \ru код ошибки \_ru +*/ +ERR_Code +aRole::addPermission( aPermission p ) +{ + aSQLTable *tg = table( md_right_roles ); + if ( !tg ) return err_notable; + setSelected(true, md_right_roles); + qulonglong idg; + QSqlRecord* rec = tg->primeInsert(); // get edit buffer for table groups + idg = rec->value("id").toULongLong(); + rec->setValue("id",idg ); + rec->setValue("permission",p); + tg->insert(); // insert record + tg->update(); +return err_noerror; +} + + +/*! + * \en + * Removs permission from role + * \_en + * \ru + * Убирает у роли право \a p + * \_ru + * \param p - \en permission \_en \ru право \_ru + * \return \en error code \_en \ru код ошибки \_ru +*/ +ERR_Code +aRole::delPermission( aPermission p ) +{ +/* aSQLTable *tg = table( md_user_roles ); + if (!tg ) return err_notable; + setSelected(true, md_right_roles); +// tg->select(parentId); +// setSelected(true,md_group); + Q_ULLONG idg; + QSqlRecord* rec = tg->primeInsert(); // get edit buffer for table groups + idg = rec->value("id").toULongLong(); + //printf( "idg=%lu\n", idg ); + rec->setValue("id",idg ); + rec->setValue("permission",p); + tg->insert(); // insert record + tg->update();*/ +return err_noerror; +} + + +/*! + * \en + * Check permission \a p. + * \_en + * \ru + * Проверяет, есть ли у роли право \a p + * \_ru + * \param p - \en permission \_en \ru право \_ru + * \return \en true, if role has perission \_en \ru true, если у роли есть право \_ru +*/ +bool +aRole::hasPermission( aPermission p ) +{ + aSQLTable *tg = table( md_right_roles ); + if (!tg ) return err_notable; + tg->select(QString("idr=%1").arg(sysValue("id").toULongLong())); + if( tg->first() ) + { + return true; + } + else + { + return false; + } + +} + + + +/*! + * \en + * Adds user to role + * \_en + * \ru + * Добавляет к пользователю данную роль. + * \_ru + * \param userId - \en user id \_en \ru идентификатор пользовыателя \_ru + * \return \en error code \_en \ru код ошибки \_ru +*/ + +ERR_Code +aRole::addUser( qulonglong userId ) +{ + aUser *user = new aUser(userId, db); + user->addRole(sysValue("id").toULongLong()); + delete user; +return err_noerror; +} + + +/*! + * \en + * Delete user from role + * \_en + * \ru + * Удаляет у пользователя данную роль + * \_ru + * \param userId - \en user id \_en \ru идентификатор пользовыателя \_ru + * \return \en error code \_en \ru код ошибки \_ru +*/ +ERR_Code +aRole::delUser( qulonglong userId ) +{ + aUser *user = new aUser(userId, db); + user->delRole(sysValue("id").toULongLong()); + delete user; +return err_noerror; +} + + +/*! + * \en + * Check user have role. + * \_en + * \ru + * Проверяет, принадлежит ли пользователь к данной роли. + * \_ru + * \param userId - \en user id \_en \ru id пользователя \_ru + * \return \en true, if role has user \_en \ru true, если у пользователя есть эта роль\_ru +*/ +bool +aRole::hasUser(qulonglong userId) +{ + aUser *user = new aUser(userId, db); + bool res; + if(user->hasRole(sysValue("id").toULongLong())) + { + res = true; + } + else + { + res =false; + } + delete user; + return res; +} + + +/*! + * \en + * Adds new pole. + * \_en + * \ru + * Добавляет новую роль. + * \_ru + */ +ERR_Code +aRole::New(const QString &rname) +{ + aSQLTable *te = table(); + if (!te) return err_notable; + QSqlRecord *rec; + qulonglong ide; + rec = te->primeInsert(); // get edit buffer for table elements + ide = rec->value("id").toULongLong(); + rec->setValue("id",ide); // set defult values for all user fields = id + rec->setValue( "name", rname ); + te->insert(); // insert edit buffer as new line in table + te->select(QString("id=%1").arg(ide),false); // set cursor to inserted record + te->first(); + setSelected(true); + return err_noerror; +} + + + + + +/*! + * \en + * Delete this role. + * \_en + * \ru + * Удаляет эту роль. Не удаляет роль у пользователей. + * \_ru + */ +ERR_Code +aRole::Delete() +{ + aSQLTable * t = table(); + qulonglong ide=0; + if ( !t ) return err_notable; + ide = t->sysValue("id").toULongLong(); + if ( ide ) + { + printf("ide=" LLU_SPEC "\n",ide); + t->primeDelete(); + t->del(); + setSelected( false ); + } + else return err_notselected; + return err_noerror; +} + + + +bool +aRole::Next() +{ + return aObject::Next( ); //return !groupSelect(); + //else return false; +} + +bool +aRole::Prev() +{ + return aObject::Prev( ); //return !groupSelect(); +// else return false; +} + +bool +aRole::First() +{ + return aObject::First( ); //return !groupSelect(); + //else return false; +} + +bool +aRole::Last() +{ + return aObject::Last( ); //return !groupSelect(); + //else return false; +} + + + diff --git a/src/lib/arole.h b/src/lib/arole.h new file mode 100644 index 0000000..3dff46d --- /dev/null +++ b/src/lib/arole.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** $Id: arole.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Role object header file of +** Ananas application library +** +** Created : 20050527 +** +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AROLE_H +#define AROLE_H + +#include "aobject.h" +#include "adatabase.h" +#include "acfg.h" +//#include "auser.h" + +//class aUser; +//class aPermission; +//class aObject; + + + +/*! + * \en + * Not visual object used for working with catalogues in database. + * Used as interface between database and script or wObjects* + * \_en + * \ru + * \brief Класс предоставляет методы управления ролями. Не используется в настоящее время. + * Наследует aObject. + * + * \_ru +*/ +class ANANAS_EXPORT aRole: public aObject +{ + Q_OBJECT +public: + + aRole(); + aRole(qulonglong roleId, aDatabase * adb); + aRole(aDatabase * adb); + virtual ERR_Code initObject(); + +//public slots: + + virtual ERR_Code New(const QString &name); + + virtual ERR_Code Delete(); + virtual ERR_Code Update(); + virtual ERR_Code Select(); + virtual ERR_Code Select(qulonglong id); + + virtual ERR_Code addPermission( aPermission ); + virtual ERR_Code delPermission( aPermission ); + virtual bool hasPermission( aPermission ); + + virtual ERR_Code addUser( qulonglong userId ); + virtual ERR_Code delUser( qulonglong userId ); + +// QValueList< aUser *> getUsers( bool assigned); + + bool hasUser( qulonglong userId); + + virtual ERR_Code SetName( const QString & ); + virtual QString GetName(); + + //virtual ERR_Code setLogin( const QString & ); + //virtual ERR_Code setFirstName( const QString & ); + //virtual ERR_Code setLastName( const QString & ); + +//irtual Q_ULLONG getUserId( const QString &login, const QString &password ); +//irtual ERR_Code getRoles(QValueList *lst); + bool First(); + bool Next(); + bool Last(); + bool Prev(); +}; + + +#endif// AROLE_H diff --git a/src/lib/aservice.cpp b/src/lib/aservice.cpp new file mode 100644 index 0000000..85433f0 --- /dev/null +++ b/src/lib/aservice.cpp @@ -0,0 +1,547 @@ +/**************************************************************************** +** $Id: aservice.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Service functions source file of +** Ananas application library +** +** Created : 20050425 +** +** Copyright (C) 2003-2006 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "qsettings.h" +#include "aservice.h" +#include "alog.h" +#include "amoney.h" +#include +#include + + +/*! + *\~english + * Converted double currency value to string representation (ru currency). + *\~russian + * Конвертирует валюту, записанную в виде десятичного числа в ее текстовое представление. + *\~ + * \param rubli - \~english Value to convertions \~russian Значение для конвертации \~ + * \return - \~english Converted value \~russian Сконвертированное значение \~ + * \see parts2money(Q_ULLONG rubli, unsigned int kopeyki, bool positive) + * \see part2string(unsigned int st3, unsigned int st2, unsigned int st1, int stepen) + * \see convertNumber2MoneyFormat(double number) +*/ +QString +aService::number2money( double rubli, + bool need_kopeyki, + bool male, + const QString &end1, + const QString &end2, + const QString &end3) +{ + bool neg = rubli<0; + //printf("chislo=%f\n",rubli); + if(neg) + { + rubli = -rubli; + } + qulonglong r = QVariant(rubli).toULongLong(); + double tmp = rubli-r; + + uint kop; +#ifdef Q_OS_UNIX + kop = round(tmp*100.0); +#else + kop = tmp * 100.0; +#endif + return parts2money(r,kop, need_kopeyki, !neg, male, end1, end2, end3); +} + + +/** + * \ru + * \brief Конвертирует числовое представление денег в пропись с учетом указанной валюты. + * \param amount - сумма денег для преобразование в пропись. + * \param currency - строка с обозначением валюты. Допустимые значения: "RUR" - рубль, "USD" - доллар, "EUR" - евро. + * \returns значение суммы прописью. + * \_ru + */ +QString +aService::number2money( QString currency, double amount ) { + AMoney* money = new AMoney( amount, currency ); + return money->toText(); +} + + + +/*! + *\~english + * Converted currency value to string representation (ru currency). + *\~russian + * Конвертирует валюту, записанную в виде рублей и копеек в ее текстовое представление. + *\~ + * \return - \~english Converted value \~russian Сконвертированное значение \~ + * \see number2money(double rubli) + * \see part2string(unsigned int st3, unsigned int st2, unsigned int st1, int stepen) +*/ +QString +aService::parts2money(qulonglong rubli, + unsigned int kopeyki, + bool need_kopeyki, + bool positive, + bool male, + const QString &end1, + const QString &end2, + const QString &end3) +{ +// if(cur!=ru) return QString("%1 dollars %2 cents").arg(rubli).arg(kopeyki); + QString chislo = (QString("%1").arg(rubli)); + int len = chislo.length(); + //printf("length=%d\n",len); + int count=0; + int a,b,c; + int stepen=(len-1)/3; + int offset=(len%3); + if(offset) offset = 3-offset; + //printf("offset=%d\n",offset); + QString res = ""; + bool has_sum=false; + if(!positive) res+="минус "; + while(count mapMaleCur; + QMap mapFeMaleCur; + QMap mapHungred; + QMap mapDec; + + mapFeMaleCur[0]=""; + mapFeMaleCur[1]="одна"; + mapFeMaleCur[2]="две"; + mapFeMaleCur[3]="три"; + mapFeMaleCur[4]="четыре"; + mapFeMaleCur[5]="пять"; + mapFeMaleCur[6]="шесть"; + mapFeMaleCur[7]="семь"; + mapFeMaleCur[8]="восемь"; + mapFeMaleCur[9]="девять"; + + mapFeMaleCur[10]="копеек"; + mapFeMaleCur[11]="копейка"; + mapFeMaleCur[12]= mapFeMaleCur[13]= mapFeMaleCur[14]="копейки"; + mapFeMaleCur[15]= mapFeMaleCur[16]= mapFeMaleCur[17]= mapFeMaleCur[18]= mapFeMaleCur[19]="копеек"; + + mapFeMaleCur[20]="тысяч"; + mapFeMaleCur[21]="тысяча"; + mapFeMaleCur[22]= mapFeMaleCur[23]= mapFeMaleCur[24]="тысячи"; + mapFeMaleCur[25]= mapFeMaleCur[26]= mapFeMaleCur[27]= mapFeMaleCur[28]= mapFeMaleCur[29]="тысяч"; + + mapMaleCur[0]=""; + mapMaleCur[1]="один"; + mapMaleCur[2]="два"; + mapMaleCur[3]="три"; + mapMaleCur[4]="четыре"; + mapMaleCur[5]="пять"; + mapMaleCur[6]="шесть"; + mapMaleCur[7]="семь"; + mapMaleCur[8]="восемь"; + mapMaleCur[9]="девять"; + + if(male==true) + { + mapMaleCur[10]=end1; //"рублей"; + mapMaleCur[11]=end2;//"рубль"; + mapMaleCur[12]= mapMaleCur[13]= mapMaleCur[14]=end3;//"рубля"; + mapMaleCur[15]= mapMaleCur[16]= mapMaleCur[17]= mapMaleCur[18]= mapMaleCur[19]=end1;//"рублей"; + } + else + { + mapFeMaleCur[10]= end1;//"копеек"; + mapFeMaleCur[11]= end2;//"копейка"; + mapFeMaleCur[12]= mapFeMaleCur[13]= mapFeMaleCur[14]=end3;//"копейки"; + mapFeMaleCur[15]= mapFeMaleCur[16]= mapFeMaleCur[17]= mapFeMaleCur[18]= mapFeMaleCur[19]=end1;//"копеек"; + } + mapMaleCur[30]="миллионов"; + mapMaleCur[31]="миллион"; + mapMaleCur[32]= mapMaleCur[33]= mapMaleCur[34]="миллиона"; + mapMaleCur[35]= mapMaleCur[36]=mapMaleCur[37]=mapMaleCur[38]=mapMaleCur[39]="миллионов"; + mapMaleCur[40]="миллиардов"; + mapMaleCur[41]="миллиард"; + mapMaleCur[42]= mapMaleCur[43]= mapMaleCur[44]="миллиарда"; + mapMaleCur[45]= mapMaleCur[46]=mapMaleCur[47]=mapMaleCur[48]=mapMaleCur[49]="миллиардов"; + mapHungred[0]=""; + mapHungred[1]="сто"; + mapHungred[2]="двести"; + mapHungred[3]="триста"; + mapHungred[4]="четыреста"; + mapHungred[5]="пятьсот"; + mapHungred[6]="шестьсот"; + mapHungred[7]="семьсот"; + mapHungred[8]="восемьсот"; + mapHungred[9]="девятьсот"; + + mapDec[0]="десять"; + mapDec[1]="одиннадцать"; + mapDec[2]="двенадцать"; + mapDec[3]="тринадцать"; + mapDec[4]="четырнадцать"; + mapDec[5]="пятнадцать"; + mapDec[6]="шестнадцать"; + mapDec[7]="семнадцать"; + mapDec[8]="восемнадцать"; + mapDec[9]="девятнадцать"; + mapDec[10]=""; + mapDec[11]=""; + mapDec[12]="двадцать"; + mapDec[13]="тридцать"; + mapDec[14]="сорок"; + mapDec[15]="пятьдесят"; + mapDec[16]="шестьдесят"; + mapDec[17]="семьдесят"; + mapDec[18]="восемьдесят"; + mapDec[19]="девяносто"; + + + if(stepen==1 || stepen==-1 || stepen==0 && male==false) + { + part1 = mapHungred[st3]; + part2 = mapDec[10+st2]; + int mult = 20; + if(stepen==-1) mult=10; + if(stepen==0) mult=10; + switch(st2) + { + case 0: + part3=mapFeMaleCur[st1]; + suff=mapFeMaleCur[st1+mult]; + break; + case 1: + part3=mapDec[st1]; + suff=mapFeMaleCur[9+mult]; + break; + default: + part3=mapFeMaleCur[st1]; + suff=mapFeMaleCur[st1+mult]; + break; + } + if(stepen==-1 && st3==0 && st2==0 && st1==0) + { + part3="ноль"; + } + } + else + { + part1 = mapHungred[st3]; + part2 = mapDec[10+st2]; + int mult = 10*(stepen+1); + switch(st2) + { + case 0: + part2=""; + part3=mapMaleCur[st1]; + suff=mapMaleCur[st1+mult]; + break; + case 1: + part2=""; + part3=mapDec[st1]; + suff=mapMaleCur[9+mult]; + break; + default: + part3=mapMaleCur[st1]; + suff=mapMaleCur[st1+mult]; + break; + } + } + if(stepen==-1) // если убрать этот блок, копейки будут выводиться прописью + { + part1 = part2 =""; + part3 = QString("%1%2").arg(st2).arg(st1); + } +return part1+" "+part2 +" "+part3+" "+suff+" "; +} + + +/*! + *\~english + * Converted date from ISO format (yyyy-mm-dd) to local format. + *\~russian + * Конвертирует дату из ISO формата в локальный формат. + *\~ + * \param ISODate - \~english Date to convertion \~russian Дата для конвертации \~ + * \return - \~english Converted value \~russian Сконвертированное значение \~ +*/ +QString +aService::Date2Print(const QString &ISODate) +{ + QString res; + QDate dat = QDate::fromString(ISODate, Qt::ISODate); + res = dat.toString(Qt::LocalDate); + return res; +} + + +/*! + *\~english + * Writes window size to config file. + *\~russian + * Пишет размер окна в конфиг. + *\~ + * \param windowSize - \~english Rect of window geometry \~russian Прямоугольник, представляющий окно \~ + * \param mdname - \~english Unical name \~russian Имя окна (должно быть уникальным) \~ + * \see loadSizeFromConfig(const QString &mdname) +*/ +void +aService::saveSize2Config(QRect windowSize, const QString &mdname) +{ + QSettings settings; + //--settings.insertSearchPath( QSettings::Unix, QString(QDir::homeDirPath())+QString("/.ananas")); + //--settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas" ); + settings.beginGroup(QString("/config/%1").arg(mdname)); + settings.writeEntry("/left", windowSize.left()); + settings.writeEntry("/top", windowSize.top()); + settings.writeEntry("/right", windowSize.right()); + settings.writeEntry("/bottom", windowSize.bottom()); +} + + +/*! + *\~english + * Reads window size from config file. + *\~russian + * Читает размер окна из конфиг. + *\~ + * \param mdname - \~english Window name. + * If config not contains info about mdname, + * return default value (400x300) + * \~russian Имя окна. + * Если конфиг не содержит информации об окне с таким именем, + * возвращает значение по умолчанию (400x300) \~ + * \return - \~english Window size \~russian Размер окна \~ + * \see saveSize2Config(QRect windowSize, const QString &mdname) + * +*/ +QRect +aService::loadSizeFromConfig(const QString &mdname) +{ + QSettings settings; + //--settings.insertSearchPath( QSettings::Unix, QString(QDir::homeDirPath())+QString("/.ananas")); + //--settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas" ); + settings.beginGroup(QString("/config/%1").arg(mdname)); + int l = settings.readNumEntry("/left", 0); + int t = settings.readNumEntry("/top", 0); + int r = settings.readNumEntry("/right", 400); + int b = settings.readNumEntry("/bottom", 300); + return QRect(l,t,r,b); +} + + +/*! + *\~english + * Reads variable from config file. + *\~russian + * Читает переменную из конфига. + *\~ + * \param name - \~english variable name to read \~russian Имя переменной для чтения \~ + * \param ok (out) - \~english true if success, false otherwise + \~russian true если успешно иначе false \~ + * \return - \~english Variable value \~russian Значение переменной \~ + * \see writeConfigVariable(const QString &name, const QString &value) + * \see loadSizeFromConfig(const QString &mdname) + * \see saveSize2Config(QRect windowSize, const QString &mdname) +*/ +QString +aService::readConfigVariable(const QString &name, bool *ok) +{ + QSettings settings; + //--settings.insertSearchPath( QSettings::Unix, QString(QDir::homeDirPath())+QString("/.ananas")); + //--settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas" ); + settings.beginGroup(QString("/config/variables")); + return settings.readEntry(QString("/%1").arg(name), "", ok); +} + + +/*! + *\~english + * Writes variable to config file. + *\~russian + * Пишет переменную в конфиг. + *\~ + * \param name - \~english Variable name \~russian Имя переменной \~ + * \param value - \~english Variable value \~russian Значение переменной \~ + * \see loadSizeFromConfig(const QString &mdname) + * \see saveSize2Config(QRect windowSize, const QString &mdname) + * \see readConfigVariable(const QString &name, bool *ok) +*/ +void +aService::writeConfigVariable(const QString &name, const QString &value) +{ + QSettings settings; + //--settings.insertSearchPath( QSettings::Unix, QString(QDir::homeDirPath())+QString("/.ananas")); + //--settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas" ); + settings.beginGroup(QString("/config/variables")); + settings.writeEntry(QString("/%1").arg(name), value); +} + +/*! + *\~english + * Converted number to money format (publi.kk). + *\~russian + * Конвертирует число с плавающей точкой в числовой денежный формат (рубли.кк) + *\~ + * \param number - \~english number to convertion \~russian число для конвертации \~ + * \return - \~english Converted value \~russian Сконвертированное значение \~ +*/ +QString +aService::convertNumber2MoneyFormat(double number) +{ + return QString("%1").arg(number,0,'f',2); +} + +bool +aService::copyFile(const QString& srcFileName, const QString& destFileName, bool replaceIfExists) +{ + + QFile srcFile(srcFileName); + QFile destFile(destFileName); + + if(!srcFile.exists()) + { + aLog::print(aLog::Error, QObject::tr("aService copy: source file %1 not exist").arg(srcFileName)); + return false; + } + if(destFile.exists() && !replaceIfExists) + { + aLog::print(aLog::Error, QObject::tr("aService copy: replace destination file %1").arg(destFileName)); + return false; + } + + if(!srcFile.open( QIODevice::ReadOnly )) + { + aLog::print(aLog::Error, QObject::tr("aService copy: source file %1 open for read error").arg(srcFileName)); + return false; + } + if(!destFile.open( QIODevice::WriteOnly)) + { + aLog::print(aLog::Error, QObject::tr("aService copy: destination file %1 open for write error").arg(destFileName)); + return false; + } + + const int BUFFER_SIZE = 1024; + Q_INT8 buffer[BUFFER_SIZE]; + QDataStream srcStream(&srcFile); + QDataStream destStream(&destFile); + + while(!srcStream.atEnd()) + { + int i = 0; + while(!srcStream.atEnd() && i < BUFFER_SIZE) + { + srcStream >> buffer[i]; + i++; + } + for(int k = 0; k < i; k++) + { + destStream << buffer[k]; + } + } + srcFile.close(); + destFile.close(); + + aLog::print(aLog::Info, QObject::tr("aService copy file %1 to %2 ok").arg(srcFileName).arg(destFileName)); + return true; +} diff --git a/src/lib/aservice.h b/src/lib/aservice.h new file mode 100644 index 0000000..46a74f6 --- /dev/null +++ b/src/lib/aservice.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** $Id: aservice.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Service functions header file of +** Ananas application library +** +** Created : 20050425 +** +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ASERVICE_H +#define ASERVICE_H + +//#include +#include "ananas.h" + +/*! + * \~english + * Class contains static functions for various destination: convertation, work with config file etc. + * \~russian + * \brief Класс содержит статические методы различного назначения: конвертации, работы с конфигом и т.д. + * Не наследует свойства других классов. + * + * Врапперы для некоторых функций для работы со скриптами есть в классе aForm + * \~ + * \see aForm aTests + */ +class ANANAS_EXPORT aService +{ + public: + + static QString number2money( double rubli, + bool need_kopeyki=true, + bool male=true, + const QString &end1="рублей", + const QString &end2="рубль", + const QString &end3="рубля"); + static QString number2money( QString currency, double rubli ); + static QString parts2money( qulonglong rubli, + unsigned int kopeyki, + bool need_kopeyki=true, + bool positive = true, + bool male=true, + const QString &end1="рублей", + const QString &end2="рубль", + const QString &end3="рубля"); + static QString Date2Print(const QString &ISODate); + static void saveSize2Config(QRect size, const QString &mdname); + static QRect loadSizeFromConfig(const QString &mdname); + static QString readConfigVariable(const QString &name, bool *ok); + static void writeConfigVariable(const QString &name, const QString &value); + static QString convertNumber2MoneyFormat(double number); + static bool copyFile(const QString& srcFileName, const QString& destFileName, bool replaceIfExists=true); + protected: + + static QString part2string( unsigned int st3, + unsigned int st2, + unsigned int st1, + int stepen, + bool male, + const QString &end1, + const QString &end2, + const QString &end3); + private: + aService(); +}; +#endif// AREPORT_H diff --git a/src/lib/asqlfield.cpp b/src/lib/asqlfield.cpp new file mode 100644 index 0000000..d92a3cd --- /dev/null +++ b/src/lib/asqlfield.cpp @@ -0,0 +1,155 @@ +/**************************************************************************** +** $Id: asqlfield.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Code file of the Ananas database field of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include "acfg.h" +#include "asqlfield.h" + +/*! +Create Ananas database field contaner. +*/ +/* +aField::aField(aCfg *newmd, aCfgItem newcontext ) +:QObject( 0, "aField" ) // name ) +{ + md = newmd; + context = newcontext; +// fType = type; + fTName = ""; +// field = new QSqlField( fTName ); + fSys = false; +} +*/ + +/*! +Create Ananas field contaner. +*/ +/* +aField::aField(const QString &name, const QString &type ) +:QObject( 0, "aField" ) +{ + QString t; + + fSys = true; + Name = name; +// Type = type; + aType = ( (const char *) type.section(" ",0,0).upper() )[0]; + Width = type.section(" ",1,1).toInt(); + Dec = type.section(" ",2,2).toInt(); + switch ( aType ){ + case 'C': + Type = QVariant::String; + field = QString(""); + break; + case 'N': + Type = QVariant::Double; + field = ( double ) 0.0; + default: + Type = QVariant::Invalid; + } +} +*/ + +/*! +Destroy object. +*/ + +//aField::~aField() +//{ +// delete field; +//} + + +/*! +Return pointer to asociated sql field. +*/ +//QSqlField * +//aField::sqlField(){ +// return field; +//} + + +//QVariant +//aField::value() +//{ +// return field; +//} + + +//void +//aField::setValue( const QVariant &value) +//{ +// field = value; +//} + + +aSQLField::aSQLField( aCfg *newmd, aCfgItem newcontext ) +: QObject( 0, "aSQLField" ) +{ + +} + + +aSQLField::aSQLField( const QString &name, const QString &type, const QString &tname ) +: QObject( 0, "aSQLField" ) +{ + tName = tname; +} + + +aSQLField::~aSQLField() +{ + +} + + +QSqlField * +aSQLField::sqlField() +{ + return field; +} + + +QVariant +aSQLField::value() +{ + return ""; +} + + +void +aSQLField::setValue( const QVariant &value) +{ + +} +QWidget * +aSQLField::editor() +{ + return NULL; +} diff --git a/src/lib/asqlfield.h b/src/lib/asqlfield.h new file mode 100644 index 0000000..ac0c166 --- /dev/null +++ b/src/lib/asqlfield.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** $Id: asqlfield.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Ananas database field of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ASQLFIELD_H +#define ASQLFIELD_H +#include +#include "acfg.h" + +/* +class ANANAS_EXPORT aField : public QObject //SqlField +{ + Q_OBJECT +public: +// enum fieldType ( Unknown, Numberic, Character, Date, Object ); + aCfgItem context; + long id; + aCfg *md; + bool fSys; + int Width, Dec; + QString Name; + char aType; + QVariant::Type Type; + + +// aField( aCfg *newmd, aCfgItem newcontext ); + aField( const QString &fname = QString::null, const QString &ftype = QString::null ); + ~aField(); + +// QSqlField *sqlField(); +public slots: + virtual QVariant value(); + virtual void setValue( const QVariant &value); +private: + QVariant field; +}; +*/ + +class ANANAS_EXPORT aSQLField: public QObject //aField +{ + Q_OBJECT +public: + QString tName; + QWidget *editorWidget; + + aSQLField( aCfg *newmd, aCfgItem newcontext ); + aSQLField( const QString &name = QString::null, const QString &type = QString::null, const QString &tname = QString::null ); + ~aSQLField(); + + QSqlField *sqlField(); + virtual QWidget *editor(); + +public slots: + virtual QVariant value(); + virtual void setValue( const QVariant &value); +private: + QSqlField *field; +}; + +#endif diff --git a/src/lib/asqltable.cpp b/src/lib/asqltable.cpp new file mode 100644 index 0000000..8d5ba35 --- /dev/null +++ b/src/lib/asqltable.cpp @@ -0,0 +1,1111 @@ +/**************************************************************************** +** $Id: asqltable.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Code file of the Ananas database table of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +//#include + +#include "asqltable.h" +#include +//Added by qt3to4: +#include +#include "adatabase.h" +#include +#include + +#include "acatalogue.h" +#include "adocument.h" +#include "aaregister.h" +#include "alog.h" + +/*! + * \~english + * Constructor + * \~russian + * Создает таблицу доступа к базе данных, позволяющую работать с одной + * sql таблицей или одним sql представлением (view). + * \param context - объект метаданных, который описывает таблицу. + * \param adb - ссылка на объект базы данных, которой + * принадлежит sql таблица. + * \~ + */ +aDataTable::aDataTable( aCfgItem context, aDatabase *adb ) +:Q3SqlCursor( QString::null, false, *adb->db() ) +{ + db = adb; + md = &db->cfg; + mdobjId = 0; + tableName = db->tableDbName( db->cfg, context, &mdobjId ); + if ( !tableName.isEmpty() ) { + setName( tableName, true ); + init (context, adb ); + } + selected = false; + p_cat.setAutoDelete ( true ); + p_reg.setAutoDelete ( true ); + p_doc.setAutoDelete ( true ); +} + + + +/*! + * \~english + * Constructor + * \~russian + * Создает таблицу доступа к базе данных, позволяющую работать с одной + * sql таблицей или одним sql представлением (view). + * \param tname - имя sql таблицы в базе данных + * \param adb - ссылка на объект базы данных, которой + * принадлежит sql таблица. + * \~ + * + */ +aDataTable::aDataTable( const QString &tname, aDatabase *adb ) +:Q3SqlCursor( tname, true, *adb->db() ) +{ + db = adb; + md = &db->cfg; + tableName = tname; + mdobjId = 0; + selected = false; + p_cat.setAutoDelete ( true ); + p_reg.setAutoDelete ( true ); + p_doc.setAutoDelete ( true ); + +} + +/*! + * \~english + * Destructor + * \~russian + * Деструктор + * \~ + * + */ +aSQLTable::~aSQLTable() +{ +// delete p_reg; +// delete p_cat; + p_reg.clear(); + p_cat.clear(); + p_doc.clear(); +} + +/*! + * \~english + * Inits table object. + * \~russian + * Инициализирует объект. + * \see setObject() + * \param context - объект метаданных, который описывает таблицу. + * \param adb - ссылка на объект базы данных, которой + * принадлежит sql таблица. + * \~ + */ +void +aDataTable::init( aCfgItem context, aDatabase *adb ) +{ + db = adb; + fnames.clear(); + fnames.setAutoDelete( true ); + userFilter.clear(); + userFilter.setAutoDelete( true ); + setObject( context ); + +} + + + +/*! + * \~english + * Sets md object to table. + * \~russian + * Задает объект метаданных для таблицы. + * Заполняет внутренние объекты именами полей для последующего использования в + * функциях SetValue() и Value(), добавляет информацию о них в sql курсор. + * В случае, если добавляется накопительный регистр, к объетку добавляются также виртуальные поля - ресурсы регистра + * После вызова этой функции с таблицей можно начинать работу. + * \param context - объект метаданных, который описывает таблицу. + * \~ + */ +void +aDataTable::setObject( aCfgItem context ) +{ + aCfgItem cobj, parent; + parent = obj = context; + + + mdobjId = md->id(obj); + while ( !mdobjId ) + { + parent = md->parent(parent); + mdobjId = md->id(parent); + } + if ( context.isNull() ) + { + aLog::print(aLog::Error,QObject::tr("aDataTable try set mdobject to null")); + return; + } + mapCat.clear(); + mapDoc.clear(); + mapReg.clear(); + mapDim.clear(); + mapSum.clear(); + //TODO: test to memory leak + p_cat.clear(); + p_reg.clear(); + p_doc.clear(); +// printf("before delete p_cat\n"); +// if(p_cat) + //delete p_cat; + +// p_cat.clear(); +// printf("after delete p_cat\n"); +// if(p_reg) + //delete p_reg; +// p_reg.clear(); + if(md->objClass(context) == md_field && md->objClass(md->parent(context))== md_dimensions) + { + insertFieldInfo(context,false); + aCfgItem res; + aCfgItem ress = md->findChild(md->parent(md->parent(context)),md_resources); + uint n = md->count( ress, md_field ); + for ( uint i = 0; i < n; i++ ) + { + res = md->find( ress, md_field, i ); + insertFieldInfo(res,false); + } + } + uint n = md->count( context, md_field ); + for ( uint i = 0; i < n; i++ ) + { + cobj = md->find( context, md_field, i ); + insertFieldInfo(cobj); + + } + +// r = *this; +} + + +/*! + * \~english + * Appends info about field to object. + * \~russian + * Добавляет информацию о поле к объекту. + * \param obj - объект метаданных, который описывает поле. + * \param calculatd - указывает будет ли поле вычисляемым. + * \~ + */ +void +aSQLTable::insertFieldInfo(aCfgItem cobj, bool calculated) +{ + QString fname, fdbname, objt;//, fid; + int fid ; + + if ( !cobj.isNull() ) + { + fid = md->id(cobj); + fname = md->attr(cobj, mda_name); + objt = md->attr( cobj, mda_type ).upper(); + fdbname = QString("uf%1").arg( fid ); + if ( objt[0]=='O' ) + { + fnames.insert( fname, new QString(fdbname) ); + fdbname = QString("text_uf%1").arg( fid ); + append( Q3SqlFieldInfo( fdbname, QVariant::String ) ); + // setGenerated( fdbname, false ); + setCalculated( fdbname, calculated ); + int ftid = objt.section(" ", 1, 1 ).toInt(); + aCfgItem fto = md->find( ftid ); + if ( !fto.isNull() ) + { + if ( md->objClass( fto ) == md_catalogue ) + { + mapCat[fid] = fto; + } + if ( md->objClass( fto ) == md_document ) + { + mapDoc[fid] = fto; + } + } + } + else + if ( objt[0]==' ' ) + { + fdbname = QString("text_uf%1").arg( fid ); + append( Q3SqlFieldInfo( fdbname, QVariant::String ) ); + setCalculated( fdbname, calculated ); + // setGenerated( fdbname, false ); + fnames.insert( fname, new QString(fdbname) ); + int ftid = objt.section(" ", 1, 1 ).toInt(); + aCfgItem fto = md->find( ftid ); + if ( !fto.isNull() ) + { + if ( md->objClass( fto ) == md_aregister ) + { + aCfgItem s_field = md->find(objt.section(" ",2,2).toInt()); + aCfgItem dim_fields = md->find(fto,md_dimensions); + + if(!dim_fields.isNull()) + { + int cnt = md->count( dim_fields, md_field ); + for ( int k = 0; k < cnt; k++ ) + { + aCfgItem dim_field = md->find( dim_fields, md_field, k ); + QString type = md->attr(dim_field, mda_type); + if(type[0]=='O') + { + + if(type.section(" ",1,1).toInt()== mdobjId) + { + mapReg[fid]=fto; + mapDim[fid]= md->attr(dim_field,mda_name); + mapSum[fid] = md->attr(s_field,mda_name); + break; + } + } + } + } + } + } + + } + else + { + fnames.insert( fname, new QString(fdbname) ); + } + } +} + + +/*! + * \~english + * Gets metadata object. + * \~russian + * Получение объекта метаданных, которым инициализировали таблицу. + * \return объект метаданных, который описывает таблицу. + * \~ + */ +qulonglong +aDataTable::getIdd(void) +{ + return 0; +} +long +aDataTable::getMdObjId() +{ + return mdobjId; +} + + + +/*! + * \~english + * Stub. + * \~russian + * Заглушка. + * \~ + */ +void +aDataTable::appendField( aSQLField * ) // fieldinfo ) +{ + +} + + + +/*! + * \~english + * Stub. + * \~russian + * Заглушка. + * \~ + */ +void +aDataTable::insertField( int /*pos*/, aSQLField * ) // fieldinfo ) +{ + +} + + + +/*! + * \~english + * Stub. + * \~russian + * Заглушка. + * \~ + */ +void +aDataTable::removeField( int ) // pos ) +{ + +} + + + +/*! + * \~english + * Stub. + * \~russian + * Заглушка. + * \~ + */ +void +aDataTable::clearFields() +{ + +} + + + +/*! + * \~english + * Stub. + * \~russian + * Заглушка. + * \~ + */ +bool +aDataTable::checkStructure( bool ) //update ) +{ + bool rc = false; + if ( name().isEmpty() ) { + + } else { + + } + return rc; +} + + + +/*! + * \~english + * Return field falue. + * \~russian + * Возвращает значение поля с номером \a i. + * \param i - номер поля. + * \return значение поля + * \~ + */ +QVariant +aDataTable::value ( int i ) +{ + // QVariant v = QSqlCursor::value( i ); + + QVariant v = sysValue(Q3SqlCursor::fieldName(i)); + return v; +} + + + +/*! + * \~english + * Return field falue. + * \~russian + * Возвращает значение поля с именем \a name. + * Для получения значения необходимо указывать имя поля в метаданных + * \param name - имя поля в метаданных. + * \return значение поля или QVariant::Invalid, если поля не существует. + * \~ + */ +QVariant +aDataTable::value ( const QString & name ) +{ + QString fname; + QVariant v; + + if ( !fnames[name] ) + { + aLog::print(aLog::Error, QObject::tr("aDataTable get value of unknown field `%1'").arg(name)); + return QVariant::Invalid; + } + fname = * fnames[ name ]; + + //v = QSqlCursor::value( fname ); + + return sysValue(fname); +} + + + +/*! + * Return true if column name exists in database table. + */ + /*! + * \~english + * Check field existing. + * \~russian + * Проверяет существование поля в таблице + * \param name - имя поля в таблице (не в метаданных!). + * \return \~engish true if column name exists in database table \~russian true, если столбец с данным именем есть в таблице. \~ + * \~ + */ + +bool +aDataTable::sysFieldExists( const QString & name ) +{ + return contains( name ); +} + + + +/*! + * Return value of the column of the database table. + */ +QVariant +aDataTable::sysValue ( const QString & name ) +{ + if(isCalculated(name)) return calcFieldValue(name); + else return Q3SqlCursor::value( name ); +} + + + +/*! + * + */ +void +aDataTable::setSysValue ( const QString & name, QVariant value ) +{ + if ( name == QString("pnum") ) + { + aLog::print(aLog::Info, QObject::tr("aDataTable get document prefix to `%1'").arg(value.toString())); + // debug_message("document prefix set to '%s'\n",(const char*)value.toString()); + } + + Q3SqlCursor::setValue( name, value ); +} + + + +/*! + * Set value of the column of the database table. + */ +void +aDataTable::setValue ( int i, QVariant value ) +{ + Q3SqlCursor::setValue( i, value ); +} + + + +/*! + * + */ +bool +aDataTable::setValue ( const QString & name, QVariant value ) +{ + QString fname; + if ( !fnames[name] ) return false; + fname = * fnames[ name ]; + if ( contains( fname ) ) { + Q3SqlCursor::setValue( fname, value ); + } + else return false; + return true; +} + + + +/*! + * + */ +QSqlRecord * +aDataTable::primeInsert() +{ + QSqlRecord *rec; + QVariant v; + + rec = Q3SqlCursor::primeInsert(); + if ( sysFieldExists("id") ) { + rec->setValue("id", QVariant( db->uid( mdobjId ) ) ); + } + return rec; +} + + + +/*! + * + *//* +QSqlRecord * +aDataTable::primeUpdate() +{ + QSqlRecord *rec; + + rec = QSqlCursor::primeUpdate(); + *rec = r; + return rec; +} +*/ + + +/*! + * + */ +bool +aDataTable::select( const QString & filter, bool usefltr ) +{ + bool res; + QString flt = getFilter(); + if ( usefltr ) + { + if ( flt == "" ) flt = filter; + else if ( filter != "" ) flt = flt + " AND " + filter; + } + else flt = filter; + res = Q3SqlCursor::select( flt ); +// next(); +// r = *this; + return res; +} + + + +/*! + * + */ +bool +aDataTable::select( qulonglong id ) +{ + bool res; +// printf("aSQLTable::select %llu\n",id); + res = Q3SqlCursor::select( QString( "id=%1" ).arg( id ) ); + //setSelected(true); +// next(); +// r = *this; + return res; +} + + + +/*! + * + */ +void +aDataTable::clearFilter() +{ + aLog::print(aLog::Debug, QObject::tr("aDataTable clear filter")); + userFilter.clear(); +} + + +/*QDict +aDataTable::getUserFilter() { + return this.userFilter; +}; + +void +setUserFilter( QDict newFilter) { + this.userFilter = newFilter; +}; +*/ + +/** + * + */ +void +aDataTable::setFilter ( const QString & newFilter ) { + Q3SqlCursor::setFilter( newFilter ); +} + + +/*! + * + */ +bool +aDataTable::setFilter( const QString& name, const QVariant& value ) +{ + + aLog::print(aLog::Debug, QObject::tr("aDataTable set filter %1='%2'").arg(name).arg(value.toString())); + if ( !fnames[name] ) + { + aLog::print(aLog::Error, QObject::tr("aDataTable set filter %1='%2', %3 not exist").arg(name).arg(value.toString()).arg(name)); + return false; + } + QVariant *v = new QVariant(value); + userFilter.replace(*fnames[name], v ); + Q3SqlCursor::setFilter(getFilter()); + return true; +} + + + +/*! + * + */ +QString +aDataTable::getFilter() +{ + QString filter = "", fid, type; + aCfgItem field; + Q3DictIteratorit( userFilter ); + if ( it.toFirst() ) + { + fid = it.currentKey().mid(2); + field = md->find(fid.toLong() ); + if ( !field.isNull() ) + { + type = md->attr( field, mda_type ); + if ( type[0] == 'N' || type[0] == 'O' ) + filter = it.currentKey() + "=" + it.current()->toString(); + else + filter = it.currentKey() + "='" + it.current()->toString() + "'"; + } + } + ++it; + for (;it.current();++it) + { + fid = it.currentKey().mid(2); + field = md->find(fid.toLong() ); + if ( !field.isNull() ) + { + type = md->attr( field, mda_type ); + if ( type[0] == 'N' || type[0] == 'O' ) + filter += " and " + it.currentKey() + "=" + it.current()->toString(); + else + filter += " and " + it.currentKey() + "='" + it.current()->toString() + "'"; + } + } + return filter; +} + + + +/*! + * + */ +QString +aDataTable::getNFilter() +{ + QString filter = "", fid, type; + aCfgItem field; + Q3DictIteratorit( userFilter ); + if ( it.toFirst() ) + { + fid = it.currentKey().mid(2); + field = md->find(fid.toLong() ); + if ( !field.isNull() ) + { + type = md->attr( field, mda_type ); + if ( type[0] == 'N' || type[0] == 'O' ) + filter = tableName + "." + it.currentKey() + "=" + it.current()->toString(); + else + filter = tableName + "." + it.currentKey() + "='" + it.current()->toString() + "'"; + } + } + ++it; + for (;it.current();++it) + { + fid = it.currentKey().mid(2); + field = md->find(fid.toLong() ); + if ( !field.isNull() ) + { + type = md->attr( field, mda_type ); + if ( type[0] == 'N' || type[0] == 'O' ) + filter += " and " + tableName + "." + it.currentKey() + "=" + it.current()->toString(); + else + filter += " and " + tableName + "." + it.currentKey() + "='" + it.current()->toString() + "'"; + } + } + return filter; +} + + + +/*! + * + */ +void +aDataTable::printRecord(){ + unsigned int i; + Q3DictIterator it( fnames ); + QString fname, sname; + + for (i=0; i< count(); i++){ + fname = ""; + sname = field( i ).name(); + it.toFirst(); + for( ; it.current(); ++it ){ + if ( *it.current() == sname ) { + fname = it.currentKey(); + break; + } + } + printf("%s(%s)=%s\n", + ( const char *) fname, + ( const char *) sname, + ( const char *) value( i ).toString().local8Bit() ); + } + +/* for (i=0; i< r.count(); i++){ + fname = ""; + sname = r.field( i )->name(); + it.toFirst(); + for( ; it.current(); ++it ){ + if ( *it.current() == sname ) { + fname = it.currentKey(); + break; + } + } + printf("r:%s(%s)=%s\n", + ( const char *) fname, + ( const char *) sname, + ( const char *) r.value( i ).toString().local8Bit() ); + } +*/ +} + + + +/*! + * +*/ +bool +aDataTable::exec( QString query ) +{ + return Q3SqlCursor::exec( query ); +} + + + +QVariant +aDataTable::calc_rem(int fid, qulonglong id) +{ + aCfgItem o,fto; + QString t,oclass; + int ftid,oid; + QVariant v=""; + fto = mapReg[fid];// = md->find( ftid ); + if ( !fto.isNull() ) + { + if(p_reg[QString("%1").arg(fid)]==0) + { + p_reg.insert(QString("%1").arg(fid), new aARegister( fto, db )); + } + v = ((aARegister*)p_reg[QString("%1").arg(fid)])->getSaldo( QDateTime::currentDateTime(), + mapDim[fid], + id, + mapSum[fid]);//md->attr(s_field,mda_name)); + if(!v.isValid()) v = ""; + } + return v; +} + + +QVariant +aDataTable::calc_obj(int fid, qulonglong idd) +{ + aCfgItem o,fto; + QString t,oclass; + int ftid; + QVariant v=""; +// printf("calculate cat %d, %llu\n",fid, idd); + o = mapCat[fid]; + if( !o.isNull() ) + { + aCatalogue *pCat = (aCatalogue*)p_cat[QString("%1").arg(fid)]; +// printf("obj not null\n"); + if(pCat==0) + { + p_cat.insert(QString("%1").arg(fid), new aCatalogue( o, db )); + pCat = (aCatalogue*)p_cat[QString("%1").arg(fid)]; + } + pCat->select( idd ); + + if ( pCat->selected() ) + { +// printf("select ok\n"); + v = QVariant( pCat->displayString() ); + } + } + else + { + o = mapDoc[fid]; + if(!o.isNull()) + { + aDocument *pDoc = (aDocument*)p_doc[QString("%1").arg(fid)]; +// printf("obj not null\n"); + if(pDoc==0) + { + p_doc.insert(QString("%1").arg(fid), new aDocument( o, db )); + pDoc = (aDocument*)p_doc[QString("%1").arg(fid)]; + } + pDoc->select( idd ); + if ( pDoc->selected() ) + { + v = QVariant( pDoc->displayString() ); + } + } + } + + return v; +} + +/*! + * Calculate value object type fields. + */ +QVariant +aDataTable::calculateField( const QString &name ) +{ + QVariant v; + if(name=="system_icon") return v; + else return QVariant(""); +// return QVariant::Invalid; +} + +/*! + * Calculate value object type fields. + */ +QVariant +aDataTable::calcFieldValue( const QString &name ) +{ + + QVariant v="", fv=0; + int fid = 0; //, ftid; + qulonglong id = 0; + aCfgItem o, fto; + QString t, oclass; + if ( name.left(5)=="text_" ) + { + if(sysFieldExists(name.mid(5))) + { + fv = sysValue( name.mid( 5 ) ); + id = fv.toULongLong(); + } + else + { + id = 0; + } + fid = name.mid( 7 ).toInt(); + v = QVariant(""); + if ( fid && id ) + { + v=calc_obj(fid,id); + } + else + { + if(fid) + { + id = sysValue("id").toULongLong(); + v=calc_rem(fid,id); + } + } + } +// printf("calculate field %s\n", name.ascii()); + return v; +} + + + +/*! + * Gets list of user and calculation fields. + */ +QStringList +aDataTable::getUserFields() +{ + QStringList lst; + uint i; + const QString text_uf = "text_uf"; + for(i=0; iuid( mdobjId ); + aLog::print(aLog::Debug, QString("aDataTable new record with id=%1 for meta object with id=%2").arg(Uid).arg(mdobjId)); + + rec->setValue("id", QVariant( Uid ) ); + } + if ( insert() ) + { + if ( select(QString("id=%1").arg(Uid), false) ) + if ( first() ) + { + res = true; + } + else + { + aLog::print(aLog::Error, QString("aDataTable record with id=%1 not found").arg(Uid)); + } + } + return res; +} + + +bool +aDataTable::Copy() +{ + QSqlRecord *rec = new QSqlRecord( *editBuffer(true) ); + if ( New() ) + { + for ( unsigned int i=0; icount(); i++ ) + { + if ( rec->field( i ).name() != QString("id") ) + { + setValue( i, rec->value( i ) ); +// printf("field %s, before %s, after %s\n",rec->field( i )->name().ascii(), rec->value( i ).toString().ascii(), value( i ).toString().ascii()); + } + } + } + delete rec; + return Update(); +// Q_ULLONG Uid = db->uid( t->id ); +// r->setValue("id",Uid); +// if ( t->insert() ) return Uid; + +// return true; +} + + +bool +aDataTable::Delete() +{ + QSqlRecord *rec; + rec = primeDelete(); + del(); +// fNewNotUpdated = false; + return true; +} + + +bool +aDataTable::Update() +{ + QSqlRecord *rec; + + rec = Q3SqlCursor::primeUpdate(); + //for ( unsigned int i=0; icount(); i++ ) rec->setValue( i, value( i ) ); + update(); + QSqlError err = lastError(); + if(!err.type() == QSqlError::None) + { + aLog::print(aLog::Error, QString("%1 %2").arg(err.text()).arg(err.driverText()) ); + } + return true; +} + diff --git a/src/lib/asqltable.h b/src/lib/asqltable.h new file mode 100644 index 0000000..32f206c --- /dev/null +++ b/src/lib/asqltable.h @@ -0,0 +1,139 @@ +/**************************************************************************** +** $Id: asqltable.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Ananas database table of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ASQLTABLE_H +#define ASQLTABLE_H +#include +#include +#include "acfg.h" +//#include "aaregister.h" +//#include "adatarecord.h" + +// temporray define for old definitions +#define aSQLTable aDataTable + + +class aDatabase; +class aSQLField; + +/*! + * \~english + * Provides browsing and editing Ananas's sql tables mantained by Ananas.Designer. + * \~russian + * \brief Определяет программный интерфейс модели данных aDataTable. Наследует QSqlCursor. + * + * Позволяет работать с табличными представлениями данных, определенных метаданными бизнес схемы. + * \~ + */ +class ANANAS_EXPORT aDataTable : public Q3SqlCursor +{ +public: + aDatabase* db; + QString tableName; + bool selected; + + aSQLTable( aCfgItem context, aDatabase *adb ); + aSQLTable( const QString &tname, aDatabase *adb ); + virtual ~aSQLTable(); + void init( aCfgItem context, aDatabase *adb ); + void setObject(aCfgItem context); + void appendField( aSQLField * fieldinfo ); + void insertField( int pos, aSQLField * fieldinfo ); + void removeField( int pos ); + void clearFields(); + bool checkStructure( bool update ); + long getMdObjId(); + qulonglong getIdd(); + void printRecord(); + //QDict getUserFilter(); + //void setUserFilter( QDict ); + + virtual QVariant value ( int i ); + virtual QVariant value ( const QString & name ); + virtual void setValue ( int i, QVariant value ); + virtual bool setValue ( const QString & name, QVariant value ); + virtual QVariant sysValue ( const QString & name ); + virtual void setSysValue ( const QString & name, QVariant value ); + virtual bool sysFieldExists( const QString & name ); + + virtual QSqlRecord *primeInsert(); +// virtual QSqlRecord *primeUpdate(); + + virtual bool select( const QString & filter="", bool usefltr = true ); + virtual bool select( qulonglong id ); + virtual void clearFilter(); + virtual bool setFilter( const QString &name, const QVariant &value ); + virtual void setFilter( const QString& ); + virtual QString getFilter(); + virtual QString getNFilter(); + virtual bool exec( QString query ); + virtual QStringList getUserFields(); + virtual ERR_Code setMarkDeleted( bool Deleted ); + virtual bool isMarkDeleted(); + + virtual bool New(); + virtual bool Copy(); + virtual bool Delete(); + virtual bool Update(); + + virtual bool seek ( int i, bool relative = FALSE ); + virtual bool next (); + virtual bool prev (); + virtual bool first (); + virtual bool last (); + + +protected: + QVariant calcFieldValue( const QString &name ); + virtual QVariant calculateField( const QString &name ); + virtual QVariant calc_obj(int fid,qulonglong idd); + virtual QVariant calc_rem(int fid,qulonglong id); + void insertFieldInfo(aCfgItem cobj, bool calculated=true); + + long mdobjId; + +private: +// bool fNewNotUpdated; + aCfgItem obj; + aCfgItem init_obj; + aCfg* md; + Q3Dict p_cat; + Q3Dict p_doc; + Q3Dict p_reg; + QMap mapCat, mapReg, mapDoc; + QMap mapDim,mapSum; + QStringList fildsList; + Q3Dict fnames; + Q3Dict userFilter; +// QDict dataRecord; +// aDataRecord dataRecord; +// QSqlRecord r; +}; + +#endif diff --git a/src/lib/atests.cpp b/src/lib/atests.cpp new file mode 100644 index 0000000..31299c2 --- /dev/null +++ b/src/lib/atests.cpp @@ -0,0 +1,239 @@ +/**************************************************************************** +** $Id: atests.cpp,v 1.2 2008/11/08 20:16:35 leader Exp $ +** +** Tests functions source file of +** Ananas application library +** +** Created : 20051024 +** +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "atests.h" +#include "alog.h" +#include +#include +#include + +/*! + *\~english + * Writes text to log. + *\~russian + * Пишет текст в лог. + *\~ + * \param log_name - \~english Full path to logfile \~russian Полный путь к лог файлу \~ + * \param test_name - \~english Test name \~russian Имя теста \~ + * \param status - \~english OK, ERROR or SKIP \~russian OK, ОШИБКА или ПРОПУЩЕН \~ + * \param text - \~english Comment \~russian Комментарий \~ +*/ +void +aTests::print2log( const QString &log_name, + const QString &test_name, + const QString &status, + const QString &text) +{ + QString toWrite = QString("%1::%2::%3::%4\r\n")\ + .arg(QDateTime::currentDateTime().toString(Qt::ISODate).replace('T',' '))\ + .arg(test_name)\ + .arg(status)\ + .arg(text); + + QFile f; + if(log_name==QString::null) + { + f.open( QIODevice::WriteOnly, stdout ); + f.writeBlock((const char*)toWrite,strlen((const char*)toWrite)); + } + else + { + f.setName(log_name); + f.open( QIODevice::WriteOnly | QIODevice::Append ); + f.writeBlock((const char*)toWrite,strlen((const char*)toWrite)); + f.flush(); + } + f.close(); + +// else printf("error write to log\n"); +} + + +/*! + *\~english + * Reads config into QMap object. + *\~russian + * Считывает конфиг в объект QMap. + *\~ + * \param conf_name - \~english configfile name \~russian Путь к конфигу \~ + * \param log_name - \~english logfile name \~russian Путь к логу (не обязательно) \~ + * \return - \~english map with config values \~russian map со значениями конфига \~ +*/ +QMap +aTests::readConfig(const QString &conf_name,const QString &log_name) +{ + QMap map; + QString str, buff; + QStringList list; + QFile f(conf_name); + if(!f.exists()) + { + aLog::print(aLog::Error, QObject::tr("aTests file %1 not exists").arg(f.name())); + } + else + { + if(!f.open( QIODevice::ReadOnly )) + { + aLog::print(aLog::Error, QObject::tr("aTests file %1 not open for read").arg(f.name())); + } + else + { + while(!f.atEnd()) + { + str=f.readLine(1024); + if(!str.isEmpty()) + //--if(f.readLine(str,1024)!=-1) + { + if(str==QString::null || str[0]=='#' || str[0]=='\n') continue; + QString s = str.section("=",0,0); + map[s] = (str.right(str.length() - s.length()-1)).stripWhiteSpace(); + aLog::print(aLog::Debug, QString("map[%1] = %2").arg(s).arg(map[s])); + } + else + { + break; + } + } + f.close(); + } + } + return map; +} + + +/*! + *\~english + * Writes config. + *\~russian + * Пишет конфиг из объекта QMap. + *\~ + * \param conf_name - \~english configfile name \~russian Путь к конфигу \~ + * \param log_name - \~english logfile name \~russian Путь к логу (не обязательно) \~ + * \return - \~english true, if successful \~russian true - успех \~ +*/ +bool +aTests::writeConfig(const QString &conf_name, QMap map, const QString &log_name) +{ + QString str; + QFile f(conf_name); + if(!f.exists()) + { + aLog::print(aLog::Error, QObject::tr("aTests file %1 not exists").arg(f.name())); + } + //else + //{ + if(f.open( QIODevice::WriteOnly )) + { + QMap::Iterator it; + for ( it = map.begin(); it != map.end(); ++it ) + { + str= QString("%1=%2\n").arg(it.key()).arg(it.data()); + f.writeBlock((const char*)str,strlen((const char*)str)); + f.flush(); + } + f.close(); + if(log_name!=QString::null) + { + aTests::print2log(log_name,conf_name,"OK","write config"); + } + } + else + { + aLog::print(aLog::Error, QObject::tr("aTests file %1 not open for read").arg(f.name())); + return 0; + } + //} + return 1; +} +/*! + *\~english + * Writes line in log with name \a log_name + *\~russian + * Пишет строку в лог с именем \a log_name + *\~ + * \param log_name - \~english logfile name \~russian Путь к логу (не обязательно) \~ +*/ +void +aTests::printline2log(const QString &log_name) +{ + QString toWrite; + toWrite.fill('=',60); + toWrite+="\n"; + QFile f; + if(log_name==QString::null) + { + f.open( QIODevice::WriteOnly, stdout ); + f.writeBlock((const char*)toWrite,strlen((const char*)toWrite)); + } + else + { + f.setName(log_name); + f.open( QIODevice::WriteOnly | QIODevice::Append ); + f.writeBlock((const char*)toWrite,strlen((const char*)toWrite)); + f.flush(); + } + f.close(); +} + +/*! + *\~english + * Find parament in command line. + *\~russian + * Ищет параметр с именем \a requestedParam в коммандной строке и если находит, то возвращает его + * значение (то, что идет после знака = до первого пробела). Заменяет знак ~ на $(HOME) + *\~ + * \param argc - \~english parametr command line count \~russian число параметров коммандной строки \~ + * \param argv - \~english command line paraments \~russian параметры коммандной строки \~ + * \param requestedParam - \~english param for search \~russian параметр для поиска \~ + * \return - \~english parametr value \~russian значение параметра \~ +*/ +QString +aTests::parseCommandLine(int argc, char** argv, const QString requestedParam) +{ + + QString param,value; + for(int j=1;j + +/*! + * \~english + * Class contain static functions for test utilites + * \~russian + * \brief Класс содержит статические функции для утилит тестирования. + * + * Предназначен для использования при отладке и тестировании кода. + * \~ +*/ +class ANANAS_EXPORT aTests +{ + public: + + static QMap readConfig(const QString &cfg_name, const QString &log_name=QString::null); + static bool writeConfig(const QString &cfg_name,QMap cfg, const QString &log_name=QString::null); + static void print2log( const QString &log_name, + const QString &test_name, + const QString &status, + const QString &text=""); + + static void printline2log(const QString &log_name); + static QString parseCommandLine(int argc, char** argv, const QString requestedParam); + + private: + aTests(); +}; +#endif// ATESTS_H diff --git a/src/lib/atime.cpp b/src/lib/atime.cpp new file mode 100644 index 0000000..9cbadf0 --- /dev/null +++ b/src/lib/atime.cpp @@ -0,0 +1,119 @@ +/**************************************************************************** +** $Id: atime.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Engine applications +** +** Created : 20041109 +** +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "atime.h" +//#include "adatabase.h" +//#include "adocjournal.h" + + + +/*! + *\en + * Constructor that create object aTime for work in ananas script. + *\_en + *\ru + * Конструктор, который создает aTime для работы в ананас скрипте. + *\_ru + */ +aTime::aTime(): QObject() +{ + time = new QTime; + +} + +/*! + *\en + * Destructor + *\_en + *\ru + * Деструктор + *\_ru + */ +aTime::~aTime() +{ + delete time; +} + +/*! + *\en + * Starts timer. + *\_en + *\ru + * Запускает таймер. + *\_ru + */ +void +aTime::start() +{ + time->start(); +} + + +/*! + *\en + * Restarts timer. + *\_en + *\ru + * Перезапускает таймер. + *\_ru + */ +int +aTime::restart() +{ + time->restart(); + return 0; +} + +/*! + *\en + * Gets elapsed time from last call of start() or restart() + *\_en + *\ru + * Возвращает количество миллисекунд с последнего запуска таймера. + *\_ru + */ +int +aTime::elapsed() +{ + return time->elapsed(); +} + +/*! + *\en + * Return current date for ananas.script + *\_en + *\ru + * Возвращает текущую дату в ISO формате. Используется для работы с Ананас.Скриптом + *\_ru + */ +QString +aTime::CurrentDate() +{ + return QDate::currentDate().toString(Qt::ISODate); +} + diff --git a/src/lib/atime.h b/src/lib/atime.h new file mode 100644 index 0000000..702af8b --- /dev/null +++ b/src/lib/atime.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** $Id: atime.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Accumulation Register of Ananas +** Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ATIME_H +#define ATIME_H + +#include +#include +//#include "airegister.h" +#include "ananas.h" + + + + +/*! + *\en + *\_en + *\ru + * \brief Сервисный класс для работы с объектом Время + *\_ru + */ +class ANANAS_EXPORT aTime : public QObject +{ + Q_OBJECT +public: + aTime(); + ~aTime(); +protected: + QTime *time; +public slots: + + virtual void start(); + virtual int restart(); + virtual int elapsed(); + virtual QString CurrentDate(); +}; + +#endif// ATIME_H diff --git a/src/lib/auser.cpp b/src/lib/auser.cpp new file mode 100644 index 0000000..7caeed7 --- /dev/null +++ b/src/lib/auser.cpp @@ -0,0 +1,402 @@ +/**************************************************************************** +** $Id: auser.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** User object implementation file of +** Ananas application library +** +** Created : 20050527 +** +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "auser.h" +//Added by qt3to4: +#include +//#include "ananas.h" + + +/*!\en Constructor for concrete object class creating + * \_en + * \ru Конструктор для создания конкретного объекта класса + * \_ru + */ +aUser::aUser( qulonglong userId, aDatabase * adb ):aObject("",adb) +{ + + initObject(); + Select(userId); + +} +/*!\en Constructor for abstract object class creating + * \_en + * \ru Конструктор для создания абстрактного объекта класса + * \_ru + */ +aUser::aUser( aDatabase * adb ):aObject("",adb) +{ + +// Select(userId); + initObject(); +} + + + + +/*!\en Reimplement base class function + * \_en + * \ru Переопределяет функцию базового класса + * \_ru + */ +ERR_Code +aUser::initObject() +{ + ERR_Code err = aObject::initObject(); // don't handle errors + //if ( err ) return err; + //aCfgItem e;// = md->find( obj, md_group ), e = md->find( obj, md_element ); + err = tableInsert( db_users, ""); + + if(err) return err; + err = tableInsert( db_user_roles, md_user_roles ); + return err; +} + +/*!\en Returns list of roles, (un)assigned for this user. List elements must be deleted in called procedure. + * \_en + * \ru Возвращает список ролей, (не)назначенных данному пользователю. Элементы списка должны быть удалены в вызывающей процедуре + * \_ru + * \param assibned \en true for return assigned roles, false for retun unassigned roles\_en + * \ru true для возврата назначенных ролей, false для возврата неназначенных ролей \_ru + */ +Q3ValueList< aRole *> +aUser::getRoles(bool assigned) +{ + Q3ValueList list; + qulonglong rid; + aRole *rl = new aRole(db); + rl->Select(); + if(rl->First()) + { + do + { + rid = rl->sysValue("id").toULongLong(); + if(!(hasRole(rid) ^ assigned))// !XOR + { + aRole *r = new aRole(rid,db); + list.insert(list.end(),r); + } + }while(rl->Next()); + } + delete rl; + return list; +} + +/*!\en Gets user id + * \_en + * \ru Получение id пользователя + * \_ru + * \param login \en user login \_en \ru логин пользователя\_ru + * \param password \en user password \_en \ru пассворд пользователя\_ru + * \return \en 0 if login and password has no match, user id otherwise \_en + * \ru 0 если логин и пароль не совпадают, в противном случае id пользователя\_ru + */ +qulonglong +aUser::getUserId(const QString &login, const QString &password) +{ + aSQLTable * t = table(); + t->select(QString("login='%1' AND password='%2'").arg(login).arg(password)); + if(t->first()) + { + return t->sysValue( "id").toULongLong(); + } + else + { + return 0; + } + +} + + + +/*!\en Updates table values + * \_en + * \ru Обновляет значения таблиц + * \_ru + */ +ERR_Code +aUser::Update() +{ + ERR_Code err = aObject::Update(); + if ( !err ){ + err = TableUpdate( md_user_roles ); + } + return err; +} + + +/*!\en Selected table and clear filter + * \_en + * \ru Выбирает таблицу и сбрасывает фильтр + * \_ru + */ +ERR_Code +aUser::Select( ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; +// setSelected(true,md_group); +// setSelected(true); + QString flt = ""; +// groupSelect(); + if ( t->select( flt ) ) + if ( t->first() ) + { + setSelected(true); + } + else return err_notselected; + else return err_selecterror; + return err_noerror; +} + +/*!\en Select table and set filter to user with given id + * \_en + * \ru Выбирает таблицу и устанавлиет фильтр на пользователя с переданным в параметре id + * \_ru + * \param id - \en user id \_en \ru id пользователя \_ru + */ +ERR_Code +aUser::Select( qulonglong id) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; +// setSelected(true,md_group); +// setSelected(true); + QString flt; + flt = QString("id=%1").arg(id); +// groupSelect(); + if ( t->select( flt ) ) + if ( t->first() ) + { + setSelected(true); + } + else return err_notselected; + else return err_selecterror; + return err_noerror; +} + +/*!\en Assign role to user + * \_en + * \ru Назначет пользователю роль + * \_ru + * \param roleId - \en id role to asssign \_en \ru id роли для назначения\_ru + */ +ERR_Code +aUser::addRole( qulonglong roleId ) +{ + aSQLTable *tg = table( md_user_roles ); + if (!tg ) return err_notable; + setSelected(true, md_user_roles); +// tg->select(parentId); +// setSelected(true,md_group); + qulonglong idg; + QSqlRecord* rec = tg->primeInsert(); // get edit buffer for table groups + idg = sysValue("id").toULongLong(); + //printf( "idg=%lu\n", idg ); + rec->setValue("id",idg ); + rec->setValue("idr",roleId ); + tg->insert(); // insert record + //tg->update(); +return err_noerror; +} + +/*!\en Drop role + * \_en + * \ru Сбрасывает назначение роли пользователю + * \_ru + * \param roleId - \en id role to drop \_en + * \ru id роли, назначение которой будет сброшено\_ru + */ +ERR_Code +aUser::delRole( qulonglong roleId ) +{ + aSQLTable *t = table( md_user_roles ); + qulonglong ide=0; + if ( !t ) return err_notable; + ide = sysValue("id").toULongLong(); + t->select(QString("id=%1 and idr=%2").arg(ide).arg(roleId)); + if ( t->first() ) + { + //printf("del usr_role \n"); + t->primeDelete(); + t->del(); +// setSelected( false ); + } + else return err_notselected; + return err_noerror; +return err_noerror; +} + +/*!\en Checks role assign + * \_en + * \ru Проверяет, назначена ли роль данному пользователю + * \_ru + * \param rid - \en role id to check \_en + * \ru id роль для проверки \_ru + * \return \en true, if role assigned, false otherwise \_en + * \ru true, если роль назначена, false в противном случае \_ru + */ +bool +aUser::hasRole(qulonglong rid) +{ + aSQLTable *tg = table( md_user_roles ); + if (!tg ) return err_notable; + tg->select(QString("id=%1 AND idr=%2").arg(sysValue("id").toULongLong()).arg(rid)); + if(tg->first()) + return true; + else return false; +// setSelected(true, md_user_roles); + + +} + +/*!\en + * Inserts new element in elements table + \_en \ru + * Вставляет новый элемент в таблицу элементов + *\_ru + * \param login - \en login \_en \ru логин \_ru + * \param password - \en password \_en \ru пароль \_ru + * \param firstName - \en first name \_en \ru имя пользователя \_ru + * \param lastName - \en last name \_en \ru фамилия пользователя \_ru + */ +ERR_Code +aUser::New(const QString &login, + const QString &password, + const QString &firstName, + const QString &lastName) +{ + aSQLTable *te = table(); + if (!te) return err_notable; + QSqlRecord *rec; + qulonglong ide; + rec = te->primeInsert(); // get edit buffer for table elements + ide = rec->value("id").toULongLong(); +// printf(">>>id=%lu\n",ide); + rec->setValue("id",ide); // set defult values for all user fields = id + rec->setValue( "login", login ); + rec->setValue( "password", password ); + rec->setValue( "fname", firstName ); + rec->setValue( "lname", lastName ); + te->insert(); // insert edit buffer as new line in table + te->select(QString("id=%1").arg(ide),false); // set cursor to inserted record + te->first(); + setSelected(true); + return err_noerror; +} + + + + + +/*!\en + * Delets user. + \_en \ru + * удаляет пользователя. + *\_ru + */ +ERR_Code +aUser::Delete() +{ + aSQLTable * t = table(); + qulonglong ide=0; + if ( !t ) return err_notable; + ide = t->sysValue("id").toULongLong(); + if ( ide ) + { + // printf("ide=" LLU_SPEC "\n",ide); + t->primeDelete(); + t->del(); +//TODO: clear roles, assigned to user + setSelected( false ); + } + else return err_notselected; + return err_noerror; +} + + +/*!\en Updates roles table values + *\_en + * \ru Обновляет значение таблицы ролей + *\_ru + */ +ERR_Code +aUser::UpdateRole() +{ + return TableUpdate( md_user_roles ); +} + + +/*!\en Next + *\_en + * \ru + *\_ru + */ +bool +aUser::Next() +{ + return aObject::Next( ); //return !groupSelect(); + //else return false; +} + +/*!\en Rpev + *\_en \ru + *\_ru + */ +bool +aUser::Prev() +{ + return aObject::Prev( ); //return !groupSelect(); +// else return false; +} + +/*!\en First + *\_en \ru + *\_ru + */ +bool +aUser::First() +{ + return aObject::First( ); //return !groupSelect(); + //else return false; +} + +/*!\en Last + *\_en \ru + *\_ru + */ +bool +aUser::Last() +{ + return aObject::Last( ); //return !groupSelect(); + //else return false; +} + + + diff --git a/src/lib/auser.h b/src/lib/auser.h new file mode 100644 index 0000000..f49d9cc --- /dev/null +++ b/src/lib/auser.h @@ -0,0 +1,95 @@ +/**************************************************************************** +** $Id: auser.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** User object header file of +** Ananas application library +** +** Created : 20050527 +** +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AUSER_H +#define AUSER_H + +#include "arole.h" +#include "adatabase.h" +#include "acfg.h" +#include "aobject.h" +#include +//class aDatabase; +//class aRole; +//class aObject; + + + +/*! + * \en + * Not visual object used for working with users in database. + * \_en + * \ru + * \brief Определяет программный интерфейс для управления пользователями. Не используется в настоящий момент. + * Наследует aObject. + * \_ru +*/ +class ANANAS_EXPORT aUser: public aObject +{ + Q_OBJECT +public: + aUser(); + aUser(qulonglong userId, aDatabase * adb); + aUser(aDatabase * adb); + virtual ERR_Code initObject(); + +//public slots: + + virtual ERR_Code New( const QString &login, + const QString &passwd="", + const QString &Name="", + const QString &LastName=""); + + virtual ERR_Code Delete(); + virtual ERR_Code Update(); + virtual ERR_Code Select(); + virtual ERR_Code Select( qulonglong userId ); + + virtual ERR_Code addRole( qulonglong roleId ); + virtual ERR_Code delRole( qulonglong roleId ); + virtual ERR_Code UpdateRole(); + + Q3ValueList< aRole *> getRoles( bool assigned); + + bool hasRole( qulonglong roleId); +// virtual ERR_Code setPassword( const QString & ); + //virtual ERR_Code setLogin( const QString & ); + //virtual ERR_Code setFirstName( const QString & ); + //virtual ERR_Code setLastName( const QString & ); + + virtual qulonglong getUserId( const QString &login, const QString &password ); + //virtual ERR_Code getRoles(QValueList *lst); + bool First(); + bool Next(); + bool Last(); + bool Prev(); +}; + + +#endif// AUSER_H diff --git a/src/lib/dialogs/awindowslist.cpp b/src/lib/dialogs/awindowslist.cpp new file mode 100644 index 0000000..2427415 --- /dev/null +++ b/src/lib/dialogs/awindowslist.cpp @@ -0,0 +1,176 @@ +/**************************************************************************** +** $Id: awindowslist.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Main window of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "awindowslist.h" +#include "acfg.h" + +/*! + * \~english + * Constructor + * \~russian + * Конструктор. + * \~ + */ +aWindowsList::aWindowsList() + : QWidget() +{ +} + + +/*! + * \~english + * Destructor + * \~russian + * Деструктор. + * \~ + */ +aWindowsList::~aWindowsList() +{ +} + + +/*! + * \~english + * Insert window into list. + * \~russian + * Добавляет ссылку на окно в список. + * \~ + * \param id - \~english object class id \~russian идентификатор класса объекта \~ + * \param window - \~english link to form \~russian ссылка на форму \~ + * \param ido - \~english object id (default 0) \~russian идентификатор объекта (по умолчанию 0) \~ + */ +void +aWindowsList::insert( int id, QWidget *window, qulonglong ido ) +{ + list.insert( conv( id, ido ), window ); +} + +/*! + * \~english + * Remove window from list. + * \~russian + * Удаляет окно из списка. + * \~ + * \param id - \~english object class id \~russian идентификатор класса объекта \~ + * \param ido - \~english object id (default 0) \~russian идентификатор объекта (по умолчанию 0) \~ + */ +void +aWindowsList::remove( int id, qulonglong ido ) +{ + list.remove( conv( id, ido ) ); +} + +/*! + * \~english + * Remove window from list. + * \~russian + * Удаляет окно из списка. + * \~ + * \param window - \~english link to form \~russian ссылка на форму \~ + */ +void +aWindowsList::remove( QWidget *window ) +{ + Q3DictIterator it( list ); + for ( ; it.current(); ++it ) + { + if ( it.current() == window ) { + list.remove( it.currentKey() ); + break; + } + } +} + +/*! + * \~english + * Find window with \a id and \a ido. + * \~russian + * Ищет окно по его \a id и \a ido + * \~ + * \param id - \~english object class id \~russian идентификатор класса объекта \~ + * \param ido - \~english object id (default 0) \~russian идентификатор объекта (по умолчанию 0) \~ + * \return \~english true, if window found \~russian true, если окно найдено. \~ + */ +bool +aWindowsList::find( int id, qulonglong ido ) +{ + if ( !list.find( conv( id, ido ) ) ) return FALSE; + return TRUE; +} + +/*! + * \~english + * Find object in list with link + * \~russian + * Ищет объект в списке по ссылке. + * \~ + * \param window - \~english link to form \~russian ссылка на форму \~ + * \return \~english true, if window found \~russian true, если окно найдено. \~ + */ +bool +aWindowsList::find( QWidget *window ) +{ + Q3DictIterator it( list ); + for ( ; it.current(); ++it ) if ( it.current() == window ) return TRUE; + return FALSE; +} + + +/*! + * \~english + * Get window with \a id and \a ido. + * \~russian + * Функция получения ссылки на окно по его \a id и \a ido + * \~ + * \param id - \~english object class id \~russian идентификатор класса объекта \~ + * \param ido - \~english object id (default 0) \~russian идентификатор объекта (по умолчанию 0) \~ + * \return \~english link to window, or 0 if window not found \~russian ссылка на окно или 0\~ + */ +QWidget * +aWindowsList::get( int id, qulonglong ido ) +{ + return list.find( conv( id, ido ) ); +} + + +/*! + * \~english + * Create key for store in list. + * \~russian + * Создает ключ из параметров \a id и \a ido + * \~ + * \param id - \~english object class id \~russian идентификатор класса объекта \~ + * \param ido - \~english object id (default 0) \~russian идентификатор объекта (по умолчанию 0) \~ + * \return \~english key \~russian ключ \~ + */ +QString +aWindowsList::conv( int id, qulonglong ido ) +{ + return QString("%1_%2").arg( id ).arg( ido ); +} + diff --git a/src/lib/dialogs/awindowslist.h b/src/lib/dialogs/awindowslist.h new file mode 100644 index 0000000..92a1dab --- /dev/null +++ b/src/lib/dialogs/awindowslist.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** $Id: awindowslist.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Main window of Ananas Designer applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AWINDOWSLIST_H +#define AWINDOWSLIST_H + +#include "ananasglobal.h" + + +#include +#include + +/*! + * \~english + * Contains list of opened window. + * \~russian + * \brief Класс определяет интерфейс управления списком открытых окон. + * Наследует QWidget. + * + * Объект класса содержит ссылки на все открытые окна. При открыти окна проверяется, есть ли оно в списке, + * и если есть, то ему просто передается фокус. + * \~ + */ +class ANANAS_EXPORT aWindowsList : public QWidget +{ + Q_OBJECT +public: + aWindowsList(); + virtual ~aWindowsList(); + + void insert( int id, QWidget *window, qulonglong ido = 0 ); + void remove( int id, qulonglong ido = 0 ); + void remove( QWidget *window ); + bool find( int id, qulonglong ido = 0 ); + bool find( QWidget *window ); + QWidget *get( int id, qulonglong ido = 0 ); + +private: + Q3Dict list; + QString conv( int id, qulonglong ido ); +}; + + +#endif //AWINDOWSLIST_H diff --git a/src/lib/dialogs/deditrc.cpp b/src/lib/dialogs/deditrc.cpp new file mode 100644 index 0000000..8ce6e30 --- /dev/null +++ b/src/lib/dialogs/deditrc.cpp @@ -0,0 +1,127 @@ +#include "deditrc.h" + +#include +//#include +#include +#include +#include + +#include "atests.h" +/* + * Constructs a dEditRC as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dEditRC::dEditRC(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + +} + +/* + * Destroys the object and frees any allocated resources + */ +dEditRC::~dEditRC() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dEditRC::languageChange() +{ + retranslateUi(this); +} + + + +void dEditRC::setdata(QString nameRC, rcListViewItem *item) +{ +// QFile f; +// QString s, sv, sn; +// char buf[1025]; + it = item; + QMap cfg; + + cfg = aTests::readConfig(QDir::convertSeparators(nameRC)); + eRCFile->setText(QDir::convertSeparators(nameRC)); + eDBType->setCurrentItem(0); + + eDBTitle->setText(cfg["dbtitle"]); + eDBName->setText(cfg["dbname"]); + eDBUserName->setText(cfg["dbuser"]); + ePass->setText(cfg["dbpass"]); + eDBHost->setText(cfg["dbhost"]); + eDBPort->setText(cfg["dbport"]); + eCfgName->setText(QDir::convertSeparators(cfg["configfile"])); + if(cfg["dbtype"]=="postgres") eDBType->setCurrentItem(3); + if(cfg["dbtype"]=="mysql") eDBType->setCurrentItem(2); + if(cfg["dbtype"]=="internal") eDBType->setCurrentItem(1); + eWorkDir->setText(QDir::convertSeparators(cfg["workdir"])); +} + + +void dEditRC::updatecfg() +{ + QMap cfg; + + cfg["dbtitle"] = eDBTitle->text(); + cfg["dbname"] = eDBName->text(); + if(eDBType->currentItem()==1) cfg["dbtype"] ="internal"; + if(eDBType->currentItem()==2) cfg["dbtype"] ="mysql"; + if(eDBType->currentItem()==3) cfg["dbtype"]= "postgres"; + cfg["dbuser"] = eDBUserName->text(); + cfg["dbpass"] = ePass->text(); + cfg["dbhost"] = eDBHost->text(); + cfg["dbport"] = eDBPort->text(); + cfg["workdir"] = QDir::convertSeparators(eWorkDir->text()); + cfg["configfile"]= QDir::convertSeparators(eCfgName->text()); + + aTests::writeConfig(QDir::convertSeparators(eRCFile->text()),cfg); +} + + + +void dEditRC::onOK() +{ + updatecfg(); + it->rcfile = QDir::convertSeparators(eRCFile->text()); + it->setText(0,eDBTitle->text()); + accept(); +} + + +void dEditRC::onRCFile() +{ + Q3FileDialog fd( QString::null, + tr("ananas config resource (*.rc)"), + 0, 0, TRUE ); + fd. setMode ( Q3FileDialog::AnyFile ); + fd.setSelection( QDir::convertSeparators(eRCFile->text())); + if ( fd.exec() == QDialog::Accepted ) { + eRCFile->setText(QDir::convertSeparators(fd.selectedFile())); + setdata(eRCFile->text(),it); + } else { + return; + } +} + + +void dEditRC::onCFGFile() +{ + Q3FileDialog fd( QString::null, + tr("ananas config file (*.cfg)"), + 0, 0, TRUE ); + fd. setMode ( Q3FileDialog::AnyFile ); + fd.setSelection( QDir::convertSeparators(eCfgName->text())); + if ( fd.exec() == QDialog::Accepted ) { + eCfgName->setText(QDir::convertSeparators(fd.selectedFile())); + } else { + return; + } +} diff --git a/src/lib/dialogs/deditrc.h b/src/lib/dialogs/deditrc.h new file mode 100644 index 0000000..af330f9 --- /dev/null +++ b/src/lib/dialogs/deditrc.h @@ -0,0 +1,36 @@ +#ifndef DEDITRC_H +#define DEDITRC_H + +#include "ui_deditrc.h" + +class ANANAS_EXPORT dEditRC : public QDialog, public Ui::dEditRC +{ + Q_OBJECT + +public: + dEditRC(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dEditRC(); + +public slots: + virtual void setdata( QString nameRC, rcListViewItem * item ); + virtual void updatecfg(); + +signals: + void onOk(QString rc); + +protected slots: + virtual void languageChange(); + + virtual void onCFGFile(); + + +private: + rcListViewItem *it; + +private slots: + virtual void onOK(); + virtual void onRCFile(); + +}; + +#endif // DEDITRC_H diff --git a/src/lib/dialogs/deditrc.ui b/src/lib/dialogs/deditrc.ui new file mode 100644 index 0000000..a512e9a --- /dev/null +++ b/src/lib/dialogs/deditrc.ui @@ -0,0 +1,460 @@ + + + + ANANAS_EXPORT + dEditRC + + + + 0 + 0 + 777 + 402 + + + + Resource file + + + + + + + + + 180 + 0 + + + + Resource file name + + + false + + + + + + + + + + + 30 + 32767 + + + + ... + + + + + + + + + + + + 180 + 0 + + + + Data base header + + + false + + + + + + + + + + + + + + + 180 + 0 + + + + Data base name + + + false + + + + + + + + + + + + + + + 180 + 0 + + + + + 160 + 32767 + + + + Data base server type + + + false + + + + + + + false + + + false + + + + Unknown + + + + + internal + + + + + mysql + + + + + postgres + + + + + + + + + + + + + 180 + 0 + + + + Data base server address + + + false + + + + + + + + + + + + + + + 180 + 0 + + + + Data base server port + + + false + + + + + + + + + + + 146 + 21 + + + + Expanding + + + Horizontal + + + + + + + + + + + + 180 + 0 + + + + Data base server user + + + false + + + + + + + + + + + + + + + 180 + 0 + + + + Data base server password + + + false + + + + + + + QLineEdit::Password + + + + + + + + + + + + 180 + 0 + + + + Work directory + + + false + + + + + + + + + + + + + + + 180 + 0 + + + + Configuration file name + + + false + + + + + + + + + + + 30 + 32767 + + + + ... + + + + + + + + + + 130 + 16 + + + + Expanding + + + Vertical + + + + + + + + + + 470 + 21 + + + + Expanding + + + Horizontal + + + + + + + + 80 + 32767 + + + + OK + + + true + + + + + + + + 20 + 21 + + + + Fixed + + + Horizontal + + + + + + + + 80 + 32767 + + + + Cancel + + + + + + + + + qPixmapFromMimeSource + + eRCFile + bFileRC + eDBTitle + eDBName + eDBType + eDBHost + eDBPort + eDBUserName + ePass + eWorkDir + eCfgName + bFileCFG + bOK + bCancel + + + rclistviewitem.h + qstringlist.h + ananasglobal.h + + + + bCancel + clicked() + dEditRC + reject() + + + bFileRC + clicked() + dEditRC + onRCFile() + + + bOK + clicked() + dEditRC + onOK() + + + bFileCFG + clicked() + dEditRC + onCFGFile() + + + diff --git a/src/lib/dialogs/dhelpcfgform.cpp b/src/lib/dialogs/dhelpcfgform.cpp new file mode 100644 index 0000000..fb548f9 --- /dev/null +++ b/src/lib/dialogs/dhelpcfgform.cpp @@ -0,0 +1,42 @@ +#include "dhelpcfgform.h" + +#include +#include +#include + +/* + * Constructs a HelpCfgForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +HelpCfgForm::HelpCfgForm(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +HelpCfgForm::~HelpCfgForm() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void HelpCfgForm::languageChange() +{ + retranslateUi(this); +} + +void HelpCfgForm::init() +{ + textEdit1->setText( tr("Make group, item, set item paramert and press Ok button. See http://ananas.lrn.ru/index.php?title=Manual:Disigner for details" )); +} diff --git a/src/lib/dialogs/dhelpcfgform.h b/src/lib/dialogs/dhelpcfgform.h new file mode 100644 index 0000000..785f249 --- /dev/null +++ b/src/lib/dialogs/dhelpcfgform.h @@ -0,0 +1,22 @@ +#ifndef HELPCFGFORM_H +#define HELPCFGFORM_H + +#include "ui_dhelpcfgform.h" + + +class HelpCfgForm : public QDialog, public Ui::HelpCfgForm +{ + Q_OBJECT + +public: + HelpCfgForm(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~HelpCfgForm(); + + virtual void init(); + +protected slots: + virtual void languageChange(); + +}; + +#endif // HELPCFGFORM_H diff --git a/src/lib/dialogs/dhelpcfgform.ui b/src/lib/dialogs/dhelpcfgform.ui new file mode 100644 index 0000000..6f8e77b --- /dev/null +++ b/src/lib/dialogs/dhelpcfgform.ui @@ -0,0 +1,94 @@ + + + + + HelpCfgForm + + + + 0 + 0 + 608 + 508 + + + + Create busines shema + + + + + + Qt::RichText + + + + + + Q3TextEdit::WidgetWidth + + + false + + + + + + + + 201 + 20 + + + + Expanding + + + Horizontal + + + + + + + + 171 + 20 + + + + Expanding + + + Horizontal + + + + + + + + 0 + 0 + 0 + 0 + + + + Close + + + + + + + qPixmapFromMimeSource + + + closeButton + clicked() + HelpCfgForm + accept() + + + diff --git a/src/lib/dialogs/dialogs.pri b/src/lib/dialogs/dialogs.pri new file mode 100644 index 0000000..003e3d4 --- /dev/null +++ b/src/lib/dialogs/dialogs.pri @@ -0,0 +1,24 @@ +HEADERS += \ + dialogs/deditrc.h \ + dialogs/dhelpcfgform.h \ + dialogs/dimportdb.h \ + dialogs/dlogin.h \ + dialogs/dselectdb.h \ + dialogs/messageswindow.h \ + dialogs/awindowslist.h + +SOURCES += \ + dialogs/awindowslist.cpp \ + dialogs/deditrc.cpp \ + dialogs/dhelpcfgform.cpp \ + dialogs/dimportdb.cpp \ + dialogs/dlogin.cpp \ + dialogs/dselectdb.cpp \ + dialogs/messageswindow.cpp + + +FORMS += \ + dialogs/deditrc.ui \ + dialogs/dhelpcfgform.ui \ + dialogs/dlogin.ui \ + dialogs/dselectdb.ui diff --git a/src/lib/dialogs/dimportdb.cpp b/src/lib/dialogs/dimportdb.cpp new file mode 100644 index 0000000..8f3ead2 --- /dev/null +++ b/src/lib/dialogs/dimportdb.cpp @@ -0,0 +1,64 @@ +/**************************************************************************** +** Form implementation generated from reading ui file 'deditrc.ui' +** +** Created: Пнд Фев 13 14:29:13 2006 +** by: The User Interface Compiler ($Id: dimportdb.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#include "dimportdb.h" +#include "atests.h" +#include +#include +#include +#include + +dImportDB::dImportDB( QWidget* parent, const char* name, bool modal, Qt::WFlags fl ) + : dEditRC( parent, name, modal, fl ) +{ + if ( !name ) + setName( "dImportDB" ); + languageChange(); + +} + +/* + * Destroys the object and frees any allocated resources + */ +dImportDB::~dImportDB() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void +dImportDB::languageChange() +{ + dEditRC::languageChange(); + setCaption( tr( "Resource file" ) ); + textLabel8_2->setText( tr( "archive file" ) ); + bOK->setText( tr( "Import" ) ); +} + +void +dImportDB::onCFGFile() +{ + Q3FileDialog fd( QString::null, + tr("any files (*)"), + 0, 0, TRUE ); + fd.setMode(Q3FileDialog::AnyFile); + fd.addFilter(tr("ananas business schema archiff file (*.bsa)")); + fd.setSelection( QDir::convertSeparators(eCfgName->text())); + if ( fd.exec() == QDialog::Accepted ) + { + eCfgName->setText(QDir::convertSeparators(fd.selectedFile())); + } + else + { + return; + } +} diff --git a/src/lib/dialogs/dimportdb.h b/src/lib/dialogs/dimportdb.h new file mode 100644 index 0000000..2c011d9 --- /dev/null +++ b/src/lib/dialogs/dimportdb.h @@ -0,0 +1,30 @@ +/**************************************************************************** +** Form interface generated from reading ui file 'deditrc.ui' +** +** Created: Пнд Фев 13 14:06:55 2006 +** by: The User Interface Compiler ($Id: dimportdb.h,v 1.1 2008/11/05 21:16:28 leader Exp $) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#ifndef DIMPORTDB_H +#define DIMPORTDB_H + +#include "ananasglobal.h" +#include "deditrc.h" + +class ANANAS_EXPORT dImportDB : public dEditRC +{ + Q_OBJECT + +public: + dImportDB( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, Qt::WFlags fl = 0 ); + ~dImportDB(); + + +protected slots: + virtual void languageChange(); + virtual void onCFGFile(); +}; + +#endif // DIMPORTDB_H diff --git a/src/lib/dialogs/dlogin.cpp b/src/lib/dialogs/dlogin.cpp new file mode 100644 index 0000000..a1c2a71 --- /dev/null +++ b/src/lib/dialogs/dlogin.cpp @@ -0,0 +1,52 @@ +#include "dlogin.h" + +#include +#include +#include + +/* + * Constructs a dLogin as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dLogin::dLogin(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dLogin::~dLogin() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dLogin::languageChange() +{ + retranslateUi(this); +} + +void dLogin::init() +{ + username = ""; + password = ""; +} + + +void dLogin::buttonOK() +{ + username = eName->text(); + password = ePassword->text(); + accept(); +} + diff --git a/src/lib/dialogs/dlogin.h b/src/lib/dialogs/dlogin.h new file mode 100644 index 0000000..aaf31bc --- /dev/null +++ b/src/lib/dialogs/dlogin.h @@ -0,0 +1,26 @@ +#ifndef DLOGIN_H +#define DLOGIN_H + +#include "ui_dlogin.h" + + +class ANANAS_EXPORT dLogin : public QDialog, public Ui::dLogin +{ + Q_OBJECT + +public: + dLogin(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dLogin(); + + QString username, password; + +public slots: + virtual void init(); + virtual void buttonOK(); + +protected slots: + virtual void languageChange(); + +}; + +#endif // DLOGIN_H diff --git a/src/lib/dialogs/dlogin.ui b/src/lib/dialogs/dlogin.ui new file mode 100644 index 0000000..cf27a3b --- /dev/null +++ b/src/lib/dialogs/dlogin.ui @@ -0,0 +1,96 @@ + + + + ANANAS_EXPORT + dLogin + + + + 0 + 0 + 303 + 89 + + + + Ananas: Login + + + + Fixed + + + + + Login name + + + false + + + + + + + Password + + + false + + + + + + + + + + QLineEdit::Password + + + + + + + &Cancel + + + Alt+C + + + + + + + O&K + + + Alt+K + + + true + + + + + + + qPixmapFromMimeSource + + ananasglobal.h + + + + bOK + clicked() + dLogin + buttonOK() + + + bCancel + clicked() + dLogin + reject() + + + diff --git a/src/lib/dialogs/dselectdb.cpp b/src/lib/dialogs/dselectdb.cpp new file mode 100644 index 0000000..b11d066 --- /dev/null +++ b/src/lib/dialogs/dselectdb.cpp @@ -0,0 +1,520 @@ +#include "dselectdb.h" + +#include +#include +#include + +#include "atests.h" +#include "dhelpcfgform.h" +/* + * Constructs a dSelectDB as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +dSelectDB::dSelectDB(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) + ,settings( QSettings::IniFormat, QSettings::UserScope, "Ananas company Ltd", "Ananas4") +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +dSelectDB::~dSelectDB() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void dSelectDB::languageChange() +{ + retranslateUi(this); +} + + +//#include "acfgobj.h" +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include + +#include "deditrc.h" +#include "dimportdb.h" +#include "acfgrc.h" +#include "atests.h" +#include "adataexchange.h" +#include "alog.h" + +void dSelectDB::init() +{ + aLog::init("ananas.log", aLog::Debug); + createMenu(); + progressBar1->hide(); + QString fname; + withgroups = 1; + //--settings.insertSearchPath( QSettings::Unix, QString(QDir::homeDirPath())+QString("/.ananas")); + //--settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas" ); + + local = settings.entryList("/groups").count(); + changes = false; + /*--if(!local) + { + + aLog::print(aLog::Debug, tr("dSelectDB local settings not found")); + settings.insertSearchPath( QSettings::Windows, "/ananasgroup/ananas/globalsettings"); +#ifdef Q_OS_WIN32 + QStringList subkeys = settings.subkeyList("/ananasgroup/ananas/globalsettings"); + settings.insertSearchPath(QSettings::Windows,"/ananasgroup/ananas/globalsettings"); + QStringList entryGroup; + for(uint i=0; ihideColumn( 1 ); + listDBRC->setSorting( -1 ); + listDBRC->header()->hide(); + listDBRC->setRootIsDecorated(1); + buttonOk->setEnabled( FALSE ); + return; +} + +void dSelectDB::readSettings(QStringList entryGroup) +{ + rcfile=""; + ro_mode=0; + QFile f, fc; + QString s, sp, sn, rc; + rcListViewItem *item, *gitem=NULL; //, *subitem; + for(uint j=0; jlastItem(); + if(lastIt!=NULL) + { + while(lastIt->depth()>0) + { + lastIt =(rcListViewItem *) lastIt->parent(); + } + gitem= new rcListViewItem(listDBRC, lastIt, groupName, "", true ); + gitem->setOpen(true); + } + else + { + gitem= new rcListViewItem(listDBRC, groupName, "", true ); + gitem->setOpen(true); + } +// withgroups=1; + QMap cfg; + for(int k = eitems.count()-1; k>=0; k--) + { + if(k<0) break; + rc = settings.readEntry(entryGroup[j]+"/"+eitems[k]); + cfg = aTests::readConfig(QDir::convertSeparators(rc)); + sn=cfg["dbtitle"]; + if (gitem) item= new rcListViewItem( gitem, sn, rc ); + else item= new rcListViewItem( listDBRC, sn, rc ); + } + } +} + + +void dSelectDB::itemSelect( Q3ListViewItem *item ) +{ + if (! item ) return; + rcListViewItem *i = ( rcListViewItem *) item ; + buttonOk->setEnabled( !i->group ); +} + + +void dSelectDB::newGroup() +{ + Q3ListViewItem *gitem; + gitem = new rcListViewItem(listDBRC, tr("New group"), "", true ); + listDBRC->setRootIsDecorated(1); + gitem->setOpen(true); + listDBRC->setSelected(gitem, true); + editItem(); + withgroups=1; + changes = true; + //saveRC(); +} + + +void dSelectDB::newItem() +{ + rcListViewItem *item, *gitem; + QString rc; + item= ( rcListViewItem *) listDBRC->selectedItem(); + if (!item) return; + if (withgroups) { + if (item->parent()) gitem = ( rcListViewItem *) item->parent(); + else gitem=item; + item = new rcListViewItem(gitem, tr("New shema"), "myrc"); + gitem->setOpen(true); + + } else { + item = new rcListViewItem(listDBRC, tr("New shema"), "myrc"); + } + listDBRC->setSelected(item, true); + editItem(); + changes = true; +} + + +void dSelectDB::editItem() +{ + rcListViewItem *item; + dEditRC *d = new dEditRC(this); + + item = ( rcListViewItem *) listDBRC->selectedItem(); + if (!item) return; + if ( item->group ) + { + // Group + item->setRenameEnabled(0, true); + item->startRename(0); + changes = true; + } + else + { + // Resource + d->setdata( QDir::convertSeparators(item->rcfile), item ); + if ( d->exec() == QDialog::Accepted ) + { + changes = true; + } + } +} + + + +void dSelectDB::deleteItem() +{ + Q3ListViewItem *item; + item=listDBRC->selectedItem(); + if (item) + { + QString msg = tr("Delete item?"); + if(QMessageBox::question(this,tr("confirm delete"),msg,QMessageBox::Ok,QMessageBox::Cancel)!=QMessageBox::Ok) + { + return; + } + + delete item; + if (listDBRC->childCount()==0) withgroups=0; + changes = true; + } +} + + +void dSelectDB::saveRC() +{ + rcListViewItem *item, *gitem; + QFile f( rcfile ); + aLog::print(aLog::Info, tr("dSelectDB save settings")); + if (!local) + { + if(!changes) return; + QString home = QDir::homeDirPath(); +#ifndef Q_OS_WIN32 + QString msg = QString("Все внесенные изменения будут сохранены локально в вашем домашнем каталоге.\nПри очередном запуске программы будут использованы локальные настройки из каталога\n%1/.ananas.\nЕсли Вы хотите использовать глобальные настройки, вам следует удалить каталог\n%2/.ananas").arg(home).arg(home); +#else + QString msg = tr("save settings local?"); +#endif + if(QMessageBox::question(this,tr("save"),QString::fromUtf8(msg),QMessageBox::Ok,QMessageBox::Cancel)!=QMessageBox::Ok) + { + return; + } + } + //--settings.removeSearchPath( QSettings::Unix, "/etc/ananas" ); + //--settings.removeSearchPath( QSettings::Windows, "/ananasgroup/ananas/globalsettings"); + + + gitem= ( rcListViewItem *) listDBRC->firstChild(); + uint gcount=0; + uint ecount=0; + clearSettings(); + + settings.beginGroup("/groups"); + + while (gitem) + { + if (withgroups) + { + settings.writeEntry(QString::number(gcount),gitem->text(0)); + if(gitem->childCount()) + { + item = ( rcListViewItem *) gitem->firstChild(); + while (item) + { + settings.writeEntry(QString::number(gcount)+"/"+QString::number(ecount),item->rcfile); + item = ( rcListViewItem *) item->nextSibling(); + ++ecount; + } + } + } + ++gcount; + gitem = ( rcListViewItem *) gitem->nextSibling(); + } + settings.endGroup(); +} + + +void dSelectDB::onOK() +{ + rcListViewItem *item; + + saveRC(); + item = ( rcListViewItem *) listDBRC->selectedItem(); + if (item) { + if ( !item->rcfile.isEmpty() ) { + rcfile = item->rcfile; + accept(); + } + } +} + + +void dSelectDB::onCancel() +{ + //saveRC(); + reject(); +} + + +void dSelectDB::ItemRenamed(Q3ListViewItem *item, int col) +{ + if (!item) return; + if (col>1) return; +} + + +void dSelectDB::clearSettings() +{ + QStringList eitems; + QStringList entryGroup =settings.entryList("/groups"); + settings.beginGroup("/groups"); + for(uint j=0; j=0; k--) + { + if(k<0) break; + settings.removeEntry(entryGroup[j]+"/"+eitems[k]); + } + } + settings.endGroup(); +} + + +void dSelectDB::onHelp() +{ + HelpCfgForm f; + f.exec(); +} + +void dSelectDB::createMenu() +{ + + menuBar = new QMenuBar(this); + Q3PopupMenu *menuFile = new Q3PopupMenu(this); + menuFile->insertItem(tr("E&xit"), this, SLOT(onCancel())); + + Q3PopupMenu *menuEdit = new Q3PopupMenu(this); + menuEdit->insertItem(tr("New &group"), this, SLOT(newGroup())); + menuEdit->insertItem(tr("&New shema"), this, SLOT(newItem())); + menuEdit->insertSeparator(); + menuEdit->insertItem(tr("Edi&t"), this, SLOT(editItem())); + menuEdit->insertSeparator(); + menuEdit->insertItem(tr("&Delete"), this, SLOT(deleteItem())); + + Q3PopupMenu *menuAction = new Q3PopupMenu(this); + menuAction->insertItem(tr("&Import"), this, SLOT(importItem())); + menuAction->insertItem(tr("&Export"), this, SLOT(exportItem())); + + menuBar->insertItem(tr("Program"), menuFile); + menuBar->insertItem(tr("Actions"), menuEdit); + menuBar->insertItem(tr("Service"), menuAction); + layout()->setMenuBar(menuBar); + menuBar->show(); +} + + +void dSelectDB::importItem() +{ + rcListViewItem *item,*gitem; + dImportDB *d = new dImportDB(this); + item = (rcListViewItem *)listDBRC->selectedItem(); + if (!item) return; + if (withgroups) + { + if (item->parent()) gitem = ( rcListViewItem *) item->parent(); + else gitem=item; + item = new rcListViewItem(gitem, tr("New shema"), "myrc"); + gitem->setOpen(true); + + } + else + { + item = new rcListViewItem(listDBRC, tr("New shema"), "myrc"); + } + listDBRC->setSelected(item, true); + d->setdata("", item ); + if ( d->exec() == QDialog::Accepted ) + { + bool res; + QString rcfile = item->rcfile; + QString filename = d->eCfgName->text(); + progressBar1->show(); + progressBar1->reset(); + aBackup newBase; + connect (&newBase, SIGNAL(progress(int,int)), progressBar1, SLOT( setProgress(int,int))); + if(newBase.importData(rcfile, filename, true)==false) + { + QMessageBox::information(this,tr("Backup"),newBase.lastError(),Qt::NoButton); + progressBar1->hide(); + aLog::print(aLog::Info, tr("dSelectDB business schema import")); + } + else + { + aLog::print(aLog::Error, tr("dSelectDB restore: %1").arg(newBase.lastError())); + QMessageBox::critical(this,tr("Backup"),newBase.lastError(),0, Qt::NoButton); + progressBar1->hide(); + delete item; + item =0; + return; + } + + + + changes = true; + } + else + { + delete item; + item = 0; + return; + } +} + + +void dSelectDB::exportItem() +{ +// progressBar1->setTotalSteps(10); + QString dir,rcfile,filename; +#ifndef Q_OS_WIN32 + dir = "/home"; +#endif + + rcListViewItem *item = ( rcListViewItem *) listDBRC->selectedItem(); + if (item) + { + if ( !item->rcfile.isEmpty() && !item->group ) + { + rcfile = item->rcfile; + } + else + { + QMessageBox::information(this,tr("Select item"),tr("Please, select item for export"),Qt::NoButton); + return; + } + + Q3FileDialog *fdlg = new Q3FileDialog(this, "fileDialog",true); // create modal dialog + fdlg->setMode ( Q3FileDialog::AnyFile ); + if(fdlg->exec()==QDialog::Accepted) + { + filename = fdlg->selectedFile(); + } + else + { + return; + } + delete fdlg; + fdlg = 0; + + aBackup backupBase; + progressBar1->show(); + progressBar1->reset(); + connect (&backupBase, SIGNAL(progress(int,int)), progressBar1, SLOT( setProgress(int,int))); + if(backupBase.exportData(rcfile, filename, true )==0) + { + aLog::print(aLog::Info, tr("dSelectDB backup ok")); + QMessageBox::information(this,tr("Backup"),backupBase.lastError(),Qt::NoButton); + progressBar1->hide(); + + } + else + { + aLog::print(aLog::Debug, tr("dSelectDB backup: %1").arg(backupBase.lastError())); + QMessageBox::critical(this,tr("Backup"),backupBase.lastError(),0, Qt::NoButton); + progressBar1->hide(); + return; + } + } + else + { + QMessageBox::information(this,tr("Select item"),tr("Please, select item for export"),Qt::NoButton); + return; + } + +} + + +void dSelectDB::onDblClick( Q3ListViewItem *item) +{ + + if (! (( rcListViewItem *)item)->group ) + { + onOK(); + + } +} + diff --git a/src/lib/dialogs/dselectdb.h b/src/lib/dialogs/dselectdb.h new file mode 100644 index 0000000..817019a --- /dev/null +++ b/src/lib/dialogs/dselectdb.h @@ -0,0 +1,54 @@ +#ifndef DSELECTDB_H +#define DSELECTDB_H + +#include "ui_dselectdb.h" + + +class ANANAS_EXPORT dSelectDB : public QDialog, public Ui::dSelectDB +{ + Q_OBJECT + +public: + dSelectDB(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~dSelectDB(); + + QString rcfile; + +public slots: + void newItem(); + void editItem(); + void deleteItem(); + void onCancel(); + void ItemRenamed( Q3ListViewItem * item, int col ); + void onHelp(); + void createMenu(); + virtual void onDblClick(Q3ListViewItem *); + +protected: + QSettings settings; + + virtual void clearSettings(); + +protected slots: + virtual void languageChange(); + +private: + int withgroups; + QMenuBar *menuBar; + bool changes; + int ro_mode; + bool local; + +private slots: + void init(); + void readSettings( QStringList entryGroup ); + void itemSelect( Q3ListViewItem * item ); + void newGroup(); + void saveRC(); + void onOK(); + void importItem(); + void exportItem(); + +}; + +#endif // DSELECTDB_H diff --git a/src/lib/dialogs/dselectdb.ui b/src/lib/dialogs/dselectdb.ui new file mode 100644 index 0000000..ac202a1 --- /dev/null +++ b/src/lib/dialogs/dselectdb.ui @@ -0,0 +1,181 @@ + + + + ANANAS_EXPORT + dSelectDB + + + + 0 + 0 + 443 + 415 + + + + Information base + + + true + + + + + + + + &OK + + + + + + true + + + true + + + + + + + &Cancel + + + Alt+C + + + true + + + + + + + &Help + + + Alt+H + + + true + + + + + + + + 20 + 80 + + + + Expanding + + + Vertical + + + + + + + + + + + Select data base + + + false + + + + + + + Q3ScrollView::AlwaysOff + + + true + + + + Name + + + true + + + true + + + + + Resource file + + + true + + + true + + + + + + + + true + + + + + + + + + qPixmapFromMimeSource + + ananasglobal.h + qmenubar.h + q3popupmenu.h + qsettings.h + rclistviewitem.h + qmessagebox.h + + + + buttonOk + clicked() + dSelectDB + onOK() + + + buttonCancel + clicked() + dSelectDB + onCancel() + + + listDBRC + selectionChanged(Q3ListViewItem*) + dSelectDB + itemSelect(Q3ListViewItem*) + + + buttonHelp + clicked() + dSelectDB + onHelp() + + + listDBRC + doubleClicked(Q3ListViewItem*) + dSelectDB + onDblClick(Q3ListViewItem*) + + + diff --git a/src/lib/dialogs/messageswindow.cpp b/src/lib/dialogs/messageswindow.cpp new file mode 100644 index 0000000..3c12310 --- /dev/null +++ b/src/lib/dialogs/messageswindow.cpp @@ -0,0 +1,140 @@ +/**************************************************************************** +** $Id: messageswindow.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Mesages window of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/* +*/ +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include "messageswindow.h" +#include "acfg.h" + +/* + * Constructs a MessagesWindow as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +MessagesWindow *msgwindow = 0; + + +void +messageproc(int n, const char *msg){ + if (msgwindow) msgwindow->message( n, QObject::trUtf8( msg ) ); +} + + +MessagesWindow::MessagesWindow( QWidget* parent, Qt::WFlags fl ) + : Q3DockWindow( parent, "MessagesWindow", fl ) +{ + msgBrowser = new Q3TextBrowser( this, "msgBrowser" ); + boxLayout()->addWidget( msgBrowser ); + languageChange(); + setMinimumSize( QSize( 1, 1 ) ); + msgBrowser->setMinimumSize( QSize( 1, 1 ) ); + //--clearWState( WState_Polished ); + //--setWindowState( WState_Polished ); + setResizeEnabled( TRUE ); + setExpanded(false); + setCloseMode( Q3DockWindow::Always ); + msgBrowser->show(); + msgwindow = this; + connect(msgBrowser, SIGNAL(doubleClicked(int,int)), this, SLOT(on_click())); + cfg_messageproc=messageproc; +} + +/* + * Destroys the object and frees any allocated resources + */ +MessagesWindow::~MessagesWindow() +{ + msgwindow=NULL; + cfg_messageproc = 0; +} + +void +MessagesWindow::message( int msgtype, const QString &msg) +{ + char st[4][50]={ + "", + "", + "", + ""}; + if (msgtype<0) msgtype=0; + if (msgtype>3) msgtype=3; + msgBrowser->append( tr( st[ msgtype ] )+msg ); + show(); +} + + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void MessagesWindow::languageChange() +{ + setCaption( tr( "Messages window" ) ); + msgBrowser->setText( QString::null ); +} + +void +MessagesWindow::hideEvent ( QHideEvent *e ) +{ + msgBrowser->clear(); + Q3DockWindow::hideEvent( e ); +} + + +void +MessagesWindow::on_click() +{ + setExpanded(!expanded); +} + + +void +MessagesWindow::setExpanded(bool exp) +{ + if(exp) setFixedExtentHeight ( 150 ); + else setFixedExtentHeight ( 30 ); + expanded = exp; + updateGeometry(); +} + + +bool +MessagesWindow::isExpanded() +{ + return expanded; +} + + diff --git a/src/lib/dialogs/messageswindow.h b/src/lib/dialogs/messageswindow.h new file mode 100644 index 0000000..d647fee --- /dev/null +++ b/src/lib/dialogs/messageswindow.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** $Id: messageswindow.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Header file of the Mesages window of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/* +*/ +#ifndef MESSAGESWINDOW_H +#define MESSAGESWINDOW_H + +#include "ananasglobal.h" + +#include +//Added by qt3to4: +#include + +class Q3TextBrowser; + +void messageproc(int n, const char *msg); + +class ANANAS_EXPORT MessagesWindow : public Q3DockWindow +{ + Q_OBJECT + +public: +// bool empty; + MessagesWindow( QWidget* parent = 0, Qt::WFlags fl = Qt::WType_TopLevel ); + ~MessagesWindow(); + + Q3TextBrowser* msgBrowser; +private: + bool expanded; +public slots: + void message( int msgtype, const QString &msg); +protected slots: + virtual void languageChange(); + virtual void hideEvent ( QHideEvent *e ); + void on_click(); + void setExpanded(bool exp); + bool isExpanded(); +}; + +#endif // MESSAGESWINDOW_H diff --git a/src/lib/images/lib_database.png b/src/lib/images/lib_database.png new file mode 100644 index 0000000..5f6aad3 Binary files /dev/null and b/src/lib/images/lib_database.png differ diff --git a/src/lib/images/lib_dbgroup.png b/src/lib/images/lib_dbgroup.png new file mode 100644 index 0000000..3005290 Binary files /dev/null and b/src/lib/images/lib_dbgroup.png differ diff --git a/src/lib/images/print.png b/src/lib/images/print.png new file mode 100644 index 0000000..b03cafd Binary files /dev/null and b/src/lib/images/print.png differ diff --git a/src/lib/lib.pri b/src/lib/lib.pri new file mode 100644 index 0000000..99447cc --- /dev/null +++ b/src/lib/lib.pri @@ -0,0 +1,17 @@ +# include paths for Ananas library + +INCLUDEPATH += \ + ../lib/metadata \ + ../lib/dialogs \ + ../lib/objects \ + ../lib/widgets \ + ../lib/report \ + ../lib/sys + +INCLUDEPATH += \ + ../../lib/metadata \ + ../../lib/dialogs \ + ../../lib/objects \ + ../../lib/widgets \ + ../../lib/report \ + ../../lib/sys diff --git a/src/lib/lib.pro b/src/lib/lib.pro new file mode 100644 index 0000000..209ff48 --- /dev/null +++ b/src/lib/lib.pro @@ -0,0 +1,132 @@ +include(../plugins/plugins.pri) +include(lib.pri) + +TARGET = ananas4 +TEMPLATE = lib +shared:CONFIG += dll +unix:VERSION = 1.0.1 + +DESTDIR = ../../lib +DLLDESTDIR = ../../bin + +INCLUDEPATH += ../lib ../plugins +LIBS += -L../../lib +LIBS +=-lqt4-qdataschema + +shared { + win32:DEFINES += ANANAS_DLL +} else { + win32:DEFINES += ANANAS_NO_DLL +} + +win32 { + CONFIG -= console +# CONFIG += dll +} + +#LIBS += -L$(QTDIR)/plugins/designer -lqsa # Why? -L../designer -lformdesigner +unix{ + LIBS += -L/usr/X11R6/lib/ +} +win32 { + #LIBS += -L..\..\plugins -lananasplugin +} + +#MOC_DIR = ../../tmp/moc/$$TARGET +#OBJECTS_DIR = ../../tmp/obj/$$TARGET +#UI_DIR = ../../tmp/ui/$$TARGET + +include ( ../ananas.pri ) + +HEADERS = \ + acfg.h \ + acfgrc.h \ + acmanifest.h \ + acontainer.h \ + adataexchange.h \ + adatafield.h \ + aextension.h \ + aextensionplugin.h \ + aextensionfactory.h \ + afilter.h \ + alog.h \ + amenubar.h \ + amoney.h \ + ananas.h \ + ananasglobal.h \ + arole.h \ + aservice.h \ + asqlfield.h \ + asqltable.h \ + atests.h \ + atime.h \ + auser.h \ + rclistviewitem.h + +SOURCES = \ + acfg.cpp \ + acfgrc.cpp \ + acmanifest.cpp \ + acontainer.cpp \ + adataexchange.cpp \ + adatafield.cpp \ + aextension.cpp \ + aextensionplugin.cpp \ + aextensionfactory.cpp \ + afilter.cpp \ + alog.cpp \ + amenubar.cpp \ + amoney.cpp \ + ananas.cpp \ + arole.cpp \ + aservice.cpp \ + asqlfield.cpp \ + asqltable.cpp \ + atests.cpp \ + atime.cpp \ + auser.cpp \ + rclistviewitem.cpp + +#FORMS = \ +# deditrc.ui \ +# dhelpcfgform.ui \ +# dlogin.ui \ +# dselectdb.ui + +RESOURCES += \ + lib.qrc + +TRANSLATIONS = \ + ../../translations/ananas-lib-en.ts \ + ../../translations/ananas-lib-ru.ts + +unix{ + alib.path = $(LIBDIR) + alib.files = libananas4.so.$$VERSION + alib.extra = cp -df libananas4.so* $(INSTALL_ROOT)$(LIBDIR) + + alibheader.path = $(INCLUDEDIR) + alibheader.files = $$HEADERS + alibheader.files += .ui/*h + } + +win32 { + alib.path = $(QTDIR)\lib + alib.files += ananas4.dll + alib.files += ananas4.lib +# alibheader.path = $(INCLUDEDIR) +# alibheader.files = $$HEADERS +# alibheader.files += tmp\ui\*h + } + +#INSTALLS += alib +unix{ +# INSTALLS += alibheader +} + +include(metadata/metadata.pri) +include(dialogs/dialogs.pri) +include(objects/objects.pri) +include(widgets/widgets.pri) +include(report/report.pri) +include(sys/sys.pri) diff --git a/src/lib/lib.qrc b/src/lib/lib.qrc new file mode 100644 index 0000000..5a3ede7 --- /dev/null +++ b/src/lib/lib.qrc @@ -0,0 +1,7 @@ + + + images/lib_database.png + images/lib_dbgroup.png + images/print.png + + diff --git a/src/lib/metadata/ametadata.cpp b/src/lib/metadata/ametadata.cpp new file mode 100644 index 0000000..8bf566e --- /dev/null +++ b/src/lib/metadata/ametadata.cpp @@ -0,0 +1,117 @@ +/**************************************************************************** +** $Id: ametadata.cpp,v 1.3 2008/12/14 10:53:02 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "ametadata.h" + +#define context_startid 100 + +AMetaData AMetaData_default; + +/*! + * \class AMetaData + * + */ +AMetaData::AMetaData() +:AMetaObjectGroup( "MetaData", (AMetaObjectGroup *) 0 ) +{ +/* + int i = qRegisterMetaType("AMetaDataInfo"); +printf("metatype=%i\n", i); + +int id = QMetaType::type("AMetaDataInfo"); + if (id != -1) { + void *myClassPtr = QMetaType::construct(id); + if (myClassPtr) printf("OK\n"); + + QMetaType::destroy(id, myClassPtr); + myClassPtr = 0; + } +*/ +} + + +AMetaData* +AMetaData::metadata() +{ + return &AMetaData_default; +} + + +void +AMetaData::clear() +{ + +} + + + +ACataloguesGroup * +AMetaData::catalogues() +{ + return &v_catalogues; +} + + + +ADocumentsGroup * +AMetaData::documents() +{ + return &v_documents; +} + + +AReportsGroup * +AMetaData::reports() +{ + return &v_reports; +} + + +AJournalsGroup * +AMetaData::journals() +{ + return &v_journals; +} + + +AInfoRegistersGroup * +AMetaData::inforegisters() +{ + return &v_inforegisters; +} + + + +AAccRegistersGroup * +AMetaData::accregisters() +{ + return &v_accregisters; +} + diff --git a/src/lib/metadata/ametadata.h b/src/lib/metadata/ametadata.h new file mode 100644 index 0000000..4a2fcf9 --- /dev/null +++ b/src/lib/metadata/ametadata.h @@ -0,0 +1,105 @@ +/**************************************************************************** +** $Id: ametadata.h,v 1.3 2008/12/14 10:53:02 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AMETADATA_H +#define AMETADATA_H + +#include +#include + +#include "ametaobject.h" +#include "ametaobjectgroup.h" + + +#ifdef __BORLANDC__ +#define CHECK_POINT printf("%s:%i %s()\n",__FILE__,__LINE__,__FUNC__); +#else +#define CHECK_POINT printf("%s:%i %s()\n",__FILE__,__LINE__,__FUNCTION__); +#endif + +/*! + * \~english Metadata object methods return codes. \~russian + * Коды возвратов методов объекта метаданных. \~ + */ +#define RC_OK 0 /**< All right - no errors */ +#define RC_ERROR 1 /**< Error while executing method */ + + +//#define aPermission int + +#include +#include + +/*! + *\en + * Metadata object for metadata script access. + *\_en + *\ru + * \brief Объект метаданных для обеспечения доступа из скриптов. + * Наследует QObject. + *\_ru + */ +class AMetaData: public AMetaObjectGroup +{ +Q_OBJECT +//Q_PROPERTY( AMetaDataInfo info READ info SCRIPTABLE true ) +//Q_PROPERTY( AMetaDataGlobal* global READ global SCRIPTABLE true ) +public: + AMetaData(); + void clear(); + + static AMetaData* metadata(); + +public slots: + AMetaDataInfo *info(){ return &v_info;}; + AMetaDataGlobal *global(){ return &v_global;}; + + ADocumentsGroup* documents(); + ACataloguesGroup* catalogues(); + AReportsGroup* reports(); + AJournalsGroup* journals(); + AInfoRegistersGroup* inforegisters(); + AAccRegistersGroup* accregisters(); + + QString test(){ return QString("AMETADATA TEST STRING");}; + +private: + AMetaDataInfo v_info; + AMetaDataGlobal v_global; +//groups + ACataloguesGroup v_catalogues; + ADocumentsGroup v_documents; + AReportsGroup v_reports; + AJournalsGroup v_journals; + AInfoRegistersGroup v_inforegisters; + AAccRegistersGroup v_accregisters; +}; + +#endif diff --git a/src/lib/metadata/ametadataio.cpp b/src/lib/metadata/ametadataio.cpp new file mode 100644 index 0000000..f94fe8f --- /dev/null +++ b/src/lib/metadata/ametadataio.cpp @@ -0,0 +1,77 @@ +/**************************************************************************** +** $Id: ametadataio.cpp,v 1.2 2008/12/13 22:19:15 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "ametadataio.h" + +/*! + * \class AMetaDataIO + * + */ +AMetaDataIO::AMetaDataIO() +:QObject() +{ +} + + +AMetaDataIO::~AMetaDataIO() +{ +} + + +int +AMetaDataIO::read( const QString &name, AMetaData *md ) +{ + if ( !md ) md = AMetaData::metadata(); +} + + +int +AMetaDataIO::write( const QString &name, AMetaData *md ) +{ + if ( !md ) md = AMetaData::metadata(); +} + + +QObject * +AMetaDataIO::createObject( const QString &name ) +{ + QObject *o = 0; + if ( name == "AMetaObject" ) return new AMetaObject(); +// if ( name == "AMetaObjectGroup" ) return new AMetaObjectGroup(); + + return o; +} diff --git a/src/lib/metadata/ametadataio.h b/src/lib/metadata/ametadataio.h new file mode 100644 index 0000000..f515e92 --- /dev/null +++ b/src/lib/metadata/ametadataio.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** $Id: ametadataio.h,v 1.3 2008/12/15 22:22:48 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2008 Valeriy Grazhdankin. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AMETADATAIO_H +#define AMETADATAIO_H + +#include +#include "ametadata.h" + +class AMetaDataIO: public QObject +{ +Q_OBJECT +public: + AMetaDataIO(); + ~AMetaDataIO(); + virtual int read( const QString &name, AMetaData *md = 0); + virtual int write( const QString &name, AMetaData *md = 0); + virtual QObject *createObject( const QString &name ); + //virtual void storeGroup( AMetaObjectGroup *g ); + virtual void storeGroupBegin( AMetaObjectGroup *g ); + +signals: + void message( int msg_class, const QString & msg ); +}; + +#endif diff --git a/src/lib/metadata/ametadataioxml.cpp b/src/lib/metadata/ametadataioxml.cpp new file mode 100644 index 0000000..29d0e72 --- /dev/null +++ b/src/lib/metadata/ametadataioxml.cpp @@ -0,0 +1,373 @@ +/**************************************************************************** +** $Id: ametadataioxml.cpp,v 1.2 2008/12/13 22:19:15 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "ametadataioxml.h" + + +/*! +Metadata tags. +*/ +#define md_root "ananas_configuration" +#define md_interface "interface" + +#define md_info "info" +#define md_info_name "name" +#define md_info_author "author" +#define md_info_date "date" +#define md_info_mdate "mdate" +#define md_info_remark "remark" +#define md_info_lastid "lastid" +//#define md_info_dir "dir" + +#define md_metadata "metadata" /**< Metadata tag */ +#define md_globals "globals" +#define md_languages "languages" +#define md_language "language" +#define md_aliases "aliases" +#define md_alias "alias" +#define md_roles "roles" +#define md_role "role" +#define md_description "description" +#define md_sourcecode "sourcecode" +#define md_servermodule "server_module" +#define md_clientmodule "client_module" +#define md_formsource "form_source" +#define md_menutext "menutext" +#define md_argument "argument" + +#define md_documents "documents" +#define md_document "document" + +#define md_catalogues "catalogues" +#define md_catalogue "catalogue" +#define md_element "element" +#define md_group "group" + +#define md_string_view "string_view" +#define md_svfunction "svfunction" + +#define md_registers "registers" +#define md_iregisters "iregisters" +#define md_iregister "iregister" +#define md_aregisters "aregisters" +#define md_aregister "aregister" + +#define md_reports "reports" +#define md_report "report" + +#define md_journals "journals" +#define md_journal "journal" +#define md_columns "columns" +#define md_column "column" +#define md_used_doc "used_doc" +#define md_fieldid "fieldid" + +#define md_field "field" +#define md_forms "forms" +#define md_form "form" +#define md_defaultmod "defaultmod" +#define md_webforms "webforms" +#define md_webform "webform" +#define md_formdesign "dialogform" + +#define md_tables "tables" +#define md_table "table" +#define md_header "header" + +#define md_resources "resources" +#define md_dimensions "dimensions" +#define md_information "information" + +/*! +Action metadata object items. +*/ +#define md_actions "actions" +#define md_actiongroup "actiongroup" +#define md_action "action" +#define md_objectid "objectid" +#define md_formid "formid" +#define md_actiontype "actiontype" +#define md_active_picture "active_picture" +#define md_passive_picture "passive_picture" + +/*! +Interface metadata object items. +*/ +#define md_interface "interface" +#define md_toolbars "toolbars" +#define md_toolbar "toolbar" +#define md_popupmenus "popupmenus" +#define md_popupmenu "popupmenu" +#define md_mainmenu "mainmenu" +#define md_submenu "submenu" +#define md_command "command" +#define md_comaction "comaction" +#define md_separator "separator" +#define md_key "key" +#define md_menutext "menutext" +//key modifiers +#define md_km_ctrl "Ctrl+" +#define md_km_alt "Alt+" +#define md_km_shift "Shift+" + +#define md_image_collection "image_collection" +#define md_image "image" + + +/*! +Metadata attributes. +*/ +#define mda_name "name" +#define mda_id "id" +#define mda_type "type" +#define mda_readonly "readonly" +#define mda_lang "lang" +#define mda_nz "nz" +#define mda_sort "sort" +#define mda_no_unconduct "no_unconduct" +#define mda_plus "plus" +#define mda_sum "sum" +#define mda_tag "tag" +#define mda_trfile "trfile" +#define mda_length "length" +#define mda_format "format" +#define mda_stdf "stdf" +#define mda_rights "rights" + +/*! +Actions types +*/ + +#define md_action_new 0 +#define md_action_edit 1 +#define md_action_view 2 +#define md_action_execute 3 + +/*! + * Default forms types. + * If bit with some number set in 1 form can use for this action. + */ + +#define md_form_nouse 0 +#define md_form_new 1 +#define md_form_view 2 +#define md_form_edit 3 +#define md_form_select 4 + + +/*! + * Catalogue forms types. + */ + +#define md_form_elem_list 0 +#define md_form_elem 1 +#define md_form_group 2 + +/*! +System object id +*/ + +#define md_systemjournal 1 +#define md_aregarhive 2 + +//class aCfg; +//extern aCfg cfg; + +#define ERR_Code int + +#define md_user_roles "userroles" +#define md_users "users" +#define md_user "user" +#define md_usr_role "u_role" +#define md_roles "roles" +#define md_role "role" +#define md_rl_users "r_users" +#define md_rl_user "r_user" +#define md_right_roles "rroles" + +#define perm_read 0 +#define perm_execute 1 +#define perm_create 2 +#define perm_delete 3 +#define perm_turn_on 4 +#define perm_turn_off 5 +#define perm_admin 6 + +/*! + * \class AMetaDataIOXML + * + */ +AMetaDataIOXML::AMetaDataIOXML() +:AMetaDataIO() +{ +} + + +int +AMetaDataIOXML::read( const QString &name, AMetaData *md ) +{ + QFile file( name ); + QByteArray buf; + QString err; + int errLine = 0, errColumn = 0; +// QDomDocument xml; + QDomNode cur, sub; + QDomElement node, rootnode, cfginfo, mdelement, iface, actions; + long id; + + if ( !md ) md = AMetaData::metadata(); + if ( !file.open( QIODevice::ReadOnly ) ) return 1; + buf = file.readAll(); + file.close(); + xml.setContent( QString("") ); + if ( !xml.setContent( buf, false, &err, &errLine, &errColumn ) ) { + emit message( 2, QObject::tr( + "Error read configuration line:%1 col:%2 %3" + ).arg( errLine ).arg( errColumn ).arg( err )); + return 1; + } + if ( !xml.isDocument() ) { +// aLog::print(aLog::Error, tr("Bad configuration")); + return 1; + } + md->clear(); + rootnode = xml.documentElement(); + + node = rootnode.namedItem( md->info()->className() ).toElement(); + XMLToAMetaObject( node, md->info() ); + node = rootnode.namedItem( md->global()->className() ).toElement(); + XMLToAMetaObject( node, md->global() ); + + mdelement = rootnode.namedItem( md_metadata ).toElement(); + iface = rootnode.namedItem( md_interface ).toElement(); + actions = rootnode.namedItem( md_actions ).toElement(); + return 0; +} + + +int +AMetaDataIOXML::write( const QString &name, AMetaData *md ) +{ + QFile file( name ); + + if ( !md ) md = AMetaData::metadata(); +// QDomDocument xml("ananas4_configuration"); + QDomNode cur, sub; + QDomElement node, rootnode, cfginfo, mdelement, iface, actions; + + xml.setContent(QString("\n")); + xml.appendChild( xml.implementation().createDocumentType("ananas_configuration", + QString::null,"ananas-cfg.dtd")); + rootnode = xml.createElement( md_root ); + xml.appendChild( rootnode ); + rootnode = xml.documentElement(); + + rootnode.appendChild( AMetaObjectToXML( md->info() ) ); + rootnode.appendChild( AMetaObjectToXML( md->global() ) ); + + + node = xml.createElement( md_info ); + rootnode.appendChild( node ); + + + node = xml.createElement( md_interface ); + rootnode.appendChild( node ); + + node = xml.createElement( md_metadata ); + rootnode.appendChild( node ); + + node = xml.createElement( md_actions ); + rootnode.appendChild( node ); + + + if ( !file.open( QIODevice::WriteOnly ) ) return 1; + QTextStream ts( &file ); + xml.save( ts, 4 ); + file.close(); + return 0; +} + +#include + +void +AMetaDataIOXML::XMLToAMetaObject( QDomElement e, AMetaObject *o ) +{ + int i; + QDomElement se; + QDomNode cur; + QString s, t; + int id; + + cur = e.firstChild(); + while (!cur.isNull()) { + se = cur.toElement(); + if ( se.hasAttribute( mda_id ) ) { + id = 0; + id = se.attribute( mda_id ).toInt(); + o->setId( id ); + } + s = se.text(); +// qDebug() << se.tagName() << ":" << s; + if ( !s.isNull() ) o->setText( se.tagName(), s ); + cur = cur.nextSibling(); + } + +} + + + +QDomElement +AMetaDataIOXML::AMetaObjectToXML( AMetaObject *o ) +{ + int i; + QDomElement e, se; + + e = xml.createElement( o->className() ); + for ( i=0; i< o->textCount(); i++ ){ + se = xml.createElement( o->textName( i ) ); + se.appendChild( xml.createTextNode( o->text( i ) ) ); + e.appendChild( se ); + } + return e; +} + + +QString +AMetaDataIOXML::text() +{ + return xml.toString( 4 ); +} diff --git a/src/lib/metadata/ametadataioxml.h b/src/lib/metadata/ametadataioxml.h new file mode 100644 index 0000000..bae4f59 --- /dev/null +++ b/src/lib/metadata/ametadataioxml.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** $Id: ametadataioxml.h,v 1.2 2008/12/13 22:19:15 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2008 Grazhdankin Valeriy. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AMETADATAOIXML_H +#define AMETADATAIOXML_H +#include "ametadataio.h" +#include +#include + +class AMetaDataIOXML: public AMetaDataIO +{ +Q_OBJECT +public: + AMetaDataIOXML(); + int read(const QString &name, AMetaData *md = 0); + int write( const QString &name, AMetaData *md = 0); + QString text(); +private: + void XMLToAMetaObject( QDomElement e, AMetaObject *o ); + QDomElement AMetaObjectToXML( AMetaObject *o ); + QDomDocument xml; +}; + +#endif diff --git a/src/lib/metadata/ametadocument.cpp b/src/lib/metadata/ametadocument.cpp new file mode 100644 index 0000000..0de6592 --- /dev/null +++ b/src/lib/metadata/ametadocument.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** $Id: ametadocument.cpp,v 1.1 2008/12/15 22:22:48 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include "ametadocument.h" + +/*! + * \class AMetaDocument + * + */ +AMetaDocument::AMetaDocument() +:AMetaObject("Document") +{ +} + + +AMetaFields * +AMetaDocument::fields() +{ + return &v_fields; +} + + + +AMetaTables * +AMetaDocument::tables() +{ + return &v_tables; +} + + +AMetaForms * +AMetaDocument::forms() +{ + return &v_forms; +} diff --git a/src/lib/metadata/ametadocument.h b/src/lib/metadata/ametadocument.h new file mode 100644 index 0000000..91ff5e8 --- /dev/null +++ b/src/lib/metadata/ametadocument.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** $Id: ametadocument.h,v 1.1 2008/12/15 22:22:48 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AMETADOCUMENT_H +#define AMETADOCUMENT_H + +#include "ametaobject.h" +#include "ametaobjectgroup.h" +#include "ametafield.h" + + +class AMetaDocument: public AMetaObject +{ +Q_OBJECT +public: + AMetaDocument(); + +public slots: + AMetaFields *fields(); + AMetaTables *tables(); + AMetaForms *forms(); + +private: + AMetaFields v_fields; + AMetaTables v_tables; + AMetaForms v_forms; +}; + +#endif diff --git a/src/lib/metadata/ametafield.cpp b/src/lib/metadata/ametafield.cpp new file mode 100644 index 0000000..e979278 --- /dev/null +++ b/src/lib/metadata/ametafield.cpp @@ -0,0 +1,176 @@ +/**************************************************************************** +** $Id: ametafield.cpp,v 1.1 2008/12/15 22:22:48 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include "ametafield.h" + + +/*! + * \class AMetaField + * + */ +AMetaField::AMetaField() +:AMetaObject("MetaField") +{ + setFieldType( Unknown ); + setFieldSubType( 0 ); + setWidth( 0 ); + setDecimals( 0 ); + setNotNull( false ); + setNotNegative( false ); + setCalcSumm( false ); +} + + +AMetaField::AMetaField( FieldTypes t, int st, int w, int d, bool notnul, bool notneg, bool calcsum ) +:AMetaObject("MetaField") +{ + setFieldType( t ); + setFieldSubType( st ); + setWidth( w ); + setDecimals( d ); + setNotNull( notnul ); + setNotNegative( notneg ); + setCalcSumm( calcsum ); +} + + +int +AMetaField::fieldType() +{ + return attr("type").toInt(); +} + + + +void +AMetaField::setFieldType( FieldTypes t ) +{ + setAttr( "type", t ); +} + + + +int +AMetaField::fieldSubType() +{ + return attr("subtype").toInt(); +} + + +void +AMetaField::setFieldSubType( int st ) +{ + setAttr( "subtype", st ); +} + + +int +AMetaField::width() +{ + return attr("width").toInt(); +} + + +void +AMetaField::setWidth( int w ) +{ + setAttr( "width", w ); +} + + + +int +AMetaField::decimals() +{ + return attr("decimals").toInt(); +} + + +void +AMetaField::setDecimals( int d ) +{ + setAttr( "decimals", d ); +} + + + +bool +AMetaField::notNull() +{ + return attr("notnull").toBool(); +} + + +void +AMetaField::setNotNull( bool f ) +{ + setAttr( "notnull", f ); +} + + +bool +AMetaField::notNegative() +{ + return attr("notnegative").toBool(); +} + + +void +AMetaField::setNotNegative( bool f ) +{ + setAttr( "notnegative", f ); +} + + + +bool +AMetaField::calcSumm() +{ + return attr("calcsumm").toBool(); +} + + +void +AMetaField::setCalcSumm( bool f ) +{ + setAttr( "calcsumm", f ); +} + + + +/*! + * \class AMetaFields + * + */ +AMetaFields::AMetaFields() +:AMetaObjectGroup("MetaFields") +{ + +} + diff --git a/src/lib/metadata/ametafield.h b/src/lib/metadata/ametafield.h new file mode 100644 index 0000000..9e3c5e6 --- /dev/null +++ b/src/lib/metadata/ametafield.h @@ -0,0 +1,95 @@ +/**************************************************************************** +** $Id: ametafield.h,v 1.1 2008/12/15 22:22:48 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AMETAFIELD_H +#define AMETAFIELD_H + +#include "ametaobject.h" +#include "ametaobjectgroup.h" + + +class AMetaField: public AMetaObject +{ +Q_OBJECT +Q_ENUMS( FieldTypes ) +Q_PROPERTY( int fieldtype READ fieldType SCRIPTABLE true ) +Q_PROPERTY( int fieldsubtype READ fieldSubType SCRIPTABLE true ) +Q_PROPERTY( int width READ width SCRIPTABLE true ) +Q_PROPERTY( int decimals READ decimals SCRIPTABLE true ) +Q_PROPERTY( bool notnull READ notNull SCRIPTABLE true ) +Q_PROPERTY( bool notnegative READ notNegative SCRIPTABLE true ) +Q_PROPERTY( bool calcsumm READ calcSumm SCRIPTABLE true ) + +public: + enum FieldTypes { Unknown, Char, String, Number, Date, Object, Document, Catalogue }; + AMetaField(); + + AMetaField( FieldTypes t, int st = 0, int w = 0, + int d = 0, bool notnul = false, bool notneg = false, + bool calcsum = false ); + + int fieldType(); + void setFieldType( FieldTypes t ); + + int fieldSubType(); + void setFieldSubType( int st ); + + int width(); + void setWidth( int w ); + + int decimals(); + void setDecimals( int d ); + + bool notNull(); + void setNotNull( bool f ); + + bool notNegative(); + void setNotNegative( bool f ); + + bool calcSumm(); + void setCalcSumm( bool f ); + +private: + +}; + + +class AMetaFields: public AMetaObjectGroup +{ +Q_OBJECT +public: + AMetaFields(); + +public slots: + + +}; + +#endif diff --git a/src/lib/metadata/ametaform.cpp b/src/lib/metadata/ametaform.cpp new file mode 100644 index 0000000..4f98592 --- /dev/null +++ b/src/lib/metadata/ametaform.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** +** $Id: ametaform.cpp,v 1.1 2008/12/15 22:22:48 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include "ametaform.h" + + +/*! + * \class AMetaField + * + */ +AMetaForm::AMetaForm() +:AMetaObject("MetaForm") +{ +} diff --git a/src/lib/metadata/ametaform.h b/src/lib/metadata/ametaform.h new file mode 100644 index 0000000..0436d21 --- /dev/null +++ b/src/lib/metadata/ametaform.h @@ -0,0 +1,45 @@ +/**************************************************************************** +** $Id: ametaform.h,v 1.1 2008/12/15 22:22:48 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AMETAFORM_H +#define AMETAFORM_H + +#include "ametaobject.h" + +class AMetaForm: public AMetaObject +{ +Q_OBJECT +public: + AMetaForm(); +private: + +}; + +#endif diff --git a/src/lib/metadata/ametaobject.cpp b/src/lib/metadata/ametaobject.cpp new file mode 100644 index 0000000..7f19273 --- /dev/null +++ b/src/lib/metadata/ametaobject.cpp @@ -0,0 +1,386 @@ +/**************************************************************************** +** $Id: ametaobject.cpp,v 1.2 2008/12/15 22:22:48 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +//#include +#include +#include +#include +#include + +#include "ametaobject.h" +#include "ametaobjectgroup.h" + +/*! + * \class AMetaObject + * + */ +/*! + *\en + * Metadata object for metadata script access. + *\_en + *\ru + * \brief Объект метаданных для обеспечения доступа из скриптов. + * Наследует QObject. + *\_ru + */ + +AMetaObject::AMetaObject(const QString &objectclass, + const QString &objectname, + AMetaObjectGroup *parent) +:QObject( parent ) +{ + setObjectName( objectname ); + setClassName( objectclass ); + setDescription(""); +} + + +Q_ULONG +AMetaObject::id() +{ + return v_id; +} + + +void +AMetaObject::setId( Q_ULONG new_id ) +{ + v_id = new_id; +} + + +void +AMetaObject::setClassName( const QString &name ) +{ + v_className = name; +} + + +QString +AMetaObject::className() +{ + return v_className; +} + + +QString +AMetaObject::name() +{ + return objectName(); +} + + +QString +AMetaObject::description() +{ + return text("description"); +} + +void +AMetaObject::setDescription( const QString &descr ) +{ + setText( "description", descr ); +} + + +void +AMetaObject::setAttr( const QString &name, const QVariant &value ) +{ + if ( value.isNull() && attrExists( name ) ) v_attr.remove( name ); + else v_attr[ name ] = value; +} + + + +void +AMetaObject::setText( const QString &name, const QString &text ) +{ + if ( text.isNull() && textExists( name ) ) v_text.remove( name ); + else v_text[ name ] = text; +} + + +void +AMetaObject::setRawdata( const QString &name, const QByteArray &data ) +{ + if ( data.isNull() && rawdataExists( name ) ) v_rawdata.remove( name ); + else v_rawdata[ name ] = data; +} + + + +QVariant +AMetaObject::attr( const QString &name ) const +{ + return v_attr.value( name, QVariant() ); +} + + + +QString +AMetaObject::text( const QString &name ) const +{ + return v_text.value( name, QString::null ); +} + + + +QByteArray +AMetaObject::rawdata( const QString &name ) const +{ + return v_rawdata.value( name, QByteArray() ); +} + + + +QVariant +AMetaObject::attr( int idx ) const +{ + return attr( attrName( idx ) ); +} + + + +QString +AMetaObject::text( int idx ) const +{ + return text( textName( idx ) ); +} + + + +QByteArray +AMetaObject::rawdata( int idx ) const +{ + return rawdata( rawdataName( idx ) ); +} + + + +QString +AMetaObject::attrName( int idx ) const +{ + if ( idx < 0 || idx >= attrCount() ) return QString::null; + return v_attr.keys().at( idx ); +} + + + +QString +AMetaObject::textName( int idx ) const +{ + if ( idx < 0 || idx >= textCount() ) return QString::null; + return v_text.keys().at( idx ); +} + + + +QString +AMetaObject::rawdataName( int idx ) const +{ + if ( idx < 0 || idx >= rawdataCount() ) return QString::null; + return v_rawdata.keys().at( idx ); +} + + + +bool +AMetaObject::attrExists( const QString &name ) +{ + return v_attr.contains( name ); +} + + + +bool +AMetaObject::textExists( const QString &name ) +{ + return v_text.contains( name ); +} + + + +bool +AMetaObject::rawdataExists( const QString &name ) +{ + return v_rawdata.contains( name ); +} + + + +int +AMetaObject::attrCount() const +{ + return v_attr.size(); +} + + + +int +AMetaObject::textCount() const +{ + return v_text.size(); +} + + +int +AMetaObject::rawdataCount() const +{ + return v_rawdata.size(); +} + + + +/*! + * \class AMetaCatalogue + * + */ +AMetaCatalogue::AMetaCatalogue() +:AMetaObject("Catalogue") +{ +} + + + +/*! + * \class AMetaDataInfo + * + */ +AMetaDataInfo::AMetaDataInfo() +:AMetaObject("Info") +{ + setAppName("new"); + setAuthor("unknown"); + setDate( QDate::currentDate() ); + setLastId( 100 ); + +} + + +AMetaDataInfo::AMetaDataInfo( const AMetaDataInfo &info ) +:AMetaObject("Info") +{ +} + + +AMetaDataInfo::~AMetaDataInfo() +{ +} + + +AMetaDataInfo& +AMetaDataInfo::operator=(const AMetaDataInfo&) +{ + return *this; +} + + +QString +AMetaDataInfo::appName() +{ + return text("name"); +} + + +void +AMetaDataInfo::setAppName( const QString &name ) +{ + setText( "name", name ); +} + + +long +AMetaDataInfo::lastId() +{ + return text( "lastid" ).toLong(); +} + + +void +AMetaDataInfo::setLastId( long id ) +{ + setText( "lastid", QString::number( id ) ); +} + + +QString +AMetaDataInfo::author() +{ + return text("author"); +} + + +void +AMetaDataInfo::setAuthor( const QString &name ) +{ + setText( "author", name ); +} + + +QDate +AMetaDataInfo::date() +{ + return QDate::fromString( text("date"), Qt::ISODate ); +} + + +void +AMetaDataInfo::setDate( QDate d ) +{ + setText( "date", d.toString( Qt::ISODate ) ); +} + + + +/*! + * \class AMetaDataGlobal + * + */ +AMetaDataGlobal::AMetaDataGlobal() +:AMetaObject("Global") +{ + setSourceCode("function on_systemstart()\n{\n}\n"); +} + + +QString +AMetaDataGlobal::sourceCode() +{ + return text("sourcecode"); +} + + +void +AMetaDataGlobal::setSourceCode( const QString &src ) +{ + setText( "sourcecode", src ); +} + diff --git a/src/lib/metadata/ametaobject.h b/src/lib/metadata/ametaobject.h new file mode 100644 index 0000000..18bb096 --- /dev/null +++ b/src/lib/metadata/ametaobject.h @@ -0,0 +1,162 @@ +/**************************************************************************** +** $Id: ametaobject.h,v 1.2 2008/12/15 22:22:48 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AMETAOBJECT_H +#define AMETAOBJECT_H + +#include +#include + +#ifdef __BORLANDC__ +#define CHECK_POINT printf("%s:%i %s()\n",__FILE__,__LINE__,__FUNC__); +#else +#define CHECK_POINT printf("%s:%i %s()\n",__FILE__,__LINE__,__FUNCTION__); +#endif + +/*! + * \~english Metadata object methods return codes. \~russian + * Коды возвратов методов объекта метаданных. \~ + */ +#define RC_OK 0 /**< All right - no errors */ +#define RC_ERROR 1 /**< Error while executing method */ + +#include +#include +class AMetaObjectGroup; + +class AMetaObject: public QObject +{ +Q_OBJECT +// system properties +Q_PROPERTY( Q_ULONG id READ id SCRIPTABLE true ) +Q_PROPERTY( QString name READ name SCRIPTABLE true ) +Q_PROPERTY( QString className READ className SCRIPTABLE true ) +Q_PROPERTY( QString description READ description SCRIPTABLE true ) + +public: + AMetaObject( const QString &objectclass = QString::null, + const QString &objectname = QString::null, + AMetaObjectGroup *parent = 0 ); + + void setClassName( const QString &name ); + + Q_ULONG id(); + void setId( Q_ULONG ); + QString className(); + QString name(); + + QString description(); + void setDescription( const QString &descr ); + + void setAttr( const QString &name, const QVariant &value ); + void setText( const QString &name, const QString &text ); + void setRawdata( const QString &name, const QByteArray &data ); + + QVariant attr( const QString &name ) const; + QString text( const QString &name ) const; + QByteArray rawdata( const QString &name ) const; + + QVariant attr( int idx ) const; + QString text( int idx ) const; + QByteArray rawdata( int idx ) const; + + QString attrName( int idx ) const; + QString textName( int idx ) const; + QString rawdataName( int idx ) const; + + bool attrExists( const QString &name ); + bool textExists( const QString &name ); + bool rawdataExists( const QString &name ); + + int attrCount() const; + int textCount() const; + int rawdataCount() const; + +public slots: + +private: + Q_ULONG v_id; + QString v_className; + QHash v_attr; + QHash v_text; + QHash v_rawdata; +}; + + + +class AMetaCatalogue: public AMetaObject +{ +Q_OBJECT +public: + AMetaCatalogue(); +}; + + + +class AMetaDataInfo: public AMetaObject +{ +Q_OBJECT +Q_PROPERTY( QString appname READ appName SCRIPTABLE true ) +Q_PROPERTY( QString author READ author SCRIPTABLE true ) +Q_PROPERTY( QDate date READ date SCRIPTABLE true ) +public: + AMetaDataInfo(); + AMetaDataInfo( const AMetaDataInfo &info ); + ~AMetaDataInfo(); + AMetaDataInfo& operator=(const AMetaDataInfo&); + + QString appName(); + void setAppName( const QString &name ); + long lastId(); + void setLastId( long id ); + QString author(); + void setAuthor( const QString &name ); + QDate date(); + void setDate( QDate d ); +}; + + +class AMetaDataGlobal: public AMetaObject +{ +Q_OBJECT +public: + AMetaDataGlobal(); + + QString sourceCode(); + void setSourceCode( const QString &src ); + +}; + +Q_DECLARE_METATYPE ( AMetaDataInfo ) + +//qRegisterMetaType("MetaDataInfo"); +//Q_DECLARE_METATYPE ( AMetaDataGlobal ) + +#endif diff --git a/src/lib/metadata/ametaobjectgroup.cpp b/src/lib/metadata/ametaobjectgroup.cpp new file mode 100644 index 0000000..bd2e97a --- /dev/null +++ b/src/lib/metadata/ametaobjectgroup.cpp @@ -0,0 +1,220 @@ +/**************************************************************************** +** $Id: ametaobjectgroup.cpp,v 1.2 2008/12/15 22:22:48 leader Exp $ +** +** Code file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +//--#include +#include +#include + +#include "ametaobject.h" +#include "ametaobjectgroup.h" + +#define context_startid 100 + + +/*! + * \class AMetaObjectGroup + * + */ +AMetaObjectGroup::AMetaObjectGroup( const QString &groupname ) +:QObject() +{ + setObjectName( groupname ); +} + + + + +AMetaObjectGroup::AMetaObjectGroup( const QString &groupname, AMetaObject *parent ) +:QObject( parent ) +{ + setObjectName( groupname ); +} + + +AMetaObjectGroup::AMetaObjectGroup( const QString &groupname, AMetaObjectGroup *parent ) +:QObject( parent ) +{ + setObjectName( groupname ); +} + + +QString +AMetaObjectGroup::name() +{ + return objectName(); +} + + + +AMetaObject * +AMetaObjectGroup::metaObject( const QString &name ) +{ + return findChild( name ); +} + + + +AMetaObject * +AMetaObjectGroup::metaObject( int idx ) +{ + return v_metaObjects.at( idx ); +} + + +void +AMetaObjectGroup::append( AMetaObject *obj ) +{ + obj->setParent( this ); + v_metaObjects.append( obj ); + connect( obj, SIGNAL(destroyed(QObject*)), this, SLOT(destroyed(QObject *))); +} + + +int +AMetaObjectGroup::count() const +{ + return v_metaObjects.count(); +} + + +void +AMetaObjectGroup::clear() +{ + v_metaObjects.clear(); +} + + +void +AMetaObjectGroup::destroyed( QObject *obj ) +{ + if ( obj->inherits("AMetaObject") ){ + v_metaObjects.removeAll( ( AMetaObject *) obj ); + } +} + + + +/*! + * \class ADocumentsGroup + * + */ +ADocumentsGroup::ADocumentsGroup() +:AMetaObjectGroup("Documents") +{ + +} + + + +/*! + * \class ACataloguesGroup + * + */ +ACataloguesGroup::ACataloguesGroup() +:AMetaObjectGroup("Catalogues") +{ + +} + + + +/*! + * \class AReportsGroup + * + */ +AReportsGroup::AReportsGroup() +:AMetaObjectGroup("Reports") +{ + +} + + + +/*! + * \class AReportsGroup + * + */ +AJournalsGroup::AJournalsGroup() +:AMetaObjectGroup("Journals") +{ + +} + + + +/*! + * \class AInformationRegistersGroup + * + */ +AInfoRegistersGroup::AInfoRegistersGroup() +:AMetaObjectGroup("InfoRegisters") +{ + +} + + + +/*! + * \class AInformationRegistersGroup + * + */ +AAccRegistersGroup::AAccRegistersGroup() +:AMetaObjectGroup("AccRegisters") +{ + +} + + + +/*! + * \class AMetaTables + * + */ +AMetaTables::AMetaTables() +:AMetaObjectGroup("MetaTables") +{ + +} + + + +/*! + * \class AMetaForms + * + */ +AMetaForms::AMetaForms() +:AMetaObjectGroup("MetaForms") +{ + +} diff --git a/src/lib/metadata/ametaobjectgroup.h b/src/lib/metadata/ametaobjectgroup.h new file mode 100644 index 0000000..52210a6 --- /dev/null +++ b/src/lib/metadata/ametaobjectgroup.h @@ -0,0 +1,185 @@ +/**************************************************************************** +** $Id: ametaobjectgroup.h,v 1.2 2008/12/15 22:22:48 leader Exp $ +** +** Header file of the Ananas configuration objects of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AMETAOBJECTGROUP_H +#define AMETAOBJECTGROUP_H + +#include +#include +#include + +#include "ametaobject.h" + +#include +#include + + +/*! + *\en + * Metadata object for metadata script access. + *\_en + *\ru + * \brief Объект метаданных для обеспечения доступа из скриптов. + * Наследует QObject. + *\_ru + */ +class AMetaObjectGroup: public QObject +{ +Q_OBJECT +Q_PROPERTY( QString name READ name SCRIPTABLE true ) +public: + AMetaObjectGroup( const QString &groupname ); + AMetaObjectGroup( const QString &groupname, AMetaObject *parent ); + AMetaObjectGroup( const QString &groupname, AMetaObjectGroup *parent ); + + QString name(); +// QMetaObject *metaObject(const QString &objClass, const QString &objName); +// QMetaObject *metaObject(const QString &objClass, const QString &objName); + AMetaObject *metaObject( const QString &name ); + AMetaObject *metaObject( int idx ); + void append( AMetaObject *object ); + int count() const; + void clear(); + +public slots: + QString test(){ return QString("TEST STRING");}; + +private slots: + void destroyed( QObject *obj ); + +private: + QList v_metaObjects; +}; + + +class ACataloguesGroup: public AMetaObjectGroup +{ +Q_OBJECT +public: + ACataloguesGroup(); + +public slots: + + +}; + + + +class ADocumentsGroup: public AMetaObjectGroup +{ +Q_OBJECT +public: + ADocumentsGroup(); + +public slots: + QString test(){ return QString("DOCUMENTS TEST STRING");}; + + +}; + + + +class AReportsGroup: public AMetaObjectGroup +{ +Q_OBJECT +public: + AReportsGroup(); + +public slots: + + +}; + + + +class AJournalsGroup: public AMetaObjectGroup +{ +Q_OBJECT +public: + AJournalsGroup(); + +public slots: + + +}; + + + +class AInfoRegistersGroup: public AMetaObjectGroup +{ +Q_OBJECT +public: + AInfoRegistersGroup(); + +public slots: + + +}; + + + +class AAccRegistersGroup: public AMetaObjectGroup +{ +Q_OBJECT +public: + AAccRegistersGroup(); + +public slots: + + +}; + + + +class AMetaTables: public AMetaObjectGroup +{ +Q_OBJECT +public: + AMetaTables(); + +public slots: + + +}; + + + +class AMetaForms: public AMetaObjectGroup +{ +Q_OBJECT +public: + AMetaForms(); + +public slots: + + +}; + +#endif diff --git a/src/lib/metadata/metadata.pri b/src/lib/metadata/metadata.pri new file mode 100644 index 0000000..d914a90 --- /dev/null +++ b/src/lib/metadata/metadata.pri @@ -0,0 +1,19 @@ +HEADERS += \ + metadata/ametadata.h \ + metadata/ametaobject.h \ + metadata/ametaobjectgroup.h \ + metadata/ametafield.h \ + metadata/ametadocument.h \ + metadata/ametaform.h \ + metadata/ametadataio.h \ + metadata/ametadataioxml.h + +SOURCES += \ + metadata/ametadata.cpp \ + metadata/ametaobject.cpp \ + metadata/ametaobjectgroup.cpp \ + metadata/ametafield.cpp \ + metadata/ametadocument.cpp \ + metadata/ametaform.cpp \ + metadata/ametadataio.cpp \ + metadata/ametadataioxml.cpp diff --git a/src/lib/objects/aaregister.cpp b/src/lib/objects/aaregister.cpp new file mode 100644 index 0000000..5b7a027 --- /dev/null +++ b/src/lib/objects/aaregister.cpp @@ -0,0 +1,585 @@ +/**************************************************************************** +** $Id: aaregister.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Code file of the Accumulation Register of Ananas +** Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) 2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "aaregister.h" +#include "adatabase.h" +#include "adocjournal.h" +#include "alog.h" +#include +//Added by qt3to4: +#include + + +/*! + *\en + * Constructor that create object of aAregister by metadata object. + *\_en + *\ru + * Конструктор, который создает объект по элементу метаданных. + *\_ru + *\param context -\en configuration item, \_en \ru + элемент конфигурации,\_ru + *\param adb -\en link on ananas database.\_en \ru + ссылка на базу данных.\_ru + */ +aARegister::aARegister( aCfgItem context, aDatabase * adb ) +:aIRegister( context, adb ) +{ + concrete = !context.isNull(); + initObject(); +} + + + +/*! + *\en + * Сonstructor that create object of aAregister by metadata name + *\_en + *\ru + * Конструктор, который создает объект по имени рагистра остатков из конфигурации. + *\_ru + *\param context -\en md name of register,\_en \ru + имя регистра, заданное в конфигурации через Ананас-Дизайнер,\_ru + *\param adb - + \en link on ananas database.\_en + \ru ссылка на базу данных. Необязательный параметр. Если не задан или задано нулевое + значение, создавамый объект для работы с регистром не будет связан с базой данный. + То есть объект не будет заполнен данными из регистра, хранящимися в базе данных, + и все изменения, вносимые в него, не будут сохранены в базе данных. + \_ru + */ +aARegister::aARegister( QString name, aDatabase *adb ) +:aIRegister( name, adb, "AccumulationRegister.") +{ + if ( name.isEmpty() ) concrete = false; + else concrete = true; + initObject(); +} + +/*! + *\en + * Destructor + *\_en + *\ru + * Деструктор. + *\_ru + */ +aARegister::~aARegister() +{ +} + + +/*! + *\en + * Initing this object by metadata object. + * Сreating used tables and filters + *\_en + *\ru + * Инициализирует объект элементом конфигурации. + * В процесе инициализации выполняется настройка на таблицы базы данных. + * Этот метод вызывается конструктором. + *\_ru + *\return -\en error code.\_en \ru код ошибки.\_ru + */ +ERR_Code +aARegister::initObject() +{ + int len_uf; + //resnames.clear(); + ERR_Code err = aIRegister::initObject(); + if ( err ) + { + aLog::print(aLog::Error, tr("Accumulation Register init")); + return err; + } + err = tableInsert( db->tableDbName(*md,obj), obj ); + if ( err ) + { + aLog::print(aLog::Error, tr("Accumulation Register create main table")); + return err; + } + aCfgItem field, dims = md->find(obj, md_dimensions,0); + aCfgItem ress = md->find(obj, md_resources,0); + //if ( res.isNull() ) return err_noresources; + tablename = table()->tableName; + uint n = md->count( dims, md_field ); + for ( uint i = 0; i < n; i++ ) + { + field = md->find( dims, md_field, i ); + err = tableInsert( db->tableDbName(*md,field), field, md->attr(field,mda_name) ); + if ( err ) + { + aLog::print(aLog::Error, tr("Accumulation Register create saldo table")); + return err; + } + long mdid = md->id(field); + QString f_name = md->attr(field,mda_name); + dimnames[mdid]=f_name; + } + ress = md->find(obj, md_resources,0); + n = md->count( ress, md_field ); + for ( uint i = 0; i < n; i++ ) + { + field = md->find( ress, md_field, i ); + long mdid = md->id(field); + QString f_name = md->attr(field,mda_name); + resnames[mdid]=f_name; + resSysNames[f_name]=QString("uf%1").arg(md->attr(field,mda_id)); + } + return err_noerror; +} + + +/*! + *\en + * \brief Adds new line to register table. + * + * \return Error code + * \see SetDocument( aDocument * doc ) + * \see SetTable( const QString & tblname ) + *\_en + *\ru + * \brief Добавляет новую строку к таблице регистра. + * + * \return Код ошибки + * \see SetDocument( aDocument * doc ) + * \see SetTable( const QString & tblname ) + *\_ru + */ +int +aARegister::New() +{ + if ( !docseted ) return err_nodocument; + aSQLTable * t = table(); + if ( !t ) return err_notable; + qulonglong idd = nowDoc->getUid(); + if ( !idd ) return err_notselected; + int err = aObject::New(); + if ( err ) return err; + t->setSysValue( "idd", idd ); + t->setSysValue( "date", nowDoc->Value("DocDate") ); + if ( tableseted ) + { + aSQLTable * tt = nowDoc->getTable ( tname ); + t->setSysValue("iddt",tt->sysValue("id")); + t->setSysValue("ln",tt->sysValue("ln")); + } + err = Update(); + if ( err ) return err; + else return select(getUid()); +} + +/*! + *\en + * Updates information in database. + * Reimplements aObject function for recalc rests. + *\_en + *\ru + * Обновляет информацию в регитре. + * Все новые значения, заданные с помощью SetValue, сохраняются в базе данных. + * Выполняет пересчет остатков. + *\_ru + *\return -\en error code.\_en \ru код ошибки.\_ru + */ +int +aARegister::Update() +{ + aIRegister::Update(); + qulonglong uid = getUid(); + resum( table(), nowDoc->Value("DocDate").toDateTime(), true ); + aLog::print(aLog::Debug, tr("Accumulation Register update")); + return err_noerror;//aIRegister::Update(); +} + + +/*! + *\en + * Deletes records from accumulation registers. + * Deletes all records from accumulation register tables that contents reference to doc. + *\_en + *\ru + * Удаляет все записи в регистре, ссылающиеся на досумент. + *\_ru + *\param doc - \en document to delete\_en \ru + документ для удаления\_ru + *\return - \en false if can't find tag in meta data or have no document.\_en \ru + false если в конфигурации отсутствует раздел регистров остатков или нет документа.\_ru + */ +bool +aARegister::deleteDocument( aDocument * doc ) +{ + qulonglong idd = doc->getUid(); + if ( !idd ) return false; + aSQLTable *t = table(); + if ( t->select(QString("idd=%1").arg(idd) )) + { + if(t->first()) + { + do + { + resum( t, doc->Value("DocDate").toDateTime(), false ); + }while(t->next()); + } + db->db()->exec(QString("delete from %1 where idd=%2").arg(t->tableName).arg(idd)); + aLog::print(aLog::Info, QString("Accumulation register delete document with idd=%1").arg(idd)); + } + return true; +} + + + + +/*! + *\en + * Gets saldo. + * Helper metod. + *\_en + * \see getSaldo(const QDateTime &date, const QString & dimfieldname, QVariant dimvalue, const QString &resname) + *\ru + * Функция получения остатка. Вспомогательный метод. Служит для совместимости со скриптами. + *\_ru + *\param strdate - \en date\_en \ru дата, за которую надо получить остаток. Дата задается в виде строки в ISO формате.\_ru + *\param dimfieldname - \en name of dimensions field\_en \ru измерение, по которому нужно получить остаток\_ru + *\param dimvalue - \en value of dimensions field\_en \ru значение измерения, по которому надо получить остаток\_ru + *\param resname - \en name of resounces field\_en \ru ресурс, значение которого надо получить\_ru + *\return - \en Saldo value or QVariant::Invalid on error.\_en \ru + Значение остатка или QVariant::Invalid при ошибке или неправильных параметрах.\_ru + */ +QVariant +aARegister::getSaldo(const QString & strdate, const QString & dimfieldname, QVariant dimvalue, const QString &resname) +{ + QDateTime data = QDateTime::fromString(strdate,Qt::ISODate); + + if (!data.isValid()){ + QDate dt = QDate::fromString(strdate,Qt::ISODate); + if(dt.isValid()) + { + QTime tm; + data.setDate(dt); + data.setTime(tm); + return getSaldo(data,dimfieldname, dimvalue,resname); + } + else + { + aLog::print(aLog::Error, QString(tr("Accumulation register convert datetime from string %1")).arg(strdate)); + return QVariant::Invalid; + } + } + else + { + return getSaldo(data,dimfieldname, dimvalue,resname); + } +} + + + +/*! + * \ru + * Выбирает остаток на заданную дату-время. + * Выбирает остаток на заданную дату-время для одного (любого из заданных в регистре) + * аналитического разреза (измерения) с указанным значением. + * Проще говоря, метод позволяет получить, например, остаток по дебету или кредиту требуемого счета + * на требуемую дату, если регистр используется для хранения бухгалтерских проводок, в каждой из которых + * указывается один дебетуемый и один кредитуемый счет. + * \param date - дата, на которую требуется получить остаток. + * \param dimfieldname - название аналитического разреза регистра. + * \param dimvalue - значение (точка) аналитического разреза, для которого требуется определить остаток. + * Например для Аналитического разреза "Счет по дебету" значение может быть "41.1" или любой другой + * номер счета бухгалтерского плана счетов. + * \return возвращает значение остатка. + * \_ru + */ + +QVariant +aARegister::getSaldo(const QDateTime &date, const QString & dimfieldname, QVariant dimvalue, const QString &resname) +{ + aSQLTable *t_dim = table(dimfieldname); + if(!t_dim) + { + aLog::print(aLog::Error,QString(tr("Accumulation register not found table %1")).arg(dimfieldname)); + return QVariant::Invalid; + } + t_dim->clearFilter(); + if(!t_dim->setFilter(dimfieldname,dimvalue)) + { + aLog::print(aLog::Error,tr("Accumulation register set filter")); + return QVariant::Invalid; + } + QString flt = QString("date<='%1' and %2").arg(date.toString(Qt::ISODate)).arg(t_dim->getFilter()); + + QString query = QString("select * from %1 where %2").arg(t_dim->tableName).arg(flt); + t_dim->clearFilter(); + t_dim->select(); + + QSqlQuery q = db->db()->exec(query); + q.last(); + if(q.isValid()) + { + return q.value(t_dim->position(resSysNames[resname])); + } + else + { + aLog::print(aLog::Debug,"Accumulation register record empty"); + } + return QVariant::Invalid;// t_dim->value(resname);//QVariant::Invalid; +} + + +/*! + * \ru + * Вычисляет сумму за определенный период. + * Выбирает сумму для одного (минимум) аналитического разреза (измерения) с указанным значением. + * Если необходимо сальдо по нескольким измерениям, установите по ним фильтры \see aIRegister::SetFilter() + * \param from - дата начала периода. + * \param to - дата окончания периода. + * \param dimfieldname - название аналитического разреза регистра. + * \param dimvalue - значение (точка) аналитического разреза, для которого требуется определить остаток. + * Например для Аналитического разреза "Счет по дебету" значение может быть "41.1" или любой другой + * номер счета бухгалтерского плана счетов. + * \return возвращает значение остатка. + * \_ru + */ +QVariant +aARegister::getSaldoByManyDimensions(const QString &from, const QString &to, const QString & dimfieldname, QVariant dimvalue, const QString &resname) +{ + aSQLTable *t = table(); + QString currentFilter; + + if(!t) + { + aLog::print(aLog::Error,QString(tr("Accumulation register not found main table"))); + return QVariant::Invalid; + } + currentFilter = t->filter(); // QSqlCursor method call + + if(!t->setFilter(dimfieldname,dimvalue)) + { + aLog::print(aLog::Error,tr("Accumulation register set filter")); + t->setFilter( currentFilter ); // QSqlCursor method call + t->select(); + return QVariant::Invalid; + } + QString flt = QString("date>='%1' and date<='%2' and %3 ").arg(from).arg(to).arg(t->getFilter()); + + QString query = QString("select sum(%1) from %2 where %3").arg(resSysNames[resname]).arg(t->tableName).arg(flt); + + aLog::print(aLog::Info,QString("Accumulation register query %1").arg(query)); + QSqlQuery q = db->db()->exec(query); + q.last(); + if(q.isValid()) + { + t->setFilter( currentFilter ); + t->select(); + return q.value(0);//t->position(resSysNames[resname])); + } + else + { + aLog::print(aLog::Debug,"Accumulation register record empty"); + } + t->setFilter( currentFilter ); + t->select(); + return 0; + +} +/*! + *\en + * Recalculates rest tables. + *\_en + *\ru + * Пересчитывает таблицы остатков. + * Таблицы остатков пересчитывается для всех занчений с равной или более поздней датой. + * В передаваемой таблице должны быть выбрана запись, обусловившая пересчет. + *\_ru + *\param t - \en table with selected record \_en \ru + * таблица с выбранной записью\_ru + *\param dd - \en date for start recalculation.\_en \ru + * дата, с которой пересчитаются остатки.\_ru + *\param plus - \en true for new record, false for delete\_en \ru + * true для новой записи, false для удаления записи.\_ru + */ +void +aARegister::resum( aSQLTable * t, const QDateTime & dd, bool plus ) +{ + aCfgItem dims; + dims = md->find( obj, md_dimensions ); + int dims_count = md->count(dims,md_field); + for(uint i=0; ifindChild(dims,md_field,i); + long dimId = atoi(md->attr(dim,mda_id).ascii()); + aSQLTable *t_dim = table(md->attr(dim,mda_name)); + QVariant v = t->value(md->attr(dim,mda_name)); + if(v.isValid() && !v.isNull() && v!=QString()) + { + recalculate_saldo(t_dim, t, dd, plus, dimId, v ); + } + } +} + + + +/*! + *\ru + * Выбирает запись в таблице остатков с заданной датой, если ее нет, то создает новую. + * После этого вызывает функцию для обновления значений остатков. + *\_ru + *\param t_dim - \en saldo table \_en \ru таблица остатков для обновления\_ru + *\param t - \en table \_en \ru таблица оборотов с выбранной записью, из которой берутся значения\_ru + *\param dd - \en date for start recalculation.\_en \ru дата, с которой пересчитаются остатки.\_ru + *\param plus - \en true for new record, false for delete\_en \ru true для новой записи, false для удаления записи.\_ru + *\param dimId - \en dimension id\_en \ru id поля измерения в метаданных\_ru + *\param dimValue - \en dimension value\_en \ru значение поля измерения в метаданных\_ru + */ +void //protected +aARegister::recalculate_saldo(aSQLTable *t_dim, aSQLTable *t, const QDateTime & dd, bool plus, long dimId, QVariant dimValue) +{ + QString query = QString("select * from %1 where date='%2' and uf%3='%4'").arg(t_dim->tableName).arg(dd.toString(Qt::ISODate)).arg(dimId).arg(dimValue.toString()); + + QSqlQuery q =db->db()->exec(query); + q.first(); + if(!q.isValid()) + { + t_dim->select(); + QString where = QString("date<'%2' and uf%3='%4'").arg(dd.toString(Qt::ISODate)).arg(dimId).arg(dimValue.toString()); + query = QString("select * from %1 where %2").arg(t_dim->tableName).arg(where); + QString values; + q = db->db()->exec(query); + q.last(); + if(q.isValid()) + { + //t_dim->select(query,false); + //t_dim->last(); + insert_values(&q,t_dim,dd,plus,dimId,dimValue); + } + else + { + insert_values(0,t_dim,dd,plus,dimId,dimValue); + } + } + update_values(t_dim,dd,plus,dimId,dimValue,t); +} + +/*! + *\ru + * Добавляет запись в таблицу остатков. + *\_ru + *\param q - \en query with selected record \_en \ru запрос с данными для добавления. Если q!=0, то данные из q попадут в добавляемую строку\_ru + *\param t_dim - \en saldo table \_en \ru таблица остатков\_ru + *\param dd - \en date for start recalculation.\_en \ru дата, с которой пересчитаются остатки.\_ru + *\param plus - \en true for new record, false for delete\_en \ru true для новой записи, false для удаления записи.\_ru + *\param dimId - \en dimension id\_en \ru id поля измерения в метаданных\_ru + *\param dimValue - \en dimension value\_en \ru значение поля измерения в метаданных\_ru + */ + +int //protected +aARegister::insert_values(QSqlQuery *q, aSQLTable *t_dim, const QDateTime & dd, bool plus, long dimId, QVariant dimValue) +{ + int res=0; + QString ins_col = QString("date,uf%1,").arg(dimId); + QString ins_val = QString("'%1','%2',").arg(dd.toString(Qt::ISODate)).arg(dimValue.toString()); + QMap::Iterator it; + QVariant res_value; + for ( it = resSysNames.begin(); it != resSysNames.end(); ++it ) + { + if(q) + { + res_value = q->value(t_dim->position(it.data())); + } + else + { + res_value = 0; + } + ins_col+=QString("%1,").arg(it.data()); + ins_val+=QString("%2,").arg(res_value.toString()); + } + ins_col.truncate(ins_col.length()-1); + ins_val.truncate(ins_val.length()-1); + QString query = QString("insert into %1 (%2) values(%3)").arg(t_dim->tableName).arg(ins_col).arg(ins_val); + db->db()->exec(query); + t_dim->select(); + return res; +} + + + +/*! + *\ru + * Обновляет записи в таблице остатков с датой, большей или равной заданной. + *\_ru + *\param t_dim - \en saldo table \_en \ru таблица остатков для обновления\_ru + *\param t - \en table \_en \ru таблица оборотов с выбранной записью, из которой берутся значения\_ru + *\param dd - \en date for start recalculation.\_en \ru дата, с которой пересчитаются остатки.\_ru + *\param plus - \en true for new record, false for delete\_en \ru true для новой записи, false для удаления записи.\_ru + *\param dimId - \en dimension id\_en \ru id поля измерения в метаданных\_ru + *\param dimValue - \en dimension value\_en \ru значение поля измерения в метаданных\_ru + */ +int //protected +aARegister::update_values(aSQLTable *t_dim, const QDateTime & dd, bool plus, long dimId, QVariant dimValue, aSQLTable *t) +{ + QMap::Iterator it; + QString upd; + QString where = QString("date>='%1' and uf%2='%3'").arg(dd.toString(Qt::ISODate)).arg(dimId).arg(dimValue.toString()); + QVariant res_value; + QString sign;//="-"; + //if(plus) sign="+"; + for ( it = resnames.begin(); it != resnames.end(); ++it ) + { + if(t) + { + res_value = t->value(it.data()); + } + else + { + res_value = 0; + } + if(plus) sign="+"; + else sign ="-"; + upd+=QString("uf%1=uf%2%3%4,").arg(it.key()).arg(it.key()).arg(sign).arg(res_value.toString()); + } + upd.truncate(upd.length()-1); + QString query = QString("update %1 set %2 where %3").arg(t_dim->tableName).arg(upd).arg(where); + db->db()->exec(query); + return 0; +} + + + + + +QString +aARegister::trSysName( const QString & sname) +{ + if(sname == tr("RecordDate") || sname == "RecordDate" ) + { + return "date"; + } + else return ""; +} diff --git a/src/lib/objects/aaregister.h b/src/lib/objects/aaregister.h new file mode 100644 index 0000000..ac1e906 --- /dev/null +++ b/src/lib/objects/aaregister.h @@ -0,0 +1,104 @@ +/**************************************************************************** +** $Id: aaregister.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the Accumulation Register of Ananas +** Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Andrey Paskal . +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AAREGISTER_H +#define AAREGISTER_H + +#include "acfg.h" +#include "airegister.h" +//Added by qt3to4: +#include + + + +/*! + *\en + * Object for working with accumulation register in database. + * Using for provide between database tables and wobjects or ananas scripts + *\_en + *\ru + *\brief Класс aARegister определяет программный интерфейс Накопительных регистров. Наследует aIRegister. + * + * Накопительный регистр расширяет функциональность информационного регистра aIRegister, + * автоматически расчитывая остатки по каждому измерению. + * В базе данных хранятся остатки по каждому измерению и на каждое время изменения значения ресурсов. + * Реквизиты накопительного регистра деляться на три вида: измерения, ресурсы, примечания. + * \see aIRegister + *\_ru + */ +class ANANAS_EXPORT aARegister : public aIRegister +{ + Q_OBJECT +public: + aARegister(aCfgItem context, aDatabase * adb = 0); + aARegister(QString name, aDatabase * adb = 0); + virtual ~aARegister(); + + virtual ERR_Code initObject(); + + virtual bool deleteDocument( aDocument * doc ); + //virtual bool deleteTable( Q_ULLONG iddt ); + virtual QString trSysName( const QString & sname ); +public slots: + virtual ERR_Code New(); + virtual int Update(); + //int SelectCountByDoc(); + //int ClosePeriod( const QDateTime & date = QDateTime::currentDateTime() ); + //int SelectRemainders(const QDateTime & date = QDateTime::currentDateTime() ); + //int SelectRemainders(const QString & strdate); + //int SelectRemainder(const QString & strdate, const QString & dimfieldname, QVariant dimvalue); + QVariant getSaldo(const QDateTime &date, const QString & dimfieldname, QVariant dimvalue, const QString &resname); + QVariant getSaldo(const QString &dateISO, const QString & dimfieldname, QVariant dimvalue, const QString &resname); + + QVariant getSaldoByManyDimensions(const QString &from, const QString &to, const QString & dimfieldname, QVariant dimvalue, const QString &resname); + /* + QVariant SumValue( const QString & name ); + bool SumNext(); + bool SumPrev(); + bool SumFirst(); + bool SumLast(); + */ +protected: + void recalculate_saldo(aSQLTable *t, aSQLTable *t_dim, const QDateTime & dd, bool plus, long dimId, QVariant dimValue); + int insert_values(QSqlQuery *q, aSQLTable *t_dim, const QDateTime & dd, bool plus, long dimId, QVariant dimValue); + int update_values(aSQLTable *t_dim, const QDateTime & dd, bool plus, long dimId, QVariant dimValue, aSQLTable *t=0); +private: + + void resum( aSQLTable * t, const QDateTime & dd, bool plus ); + QString tablename; + QSqlQuery sumQuery; + QMap resnames; + QMap resSysNames; + QMap dimnames; + //QDateTime actualDate; + //ERR_Code makeTmpTable( const QDateTime & date ); +}; + +#endif// AAREGISTER_H diff --git a/src/lib/objects/acatalogue.cpp b/src/lib/objects/acatalogue.cpp new file mode 100644 index 0000000..63b6a54 --- /dev/null +++ b/src/lib/objects/acatalogue.cpp @@ -0,0 +1,1146 @@ +/**************************************************************************** +** $Id: acatalogue.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Catalogue metadata object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "acfg.h" +#include "aobject.h" +#include "adatabase.h" +#include "acatalogue.h" +#include "alog.h" +//Added by qt3to4: +#include + + +/*!\en + *\_en \ru + *\_ru + */ +aCatalogue::aCatalogue( aCfgItem context, aDatabase * adb ) +:aObject( context, adb, 0, "aCatalogue") +{ + concrete = !context.isNull(); + initObject(); +} + + + +/*!\en + *\_en \ru + *\_ru + */ +aCatalogue::aCatalogue(QString name, aDatabase * adb) +:aObject( "Catalogue."+name, adb, 0, "aCatalogue") +{ + if ( name.isEmpty() ) concrete = false; + else concrete = true; + initObject(); +} + + + +ERR_Code +aCatalogue::initObject() +{ + ERR_Code err = aObject::initObject(); + if ( err ) return err; + aCfgItem g = md->find( obj, md_group ), e = md->find( obj, md_element ); + err = tableInsert( aDatabase::tableDbName( *md, e ), e ); + if ( err ) return err; + return tableInsert( aDatabase::tableDbName( *md, g ), g, md_group ); +} + +/* +Q_ULLONG +aCatalogue::getCatGroup() +{ + aSQLTable * t = table(); + if ( !t ) return 0; + if ( !selected() ) return 0; + return t->sysValue("idg").toULongLong(); +}*/ + +qulonglong +aCatalogue::getGroup() +{ + aSQLTable * t = table(md_group); + if ( !t ) return 0; + if ( !selected(md_group) ) return 0; + return t->sysValue("id").toULongLong(); +} + +ERR_Code +aCatalogue::setGroup( qulonglong idg ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + if ( !selected() ) return err_notselected; + t->setSysValue( "idg", idg ); + t->primeUpdate(); + t->update(); + return err_noerror; +} + +ERR_Code +aCatalogue::SetGroup( aCatalogue * cat ) +{ + if ( !cat ) return setGroup( 0 ); + else return setGroup(cat->getGroup()); +} + +qulonglong +aCatalogue::getOwner() +{ + aSQLTable * t = table(); + if ( !t ) return 0; + if ( !selected() ) return 0; + return t->sysValue("ido").toULongLong(); +} + +ERR_Code +aCatalogue::setOwner( qulonglong ido ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + if ( !selected() ) return err_notselected;; + t->setSysValue( "ido", ido ); + t->primeUpdate(); + t->update(); + return err_noerror; +} + +ERR_Code +aCatalogue::SetOwner( aCatalogue * cat ) +{ + if ( !cat ) return setOwner( 0 ); + else return setOwner(cat->getUid()); +} + +ERR_Code +aCatalogue::New( bool child ) +{ + qulonglong group = getGroup(), parent = getUid(); + ERR_Code err = aObject::New(); + if ( err ) return err; + aSQLTable * t = table(); + t->setSysValue( "idg", group ); + if ( child ) t->setSysValue( "ido", parent ); + t->primeUpdate(); + t->update(); + if ( group ) groupSelect(); + setSelected(true); + return err_noerror; +} + + +ERR_Code +aCatalogue::New( ) +{ + return New(false); +} + + +ERR_Code +aCatalogue::Delete() +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + if ( !selected() ) return err_notselected; + qulonglong ido = t->sysValue("id").toULongLong(); + if ( ido ) + { + aLog::print(aLog::Debug, tr("aCatalogue delete ido=%1").arg(ido)); + aCatalogue cat( obj, db ); + while ( !cat.selectByOwner(ido) ) + { + cat.Delete(); + } + } + return aObject::Delete(); +} + +ERR_Code +aCatalogue::Update() +{ + ERR_Code err = aObject::Update(); + if ( !err ) + { + + aLog::print(aLog::Debug, tr("aCatalogue update")); + err = TableUpdate( md_group ); + if(err) + { + aLog::print(aLog::Error, tr("aCatalogue update groups error %1").arg(err)); + } + else + { + aLog::print(aLog::Debug, tr("aCatalogue update groups")); + } + } + else + { + aLog::print(aLog::Error, tr("aCatalogue update elements error %1").arg(err)); + } + return err; +} + +ERR_Code +aCatalogue::Copy() +{ + return aObject::Copy(); +} + +ERR_Code +aCatalogue::Select( bool grouponly ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; +// setSelected(true,md_group); +// setSelected(true); + qulonglong idg = getGroup(); + QString flt = ""; +// groupSelect(); + if ( grouponly ) flt = QString("idg=%1").arg( idg ); + if ( t->select( flt ) ) + if ( t->first() ) + { + setSelected(true); + qulonglong newidg = t->sysValue("idg").toULongLong(); + + aLog::print(aLog::Debug, tr("aCatalogue select group id=%1").arg(idg)); + if ( newidg != idg ) groupSelect( newidg ); + return err_noerror; + } + else return err_notselected; + else return err_selecterror; +} + +/*! + *\~english + * Select group. + * Get group id from current element and select group table + * with this id. + *\~russian + *\~ + * \return \~english Error code \~russian \~ + */ +int +aCatalogue::GroupSelect() +{ + aSQLTable * t = table(); + if(!t) return err_notable; + if ( !selected() ) return err_notselected;; + qulonglong idg = t->sysValue("idg").toULongLong(); + return groupSelect(idg); +} +void +aCatalogue::UnSelect( bool grouponly ) +{ + if (!grouponly ) + { + setSelected(false); + } + setSelected(false, md_group); +} +ERR_Code +aCatalogue::groupSelect ( qulonglong idg ) +{ + if ( !idg ) return err_noerror; + aSQLTable * t = table( md_group ); + if ( !t ) return err_notable; + setSelected( false, md_group ); + if ( t->select( idg ) ) + if ( t->first() ) + { + setSelected( true, md_group ); + return err_noerror; + } + else return err_notselected; + else return err_selecterror; +} + + +ERR_Code +aCatalogue::groupSelect () +{ + aSQLTable * t = table(md_group); + if ( !t ) return err_notable; + qulonglong idg = t->sysValue("id").toULongLong(); + return groupSelect( idg ); +} + +ERR_Code +aCatalogue::selectByOwner ( qulonglong ido ) +{ + aSQLTable * t = table(); + + if ( !t ) return err_notable; + if ( t->select(QString("ido=%1").arg(ido),false) ) + if ( t->first() ) + { + setSelected(true); + return err_noerror; + } + else return err_notselected; + else return err_selecterror; +} + +ERR_Code +aCatalogue::selectByGroup ( qulonglong idg ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + setSelected(false); + if ( t->select(QString("idg=%1").arg(idg),false ) ) + if ( t->first() ) + { + setSelected(true); + return err_noerror; + } + else return err_notselected; + else return err_selecterror; +} + +ERR_Code +aCatalogue::groupByParent(qulonglong idp ) +{ + aSQLTable * t = table( md_group ); + if ( !t ) return err_notable; +//f ( !selected(md_group) ) return err_notselected; + setSelected( false, md_group ); + if ( t->select(QString("idp=%1").arg(idp),false) ) + if ( t->first() ) + { + setSelected(true,md_group); + return err_noerror; + } + else + { + return err_notselected; + } + else return err_selecterror; +} + + + +/*!\en + * Select groups depth level. + * \param level (in) - level +\_en \ru + * + *\_ru +*/ +int +aCatalogue::selectByLevel(int level ) +{ + aSQLTable * t = table(md_group); + if ( !t ) return err_notable; +// if ( !selected(md_group) ) return err_notselected; + setSelected( false, md_group ); + if ( t->select(QString("level=%1").arg(level),false) ) + if ( t->first() ) + { + + setSelected(true, md_group); + return err_noerror; + } + else + { + return err_notselected; + } + else + { + return err_selecterror; + } + +} + + + +/*!\en + * Gets id of group on the id of element + * \param ide (in) - id of element. + * \return id of group. + \_en \ru + * Получает идентификационный номер группы по номеру элемента + * \param ide (in) - идентификационный номер элемента. + * \return идентификационный номер группы. + *\_ru + */ +qulonglong +aCatalogue::idGroupByElement(qulonglong ide ) +{ + aSQLTable * t = table(); + if ( !t ) return 0; + t->select(QString("id=%1").arg(ide), false); + if ( t->first() ) + { + setSelected(true); + return sysValue("idg").toLongLong(); + } + else return 0; +} + +ERR_Code +aCatalogue::GroupNew( bool reparent ) +{ + aSQLTable * te = table(), *tg = table( md_group ); + if ( !te || !tg ) return err_notable; +// groupSelect(); +// setSelected(true, md_group); + qulonglong idp = getGroup(), level = tg->sysValue("level").toULongLong(), + idg = tg->primeInsert()->value("id").toULongLong(); + if ( tg->insert() ) + { + if ( idp ) level++; + tg->select( idg ); + if ( !tg->first() ) return err_selecterror; + tg->selected = true; + aLog::print(aLog::Info,tr("aCatalogue new group with id=%1").arg(idg) ); + tg->setSysValue("idp",idp); + tg->setSysValue("level",level); + if ( reparent ) te->setSysValue("idg",idg); + } + return Update(); +} + + + +/*!\en + * Inserts new group in groups table + * \param parentId (in) - id parent group, or 0 if no parent. + \_en \ru + * Вставляет новую группу в таблицу групп + * \param parentId (in) - идентификационный номер группы предка или 0 если нет предка. + *\_ru +*/ +ERR_Code +aCatalogue::newGroup(qulonglong parentId ) +{ + aSQLTable *tg = table( md_group ); + if (!tg ) return err_notable; + setSelected(true, md_group); + tg->select(parentId); + setSelected(true,md_group); + qulonglong level, idg; + if(tg->first()) + { + level = tg->sysValue("level").toULongLong()+1; + } + else level=0; + QSqlRecord* rec = tg->primeInsert(); // get edit buffer for table groups + idg = rec->value("id").toULongLong(); + aLog::print(aLog::Info,tr("aCatalogue new group with id=%1").arg(idg) ); + rec->setValue("id",idg ); + rec->setValue("idp",parentId); + rec->setValue("level",level); + rec->setValue("df","0"); + tg->insert(); // insert record + tg->select(QString("id=%1").arg(idg),false); // set cursor to inserted record + tg->first(); + setSelected(true,md_group); + //tg->update(); +return groupSelect(idg); +} + + + +/*!\en + * Inserts new element in elements table + * \param parentId (in) - id parent group. + \_en \ru + * Вставляет новый элемент в таблицу элементов + * \param parentId (in) - идентификационный номер группы предка. + *\_ru + */ +ERR_Code +aCatalogue::newElement(qulonglong parentId ) +{ + aSQLTable *te = table(); + if (!te) return err_notable; + QSqlRecord *rec; + qulonglong ide; + rec = te->primeInsert(); // get edit buffer for table elements + ide = rec->value("id").toULongLong(); + rec->setValue("id",ide); // set defult values for all user fields = id + //for(uint i=0; i< rec->count(); i++) + //{ + // rec->setValue(i,ide); +// printf("%s\n",rec->fieldName(i).ascii()); + //} + rec->setValue("idg",parentId); + rec->setValue("df","0"); + rec->setNull("ido"); + te->insert(); // insert edit buffer as new line in table + te->select(QString("id=%1").arg(ide),false); // set cursor to inserted record + te->first(); + setSelected(true); + return err_noerror; +} + + + +/*!\en + * Mark deleted element only. Don't supports link one to many. + * \return id of deleted element. + \_en \ru + * Только выделяет удаляемый элемент. Не поддерживает связь один ко многим. + * \return идентификационный номер удаляемого элемента. + *\_ru + */ +qulonglong +aCatalogue::setMarkDeletedElement(qulonglong id_el,bool del) +{ + select(id_el); + SetMarkDeleted(del); + Update(); +return table()->sysValue("id").toULongLong(); +} +qulonglong +aCatalogue::setMarkDeletedGroup(qulonglong id_gr, bool del) +{ + groupSelect(id_gr); + SetMarkDeleted(del, md_group); + GroupUpdate(); +return table()->sysValue("id").toULongLong(); +} + + + +/*!\en + * Delets element only. Don't supports link one to many. + * \return id of deleted element. + \_en \ru + * Только удаляет элемент. Не поддерживает связь один ко многим. + * \return идентификационный номер удаляемого элемента. + *\_ru + */ +qulonglong +aCatalogue::delElement() +{ + aSQLTable * t = table(); + qulonglong ide=0; + if ( !t ) return ide; + ide = t->sysValue("id").toULongLong(); + if ( ide ) + { + aLog::print(aLog::Info,tr("aCatalogue delete element with id=%1").arg(ide)); + t->primeDelete(); + t->del(); + setSelected( false ); + } + return ide; +} + + + +/*!\en + * Mark deleted group with child elements and groups. + * \param idg (in) - id mark deleted group. + * \param listDelId (in,out) - list of id mark deleted elements and groups. + \_en \ru + * Выделяет удаляемую группу с дочерними элементами и группами. + * При первом вызове параметр listDelId должен быть пустой, он не обнуляется + * автоматически при вызове этой функции. + * Функция рекурсивно вызывает сама себя для всех дочерних подгрупп и + * добавляет их id в список. Также туда добавляются и id элементов, + * содержащихся в этих группах. Для изменения атрибута удаления используте функции + * setElementMarkDeleted(id)(для элементов) и setGroupMarkDeleted(id) (для групп) + * \param idg (in) - идентификационный номер выделенной для удаления группы. + * \param listDelId (in,out) - список идентификационных номеров выделенных для удаления элементов и групп. + *\_ru + */ +void +aCatalogue::getMarkDeletedList(qulonglong idg, + Q3ValueList &listDelId) +{ + Q3ValueList lst; + aSQLTable * tg = table ( md_group ); + if ( !tg ) return; + qulonglong tmp; + if ( idg ) + { + + // delete elements in group; + if(selectByGroup(idg)==err_noerror) + { + do + { + listDelId << sysValue("id").toULongLong(); + } + while(Next()); + } + if (groupByParent(idg)==err_noerror) + { + do + { + lst << GroupSysValue("id").toULongLong(); + }while(NextInGroupTable()); + + Q3ValueList::iterator it = lst.begin(); + while(it!= lst.end()) + { + getMarkDeletedList((*it),listDelId); + ++it; + } + } + + } + tg->select(QString("id=%1").arg(idg),false); + if(tg->first()) + { + listDelId << idg; + } + return; +} +bool +aCatalogue::isGroupMarkDeleted() +{ + return IsMarkDeleted(md_group); +} +bool +aCatalogue::isElementMarkDeleted() +{ + return IsMarkDeleted(); +} + + + +/*!\en + * Delets group with child elements and groups. + * \param idg (in) - id deleted group. + * \param listDelId (in,out) - list of id deleted elements and groups. + \_en \ru + * Физически удаляет группу со всеми ее дочерними элементами и группами. + * \param idg (in) - идентификационный номер выделенной для удаления группы. + * \param listDelId (in,out) - список идентификационных номеров выделенных для удаления элементов и групп. + *\_ru + */ +qulonglong +aCatalogue::delGroup(qulonglong idg, Q3ValueList &listDelId) +{ + aSQLTable * tg = table ( md_group ); + if ( !tg ) return 0; + //if ( !selected( md_group ) ) return err_notselected; + qulonglong tmp;// idg = tg->sysValue("id").toULongLong(); + groupSelect(idg); + if ( idg ) + { + + aLog::print(aLog::Info,tr("aCatalogue delete group with id=%1").arg(idg)); + // printf("idg=" LLU_SPEC "\n",idg); + // delete elements in group; + while(selectByGroup(idg)==err_noerror) + { + listDelId << delElement(); + } + while (groupByParent(idg)==err_noerror) + { + delGroup(GroupSysValue("id").toULongLong(), listDelId); + //printf(">>>idg=%lu\n",tmp); + } + } + tg->select(QString("id=%1").arg(idg),false); + if(tg->first()) + { + tg->primeDelete(); + tg->del(); + listDelId << idg; + setSelected( false, md_group ); + } + return idg; +} +ERR_Code +aCatalogue::GroupDelete() +{ + aSQLTable * tg = table ( md_group ); + if ( !tg ) return err_notable; + getGroup(); + if ( !selected( md_group ) ) + { + + aLog::print(aLog::Info,tr("aCatalogue delete without selection")); + //debug_message(">>not seletc in delete\n"); + return err_notselected; + } + + qulonglong idg = tg->sysValue("id").toULongLong(); + if ( idg ) + { + //printf("idg=" LLU_SPEC "\n",idg); + aCatalogue cat( obj,db ); + while ( !cat.selectByGroup(idg) ) cat.Delete(); + while ( !cat.groupByParent(idg) ) + { + //printf("delete group\n"); + cat.GroupDelete(); + } + } + tg->primeDelete(); + tg->del(); + aLog::print(aLog::Info,tr("aCatalogue delete group with id=%1").arg(idg)); + if(tg->first()) + { + setSelected( true, md_group ); + } + else + { + setSelected( false, md_group ); + } + return err_noerror; +} + +ERR_Code +aCatalogue::GroupMarkDeleted() +{ + aSQLTable * t = table ( md_group ); + if ( !t ) return err_notable; + if ( !selected( md_group ) ) return err_notselected; + if ( SetMarkDeleted( true, md_group ) ) return err_noerror; + else return err_deleteerror; +} + +ERR_Code +aCatalogue::GroupUpdate() +{ + aLog::print(aLog::Debug, tr("aCatalogue update group")); + return TableUpdate( md_group ); +} + +ERR_Code +aCatalogue::GroupSetGroup( aCatalogue * cat ) +{ + aSQLTable * t = table( md_group ); + if ( !t ) return err_notable; + qulonglong newidp, oldidp = t->sysValue("idp").toULongLong(); + if ( !cat ) newidp = 0; + else newidp = cat->getGroup(); + if ( newidp == oldidp ) return err_noerror; + t->setSysValue( "idp", newidp ); + t->primeUpdate(); + t->update(); + return err_noerror; +} + +QVariant +aCatalogue::GroupValue( const QString & name ) +{ + aSQLTable * t = table( md_group ); + if ( !t ) return QVariant::Invalid; + return t->value( name ); +} + + + +/*!\en + * Gets system field value in table of group. + * \param name (in) - field name. + * \return field value or QVariant::Invalid if no field. + \_en \ru + *\_ru + */ +QVariant +aCatalogue::GroupSysValue( const QString & name ) +{ + aSQLTable * t = table( md_group ); + if ( !t ) return QVariant::Invalid; + //if(name=="id") return t->sysValue(name).toString(); + return t->sysValue( name );//.toString(); +} + +ERR_Code +aCatalogue::GroupSetValue( const QString & name, const QVariant & value ) +{ + aSQLTable * t = table( md_group ); + if ( !t ) return err_notable; + if ( !selected( md_group ) ) return err_notselected; + if ( t->setValue( name, value ) ) return err_noerror; + else return err_fieldnotfound; + +} + + +ERR_Code +aCatalogue::GroupSetSysValue( const QString & name, const QVariant & value ) +{ + aSQLTable * t = table( md_group ); + if ( !t ) return err_notable; + if ( !selected( md_group ) ) return err_notselected; + t->setSysValue( name, value); + return err_noerror; + //else return err_fieldnotfound; + +} + +QVariant +aCatalogue::GetElementValue(QVariant ide, const QString &fname) +{ + aSQLTable * t = table(); + if ( !t ) return ""; + t->select(ide.toULongLong()); + if ( !t->first() ) return ""; + else return t->value( fname ); + + +} +bool +aCatalogue::Next() +{ + return aObject::Next(); //return !groupSelect(); + //else return false; +} + +bool +aCatalogue::Prev() +{ + return aObject::Prev(); //return !groupSelect(); +// else return false; +} + +bool +aCatalogue::First() +{ + return aObject::First(); //return !groupSelect(); + //else return false; +} + +bool +aCatalogue::Last() +{ + return aObject::Last(); //return !groupSelect(); + //else return false; +} + +bool +aCatalogue::NextInGroupTable() +{ + return aObject::Next(md_group); +} + +bool +aCatalogue::PrevInGroupTable() +{ + return aObject::Prev(md_group); +} + +bool +aCatalogue::FirstInGroupTable() +{ + return aObject::First(md_group); +} + +bool +aCatalogue::LastInGroupTable() +{ + return aObject::Last(md_group); +} + + + +/*!\en + * Gets list user and calculation fields in table of elements. + \_en \ru + *\_ru + */ +QStringList +aCatalogue::getUserFields() +{ + QStringList l; + aSQLTable *t = table(); + if(t) l = t->getUserFields(); + return l; +} + + + +/*!\en + * Gets list user and calculation fields in table of Groups. + \_en \ru + *\_ru + */ +QStringList +aCatalogue::getGroupUserFields() +{ + QStringList l; + aSQLTable *t = table( md_group ); + if(t) l = t->getUserFields(); + return l; +} + + +aCfgItem +aCatalogue::displayStringContext() +{ + return md->find( md->find( obj, md_element ), md_string_view ); +} + + + +aCatElement::aCatElement(aCfgItem context, aDatabase * adb) +:aObject( context, adb, 0, "aElement") +{ +} + + + + +aCatGroup::aCatGroup(aCfgItem context, aDatabase * adb) +:aObject( context, adb, 0, "aGroup") +{ + int err = initObject(); +} + + + + +/*! + *\ru + * Возвращает id родительской группы + *\_ru + */ +qulonglong +aCatGroup::parentUid() +{ + if ( !selected() ) return 0; + else return table()->sysValue("idp").toULongLong(); +} + + + +void +aCatGroup::setLevel( qulonglong newLevel ) +{ + if ( !selected() ) return; + aSQLTable * t = table(); + qulonglong level = t->sysValue("level").toULongLong(); + if ( level == newLevel ) return; + aCatGroup tgr( obj, db ); + QString query; + query = QString("UPDATE %1 SET level=%2 WHERE id=%3")\ + .arg(t->tableName).arg(newLevel).arg(getUid()); +// printf("%s\n",(const char*) query); + db->db()->exec(query); + if ( !tgr.SelectChild( this )); + do + { + tgr.setLevel( newLevel + 1 ); + } + while ( tgr.Next() ); +} + + + +QString +aCatGroup::trSysName( const QString & sname ) +{ + if (( sname == "Level" )||( sname == QString::fromUtf8("Уровень") )) return "Level"; + return ""; +} + + + +QVariant +aCatGroup::sysValue( const QString & sname ) +{ + if ( sname == "Level" ) + return table()->sysValue("level"); + return QVariant::Invalid; +} + + + +/*! + *\~english + * Init object. + * We can work with object only after inited. + * Auto call from constructor. + *\~russian + *\brief Инициализирует объект элементом конфигурации. + * + * Мы можем работать с объектом после его инициализации. + * Функция вызывается из конструктора. + *\~ + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aCatGroup::initObject() +{ + ERR_Code err = aObject::initObject(); + if ( err ) return err; + aCfgItem g = md->find( obj, md_group ); + return tableInsert( aDatabase::tableDbName( *md, g ), g ); +} + + +/*! + *\ru + *\brief Ничего не делает. Возвращает 0. + * + *\return Код ошибки. + *\_ru + */ + +ERR_Code +aCatGroup::New(aCatGroup *group) +{ + int rc = 0; + return rc; +} +/*! + *\en + * Create new group in table. + * New group added in root group and have level 0. + * \return Error code. + *\_en + *\ru + * \brief Добавляет группу в справочник. + * + * Группа добавляется как корневая и имеет уровень 0. + * \return Код ошибки. + *\_ru + */ +ERR_Code +aCatGroup::New() +{ + int rc = 0; + qulonglong level = 0, idg=0, idp = 0; + aSQLTable * t; + aLog::print(aLog::Info, tr("aCatGroup new group")); + int err = aObject::New(); + if(!err) + { + aLog::print(aLog::Info, tr( "aCatGroup new group ok")); + setSelected(true); + } + else + { + aLog::print(aLog::Error, tr("aCatGroup new group error %1").arg(err)); + } + return err; +} + + + +/*! + *\~english + * Select all groups. + * Select all groups use filter (if it's seted). + *\~russian + * \brief Выбирает все группы. + * + * Выбирает все группы используя фильтр (если он установлен). + *\~ + *\return \~english Error code. \~russian Код ошибки.\~ + */ +ERR_Code +aCatGroup::Select() +{ + return aObject::select(""); +} + + + +/*! + *\~english + * Select all childs. + * Select childs ( not include ) for parent. + * If parent = 0 or not parent, selected all root groups. + *\~russian + * Выбирает всех потомков. + * Выбирает всех потомков (первого уровня) для группы parent. + * Если параметр отсутствует или нулевой, находятся все группы 0 - уровня. + * Навигация по выбранным записям стандартная(Next(), Prev(), First(), Last()) + *\~ + *\param parent - \~english parent group. \~russian родительская группа.\~ + *\return \~english Error code. \~russian Код ошибки.\~ + */ +ERR_Code +aCatGroup::SelectChild( aCatGroup * parent ) +{ + qulonglong idp = 0; + if ( parent ) idp = parent->getUid(); + QString query; + query = QString("idp=%1").arg(idp); +// printf("%s\n",(const char*)query); + return select(query); +} + + + +/*! + *\~english + * Set parent for group. + * Set for current group new parent. + * Check for cycle parent and recalc levels. + *\~russian + * Устанавливает родителя для группы. + * устанавливает текущей группе родителя переданного в качестве параметра. + * Выполняется проверка на циклическое присваивание и пересчет уровней вложенности. + *\~ + *\param parent - \~english new parent group. \~russian новая родительская группа.\~ + *\return \~english Error code. \~russian Код ошибки.\~ + */ + +ERR_Code +aCatGroup::SetParent( aCatGroup * parent ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + qulonglong idp = 0, uid = getUid(); + if ( parent ) idp = parent->getUid(); + if ( idp == uid ) return err_cyclereparent; + qulonglong level, tmpid = idp; + aCatGroup tg( obj, db ); + while ( tmpid ) + { + tg.select(tmpid); + tmpid = tg.parentUid(); + if ( tmpid == uid ) return err_cyclereparent; + } + QString query; + query = QString("UPDATE %1 SET idp=%2 WHERE id=%3").arg(t->tableName).arg(idp).arg(uid); + level = parent->Value("Level").toULongLong(); +// printf("%s\n",(const char*)query); + QSqlDatabase tdb = *db->db(); + tdb.exec(query); + if ( !tdb.lastError().type() ) + { + if (idp) setLevel(level+1); + else setLevel(0); + return err_noerror; + } + else return err_execerror; +} + + +aCfgItem +aCatGroup::displayStringContext() +{ + return md->find( md->find( obj, md_group ), md_string_view ); +} diff --git a/src/lib/objects/acatalogue.h b/src/lib/objects/acatalogue.h new file mode 100644 index 0000000..24a3e1e --- /dev/null +++ b/src/lib/objects/acatalogue.h @@ -0,0 +1,175 @@ +/**************************************************************************** +** $Id: acatalogue.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Catalogue metadata object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACATALOGUE_H +#define ACATALOGUE_H + +#include "acfg.h" +#include "aobject.h" +//Added by qt3to4: +#include + +class aDatabase; +class aCatGroup; +//class aObject; + + + +/*!\en + * Not visual object used for working with catalogues in database. + * Used as interface between database and script or wObjects* + *\_en + *\ru + *\brief Класс aCatalogue определяет программный интерфейс иерархических справочников. + * Наследует aObject. + * + * Не визуальный объект используемый для работы с иерархическими каталогами (справочниками). + * Используется как интерфейс между базой данных и скриптами или wObjects* + *\_ru + */ +class ANANAS_EXPORT aCatalogue :public aObject +{ + Q_OBJECT +public: + + aCatalogue(aCfgItem context, aDatabase * adb = 0); + aCatalogue(QString name, aDatabase * adb = 0); +// virtual ERR_Code initObject(aDatabase * adb); + virtual ERR_Code initObject(); + +protected: + virtual aCfgItem displayStringContext(); + +private: +// Q_ULLONG getCatGroup(); + qulonglong getGroup(); + qulonglong getOwner(); + ERR_Code setOwner( qulonglong ido ); + ERR_Code setGroup( qulonglong idg ); + ERR_Code selectByOwner ( qulonglong ido ); + ERR_Code groupSelect (); + ERR_Code groupByParent(qulonglong idp ); +public slots: + //virtual aCatGroup * group(); + virtual int New( bool child); + virtual int New(); + virtual int Delete(); + + virtual int newGroup( qulonglong parentId ); + virtual int newElement( qulonglong parentId ); + + virtual int Update(); + virtual int Copy(); + virtual int SetOwner( aCatalogue * cat ); + virtual int SetGroup( aCatalogue * cat ); + virtual int Select( bool grouponly = false ); + void UnSelect( bool grouponly = false ); + virtual int selectByLevel ( int level ); + virtual int selectByGroup ( qulonglong idg ); + virtual qulonglong idGroupByElement(qulonglong ide ); + virtual int groupSelect ( qulonglong idg ); + + virtual QVariant GetElementValue(QVariant ide, const QString &fname); + + virtual qulonglong delElement(); + virtual qulonglong delGroup(qulonglong idg, Q3ValueList &listDelId); + + qulonglong setMarkDeletedElement(qulonglong el_id, bool del); + qulonglong setMarkDeletedGroup(qulonglong gr_id, bool del); + void getMarkDeletedList(qulonglong idg, Q3ValueList &listDelId); + + virtual bool isGroupMarkDeleted(); + virtual bool isElementMarkDeleted(); + + virtual bool Next(); + virtual bool Prev(); + virtual bool First(); + virtual bool Last(); + + virtual bool NextInGroupTable(); + virtual bool PrevInGroupTable(); + virtual bool FirstInGroupTable(); + virtual bool LastInGroupTable(); + + virtual int GroupNew( bool reparent = false ); + virtual int GroupDelete(); + virtual int GroupMarkDeleted(); + virtual int GroupUpdate(); + virtual int GroupSelect(); + virtual int GroupSetGroup( aCatalogue * cat ); + virtual QVariant GroupValue( const QString & name ); + virtual int GroupSetValue( const QString & name, const QVariant & value); + virtual QVariant GroupSysValue( const QString & name ); + virtual int GroupSetSysValue( const QString & name, const QVariant & value); +// virtual ERR_Code GroupSelectChild( aCatalogue * parent = 0 ); + virtual QStringList getUserFields(); + virtual QStringList getGroupUserFields(); +}; + +class ANANAS_EXPORT aCatElement :public aObject +{ + Q_OBJECT +public: + aCatElement(aCfgItem context, aDatabase * adb = 0); + +}; + + + +/*! + *\~english + * Object for work with catalogue group. + *\~russian + *\brief Класс aCatGroup определяет программный интерфейс для управления группами иерархических + * справочников (каталогов). Наследует aObject. + * + * Иерархический справочник может состоять из элементов и групп. Группы, в отличие от элементов + * предназначены не для хранения данных, а для группировки элементов. + */ +class ANANAS_EXPORT aCatGroup :public aObject +{ + Q_OBJECT + qulonglong parentUid(); + void setLevel( qulonglong newlevel ); + virtual QString trSysName( const QString & sname ); + QVariant sysValue( const QString & sname ); +public: + aCatGroup(aCfgItem context, aDatabase * adb = 0); + virtual ERR_Code initObject(); +public slots: + ERR_Code New(); + ERR_Code New(aCatGroup *gr); + ERR_Code Select(); + ERR_Code SelectChild( aCatGroup * parent = 0 ); + ERR_Code SetParent( aCatGroup * parent ); +protected: + virtual aCfgItem displayStringContext(); +}; + +#endif// ACATALOGUE_H diff --git a/src/lib/objects/adocjournal.cpp b/src/lib/objects/adocjournal.cpp new file mode 100644 index 0000000..6169f4b --- /dev/null +++ b/src/lib/objects/adocjournal.cpp @@ -0,0 +1,726 @@ +/**************************************************************************** +** $Id: adocjournal.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Documents journal metadata object implementation file of +** Ananas application library +** +** Created : 20040701 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +//Added by qt3to4: +#include + +#include "acfg.h" +#include "aobject.h" +#include "adatabase.h" +#include "adocjournal.h" +#include "alog.h" + +/*! + * \en + * Constructor. Init object with \a context. + * \_en + * \ru + * Конструктор. Инициализирует объект объектом метаданных. + * \_ru + * \param context - \en md object\_en \ru объект метаданных \_ru + * \param adb - \en link to database\_en \ru ссылка на базу данных \_ru +*/ +aDocJournal::aDocJournal( aCfgItem context, aDatabase * adb ) +:aObject( context, adb, 0, "aDocJournal") +{ + initObject(); +} + + +/*! + * \en + * Constructor. Init object with md object, founded by \a name. + * \_en + * \ru + * Конструктор. Инициализирует объект объектом метаданных с именем \a name. + * \_ru + * \param name - \en md object name\_en \ru имя объекта метаданных \_ru + * \param adb - \en link to database\_en \ru ссылка на базу данных \_ru +*/ +aDocJournal::aDocJournal( const QString & name, aDatabase * adb) +:aObject( name, adb, 0, "aDocJournal") +{ + db = adb; + initObject(); +} + + +/*! + * \en + * Constructor. Creates system journal. + * \_en + * \ru + * Конструктор. Создает экземпляр системного журнала, в котором хранятся ссылки на все созданные документы. + * \_ru + * \param adb - \en link to database\_en \ru ссылка на базу данных \_ru +*/ +aDocJournal::aDocJournal( aDatabase * adb ) +{ + db = adb; + initObject(); +} + + + +ERR_Code +aDocJournal::initObject() +{ + ERR_Code err = err_noerror; + aCfgItem mditem, docitem, header; + + + journalType=0; + + setInited( true ); + md = 0; + if ( db ) md = &db->cfg; + if(!md) + { + aLog::print(aLog::Error, tr("aDocJournal md object not exists")); + return err_objnotfound; + } +// aObject::initObject(); + journalType= md->attr(obj,mda_type).toInt(); + if (journalType) + { + mditem= md->find(obj,md_fieldid); + if (mditem.isNull()) + { + aLog::print(aLog::Error, tr("aDocJournal columns not defined")); + return err; + } + else + { + aLog::print(aLog::Debug, tr("aDocJournal column defined")); + } + docitem= md->parent( md->parent( md->find(md->text(mditem).toLong()))); + + header = md->find( docitem, md_header ); + if(header.isNull()) aLog::print(aLog::Error, tr("aDocJournal invalid column define")); + //table for special journal + err = tableInsert( aDatabase::tableDbName( *md, header ), header ); +// printf("table name is %s\n", aDatabase::tableDbName( *md, header ).ascii()); + } + else + { + //table for common journal + err = tableInsert( "a_journ" ); + } + + return err; +} + + + +/*! + *\~english + * Get current document id. + * Get database id for current document. + *\~russian + * Возвращает id текущего документа. + * Возвращает id документа в базе данных. + *\~ + *\return \~english database document id. \~russian id документа в базе данных.\~ + */ +qulonglong +aDocJournal::docId() +{ + if (!journalType) { + return table()->sysValue("idd").toULongLong(); + } else { + return table()->sysValue("id").toULongLong(); + } +} + + + +/*! + *\~english + * Gets current document type. + *\~russian + * Получение типа текущего документа. + *\~ + *\return \~english database document type. \~russian тип документа в базе данных.\~ + */ +int +aDocJournal::docType() +{ + return db->uidType( docId() ); +} + + + +/*! + *\~english + * Delets current document. + *\~russian + * Удаляет текущий документ. + *\~ + *\see deleteDocument( Q_ULLONG idd ) + *\return \~english error code \~russian код ошибки.\~ + */ +ERR_Code +aDocJournal::Delete() +{ + ERR_Code err; + aDocument * doc = CurrentDocument(); + if ( !doc ) return err_notselected; + else err = doc->Delete(); + delete doc; + doc = 0; + return err; +} + + + +/*! + *\~english + * Delets document with id =\a idd. + *\~russian + * Удаляет документ с заданным идентификатором. + *\~ + *\see Delete() + *\param idd - \~english document id \~russian идентификатор документа \~ + *\return \~english error code \~russian код ошибки.\~ + */ +ERR_Code +aDocJournal::deleteDocument( qulonglong idd ) +{ + aSQLTable * t = table(); + qulonglong Uid = findDocument(idd); + db->markDeleted( Uid ); + if (t->exec("DELETE FROM a_journ WHERE idd =" + QString("%1").arg(idd))) + { + aLog::print(aLog::Info, tr("aDocJournal delete document with idd=%1").arg(idd)); + return err_noerror; + } + else + { + aLog::print(aLog::Error, tr("aDocJournal delete document with idd=%1").arg(idd)); + return err_execerror; + } +} + + + +/*! + *\~english + * Create new record in system journal. + * Record create afte crate new document and use information about doc's + * database id, prefix and metadata id(type). + * Document number generate automatically by nextNumber(). + *\~russian + * Добавляет запись в системный журнал. + * Запись добавляется после создания документа и использует информацию о его + * id в базе данных, префиксе номера и id в конфигурации. + * Номер досумента генерируется функцией nextNumber() + *\~ + *\param idd - \~english database document id.\~russian id базы данных.\~ + *\param docPrefix - \~english document number prefix. + \~russian перфикс номера документа.\~ + *\param type - \~english document metadata id. + \~russian id документа в конфигурации.\~ + *\return \~english error code.\~russian код ошибки.\~ + */ +ERR_Code +aDocJournal::New( qulonglong idd, const QString & docPrefix, int type ) +{ + //qulonglong Uid =0;// db->uid( md_systemjournal ); + aDataTable * t = table(); + if ( !t ) return err_notable; + //t->exec("LOCK TABLE a_journ WRITE"); + //printf("insert into ajourn id=%llu idd=%llu, docPrefix=%s, type=%d\n",Uid,idd, (const char*)docPrefix.local8Bit(), type); +// t->exec("LOCK TABLE a_journ WRITE"); + QSqlRecord *rec; + rec = t->primeInsert(); // get edit buffer for table elements +// t->primeInsert(); + //ide = rec->value("id").toULongLong(); + //rec->setValue("id",Uid); + rec->setValue("idd",idd); + rec->setValue("typed",type); + rec->setValue("num",nextNumber(docPrefix,type)); + rec->setValue("pnum",docPrefix); + rec->setValue("ddate",QDateTime::currentDateTime()); + + t->insert(); // insert edit buffer as new line in table +//TODO: error handle + aLog::print(aLog::Info, tr("aDocJournal new document with idd=%1").arg(idd)); + /* + t->primeInsert(); + t->insert(); + t->setSysValue( "id", Uid ); + t->setSysValue( "idd", idd ); + t->setSysValue( "typed", type ); + t->setSysValue( "num", nextNumber(docPrefix,type) ); + t->setSysValue( "pnum", docPrefix ); + t->setSysValue( "ddate", QDateTime::currentDateTime() ); + Update(); + t->exec("UNLOCK TABLE"); + */ + + int err = selectDocument( idd ); + setSelected(!err); + return err; +} + + + +/*! + *\~english + * Select document with id =\a idd. + *\~russian + * Выбирает документ с заданным идентификатором. + *\~ + *\param idd - \~english document id \~russian идентификатор документа \~ + *\see findDocument( Q_ULLONG idd ) + *\return \~english error code \~russian код ошибки.\~ + */ +ERR_Code +aDocJournal::selectDocument( qulonglong idd ) +{ + aDataTable * t = table(); + if ( !t ) return err_notable; + QString flt; + flt = QString("idd=%1").arg(idd); + if ( t->select(flt) ) + if ( t->first() ) + { + setSelected(true); + return err_noerror; + } + else return err_notselected; + return err_selecterror; +} + + + + +/*! + *\~english + * Generate next document number. + *\~russian + * Генерирует следующий номер для документа. + * Номер представляет собой строку, состоящую из префикса номера и числа. + * Номер документа генерируется используя префикс номера документа + * и его тип (id в конфигурации), как следующий за максимальным для даного сочетания. + * Номер является уникальным в для доументов одного типа. + *\~ + *\param prefix - \~english \~russian префикс номера.\~ + *\param mdId - \~english \~russian id документа в конфигурации.\~ + *\return \~english document number \~russian номер документа (только число).\~ + */ +QString +aDocJournal::nextNumber( const QString &prefix, int mdId ) +{ + QString num="0", query; + query = QString("SELECT MAX(num)+1 FROM a_journ where pnum='%1' AND typed=%2").arg( prefix ).arg(mdId); + QSqlQuery q = db->db()->exec( query ); + if ( q.first() ) num = q.value( 0 ).toString(); + if ( num == "0" ) num = "1"; + aLog::print(aLog::Info, tr("aDocJournal generated next number for %1 is %2").arg(prefix).arg(num)); + //debug_message("<<>>\n%s\nreturn: %s\n", + // (const char*)query,(const char*)num); + return num; +} + + + +/*! + *\~english + * Gets current document date. + *\~russian + * Возвращает дату текущего документа. + *\~ + *\see setDate( QVariant date ) + *\return \~english document date \~russian дата документа \~ + */ +QVariant +aDocJournal::getDate() +{ + aSQLTable * t = table(); + if ( !t || !selected() ) return QVariant::Invalid; + else return t->sysValue("ddate"); +} + + +/*! + *\~english + * Gets current document prefix + number. + *\~russian + * Возвращает строку префикс + номер текущего документа. + *\~ + *\see setNumber( QVariant number ) + *\return \~english document number \~russian номер документа \~ + */ +QString +aDocJournal::getNumber() +{ + aSQLTable * t = table(); + if ( !t || !selected() ) return ""; + else return t->sysValue("pnum").toString() + t->sysValue("num").toString(); +} + +/*! + *\~english + * Gets current document number. + *\~russian + * Возвращает номер текущего документа. + *\~ + *\see getNumber( QVariant number ) + *\return \~english document number \~russian номер документа \~ + */ +int +aDocJournal::getSerialNumber() +{ + aSQLTable * t = table(); + if ( !t || !selected() ) return 0; + else return t->sysValue("num").toInt(); +} + +/*! + *\~english + * Sets current document date. + *\~russian + * Устанавливает дату текущего документа. + *\~ + *\see getDate() + *\param date - \~english document date \~russian дата документа \~ + *\return \~english error code \~russian код ошибки.\~ + */ +ERR_Code +aDocJournal::setDate( QVariant date ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + if ( !selected() ) return err_notselected; + t->setSysValue( "ddate", date ); + return err_noerror; +} + + + +/*! + *\~english + * Sets current document number. + *\~russian + * Устанавливает номер текущего документа. + *\~ + *\see getNumber() + *\param number - \~english document number \~russian номер документа \~ + *\return \~english error code \~russian код ошибки.\~ + */ +ERR_Code +aDocJournal::setNumber( QVariant number ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + if ( !selected() ) return err_notselected; + QString pr; + int num; + decodeDocNum( number.toString(), pr, num ); + t->setSysValue( "pnum", pr ); + t->setSysValue( "num", num ); + return err_noerror; +// return Update(); + /*QString query; + Q_ULLONG idd = docId(); + QSqlQuery q = db->db()->exec ( QString("SELECT pnum, num FROM a_journ WHERE idd=%1").arg( idd ) ); + if ( q.first() ) return q.value(0).toString()+q.value(1).toString(); + else return "";*/ +} + + + +/*! + *\~english + * Find document by id. + *\~russian + * Ищет документ в системном журнале по его идентификатору. + *\~ + *\see findDoc( const QString & number, int type ) selectDocument( Q_ULLONG idd ) + *\param idd - \~english document number \~russian номер документа \~ + *\return \~english document id or 0 if document not found + * \~russian id документа или 0, если документ не найден.\~ + */ +qulonglong +aDocJournal::findDocument( qulonglong idd ) +{ + aSQLTable * t = table(); + if ( !t ) return 0; + if (t->exec(QString("SELECT * FROM a_journ WHERE idd=%1").arg(idd)) ) + if ( t->first() ) + { + setSelected( true ); + return getUid(); + } + else + { + aLog::print(aLog::Debug, tr("aDocJournal document not found with idd=%1").arg(idd)); + } + return 0; +} + + + +/*! + *\~english + * Find document by number and type. + *\~russian + * Ищет документ по его номеру и типу. + *\~ + *\see findDocument( Q_ULLONG idd ) + *\param number - \~english document number \~russian номер документа, состоящий из префикса и номера \~ + *\param type - \~english document type \~russian тип документа \~ + *\return \~english document id or 0 if document not found + * \~russian id документа или 0, если документ не найден.\~ + */ +qulonglong +aDocJournal::findDoc( const QString & number, int type ) +{ + QString pref; + int num; + decodeDocNum( number, pref, num ); + if ( table()->select(QString("pnum='%1' AND num=%2 AND typed=%3").arg(pref).arg(num).arg(type)) ) + if ( table()->first() ) + { + setSelected(true); + return table()->sysValue("idd").toULongLong(); + } + else + { + aLog::print(aLog::Debug, tr("aDocJournal document not found with number=%1 and type=%2 ").arg(number).arg(type)); + } + return 0; +} + + + +/*! + *\~english + * Gets current document. + *\~russian + * Возвращает текущий документ. Полученный документ необходимо удалить после использования. + * \code + * aDocument *doc = sysJournal->CurrentDocument(); + * //какие-то действия с документом + * delete doc; + * doc=0; + * \endcode + *\~ + *\return \~english current document + * \~russian текущий документ \~ + */ +aDocument* +aDocJournal::CurrentDocument() +{ + aCfgItem i = md->find( docType() ); + if(!i.isNull()) + { + aDocument *d = new aDocument( i, db ); + if(!d->select( docId() )) + { + return d; + } + else + { + delete d; + return 0; + } + } + else + { + return 0; + } +} + + + +/*! + *\~english + * Select documents at some period. + *\~russian + * Выбирает документы определенного типа за некоторый период. + *\~ + *\param from - \~english begin date \~russian дата начала периода \~ + *\param to - \~english end date \~russian дата окончания периода \~ + *\param nmName - \~english document type \~russian тип документа \~ + *\return \~english error code + * \~russian код ошибки \~ + */ +ERR_Code +aDocJournal::Select( QDateTime from, QDateTime to, const QString & mdName ) +{ + aSQLTable * t = table(); + if ( !t ) + return err_notable; + QString fltr, docType = ""; + if ( mdName != "" ) + { + aCfgItem item = md->find( "Document." + mdName ); + if ( item.isNull() ) + return err_objnotfound; + int type = md->id( item ); + docType = QString(" AND typed=%1").arg(type); + } + if ( from.isNull() ) + if ( !to.isNull() ) + fltr = "ddate<='" + to.toString("yyyy-MM-dd hh:mm:ss") + "'"; + else + return err_condition; + else + if ( !to.isNull() ) + fltr = "ddate>='" + from.toString("yyyy-MM-dd hh:mm:ss") + "' AND ddate<='" +\ + to.toString("yyyy-MM-dd hh:mm:ss") + "'"; + else + fltr = "ddate>='" + from.toString("yyyy-MM-dd hh:mm:ss") + "'"; + if ( t->select( fltr + docType ) ) + if ( t->first() ) + { + setSelected(true); + return err_noerror; + } + else return err_notselected; + return err_selecterror; +} + + + +/*! + *\~english + * Select document by number and type. + *\~russian + * Выбирает документ определенного типа и номера. + *\~ + *\param number - \~english document number \~russian составной номер документа \~ + *\param nmName - \~english document type \~russian тип документа \~ + *\return \~english error code + * \~russian код ошибки \~ + */ +ERR_Code +aDocJournal::Select( const QString & number, const QString & mdName ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + QString dFilter = "", pref; + if ( mdName != "" ) + { + aCfgItem tObj = md->find( "Document."+mdName ); + if ( tObj.isNull() ) return err_objnotfound; + else dFilter = QString(" AND typed=%1").arg(md->attr(tObj,mda_id));; + } + int num; + //printf(">>>>>>>>>>>>decode doc num %s\n",number.ascii()); + decodeDocNum( number, pref, num ); + if ( t->select(QString("pnum='%1' AND num=%2").arg(pref).arg(num) + dFilter) ) + if ( t->first() ) + { +// printf(">document selected!\n"); + + aLog::print(aLog::Debug, tr("aDocJournal select document with number=%1 and md name=%2").arg(number).arg(mdName)); + setSelected(true); + return err_noerror; + } + else return err_notselected; + return err_selecterror; + +} + + + +/*! + *\~english + * Gets current document prefix + *\~russian + * Выбирает префикс текущего документа. + *\~ + *\return \~english prexix + * \~russian префикс \~ + */ +QString +aDocJournal::getPrefix() +{ + QString pref = ""; + qulonglong dUid = docId(); + if ( dUid ) + { + QSqlQuery q = db->db()->exec(QString("SELECT pnum FROM a_journ WHERE idd=%1").arg(dUid)); + if ( q.first() ) pref = q.value(0).toString(); + } + return pref; +} + + + +QString +aDocJournal::selectionFilter( QDateTime from, QDateTime to, const QString & mdName, bool full ) +{ + QString fltr="", docType = "", journ=""; + if ( full ) journ="a_journ."; + if ( mdName != "" ) + { + aCfgItem item = md->find( "Document." + mdName ); + if ( item.isNull() ) + return ""; + int type = md->id( item ); + docType = " AND " + journ + QString("typed=%1").arg(type); + } + if ( from.isNull() ) + if ( !to.isNull() ) + fltr = journ + "ddate<='" + to.toString("yyyy-MM-dd hh:mm:ss") + "'"; + else + return ""; + else + if ( !to.isNull() ) + fltr = journ + "ddate>='" + from.toString("yyyy-MM-dd hh:mm:ss") + "' AND " + journ + "ddate<='" + to.toString("yyyy-MM-dd hh:mm:ss") + "'"; + else + fltr = journ + "ddate>='" + from.toString("yyyy-MM-dd hh:mm:ss") + "'"; + return fltr + docType; +} + +QString +aDocJournal::selectionFilter( const QString & num, const QString & mdName, bool full ) +{ + QString pref, fltr="", journ=""; + int nm; + decodeDocNum( num, pref, nm ); + if ( full ) + { + fltr=QString("a_journ.num=%1 AND a_journ.pnum='%2'").arg(nm).arg(pref); + journ = "a_journ."; + } + else fltr=QString(" num=%1 AND pnum='%2'").arg(nm).arg(pref); + if ( mdName != "" ) + { + aCfgItem tObj = md->find( "Document."+mdName ); + if ( tObj.isNull() ) return ""; + else fltr += QString(" AND %1typed=%2").arg(journ).arg(md->id(tObj)); + } + return fltr; +} diff --git a/src/lib/objects/adocjournal.h b/src/lib/objects/adocjournal.h new file mode 100644 index 0000000..8804c70 --- /dev/null +++ b/src/lib/objects/adocjournal.h @@ -0,0 +1,110 @@ +/**************************************************************************** +** $Id: adocjournal.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Documents journal metadata object header file of +** Ananas application library +** +** Created : 20040701 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ADOCJOURNAL_H +#define ADOCJOURNAL_H + +#include +#include "acfg.h" +#include "aobject.h" +#include "adocument.h" + +class aDatabase; + + + +/*! + *\~english + * Not visual object used for working with system journal. + * Used as interface between database and script or wObjects + * Included in aDocument for linked document and system journal + *\~russian + * \brief Определяет программный интерфейс управления общим (системным) журналом документов. + * Наследует aObject. + * + * Невизуальный объект для работы с системным журналом документов базы данных. + * Все хранящиеся в базе данных Ананаса документы система регистрирует в журнале. + * Используется для доступа к системному журналу скриптами и визуальными объектами. + * Включается в объект aDocument, для обеспечения работы документа с ситемным журналом. + *\~ + */ +class ANANAS_EXPORT aDocJournal :public aObject +{ + Q_OBJECT +private: + /*!\ru Тип журнала. \n + * 0 - общий, содержит список документов всех типовб. \n + * 1 - специализированный журнал, содрежит список документов одного типа, + * например "Расходные накладные". + * \_ru + */ + int journalType; +public: + aDocJournal(aCfgItem context, aDatabase * adb = 0); + aDocJournal( const QString & name, aDatabase * adb = 0); + aDocJournal( aDatabase * adb = 0); + virtual ERR_Code initObject(); + ERR_Code selectDocument( qulonglong idd ); + virtual qulonglong docId(); + int docType(); + + /*!\ru \return тип журнала. \n + * 0 - общий, содержит список документов всех типовб. \n + * 1 - специализированный журнал, содержит список документов одного типа, + * например "Расходные накладные". \n + * \_ru + */ + int type() { return journalType; } + QString nextNumber( const QString &prefix, int mdId ); + QVariant getDate(); + QString getNumber(); + // may be need return ULongLong ? + int getSerialNumber(); + ERR_Code setDate( QVariant date ); + ERR_Code setNumber( QVariant number ); + + virtual ERR_Code New ( qulonglong idd, const QString & docPrefix, int type ); + virtual ERR_Code deleteDocument ( qulonglong idd ); + qulonglong findDocument( qulonglong idd ); +// Q_ULLONG docId( Q_ULLONG id ); + qulonglong findDoc( const QString & num, int type ); + QString getPrefix(); + QString selectionFilter( QDateTime from, QDateTime to, const QString & mdName = "", + bool full=false ); + QString selectionFilter( const QString & num, const QString & mdName = "", bool full=false ); + +public slots: + aDocument* CurrentDocument(); + virtual ERR_Code Delete(); + virtual ERR_Code Select( QDateTime from, QDateTime to, const QString & mdName = "" ); + virtual ERR_Code Select( const QString & num, const QString & mdName = "" ); +}; + +#endif// ADOCJOURNAL_H diff --git a/src/lib/objects/adocument.cpp b/src/lib/objects/adocument.cpp new file mode 100644 index 0000000..cca5253 --- /dev/null +++ b/src/lib/objects/adocument.cpp @@ -0,0 +1,1522 @@ +/**************************************************************************** +** $Id: adocument.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Document metadata object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + + +#include "acfg.h" +#include "alog.h" +#include "aobject.h" +#include "adatabase.h" +#include "adocument.h" +#include "adocjournal.h" +#include "airegister.h" +#include "aaregister.h" +//Added by qt3to4: +#include + + + +/*! + *\en + * Create object aDocument by ananas configuration object. + * New object initing by md ojbect + * Use for creating object if you have md object, for example in default document form + *\_en + *\ru + * \brief Создает объект и инициализирует его по метаданным бизнес схемы. + *\_ru + * \param context - \en md object used for initing aDocument. \_en \ru + * элемент метаданных бизнес схемы, инициализирующий объект.\_ru + * \param adb - \en ananas database for working. \_en \ru + * ссылка на базу данных.\_ru +*/ +aDocument::aDocument( aCfgItem context, aDatabase * adb ) +:aObject( context, adb, 0, "aDocument") +{ + if ( context.isNull() ) concrete = false; + else concrete = true; + initObject(); + sysJournal = new aDocJournal(adb); +} + + + +/*! + *\en + * Create object aDocument by document metadata name. + * new object initing by md ojbect with some name + * Use for creating object if you know it's name + *\_en + *\ru + * Создает объект и инициализирует его по метаданным бизнес схемы. + * Документ инициализируется элементом метаданных, найденым по его имени, + * причем поиск осуществляется только среди документов. + *\_ru + * \param name - \en md name of document.\_en \ru + имя документа в метаданных бизнес схемы.\_ru + * \param adb - \en ananas database for working. \_en \ru + * ссылка на базу данных\_ru + */ +aDocument::aDocument(const QString & name, aDatabase * adb) +:aObject( "Document."+name, adb, 0, "aDocument") +{ + if ( name.isEmpty() ) concrete = false; + else concrete = true; + initObject(); + sysJournal = new aDocJournal(adb); +} + + + +/*! + *\en + * Destroy object aDocument. + * Use for delete system journal and free memory. + *\_en + *\ru + * Уничтожает объект. + * Используется для удаления системного журнала и освобождения занятой под него памяти. + *\_ru + */ +aDocument::~aDocument() +{ + delete sysJournal; + sysJournal=0; +} + + + +/*! + * \en + * Translate name of system field. + * Used for translate same system names from different languages ot english, + * result used from working with system fields + * \_en + * \ru + * Используется для перевода предопределенных имен для системных полей. + * Позволяет использовать для обращения к системным полям из скриптов назавания, + * близкие по смыслу к их назначению с учетом языка пользователя. + * Например к полю номер документа можно обратиться используя имя "НомерДок" или "DocNumber". + * \_ru + * \param sname - \en field name on same language. \_en \ru + * одно из предопределенных имен поля.\_ru + * \return \en field name on english \_en \ru имя поля\_ru + */ +QString +aDocument::trSysName( const QString & sname ) +{ + if (( sname == "DocDate" )||( sname == QString::fromUtf8("ДатаДок") )) return "DocDate"; + if (( sname == "DocNumber" )||( sname == QString::fromUtf8("НомерДок") )) return "DocNumber"; + if (( sname == "SerialNumber" )||( sname == "ПНомДок" )) return "SerialNumber"; + if (( sname == "TableLine" )||( sname == QString::fromUtf8("ЛинияТабл") )) return "TableLine"; + return ""; +} + + + +/*! + * \en + * Init object aDocument. + * Used for insert table for document header and tables for all table part of document. + * After that we can work wthith document' tables by it name, name of heared table = "" + * \_en + * \ru + * Инициализирует объект элементом метаданных бизнес схемы. + * В процесе инициализации выполняется настройка на шапку документа + * и все его табличные части. После инициализации появляется возможность + * работать с полями и таблицами, используя их имена, определенные в бизнес схеме. + * \_ru + * \return \en error code. \_en \ru код ошибки.\_ru + */ +ERR_Code +aDocument::initObject() +{ + aCfgItem o, og; + int i, nt; + QString tdbname, tname; + + pref=""; + ERR_Code error = aObject::initObject(); + if ( error ) + return error; + og = md->find( obj, md_header ); + error = tableInsert( aDatabase::tableDbName( *md, og ), og ); + if ( error ) + return error; + og = md->find( obj, md_tables ); + nt = md->count( og, md_table ); + for ( i=0; i< nt; i++ ) { + o = md->find( og, md_table, i ); + tdbname = aDatabase::tableDbName( *md, o ); + tname = md->attr( o, mda_name ); + error = tableInsert( tdbname, o, tname ); + if ( error ) + return error; + } + return err_noerror; +} + + + +/*! + *\en + * Get value for some system field of document. + * Used for read some system field of document: DocDate - Date and time of document, + * DocNumber - Number of document. + *\_en + *\ru + * Читает значение системного поля. + * Используется для получения значения системного поля по его имени + *\_ru + * \param sname - \en name of system field. \_en \ru + * имя ситемного поля. \_ru + * \return \en field value or QVariant::Invalid if used unknown field name.\_en \ru + * значение поля или ошибочное значение, если имя поля неизвестно.\_ru + */ +QVariant +aDocument::sysValue( const QString & sname, const QString & ) +{ + if ( sname == "DocDate" ) + return sysJournal->getDate(); + if ( sname == "DocNumber" ) + return sysJournal->getNumber(); + if ( sname == "SerialNumber" ) + return sysJournal->getSerialNumber(); + return QVariant::Invalid; +} + + + +/*! + * \en + * Set value for some system field of document. + * Used for write some system field of document: DocDate - Date and time of document, + * DocNumber - Number of document. + * \_en + * \ru + * Устанавливает значение системного поля. + * Используется для установки значения системного поля по его имени + * \_ru + * \param sname - \en name of system field\_en \ru + имя ситемного поля.\_ru + * \param value - \en new value of field\_en \ru + устанавливаемое значение\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::setSysValue( const QString & sname, QVariant value, const QString &) +{ + if ( sname == "DocDate" ) + return sysJournal->setDate( value ); + if ( sname == "DocNumber" ) + return sysJournal->setNumber( value ); + return err_fieldnotfound; +} + + + +/*! + * \en + * Get some field value of current table line. + * Get value for field by metadata name or sustem value ln if use name "TableLine". + * \_en + * \ru + * \brief ScriptAPI. Читает значение поля табличной части документа. + * + * Используется для получения значения поля таблицы по именам таблицы и поля. + * При вызове функции используются имена, указанные в бизнес схеме. + * Кроме этого может использоваться продопределенное имя "TableLine" для + * получения номера текущей записи + * \_ru + * \param tablename - \en metadata name of table\_en \ru + имя таблицы в бизнес схеме\_ru + * \param name - \en name of field\_en \ru + имя поля в бизнес схеме\_ru + * \return \en field value\_en \ru + значение поля\_ru + */ +QVariant +aDocument::TableValue( const QString & tablename, const QString & name ) +{ + if ( trSysName(name) == "TableLine" ) return table(tablename)->sysValue("ln"); + else return tValue( tablename, name ); +} + + + +/*! + * \en + * Set some field value of current table line. + * Set value for field by metadata name + * \_en + * \ru + * \brief ScriptAPI. Записывает значение в поле текущей строки табличной части документа. + * \_ru + * \param tablename - \en metadata name of table,\_en \ru + имя таблицы в бизнес схеме,\_ru + * \param name - \en metadata name of field,\_en \ru + имя поля в бизнес схеме,\_ru + * \param value - \en new field value.\_en \ru + новое значение поля.\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::TableSetValue( const QString & tablename, const QString & name, const QVariant &value ) +{ + return setTValue( tablename, name, value ); +} + + + +/*! + * \en + * Create new document. + * Create new document header record by selected type in database, + * if object not seted, return error. + * New document also registred in system journal and make current + * \_en + * \ru + * \brief ScriptAPI. Создает и регистрирует в системном журнале объект aDocument. + * + * Создает новую запись в БД с данными из шапки документа. При этом резервируется уникальный Id записи таблицы. + * При этом документ регистрируется в системном журнале и получает следующий по порядку номер. + * \_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::New() +{ + if ( !sysJournal ) + { + aLog::print(aLog::Error, tr("aDocument have no sysjournal")); + return err_nosysjournal; + } + ERR_Code err = aObject::New(); + if ( err ) + { + aLog::print(aLog::Error, tr("aDocument aObject::New() ended with error code = %1").arg(err)); + return err; + } + if ( obj.isNull() ) + { + aLog::print(aLog::Error, tr("aDocument metaobject is null=%1")); + return err_noobject; + } + qulonglong Uid = getUid(); + SetPrefix(md->attr(obj,mda_name)); + aLog::print(aLog::Debug, tr("aDocument new type = %1").arg(md->id(obj))); + err = sysJournal->New( Uid, Prefix(), md->id(obj) ); + if ( err ) + { + aLog::print(aLog::Error, tr("aDocument New() error while added record in sysJournal =%1").arg(err)); + table()->exec(QString("DELETE FROM %1 WHERE id=%2").arg(table()->tableName).arg(Uid)); + db->markDeleted( Uid ); + return err; + } + + aLog::print(aLog::Debug, tr("aDocument new document")); + return err_noerror; +} + + + +/*! + * \en + * Create new table line. + * Create new table line for table of now document + * if document not selected, or no table with some name return error. + * New line begin current in table + * \_en + * \ru + * \brief ScriptAPI. Добавляет новую строку табличной части документа. + * + * Строка добавляется в таблицу текущего документа, если документ не выбран + * или не имеет таблицы с таким именем - возникает ошибка. + * При создании строки ей автоматически присваивается очередной номер. + * \_ru + * \param tablename - \en metadata name of table.\_en \ru + имя таблицы в бизнес схеме.\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::TableNewLine( const QString & tablename ) +{ + if ( IsConducted() ) return err_docconducted; + aSQLTable *t = table( tablename ); + if ( !t ) return err_notable; + qulonglong tUid = t->primeInsert()->value("id").toULongLong(), dUid = getUid(); + if ( !dUid ) return err_abstractobj; + if ( t->insert() ) + { + t->select( QString("id=%1").arg(tUid), false ); + if (!t->first()) + return err_selecterror; + t->setSysValue("idd",dUid); + QString query; + QVariant ln; + query = QString("SELECT MAX(ln)+1 FROM %1 WHERE idd=%2").arg( t->tableName ).arg(dUid); + QSqlQuery q = db->db()->exec( query ); + if ( q.first() ) + { + ln = q.value( 0 ); + if ( !ln.toInt() ) ln = 1; + } + else + { + aLog::print(aLog::Error, tr("aDocument select new table line number")); + return err_execerror; + } + t->setSysValue("ln",ln); + t->selected = true; + aLog::print(aLog::Info, tr("aDocument new table line number=%1").arg(ln.toString())); + return TableUpdate( tablename ); + } + aLog::print(aLog::Error, tr("aDocument insert new table line")); + return err_inserterror; +} + + + +/*! + * \en + * Delete current document. + * Delete document header, all tables and system journal record, + * If document conducted (turn on) it unconduct (make turn off). + * \_en + * \ru + * \brief ScriptAPI. Удаляет текущий документ. + * + * Документ удаляется полностью вместе с табличными частями, также документ удаляется из системного журнала. + * Идентификатор документа не освободжается и повторно не используется. + * \_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::Delete() +{ + if ( !selected() ) return err_notselected; + if(IsConducted()) UnConduct(); + qulonglong uid = getUid(); + sysJournal->deleteDocument(uid); + + aLog::print(aLog::Debug, tr("aDocument delete from sysjournal")); + db->markDeleted( uid ); + aLog::print(aLog::Debug, tr("aDocument delete from unicues")); + aCfgItem tobj; + uint n = md->count( obj, md_table ); + for ( uint i = 0; i < n; i++ ) + { + tobj = md->find(obj,md_table,i); + if ( tobj.isNull() ) continue; + tableDeleteLines( md->attr(tobj,mda_name) ); + aLog::print(aLog::Debug, tr("aDocument delete table %1").arg(md->attr(tobj,mda_name))); + } + return aObject::Delete(); +} + + + +/*! + * \en + * Delete current table line. + * When deleted table line also deleted all records in all reegisters which contain link on this line + * Don't work if document conducted. + * \_en + * \ru + * \brief ScriptAPI. Удаляет текущую строку табличной части документа. + * + * Также удаляются все записи, связанные с этой строкой во всех регистрах. + * Не работает для проведенных документов. + * \_ru + * \param tablename - \en metadata name of table\_en \ru + имя таблицы в бизнес схеме\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::TableDelete( const QString & tablename ) +{ + if ( IsConducted() ) + { + aLog::print(aLog::Error, tr("aDocument delete table of conducted document")); + return err_docconducted; + } + aSQLTable * t = table(tablename); + if ( !t ) + { + aLog::print(aLog::Error, tr("aDocument deleted table not exist")); + return err_notable; + } + if ( !t->selected ) + { + //а эта проверка нужна??? + aLog::print(aLog::Error, tr("aDocument deleted table not selected")); + return err_notselected; + } + qulonglong tUid = t->sysValue("id").toULongLong(); + aIRegister * reg = new aIRegister("",db); + reg->deleteTable(tUid); + delete reg; + aLog::print(aLog::Debug, tr("aDocument delete table from info register")); + //reg = new aARegister("",db); + //reg->deleteTable(tUid); + //delete reg; + db->markDeleted( tUid ); + t->primeDelete(); + t->del(); + t->selected = false; + aLog::print(aLog::Info, tr("aDocument delete table")); + return err_noerror; +} + + + + +/*! + * \en + * Delete all table lines. + * Delete all table lines for current document. + * Delete all table lines, don't take document conductions and make any chanded in registers. + * \_en + * \ru + * Удаляет все строки таблицы. + * Удаляет все строки таблицы для текущего документа. + * Функция является внутренней для документа, не проверяет проведен ли документ + * и не вызывает никах изменения в регистрах. + * \_ru + * \param tablename - \en metadata name of table\_en \ru + имя таблицы в бизнес схеме\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::tableDeleteLines( const QString & tablename ) +{ + qulonglong dUid = getUid(); + if ( !dUid ) + { + aLog::print(aLog::Error, tr("aDocument not selected")); + return err_notselected; + } + QString tdbname = table( tablename )->tableName; + if ( tdbname == "" ) + { + aLog::print(aLog::Error, tr("aDocument table name is empty")); + return err_notable; + } + db->db()->exec(QString("DELETE FROM %1 WHERE idd=%2").arg(tdbname).arg(dUid)); + return err_noerror; +} + + + +/*! + * \en + * Updete current record in database. + * Also update record for document system journal and all table parts. + * Don't work for conducted (Turn on) documents + * \_en + * \ru + * \brief ScriptAPI. Обновляет информацию в базе данных. + * + * Заносит запись из буфера ОЗУ в базу данных. Обновляется информация в шапке документа, + * табличных частях, журнале документов. + * Не работает для проведенных документов. + * \_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::Update() +{ + if ( IsConducted() ) return err_docconducted; + ERR_Code e = aObject::Update(); + if ( e ) + { + aLog::print(aLog::Error, tr("aDocument update error=%1").arg(e)); + return e; + } + e = sysJournal->Update(); + //TODO: may be it fix bug with saving values in first line; + //e += TableUpdate(); + return e; +} + + + +/*! + *\en + * Update table. + * Use for insert information from bufer into database. + * Information is inserting in table with md name=teblename, + * if used TableUpdate() - updating all tables of document. + * If document already conducted return error. + *\_en + *\ru + * \brief SrciptAPI. Обновляет текущую запись табличной части документа. + * + * Копирует информацию из буфера в текущую строку таблицы. + * Если имя не указано или задана пустая строка, обновляются все таблицы документа. + * Не работает для проведенного досумента. + *\_ru + * \param tablename - \en metadata name of table\_en \ru + имя таблицы в бизнес схеме\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::TableUpdate( const QString & tablename ) +{ + if ( IsConducted() ) + { + aLog::print(aLog::Debug, tr("aDocument conducted table update")); + return err_docconducted; + } + if ( tablename != "" ) return aObject::TableUpdate(tablename); + aCfgItem tobj; + uint n = md->count( obj, md_table ); + ERR_Code err = 0; + for ( uint i = 0; i < n; i++ ) + { + tobj = md->find(obj,md_table,i); + if ( tobj.isNull() ) continue; + err += aObject::TableUpdate( md->attr(tobj,mda_name) ); + } + return err; +} + + + +/*! + * \en + * Check document on mark deleted + * \_en + * \ru + * \brief ScriptAPI. Проверяет помечен ли документ как удаленный. + * \_ru + * \return \en true if document is mark deleted and fasle in othe event\_en \ru + значение флага удаления.\_ru + */ +bool +aDocument::IsMarkDeleted() +{ + return sysJournal->IsMarkDeleted(); +} + + + +/*! + * \en + * Check document on marked + * \_en + * \ru + * \brief ScriptAPI. Проверяет помечен ли документ. + * \_ru + * \return \en true if document is marked and fasle in othe event\_en \ru + значение флага.\_ru + */ +bool +aDocument::IsMarked() +{ + return sysJournal->IsMarked(); +} + + + +/*! + * \en + * Set document deleted flag + * \_en + * \ru + * \brief ScriptAPI. Устанавливает флаг удаления. + * \_ru + * \param Deleted - \en deleted flag\_en \ru + флаг удаления\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::SetMarkDeleted( bool Deleted ) +{ + return sysJournal->SetMarkDeleted( Deleted ); +} + + + +/*! + * \en + * Set document marked flag + * \_en + * \ru + * \brief ScriptAPI Помечает документ. + * + * В последствии помеченные документы можно рассматривать как группу документов, + * подобранных для обработки. + * \_ru + * \param Marked - \en marked flag\_en \ru + флаг отметки\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::SetMarked( bool Marked ) +{ + return sysJournal->SetMarked( Marked ); +} + + + +/*! + * \en + * Set document prefix. + * Document prefix used for generate document number. + * \_en + * \ru + * \brief ScriptAPI. Задает префикс документа. + * + * Префикс документа используется для генерации номера документа. + * \_ru + * \see Prefix() Select( const QString & num ) + * \param pr - \en new document prefix.\_en \ru + Новый префикс документа.\_ru + */ +void +aDocument::SetPrefix( const QString & pr ) +{ + pref = pr; +} + + + +/*! + * \en + * Get document prefix. + * \_en + * \ru + * \brief ScriptAPI. Возвращает префикс документа. + * \_ru + * \see SetPrefix( const QString & pr ) Select( const QString & num ) + * \return \en document prefix.\_en \ru + текущий префикс документа.\_ru + */ +QString +aDocument::Prefix() +{ + return pref; +} + + + +/*! + * \en + * Select document by dates. + * If set only one date (othe isNull) select records before or after date. + * If adocument inited by some document type from metadata selected only this documents from jpurnal, + * otherwise - select all documents from system journal with such date + * \_en + * \ru + * \brief ScriptAPI. Выбирает документы по интервалу времени. + * + * Выбирает из системного журнала документы, значение поля "дата" которых + * лежит в указанном диапазоне. Если объект настроен на конкретный тип документа из бизнес схемы, + * выбираются только документы этого типа, в противном случае - все документы журнала, + * соответствующие условию. + * \_ru + * \param from - \en begin date of selection if isNull - selected from first date of system journal,\_en \ru + начальная дата диапазона, если дата isNull, первая дата журнала,\_ru + * \param to - \en end date of selection if isNull - selected to last date of system journal.\_en \ru + конечная дата диапазона, если isNull - до наиболее позднего документа.\_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::Select( QDateTime from, QDateTime to ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + QString query, dname = "", jFltr; + if ( concrete ) dname = md->attr(obj, mda_name); + jFltr = sysJournal->selectionFilter( from, to, dname, true ); + if ( jFltr == "" ) return err_selecterror; + query = QString("SELECT %1.* FROM %2, a_journ WHERE a_journ.idd=%3.id AND %4").arg(t->tableName).arg(t->tableName).arg(t->tableName).arg( jFltr ); + if ( IsFiltred() ) query = query + QString(" AND %1").arg(t->getNFilter()); + if ( t->exec(query) ) + if ( t->first() ) + { + setSelected(true); + sysJournal->findDocument(getUid()); + return err_noerror; + } + else return err_notselected; + else + return err_selecterror; +} + + + +/*! + * \en + * Select document by number. + * Document number string which conteyn document prefix and some number + * If adocument inited by some document type from metadata selected only this documents from jpurnal, + * otherwise - select all documents from system journal with such date + * \_en + * \ru + * \brief ScriptAPI. Выбирает документы по номеру. + * + * Номер задается как строка, которая содержит префикс и число. + * Если объект настроен на конкретный тип документа из бизнес схемы, + * выбираются только документы этого типа, в противном случае - все документы + * с таким номером. + * \_ru + * \see Prefix() SetPrefix() + * \param num - \en document number\_en \ru + \_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::Select( const QString & num ) +{ + aSQLTable * t = table(); + if ( !t ) return err_notable; + QString query, dname = "", jFltr; + if ( concrete ) dname = md->attr(obj, mda_name); + jFltr = sysJournal->selectionFilter( num, dname, true ); + if ( jFltr == "" ) return err_selecterror; + query = QString("SELECT %1.* FROM %2, a_journ WHERE a_journ.idd=%3.id AND %4").arg(t->tableName).arg(t->tableName).arg(t->tableName).arg( jFltr ); + if ( IsFiltred() ) query = query + QString(" AND %1").arg(t->getNFilter()); + if ( t->exec(query) ) + if ( t->first() ) + { + setSelected(true); + sysJournal->findDocument(getUid()); + return err_noerror; + } + else return err_notselected; + else + return err_selecterror; +} + +bool +aDocument::Select() +{ + aSQLTable *t = table(); + if(!t) return false; + t->select(); + if(t->first()) + { + setSelected(true); + return true; + } + else + { + return false; + } +} + + +/*! + * \en + * Select table lines by name and document uid. + * If document uid = 0 selected table in current document. + * \_en + * \ru + * Выбирает строку таблицы по имени и uid документа. + * Если uid документа не указан или равен 0, выбирается строка текущего. + * \_ru + * \param name - \en table metadata name\_en \ru имя таблицы в бизнес схеме\_ru + * \param idd - \en document database id (uid)\_en \ru идентификатор экземпляра документа в базе\_ru + * \return \en error code. \_en \ru код ошибки.\_ru + */ +ERR_Code +aDocument::tableSelect( const QString & name, qulonglong idd ) +{ + qulonglong dUid = idd; + if ( !dUid ) dUid = getUid(); + if ( !dUid ) return err_abstractobj; + aSQLTable * t = table( name ); + if ( !t ) return err_notable; + if ( t->select(QString("idd=%1").arg(dUid))) + if ( t->first() ) + { + setSelected( true, name ); + return err_noerror; + } + else return err_notselected; + else return err_selecterror; +} + + + +/*! + * \en + * Get table by it's metadataname name. + * This function added for get access to document table by it name for othe objects. + * \_en + * \ru + * Возвращает таблицу дакумента по имени. + * Функция позволяет получить ссылку на таблизу документа по ее имени. + * \_ru + * \see aObject::table() + * \param tname - \en metadata table name.\_en \ru + имя таблицы в бизнес схеме.\_ru + * \return \en link on aSQLTable or 0 if table not found.\_en \ru + ссылка на таблицу.\_ru + */ +aSQLTable * +aDocument::getTable( const QString & tname ) +{ + return table(tname); +} + + + +/*! + * \en + * Select table by name. + * Make table with such name current + * \_en + * \ru + * \brief ScriptAPI. Выбирает табличную часть документа по ее имени. + * + * Используется, если документ имеет более одной табличной части. + * \_ru + * \param name - \en table metadata name\_en \ru имя таблицы \_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::TableSelect( const QString & name ) +{ + return tableSelect( name ); +} + + + +/*! + * \en + * Copy current document. + * Create document with header and table pats like current document. + * New document have current date and next unical number. + * \_en + * \ru + * \brief ScriptAPI. Копирует текущий документ + * \_ru + * \return \en error code. \_en \ru + код ошибки.\_ru + */ +ERR_Code +aDocument::Copy() +{ + if ( !sysJournal ) return err_nosysjournal; + QString nowPrefix = sysJournal->getPrefix(); + qulonglong oldUid = getUid(); + ERR_Code err = aObject::Copy(); + if ( err ) return err; + qulonglong Uid = getUid(); + err = sysJournal->New( Uid, nowPrefix, md->id(obj) ); + if ( err ) + { + table()->exec(QString("DELETE FROM %1 WHERE id=%2").arg(table()->tableName).arg(Uid)); + db->markDeleted( Uid ); + return err; + } + aDocument doc( obj, db ); + err = doc.select(oldUid); + if ( err ) return err; + aCfgItem tObj, fObj; + QString tname, query, tdbname, fname ; + uint n = md->count(obj,md_table), m; + for ( uint i = 0; i < n; i++ ) + { + tObj = md->find( doc.obj, md_table, i ); + if ( tObj.isNull() ) continue; + tname = md->attr( tObj, mda_name ); + if ( !doc.TableSelect(tname) ) + { + TableNewLine(tname); + m = md->count( tObj, md_field ); + for ( uint j = 0; j < m; j++ ) + { + fObj = md->find( tObj, md_field, j ); + if ( fObj.isNull() ) continue; + fname = md->attr( fObj, mda_name ); + TableSetValue( tname, fname, doc.TableValue( tname, fname ) ); + } + TableUpdate( tname ); + while ( doc.TableNext( tname ) ) + { + TableNewLine(tname); + m = md->count( tObj, md_field ); + for ( uint j = 0; j < m; j++ ) + { + fObj = md->find( tObj, md_field, j ); + if ( fObj.isNull() ) continue; + fname = md->attr( fObj, mda_name ); + TableSetValue( tname, fname, doc.TableValue( tname, fname ) ); + } + TableUpdate( tname ); + } + } + } + return err_noerror; +} + + + +/*! + * \en + * Make current next selected header. + * Use for navigation by selected documents. + * \_en + * \ru + * \brief ScriptAPI. Переход к следующему документу. + * \_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::Next() +{ + if ( aObject::Next() ) if ( sysJournal->findDocument( getUid() ) ) return true; + return false; +} + + + +/*! + * \en + * Make current prev selected header. + * Use for navigation by selected documents. + * \_en + * \ru + * \brief ScriptAPI. Переход к предыдущему документу + * \_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::Prev() +{ + if ( aObject::Prev() ) if ( sysJournal->findDocument( getUid() ) ) return true; + return false; +} + + + +/*! + * \en + * Make current first selected header. + * Use for navigation by selected documents. + * \_en + * \ru + * \brief ScriptAPI. Переходит к первому документу + * \_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::First() +{ + + printf("aDoc::first uid = %llu\n", getUid()); + if ( aObject::First() ) if ( sysJournal->findDocument( getUid() ) ) return true; + return false; +} + + + +/*! + * \en + * Make current last selected header. + * Use for navigation by selected documents. + * \_en + * \ru + * \brief ScriptAPI. Переходит к последнему документу + * \_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::Last() +{ + if ( aObject::Last() ) if ( sysJournal->findDocument( getUid() ) ) return true; + return false; +} + + + +/*! + * \en + * Make current next selected line in table. + * Use for navigation in table. + * \_en + * \ru + * \brief ScriptAPI. Переход к следуещей записи в табличной части документа + * \_ru + * \param name - \en metadata table name.\_en \ru + имя таблицы из бизнес схемы.\_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::TableNext( const QString & name ) +{ + aSQLTable * t = table(name); + if ( !t ) return false; + if ( t->next() ) return true; + else return false; +} + + + +/*! + * \en + * Make current prev selected line in table. + * Use for navigation in table + * \_en + * \ru + * \brief ScriptAPI. Переход к предыдущей записи в табличной части документа + * \_ru + * \param name - \en metadata table name.\_en \ru + имя таблицы из бизнес схемы.\_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::TablePrev( const QString & name) +{ + aSQLTable * t = table(name); + if ( !t ) return false; + if ( t->prev() ) return true; + else return false; +} + + + +/*! + * \en + * Make current first selected line in table. + * Use for navigation in table + * \_en + * \ru + * \brief ScriptAPI. Переход к первой записи в табличной части документа + * \_ru + * \param name - \en metadata table name.\_en \ru + имя таблицы из бизнес схемы.\_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::TableFirst( const QString & name) +{ + aSQLTable * t = table(name); + if ( !t ) return false; + if ( t->first() ) return true; + else return false; +} + + + +/*! + * \en + * Make current last selected line in table. + * Use for navigation in table + * \_en + * \ru + * \brief ScriptAPI. Переход к последней записи в табличной части документа + * \_ru + * \param name - \en metadata table name.\_en \ru + имя таблицы из бизнес схемы.\_ru + * \return \en operation result.\_en \ru + результат операции (успешно или нет)\_ru + */ +bool +aDocument::TableLast( const QString & name ) +{ + aSQLTable * t = table(name); + if ( !t ) return false; + if ( t->last() ) return true; + else return false; +} + + + + +/*! + * \en + * Set filter for some field. + * If filter seted, on select selected only records where that field equal value. + * If seted filters for diferent fields it's group by and. + * If filter reseted it override previous value + * \_en + * \ru + * \brief ScripAPI. Устанавливает фильтр на доступные документы. + * + * Доступными становяться только документы, удовлетворяющие условию. + * Например, для получения всех накладных с номером 0003 нужно сделать примерно следующее: + * \code + * aDocument * doc = new aDocument("Накладная", db); + * doc->SetFilter("Номер","0003"); + * doc->First(); + * do{ + * //какие-то действия + * }while(doc->Next()); + * delete doc; + * \endcode + * \_ru + * \see ClearFilter() + * \param valname - \en metadata name of field.\_en \ru имя поля в метаданных \_ru + * \param value - \en filter value.\_en \ru Значение фильтра \_ru + * \return \en error code. \_en \ru код ошибки.\_ru + */ +ERR_Code +aDocument::SetFilter( const QString & valname, const QVariant & value ) +{ + return aObject::SetFilter( valname, value ); +} + + + +/*! + * \en + * Clear all filters values. + * \_en + * \ru + * \brief ScriptAPI. Сбрасывает фильтр. + * \_ru + * \see SetFilter( const QString & valname, const QVariant & value ) + * \return \en error code. \_en \ru код ошибки.\_ru + */ +ERR_Code +aDocument::ClearFilter() +{ + return aObject::ClearFilter(); +} + +/* +ERR_Code +aDicument::TableSetFilter( const QString & tname, const QString & valname, const QVariant & value ) +{ +} + +ERR_Code +aDicument::TableClearFilter( const QString & tname ) +{ +} +*/ + + + +/*! + * \en + * Set conduct flag for current document. + * \_en + * \ru + * Устанавливает флаг проведения для текущего документа. Не используйте эту функцию напрямую. Используйте Conduct() и UnConduct() + * \_ru + * \param cond - \en conducted flag, flag set on 1 if cond true adn 0 if cond false\_en \ru значение флага \_ru + * \see Conduct() Unconduct() IsConducted() + * \return \en error code. \_en \ru код ошибки.\_ru + */ +ERR_Code +aDocument::setConduct( bool cond ) +{ + qulonglong idd = getUid(); + + if (!idd) return err_nodocument; + QSqlDatabase *tdb = db->db(); + QString query; + query = QString("UPDATE a_journ SET cf='%1' WHERE idd=%2").arg( ( int ) cond).arg( idd ); + tdb->exec(query); + if ( !tdb->lastError().type() ) + { + aLog::print(aLog::Debug, tr("aDocument conduct")); + return err_noerror; + } + else + { + aLog::print(aLog::Error, tr("aDocument conduct")); + return err_conducterror; + } +} + +/** + * \brief Deprecated + */ +ERR_Code +aDocument::Conduct(){ + aLog::print(aLog::Debug, tr("Deprecated method call. aDocument::Conduct(...)")); + return this->SignIn(); +} + +/*! + * \en + * Make document conducted. + * Work only for unconducted documents otherwise return error err_docconducted + * \_en + * \ru + * \brief ScriptAPI. Вызывает проведение документа. + * \_ru + * \see SignOut() IsSignedIn() + * \return \en error code. \_en \ru код ошибки.\_ru + */ +ERR_Code +aDocument::SignIn() +{ + if ( IsConducted() ) return err_docconducted; + else return setConduct(true); + +} + + +/** + * \brief Deprecated + */ +ERR_Code +aDocument::UnConduct(){ + aLog::print(aLog::Debug, tr("Deprecated method call. aDocument::UnConduct()")); + return this->SignOut(); +} + +/*! + * \en + * Make document unconducted. + * Work only for conducted documents otherwise return error err_docunconducted + * \_en + * \ru + * \brief ScriptAPI. Отменяет проведение документа. + * \_ru + * \see SignIn() IsSignedIn() + * \return \en error code. \_en \ru код ошибки.\_ru + */ +ERR_Code +aDocument::SignOut() +{ + if ( !IsConducted() ) return err_docunconducted; + ERR_Code err = setConduct(false); + if ( err ) return err; + //Q_ULLONG uid = getUid(); + aIRegister * reg = new aIRegister("",db); + reg->deleteDocument(this); + delete reg; + aCfgItem aReg, aRegs; + aRegs= md->find(md->find(md->find(mdc_metadata),md_registers,0),md_aregisters,0); + if ( aRegs.isNull() ) return 1; //TODO: set error code + uint n = md->count( aRegs, md_aregister ); + aARegister *areg; + for ( uint i = 0; i < n; i++ ) + { + aReg = md->find( aRegs, md_aregister, i ); + if ( aReg.isNull() ) continue; + areg = new aARegister(aReg,db); + areg->deleteDocument(this); + aLog::print(aLog::Debug, tr("aDocument delete from accumulation register")); + delete areg; + areg = 0; + } + return err_noerror; +} + + +/** + * \brief Deprecated + */ +bool +aDocument::IsConducted(){ + aLog::print(aLog::Debug, tr("Deprecated method call. aDocument::IsConducted()")); + return this->IsSignedIn(); +} + +/*! + * \en + * Check document conducting. + * \_en + * \ru + * \brief ScriptAPI. Проверяет, проведен ли документ. + * \_ru + * \see SignIn() SignOut() + * \return \en true, if document is conducted. \_en \ru true, если документ проведен \_ru + */ +bool +aDocument::IsSignedIn() +{ + qulonglong idd = getUid(); + if (!idd) return false; + QSqlQuery q = db->db()->exec(QString("SELECT cf FROM a_journ WHERE idd=%1").arg(idd)); + if ( q.first() ) return q.value(0).toBool(); + else return false; +} + + + +/*! + * \en + * Select document with id = \a uid. + * \_en + * \ru + * Выбирает документ с заданным идентификатором. + * \_ru + */ +ERR_Code +aDocument::select( qulonglong uid) +{ + ERR_Code res= err_noerror; + qulonglong idd = 0; + if ( !sysJournal ) return err_nosysjournal; + res = aObject::select(uid); + if(res != err_noerror) return res; + idd = sysJournal->findDocument(uid); + if (idd == 0) return err_nodocument; + aCfgItem tobj; + uint n = md->count( obj, md_table ); + for ( uint i = 0; i < n; i++ ) + { + tobj = md->find(obj,md_table,i); + if ( tobj.isNull() ) continue; + tableSelect(md->attr(tobj,mda_name), uid); +// aObject::select( QString("idd=%1").arg(uid), md->attr(tobj,mda_name) ); + } + return res; +} + +/** + * \ru + * \brief ScriptAPI. Выбирает документ с заданным идентификатором. + * \_ru + */ +int +aDocument::SelectDocument( QVariant uid ) +{ + return select(uid.toULongLong()); +} + +/*! + * \en + * Sets position in document table tname at \a pos. + * \_en + * \ru + * \brief ScriptAPI. Устанавливает позицию в табличной части документа на строку с заданным номером. + * \_ru + * \param pos - \en line number \_en \ru номер строки \_ru + * \param tname - \en table name \_en \ru имя таблицы \_ru + */ +void +aDocument::Seek(int pos, const QString &tname) +{ + aSQLTable * t = table(tname); + if(t && t->first()) + { + setSelected( true, tname ); + for(int i=0; inext()) continue; + else break; + } + } +} + +/** + * \en + * Get value of document field. + * \_en + * \ru + * \brief ScriptAPI. Получение значения атрибута документа c указанным идентификатором. + * + * С помощью этого метода можно получить значение атрибута документа, не являющегося текущим. + * Вызов метода приводит к смене текущего документа. + * Для получения значения атрибута текущего документа используйте метод Value(...), + * унаследованный от aObject. + * \_ru + * + * \param docId - \en document id \_en \ru id документа \_ru + * \param fname - \en md field name \_en \ru имя поля в метаданных \_ru + * + * \return \en value of field \_en \ru значение поля или строку "Unknown", в случае ошибки \_ru + * + */ +QVariant +aDocument::GetDocumentValue(QVariant docId, const QString &fname) +{ + //aSQLTable * t = table(); + //if ( !t ) return ""; + //t->select(docId.toULongLong()); + //if ( !t->first() ) return ""; + //else + //{ + if(!select(docId.toULongLong())) + { + QVariant val = Value( fname ); + if(val.type()==QVariant::ULongLong || + val.type()==QVariant::LongLong) + { + return val.toString(); + } + else + { + return val; + } + } + else + { + aLog::print(aLog::Error, tr("aDocument::GetDocumentValue(...): Can't find aDocument")); + return "Unknown"; + } + //} + +} +/*! + * \en + * Return field value with name = \a name of the primary object database table. + * \_en + * \ru + * Возвращает значения поля с именем = \a name основг\ной таблицы объекта. + * \_ru + * \param name - \en field name \_en \ru имя поля \_ru + * \return \en field value \_en \ru значение поля. Поля типа Q_ULLONG и DateTime переводятся в строки. \_ru + */ +QVariant +aDocument::Value( const QString & name, const QString &tableName ) +{ + QVariant res = aObject::Value(name, tableName); + if(res.type() == QVariant::ULongLong || res.type() == QVariant::LongLong) + { + return QVariant(res.toString()); + } + //if(res.type() == QVariant::DateTime) + //{ + // return QVariant(res.toDate().toString(Qt::ISODate)); + //} + return res; +} diff --git a/src/lib/objects/adocument.h b/src/lib/objects/adocument.h new file mode 100644 index 0000000..50bf259 --- /dev/null +++ b/src/lib/objects/adocument.h @@ -0,0 +1,140 @@ +/**************************************************************************** +** $Id: adocument.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Document metadata object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ADOCUMENT_H +#define ADOCUMENT_H + +#include +#include "acfg.h" +#include "aobject.h" +//#include "adocjournal.h" + +class aDocJournal; + +class aDatabase; + + + +/*! + * \en + * Not visual object used for working with documents in database. + * Used as interface between database and script or wObjects + * \_en + * \ru + * \brief Определяет программный интерфейс для работы с бизнес объектами типа Документ и их атрибутами. + * Наследует aObject. + * + * Объект класса предоставляет навигационный доступ ко всем документам, имеющим тип, указанный при инициализации + * объекта. С помощью методов класса можно управлять как документом целиком, так и отдельными его реквизитами. + * В том числе табличными частями, если они определены в метаданных у документа. + * Обеспечивает единообразный доступ к полям и таблицам документов, + * хранимых в базе данных. Информация о составе и структуре полей и табличных частей документа + * храниться в метаданных. + * Позволяет создавать, удалять, изменять, копировать, проводить и распроводить документы. + * \_ru + */ +class ANANAS_EXPORT aDocument :public aObject +{ + Q_OBJECT + ERR_Code tableDeleteLines( const QString & tablename ); + ERR_Code tableSelect( const QString & tablename, qulonglong = 0 ); +public: + + aDocument( aCfgItem context, aDatabase * adb = 0 ); + aDocument( const QString & name, aDatabase * adb = 0 ); + virtual ~aDocument(); + + virtual ERR_Code select ( qulonglong uid ); + virtual ERR_Code initObject(); + virtual QString trSysName( const QString & sname ); + virtual QVariant sysValue( const QString & sname, const QString & = ""); // second parameter is here to make method declaration identical to aObject::sysValue + virtual ERR_Code setSysValue( const QString & sname, QVariant value, const QString & = ""); // third parameter makes method declaration identical to aObject::setSysValue + + aSQLTable * getTable( const QString & tablename ); +public slots: + + virtual ERR_Code New(); + virtual ERR_Code Delete(); + virtual ERR_Code Update(); + virtual ERR_Code Select( QDateTime from, QDateTime to ); + virtual bool Select(); + virtual ERR_Code Select( const QString & num ); + virtual int SelectDocument( QVariant uid ); + virtual ERR_Code Copy(); + + virtual bool Next(); + virtual bool Prev(); + virtual bool First(); + virtual bool Last(); + + virtual ERR_Code TableNewLine( const QString & tablename ); + virtual ERR_Code TableDelete(const QString & tablename); + virtual ERR_Code TableSelect( const QString & name ); + + virtual QVariant TableValue( const QString & tablename, const QString & name ); + virtual ERR_Code TableSetValue( const QString & tablename, const QString & name, + const QVariant &value ); + virtual ERR_Code TableUpdate( const QString & tablename = "" ); + + virtual bool TableNext( const QString & name); + virtual bool TablePrev( const QString & name); + virtual bool TableFirst( const QString & name); + virtual bool TableLast( const QString & name); + + virtual bool IsMarkDeleted(); + virtual bool IsMarked(); + virtual ERR_Code SetMarkDeleted( bool Deleted ); + virtual ERR_Code SetMarked( bool Marked ); + + void SetPrefix( const QString & pr ); + QString Prefix(); + + virtual QVariant Value( const QString & name, const QString &tableName = "" ); + + virtual ERR_Code SetFilter( const QString & valname, const QVariant & value ); + virtual ERR_Code ClearFilter(); + + ERR_Code Conduct(); //depricated + ERR_Code UnConduct(); //depricated + bool IsConducted(); // depricated + ERR_Code SignIn(); + ERR_Code SignOut(); + bool IsSignedIn(); +// virtual ERR_Code TableSetFilter( const QString & tname, const QString & valname, const QVariant & value ); +// virtual ERR_Code TableClearFilter( const QString & tname ); + void Seek(int pos, const QString &tname); + QVariant GetDocumentValue(QVariant ide, const QString &fname); + +private: + QString pref; + aDocJournal* sysJournal; + ERR_Code setConduct( bool cond ); +}; + +#endif// ADOCUMENT_H diff --git a/src/lib/objects/airegister.cpp b/src/lib/objects/airegister.cpp new file mode 100644 index 0000000..ead4d50 --- /dev/null +++ b/src/lib/objects/airegister.cpp @@ -0,0 +1,554 @@ +/**************************************************************************** +** $Id: airegister.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Code file of the Information Register of Ananas +** Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "airegister.h" +#include "adatabase.h" +#include "adocjournal.h" +#include "adocument.h" +#include "alog.h" + + +/*! + *\en + * \brief Create object aIRegister by ananas configuration object. + * + * New object initing by md ojbect + * \param context - md object used for initing aDocument + * \param adb - ananas database for working + *\_en + *\ru + * \brief Создает новый экземпляр объекта информационного регистра по описанию в бизнес схеме. + * + * \param context - Ссылка на объект бизнес схемы, описывающий регистр. + * \param adb - Можно не передавать. Значение по умолчанию = 0. Текущая база данных Ананаса. + * + *\_ru + */ +aIRegister::aIRegister( aCfgItem context, aDatabase * adb ) +: aObject( context, adb ) +{ + concrete = !context.isNull(); + initObject(); +} + + + +/*! + *\en + * \brief Create object aIRegister by information register metadata name. + * + * New object initing by md ojbect with some name. + * Use for creating object if you know it's name. + * \param name - md name of document + * \param adb - ananas database for working + * \param type - ananas database for working + *\_en + *\ru + * \brief Создает новый экземпляр объекта информационного регистра по имени. + * + * Новый объект создается по описанию объекта с таким именем, хранимом в бизнес схеме. + * \param name - Имя Регистра в бизнес схеме + * \param adb - Можно не передавать. Значение по умолчанию = 0. Ссылка на текущую базу данных Ананаса + * \param type - Можно не передавать. Значение по умолчанию = "InfoRegister". Тип (класс) реристра в бизнес схеме + * + *\_ru + */ +aIRegister::aIRegister( const QString & name, aDatabase * adb, const QString & type ) +:aObject( type+name, adb ) +{ + if ( name.isEmpty() ) concrete = false; + else concrete = true; + initObject(); +} + +/*! + * \ru + * Деструктор. + * \_ru + */ + +aIRegister::~aIRegister() +{ +} + + +/*! + *\en + * \brief Initing this object by information registr from metadata object + * + * \return Error code + *\_en + *\ru + * \brief Инициализирует объект информационного регистра. + * + * \return Код ошибки + *\_ru + */ +ERR_Code +aIRegister::initObject() +{ + docseted = false; + tableseted = false; + ERR_Code err = aObject::initObject(); + if ( err ) + return err; + return tableInsert( db->tableDbName(*md,obj), obj ); +} + + +/*! + *\ru + * \brief Устанавливает фильтр на записи регистра. + * + * После установки фильтра навигация происходит по записям значение данного поля которых равно указанному значению. + * \param name - Имя столбца в метаданных, на который устанавливается фильтр + * \param value - Значение для фильтрации + * \return Код ошибки + *\_ru + *\en + * \brief Sets filter. + * + * \param name - Field name. + * \param value - Field value. + * \return Error code + *\_en + */ +int +aIRegister::SetFilter( const QString & name, const QVariant & value ) +{ + if ( (md->findName( md->find(obj,md_dimensions,0), md_field, name )).isNull() ) + return err_incorrecttype; + return aObject::SetFilter( name, value ); +} + + + +/*! + *\ru + * \brief Отфильтровывает записи регистра, принадлежащие документу. Подготовливает регистр для добавления записи + * функцией New. + * + * + * Задав документ для регистра, получаем возможность работать только с записями регистра, указывающими на этот документом. + * + * \param - Ссылка на существующий документ + * \return Код ошибки + * \see New() + * + *\_ru + *\en + * \brief Sets document. + * + * \param doc - Reference to documetn. + * \return Error code + * \see New() + *\_en + */ +int +aIRegister::SetDocument( aDocument * doc ) +{ + nowDoc = doc; + if ( !doc ) return err_nodocument; + docseted = true; + SetFilter( "idd", doc->getUid() ); + return err_noerror; +} + +/*! + *\ru + * \brief Возвращает документ, на основании которого была сделана текущая запись регистра. + * + * Возвращяет хранящийся в текущей записи регистра указатель на документ (не идентификатор, а объект), + * позволяющий обратиться к реквизитам документа. + * \return Указатель на документ, если текущая запись регистра имеет ссылку на документ и этот докуменрт существует. + * Возврат ошибки будет свидетельствовать, что с данными не все в порядке, т.е. нарушена ссылочная целостность. + *\_ru + *\en + * \brief Gets document. + * + * \return Document pointer + *\_en + */ +aDocument* +aIRegister::GetDocument() +{ + //TODO: проверить, не происходит ли утечек памяти + qulonglong doc_id = table()->sysValue("idd").toULongLong(); + aCfgItem o = md->find(db->uidType(doc_id)); + if(!o.isNull()) + { + aDocument * d = new aDocument(o, db); + if(d) + { + d->select(doc_id); + } + return d; + } + return 0; +} + + +/*! + *\en + * \brief Sets table. + * + * \param tblname - Table name. + * \return Error code + *\_en + *\ru + * \brief Задает табличную часть документа для использования при добавдении новых записей регистра методом New. + * + * Вновь добавляемые записи регистра будут содержать ссылку на текущую запись указанной табличной части документа. + * Используется только когда нужно добавить строки из таблицы документа. + * До вызова этой функции должна быть вызвана функция установки документа SetDocument( aDocument * doc ). + * \param tblname - Имя таблицы документа. + * \return Код ошибки + * \see SetDocument( aDocument * doc ) + *\_ru + */ +int +aIRegister::SetTable( const QString & tblname ) +{ + if ( tblname == "" ) + { + tname = ""; + tableseted = false; + return err_notable; + } + if ( !docseted ) return err_nodocument; + tableseted = true; + tname = tblname; + return err_noerror; +} + + + +/*! + *\en + * \brief Adds new line to infomation register table. + * + * \return Error code + * \see SetDocument( aDocument * doc ) + * \see SetTable( const QString & tblname ) + *\_en + *\ru + * \brief Добавляет новую строку к таблице информационного регистра. + * + * Для каждой строки информационного регистра обязательным является указание того, какая строка + * табличной части какого документа с ней связана. То есть каждая запись в регистре обязательно связана + * ровно с одной строкой табличной части какого-либо документа. И если при редактировании документа + * пользователем удаляется строка в его табличной части, то происходит автоматическое удаление соответствующих + * строк регистра. + * Перед вызовом необходимо указать ссылку на документ и на одну из его (возможно нескольких) табличных частей. + * Важно чтобы в табличной части документа была задана требуемая текущая запись (строка). Именно с ней будет связана + * создаваемая запись регистра. + * Для указания документа и табличной части перед выховом этой функции нужно вызвать функции SetDocument() и SetTable() + * Иначе запись не будет создана и вернется ошибка. + * \return Код ошибки + * \see SetDocument( aDocument * doc ) + * \see SetTable( const QString & tblname ) + *\_ru + */ +int +aIRegister::New() +{ + if ( !docseted ) return err_nodocument; + aSQLTable * t = table(); + if ( !t ) return err_notable; + qulonglong idd = nowDoc->getUid(); + if ( !idd ) return err_notselected; + int err = aObject::New(); + if ( err ) return err; + t->setSysValue( "idd", idd ); + //t->setSysValue( "date", nowDoc->Value("DocDate") ); + if ( tableseted ) + { + aSQLTable * tt = nowDoc->getTable ( tname ); + t->setSysValue("iddt",tt->sysValue("id")); + t->setSysValue("ln",tt->sysValue("ln")); + } + err = Update(); + if ( err ) return err; + else return select(getUid()); +} + + +/*! + *\en + * \brief Delete all record with document id from all information registers. + * + * \param doc - document to delete. + * \return true - ok, false - error + *\_en + *\ru + * \brief Удаляет все записи с идентификатором данного документа из всех информационных регистров. + * + * \param doc - Документ, записи о котором будут удалены. + * \return true - успех, false - ошибка + *\_ru + */ +bool +aIRegister::deleteDocument( aDocument * doc ) +{ + QString tdbname; + aCfgItem iReg, iRegs = md->find(md->find(md->find(mdc_metadata),md_registers,0),md_iregisters,0); + if ( iRegs.isNull() ) + { + aLog::print(aLog::Error, tr("aIRegister metaobject is null")); + return false; + } + qulonglong idd = doc->getUid(); + if ( !idd ) + { + aLog::print(aLog::Error, tr("aIRegister deleted document have invalid idd")); + return false; + } + uint n = md->count( iRegs, md_iregister ); + for ( uint i = 0; i < n; i++ ) + { + iReg = md->find( iRegs, md_iregister, i ); + if ( iReg.isNull() ) continue; + if ( md->attr( iReg, mda_no_unconduct)=="1") continue; + tdbname = db->tableDbName( db->cfg, iReg ); + db->db()->exec(QString("DELETE FROM %1 WHERE idd=%2").arg(tdbname).arg(idd)); + } + return true; +} + + + +/*! + *\en + * \brief Removes records with given table id + * + * \param iddt - table id. + * \return true - ok, false - error + *\_en + *\ru + * \brief Удаляет все записи из всех информационных регистрах о таблице с данным идентификатором + * + * \param iddt - id таблицы. + * \return true - успех, false - ошибка + *\_ru + */ +bool +aIRegister::deleteTable( qulonglong iddt) +{ + QString tdbname; + aCfgItem iReg, iRegs = md->find(md->find(md->find(mdc_metadata),md_registers,0),md_iregisters,0); + if ( iRegs.isNull() ) + { + aLog::print(aLog::Error, tr("aIRegister metaobject is null")); + return false; + } + uint n = md->count( iRegs, md_iregister ); + for ( uint i = 0; i < n; i++ ) + { + iReg = md->find( iRegs, md_iregister, i ); + if ( iReg.isNull() ) continue; + if ( md->attr( iReg, mda_no_unconduct)=="1") continue; + tdbname = db->tableDbName( db->cfg, iReg ); + db->db()->exec(QString("DELETE FROM %1 WHERE iddt=%2").arg(tdbname).arg(iddt)); + } + return true; +} + + + +/*! + *\en + * \brief Selects records for date interval. + * + * \return Error code + * \see Select( QDateTime from, QDateTime to ) + *\_en + *\ru + * \brief Выбирает записи в информационном регистре за заданный период. + * + * Вспомогательный метод для скриптов. + * \param from - дата начала периода в строке в фрмате ISO 8601 (ГГГГ-ММ-ДД) + * \param to - дата окончания периода в строке в формате ISO 8601 (ГГГГ-ММ-ДД) + * \return Код ошибки + * \see Select( QDateTime from, QDateTime to ) + *\_ru + */ +int +aIRegister::Select( const QString &from, const QString &to) +{ + //printf("from %s, to %s\n",from.ascii(),to.ascii() ); + aLog::print(aLog::Debug, tr("aIRegister select period from %1 to %2").arg(from).arg(to)); + return Select(QDateTime::fromString(from+"T00:00:00",Qt::ISODate), QDateTime::fromString(to+"t00:00:00",Qt::ISODate)); +} + + +/*! + *\en + * \brief Selects records for period + * + * \param from - Period begin date + * \param to - Period end date + * \return Error code + *\_en + *\ru + * \brief Выбирает записи в информационном регистре за заданный период. + * + * \param from - Дата начала периода + * \param to - Дата окончания периода + * \return Код ошибки + *\_ru + */ +int +aIRegister::Select( QDateTime from, QDateTime to ) +{ + aDocJournal journ(db); + aSQLTable * t = table(); + if ( !t ) return err_notable; + QString query, flt; + flt = journ.selectionFilter( from, to, "", true ); + if ( flt == "" ) return err_selecterror; + query = QString("SELECT %1.* FROM a_journ, %2 WHERE %3.idd=a_journ.idd AND %4").arg(t->tableName).arg(t->tableName).arg(t->tableName).arg(flt); + if ( IsFiltred() ) + { + QString tf = t->getNFilter(); + if ( tf != "" ) + query = query + QString(" AND %1").arg(tf); + } + if ( t->exec(query) ) + if ( t->first() ) + { + setSelected(true); + return err_noerror; + } + else return err_notselected; + else + return err_selecterror; +} + + +/*! + *\en + * + * \return Error code + *\_en + *\ru + * \brief Выбирает первую запись регистра по документу, установленному перед этим функцией SetDocument( aDocument * doc ). + * + * \return Код ошибки + * \see SetDocument( aDocument * doc ) + *\_ru + */ +int +aIRegister::SelectByDoc() +{ + if ( !docseted ) return err_nodocument; + qulonglong uidd = nowDoc->getUid(); + if ( !uidd ) return err_nodocument; + aSQLTable * t = table(); + if ( !t ) return err_notable; + if ( t->select(QString("idd=%1").arg(uidd)) ) + if (t->first()) return err_noerror; + else return err_notselected; + else return err_selecterror; +} + +/*! + *\en + * \brief Return field value with name = name of the primary object database table. + * + * \param name - field name + * \return field value + *\_en + *\ru + * \brief Возвращает значения поля с именем = name основной таблицы объекта. + * + * \param name - имя поля + * \return значение поля. Поля типа Q_ULLONG и DateTime переводятся в строки. + *\_ru + */ +QVariant +aIRegister::Value( const QString & name, const QString &tableName ) +{ + QVariant res = aObject::Value(name, tableName); + if(res.type() == QVariant::ULongLong || res.type() == QVariant::LongLong) + { + return QVariant(res.toString()); + } + //if(res.type() == QVariant::DateTime) + //{ + // return QVariant(res.toDate().toString(Qt::ISODate)); + //} + return res; +} + +/** + * \ru + * \brief Переход к следующей записи регистра. + * \_ru + */ +bool +aIRegister::Next() +{ + return aObject::Next(); +} + + +/** + * \ru + * \brief Переход к предыдущей записи регистра. + * \_ru + */ +bool +aIRegister::Prev() +{ + return aObject::Prev(); +} + + +/** + * \ru + * \brief Переход к первой записи регистра. + * \_ru + */ +bool +aIRegister::First() +{ + return aObject::First(); +} + + +/** + * \ru + * \brief Переход к последней записи регистра. + * \_ru + */ +bool +aIRegister::Last() +{ + return aObject::Last(); +} diff --git a/src/lib/objects/airegister.h b/src/lib/objects/airegister.h new file mode 100644 index 0000000..d7ab9b6 --- /dev/null +++ b/src/lib/objects/airegister.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** $Id: airegister.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the Information Register of Ananas +** Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AIREGISTER_H +#define AIREGISTER_H +#include +#include +#include +#include +#include "acfg.h" +#include "aobject.h" + +class aDatabase; + +class aDocJournal; + +class aDocument; + + + +/*! + * \en + * Object for working with information register in database. + * Using for provide between database tables and wobjects or ananas scripts + * \_en + * \ru + * \class aIRegister aIRegister.h + * \brief Класс aIRegister определяет программный интерфейс Информационных регистров. + * + * Информационный регистр служит для хронологической записи данных. + * Для хранения остатков следует использовать Накопительные регистры aARegister + * \see aARegister + * \_ru + */ +class ANANAS_EXPORT aIRegister :public aObject +{ + Q_OBJECT +public: + aIRegister(aCfgItem registerItem, aDatabase * adb = 0); + aIRegister( const QString & name, aDatabase * adb = 0, const QString & type = "InfoRegister."); + virtual ~aIRegister(); +// ERR_Code initObject(aDatabase * adb); + virtual ERR_Code initObject(); + virtual bool deleteDocument( aDocument * doc ); + virtual bool deleteTable( qulonglong iddt ); +public slots: + virtual int SetDocument( aDocument * doc ); + virtual aDocument * GetDocument(); + virtual int SetTable( const QString & tblname ); + virtual int New(); + virtual int Select( const QString &from, const QString & to); + virtual int Select( QDateTime from, QDateTime to ); + virtual int SelectByDoc(); + virtual QVariant Value( const QString & name, const QString &tableName = "" ); + + virtual int SetFilter( const QString & fieldName, const QVariant & value ); + virtual bool Next(); + virtual bool Prev(); + virtual bool First(); + virtual bool Last(); +protected: + bool docseted, tableseted; + QString tname; + aDocument * nowDoc; +}; + +#endif// AIREGISTER_H diff --git a/src/lib/objects/aobject.cpp b/src/lib/objects/aobject.cpp new file mode 100644 index 0000000..cad317a --- /dev/null +++ b/src/lib/objects/aobject.cpp @@ -0,0 +1,1136 @@ +/**************************************************************************** +** $Id: aobject.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Code file of the Ananas Object of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2005-2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include "adatabase.h" +#include "aobject.h" +#include "aform.h" +#include "alog.h" + + +/*! + * \en + * Craeate abstract aObject. + * \param parent - parent object + * \param name - name of object + * \_en + * \ru + * Создает абстрактный не связанный с базой данных объект управления данными. + * Созданный таким образом объект не использует информацию из метаданных о составе и + * типах полей. То есть он не является какой-либо моделью данных. И на самом деле малопригоден + * для использования. В дазе данных ни как не отражается создание этого объекта. Для того, + * что бы зарегистрировать вновь созданный абстрактный объект в базе данных, необходимо + * сначала проинициализировать его с использованием метаданных, а затем вызвать метод New(). + * \_ru + */ +aObject::aObject( QObject *parent, const char *name ) +:QObject( parent, name ) +{ + db = 0; + vInited = false; + filtred = false; + selectFlag = false; +} + + + +/*! + * \en + * Create aObject, inited by md object. + * md object finding by name + * \param oname - md name of object, name contens prefix + * Document. for documents, + * InfoRegister. for information registers, + * Catalogue. for catalogues, + * AccumulationRegister. for Accumulation registers, + * DocJournal. for journals + * \param adb - link on object aDataBase used for work + * \param parent - parent object + * \param name - name of object + * \_en + * \ru + * Создает объект как модель данных, описанную в метаданных. На описание в метаданных + * указывает один из передаваемых при вызове параметров - имя элемента метаданных. + * После успешного создания объекта с ним можно работать как с объектом данных со структурой, + * описанной в метаданных, и индентифицируемой именем, переданным в параметрах вызова. + * + * \_ru + */ +aObject::aObject( const QString &oname, aDatabase *adb, QObject *parent, const char *name ) +:QObject( parent, name ) +{ + vInited = false; + filtred = false; + selectFlag = false; + db = adb; + if ( adb ) + { + obj = adb->cfg.find( oname ); + setObject( obj ); + } +} + + + +/*! + * Create aObject, inited by md object. + * \param context - hi leve md object + * \param adb - link on object aDataBase used for work + * \param parent - parent object + * \param name - name of object + */ +aObject::aObject( aCfgItem context, aDatabase *adb, QObject *parent, const char *name ) +:QObject( parent, name ) +{ + filtred = false; + vInited = false; + db = adb; + if ( adb ) + { + setObject( context ); + } +} + + + +/*! + * virtual destructor. + */ +aObject::~aObject() +{ +} + + + +/*! + * Tune on metadata object and it's database tables. + * \param adb - link on database object + * \return error code + */ +ERR_Code +aObject::init() +{ + if ( isInited() ) return err_noerror; + return initObject(); +} + + + +/*! + * Set new object type after create + * /param newobject - new md object + * \return error code + */ +ERR_Code +aObject::setObject( aCfgItem newobject ) +{ + setInited( false ); + obj = newobject; + return init(); +} + + + +/*! + * Init object after create. + * Need setObject( id ), where id - if of the metadata object of the adb->cfg loaded Configuration. + * \return error code + */ +ERR_Code +aObject::initObject() +{ + aCfgItem fg, f; + QString tname; + + setInited( true ); +// db = adb; + md = 0; + if ( db ) md = &db->cfg; + else + { + aLog::print(aLog::Error, tr("aObject have no database!")); + return err_nodatabase; + } + if ( obj.isNull() ) + { + aLog::print(aLog::Error, tr("aObject md object not found")); + return err_objnotfound; + } + return err_noerror; +} + + + +/*! + * + */ +bool +aObject::checkStructure() +{ + return false; +} + + + +/*! + * Return the table of object by it's name. + * /param name - name of table for main table use name="" or empty parametr + * /return link on aDataTable or 0 if table not found + */ +aDataTable * +aObject::table( const QString &name ) +{ + if ( !dbtables[ name ] ) + { + if (name!="" && !name.isEmpty()) + { + aLog::print(aLog::Error, tr("aObject table with name %1 not found").arg(name)); + cfg_message(1, tr("Table `%s' not found.\n").utf8(),(const char*) name); + } + // else + // { + // cfg_message(1, tr("Table name is empty.\n").utf8()); + // } + return 0; + } + return dbtables[ name ]; +} + + + +/*! + * Insert table name and it link into internal buffer. + * used for finding table by it's md name or some default name + * /param dbname - database name of table + * /param obj - md object, used for aDataTable initing + * /param name - name of table, used for finding table in buffer + * /return error code + */ +ERR_Code +aObject::tableInsert( const QString &dbname, aCfgItem obj, const QString &name ) +{ + if ( db ) + { + aDataTable *t = db->table( dbname ); + if ( !t ) + return err_notable; + t->setObject( obj ); + dbtables.insert( name, t ); + return err_noerror; + } + aLog::print(aLog::Error, tr("aObject have no database!")); + return err_nodatabase; +} + + + +/*! + * Insert table name and it link into internal buffer. + * used for finding table by it's md name or some default name + * table not inited by md object + * /param dbname - database name of table + * /param name - name of table, used for finding table in buffer + * /return error code + */ +ERR_Code +aObject::tableInsert( const QString &dbname, const QString &name ) +{ + if ( db ) { + aDataTable *t = db->table( dbname ); + if ( !t ) return err_notable; + dbtables.insert( name, t ); + return err_noerror; + } + aLog::print(aLog::Error, tr("aObject have no database!")); + return err_nodatabase; +} + + + +/*! + * Remove table from buffer. + * /param name - table name + * /return err_notable if table not found + */ +ERR_Code +aObject::tableRemove( const QString &name ) +{ + if ( !dbtables[name] ) + { + aLog::print(aLog::Error, tr("aObject table with name %1 not found").arg(name)); + return err_notable; + } + dbtables.remove( name ); + return err_noerror; +} + + + +/*! + * + */ +QString +aObject::trSysName( const QString & ) +{ + return ""; +} + + + +/*! + * Gets system field value. + * \param name (in) - field name. + * \return field value or QVariant::Invalid if field no exist. + */ +QVariant +aObject::sysValue( const QString & name, const QString &tableName ) +{ + aDataTable *t = table( tableName ); + if ( t && t->sysFieldExists( name ) ) + { + return t->sysValue(name); + } + else return QVariant::Invalid; +} + + + +/*! + * Sets system field value. + * \param name (in) - field name. + * \param value (in) - sets value. + */ +int +aObject::setSysValue( const QString & name, QVariant value, const QString &tableName ) +{ + aDataTable *t = table( tableName ); + if ( t ) + { + t->setSysValue( name, value ); + return err_noerror; + } + return err_notable; +} + + + +/*! + * Return field value of the primary object database table. + */ +QVariant +aObject::Value( const QString & name, const QString &tableName ) +{ + + aDataTable *t = table( tableName ); + QString trName = trSysName(name); + + if ( trName != "" ) return sysValue( trName ); + else + { + if ( t ) return t->value( name ); + } + return QVariant(""); +} + + + +/*! + * Set field value of the primary object database table. + */ +int +aObject::SetValue( const QString & name, const QVariant &value, const QString &tableName ) +{ + aDataTable *t = table( tableName ); + QString trName = trSysName(name); + + if ( trName != "" ) return setSysValue( trName, value ); + else + { + if ( t ) + { + t->setValue( name, value ); + return err_noerror; + } + + } + return err_notable; +// return setTValue( "", name, value ); +} + + + +/*! + * Check object selecting. + * \return true if object record selected in database. + */ +bool +aObject::IsSelected() +{ + return selected(); +} + + + +/*! + * + */ +bool +aObject::IsMarkDeleted(const QString & tname) +{ + aDataTable *t = table( tname ); + if ( t && t->sysFieldExists( "df" ) ) return t->sysValue( "df" ).toInt() == 1; + return false; +} + + + +/*! + * + */ +bool +aObject::IsMarked() +{ + aDataTable *t = table(); + if ( t && t->sysFieldExists( "mf" ) ) return t->sysValue( "mf" ).toInt() == 1; + return false; +} + + + +/*! + * + */ +/* +int +aObject::TableSetMarkDeleted( bool Deleted, const QString & tname ) +{ + aDataTable *t = table( tname ); + if ( t && t->sysFieldExists( "df" ) ) { + QString v = "0"; + if ( Deleted ) v = "1"; + t->setSysValue( "df", QVariant( v ) ); + return err_noerror; + } + return err_incorrecttype; // Object can not be mark deleted +} +*/ + + +/*! + * + */ +int +aObject::SetMarkDeleted( bool Deleted, const QString & tname ) +{ + aDataTable *t = table( tname ); + if ( t && t->sysFieldExists( "df" ) ) + { + QString v = "0"; + if ( Deleted ) v = "1"; + t->setSysValue( "df", QVariant( v ) ); + return err_noerror; + } + else + { + aLog::print(aLog::Error, tr("aObject have no system field %1").arg("df")); + return err_incorrecttype; // Object can not be mark deleted + } +} + + + +/*! + * + */ +int +aObject::SetMarked( bool Marked ) +{ + aDataTable *t = table(); + if ( t && t->sysFieldExists( "mf" ) ) { + QString v = ""; + if ( Marked ) v = "1"; + t->setSysValue( "mf", QVariant( v ) ); +// t->printRecord(); + return err_noerror; + } + aLog::print(aLog::Error, tr("aObject have no system field %1").arg("mf")); + return err_incorrecttype; // Object can not be marked +} + + + +/*! + * Add new object record in database. + */ +int +aObject::New() +{ + aDataTable *t = table(); + + if ( !t ) return err_notable; + setSelected ( t->New() ); +/* Q_ULLONG Uid = t->primeInsert()->value("id").toULongLong(); + if ( t->insert() ) + { + if ( t->select(QString("id=%1").arg(Uid), false) ) + if ( t->first() ) + { + setSelected(true); + return err_noerror; + } + return err_selecterror; + } +*/ if ( selected() ) return err_noerror; + return err_inserterror; +} + + + +/*! + * Copy current selected object data in database. + */ +/*Q_ULLONG +aObject::copy( const QString & tablename ) +{ + aDataTable * t = table( tablename ); + + if ( !t ) return 0; + if ( !selected(tablename) ) return 0; + QSqlRecord * r = t->primeUpdate(); + Q_ULLONG Uid = db->uid( t->id ); + r->setValue("id",Uid); + if ( t->insert() ) return Uid; + else return 0; +} +*/ + + +/*! + * + */ +int +aObject::Copy() +{ +// QSqlRecord r; + +// Q_ULLONG Uid = copy(); +// if ( !Uid ) return err_copyerror; + aDataTable *t = table(); + if ( t->Copy() ) return err_noerror; +// if ( t->select(QString("id=%1").arg(Uid)) ) +// if ( t->first() ) +// return err_noerror; + return err_copyerror; +} + + + +/*! +* Delete curent selected object record from database. +*/ +int +aObject::Delete() +{ + aDataTable * t = table(); + if ( !t ) return err_notable; + db->markDeleted(getUid()); + t->Delete(); +// if ( !selected() ) return err_notselected; +// t->primeDelete(); +// t->del(); + setSelected (false); + return err_noerror; +} + + + +/*! + *\~english + * Update curent selected object record to database. + *\~russian + *\~ + */ +int +aObject::Update() +{ + aDataTable *t = table(); + QSqlRecord *r; + int i; + + if ( !t ) return err_notable; + t->Update(); +/* + r = t->primeUpdate(); + t->printRecord(); + for ( i=0;icount();i++ ) r->setValue( i, t->value( i ) ); + + t->update(); +*/ + if ( t->lastError().type() ) + { + //debug_message("update error %i %s\n",t->lastError().type(), ( const char *)t->lastError().text()); + + aLog::print(aLog::Error, tr("aObject update error. Driver message: %1").arg(t->lastError().text())); + return err_updateerror; + } + else { + return err_noerror; + } +} + + + +/*! + *\~english + * Update object attributes from curent selected object database record. + *\~russian + *\~ + *//* +void +aObject::updateAttributes( const QString & tname ) +{ + aDataTable *t = table(); + +} +*/ + +/*! + *\~english + * Conduct document. + * Do nothing. Added for wDocument compatibility. + *\~russian + * Проводит документ. + * Ничего не делает. Предназначена для совместимости и работы в wDocument. + *\~ + *\return \~english error code - abstract object.\~russian код ошибки - абстрактный обект.\~ + */ +int +aObject::Conduct() +{ + return err_abstractobj; +} + +/*! + *\~english + * UnConduct document. + * Do nothing. Added for wDocument compatibility. + *\~russian + * Распроводит документ. + * Ничего не делает. Предназначена для совместимости и работы в wDocument. + *\~ + *\return \~english error code - abstract object.\~russian код ошибки - абстрактный обект.\~ + */ +int +aObject::UnConduct() +{ + return err_abstractobj; +} + +bool +aObject::IsConducted() +{ + return 0; +} + + + +/*! + *\~english + * Return document database id. + * always return 0. Added for wJournal compatibility. + *\~russian + * Возвращает id документа в базе данных. + * Всегда возвращает 0. Предназначена для совместимости и работы в wJournal. + *\~ + *\return \~english 0.\~russian 0.\~ + */ +qulonglong +aObject::docId() +{ + return 0; +} + + +/*! + * \ru + * Позиционирует указатель в БД на запись, соотвествующую объекту + * с указанным идентификатором. + * \param id - Идентификатор объекта. + * \return возвращает код ошибки или 0 в случае успеха. + * \_ru + */ +ERR_Code +aObject::select( qulonglong id ) +{ + aDataTable * t = table(); + if ( !t ) return err_notable; + setSelected (false); + long otype = db->uidType( id ); +// debug_message("otype=%li\n",otype); + if ( !otype ) return err_objnotfound; + if ( concrete && ( otype != t->getMdObjId() ) ) return err_incorrecttype; + if ( !concrete ) + { + aCfgItem tmpObj = md->find( otype ); + if ( tmpObj.isNull() ) return err_objnotfound; + setObject ( tmpObj ); + } + if ( t->select( QString("id=%1").arg(id), false ) ) + if ( t->first() ) + { +// t->primeUpdate(); + setSelected (true); +// t->printRecord(); + return err_noerror; + } + else return err_notselected; + return err_selecterror; +} + + + +/*! + * + */ +ERR_Code +aObject::select(const QString & query, const QString &tableName) +{ + aDataTable * t = table(tableName); + if ( !t ) return err_notable; + if (t->select(query)) + if( t->first() ) + { + setSelected (true); + return err_noerror; + } + else return err_notselected; + return err_selecterror; +} + + + +/*! + * Return field value of the secondary object database table. + */ +QVariant +aObject::tValue( const QString & tablename, const QString & name ) +{ + aDataTable *t = table( tablename ); +//CHECK_POINT + if ( t ) return t->value( name ); + return QVariant(""); +} + + + +/*! + * Set field value of the secondary object database table. + */ +ERR_Code +aObject::setTValue( const QString & tablename, const QString & name, const QVariant &value ) +{ + aDataTable *t = table( tablename ); + if ( t ) + { + t->setValue( name, value ); + return err_noerror; + } + return err_notable; +} + + + +/*! + * + */ +ERR_Code +aObject::decodeDocNum( QString nm, QString & pref, int & num) +{ + + aLog::print(aLog::Debug, tr("aObject decode doc number %1").arg(nm)); + int pos = -1; + for ( uint i = nm.length(); i > 0; i-- ) + { + if ( ( nm.at(i-1) >='0' ) && ( nm.at(i-1) <= '9' ) ) + continue; + else + { + pos = i; + break; + } + } + if ( pos == -1 ) + { +//CHECK_POINT + pref = ""; + num = nm.toInt(); + return err_incorrectname; + } + if ( pos == ( int ) nm.length() ) + { +//CHECK_POINT + pref = nm; + num = -1; + return err_incorrectname; + } +//CHECK_POINT + pref = nm.left( pos ); + num = nm.mid(pos).toInt(); + aLog::print(aLog::Debug, tr("aObject decode doc number ok, pref=%1 num=%2").arg(pref).arg(num)); + return err_noerror; +} + + + +/*! + * + */ +/* +bool +aObject::Next() +{ + return table()->next(); +// return dbtables[""]->next(); +} +*/ + + +/*! + * + */ +/* +bool +aObject::Prev() +{ +// return dbtables[""]->prev(); + return table()->prev(); +} +*/ + + +/*! + * + */ +/* +bool +aObject::First() +{ +// return dbtables[""]->first(); + return table()->first(); +} +*/ + + +/*! + * + */ +/* +bool +aObject::Last() +{ +// return dbtables[""]->last(); + return table()->last(); +} +*/ + + +/*! + * + */ +bool +aObject::Next( const QString& tableName ) +{ + return table(tableName)->next(); +} + + + +/*! + * + */ +bool +aObject::Prev( const QString& tableName ) +{ + return table(tableName)->prev(); +} + + + +/*! + * + */ +bool +aObject::First( const QString& tableName ) +{ + return table(tableName)->first(); +} + + + +/*! + * + */ +bool +aObject::Last( const QString& tableName ) +{ + return table(tableName)->last(); +} + +/*! + * \ru + * Возвращает уникальный идентификатор объекта из базы данных. + * В качестве объекта например может выступать "Приходная накладная" от такого-то числа за таким то номером. + * Каждый вновь созданный в системе документ или элемент справочника, включая группы справочника имеет свой уникальный + * неповторяющийся идентификатор. Если какое-либо поле, какого-либо объекта имеет тип Объект (например Document.Накладная), + * то в качестве значения ему нужно задавать уникальный идентификатор объекта, возвращаемый функцией Uid(). + * Не существует возможности изменить существующий идентификатор какого-либо объекта. Созданием и управлением + * идентификаторами объектов занимается система. + * \return строка со значением уникального идентификатора. + * \_ru + */ +QString +aObject::Uid() +{ + return QString::number(getUid()); +} + + +/*! + * + */ +qulonglong +aObject::getUid() +{ + qulonglong Uid = 0; + if ( selected() ) Uid = table()->sysValue("id").toULongLong(); + return Uid; +} + + + +/*! + * + */ +void +aObject::setSelected( bool sel, const QString & tablename ) +{ + if ( tablename == "" ) selectFlag = sel; + else table(tablename)->selected = sel; +} + + + +/*! + * + */ +bool +aObject::selected( const QString & tablename ) +{ + if ( tablename == "" ) return selectFlag; + else return table(tablename)->selected; +} + + + +/*! + * + */ +ERR_Code +aObject::setTFilter( const QString & tname, const QString & valname, const QVariant & value ) +{ + aDataTable * t = dbtables[tname]; + if ( !t ) return err_notable; + if ( t->setFilter( valname, value ) ) return err_noerror; + else return err_fieldnotfound; +} + + + +/*! + * + */ +ERR_Code +aObject::clearTFilter( const QString & tname ) +{ + aDataTable * t = dbtables[tname]; + if ( !t ) return err_notable; + t->clearFilter(); + return err_noerror; +} + + + +/*! + * + */ +int +aObject::SetFilter( const QString & valname, const QVariant & value ) +{ + int err = setTFilter( "", valname, value ); + filtred = !err; + return err; +} + + + +/*! + * + */ +int +aObject::ClearFilter() +{ + filtred = false; + return clearTFilter(""); +} + + + +/*! + * + */ +int +aObject::TableSetFilter( const QString & tname, const QString & valname, const QVariant & value ) +{ + return setTFilter( tname, valname, value ); +} + + + +/*! + * + */ +int +aObject::TableClearFilter( const QString & tname ) +{ + return clearTFilter(tname); +} + + + +/*! + * \ru + * Обновляет базу данных данными табличной части объекта. Обычно вызывается + * после метода TableSetValue. + * \param tablename - имя таблицы. Необходим для указания имени, так как + * в объекте возможно наличие нескольких табличных частей. + * \return возвращает код ошибки или 0 в случае успеха. + * \_ru + */ +int +aObject::TableUpdate( const QString & tablename ) +{ + aDataTable *t = table( tablename ); + if ( !t ) + { + + aLog::print(aLog::Error, tr("aObject table update: no table found with name %1").arg(tablename)); + return err_notable; + } +// t->primeUpdate(); + t->Update(); + if (t->lastError().type()) + { + + aLog::print(aLog::Error, tr("aObject update error. Driver message: %1").arg(t->lastError().text())); + return err_updateerror; + } + return err_noerror; +} + + + +/*! + * + */ +QString +aObject::displayString() +{ + QString res="***"; + int stdfc = 0, fid; + aCfgItem sw, f; + + sw = displayStringContext(); +// if ( md->objClass( obj ) == md_catalogue ) { +// sw = md->find( md->find( obj, md_element ), md_string_view ); +// } else { +// sw = md->find( obj, md_string_view ); +// } + if ( !sw.isNull() ) { + stdfc = md->attr( sw, mda_stdf ).toInt(); + switch ( stdfc ) { + case 0: + fid = md->sText( sw, md_fieldid ).toInt(); + res = table()->sysValue( QString( "uf%1" ).arg( fid ) ).toString(); +//printf("fid=%i res=%s\n",fid, ( const char *) res ); + break; + case 1: + break; + case 2: + break; + } + } + else + { + + aLog::print(aLog::Debug, tr("aObject display string context is null")); + } +// res = + return res; +} + + + + +aCfgItem +aObject::displayStringContext() +{ + return md->find( obj, md_string_view ); +} + + + +/** + * \ru + * Вид объекта, так как он описан в метаданных. + * \_ru + */ +QString +aObject::Kind( const QString & name ) +{ + QString wasKind = md->objClass( obj ); + if ( !name.isEmpty() ) { + // Set new kind. + + } + return wasKind; +} diff --git a/src/lib/objects/aobject.h b/src/lib/objects/aobject.h new file mode 100644 index 0000000..22ff56e --- /dev/null +++ b/src/lib/objects/aobject.h @@ -0,0 +1,170 @@ +/**************************************************************************** +** $Id: aobject.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the Ananas Object of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AOBJECT_H +#define AOBJECT_H + +#include +#include "acfg.h" +#include "asqltable.h" + + +class aDatabase; + + + +/*! + * \en + * The parent object for hi level not visual objects + * for worcs with SQL database + * \_en + * \ru + * \brief Базовый класс для невизуальных классов (моделей в терминологии MVC) Ананаса, + * которым необходим доступ к базе данных. + * Наследует QObject. + * + * Как правило такие классы предоставляют методы + * для работы с пользовательскими "объектами" типа "Журнал операций", + * первичный учетный документ "Приходная накладная", "Справочник товаров", + * "Элемент справочника товаров" и др. + * + * Для доступа к данным базы данных через методы такого объекта + * сначала необходимо создать объект, указав в параметре вызова + * конструктора имя элемента метаданных, описывающего модель данных объекта, + * затем вызвать метод New(). + * \_ru + */ +class ANANAS_EXPORT aObject : public QObject +{ + Q_OBJECT +public: + aCfg * md; + aCfgItem obj; + aDatabase * db; + + aObject( QObject *parent = 0, const char *name = 0 ); + aObject( const QString &oname, aDatabase *adb, QObject *parent = 0, const char *name = 0 ); + aObject( aCfgItem context, aDatabase *adb, QObject *parent = 0, const char *name = 0 ); + virtual ~aObject(); + + virtual bool checkStructure(); + + ERR_Code init(); +// aCfgItem *getMDObject(); +// void setMDObject( aCfgItem object ); + ERR_Code decodeDocNum( QString nm, QString & pref, int & num); + virtual ERR_Code select( qulonglong id ); + qulonglong getUid(); + bool selected( const QString & tablename = "" ); + //void selectTable(const QString & tablename = ""); + ERR_Code select(const QString & query, const QString &tableName = ""); + aDataTable *table( const QString &name = "" ); + +// void updateAttributes( const QString & tname = "" ); + virtual qulonglong docId(); + + + virtual bool Next(const QString &tableName = "" ); + virtual bool Prev(const QString &tableName = "" ); + virtual bool First(const QString &tableName = "" ); + virtual bool Last(const QString &tableName = "" ); + +public slots: + virtual QString Uid(); + virtual bool IsSelected(); + virtual bool IsMarkDeleted( const QString & tname = "" ); + virtual bool IsMarked(); +// virtual int TableSetMarkDeleted( bool Deleted, const QString & tablename = "" );//depricated + virtual int SetMarkDeleted( bool Deleted, const QString & tablename = "" ); + virtual int SetMarked( bool Marked ); + +// virtual aObject *GetAttrib( const QString & AttribName ); +// virtual void SetAttrib( const QString & AttribName, const *aObject ); + + virtual int New(); + virtual int Copy(); + virtual int Delete(); + virtual int Update(); + virtual int Conduct(); + virtual int UnConduct(); + virtual bool IsConducted(); + virtual QString Kind( const QString & name = QString::null ); +// virtual ERR_Code Select( QString num ){return err_incorrecttype;}; +// virtual ERR_Code Select( QDateTime from, QDateTime to, QString mdName){return err_incorrecttype;}; +// virtual ERR_Code Select( aObject* ){return err_incorrecttype;}; + + virtual QVariant Value( const QString & name, const QString &tableName = "" ); + virtual int SetValue( const QString & name, const QVariant &value, const QString &tableName = "" ); + + virtual QVariant sysValue( const QString & name, const QString &tableName = "" ); + virtual int setSysValue( const QString & name, QVariant value, const QString &tableName = "" ); + +// virtual bool Next(); +// virtual bool Prev(); +// virtual bool First(); +// virtual bool Last(); + + virtual int SetFilter( const QString & valname, const QVariant & value ); + virtual int ClearFilter(); + virtual int TableSetFilter( const QString & tname, const QString & valname, const QVariant & value ); + virtual int TableClearFilter( const QString & tname ); + virtual bool IsFiltred() {return filtred;}; + virtual int TableUpdate( const QString & tablename ); + virtual QString displayString(); + +protected: + bool concrete; + virtual aCfgItem displayStringContext(); +// Q_ULLONG lastUid; + virtual ERR_Code setObject( aCfgItem newobject ); +// virtual ERR_Code initObject( aDatabase *adb ); + virtual ERR_Code initObject(); + bool isInited() { return vInited; }; + void setInited( bool flag ){ vInited = flag; }; + ERR_Code tableInsert( const QString &dbname, aCfgItem obj, const QString &name = "" ); + ERR_Code tableInsert( const QString &dbname, const QString &name = "" ); + ERR_Code tableRemove( const QString &name = "" ); + + virtual QVariant tValue( const QString & tablename, const QString & name ); + virtual ERR_Code setTValue(const QString & tablename, const QString & name, const QVariant &value); + virtual QString trSysName( const QString & sname ); +// Q_ULLONG copy(const QString & tablename = ""); + void setSelected( bool sel, const QString & tablename = "" ); + virtual ERR_Code setTFilter( const QString & tname, const QString & valname, const QVariant & value ); + virtual ERR_Code clearTFilter( const QString & tname ); + +private: + bool vInited, selectFlag, filtred; + Q3Dict dbtables; + +// QDict attributes; +}; + + +#endif diff --git a/src/lib/objects/aobjectlist.cpp b/src/lib/objects/aobjectlist.cpp new file mode 100644 index 0000000..cc2d52a --- /dev/null +++ b/src/lib/objects/aobjectlist.cpp @@ -0,0 +1,548 @@ +/**************************************************************************** +** $Id: aobjectlist.cpp,v 1.3 2008/11/09 21:09:11 leader Exp $ +** +** Code file of the Ananas Objects List of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2005-2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include "adatabase.h" +#include "aobjectlist.h" +#include "aform.h" +#include "alog.h" + + +/*! + * \en + * Craeate abstract aObjectListList. + * \param parent - parent object + * \param name - name of object + * \_en + * \ru + * Создает абстрактный не связанный с базой данных объект управления данными. + * Созданный таким образом объект не использует информацию из метаданных о составе и + * типах полей. То есть он не является какой-либо моделью данных. И на самом деле малопригоден + * для использования. В дазе данных ни как не отражается создание этого объекта. Для того, + * что бы зарегистрировать вновь созданный абстрактный объект в базе данных, необходимо + * сначала проинициализировать его с использованием метаданных, а затем вызвать метод New(). + * \_ru + */ +aObjectList::aObjectList( QObject *parent, const char *name ) +:QObject( parent, name ) +{ + db = 0; + vInited = false; + filtred = false; + selectFlag = false; +} + + + +/*! + * \en + * Create aObjectList, inited by md object. + * md object finding by name + * \param oname - md name of object, name contens prefix + * Document. for documents, + * InfoRegister. for information registers, + * Catalogue. for catalogues, + * AccumulationRegister. for Accumulation registers, + * DocJournal. for journals + * \param adb - link on object aDataBase used for work + * \param parent - parent object + * \param name - name of object + * \_en + * \ru + * Создает объект как модель данных, описанную в метаданных. На описание в метаданных + * указывает один из передаваемых при вызове параметров - имя элемента метаданных. + * После успешного создания объекта с ним можно работать как с объектом данных со структурой, + * описанной в метаданных, и индентифицируемой именем, переданным в параметрах вызова. + * + * \_ru + */ +aObjectList::aObjectList( const QString &oname, aDatabase *adb, QObject *parent, const char *name ) +:QObject( parent, name ) +{ + vInited = false; + filtred = false; + selectFlag = false; + db = adb; + if ( adb ) + { + obj = adb->cfg.find( oname ); + setObject( obj ); + } +} + + + +/*! + * Create aObjectList, inited by md object. + * \param context - hi leve md object + * \param adb - link on object aDataBase used for work + * \param parent - parent object + * \param name - name of object + */ +aObjectList::aObjectList( aCfgItem context, aDatabase *adb, QObject *parent, const char *name ) +:QObject( parent, name ) +{ + filtred = false; + vInited = false; + db = adb; + if ( adb ) + { + setObject( context ); + } +} + + + +/*! + * virtual destructor. + */ +aObjectList::~aObjectList() +{ +} + + + +/*! + * Tune on metadata object and it's database tables. + * \param adb - link on database object + * \return error code + */ +ERR_Code +aObjectList::init() +{ + if ( isInited() ) return err_noerror; + return initObject(); +} + + + +/*! + * Set new object type after create + * /param newobject - new md object + * \return error code + */ +ERR_Code +aObjectList::setObject( aCfgItem newobject ) +{ + setInited( false ); + obj = newobject; + return init(); +} + + + +/*! + * Init object after create. + * Need setObject( id ), where id - if of the metadata object of the adb->cfg loaded Configuration. + * \return error code + */ +ERR_Code +aObjectList::initObject() +{ + aCfgItem fg, f; + QString tname; + + setInited( true ); +// db = adb; + md = 0; + if ( db ) md = &db->cfg; + else + { + aLog::print(aLog::Error, tr("aObjectList have no database!")); + return err_nodatabase; + } + if ( obj.isNull() ) + { + aLog::print(aLog::Error, tr("aObjectList md object not found")); + return err_objnotfound; + } + return err_noerror; +} + + + + + +/*! + * Return field value of the primary object database table. + */ +QVariant +aObjectList::Value( const QString & name ) +{ + + aDataTable *t = table; + if ( t ) return t->value( name ); + return QVariant(""); +} + + + +/*! + * Set field value of the primary object database table. + */ +int +aObjectList::SetValue( const QString & name, const QVariant &value ) +{ + aDataTable *t = table; + if ( t ) + { + t->setValue( name, value ); + return err_noerror; + } + return err_notable; +} + + + +/*! + * Check object selecting. + * \return true if object record selected in database. + */ +bool +aObjectList::IsSelected() +{ + return selected(); +} + + + +/*! + * + */ +bool +aObjectList::IsMarkDeleted() +{ + aDataTable *t = table; + if ( t && t->sysFieldExists( "df" ) ) return t->sysValue( "df" ).toInt() == 1; + return false; +} + + + +/*! + * + */ +bool +aObjectList::IsMarked() +{ + aDataTable *t = table; + if ( t && t->sysFieldExists( "mf" ) ) return t->sysValue( "mf" ).toInt() == 1; + return false; +} + + + +/*! + * + */ +int +aObjectList::SetMarkDeleted( bool Deleted ) +{ + aDataTable *t = table; + if ( t && t->sysFieldExists( "df" ) ) + { + QString v = "0"; + if ( Deleted ) v = "1"; + t->setSysValue( "df", QVariant( v ) ); + return err_noerror; + } + else + { + aLog::print(aLog::Error, tr("aObjectList have no system field %1").arg("df")); + return err_incorrecttype; // Object can not be mark deleted + } +} + + + +/*! + * + */ +int +aObjectList::SetMarked( bool Marked ) +{ + aDataTable *t = table; + if ( t && t->sysFieldExists( "mf" ) ) { + QString v = ""; + if ( Marked ) v = "1"; + t->setSysValue( "mf", QVariant( v ) ); +// t->printRecord(); + return err_noerror; + } + aLog::print(aLog::Error, tr("aObjectList have no system field %1").arg("mf")); + return err_incorrecttype; // Object can not be marked +} + + + + + +/*! + * \ru + * Позиционирует указатель в БД на запись, соотвествующую объекту + * с указанным идентификатором. + * \param id - Идентификатор объекта. + * \return возвращает код ошибки или 0 в случае успеха. + * \_ru + */ +ERR_Code +aObjectList::select( qulonglong id ) +{ + aDataTable * t = table; + if ( !t ) return err_notable; + setSelected (false); + long otype = db->uidType( id ); + if ( !otype ) return err_objnotfound; +// if ( concrete && ( otype != t->getMdObjId() ) ) return err_incorrecttype; +// if ( !concrete ) +// { + aCfgItem tmpObj = md->find( otype ); + if ( tmpObj.isNull() ) return err_objnotfound; + setObject ( tmpObj ); +// } + if ( t->select( QString("id=%1").arg(id), false ) ) + if ( t->first() ) + { +// t->primeUpdate(); + setSelected (true); +// t->printRecord(); + return err_noerror; + } + else return err_notselected; + return err_selecterror; +} + + + +/*! + * + */ +ERR_Code +aObjectList::select(const QString & query ) +{ + aDataTable * t = table; + if ( !t ) return err_notable; + if (t->select(query)) + if( t->first() ) + { + setSelected (true); + return err_noerror; + } + else return err_notselected; + return err_selecterror; +} + + + + + +/*! + * + */ +bool +aObjectList::Next() +{ + return table->next(); +} + + + +/*! + * + */ +bool +aObjectList::Prev() +{ + return table->prev(); +} + + + +/*! + * + */ +bool +aObjectList::First() +{ + return table->first(); +} + + + +/*! + * + */ +bool +aObjectList::Last() +{ + return table->last(); +} + +/*! + * \ru + * Возвращает уникальный идентификатор объекта из базы данных. + * В качестве объекта например может выступать "Приходная накладная" от такого-то числа за таким то номером. + * Каждый вновь созданный в системе документ или элемент справочника, включая группы справочника имеет свой уникальный + * неповторяющийся идентификатор. Если какое-либо поле, какого-либо объекта имеет тип Объект (например Document.Накладная), + * то в качестве значения ему нужно задавать уникальный идентификатор объекта, возвращаемый функцией Uid(). + * Не существует возможности изменить существующий идентификатор какого-либо объекта. Созданием и управлением + * идентификаторами объектов занимается система. + * \return строка со значением уникального идентификатора. + * \_ru + */ +QString +aObjectList::Uid() +{ + return QString::number(getUid()); +} + + +/*! + * + */ +qulonglong +aObjectList::getUid() +{ + qulonglong Uid = 0; + if ( selected() ) Uid = table->sysValue("id").toULongLong(); + return Uid; +} + + + +/*! + * + */ +void +aObjectList::setSelected( bool sel ) +{ + selectFlag = sel; +} + + + +/*! + * + */ +bool +aObjectList::selected() +{ + return selectFlag; +} + + + +/*! + * + */ +ERR_Code +aObjectList::SetFilter( const QString & valname, const QVariant & value ) +{ + aDataTable *t = table; + if ( !t ) return err_notable; + if ( t->setFilter( valname, value ) ) return err_noerror; + else return err_fieldnotfound; +} + + + +/*! + * + */ +ERR_Code +aObjectList::ClearFilter() +{ + aDataTable * t = table; + if ( !t ) return err_notable; + t->clearFilter(); + return err_noerror; +} + + + + +/*! + * + */ +QString +aObjectList::displayString() +{ + QString res="***"; + int stdfc = 0, fid; + aCfgItem sw, f; + + sw = displayStringContext(); +// if ( md->objClass( obj ) == md_catalogue ) { +// sw = md->find( md->find( obj, md_element ), md_string_view ); +// } else { +// sw = md->find( obj, md_string_view ); +// } + if ( !sw.isNull() ) { + stdfc = md->attr( sw, mda_stdf ).toInt(); + switch ( stdfc ) { + case 0: + fid = md->sText( sw, md_fieldid ).toInt(); + res = table->sysValue( QString( "uf%1" ).arg( fid ) ).toString(); +//printf("fid=%i res=%s\n",fid, ( const char *) res ); + break; + case 1: + break; + case 2: + break; + } + } + else + { + + aLog::print(aLog::Debug, tr("aObjectList display string context is null")); + } +// res = + return res; +} + + + + +aCfgItem +aObjectList::displayStringContext() +{ + return md->find( obj, md_string_view ); +} + + + +aObject * +aObjectList::currentObject() const +{ + return 0; +} diff --git a/src/lib/objects/aobjectlist.h b/src/lib/objects/aobjectlist.h new file mode 100644 index 0000000..c2bf8a6 --- /dev/null +++ b/src/lib/objects/aobjectlist.h @@ -0,0 +1,112 @@ +/**************************************************************************** +** $Id: aobjectlist.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the Ananas Objects List of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AOBJECTLIST_H +#define AOBJECTLIST_H + +#include +#include "acfg.h" +#include "asqltable.h" + + +class aDatabase; +class aObject; + + +/*! + * \en + * The parent object for hi level not visual objects lists + * for worcs with SQL database + * \_en + * \ru + +* \_ru + */ +class ANANAS_EXPORT aObjectList : public QObject +{ + Q_OBJECT +// Q_PROPERTY( aObject currentObject READ currentObject ) +public: + aCfg * md; + aCfgItem obj; + aDatabase * db; + + aObjectList( QObject *parent = 0, const char *name = 0 ); + aObjectList( const QString &oname, aDatabase *adb, QObject *parent = 0, const char *name = 0 ); + aObjectList( aCfgItem context, aDatabase *adb, QObject *parent = 0, const char *name = 0 ); + virtual ~aObjectList(); + + ERR_Code init(); + ERR_Code decodeDocNum( QString nm, QString & pref, int & num); + virtual ERR_Code select( qulonglong id ); + qulonglong getUid(); + bool selected(); + void setSelected( bool sel ); + ERR_Code select(const QString & query ); + +// virtual Q_ULLONG docId(); + + +public slots: + virtual aObject *currentObject() const; + + virtual QString Uid(); + virtual bool IsSelected(); + virtual bool IsMarkDeleted(); + virtual bool IsMarked(); + virtual int SetMarkDeleted( bool Deleted ); + virtual int SetMarked( bool Marked ); + virtual QVariant Value( const QString & name ); + virtual int SetValue( const QString & name, const QVariant &value ); + + virtual bool Next(); + virtual bool Prev(); + virtual bool First(); + virtual bool Last(); + + virtual int SetFilter( const QString & valname, const QVariant & value ); + virtual int ClearFilter(); + virtual bool IsFiltred() {return filtred;}; + virtual QString displayString(); + +protected: + virtual aCfgItem displayStringContext(); + virtual ERR_Code setObject( aCfgItem newobject ); + virtual ERR_Code initObject(); + bool isInited() { return vInited; }; + void setInited( bool flag ){ vInited = flag; }; +private: + aDataTable *table; + bool vInited, selectFlag, filtred; + Q3Dict dbtables; +// QDict attributes; +}; + + +#endif diff --git a/src/lib/objects/objects.pri b/src/lib/objects/objects.pri new file mode 100644 index 0000000..6474384 --- /dev/null +++ b/src/lib/objects/objects.pri @@ -0,0 +1,17 @@ +HEADERS += \ + objects/aobject.h \ + objects/aaregister.h \ + objects/acatalogue.h \ + objects/adocjournal.h \ + objects/adocument.h \ + objects/airegister.h \ + objects/aobjectlist.h + +SOURCES += \ + objects/aobject.cpp \ + objects/aaregister.cpp \ + objects/acatalogue.cpp \ + objects/adocjournal.cpp \ + objects/adocument.cpp \ + objects/airegister.cpp \ + objects/aobjectlist.cpp diff --git a/src/lib/rclistviewitem.cpp b/src/lib/rclistviewitem.cpp new file mode 100644 index 0000000..3a5a1e3 --- /dev/null +++ b/src/lib/rclistviewitem.cpp @@ -0,0 +1,69 @@ +/**************************************************************************** +** $Id: rclistviewitem.cpp,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Code file of the Ananas select database window +** of Ananas Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include "rclistviewitem.h" +#include "qpixmap.h" + +rcListViewItem::rcListViewItem( Q3ListView *parent, + const QString &name, + const QString &rc, + bool fgroup): Q3ListViewItem( parent, name ) + { + init( rc, fgroup ); + }; + +rcListViewItem::rcListViewItem( Q3ListView *parent, + rcListViewItem* after, + const QString &name, + const QString &rc, + bool fgroup ): Q3ListViewItem( parent, after, name ) + { + init( rc, fgroup ); + }; + +rcListViewItem::rcListViewItem( rcListViewItem *parent, + const QString &name, + const QString &rc, + bool fgroup): Q3ListViewItem( parent, name ) + { + init( rc, fgroup ); + }; + +rcListViewItem::~rcListViewItem() + { +// rcfile = ""; + }; + +void +rcListViewItem::init( const QString &rc, bool fgroup) + { + group = fgroup; + rcfile = rc; + if ( group ) setPixmap(0, QPixmap(":/images/lib_dbgroup.png") ); + else setPixmap(0, QPixmap(":/images/lib_database.png") ); + }; diff --git a/src/lib/rclistviewitem.h b/src/lib/rclistviewitem.h new file mode 100644 index 0000000..8a99709 --- /dev/null +++ b/src/lib/rclistviewitem.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** $Id: rclistviewitem.h,v 1.1 2008/11/05 21:16:28 leader Exp $ +** +** Code file of the Ananas select database window +** of Ananas Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef RCLISTVIEWITEM_H +#define RCLISTVIEWITEM_H + +//#include +//#include +#include +//#include +//#include + +//#include "deditrc.h" +//#include "acfgrc.h" +//#include "atests.h" + +class Q3ListView; +class Q3ListViewItem; + +class rcListViewItem : public Q3ListViewItem +{ +public: + QString rcfile; + bool group; + + rcListViewItem( Q3ListView *parent, + const QString &name = QString::null, + const QString &rc = QString::null, + bool fgroup = false ); + + rcListViewItem( Q3ListView *parent, + rcListViewItem* after, + const QString &name = QString::null, + const QString &rc = QString::null, + bool fgroup = false ); + + rcListViewItem( rcListViewItem *parent, + const QString &name = QString::null, + const QString &rc = QString::null, + bool fgroup = false ); + + virtual ~rcListViewItem(); + void init( const QString &rc = QString::null, bool fgroup = false ); +}; +#endif + diff --git a/src/lib/report/acalctemplate.cpp b/src/lib/report/acalctemplate.cpp new file mode 100644 index 0000000..393cbc6 --- /dev/null +++ b/src/lib/report/acalctemplate.cpp @@ -0,0 +1,151 @@ +/**************************************************************************** +** $Id: acalctemplate.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20050202 +** +** Copyright (C) 2003 by HaPK, email : theHaPK@yandex.ru +** Copyright (C) 2003-2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "acalctemplate.h" +#include "alog.h" + +#include +#include + + +aCalcTemplate::aCalcTemplate() : aOOTemplate() +{ + +} + +aCalcTemplate::~aCalcTemplate() +{ +} + + +/** + * \~english + * Return true, if node contain tag + * \~russian + * Возвращает истину, когда текст ноды содержит тег с заданным именем. + * \~ + * \param node - \~english context for searching \~russian узел, с которого осуществляется поиск. \~ + * \param sname - \~english tag name \~russian имя тега для поиска \~ + * \param params - \~english true, if find simple tag and false, if section + * \~russian true, если ищется обычный тег и false, если ищется тег секции \~ + */ +bool +aCalcTemplate::getNodeTags(QDomNode node, const QString &tagname, bool params ) +{ + if(node.isText()) + { + QString str = node.nodeValue(); + QRegExp re; + // printf("n->text=%s\n",str.ascii()); + if(params) + { + re.setPattern(QString("%1.*%2").arg(open_token).arg(close_token)); + } + else + { + re.setPattern(QString("%1.*%2").arg(open_token_section).arg(close_token_section)); + } + re.setMinimal(true); + int pos = re.search(str,0); + + while(pos != -1) + { + // printf("find string =%s\n",str.mid(pos+2, re.matchedLength()-4).ascii()); + if(tagname == str.mid(pos+2, re.matchedLength()-4)) + { + // printf(">>>>>>>>>ok!\n"); + return true; + } + pos+= re.matchedLength(); + pos = re.search(str,pos); + } + + } + return false; +} + + + +QDomNode +aCalcTemplate::getCellNode(QDomNode node) +{ + while(!node.parentNode().isNull()) + { + QDomNode parent = node.parentNode(); + if(parent.nodeName() == "table:table-cell") + { + return parent; + } + else + { + return getCellNode(parent); + } + } +} + + /** + * \~english + * Addes to tag value of parametr \a tagName + * \~russian + * Добавляет к тегу значение параметра \a tagName. После вызова этой функции тег не исчезает, + * и к нему можно добавить еще значения, которые добавятся к концу текста, содержащего тег. + * \~ + * \param node - \~english context \~russian узел к которому добавляется значение \~ + * \param sname - \~english tag name \~russian имя тега \~ + */ +void +aCalcTemplate::insertTagsValues(QDomNode node, const QString &tagName) +{ + QDomNode n = node; + QString val = getValue(tagName); + bool ok; + val.toDouble(&ok); + if(ok) + { + aLog::print(aLog::Debug, QString("aCalcTemplate append double value %1 to tag").arg(val)); + QDomNode cellNode = getCellNode(n); + if(!cellNode.isNull()) + { + cellNode.toElement().setAttribute("office:value-type", "float"); + cellNode.toElement().setAttribute("office:value", val); + } + else + { + aLog::print(aLog::Error, "aCalcTemplate cell not found\n"); + } + } + else + { + aLog::print(aLog::Debug, "aCalcTemplate append string value to tag\n"); + } + n.setNodeValue(n.nodeValue()+getValue(tagName)); +} + + diff --git a/src/lib/report/acalctemplate.h b/src/lib/report/acalctemplate.h new file mode 100644 index 0000000..0b43acd --- /dev/null +++ b/src/lib/report/acalctemplate.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** $Id: acalctemplate.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20050202 +** +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef ACALCTEMPLATE_H +#define ACALCTEMPLATE_H + +#include +#include +#include +#include + +#include "ananasglobal.h" +#include "aootemplate.h" + +/** + * \en + * Class for work with pattern in OpenOffice Calc format + * \_en + * \ru + * \brief Класс определяет интерфейс для работы с шаблонами в формате OpenOffice Calc. + * \_ru + */ +class ANANAS_EXPORT aCalcTemplate : public aOOTemplate +{ +public: + aCalcTemplate(); + virtual ~aCalcTemplate(); +protected: + virtual bool getNodeTags(QDomNode node, const QString &tagname, bool params ); + virtual void insertTagsValues(QDomNode node, const QString &tagName); + QDomNode getCellNode(QDomNode node); +}; +#endif // ACALCTEMPLATE_H diff --git a/src/lib/report/aootemplate.cpp b/src/lib/report/aootemplate.cpp new file mode 100644 index 0000000..b42ac6d --- /dev/null +++ b/src/lib/report/aootemplate.cpp @@ -0,0 +1,645 @@ +/**************************************************************************** +** $Id: aootemplate.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20050202 +** +** Copyright (C) 2003 by HaPK, email : theHaPK@yandex.ru +** Copyright (C) 2003-2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "aootemplate.h" +#include "alog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +aOOTemplate::aOOTemplate() : iTemplate() +{ + +} + +aOOTemplate::~aOOTemplate() +{ +} + +/** + * \en + * Open pattern. + * \_en + * \ru + * Открывает шаблон. Распаковывает его во временный каталог в директории /tmp + * \_ru + * \param fname \ru имя шаблона\_ru + */ +bool +aOOTemplate::open( const QString &fname ) +{ + QDir dir; + QString temp; + +#ifndef Q_OS_WIN32 + temp = getenv("TMPDIR"); + if(temp=="" || temp.isEmpty()) + temp = P_tmpdir; +#else + temp = getenv("TEMP"); +#endif + copyName = QString(temp+"/%1").arg(QDateTime::currentDateTime().toTime_t()); + copyName = QDir::convertSeparators(copyName); + aLog::print(aLog::Debug, tr("aOOTemplate temporary directory is %1").arg(copyName)); +// printf("copy name = %s\n",copyName.ascii()); + if(!dir.mkdir(copyName)) + { + aLog::print(aLog::Error, tr("aOOTemplate create temporary directory %1").arg(copyName)); + return false; + } + else + { + aLog::print(aLog::Debug, tr("aOOTemplate create temporary directory %1").arg(copyName)); + } +#ifndef Q_OS_WIN32 + Q3Process process( QString("unzip") ); + process.setWorkingDirectory (templateDir); + process.addArgument( fname ); + process.addArgument( "-d" ); + process.addArgument( copyName ); + +#else + Q3Process process( QString("7z") ); + process.setWorkingDirectory ( templateDir); + //printf("working dir = `%s'\n", QString(templateDir).ascii()); + process.addArgument( "x" ); + process.addArgument( "-y" ); + process.addArgument( QString("-o%1").arg(copyName) ); + process.addArgument( fname ); + +#endif + + if( !process.start() ) + { + aLog::print(aLog::Error, tr("aOOTemplate start unzip")); + return false; + } + + while( process.isRunning() ); + + if( !process.normalExit() ) + { + aLog::print(aLog::Error, tr("aOOTemplate unzip dead")); + return false; + } + else + { + aLog::print(aLog::Debug, tr("aOOTemplate unzip normal")); + } + if( process.exitStatus() ) + { + return false; + } + + QFile content (QDir::convertSeparators( copyName+"/content.xml") ); + docTpl.setContent( &content, false ); + + QFile style (QDir::convertSeparators( copyName+"/styles.xml") ); + docStyle.setContent( &style, false ); + + aLog::print(aLog::Info, tr("aOOTemplate open")); +return true; +} +/** + * \en + * Closes pattern. Deletes temporary files. + * \_en + * + * \ru + * Закрывает шаблон. Удаляет временные файлы. + * \_ru + */ +void +aOOTemplate::close() +{ + values.clear(); + // QDir dir; + docTpl.clear(); + docStyle.clear(); +#ifndef Q_OS_WIN32 + system( "rm -Rf "+copyName); +#else + system( "rd /S /Q \""+copyName+"\""); +#endif + QDir dir; + dir.rmdir(copyName); + +} +/** + * \en + * clears internal variable. + * \_en + * \ru + * Обнуляет внутренние переменные. + * \_ru + */ +void +aOOTemplate::clear() +{ + values.clear(); +// cleanUpTags(); +} +/** + * \en + * Returns value parameter `name` + * \_en + * \ru + * Возвращает значение параметра по его имени. + * \_ru + */ +QString +aOOTemplate::getValue( const QString &name ) +{ + if(values.find( name )!=values.end()) + { + return values.find( name ).data(); + } + else + { + aLog::print(aLog::Info, tr("aOOTemplate value for field %1 not setted").arg(name)); + return ""; + } +} + +/** + * \en + * Sets value parameter `name' + * \_en + * \ru + * Устанавливает значение параметра по его имени. + * \_ru + */ +void +aOOTemplate::setValue( const QString &name, const QString &value ) +{ + values[name]=value; +} +/** + * \en + * Execute replace tags to values. + * \_en + * \ru + * Выполняет подстановку значения параметра в шаблоне. + * Есть 2 типа тегов + * \arg обычные теги + * \arg секции - могут находиться ТОЛЬКО в строках таблицы. + + * Для подстановки значений обычных тегов необходимо выполнить setValue() где name = PARAM (сейчас #define PARAM "param") а value - значение для подстановки. Потом выполнить exec() с параметром = имени тега. + * Для подстановки секций необходимо задать нужные параметры, используя setValue() + * а потом выполнить exec() с именем секции. + * exec может вызываться нужное число раз как для обычных тегов, так и для секций + * \_ru + */ +QString +aOOTemplate::exec( const QString &sname ) +{ + setValue(sname, getValue(PARAM)); + //search tags in content + QDomNode n = docTpl.lastChild(); + while( !n.isNull() ) + { + searchTags(n, sname); + n = n.previousSibling(); + } + //search tags in colontituls + n = docStyle.lastChild(); + while( !n.isNull() ) + { + searchTags(n, sname); + n = n.previousSibling(); + } + return docTpl.toString(); + +} +/** + * \~english + * Added value to end tag with name `sname'. Don't deletes tag. + * \~russian + * Рекурсивная функция поиска и замены тегов на их значения в node. + * Не заменяет теги, а дописывает значения в конец. + * Для удаления тэгов используйте функцию cleanUpTags() + * \~ + * \param node - \~english context for searching \~russian узел, с которого осуществляется поиск. \~ + * \param sname - \~english tag name \~russian имя тега для поиска \~ + * \see cleanUpTags() getNodeTags() insertRowValues() + */ +void +aOOTemplate::searchTags(QDomNode node, const QString &sname ) +{ +QDomNode n = node.lastChild(); + while( !n.isNull() ) + { + + // printf("n->name=%s\n",n.nodeName().ascii()); + bool res = getNodeTags(n, sname, false); + if( res ) + { + insertRowValues(n); + } + else + { + res = getNodeTags(n, sname, true); + if(res) + { + insertTagsValues(n, sname); + } + else + { + searchTags(n, sname); + } + } + n = n.previousSibling(); + } +} +/** + * \~english + * Return true, if node contain tag + * \~russian + * Возвращает истину, когда текст ноды содержит тег с заданным именем. + * \~ + * \param node - \~english context for searching \~russian узел, с которого осуществляется поиск. \~ + * \param sname - \~english tag name \~russian имя тега для поиска \~ + * \param params - \~english true, if find simple tag and false, if section + * \~russian true, если ищется обычный тег и false, если ищется тег секции \~ + */ +bool +aOOTemplate::getNodeTags(QDomNode node, const QString &tagname, bool params ) +{ + if(node.isText()) + { + QString str = node.nodeValue(); + QRegExp re; + // printf("n->text=%s\n",str.ascii()); + if(params) + { + re.setPattern(QString("%1.*%2").arg(open_token).arg(close_token)); + } + else + { + re.setPattern(QString("%1.*%2").arg(open_token_section).arg(close_token_section)); + } + re.setMinimal(true); + int pos = re.search(str,0); + + while(pos != -1) + { + // printf("find string =%s\n",str.mid(pos+2, re.matchedLength()-4).ascii()); + if(tagname == str.mid(pos+2, re.matchedLength()-4)) + { + // printf(">>>>>>>>>ok!\n"); + return true; + } + pos+= re.matchedLength(); + pos = re.search(str,pos); + } + + } + return false; +} + +/** + * \~english + * insert new row in table and replace tag to value + * \~russian + * Вставляет новую строку в таблицу, заменяет теги на значения, удаляет тег секции из строки таблицы. + * Выполняет рекурсивный поиск узла, содержащего строку таблицы. У этого узла в OpenOffic'е есть + * специальное имя, которое распознается функцией. После того, как узел найден, строка строка дублируется, + * а из текущей строки удаляются все теги секции, чтобы избежать мнократного размножения строк таблицы. + * \~ + * \see searchTags() + */ +void +aOOTemplate::insertRowValues(QDomNode node) +{ + QDomNode n = node; + while(!n.parentNode().isNull()) + { + n = n.parentNode(); + if( n.nodeName()=="table:table-row" ) + { + n.parentNode().insertAfter(n.cloneNode(true),n); + clearTags(n,true); + QMap::Iterator it; + for ( it = values.begin(); it != values.end(); ++it ) + { + searchTags(n,it.key()); + } + + } + } +} + + + /** + * \~english + * Addes to tag value of parametr \a tagName + * \~russian + * Добавляет к тегу значение параметра \a tagName. После вызова этой функции тег не исчезает, + * и к нему можно добавить еще значения, которые добавятся к концу текста, содержащего тег. + * \~ + * \param node - \~english context \~russian узел к которому добавляется значение \~ + * \param sname - \~english tag name \~russian имя тега \~ + */ +void +aOOTemplate::insertTagsValues(QDomNode node, const QString &tagName) +{ + QDomNode n = node; + n.setNodeValue(n.nodeValue()+getValue(tagName)); +} + +/** + * \en + * clears all tags from pattern + * \_en + * \ru + * Удаляет все теги из документа, а также строки, в которых содержится тег секции + * \_ru + */ +void +aOOTemplate::cleanUpTags() +{ + + //clear tags in content + QDomNode n = docTpl.lastChild(); + while( !n.isNull() ) + { + clearTags(n,false); + // clearRow(n); + n = n.previousSibling(); + } + n = docTpl.lastChild(); + while( !n.isNull() ) + { + // clearTags(n,false); + clearRow(n); + n = n.previousSibling(); + } + + //clear tags in colontituls + n = docStyle.lastChild(); + while( !n.isNull() ) + { + clearTags(n,false); + // clearRow(n); + n = n.previousSibling(); + } + n = docStyle.lastChild(); + while( !n.isNull() ) + { + // clearTags(n,false); + clearRow(n); + n = n.previousSibling(); + } +} + + + + /** + * \~english + * Deletes tags from \a node + * \~russian + * Удаляет рекурсивно теги из \a node. + * \~ + * \param node - \~english context \~russian узел из которого нужно удалить теги \~ + * \param section - \~russian true, если надо удалить тег секции \~ + */ +void +aOOTemplate::clearTags(QDomNode node, bool section ) +{ + if(node.isNull()) return; + + QDomNode n = node.lastChild(); + while( !n.isNull() ) + { + if(n.isText()) + { + QString str = n.nodeValue(); + QRegExp re; + // printf("n->text tag = %s\n",str.ascii()); + if(section) + { + re.setPattern(QString("%1.*%2").arg(open_token_section).arg(close_token_section)); + } + else + { + re.setPattern(QString("%1.*%2").arg(open_token).arg(close_token)); + } + re.setMinimal(true); + int pos = re.search(str,0); + + while(pos != -1) + { + str = str.remove(re); + //printf("str = %s\n",str.ascii()); + pos = re.search(str,0); + } + n.setNodeValue(str); + + } + else + { + clearTags(n,section); + } + n = n.previousSibling(); + } + +} + +/** + * \~english + * Deletes row, having section tag + * \~russian + * Рекурсивная функция. Удаляет строки, содержащие тег секции + * \~ +* \param node - \~english context \~russian узел из которого нужно удалить строки \~ + */ +void +aOOTemplate::clearRow(QDomNode node) +{ +QDomNode n = node.lastChild(); + while( !n.isNull() ) + { + if(n.isText()) + { + QString str = n.nodeValue(); + QRegExp re; + //printf("n->text row=%s\n",str.ascii()); + re.setPattern(QString("%1.*%2").arg(open_token_section).arg(close_token_section)); + re.setMinimal(true); + int pos = re.search(str,0); + if(pos!=-1) + { + // printf(">>>find string =%s\n",str.ascii()); + QDomNode tmp = n; + while(!tmp.parentNode().isNull()) + { + tmp = tmp.parentNode(); + if( tmp.nodeName()=="table:table-row" ) + { + // printf("row removed\n"); + tmp.parentNode().removeChild(tmp); + break; + } + } + } + //n.setNodeValue(str); + + } + else + { + //clearTags(n); + clearRow(n); + } + n = n.previousSibling(); + } + +} +/** + * \en + * Returns patten + * \_en + * \ru + * Возвращает результат, т.е. шаблон в текстовом виде. Включена в интерфейс временно. + * \_ru + */ +QString +aOOTemplate::result() +{ + return docTpl.toString(); +} +/** + * \en + * Save pattern + * \_en + * \ru + * Сохраняет шаблон в файл с заданным именем. Перед сохранением необходимо выполнить функцию cleanUpTags() чтобы удалить тэги из сохраняемого документа. + * \_ru + */ +bool +aOOTemplate::save( const QString & fname ) +{ + + QString homeDir = QString("%1").arg(QDir::convertSeparators(QDir::homeDirPath ())); + QFile fContent( QDir::convertSeparators(copyName+"/content.xml") ); + if( !fContent.open( QIODevice::WriteOnly ) ) + { + aLog::print(aLog::Error, tr("aOOTemplate save %1 open for write").arg(fContent.name())); + return false; + } + QTextStream stream4content(&fContent); + docTpl.save(stream4content,2); + fContent.close(); + + QFile fStyle( QDir::convertSeparators(copyName+"/styles.xml") ); + if( !fStyle.open( QIODevice::WriteOnly ) ) + { + aLog::print(aLog::Error, tr("aOOTemplate save %1 open for write").arg(fContent.name())); + return false; + } + QTextStream stream4styles(&fStyle); + docStyle.save(stream4styles,2); + fStyle.close(); + + + + QString curDir;// = QDir::convertSeparators(QDir::irPath()); + curDir = QDir::convertSeparators(templateDir); + aLog::print(aLog::Debug, tr("aOOTemplate save working dir =%1").arg(curDir)); + +#ifndef Q_OS_WIN32 + + Q3Process process( QString("zip") ); + process.setWorkingDirectory(copyName); + process.addArgument( "-r" ); + process.addArgument( fname ); + process.addArgument("."); +#else + Q3Process process( QString("7z") ); + process.setWorkingDirectory(copyName); + process.addArgument( "a" ); + process.addArgument( "-tzip" ); + process.addArgument( fname ); + process.addArgument( "-r" ); + process.addArgument("."); +#endif + + + + if( !process.start() ) + { + aLog::print(aLog::Error, tr("aOOTemplate start zip")); + return false; + } + + while( process.isRunning() ); + + if( !process.normalExit() ) + { + aLog::print(aLog::Error, tr("aOOTemplate zip dead")); + return false; + } + else + { + aLog::print(aLog::Debug, tr("aOOTemplate zip normal to %1").arg(fname)); + } + if( process.exitStatus() ) + { + return false; + } + return true; +} +void +aOOTemplate::setDir(const QString &dir) +{ + templateDir = dir; +} + +QString +aOOTemplate::getDir() +{ + QString homeDir = QString("%1").arg(QDir::convertSeparators(QDir::homeDirPath ())); +#ifdef Q_OS_WIN32 + if(homeDir.right(1)!="\\") homeDir.append("\\"); +#else + + if(homeDir.right(1)!="/") homeDir.append("/"); +#endif + return QDir::convertSeparators(homeDir); +} + diff --git a/src/lib/report/aootemplate.h b/src/lib/report/aootemplate.h new file mode 100644 index 0000000..3a83ce9 --- /dev/null +++ b/src/lib/report/aootemplate.h @@ -0,0 +1,146 @@ +/**************************************************************************** +** $Id: aootemplate.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20050202 +** +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef AOOTEMPLATE_H +#define AOOTEMPLATE_H + +#include +#include +#include +#include +#include + +#define open_token "<:" +#define close_token ":>" +#define open_token_section "\\[:" +#define close_token_section ":\\]" +#define PARAM "param" + +#include "ananasglobal.h" +#include "itemplate.h" + +/** + * \en + * Class for work with pattern in OpenOffice format + * \_en + * \ru + * \brief Класс определяет интерфейс для работы с шаблонами в формате OpenOffice. Наследует iTemplate. + * + * Описание шаблона: \n + * Шаблон представляет собой обычный документ OpenOffice. + * Он предназначен для того, чтобы быстро создавать отчеты. + * Внешне шаблон отличается от того документа, который необходимо сгенерировать + * только наличием специальных тегов. + * Эти теги при генерации заменяются на конкретные значения. \n + * Предусмотрено два типа тегов: \n + * 1) Тег секции \n + * С помощью него можно размножать строки таблицы. + * Для этого надо просто записать его в любую ячейку строки. \n + * Формат тега [:имя тега:] \n + * В имени допустимы любые символы. \n + * При вызове exec() с параметром = имени этого тега к таблице будет добавлена еще + * одна строка. Если в этой строке есть простые теги, + * то произойдет замена тега на значение, заданное с помощью функции setValue() \n + * 2) Простой тег. \n + * С помощью него можно вставлять в документ обычный текст, дату, и т.п. \n + * формат тега <:имя тега:> \n + * При вызове exec() с параметром = имени этого тега, рядом допишется значение, + * предварительно заданное с помощью функции setValue() \n + * Функция setValue() задает значения для подстановки. + * Для прстых тегов надо задавать setValue("param",значение для подстановки); + * после чего надо выполнить exec(имя простого тега) \n + * Для тегов секции setValue(имя простого тега, значение для подстановки); + * после чего выполнить exec(имя секции); + * \_ru + */ +class ANANAS_EXPORT aOOTemplate : public iTemplate +{ +public: + aOOTemplate(); + virtual ~aOOTemplate(); + virtual bool open( const QString &fname ); + virtual void close(); + virtual void clear(); + virtual QString getValue( const QString &name ); + virtual void setValue( const QString &name, const QString &value ); + virtual QString exec( const QString &sname ); + virtual QString result(); + virtual bool save( const QString & fname ); + virtual void setDir( const QString &dirName ); + virtual QString getDir(); + virtual void cleanUpTags(); +protected: +/** + * \en + * directory name for unzip + * \_en + * \ru + * Имя директории для распаковки + * \_ru + */ + QString copyName; + protected: +/** + * \en + * directory template name + * \_en + * \ru + * Имя директории шаблонов + * \_ru + */ + QString templateDir; + + QMap values; + + void searchTags(QDomNode node, const QString &sname ); + virtual bool getNodeTags(QDomNode node, const QString &tagname, bool params ); + void insertRowValues(QDomNode node); + virtual void insertTagsValues(QDomNode node, const QString &tagName); + void clearTags(QDomNode node, bool section ); + void clearRow(QDomNode node); +/** + * \en + * Variable for store unpacking teplate content + * \_en + * \ru + * Переменная для хранения содержимого распакованного шаблона. + * \_ru + */ + QDomDocument docTpl; + +/** + * \en + * Variable for store unpacking teplate stales + * \_en + * \ru + * Переменная для хранения стилей (колонтитулы в т.ч.) распакованного шаблона. + * \_ru + */ + QDomDocument docStyle; +}; +#endif // AOOTEMPLATE_H diff --git a/src/lib/report/areport.cpp b/src/lib/report/areport.cpp new file mode 100644 index 0000000..9216c61 --- /dev/null +++ b/src/lib/report/areport.cpp @@ -0,0 +1,574 @@ +/**************************************************************************** +** $Id: areport.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Report metadata object implementation file of +** Ananas application library +** +** Created : 20040701 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include "acfg.h" +#include "aobject.h" +#include "adatabase.h" +#include "areport.h" +#include "acalctemplate.h" +#include "aservice.h" +#include "alog.h" +#include "stdlib.h" +/*! +* \en +* Constuct object +* \_en +* \ru +* Создает объект +* \_ru +*/ +aReportBrowser::aReportBrowser( QWidget *parent, const char *name, Qt::WFlags f ) +:Q3MainWindow( parent, name, f ) +{ + QAction *a; + + Q3ToolBar *t = new Q3ToolBar( this, "ReportTool" ); + a = new QAction( + //QPixmap::fromMimeSource("print.png"), + QPixmap(":/images/print.png"), + tr("Print"), + QKeySequence("Ctrl+P"), + t, + tr("Print report") + ); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( print() ) ); + t->show(); + + textBrowser = new Q3TextBrowser( this, "textBrowser" ); + textBrowser->setTextFormat( Qt::RichText ); + textBrowser->setFocus(); +// textBrowser->showMaximized(); + setCentralWidget( textBrowser ); +// if ( layout() ) delete layout(); +// QGridLayout *l = new QGridLayout( this ); +// l->addWidget( textBrowser, 1, 0 ); + languageChange(); +} + + + +/*! +* \en +* Appends text to browser. +* \_en +* \ru +* Добавляет текст в браузер +* \_ru +* \param text - \en text to append \_en \ru текст для добавления \_ru +*/ +void +aReportBrowser::append( const QString &text ) +{ + textBrowser->append( text ); +} + + + +/*! +* \en +* Clears browser. +* \_en +* \ru +* Очищает браузер +* \_ru +*/ +void +aReportBrowser::clear() +{ + textBrowser->clear(); +} + + + +/*! +* \en +* Print browser content. +* \_en +* \ru +* Печатает содержимое браузера. +* \_ru +*/ +void +aReportBrowser::print() +{ + QPrinter printer; + QPainter p; + + if (!printer.setup()) return; + if ( p.begin( &printer ) ){ + Q3PaintDeviceMetrics metrics( p.device() ); + int dpiy = metrics.logicalDpiY(); + int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins + QRect body( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); + Q3SimpleRichText richText( textBrowser->text(), + QFont(), + textBrowser->context(), + textBrowser->styleSheet(), + textBrowser->mimeSourceFactory(), + body.height() ); + richText.setWidth( &p, body.width() ); + QRect view( body ); + int page = 1; + do { + richText.draw( &p, body.left(), body.top(), view, colorGroup() ); + view.moveBy( 0, body.height() ); + p.translate( 0 , -body.height() ); + p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ), + view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) ); + if ( view.top() >= richText.height() ) + break; + printer.newPage(); + page++; + } while (TRUE); + } +} + + + +/**! + * Sets the strings of the subwidgets using the current + * language. + */ +void aReportBrowser::languageChange() +{ +} + + + +/*! +* \en +* Constuct object +* \_en +* \ru +* Создает объект +* \param context - объект метаданных для инициализации. +* \param report_type - тип отчета. RT_text - для отчета в формате HTML, RT_office - для отчета в формате OpenOffice +* \param e - енжин. +* \_ru +*/ +aReport::aReport( aCfgItem context, RT_type report_type, aEngine * e ) +:aObject( context, 0, 0, "aReport") +{ + engine = e; + md = e->md; + browser = new aReportBrowser( e->ws ); + type = report_type; + if(report_type==RT_text) + { + tpl = new aTemplate(); + } + if(report_type == RT_office_writer) + { + tpl = new aOOTemplate(); + } + if(report_type==RT_office_calc) + { + tpl = new aCalcTemplate(); + } +} + + + +/*! +* \en +* Constuct object +* \_en +* \ru +* Создает объект +* \param name - имя объекта. +* \param report_type - тип отчета. RT_text - для отчета в формате HTML, RT_office - для отчета в формате OpenOffice +* \param e - енжин. +* \_ru +*/ +aReport::aReport(QString name, RT_type report_type, aEngine * e ) +:aObject( name, 0, 0, "aReport") +{ + engine = e; + md = e->md; + browser = new aReportBrowser( e->ws ); + type = report_type; + if(report_type==RT_text) + { + tpl = new aTemplate(); + } + if(report_type == RT_office_writer) + { + tpl = new aOOTemplate(); + } + if(report_type == RT_office_calc) + { + tpl = new aCalcTemplate(); + } +} + + + +/*! +* \en +* Destructor +* \_en +* \ru +* Деструктор +* \_ru +*/ +aReport::~aReport() +{ + if(tpl) + { + delete tpl; + tpl=0; + } +} + + + +/*! +* \en +* Init object. +* \_en +* \ru +* Инициализирует объект. Объект не содержит никаких таблиц в базе данных. +* \_ru +*/ +ERR_Code +aReport::initObject() +{ + ERR_Code err = aObject::initObject(); + if ( err ) return err; + return err_noerror; +} + + + +/*! +* \en +* Set template. +* \_en +* \ru +* Задает имя файла шаблона. Расширение указывать необходимо. +* \_ru +* \param name - \en template name \_en \ru имя шаблона \_ru +* \see path2workdir() +*/ +void +aReport::setTable( const QString &name ) +{ + tpl->setDir(path2workdir()); + tpl->open( name ); + tplName = name; +} + + + +/*! +* \en +* Sets tag value. +* \_en +* \ru +* Задает значение тега. +* \_ru +* \param name - \en tag name \_en \ru имя тега \_ru +* \param value - \en tag value \_en \ru значение тега \_ru +*/ +void +aReport::setValue( const QString &name, const QString &value ) +{ + tpl->setValue( name, value ); +} + + + +/*! +* \en +* Gets tag value. +* \_en +* \ru +* Возвращает значение тега. +* \_ru +* \param name - \en tag name \_en \ru имя тега \_ru +* \return \en tag value \_en \ru значение тега \_ru +*/ +QString +aReport::value( const QString &name ) +{ + return tpl->getValue( name ); +} + + + +/*! +* \en +* Clear browser content. +* \_en +* \ru +* Очищает содержимое браузра. Используется для текстово отчета. +* \_ru +*/ +void +aReport::clear() +{ + browser->clear(); +} + + + +/*! +* \en +* Update report value. +* \_en +* \ru +* Обновляет репорт на основе заданных перед этим функцией setValue() значений. +* \_ru +*/ +void +aReport::exec( const QString §ion ) +{ + tpl->exec( section ); +} + + + +/*! +* \en +* Shows report. +* \_en +* \ru +* Показывает отчет. +* \_ru +*/ +void +aReport::show() +{ + if(type==RT_text) + { + browser->textBrowser->setText( tpl->result() ); + browser->show(); + } + if(type==RT_office_writer || type==RT_office_calc) + { + QString fileName = getName4NewTemplate(); + tpl->cleanUpTags(); + tpl->save(fileName); + QString startCatalog = "/usr/bin"; + QString filter; + bool sofficeFound = false; + + bool ok; + QString oowriter = aService::readConfigVariable("OpenOfficeExecutable", &ok); + if(!ok || oowriter == "" ) + { +#ifdef Q_OS_WIN32 + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable not found in registery")); + startCatalog = QString("%1\\Program Files\\OpenOffice.org1.1.1\\program").arg(getenv("HOMEDRIVE")); + QFile soffice(startCatalog + "\\soffice.exe"); + if(!soffice.exists()) + { + startCatalog = QString("%1\\Program Files\\OpenOffice.org 2.0\\program").arg(getenv("HOMEDRIVE")); + soffice.setName(startCatalog + "\\soffice.exe"); + if(!soffice.exists()) + { + startCatalog = QString("%1\\Program Files").arg(getenv("HOMEDRIVE")); + } + else + { + aService::writeConfigVariable("OpenOfficeExecutable",startCatalog + "\\soffice.exe"); + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable found %1").arg(startCatalog + "\\soffice.exe")); + } + } + else + { + aService::writeConfigVariable("OpenOfficeExecutable",startCatalog + "\\soffice.exe"); + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable found %1").arg(startCatalog + "\\soffice.exe")); + } + filter = "Executable files (*.exe)"; +#else + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable not found in ~/.ananas/configrc")); + QFile soffice(startCatalog + "/ooffice"); + if(!soffice.exists()) + { + soffice.setName(startCatalog + "/ooffice2"); + if(soffice.exists()) + { + aService::writeConfigVariable("OpenOfficeExecutable",startCatalog + "/ooffice2"); + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable found %1").arg(startCatalog + "/ooffice2")); + } + } + else + { + aService::writeConfigVariable("OpenOfficeExecutable",startCatalog + "/ooffice"); + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable found %1").arg(startCatalog + "/ooffice")); + } +#endif + } + oowriter = aService::readConfigVariable("OpenOfficeExecutable", &ok); + if(!ok || oowriter == "" ) + { + + Q3FileDialog dlg(0,"select_file_dialog",true); + dlg.addFilter( filter ); + dlg.setMode(Q3FileDialog::ExistingFile); + dlg.setDir(QDir(startCatalog)); + dlg.setCaption("Для отображения отчета необходим OpenOffice. Укажите исполняемый файл OpenOffice"); + if(dlg.exec()==QDialog::Accepted) + { + oowriter = dlg.selectedFile(); + //printf("select %s", oowriter.ascii()); + Q3Process process( oowriter ); + process.addArgument( "-n" ); + process.addArgument( QDir::convertSeparators( fileName ) ); + if( !process.start() ) + { + QMessageBox::warning(0, tr("Warning"), tr("Unable to start OpenOffice (%1)").arg(oowriter), QMessageBox::Ok,QMessageBox::NoButton); +// printf("Unable to start OpenOffice Writer\n"); + } + else + { + aService::writeConfigVariable("OpenOfficeExecutable",oowriter); + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable set to %1").arg(oowriter)); + } + } + } + else + { + + Q3Process process( oowriter ); + process.addArgument( "-n" ); + process.addArgument( QDir::convertSeparators( fileName ) ); + if( !process.start() ) + { + QMessageBox::warning(0, tr("Warning"), tr("Unable to start OpenOffice (%1)").arg(oowriter), QMessageBox::Ok,QMessageBox::NoButton); +// printf("Unable to start OpenOffice Writer\n"); + } + else + { + aService::writeConfigVariable("OpenOfficeExecutable",oowriter); + aLog::print(aLog::Info,tr("aReport OpenOfficeExecutable set to %1").arg(oowriter)); + } + } + + //tpl->open( tplName ); + } +} + + + +/*! +* \en +* Return path to working dir. +* \_en +* \ru +* Возвращает путь к рабочей директории. +* \_ru +* \see setTable( const QString &name ) +*/ +QString +aReport::path2workdir() +{ + QString res; +#ifndef Q_OS_WIN32 + res = "/usr/share/ananas/"; +#else + res = ""; +#endif + if(md!=NULL) + { + res = md->rc.value("workdir"); + } + aLog::print(aLog::Debug, tr("aReport working dir = %1").arg(res)); + return res; +} + + + +/*! +* \en +* Close report. +* \_en +* \ru +* Закрывает отчет. Удаляет временные файлы. +* \_ru +*/ +void +aReport::close() +{ + tpl->close(); +} + + +/*! +* \en +* Gets name for new template. Need for OpenOffice v2. +* \_en +* \ru +* Получение имени для нового шаблона. Нужна из-за блокировок в OpenOffice v2. +* \_ru +*/ +QString +aReport::getName4NewTemplate() +{ + uint count=0; + QFile tmpf; + QString suff = ".odt"; + QString fname; + if(type==RT_office_calc) suff = ".ods"; + do + { + // tpl->getDir() должно заканчиваться на / + fname = QDir::convertSeparators(QString(tpl->getDir()+".ananas-report%1%2").arg(count).arg(suff)); + tmpf.setName(fname); + if(tmpf.exists()) + { + if(tmpf.remove()) break; + else ++count; + } + else + { + break; + } + }while(count<100); + + aLog::print(aLog::Debug, tr("aReport name for template = %1").arg(fname)); + return fname; +} diff --git a/src/lib/report/areport.h b/src/lib/report/areport.h new file mode 100644 index 0000000..5e59def --- /dev/null +++ b/src/lib/report/areport.h @@ -0,0 +1,121 @@ +/**************************************************************************** +** $Id: areport.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AREPORT_H +#define AREPORT_H + +#include +#include +#include +#include "acfg.h" +#include "aobject.h" +#include "engine.h" +#include "atemplate.h" +#include "aootemplate.h" + +class aDatabase; + +/** + * \ru + * \brief Класс для показа отчета в формате HTML. Наследует QMainWindow. + * + * \see aTemplate aReport + * \_ru + */ +class ANANAS_EXPORT aReportBrowser :public Q3MainWindow +{ + Q_OBJECT +public: + QWorkspace *ws; + Q3TextBrowser *textBrowser; + aReportBrowser( QWidget *parent = 0, const char *name = 0, Qt::WFlags f = Qt::WDestructiveClose ); + void append( const QString &text ); + void clear(); +public slots: + void print(); + +protected slots: + virtual void languageChange(); +}; + +/** + * \ru + * \brief Определяет программный интерфейс для работы со всеми типами отчетов. + * Наследует aObject. + * + * Применяется для генерирования документов для печати в форматах OpenOffice *.odt,*ods и HTML. + * \see aTemplate aOOTemplate + * \_ru + */ + +class ANANAS_EXPORT aReport :public aObject +{ + Q_OBJECT +public: + +/*! + * \ru + * Перечисление типов возможных отчетов. + * \_ru + */ + enum RT_type { + RT_text/**отчет в формате HTML*/, + RT_office_writer/**отчет в формате OpenOffice Writer*/, + RT_office_calc/**отчет в формате OpenOffice Calc*/ + }; + + aEngine *engine; + iTemplate *tpl; + aReportBrowser *browser; + RT_type type; + + aReport( aCfgItem context, RT_type r_type = RT_text, aEngine * e = 0 ); + aReport( QString name, RT_type r_type = RT_text, aEngine * e = 0 ); + virtual ~aReport(); + virtual ERR_Code initObject(); + + QString path2workdir(); + +public slots: + void setTable( const QString &name ); + void setValue( const QString &name, const QString &value ); + QString value( const QString &name ); + void clear(); + void exec( const QString §ion ); + void close(); + void show(); +protected: + QString getName4NewTemplate(); +private: + QString tplName; + +}; + +#endif// AREPORT_H diff --git a/src/lib/report/atemplate.cpp b/src/lib/report/atemplate.cpp new file mode 100644 index 0000000..8637dd3 --- /dev/null +++ b/src/lib/report/atemplate.cpp @@ -0,0 +1,208 @@ +/**************************************************************************** +** $Id: atemplate.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "atemplate.h" +#include "alog.h" + +aTemplate::aTemplate() + : iTemplate() +{ + clear(); +} + + + +aTemplate::~aTemplate() +{ +} + + + +bool +aTemplate::open( const QString &fname ) +{ + QFile file( QDir::convertSeparators(QDir::currentDirPath()+"/"+templateDir+"/"+fname) ); + if ( file.open( QIODevice::ReadOnly ) ) + { + QTextStream stream( &file ); + tpl = stream.read(); + file.close(); + return true; + } + else + { + return false; + } +} + + + +void +aTemplate::close() +{ + freeValues(); +} + + + +QString +aTemplate::getValue( const QString &name ) +{ + QString * pStr=values.find( name ); + return pStr==0?(QString::null):*pStr; +} + + + +void +aTemplate::setValue( const QString &name, const QString &value ) +{ + values.remove( name ); + if ( !value.isEmpty() ) values.insert( name, new QString( value ) ); +} + + + +void +aTemplate::freeValues() +{ + values.clear(); +} + + +QString +aTemplate::exec( const QString &sname ) +{ + int c = 0, c1 = 0, sec_start = 0, sec_end = 0, sec_len = 0, sfound = 0, l; + QString token, tname, tparam, sec_buf = "", v; + + if ( tpl.isEmpty() ) return ""; + + while ( !sfound ) { + sec_len = 0; + c = tpl.find( token_open, c ); + if ( c >= 0 ) { + c += strlen( token_open ); + c1 = tpl.find( token_close, c ); + if ( c1 >= 0 ) { + l = c1 - c; + token = tpl.mid( c, l ); + tname = token.section( " ", 0, 0 ); + tparam = token.section( " ", 1, 1 ); + if ( tname == "section" && tparam == sname ) { + sec_end = tpl.find( QString(token_open"endsection"token_close), c1 ); + if ( sec_end > 0 ) { + sfound = 1; + sec_start = c1 + QString( token_close ).length(); + sec_len = sec_end - sec_start; + } else break; + } + } else break; + } else break; + } + + if ( sfound && sec_len ) { + c = sec_start; + while ( c < sec_end ) { + c1 = tpl.find( token_open, c ); + l = c1 - c; + if ( l ) sec_buf.append( tpl.mid( c, l ) ); + if ( c1 < sec_end ) { + c = c1 + QString( token_open ).length(); + c1 = tpl.find( token_close, c ); + if ( c1 ) { + l = c1 - c; + token = tpl.mid( c, l ); + tname = token.section( " ", 0, 0 ); + tparam = token.section( " ", 1, 1 ); + c1 += QString( token_close ).length(); + v = getValue( tname ); + if ( !v.isEmpty() ) sec_buf.append( v ); + } else break; + } + c = c1; + } + } + buf.append( sec_buf ); +// printf("%s",( const char *) sec_buf.local8Bit() ); + return sec_buf; +} + + + +bool +aTemplate::save( const QString & fname) +{ + QFile file( QDir::convertSeparators(QDir::currentDirPath()+"/"+templateDir+"/"+fname) ); + if ( file.open( QIODevice::WriteOnly ) ) + { + QTextStream stream( &file ); + stream << result(); + file.close(); + aLog::print(aLog::Info, tr("aTemplate save file %1").arg(file.name())); + return true; + } + else + { + aLog::print(aLog::Error, tr("aTemplate save file %1").arg(file.name())); + return false; + } +} + + + +void +aTemplate::cleanUpTags() +{ +} + + + +void +aTemplate::setDir(const QString &dir) +{ + templateDir = dir; +} + + + +QString +aTemplate::getDir() +{ + return templateDir; +} + diff --git a/src/lib/report/atemplate.h b/src/lib/report/atemplate.h new file mode 100644 index 0000000..275491e --- /dev/null +++ b/src/lib/report/atemplate.h @@ -0,0 +1,134 @@ +/**************************************************************************** +** $Id: atemplate.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ATEMPLATE_H +#define ATEMPLATE_H + +#include "ananasglobal.h" +#include "itemplate.h" + +#define token_open "<#" +#define token_close "#>" + +#include +#include +#include + +/** + * \en + * Class for work with pattern in HTML format + * \_en + * \ru + * \brief Класс для работы с шаблонами в HTML формате. + * Наследует iTemplate. + * + * Приведенный пример показывает создание таблицы размеров 10х10. + * \code + * function printreport() + * { + * p = new Report("Report1"); + * p.setTable("report.tpl"); + * p.setValue("title","Заголовок таблицы :"+Value("eHeader") + Value("fNDS")); + * p.exec("main"); + * for ( i = 1; i<10; i++) + * { + * p.setValue("value", String(i) ); + * p.exec("trow"); + * for ( j=1; j<10; j++) + * { + * p.setValue("value", String(i)+":"+String(j) ); + * p.exec("col"); + * } + * p.exec("endrow"); + * } + * p.exec("endmain"); + * p.show(); + * delete p; + * } + * \endcode + * Шаблон: + * \code +<#section main#> + +
+Ananas HTTP Server +
+ +<#title#> + +<#endsection#> + +<#section endmain#> +
+ +<#endsection#> + +<#section trow#><#value#>)<#endsection#> + +<#section endrow#> +<#endsection#> + +<#section col#><#value#><#endsection#> + * \endcode + * \_ru + */ +class ANANAS_EXPORT aTemplate : public iTemplate +{ + Q_OBJECT +public: + + aTemplate(); + virtual ~aTemplate(); + + bool open( const QString &fname ); + void close(); + void clear(){ buf="";}; + + QString getValue( const QString &name ); + void setValue( const QString &name, const QString &value ); + QString exec( const QString &sname ); + QString result(){ return buf;}; + bool save( const QString & fname ); + void cleanUpTags(); + virtual void setDir(const QString &dir); + virtual QString getDir(); + +protected: + QString templateDir; + +private: + QString buf; + QString tpl; + Q3Dict values; + + void freeValues(); +}; + +#endif //ATEMPLATE_H diff --git a/src/lib/report/itemplate.cpp b/src/lib/report/itemplate.cpp new file mode 100644 index 0000000..d40db4d --- /dev/null +++ b/src/lib/report/itemplate.cpp @@ -0,0 +1,108 @@ +/**************************************************************************** +** $Id: itemplate.cpp,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +//#include +//#include +//#include +//#include + +#include "itemplate.h" + + +iTemplate::iTemplate() + : QObject() +{ +} + +iTemplate::~iTemplate() +{ +} + +bool +iTemplate::open( const QString &) +{ + return true; +} + +void +iTemplate::close() +{ +} + +QString +iTemplate::getValue( const QString & ) +{ + return ""; +} + + +void +iTemplate::setValue( const QString &, const QString & ) +{ +} + + +bool +iTemplate::save( const QString & ) +{ + return true; +} + + +QString +iTemplate::exec( const QString & ) +{ + return ""; +} + +void +iTemplate::clear() +{ +} + +QString +iTemplate::result() +{ + return ""; +} +void +iTemplate::cleanUpTags() +{ +} +void +iTemplate::setDir(const QString &) +{ +} + +QString +iTemplate::getDir() +{ + return ""; +} diff --git a/src/lib/report/itemplate.h b/src/lib/report/itemplate.h new file mode 100644 index 0000000..a334087 --- /dev/null +++ b/src/lib/report/itemplate.h @@ -0,0 +1,184 @@ +/**************************************************************************** +** $Id: itemplate.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Report metadata object header file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ITEMPLATE_H +#define ITEMPLATE_H + +#include "ananasglobal.h" + +#include +//#include +//#include + +/** + * \~english + * Interface for work with report + * \~russian + * \brief Интерфейс для работы с отчетами. Наследует QObject. + * + * Классы, генерирующие отчеты, должны использовать этот интерфейс. + * Содержит чистые виртуальные функции, не допускается создание объектов этого класса напрямую. + * Пример: + * \code + * iTemplate *tpl = new aTemplate(); // aTemplate должен реализовывать интерфейс iTemplate + * tpl->open("test.tpl"); + * tpl->close(); + * delete tpl; + * \endcode + * \~ + */ +class ANANAS_EXPORT iTemplate : public QObject +{ + Q_OBJECT +public: +/** + * \en + * Constructor + * \_en + * \ru + * Конструктор. + * \_ru + */ + iTemplate(); +/** + * \en + * Destructor + * \_en + * \ru + * Деструктор + * \_ru + */ + virtual ~iTemplate(); + +/** + * \en + * Opens pattern + * \_en + * \ru + * Открывает шаблон. + * \_ru + */ + virtual bool open( const QString &fname )=0; +/** + * \en + * Closes pattern. + * \_en + * \ru + * Закрывает шаблон. + * \_ru + */ + virtual void close(); +/** + * \en + * Clears internal variable. + * \_en + * \ru + * Обнуляет внутренние переменные. + * \_ru + */ + virtual void clear(); +/** + * \en + * Get value of parameter `name' + * \_en + * \ru + * Возвращает значение параметра по его имени. + * \_ru + */ + virtual QString getValue( const QString &name ); +/** + * \en + * Set value of parameter `name' + * \_en + * \ru + * Устанавливает значение параметра по его имени. + * \_ru + */ + virtual void setValue( const QString &name, const QString &value ); +/** + * \en + * Replaces tads to values + * \_en + * \ru + * Выполняет подстановку значения параметра в шаблоне. + * Может вызываться несколько раз. + * \_ru + */ + virtual QString exec( const QString &sname ); +/** + * \en + * Returns document. + * \_en + * \ru + * Возвращает результат, т.е. шаблон в текстовом виде. Включена в интерфейс временно. + * \_ru + */ + virtual QString result(); +/** + * \en + * Saves document to file + * \_en + * \ru + * Сохраняет документ в файл с заданным именем. + * \_ru + */ + virtual bool save( const QString & fname ); +/** + * \en + * Clears all tags + * \_en + * \ru + * Очищает все теги + * \_ru + */ + + virtual void cleanUpTags(); +/** + * \en + * Sets working directory + * \_en + * \ru + * Устанавливает рабочую директорию + * \_ru + */ + virtual void setDir(const QString &dir); + + /** + * \en + * Gets working directory + * \_en + * \ru + * Возвращает рабочую директорию + * \_ru + */ + virtual QString getDir(); +}; + +#endif //ITEMPLATE_H diff --git a/src/lib/report/report.pri b/src/lib/report/report.pri new file mode 100644 index 0000000..9fc0be5 --- /dev/null +++ b/src/lib/report/report.pri @@ -0,0 +1,13 @@ +HEADERS += \ + report/acalctemplate.h \ + report/aootemplate.h \ + report/areport.h \ + report/atemplate.h \ + report/itemplate.h + +SOURCES += \ + report/acalctemplate.cpp \ + report/aootemplate.cpp \ + report/areport.cpp \ + report/atemplate.cpp \ + report/itemplate.cpp diff --git a/src/lib/sys/aapplication.cpp b/src/lib/sys/aapplication.cpp new file mode 100644 index 0000000..2e064c2 --- /dev/null +++ b/src/lib/sys/aapplication.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** +** $Id: aapplication.cpp,v 1.1 2008/11/09 21:08:09 leader Exp $ +** +** Code file of the Ananas Library of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "aapplication.h" +#include "dselectdb.h" +#include "dlogin.h" + + +AApplication::AApplication( int & argc, char ** argv, AApplicationType aat ) + :QApplication( argc, argv, true ) +{ + v_aat = aat; +} + +int +AApplication::applicationType() +{ + return v_aat; +} + diff --git a/src/lib/sys/aapplication.h b/src/lib/sys/aapplication.h new file mode 100644 index 0000000..65a533f --- /dev/null +++ b/src/lib/sys/aapplication.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** $Id: aapplication.h,v 1.2 2008/11/21 20:58:12 leader Exp $ +** +** Header file of the Ananas Library of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AAPPLICATION_H +#define AAPPLICATION_H + +#include "ananasglobal.h" +#include + +class ANANAS_EXPORT AApplication : public QApplication +{ +Q_OBJECT +public: + + enum AApplicationType { + Unknown, + Ananas, + Designer, + Administrator + }; + + AApplication( int & argc, char ** argv, AApplicationType aat = Unknown ); + int applicationType(); + +private: + int v_aat; +}; + +#endif diff --git a/src/lib/sys/adatabase.cpp b/src/lib/sys/adatabase.cpp new file mode 100644 index 0000000..a0a91e3 --- /dev/null +++ b/src/lib/sys/adatabase.cpp @@ -0,0 +1,1668 @@ +/**************************************************************************** +** $Id: adatabase.cpp,v 1.6 2008/12/10 21:04:03 leader Exp $ +** +** Database abstaraction layer +** of Ananas Project +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/* +*/ +/* +for mysql server set variable in /var/lib/mysql/my.cnf +default-character-set=utf8 + +*/ +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include +#include +#include + +#include "alog.h" + +#include "asqltable.h" +#include "aapplication.h" + +#include "adatabase.h" + + +QStringList dd; + +static aDatabase aDatabase_default; + +/*! + * + */ +QString +qds_field ( const QString fname, const QString &tdef, const QString &descr = "" ) +{ + int n1, n2; + bool notnull, serial; + char t=' '; + QString st, dt="F="+fname+"|"+descr+"|"; + + if ( tdef.isEmpty() ) return ""; + n1=0; n2=0; + st = tdef.section ( " ", 0, 0 ).lower(); + n1 = tdef.section ( " ", 1, 1 ).toInt(); + n2 = tdef.section ( " ", 2, 2 ).toInt(); + if ( !st.isEmpty() ) t = ( ( const char * ) st ) [0]; + serial = ( st.mid ( 1 ).contains ( 's' ) > 0 ); + notnull = ( st.mid ( 1 ).contains ( 'n' ) > 0 ); +// if ( serial && t=='l') t='i'; + switch ( t ) + { + case 'i': + dt.append ( "I|0|0|" ); + break; + case 'l': + dt.append ( "L|0|0|" ); + break; + case 'c': + dt.append ( QString ( "S|%1|0|" ).arg ( n1 ) ); + break; + case 'n': + dt.append ( QString ( "N|%1|%2|" ).arg ( n1 ).arg ( n2 ) ); + break; + case 'd': + dt.append ( "D|0|0|" ); + break; + case 'o': + dt.append ( "L|0|0|" ); + break; + case 'b': + dt.append ( "C|1|0|" ); + break; + default: + dt.append ( "I|0|0|" ); + break; + } + if ( !serial && notnull ) dt.append ( "N" ); + if ( serial ) dt.append ( "PS" ); + return dt; +} + + + +void +qds_fields ( aCfg &cfg, aCfgItem context ) +{ + + int j, ifld; + QString t, flddef=""; + aCfgItem of, item; + int id, n=0; + aCfgItem dim_field; + + /* + if(cfg.objClass(context) == md_field && cfg.objClass(cfg.parent(context))== md_dimensions) + { + dim_field = context; + t = cfg.attr( dim_field, mda_type ); + if ( !t.isEmpty() ) + { + if(t[0]!=' ') + { + flddef.append( QString("uf%1 %2,").arg(cfg.id(dim_field)).arg(t) ); + } + } + } + */ + ifld = cfg.count ( context, md_field ); + for ( j = 0; j < ifld; j++ ) + { + item = cfg.find ( context, md_field, j ); + id = cfg.id ( item ); + if ( id ) + { + t = cfg.attr ( item, mda_type ); + if ( !t.isEmpty() ) + { + if ( t[0]!=' ' ) + { + dd<driverName(); + if ( name == "QMYSQL" ) name = "QMYSQL"; + return name; +} + + +/*! + * \~english + * Return text feature for dynamic SQL by feature name. + * \~russian + * Возвращает код реализации какой либо осбенности сервера БД по ее ключу. + * \~ + * \return \~english Code for dynamic SQL creation \~russian Код для формирования динамического SQL \~ + */ +QString +aDatabase::feature(const QString& featureName) +{ + QString res = QString::null; + if(driverName() == "QMYSQL") + { + res = featuresMySQL[featureName]; + } + if(driverName() == "QSQLITE") + { + res = featuresSQLite[featureName]; + } + if(driverName() == "QPSQL7") + { + res = featuresPostgreSQL[featureName]; + } + return res; +} + +/*! + * \~english + * This is overloaded method, provided for convenience. + * \~russian + * Перегружет метод init( aCfgRc *rc, const QString &dbname ) + * \~ + * \see init( aCfgRc *rc, const QString &dbname ) + * \param rcname (in) - \~english rc file name. \~russian имя файла ресурса \~ + * \param dbname (in) - \~english parameter to pass trough. \~russian имя базы данных \~ + * \return \~english true, if no error \~russian true, если ошибок не было \~ + */ +bool +aDatabase::init( const QString &rcname, const QString &dbname ) +{ + if ( rcname.isEmpty() ) return false; + if ( cfg.readrc( rcname ) ) return false; + return init( &cfg.rc, dbname ); +} + +/** + * \en + * \brief Creates database on SQL server. + * + * Uses rc file parameters values and makes connection to database server. + * Then creates database with name obtained from rc file. + * \param rc (in) - rc object reference. + * \param dbname (in) - unused now. + * \return true, if no error + * \_en \ru + * \brief Открывает соединение с базой данных на SQL сервере или создает базу данных. + * + * Если БД не удалось открыть, метод пытается создать базу данных на SQL сервере, + * используя переданные параметры соединения с SQL сервером. При этом создается пустая база данных + * без таблиц и других элементов. + * \param rc (in) - ссылка на инициализированный объект, + * хранящий данные файла ресурсов, необходимые для установления соединения. Проще говоря, объект + * с параметрами соединения. + * \param dbname (in) - не используется + * \return frue, если не было ошибок + * \_ru + * \see init( const QString &rcname, const QString &dbname ) + */ +bool +aDatabase::init ( aCfgRc *rc, const QString &dbname ) +{ + fillFeatures(); + if ( !rc ) return false; + if ( !prepareDatabaseConnect ( rc ) ) return false; + + qds_dd ( cfg ); + qds->setDataDictionary ( dd ); + if ( qds->open() ) + { + aLog::print ( aLog::Info,tr ( "aDatabase open connection to %1" ).arg ( rc->value ( "dbname" ) ) ); + } + else + { + cfg_message ( 3, ( const char * ) tr ( "Can't open database connection\n" ).utf8() ); + aLog::print ( aLog::Error,tr ( "aDatabase open connection to %1" ).arg ( rc->value ( "dbname" ) ) ); + }; + QSqlQuery q = db()->exec ( QString ( "SELECT * FROM %1" ).arg ( qds->tableName ( "netusers" ) ) ); + if ( !q.first() ) + { + db()->exec ( QString ( "INSERT INTO %1 (users,updates) VALUES (0,0)" ).arg ( qds->tableName ( "netusers" ) ) ); + } + v_updatesCount = updatesCount(); + v_timerId = startTimer ( 5000 ); + return true; +} + +/** + * \ru + * \brief Инициализирует драйвер sql соединения. + * + * Для инициализации используются параметры из файла ресурсов бизнес схемы. + * \param dbParams - объект хранящий данные файла ресурсов. + * \return true, если драйвер успешно инициализирован. false, если возникла ошибка. + * \_ru + */ +bool +aDatabase::prepareDatabaseConnect ( aCfgRc* dbParams ) +{ + QString driver = "UNKNOWN"; + QString dbtype; + + dbtype = dbParams->value ( "dbtype" ); + done(); + + /**/ + QString qds_dbtype = "QSQLITE"; + if ( dbtype=="internal" ) qds_dbtype = "QSQLITE"; + if ( dbtype=="mysql" ) qds_dbtype = "QMYSQL"; + if ( dbtype=="postgres" ) qds_dbtype = "QPOSTGRESQL"; + + if ( qds==0 ) qds = new QDataSchema ( qds_dbtype, "ANANAS" ); + //qds->setNameSpace("qds_"); + + qds->db()->setDatabaseName ( dbParams->value ( "dbname" ) ); + qds->db()->setUserName ( dbParams->value ( "dbuser" ) ); + qds->db()->setPassword ( dbParams->value ( "dbpass" ) ); + qds->db()->setHostName ( dbParams->value ( "dbhost","localhost" ) ); + qds->db()->setPort ( dbParams->value ( "dbport","0" ).toInt() ); + + dataBase = qds->db(); + return true; +} + + + +void +aDatabase::fillFeatures() +{ + featuresMySQL["autoincrement"] = "select last_insert_id()"; + featuresMySQL["encoding"] = "character set utf8"; + featuresMySQL["systemDatabase"] = "mysql"; + featuresPostgreSQL["autoincrement"] = "select currval('uniques_id_seq')"; + featuresPostgreSQL["encoding"] = "with encoding='UTF-8'"; + featuresPostgreSQL["systemDatabase"] = "template1"; + featuresSQLite["autoincrement"] = "select last_insert_rowid()"; + featuresSQLite["encoding"] = ""; +} + +/*! + * \~english + * Closes database connection. + * \~russian + * Закрывает соединение с базой данных и освобождает все занятые ресурсы. + * \~ + */ +void +aDatabase::done() +{ + killTimer( v_timerId ); +// if ( db() ) +// { +// db()->close(); +// } + if ( qds ) + { + delete qds; + qds = 0; + } +} + + + +/** + * \en + * \brief Returns database connection. + * + * \param dbname (in) - database connection name. Default value used if dbname is empty. + * \return database connection. + * \_en \ru + * \brief Возвращает ссылку на соединение с базой данных. + * + * \param dbname (in) - имя базы данных + * \return соединение с базой данных. Возвращаемый объект удалять не следует. + */ +QSqlDatabase* +aDatabase::db ( const QString &dbname ) +{ + if ( qds ) return qds->db(); + return 0; +} + + +/*! + * \~english + * Check database structure. + * \~russian + * проверяет структуру базы данных. + * \~ + * \return \~english true, if structure is valid. \~russian true, если база данных корректна \~ + */ +bool +aDatabase::checkStructure() +{ + if ( qds ) + { + if ( qds->verifyStructure() ) + { + return false; + } + else return true; + } + return false; +} + + + +/*! + * \~english + * Helper method. + * \~russian + * Вспомогательный метод. Создает новую базу данных. + * \~ + * \see createdb() + */ +bool +aDatabase::create() +{ + return createdb ( false ); +} + +bool +aDatabase::drop ( const QString& dbname ) +{ + + QString query = QString ( "drop database %1" ).arg ( dbname ); + if ( !dataBase ) return true; + if ( dataBase->exec ( query ).lastError().type() ==QSqlError::None ) + { + aLog::print ( aLog::Error,tr ( "aDatabase drop database %1" ).arg ( dbname ) ); + } + query = QString ( "create database %1 %2" ).arg ( dbname ).arg ( feature ( "encoding" ) ); + //if ( driverName() == "QPSQL7" ) query.append( " with encoding='UTF-8'" ); +//#ifdef MYSQL_UTF8 + //if ( driverName() == "QMYSQL3" ) query.append( " character set utf8" ); +//#endif + //printf("query = %s\n",query.ascii()); + QSqlQuery q = db()->exec ( query ); + if ( db()->lastError().type() !=QSqlError::None ) + { + reportError ( db()->lastError(),query ); + } + dataBase->setDatabaseName ( dbname ); + if ( !dataBase->open() ) + { + cfg_message ( 3, ( const char * ) tr ( "Can't open database connection\n" ).utf8() ); + aLog::print ( aLog::Error,tr ( "aDatabase open connection to %1" ).arg ( dbname ) ); + return false; + } + else + { + aLog::print ( aLog::Info,tr ( "aDatabase open connection to %1" ).arg ( dbname ) ); + + } + return false; +} + + +/*! + * \~english + * Helper method. + * \~russian + * Вспомогательный метод. Обновляет структуру базы данных. + * \~ + * \see createdb() + */ +bool +aDatabase::update() +{ + return createdb ( true ); +} + + + +/*! + * Creates aDataTable object for browsing and editing sql table in current database. + * \param name (in) - sql table name. + * \return newly created object. + */ +aDataTable * +aDatabase::table ( const QString & name ) +{ + aDataTable *t = 0; + + if ( tableExists ( name ) ) + { + t = new aDataTable ( qds->tableName ( name ), this ); + } + else + { + t = new aDataTable ( QString::null, this ); + } + return t; +} + + +/*! + * \~english + * Helper metod. Returns sql table name for metadata object. + * \~russian + * Вспомогательный метод. Возвращает имя sql таблицы для объекта метаданных. + * \~ + * \see tableDbName( aCfg &md, aCfgItem context, long * tid ) + * \param md (in) - \~english metadata tree object. \~russian дерево метаданных. \~ + * \param context (in) - \~english node of metadata tree which represents metadata Class. \~russian объект метаданных \~ + * \return \~english sql table name. \~russian имя таблицы в базе данных \~ + */ +QString +aDatabase::tableDbName ( aCfg &md, aCfgItem context ) +{ + long dummy; + return tableDbName ( md,context,&dummy ); +} + + +/*! +* \~english +* Returns sql table name for metadata object. +* \~russian +* Возвращает имя sql таблицы для объекта метаданных. +* \~ +* \see tableDbName( aCfg &md, aCfgItem context, long * tid ) +* \param md (in) - \~english metadata tree object. \~russian дерево метаданных. \~ +* \param context (in) - \~english node of metadata tree which represents metadata Class. \~russian объект метаданных \~ +* \param tid (out) - \~english id of metadata Class. \~russian идентификатор объекта метаданных, которому принадлежит таблица \~ +* \return \~english sql table name. \~russian имя таблицы в базе данных \~ +*/ +QString +aDatabase::tableDbName ( aCfg &md, aCfgItem context, long * tid ) +{ + aCfgItem parent = context; + QString oclass, tname = ""; + long id, idp=0, temp=0; + if ( context.isNull() ) return ""; + oclass = md.objClass ( context ); + id = md.id ( context ); + while ( idp == 0 && ! parent.isNull() ) + { + parent = md.parent ( parent ); + idp = md.id ( parent ); + } + if ( oclass == md_element ) + { + tname = QString ( db_catalog_element ).arg ( idp ); + temp = idp; + } + if ( oclass == md_group ) + { + tname = QString ( db_catalog_group ).arg ( idp ); + temp = idp; + } + if ( oclass == md_header ) + { + tname = QString ( db_document_header ).arg ( idp ); + temp = idp; + } + if ( oclass == md_iregister ) + { + tname = QString ( db_iregister ).arg ( id ); + temp = id; + } + if ( oclass == md_aregister ) + { + tname = QString ( db_aregister ).arg ( id ); + temp = id; + } + if ( oclass == md_table ) + { + if ( md.objClass ( parent ) == md_document ) + { + tname = QString ( db_document_table ).arg ( idp ).arg ( id ); + temp = id; + } + } + if ( oclass == md_resources ) + { + if ( md.objClass ( parent ) == md_aregister ) + { + tname = QString ( db_areg_remainder ).arg ( idp ); + temp = idp; + } + } + if ( oclass == md_field ) + { + if ( md.objClass ( parent ) == md_aregister ) + { + tname = QString ( db_areg_dim ).arg ( idp ).arg ( id ); + temp = idp; + } + } + *tid = temp; +// printf("tname = %s\n",tname.ascii()); + return tname; +} + + + +/*! + * \~english + * Generates new unique id for system object. + * \~russian + * Генерирует новый уникальный номер. Эти номера являются невосполнимым ресурсом системы. + * \~ + * \param otype (in) - \~english object type (e.g. document, catalog, journal etc.) \~russian тип объекта \~ + * \return \~english newly generated unique id. \~russian новый сгенерированный номер \~ + */ +Q_ULLONG +aDatabase::uid ( int otype ) +{ + Q_ULLONG uid = 0; + QString query; + QString drv = driverName(); +// printf("driver name =%s\n",drv.ascii()); + query.sprintf ( "insert into uniques (otype) values (%d)", otype ); + QSqlQuery q = db()->exec ( query ); + if ( db()->lastError().type() !=QSqlError::None ) + { + reportError ( db()->lastError(),query ); + } + query = feature ( "autoincrement" ); + q = db()->exec ( query ); + if ( db()->lastError().type() !=QSqlError::None ) + { + reportError ( db()->lastError(),query ); + } + if ( q.first() ) + { + uid = q.value ( 0 ).toULongLong(); + } + else + { + aLog::print ( aLog::Error,tr ( "aDatabase generate new unique number for object type %1" ).arg ( otype ) ); + } +// printf("uid=%llu, otype=%d\n",uid,otype); + aLog::print ( aLog::Debug,tr ( "aDatabase generate new unique number %1 for objecttype %2" ).arg ( uid ).arg ( otype ) ); + return uid; +} + + + +/*! + * \~english + * Returns type of object identified by its uid. + * \~russian + * Возвращает тип объекта по его идентификатору. + * \~ + * \see uid( int otype ) + * \param uid (in) - \~english object's uid. \~russian уникальный идентификатор объекта \~ + * \return \~english object's type \~russian тип объекта \~ + */ +int +aDatabase::uidType ( Q_ULLONG uid ) +{ + QSqlQuery q = db()->exec ( QString ( "SELECT otype FROM uniques WHERE id=%1" ).arg ( uid ) ); + if ( q.first() ) + return q.value ( 0 ).toInt(); + else + aLog::print ( aLog::Error,tr ( "aDatabase get object type for unique id=%1" ).arg ( uid ) ); + return 0; +} + + + +/*! + * \~english + * Checks table existence. + * \~russian + * Проверяет, существует ли таблица в базе данных. + * \~ + * \param name (in) - \~english table name to check for. \~russian имя проверяемой таблицы \~ + * \return \~english true, if table exists in current database \~russian true, если таблица существует \~ + */ +bool +aDatabase::tableExists ( const QString & name ) +{ + return qds->tableExists ( qds->tableName ( name ) ); +} + + +/*! + * + */ +bool +aDatabase::createdb ( bool update ) +{ + bool rc = false; + + if ( qds ) + { + qds_dd ( cfg ); + qds->setDataDictionary ( dd ); + if ( qds->verifyStructure() ) + { + // need to update + printf ( "verify log:\n%s\n", ( const char * ) qds->verifyLog().join ( "\n" ) ); + printf ( "update structure query:\n%s\n", ( const char * ) qds->updateStructureQuery().join ( "\n" ) ); + if ( qds->updateStructure() !=0 ) + { + rc = false; + cfg_message ( 2, ( const char * ) tr ( "Data base update error\n" ) ); + } + else + { + rc = true; + cfg_message ( 0, ( const char * ) tr ( "Data base update successfull\n" ) ); + } + } + } + return rc; +} + + + +/*! + * \~english + * Sets delete flag to true in system table for \a uid. + * \~russian + * Устанавливает флаг удаления в true в системной таблице для заданного \a uid + * \~ + * \see deleteMarked() + * \param uid - \~english id for mark deleted \~russian id для пометки на удаление \~ + */ +void +aDatabase::markDeleted ( Q_ULLONG uid ) +{ + db()->exec ( QString ( "UPDATE uniques SET df='1' WHERE id=%1" ).arg ( uid ) ); +} + + +/*! + * \~english + * Delete all marked records. + * \~russian + * Удаляет все помеченные записи. + * \~ + * \see markDeleted(Q_ULLONG uid) + */ +void +aDatabase::deleteMarked() +{ + db()->exec ( "DELETE FROM uniques WHERE df='1'" ); +} + + +QStringList +aDatabase::supportedDriverList() +{ + QStringList l; + l<<"internal"; + l<<"mysql"; + l<<"postgresql"; + return l; +} + + +bool +aDatabase::exchangeDataSystables ( QDomDocument &xml, bool import ) +{ + bool res = false; + if ( import ) + { + qds->databaseImport ( "import.xml", false ); + res |= importTableData ( xml,"a_journ" ); + res |= importTableData ( xml,db_users ); + res |= importTableData ( xml,db_user_roles ); + res |= importTableData ( xml,db_roles ); + res |= importTableData ( xml,db_right_roles ); + res |= importTableData ( xml,db_indices ); + + } + else + { + qds->databaseExport ( "export.xml" ); + res |= exportTableData ( xml,"a_journ" ); + res |= exportTableData ( xml,db_users ); + res |= exportTableData ( xml,db_user_roles ); + res |= exportTableData ( xml,db_roles ); + res |= exportTableData ( xml,db_right_roles ); + res |= exportTableData ( xml,db_indices ); + } + return res; +} + +bool +aDatabase::exchangeDataUniques ( QDomDocument &xml, bool import ) +{ + bool res = false; + if ( import ) + { + res |= importTableData ( xml,"uniques" ); + } + else + { + res |= exportTableData ( xml,"uniques" ); + } + return res; +} + +bool +aDatabase::exchangeDataCatalogues ( QDomDocument &xml, bool import ) +{ + aCfgItem gcont, cont, item; + long id; + int n, i; + bool rc = false; + + gcont = cfg.find ( cfg.find ( mdc_metadata ), md_catalogues, 0 ); + n = cfg.count ( gcont, md_catalogue ); + for ( i = 0; iselect(); + QDomElement xml_root = xml.documentElement(); + if ( xml_root.isNull() ) + { + aLog::print ( aLog::Error,tr ( "aDatabase export table: invalid XML file" ) ); +// printf("xml has no root element"); + return true; + } + QDomElement table = xml.createElement ( "table" ); + table.setAttribute ( "name",tableName ); + QDomElement row; + QDomElement field; + xml_root.appendChild ( table ); + if ( !dataTable->first() ) return false; + do + { + uint countField = dataTable->count(); + QVariant val; + row = xml.createElement ( "row" ); + table.appendChild ( row ); + for ( uint i=0; ivalue ( i ); + if ( val.isValid() ) + { + field = xml.createElement ( "field" ); + field.setAttribute ( "name",dataTable->fieldName ( i ) ); + field.appendChild ( xml.createTextNode ( val.toString() ) ); + row.appendChild ( field ); + } + } + } + while ( dataTable->next() ); + return false; +} + + +bool +aDatabase::importTableData ( QDomDocument &xml, const QString &tableName ) +{ +// printf("import table data %s\n",tableName.ascii()); + QDomElement root = xml.documentElement(); + if ( root.nodeName() != "AnanasDump" ) + { + + aLog::print ( aLog::Error,tr ( "aDatabase import table: invalid XML file" ) ); + //printf("uncnown data format\n"); + return true; + } + QDomNodeList tables = root.childNodes(); + uint countTables = tables.count(); + for ( uint i=0; iexec ( query ); + } + for ( uint j=0; jexec ( query ); + + } + } + else + { + buffer = tbl->primeInsert(); + for ( uint k=0; ksetValue ( field.attribute ( "name" ),field.toElement().text() ); + } + } + tbl->insert(); + } + } + break; + } + } + return false; +} + +void +aDatabase::reportError ( QSqlError er, const QString &query ) +{ + aLog::print ( aLog::Error, QObject::tr ( "aDatabase query: %1" ).arg ( query ) ); + aLog::print ( aLog::Error, QObject::tr ( "aDatabase text: %1" ).arg ( er.text() ) ); + aLog::print ( aLog::Error, QObject::tr ( "aDatabase database text: %1" ).arg ( er.databaseText() ) ); + aLog::print ( aLog::Error, QObject::tr ( "aDatabase driver text: %1" ).arg ( er.driverText() ) ); +} + +//start transaction +bool aDatabase::transaction() +{ + if ( dataBase ) + return dataBase->transaction(); + return false; +} + +//commit transaction +bool aDatabase::commit() +{ + if ( dataBase ) + return dataBase->commit(); + return false; +} + +//rollback transaction +bool aDatabase::rollback() +{ + if ( dataBase ) + return dataBase->rollback(); + return false; +} + + +QStringList +aDatabase::users() +{ + QStringList l; + l << "user1"; + l << "user2"; + l << "user3"; + return l; +} + + +int +aDatabase::loginUsersCount() +{ + QSqlQuery q = db()->exec ( QString ( "SELECT users FROM netusers" ) ); + if ( q.first() ) return q.value ( 0 ).toInt(); + else aLog::print ( aLog::Error,tr ( "aDatabase get users count" ) ); + return 0; +} + + +bool +aDatabase::login ( const QString &username, const QString &password, int applicationId ) +{ + QSqlQuery q, q1; + int count = 0, role_id, md_id, perm, isActive = 0; + bool userOk = false; + + v_user_id = 0; + v_app_id = applicationId; + + if ( applicationId < 0 || applicationId > 3 ) applicationId = 0; + q = db()->exec ( QString ( "SELECT count(*) FROM %1" ).arg ( qds->tableName ( db_users ) ) ); + if ( q.first() ) count = q.value ( 0 ).toInt(); + if ( !count ) + { + userOk = true; + } + else + { + q = db()->exec ( QString ( "SELECT id,active%4 FROM %1 WHERE login='%2' AND password='%3'" ).arg ( qds->tableName ( db_users ) ).arg ( username ).arg ( password ).arg ( applicationId ) ); + if ( q.first() ) + { + v_user_id = q.value ( 0 ).toInt(); + isActive = q.value ( 1 ).toInt(); + userOk = true; + } + else aLog::print ( aLog::Error,tr ( "aDatabase get users count" ) ); + } + if ( userOk ) + { + if ( isActive !=0 && applicationId !=AApplication::Administrator ){ + QMessageBox::information ( 0, "Ananas",tr ( "User already logged in" ), 0, 0, 0 ); +// return false; + } + db()->exec ( QString ( "UPDATE %1 SET users=users+1" ).arg ( qds->tableName ( "netusers" ) ) ); + if ( count ) + { + db()->exec ( QString ( "UPDATE %1 SET active%2=1 WHERE id=%3" ).arg ( qds->tableName ( db_users ) ).arg ( applicationId ).arg ( v_user_id ) ); + } + printf ( "login user id = %i OK\n", v_user_id ); + +// Считаем набор прав пользователя + q = db()->exec ( QString ( "SELECT idr FROM %1 WHERE id=%2" ).arg ( qds->tableName ( db_user_roles ) ).arg ( v_user_id ) ); + while ( q.next() ) + { + role_id = q.value ( 0 ).toInt(); + q1 = db()->exec ( QString ( "SELECT object,permission FROM %1 WHERE id=%2" ).arg ( qds->tableName ( db_right_roles ) ).arg ( role_id ) ); + while ( q1.next() ) + { + md_id = q1.value ( 0 ).toInt(); + perm = q1.value ( 1 ).toInt(); + if ( accessRights.contains ( md_id ) ) + { + accessRights[ md_id ] |= perm; + } + else accessRights[ md_id ] = perm; + } + } + QMap::Iterator it; + for ( it = accessRights.begin(); it != accessRights.end(); ++it ) + { + printf ( "P %i:%04x\n", + it.key(), + it.data() ); + } + + return true; + } + return false; +} + + +void +aDatabase::logout() +{ + db()->exec ( QString ( "UPDATE %1 SET users=CASE WHEN users>0 THEN users-1 ELSE 0 END" ).arg ( qds->tableName ( "netusers" ) ) ); + objectUnlock ( 0 ); + db()->exec ( QString ( "UPDATE %1 SET active%2=0 WHERE id=%3" ).arg ( qds->tableName ( db_users ) ).arg ( v_app_id ).arg ( v_user_id ) ); + if ( !loginUsersCount() ) + { + db()->exec ( QString ( "DELETE FROM %1" ).arg ( qds->tableName ( "locks" ) ) ); + } +} + + +void +aDatabase::netupdate() +{ + printf ( "UPDATE++\n" ); + db()->exec ( QString ( "UPDATE %1 SET updates=updates+1" ).arg ( qds->tableName ( "netusers" ) ) ); + v_updatesCount++; +} + + + +bool +aDatabase::isObjectLocked ( Q_ULLONG id ) +{ + if ( !id ) return false; + QSqlQuery q = db()->exec ( QString ( "SELECT id FROM %1 WHERE userid=%2 AND id=%3" ).arg ( qds->tableName ( "locks" ) ).arg ( v_user_id ).arg ( id ) ); + if ( q.first() ) + { + QMessageBox::information ( 0, "Ananas",tr ( "Object locked by another user" ), 0, 0, 0 ); + return true; + } + return false; +} + + +bool +aDatabase::objectLock ( Q_ULLONG id ) +{ + if ( !id ) return true; +// printf("LOCK user=%i obj=%Lu\n", v_user_id, id); + db()->exec ( QString ( "INSERT INTO %1 (userid,id) VALUES (%2,%3)" ).arg ( qds->tableName ( "locks" ) ).arg ( v_user_id ).arg ( id ) ); + if ( db()->lastError().type() ==0 ) return true; + QMessageBox::information ( 0, "Ananas",tr ( "Object locked by another user" ), 0, 0, 0 ); + return false; +} + +void +aDatabase::objectUnlock ( Q_ULLONG id ) +{ +// printf("UNLOCK user=%i obj=%Lu\n", v_user_id, id); + QString query ( QString ( "DELETE FROM %1 WHERE userid=%2" ).arg ( qds->tableName ( "locks" ) ).arg ( v_user_id ) ); + if ( id ) query.append ( QString ( " AND id=%1" ).arg ( id ) ); + db()->exec ( QString ( query ) ); +} + + +aDatabase * +aDatabase::database() +{ + return &aDatabase_default; +} + + +int +aDatabase::updatesCount() +{ + QSqlQuery q = db()->exec ( QString ( "SELECT updates FROM %1" ).arg ( qds->tableName ( "netusers" ) ) ); + if ( q.first() ) return q.value ( 0 ).toInt(); + return 0; +} + + + +void +aDatabase::timerEvent ( QTimerEvent * ) +{ + int uc; + if ( !db()->isOpen() ) return; + uc = updatesCount(); + if ( uc > v_updatesCount ) + { + v_updatesCount = uc; + emit refresh(); +// printf( "EMIT refresh\n" ); + } +} + + + +bool +aDatabase::isAccessRights ( int md_type, Q_ULLONG obj_id, DBPermission req_operation ) +{ + bool res = false; + + if ( accessRights.contains ( md_type ) ) + { + res = ( accessRights[ md_type ] & req_operation ) != 0; + } + else res = true; + if ( ! res ) + { + QMessageBox::information ( 0, "Ananas",tr ( "No access rights" ), 0, 0, 0 ); + } + return res; +} + + +int +aDatabase::rolePermission ( int role_id, int md_id ) +{ + int perm = 0; + + QSqlQuery q = db()->exec ( QString ( "SELECT permission FROM %1 WHERE id=%2 AND object=%3" ).arg ( qds->tableName ( db_right_roles ) ).arg ( role_id ).arg ( md_id ) ); + if ( q.first() ) perm = q.value ( 0 ).toInt(); + else perm = DBP_All; + return perm; +} + + +void +aDatabase::setRolePermission ( int role_id, int md_id, int new_permission ) +{ + QString query; + + printf ( "SET PERMISSIONS role = %i, obj_id=%i perm=%08x\n", role_id, md_id, new_permission ); + + QSqlQuery q = db()->exec ( QString ( "SELECT permission FROM %1 WHERE id=%2 AND object=%3" ).arg ( qds->tableName ( db_right_roles ) ).arg ( role_id ).arg ( md_id ) ); + if ( q.first() ) query = QString ( "UPDATE %1 SET permission=%4 WHERE id=%2 AND object=%3" ).arg ( qds->tableName ( db_right_roles ) ).arg ( role_id ).arg ( md_id ).arg ( new_permission ); + else query = QString ( "INSERT INTO %1 (id,object,permission) VALUES (%2,%3,%4)" ).arg ( qds->tableName ( db_right_roles ) ).arg ( role_id ).arg ( md_id ).arg ( new_permission ); + q = db()->exec ( query ); + if ( db()->lastError().type() !=0 ) printf ( "error query %s\n", ( const char* ) query ); +} diff --git a/src/lib/sys/adatabase.h b/src/lib/sys/adatabase.h new file mode 100644 index 0000000..cece630 --- /dev/null +++ b/src/lib/sys/adatabase.h @@ -0,0 +1,208 @@ +/**************************************************************************** +** $Id: adatabase.h,v 1.2 2008/11/09 21:08:09 leader Exp $ +** +** Header file of the ananas database of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ADATABASE_H +#define ADATABASE_H +#include +#include +#include +#include +//Added by qt3to4: +#include +#include "acfg.h" +#include +#include +#include + + +/** + * Константы, используемые для формирования имен sql таблиц в зависимости от соответствия + * sql таблицы и бизнес объекта Ананаса + */ +#define db_document_header "dh%1" +#define db_document_table "dt%1_%2" +#define db_catalog_element "ce%1" +#define db_catalog_group "cg%1" +#define db_iregister "ri%1" +#define db_aregister "ra%1" +#define db_areg_remainder "ra%1_rem" +#define db_user_roles "usr_rl" +#define db_users "usr" +#define db_roles "rl" +#define db_right_roles "r_rl" +#define db_indices "idc" +#define db_areg_dim "ra%1_d%2" + +class aDatabase; +class aCfgRc; +class aDataTable; + +/*! + *\~english + * Database abstraction layer class. + * Used for working with SQL database on metadata context. + *\~russian + * \brief Класс для работы с СУБД. Ananas Data Abstraction Layer. + * Наследует QObject. + * + * Обеспечивает унифицированный программный интерфейс доступа к данным, независимый от используемой СУБД. + * Используется для работы с базой данных в контексте бизнес схемы. + *\~ + */ +class ANANAS_EXPORT aDatabase: public QObject +{ + Q_OBJECT + +public slots: + +public: + + enum DBPermission { + DBP_NoAccess = 0, + DBP_View = 1 << 0, + DBP_Update = 1 << 1, + DBP_Insert = 1 << 2, + DBP_Delete = 1 << 3, + DBP_Execute = 1 << 4, + DBP_TurnOn = 1 << 5, + DBP_TurnOff = 1 << 6, + DBP_All = 0xFFFF + }; + + /*! \~english type of database drivers \~russian перечисление типов баз данных \~ */ + enum dbServer + { + /*! \~english Unknown driver (not supported)\~russian Неизвестный драйвер (не поддерживается)\~ */ + unknown, + /*! \~english MySQL driver \~russian MySQl драйвер \~ */ + mysql, + /*! \~english PostgreSQL driver \~russian PostgreSQL драйвер \~ */ + postgresql, + /*! \~english ODBC driver (not supported)\~russian ODBC драйвер (не поддерживается) \~ */ + odbc, + /*! \~english Oracle driver (not supported)\~russian Oracle драйвер (не поддерживается) \~ */ + oracle, + /*! \~english MSSQL driver (not supported)\~russian MSSQL драйвер (не поддерживается) \~ */ + mssql, + /*! \~english Sybase driver (not supported)\~russian Sybase драйвер (не поддерживается) \~ */ + sybase }; + /*! \~english link to database \~russian ссылка на базу данных \~ */ + QSqlDatabase ddb; + /*! \~english metadata object \~russian метаданные \~ */ + aCfg cfg; + QDataSchema *qds; + + aDatabase(); + ~aDatabase(); + bool init( aCfgRc *rc, const QString &dbname = QString::null ); + bool init( const QString &rcname, const QString &dbname = QString::null ); + bool prepareDatabaseConnect( aCfgRc *rc ); + void done(); + QSqlDatabase *db(const QString &dbname = QString::null ); + bool checkStructure(); + bool create(); + bool drop( const QString &); + bool update(); + Q_ULLONG uid( int otype ); +// int otype( Q_ULLONG uid ); + int uidType ( Q_ULLONG uid ); + aDataTable *table( const QString & name = QString::null ); + bool tableExists( const QString & name ); + void markDeleted(qulonglong uid); + void deleteMarked(); + QString driverName(); + + bool isAccessRights( int md_type, Q_ULLONG obj_id, DBPermission req_operation ); + + static QStringList supportedDriverList(); + static QStringList getUniqueIndices(const QString & flddef); + static QString tableDbName( aCfg &md, aCfgItem context, long * tid); + static QString tableDbName( aCfg &md, aCfgItem context); + + bool exchangeDataSystables ( QDomDocument &xml, bool import ); + bool exchangeDataCatalogues ( QDomDocument &xml, bool import ); + bool exchangeDataDocuments ( QDomDocument &xml, bool import ); + bool exchangeDataJournals ( QDomDocument &xml, bool import ); + bool exchangeDataInfoRegisters ( QDomDocument &xml, bool import ); + bool exchangeDataAccumulationRegisters ( QDomDocument &xml, bool import ); + bool exchangeDataUniques ( QDomDocument &xml, bool import ); + + bool transaction(); + bool commit(); + bool rollback(); + + QStringList users(); + int loginUsersCount(); + bool login( const QString &username, const QString &password, int applicationId = 0 ); + void logout(); + void netupdate(); + + bool isObjectLocked( Q_ULLONG id ); + bool objectLock( Q_ULLONG id ); + void objectUnlock( Q_ULLONG id=0 ); +// QDataSchema *qds(); + + int rolePermission( int role_id, int md_id ); + void setRolePermission( int role_id, int md_id, int new_permission ); + + static aDatabase *database(); +signals: + void refresh(); +protected: + void timerEvent ( QTimerEvent * ); +private: + /** + * \en + * link to database + * \_en \ru + * \brief Ссылка на объект доступа к базе данных sql сервера. + * \_ru + */ + QSqlDatabase *dataBase; + int v_user_id, v_app_id; + int v_updatesCount; + int v_timerId; + + int updatesCount(); + bool exportTableData(QDomDocument& xml, const QString &tableName); + bool importTableData(QDomDocument& xml, const QString &tableName); + void reportError(QSqlError er, const QString &query); + + bool isExists(const QString fname, QStringList *f_lst, QString &match); + bool createdb( bool update ); + bool dumpTable( QDomDocument& xml, const QString &tableName); + void fillFeatures(); + QString feature(const QString& fetureName); + + QMap featuresMySQL, featuresSQLite, featuresPostgreSQL; + QMap accessRights; +}; + +#endif diff --git a/src/lib/sys/sys.pri b/src/lib/sys/sys.pri new file mode 100644 index 0000000..565fc56 --- /dev/null +++ b/src/lib/sys/sys.pri @@ -0,0 +1,7 @@ +HEADERS += \ + sys/adatabase.h \ + sys/aapplication.h + +SOURCES += \ + sys/adatabase.cpp \ + sys/aapplication.cpp diff --git a/src/lib/widgets/awidget.cpp b/src/lib/widgets/awidget.cpp new file mode 100644 index 0000000..6cbb20f --- /dev/null +++ b/src/lib/widgets/awidget.cpp @@ -0,0 +1,1108 @@ +/**************************************************************************** +** $Id: awidget.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Code file of the Ananas visual bject of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include +#include "adatabase.h" +#include "awidget.h" +#include "wfield.h" +#include "wdbfield.h" +#include "wdbtable.h" +#include "aform.h" +#include "alog.h" + + +/*! + *\en + * Abstract Ananas widget object. + *\_en + *\ru + * Конструктор, создающий абстрактный объект. Абстрактность в данном случае означает + * отстутствие привязки к базе данных. \n + * Вызывает конструктор базового класса QWidget. + * \param parent - указатель на родительский виджет. + * \param name - имя создаваемого объекта. + * \param fl - флаги используемые при создании виджета. Передаются в конструктор базового класса. + *\_ru + */ +aWidget::aWidget( QWidget *parent, const char *name, Qt::WFlags fl ) +:QWidget( parent, name, fl ) +{ + vId = 0; + db = 0; + dbobj = 0; + engine = 0; + vFormMode = 0; + vInited = false; +} + +/*! + * \ru + * Конструктор, использующий для создания объекта имя элемента метаданных.\n + * У класса есть также конструктор, использующий для создания объекта ссылку на объект с описанием элемента метаданных. + * \param itemname - имя элемента метаданных. + * \param adb - ссылка на объект доступа к базе данных. + * \param parent - указатель на родительский виджет (передается в конструктор базового класса). + * \param name - имя создаваемого объекта (передается в конструктор базового класса). + * \param fl - флаги, используемые конструктором базового класса. + * \_ru + */ +aWidget::aWidget( const QString &itemname, aDatabase *adb, QWidget *parent, const char *name, Qt::WFlags fl ) +:QWidget( parent, name, fl ) +{ + vId = 0; + dbobj = 0; + vInited = false; + engine = 0; + vFormMode = 0; + if ( adb ) { + obj = adb->cfg.find( itemname ); + init( adb ); + } +} + + +/*! + * \ru + * Конструктор, использующий для создания объекта ссылку на объект элемента метаданных.\n + * У класса есть также конструктор, использующий для создания объекта имя элемента метаданных. + * \param context - ссылка на объект элемента метаданных. + * \param adb - ссылка на объект доступа к базе данных. + * \param parent - указатель на родительский виджет (передается в конструктор базового класса). + * \param name - имя создаваемого объекта (передается в конструктор базового класса). + * \param fl - флаги, используемые конструктором базового класса. + * \_ru + */ +aWidget::aWidget( aCfgItem context, aDatabase *adb, QWidget *parent, const char *name, Qt::WFlags fl ) +:QWidget( parent, name, fl ) +{ + vId = 0; + dbobj = 0; + vInited = false; + engine = 0; + obj = context; + vFormMode = 0; + init( adb ); +} + +aWidget::~aWidget() +{ + delete dbobj; + dbobj = 0; +} + + + +/*! + *\en + * Create database object. + *\_en + *\ru + * Пока ничего не делает. Возвращает 0; + *\_ru + */ +aObject * +aWidget::createDBObject( aCfgItem , aDatabase * ) +{ + return 0; +} + + + + +/*! + *\en + * Create toolbar for QMainWindow owner object. + *\_en + *\ru + * Пока ничего не делает. Возвращает 0; + *\_ru + */ +Q3ToolBar* +aWidget::createToolBar( Q3MainWindow * ) +{ + return 0; +} + + +/*! + *\ru + * Если объект не был проинициализирован, вызывает initObject(adb). + *\_ru + */ + +void +aWidget::init( aDatabase *adb ) +{ + if ( isInited() ) return; +// aWidget *pc = parentContainer( this ); +// if ( pc ) if ( !pc->isInited() ) pc->init( adb ); + initObject( adb ); +} + + + +/*! + *\en + * Init object after create. + * Need setId( id ), where id - if of the metadata object of the adb->cfg loaded Configuration. + *\_en + *\ru + * Инизиализирует созданный объект. + * Необходимо выполнить setId(id), где id идентификатор обекта в конфигурации. + *\_ru + *\param adb - \en ananas database object. \_en \ru объект доступа к базе данных. \_ru + */ +void +aWidget::initObject( aDatabase *adb ) +{ + aCfgItem fg, f; + QString tname; + + aLog::print(aLog::Debug, tr("aWidget init widget %1 form mode %2").arg(name()).arg(formMode()) ); + // Init myself. + setInited( true ); + + //<для чего? + Q3SqlPropertyMap *pm = new Q3SqlPropertyMap(); + //> + + + db = adb; + md = 0; + if ( db ) + { + md = &db->cfg; + } + else + { + aLog::print(aLog::Error, tr("aWidget init: invalid database") ); + return; + } + + if ( obj.isNull() ) + { + obj = md->find( getId() ); + } + + + //<для чего? + form = new Q3SqlForm( this ); + pm->insert("wDBField","value"); + form->installPropertyMap( pm ); + //> + + + if ( obj.isNull() ) + { + aLog::print(aLog::Error, tr("aWidget init: invalid meta object") ); + return; + } + dbobj = createDBObject( obj, adb ); + QObjectList l = this->queryList( "QWidget" ); + QListIterator it( l ); + QObject *obj; + while ( it.hasNext() ) + { + obj = it.next(); + if ( parentContainer( ( QWidget *) obj ) != this ) continue; + + //debug_message("SCAN: Widget class name=%s\n", obj->className() ); + + if ( obj->className()==QString("wDBTable") ) + { + + aLog::print(aLog::Debug, tr("aWidget init: connect signals wDBTable") ); + connect( this, SIGNAL( changeObj(const QString &) ), + //(wDBTable*) + obj, SLOT( newFilter(const QString &) )); + connect( this, SIGNAL( changeObjId(const qulonglong) ), + //(wDBTable*) + obj, SLOT( newDataId(const qulonglong) )); + } + // if ( obj->className()==QString("wDBField") ) + // { +// connect( this, SIGNAL( changeObj(const QString &) ), +// //(wDBTable*) +// obj, SLOT( newFilter(const QString &) )); + // } + } + //--delete l; // delete the list, not the objects + //--l=0; +} + + + +/*! + *\~english + *\~russian + *\~ + */ + /* +void +aWidget::formInsert( QWidget *widget, const QString &field ) +{ + form->insert( widget, field ); +} +*/ + + +/*! + *\~english + *\~russian + *\~ + */ +/* +void +aWidget::formRemove( const QString &field ) +{ + form->remove( field ); +} +*/ + + +/*! + *\en + *\_en + *\ru + * Ничего не делает. Возвращает false. + *\_ru + */ +bool +aWidget::checkStructure() +{ + return false; +} + + + +/*! + *\en + *\_en + *\ru + * Возвращает значение свойства vName. + *\_ru + */ +/*QString +aWidget::getName() const { +// if (vName.isEmpty()) return name(); + return vName; +} +*/ + + +/*! + *\en + *\_en + *\ru + * Устанавливает значение свойства vName. + *\_ru + */ + /* +void +aWidget::setName(QString fn){ + vName = fn; +} +*/ + + +/*! + *\en + *\_en + *\ru + * Ничего не делает. Возвращает 0. + *\_ru + */ +QDialog* +aWidget::createEditor( QWidget * ) +{ + return 0; +} + + + +/*! + *\en + *\_en + *\ru + * Вызывает редактор свойств, если значение передаваемого параметра равно true. + * Редактор свойств предоставляет пользователю диалог задания значений свойств виджета. + * Например, для такого виджета как wDBField редактор свойств позволяет выбрать элемент метаданных + * описывающий поле базы данных, значение которого будет редактироваться с использованием виджета. + * То есть осуществить привязку данных (data bindings). + *\param fn - параметр, значение которого должно быть равно true, для того чтобы был вызван + * редактор свойств. + *\_ru + */ +void +aWidget::setOpenEditor( bool fn ) +{ + if(fn) widgetEditor(); +} + + + +/*! + *\en + * Emit signal setData( object, md ). + *\_en + *\ru + * Посылает сигнал setData( object, md ). + *\_ru + */ +void +aWidget::setObjectData( QWidget *object, aCfg *md ) +{ + emit( setData( object, md ) ); +} + + + +/*! + *\en + * Emit signal getData( object ). + *\_en + *\ru + * Посылает сигнал getData( object ). + *\_ru + */ +void +aWidget::getObjectData( QWidget *object ) +{ + emit( getData( object ) ); +} + + + +/*! + *\en + * Return toplevel metadata configuration. + *\_en + *\ru + * Возвращает объект конфигурации для виджета верхнего уровня. + *\_ru + */ +aCfg* +aWidget::getMd() +{ + aCfg *md = 0; + QWidget *mw = topLevelWidget(); + if (mw->name() == QString("ananas-designer_mainwindow") ) + { + connect( this, SIGNAL( getMd( aCfg ** ) ), mw, SLOT( getMd( aCfg ** ) )); + emit ( getMd( &md ) ); + } + return md; +} + + + +/*! + *\~english + * Get id from database. + * Get id for current database record or 0 if database object not created. + *\~russian + * Возвращает id объекта базы данных. + * Возвращает id текущей записи в базе данных или 0 если обект + * для работы с базой не создан. Id является уникальным и идентифицирует конкретный + * экземпляр обекта. + *\~ + *\return \~english current database record id\~russian id текущей записи в базе данных.\~ + */ +qulonglong +aWidget::uid() +{ + if ( dbobj ) + { + return dbobj->getUid(); + } + else + { + aLog::print(aLog::Error, tr("aWidget invalid data source object") ); + } + return 0; +} + + + +/*! + *\~english + *\~russian + *\~ + */ +void +aWidget::widgetEditor() +{ + aWidget::widgetEditor( this, createEditor( topLevelWidget() ) ); +} + + + +/*! + *\~english + *\~russian + *\~ + */ +void +aWidget::widgetEditor( QWidget *object, QDialog *editor ) +{ + aCfg *md = 0; + QWidget *mw = object->topLevelWidget(); + aWidget o( mw ); + if ( mw->name() == QString( "ananas-designer_mainwindow" ) ) + { + md = o.getMd(); + if ( !md ) + { + aLog::print(aLog::Error, tr("aWidget widgetEditor: invalid metadata object") ); + return; + } + if ( editor ) { + connect( &o, SIGNAL( setData( QWidget *, aCfg* ) ), editor, SLOT( setData( QWidget *, aCfg* ) ) ); + connect( &o, SIGNAL( getData( QWidget * ) ), editor, SLOT( getData( QWidget * ) ) ); + o.setObjectData( object, md ); + if ( editor->exec() == QDialog::Accepted ) + { + o.getObjectData( object ); + //o.updateProp(); + } + delete editor; + editor = 0; + } + } +} + + + +/*! + *\~english + *\~russian + *\~ + */ +aWidget * +aWidget::parentContainer( QWidget *w ) +{ + while ( w ) + { + w = w->parentWidget(); + if ( w ) + { + if ( w->inherits("aWidget") ) + { + if ( ( ( aWidget *) w )->isContainer()) break; + } + } + } + return ( aWidget *) w; +} + + + +/*! + *\~english + *\~russian + *\~ + */ +aForm * +aWidget::parentForm( QWidget *w ) +{ + while ( w ) + { + if ( w->inherits("aForm") ) break; + w = w->parentWidget(true); + } + return ( aForm *) w; +} + + + +/*! + *\~english + *\~russian + *\~ + */ +aCfgItem * +aWidget::getMDObject() +{ + return &obj; +} + + + +/*! + *\~english + *\~russian + *\~ + */ +void +aWidget::setMDObject( aCfgItem object ) +{ + obj = object; +} + + + +/*! + *\~english + *\~russian + *\~ + */ +aSQLTable * +aWidget::table( const QString &name ) +{ + if ( dbobj ) + { + return dbobj->table( name ); + } + aLog::print(aLog::Error, tr("aWidget table: invalid data source object") ); + return 0; +} + +/* +bool +aWidget::tableInsert( const QString &name ) +{ + if ( db ) { + aSQLTable *t = db->table( name ); + if ( !t ) return false; + dbtables.insert( name, t ); + return true; + } + return false; +} + + +bool +aWidget::tableRemove( const QString &name ) +{ + dbtables.remove( name ); + return true; +} +*/ + + + +/*! + *\~english + *\~russian + *\~ + */ +QString +aWidget::displayString() +{ + return ""; +} + + + + +/*! + *\~english + * Create new database record object. + * New object create with using wirtual function aObject::New() of aObject + * and it's childs. + *\~russian + * Создает новый объект для работы с записями базы данных. + * Объект создается испоьлзуя виртуальную функцию aObject::New() объекта aObject + * и его потомков. + *\~ + *\return \~engilsh error code. \~russian код ошибки.\~ + */ +ERR_Code +aWidget::New() +{ + if ( dbobj ) + { + return dbobj->New(); + } + aLog::print(aLog::Error, tr("aWidget new: invalid data source object") ); + return err_abstractobj; + +} + + + +/*! + *\~english + * Select object in database. + *\~russian + * Выбирает объект в базе данных. + *\~ + *\param id -\~english database record id.\~russian id объекта в базе данных.\~ + *\return \~english error code.\~russian код ошибки.\~ + */ +ERR_Code +aWidget::Select( qulonglong id ) +{ + int rc = 0; + if ( dbobj ) + { + bool res; + res = dbobj->select( id ); + if(res) rc = err_noerror; + else rc = err_selecterror; + //Refresh(); + return rc; + } + aLog::print(aLog::Error, tr("aWidget select: invalid data source object") ); + return err_abstractobj; +} + + + +/*! + *\~english Update data + *\~russian Обновляет данные по данному виджету в базе + *\~ + */ +ERR_Code +aWidget::Update() +{ + QString fname; + if ( dbobj ) + { + + QObjectList l = this->queryList( "wDBField" ); + QListIterator it( l ); + aWidget *obj; + while ( it.hasNext() ) + { + obj = qobject_cast(it.next()); + fname= obj->getFieldName(); + dbobj->SetValue( fname,( ( aWidget *) obj )->value() ); + } + //--delete l; // delete the list, not the objects + //--l=0; +/* + while ( (obj = (aWidget*) tit.current()) != 0 ){ + ++tit; + ((QDataTable*)obj)->refresh(); + } + delete tl; // delete the list, not the objects + + return err_noerror; +*/ + return dbobj->Update(); + } + aLog::print(aLog::Error, tr("aWidget update: invalid data source object") ); + return err_incorrecttype; +} + +/*! + *\~english + *\~russian + *\~ + */ +ERR_Code +aWidget::Refresh() +{ + QString fname; + QObjectList l = this->queryList( "wDBField" ); + QListIterator it( l ); + QObjectList tl = this->queryList( "wDBTable" ); + QListIterator tit( tl ); + aWidget *obj; + while ( it.hasNext() ){ + obj = qobject_cast(it.next()); + if ( parentContainer( obj ) != this ) continue; + fname= obj->getFieldName(); + obj->setValue(dbobj->Value(fname).toString()); + } + //--delete l; // delete the list, not the objects + //--l=0; + + Q3DataTable* obj2; + while ( tit.hasNext() ){ + obj2 = qobject_cast(tit.next()); + obj2->refresh(); + } + //--delete tl; // delete the list, not the objects + + return err_noerror; +} + + +/*! + *\~english + *\~russian + *\~ + */ +ERR_Code +aWidget::TurnOn() +{ + return err_incorrecttype; +} + + + +/*! + *\~english + * Get field value. + * get value for field with such name. + *\~russian + * Возвращает значение поля. + * Возвращает значение поля с именем name. + *\~ + *\param name - \~english field md name. \~russian имя поля в конфигурации.\~ + *\return \~english field value. \~russian значение поля.\~ + */ +QVariant +aWidget::value( const QString & nameWidget ) +{ + QObject *w; + QVariant res; +/* + aObject *o = 0; + if ( mainWidget ) o = mainWidget->dataObject(); + if ( o ) { + res = o->Value( name ); + } + if ( res.type() != QVariant::Invalid ) return res; + else printf("no field %s in data object\n", ( const char *) name ); +*/ + w = Widget( nameWidget ); + if ( w ) { + if (w->inherits("aWidget")){ + res=( (aWidget*)w )->textValue();//value(); +// } else if (w->inherits("wField")){ +// res=( (wField*)w )->text();//value(); + } else if (!strcmp(w->className(),"QPushButton")){ + res=((QPushButton *)w)->text(); + } else if (!strcmp(w->className(),"QLabel")){ + res=((QLabel*)w)->text(); + } else if (!strcmp(w->className(),"QLineEdit")){ + res=((QLineEdit*)w)->text(); + } else if (!strcmp(w->className(),"QCheckBox")){ + res=((QCheckBox*)w)->text(); + } else if (!strcmp(w->className(),"QDateEdit")){ + res=((Q3DateEdit*)w)->date().toString(Qt::ISODate); + } + } else { + // debug_message(tr("Error! Can't find widget by name==`%s`\n"),(const char*) name.local8Bit()); + + aLog::print(aLog::Error, tr("aWidget value not fount widget with name %1").arg(nameWidget) ); + } + return res; +// if ( dbobj ) return dbobj->Value(name); +//CHECK_POINT +// return QVariant(""); +} + + + +/*! + *\~english + * Setting form widgets value. + * Support type of widgets: wField, wDBField, QPushButton, QLabel, QLineEdit, QCheckBox. + *\~russian + * Установка значения виджетов формы. + * Поддерживаемые типы виджетов: wField, wDBField, QPushButton, QLabel, QLineEdit, QCheckBox. + *\~ + *\param nameWidget -\~english Widget name. + \~russian Имя виджета. + \~ + *\param value -\~english value. + \~russian Значение виджета. + \~ + */ +int +aWidget::setValue( const QString & nameWidget, const QVariant &value ) +{ + QObject *w; + int rc= err_noerror; + + w = Widget( nameWidget ); + if ( w ) { + if (w->inherits("wField")){ + ((aWidget*)w)->setValue(value.toString()); +// } else if (w->inherits("wField")){ +// ((wField*)w)->setValue(value.toString()); + } else if (!strcmp(w->className(),"QPushButton")){ + ((QPushButton *)w)->setText( value.toString() ); + } else if (!strcmp(w->className(),"QLabel")){ + ((QLabel*)w)->setText( value.toString() ); + } else if (!strcmp(w->className(),"QLineEdit")){ + ((QLineEdit*)w)->setText( value.toString() ); + } else if (!strcmp(w->className(),"QCheckBox")){ + ((QCheckBox*)w)->setText(value.toString() ); + } else if (!strcmp(w->className(),"QDateEdit")){ + ((Q3DateEdit*)w)->setDate( value.toDate() ); + } + } else { + //debug_message(tr("aForm::SetValue() Error! Can't find widget by name==`%s`\n"),(const char*) name.local8Bit()); + aLog::print(aLog::Error, tr("aWidget set value: not fount widget with name %1").arg(nameWidget) ); + rc = err_nowidgetfound; + } + return rc; +} + + + +/*! + *\~english + * Setting form widgets value. + * Must be implemented in inherited class. + *\~russian + * Функция установки значения виджетов формы. + * Должна быть реализована в наследующем классе. + *\~ + *\param value -\~english value. + \~russian Значение виджета. Имя у виджета уже есть в момент вызова этой функции. + \~ + */ +void +aWidget::setValue( const QString & value) +{ +} +/*! + *\~english + * Setting form widgets value of object type. + * Support type of widgets: wField, wDBField. + *\~russian + * Установка значения виджетов формы сложного типа. + * Поддерживаемые типы виджетов: wField, wDBField. + *\~ + *\param nameWidget -\~english Widget name. + \~russian Имя виджета. + \~ + *\param value -\~english value. + \~russian Значение виджета. + \~ + */ +int +aWidget::setObjValue( const QString & nameWidget, aObject *value ) +{ + QObject *w; + int rc= err_noerror; + w = Widget( nameWidget ); + if ( w ) { + if (w->inherits("wField") && value){ + ((aWidget*)w)->setValue(QString("%1").arg(value->getUid())); + } + } else { + //debug_message(tr("aForm::SetValue() Error! Can't find widget by name==`%s`\n"),(const char*) name.local8Bit()); + aLog::print(aLog::Error, tr("aWidget set value: not fount widget with name %1").arg(nameWidget) ); + rc = err_nowidgetfound; + } + return rc; +} + + +/*! + *\~english + *\~russian + *\~ + */ +bool +aWidget::isContainer() +{ + return false; +} + + + +/*! + *\~english + * Seting widget readonly flag. + * When widget readonly it's fields can't be edit, and make updatе action + *\~russian + * Устанавливает флаг толко чтение. + * Когда установлен этот флаг, запрещается редактирование полей виджета, + * и сохранение изменений в базу. + *\~ + *\param status - \~english New readonly flag.\~russian Новое значение флага только чтение.\~ + */ +void +aWidget::SetReadOnly ( bool status ) +{ +//CHECK_POINT + QObjectList l;// = this->queryList( "wField" ); + QObject *obj; + l = this->queryList( "aWidget" ); + QListIterator itl( l ); + while ( itl.hasNext() ) + { +// CHECK_POINT + obj = itl.next(); + (( aWidget *)obj)->SetReadOnly( status ); + } + //--delete l; // delete the list, not the objects + l = this->queryList( "QFrame" ); + QListIterator tl( l ); + while ( tl.hasNext() ) + { + //printf("QFrame classname '%s'\n", (const char*) obj->className() ); + obj = tl.next(); + if (obj->inherits("QTable")) (( Q3Table * )obj)->setReadOnly(true); + //else (( QFrame *)obj)->setDisabled( status ); + } + //--delete l; // delete the list, not the objects + //--l=0; +} + + +/*! + * + */ +qulonglong +aWidget::docId() +{ + if ( dbobj ) + { + return dbobj->docId(); + } + aLog::print(aLog::Error, tr("aWidget doc Id: invalid data source object") ); + return 0; +} + + + +QString +aWidget::widgetName(QWidget *obj) +{ + QString res=""; + if (obj) + { + if (obj->inherits("wDBField")) + { + res= ((aWidget*)obj)->getFieldName(); + } + else + { + res=obj->name(); + } + } + return res; +} + + + + +/*! + *\~english + * Return form widget pointer by name. + *\~russian + *\~ +*/ +QWidget* +aWidget::Widget( QWidget *owner, QString name ) +{ + QWidget *res = 0; + QWidget* obj; + QObjectList list = owner->queryList("QWidget"); + + QListIterator it(list); + while ( it.hasNext() ) { + obj = qobject_cast(it.next()); + if (!obj) continue; + if ( name == aWidget::widgetName( obj ) ) { + res = obj; + break; + } + } + return res; +} + + + +/*! + *\~english + * Return form widget pointer by name. + *\~russian + *\~ +*/ +QWidget * +aWidget::Widget( QString name, bool onlyMyWidgets ) +{ + QWidget *res = aWidget::Widget( this, name ); + if ( onlyMyWidgets && parentContainer( res ) != this ) res = 0; + return res; +} + + + +/*! + *\~english + * Return form widget pointer by name. + *\~russian + *\~ +*/ +aDataField* +aWidget::getAttribute( const QString & name ) +{ + aDataField *f = 0; + + return f; +} + + + +/*! + *\~english + * Return form widget pointer by name. + *\~russian + *\~ +*/ +int +aWidget::setAttribute( const QString & name, const aDataField *value ) +{ + return 0; +} + + +/*! + *\~english + * + *\~russian + * Обрабатывает события при нажатии кнопок клавиатуры. + *\~ + */ +void +aWidget::keyPressEvent ( QKeyEvent *e ) +{ +// switch ( e->key() ){ +// case Qt::Key_Escape: +// printf("ESC\n"); +// break; +// default: +// e->ignore(); +// break; +// } + + QWidget::keyPressEvent( e ); +} + diff --git a/src/lib/widgets/awidget.h b/src/lib/widgets/awidget.h new file mode 100644 index 0000000..e1fe08b --- /dev/null +++ b/src/lib/widgets/awidget.h @@ -0,0 +1,156 @@ +/**************************************************************************** +** $Id: awidget.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the Ananas visual bject of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef AWIDGET_H +#define AWIDGET_H +#include +#include +#include +//Added by qt3to4: +#include +#include "ananas.h" + +class QWidget; + + + +/*! + *\~english + * Base visual object. + *\~russian + * \brief Базовый класс для визуальных объектов. + * Наследует QWidget. + * + * От него наследуют свойства и методы такие визуальные объекты + * как контейнеры wDocument, wJournal, wCatalog, wDocument, wReport и виджеты wField, wDBField.\n + * + */ +class ANANAS_EXPORT aWidget : public QWidget +{ + Q_OBJECT +// Q_PROPERTY( QString Name READ getName WRITE setName STORED true DESIGNABLE false ) + Q_PROPERTY( int Id READ getId WRITE setId STORED true DESIGNABLE false ) + Q_PROPERTY( bool openEditor READ getOpenEditor WRITE setOpenEditor STORED false ) + Q_PROPERTY( int FormMode READ formMode WRITE setFormMode STORED true ) +public: + aDatabase* db; + aCfg* md; + aEngine* engine; + + aWidget( QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0 ); + aWidget( const QString &oname, aDatabase *adb, QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0 ); + aWidget( aCfgItem context, aDatabase *adb, QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0 ); + virtual ~aWidget(); + + virtual bool checkStructure(); + virtual void initObject( aDatabase *adb ); + virtual void widgetEditor(); + static void widgetEditor( QWidget *object, QDialog *editor ); + virtual QDialog* createEditor( QWidget *parent ); + virtual Q3ToolBar* createToolBar( Q3MainWindow *parent ); + virtual aObject* createDBObject( aCfgItem obj, aDatabase * ); + virtual QString displayString(); + + void init( aDatabase *adb ); + bool getOpenEditor() const { return false; }; + void setOpenEditor( bool );// { widgetEditor(); }; + bool isInited() { return vInited; }; + virtual bool isContainer(); + void setInited( bool flag ){ vInited = flag; }; +// void formInsert( QWidget *widget, const QString &field ); +// void formRemove( const QString &field ); + static aWidget* parentContainer( QWidget *w ); + static aForm* parentForm( QWidget *w ); + aCfgItem* getMDObject(); + void setMDObject( aCfgItem object ); + aSQLTable* table( const QString &name = "" ); +// bool tableInsert( const QString &name ); +// bool tableRemove( const QString &name ); + void setObjectData( QWidget *object, aCfg *md ); + void getObjectData( QWidget *object ); + aCfg* getMd(); + virtual qulonglong uid(); + virtual ERR_Code New(); + virtual ERR_Code Update(); + virtual ERR_Code TurnOn(); + virtual ERR_Code Select( qulonglong id ); + aObject* dataObject(){ return dbobj; }; + + virtual qulonglong docId(); + int formMode() const { return vFormMode; }; + virtual void setFormMode( int mode ){ vFormMode = mode; }; + virtual QString getFieldName() const { return ""; }; + + static QString widgetName( QWidget *w ); + static QWidget* Widget( QWidget *owner, QString name ); + +// QString getName() const; +// void setName( QString fn ); + int getId() const { return vId ;}; + void setId( int fn ){ vId = fn; }; + +public slots: + virtual QVariant value( const QString & name ); + virtual QString value() const {return QString::null;}; + virtual QString textValue() {return QString::null;}; + virtual void setValue( const QString &); + virtual int setValue( const QString & name, const QVariant &value ); + virtual int setObjValue( const QString & nameWidget, aObject *value ); + virtual void SetReadOnly(bool); + virtual int Refresh(); + QWidget* Widget( QString name, bool onlyMyWidgets = true ); + + virtual aDataField* getAttribute( const QString & name ); + virtual int setAttribute( const QString & name, const aDataField *value ); + +signals: + void setData( QWidget *, aCfg * ); + void getData( QWidget * ); + void getMd( aCfg ** ); + void valueChanged( const QString &, const QVariant & ); + void valueChanged( const QString &, const QVariant &, const QString & ); + void changeObj(const QString &); + void changeObjId(const qulonglong); + void keyPressed(QKeyEvent *e); + +protected: + aObject *dbobj; + virtual void updateProp() {}; + virtual void keyPressEvent ( QKeyEvent * e ); +private: + bool vInited; + QString vName; + int vId, vFormMode; + aCfgItem obj; + Q3SqlForm* form; +// QDict dbtables; +}; + + +#endif diff --git a/src/lib/widgets/widgets.pri b/src/lib/widgets/widgets.pri new file mode 100644 index 0000000..bc23eaf --- /dev/null +++ b/src/lib/widgets/widgets.pri @@ -0,0 +1,5 @@ +HEADERS += \ + widgets/awidget.h + +SOURCES += \ + widgets/awidget.cpp diff --git a/src/plugins/README b/src/plugins/README new file mode 100644 index 0000000..d360b41 --- /dev/null +++ b/src/plugins/README @@ -0,0 +1,69 @@ +_Введение_ +В каждом каталоге находится код, реализующий ровно один плагин (plugin), предназначенный для +использования в QSA Designer. +С помощью этих плагинов реализуется связывание данных (data binding) +элементов настраиваемого пользовательского интерфейса Ананаса с базами, +хранящимися на SQL сервере, облегчающее +прикладному программисту-настройщику создание экранных форм-диалогов. + + +_Спецификация_ +Визуальные плагины ананас состоят из двух модулей: +- плагин, реализующий функциональность +- диалог конфигурации плагина в дизайнере Ананас + +Плагин реализует _только_ функциональность, необходимую для работы +в инициализированной форме диалога. Он не должен содержать функции, +необходимые для поддержки форм диалога. Плагин всегда вставляется в +объект-контейнер. Для получения дополнительной информации для +инициализации использовать функцию: +static aWidget *aWidget::parentContainer( QWidget *w ); + +Диалог конфигурации считывает и отображает свойства плагина, +позволяет редактировать их, используя статические функции +aWidget и aObject для получения указателей на метаданные, +контейнер плагина и дополнительной информации,сохраняет свойства +в плагине для записи в структуру формы. +Диалог должен считать всю необходимую информацию из метаданных +при установке параметров и в дальнейшем к метаданным не обращаться. +Функции для получения дополнительной информации: +static aWidget *aWidget::parentContainer( QWidget *w ); + +В режиме настройки плагин должен использовать _только_ метаданные +без обращения к базе данных, так как информация в БД не актуальна до +момента обновления структуры при сохранении метаданных. + +_Компилирование_ + +Makefile'ы генерируются командой qmake на основе содержимого *.pro файлов. +Для изменения процедуры компиляции следует вносить изменения в *.pro файлы. + +компилирование заключается в задании двух команд +qmake +make + +в каждом подкаталоге + + +_Установка_ + +После успешной компиляции необходимо скопировать получившиеся динамические библиотеки +в каталог /usr/lib, а лучше создать ссылку. +А также проверить появились ли они в каталоге +$(QTDIR)/plugins/designer + + +_Возможные проблеммы_ + +Если компиляция и копирование библиотек выполнено, а при запуске designer плагины +не отображаются в списке виджелов, попробуйте исправить содержимое файла *.pro, +убрав параметр +thread +в строке, начинающейся со слова CONFIG + +Удачи! + + + + + diff --git a/src/plugins/actionbutton/actionbutton.pri b/src/plugins/actionbutton/actionbutton.pri new file mode 100644 index 0000000..caf0592 --- /dev/null +++ b/src/plugins/actionbutton/actionbutton.pri @@ -0,0 +1,15 @@ +HEADERS += \ + actionbutton/eactionbutton.h \ + actionbutton/wactionbutton.h \ + actionbutton/wactionbutton_plugin.h \ + actionbutton/wactionbutton_taskmenu.h \ + +SOURCES += \ + actionbutton/eactionbutton.cpp \ + actionbutton/wactionbutton.cpp \ + actionbutton/wactionbutton_plugin.cpp \ + actionbutton/wactionbutton_taskmenu.cpp \ + +FORMS += \ + actionbutton/eactionbutton.ui + \ No newline at end of file diff --git a/src/plugins/actionbutton/eactionbutton.cpp b/src/plugins/actionbutton/eactionbutton.cpp new file mode 100644 index 0000000..76d9263 --- /dev/null +++ b/src/plugins/actionbutton/eactionbutton.cpp @@ -0,0 +1,138 @@ +#include "eactionbutton.h" + +#include +#include +#include + +#include +#include + +/* + * Constructs a eActionButton as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eActionButton::eActionButton(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + +} + +/* + * Destroys the object and frees any allocated resources + */ +eActionButton::~eActionButton() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eActionButton::languageChange() +{ + retranslateUi(this); +} + +void eActionButton::Action_toggled( bool o ) +{ + Script->setChecked( !o ); + //else +} + + +void eActionButton::Script_toggled( bool o ) +{ + Action->setChecked( !o ); +} + +void eActionButton::setData( wActionButton *b ) +{ + if ( !b ) return; + if ( b->isAction() ) Action->setChecked( TRUE ); + if ( b->isActionUpdate() ) cbUpdate->setChecked( TRUE ); + if ( b->isActionTurnOn() ) cbTurnon->setChecked( TRUE ); + if ( b->isActionClose() ) cbClose->setChecked( TRUE ); + if ( b->isScript() ) Script->setChecked( TRUE ); +// cbAction->setCurrentItem(b->getAction()) + // eCode->setText( b->getScriptCode() ); +// button = b; + aWidget *wd = aWidget::parentContainer( b ); + if ( !strcmp(wd->name(),"Catalogue") ) + { + cbTurnon->setChecked( false ); + cbTurnon->setHidden( TRUE ); + +// b->setActionTurnOn( FALSE ); + } + aCfg *md = wd->getMd(); + QStringList l_name; + aCfgItem parent = md->find(mdc_actions); + l_id.clear(); + loadActions(&l_name, &l_id, parent, md); + cbAction->clear(); + cbAction->insertStringList(l_name); + cbAction->setCurrentItem( l_id.findIndex( QString("%1").arg(b->getActionId()) ) ); + +} + + +void eActionButton::getData( wActionButton *button) +{ + if ( !button ) return; + button->setAction( Action->isChecked() ); + button->setActionUpdate( cbUpdate->isChecked() ); + button->setActionTurnOn( cbTurnon->isChecked() ); + button->setActionClose( cbClose->isChecked() ); + button->setScript( Script->isChecked() ); + button->setActionUpdate( cbUpdate->isChecked() ); + if(cbAction->isEnabled()) + { + + button->setActionId ( atoi(l_id[cbAction->currentItem()].ascii())); + } + else + { + button->setActionId(0); + } +// button->setScriptCode( eCode->text() ); +} + +void eActionButton::destroy() +{ + //getData(); +} + + +void +eActionButton::loadActions( QStringList *lst, QStringList *id, aCfgItem p, aCfg *md ) +{ + aCfgItem cobj; + QString oclass; + if(p.isNull()) + { + p = md->find(mdc_actions); + // printf("parent were NULL, set parent to %s\n",md->objClass(p).ascii()); + } + + if(p.isNull()) return; + cobj = md->firstChild ( p ); + while ( !cobj.isNull() ) + { + oclass = md->objClass ( cobj ); + if ( oclass == md_actiongroup ) + loadActions ( lst, id, cobj, md ); + if ( oclass == md_action ) + { + lst->append(md->attr(cobj,mda_name)); + id->append(md->attr(cobj,mda_id)); + } + cobj = md->nextSibling ( cobj ); + } +} + diff --git a/src/plugins/actionbutton/eactionbutton.h b/src/plugins/actionbutton/eactionbutton.h new file mode 100644 index 0000000..592bdb9 --- /dev/null +++ b/src/plugins/actionbutton/eactionbutton.h @@ -0,0 +1,34 @@ +#ifndef EACTIONBUTTON_H +#define EACTIONBUTTON_H + +#include "ui_eactionbutton.h" + + +class eActionButton : public QDialog, public Ui::eActionButton +{ + Q_OBJECT + +public: + eActionButton(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eActionButton(); + +public slots: + virtual void Action_toggled( bool o ); + virtual void Script_toggled( bool o ); + virtual void setData( wActionButton *o ); + virtual void getData( wActionButton *o ); + +protected: + virtual void loadActions( QStringList *lst, QStringList *id, aCfgItem parent, aCfg *md); + +protected slots: + virtual void languageChange(); + +private: + QStringList l_id; + + void destroy(); + +}; + +#endif // EACTIONBUTTON_H diff --git a/src/plugins/actionbutton/eactionbutton.ui b/src/plugins/actionbutton/eactionbutton.ui new file mode 100644 index 0000000..e3d4541 --- /dev/null +++ b/src/plugins/actionbutton/eactionbutton.ui @@ -0,0 +1,206 @@ + + + + + eActionButton + + + + 0 + 0 + 484 + 228 + + + + Action button + + + + + + + 3 + 5 + 0 + 0 + + + + 0 + + + Simple action + + + true + + + false + + + false + + + false + + + + + + + + Update + + + + + + + Close + + + + + + + Turn on + + + + + + + + + + + + User action + + + true + + + false + + + false + + + false + + + + + + + + + 0 + 5 + 0 + 0 + + + + Execute + + + false + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + 0 + + + + OK + + + + + + + + 1 + 0 + 0 + 0 + + + + Cancel + + + + + + + + 20 + 121 + + + + Expanding + + + Vertical + + + + + + + + + qPixmapFromMimeSource + + wactionbutton.h + awidget.h + + + + Action + toggled(bool) + eActionButton + Action_toggled(bool) + + + Script + toggled(bool) + eActionButton + Script_toggled(bool) + + + pushButton1 + clicked() + eActionButton + accept() + + + pushButton2 + clicked() + eActionButton + reject() + + + diff --git a/src/plugins/actionbutton/wactionbutton.cpp b/src/plugins/actionbutton/wactionbutton.cpp new file mode 100644 index 0000000..fb7bd7a --- /dev/null +++ b/src/plugins/actionbutton/wactionbutton.cpp @@ -0,0 +1,106 @@ +/**************************************************************************** +** $Id: wactionbutton.cpp,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the table plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "wactionbutton.h" +#include "eactionbutton.h" +#include +#include +#include +#include "qobject.h" +#include "qobject.h" +//Added by qt3to4: +#include + +//--#include "command.h" +//--#include "formwindow.h" +//--#include "mainwindow.h" +//--#include "mainform.h" + +#include "adatabase.h" + +wActionButton::wActionButton( QWidget *parent, const char *name ) + : QPushButton( parent, "wActionButton") +{ + action = true; + actionId=0; + actionUpdate = actionTurnOn = actionClose = false; + connect( this, SIGNAL(clicked()), this, SLOT(onClick()) ); + +} + + +wActionButton::~wActionButton() +{ +} + + +void +wActionButton::openEditor() +{ + eActionButton *e = new eActionButton(this->topLevelWidget()); + aCfg *md; + e->setData(this); + if ( e->exec()==QDialog::Accepted ) + { + e->getData(this); + //updateProp(); + } + delete e; + e=0; +} + + + +void +wActionButton::onClick() +{ +//CHECK_POINT +} + +void +wActionButton::keyPressHandler ( QKeyEvent * e ) +{ + CHECK_POINT + switch(e->key()) + { + case Qt::Key_Return: + break; + case Qt::Key_Escape: + if(accel() == QKeySequence(Qt::Key_Escape)) + { + emit(clicked()); + e->accept(); + } + break; + + } + //printf("key pressed %c",e->ascii()); + //QWidget::keyPressEvent ( e ); + e->ignore(); +} diff --git a/src/plugins/actionbutton/wactionbutton.h b/src/plugins/actionbutton/wactionbutton.h new file mode 100644 index 0000000..d0d0823 --- /dev/null +++ b/src/plugins/actionbutton/wactionbutton.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** $Id: wactionbutton.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the table plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WACTIONBUTTON_H +#define WACTIONBUTTON_H + +#include +#include +//Added by qt3to4: +#include +#include "acfg.h" + +class QWidget; + +class QT_WIDGET_PLUGIN_EXPORT wActionButton : public QPushButton +{ + Q_OBJECT + Q_PROPERTY( bool openEditor READ getOpenEditor WRITE setOpenEditor STORED false ) + Q_PROPERTY( bool action READ isAction WRITE setAction DESIGNABLE true ) + Q_PROPERTY( bool actionUpdate READ isActionUpdate WRITE setActionUpdate DESIGNABLE true ) + Q_PROPERTY( bool actionTurnOn READ isActionTurnOn WRITE setActionTurnOn DESIGNABLE true) + Q_PROPERTY( bool actionClose READ isActionClose WRITE setActionClose DESIGNABLE true) + Q_PROPERTY( int actionId READ getActionId WRITE setActionId DESIGNABLE true) + Q_PROPERTY( bool script READ isScript WRITE setScript DESIGNABLE true) +// Q_PROPERTY( QString scriptCode READ getScriptCode WRITE setScriptCode DESIGNABLE false) +public: + + wActionButton( QWidget *parent = 0, const char *name = 0 ); + virtual ~wActionButton(); + + void openEditor(); + + +public slots: + + void onClick(); + void keyPressHandler ( QKeyEvent * e ); + + bool getOpenEditor() const { return false; }; + void setOpenEditor( bool b ) { if( b ) openEditor(); }; + bool isAction() const { return action; }; + bool isActionUpdate() const { return actionUpdate; }; + bool isActionTurnOn() const { return actionTurnOn; }; + bool isActionClose() const { return actionClose; }; + int getActionId() const { return actionId; }; + bool isScript() const { return !action; }; + QString getScriptCode() const { return scriptCode; }; + + void setAction( bool a ) { action = a; }; + void setActionUpdate( bool a ) { actionUpdate = a; }; + void setActionTurnOn( bool a ) { actionTurnOn = a; }; + void setActionClose( bool a ) { actionClose = a; }; + void setActionId( int a ) { actionId = a; }; + void setScript( bool a ) { action = !a; }; + void setScriptCode( QString a ) { scriptCode = a; }; +private: + + bool action, actionUpdate, actionTurnOn, actionClose; + int actionId; + QString scriptCode; +}; + +#endif //WACTIONBUTTON_H + diff --git a/src/plugins/actionbutton/wactionbutton_plugin.cpp b/src/plugins/actionbutton/wactionbutton_plugin.cpp new file mode 100644 index 0000000..31026db --- /dev/null +++ b/src/plugins/actionbutton/wactionbutton_plugin.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wactionbutton_plugin.h" + +#include +#include +#include + +#include "wactionbutton_taskmenu.h" +#include "wactionbutton.h" + + +wActionButtonPlugin::wActionButtonPlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wActionButtonPlugin::isContainer() const +{ + return false; +} + +bool wActionButtonPlugin::isInitialized() const +{ + return m_initialized; +} + +void wActionButtonPlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wActionButtonTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; +} + +QWidget *wActionButtonPlugin::createWidget(QWidget *parent) +{ + wActionButton *w = new wActionButton(parent); + return w; +} + +QString wActionButtonPlugin::name() const +{ + return QLatin1String("wActionButton"); +} + +QString wActionButtonPlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wActionButtonPlugin::toolTip() const +{ + return QString("Ananas for QT Action button Widget"); +} + +QString wActionButtonPlugin::whatsThis() const +{ + return QString(); +} + +QString wActionButtonPlugin::includeFile() const +{ + return QLatin1String("wactionbutton.h"); +} + +QIcon wActionButtonPlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wactionbutton.png"); +} + +QString wActionButtonPlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/actionbutton/wactionbutton_plugin.h b/src/plugins/actionbutton/wactionbutton_plugin.h new file mode 100644 index 0000000..9b03290 --- /dev/null +++ b/src/plugins/actionbutton/wactionbutton_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WACTIONBUTTON_PLUGIN_H +#define WACTIONBUTTON_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wActionButtonPlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wActionButtonPlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WACTIONBUTTON_PLUGIN_H diff --git a/src/plugins/actionbutton/wactionbutton_taskmenu.cpp b/src/plugins/actionbutton/wactionbutton_taskmenu.cpp new file mode 100644 index 0000000..3605c9e --- /dev/null +++ b/src/plugins/actionbutton/wactionbutton_taskmenu.cpp @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wactionbutton_taskmenu.h" +#include "wactionbutton.h" +#include "eactionbutton.h" + + +wActionButtonTaskMenu::wActionButtonTaskMenu(wActionButton *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wActionButtonTaskMenu::edit() +{ + //eActionButton e(m_widget->topLevelWidget()); + /*eActionButton e; + + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->openEditor(); +} + +QAction *wActionButtonTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wActionButtonTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wActionButtonTaskMenuFactory::wActionButtonTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wActionButtonTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wActionButton *ab = qobject_cast(object)) + return new wActionButtonTaskMenu(ab, parent); + + return 0; +} diff --git a/src/plugins/actionbutton/wactionbutton_taskmenu.h b/src/plugins/actionbutton/wactionbutton_taskmenu.h new file mode 100644 index 0000000..4d68b96 --- /dev/null +++ b/src/plugins/actionbutton/wactionbutton_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WACTIONBUTTON_TASKMENU_H +#define WACTIONBUTTON_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wActionButton; + +class wActionButtonTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wActionButtonTaskMenu(wActionButton *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wActionButton *m_widget; +}; + +class wActionButtonTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wActionButtonTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WACTIONBUTTON_TASKMENU_H diff --git a/src/plugins/aform.cpp b/src/plugins/aform.cpp new file mode 100644 index 0000000..a108061 --- /dev/null +++ b/src/plugins/aform.cpp @@ -0,0 +1,1896 @@ +/**************************************************************************** +** $Id: aform.cpp,v 1.3 2008/12/10 21:04:56 leader Exp $ +** +** Code file of Ananas forms of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2006 Leader InfoTech. All rights reserved. +** Copyright (C) Andrey Paskal , Yoshkar-Ola +** Copyright (C) Grigory Panov , Yoshkar-Ola +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +//--#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//--#include +#include +//--#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include + +#include "aform.h" +#include "wcatalogue.h" +#include "wdocument.h" +#include "wjournal.h" +#include "wreport.h" +#include "wfield.h" +#include "wdbfield.h" +#include "wtable.h" +#include "wdbtable.h" +#include "wactionbutton.h" +#include "alog.h" +/*! +Base form object. +*/ +aForm::aForm( QWidget *parent, aEngine *eng ) +:QObject( eng, (QString("aForm%1").arg(eng->next_obj_id++)).ascii()) +{ + engine = eng; + db = eng->db; + md = &db->cfg; + parentWidget = parent; + form = 0; + closeAfterSelect = false; + RO=false; + callerWidget = NULL; + mode = 0; + db_uid=0; + objid=0; + init(); +} + + + +aForm::aForm( QWidget *parent, aEngine *eng, Q_ULONG form_mid, aWidget* caller ) +:QObject( eng, (QString("aForm%1").arg(eng->next_obj_id++)).ascii() ) +{ + aCfgItem obj; + + engine = eng; + db = eng->db; + md = engine->md; + parentWidget = parent; + form = 0; + closeAfterSelect = false; + mdObj = md->find( form_mid ); + objid = form_mid; + db_uid=0; + RO=false; + callerWidget = caller; + mode = 0; + init(); +} + +aForm::aForm( QWidget *parent, aEngine *eng, QString oftype, QObject *aobj ) +:QObject( eng, (QString("aForm%1").arg(eng->next_obj_id++)).ascii()) +{ + engine = eng; + db = eng->db; + md = &db->cfg; + parentWidget = parent; + db_uid=0; + objid=0; + form = 0; + closeAfterSelect = false; + RO=false; + mode = 0; + init(); + +} + + + +aForm::~aForm() +{ +} + +aWidget * +aForm::parentContainer( QWidget *w ) +{ + w = w->parentWidget(); + while ( w ) { + if ( w->inherits("aWidget") ) break; + w = w->parentWidget(); + } + return ( aWidget *) w; +} + + +/*! + *\~english + * Init container object, that not inherits from aWidget. + *\~russian + * Инициализирует объекты, которые не унаследованы от aWidget, но + * требуют инициализации, например wDBTable. + *\~ + */ +void +aForm::initWidget( QWidget *widget, aDatabase *adb ) +{ + QString oclass = widget->className(); + if (oclass == "wDBTable") ( ( wDBTable* ) widget )->init( adb, engine ); +} + + +/*! + *\~english + * Recursive init all form containers and widgets. + *\~russian + * Инициализирует все виджеты, унаследованные от aWidget + *\~ + */ +void +aForm::initContainer( aWidget *widget, aDatabase *adb ){ + + // Init subobjects. + if ( !widget->isContainer() ) return; + + widget->engine = engine; + widget->init( adb ); + QObjectList l = widget->queryList( "QWidget" ); + QListIterator it( l ); // iterate over all subwidgets + QObject *obj; + QString oclass; + aWidget *aw; +// QWidget *w; + // Init all container owned widgets + while ( it.hasNext() ) { + // for each found object... + obj = it.next(); + if ( !obj ) continue; + if ( parentContainer( ( QWidget *) obj ) != widget ) continue; + if ( obj->inherits("aWidget") ) { + aw = ( aWidget* ) obj; + aw->engine = engine; + if ( !aw->isContainer() ) + { + aw->init( adb ); + } + if ( form->inherits( "QMainWindow" ) ) aw->createToolBar( ( Q3MainWindow *) form ); + } else initWidget( ( QWidget *) obj, adb ); + } + it.toFront(); + // Init all container subcontainers + while ( it.hasNext() ) { + obj = it.next(); + if ( !obj ) continue; + if ( obj == widget ) continue; + if ( parentContainer( ( QWidget*) obj ) != widget ) continue; + if ( obj->inherits("aWidget") ) { + aw = ( aWidget* ) obj; + aw->engine = engine; + if ( aw->isContainer() ) initContainer( aw, adb ); + } + } + //delete l; +} + + +/*! + *\~english + * Init form, reparent central widget of form, if it needed. Evaluate script module. + *\~russian + * Инициализирует форму, меняет родителя у центрального виджера формы, если это необходимо. + * Обрабатывает также модуль скрипта, благодаря этому впоследствии можно вызывать + * функции, определенные в этом модуле. + *\~ + */ +void +aForm::init() +{ + QString ui, sModule; + aCfgItem obj; + static QMutex mutex; + mainWidget = 0; + if ( !mdObj.isNull() && md ) { + ui = md->sText( mdObj, md_formdesign ); + sModule = md->sText( mdObj, md_sourcecode ); + if ( !ui.isEmpty() ) { + //aLog::print(aLog::Debug, ui); + QByteArray buf = ui.toUtf8(); + QBuffer b(&buf); + //--b.open(QIODevice::WriteOnly); + + //--b.writeBlock( ( const char *) ui, strlen( ( const char *) ui) ); + //--b.close(); + b.open(QIODevice::ReadOnly ); + aLog::print(aLog::Info, tr("aForm creating form from ui")); + //--form = QWidgetFactory::create( &b ); + QFormBuilder fb; + fb.addPluginPath(QCoreApplication::applicationDirPath() /*"/plugins/designer"*/); + /*QList l = fb.customWidgets(); + int i; + for (i=0; iname()); + }*/ + form = fb.load(&b); + aLog::print(aLog::Info, tr("aForm form create from ui ok")); + b.close(); + } + } + if (form) { + Q3MainWindow *mw = new Q3MainWindow( parentWidget, "main form", Qt::WDestructiveClose ); + mw->statusBar()->hide(); + mw->setCaption( form->caption() ); + + printf("try find in windowslist %d, %llu\n ", objid, db_uid); + if ( engine->wl->find( objid, db_uid ) ) + { + printf("found, remove\n"); + engine->wl->remove( objid, db_uid ); + } + else + { + printf("not found\n"); + } + engine->wl->insert( objid, mw, db_uid ); + printf("insert new in wl ok\n"); + if ( form->inherits("QMainWindow" )){ + ((Q3MainWindow *) form)->statusBar()->hide(); + } + mainWidget = 0; + aCfgItem par = md->parent( md->parent( mdObj ) ); + if ( !form->inherits("aWidget")) + { + aLog::print(aLog::Error, tr("aForm do not inherits aWidget!")); + QMessageBox::critical( 0, tr("Error"), tr("Error while open dialog form. Init hasn't been completed.") ); + return; + } + // Create main widgets container. + if ( md->objClass( par ) == md_catalogue ) { + mainWidget = ( wCatalogue *) form; //new wCatalogue( mw ); + mw->setIcon( rcIcon("wcatalogue.png")); + } + if ( md->objClass( par ) == md_document ) { + mainWidget = ( wDocument *) form; //new wDocument( mw ); + mw->setIcon( rcIcon("wdocument.png")); + } + if ( md->objClass( par ) == md_journal ) { + mainWidget = ( wJournal *) form; //new wJournal( mw ); + mw->setIcon( rcIcon("wjournal.png")); + mw->statusBar()->show(); + mw->statusBar()->message(tr("New document - , Edit - , View - ")); + } + if ( md->objClass( par ) == md_report ) { + mainWidget = ( wReport *) form; + mw->setIcon( rcIcon("wreport.png")); + } + + if ( !mainWidget ) { + form->reparent( parentWidget, Qt::WDestructiveClose, QPoint(0, 0)); + delete mw; + } else { + form = mw; + mainWidget->setFormMode( md->attr( mdObj, mda_type ).toInt()); + mainWidget->createToolBar( mw ); + mw->resize( mainWidget->size() ); + mainWidget->reparent( mw, 0, QPoint(0, 0)); + mw->setCentralWidget( mainWidget ); + initContainer( mainWidget, db ); + mainWidget->show(); + form = mw; + mw->setFocusPolicy( Qt::NoFocus ); + } + //-- + ((QWorkspace*)engine->ws)->addWindow(form); + form->show(); + + connectSlots(); + if ( !sModule.isEmpty() ) + { + // engine->project.addObject(this); + engine->project.interpreter()->evaluate(sModule,this ); + aLog::print(aLog::Debug, tr("aForm load form module script")); + QStringList lst = engine->project.interpreter()->functions(this); + for(uint i=0; iattr( mdObj, mda_readonly ).toInt()) SetReadOnly(true); + } + else + { + aLog::print(aLog::Error, tr("aForm form not found")); + QMessageBox::critical( 0, tr("Error"), tr("Error open dialog form. Form not found.") ); + + } +} + +/*! + *\~english + * Return ananas contaner object for widget. + * Use for widget->init() function. + *\~russian + * Возвращает объект-контейнер для заданного виджета. + * \param widget - виджет, для которого необходимо найти объект-контейнер. + * \return объект контейнер. + *\~ +*/ +QWidget * +aForm::aParent( QWidget *widget ) +{ + QWidget *p = widget->parentWidget(); + QString pc; + while ( p ){ + pc = p->className(); + if ( pc == "wCatalogue") break; + if ( pc == "wDocument") break; + p = p->parentWidget(); + } + return p; +} + + +/*! + *\~english + * Show form. Move it in left top corner of workspace. + *\~russian + * \brief ScriptAPI. Показывает форму на экране. + * + * Перемещает ее в левый верхний угол рабочего пространства. Вызывает функцию on_formstart() скрипта модуля + * экранной формы, если функция определена в модуле. + * + * \see close + *\~ +*/ +void +aForm::Show() +{ + if ( form ) + { + if ( engine->project.interpreter()->functions( this ).findIndex("on_formstart")!=-1) + { + engine->project.interpreter()->call("on_formstart", QVariantList(), this); + } + form->show(); + ((QWidget*)form->parent())->move(0,0); + connect( form, SIGNAL(destroyed()), this, SLOT(close()) ); + } +} + +/** + * \brief Deprecated. See Show() + */ +void +aForm::show() { + aLog::print(aLog::Debug,tr("Deprecated method call: aForm::show()")); + this->Show(); +} + + +/*! + *\~english + * Close form. Delete this pointer after close. + *\~russian + * \brief ScriptAPI. Закрывает и уничтожает форму. + * + * Вызывает функцию on_formstop() + * скрипта модуля экранной формы, если функция определена в модуле. + * + * \see show + *\~ +*/ +void +aForm::Close() { + // don't call function name() in this place in Win32 - crash + emit(closeForm(selectedCatId())); + on_form_close(); //to run ananas-script + + if( form ) { + if( form->isShown() ) { + aLog::print(aLog::Debug,tr("aForm::Close() hides form")); + disconnect( form ); + form->hide(); + } + } + if( engine && engine->wl ) { + engine->wl->remove( objid, db_uid ); + } + deleteLater(); +} + +/** + * \brief Deprecated + */ +void +aForm::close() { + aLog::print(aLog::Debug,tr("Deprecated method call: aForm::close(). Use aForm::Close() instead")); + this->Close(); +} + +/** + * \brief Deprecated + */ +int +aForm::turn_on(){ + aLog::print(aLog::Debug,tr("Deprecated method call: aForm::turn_on()")); + return SignIn(); +} + +/*! + *\~english + * Turn on document. + *\~russian + * \brief ScriptAPI. Проводит (регистрирует) документ. + * + * Вызывает функцю on_conduct() кода Ананас.скрипта модуля экранной формы. + * В скрипте вы можете проверить условия проведения документа, + * и, если они не выполняются, вернуть в функции false. + * Если функция возвращает false, то отметка о проведении не ставится. + *\~ + */ +int +aForm::SignIn(){ + QVariant res; + if ( form && !mainWidget->dataObject()->IsConducted()) + { + if ( engine->project.interpreter()->functions( this ).findIndex("on_conduct")!=-1) + { + res = engine->project.interpreter()->call("on_conduct",QVariantList(), this); + } + } + //--if(res.type()==QSArgument::Variant) + { + // if return false + if(res.toBool()==false && res.type()!=QVariant::Invalid) + { + aLog::print(aLog::Info, tr("aForm conduct: function on_conduct() return false, document not conducted")); + return 0; + } + } + return mainWidget->TurnOn(); +} + +/** + * \brief Deprecated + */ +int +aForm::turn_off(){ + aLog::print(aLog::Debug,tr("Deprecated method call: aForm::turn_off()")); + return SignOut(); +} + +/*! + *\~english + * Turn off document. Do nothing. + *\~russian + * \brief ScriptAPI. Отменяет проведение (регистрацию) документа. + * + * На самом деле ничего не делает. Отмена проведения производится при открытии + * документа. + *\~ + */ +int +aForm::SignOut(){ + return 0; +} + +/** + * \brief Depticated + */ +ERR_Code +aForm::update(){ + aLog::print(aLog::Debug,tr("Deprecated method call: aForm::update()")); + return this->UpdateDB(); +} + +/*! + *\~english + * Update object. + *\~russian + * \brief ScriptAPI. Обновляет данные в базе. + *\~ + */ +ERR_Code +aForm::UpdateDB() +{ + ERR_Code rc = err_noerror; + aWidget* aw = NULL; + + if ( RO ) return err_readonly; + rc = mainWidget->Update(); + if (!rc && callerWidget!=NULL) + { + emit( changedData()); + emit( update( db_uid ) ); + } + return rc; +} + +/*! + *\~english + * do nothing. + *\~russian + * Ничего не делает. + *\~ +char* +aForm::formMetaObjectId(QString filename){ +// if (filename==""){ +// } +// return aot_doc; + return ""; +} + */ + + + +//QString +//aForm::widgetName(QObject *obj){ +// return aWidget::widgetName( ( QWidget *) obj ); +/* + QString res=""; + + if (obj) { +*/ +/* + if (!strcmp(obj->className(),"QAnanasField")) res=((QAnanasField *)obj)->getName(); + else + if (!strcmp(obj->className(),"QAnanasDBField")) res=((QAnanasDBField *)obj)->getName(); + else + if (!strcmp(obj->className(),"QAnanasTable")) res=((QAnanasTable *)obj)->getName(); + else +*/ +/* if (!strcmp(obj->className(),"wDBField")) { + res= ((wDBField*)obj)->getMdFieldName(); +// printf("wdbfield name=%s\n",(const char*)((wDBField*)obj)->getMdFieldName().local8Bit()); + } else { + res=obj->name(); + } + } + return res; +*/ +//} + + + +/*! + *\~english + * Return form widget pointer by name. + *\~russian + * \brief ScriptAPI. Возвращает указатель на виджет по его имени. + * + * Очень полезная функция для работы с QT виджетами, находящимися в экранной форме. Используя этот метод, + * можно получить доступ к методам любого виджета, лежащего в форме. + * ВАЖНО! Из Ананас скрипта вы сможете обратиться только к публичным слотам и свойствам виджета. Публичные методы + * виджета из Ананас скрипта недоступны. + * Документацию по свойствам и методам QT виджетов смотрите на сайте http://trolltech.com + * + * \code + * // допустим в экранной форме есть виджет myCheckBox, являющийся экземпляром класса QCheckBox + * + * var myBox = Widget("myCheckBox"); //возвращает указатель на объект + * if ( myBox.checked ) { // Проверяем значение свойства checked + * sys.Message(0, "Yes" ); + * } else { + * sys.Message(0, "No" ); + * } + * + * // К сожалению мы не имеем доступа к методам setChecked() и isChecked(), так как они не являются публичными слотами. + * + * \endcode + * \see aWidget::Widget() + *\~ +*/ +QWidget * +aForm::Widget( QString name ) +{ + return mainWidget->Widget( name ); +} + +//QObject * +//aForm::findWidget( QString name ){ + +// return mainWidget->Widget( name ); +/* + QObject *res=NULL; + QObject* obj; + QObjectList* list = form->queryList("QWidget"); + + QObjectListIt it(*list); + while ( ( obj = it.current() ) !=0 ) { + ++it; + if (!obj) continue; + if (name==widgetName(obj)) { + res=obj; + break; + } + } + delete list; + return res; +*/ +//} + + +/*! + *\~english + * Connecting widget slots to form. + *\~russian + * Коннектит некоторые слоты объектов формы. + * Обеспечивает работу функций ананас скрипта + * on_valuechanged(), on_button(), on_tabvaluechanged(), etc. + *\~ + */ +void +aForm::connectSlots() +{ + QObject* obj; + if ( !form ) return; + QObjectList list = form->queryList("QWidget"); + if ( mainWidget->inherits("aWidget") ) + connect( mainWidget, SIGNAL( valueChanged( const QString &, const QVariant & ) ),\ + this, SLOT( on_valueChanged( const QString &, const QVariant & ) ) ); + + QListIterator it(list); + while ( it.hasNext() ) { + obj = it.next(); + if (!obj) continue; + if ( obj->inherits("wActionButton" )){ + connect( obj, SIGNAL( clicked() ), this, SLOT( on_actionbutton() ) ); + connect( mainWidget, SIGNAL( keyPressed(QKeyEvent*) ), obj, SLOT( keyPressHandler(QKeyEvent*) ) ); + // continue; + } + if ( obj->inherits("QPushButton" )){ + connect( obj, SIGNAL( clicked() ), this, SLOT( on_button() ) ); + continue; + } + if ( obj->inherits("wDBTable" )){ + connect( obj, SIGNAL( currentChanged( QSqlRecord * ) ), this, SLOT( on_dbtablerow( QSqlRecord * ) ) ); + connect( obj, SIGNAL( deleteLine( QSqlRecord * ) ), this, SLOT( on_tabupdate( QSqlRecord * ) ) ); + + connect(obj, SIGNAL(updateCurr(int,int) ), + this, SLOT( on_tabvalueChanged(int, int) ) ); +// connect( obj, SIGNAL( primeUpdate( QSqlRecord * ) ), this, SLOT( on_tabupdate( QSqlRecord * ) ) ); + connect( obj, SIGNAL( selected( qulonglong ) ), this, SLOT( on_tabselected( qulonglong ) ) ); + connect( obj, SIGNAL( selectRecord( qulonglong ) ), this, SLOT( on_tablerow( qulonglong ) ) ); + continue; + } + } + //--delete list; +} + +void +aForm::on_tabupdate( QSqlRecord *rec ) +{ +} + +/*! + * \ru + * \brief ScriptAPI. Возвращает значение поля экранной формы. + * + * Например, значение поля шапки "Номер" приходной накладной. + * Слот предназначен для использования Ананас-Скриптом. + * \param name - имя поля, как оно определено в метаданных. Например, "Номер" или "Покупатель". + * \return значение поля. Необходимо понимать, что если поле имеет сложный тип данных, например + * его значение задается выбором элемента из справочника товаров, то будет возвращено текстовое + * представление товара (его название), а не ссылка на составной объект, хранящий все атрибуты товара. + * Для того что бы получить доступ к составному объекту, для обращения ко всем атрибутам товара + * необходимо воспользоваться функцией DBValue(); + *\see aForm::DBValue() + +Пример кода для размещения в модуле экранной формы. Экранная форма содержит одну кнопку с именем Button1 и +поле ввода LineEdit1. +После ввода значения, следует нажать на кнопку и в окно сообщений будет выведено только что введенное значение. + + +\code +function on_button(buttonName) // обработчик нажатия кнопки +{ + if(buttonName=="Button1") // Button1 - имя кнопки, данное ей в дизайнере + { + // Получаем значение поля LineEdit1 экранной формы + str = Value("LineEdit1"); + + // Выводим в окно сообщений, полученное значение + StatusMessage(str); + } +} +\endcode + * \_ru + */ +QVariant +aForm::Value(const QString &name) +{ + QVariant res= mainWidget->value( name ); //value(); + if(res.type()==QVariant::ULongLong || res.type()==QVariant::LongLong) + { + res = res.toString(); + } + //if(res.type()==QVariant::DateTime) + //{ + // res = res.toDateTime().toString(ISODate); + //} + return res; + +/* + aObject *o = 0; + if ( mainWidget ) o = mainWidget->dataObject(); + if ( o ) { + res = o->Value( name ); + } + if ( res.type() != QVariant::Invalid ) return res; + else printf("no field %s in data object\n", ( const char *) name ); +*/ +/* + w = findWidget( name ); + if ( w ) { + if (!strcmp(w->className(),"wDBField")){ + res=( (wDBField*)w )->text(); //value(); + } else if (w->inherits("wField")){ + res=( (wField*)w )->text(); //value(); + } else if (!strcmp(w->className(),"QPushButton")){ + res=((QPushButton *)w)->text(); + } else if (!strcmp(w->className(),"QLabel")){ + res=((QLabel*)w)->text(); + } else if (!strcmp(w->className(),"QLineEdit")){ + res=((QLineEdit*)w)->text(); + } else if (!strcmp(w->className(),"QDateEdit")){ + res=((QDateEdit*)w)->date().toString(Qt::ISODate); + } + } else { + debug_message(tr("Error! Can't find widget by name==`%s`\n"),(const char*) name.local8Bit()); + } + return res; +*/ +} + + +/*! + *\~english + * Getting widgets value, inherited aWidget. + *\~russian + * \brief ScriptAPI. Возвращает значение атрибута бизнес объекта Ананаса. + * + * Предназначен для использования в контексте экранной формы редактирования бизнес объекта. + * Или, говоря по другому, в модуле экранной формы. + * Тип возвращаемого значения такой же, как задан в метаданных у соответствующего атрибута бизнес объекта. + * Для поля типа Каталог или Документ функция вернет число (id). + * Функция необходима, если нужно заполнять поля сложных типов. + * Для остальных случаев можно использовать aForm::Value(), обеспечивающее доступ к значению виджета экранной формы, + * в контексте которой исполняется Скрипт. + *\~ + *\param name -\~english Widget name. For wDBField this parameter must be name field of metadata. + \~russian Имя атрибута бизнес объекта, как задано в метаданных. + \~ + +Пример кода для размещения в модуле экранной формы. Экранная форма содержит одну кнопку с именем Button1. +При нажатии на кнопку в окно сообщений будет выведено значение атрибута "Покупатель" редактируемого бизнес объекта. + + +\code +function on_button(buttonName) // обработчик нажатия кнопки +{ + if(buttonName=="Button1") // Button1 - имя кнопки, данное ей в дизайнере + { + // Получаем значение атрибута "Покупатель" редактируемого бизнес объекта + contragent = DBValue("Покупатель"); + + // Выводим в окно сообщений, полученное значение + StatusMessage(contragent); + } +} +\endcode +\~ + */ +QVariant +aForm::DBValue(const QString &name) +{ + QObject *w; + QVariant res; + w = Widget( name ); + if ( w ) + { + if (!strcmp(w->className(),"wDBField")) + { + res=( (wDBField*)w )->value(); //value(); + if(res.type()==QVariant::ULongLong || res.type()==QVariant::LongLong) + { + res = res.toString(); + } + //if(res.type()==QVariant::DateTime) + //{ + // res = res.toDateTime().toString(ISODate); + //} + } + else + { + if (w->inherits("wField")) + { + res=( (wField*)w )->value(); //value(); + } + if(res.type()==QVariant::ULongLong || res.type()==QVariant::LongLong) + { + res = res.toString(); + } + //if(res.type()==QVariant::DateTime) + //{ + // res = res.toDateTime().toString(ISODate); + //} + } + } + else + { + aLog::print(aLog::Error, tr("aForm not found widget with name %1").arg(name)); + } + return res; +} + + +/*! + *\~english + * Setting form widgets value of object type. + *\~russian + * \brief ScriptAPI. Устанавливает значения виджетов формы сложных типов (aDocument, aCatalogue) + * + * Обычно для установки значения используют SetValue(...) + *\~ + * \see SetValue(...) + *\param tname -\~english Widget name. + \~russian Имя виджета. + \~ + */ +int +aForm::SetObjValue(const QString &name, aObject *value) +{ + return mainWidget->setObjValue( name, value ); +} + +/*! + *\~english + * Setting form widgets value. + *\~russian + * \brief ScriptAPI. Устанавливает значения виджетов экранной формы. + *\~ + * \see aWidget::setValue() + *\param name -\~english Widget name. + \~russian Имя виджета. + \~ + *\param value -\~english Widget value. + \~russian Значение виджета. Для сложных типов (Документ,Каталог) должен использоваться идентификатор. + * Если идентификатор недоступен, используйте функция SetObjValue(), которая принимает в качестве + * параметра ссылку на объект. + \~ + */ +int +aForm::SetValue(const QString &name, QVariant value) +{ + return mainWidget->setValue( name, value ); +/* + QObject *w; + int rc= err_noerror; + + w = findWidget( name ); + if ( w ) { + if (!strcmp(w->className(),"wDBField")){ + ((wDBField*)w)->setValue(value.toString()); + } else if (w->inherits("wField")){ + ((wField*)w)->setValue(value.toString()); + } else if (!strcmp(w->className(),"QPushButton")){ + ((QPushButton *)w)->setText( value.toString() ); + } else if (!strcmp(w->className(),"QLabel")){ + ((QLabel*)w)->setText( value.toString() ); + } else if (!strcmp(w->className(),"QLineEdit")){ + ((QLineEdit*)w)->setText( value.toString() ); + } + } else { + debug_message(tr("aForm::SetValue() Error! Can't find widget by name==`%s`\n"),(const char*) name.local8Bit()); + rc = err_nowidgetfound; + } + return rc; +*/ +} + +/*! + *\~english + * Setting column readonly flag. + * When column readonly, user can't edit value of this column. + *\~russian + * \brief ScriptAPI. Устанавливает для столбца таблицы флаг только чтение. + * + * Когда установлен этот флаг, пользователь не может редактировать значения в этом столбце. + *\~ + *\param tname - \~english Table name.\~russian Имя таблицы.\~ + *\param numCol - \~english Column number.\~russian Номер столбца.\~ + *\param ro - \~english `Readonly' flag value.\~russian Значение флага `только чтение'.\~ + */ +void +aForm::SetColumnReadOnly(const QString &tname, int numCol, bool ro) +{ + QObject *w; + w = Widget( tname ); + if ( w ) + { + if (!strcmp(w->className(),"wDBTable")) + { + ((wDBTable*)w)->setColumnReadOnly(numCol,ro); + } + } + else + { + aLog::print(aLog::Error, tr("aForm not found widget with name %1").arg(tname)); + } + + return; +} + + +/*! + *\~english + * Count table row. + *\~russian + * \brief ScriptAPI. Возвращает количество строк в табличном виджете wDBTable. + * + * Если табличный виджет не является объектом класса wDBTable, + * метод запишет в лог сообщение об ошибке и вернет 0. + *\~ + *\param tname - \~english Table name.\~russian Имя таблицы.\~ + *\return - \~english Number rows of table.\~russian Количество строк в таблице.\~ + */ +int +aForm::TabCount(const QString &tname) +{ + int res=0; + QObject *w; + w = Widget( tname ); + if ( w ) + { + if (!strcmp(w->className(),"wDBTable")) + { + res=( (wDBTable*)w )->numRows() ; //value(); + } + else + { + aLog::print(aLog::Error, tr("Expected wDBTable widget but found %1").arg(w->className())); + } + } + else + { + aLog::print(aLog::Error, tr("aForm not found widget with name %1").arg(tname)); + } + + return res; + +} + +/** + * \ru + * \brief ScriptAPI. Добавляет новую строку в табличный виджет wDBTable. + * + * \param tname - имя виджета + * \_ru + */ +void +aForm::TabNewLine(const QString &tname) +{ + QObject *w; + + w = Widget( tname ); + if ( w && !strcmp(w->className(),"wDBTable")) + { + wDBTable *wdb = (wDBTable*)w; + Q3SqlCursor *cur = wdb->sqlCursor(); + QSqlRecord *buffer = cur->primeInsert(); + wdb->lineInsert(buffer); + cur->insert(); + } + else + { + aLog::print(aLog::Error, tr("aForm not found wDBTabe widget with name %1").arg(tname)); + } +} + +void +aForm::TabUpdate(const QString &tname) +{ + QObject *w; + + w = Widget( tname ); + if ( w && !strcmp(w->className(),"wDBTable")) + { + wDBTable *wdb = (wDBTable*)w; + Q3SqlCursor *cur = wdb->sqlCursor(); + //QSqlRecord *buffer = cur->primeInsert(); + // wdb->lineInsert(buffer); + cur->primeUpdate(); + cur->update(); + } + else + { + aLog::print(aLog::Error, tr("aForm not found wDBTabe widget with name %1").arg(tname)); + } +} +/** + * \ru + * \brief ScriptAPI. Возвращает значение ячейки табличного виджета wDBTable. + * + * + * Если табличный виджет не является объектом класса wDBTable, метод запишет сообщение + * об ошибке в лог и вернет строку "Unknown". + * То есть он предназначен только для работы с таблицами привязанными (binded) к + * табличным частям бизнес объектов Ананаса. Если в ячейке хранится сложный тип данных (Документ, Элемент справочника) + * будет возвращен уникальный идентификатор объекта, а не его текстовое представление, которое видит пользователь. + * Для получения текстового представления сложного объекта воспользуйтесь методом aForm::TabDBValue. + * + * \param tname - имя виджета + * \param row - индекс строки таблицы + * \param col - индекс столбца таблицы + * \return значение ячейки табличного виджета + * \see aForm::TabDBValue(...) + * \_ru + * + */ +QVariant +aForm::TabValue(const QString &tname, int row, int col) +{ + return tabValue(tname,row,col,true); +} + +/** + * \ru + * \brief ScriptAPI. Возвращает значение ячейки табличного виджета wDBTable для сложного типа данных. + * + * + * Если табличный виджет не является объектом класса wDBTable, метод запишет сообщение + * об ошибке в лог и вернет строку "Unknown". + * То есть он предназначен только для работы с таблицами привязанными (binded) к + * табличным частям бизнес объектов Ананаса. + * В отличие от aForm::TabValue, который вернет числовой идентификатор, в случае, если ячейка имеет сложный тип данных, + * aForm::TabDBValue вернет текстовое представление, которое видит в таблице пользователь. + * + * \param tname - имя виджета + * \param row - индекс строки таблицы + * \param col - индекс столбца таблицы + * \return значение ячейки табличного виджета + * \see aForm::TabValue(...) + * \_ru + * + */ +QVariant +aForm::TabDBValue(const QString &tname, int row, int col) +{ + return tabValue(tname,row,col,false); +} + + +QVariant +aForm::tabValue(const QString &tname, int row, int col, bool dbval) +{ + QVariant res=QString::QString("Unknown"); + QObject *w; + QStringList l; + w = Widget( tname ); + if ( w && !strcmp(w->className(),"wDBTable")) + { + wDBTable *wdb = (wDBTable*)w; + if(wdb->getDefIdList().count()>col && col>=0) + { + long f_oid = wdb->getDefIdList()[col].toLong(); + QString type = wdb->getFieldType(f_oid); + if(row==-1) + { + row = wdb->currentRow(); + } + if(type.left(1) == "O" && dbval) + { + res = ananas_objectstr(db, wdb->value(row,col).toULongLong(), type.section(' ',1,1).toInt()); + } + else + { + res = wdb->value(row,col); + //if( res.type() == QVariant::DateTime || res.type() == QVariant::Date ) + //{ + // res = QString("%1").arg(res.toDateTime().toString(Qt::ISODate)); + //} + } + } + else + { + aLog::print(aLog::Error, tr("aForm table value: column out of range")); + } + } + else + { + aLog::print(aLog::Error, tr("aForm not found widget with name %1").arg(tname)); + } + return res; +} + + +/*! + *\~english + * Return column index in table \param tname. + *\~russian + * \brief ScriptAPI. Возвращает индекс столбца таблицы tname по его имени в метаданных. + *\~ + * \param tname - \~english Table name.\~russian Имя таблицы.\~ + * \param colname - \~english Column name.\~russian Имя столбца.\~ + * \return \~english Column index.\~russian Индекс столбца.\~ + */ +int +aForm::ColIndex(const QString &tname, const QString &colname) +{ + int res; + QObject *w; + int col=-1; + w = Widget( tname ); + if ( w && !strcmp(w->className(),"wDBTable")) + { + wDBTable *wdb = ((wDBTable*)w ); + col= wdb->getDefFields().findIndex(colname); + } + else + { + aLog::print(aLog::Error, tr("aForm not found widget with name %1").arg(tname)); + } + return col; +} + + +/** + * \ru + * \brief ScriptAPI. Задает значение ячейки табличного виджета wDBTable. + * + * \param tname - имя таблицы + * \param colname - имя столбца + * \param row - номер строки + * \param value - значение + * \_ru + */ +void +aForm::SetTabValue(const QString &tname, const QString &colname, int row, QVariant value) +{ + QObject *w; + w = Widget( tname ); + if ( w && !strcmp(w->className(),"wDBTable")) + { + // printf(">>>>>>>>>>>>>>Set tab value %s, for %s, rov = %d, value = %s\n",(const char*)tname.local8Bit(), (const char *)colname.local8Bit(), row, (const char*)value.toString().local8Bit() ); + wDBTable *wdb = (wDBTable*)w; + aSQLTable *t = ( aSQLTable *) wdb->sqlCursor(); + t->select(QString("idd=%1").arg(mainWidget->uid())); + t->first(); + if(t->seek(row)) + { + t->setValue(colname,value); + t->Update(); + //t->update(); + } + wdb->refresh();//updateCurrent(); + // wdb->setValue(row, col, value); + //res = wdb->text(row,col); + } + else + { + aLog::print(aLog::Error, tr("aForm not found wDBTable widget with name %1").arg(tname)); + } + + return; + +} + + + +/** + * \brief Deprecated + */ +void +aForm::done( int rc ){ + aLog::print(aLog::Debug,tr("Deprecated method call: aForm::done(...)")); + rc=rc; +// if (form) form->done(rc); +} + +/** + * \brief Deprecated + */ +void +aForm::setfocus(QString fname){ + aLog::print(aLog::Debug,tr("Deprecated method call: aForm::setfocus()")); +// QWidget *w; +// w=(QWidget *) form->child(fname,"QWidget"); +// if (w) w->setFocus(); +} + +/** + * + */ +void +aForm::SetFocus(){ +// aLog::print(aLog::Debug,tr("Deprecated method call: aForm::setfocus()")); +// QWidget *w; +// w=(QWidget *) form->child(fname,"QWidget"); + if(form) form->setFocus(); +} + +void +aForm::on_button(){ + if ( engine->project.interpreter()->functions(this).findIndex("on_button")!=-1) + { + engine->project.interpreter()->call("on_button",QVariantList()<name(),this); +// engine->code->evaluate("on_button(\""+sender()->name()+"\")", this); + } +} + + + +/*! + *\~english + * Action button pressed. + *\~russian + *\~ + */ +void +aForm::on_actionbutton() +{ + wActionButton *b = ( wActionButton *) sender(); + if ( b ) { + if ( b->isAction() ) { + if ( b->isActionUpdate() ) update(); + if ( b->isActionTurnOn() ) turn_on(); + if ( b->isActionClose() ) + { + if(form) + if( form->isShown() ) + { +//#ifndef _Windows + form->disconnect(); + form->hide(); +//#endif + } + close(); + } + } else { + if(b->getActionId()) + { + aCfgItem item = md->find(b->getActionId()); + engine->execAction( item, this); + } + } + } +} + + + +void +aForm::on_return(){ +} + + +void +aForm::on_lostfocus(){ +} + + +void +aForm::on_form_close(){ + if(!engine) return; + if ( engine->project.interpreter()->functions(this).findIndex("on_formstop")!=-1) { + engine->project.interpreter()->call("on_formstop", QVariantList(),this); + } +} + + +void +aForm::on_valueChanged(const QString &s){ +// char buf[200]; +/* + const QObject *sobj=sender(); + QString objName=widgetName((QObject *) sobj); + cfg_message(0, "value changed %s (%s)\n", (const char *) objName.utf8(), (const char *) dbobject->className()); + cfg_message(0, "classname %s\n", (const char *) sobj->className()); + if (strcmp(sobj->className(),"QAnanasDBField")==0) { +// if (sobj->className()=="QAnanasDBField") { + cfg_message(0,"OK"); + if (dbobject->className()=="QAdoc"){ + ((QAdoc *)dbobject)->setfield(objName, s); + } + if (dbobject->className()=="QAcat"){ + cfg_message(0,"Поле справочника %s=%s\n",(const char *) objName.utf8(), (const char *) s.utf8()); + ((QAcat *)dbobject)->setfield(objName, s); + } + } +*/ +} + + + +/*! + *\~english + * Process field value changed. + * Connect on main widget signal, and work only with it fields. + * Call afta widget process change field value signal. + *\~russian + * Обрабатывает изменение значения поля + * Присоединяется на сигнал главнов виджета формы + * и обрабатывает только изменение его полей. + * Сигнал вызывается виджетом, после того, как он сам обработает новое значение. + *\~ + *\param name - \~english field metedata name \~russian имя поля в конфигурации.\~ + *\param value - \~english new field value \~russian новое значение поля. \~ + */ +void +aForm::on_valueChanged( const QString & name, const QVariant & val ) +{ + + if ( engine->project.interpreter()->functions(this).findIndex("on_valuechanged")!=-1) + { + Q3ValueList lst; + lst << name; + lst << val; +// if(!val.isNull() && !val.isValid()) v = val; + engine->project.interpreter()->call("on_valuechanged",QVariantList(lst), this); + // printf("aForm change value field %s to %s\n",(const char*)name.local8Bit(), val.toString().ascii()); + } +} + + +void +aForm::on_tabvalueChanged(int row, int col) +{ + + if ( engine->project.interpreter()->functions(this).findIndex("on_tabupdate")!=-1) + { + Q3ValueList lst; + lst << row; + lst << col; + lst << sender()->name(); + + engine->project.interpreter()->call("on_tabupdate",QVariantList(lst), this); + } +/* + const QObject *sobj=sender(); + QString objName=widgetName((QObject *) sobj); + cfg_message(0, "value changed %s (%s)\n", (const char *) objName.utf8(), (const char *) dbobject->className()); + cfg_message(0, "classname %s\n", (const char *) sobj->className()); + if (strcmp(sobj->className(),"QAnanasDBTable")==0) { +// if (sobj->className()=="QAnanasDBField") { +*/ +/* cfg_message(0,"OK"); + if (dbobject->className()=="QAdoc"){ + ((QAdoc *)dbobject)->setfield(objName, s); + } + if (dbobject->className()=="QAcat"){ + cfg_message(0,"Поле справочника %s=%s\n",(const char *) objName.utf8(), (const char *) s.utf8()); + ((QAcat *)dbobject)->setfield(objName, s); + } +*/ +// } +} + + +void +aForm::on_dbtablerow( QSqlRecord *r ) +{ + unsigned int i; + aObject *o = 0; + QVariant tv; + if ( mainWidget ) o = mainWidget->dataObject(); + if ( o ) + { + aSQLTable *t = o->table(); + id = t->value(0).toULongLong(); + } + if ( engine->project.interpreter()->functions(this).findIndex("on_tablerow")!=-1) { + engine->project.interpreter()->call("on_tablerow", QVariantList()<name(), this); + } +} + +void +aForm::on_event( const QString &source, const QString &data ) +{ + Q3ValueList lst; + lst << source; + lst << data; + if ( engine->project.interpreter()->functions(this).findIndex("on_event")!=-1) { + engine->project.interpreter()->call("on_event", QVariantList(lst), this); + } +} + + + +void +aForm::on_tabselected( qulonglong uid ) +{ + emit selected( uid ); + if ( closeAfterSelect ) { + aLog::print(aLog::Debug, QObject::tr("aForm::on_tabselected(...), closeAfterSelect is true")); + close(); + } else { + aLog::print(aLog::Debug, QObject::tr("aForm::on_tabselected(...), closeAfterSelect is false")); + } +} + +void +aForm::on_tablerow( qulonglong uid ) +{ + Q3ValueList lst; + lst << sender()->name(); + lst << QString("%1").arg(uid); + if ( engine->project.interpreter()->functions(this).findIndex("on_tabrowselected")!=-1) { + engine->project.interpreter()->call("on_tabrowselected", QVariantList(lst), this); + } +} + +int +aForm::New() +{ + if ( mainWidget ) { +// printf("try find in windowslist %d, %llu\n ", objid, db_uid); + if ( engine->wl->find( objid, db_uid ) ) + { +// printf("found, remove\n"); + engine->wl->remove( objid, db_uid ); + } + else + { +// printf("not found\n"); + } + mainWidget->New(); + db_uid = mainWidget->uid(); + printf(">>>>>db_uid = %llu\n",db_uid); + if(engine->wl->find( objid, db_uid )) + { + engine->wl->get(objid, db_uid )->setFocus(); + } + else + { + engine->wl->insert( objid, form , db_uid ); + } + } + return 0; +} + + +int +aForm::Select( qulonglong id ) +{ + if ( mainWidget ) { +// printf("try find in windowslist %d, %llu\n ", objid, db_uid); + if ( engine->wl->find( objid, db_uid ) ) + { +// printf("found, remove\n"); + engine->wl->remove( objid, db_uid ); + } + else + { +// printf("not found\n"); + } +// printf("insert new in wl ok\n"); +// printf("form->select()\n"); + mainWidget->Select( id ); + mainWidget->Refresh(); + db_uid = id; + if(engine->wl->find( objid, db_uid )) + { + engine->wl->get(objid, db_uid )->setFocus(); + } + else + { + engine->wl->insert( objid, form, db_uid ); + } + } + return 0; +} + + +int +aForm::SelectGroup( qulonglong id ) +{ + if ( mainWidget && !strcmp(mainWidget->className(),"wCatalogue")) + { + if ( engine->wl->find( objid, db_uid ) ) + { +// printf("found, remove\n"); + engine->wl->remove( objid, db_uid ); + } + ((wCatalogue*)mainWidget)->SelectGroup ( id ); + db_uid = id; + if(engine->wl->find( objid, db_uid )) + { + engine->wl->get(objid, db_uid )->setFocus(); + } + else + { + engine->wl->insert( objid, form, db_uid ); + } + } + return 0; +} + +/* +int +aForm::select( Q_ULLONG id ) +{ +CHECK_POINT +// Select( id ); + QObject *res=NULL; + QObject* obj; + QObjectList* list = form->queryList("wDBField"); + aCfgItem o; + QString fieldName; + QObjectListIt it(*list); + while ( ( obj = it.current() ) !=0 ) + { + ++it; + if (!obj) continue; + ((aWidget*)obj)->Select(id); + // if (name==widgetName(obj)) { + //o = md->find(((wDBField*)obj)->getId()); + //if(o.isNull()) continue; + fieldName = ((wDBField*)obj)->getMdFieldName(); + ((wDBField*)obj)->setValue(mainWidget->table()->value(fieldName).toString()); + + //debug_message("mainWidget class = %s\n", mainWidget->className() ); + // break; + // } + } + //return res; + + return 0; +} +*/ + + +/** + * \ru + * \brief ScriptAPI. Обновляет экранную форму. + * \_ru + */ +int +aForm::Update() +{ + if ( mainWidget ) { + mainWidget->Update(); + } + return err_noerror; +} + + + +/*! + *\~english + * Seting form readonly flag. + * When form readonly we can't edit database fields, and make updatе action + *\~russian + * \brief ScriptAPI. Устанавливает флаг "только чтение". + * + * Когда установлен этот флаг, запрещается редактирование полей формы, + * и сохранение изменений в базу. + *\~ + *\param status - \~english New readonly flag.\~russian Новое значение флага только чтение.\~ + */ +void +aForm::SetReadOnly ( bool status ) +{ + RO = status; + if ( mainWidget ) + { + if(status) + { + aLog::print(aLog::Info, tr("aForm set read only")); + } + else + { + aLog::print(aLog::Info, tr("aForm set read/write")); + } + mainWidget->SetReadOnly( status ); + } +/* QObjectList *l = mainWidget->queryList( "wDBField" ); + QObjectListIt it( *l ); + QObject *obj; + while ( (obj = it.current()) != 0 ) + { +CHECK_POINT + ++it; + (( wDBField *)obj)->setDisabled( status ); + } + delete l; // delete the list, not the objects*/ +} + + + +/*! + *\~english + * Geting form readonly flag. + *\~russian + * \brief ScriptAPI. Возвращает значение флага "только чтение". + *\~ + *\return \~english true if form open in read only mode. + * \~russian true если форма открыта в режиме только чтение.\~ + */ +bool +aForm::IsReadOnly() +{ + return RO; +} + +/*! + *\~english + * Convert number to russian language text format. + *\~russian + * \brief Конвертирует число в его текстовое представление c указанием единиц измерения. + * + * Параметры позволяют настроить вид результата. По умолчанию валюта - рубли, копейки выводятся. + * + * примеры использования: + * \li Propis("20301.34") = Двадцать тысяч триста один рубль 34 копейки + * \li Propis("20301.34", false) = Двадцать тысяч триста один рубль + * \li Propis("20301.34", false, false, "штук", "штука", "штуки") = Двадцать тысяч триста одна штука + * \li Propis("2", false, true, "слонёнков", "слонёнок", "слонёнка") = Два слонёнка + * \li Propis("5", false, false, "мартышек", "мартышка", "мартышки") = Пять мартышек + * \li Propis("38.5", false, true, "попугаев", "попугай", "попугая") = Тридцать восемь попугаев + * + * пример неправильного использования: + * \li Propis("38.5", true, true, "попугаев", "попугай", "попугая") = Тридцать восемь попугаев 50 копеек + * + *\~ + * \param val - \~english number to convert \~russian число для конвертирования\~ + * \param need_kopeyki - \~english wtite to output decimal part \~russian записывать в результат копейки (по умолчанию - да)\~ + * \param male - \~english male \~russian конвертируемая единица - мужского рода (по умолчанию - да)\~ + * \param end1 - \~english end1 \~russian окончание для нуля конвертируемых единиц (по умолчанию - `рублей')\~ + * \param end2 - \~english end2 \~russian окончание для одной конвертируемой единицы (по умолчанию - `рубль')\~ + * \param end3 - \~english end3 \~russian окончание для двуx конвертируемых единиц (по умолчанию - `рубля')\~ + * \return - \~english text representetion of number \~russian текстовое представление числа \~ + * \see Propis() + */ +QString +aForm::Propis( QString val, bool need_kopeyki, bool male, const QString &end1, const QString &end2, const QString &end3) +{ + return aService::number2money(QVariant(val).toDouble(),need_kopeyki,male, end1, end2, end3); +} + + +/** + * \ru + * \brief Конвертирует числовое представление денег в пропись с учетом указанной валюты. + * \param amount - сумма денег для преобразование в пропись. + * \param currency - строка с обозначением валюты. Допустимые значения: "RUR" - рубль, "USD" - доллар, "EUR" - евро. + * \returns значение суммы прописью. + * \_ru + */ +QString +aForm::MoneyToText( QString amount , QString currency ) { + return aService::number2money( currency, QVariant(amount).toDouble()); +} + + +/*! + * \ru + * \brief ScriptAPI. Используя идентификатор редактируемого виджетами формы документа, настраивает объект aDocument на доступ к + * документу с таким же идентификатором. + * + * То есть к тому же документу. Используется в Ананас.Скрипте для передачи + * ссылки на документ в другие объекты. Например в регистры. Для примера смотри код на Ананас.Cкрипте, + * отрабатываемый при проведении Приходной накладной в бизнес схеме Inventory. + * \param doc - документ, который необходимо настроить. + * \return void. + * \_ru + */ +void +aForm::SelectByCurrent(aObject *doc) +{ + if(mainWidget) + { + int res = doc->select(mainWidget->uid()); + aLog::print(aLog::Debug, QObject::tr("aForm SelectByCurrent %1 ended with %1").arg(mainWidget->uid()).arg(res)); + } +} + +/** + * \ru + * \brief Устаревшая. Смотри SelectByCurrent() + * \_ru + * \en + * \brief Deprecated. See SelectByCurrent() + * \_en + */ +void +aForm::SetCurrent( aObject *doc) { + SelectByCurrent( doc ); +} + +/*! + *\~english + * Return current data object of form. + *\~russian + * \brief ScriptAPI. Возвращает ссылку на бизнес объект, редактируемый данной экранной формой. + * + * По свему назначению метод аналогичен SelectByCurrent() + *\~ + * \return - \~english current data object \~russian текущий объект формы \~ + * \see SelectByCurrent() + */ +aObject* +aForm::Current() +{ + if(mainWidget) + { + return mainWidget->dataObject(); + } + else return 0; +} + +/*! + *\~english + * Get value of attribute + *\~russian + * \brief Возвращает значение атрибута формы. + *\~ + *\param name - \~english Name of attribute.\~russian Имя атрибута.\~ +aDataField* +aForm::getAttribute(const QString &name) +{ + QString oname, aname; + aWidget *w = mainWidget; + QVariant v; + aDataField *f = 0; + + oname = name.section(".",0,0); + aname = name.section(".",1); + if ( oname.isEmpty() ) aname = oname; + else { + } + v = w->value( aname ); +// f = new aDataField( this, aname ); + return f; +} + */ + + +/*! + *\~english + * Sets attribute value + *\~russian + * Устанавливает значение атрибута формы. + *\~ + * *Not implemented* + *\param name - \~english Name of attribute.\~russian Имя атрибута.\~ +int +aForm::setAttribute(const QString &name, aDataField *value) +{ + return 1; +} + */ + +/*! + *\~english + * Convert number to currensy format. + *\~russian + * \brief ScriptAPI. Конвертирует число в денежный формат (#0.00 :) ). Используется для вывода на печать. + * + * Для конвертирования числа в текстовое представление используйте Propis() + *\~ + * \param number - \~english number to convert \~russian число для конвертирования\~ + * \return - \~english rounded number \~russian округленное до 2-х цифр после запятой число \~ + * \see Propis() + */ +QString +aForm::ConvertNumber2MoneyFormat(double number) +{ + return aService::convertNumber2MoneyFormat(number); +} + +/*! + *\~english + * Convert date to local format. + *\~russian + * \brief ScriptAPI. Конвертирует дату в локальный формат. Используется для вывода на печать. + * + * Все функции работы с датой оперируют датой в ISO формате. (yyyy-MM-ddThh:mm:ss) + * Данная функция предназначена для конвертации такой даты в читаемый вид. + *\~ + * \param ISODate - \~english date in ISO format \~russian дата в ISO формате (yyyy-MM-ddThh:mm:ss)\~ + * \return - \~english date in local format \~russian дату в локальном формате \~ + */ +QString +aForm::ConvertDateFromIso(const QString &ISODate) +{ + return aService::Date2Print(ISODate); +} + + +/*! + *\~english + * Date of end day. + *\~russian + * \brief ScriptAPI. Возвращает дату-время на конец дня. + * \param ISODate - строка, содержащая дату в формате ISO (YYYY-MM-DD). + *\~ + * \return - \~english date \~russian дату вида yyyy-mm-ddT23:59:59 \~ + */ +QString +aForm::EndOfDay(const QString& ISODate) +{ + return QString("%1T%2").arg(ISODate.section('T',0,0)).arg("23:59:59"); +} + +/*! + *\~english + * Sets form mode. + *\~russian + * \brief ScriptAPI. Устанавливает режим формы. + * \param m - Допустим один из трех режимов открытия формы: 0 - новая, 1 - редактирование, 2- просмотр. + *\~ + * \see GetMode() + */ +void +aForm::setMode(int m) +{ + this->mode = m; +} + +/*! + *\~english + * Get form mode. 0 - new, 1- edit, 2- browse + *\~russian + * \brief ScriptAPI. Получение режима открытия формы. + * \return 0 - новая, 1 - редактирование, 2- просмотр. + *\~ + * \return - \~english mode \~russian режим открытия формы \~ + */ +int +aForm::GetMode() +{ + return this->mode; +} diff --git a/src/plugins/aform.h b/src/plugins/aform.h new file mode 100644 index 0000000..993ea6f --- /dev/null +++ b/src/plugins/aform.h @@ -0,0 +1,207 @@ +/**************************************************************************** +** $Id: aform.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of Ananas forms of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2005 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/*! +*/ +#ifndef AFORM_H +#define AFORM_H + +#include "ananasglobal.h" + +#include +#include +#include +#include +//--#include +#include +//Added by qt3to4: +#include + +#include "engine.h" +#include "adatabase.h" +#include "adocument.h" +#include "acfg.h" + + +class QWidget; +class Q3SqlForm; +class aWidget; + + + +/*! + *\~english + * Ananas form. + *\~russian + * \brief Определяет программный интерфейс экранных форм Ананаса, предназначенный для использования + * Ананас.Скриптом модуля экранной формы Документа и других бизнес объектов Ананаса. + * + * Любая экранная форма, спроектированная в Ананас.Дизайнере имеет методы этого класса. + * Объект данного класса создается при создании формы. Программный код, написанный на Ананас.Скрипте и хранящийся + * в модуле экранной формы (вкладка "Модуль" в Дизайнере) может обращаться к методам этого объекта напрямую, + * без указания имени объекта. + * + * Кроме того, класс обеспечивает вызов некоторых функций на Ананас.Скрипте, определенных в модуле экранной формы, + * при наступлении определенных событий, например открытии или закрытии формы, изменения значения виджетов формы и т.п + * Полный список этих событий и функций можно посмотеть на сайте Ананаса в разделе руководства по Ананас.Дизайнеру. + *\~ + */ +class QT_WIDGET_PLUGIN_EXPORT aForm : public QObject +{ + Q_OBJECT +public: + aEngine* engine; + aDatabase* db; + aCfg* md; + aCfgItem mdObj; + QWidget* parentWidget; + bool closeAfterSelect; + + aForm(); + aForm( QWidget *parent, aEngine *eng ); + aForm( QWidget *parent, aEngine *eng, Q_ULONG form_mid = 0, aWidget* caller = NULL); + aForm( QWidget *parent, aEngine *eng, QString oftype, QObject *aobj = NULL); + ~aForm(); + QWidget *form; + void init(); + QWidget* aParent( QWidget *widget ); + int New(); + int Select( qulonglong id ); + int SelectGroup( qulonglong id ); + qulonglong selectedCatId(){ return db_uid;} // Return uid, selected in Catalogue + qulonglong selectedId(){ return id;} // Return uid, selected in main wDBTable +signals: + void selected( qulonglong uid ); + void closeForm( qulonglong ); + void changedData(); + void update( ANANAS_UID ); +public: + + QVariant tabValue(const QString &tname, int row, int col, bool dbval=false); + void setMode(int m); + +public slots: +// QObject * object(const QString &name); + void done( int rc ); + void Show(); + void Close(); + void show(); //depricated + void close(); //depricated + QVariant Value(const QString &name); + QVariant DBValue(const QString &name); + int SetValue(const QString &name, QVariant value); + int SetObjValue(const QString &name, aObject *value); + void SetColumnReadOnly(const QString &tname, int numCol, bool ro); + int ColIndex(const QString &tname, const QString &colname); + int TabCount(const QString &tname); +// QVariant TabValue(const QString &tname, const QString &colname, int row =-1 ); + QVariant TabValue(const QString &tname, int row, int col); + QVariant TabDBValue(const QString &tname, int row, int col); + void TabNewLine(const QString &tname); + void TabUpdate(const QString &tname); +// QVariant TabDBValue(const QString &tname, const QString &colname , int row =-1); +// void SetTabValue(const QString &tname, const QString &name, QVariant value); + void SetTabValue(const QString &tname, const QString &colname, int row, QVariant value); + void setfocus(QString fname); + void SetFocus(); + ERR_Code UpdateDB(); // Обновить в БД + ERR_Code update(); // Depricated + int turn_on(); // Depricated + int turn_off(); // Depricated + int SignIn(); // Провести документ + int SignOut(); // Отменить проведение документа +// void formClose(); + int Update(); + void SetReadOnly( bool status ); + bool IsReadOnly(); + int GetMode(); + + QString Propis( QString val , + bool need_kopeyki=true, + bool male=true, + const QString &end1="рублей", + const QString &end2="рубль", + const QString &end3="рубля"); + QString MoneyToText( QString amount , QString currency ); + QString ConvertNumber2MoneyFormat(double number); + QString ConvertDateFromIso(const QString &ISODate); + QString EndOfDay(const QString& ISODate); + + void SelectByCurrent(aObject *doc); + void SetCurrent(aObject *doc); + aObject* Current(); + + QWidget* Widget( QString name ); + +// after compleete will remove value() setValue() +// aDataField* getAttribute(const QString &name); +// int setAttribute(const QString &name, aDataField *value); + +/** + * Возвращает идентификатор объекта метаданных для которого создана форма. + * \input fn (in) - имя файла формы. + * \return один из предопределенных в cfg.h типов. + */ +// char* formMetaObjectId(QString fn); +private slots: + void on_dbtablerow( QSqlRecord *r ); + void on_tabupdate( QSqlRecord *r ); + void on_button();//int id); + void on_actionbutton(); + void on_form_close(); + void on_return(); + void on_lostfocus(); + void on_valueChanged(const QString &s); + void on_valueChanged( const QString & name, const QVariant & value ); + void on_tabvalueChanged(int row, int col); + void on_tabselected( qulonglong uid ); + void on_event( const QString &source, const QString &data ); + void on_tablerow( qulonglong uid ); +// QObject *findWidget(QString name); +// QString widgetName(QObject *w); +// void openForm( int oid, int fid = 0 , int defaultfor = 1, int mode = 0, bool readonly = false ); + void connectSlots(); +protected: + virtual void initWidget( QWidget *widget, aDatabase *adb ); + virtual void initContainer( aWidget *widget, aDatabase *adb ); + aWidget *parentContainer( QWidget *widget ); +private: + QObject* dbobject; + int tobj, objid; + int mode; + qulonglong id; + qulonglong db_uid; + bool RO; + aWidget* mainWidget; + aWidget* callerWidget; +}; + + +#endif // AFORM_H diff --git a/src/plugins/atoolbar.cpp b/src/plugins/atoolbar.cpp new file mode 100644 index 0000000..ce607f1 --- /dev/null +++ b/src/plugins/atoolbar.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** $Id: atoolbar.cpp,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Code file of the Ananas Tool bar of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/****************************************************************** + ******************************************************************/ + +//#include +#include "atoolbar.h" +//Added by qt3to4: +#include + +aToolBar::aToolBar( aCfg *cfg, aCfgItem &obj, aEngine *e, Q3MainWindow* parent , const char* name ) +: Q3ToolBar( parent, name ) +{ + md = cfg; + en = e; + ReadTool( obj ); +} + +aToolBar::~aToolBar(){ +} + +void +aToolBar::ReadTool( aCfgItem &obj ) +{ + aCfgItem aobj, apix; // action and pixmap XML data + QString aKey; // key sequence + long pid; // action id + + aobj = md->firstChild( obj ); //from first child action + while ( !aobj.isNull() ) { // foreach not null + aKey = md->sText ( aobj, md_key ); //key sequence + pid = md->id( aobj ); // action id + apix = md->findChild( + md->find( + md->text( md->findChild( aobj, md_comaction, 0 ) ).toLong() ), + md_active_picture, + 0 + ); // first action pixmap cfg object + QPixmap pix( md->binary( apix ) ); // pixmap + QAction *a = new QAction( + QIcon(pix), // pixmap + md->attr( aobj, mda_name), // name + aKey, // key sequence + this, // owner + md->attr( aobj, mda_name) // name + ); // create new action + actions.insert( pid, a ); // add action to dict + a->addTo( this ); // put action into toolbar + connect( a, SIGNAL(activated()), this, SLOT(on_Item()) ); // connect to slot + aobj = md->nextSibling( aobj ); // get next action + } +} + +void +aToolBar::on_Item() +{ + Q3IntDictIterator it( actions ); //dict iterator + for ( ; it.current(); ++it ) { // foreach action + if ( it.current() == sender() ) { // sender object + en->on_MenuBar( it.currentKey() ); // call slot + break; // break cycle + } + } +} diff --git a/src/plugins/atoolbar.h b/src/plugins/atoolbar.h new file mode 100644 index 0000000..5c7c129 --- /dev/null +++ b/src/plugins/atoolbar.h @@ -0,0 +1,61 @@ +/**************************************************************************** +** $Id: atoolbar.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the Ananas Tool bar of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/**************************************************************************** +****************************************************************************/ + +#ifndef ATOOLBAR_H +#define ATOOLBAR_H + +#include +#include + +#include "acfg.h" +#include "ananas.h" + +class QT_WIDGET_PLUGIN_EXPORT aToolBar : public Q3ToolBar +{ + Q_OBJECT +private: + aCfg *md; + aEngine *en; + Q3IntDict actions; + +public: + aToolBar( aCfg *cfg, aCfgItem &obj, aEngine *e, Q3MainWindow* parent = 0, const char* name = 0 ); + ~aToolBar(); + + void ReadTool( aCfgItem &obj ); + +public slots: + void on_Item(); +}; + + +#endif // ATOOLBAR_H diff --git a/src/plugins/awidgets_plugin.cpp b/src/plugins/awidgets_plugin.cpp new file mode 100644 index 0000000..ca0a03a --- /dev/null +++ b/src/plugins/awidgets_plugin.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "awidgets_plugin.h" + +#include + +#include "acombobox_plugin.h" +#include "wfield_plugin.h" +#include "wdbfield_plugin.h" +#include "wtable_plugin.h" +#include "wdbtable_plugin.h" +#include "wcatalogue_plugin.h" +#include "wdocument_plugin.h" +#include "wjournal_plugin.h" +#include "wgrouptree_plugin.h" +#include "wactionbutton_plugin.h" +#include "wreport_plugin.h" + + +aWidgetsCollection::aWidgetsCollection(QObject *parent) + : QObject(parent) +{ + widgets.append(new wActionButtonPlugin(this)); + widgets.append(new wFieldPlugin(this)); + widgets.append(new wDBFieldPlugin(this)); + widgets.append(new wTablePlugin(this)); + widgets.append(new wDBTablePlugin(this)); + widgets.append(new wGroupTreePlugin(this)); + widgets.append(new AComboBoxPlugin(this)); + widgets.append(new wCataloguePlugin(this)); + widgets.append(new wDocumentPlugin(this)); + widgets.append(new wJournalPlugin(this)); + widgets.append(new wReportPlugin(this)); +} + +QList aWidgetsCollection::customWidgets() const +{ + return widgets; +} + +Q_EXPORT_PLUGIN2(aWidgetsCollection, aWidgetsCollection) diff --git a/src/plugins/awidgets_plugin.h b/src/plugins/awidgets_plugin.h new file mode 100644 index 0000000..db17ddb --- /dev/null +++ b/src/plugins/awidgets_plugin.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef AWIDGETS_PLUGIN_H +#define AWIDGETS_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +typedef QList aListInterfaces; + +class QT_WIDGET_PLUGIN_EXPORT aWidgetsCollection: public QObject, public QDesignerCustomWidgetCollectionInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetCollectionInterface) + +public: + aWidgetsCollection(QObject *parent=0); + + virtual aListInterfaces customWidgets() const; + +private: + aListInterfaces widgets; +}; + +#endif // AWIDGETS_PLUGIN_H diff --git a/src/plugins/catalogue/catalogform.cpp b/src/plugins/catalogue/catalogform.cpp new file mode 100644 index 0000000..cef8d59 --- /dev/null +++ b/src/plugins/catalogue/catalogform.cpp @@ -0,0 +1,986 @@ +#include "catalogform.h" + +#include +#include +#include "alog.h" +// TODO Remove!!! +#include "../ananas/mainform.h" +#include "aform.h" +#include "aservice.h" + +#include +#include +#include +#include +#include +#include +#include +/* + * Constructs a CatalogForm as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +CatalogForm::CatalogForm(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +CatalogForm::~CatalogForm() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void CatalogForm::languageChange() +{ + retranslateUi(this); +} + +/*! + * \return id selected element + */ +qulonglong +CatalogForm::getId() +{ + return id; +} + +/*! + * Function set initial data. Adds one element in each group. + * \param catalog (in) - object catalog for edit or select. + * \param mg (in) - map of catalog groups. Key - group id. + * \param Fname (in) - list of field names of elements. + * \param FnameGroup (in) - list of field names of groups. + */ +void +CatalogForm::setData( aCatalogue* catalog, + QMap mg, + //QMap map_d, + const QStringList & Fname, + const QStringList & FnameGroup, + qulonglong idElForm, + qulonglong idGrForm, + const bool toSelect) +{ + ListView->setDestination(toSelect); + aLog::print(aLog::Debug, tr("CatalogForm:setData begin")); + Q3ListViewItem* item; + uint i; + QPixmap pixmap(getElementPixmap()); + QPixmap pixmap_mark_deleted(getMarkDeletedPixmap()); + idElementForm = idElForm; + idGroupForm = idGrForm; + cat = catalog; + fieldName= Fname[0]; + fieldList= Fname; + fieldListGroup = FnameGroup; + map_gr = mg; + ListView->setAllColumnsShowFocus ( true ); + QMap::Iterator it = map_gr.begin(); + cat->Select(); + // added one element in each group + while(it!=map_gr.end()) + { + cat->selectByGroup(it.key());// select elements in each group + if(cat->First()) // if group have elements + { + item = new Q3ListViewItem(map_gr[it.key()]); + aLog::print(aLog::Debug, tr("CatalogForm add first element in group")); + //printf("add first element in group\n"); + if(cat->isElementMarkDeleted()) + item->setPixmap(0,pixmap_mark_deleted); + else + item->setPixmap(0,pixmap); + for(i=0; isetText(i,cat->sysValue(fieldList[i]).toString()); + } + map_el.insert(cat->sysValue("id").toULongLong(),item); + } + ++it; + } + + cat->selectByGroup(0);// select elements without group + if(cat->First()) + { + + aLog::print(aLog::Debug, tr("CatalogForm add elements into root")); + do + { + item = new Q3ListViewItem(ListView); + if(cat->isElementMarkDeleted()) + item->setPixmap(0,pixmap_mark_deleted); + else + item->setPixmap(0,pixmap); + for(i=0; isetText(i,cat->sysValue(fieldList[i]).toString()); + } + map_el.insert(cat->sysValue("id").toULongLong(),item); + + }while(cat->Next()); + } + cat->Select(); + setGeometry(aService::loadSizeFromConfig(QString("%1_embedded editor").arg(cat->md->attr(cat->obj, mda_name)))); + ListView->setSelected(ListView->firstChild(),true); + aLog::print(aLog::Debug, tr("CatalogForm init")); +} + +/*! + * Function set id, returned getId(). + * \param idx (in) - id. + */ +void +CatalogForm::setId(qulonglong idx ) +{ + id = idx; +} + +/*! Function search string s in table of elements and show list founding lines. + * Searching for length s >= constant LENGTH_NO_FIND. + * Displaing <= VISIBLE_ROWS lines. + * \param s (in) - string for search. + */ +void +CatalogForm::find(const QString& s ) +{ + int count=0;//,rows=0; + bool ok; + int tmp = aService::readConfigVariable("LengthAboveFind",&ok).toInt(); + if(!ok) tmp = 3; + const int LENGTH_NO_FIND = tmp; + + tmp = aService::readConfigVariable("VisibleRows",&ok).toInt(); + if(!ok) tmp = 50; + + const int VISIBLE_ROWS = tmp; + + setId(0); + ListHint->clear(); + if(s.length()>=LENGTH_NO_FIND) // show list hint + { + if(!ListHint->isVisible()) + { + ListHint->show(LineEdit, StatusFrame); + StatusFrame->show(); + } + + cat->select(fieldName + " like '%"+s+"%'");// AND df<>'1'"); + if(cat->First()) + { + do + { + if(count++insertItem(cat->sysValue(fieldName).toString(), cat->sysValue("id").toInt()); + } + } while(cat->Next()); + } + if(!ListHint->count()) // don't show empty list + { + ListHint->hide(); + StatusFrame->hide(); + + } + else + { + StatusFrame->repaint(); + StatusFrame->drawText( 5, StatusFrame->size().height()-3, QString(tr("displaying %1 from %2")).arg(ListHint->count()).arg(count) ); + } + + } + else // length < LENGTH_NO_FIND, don't show list hint + { + if(ListHint->isVisible()) + { + ListHint->hide(); + StatusFrame->hide(); + } + } + +} + +/*! + * Handler signal press arrow for line edit + */ +void +CatalogForm::pressArrow() +{ + + if(ListHint->isVisible()) + { + ListHint->setFocus(); + ListHint->setSelected(ListHint->currentItem(),true); + + } + else + { + find(LineEdit->text()); + if(ListHint->isVisible()) + { + ListHint->setFocus(); + ListHint->setSelected(ListHint->currentItem(),true); + } + + } +} + + +void +CatalogForm::isPressArrow() +{ + +} + +/*! + * Function create visual objects and connect slots. + */ +void +CatalogForm::init() +{ + + ListView = new aListView(centralWidget(), "listView"); + ListView->setGeometry(30,30,400,300); + ListView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); + LineEdit = new aLineEdit(centralWidget(), "lineEdit"); + ListHint = new aListBox(centralWidget(), "listBox"); + StatusFrame = new Q3Frame(centralWidget(), "statusFrame"); + + ListView->setRootIsDecorated( true ); + + StatusFrame->setGeometry( QRect( 0, 0, 50,5 ) ); + StatusFrame->setFrameShape( Q3Frame::StyledPanel ); + StatusFrame->setFrameShadow( Q3Frame::Raised ); + StatusFrame->hide(); + + GridLayout = new Q3GridLayout(centralWidget(), 1, 1, 11, 6, "GridLayout"); + GridLayout->addMultiCellWidget( ListView, 2,3, 0 , 0 ); + GridLayout->addWidget( LineEdit, 1, 0 ); + GridLayout->addWidget( bCancel, 3, 1 ); + QLabel *lb = new QLabel(tr("Search"),centralWidget()); + lb->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)0, 0, 0, lb->sizePolicy().hasHeightForWidth() ) ); + GridLayout->addWidget( lb ,0,0); + QSpacerItem* spacer = new QSpacerItem( 20, 390, QSizePolicy::Minimum, QSizePolicy::Expanding ); + GridLayout->addMultiCell( spacer, 0,2,1, 1); + + QPixmap pix= rcIcon("cat.png"); + if(pix.isNull()) + { + aLog::print(aLog::Info, tr("Catalog Form image cat.png not loaded")); + } + else + { + setIcon( pix ); + } + //setFocusPolicy(); + // connect(this, SIGNAL (destoyed()), +// this, SLOT (close()); + + connect(ListView, SIGNAL (newItemRequest(Q3ListViewItem*)), + this, SLOT (new_item(Q3ListViewItem*))); + + connect(ListView, SIGNAL (newGroupRequest(Q3ListViewItem*)), + this, SLOT (new_group(Q3ListViewItem*))); + + connect(ListView, SIGNAL (delItemRequest(Q3ListViewItem*)), + this, SLOT (del_item(Q3ListViewItem*))); + + connect(ListView, SIGNAL (markDeletedRequest(Q3ListViewItem*)), + this, SLOT (mark_deleted(Q3ListViewItem*))); + + connect(ListView, SIGNAL (undoMarkDeletedRequest(Q3ListViewItem*)), + this, SLOT (undo_mark_deleted(Q3ListViewItem*))); + + connect(ListView, SIGNAL (editRequest(Q3ListViewItem*, int)), + this, SLOT (edit(Q3ListViewItem*, int))); + + connect(ListView, SIGNAL (selectRequest(Q3ListViewItem*)), + this, SLOT (select(Q3ListViewItem*))); + + connect(LineEdit, SIGNAL (delayTextChanged(const QString&)), + this, SLOT (find(const QString&))); + + connect(LineEdit, SIGNAL (keyArrowPressed()), + this, SLOT (pressArrow())); + + connect(LineEdit, SIGNAL (keyEnterPressed()), + this, SLOT (go())); + + connect(ListView, SIGNAL (expanded ( Q3ListViewItem *)), + this, SLOT (onLoadElements( Q3ListViewItem *))); + + connect(ListHint, SIGNAL (lostFocus()), + LineEdit, SLOT (setFocus())); + + connect(ListHint, SIGNAL (lostFocus()), + StatusFrame, SLOT (hide())); + + connect(ListHint, SIGNAL (lostFocus()), + ListHint, SLOT (hide())); + + connect(ListHint, SIGNAL (keyArrowLRPressed()), + LineEdit, SLOT (setFocus())); + + connect(ListHint, SIGNAL (keyArrowLRPressed(const QString&)), + this, SLOT (setText(const QString&))); + + connect(ListHint, SIGNAL (keyEnterPressed()), + this, SLOT (go())); + + connect(ListHint, SIGNAL (sendMessage(const QString &)), + this->statusBar(), SLOT (message( const QString &))); + + connect(ListView, SIGNAL (sendMessage(const QString &)), + this->statusBar(), SLOT (message( const QString &))); + + connect(LineEdit, SIGNAL (sendMessage(const QString &)), + this->statusBar(), SLOT (message( const QString &))); + + LineEdit->setFocus(); +} + +/*! + * Function delete objects, which were created in function init() + */ +void +CatalogForm::destroy() +{ + aService::saveSize2Config(this->rect(),QString("%1_embedded editor").arg(cat->md->attr(cat->obj, mda_name))); + delete cat; + cat = 0; +} + +/*! + * Function set text for line edit. Don't emit signals. + */ +void +CatalogForm::setText( const QString & s ) +{ + LineEdit->blockSignals ( true ); + LineEdit->setText ( s ); + setId(ListHint->getId(ListHint->currentItem())); + LineEdit->blockSignals ( false ); +} + +/*! + * Handler bGo::onClick() event. + */ +void +CatalogForm::go() +{ + qulonglong ide=getId(), idg; + if(!getId()) + { + ide = findFirst(LineEdit->text()); + setId(ide); + } + idg = getIdg(ide); + loadElements(idg); + if(map_el.contains(getId())) + { + goToItem(map_el[getId()]); + } + +} +/*! + * Ensures that item is visible, scrolling the list view vertically if necessary and opening (expanding) any parent items if this is required to show the item. + */ +void +CatalogForm::goToItem( Q3ListViewItem *item) +{ + ListView->setSelected(item, true); + ListView->ensureItemVisible(item); + ListView->setFocus(); +} + +/*! + * Searching string s in table of elements. + * \param s (in) - stirng for search. + * \return id first founding line. + */ +long +CatalogForm::findFirst( const QString &s ) +{ + qulonglong res=0; + cat->select(fieldName + " like '%"+s+"%'");// AND df<>'1'"); + //Cat->Select(); + if(cat->First()) + { + res = cat->sysValue("id").toULongLong(); + + } + return res; +} + +/*! + * Loads elements in group, if then don't loaded. + * \param idGroup (in) - id group for load. + */ +void +CatalogForm::loadElements( qulonglong idGroup ) +{ + Q3ListViewItem * item; + Q3ListViewItem * p_item; + uint i; +// printf("load elements\n"); +// printf("sel by group id = %lu\n",idGroup); + QPixmap pixmap(getElementPixmap()); + QPixmap pixmap_mark_deleted(getMarkDeletedPixmap()); + cat->selectByGroup(idGroup); +// printf("_sel by group\n"); + if(cat->First()) + { + do + { + //count++; + if(map_gr.contains(idGroup) + && !map_el.contains(cat->sysValue("id").toULongLong())) + { + p_item = map_gr[idGroup]; + item = new Q3ListViewItem(p_item); + if(cat->isElementMarkDeleted()) + item->setPixmap(0,pixmap_mark_deleted); + else + item->setPixmap(0,pixmap); + for(i=0; isetText(i,cat->sysValue(fieldList[i]).toString()); + } + map_el.insert(cat->sysValue("id").toULongLong(),item); + } + }while(cat->Next()); + } +// printf("end load\n"); +} + +/*! + * Loads elemens in group, if then don't loaded. + * \param item (in) - group for load. + */ +void +CatalogForm::onLoadElements( Q3ListViewItem *item ) +{ + Q3ValueList lst = map_gr.values(); + int ind = lst.findIndex(item); + qulonglong key; + if(ind!=-1) + { + Q3ValueList listKey = map_gr.keys(); + key = listKey[ind]; + loadElements(key); + } +} + +/*! + * Gets id parent group for element. + * \param ide (in) - id of element. + * \return id of group or 0 if no group. + */ +qulonglong +CatalogForm::getIdg( qulonglong ide ) +{ + return cat->idGroupByElement(ide); +} + + +/*! + * Adds new element. + * \param parentItem (in) - parent group. If parent group == 0, element not added. + */ +void +CatalogForm::new_item( Q3ListViewItem * parentItem ) +{ + if(!parentItem) + { + //cat->groupSelect(0); + cat->newElement(0); + //printf("id = %llu\n",id); + Q3ListViewItem* item = new Q3ListViewItem(ListView); + QPixmap pixmap(getElementPixmap()); + item->setPixmap(0,pixmap); + map_el.insert(cat->sysValue("id").toULongLong(),item); + edit(item,true); + ListView->ensureItemVisible(item); + // cfg_message(0,tr("Can't added element")); + return; + } + qulonglong id = getGroupId(parentItem); + QPixmap pixmap(getElementPixmap()); + if(id) // parent item is group + { + cat->groupSelect(id); + if(!cat->isGroupMarkDeleted()) + { + cat->newElement(id); + Q3ListViewItem* item = new Q3ListViewItem(map_gr[id]); + item->setPixmap(0,pixmap); + map_el.insert(cat->sysValue("id").toULongLong(),item); + edit(item,true); + ListView->ensureItemVisible(item); + //ListView->setFocus(); + } + else cfg_message(0,tr("Can't added new element to mark deleted group")); + } + else + { + new_item(parentItem->parent()); + }//cfg_message(0,tr("Can't added element to element")); +} + +/*! + * Gets group id. + * \param item (in) - group item. + */ +long +CatalogForm::getGroupId( Q3ListViewItem * item ) +{ + Q3ValueList lst = map_gr.values(); + int ind = lst.findIndex(item); + qulonglong key=0; + if(ind!=-1) + { + Q3ValueList listKey = map_gr.keys(); + key = listKey[ind]; + } +return key; +} + +/*! + * Adds new group. + * \param parentItem (in) - parent group. If parent group == 0, group adds in root. + */ +void +CatalogForm::new_group( Q3ListViewItem * parentItem ) +{ + qulonglong id = getGroupId(parentItem); + Q3ListViewItem * item; + QPixmap pixmap(getGroupPixmap()); + //cat->groupSelect( id ); + if(!id) + { + id = getElementId(parentItem); + if(id) + { + cfg_message(0,tr("Can't added group to element")); + return; + } + else + { +// printf(">>>>id=0\n"); + cat->newGroup(id); + item = new Q3ListViewItem(ListView); + ListView->insertItem(item); + } + } + else + { + //cat->groupSelect(id); + if(cat->isGroupMarkDeleted()) + { + cfg_message(0,tr("Can't added group to mark deleted group")); + return; + } + cat->newGroup(id); + item = new Q3ListViewItem(map_gr[id]); + } + //item->setText(0,cat->GroupSysValue(fieldListGroup[0]).toString()); + item->setPixmap(0,pixmap); + map_gr.insert(cat->GroupSysValue("id").toULongLong(),item); + edit(item,true); + ListView->ensureItemVisible(item); + ListView->setCurrentItem(item); + ListView->setSelected(item,true); + //ListView->setFocus(); + +} + +/*! + * Gets pixmap for group. + * \return pixmap. + */ +QPixmap +CatalogForm::getGroupPixmap() +{ + QPixmap pixmap = rcIcon("group2.png"); +// pixmap.detach(); + if(pixmap.isNull()) + { + aLog::print(aLog::Info, tr("Catalog Form group pixmap not load")); + } +return pixmap; +} + + +/*! + * Gets pixmap for element. + * \return pixmap. + */ +QPixmap +CatalogForm::getElementPixmap() +{ + QPixmap pixmap= rcIcon("field2.png"); + if(pixmap.isNull()) + { + aLog::print(aLog::Info, tr("Catalog Form element pixmap not load")); + } +return pixmap; +} + +/*! + * Gets pixmap for mark deleted element or group. + * \return pixmap. + */ +QPixmap +CatalogForm::getMarkDeletedPixmap() +{ + QPixmap pixmap = rcIcon("editdelete2.png"); +// pixmap. + if(pixmap.isNull()) + { + aLog::print(aLog::Info, tr("Catalog Form mark deleted group pixmap not load")); + } +return pixmap; +} +/*! + * Delets current element or group (with subgroups). + * \param item (in) - deleted element or group item. + */ +void CatalogForm::del_item( Q3ListViewItem * item ) +{ + // cat->groupSelect(getGroupId(item)); + qulonglong id = getElementId(item); + if(id) + { + cat->select(id); + if(cat->First()) + { + cat->delElement(); + map_el.remove(id); + delete item; + item = 0; + } + } + else + { + id = getGroupId(item); + if(id) + { + Q3ValueList listDeletedId; + cat->delGroup(id, listDeletedId); + Q3ValueList::iterator it = listDeletedId.begin(); + while(it!= listDeletedId.end()) + { + if(map_el.contains(*it)) map_el.remove(*it); + else if(map_gr.contains(*it)) map_gr.remove(*it); + ++it; + } + delete item; // destructor delete all subitems + item = 0; + } + } +} + +/*! + * Marks deleted current element or group (with subgroups). + * While for mark deleted items sets ahother pixmap only. + * \param item (in) - marked deleted element or group item. + */ +void CatalogForm::mark_deleted( Q3ListViewItem * item ) +{ + qulonglong id = getElementId(item); + if(id) + { + cat->select(id); +// cat->setSelected(true); + if(cat->First()) + { + cat->setMarkDeletedElement(id,true); + item->setPixmap(0,getMarkDeletedPixmap()); + } + } + else + { + id = getGroupId(item); + if(id) + { + loadElements(id); // populate items in group + Q3ValueList listDeletedId; + cat->getMarkDeletedList(id,listDeletedId); + Q3ValueList::iterator it = listDeletedId.begin(); + while(it != listDeletedId.end()) //first delete elements in this group + { + if(map_el.contains(*it)) + { + map_el[*it]->setPixmap(0, getMarkDeletedPixmap()); + cat->setMarkDeletedElement(*it,true); + it = listDeletedId.remove(it); + } + else + { + ++it; + } + } + it = listDeletedId.begin(); + while(it != listDeletedId.end()) //second delete groups + { + if(map_gr.contains(*it)) + { + map_gr[*it]->setPixmap(0, getMarkDeletedPixmap()); + cat->setMarkDeletedGroup(*it,true); + it = listDeletedId.remove(it); + //map_el[*it]->invalidateHeight();// setHeight(10); + } + else + { + ++it; + } + } + } + } +} + +/*! + * Undo marks deleted current element or group (with subgroups). + * \param item (in) - marked deleted element or group item. + */ +void CatalogForm::undo_mark_deleted( Q3ListViewItem * item ) +{ + qulonglong id = getElementId(item); + if(id) + { + cat->select(id); + if(cat->First()) + { + cat->setMarkDeletedElement(id,false); + item->setPixmap(0,getElementPixmap()); + } + } + else + { + id = getGroupId(item); + if(id) + { + // cat->select(QString("id=%1").arg(id),md_group); + //if(cat->FirstInGroupTable()) + Q3ValueList listDeletedId; + // cat->setMarkDeletedGroup(id, listDeletedId,false); + cat->getMarkDeletedList(id, listDeletedId); + Q3ValueList::iterator it = listDeletedId.begin(); + while(it != listDeletedId.end()) //first delete elements in this group + { + if(map_el.contains(*it)) + { + map_el[*it]->setPixmap(0, getElementPixmap()); + cat->setMarkDeletedElement(*it,false); + it = listDeletedId.remove(it); + } + else + { + ++it; + } + } + it = listDeletedId.begin(); + while(it != listDeletedId.end()) //second delete groups + { + if(map_gr.contains(*it)) + { + map_gr[*it]->setPixmap(0, getGroupPixmap()); + cat->setMarkDeletedGroup(*it,false); + it = listDeletedId.remove(it); + //map_el[*it]->invalidateHeight();// setHeight(10); + } + else + { + ++it; + } + } + } + } +} + +void CatalogForm::edit( Q3ListViewItem * item, int) +{ + edit( item, false); +} + +void CatalogForm::edit( Q3ListViewItem * item, bool afterNew) +{ +// QWidget *wd = topLevelWidget(); + aLog::print(aLog::Debug, tr("Catalog Form edit element start")); + MainForm * mw = (MainForm*) topLevelWidget(); + if(mw) + { + qulonglong id = getElementId(item); + if(id) + { + aLog::print(aLog::Debug, tr("Catalog Form edit element with id=%1").arg(id)); + cat->select(id); + if(idElementForm) + { + if(!cat->isElementMarkDeleted()) + { + aForm *editForm = new aForm(mw->ws, &mw->engine, (long int) idElementForm); + if(editForm) + { + if(afterNew) editForm->setMode(0); + else editForm->setMode(1); + editForm->Select(id); + connect(editForm, SIGNAL(closeForm(qulonglong)), this, SLOT(Refresh(qulonglong))); + editForm->show(); + } + else + { + aLog::print(aLog::Error, tr("Catalog Form edit element form is null")); + } + } + else cfg_message(0, tr("Can't edit mark deleted element")); + } + else cfg_message(1,tr("Catalog haven't edit element form")); + } + else + { + id = getGroupId(item); + aLog::print(aLog::Debug, tr("Catalog Form edit group with id = %1").arg(id)); + if(id) + { + + cat->groupSelect(id); + if(idGroupForm) + { + if(!cat->isGroupMarkDeleted()) + { + aForm *editForm = new aForm(mw->ws, &mw->engine, (long int) idGroupForm); + if(editForm) + { + if(afterNew) editForm->setMode(0); + else editForm->setMode(1); + + editForm->SelectGroup(id); + connect(editForm, SIGNAL(closeForm(qulonglong)), this, SLOT(Refresh(qulonglong))); + editForm->show(); + } + else + { + aLog::print(aLog::Error, tr("Catalog Form edit group form is null")); + } + } + else cfg_message(0, tr("Can't edit mark deleted group")); + } + else cfg_message(1,tr("Catalog haven't edit group form")); + } + } + } + else + { + aLog::print(aLog::Error, tr("Catalog Form main widget is not 'MainForm'")); + } + +} + +/*! + * Selects current group or element. + * \param item (in) - selected element or group item + */ +void CatalogForm::select( Q3ListViewItem * item ) +{ + qulonglong res = getGroupId(item); + if(!res) + { + res = getElementId(item); + cat->select(res); + if(!cat->isElementMarkDeleted()) + { + setId(res); + doOk(); + } + } + else + { + cat->groupSelect(res); + if(!cat->isGroupMarkDeleted()) + { + setId(res); + doOk(); + } + } + emit(selected(res)); +// return res; +} + +/*! + * Gets element id. + * \param item (in) - element item. + */ +qulonglong CatalogForm::getElementId( Q3ListViewItem * item ) +{ + Q3ValueList lst = map_el.values(); + int ind = lst.findIndex(item); + qulonglong key=0; + if(ind!=-1) + { + Q3ValueList listKey = map_el.keys(); + key = listKey[ind]; + } +return key; +} + + +void CatalogForm::doOk() +{ + close(); +} + + + +void CatalogForm::keyPressEvent( QKeyEvent * e ) +{ + if ( e->key()==Qt::Key_Return) + { + } + if ( e->key()==Qt::Key_Escape) + { + close(); + } + e->ignore(); +} + + +void CatalogForm::Refresh( qulonglong id ) +{ + Q3ListViewItem * item; + if( map_el.contains( id )) + { + item = map_el[id]; + cat->select( id ); + for(uint i=0; isetText(i,cat->sysValue(fieldList[i]).toString()); + ListView->setFocus(); + } + } + else + { + if( map_gr.contains( id ) ) + { + item = map_gr[id]; + cat->groupSelect( id ); + item->setText(0,cat->GroupSysValue(fieldListGroup[0]).toString()); + ListView->setFocus(); + } + } +} + +//#include "catalogform.ui.h" diff --git a/src/plugins/catalogue/catalogform.h b/src/plugins/catalogue/catalogform.h new file mode 100644 index 0000000..891f884 --- /dev/null +++ b/src/plugins/catalogue/catalogform.h @@ -0,0 +1,84 @@ +#ifndef CATALOGFORM_H +#define CATALOGFORM_H + +#include "ui_catalogform.h" + +#include +#include + + +class CatalogForm : public Q3MainWindow, public Ui::CatalogForm +{ + Q_OBJECT + +public: + CatalogForm(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~CatalogForm(); + + aListView* ListView; + QString fieldName; + aLineEdit *LineEdit; + aListBox* ListHint; + Q3Frame* StatusFrame; + aCatalogue* cat; + bool FormToSelect; + + virtual Q_ULLONG getId(); + virtual void init(); + virtual void destroy(); + virtual long findFirst( const QString & s ); + virtual Q_ULLONG getIdg( Q_ULLONG ide ); + virtual QPixmap getGroupPixmap(); + virtual void edit( Q3ListViewItem * item, bool ); + virtual QPixmap getElementPixmap(); + virtual QPixmap getMarkDeletedPixmap(); + +public slots: + virtual void setData( aCatalogue * catalog, QMap mg, const QStringList & Fname, const QStringList & FnameGroup, Q_ULLONG idElForm, Q_ULLONG idGrForm, const bool toSelect ); + virtual void setId( Q_ULLONG idx ); + virtual void find( const QString & s ); + virtual void pressArrow(); + virtual void isPressArrow(); + virtual void setText( const QString & s ); + virtual void go(); + virtual void goToItem( Q3ListViewItem * item ); + virtual void loadElements( Q_ULLONG idGroup ); + virtual void onLoadElements( Q3ListViewItem * item ); + virtual void new_item( Q3ListViewItem * parentItem ); + virtual void new_group( Q3ListViewItem * parentItem ); + virtual void del_item( Q3ListViewItem * item ); + virtual void mark_deleted( Q3ListViewItem * item ); + virtual void undo_mark_deleted( Q3ListViewItem * item ); + virtual void edit( Q3ListViewItem * item, int ); + virtual void select( Q3ListViewItem * item ); + virtual void Refresh( Q_ULLONG id ); + +signals: + void selected(Q_ULLONG); + +protected: + Q3GridLayout* GridLayout; + Q3VBoxLayout* layout1; + Q_ULLONG id,idElementForm,idGroupForm; + QStringList fieldList, fieldListGroup; + + virtual long getGroupId( Q3ListViewItem * item ); + virtual Q_ULLONG getElementId( Q3ListViewItem * item ); + +protected slots: + virtual void languageChange(); + + virtual void keyPressEvent( QKeyEvent * e ); + + +private: + QMap map_gr; + QMap map_el; + QMap map_deleted; + +private slots: + virtual void doOk(); + +}; + +#endif // CATALOGFORM_H diff --git a/src/plugins/catalogue/catalogform.ui b/src/plugins/catalogue/catalogform.ui new file mode 100644 index 0000000..f5411d8 --- /dev/null +++ b/src/plugins/catalogue/catalogform.ui @@ -0,0 +1,50 @@ + + + + + CatalogForm + + + + 0 + 0 + 610 + 466 + + + + Catalogue + + + + + + 530 + 410 + 70 + 24 + + + + Cancel + + + + + + qPixmapFromMimeSource + + wfield.h + catalogformwidgets.h + qmap.h + qstatusbar.h + + + + bCancel + clicked() + CatalogForm + close() + + + diff --git a/src/plugins/catalogue/catalogformwidgets.cpp b/src/plugins/catalogue/catalogformwidgets.cpp new file mode 100644 index 0000000..2d067d0 --- /dev/null +++ b/src/plugins/catalogue/catalogformwidgets.cpp @@ -0,0 +1,435 @@ +/**************************************************************************** +** $Id: catalogformwidgets.cpp,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Catalogue metadata object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +//Added by qt3to4: +#include +#include +#include + +#include "catalogformwidgets.h" +/*! + * Constructor + */ +aListBox::aListBox(QWidget* parent, const char * name, Qt::WFlags f):Q3ListBox(parent,name,f) +{ + + listPrivate = new Q3ListBox(parent); + listPrivate->hide(); + setFocusPolicy (Qt::StrongFocus); + connect(this, SIGNAL ( doubleClicked( Q3ListBoxItem * ) ), + this, SLOT ( doubleClickHandler( Q3ListBoxItem * ) )); +// layout1 = new QVBoxLayout(); +// statusBar = new QLabel(this,"statusBar"); +// statusBar-> +// layout1->addWidget(this,0); +// layout1->addWidget(statusBar,1); + +} +/*! + * Destructor + */ +aListBox::~aListBox() +{ +// delete statusBar; + delete listPrivate; +} +/*! + * Function move and resize frame and list box. + *\param wd (in) - widget for pattern geometry. + * \param fr (in, out) - status frame. + */ +void +aListBox::show(QWidget *wd, Q3Frame *fr)//, QLabel *lb) +{ + setGeometry(wd->x(), + wd->y()+wd->size().height()+1, + wd->size().width()+wd->x(), + wd->size().height()+wd->y()+100); + QWidget::show(); +// statusBar->setGeometry( size().higth(), +// size()+10 +// statusBar->setWidth(wd->size().width() ); +// fr->resize(size()); +// fr->setPos(pos()); + fr->setGeometry(x(), + size().height()+y(), + size().width(), + 20); + emit(sendMessage(tr("Press arrow down for go to drop down list"))); +// lb->move(fr->x()+2,fr->y()+2); +} +/*! + * Key press event handler. + * Emit signals keyArrowLRPressed if press arrow left or arrow rigth. + * \param e (in) - key press event. + */ +void +aListBox::keyPressEvent(QKeyEvent *e) +{ + if(e->key()==Qt::Key_Left || e->key()==Qt::Key_Right) + { + emit(keyArrowLRPressed()); + emit(keyArrowLRPressed(currentText())); + //printf("emit key pressed\n"); + } + if(e->key() == Qt::Key_Return) + { + //printf("enter !!!\n");// return; + emit(keyArrowLRPressed()); + emit(keyArrowLRPressed(currentText())); + emit(keyEnterPressed()); + //printf("enter !!!\n");// return; + } + if(e->key() == Qt::Key_Escape) + { + this->clearFocus(); + +// emit(lostFocus()); +// printf("Esc!\n"); + e->accept(); + return; + + } + e->accept(); + Q3ListBox::keyPressEvent(e); +} +/*! + * Inserts s in list and idx in list of id. + * \param s (in) - string for insert. + * \param idx (in) - id for insert. + * \param index (in) - position for insert. + */ +void +aListBox::insertItem(const QString &s, long idx, int index) +{ + listPrivate->insertItem(QString("%1").arg(idx),index); + Q3ListBox::insertItem(s,index); +} +/*! + * Clears list and list of id. + */ +void +aListBox::clear() +{ + listPrivate->clear(); + Q3ListBox::clear(); +} +/*! + * Focus out event handler. Emit signal lost focus. + * \param e - focus out event. + */ +void +aListBox::focusOutEvent ( QFocusEvent *e ) +{ + QWidget::focusOutEvent ( e ); +// printf("focus is out\n"); + emit(lostFocus()); +} + +void +aListBox::setFocus() +{ + Q3ListBox::setFocus(); + emit(sendMessage(tr("Use Enter for go to item and arrow for navigation"))); +} + +void +aListBox::doubleClickHandler(Q3ListBoxItem *i) +{ +// printf("double click handler!\n"); + emit(keyArrowLRPressed()); + emit(keyArrowLRPressed(i->text())); + emit(keyEnterPressed()); + +} +aLineEdit::aLineEdit ( QWidget* parent, const char* name) : QLineEdit(parent,name) +{ + timer = new QTimer(this); + setFocusPolicy(Qt::StrongFocus); + connect(timer, SIGNAL (timeout()), + this, SLOT (timerDone())); + connect(this, SIGNAL (textChanged ( const QString & )), + this, SLOT (timerRestart(const QString &))); + connect(this, SIGNAL (lostFocus()), + SLOT (stopTimer())); +} + +aLineEdit::~aLineEdit() +{ + if(timer) + { + delete timer; + timer=0; + } +} + +/*! Key press event handler. Emit signal keyArrowPressed(). + * \param e (in) - key press event. + */ +void +aLineEdit::keyPressEvent(QKeyEvent *e) +{ +// timer->start(500,TRUE); + if(e->key()==Qt::Key_Return)//Key_Enter) + { + e->accept(); + emit(keyEnterPressed()); + //e->ignore(); + } + if(e->key()==Qt::Key_Down) + { + emit(keyArrowPressed()); + } + e->ignore(); + QLineEdit::keyPressEvent(e); +} +void +aLineEdit::timerDone() +{ + emit(delayTextChanged(text())); + +} + +void +aLineEdit::timerRestart(const QString &) +{ + timer->start(500, false); +} + +void +aLineEdit::stopTimer() +{ + timer->stop(); +} + +void +aLineEdit::setFocus() +{ + QLineEdit::setFocus(); + emit(sendMessage(tr("Enter string for search"))); +} +/*! + <* Constructor create list view and popup menu. + */ +aListView::aListView(QWidget* parent, + const char* name, + Qt::WFlags f) : Q3ListView(parent,name,f) +{ + menu = 0; + toSelect = true; + + connect(this, SIGNAL( doubleClicked( Q3ListViewItem *, const QPoint&, int)), + this, SLOT( doubleClickHandler( Q3ListViewItem *, const QPoint&, int))); + + connect(this, SIGNAL( contextMenuRequested (Q3ListViewItem*, const QPoint&, int)), + this, SLOT( showMenu( Q3ListViewItem*, const QPoint&, int))); + +} + +aListView::~aListView() +{ + delete menu; + menu = 0; +} +/*! + * Shows popup menu. + * \param item (in) - current item. + * \param p (in) - mouse pointer position. + * \param col (in) - current column. + */ +void +aListView::showMenu( Q3ListViewItem* item, const QPoint& p, int col) +{ + delete menu; + menu = new Q3PopupMenu(); + if(toSelect) + { + menu->insertItem(tr("Select"), this, SLOT(select())); + menu->insertSeparator(); + } + menu->insertItem(tr("Edit"), this, SLOT(edit())); + menu->insertSeparator(); + menu->insertItem(tr("New element"), this, SLOT(newItem())); + menu->insertItem(tr("New group"), this, SLOT(newGroup())); + menu->insertSeparator(); + //menu->setItemEnabled(menu->idAt(3),false); + menu->insertItem(tr("Undo mark delete"), this, SLOT(undoMarkDeleted())); + menu->insertItem(tr("Delete (mark deleted)"),this, SLOT(markDeleted())); + menu->insertItem(tr("Delete (phisical)"), this, SLOT(delItem())); + parentItem = item; + if(col==-1) col = 0; + columnClicked = col; + menu->popup( p ); +} + +void +aListView::newItem() +{ + emit (newItemRequest(parentItem)); +} +void +aListView::newGroup() +{ + emit (newGroupRequest(parentItem)); +} +void +aListView::delItem() +{ + emit (delItemRequest(parentItem)); +} +void +aListView::markDeleted() +{ + emit (markDeletedRequest(parentItem)); +} +void +aListView::undoMarkDeleted() +{ + emit (undoMarkDeletedRequest(parentItem)); +} + +void +aListView::edit() +{ + emit (editRequest(parentItem,columnClicked)); +} +void +aListView::select() +{ + emit (selectRequest(parentItem)); +} +void +aListView::setDestination(const bool dest) +{ + toSelect = dest; +} +bool +aListView::getDestination() +{ + return toSelect; +} +/*! Key press event handler. Emit signal keyEnterPressed(). + * \param e (in) - key press event. + */ +void +aListView::keyPressEvent(QKeyEvent *e) +{ + + switch(e->key()) + { + case Qt::Key_Return: + e->accept(); + parentItem = selectedItem(); + columnClicked = 0; + if(toSelect) + { + select(); + } + else + { + edit(); + } + break; + case Qt::Key_Insert: + parentItem = selectedItem(); + columnClicked = 0; + switch(QMessageBox::question(this, + tr("Type of new item"), + tr("

Select type of new item

"), + tr("&Elemnt"), tr("&Group"))) + { + case 0: + newItem(); + break; + case 1: + newGroup(); + break; + default: + break; + } + break; + case Qt::Key_Delete: + parentItem = selectedItem(); + columnClicked = 0; + switch(QMessageBox::question(this, + tr("Delete item"), + tr("

Mark deleted or delete?

"), + tr("&Mark deleted"), tr("&Delete"))) + { + case 0: + markDeleted(); + break; + case 1: + delItem(); + break; + default: + break; + } + break; + default: + e->ignore(); + break; + } + Q3ListView::keyPressEvent(e); + +} + +void +aListView::setFocus() +{ + Q3ListView::setFocus(); + if(toSelect) + { + emit(sendMessage(tr(" - select, - add, - delete items"))); + } + else + { + emit(sendMessage(tr(" - edit, - add, - delete items"))); + } +} + + +void +aListView::doubleClickHandler( Q3ListViewItem *item, const QPoint& p, int col) +{ + parentItem = item; + columnClicked = col; + if(toSelect) + { + select(); + } + else + { + edit(); + } +} + diff --git a/src/plugins/catalogue/catalogformwidgets.h b/src/plugins/catalogue/catalogformwidgets.h new file mode 100644 index 0000000..f4b07a8 --- /dev/null +++ b/src/plugins/catalogue/catalogformwidgets.h @@ -0,0 +1,154 @@ +/**************************************************************************** +** $Id: catalogformwidgets.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Catalogue metadata object implementation file of +** Ananas application library +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef CATALOGFORMWIDGET_H +#define CATALOGFORMWIDGET_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include +//class QVBoxLayout; + +class aListBox:public Q3ListBox +{ + Q_OBJECT +public: + aListBox(QWidget *parent = 0, const char* name = 0, Qt::WFlags f = 0); + ~aListBox(); + void insertItem(const QString &s, long idx, int index = -1); + void show(QWidget *w, Q3Frame *fr);//, QLabel *lb); + + long getId(int ind) { return atol(listPrivate->text(ind).ascii()); }; + + void clear(); + //void setId(long idx) {id = idx;}; +public slots: + virtual void setFocus(); + +protected: + + virtual void keyPressEvent ( QKeyEvent *e ); + void focusOutEvent ( QFocusEvent *e ); +protected slots: + void doubleClickHandler(Q3ListBoxItem *i); + // QVBoxLayout* layout1; +// QLabel * statusBar; +signals: + void keyArrowLRPressed(); + void keyArrowLRPressed(const QString&); + void keyEnterPressed(); + void lostFocus(); + void sendMessage(const QString &); +private: + Q3ListBox* listPrivate; +}; + + +class aLineEdit:public QLineEdit +{ + Q_OBJECT +public: + aLineEdit( QWidget* parent, const char* name = 0 ); + ~aLineEdit(); + +protected: + virtual void keyPressEvent ( QKeyEvent *e ); + +private: + QTimer *timer; + +public slots: + void stopTimer(); + virtual void setFocus(); +protected slots: + void timerDone(); + void timerRestart(const QString & s); + +signals: + void keyArrowPressed(); + void delayTextChanged(const QString &); + void keyEnterPressed(); + void sendMessage(const QString &); +}; + +class aListView : public Q3ListView +{ + Q_OBJECT +public: + aListView(QWidget* parent = 0, const char* name = 0, Qt::WFlags f = 0); + ~aListView(); + + Q3PopupMenu *menu; + void setDestination(const bool dest); + bool getDestination(); +protected: + virtual void keyPressEvent ( QKeyEvent *e ); + +public slots: + + void showMenu( Q3ListViewItem* item, const QPoint& p, int); + void newItem(); + void newGroup(); + void delItem(); + void markDeleted(); + void undoMarkDeleted(); + void edit(); + void select(); + virtual void setFocus(); + +protected slots: + void doubleClickHandler( Q3ListViewItem *, const QPoint&, int col); + +signals: + + void sendMessage(const QString &); + void newItemRequest(Q3ListViewItem* parentItem); + void newGroupRequest(Q3ListViewItem* parentItem); + void delItemRequest(Q3ListViewItem* item); + void markDeletedRequest(Q3ListViewItem* item); + void undoMarkDeletedRequest(Q3ListViewItem* item); + void editRequest(Q3ListViewItem* item, int columnClicked); + void selectRequest(Q3ListViewItem* item); +private: + Q3ListViewItem* parentItem; + int columnClicked; + bool toSelect; +}; +#endif + diff --git a/src/plugins/catalogue/catalogue.pri b/src/plugins/catalogue/catalogue.pri new file mode 100644 index 0000000..85dbd8a --- /dev/null +++ b/src/plugins/catalogue/catalogue.pri @@ -0,0 +1,19 @@ +HEADERS += \ + catalogue/catalogform.h \ + catalogue/catalogformwidgets.h \ + catalogue/ecatalogue.h \ + catalogue/wcatalogue.h \ + catalogue/wcatalogue_plugin.h \ + catalogue/wcatalogue_taskmenu.h + +SOURCES += \ + catalogue/catalogform.cpp \ + catalogue/catalogformwidgets.cpp \ + catalogue/ecatalogue.cpp \ + catalogue/wcatalogue.cpp \ + catalogue/wcatalogue_plugin.cpp \ + catalogue/wcatalogue_taskmenu.cpp + +FORMS += \ + catalogue/catalogform.ui \ + catalogue/ecatalogue.ui diff --git a/src/plugins/catalogue/ecatalogue.cpp b/src/plugins/catalogue/ecatalogue.cpp new file mode 100644 index 0000000..2da761e --- /dev/null +++ b/src/plugins/catalogue/ecatalogue.cpp @@ -0,0 +1,203 @@ +#include "ecatalogue.h" + +#include +#include +#include + +/* + * Constructs a eCatalogue as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eCatalogue::eCatalogue(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eCatalogue::~eCatalogue() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eCatalogue::languageChange() +{ + retranslateUi(this); +} + + +#include "acfg.h" + +void eCatalogue::init() +{ +/* + int oc, i, f, idx=0; + char *id, *name, *ot; + cfg_objptr o; + char otype[100]; + QString named; + + otypes.clear(); + eType->clear(); + otypes.append("D"); + eType->insertItem(trUtf8("Дата"), idx++); + otypes.append("T"); + eType->insertItem(trUtf8("Время"), idx++); + otypes.append("N %d %d"); + eType->insertItem(trUtf8("Число"), idx++); + otypes.append("C %d"); + eType->insertItem(trUtf8("Строка"), idx++); + + oc=cfgobj_count(NULL, NULL); + for (i=1;i<=oc;i++) { + id=cfgobj_idn(NULL, NULL, i, &o); + ot=(char *)o->name; + name=cfgobj_attr(o, "name"); + named=""; + f=0; + if (strcmp((char *)ot, aot_doc)==0) { + named=trUtf8("Документ."); + f=1; + } + if (strcmp((char *)ot, aot_cat)==0) { + named=trUtf8("Справочник."); + f=1; + } + if (f) { + named=named+trUtf8(name); + sprintf(otype, "O %s", id); + otypes.append(otype); + eType->insertItem(named, idx++); + } + } +*/ +} + + + +/*void eCatalogue::setData( aCatalogue *f, QWidget *mw ) +{ + aCfg *md = 0; + if ( !f ) return; +// printf("name = '%s'\n", (const char *) mw->name() ); + if (mw->name() == QString("ananas-designer_mainwindow") ) { +// printf("running under ananas designer\n"); + CfgForm *cf = ( ( MainForm *) mw )->cfgForm(); + if ( cf ) { + md = &cf->cfg; +// QString ts = f->getFieldType(); +// char t=' '; + int w=0, d=0, idx=0; + unsigned int i; + long oid , id; + + id = f->getId(); + + otypes.clear(); + eType->clear(); + + QStringList tlist = md->types( md_catalogue ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == id ) { + eType->setCurrentItem( i ); + break; + } + } + } + } else reject(); + } + +} +*/ + +void +eCatalogue::setData( QWidget *o, aCfg *md ) +{ +// const QObject *o = sender(); + if ( o ) { + if ( o->className() != QString("wCatalogue") || !md ) { + reject(); + return; + } + } + else { + reject(); + return; + } + wCatalogue *f = ( wCatalogue*) o; + int w=0, d=0, idx=0; + unsigned int i; + long oid , id; + + id = f->getId(); + + QStringList tlist = md->types( md_catalogue ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == id ) { + eType->setCurrentItem( i ); + break; + } + } + } +} + + +void eCatalogue::getData( QWidget * o ) +{ + +/* int idx=eType->currentItem(); + long oid = 0; + + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); + f->setId( oid ); + } + } +*/ +// const QObject *o = sender(); + if ( !o ) return; + if ( o->className() != QString("wCatalogue") ) return; + wCatalogue *f = ( wCatalogue*) o; + + int idx=eType->currentItem(); + long oid = 0; + + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); + f->setId( oid ); + } + } + +} + diff --git a/src/plugins/catalogue/ecatalogue.h b/src/plugins/catalogue/ecatalogue.h new file mode 100644 index 0000000..1fc2cbe --- /dev/null +++ b/src/plugins/catalogue/ecatalogue.h @@ -0,0 +1,27 @@ +#ifndef ECATALOGUE_H +#define ECATALOGUE_H + +#include "ui_ecatalogue.h" + + +class eCatalogue : public QDialog, public Ui::eCatalogue +{ + Q_OBJECT + +public: + eCatalogue(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eCatalogue(); + + QStringList otypes; + +public slots: + virtual void init(); + virtual void setData( QWidget * o, aCfg * md ); + virtual void getData( QWidget * o ); + +protected slots: + virtual void languageChange(); + +}; + +#endif // ECATALOGUE_H diff --git a/src/plugins/catalogue/ecatalogue.ui b/src/plugins/catalogue/ecatalogue.ui new file mode 100644 index 0000000..4f847bf --- /dev/null +++ b/src/plugins/catalogue/ecatalogue.ui @@ -0,0 +1,116 @@ + + + + + eCatalogue + + + + 0 + 0 + 348 + 106 + + + + Catalogue + + + + + + + + + + + + + 100 + 32767 + + + + Type + + + false + + + + + + + + 31 + 16 + + + + Expanding + + + Vertical + + + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + + + 91 + 31 + + + + Expanding + + + Horizontal + + + + + + + qPixmapFromMimeSource + + ananas.h + wcatalogue.h + + + + bOK + clicked() + eCatalogue + accept() + + + bCancel + clicked() + eCatalogue + reject() + + + diff --git a/src/plugins/catalogue/wcatalogue.cpp b/src/plugins/catalogue/wcatalogue.cpp new file mode 100644 index 0000000..e6d42a2 --- /dev/null +++ b/src/plugins/catalogue/wcatalogue.cpp @@ -0,0 +1,443 @@ +/**************************************************************************** +** $Id: wcatalogue.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Code file of the catlogue plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +//--#include +#include "adatabase.h" +#include "wcatalogue.h" +#include "ecatalogue.h" +#include "wdbfield.h" +#include "wdbtable.h" +#include "wgrouptree.h" +#include "alog.h" + +//extern aCfg *plugins_aCfg; + + +/*!\en + *\_en \ru + *\_ru + */ +wCatalogue::wCatalogue( QWidget *parent, Qt::WFlags fl ) +:aWidget( parent, "wCatalogue", fl ) +{ + setInited( false ); + setFormMode( 0 ); +} + + +wCatalogue::~wCatalogue() +{ +} + + + +void +wCatalogue::initObject( aDatabase *adb ) +{ + aWidget::initObject( adb ); + QObject *obj; + QObjectList lb = this->queryList( "QWidget" ); + QListIterator itb( lb ); // iterate over all wDBFields + while ( itb.hasNext() ) + { + obj = itb.next(); + if(obj->inherits("wDBField")) + { +// if ( (wActionButtton*) obj )->isActionUpdate() ) + connect( (wDBField *)obj, SIGNAL(valueChanged( const QVariant & )), + this, SLOT(valueChanged( const QVariant & )) ); + } + if(obj->inherits("wGroupTree")) + { + ((wGroupTree*)obj)->setId(getId()); + connect( (wGroupTree *)obj, SIGNAL(selectionChanged( const qulonglong )), + this, SLOT(selectionChanged( const qulonglong )) ); + + } + if(obj->inherits("wDBTable")) + { + connect( this, SIGNAL(newSelectionFilter( const QString& )), + (wDBTable*)obj, SLOT(newFilter( const QString& )) ); + connect( this, SIGNAL(newSelectionGroupId( const qulonglong )), + (wDBTable*)obj, SLOT(newDataId( const qulonglong )) ); + + } + + } + //--delete lb; // delete the list, not the objects + //--focusData()->next()->setFocus(); + focusNextChild(); + +} + + + +/*! + *\~english + * Processed field value changed. + * Conected on signal valueChanged( const QVariant & ) for all + * wDBField insert in the widget. + * Decode field name and set new field value in database object. + * Emit signal value change with field name and value. + * Signal connectaed on aform slot, for future work. + *\~russian + * Обрабатывает изменение значения поля + * Присоединяется к сигналу valueChanged( const QVariant & ), + * всех полей типа wDBField, вставленных в виджет. + * Декодирует имя поля и сохраняет его новое значение в объекте для + * работы с базой. + * Посылает сигнал об изменении значения, который содержит имя поля + * и его новое значение. + * Сигнал присоединяется к слоту формы для последующей обработки. + *\~ + *\param value - \~english new field value. \~russian новое значение поля. \~ + */ +void +wCatalogue::valueChanged( const QVariant & value ) +{ + if ( sender()->className() != QString("wDBField") ) return; + wDBField * fld = ( wDBField * ) sender(); + aCfgItem o_field,o_parent; + QString parent_name; + QVariant val = value; + + o_field = md->find(fld->getId()); + o_parent = md->parent(o_field); + const QString fname = fld->getFieldName(); + + parent_name = md->objClass( o_parent ); + if( parent_name == QString(md_group) ) + { + + if (dbobj)// && dbobj->className() == QString("aCatalogue") ) + { + aLog::print(aLog::Debug, tr("wCatalogue group value changed to %1").arg(value.toString())); + ((aCatalogue*)dbobj)->GroupSetValue( fname, value ); + } + + + } + + else + { + + if (dbobj) + { + aLog::print(aLog::Debug, tr("wCatalogue element value changed to %1").arg(value.toString())); + dbobj->SetValue( fname, val ); + } + } + + emit aWidget::valueChanged( fname, value ); +} + + +bool +wCatalogue::checkStructure() +{ + + return false; +} + + +QVariant +wCatalogue::value( const QString &name ) +{ + + aLog::print(aLog::Error, tr("wCatalogue value for name %1 ").arg(name)); + return QVariant(""); +} + + +void +wCatalogue::setValue( const QString &name, QVariant &value ) +{ +// if ( formMode() == CATALOGUEFORMMODE_GROUP ) { +// ( aCatalogue *) dbobj->SetValue(name,value); +// } else { +// printf("wCatalogue::setValue(%s,%s)\n",name.ascii(),value.toString().ascii()); + aLog::print(aLog::Debug, tr("wCatalogue set value %1 for name %2 ").arg(value.toString()).arg(name)); + dbobj->SetValue(name,value); +// } + //dbobj->Update(); +// debug_message("wCatalogue value changed to %s\n",value.toString().ascii()); + +} + + +QDialog* +wCatalogue::createEditor( QWidget *parent ) +{ + return new eCatalogue( parent ); +} + + +int +wCatalogue::select( qulonglong )//id ) +{ + return 0; +} + + +qulonglong +wCatalogue::insert() +{ + return 0; +} + + +int +wCatalogue::update() +{ + if ( dbobj ) + { + aLog::print(aLog::Debug, tr("wCatalogue update")); +// printf("wCatalogue:;update()\n"); + return dbobj->Update(); + } + + aLog::print(aLog::Error, tr("wCatalogue have not data source object ")); + return err_abstractobj; +} + + +int +wCatalogue::markDelete() +{ + return 0; +} + + +QString +wCatalogue::displayString() +{ + return ""; +} + +/*! + * Create aDocument database object. + */ +aObject * +wCatalogue::createDBObject( aCfgItem obj, aDatabase *adb ) +{ +// printf("cat form mode = %i\n",formMode() ); +// if ( formMode() == CATALOGUEFORMMODE_GROUP ) return new aCatGroup( obj, adb ); + return new aCatalogue( obj, adb ); +} + + +ERR_Code +wCatalogue::Select( qulonglong id ) +{ + + //if ( formMode()==0 ) { + + QObject *obj; + QObjectList lb = this->queryList( "wDBTable" ); + QListIterator itb( lb ); // iterate over all wDBTable + while ( itb.hasNext() ) + { + obj = itb.next(); + ( (wDBTable *)obj )->setFocus(); + ( (wDBTable *)obj )->Select( id ); +// if ( (wActionButtton*) obj )->isActionUpdate() ) +// connect( (wDBTable *)obj, SIGNAL(valueChanged( const QVariant & )), +// this, SLOT(valueChanged( const QVariant & )) ); + } + //--delete lb; // delete the list, not the objects + //--lb=0; +// return 0; + + + +//} +// +// + blockSignals( true ); + ERR_Code err = aWidget::Select ( id ); //table()->select( id ); //aWidget::Select ( id ); + + blockSignals( true ); + NewValues(); + blockSignals( false ); + return err_noerror; +} + + + +ERR_Code +wCatalogue::SelectGroup( qulonglong id ) +{ + + ERR_Code err = ((aCatalogue*)dbobj)->groupSelect( id ); + if ( err ) + { + aLog::print(aLog::Error, tr("wCatalogue select group error = %1 ").arg(err)); + return err; + } + blockSignals( true ); + NewValues(); + blockSignals( false ); + //emit( changeObj(QString("idd=%1").arg(id))); + return err_noerror; +} + + +/*! + *\~english + * Set fields values from database. + * Used for insert values into fields when create or open catalogue. + *\~russian + * Устанавливает значения полей. + * Устанавливает значения полей из базы данных, + * используется при открытии формы или смене каталога. + *\~ + */ +void +wCatalogue::NewValues() +{ + aLog::print(aLog::Debug, tr("wCatalogue set new values for all fields")); + QString fname; + QObjectList l = this->queryList( "wDBField" ); + QListIterator it( l ); + QObject *obj; + //--obj = it.toFirst(); + aCfgItem o_field,o_parent; + QString parent_name; + while ( it.hasNext() ) + { + //++it; + //obj = it.current(); + obj= it.next(); + fname=((wDBField *)obj)->getFieldName(); + o_field = md->find(((wDBField *)obj)->getId()); + o_parent = md->parent(o_field); + //printf( "field name %s\n",(const char*)fname.local8Bit() ); + parent_name = md->objClass( o_parent ); + //printf("parent_name = %s\n", (const char*)parent_name ); + if( parent_name == QString(md_group) ) + { +// debug_message("group set value\n"); + if (dbobj)// && dbobj->className() == QString("aCatalogue") ) + { + + aLog::print(aLog::Debug, tr("wCatalogue set new values for group field %1").arg(fname)); + ((wDBField*)obj)->setValue(((aCatalogue*)dbobj)->GroupValue( fname ).toString()); + } + + } + else + { + aLog::print(aLog::Debug, tr("wCatalogue value for element field %1 ").arg(fname)); + ((wDBField*)obj)->setValue(dbobj->Value(fname).toString()); + } + } + //--delete l; // delete the list, not the objects + //--l=0; +} + + + +void +wCatalogue::setFormMode( int Mode ) +{ + aWidget::setFormMode( Mode ); +} + + +/*! + * Create toolbar for Catalogue. + */ +Q3ToolBar* +wCatalogue::createToolBar( Q3MainWindow * owner ) +{ + /* + QAction *a; + QToolBar *t = new QToolBar( owner, "CatalogueTools" ); + + a = new QAction( + QPixmap::fromMimeSource("doc_new.png"), + tr("New"), + QKeySequence(""),//Insert"), + t, + tr("New Element") + ); + a->setToolTip(tr("New element (Ins)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( insert() ) ); + + a = new QAction( + QPixmap::fromMimeSource("doc_edit.png"), + tr("Edit"), + QKeySequence(""),//Return"), + t, + tr("Edit element") + ); + a->setToolTip(tr("Edit element (Enter)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( update() ) ); +*/ +/* a = new QAction( + QPixmap::fromMimeSource("doc_view.png"), + tr("View"), + QKeySequence("Shifh+Return"), + t, + tr("View element") + ); + a->setToolTip(tr("View element (Shift+Enter)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( view() ) ); +*/ +/* + a = new QAction( + QPixmap::fromMimeSource("doc_view.png"), + tr("Delete"), + QKeySequence(""),//Delete"), + t, + tr("Delete element") + ); + a->setToolTip(tr("Delete element (Shift+Enter)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( markDelete() ) ); +*/ + return 0; +} + +void +wCatalogue::selectionChanged(const qulonglong groupId) +{ + aLog::print(aLog::Error, tr("wCatalogue selection changed to %1 ").arg(groupId)); + emit(newSelectionGroupId(groupId)); + emit(newSelectionFilter(QString("idg=%1").arg(groupId))); +} diff --git a/src/plugins/catalogue/wcatalogue.h b/src/plugins/catalogue/wcatalogue.h new file mode 100644 index 0000000..8348a67 --- /dev/null +++ b/src/plugins/catalogue/wcatalogue.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** $Id: wcatalogue.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the catlogue plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WCATALOGUE_H +#define WCATALOGUE_H +#include +//#include "ananas.h" +#include "awidget.h" + +class QWidget; + +#define CATALOGUEFORMMODE_LIST 0 // Elements list +#define CATALOGUEFORMMODE_ELEMENT 1 // Element form +#define CATALOGUEFORMMODE_GROUP 2 // Group form + + +class QT_WIDGET_PLUGIN_EXPORT wCatalogue : public aWidget +{ + Q_OBJECT +public: + wCatalogue( QWidget *parent = 0, Qt::WFlags fl = 0 ); + virtual ~wCatalogue(); + bool checkStructure(); + virtual void initObject( aDatabase *adb ); + virtual QDialog* createEditor( QWidget *parent ); + virtual QString displayString(); + virtual bool isContainer() { return true; }; + virtual aObject* createDBObject( aCfgItem obj, aDatabase *adb ); + virtual Q3ToolBar* createToolBar( Q3MainWindow *parent ); + void setFormMode( int Mode ); +public slots: + virtual ERR_Code Select( qulonglong id ); + virtual ERR_Code SelectGroup( qulonglong id ); + void valueChanged( const QVariant & value ); + QVariant value( const QString &name ); + void setValue( const QString &name, QVariant &value ); + int select( qulonglong id ); + qulonglong insert(); + int update(); + int markDelete(); + void selectionChanged(const qulonglong); + +private: + + void NewValues(); +signals: + void newSelectionFilter(const QString &); + void newSelectionGroupId( const qulonglong ); + +}; + + +#endif // WCATALOGUE_H diff --git a/src/plugins/catalogue/wcatalogue_plugin.cpp b/src/plugins/catalogue/wcatalogue_plugin.cpp new file mode 100644 index 0000000..d6733a6 --- /dev/null +++ b/src/plugins/catalogue/wcatalogue_plugin.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wcatalogue_plugin.h" + +#include +#include +#include + +#include "wcatalogue_taskmenu.h" +#include "wcatalogue.h" + + +wCataloguePlugin::wCataloguePlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wCataloguePlugin::isContainer() const +{ + return true; +} + +bool wCataloguePlugin::isInitialized() const +{ + return m_initialized; +} + +void wCataloguePlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wCatalogueTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; +} + +QWidget *wCataloguePlugin::createWidget(QWidget *parent) +{ + wCatalogue *w = new wCatalogue(parent, 0); + return w; +} + +QString wCataloguePlugin::name() const +{ + return QLatin1String("wCatalogue"); +} + +QString wCataloguePlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wCataloguePlugin::toolTip() const +{ + return QString(); +} + +QString wCataloguePlugin::whatsThis() const +{ + return QString(); +} + +QString wCataloguePlugin::includeFile() const +{ + return QLatin1String("wcatalogue.h"); +} + +QIcon wCataloguePlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wcatalogue.png"); +} + +QString wCataloguePlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/catalogue/wcatalogue_plugin.h b/src/plugins/catalogue/wcatalogue_plugin.h new file mode 100644 index 0000000..2eab2b0 --- /dev/null +++ b/src/plugins/catalogue/wcatalogue_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WCATALOGUE_PLUGIN_H +#define WCATALOGUE_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wCataloguePlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wCataloguePlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WCATALOGUE_PLUGIN_H diff --git a/src/plugins/catalogue/wcatalogue_taskmenu.cpp b/src/plugins/catalogue/wcatalogue_taskmenu.cpp new file mode 100644 index 0000000..3d3f1ba --- /dev/null +++ b/src/plugins/catalogue/wcatalogue_taskmenu.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wcatalogue_taskmenu.h" +#include "wcatalogue.h" +#include "ecatalogue.h" + + +wCatalogueTaskMenu::wCatalogueTaskMenu(wCatalogue *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wCatalogueTaskMenu::edit() +{ + /*eCatalogue e; + + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->widgetEditor(); +} + +QAction *wCatalogueTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wCatalogueTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wCatalogueTaskMenuFactory::wCatalogueTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wCatalogueTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wCatalogue *cat = qobject_cast(object)) + return new wCatalogueTaskMenu(cat, parent); + + return 0; +} diff --git a/src/plugins/catalogue/wcatalogue_taskmenu.h b/src/plugins/catalogue/wcatalogue_taskmenu.h new file mode 100644 index 0000000..5f0d4da --- /dev/null +++ b/src/plugins/catalogue/wcatalogue_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WCATALOGUE_TASKMENU_H +#define WCATALOGUE_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wCatalogue; + +class wCatalogueTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wCatalogueTaskMenu(wCatalogue *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wCatalogue *m_widget; +}; + +class wCatalogueTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wCatalogueTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WCATALOGUE_TASKMENU_H diff --git a/src/plugins/combobox/acombobox.cpp b/src/plugins/combobox/acombobox.cpp new file mode 100644 index 0000000..044533c --- /dev/null +++ b/src/plugins/combobox/acombobox.cpp @@ -0,0 +1,272 @@ +/**************************************************************************** +** $Id: acombobox.cpp,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Code file of the field plugin of Ananas +** Designer and Engine applications +** +** Copyright (C) 2006 Andrey Paskal. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** +**********************************************************************/ + +#include "acombobox.h" +//Added by qt3to4: +#include +#include +#include + +AComboBox::AComboBox( QWidget* parent, const char* name ):QComboBox( parent, name ) { +} + +AComboBox::AComboBox( bool rw, QWidget* parent, const char* name ):QComboBox( rw, parent, name ) { +} + +AComboBox::~AComboBox(){ +} + +int +AComboBox::count() const { + return QComboBox::count(); +} + +void +AComboBox::insertStringList( const QStringList &list, int index ) { + QComboBox::insertStringList( list, index ); +}; + +/*--void +AComboBox::insertStrList( const Q3StrList &list, int index ){ + QComboBox::insertStrList( list, index ); +}; + +void +AComboBox::insertStrList( const Q3StrList *list, int index ){ + QComboBox::insertStrList( list, index ); +}; + +void +AComboBox::insertStrList( const char **str, int numStrings, int index){ + QComboBox::insertStrList( str, numStrings, index ); +};*/ + +void +AComboBox::insertItem( const QString &text, int index ){ + QComboBox::insertItem( text, index); +}; + +void +AComboBox::insertItem( const QPixmap &pixmap, int index ){ + QComboBox::insertItem( pixmap, index); +}; + +void +AComboBox::insertItem( const QPixmap &pixmap, const QString &text, int index ){ + QComboBox::insertItem(pixmap, text, index ); +}; + + +void +AComboBox::removeItem( int index ){ + QComboBox::removeItem( index ); +}; + + +int +AComboBox::currentItem() { + return QComboBox::currentItem(); +}; + +void +AComboBox::setCurrentItem( int index ){ + QComboBox::setCurrentItem( index ); +}; + + +QString +AComboBox::currentText() const { + return QComboBox::currentText(); +}; + +void +AComboBox::setCurrentText( const QString& string){ + QComboBox::setCurrentText( string ); +}; + + +QString +AComboBox::text( int index ) const { + return QComboBox::text( index ); +}; + +const QPixmap +AComboBox::pixmap( int index ) const { + return QComboBox::pixmap( index ); +}; + +void +AComboBox::changeItem( const QString &text, int index ){ + QComboBox::changeItem( text, index ); +}; + +void +AComboBox::changeItem( const QPixmap &pixmap, int index ){ + QComboBox::changeItem( pixmap, index ); +}; + +void +AComboBox::changeItem( const QPixmap &pixmap, const QString &text, int index ){ + QComboBox::changeItem( pixmap, text, index ); +}; + + +/*--bool +AComboBox::autoResize() const { + return QComboBox::autoResize(); +}; + +void +AComboBox::setAutoResize( bool val){ + QComboBox::setAutoResize( val ); +};*/ + +QSize +AComboBox::sizeHint() const { + return QComboBox::sizeHint(); +}; + +void +AComboBox::setPalette( const QPalette &pal ){ + QComboBox::setPalette( pal ); +}; + +void +AComboBox::setFont( const QFont & font) { + QComboBox::setFont( font ); +}; + +void +AComboBox::setEnabled( bool val){ + QComboBox::setEnabled( val); +}; + + +/*--void +AComboBox::setSizeLimit( int size ){ + QComboBox::setSizeLimit( size ); +}; + +int +AComboBox::sizeLimit() const { + return QComboBox::sizeLimit(); +};*/ + +void +AComboBox::setMaxCount( int cnt ){ + QComboBox::setMaxCount( cnt ); +} + +int +AComboBox::maxCount() const { + return QComboBox::maxCount(); +} + +void +AComboBox::setInsertionPolicy(QComboBox::Policy policy ){ + QComboBox::setInsertionPolicy(policy ); +} + +QComboBox::Policy +AComboBox::insertionPolicy() const{ + return QComboBox::insertionPolicy() ; +} + + +void +AComboBox::setValidator( const QValidator * v){ + QComboBox::setValidator( v ); +} + +const QValidator * +AComboBox::validator() const{ + return QComboBox::validator(); +} + +/*--void +AComboBox::setListBox( Q3ListBox * lb){ + QComboBox::setListBox( lb ); +} + +Q3ListBox * +AComboBox::listBox() const { + return QComboBox::listBox(); +}*/ + +void +AComboBox::setLineEdit( QLineEdit *edit ){ + QComboBox::setLineEdit( edit ); +} + +QLineEdit* +AComboBox::lineEdit() const{ + return QComboBox::lineEdit(); +} + + +void +AComboBox::setAutoCompletion( bool val ){ + QComboBox::setAutoCompletion( val ); +} + +bool +AComboBox::autoCompletion() const{ + return QComboBox::autoCompletion(); +} + +bool +AComboBox::eventFilter( QObject *object, QEvent *event ){ + return QComboBox::eventFilter( object, event ); +} + +void +AComboBox::setDuplicatesEnabled( bool enable ){ + QComboBox::setDuplicatesEnabled( enable ); +} + +bool +AComboBox::duplicatesEnabled() const{ + return QComboBox::duplicatesEnabled(); +} + +bool +AComboBox::editable() const{ + return QComboBox::editable(); +} + +void +AComboBox::setEditable( bool val ){ + QComboBox::setEditable( val ); +} + +void +AComboBox::popup(){ + QComboBox::popup(); +} + + +void +AComboBox::hide(){ + QComboBox::hide(); +} + + diff --git a/src/plugins/combobox/acombobox.h b/src/plugins/combobox/acombobox.h new file mode 100644 index 0000000..62c3860 --- /dev/null +++ b/src/plugins/combobox/acombobox.h @@ -0,0 +1,140 @@ +/**************************************************************************** +** $Id: acombobox.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the field plugin of Ananas +** Designer and Engine applications +** +** Copyright (C) 2006 Andrey Paskal +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef ACOMBOBOX_H +#define ACOMBOBOX_H + + +#include +#include "qcombobox.h" +//Added by qt3to4: +#include +#include +#include +#include + + +/*! + * \en + * \brief QComboBox wrapper for AnanasScript access. + * \_en + * \ru + * \brief Плагин -- виджет обеспечивает доступ из Ананас.Скрипта ко всем публичным методам QComboBox, являясь врапером + * последнего. + * Наследует QComboBox. + * + * Смотрите документацию на QComboBox, поставляемую вместе с библиотекой QT компании TrollTech или на сайте + * http://trolltech.com + * + * Все публичные методы QComboBox доступны как публичные слоты AComboBox. + * + * \code + * var myBox=Widget("aComboBox1"); // Предполагается наличие в экранной форме комбобокса с именем aComboBox1 + * myBox.clear(); + * myBox.insertItem("Первый пункт"); + * myBox.insertItem("Второй пункт"); + * myBox.insertItem("Третий пункт"); + * myBox.setCurrentItem(1); // Порядковые номера наченаются с нуля, так что текущим делаем второй пункт. + * \endcode + * + * \_ru + */ +class QT_WIDGET_PLUGIN_EXPORT AComboBox : public QComboBox +{ + Q_OBJECT + public: + AComboBox( QWidget* parent=0, const char* name=0 ); + AComboBox( bool rw, QWidget* parent=0, const char* name=0 ); + ~AComboBox(); +public slots: + + int count() const; + + void insertStringList( const QStringList &, int index=-1 ); + //--void insertStrList( const Q3StrList &, int index=-1 ); + //--void insertStrList( const Q3StrList *, int index=-1 ); + //--void insertStrList( const char **, int numStrings=-1, int index=-1); + + void insertItem( const QString &text, int index=-1 ); + void insertItem( const QPixmap &pixmap, int index=-1 ); + void insertItem( const QPixmap &pixmap, const QString &text, int index=-1 ); + + void removeItem( int index ); + + int currentItem(); + virtual void setCurrentItem( int index ); + + QString currentText() const; + virtual void setCurrentText( const QString& ); + + QString text( int index ) const; + const QPixmap pixmap( int index ) const; + + void changeItem( const QString &text, int index ); + void changeItem( const QPixmap &pixmap, int index ); + void changeItem( const QPixmap &pixmap, const QString &text, int index ); + + //--bool autoResize() const; + //--virtual void setAutoResize( bool ); + QSize sizeHint() const; + + void setPalette( const QPalette & ); + void setFont( const QFont & ); + void setEnabled( bool ); + + //--virtual void setSizeLimit( int ); + //--int sizeLimit() const; + + + virtual void setMaxCount( int ); + int maxCount() const; + + virtual void setInsertionPolicy( Policy policy ); + QComboBox::Policy insertionPolicy() const; + + virtual void setValidator( const QValidator * ); + const QValidator * validator() const; + + //--virtual void setListBox( Q3ListBox * ); + //--Q3ListBox * listBox() const; + + virtual void setLineEdit( QLineEdit *edit ); + QLineEdit* lineEdit() const; + + virtual void setAutoCompletion( bool ); + bool autoCompletion() const; + + bool eventFilter( QObject *object, QEvent *event ); + + void setDuplicatesEnabled( bool enable ); + bool duplicatesEnabled() const; + + bool editable() const; + void setEditable( bool ); + + virtual void popup(); + + void hide(); + +}; + + +#endif diff --git a/src/plugins/combobox/acombobox_plugin.cpp b/src/plugins/combobox/acombobox_plugin.cpp new file mode 100644 index 0000000..4cec34d --- /dev/null +++ b/src/plugins/combobox/acombobox_plugin.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "acombobox_plugin.h" + +#include + +#include "acombobox.h" + + +AComboBoxPlugin::AComboBoxPlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool AComboBoxPlugin::isContainer() const +{ + return false; +} + +bool AComboBoxPlugin::isInitialized() const +{ + return m_initialized; +} + +void AComboBoxPlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + m_initialized = true; +} + +QWidget *AComboBoxPlugin::createWidget(QWidget *parent) +{ + AComboBox *w = new AComboBox(parent, 0); + return w; +} + +QString AComboBoxPlugin::name() const +{ + return QLatin1String("AComboBox"); +} + +QString AComboBoxPlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString AComboBoxPlugin::toolTip() const +{ + return QString("Ananas for QT custom combobox"); +} + +QString AComboBoxPlugin::whatsThis() const +{ + return QString(""); +} + +QString AComboBoxPlugin::includeFile() const +{ + return QLatin1String("acombobox.h"); +} + +QIcon AComboBoxPlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/acombobox.png"); +} + +QString AComboBoxPlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/combobox/acombobox_plugin.h b/src/plugins/combobox/acombobox_plugin.h new file mode 100644 index 0000000..2f43ce1 --- /dev/null +++ b/src/plugins/combobox/acombobox_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef ACOMBOBOX_PLUGIN_H +#define ACOMBOBOX_PLUGIN_H + +#include + +#include + + +class QT_WIDGET_PLUGIN_EXPORT AComboBoxPlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + AComboBoxPlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // ACOMBOBOX_PLUGIN_H diff --git a/src/plugins/combobox/combobox.pri b/src/plugins/combobox/combobox.pri new file mode 100644 index 0000000..3051470 --- /dev/null +++ b/src/plugins/combobox/combobox.pri @@ -0,0 +1,7 @@ +HEADERS += \ + combobox/acombobox.h \ + combobox/acombobox_plugin.h + +SOURCES += \ + combobox/acombobox.cpp \ + combobox/acombobox_plugin.cpp diff --git a/src/plugins/dbfield/dbfield.pri b/src/plugins/dbfield/dbfield.pri new file mode 100644 index 0000000..7599d16 --- /dev/null +++ b/src/plugins/dbfield/dbfield.pri @@ -0,0 +1,15 @@ +HEADERS += \ + dbfield/edbfield.h \ + dbfield/wdbfield.h \ + dbfield/wdbfield_plugin.h \ + dbfield/wdbfield_taskmenu.h + +SOURCES += \ + dbfield/edbfield.cpp \ + dbfield/wdbfield.cpp \ + dbfield/wdbfield_plugin.cpp \ + dbfield/wdbfield_taskmenu.cpp \ + +FORMS += \ + dbfield/edbfield.ui + \ No newline at end of file diff --git a/src/plugins/dbfield/edbfield.cpp b/src/plugins/dbfield/edbfield.cpp new file mode 100644 index 0000000..dd81233 --- /dev/null +++ b/src/plugins/dbfield/edbfield.cpp @@ -0,0 +1,137 @@ +#include "edbfield.h" + +#include +#include +#include + +#include "acfg.h" +#include "wdbfield.h" + +/* + * Constructs a eDBField as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eDBField::eDBField(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eDBField::~eDBField() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eDBField::languageChange() +{ + retranslateUi(this); +} + + +void eDBField::init() +{ + eName->clear(); + onames.clear(); + oids.clear(); +} + + + +void eDBField::setData( QWidget *o, aCfg *md ) +{ +// const QObject *o = sender(); + if ( o ) { + if ( o->className() != QString("wDBField") || !md ) { + reject(); + return; + } + } + else { + reject(); + return; + } + int w=0, d=0, idx=0; + unsigned int i; + long oid, widgetId, fieldId; + QString pn; + aWidget *widget; + wDBField *field = (wDBField*)o; + QWidget *pWidget = field->parentWidget(); + + while ( pWidget ) { + pn = ""; + pn = pWidget->className(); + if ( pn == QString("wCatalogue") || pn == QString("wDocument") ) break; + pWidget = pWidget->parentWidget(); + } + if ( pn == QString("wCatalogue") ) widget = (wCatalogue*)pWidget; else + if ( pn == QString("wDocument") ) widget = (wDocument*)pWidget; else + return; + + widgetId = widget->getId(); + //fieldId = field->getId(); + if ( widgetId ) widget->setMDObject( md->find( widgetId ) ); + +// printf( "parent widget id = %i\n", widgetId ); +// printf( "field id = %i\n", fieldId ); +// printf( "metadata id = %i\n", md->id( *widget->getMDObject() ) ); + + QStringList tlist = md->types( md_field, widget->getMDObject() ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eName->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == fieldId ) { + eName->setCurrentItem( i ); + break; + } + } + } +} + + +void eDBField::getData( QWidget *o ) +{ +// const QObject *o = sender(); + if ( !o ) return; + if ( o->className() != QString("wDBField") ) return; + wDBField *f = ( wDBField*) o; + + int idx=eName->currentItem(); + long oid = 0; + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); + // f->setId( oid ); + } + } +} + + +void eDBField::namechanged( const QString &s ) +{ + int idx=eName->currentItem(); +// printf("new str=%s\n", (const char *) s.utf8()); + selotype=otypes[idx]; + seloid=oids[idx]; + eType->setText(onames[idx]); +} + diff --git a/src/plugins/dbfield/edbfield.h b/src/plugins/dbfield/edbfield.h new file mode 100644 index 0000000..6830c99 --- /dev/null +++ b/src/plugins/dbfield/edbfield.h @@ -0,0 +1,36 @@ +#ifndef EDBFIELD_H +#define EDBFIELD_H + +#include "ui_edbfield.h" + + +class eDBField : public QDialog, public Ui::eDBField +{ + Q_OBJECT + +public: + eDBField(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eDBField(); + + QStringList oids; + QString selotype; + QStringList otypes; + QString seloid; + +public slots: + virtual void setData( QWidget * o, aCfg * md ); + virtual void getData( QWidget * o ); + virtual void namechanged( const QString & s ); + +protected: + QStringList onames; + +protected slots: + virtual void languageChange(); + +private: + void init(); + +}; + +#endif // EDBFIELD_H diff --git a/src/plugins/dbfield/edbfield.ui b/src/plugins/dbfield/edbfield.ui new file mode 100644 index 0000000..18d158d --- /dev/null +++ b/src/plugins/dbfield/edbfield.ui @@ -0,0 +1,134 @@ + + + + + eDBField + + + + 0 + 0 + 356 + 161 + + + + Database field + + + + + + Field type + + + false + + + + + + + Field name + + + false + + + + + + + QFrame::Box + + + + + + false + + + + + + + + + + OK + + + true + + + + + + + + 101 + 31 + + + + Expanding + + + Horizontal + + + + + + + Cancel + + + + + + + + 21 + 21 + + + + Expanding + + + Vertical + + + + + + + qPixmapFromMimeSource + + ananas.h + wfield.h + wcatalogue.h + wdocument.h + + + + pushButton1 + clicked() + eDBField + accept() + + + pushButton2 + clicked() + eDBField + reject() + + + eName + activated(QString) + eDBField + namechanged(QString) + + + diff --git a/src/plugins/dbfield/wdbfield.cpp b/src/plugins/dbfield/wdbfield.cpp new file mode 100644 index 0000000..7fba231 --- /dev/null +++ b/src/plugins/dbfield/wdbfield.cpp @@ -0,0 +1,423 @@ +/**************************************************************************** +** $Id: wdbfield.cpp,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Code file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +//Added by qt3to4: +#include + +#include "ananas.h" +#include "wfield.h" +#include "edbfield.h" +#include "wdbfield.h" +#include "addfdialog.h" +//--#include "mainform.h" + + + +/*! + * \en Constructor without name. \_en + * \ru Создает конструктор без указания имени виджета. \_ru + */ +wDBField::wDBField( QWidget *parent, Qt::WFlags fl ) + : wField( parent, "wDBField", fl) +{ + init(); +} + + + +/*! + * \en Constructor. \_en + * \ru Конструктор. \_ru + */ +wDBField::wDBField( QWidget *parent, const char *name, Qt::WFlags fl ) + : wField( parent, name, fl) +{ + init(); +} + + + +/*! + * \en Destructor. \_en + * \ru Деструктор. \_ru + */ +wDBField::~wDBField() +{ + +} + + +/*! + * \en Creates property editor dialog window. \_en + * \ru Создает окно диалога редактора свойств.\_ru + * \param parent - \en parent \_en \ru родитель \_ru + */ +QDialog* +wDBField::createEditor( QWidget *parent ) +{ + return new addfdialog( parent ); +} + + +/*! + * \en Opens property editor dialog form. \_en + * \ru Открывает окно диалога редактора свойств. \_ru + */ +void wDBField::openEditor() +{ +/* + QString s; + QValueList bindList = getBindList(); + addfdialog e(this->topLevelWidget()); + getFields(); + e.setData( defDisplayFields, defFields,defId); + e.ListBox->setCurrentItem(e.ListBox->findItem(getFieldName())); + if ( e.exec()==QDialog::Accepted ) + { + s = e.getData(true); + if(s.isEmpty()) return; + setFieldName(s); + s = e.getData(false); + if(s=="0") return; + // if select binding field + if(bindList.find(s.toULongLong()) != bindList.end()) + { + cfg_message(0, tr("field already binding, please select another field.")); + return; + } + setId(s.toInt()); + setEditorType(); + updateProp(); + } + */ +} + + + + + + + +/*! + * \en Sets property value `fieldName'. \_en + * \ru Устанавливает значение свойства `fieldName'. \_ru + */ +void +wDBField::setFieldName( QString n ) +{ + FieldName=n; +} + + +/*! + * \en Gets field name in metadata. \_en + * \ru Получение имени поля в метаданных, на которое настроен виджет. \_ru + * return - \en Field name. \_en \ru Имя поля в метаданных.\_ru + */ +/* +QString +wDBField::getMdFieldName() const +{ + aCfgItem o = md->find(getId()); + if(!o.isNull()) + { + return md->attr(o,mda_name); + } + else + { + return getFieldName(); + } +} +*/ +/*! + * \en Inits widget. Gets copy of metadata from designer window. \_en + * \ru Инициализирунт виджет. + * Получает метаданные из окна дизайнера. \_ru + */ +void +wDBField::init() +{ + qulonglong id; + id=0; + //get copy of metadata + md = getMd(); + if(md) + { + // get id of container object - catalogue or document + id = aWidget::parentContainer(this)->getId(); + head = md->find(id); + } +} + + + +/*! + * \en Gets list of fields and id for Document.Header or Catalogue.Element and + * Catalogue.Group \_en + * \ru Возвращает список полей, определенных в метаданных, для шапки документа + * или элемента и группы каталога. + * К имени уже забинденного поля добавляет впереди звездочку. + * Для групп и элементов каталога добавляет в конце (element) или (group) \_ru + * \return \en List of field name \_en \ru Список имен полей \_ru + */ +QStringList +wDBField::getFields() +{ + QStringList lst, dlst; + QString str; + int res,i; + Q3ValueList bindList = getBindList(); + aCfgItem o, o_head; + defId.clear(); + defFields.clear(); + defDisplayFields.clear(); + if(!head.isNull()) + { + if(md->objClass(head) == md_catalogue) + { +// printf("getting fields from metadata\n"); + o = md->findChild(head,md_element); //object element + res = md->countChild(o,md_field); +// printf("find elements\n"); + for( i = 0; i < res; i++ ) + { +// printf("find %d elem\n",i); + o_head = md->findChild(o,md_field,i); + if(md->attr(o_head,mda_type).at(0)!=' ') + { +// printf("mda_type = %s\n",md->attr(o_head,mda_type).ascii()); + lst << md->attr(o_head,mda_name); + dlst << md->attr(o_head,mda_name) + " (element)"; + defId << md->attr(o_head,mda_id); + } + else + { +// printf("calculated field not allowed here\n"); + } + } + o = md->findChild(head,md_group); // object group + res = md->countChild(o,md_field); +// printf("find groups\n"); + for( i = 0; i < res; i++ ) + { +// printf("find %d group\n",i); + o_head = md->findChild(o,md_field,i); + //--if(md->attr(o,mda_type).left(1)!=' ') + if(md->attr(o,mda_type).at(0)!=' ') + { + lst << md->attr(o_head,mda_name); + dlst << md->attr(o_head,mda_name) + " (group)"; + defId << md->attr(o_head,mda_id); + } + } + } + else + { + o = md->findChild(head,md_header); // object header + res = md->countChild(o,md_field); + for( i = 0; i < res; i++ ) + { + o_head = md->findChild(o,md_field,i); + dlst << md->attr(o_head,mda_name); + lst << md->attr(o_head,mda_name); + defId << md->attr(o_head,mda_id); + } + } + res = lst.count(); + for(int i=0; i>>>>>> 1.37.2.4 +return defFields; +} + + + +//<<<<<<< wdbfield.cpp +/* + * \en Updates object. \_en + * \ru Записывает значение объекта в базу. \_ru +*/ +/* +int +wDBField::Update() +{ + if(dbobj) + { + return dbobj->Update(); + } + else + { + return err_abstractobj; + } +} +*/ + + +/* + * \en Inits object. \_en + * \ru Инициализирует объект. \_ru +*/ +/* +aObject * +wDBField::createDBObject(aCfgItem o, aDatabase *adb ) +{ +// wField::initObject( adb ); + // aCfgItem o; + / o = md->find( getId() ); + aObject* obj = new aObject(o,adb); + aCfgItem g = md->parent( o );//, e = md->find( obj, md_element ); + obj->tableInsert( aDatabase::tableDbName( *md, g ), g ); + debug_message("table inserted\n"); + return obj; +} +*/ +void +wDBField::initObject(aDatabase *adb ) +{ + wField::initObject( adb ); + //aCfgItem o; + //o = md->find( getId() ); + //aObject* obj = new aObject(o,adb); + //tableInsert( aDatabase::tableDbName( *md, o ), o ); +// debug_message("init dbfield \n"); +} + +//======= +//>>>>>>> 1.37.2.4 +/*! + * \en Set widget type, use property `Id'. \_en + * \ru Устанавливает тип виджета, используя свойство `Id'. \_ru + */ +void +wDBField::setEditorType () +{ + aCfgItem o_head,o; + QString str, type; + int id; + if(!head.isNull()) + { + id = property("Id").toInt(); + o_head = md->find(id); + if(!o_head.isNull()) + { + type = md->attr(o_head,mda_type); + setFieldType(type); + str = type.section(' ',0,0); + // gets type of editor + if(str=="N") wField::setEditorType(Numberic); + if(str=="C") wField::setEditorType(String); + if(str=="D") wField::setEditorType(Date); + if(str=="B") wField::setEditorType(Boolean); + if(str=="O") + { + //editor type is Object . + //May be Catalog or Document. + qulonglong tid; + //gets object id. + str = type.section(' ',1,1); + tid = atol(str); + o = md->find(tid); + if(!o.isNull()) + { + //gets object class + str = md->objClass(o); + if(str == md_catalogue) + // and set editor + wField::setEditorType(Catalogue); + if(str == md_document) + wField::setEditorType(Document); + + } + + } + + } + + } + +} + + +/*! + * \en Gets list of binding fields id. \_en + * \ru Получает список id забинденых полей. Корректно работает с удаленными + * виджетами. \_ru + * \return \en List of binding fields id. \_en + * \ru Список id забинденых полей. \_ru + */ +Q3ValueList +wDBField::getBindList() +{ +aCfgItem obj; +QObjectList wList; +int id; +Q3ValueList listBindings; +wDBField* wfield; +QObject* wd = aWidget::parentContainer (this); + listBindings.clear(); + wList = wd->queryList( "wDBField" ); + QListIterator it( wList ); // iterate over the wDBTable + while ( it.hasNext() ) + { + wfield = qobject_cast( it.next() ); + + if(strcmp(wfield->name(),this->name())) // don't added current id + { + //don.t added deleted widgets + if(strncmp("qt_dead_widget_",wfield->name(),strlen("qt_dead_widget_"))) + { + id = wfield->property("Id").toULongLong(); + // if(id>=0) // don't added negativ id (table while not selected) + // { + listBindings << id; +// printf(">>>added id = `%d'\n",id); + // } + } + } + } + //--delete wList; +return listBindings; +} + diff --git a/src/plugins/dbfield/wdbfield.h b/src/plugins/dbfield/wdbfield.h new file mode 100644 index 0000000..2eea7a9 --- /dev/null +++ b/src/plugins/dbfield/wdbfield.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** $Id: wdbfield.h,v 1.1 2008/11/05 21:16:29 leader Exp $ +** +** Header file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef QADBFIELD_H +#define QADBFIELD_H + +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include "adatabase.h" +#include "acfg.h" +#include "wfield.h" +//#include "addfdialog.h" + +/*! + * \en + * \brief Ananas DBField. widget. + * \_en + * \ru + * \brief Универсальный Плагин -- виджет, предназначен для редактирования атрибутов бизнес объектов Ананаса. + * Наследует wField. + * + * Основным полезным свойством этого визуального класса является возможность его привязки к атрибуту persistence бизнес объекта + * Ананаса. Как только привязка задана - логика заполнения объекта значением соответствующего атрибута бизнес объекта, логика + * сохранения заданного пользователем значения в соответствующем атрибуте бизнес объекта выполняется автоматически runtime + * подсистемой Ананаса. То есть мы используем прием, который имеет общепринятое название data bindings. + * + * \_ru + */ +class QT_WIDGET_PLUGIN_EXPORT wDBField : public wField +{ + Q_OBJECT + + Q_PROPERTY( bool openEditor READ getOpenEditor WRITE setOpenEditor STORED false) + Q_PROPERTY( QString FieldName READ getFieldName WRITE setFieldName ) + +friend class addfdialog; + + +public: + + wDBField( QWidget *parent, Qt::WFlags fl ); + wDBField( QWidget *parent, const char *name, Qt::WFlags fl ); + ~wDBField(); + + virtual QDialog* createEditor( QWidget *parent ); + virtual void initObject( aDatabase *adb ); + void openEditor(); + bool getOpenEditor() const { return false; }; + virtual QString getFieldName() const { return FieldName; }; + void setOpenEditor(bool b) { if(b) openEditor(); }; + void setFieldName(QString n); +protected: + QStringList getFields(); + void init(); + Q3ValueList getBindList(); + void setEditorType(void); + + QString FieldName; + QStringList defDisplayFields,defFields,defId; + +private: + aCfgItem head; +}; +#endif diff --git a/src/plugins/dbfield/wdbfield_plugin.cpp b/src/plugins/dbfield/wdbfield_plugin.cpp new file mode 100644 index 0000000..edba874 --- /dev/null +++ b/src/plugins/dbfield/wdbfield_plugin.cpp @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wdbfield_plugin.h" + +#include +#include +#include + +#include "wdbfield_taskmenu.h" +#include "wdbfield.h" + + +wDBFieldPlugin::wDBFieldPlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wDBFieldPlugin::isContainer() const +{ + return false; +} + +bool wDBFieldPlugin::isInitialized() const +{ + return m_initialized; +} + +void wDBFieldPlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wDBFieldTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; + printf("dbfield inited\n"); +} + +QWidget *wDBFieldPlugin::createWidget(QWidget *parent) +{ + wDBField *w = new wDBField(parent, 0); + return w; +} + +QString wDBFieldPlugin::name() const +{ + return QLatin1String("wDBField"); +} + +QString wDBFieldPlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wDBFieldPlugin::toolTip() const +{ + return QString("Ananas for QT Database Field Edit Widget"); +} + +QString wDBFieldPlugin::whatsThis() const +{ + return QString("Entry to modify field value of Ananas's object"); +} + +QString wDBFieldPlugin::includeFile() const +{ + return QLatin1String("wdbfield.h"); +} + +QIcon wDBFieldPlugin::icon() const +{ + //return QIcon(); +//QIcon i = QIcon(":/images/wdbfield.png"); +//if (i.isNull()) printf("FIELD ICON is NULL\n"); +//else printf("field icon OK\n"); + return QIcon(":/images/wdbfield.png"); +} + +QString wDBFieldPlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/dbfield/wdbfield_plugin.h b/src/plugins/dbfield/wdbfield_plugin.h new file mode 100644 index 0000000..7d91c11 --- /dev/null +++ b/src/plugins/dbfield/wdbfield_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WDBFIELD_PLUGIN_H +#define WDBFIELD_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wDBFieldPlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wDBFieldPlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WDBFIELD_PLUGIN_H diff --git a/src/plugins/dbfield/wdbfield_taskmenu.cpp b/src/plugins/dbfield/wdbfield_taskmenu.cpp new file mode 100644 index 0000000..aec82e0 --- /dev/null +++ b/src/plugins/dbfield/wdbfield_taskmenu.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wdbfield_taskmenu.h" +#include "wdbfield.h" +#include "addfdialog.h" + + +wDBFieldTaskMenu::wDBFieldTaskMenu(wDBField *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wDBFieldTaskMenu::edit() +{ + /*addfdialog e; + + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->widgetEditor(); +} + +QAction *wDBFieldTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wDBFieldTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wDBFieldTaskMenuFactory::wDBFieldTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wDBFieldTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wDBField *df = qobject_cast(object)) + return new wDBFieldTaskMenu(df, parent); + + return 0; +} diff --git a/src/plugins/dbfield/wdbfield_taskmenu.h b/src/plugins/dbfield/wdbfield_taskmenu.h new file mode 100644 index 0000000..9ae82dd --- /dev/null +++ b/src/plugins/dbfield/wdbfield_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WDBFIELD_TASKMENU_H +#define WDBFIELD_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wDBField; + +class wDBFieldTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wDBFieldTaskMenu(wDBField *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wDBField *m_widget; +}; + +class wDBFieldTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wDBFieldTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WDBFIELD_TASKMENU_H diff --git a/src/plugins/dbtable/dbtable.pri b/src/plugins/dbtable/dbtable.pri new file mode 100644 index 0000000..5e2a3cb --- /dev/null +++ b/src/plugins/dbtable/dbtable.pri @@ -0,0 +1,15 @@ +HEADERS += \ + dbtable/edbtable.h \ + dbtable/wdbtable.h \ + dbtable/wdbtable_plugin.h \ + dbtable/wdbtable_taskmenu.h + +SOURCES += \ + dbtable/edbtable.cpp \ + dbtable/wdbtable.cpp \ + dbtable/wdbtable_plugin.cpp \ + dbtable/wdbtable_taskmenu.cpp + +FORMS += \ + dbtable/edbtable.ui + diff --git a/src/plugins/dbtable/edbtable.cpp b/src/plugins/dbtable/edbtable.cpp new file mode 100644 index 0000000..2477cda --- /dev/null +++ b/src/plugins/dbtable/edbtable.cpp @@ -0,0 +1,521 @@ +#include "edbtable.h" + +#include +#include +#include + +#include +#include "wdbtable.h" +//Added by qt3to4: +#include +#include + +/* + * Constructs a eDBTable as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eDBTable::eDBTable(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eDBTable::~eDBTable() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eDBTable::languageChange() +{ + retranslateUi(this); +} + +void eDBTable::init() +{ +} + + +void +eDBTable::destroy() +{ +// tablerow_free( r ); +} + + +/* +void eDBTable::insertColumn(const char *Header, const char *Name, +int idxt, int cw, int tw, int td) +{ + +tablefield *f; +char s[30]; + +sprintf(s, "%s %i %i", (const char *)otypes[idxt], tw, td); + +f = tablefield_newsys(Name, s, ""); +tablefield_setheader(f, Header); +f->sizex = cw; +f->flen = tw; +f->decimals = td; +f->ftypeindex = idxt; +tablerow_insertcolumn(r, f, -1); + +// blockSignals( true ); +ListCol->insertItem(trUtf8(Header)); +// eColHeader->setText( trUtf8(Header)); +// eColName->setText(trUtf8(Name)); +// eColWidth->setValue(cw); +// eColTWidth->setValue(tw); +// eColTDec->setValue(td); +// blockSignals( false ); +if (ListCol->count()) ListCol->setCurrentItem(ListCol->count()-1); + +} +*/ + + + +void eDBTable::ColumnDel() +{ + +int idx; +QString str; +idx = ListCol->currentItem(); +if (idx != -1 && ListCol->count()>0) +{ + str = fname[idx]; + table->removeColumn(idx); + deletedFields.append(str); + deletedFieldsId.append(idlist[idx]); + idlist.remove(idlist.at(idx)); + fname.remove(fname.at(idx)); + cwidth.remove(cwidth.at(idx)); + ListCol->removeItem(idx); +// table->removeColumn(idx); +} +} + +void eDBTable::ColumnL() +{ + int idx; + QString str; + QStringList::Iterator it; + idx = ListCol->currentItem(); + if(idx>0) + { + str = fname[idx]; + //--it = fname.at(idx); + //--fname.remove(it); + fname.removeAt(idx); + //--it = fname.at(idx-1); + //--fname.insert(it,str); + fname.insert(idx-1,str); + + str = idlist[idx]; + //--it = idlist.at(idx); + //--idlist.remove(it); + idlist.removeAt(idx); + //--it = idlist.at(idx-1); + //--idlist.insert(it,str); + idlist.insert(idx-1,str); + + str = cwidth[idx]; + //--it = cwidth.at(idx); + //--cwidth.remove(it); + cwidth.removeAt(idx); + //--it = cwidth.at(idx-1); + //--cwidth.insert(it,str); + cwidth.insert(idx-1,str); + + str = ListCol->currentText(); + ListCol->removeItem(idx); + ListCol->insertItem(str,idx-1); + ListCol->setSelected(idx-1,true); + } +} + + +void eDBTable::ColumnR() +{ + uint idx; + QString str; + QStringList::Iterator it; + idx = ListCol->currentItem(); + if(idxcount()-1) + { + str = fname[idx]; + //--it = fname.at(idx); + //--fname.remove(it); + fname.removeAt(idx); + //--it = fname.at(idx+1); + //--fname.insert(it,str); + fname.insert(idx+1,str); + + str = idlist[idx]; + //--it = idlist.at(idx); + //--idlist.remove(it); + idlist.removeAt(idx); + //--it = idlist.at(idx+1); + //--idlist.insert(it,str); + idlist.insert(idx+1,str); + + str = cwidth[idx]; + //--it = cwidth.at(idx); + //--cwidth.remove(it); + cwidth.removeAt(idx); + //--it = cwidth.at(idx+1); + //--cwidth.insert(it,str); + cwidth.insert(idx+1,str); + + str = ListCol->currentText(); + ListCol->removeItem(idx); + ListCol->insertItem(str,idx+1); + ListCol->setSelected(idx+1,true); + } + +} +void eDBTable::ColumnSel(int col) +{ +QString str,s; +int ind = 0; +QStringList lst; + eColHeader->blockSignals(true); + eColWidth->blockSignals(true); + eType->clear(); + eColTWidth->setValue(0); + eColTDec->setValue(0); + eColHeader->setText(""); + eColWidth->setValue(0); + eColName->setText(""); +// str = table->getFieldType((const char*) ComboBoxTable->currentText().utf8(),(const char*)ListCol->currentText().utf8()); + //if(eColHeader->text="") +// ListCol->blockSignals( TRUE ); + //ListCol->changeItem(s, ListCol->currentItem()); + +// printf(">>>read property DefHeaders in %s\n", table->name()); +// lst = table->property("DefHeaders").toStringList(); +// printf(">>>ok!\n"); +// ListCol->clear(); +// printf(">>>insert str list\n"); +// ListCol->insertStringList(lst); +// ListCol->setCurrentItem(col); +// ListCol->blockSignals( FALSE ); + if(col==-1 || ListCol->count()==0) return; +// printf(">>>set text in eColHeader\n"); + eColHeader->setText(ListCol->currentText()); + eColHeader->blockSignals(false); + ind = ListCol->currentItem(); + str = cwidth[ind]; + eColWidth->setValue(atoi(str)); + eColWidth->blockSignals(false); + str = fname[ind]; + eColName->setText(str); +// eType->clear(); +// printf(">>>get fields type\n"); +// str = eColName->text(); + + str = table->getFieldType(idlist[ind].toInt()); +// parse string with type, num, numdec + if(!str.isEmpty()) + { + eType->setText(str.left(1)); + str.remove(0,2); + if(!str.isEmpty()) + { +// printf(">>>%s\n",str.ascii()); + eColTWidth->setValue(atoi(str)); + } + ind = str.find(" "); + if(ind)// poisk decimal chasti + { + s = str.remove(0,str.find(" ")); + } + else + { + str="0"; + } +// printf(">>>%s\n",str.ascii()); + eColTDec->setValue(atoi(str)); + } + else + { +// printf(">>>unknown field\n"); + } + /* + tablefield *f; + + if (col >= 0 && col < tablerow_columns( r )) { + f = tablerow_column( r, col ); + blockSignals( true ); + eColHeader->setText(trUtf8(tablefield_header( f ))); + eColWidth->setValue(f->sizex); + eType->setCurrentItem(f->ftypeindex); + eColName->setText(trUtf8(f->name)); + eColTWidth->setValue(f->flen); + eColTDec->setValue(f->decimals); + blockSignals( false ); + } +*/ +} + + +void eDBTable::ColumnUpd() +{ +QStringList lst; +int id; +Q3ValueList listTableId; + id = table->getTableId(ComboBoxTable->currentItem()-1); + listTableId = table->getBindList(); + if(listTableId.find(id)!=listTableId.end()) + { + cfg_message(0,tr("table in use, please select another table")); + // ComboBoxTable->setCurrentItem(table->getTableInd(table->property("TableInd").toInt())); + ListCol->clear(); + ListCol->insertItem("table in use!"); + ListCol->setEnabled(false); + bOK->setEnabled(false); + ColumnSel(-1); // clear all line edit and labels + return; + } + if(!ListCol->isEnabled()) ListCol->setEnabled(true); + if(!bOK->isEnabled()) bOK->setEnabled(true); + lst = table->getFields(id); + ListCol->clear(); + fname = lst; + idlist = table->getFields(id,true); + ListCol->insertStringList(lst,0); + cwidth.clear(); + for(uint i=0; iproperty("DefaultColWidth").toString(); + } + //fname = table->fname; + findDeletedFields(id,idlist); + +} + + +void eDBTable::getData( wDBTable *t ) +{ +QStringList lst; +QString str, str2; +int i; +const Q3SqlFieldInfo *f; + if(ComboBoxTable->count()) + { + // t->setProperty("TableInd", tables[ComboBoxTable->currentItem()].section("\t",0,0).toInt()) + t->setProperty("TableInd",t->getTableId(ComboBoxTable->currentItem()-1)); + i=0; + while(inumCols()) + { + t->removeColumn(0); + ++i; + } + t->cur->clear(); + for(uint j=0; jcount(); j++) + { + ListCol->setCurrentItem(j); + str = ListCol->currentText(); + lst << str; + f = new Q3SqlFieldInfo(fname[j]); + t->cur->append(*f); + t->setSqlCursor(t->cur); + t->addColumn(f->name(),str,atoi(cwidth[j].ascii())); + t->refresh(Q3DataTable::RefreshColumns); + } + t->setProperty("DefHeaders",lst); + t->setProperty("DefFields",fname); + t->setProperty("DefIdList",idlist); + t->setProperty("ColWidth", cwidth); + } + else + { + t->setProperty("TableInd",-1); + } +} + + +void eDBTable::setData( wDBTable * t, aCfg *md ) + +{ +QStringList sl; +QString ft,h,n; +int idTable; +bool ok; +QStringList lst,lst_full; +aCfgItem own; +aWidget *wo; + table = t; +// md->print(); +// own = + // wo = aWidget::parentContainer( t ); + // if ( !wo ) return; + // tables = md->objTables( wo->getId() ); + // QString wotype = wo->className(); +// if ( wotype == "wDocument" ) tables.remove( tables[0] ); +// if ( wotype == "wCatalogue" ) tables.remove( tables[1] ); +// printf("tables=\n%s\n", ( const char *) tables.join("\n") ); +// for ( unsigned int i=0; i < tables.count(); i++ ) { +// ComboBoxTable->insertItem( tables[ i ].section("\t", 1 ) ); +// } +// ComboBoxTable->insertItem("None"); + ComboBoxTable->insertStringList(table->list_available_tables, 1); + idTable = table->property("TableInd").toInt(&ok); + // printf("table ind = %i, id table =%i\n", t->getTableInd(idTable), idTable ); + + ComboBoxTable->setCurrentItem(1+t->getTableInd(idTable)); + if(ok && idTable>-1) + { + // v = new QVariant(lst); + // } + // else + // { + // table->setFields(t->getTableId(0)); + // v = new QVariant(lst); + //table->setProperty("DefFields",*v); + // } + // v = new QVariant(lst); +// table->setProperty("DefHeaders",*v); + // table->setProperty("ColWidth",*v); + //ComboBoxTable->setFocus(); +// tmp_table = *t; + lst = table->property("DefHeaders").toStringList(); + ListCol->insertStringList(lst,0); + cwidth = table->property("ColWidth").toStringList(); + fname = table->property("DefFields").toStringList(); + idlist = table->property("DefIdList").toStringList(); + findDeletedFields(idTable,idlist); + } + else + { + ColumnUpd(); + } + ListCol->setFocus(); + /* if(!ListCol->isEmpty()) + { + ColumnSel(0); + } + */ + /* + if (!t->getDefineCols().isEmpty()) { + sl = QStringList::split("\n",t->getDefineCols()); + for (i = 0; i < sl.count(); i++) { + sscanf((const char *)sl[i].section("|",3,3),"%s %d %d", st, &l, &d); + if (st[0]=='O') ft.sprintf("O %d",l); + else ft=st; + w = sl[i].section("|",2,2).toInt(); + h = sl[i].section("|",5,5); + n = sl[i].section("|",4,4); + for (idxt = otypes.count()-1; idxt>0; idxt--) { + if (ft[0]=='O' && otypes[idxt]==ft) break; + else if (otypes[idxt][0]==ft[0]) break; + } + printf("set data %i = %s %s %i %i %i\n", i, + (const char *)h, (const char *)n, idxt, w, l); + insertColumn(h,n,idxt,w,l,d); + } + } + */ + + +} + + +void eDBTable::ColumnTextUpd( const QString &s ) +{ +CHECK_POINT + + int idx; + idx = ListCol->currentItem(); + if (idx == -1) return; + ListCol->blockSignals( TRUE ); + ListCol->changeItem(s, ListCol->currentItem()); + ListCol->blockSignals( FALSE ); + +} + + +void eDBTable::doOK() +{ + getData(table); + accept(); +} + + +void eDBTable::ColumnAdd() +{ +QString s; +QString idx; +QStringList::Iterator it; + addfdialog e( this->topLevelWidget()); + e.setData(deletedFields,deletedFields,deletedFieldsId); + if ( e.exec()==QDialog::Accepted ) + { + idx = e.getData(false); +// printf(">>>idx = %s\n",idx.ascii()); + if(idx=="0") return; + s = table->getFieldName(idx.toInt()); + idlist << idx; +// printf(">>> add field = '%s'\n",s.ascii()); + ListCol->insertItem(s,ListCol->count()); + fname << s; + cwidth << table->property("DefaultColWidth").toString(); + it = deletedFields.find(s); + deletedFields.remove(it); + it = deletedFieldsId.find(idx); + deletedFieldsId.remove(it); +// table->addColumn(s,s,100); + } +} + + +void eDBTable::ColWidthChange( int value ) +{ + int ind; + QString num; + ind = ListCol->currentItem(); + if(ind!=-1) + { + cwidth[ind] = num.setNum(value); + } + +} + + +QStringList +eDBTable::findDeletedFields( int t_num ,QStringList idls) +{ + QStringList lst_full; + deletedFields.clear(); + //formiruem list udalennix poley + lst_full = table->getFields(t_num,true); + for(unsigned int i=0;i>>field '%s'\n",lst_full[i].ascii()); + if(idls.find(lst_full[i])==idls.end()) + { + deletedFieldsId << lst_full[i]; + deletedFields << table->getFieldName(lst_full[i].toInt()); + } + } +return deletedFields; +} + + +void eDBTable::doCancel() +{ +} + diff --git a/src/plugins/dbtable/edbtable.h b/src/plugins/dbtable/edbtable.h new file mode 100644 index 0000000..3e59031 --- /dev/null +++ b/src/plugins/dbtable/edbtable.h @@ -0,0 +1,48 @@ +#ifndef EDBTABLE_H +#define EDBTABLE_H + +#include "ui_edbtable.h" + + +class eDBTable : public QDialog, public Ui::eDBTable +{ + Q_OBJECT + +public: + eDBTable(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eDBTable(); + + QStringList deletedFields, deletedFieldsId; + wDBTable *table; + + virtual QStringList findDeletedFields( int t_num, QStringList idls ); + +public slots: + virtual void ColumnDel(); + virtual void ColumnL(); + virtual void ColumnR(); + virtual void ColumnSel( int col ); + virtual void ColumnUpd(); + virtual void getData( wDBTable * t ); + virtual void setData( wDBTable * t, aCfg * md ); + virtual void ColumnTextUpd( const QString & s ); + virtual void doOK(); + virtual void ColumnAdd(); + virtual void ColWidthChange( int value ); + virtual void doCancel(); + +signals: + void closeEvent(); + +protected slots: + virtual void languageChange(); + +private: + QStringList otypes, fname, cwidth,idlist, tables; + + virtual void init(); + virtual void destroy(); + +}; + +#endif // EDBTABLE_H diff --git a/src/plugins/dbtable/edbtable.ui b/src/plugins/dbtable/edbtable.ui new file mode 100644 index 0000000..760b73b --- /dev/null +++ b/src/plugins/dbtable/edbtable.ui @@ -0,0 +1,448 @@ + + + + + eDBTable + + + + 0 + 0 + 479 + 348 + + + + aDBTable + + + + + + + + true + + + + 0 + 0 + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + Table name + + + false + + + + + + + + + + + + + + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + 301 + 21 + + + + Expanding + + + Horizontal + + + + + + + + + Column list + + + + + + 1 + + + 0 + + + 1 + + + + + + + + + + Column + + + + + + + + + 0 + 5 + 0 + 0 + + + + + 120 + 0 + + + + Header + + + false + + + + + + + 100 + + + + + + + + + + + + 0 + 5 + 0 + 0 + + + + + 120 + 0 + + + + Column width + + + false + + + + + + + 9999 + + + + + + + + + + + Width + + + false + + + + + + + false + + + 255 + + + + + + + + + + + Delete + + + + + + + Up + + + + + + + Down + + + + + + + Add + + + + + + + + + + + + 0 + 5 + 0 + 0 + + + + + 120 + 0 + + + + Field name + + + false + + + + + + + 300 + + + true + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 120 + 0 + + + + Field type + + + false + + + + + + + + + + false + + + + + + + + + + + decimal + + + false + + + + + + + false + + + 9 + + + + + + + + + + + + qPixmapFromMimeSource + + wdbtable.h + ananas.h + addfdialog.h + + + + bOK + clicked() + eDBTable + accept() + + + bCancel + clicked() + eDBTable + reject() + + + bColAdd + clicked() + eDBTable + ColumnAdd() + + + bColDel + clicked() + eDBTable + ColumnDel() + + + bColL + clicked() + eDBTable + ColumnL() + + + bColR + clicked() + eDBTable + ColumnR() + + + ListCol + highlighted(int) + eDBTable + ColumnSel(int) + + + ComboBoxTable + activated(QString) + eDBTable + ColumnUpd() + + + eColHeader + textChanged(QString) + eDBTable + ColumnTextUpd(QString) + + + eColWidth + valueChanged(int) + eDBTable + ColWidthChange(int) + + + ComboBoxTable + activated(QString) + ListCol + setFocus() + + + bCancel + clicked() + eDBTable + doCancel() + + + eDBTable + closeEvent() + eDBTable + doCancel() + + + bColAdd + clicked() + ListCol + setFocus() + + + diff --git a/src/plugins/dbtable/wdbtable.cpp b/src/plugins/dbtable/wdbtable.cpp new file mode 100644 index 0000000..26195b4 --- /dev/null +++ b/src/plugins/dbtable/wdbtable.cpp @@ -0,0 +1,1901 @@ +/**************************************************************************** +** $Id: wdbtable.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Code file of the database table plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2006 Grigory Panov, , Yoshkar-Ola. +** Copyright (C) 2003-2004 Andrey Paskal , Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +//--#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//--#include "propertyeditor.h" +//--#include "command.h" +//--#include "formwindow.h" +//--#include "mainwindow.h" +//--#include "mainform.h" +#include "adocjournal.h" +#include "alog.h" + +#include "wdbtable.h" +#include "edbtable.h" + + +/*! + * \en Constructor. \_en + * \ru Конструктор. + * Задает значение ширины по умолчанию для столбца = 100. \_ru + */ +wDBTable::wDBTable( QString objtype, QWidget *parent, const char *name ) + : Q3DataTable( parent, name ) +{ +// vId = 0; +// verticalHeader()->hide(); + setLeftMargin(0); + setNullText(""); + objtype = ""; + defColWidth = 100; //default column width + tableInd = -1; + inEditMode = false; + searchWidget = 0; + searchMode = false; + searchString = ""; + connect( this, SIGNAL(cursorChanged ( QSql::Op ) ), this, SLOT(lineUpdate( QSql::Op ) ) ); + connect( this, SIGNAL(currentChanged ( int, int ) ), this, SLOT(lineChange( int, int ) ) ); + connect( this, SIGNAL(beforeInsert ( QSqlRecord* ) ), this, SLOT(lineInsert( QSqlRecord* ) ) ); + connect( this, SIGNAL(valueChanged ( int, int ) ), this, SLOT(updateTableCellHandler(int, int ) ) ); + connect( this, SIGNAL(doubleClicked ( int, int, int, const QPoint&) ), this, SLOT(doubleClickEventHandler(int,int,int, const QPoint&))); + init(); + + + aLog::print(aLog::Debug, tr("wDBTable init ok")); +// printf("ok init wdbtable\n"); + +} + + + +/*! + * \en Opens property editor. \_en + * \ru Открывает окно редактора свойсв, если fn == true \_ru + */ +void +wDBTable::setOpenEditor( bool fn ) +{ + if(fn) OpenEditor(); +} + + +/*! + * \~english + * Gets list of defined fields. + * \~russian + * Получение списка заданных полей. + * \~ + */ +QStringList +wDBTable::getDefFields() const +{ + return fname; +} + + +/*! + * \~english + * Gets list of defined headers. + * \~russian + * Получение списка заданных заголовков. + * \~ + */ +QStringList +wDBTable::getDefHeaders() const +{ + return hname; +} + + +/*! + * \~english + * Gets list of defined column width. + * \~russian + * Получение списка заданных размеров столбцов. + * \~ + */ +QStringList +wDBTable::getColWidth() const +{ + return colWidth; +} + + +/*! + * \~english + * Gets list of defined column id. + * \~russian + * Получение списка заданных идентификаторов столбцов. + * \~ + */ +QStringList +wDBTable::getDefIdList() const +{ + return idList; +} + +/*! + * \~english + * Gets metadata document id. + * \~russian + * Получение идентификатора документа метаданных, которому принадлежит виджет. + * \~ + */ +qulonglong +wDBTable::getId() const +{ + return doc_id; +} + +/*! + * \~english + * Gets current table id. + * \~russian + * Получение идентификатора текущей таблицы. + * \~ + */ +int +wDBTable::getTblInd() const +{ + return tableInd; +} + +/*! + * \~english + * Olways return false. + * \~russian + * Всегда возвращает false. + * \~ + * \return false + */ +bool +wDBTable::getOpenEditor() const +{ + return false; +} + +/*! + * \~english + * Gets default column width. + * \~russian + * Получение размера столбца по умолчанию. + * \~ + */ +int +wDBTable::getDefColWidth() const +{ + return defColWidth; +} + +/*! + * \~english + * Sets list of field names. + * \~russian + * Установка списка имен полей. + * \~ + */ +void +wDBTable::setDefFields(QStringList lst) +{ + fname = lst; +} + +/*! + * \~english + * Sets list of field headers. + * \~russian + * Установка списка заголовков полей. + * \~ + */ +void +wDBTable::setDefHeaders(QStringList lst) +{ + hname = lst; +} + +/*! + * \~english + * Sets list of columns width. + * \~russian + * Установка списка размеров столбцов. + * \~ + */ +void +wDBTable::setColWidth(QStringList lst) +{ + colWidth = lst; +} + +/*! + * \~english + * Gets list of column id. + * \~russian + * Установка списка идентификаторов столбцов. + * \~ + */ +void +wDBTable::setDefIdList(QStringList lst) +{ + idList = lst; +} + +/*! + * \~english + * Sets metadata document id. + * \~russian + * Установка идентификатора документа метаданных, которому принадлежит виджет. + * \~ + */ +void +wDBTable::setId( qulonglong fn ) +{ + doc_id = fn; +} + + +/*! + * \~english + * Gets current table id. + * \~russian + * Установка идентификатора текущей таблицы. + * \~ + */ +void +wDBTable::setTblInd( int ind ) +{ + tableInd = ind; +} + + +/*! + * \~english + * Sets default columns width. + * \~russian + * Установка размера столбцов по умолчанию. + * \~ + */ +void +wDBTable::setDefColWidth( int fn ) +{ + defColWidth = fn; +} + + + +/*! + * \en Creates property editor dialog window. \_en + * \ru Создает диалоговое окно редактора свойств. \_ru + */ +void +wDBTable::OpenEditor() +{ + //getBindList(); + setAvailableTables(); + eDBTable e( this->topLevelWidget()); + checkFields(); + e.setData(this,md); + if ( e.exec()==QDialog::Accepted ) + { + e.getData(this); + //updateProp(); + } +} + + + +/*! + * \~endlish + * Destructor. + * \~russian + * Деструктор. + * \~ + */ +wDBTable::~wDBTable() +{ + delete cur; + cur=0; +} + + + +/*! + * \~english + * Function init. Sets metadata object and tables object. + * \~russian + * Функция инициализации. Устанавливает объект метаданных и объект таблицы, + * к которому идет обращение для поиска полей или (в случае документа) таблиц + * \~ + */ +void +wDBTable::init()// aDatabase *adb ) +{ + int id=0; + aCfgItem o, o_table; + aCfgItem mditem, docitem; + + // set up pixmap for calculated fields + + cur = new Q3SqlCursor("cur",false); + md = aWidget::parentContainer(this)->getMd(); + if ( md ) + { + id = aWidget::parentContainer(this)->getId(); + o = md->find(id); + QString objClass = md->objClass(o); + if(objClass==md_document) + { + o = md->findChild(o,md_tables); // object tables + tables = o; + } + if(objClass==md_journal){ + o = md->findChild(o, md_columns); + tables = o; + } + if(objClass==md_catalogue) + { +// verticalHeader()->hide(); + o = md->findChild(o,md_element); + tables = o; + } + } + else + { +// verticalHeader()->hide(); +// printf("name engin\n"); + } + +} + + + +/*! + * \en Sets available tables, using object tables. \_en + * \ru Заполняет внутренний список доступных таблиц, используя в качестве + * источника информации объект tables. + * Добавляет к имени уже забинденой таблицы звездочку(*). \_ru + */ +void +wDBTable::setAvailableTables() +{ +aCfgItem o_table, o = tables; +QString str; +QStringList listIdTable; +int res; +Q3ValueList vList = getBindList(); + + if(o.isNull()) return; + QString objClass = md->objClass(o); + //printf("obj class `%s'\n",objClass.ascii()); + list_available_tables.clear(); + if(objClass==md_tables) + { + res = md->countChild(o,md_table); // ind kol_vo tables in obj tables + for(int i=0; ifindChild(o,md_table,i); + listIdTable << QString("%1").arg(md->id(o_table)); + //printf("id = %li\n", md->id(o_table)); + } + } + if(objClass==md_columns) + { + // listIdTable << QString("%1").arg(md->id(o)); + list_available_tables << tr("Available columns"); + } + if(objClass==md_element) + { + list_available_tables << md_element; + + // listIdTable << QString("%1").arg(md->id(o)); + } + + //res = md->countChild(o,md_table); // ind kol_vo tables in obj tables + res = listIdTable.count(); + for(int i=0; ifindChild(o,md_table,i); + + if(vList.find(listIdTable[i].toInt())!=vList.end()) + str ="* "; + else + str =""; + list_available_tables << str + md->attr(md->find(listIdTable[i].toInt()),mda_name); // add tables name in combo box + } +} + + + + +/*! + * \en Handler line current change signal. \_en + * \ru Обработчик сигнала изменения строки. Генерирует сигналы + * deleteLine и saveLine. \_ru + */ +void +wDBTable::lineUpdate( QSql::Op mode) +{ +QSqlRecord *rec = sqlCursor()->editBuffer();//currentRecord(); + switch(mode) + { + case QSql::Update: + // rec = currentRecord(); + break; + case QSql::Insert: + break; + case QSql::Delete: + //printf("emit del line\n"); + emit(deleteLine(rec)); + return; + default: + break; + } + //if(!rec) return; + //printf(" emit saveLine\n"); + emit(saveLine(rec)); +} + + + +/*! + * \~english + * Function paint field in table. + * \~russian + * Переопределенная функция рисования поля таблицы. + * В типе DateTime не отображает время. + * Поддерживает вычисляемые поля. + * \~ + */ +void +wDBTable::paintField ( QPainter * p, const QSqlField * field, const QRect & cr, bool selected ) +{ + if(field->name().left(5)=="text_") return; + if ( sqlCursor()->isCalculated( field->name() ) ){ + if ( field->name()=="system_icon" ) + p->drawPixmap( QRect( 0, 0, cr.width(), cr.height() ), systemIcon() ); + return; + } + if ( sqlCursor()->contains( "text_"+field->name() ) ) { + QSqlField f(*field); + f.setValue(((aDataTable*)sqlCursor())->sysValue("text_"+f.name())); + Q3DataTable::paintField( p, &f, cr, selected ); + return; + // f = * sqlCursor()->field( "text_"+f.name() ); + } + if(field->type() == QVariant::DateTime) + { + QSqlField f(*field); + f.setValue(field->value().toDate());// don't show time + Q3DataTable::paintField( p, &f, cr, selected ); + return; + } + Q3DataTable::paintField( p, field, cr, selected ); +} + + + +/*! + * \~english + * Return system icon for display object record state. + * \russian + * Возвращает иконку для отображения состояния строки. + * \~ + */ +QPixmap +wDBTable::systemIcon() +{ + aWidget *container = aWidget::parentContainer( this ); + QString ctype=""; + QPixmap pm; + Q3SqlCursor *r = sqlCursor(); + int df=0, cf=0, mf=0; + + if ( container ) ctype = container->className(); + if ( r ) + { + if ( r->contains("df") ) df = r->field("df").value().toInt(); + if ( r->contains("cf") ) cf = r->field("cf").value().toInt(); + else + { + if(ctype=="wJournal") + { + + aDocJournal* sysObj = new aDocJournal(db); + if(sysObj) + { +//for(int i=0; icount(); i++) +// printf("f[%d]=%s, %s\n",i, r->fieldName(i).ascii(), r->field(i)->value().toString().ascii()); + if(sysObj->findDocument(r->field("id").value().toULongLong())) + { + aDocument *doc = sysObj->CurrentDocument(); + cf = doc->IsConducted(); + delete doc; + } + else + { + printf(">>doc select failed!\n"); + } + //doc = 0; + //cf = sysObj->sysValue("cf").toInt(); + } + + delete sysObj; + + + } +//>>>>>>> 1.71.2.13 + } + if ( r->contains("mf") ) mf = r->field("mf").value().toInt(); + if(ctype=="wJournal") + { + pm = t_doc; + if ( df ) pm = t_doc_d; + if ( cf && !df ) pm = t_doc_t; + if ( mf && !df ) pm = t_doc_m; + if ( cf && mf && !df ) pm = t_doc_tm; + } + else + if(ctype=="wCatalogue") + { + pm = t_cat_e; + if ( df ) pm = t_cat_ed; + } + else + if(ctype=="wCatGroupe") + { + pm = t_cat_g; + if ( df ) pm = t_cat_gd; + } + } + return pm; +} + + + +/*! + * \~english + * Sets property `DefFields', `DefHeaders', `ColWidth', `DefIdList' to + * values from metadata. + * \~russian + * Устанавливает свойства `DefFields', `DefHeaders', `ColWidth', `DefIdList' + * в значения, определенные в метаданных. Старые значения не сохраняются. + * Для документа используется idTable. + * \~ + * \param idTable (in) - \~english table id + * \~russian id таблицы документа. Не используется для каталогов и журналов. + * \~ + */ +void +wDBTable::setFields(int idTable) +{ +CHECK_POINT + int field_count,j; + int i; //,tableCount; + //QSqlCursor *cur; + const Q3SqlFieldInfo *field; + QString str; + QStringList Cwidth, list_fields,list_id; + aCfgItem o, o_table, o_field; + QString mdtag=QString(md_field); + + list_fields.clear(); + o = tables; // object tables + QString objClass = md->objClass(o); + //printf("table parent obj class '%s'\n", (const char*)objClass); + if(objClass==md_tables) + { + o_table = md->find(idTable); + } + else + if(objClass==md_columns) + { + o_table = o; + mdtag=QString(md_column); + } + else + if(objClass==md_element) + { + o_table = o; + } + colWidth.clear(); + i=0; + while(iclear(); + if(!o_table.isNull()) + { + field_count = md->countChild(o_table,mdtag); + //printf("table name '%s'\n",(const char*)md->attr(o_table,mda_name)); + //printf("table id '%s'\n",(const char*)md->attr(o_table,mda_id)); + for (j=0; jfindChild(o_table,mdtag,j); + //printf("field %i name '%s'\n",j,(const char*)md->attr(o_field,mda_name)); + //printf("field %i id '%s'\n",j,(const char*)md->attr ( o_field, mda_id )); + list_fields << md->attr(o_field,mda_name); + list_id << md->attr(o_field,mda_id); + str.setNum(j); + field = new Q3SqlFieldInfo(md->attr(o_field,"name")); + cur->append(*field); + setSqlCursor(cur); + addColumn(field->name(),field->name(),property("DefaultColWidth").toInt()); + refresh(RefreshColumns); + Cwidth << property("DefaultColWidth").toString(); + } + } + setProperty("DefFields",list_fields); + setProperty("DefHeaders",list_fields); + setProperty("ColWidth",Cwidth); + setProperty("DefIdList",list_id); +} + + + +/*! + * \en Gets table id at position table. \_en + * \ru Получение id таблицы по ее позиции в метаданных. + * Эта позиция совпадает с индексом таблицы в комбобоксе редактора свойств + * таблицы. \_ru + * \param numTable (in) - \en Position table in metadata \_en + * \ru Положение таблицы в метаданных. + * Не используется в каталоге и журнале. \_ru + * \return \en table id \_en \ru id таблицы \_ru + */ +int +wDBTable::getTableId(int numTable) +{ + int res = -1; + aCfgItem o, o_table; + if ( numTable == -1 ) return res; + o = tables; // object tables + QString objClass = md->objClass(o); + if(objClass==md_tables) + { + o_table = md->findChild(o,md_table,numTable); + res = md->id(o_table); + } + if(objClass==md_columns) + { + res = md->id(o); + //printf("parent name %s\n", (const char*)md->attr(md->parent(o),mda_name)); + } + if(objClass==md_element) + { + res = md->id(o); + } + //printf("get table id=%i\n", res); + return res; +} + + + +/*! + * \en Gets table position at id table. \_en + * \ru Получение позиции таблицы в метаданных по ее id. + * Эта позиция совпадает с индексом таблицы в комбобоксе редактора свойств + * таблицы. \_ru + * \param id (in) - \en Id table \_en + * \ru id таблицы. + * Не используется в каталоге и журнале. \_ru + * \return \en table position for documet or 0 for catalogue and journal\_en + * \ru Для документа возвращает позицию таблицы, для каталога и + * журнала документов возвращает 0 \_ru + */ +int +wDBTable::getTableInd(int id) +{ +int j,tableCount; +aCfgItem o, o_table; + o = tables; // object tables + QString objClass = md->objClass(o); + if(objClass==md_columns || objClass==md_element) + { + //printf("TableInd=%i\n",tableInd); + return tableInd; + } + tableCount = md->count(o,md_table); + for(j=tableCount-1; j>=0; j--) + { + o_table = md->findChild(o,md_table,j); + if(md->id(o_table)==id) break; + } +return j; +} + + + +/*! + * \en Gets list of id fields or list of name fields. \_en + * \ru Получение списка id или имен полей таблицы. + * Возвращаемое значение зависит от параметра GetId. \_ru + * \param idTable (in) - \en id of table \_en + * \ru id таблицы документа. Для каталога и журнала + * не используется. \_ru + * \param GetId (ib) - \en if GetId == true returns list of id, else + * returns list of names. \_en + * \ru если параметр равен true, возвращается + * список id полей таблицы, иначе возвращается + * список имен полей таблицы. \_ru + * \return \en list of id fields or list of name fields. \_en + * \ru Список id или имен полей таблицы. \_ru + */ +QStringList +wDBTable::getFields(int idTable, bool GetId) +{ + QStringList lst; + if (idTable==-1) { + return lst; + } + + int items_count,j;//,tableCount; + aCfgItem o, o_table, o_item; + QString mdtag=md_field; + + +//aWidget *wo = aWidget::parentContainer( this ); +// if ( !wo ) return lst; +// o_table = md->objTable( wo->getId(), idTable ); + + o = tables; // object tables + QString objClass = md->objClass(o); + if(objClass==md_tables) + { + o_table = md->find(idTable); + } + else + if(objClass==md_columns) + { + o_table = o; + mdtag = md_column; + } + else + if(objClass==md_element) + { + o_table = o; + } + if(!o_table.isNull()) + { + items_count = md->countChild(o_table,mdtag); + for (j=0; jfindChild(o_table,mdtag,j); + if(GetId) + lst << md->attr(o_item,mda_id); + else + lst << md->attr(o_item,mda_name); + } + } + else { + debug_message("Table not found!\n"); + } +return lst; +} + + + +/*! + * \~english + * Gets field type. + * \~russian + * Получение типа поля. + * \~ + * \param id - \~english field id \~russian идентификатор поля \~ + * \return \~english field type \~russian тип поля \~ + */ +QString +wDBTable::getFieldType(long id) +{ + aCfgItem o; + QString str=""; + + QString objClass = md->objClass(tables); + if(objClass==md_columns) { + id= journalFieldId(id); + } + o = md->find(id); + if(!o.isNull()) + { + str = md->attr(o,mda_type); + } +return str; +} + + + +/*! + * \~english + * Gets field name. + * \~russian + * Получение имени поля. + * \~ + * \param id - \~english field id \~russian идентификатор поля \~ + * \return \~english field name \~russian имя поля \~ + */ +QString +wDBTable::getFieldName(long id) +{ + aCfgItem o; + QString str=""; + o = md->find(id); + if(!o.isNull()) + { + str = md->attr(o,mda_name); + } +return str; +} + + + +/*! + *\~english + * function check property name, id, header and width. + * If have incorrect field name or id, then print message and all. + * If have less or more items in DefHeaders or ColWidth, then set them normal. + *\~russian + * Функция проверяет свойства name, id, DefHeaders и ColWidth. + * Если находит ошибки в свойствах name или id, она выводит сообщение об этом, но не исправляет ошибки. + * Если находит ошибки в свойствах DefHeaders или ColWidth, то исправляет. + *\~ + */ +void +wDBTable::checkFields() +{ + QStringList fl,hl,cl,il; + unsigned int i; + QString str; + + //t = getFields(property("tableInd").toInt(),true); //get list fields id + fl = property("DefFields").toStringList(); + il = property("DefIdList").toStringList(); + cl = property("ColWidth").toStringList(); + hl = property("DefHeaders").toStringList(); +// proverka na nalichie field in metadata + for(i=0; i=hl.count()) hl << str; + if(i>=cl.count()) cl << property("DefaultColWidth").toString(); + } + while(icfg; + tid = property("TableInd").toInt(); + container = aWidget::parentContainer( this ); + if ( !container ) + { + aLog::print(aLog::Error, tr("wDBTable not in Ananas object container ")); + return; //printf("!no wDBTable parent container\n"); + } + else + { + o = md->objTable( container->getId(), tid ); + if ( o.isNull() ) + { + //debug_message("Table not found\n"); + aLog::print(aLog::Error, tr("wDBTable init meta object not found ")); + } + ctype = container->className(); + aLog::print(aLog::Info, tr("wDBTable container type is %1 ").arg(ctype)); + + setContainerType(ctype); + } + + //o = md->find(property("TableInd").toInt()); + if ( o.isNull() ) + { + aLog::print(aLog::Error, tr("wDBTable init meta object not found ")); + return; + } + countField = numCols(); + for(i=0; iuid()); + aLog::print(aLog::Info, tr("wDBTable filter is %1 ").arg(flt)); + setFilter(flt); + //TODO: fix memory leak + tbl = new aSQLTable( o, adb ); +// printf("new table ok\n"); + // tbl->first(); + + } + if ( containerType() == "wCatalogue" ) { + tbl = container->table(); //new aSQLTable( o, adb ); + setFilter(QString("idg=0")); + newDataId(0); + tbl->append( Q3SqlFieldInfo("system_icon") ); +// tbl->setGenerated( "system_icon", false ); + tbl->setCalculated("system_icon", true ); + } + if ( containerType() == "wJournal" ) { + tbl = container->table(); //new aSQLTable( o, adb ); + tbl->setMode( 0 ); + tbl->append( Q3SqlFieldInfo( "system_icon" ) ); +// tbl->setGenerated( "system_icon", false ); + tbl->setCalculated( "system_icon", true ); +// tbl->append( QSqlFieldInfo( "t1" ) ); +// tbl->setGenerated( "t1", false ); +// tbl->setCalculated("t1", true ); + } + refresh(); + cur->clear(); + setSqlCursor(tbl,true); + refresh(RefreshColumns); + countField = numCols(); + lst = property("DefIdList").toStringList(); + lstHead = property("DefHeaders").toStringList(); + lstWidth = property("ColWidth").toStringList(); + for ( i = 0; i < countField; i++ ) + { + //remove all columns in wDBTable, not in sql cursor + removeColumn( 0 ); + QString s = sqlCursor()->fieldName(i); +// printf(">>>>s = %s\n",s.ascii()); +// if(sqlCursor()->isCalculated(s)) +// { +// if((s.left(7)=="text_uf" && lst.findIndex(s.mid(7))!=-1) || s == "system_icon") +// { +// continue; +// } + // not calculate field, if is not contents in wDBTable +// sqlCursor()->setCalculated(sqlCursor()->fieldName(i),false); +// } + } + if ( containerType() == "wJournal" ) { + addColumn( "system_icon", "", 20 ); + setColumnReadOnly( 0, true ); + if (md->objClass(*(container->getMDObject()))==md_journal && !((aDocJournal*) container->dataObject())->type() ) { + // we have common journal + // Insert journal system columns. + addColumn( "ddate", tr("Date"), 100 ); + addColumn( "pnum", tr("Prefix"), 200 ); + addColumn( "num", tr("Number"), 100 ); + } + } + if ( containerType() == "wCatalogue" ) { + addColumn( "system_icon", "", 20 ); + // printf("set column ro\n"); + setColumnReadOnly( 0, true ); + } + + if ( containerType() == "wDocument" || containerType() == "wCatalogue" ) { + + // Задаем сортировку по индентификатору в обратном порядке для + // табличной части документа + // чтобы при добавлении новых позиций в список строки не скакали + QSqlIndex pk = sqlCursor()->primaryIndex(); + pk.setDescending( 0, false); + setSort( pk ); + sqlCursor()->select(); + sqlCursor()->first(); + refresh(); + } + + + //refresh(RefreshColumns); + if (md->objClass(*(container->getMDObject()))!=md_journal || ((aDocJournal*) container->dataObject())->type() ) { + // we have not common journal + for(i=0; i>>>>>ss=%s\n",str.ascii()); + } + else + { + str = "uf"+lst[i]; + } + // add defined fields + addColumn(str,lstHead[i],lstWidth[i].toInt()); + } + } + refresh(RefreshAll); + setWFieldEditor(); + aLog::print(aLog::Debug, tr("wDBTable init in engine ok")); +} + + + +/*! + * + */ +/*! + * \~english + * Set custom field editor (wField) used property `value'. + * \~russian + * Устанавливает свой редактор ячейки таблицы (wField). + * \~ + */ +void +wDBTable::setWFieldEditor() +{ + aEditorFactory * f = new aEditorFactory(this,""); + f->setMd(md); + Q3SqlPropertyMap * m = new Q3SqlPropertyMap(); + m->insert("wField", "value"); + installPropertyMap(m); + installEditorFactory(f); +} + + + +/*! + * \~english + * Construct cell editor. Creates new wField object and inited it. + * \~russian + * Конструктор редактора ячейки. Создает новый экземпляр объекта wField и инициализирует его. + * \~ + */ +QWidget* +aEditorFactory::createEditor(QWidget * parent, const QSqlField * field) +{ +//--WFlags fl=0; +wField * tmp; +wDBTable *t=0; +QString str,stmp; +wField::tEditorType type = wField::Unknown; + if(md) + { + t = (wDBTable*)parent->parent()->parent(); + + tmp = new wField((QWidget*)(parent->parent()),""/*--,fl*/); + if(t) + { + str = field->name(); + str = str.remove(0,2); + tmp->setFieldType(t->getFieldType(str.toInt())); + str = t->getFieldType(str.toInt()); + stmp = str.section(' ',0,0); +// printf("type is %s\n",stmp.ascii()); + if(stmp=="C") type = wField::String; + if(stmp=="N") type = wField::Numberic; + if(stmp=="D") type = wField::Date; + if(stmp=="B") type = wField::Boolean; + if(stmp=="O") + { + int tid; + //gets object id. + //stmp = str.section(' ',1,1); + tid = atoi(str.section(' ',1,1).ascii()); +// printf("tid =%d\n",tid); + aCfgItem o = md->find(tid); + if(!o.isNull()) + { + //gets object class + str = md->objClass(o); +// printf("otupe = %s\n",str.ascii()); + if(str == md_catalogue) + // and set editor + type = wField::Catalogue; + if(str == md_document) + type = wField::Document; + + } + else + { + aLog::print(aLog::Error,tr("aEditorFactory field metaobject not found")); + } + } + tmp->setEditorType(type); + tmp->initObject( t->db ); + tmp->engine = t->engine; + } + } + else + { + aLog::print(aLog::Error,tr("aEditorFactory metadata in null")); + } + if(parent && parent->parent() && parent->parent()->parent()) // setted right tabOrder + // parent->parent()->parent() - pointer to wDBTable; + QWidget::setTabOrder((QWidget*)parent->parent()->parent(),tmp); + return tmp; + +} +void +aEditorFactory::setMd(aCfg * cfg) +{ + md = cfg; +} + + +/*! + * \~english + * Gets list of id binding table. + * \~russian + * Получение списка уже присутствующих в форме таблиц. Необходимо для того, чтобы одну таблицу не добавили два раза. + * \~ + * \return \~english list of id binding table. \~russian список таблиц \~ + */ +Q3ValueList +wDBTable::getBindList() +{ +aCfgItem obj; +QObjectList wList; +int id; +wDBTable* wtable; +QObject* wd = aWidget::parentContainer( this ); + listBindings.clear(); + wList = wd->queryList( "wDBTable" ); + QListIterator it( wList ); // iterate over the wDBTable + while ( it.hasNext() ) + { + wtable = qobject_cast( it.next() ); + + if(strcmp(wtable->name(),this->name())) // don't added current id + { + //don.t added deleted widgets + if(strncmp("qt_dead_widget_",wtable->name(),strlen("qt_dead_widget_"))) + { + id = wtable->property("TableInd").toInt(); + if(id>=0) // don't added negativ id (table while not selected) + { + listBindings << id; + } + } + } + } + //--delete wList; +return listBindings; +} + + + +/*! + * \~english + * Get field value slot. Don't implemented. + * \~russian + * Получение значения поля. Не реализовано. + * \~ + */ +QVariant +wDBTable::Value( const QString &colname ) +{ + aLog::print(aLog::Error, tr("wDBTable: function Value() call")); + return QVariant(""); +} + + + +/*! + *\~english + * Emit signal on select record. + * Signal give information about selected record database id. + *\~russian + * Выдает сигнал при выборе записи. + * Сигнал содержит информацию об id, выбранного объекта в базе данных. + *\param -\~english Not use, only for signal compatibility.\~russian + * Не используются, заданы только для совместимости с сигналом таблицы.\~ + *\~ + */ +void +wDBTable::lineChange(int, int) +{ + QSqlRecord * rec = currentRecord(); + if ( !rec ) return; + qulonglong id = 0; + if(rec->contains("id")) id = rec->value("id").toLongLong(); + //if (containerType() == "wJournal") + //{ + //if(rec->contains("idd")) id = rec->value("idd").toLongLong(); + //} + aLog::print(aLog::Info, tr("wDBTable: select document %1").arg(id)); + emit( selectRecord( id ) ); +} + + +/*! + *\ru + * Устанавливает значение системного поля idd во вновь добавляемую запись табличной части документа. + *\_ru + */ +void +wDBTable::lineInsert(QSqlRecord* rec){ + + if (containerType() == "wDocument") + { + if(rec->contains("idd")) rec->setValue("idd",QVariant(doc_id)); + if(rec->contains("ln")) rec->setValue("ln",numRows()-1); + } + if(containerType() == "wCatalogue") + { + if(rec->contains("idg")) rec->setValue("idg",QVariant(cat_group_id)); + } +} + + +/*! + * \~english + * Delete line function + * \~russian + * Функция удаления строки. + * \~ + * \return \~english true, if no error \~russian true, если ошибок не было \~ + */ +bool +wDBTable::deleteCurrent() +{ + bool res; + res = Q3DataTable::deleteCurrent(); + emit(updateCurr(currentRow(),currentColumn())); + return res; + +} + + +/*! + * \~english + * Key press handler. + * \~russian + * Обрабатывает события при нажатии кнопок клавиатуры. + * \~ + */ +void +wDBTable::keyPressEvent ( QKeyEvent *e ) +{ + qulonglong id; + + aWidget *container = NULL; + if ( searchMode == FALSE && e->text().at( 0 ).isPrint() ) + { + searchOpen( e->text() ); + } + else + { + searchClose(); + } + + if(containerType() =="wJournal") + { + e->ignore(); + } + if(containerType() =="wCatalogue") + { + switch ( e->key() ) + { + case Qt::Key_Escape: + e->ignore(); + break; + case Qt::Key_Return: + if(currentRecord()) + { + id = currentRecord()->value(0).toLongLong(); + if ( e->state() == Qt::ShiftModifier ) + { + //printf("Shift+Return pressed %Ld\n", id); + EditElement(); + } else + { + //printf("Return pressed %Ld\n", id ); + emit( selected( id ) ); + } + e->accept(); + } + else + { + aLog::print(aLog::Info, tr("wDBTable: current record not setted")); + } + break; + default: + e->ignore(); + break; + } + } + Q3DataTable::keyPressEvent( e ); +} + + + +/*! + *\ru + * Слот обрабатывает ситуацию смены/установки идентификатора документа, устанавливая новый фильтр. + * Кроме переустановки фильта следует вызывать слот newDataId, для смены/установки + * значения идентификатора документа. Для журнала этого можно не делать. + * \param flt - строка вида "idd=999", задающая условия отбора записей в таблицу по значению поля idd. + *\_ru + */ +void +wDBTable::newFilter(const QString & flt) +{ + setFilter(flt); + refresh(); +} + +/*! + *\ru + * Слот обрабатывает ситуацию смены/установки идентификатора документа, запоминая новое значение. + * Для смены фильта следует вызывать слот newFilter. + * \param id - идентификатор документа, который следует запомнить. + *\_ru + */ +void +wDBTable::newDataId(const qulonglong id) +{ + if(containerType() == "wDocument") + { + setId(id); + } + if(containerType() == "wCatalogue") + { + cat_group_id = id; + } +} + + +/*! + * \~english + * Opens form for edit catalogue element. + * \~russian + * Открывает форму по умолчанию для объекта контейнера и настраивает ее на работу с текущей строкой таблицы. Используется только в настраиваемом редакторе каталога. + * \~ + */ +void +wDBTable::EditElement() +{ + + ANANAS_UID id = 0; +// wGroupTreeItem * item = ( wGroupTreeItem * ) tree->currentItem(); + aForm * f = 0; + +//CHECK_POINT + id = currentRecord()->value(0).toLongLong(); + if ( id ) { + if ( engine ) { + f = engine->openForm( aWidget::parentContainer( this )->getId(), 0, md_action_edit, md_form_elem, id, ( aWidget *) this ); + if ( f ) { + connect(f, SIGNAL( update( ANANAS_UID )), this, SLOT(updateItem( ANANAS_UID ))); +// connect(f, SIGNAL(selected( Q_ULLONG )), this, SLOT(on_selected( Q_ULLONG ))); +// f->closeAfterSelect = true; + } + } + } +} + + +long +wDBTable::journalFieldId(long columnId){ + aCfgItem item; + + item= md->find(md->find(columnId),md_fieldid); + return md->text(item).toLong(); + +} + +QString +wDBTable::journalFieldName(long columnId) +{ + aCfgItem item; + item= md->find(md->find(columnId),md_fieldid); + item = md->find(md->text(item).toLong()); + if(!item.isNull()) + { + QString s = md->attr(item,mda_type); + QChar ch = s[0]; + if(ch.upper()=='O') + { + return QString("text_uf%1").arg(md->attr(item,mda_id)); + } + else + { + return QString("uf%1").arg(md->attr(item,mda_id)); + } + } + return "uf0"; + +} + +/*! + * \~english + * Hanler table cell end edit. + * \~russian + * Обрабатывает окончание редактирования ячейки таблицы. + * \~ + */ +//bool +void +wDBTable::updateTableCellHandler(int r, int c) +{ +// printf(">>>>update curr row %d col %d!\n",r,c); + lastEditedRow= r; + lastEditedCol= c; +} + +/*! + * \~english + * Reimplemented QDataTable function. + * \~russian + * Переопределяет функцию QDataTable. Испускает сигнал updateCurr(). + * \~ + */ +bool +wDBTable::updateCurrent() +{ + bool res = Q3DataTable::updateCurrent(); + if(res) + { +// printf(">>>>real update curr row %d col %d!\n",lastEditedRow, lastEditedCol); + emit(updateCurr(lastEditedRow,lastEditedCol)); + } +return res; +} + + +/*! + * \~english + * Reimplemented QDataTable function. + * \~russian + * Переопределяет функцию QDataTable. Отрабатывет после нажатия Enter в редактируемой ячейке. + * Перемещает фокус ввода на следующую ячейку. + * \~ + */ +void +wDBTable::activateNextCell() +{ + //int r = currentRow(), c = currentColumn(); + //if(r<0) r=0; + //if(c<0) c=0; + //tCurrentCell(r,c+1); +} + + + + +/*! + * \~english + * Reimplemented QDataTable function. + * \~russian + * Переопределяет функцию QDataTable. Выделяет текст в ячейке. + * \~ + */ +//>>>>>>> 1.71.2.13 +QWidget * +wDBTable::beginUpdate ( int row, int col, bool replace ) +{ + wField *wd; + wd = (wField*)Q3DataTable::beginUpdate(row,col,replace); + if(wd) + { + //inEditMode = true; + wd->selectAll(); + } + return wd; +} + + +void +wDBTable::doubleClickEventHandler(int /*rol*/, int /*col*/, int /*button*/, const QPoint &/*mousePos*/) +{ + if(containerType() =="wCatalogue" || containerType() == "wJournal") + { + if(currentRecord()) + { + qulonglong id = currentRecord()->value(0).toLongLong(); + emit( selected( id ) ); + } + } + +} + +/** + * \ru + * \brief Переопределяем метод базового класса, вызывающий диалог подтверждения. + * Переопределен только диалог подтверждения удаления. + * \_ru + */ + +QSql::Confirm +wDBTable::confirmEdit( QSql::Op m ) { + if ( m == QSql::Delete ) { + if ( 0 == QMessageBox::question( + this, + tr("Remove record?"), + tr("You are going to remove record
" + "Are you sure?"), + tr("&Yes, remove"), tr("&No"), + QString::null, 0, 1 ) ) { + return QSql::Yes; + } else { + return QSql::No; + } + } else { + return Q3DataTable::confirmEdit( m ); + } +} + +/** + * \ru + * \brief Переопределяем метод базового класса, осуществляющий вставку новой строки в таблицу. + * Наш метод будет всегда помещать новую строку в начале таблицы. + * \_ru + */ + +bool +wDBTable::beginInsert() { + if ( !sqlCursor() || isReadOnly() || !numCols() ) + return FALSE; + if ( !sqlCursor()->canInsert() ) + return FALSE; + + bool result = Q3DataTable::beginInsert(); + endEdit( currentRow(), currentColumn(), false, false); + setCurrentCell( numRows(), 0 ); + return result; + +} + + +/*! + * \~english + * Reimplemented QDataTable function. + * \~russian + * Переопределяет функцию QDataTable. Если контейнер wJournal, может испускаеть сигналы insertRequest(), updateRequest(), deleteRequest(), viewRequest() + * \~ + */ +void +wDBTable::contentsContextMenuEvent ( QContextMenuEvent * e ) +{ + Q3Table::contentsContextMenuEvent( e ); + QString str, ctype; + + if ( containerType() == "wDocument" || containerType() == "wCatalogue" ) { + // Переопределяем всплывающее по правой кнопке мыши меню для табличной части документа + // Во-первых, для его локализации + // Во-вторых, чтобы добавляемая в табличную часть строка всегда вставлялась самой последней. + enum { + IdInsert=0, + IdUpdate, + IdDelete, + }; + + QPointer popupForDoc = new Q3PopupMenu( this ); + int id[ 3 ]; + id[ IdInsert ] = popupForDoc->insertItem( tr( "New" ) ); + id[ IdUpdate ] = popupForDoc->insertItem( tr( "Edit" ) ); + id[ IdDelete ] = popupForDoc->insertItem( tr( "Delete" ) ); + + if ( !sqlCursor() || isReadOnly() || !numCols() ) { + popupForDoc->setItemEnabled(id[ IdInsert ], false ); + popupForDoc->setItemEnabled(id[ IdUpdate ], false ); + popupForDoc->setItemEnabled(id[ IdDelete ], false ); + } + + int r = popupForDoc->exec( e->globalPos() ); + delete (Q3PopupMenu*) popupForDoc; + if(r==id[IdInsert]) { + beginInsert(); + } else if(r==id[IdUpdate]) { + keyPressEvent( new QKeyEvent( QEvent::KeyPress, Qt::Key_F2, 0, Qt::NoButton)); + } else if(r==id[IdDelete]) { + Q3DataTable::deleteCurrent(); + } + } + + + if ( containerType() == "wJournal" ) + { + //id = currentRecord()->value(0).toLongLong(); + enum { + IdInsert=0, + IdUpdate, + IdDelete, + IdView, + IdRefresh }; + QPointer popup = new Q3PopupMenu( this ); + int id[ 5 ]; + id[ IdInsert ] = popup->insertItem( tr( "New" ) ); + id[ IdUpdate ] = popup->insertItem( tr( "Edit" ) ); + id[ IdDelete ] = popup->insertItem( tr( "Delete" ) ); + id[ IdView ] = popup->insertItem( tr( "View" ) ); + id[ IdRefresh ] = popup->insertItem( tr( "Refresh" ) ); + int r = popup->exec( e->globalPos() ); + delete (Q3PopupMenu*) popup; + if(r==id[IdInsert]) + emit(insertRequest()); + else + if(r==id[IdUpdate]) + emit(updateRequest()); + else + if(r==id[IdDelete]) + emit(deleteRequest()); + else + if(r==id[IdView]) + emit(viewRequest()); + if(r==id[IdRefresh]) + { + //recalculate(); + refresh(); + } + } + e->accept(); + +} + + +void +wDBTable::updateItem( ANANAS_UID db_uid ) +{ + refresh(); + emit currentChanged( currentRecord() ); +} + + +int +wDBTable::Select( ANANAS_UID db_uid ) +{ + aSQLTable *t = ( aSQLTable *) sqlCursor(); + +// printf("id = %Li\n",db_uid); + ANANAS_UID cur_id = 0; + uint curr = currentRow(), curc=currentColumn(), row = 0; + bool found = FALSE; + + while ( t->seek( row ) ){ + cur_id = t->sysValue( "id" ).toULongLong(); + if ( cur_id == db_uid ) { + found = TRUE; + break; + } + row++; + } + if ( found ) { + setCurrentCell( row, curc ); + } else setCurrentCell( curr, curc ); + return 0; +} + + +bool +wDBTable::searchColumn( const QString & text, bool FromCurrent, bool Forward ) +{ + + QString s; + uint curr = currentRow(), curc=currentColumn(), row = 0, idx; + bool found = FALSE; + aSQLTable *t = ( aSQLTable *) sqlCursor(); + + if ( FromCurrent ) row = curr; + if ( Forward ) row++; else row--; + idx = indexOf( curc ); + + while ( t->seek( row ) ){ + s = t->value( idx ).toString(); + if ( s.left( text.length() ) == text ) { + found = TRUE; + break; + } + if ( Forward ) row++; else row--; + } + if ( found ) { + setCurrentCell( row, curc ); + }; + return found; +} + + + +void +wDBTable::searchOpen( const QString & text ) +{ + searchWidget = new aSearchWidget( aWidget::parentContainer( this ), this ); + searchMode = TRUE; + searchWidget->setFocus(); + searchWidget->search( text ); +} + + +void +wDBTable::searchClose() +{ + if ( searchWidget ) { + setFocus(); + searchWidget->deleteLater(); + searchMode = FALSE; + searchWidget = 0; + } +} + + +/*! + *\~english + * + * + *\~russian + * Осуществляет интерактивный поиск по первым буквам + * текстового значения текущего столбца таблицы. + * Пока не реализован поиск для столбцов типа "Объект". + * Up - предыдущее значение. + * Down - следующее значение. + * ESC,Enter - конец поиска. + *\~ + */ +aSearchWidget::aSearchWidget( QWidget *parent, wDBTable *table ) +: Q3Frame( parent ) +{ + t = table; + ftext = ""; + setFrameStyle( Q3Frame::PopupPanel | Q3Frame::Raised ); + setFocusPolicy( Qt::StrongFocus ); + new Q3HBoxLayout( this, 0, 0 ); + l = new QLineEdit( this ); + l->installEventFilter( this ); + setFocusProxy( l ); + layout()->add( l ); +// move (0,0); + move( 3+t->x()+t->columnPos( t->currentColumn()), t->y()+1/*+t->height()*/); + resize( t->columnWidth( t->currentColumn() )-2, 25 ); + connect( l, SIGNAL( textChanged( const QString & ) ), this, SLOT( setText( const QString & ) ) ); +} + + +aSearchWidget::~aSearchWidget() +{ +} + + +void +aSearchWidget::search( const QString &t ) +{ + show(); + l->setText( t ); +} + + +void +aSearchWidget::setText( const QString &text ) +{ + if ( t->searchColumn( text ) ) ftext = text; + else l->setText( ftext ); +} + + +bool +aSearchWidget::eventFilter( QObject *obj, QEvent *ev ) +{ + if ( obj == l ) { + if ( ev->type() == QEvent::FocusOut ) { + t->searchClose(); + return TRUE; + } + if ( ev->type() == QEvent::KeyPress ) { + QKeyEvent *e = ( QKeyEvent *) ev; + switch ( e->key() ){ + case Qt::Key_Return: + case Qt::Key_Escape: + //printf("OK\n"); + t->searchClose(); + break; + case Qt::Key_Up: + t->searchColumn( ftext, TRUE, FALSE ); + break; + case Qt::Key_Down: + t->searchColumn( ftext, TRUE, TRUE ); + break; + default: + return FALSE; + break; + } + return TRUE; + } else { + return FALSE; + } + } else { + // pass the event on to the parent class + return Q3Frame::eventFilter( obj, ev ); + } +} diff --git a/src/plugins/dbtable/wdbtable.h b/src/plugins/dbtable/wdbtable.h new file mode 100644 index 0000000..2041a98 --- /dev/null +++ b/src/plugins/dbtable/wdbtable.h @@ -0,0 +1,323 @@ +/**************************************************************************** +** $Id: wdbtable.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the database table plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WDBTABLE_H +#define WDBTABLE_H + +#include +#include +//Added by qt3to4: +#include +#include +#include +#include +#include +#include +#include +#include +#include "acfg.h" +#include "aobject.h" +#include "awidget.h" +#include "wfield.h" + +class aDatabase; +class wDBTable; +class Q3DataTable; + +class aSearchWidget : public Q3Frame +{ +Q_OBJECT +public: + aSearchWidget( QWidget *parent, wDBTable *table ); + ~aSearchWidget(); + void search( const QString &t =""); +public slots: + void setText( const QString &t ); +protected: +// virtual void keyPressEvent ( QKeyEvent *e ); + bool eventFilter( QObject *obj, QEvent *ev ); +private: + QString ftext; + QLineEdit *l; + wDBTable *t; +}; + + + +/*! + * \en Class for editing documents tables. \_en + * \ru + * \brief Визуальный класс для редактирования табличных частей документа. + * Наследует QDataTable. + * + * Поддерживает редактирование журнала документов + * и таблицы элементов каталога. + * \_ru + * + */ +class QT_WIDGET_PLUGIN_EXPORT wDBTable : public Q3DataTable +{ + friend class aForm; + + Q_OBJECT + Q_PROPERTY( qulonglong Id READ getId WRITE setId DESIGNABLE true ) + Q_PROPERTY( int DefaultColWidth READ getDefColWidth WRITE setDefColWidth DESIGNABLE true ) + Q_PROPERTY( int TableInd READ getTblInd WRITE setTblInd DESIGNABLE true ) + Q_PROPERTY( QStringList DefFields READ getDefFields WRITE setDefFields DESIGNABLE true ) + Q_PROPERTY( QStringList DefHeaders READ getDefHeaders WRITE setDefHeaders DESIGNABLE true ) + Q_PROPERTY( QStringList ColWidth READ getColWidth WRITE setColWidth DESIGNABLE true ) + Q_PROPERTY( QStringList DefIdList READ getDefIdList WRITE setDefIdList DESIGNABLE true ) +// Q_PROPERTY( bool openEditor READ getOpenEditor WRITE setOpenEditor STORED true ) + Q_PROPERTY( QString editFormName READ getEditFormName WRITE setEditFormName DESIGNABLE true ) +public: + aCfg* md; + aDatabase* db; + aEngine* engine; + //char vLoaded; + QStringList list_available_tables; + QStringList fname, hname, colWidth,idList; + int defColWidth; + int tableInd; + aCfgItem tables; + Q3SqlCursor* cur; + bool searchMode; + QString searchString; + aSearchWidget *searchWidget; + + wDBTable( QString objtype, QWidget *parent = 0, const char *name = 0); + virtual ~wDBTable(); + void checkFields(); + void setFields(int numTable); //set propertis default value for table with num=numTable + QStringList getFields(int numTable, bool GetId=false); // return list field names or id's, defined in metadata + QString getFieldName(long idField); // return attribute `name' value + QString getFieldType(long idField); // return attribute `type' value + int getTableInd(int id); + int getTableId(int ind); + + // void init( aDatabase *adb ); + void init(); + void init(aDatabase *adb, aEngine *e = 0 ); // call in ananas engine + void OpenEditor(); + //QWidget* createEditor(); + + //int getDefaultWidth() const {return defColWidth;}; + + QStringList getDefFields() const; + QStringList getDefHeaders() const; + QStringList getColWidth() const; + QStringList getDefIdList() const; + qulonglong getId() const; + int getTblInd() const; + bool getOpenEditor() const; + int getDefColWidth() const; + + void setDefFields(QStringList lst); + void setDefHeaders(QStringList lst); + void setColWidth(QStringList lst); + void setDefIdList(QStringList lst); + void setId( qulonglong fn ); + void setTblInd( int ind ); + void setOpenEditor( bool fn ); + void setDefColWidth( int fn ); + + QString getEditFormName() const { return vEditFormName;}; + void setEditFormName( QString name) { vEditFormName = name; }; + + QString containerType() const { return container_type;}; + void setContainerType( QString name) { container_type = name; }; + QPixmap systemIcon(); + virtual int Select( ANANAS_UID db_uid ); +public slots: + Q3ValueList getBindList(); + void setWFieldEditor(); + void setAvailableTables(); + void lineUpdate(QSql::Op mode); + void newFilter(const QString & ); + void newDataId(const qulonglong ); + QVariant Value( const QString &colname ); + + bool searchColumn( const QString &text, bool FromCurrent = FALSE, bool Forward = TRUE ); + void searchOpen( const QString &text = "" ); + void searchClose(); + +protected slots: + void doubleClickEventHandler(int , int , int, const QPoint& ); //parametrs not used + virtual void updateTableCellHandler(int, int); +signals: + +/*! + * \~english + * Signal emitted after table line update. + * \~russian + * Сигнал испускается после обновлении строки таблицы. + * \~ + */ + void saveLine(QSqlRecord *rec); + +/*! + * \~english + * Signal emitted after table line delete. + * \~russian + * Сигнал испускается после удаления строки таблицы. + * \~ + */ + void deleteLine(QSqlRecord *rec); +/*! + * \~english + * Signal emitted after select another document. + * \~russian + * Сигнал испускается после выбора документа. + * \~ + */ + void selected( qulonglong uid ); +/*! + * \~english + * Signal emitted after change line. + * \~russian + * Сигнал испускается после изменения строки. + * \~ + */ + void selectRecord ( qulonglong ); +/*! + * \~english + * Signal emitted after update cell. + * \~russian + * Сигнал испускается после обновления ячейки с номером \a row, \a col. + * \~ + */ + void updateCurr(int row, int col); +//<<<<<<< wdbtable.h + + //signals from context menu for connecting to wJournal + //if container has another type, then do QDataTable context menu + //and this signal no emitted +//======= + +/*! + * \~english + * signals from context menu for connecting to wJournal + * if container has another type, then do QDataTable context menu + * and this signal no emitted + * \~russian + * Сигналы от контекстного меню для присоединения к wJournal + * Если контейнер другого типа, то вызывается стандартное меню, + * и эти сигналы не испускаются. + * \~ + * \see updateRequest(); deleteRequest(); viewRequest(); + * +*/ +//>>>>>>> 1.45.2.4 + void insertRequest(); +/*! + * \see insertRequest(); +*/ + void updateRequest(); +/*! + * \see insertRequest(); +*/ + void deleteRequest(); +/*! + * \see insertRequest(); +*/ + void viewRequest(); + // end + +private slots: + //void select( Q_ULLONG group ); + void lineChange(int, int); + void lineInsert(QSqlRecord*); + void updateItem( ANANAS_UID db_uid ); + +protected: + virtual void paintField ( QPainter * p, const QSqlField * field, const QRect & cr, bool selected ); + QWidget * beginUpdate ( int row, int col, bool replace ); + virtual bool updateCurrent(); + void contentsContextMenuEvent ( QContextMenuEvent * e ); +// void propertyUpdate(const QString &propName); + virtual bool deleteCurrent(); + //virtual QSql::Confirm confirmEdit ( QSql::Op m ); + virtual void keyPressEvent ( QKeyEvent *e ); + void EditElement(); + virtual void activateNextCell(); + virtual bool beginInsert (); + virtual QSql::Confirm confirmEdit( QSql::Op m ); + +private: + + QPixmap t_doc; + QPixmap t_doc_d; + QPixmap t_doc_t; + QPixmap t_doc_m; + QPixmap t_doc_tm; + QPixmap t_cat_e; + QPixmap t_cat_ed; + QPixmap t_cat_g; + QPixmap t_cat_gd; + + int lastEditedRow; + int lastEditedCol; + + QString container_type; + qulonglong doc_id; + qulonglong cat_group_id; + long journalFieldId(long); + QString journalFieldName(long); + bool inEditMode; + //aDBTablePrivate impl; +// void updateProp(void); + Q3ValueList listBindings; + aCfgItem obj; + QString vName, vEditFormName; + QString vDefineCols; + qulonglong oid; +}; + + +/*! + * \en Class for support custom editor in wDBTable. \_en + * \ru + * \brief Класс для поддержки собственного редактора поля в wDBTable. + * Наследует QSqlEditorFactory. + * \_ru + */ +class aEditorFactory: public Q3SqlEditorFactory +{ +public: +/*! + * \~english Constructor + * \~russian Конструктор \~ + */ + aEditorFactory(QObject * parent = 0, const char * name = 0):Q3SqlEditorFactory(parent/*--,name*/) {}; + QWidget * createEditor (QWidget * parent, const QSqlField * field); + void setMd(aCfg *md); +private: + aCfg * md; +}; +#endif diff --git a/src/plugins/dbtable/wdbtable_plugin.cpp b/src/plugins/dbtable/wdbtable_plugin.cpp new file mode 100644 index 0000000..b13124e --- /dev/null +++ b/src/plugins/dbtable/wdbtable_plugin.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wdbtable_plugin.h" + +#include +#include +#include + +#include "wdbtable_taskmenu.h" +#include "wdbtable.h" + + +wDBTablePlugin::wDBTablePlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wDBTablePlugin::isContainer() const +{ + return false; +} + +bool wDBTablePlugin::isInitialized() const +{ + return m_initialized; +} + +void wDBTablePlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wDBTableTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; +} + +QWidget *wDBTablePlugin::createWidget(QWidget *parent) +{ + wDBTable *w = new wDBTable("", parent, 0); + return w; +} + +QString wDBTablePlugin::name() const +{ + return QLatin1String("wDBTable"); +} + +QString wDBTablePlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wDBTablePlugin::toolTip() const +{ + return QString("Ananas for QT database Table Widget"); +} + +QString wDBTablePlugin::whatsThis() const +{ + return QString("Entry to modify database tables values of Ananas's object"); +} + +QString wDBTablePlugin::includeFile() const +{ + return QLatin1String("wdbtable.h"); +} + +QIcon wDBTablePlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wdbtable.png"); +} + +QString wDBTablePlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/dbtable/wdbtable_plugin.h b/src/plugins/dbtable/wdbtable_plugin.h new file mode 100644 index 0000000..1610911 --- /dev/null +++ b/src/plugins/dbtable/wdbtable_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WDBTABLE_PLUGIN_H +#define WDBTABLE_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wDBTablePlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wDBTablePlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WDBTABLE_PLUGIN_H diff --git a/src/plugins/dbtable/wdbtable_taskmenu.cpp b/src/plugins/dbtable/wdbtable_taskmenu.cpp new file mode 100644 index 0000000..599047a --- /dev/null +++ b/src/plugins/dbtable/wdbtable_taskmenu.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wdbtable_taskmenu.h" +#include "wdbtable.h" +#include "edbtable.h" + + +wDBTableTaskMenu::wDBTableTaskMenu(wDBTable *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wDBTableTaskMenu::edit() +{ + /*eDBTable e; + + m_widget->setAvailableTables(); + m_widget->checkFields(); + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->OpenEditor(); +} + +QAction *wDBTableTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wDBTableTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wDBTableTaskMenuFactory::wDBTableTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wDBTableTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wDBTable *dt = qobject_cast(object)) + return new wDBTableTaskMenu(dt, parent); + + return 0; +} diff --git a/src/plugins/dbtable/wdbtable_taskmenu.h b/src/plugins/dbtable/wdbtable_taskmenu.h new file mode 100644 index 0000000..a08fed9 --- /dev/null +++ b/src/plugins/dbtable/wdbtable_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WDBTABLE_TASKMENU_H +#define WDBTABLE_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wDBTable; + +class wDBTableTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wDBTableTaskMenu(wDBTable *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wDBTable *m_widget; +}; + +class wDBTableTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wDBTableTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WDBTABLE_TASKMENU_H diff --git a/src/plugins/document/document.pri b/src/plugins/document/document.pri new file mode 100644 index 0000000..3bf42d3 --- /dev/null +++ b/src/plugins/document/document.pri @@ -0,0 +1,19 @@ +HEADERS += \ + document/edocument.h \ + document/eselectdoctype.h \ + document/wdocument.h \ + document/wdocument_plugin.h \ + document/wdocument_taskmenu.h + +SOURCES += \ + document/edocument.cpp \ + document/eselectdoctype.cpp \ + document/wdocument.cpp \ + document/wdocument_plugin.cpp \ + document/wdocument_taskmenu.cpp + +FORMS += \ + document/edocument.ui \ + document/eselectdoctype.ui + + \ No newline at end of file diff --git a/src/plugins/document/edocument.cpp b/src/plugins/document/edocument.cpp new file mode 100644 index 0000000..8092766 --- /dev/null +++ b/src/plugins/document/edocument.cpp @@ -0,0 +1,153 @@ +#include "edocument.h" + +#include +#include +#include + +#include "acfg.h" + +/* + * Constructs a eDocument as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eDocument::eDocument(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eDocument::~eDocument() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eDocument::languageChange() +{ + retranslateUi(this); +} + +void eDocument::init() +{ +/* + int oc, i, f, idx=0; + char *id, *name, *ot; + cfg_objptr o; + char otype[100]; + QString named; + + otypes.clear(); + eType->clear(); + otypes.append("D"); + eType->insertItem(trUtf8("Дата"), idx++); + otypes.append("T"); + eType->insertItem(trUtf8("Время"), idx++); + otypes.append("N %d %d"); + eType->insertItem(trUtf8("Число"), idx++); + otypes.append("C %d"); + eType->insertItem(trUtf8("Строка"), idx++); + + oc=cfgobj_count(NULL, NULL); + for (i=1;i<=oc;i++) { + id=cfgobj_idn(NULL, NULL, i, &o); + ot=(char *)o->name; + name=cfgobj_attr(o, "name"); + named=""; + f=0; + if (strcmp((char *)ot, aot_doc)==0) { + named=trUtf8("Документ."); + f=1; + } + if (strcmp((char *)ot, aot_cat)==0) { + named=trUtf8("Справочник."); + f=1; + } + if (f) { + named=named+trUtf8(name); + sprintf(otype, "O %s", id); + otypes.append(otype); + eType->insertItem(named, idx++); + } + } +*/ +} + + + +void eDocument::setData( QWidget *o, aCfg *md ) +{ +// const QObject *o = sender(); + if ( o ) { + if ( o->className() != QString("wDocument") || !md ) { + reject(); + return; + } + } + else { + reject(); + return; + } + wDocument *f = ( wDocument*) o; + int w=0, d=0, idx=0; + unsigned int i; + long oid , id; + + id = f->getId(); + + otypes.clear(); + eType->clear(); + + QStringList tlist = md->types( md_document ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == id ) { + eType->setCurrentItem( i ); + break; + } + } + } +} + + +void eDocument::getData( QWidget *o ) +//aDocument *f ) +{ + QVariant v; +// const QObject *o = sender(); + if ( !o ) return; + if ( o->className() != QString("wDocument") ) return; + wDocument *f = ( wDocument*) o; + + int idx=eType->currentItem(); + int oid = 0; + + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); +// v = oid; + f->setProperty("Id", QVariant( oid ) ); +// f->setId( oid ); + } + } + +} + diff --git a/src/plugins/document/edocument.h b/src/plugins/document/edocument.h new file mode 100644 index 0000000..e60042a --- /dev/null +++ b/src/plugins/document/edocument.h @@ -0,0 +1,27 @@ +#ifndef EDOCUMENT_H +#define EDOCUMENT_H + +#include "ui_edocument.h" + + +class eDocument : public QDialog, public Ui::eDocument +{ + Q_OBJECT + +public: + eDocument(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eDocument(); + + QStringList otypes; + +public slots: + virtual void init(); + virtual void setData( QWidget * o, aCfg * md ); + virtual void getData( QWidget * o ); + +protected slots: + virtual void languageChange(); + +}; + +#endif // EDOCUMENT_H diff --git a/src/plugins/document/edocument.ui b/src/plugins/document/edocument.ui new file mode 100644 index 0000000..c3becf3 --- /dev/null +++ b/src/plugins/document/edocument.ui @@ -0,0 +1,116 @@ + + + + + eDocument + + + + 0 + 0 + 348 + 110 + + + + Document + + + + + + + + + + + + + 100 + 32767 + + + + Type + + + false + + + + + + + + 31 + 16 + + + + Expanding + + + Vertical + + + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + + + 91 + 31 + + + + Expanding + + + Horizontal + + + + + + + qPixmapFromMimeSource + + ananas.h + wdocument.h + + + + bOK + clicked() + eDocument + accept() + + + bCancel + clicked() + eDocument + reject() + + + diff --git a/src/plugins/document/eselectdoctype.cpp b/src/plugins/document/eselectdoctype.cpp new file mode 100644 index 0000000..82f16eb --- /dev/null +++ b/src/plugins/document/eselectdoctype.cpp @@ -0,0 +1,77 @@ +#include "eselectdoctype.h" + +#include +#include +#include + +/* + * Constructs a eSelectDocType as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eSelectDocType::eSelectDocType(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eSelectDocType::~eSelectDocType() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eSelectDocType::languageChange() +{ + retranslateUi(this); +} + +void eSelectDocType::init() +{ + listDocs->header()->hide(); + listDocs->setColumnWidth( 0, 1000 ); + listDocs->setFocus(); +} + + +void eSelectDocType::setJournal( aCfg *md, int id ) +{ + aCfgItem obj, dobj; + int i, cnt, t, did; + QString name; + + listDocs->clear(); + dlist.clear(); + obj = md->find( id ); + if ( !obj.isNull() ) { + dlist = md->getJournalDocuments( obj ); +// printf("docs=%s\n", ( const char *) dlist.join("\n") ); + for (i=0;i< dlist.count();i++) { + did = dlist[i].toInt(); + dobj = md->find( did ); + if ( !dobj.isNull() ) { + name = md->attr( dobj, mda_name ); + new Q3ListViewItem( listDocs, name, dlist[i] ); + } + } + listDocs->setSelected( listDocs->firstChild(), true ); + } +} + + +void eSelectDocType::accepted() +{ + docId = listDocs->selectedItem()->text(1).toInt(); + // printf("docId=%i\n", docId ); + accept(); +} diff --git a/src/plugins/document/eselectdoctype.h b/src/plugins/document/eselectdoctype.h new file mode 100644 index 0000000..936ab86 --- /dev/null +++ b/src/plugins/document/eselectdoctype.h @@ -0,0 +1,28 @@ +#ifndef ESELECTDOCTYPE_H +#define ESELECTDOCTYPE_H + +#include "ui_eselectdoctype.h" + + +class eSelectDocType : public QDialog, public Ui::eSelectDocType +{ + Q_OBJECT + +public: + eSelectDocType(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eSelectDocType(); + + QStringList dlist; + int docId; + +public slots: + virtual void init(); + virtual void setJournal( aCfg * md, int id ); + virtual void accepted(); + +protected slots: + virtual void languageChange(); + +}; + +#endif // ESELECTDOCTYPE_H diff --git a/src/plugins/document/eselectdoctype.ui b/src/plugins/document/eselectdoctype.ui new file mode 100644 index 0000000..662f149 --- /dev/null +++ b/src/plugins/document/eselectdoctype.ui @@ -0,0 +1,102 @@ + + + + + eSelectDocType + + + + 0 + 0 + 304 + 272 + + + + Select document type + + + + + + Cancel + + + + + + + OK + + + true + + + + + + + Q3ScrollView::AlwaysOff + + + + Document type + + + true + + + true + + + + + ID + + + true + + + true + + + + + + + + + 21 + 171 + + + + Expanding + + + Vertical + + + + + + + qPixmapFromMimeSource + + ananas.h + + + + bOK + clicked() + eSelectDocType + accepted() + + + bCancel + clicked() + eSelectDocType + reject() + + + diff --git a/src/plugins/document/wdocument.cpp b/src/plugins/document/wdocument.cpp new file mode 100644 index 0000000..a3f82c9 --- /dev/null +++ b/src/plugins/document/wdocument.cpp @@ -0,0 +1,420 @@ +/**************************************************************************** +** $Id: wdocument.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Code file of the document plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +//--#include +#include "adatabase.h" +#include "adocument.h" +#include "asqltable.h" +#include "wdocument.h" +#include "edocument.h" +#include "wdbfield.h" +#include "wdbtable.h" +#include "wactionbutton.h" +#include "alog.h" + + +/*! + *\~english + * Create wDocument object. + *\~russian + * Создает объект wDocument. + *\~ + *\param - \~english \~russian \~ + *\param - \~english \~russian \~ + */ +wDocument::wDocument( QWidget *parent, Qt::WFlags fl ) +:aWidget( parent, "wDocument", fl ) +{ + setInited( false ); +} + + + +/*! + *\~english + * Destructor for object. + *\~russian + * Деструктор. + *\~ + */ +wDocument::~wDocument() +{ + +} + + + +/*! + *\~english + * Create aDocument database object. + *\~russian + * Создает объект aDocument для работы с базой. + *\~ + *\param - \~english \~russian \~ + *\param - \~english \~russian \~ + *\return \~english \~russian \~ + */ +aObject * +wDocument::createDBObject( aCfgItem obj, aDatabase *adb ) +{ + return new aDocument( obj, adb ); +} + + + +/*! + *\~english + *\~russian + *\~ + *\param - \~english \~russian \~ + */ +void +wDocument::initObject( aDatabase *adb ) +{ + aWidget::initObject( adb ); + QObject *obj; + QObjectList lb = this->queryList( "wDBField" ); + QListIterator itb( lb ); // iterate over the buttons + while ( itb.hasNext() ) + { + obj = itb.next(); +// if ( (wActionButtton*) obj )->isActionUpdate() ) + connect( (wDBField *)obj, SIGNAL(valueChanged( const QVariant & )), + this, SLOT(valueChanged( const QVariant & )) ); + } + //--delete lb; // delete the list, not the objects + lb = this->queryList( "wDBTable" ); + QListIterator itb1( lb ); // iterate over the buttons + while ( itb1.hasNext() ) + { + obj = itb1.next(); +// if ( (wActionButtton*) obj )->isActionUpdate() ) + connect( this, SIGNAL(changeObj(const QString &)), + (wDBTable *)obj, SLOT(newFilter(const QString &))); + connect( this, SIGNAL(changeObjId(const qulonglong)), + (wDBTable *)obj, SLOT(newDataId(const qulonglong))); + } + //--delete lb; // delete the list, not the objects + //--focusData()->next()->setFocus(); + focusNextChild(); +} + + + +/*! + *\~english + *\~russian + *\~ + *\return \~english \~russian \~ + */ +bool +wDocument::checkStructure() +{ + return false; +} + + + +/*! + *\~english + *\~russian + *\~ + *\param - \~english \~russian \~ + *\return \~english \~russian \~ + */ +QDialog* +wDocument::createEditor( QWidget *parent ) +{ + return new eDocument( parent ); +} + + + +/*! + *\~english + *\~russian + *\~ + *\param - \~english \~russian \~ + *\return \~english \~russian \~ + */ +int +wDocument::select( qulonglong id ) +{ + id=id; + return 0; +} + + + +/*! + *\~english + * Select object in database. + *\~russian + * Выбирает объект в базе данных. + *\~ + *\param id -\~english database record id.\~russian id объекта в базе данных.\~ + *\return id -\~english error code.\~russian код ошибки.\~ + */ +ERR_Code +wDocument::Select( qulonglong id ) +{ + ERR_Code err = aWidget::Select ( id ); +/* if ( err ) + { + printf( "select document error %i\n", err ); + return err; + } +*/ NewValues(); + emit( changeObj(QString("idd=%1").arg(id))); + emit( changeObjId(id)); + return err_noerror; +} + + +/*! + *\~english + *\~russian + *\~ + *\param - \~english \~russian \~ + *\return \~english \~russian \~ + */ +qulonglong +wDocument::Insert() +{ + return 0; +} + + + +/*! + *\~english + * Update values in database. + * Udate values in current document header. + *\~russian + * Обновляет значения в базе данных. + * Обновляет значения в текущей шапке документа. + *\~ + *\return \~english error code.\~russian код ошибки.\~ + */ +int +wDocument::Update() +{ + if ( dbobj ) { + return dbobj->Update(); + NewValues(); + } + else return err_abstractobj; +} + + + +/*! + *\~english + *\~russian + *\~ + *\param - \~english \~russian \~ + *\return \~english \~russian \~ + */ +int +wDocument::MarkDelete() +{ + return 0; +} + + + +/*! + *\~english + *\~russian + *\~ + *\return \~english \~russian \~ + */ +QString +wDocument::displayString() +{ + return""; +} + + + +/*! + *\~english + *\~russian + *\~ + *\return \~english \~russian \~ + */ +bool +wDocument::isContainer() +{ + return true; +} + + + +/*! + *\~english + *\~russian + *\~ + *\return \~english \~russian \~ + */ +int +wDocument::New() +{ + ERR_Code err = aWidget::New(); + qulonglong idd; + if ( err ) return err; + NewValues(); + idd = uid(); +// printf("<<<<<<<<<<<<<<Conduct(); +} +/*! + *\~english + * UnConduct current docment. + *\~russian + * Распроводит текущий документ. + *\~ + *\return \~english error code.\~russian код ошибки.\~ + */ +int +wDocument::TurnOff() +{ + if (!dbobj) return err_abstractobj; + else return dbobj->UnConduct(); +} + + + +/*! + *\~english + * Set fields values from database. + * Used for insert values into fields when create or open document. + *\~russian + * Устанавливает значения виджетов (кроме таблиц). + * Устанавливает значения виджетов (полей экранной формы таких как поля шапки документа) + * равными значениям из базы данных. + * Используется для при открытии формы, смене документа, обновлении значений виджетов документа. + *\~ + */ +void +wDocument::NewValues() +{ + QString fname; + QObjectList l = this->queryList( "wDBField" ); + QListIterator it( l ); + QObject *obj; + while ( it.hasNext() ) + { + obj = it.next(); + fname=((wDBField *)obj)->getFieldName(); + ((wDBField *)obj)->setValue(dbobj->Value(fname).toString()); + aLog::print(aLog::Debug, tr("wDocument set new value %1 for field %2 ").arg(dbobj->Value(fname).toString()).arg(fname)); + } + //--delete l; // delete the list, not the objects +} + + + +/*! + *\~english + * Processed field value changed. + * Conected on signal valueChanged( const QVariant & ) for all + * wDBField insert in the widget. + * Decode field name and set new field value in database object. + * Emit signal value change with field name and value. + * Signal connectaed on aform slot, for future work. + *\~russian + * Обрабатывает изменение значения поля + * Присоединяется к сигналу valueChanged( const QVariant & ), + * всех полей типа wDBField, вставленных в виджет. + * Декодирует имя поля и сохраняет его новое значение в объекте для + * работы с базой. + * Посылает сигнал об изменении значения, который содержит имя поля + * и его новое значение. + * Сигнал присоединяется к слоту формы для последующей обработки. + *\~ + *\param value - \~english new field value. \~russian новое значение поля. \~ + */ +void +wDocument::valueChanged( const QVariant & value ) +{ + if ( sender()->className() != QString("wDBField") ) return; + wDBField * fld = ( wDBField * ) sender(); + QString fname=fld->getFieldName(); +// printf( "field name %s\n",(const char*)fname ); + if ( dbobj ) dbobj->SetValue( fname, value ); + emit aWidget::valueChanged( fname, value ); +} + +/*void +wDocument::on_abuttonclick() +{ + wActionButton *b = ( wActionButton *) sender(); + if ( !b ) return; + if ( !b->isAction() ) return; + if ( b->isActionUpdate() ) + { + QString fname; + QObjectList *l = this->queryList( "wDBField" ); + QObjectListIt it( *l ); + QObject *obj; + uint i = 0; + while ( (obj = it.current()) != 0 ) + { + ++it; + fname=((wDBField *)obj)->getFieldName(); + dbobj->SetValue(fname,((wDBField *)obj)->value()); + } + update(); + } + if ( b->isActionTurnOn() ) Conduct(); +}*/ + diff --git a/src/plugins/document/wdocument.h b/src/plugins/document/wdocument.h new file mode 100644 index 0000000..06920e9 --- /dev/null +++ b/src/plugins/document/wdocument.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** $Id: wdocument.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the document plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WDOCUMENT_H +#define WDOCUMENT_H +#include +#include +#include "awidget.h" + +class aDatabase; + + + +/*! + *\~english + * Visual object for work with documents. + *\~russian + * \brief Визуальный объект - контейнер для работы с документами. + * Наследует aWidget. + */ +class QT_WIDGET_PLUGIN_EXPORT wDocument : public aWidget +{ + Q_OBJECT +public: + wDocument( QWidget *parent = 0, Qt::WFlags fl = 0 ); + virtual ~wDocument(); + bool checkStructure(); + virtual void initObject( aDatabase *adb ); + virtual QDialog* createEditor( QWidget *parent ); + virtual QString displayString(); + virtual bool isContainer(); + virtual aObject *createDBObject( aCfgItem obj, aDatabase *adb ); + + virtual ERR_Code New(); + virtual ERR_Code Select( qulonglong id ); + +public slots: + int select( qulonglong id ); + qulonglong Insert(); + virtual int Update(); + virtual int TurnOn(); + virtual int TurnOff(); + int MarkDelete(); +// void on_abuttonclick(); + +//signals: +// void valueChanged( const QString &, const QVariant & ); + +private slots: + virtual void valueChanged( const QVariant & ); + +private: + void NewValues(); +}; + + +#endif // WDOCUMENT_H diff --git a/src/plugins/document/wdocument_plugin.cpp b/src/plugins/document/wdocument_plugin.cpp new file mode 100644 index 0000000..ecec7e4 --- /dev/null +++ b/src/plugins/document/wdocument_plugin.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wdocument_plugin.h" + +#include +#include +#include + +#include "wdocument_taskmenu.h" +#include "wdocument.h" + + +wDocumentPlugin::wDocumentPlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wDocumentPlugin::isContainer() const +{ + return true; +} + +bool wDocumentPlugin::isInitialized() const +{ + return m_initialized; +} + +void wDocumentPlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wDocumentTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; +} + +QWidget *wDocumentPlugin::createWidget(QWidget *parent) +{ + wDocument *w = new wDocument(parent, 0); + return w; +} + +QString wDocumentPlugin::name() const +{ + return QLatin1String("wDocument"); +} + +QString wDocumentPlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wDocumentPlugin::toolTip() const +{ + return QString(); +} + +QString wDocumentPlugin::whatsThis() const +{ + return QString(); +} + +QString wDocumentPlugin::includeFile() const +{ + return QLatin1String("wdocument.h"); +} + +QIcon wDocumentPlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wdocument.png"); +} + +QString wDocumentPlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/document/wdocument_plugin.h b/src/plugins/document/wdocument_plugin.h new file mode 100644 index 0000000..2028630 --- /dev/null +++ b/src/plugins/document/wdocument_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WDOCUMENT_PLUGIN_H +#define WDOCUMENT_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wDocumentPlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wDocumentPlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WDOCUMENT_PLUGIN_H diff --git a/src/plugins/document/wdocument_taskmenu.cpp b/src/plugins/document/wdocument_taskmenu.cpp new file mode 100644 index 0000000..6856cef --- /dev/null +++ b/src/plugins/document/wdocument_taskmenu.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wdocument_taskmenu.h" +#include "wdocument.h" +#include "edocument.h" + + +wDocumentTaskMenu::wDocumentTaskMenu(wDocument *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wDocumentTaskMenu::edit() +{ + /*eDocument e; + + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->widgetEditor(); +} + +QAction *wDocumentTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wDocumentTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wDocumentTaskMenuFactory::wDocumentTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wDocumentTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wDocument *dt = qobject_cast(object)) + return new wDocumentTaskMenu(dt, parent); + + return 0; +} diff --git a/src/plugins/document/wdocument_taskmenu.h b/src/plugins/document/wdocument_taskmenu.h new file mode 100644 index 0000000..44c190c --- /dev/null +++ b/src/plugins/document/wdocument_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WDOCUMENT_TASKMENU_H +#define WDOCUMENT_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wDocument; + +class wDocumentTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wDocumentTaskMenu(wDocument *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wDocument *m_widget; +}; + +class wDocumentTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wDocumentTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WDOCUMENT_TASKMENU_H diff --git a/src/plugins/eaddobj.cpp b/src/plugins/eaddobj.cpp new file mode 100644 index 0000000..76f7a9d --- /dev/null +++ b/src/plugins/eaddobj.cpp @@ -0,0 +1,48 @@ +#include "eaddobj.h" + +#include +#include +#include + +/* + * Constructs a eAddObj as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + */ +eAddObj::eAddObj(QWidget* parent, const char* name, Qt::WindowFlags fl) + : Q3MainWindow(parent, name, fl) +{ + setupUi(this); + + (void)statusBar(); + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eAddObj::~eAddObj() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eAddObj::languageChange() +{ + retranslateUi(this); +} + +void +eAddObj::init() +{ +} + +void +eAddObj::destroy() +{ +} + diff --git a/src/plugins/eaddobj.h b/src/plugins/eaddobj.h new file mode 100644 index 0000000..b38556e --- /dev/null +++ b/src/plugins/eaddobj.h @@ -0,0 +1,24 @@ +#ifndef EADDOBJ_H +#define EADDOBJ_H + +#include "ui_eaddobj.h" + + +class eAddObj : public Q3MainWindow, public Ui::eAddObj +{ + Q_OBJECT + +public: + eAddObj(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); + ~eAddObj(); + +protected slots: + virtual void languageChange(); + +private: + void init(); + void destroy(); + +}; + +#endif // EADDOBJ_H diff --git a/src/plugins/eaddobj.ui b/src/plugins/eaddobj.ui new file mode 100644 index 0000000..22e890a --- /dev/null +++ b/src/plugins/eaddobj.ui @@ -0,0 +1,39 @@ + + + + + eAddObj + + + + 0 + 0 + 417 + 297 + + + + Form1 + + + + + + + 0 + + + 0 + + + + + + + + qPixmapFromMimeSource + + adocument.h + acatalogue.h + + diff --git a/src/plugins/engine.cpp b/src/plugins/engine.cpp new file mode 100644 index 0000000..2c163f9 --- /dev/null +++ b/src/plugins/engine.cpp @@ -0,0 +1,874 @@ +/**************************************************************************** +** $Id: engine.cpp,v 1.4 2008/12/10 21:04:56 leader Exp $ +** +** Code file of the Ananas Engine of Ananas +** Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//--#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include + +#include "ananas.h" +#include "wcatalogeditor.h" +#include "adatafield.h" +#include "alog.h" +#include "acombobox.h" + +/*! + * \~english + * Constructor + * \~russian + * Конструктор. Регистрирует следующие типу объектов для использования их в Ананас.Скрипте + * \arg \c PopupMenu всплывающее меню + * \arg \c Document документ + * \arg \c Catalogue каталог + * \arg \c CatalogueEditor редактор каталога + * \arg \c Report отчет + * \arg \c ARegister накопительный регистр + * \arg \c DataField поле (не работает) + * \arg \c Journal журнал + * \arg \c ATime объект для работы со временем + * \~ + */ +aObjectsFactory::aObjectsFactory( aEngine *e ) +{ + engine = e; + if ( ! engine ) return; + db = e->db; + if ( ! db ) return; + + + registerClass("MetaObject",&AMetaObject::staticMetaObject); + registerClass("MetaObjectGroup",&AMetaObjectGroup::staticMetaObject); + registerClass("DocumentsGroup",&ADocumentsGroup::staticMetaObject); + registerClass("CataloguesGroup",&ACataloguesGroup::staticMetaObject); + registerClass("MetaDataInfo",&AMetaDataInfo::staticMetaObject); + registerClass("MetaDataGlobal",&AMetaDataGlobal::staticMetaObject); + + + registerClass("PopupMenu",&Q3PopupMenu::staticMetaObject); +// registerClass("PopupMenu","QApopupmenu"); + registerClass("Document",&aDocument::staticMetaObject); + registerClass("Catalogue",&aCatalogue::staticMetaObject); + registerClass("CatalogEditor",&wCatalogEditor::staticMetaObject); + registerClass("Report",&aReport::staticMetaObject); + registerClass("ARegister",&aARegister::staticMetaObject); + registerClass("IRegister",&aIRegister::staticMetaObject); + registerClass("ATime",&aTime::staticMetaObject); + registerClass("DataField",&aDataField::staticMetaObject); +// registerClass("reg","QAreg"); + registerClass("Journal",&aDocJournal::staticMetaObject); + registerClass("ComboBox",&AComboBox::staticMetaObject); +//registerClass("djournalview","QAjournview"); +// registerClass("djournalview","QAdocjournal"); +// registerClass("form","AForms"); +// registerClass("report","QAreport"); +// registerClass("table","QAnanasTable"); + +//Register extensions classes + QStringList extlist = AExtensionFactory::keys(); + for ( int i=0; i0) { + res = new aDocument(arguments[0].toString(), db ); + } + }else if (className=="Catalogue") { + if (arguments.size()>0) { + res = new aCatalogue( arguments[0].toString(), db ); + } + }else if ( className=="Report" ) { + if ( arguments.size()>0 ) + { + if(arguments.size()==2) { + res = new aReport( arguments[0].toString(),(aReport::RT_type)arguments[1].toInt(), engine ); + }else{ + res = new aReport( arguments[0].toString(),aReport::RT_text, engine ); + } + } + }else if (className =="CatalogEditor") { + if (arguments.size()>0) { + aCfgItem it; + it = db->cfg.find(QString("Catalogue.%1").arg(arguments[0].toString())); + if(!it.isNull()) { + wCatalogEditor * w = new wCatalogEditor(engine->ws,db->cfg.id(it)); + w->initCat(db); + res = w; + } + } + }else if (className == "ARegister") { + if (arguments.size() > 0) { + res = new aARegister(arguments[0].toString(), db); + } + + }else if (className == "IRegister") { + if (arguments.size() > 0) { + res = new aIRegister(arguments[0].toString(), db); + } + + } else if (className == "Journal") { + if (arguments.size() > 0) { + res = new aDocJournal(arguments[0].toString(), db); + } + + } else if (className == "ATime") { + res = new aTime(); + } else if (className == "DataField") { + res = new aDataField(); + } else if ( AExtensionFactory::keys().contains( className )) { +// printf("create extension object %s\n",(const char*) className); + AExtension *obj = AExtensionFactory::create( className ); + // Insert check existence signal in future!!!! + QObject::connect( obj, SIGNAL(event(const QString&)), + engine, SLOT( on_event(const QString&))); + obj->init(db); + res = obj; + } else if ( className == "ComboBox" ) { + if (arguments.size() == 1) { + res = new AComboBox( 0, arguments[0].toString()); + } else { + res = new AComboBox(); + } + } + if(!res) aLog::print(aLog::Error,QObject::tr("Unknown classname '%1' or metaobject '%2'").arg(className).arg(arguments[0].toString())); + return res; +} + + + +/*! + *\en + * Constructor. + *\_en + *\ru + * Конструктор. Создает новый объект с именем "sys". Доступ к функциям этого объекта из Ананас.Скрипта возможен примерно так: + * \code + * sys.Date(); // текущая дата + * sys.OpenForm("DocJournal.Системный журнал.Form.Список документов"); // открывает форму "Список Документов" журнала "Системный журнал" + * \endcode + *\_ru + */ +aEngine::aEngine():QObject(0,"sys") +{ + md = 0; + next_obj_id = 1; + db = aDatabase::database(); +} + + + +/*! + *\en + * Destructor + *\_en \ru + * Деструктор. + *\_ru + */ +aEngine::~aEngine() +{ + values.clear(); +// delete project; +} + + + +/*! + * \~english + * Init engine. + * Init script subsystem, load global module. + * \~russian + * Инициализирует объект. Инициализирует скриптовую систему, добавляет несколько глобальных функций. + * \~ + */ +bool +aEngine::init( const QString &rcfile ) +{ +// QString mGlobal; + aCfgItem gobj, obj, obj0; + QString sysf = +// "function Message( t, msg ){ sys.Message( t, msg );}" +// "function StatusMessage( msg ){ sys.StatusMessage( msg );}" +// "function Date(){ return sys.Date();}" +// "function Time(){ return sys.Time();}" +// "function Exit(){ return sys.Exit();}" + ""; + + bool ok = false; + if ( db->init( rcfile ) ) { + md = &db->cfg; + code = project.interpreter(); +// code->setErrorMode(QSInterpreter::Notify); + code->setErrorMode(QSInterpreter::Nothing); + connect(code, SIGNAL( error ( const QString &, QObject *, const QString &, int )), + this, SLOT ( error ( const QString &, QObject *, const QString &, int ))); + code->addObjectFactory( new QSInputDialogFactory ); + code->addObjectFactory( new aObjectsFactory( this ) ); + code->addObjectFactory( new QSUtilFactory ); + project.addObject( this ); + project.addObject( md ); + project.addObject( AMetaData::metadata() ); + mGlobal = md->sText( md->find( md->find( mdc_metadata ), md_globals, 0 ), md_sourcecode ); + if ( ! mGlobal.isEmpty() ) { +// project.createScript("global", mGlobal); +// project.createScript(this, mGlobal ); +// project.createScript( "globalmodule", sysf ); +// project.createScript( this, sourcePreprocessor(mGlobal)); + project.createScript( "globalmodule", sysf+sourcePreprocessor(mGlobal)); +// code->evaluate(sourcePreprocessor(mGlobal)); + } else { +// printf("Global module is empty\n"); + } + } else return false; + return true; +} + + + +/*! + *\en + *\_en \ru + * Заглушка. + *\_ru + */ +void +aEngine::done() +{ + +} + + + +/*! + *\en + * Called on system start. + *\_en \ru + * Автоматически вызывается при старте системы. Если в глобальном модуле определа функция on_systemstart() + * то она будет автоматически вызвана. + * Это можно использовать для открытия документов или журналов при старте системы, или каких-либо других действий. + * \see on_systemstop() + *\_ru + */ +int +aEngine::on_systemstart(){ + + if (project.interpreter()->functions().findIndex("on_systemstart")!=-1) { + project.interpreter()->call("on_systemstart",QVariantList()); + } + return 0; +} + + +void +aEngine::on_event( const QString &data ) +{ + Q3ValueList lst; + lst << sender()->name(); + lst << data; + if (project.interpreter()->functions().findIndex("on_event")!=-1) { + project.interpreter()->call("on_event", QVariantList(lst)); + } + emit event( sender()->name(), data ); +} + + + +/*! + *\en + * Called on system stop. + *\_en \ru + * Автоматически вызывается при остановке системы. + * Если в глобальном модуле определа функция on_systemstop() + * то она будет автоматически вызвана. + * \see on_systemstart() + *\_ru + */ +int +aEngine::on_systemstop(){ + if (project.interpreter()->functions().findIndex("on_systemstop")!=-1) { + project.interpreter()->call("on_systemstop",QVariantList()); + } + return 0; +} + + + +/*! + *\en + * Stub. + *\_en \ru + * Заглушка. + *\_ru + */ +void +aEngine::timerEvent(QTimerEvent *e) +{ + e=e; // +// project->interpreter()->evaluate(pr_timer, this); +} + + + +/*! + *\en + * Stub. + *\_en \ru + * Заглушка. Возвращает всегда строку "???" + * В будущем возможно будет возвращать имя конфигурации. + *\_ru + */ +QString +aEngine::cfgname() { + return "???"; //cfg_info("name"); +} + + + +/*! + *\en + *\_en \ru + * Возвращает строковое представление текущего времени в формате "hh:mm:ss" + *\_ru + */ +QString +aEngine::Time() { + return QTime::currentTime().toString("hh:mm:ss"); +} + + + +/*! + *\en + *\_en \ru + * Возвращает строковое представление текущей даты в формате "dd.MM.yy" + *\_ru + */ +QString +aEngine::Date() { + return QDate::currentDate().toString("dd.MM.yy"); +} + + +void +aEngine::Exit() { + qApp->quit(); +} + +/*! + * \~english + * Outputs messages. + * \~russian + * Вывод сообщений. + * \param n - тип сообщения. 0 - уведомление, 1 - предупреждение, 2 - ошибка. + * \param msg - текст сообщения. + * \~ + * \see cfg_message(int msgtype, const char *msgfmt,...) + */ +void +aEngine::Message(int n, const QString &msg) +{ + cfg_message(n, (const char *) msg.utf8()); +} + + + +/*! + *\en + * Outputs status messages. + *\_en \ru + * Вывод сообщений в строке состояния. + * \param msg - текст сообщения. + *\_ru + */ +void +aEngine::StatusMessage( const QString &msg ) +{ + emit statusMessage( msg ); +} + + + +/*! + *\en + *\_en \ru + *\_ru + */ +void +aEngine::settimer(int sec, QString proc){ + // TODO Need id timer - get from startTimer + //--killTimers(); + if (sec) { + pr_timer=proc; + startTimer(sec*1000); + } else { + pr_timer=""; + } +} + + + +/*! + *\en + *\_en \ru + * Запускает действие + * \param id - идентификатор действия в метаданных. + *\_ru + */ +void +aEngine::on_MenuBar( int id ) +{ + aCfgItem obj, act; + int actions, i; + +// printf("menu %i selected\n", id); + if ( id>0 ) { + obj = md->find( id ); + if ( !obj.isNull() ) { + actions = md->count( obj, md_comaction ); +// printf("obj found %i actions\n", actions); + for ( i=0; ifindChild( obj, md_comaction, i ); + act = md->find( md->text( act ).toLong() ); + execAction( act ); + } + } + } +} + + + +/*! + *\en + *\_en \ru + * Вспомогательный метод. + * Запускает действие в указанном контексте. Правильная работа не гарантируется (где-то там ошибки есть). + * \param act - ссылка на объект метаданных, описывающий действие + * \param context - контекст выполнения действия. + *\_ru + */ +void aEngine::execAction( aCfgItem &act, QObject *context ) +{ + QString aModule, arg; + int atype, satype; + long oid, foid; + //aForm *form; + aCfgItem gobj, obj; + + if ( ! act.isNull() ) { + atype = md->attr( act, mda_type ).toInt(); +// printf("atype=%i\n",atype); + switch ( atype ){ + case 0: + satype = md->sText( act, md_actiontype ).toInt(); + oid = md->sText( act, md_objectid ).toLong(); + foid = md->sText( act, md_formid ).toLong(); + arg = md->sText( act, md_argument ); +// printf("satype=%d, oid=%d,foid=%d,arg=%s",satype,oid,foid,arg.ascii()); + gobj = md->find( oid ); + if ( foid == 0 ) + { + foid = md->getDefaultFormId( gobj, satype ); + break; + } + if ( foid == 1 ) + { + openEmbedCatalogueEditor(oid, NULL, false); //open to edit + break; + } + + openForm(oid, foid, satype, 0, 0, 0 ); + break; +/* if ( !arg.isEmpty() ) { + obj = md->findName( md->find( gobj, md_forms ), md_form, arg ); + foid = md->id( obj ); +// if ( !obj.isNull() ) printf("form found\n"); +// else printf("! not found %s\n", (const char *) arg ); + }*/ + /* + if ( wl->find( foid ) ) + { + printf("form already exist,set focus \n"); + wl->get( foid )->setFocus(); + } + else + { + printf("execute action\n"); + if ( oid ) + switch ( satype ) + { + case md_action_new://create new + printf("create new\n"); + form = new aForm( ws, this, foid ); +// form->init(); + form->New(); + form->show(); + break; + case md_action_view://view + printf("view\n"); + form = new aForm( ws, this, foid ); + //form->init(); + form->show(); + break; + } + } + break; + */ + case 1: + aModule = md->sText( act, md_sourcecode ); + if ( !aModule.isEmpty() ) { + code->evaluate( sourcePreprocessor(aModule), context, md->attr( act, mda_name ) ); + } + break; + case 2: + break; + } +// printf("executed %s\n", ( const char *) md->attr( act, mda_name ).local8Bit() ); + } +} + + + +/*! + *\~english + * Create and open new form. + *\~russian + * Создает и открывает новую форму. + * Форма создается с учетом её id в конфигураци и действия, + * режима работы (просмотр, редактирование, создание нового объекта). + * Форма должна поддерживать тот режим, для которого она открывается. + * Если форма открыта для просмотра она открывается в режиме отлько чтение. + * Если id формы равно 0, делается попытка найти первую форму с + * требуемым режимом. + *\~ + *\param oid - \~english form owner md id,\~russian id владельца формы в конфигурации,\~ + *\param fid - \~english form md id, \~russian id формы в конфигурации\~ + *\param mode - \~english form use mode, \~russian режим работы формы\~ + *\param ido - \~english database id of opening object\~russian идентификатор объекта в базе данных, для которого открывается форма.\~ + *\return \~english link on new form or 0 if form not created. + \~russian ссылку на новую форму или 0, если форма не создана.\~ + */ +aForm* +aEngine::OpenForm(QString fname, int mode, aObject* selecter)//Q_ULLONG ido) +{ + aCfgItem object, form; + + form = md->find(fname); + if(!form.isNull()) + { + object = md->parent(md->parent(form)); + if(object.isNull()) return 0; + qulonglong ido =0; + if(selecter) ido = selecter->sysValue("id").toULongLong(); + return openForm(atoi(md->attr(object,mda_id)), atoi(md->attr(form,mda_id)), mode, mode, ido); + } + else + { + return 0; + } +} + + + +/*! + *\~english + * Create and open new form. + *\~russian + * Создает и открывает новую форму. + * Форма создается с учетом её id в конфигураци и действия, + * режима работы (просмотр, редактирование, создание нового объекта). + * Форма должна поддерживать тот режим, для которого она открывается. + * Если форма открыта для просмотра она открывается в режиме отлько чтение. + * Если id формы равно 0, делается попытка найти первую форму с + * требуемым режимом. + * При необходимости поля формы заполняются в соответствии с параметром \a id + *\~ + *\param oid - \~english form owner md id,\~russian id владельца формы в конфигурации,\~ + *\param fid - \~english form md id, \~russian id формы в конфигурации,\~ + *\param defaultfor - \~english form use mode, \~russian режим работы формы,\~ + *\param mode - \~english not use yet\~russian пока не используется,\~ + *\param id - \~english database id of opening object\~russian идентификатор объекта в базе данных, для которого открывается форма. Используется только в режиме просмотра или редактирования.\~ + *\param caller - \~english caller widget\~russian Вызывающий данную функцию объект. Он будет обновлен автоматически при закрытии формы. \~ + *\return \~english link on new form or 0 if form not created. + \~russian ссылку на новую форму или 0, если форма не создана.\~ + */ +aForm * +aEngine::openForm(int oid, int fid, int defaultfor, int mode, ANANAS_UID id, aWidget* caller ) +{ + aForm *form = 0; + if ( fid == 0 ) + { + fid = md->getDefaultFormId( md->find( oid ), defaultfor, mode ); + } + //printf("engine:try found %d %llu in wl\n", fid, id); + if ( wl->find( fid, id ) ) + { + //printf("foubd!, set focus\n"); + wl->get( fid, id )->setFocus(); + } + else { + //printf("not found!\n"); + aLog::print(aLog::Info,tr("aEngine open form %1 in mode %2, select %3").arg(fid).arg(mode).arg(id)); + if ( oid ) { + switch ( defaultfor ) { + case md_action_new://create new + form = new aForm( ws, this, fid, caller ); + if(form) + { + form->setMode(0); + form->New(); + } + else + { + aLog::print(aLog::Error,tr("aEngine form create error")); + } + //printf("open new form\n"); + break; + case md_action_view://view + form = new aForm( ws, this, fid, caller ); + if(form) + { + form->setMode(1); + form->SetReadOnly(true); + form->Select( id ); + } + else + { + aLog::print(aLog::Error,tr("aEngine form create error")); + } + //printf(" open form for view %llu\n",id); + break; + case md_action_edit: + form = new aForm( ws, this, fid, caller ); + if(form) + { + form->setMode(2); + form->Select( id ); + } + else + { + aLog::print(aLog::Error,tr("aEngine form create error")); + } + //printf("open form for edit %llu\n ",id); + break; + default: + aLog::print(aLog::Error, tr("aEngine open form mode %1 not supported").arg(defaultfor)); + } + connect( this, SIGNAL( event(const QString &, const QString&)), + form, SLOT( on_event(const QString &, const QString&))); + } + } + if(form && caller) + { + connect(form,SIGNAL(changedData()),caller,SLOT(Refresh())); + } +// printf("before clear\n"); +// this->project.interpreter()->clear(); + if ( form ) form->show(); +// printf("end open form\n"); + return form; +} + + + +/*! + *\~english + * Create and open new embedded catalog editor form. + *\~russian + * Создает и открывает новую форму встроенного редактора каталога. + *\~ + *\param oid - \~english catalogue md id,\~russian id каталога конфигурации,\~ + *\param parent - \~english parent wField object, \~russian родительский объект wField\~ + *\param toSelect - \~english Mode. true - for select, false - for edit\~russian Режим. true - выбор, false - редактирование\~ + */ +void +aEngine::openEmbedCatalogueEditor(int oid, QWidget* parent,const bool toSelect) +{ + wCatalogEditor * w = new wCatalogEditor(ws,oid); + if( parent ) + { + connect(w, SIGNAL(selected( qulonglong )), + (wField*)parent,SLOT(on_selected( qulonglong ))); + connect(w, SIGNAL(destroyed_form()), + (wField*)parent,SLOT(setFocus())); + } + + w->initCat(db); + if(toSelect) + { + w->select(); + } + else + { + w->edit(); + } +} + + + +/*! + *\en + *\_en \ru + * Печатает сообщение об ощибке. + *\_ru + */ +void +aEngine::error ( const QString & message, QObject * context, const QString & scriptName, int lineNumber ) +{ + Message( 2, tr("Line:%1 Message:%2 Stack:(%3)").arg(lineNumber).arg(message).arg(code->stackTraceString()) ); +} + + + +/*! + *\en + *\_en \ru + * Функция препроцессора исходного текста скрипта. + * Для разработчиков: + * В первую очередь может быть использована для замены коротких + * имен из локального контекста на квалифицированные имена + * глобальных функций и объектов, например Message() в контексте + * формы может заменяться на global.Message() перед выполнением скрипта + * и выполняться корректно из любого места. + * В противном случае приходится дублировать глобальные + * встроенные функции во всех контекстах. + *\_ru + */ +QString +aEngine::sourcePreprocessor( const QString &src ) +{ + QString psrc = src; + // Global functions preprocessing +// psrc.replace( "Message(", "global.Message("); +// psrc.replace( "Statusglobal.Message(", "global.StatusMessage("); +// psrc.replace( "Date(", "global.Date("); +// psrc.replace( "Time(", "global.Time("); + // Russian key words +// psrc.replace( QString::fromUtf8("функция"), "function"); +// psrc.replace( QString::fromUtf8("если"), "if"); +// psrc.replace( QString::fromUtf8("то"), "then"); +// psrc.replace( QString::fromUtf8("иначе"), "else"); +// psrc.replace( QString::fromUtf8("начало"), "{"); +// psrc.replace( QString::fromUtf8("конец"), "}"); + return psrc; +} + + + +/*! + *\en + *\_en \ru + * Получение значения глобальной переменной. + *\_ru + */ +QVariant +aEngine::value( const QString &name ) +{ + QVariant v, *pv; + pv = values.find( name ); + if ( pv ) return *pv; + return v; +} + + + +/*! + *\en + *\_en \ru + * Установка значения глобальной переменной. + *\_ru + */ +void +aEngine::setValue( const QString &name, QVariant value ) +{ + values.remove( name ); + if ( !value.isValid() ) values.insert( name, new QVariant( value ) ); +} + + + +/*! + *\en + *\_en \ru + * Установка значения глобальной переменной. + *\_ru + */ +aDataField* +aEngine::enterValue( const QString &FieldType, const QString &title ) +{ + aDataField *f = new aDataField( "", FieldType ); + QDialog *d = new QDialog( ws, title, true ); + wField *wf = new wField( d, "" ); + QPushButton *b_ok = new QPushButton( d, tr("OK") ); + QPushButton *b_cancel =new QPushButton( d, tr("Cancel") ); + connect( b_ok, SIGNAL( pressed() ), d, SLOT( accept() ) ); + connect( b_cancel, SIGNAL( pressed() ), d, SLOT( reject() ) ); + if ( d->exec() == QDialog::Accepted ) { +// printf("accepted\n"); + } + delete d; + return f; +} + diff --git a/src/plugins/engine.h b/src/plugins/engine.h new file mode 100644 index 0000000..2e0e46d --- /dev/null +++ b/src/plugins/engine.h @@ -0,0 +1,198 @@ +/**************************************************************************** +** $Id: engine.h,v 1.2 2008/12/10 21:04:56 leader Exp $ +** +** Header file of the Ananas Engine of Ananas +** Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Library of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/**************************************************************************** +****************************************************************************/ +#ifndef ENGINE_H +#define ENGINE_H +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include + +#include "adatabase.h" +#include "acfg.h" +#include "awindowslist.h" +#include +#include "adatafield.h" +#include "aobject.h" + + + +class aEngine; +class aWidget; +class QSInterpreter; + +/*! + * \~english + * Register Ananas-engine objects into script engine. + * \~russian + * \brief Метод aObjectsFactory::create регистрирует С++ классы Ананаса в интерпретаторе скриптов, + * делая доступным работу с объектами зарегистрированного класса из Ананас.Скрипта. + * Наследует QSObjectFactory. + * \~ + */ +class QT_WIDGET_PLUGIN_EXPORT aObjectsFactory : public QSObjectFactory +{ +public: + aEngine *engine; + aDatabase *db; + aObjectsFactory( aEngine *e ); + QObject *create( const QString &className, + const QVariantList &arguments, + QObject *context ); +}; + + +class aForm; + +/*! + * \~english + * Ananas-engine object. + * \~russian + * \brief Определяет программный интерфейс Runtime системы, который используется Ананас скриптом. + * Наследует QObject. + * + * Класс, реализующий обработку и выполнение скриптов, открытие экранных форм, + * предварительную обработку скрипта перед выполнением (для последующего использования русских управляющих инструкций), + * системные функции получения даты и времени, печати сообщений об ошибках и т.д + * \~ + */ +class QT_WIDGET_PLUGIN_EXPORT aEngine : public QObject +{ + Q_OBJECT +public: +/*! + * \~english + * database connection. + * \~russian + * Соединение с базой данных. + * \~ +*/ + aDatabase *db; +/*! + * \~english + * link to metadata. + * \~russian + * ссылка на метаданные. + * \~ +*/ + aCfg* md; +/*! + * \~english + * link to workspace. + * \~russian + * ссылка на рабочее пространство. + * \~ +*/ + QWidget* ws; +/*! + * \~english + * link to windowlist. + * \~russian + * ссылка на список окон. + * \~ +*/ + aWindowsList* wl; +/*! + * \~english + * link to script interpreter. + * \~russian + * ссылка на интерпретатор скрипта. + * \~ +*/ + QSInterpreter* code; +/*! + * \~english + * link to script project. + * \~russian + * ссылка на проект. + * \~ +*/ + QSProject project; +/*! + * \~english + * number to form + * \~russian + * номер для обеспечения уникальных имен при открытии форм. + * \~ +*/ + int next_obj_id; + + aEngine(); + virtual ~aEngine(); + virtual bool init( const QString &rcfile ); + virtual void done(); + void openEmbedCatalogueEditor(int oid, QWidget *parent=NULL, const bool toSelect=true); + + QString sourcePreprocessor( const QString &src ); + + void timerEvent(QTimerEvent *e); + int on_systemstart(); + int on_systemstop(); + aForm *openForm( int oid, int fid = 0 , int defaultfor = 1, + int mode = 0, ANANAS_UID id = 0, aWidget* caller = 0 ); + +public slots: + QString cfgname(); + QString Time(); + QString Date(); + void Exit(); + void Message(int n, const QString &msg ); + void StatusMessage( const QString &msg ); + void settimer(int sec, QString proc); + aForm * OpenForm(QString fname, int mode=0, aObject * selecter=0);//Q_ULLONG ido=0); + QVariant value( const QString &name ); + void setValue( const QString &name, QVariant value = QVariant::Invalid ); + + void on_MenuBar( int id ); + void execAction( aCfgItem &act, QObject *context = 0 ); + + aDataField *enterValue( const QString &FieldType, const QString &title = "" ); + +private slots: + void error ( const QString & message, QObject * context, + const QString & scriptName, int lineNumber ); + void on_event( const QString &data ); +signals: + void statusMessage( const QString &msg ); + void event( const QString &source, const QString &data ); + +private: + QString pr_timer; + QString mGlobal; + Q3Dict values; + +}; + +#endif // ENGINE_H diff --git a/src/plugins/field/addfdialog.cpp b/src/plugins/field/addfdialog.cpp new file mode 100644 index 0000000..c4dc979 --- /dev/null +++ b/src/plugins/field/addfdialog.cpp @@ -0,0 +1,126 @@ +#include "addfdialog.h" + +#include +#include "wdbfield.h" + +#include +/* + * Constructs a addfdialog as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +addfdialog::addfdialog(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +addfdialog::~addfdialog() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void addfdialog::languageChange() +{ + retranslateUi(this); +} + +/*! + * Sets current field name and field id for return with function getData() + */ + +void addfdialog::doOk() +{ + int idx; + idx = ListBox->currentItem(); + if(idx>=0) + { + id = idlist[idx]; + field = list[idx]; + } + else id="0"; + accept(); +} + + +void addfdialog::init() +{ + id="0"; + field=""; +} + + +void addfdialog::destroy() +{ + +} + + +/*! + * Function return field name (if param name == true) or field id otherwise + * \return field name or field id + */ +const QString addfdialog::getData(bool name) +{ + if(name) return field; + else return id; +} + +/*! + * Sets list of field name and list of field id. + * \param flst (in) - list of field name + * \param ilst (in) - list of field id + */ +void addfdialog::setData( QStringList displst, QStringList flst, QStringList ilds) +{ + list = flst; + ListBox->insertStringList(displst); + idlist = ilds; +} + + + + +void addfdialog::setData( QWidget *o, aCfg *md ) +{ + + wDBField *w = (wDBField *)o; + w->getFields(); + setData( w->defDisplayFields, w->defFields,w->defId); + ListBox->setCurrentItem(ListBox->findItem(w->getFieldName())); +} + + +void addfdialog::getData( QWidget *o ) +{ + QString s; + wDBField *w = (wDBField *)o; + Q3ValueList bindList = w->getBindList(); + s = getData(true); + if(s.isEmpty()) return; + w->setFieldName(s); + s = getData(false); + if(s=="0") return; + // if select binding field + if(bindList.find(s.toULongLong()) != bindList.end()) + { + cfg_message(0, tr("field already binding, please select another field.")); + return; + } + w->setId(s.toInt()); + w->setEditorType(); + //w->updateProp(); + +} diff --git a/src/plugins/field/addfdialog.h b/src/plugins/field/addfdialog.h new file mode 100644 index 0000000..2aeb81b --- /dev/null +++ b/src/plugins/field/addfdialog.h @@ -0,0 +1,36 @@ +#ifndef ADDFDIALOG_H +#define ADDFDIALOG_H + +#include "ui_addfdialog.h" + + +class addfdialog : public QDialog, public Ui::addfdialog +{ + Q_OBJECT + +public: + addfdialog(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~addfdialog(); + + QStringList list,idlist; + + virtual void init(); + virtual void destroy(); + virtual const QString getData( bool name ); + +public slots: + virtual void doOk(); + virtual void setData( QStringList displst, QStringList flst, QStringList ilds ); + virtual void setData(QWidget *o, aCfg *md); + virtual void getData(QWidget *o); + +protected slots: + virtual void languageChange(); + +private: + QString field; + QString id; + +}; + +#endif // ADDFDIALOG_H diff --git a/src/plugins/field/addfdialog.ui b/src/plugins/field/addfdialog.ui new file mode 100644 index 0000000..bda881c --- /dev/null +++ b/src/plugins/field/addfdialog.ui @@ -0,0 +1,83 @@ + + + + + addfdialog + + + + 0 + 0 + 363 + 224 + + + + select field + + + + + + + + OK + + + + + + + Cancel + + + + + + + + 20 + 120 + + + + Expanding + + + Vertical + + + + + + + + + + + + qPixmapFromMimeSource + + wdbtable.h + + + + OkButton + clicked() + addfdialog + doOk() + + + CButton + clicked() + addfdialog + reject() + + + ListBox + doubleClicked(Q3ListBoxItem*) + addfdialog + doOk() + + + diff --git a/src/plugins/field/efield.cpp b/src/plugins/field/efield.cpp new file mode 100644 index 0000000..acf687f --- /dev/null +++ b/src/plugins/field/efield.cpp @@ -0,0 +1,168 @@ +#include "efield.h" + +#include +#include +#include + +#include "acfg.h" +#include + +/* + * Constructs a eField as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eField::eField(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eField::~eField() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eField::languageChange() +{ + retranslateUi(this); +} + +void eField::init() +{ + + + +} + + + +void eField::setData( QWidget *o, aCfg *cfg ) +{ + md = cfg; + if(!o) + { + reject(); + return; + } + if ( o->className() != QString("wField") || !md ) { + reject(); + return; + } + wField *f = ( wField*) o; + QString ts = f->getFieldType(); +// printf(">>> fieldType = %s;\n", ts.ascii() ); + char t=' '; + int w=0, d=0, oid, idx=0; + unsigned int i; + +// eName->setText(f->getName()); + otypes.clear(); + eType->clear(); + + QStringList tlist = md->types(); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + if ( !ts.isEmpty() ) { + sscanf( ts, "%c %d %d", &t, &w, &d ); + } else { + t = 'N'; + w = 10; + } + if ( t=='O' ) { + for( i = 0 ; i < otypes.count(); i++ ) { + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == w ) { + eType->setCurrentItem( i ); + break; + } + } + } + } else { + eWidth->setValue( w ); + eDec->setValue( d ); + if ( t == ' ' ) eType->setCurrentItem( 0 ); + if ( t == 'N' ) eType->setCurrentItem( 1 ); + if ( t == 'C' ) eType->setCurrentItem( 2 ); + if ( t == 'D' ) eType->setCurrentItem( 3 ); + if ( t == 'B' ) eType->setCurrentItem( 4 ); + } + typeSelect( eType->currentItem() ); +} + + +void eField::getData( QWidget *o ) +{ +// const QObject *o = sender(); + if ( !o ) return; + if ( o->className() != QString("wField") ) return; + wField *f = ( wField*) o; + wField::tEditorType type; + char ntype[40]=""; + int idx=eType->currentItem(); + + if (f) { + //f->setName(eName->text()); + sprintf(ntype, (const char *) otypes[idx], eWidth->value(), eDec->value()); + f->setFieldType(ntype); + if(otypes[idx][0]==' ') type = wField::Unknown; + if(otypes[idx][0]=='N') type = wField::Numberic; + if(otypes[idx][0]=='C') type = wField::String; + if(otypes[idx][0]=='D') type = wField::Date; + if(otypes[idx][0]=='B') type = wField::Boolean; + if(otypes[idx][0]=='O') + { + QString tmp = otypes[idx].section(' ',1,1); + long tid = atol(tmp); + aCfgItem item = md->find(tid); + if(!item.isNull()) + { + //gets object class + tmp = md->objClass(item); + if(tmp == md_catalogue) + type = wField::Catalogue; + if(tmp == md_document) + type = wField::Document; + } + } + f->setEditorType(type); + } +} + +void eField::typechanged(const QString &s ) +{ +} + +void eField::typeSelect( int idx ) +{ + bool w = false, d = false; + if ( otypes[ idx ][0] == 'N' ){ + w = true; + d = true; + + } else + if ( otypes[ idx ][0] == 'C' ){ + w = true; + + } + eWidth->setShown( w ); + tWidth->setShown( w ); + eDec->setShown( d ); + tDec->setShown( d ); +} diff --git a/src/plugins/field/efield.h b/src/plugins/field/efield.h new file mode 100644 index 0000000..e4cc313 --- /dev/null +++ b/src/plugins/field/efield.h @@ -0,0 +1,32 @@ +#ifndef EFIELD_H +#define EFIELD_H + +#include "ui_efield.h" + + +class eField : public QDialog, public Ui::eField +{ + Q_OBJECT + +public: + eField(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eField(); + + QStringList otypes; + +public slots: + virtual void init(); + virtual void setData( QWidget * o, aCfg * cfg ); + virtual void getData( QWidget * o ); + virtual void typechanged( const QString & s ); + virtual void typeSelect( int idx ); + +protected: + aCfg * md; + +protected slots: + virtual void languageChange(); + +}; + +#endif // EFIELD_H diff --git a/src/plugins/field/efield.ui b/src/plugins/field/efield.ui new file mode 100644 index 0000000..a08baa7 --- /dev/null +++ b/src/plugins/field/efield.ui @@ -0,0 +1,212 @@ + + + + + eField + + + + 0 + 0 + 313 + 186 + + + + Input field + + + + + + + + Positive + + + + + + + Required + + + + + + + + + + + + + 100 + 32767 + + + + Type + + + false + + + + + + + + + + + 100 + 32767 + + + + Name + + + false + + + + + + + + 31 + 16 + + + + Expanding + + + Vertical + + + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + + + 91 + 31 + + + + Expanding + + + Horizontal + + + + + + + + 100 + 32767 + + + + Width + + + false + + + + + + + 254 + + + 1 + + + + + + + + 100 + 32767 + + + + Decimals + + + false + + + + + + + 9 + + + + + + + qPixmapFromMimeSource + + ananas.h + acfg.h + wfield.h + + + + pushButton1 + clicked() + eField + accept() + + + pushButton2 + clicked() + eField + reject() + + + eType + activated(QString) + eField + typechanged(QString) + + + eType + activated(int) + eField + typeSelect(int) + + + diff --git a/src/plugins/field/field.pri b/src/plugins/field/field.pri new file mode 100644 index 0000000..efef031 --- /dev/null +++ b/src/plugins/field/field.pri @@ -0,0 +1,22 @@ +HEADERS += \ + field/efield.h \ + field/addfdialog.h \ + field/wfield.h \ + field/wdateedit.h \ + field/wcatalogeditor.h \ + field/wfield_plugin.h \ + field/wfield_taskmenu.h + +SOURCES += \ + field/efield.cpp \ + field/addfdialog.cpp \ + field/wfield.cpp \ + field/wdateedit.cpp \ + field/wcatalogeditor.cpp \ + field/wfield_plugin.cpp \ + field/wfield_taskmenu.cpp + +FORMS += \ + field/efield.ui \ + field/addfdialog.ui + \ No newline at end of file diff --git a/src/plugins/field/wcatalogeditor.cpp b/src/plugins/field/wcatalogeditor.cpp new file mode 100644 index 0000000..6fa468b --- /dev/null +++ b/src/plugins/field/wcatalogeditor.cpp @@ -0,0 +1,411 @@ +/**************************************************************************** +** $Id: wcatalogeditor.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Code file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include "ananas.h" +#include "wcatalogeditor.h" +#include "wfield.h" +#include "wdbtable.h" +#include "catalogform.h" +#include "alog.h" +#include "../ananas/mainform.h" + + +/*! + * \en Creates catalog editor widget. \_en + * \ru Создает виджет для редактирования каталога. + * В принципе он не предусмотрен использоваться ни как иначе, кроме как часть + * объекта wField, т.е его родительский объект должен быть wField + * или его наследник для обеспечения корректной инициализации. + * При создании объекта runtime не предусмотрено, за исключением случая, + * когда виджет используется в составе wField в объекте wDBTable. + * \param parent - \en parent object. \_en \ru родительский объект. \_ru + * \param name - \en name \_en \ru имя \_ru + * \param catname \en not used \_en \ru не используется \_ru + */ +wCatalogEditor::wCatalogEditor( wField *parent, + const char *name, + const char *catname) : QWidget(parent, name) +{ + QWidget* w =0; + md = NULL; + QString str; + label = new QLabel(parent, name); + label->setFrameShape(Q3Frame::Box); + w =(QWidget*) parent->parent()->parent(); + str = parent->getFieldType(); + catId = atoi(str.remove(0,2));// gets catalog id. + if(w) + { + if(strcmp(w->className(),"wDBTable")==0) // wField is element wDBTable + { + initCat(((wDBTable*)w)->db); + } + } +} + +wCatalogEditor::wCatalogEditor(QWidget* parent,int cat) : QWidget() +{ + catId = cat; + label = 0; + ws = parent; +} + + +/*! + * \en Destructor catalog editor. \_en + */ +wCatalogEditor::~wCatalogEditor() +{ + delete label; + label = 0; +} + + + +/*! + * \en Initialisation catalog editor. \_en + * \ru Инициализация редактора каталога. + * Инициализирует внутренние объекты метаданных и базы банных. \_ru + */ +void +wCatalogEditor::initCat(aDatabase * adb) +{ + md = &adb->cfg; + db = adb; +} + + +/*! + * \en Handler signal click(). + * Creates and shows form for select catalog. \_en + * \ru Обработчик события нажатия кнопки, + * которая является второй составной частью виджета. + * Сигнал коннектится в объекте wField. + * Создает и отображет в рабочем пространстве енжина форму для + * редактирования каталога или выбора из каталога. + * Производит заполнение дерева групп и элементов группами и формирует + * данные для передачи в форму редактирования каталога. + * Создает и отображет в рабочем пространстве енжина эту форму.\_ru + */ +void +wCatalogEditor::select() +{ + openForm(true); +} +/*! + * \en Creates and shows form for edit catalog. \_en + * \ru Обработчик события нажатия кнопки, + * которая является второй составной частью виджета. + * редактирования каталога. + * Производит заполнение дерева групп и элементов группами и формирует + * данные для передачи в форму редактирования каталога. + * Создает и отображет в рабочем пространстве енжина эту форму.\_ru + */ +void +wCatalogEditor::edit() +{ + openForm(false); +} + +void +wCatalogEditor::openForm(const bool toSelect) +{ + + + aLog::print(aLog::Debug, tr("wCatalog Editor open form for select=%1 ").arg((int)toSelect)); + MainForm *mainform; + if(parent()) + { + mainform = (MainForm*) topLevelWidget(); + ws = mainform->ws; + } +// aWindowsList *wl = mainform->wl; + int objid = catId; +/* if ( wl->find( objid ) ) + { +// wl->remove(objid); + wl->get( objid )->setFocus(); + return; + } + else + { + CatalogForm* newform = new CatalogForm(ws,0, WDestructiveClose); + wl->insert( objid, newform ); + }*/ + CatalogForm* newform = new CatalogForm(ws,0, Qt::WDestructiveClose); + + connect( newform, SIGNAL(selected(qulonglong)), + this, SLOT(on_selected( qulonglong ))); + connect( newform, SIGNAL(destroyed()), + this, SLOT(on_destroyed_form())); + + aCatalogue *cat = new aCatalogue(md->find(catId),db); + int count=0; + bool est=true; + QMap map, map_el; + aCfgItem tmp, tmp_f,tmp_el,tmp_group, o; + Q3ListViewItem * item; + Q3ListViewItem * p_item; + qulonglong idGrForm=0, idElForm=0; + QStringList listPos, listPosGroup; + newform->ListHint->hide(); + QPixmap pixmap(newform->getGroupPixmap()); + QPixmap pixmap_mark_deleted(newform->getMarkDeletedPixmap()); + tmp = md->find(catId); + newform->setCaption(md->attr(tmp,mda_name)); + o = md->findChild(tmp, md_forms); // get obj forms + if(!o.isNull()) + { + count = md->count(o,md_form); + for(int i=0; ifindChild(o,md_form,i); + if(!tmp_f.isNull() + && atoi(md->attr(tmp_f,mda_type).ascii())==md_form_elem) + { + aLog::print(aLog::Debug, tr("wCatalog Editor found element forms")); + idElForm = md->id(tmp_f); +// continue; + } + if(!tmp_f.isNull() + && atoi(md->attr(tmp_f,mda_type).ascii())==md_form_group) + { + aLog::print(aLog::Debug, tr("wCatalog Editor found group forms")); + idGrForm = md->id(tmp_f); + } + } + } + else + { + aLog::print(aLog::Error, tr("wCatalog Editor meta object forms not found")); + } + tmp_el = md->findChild(tmp, md_element); + tmp_group = md->findChild(tmp,md_group); + tmp = md->findChild(tmp_el, md_field); + int count_fields = md->count(tmp_el,md_field); + listPosGroup = cat->getGroupUserFields(); + int i,level = 0; + cat->Select(); + while(est) // add group in tree on levels + { + est = false; + ++level; + cat->selectByLevel(level-1); + + if(!cat->FirstInGroupTable()) break; + do + { + if(cat->GroupSysValue("level").toInt()==level-1) //all groups, having this level + { + est = true; + QString displayString; + displayString= cat->GroupSysValue(listPosGroup[0]).toString(); + if(map.contains(cat->GroupSysValue("idp").toULongLong())) + { + p_item = map[(cat->GroupSysValue("idp").toULongLong())]; + item = new Q3ListViewItem(p_item); + } + else + { + item = new Q3ListViewItem(newform->ListView); + newform->ListView->insertItem(item); + } + item->setText(0, displayString); + if(cat->isGroupMarkDeleted()) + item->setPixmap(0,pixmap_mark_deleted); + else + item->setPixmap(0,pixmap); + + map.insert(cat->GroupSysValue("id").toULongLong(),item); + //printf("%lu\n",cat->GroupSysValue("id").toULongLong()); + + } + + + }while(cat->NextInGroupTable()); + + } + listPos = cat->getUserFields(); + checkUserFields(listPos); + int fid; + //sets column name + for(uint i=0; ifind(fid); + } + if(fid) + { + tmp = md->find(fid); + newform->ListView->addColumn(md->attr(tmp,mda_name)); + } + } + + listPos.clear(); + listPos = cat->getUserFields(); + checkUserFields(listPos); + //Q_ULLONG res = 0; + // cat deleted in function catalogform::destroy(); + + newform->setData( cat, + map, + listPos, + cat->getGroupUserFields(), + idElForm, + idGrForm, + toSelect); + + newform->setId(value().toULongLong()); + //-- + if (ws) + ((QWorkspace*)ws)->addWindow(newform); + newform->show(); + ((QWidget*)newform->parent())->move(0,0); +} +void +wCatalogEditor::checkUserFields( QStringList &lst) +{ + aCfgItem item = md->find(catId); + int fid; + if(item.isNull()) return; + item = md->findChild(item,md_element); + for(int i=0; i< md->count(item,md_field); i++) + { + aCfgItem mdi = md->findChild(item,md_field,i); + int ind = lst.findIndex(QString("uf%1").arg(md->attr(mdi,mda_id))); + if(ind!=-1) + { + //--lst.insert(lst.at(i),lst[ind]); + lst.insert(i,lst[ind]); + lst.remove(lst.at(ind+1)); + + } + else + { + ind = lst.findIndex(QString("text_uf%1").arg(md->attr(mdi,mda_id))); + if(ind!=-1) + { + //--lst.insert(lst.at(i),lst[ind]); + lst.insert(i,lst[ind]); + lst.remove(lst.at(ind+1)); + + } + } + } + +} + +void +wCatalogEditor::on_selected( qulonglong uid ) +{ + emit( selected(uid) ); +} + +void +wCatalogEditor::on_destroyed_form( ) +{ + emit( destroyed_form() ); +} + + +/*! + * \en Gets catalog editor value. \_en + * \ru Получение значения редактора каталога. + * Т.е. то, что было выбрано или утановлено функцией setValue(). + * Сейчас возвращает стринг с id, но может быть + * Для получения осмысленного значения используй функцию displayValue() \_ru + */ +QString +wCatalogEditor::value() const +{ + return vValue; +} + + +/*! + * \en Gets value for displaying. \_en + * \ru Получение осмысленного представления id. + * Строка является представлением уникального id для элемента + * или группы каталога. \_ru + * \param id_element (in) -\en unique id element or group \_en + * \ru уникальный идентификатор элемента или группы \_ru + */ +QString +wCatalogEditor::displayValue(qulonglong id_element) const +{ +const QString no_select = " "; + if(md) + { + /* aCfgItem tmp,field; + QString res; + tmp = md->find(catId); + tmp = md->findChild(tmp, md_element); + field = md->findChild(tmp,md_field); + aSQLTable* te = new aSQLTable(tmp,db); + te->select(QString("id=%1").arg(id_element)); + if(te->first()) + { + res = te->sysValue(QString("uf%1").arg(md->id(field))).toString(); + } + else res = no_select; + delete te;*/ + return QString("%1").arg(id_element); + } + else return no_select; +} + + +/*! + * \en Sets id for displaying. \_en + * \ru Установка id для показа. + * Хранится в стринге для совмесимости с wField. \_ru + */ +void +wCatalogEditor::setValue(QString newvalue) +{ + if(vValue==newvalue) return; + vValue = newvalue; + if(label) label->setText(displayValue(newvalue.toULongLong())); + emit valueChanged(value()); +} + diff --git a/src/plugins/field/wcatalogeditor.h b/src/plugins/field/wcatalogeditor.h new file mode 100644 index 0000000..a67c906 --- /dev/null +++ b/src/plugins/field/wcatalogeditor.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** $Id: wcatalogeditor.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WCATALOGEDITOR_H +#define WCATALOGEDITOR_H + +#include "ananasglobal.h" + +#include +#include +#include +#include +//#include +//#include +//#include +//#include +//#include +#include "wfield.h" +#include "adatabase.h" +#include "ananas.h" + +/*! + * \en + * \brief Ananas catalogue type field editor. + * \_en + * \ru + * \brief Класс предоставляет доступ к методам встроенного редактора справочников (каталогов) + * Наследует QWidget. + * \_ru + */ +class QT_WIDGET_PLUGIN_EXPORT wCatalogEditor : public QWidget +{ + Q_OBJECT + Q_PROPERTY( QString value READ value WRITE setValue) +public: + QLabel* label; + wCatalogEditor( wField* parent = 0, const char *name = 0, const char* catname=0); + wCatalogEditor( QWidget* w, int cat); + ~wCatalogEditor(); + QString value() const; + void setValue(QString newvalue); + void initCat(aDatabase *adb); + QString displayValue(qulonglong id_element) const; +private slots: + void on_selected( qulonglong ); + void on_destroyed_form(); + +protected slots: + void openForm(const bool toSelect); +public slots: + void checkUserFields( QStringList &lst); + void select(); + void edit(); + +signals: + void valueChanged(const QString &); + void selected( qulonglong ); + void destroyed_form(); +private: + QString vValue; + aCfg* md; + int catId; + QWidget *ws; + aDatabase* db; +}; +#endif diff --git a/src/plugins/field/wdateedit.cpp b/src/plugins/field/wdateedit.cpp new file mode 100644 index 0000000..419eb33 --- /dev/null +++ b/src/plugins/field/wdateedit.cpp @@ -0,0 +1,77 @@ +/**************************************************************************** +** $Id: wdateedit.cpp,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Code file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +//Added by qt3to4: +#include +#include "wdateedit.h" + + + +/*! + * \en Constructor. \_en + * \ru Конструктор. \_ru + */ +wDateEdit::wDateEdit(QWidget* parent, const char* name ):Q3DateEdit(parent,name) +{} + + +/*! + * \en Constructor with setting date. \_en + * \ru Конструктор с инициированием даты. \_ru + * \param date - \en date for set \_en \ru Дата для установки \_ru + */ +wDateEdit::wDateEdit(const QDate &date, + QWidget* parent, + const char* name) : Q3DateEdit(date,parent,name) +{} + + + +/*! + * \en Destructor \_en + */ +wDateEdit::~wDateEdit() +{ + //QDateEdit::~QDateEdit(); +} + + +/*! + * \en Focus out event handler. Emit signal lostFocus. \_en + * \ru Обработчик сигнала выхода из фокуса. Испускает сигнал lostFocus. \_ru + */ +void +wDateEdit::focusOutEvent ( QFocusEvent * e) +{ + emit(lostFocus()); + QWidget::focusOutEvent(e); +} + + diff --git a/src/plugins/field/wdateedit.h b/src/plugins/field/wdateedit.h new file mode 100644 index 0000000..b4b8570 --- /dev/null +++ b/src/plugins/field/wdateedit.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** $Id: wdateedit.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WDATEEDIT_H +#define WDATEEDIT_H + +#include +#include +//Added by qt3to4: +#include + +/*! + * \en Unknown field editor. \_en + * \ru + * \brief Плагин-виджет для отображения в экранной форме поля типа Unknown. + * Наследует QLabel. + * \_ru + */ +class wUnknownField : public QLabel +{ + Q_OBJECT +public: + wUnknownField( QWidget *parent = 0, const char *name = 0):QLabel(parent, name){}; + +}; + + +/*! + * \en DateEdit field editor. \_en + * \ru + * \brief Плагин -- виджет используется в экранных формах в качестве поля ввода/редактирования + * атрибута типа Дата бизнес объекта Ананаса. + * Наследует QDateEdit. + * + * \_ru + */ +class wDateEdit : public Q3DateEdit +{ + Q_OBJECT +public: + wDateEdit(QWidget* parent = 0, const char* name = 0); + wDateEdit(const QDate &date, + QWidget* parent = 0, + const char* name = 0 ); + ~wDateEdit(); +protected: + void focusOutEvent ( QFocusEvent * ); +signals: + void lostFocus(); +}; + +#endif diff --git a/src/plugins/field/wfield.cpp b/src/plugins/field/wfield.cpp new file mode 100644 index 0000000..1f18d09 --- /dev/null +++ b/src/plugins/field/wfield.cpp @@ -0,0 +1,720 @@ +/**************************************************************************** +** $Id: wfield.cpp,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Code file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include + +//--#include "command.h" +//--#include "mainwindow.h" +//--#include "formwindow.h" + +#include "ananas.h" +#include "wfield.h" +#include "wdateedit.h" +#include "wcatalogeditor.h" +#include "efield.h" + + + +/*! + * \en Constructs object with parent=parent, name=name and flags=fl \_en + * \ru Создает объект с родителем parent, именем name и флагом fl. \_ru + */ +wField::wField( QWidget *parent, const char *name, Qt::WFlags fl ) + : aWidget( parent, name, fl ) +{ + loaded = 0; + md_oid = 0; + md_fid = 0; + setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) ); + setFocusPolicy(Qt::StrongFocus); + new Q3HBoxLayout( this, 0, 0 ); + lineEdit = new QLineEdit(this); + lineEdit->hide(); + dateEdit = new wDateEdit(this); + dateEdit->hide(); + objButton = new wCatButton("...",this); + objButton->hide(); + objLabel = new QLabel(this); + objLabel->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Preferred )); + objLabel->setFrameShape(Q3Frame::Box); + objLabel->setText("UnknownField"); + objLabel->show(); + checkBox = new wCheckBox(this); + checkBox->hide(); + vEditorType = Unknown; +} +/* +wField::wField( QWidget *parent, const char *name, WFlags fl, bool dbf ) + : aWidget( parent, name, fl ) +{ + setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) ); + //vValue = ""; + //vFieldType=""; + new QHBoxLayout( this, 0, 0 ); + loaded = 0; + fieldEditor = NULL; + fieldSelector = NULL; + cfgobj_name = NULL; + cfgobj_type = NULL; + vEditorType = Unknown; + setMode( Mode0 ); + if ( dbf ) widgetInit(); +} +*/ + + +/*! + * \en Destructor. \_en + */ +wField::~wField() +{ +} + + +/*! + * \en Sets widget visual type, depend of property fieldType. + * This property must be set above call this function. \_en + * \ru Устанавливает визуальный тип виджета в зависимости от свойства + * `fieldType'. Это свойсто должно быть установлено до вызова этой функции, + * иначе тип виджета будет установлен в Unknown. \_ru + */ +void +wField::widgetInit() +{ + QString str; + char s1[20]; + int n1=0, n2=0; + lineEdit->hide(); + disconnect( lineEdit, SIGNAL( textChanged( const QString & ) ), + this, SLOT( setValue( const QString & ) ) ); + disconnect( lineEdit, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) ); + // lineEdit->disconnect(); + lineEdit->setReadOnly(false); + layout()->remove(lineEdit); + dateEdit->hide();// = new QDateEdit(this); + disconnect(dateEdit, SIGNAL( valueChanged ( const QDate&) ), + this, SLOT( setValue( const QDate & ) ) ); + disconnect(dateEdit, SIGNAL( lostFocus() ), + this, SLOT( focusOutEvent() ) ); + layout()->remove(dateEdit); + objLabel->hide();// = new QLabel(this); + objLabel->disconnect(); + layout()->remove(objLabel); + objButton->hide();// = new wCatButton("...",this); + disconnect( objButton, SIGNAL( clicked() ), + this, SLOT( fieldSelect() ) ); +// objButton->disconnect(); + layout()->remove(objButton); + checkBox->hide(); + disconnect( checkBox, SIGNAL( valueChanged ( const QString & ) ), + this, SLOT( setValue( const QString & ) ) ); + + disconnect( checkBox, SIGNAL( toggled (bool) ), checkBox, SLOT( on_toggled() ) ); +// checkBox->disconnect(); + layout()->remove(checkBox); + //TODO: need rewrite + if (!vFieldType.isEmpty()) sscanf((const char *)vFieldType,"%s %i %i", s1, &n1, &n2); + + switch (vEditorType) + { + case Numberic: + lineEdit->setText(vValue); + if(vFieldType.isEmpty()) + { + // set validator for numeric type + QString str = tr("^\\-{0,1}\\d{0,%1}\\.{1}\\d{0,%2}$").arg(3).arg(3); + QRegExp rexp( str ); + lineEdit->setValidator(new QRegExpValidator(rexp,lineEdit)); + } + else + { + if(n2==0) + { + // set default validator for integer type + QString str = tr("^\\-{0,1}\\d{0,%1}$").arg(n1); + QRegExp rexp( str ); + lineEdit->setValidator(new QRegExpValidator(rexp,lineEdit)); + } + else + { + // set default validator for float type + QString str = tr("^\\-{0,1}\\d{0,%1}\\.{1}\\d{0,%2}$").arg(n1).arg(n2); + QRegExp rexp( str ); + lineEdit->setValidator(new QRegExpValidator(rexp,lineEdit)); + } + } + connect( lineEdit, SIGNAL( textChanged( const QString & ) ), + this, SLOT( setValue( const QString & ) ) ); + connect( lineEdit, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) ); + + setFocusProxy(lineEdit); + layout()->add( lineEdit ); + lineEdit->show(); + break; + + case String: + if(vFieldType.isEmpty()) + { + // set default validator for string + lineEdit->setMaxLength(20); + } + else + { + // set validator for string + lineEdit->setMaxLength(n1); + } + connect( lineEdit, SIGNAL( textChanged( const QString & ) ), + this, SLOT( setValue( const QString & ) ) ); + connect( lineEdit, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) ); + + setFocusProxy(lineEdit); + layout()->add( lineEdit ); + lineEdit->show(); + break; + + case Date: + case DateTime: + // used object wDateTime, inherits QDateTime + dateEdit->setSeparator("."); + dateEdit->setOrder( Q3DateEdit::DMY ); + connect(dateEdit, SIGNAL( valueChanged ( const QDate&) ), + this, SLOT( setValue( const QDate & ) ) ); + connect(dateEdit, SIGNAL( lostFocus() ), + this, SLOT( focusOutEvent() ) ); + + setFocusProxy( dateEdit ); + layout()->add( dateEdit ); + dateEdit->show(); + break; + + case Catalogue: + md_oid = n1; + objLabel->setFrameShape( Q3Frame::Box ); + objLabel->setLineWidth( 1 ); + objLabel->setFocusPolicy(Qt::NoFocus); + objButton->setMaximumWidth(25); + objButton->setFocusPolicy(Qt::StrongFocus); + connect( objButton, SIGNAL( clicked() ), + this, SLOT( fieldSelect() ) ); + + setFocusProxy(objButton); + layout()->add( objLabel ); + layout()->add( objButton ); + objLabel->show(); + objButton->show(); + break; + + case Document: +//>>>>>>> 1.49.2.4 + // Field type = Document + md_oid = n1; + objLabel->setFrameStyle( Q3Frame::Panel | Q3Frame::Sunken ); + objLabel->setLineWidth( 1 ); + objLabel->setFocusPolicy(Qt::NoFocus); + objButton->setMaximumWidth(25); + objButton->setFocusPolicy(Qt::StrongFocus); + connect( objButton, SIGNAL( clicked() ), + this, SLOT( fieldSelect() ) ); + + setFocusProxy(objButton); + layout()->add( objLabel ); + layout()->add( objButton ); + objLabel->show(); + objButton->show(); + break; + + case Boolean: +// connect( checkBox, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) ); + connect( checkBox, SIGNAL( valueChanged ( const QString & ) ), + this, SLOT( setValue( const QString & ) ) ); + + connect( checkBox, SIGNAL( toggled (bool) ), checkBox, SLOT( on_toggled() ) ); + setFocusProxy(checkBox); + layout()->add(checkBox); + checkBox->show(); + break; + + default: + objLabel->setText("UnknownField"); + objLabel->setFrameShape(Q3Frame::Box); + setFocusPolicy(Qt::NoFocus); + layout()->add( objLabel ); + objLabel->show(); + break; + } + setValue(vValue); +} + + + +/*! + * \en Sets property fieldType. \_en + * \ru Устанавливает значение свойства `fieldType'.\_ru + */ +void +wField::setFieldType( QString n ) +{ + vFieldType=n; + if (!loaded) + { + loaded = true; + } + //widgetInit(); +} + + +/*! + * \en Sets property editorType. \_en + * \ru Устанавливает значение свойства `editorType'.\_ru + */ +void +wField::setEditorType( tEditorType n ) +{ + vEditorType=n; + widgetInit(); +} + + + +//<<<<<<< wfield.cpp + +/* +void +wField::load() +{ +} + +*/ + +/*! + * \en Creates property editor dialog window. \_en + * \ru Создает окно диалога редактора свойств.\_ru + * \param parent - \en parent \_en \ru родитель \_ru + */ +QDialog* +wField::createEditor( QWidget *parent ) +{ + return new eField( parent ); +} + + +/*! + * \en Sets value type DateTime. \_en + * \ru Устанавливает значения типа DateTime. + * Так как в базе хранится тип DateTime, значение дополняется + * нулевым временем для корректной конвертации и хранении в базе. + * Формат даты в базе данных должен быть ISO. \_ru + * \param newDate (in) - \en date for set \_en \ru Дата для установки \_ru + */ +void +wField::setValue(const QDate& newDate) +{ +//CHECK_POINT + vValue = newDate.toString(Qt::ISODate); + vValue+="T00:00:00"; //for correct converting to date-time + emit valueChanged(vValue); + emit valueChanged(QVariant(vValue)); +} + + + +/*! + * \en Sets value. \_en + * \ru Устанавливает значение виджета. \_ru + * \param newvalue (in) - \en value for set \_en \ru значение для установки \_ru + */ +void +wField::setValue(const QString &newvalue) +{ + int pos; + QString str; + QDateTime dt; +//<<<<<<< wfield.cpp +// if (!fieldEditor) return; +// emit valueChanged(newvalue); +// emit valueChanged(QVariant(newvalue)); +///======= +//>>>>>>> 1.49.2.4 + switch (vEditorType) + { + case Unknown: + break; + case Numberic: + case String: + vValue = newvalue; + pos = lineEdit->cursorPosition(); + lineEdit->setText(vValue); + lineEdit->setCursorPosition(pos); + break; + case Date: + case DateTime: + // conventering date-time to date, and if new value is NULL set up current locale date. + // date must be stored in server in format ISO + str = newvalue; + if(newvalue.isEmpty()) + { + str= QDateTime::currentDateTime(Qt::LocalTime).toString(Qt::ISODate); + } + dt = QDateTime::fromString(str,Qt::ISODate); + vValue = dt.toString(Qt::ISODate); + dateEdit->setDate(dt.date()); + break; + case Catalogue: + case Document: + vValue = newvalue; + objLabel->setText( ananas_objectstr( db, vValue.toULongLong(), md_oid ) ); + break; + case Boolean: + vValue = newvalue; + if(newvalue == "1") + { + checkBox->setChecked(true); + } + else + { + checkBox->setChecked(false); + } + break; + //emit valueChanged(QVariant(vValue)); + + } + emit valueChanged(vValue); + emit valueChanged(QVariant(vValue)); +} + + + +/*! + * \en Gets value. \_en + * \ru Возвращает значение виджета. \_ru + * \return \en value \_en \ru значение виджета \_ru + */ +QString +wField::value() const +{ + QString str = vValue; + return str; //str.setUnicode(vValue.unicode(),vValue.length()); +} + + + +/*! + * \en Gets text value. \_en + * \ru Возвращает текстовое значение виджета. \_ru + * \return \en value \_en \ru значение виджета \_ru + */ +QString +wField::text() const +{ + QString str; + switch (vEditorType) + { + case Date: + case DateTime: + str = dateEdit->date().toString(Qt::ISODate); + break; + case String: + case Numberic: + str = lineEdit->text(); + break; + case Catalogue: + case Document: + str = objLabel->text(); + break; + case Boolean: + str = checkBox->isChecked()?"1":"0"; + break; + default: + str = ""; + break; + } + return str; //str.setUnicode(vValue.unicode(),vValue.length()); +} + +/*! + * \en Calls handler onClick event for Catalogue or Document object. \_en + * \ru Вызывает обработчик события onClick для объектов Каталог или Документ. \_ru + */ +void +wField::fieldSelect() +{ + aForm * f = 0; +// if (!fieldEditor) return; + switch (vEditorType) + { + case Catalogue: + //printf("select catalogue\n"); + if ( engine ) + { + int fid = md->getDefaultFormId( md->find( md_oid ), md_action_view); + if ( !fid ) + { + engine->openEmbedCatalogueEditor(md_oid,this,true); + return; + } + f = engine->openForm( md_oid, 0, md_action_view, 0, false ); + if ( f ) + { + connect(f, SIGNAL(selected( qulonglong )), this, SLOT(on_selected( qulonglong ))); + f->closeAfterSelect = true; + } + } + else printf("No Engine\n"); + break; + case Document: + if( engine ) + { + aCfgItem journ = md->findJournal(1, md->find( md_oid )); + if( journ.isNull() ) + { + printf("special journal not found, find system journal\n"); + journ = md->findJournal(0, md->find( md_oid )); + } + else + { + printf("found special journal %s with class %s\n", (const char*) md->attr(journ,mda_name).local8Bit(),md->objClass(journ).ascii()); + } + f = engine->openForm( md->id(journ), 0, md_action_view, 0, false ); + if( f ) + { + connect(f, SIGNAL(selected( qulonglong )), this, SLOT(on_selected( qulonglong ))); + f->closeAfterSelect = true; + } + + } + else printf("No engine\n"); +// printf("select document!\n"); + break; + default: + break; + } +} + + + + +/*! + * \en Handler signal lostFocus. \_en + * \ru Обработчик сигнала lostFocus. \ru + */ +void +wField::focusInEvent() +{ + switch (vEditorType) { + case Catalogue: + objLabel->setLineWidth( 2 ); + break; + case Document: + break; + default: + break; + } +//emit(lostFocus()); +} + + +/*! + * \en Handler signal lostFocus. \_en + * \ru Обработчик сигнала lostFocus. \ru + */ +void +wField::focusOutEvent() +{ + switch (vEditorType) { + case Catalogue: + objLabel->setLineWidth( 1 ); + break; + case Document: + break; + default: + break; + } +//emit(lostFocus()); +} + + +void +wField::on_selected( qulonglong uid ) +{ + setValue( QString::number( uid ) ); + setFocus(); +} + +void +wField::selectAll() +{ + switch (vEditorType) { + case Numberic: + case String: +// ((QLineEdit *) fieldEditor)->home( false ); + lineEdit->selectAll(); + break; + default: + break; + } +} + +void +wField::SetReadOnly(bool fl) +{ + switch (vEditorType) { + case Numberic: + case String: + lineEdit->setReadOnly(fl); + break; + case Date: + case DateTime: + dateEdit->setDisabled(fl); + break; + case Catalogue: + objButton->setDisabled( fl ); + break; + case Document: + objButton->setDisabled( fl ); + break; + case Boolean: + checkBox->setDisabled( fl ); + break; + default: + break; + } + +} + +/*<<<<<<< wfield.cpp +void +wField::SetReadOnly(bool fl) +{ + switch (vEditorType) { + case Numberic: + case String: +// ((QLineEdit *) fieldEditor)->home( false ); + ((QLineEdit *) fieldEditor)->setReadOnly(fl); + break; + case Date: + ((QDateEdit*)fieldEditor)->setDisabled(fl); + break; + case DateTime: + ((QDateTimeEdit*)fieldEditor)->setDisabled(fl); + break; + case Catalogue: +// ((QLabel *) fieldEditor)->setFrameShape( QFrame::NoFrame ); + ((wCatButton *) fieldSelector)->setDisabled( fl ); + break; + case Document: + break; + default: + break; + } + +} + +======= + +>>>>>>> 1.49.2.4 +*/ +/*! + *\~english + * Proces value changed. + * Proces value changed in fields diferent types. + *\~russian + * Обрабатывает изменение значения. + * Обрабатывает изменение значения в поле, вне зависимости от типа поля. + *\~ + */ + +wCatButton::wCatButton(const char * caption, QWidget *parent):QPushButton(caption,parent) +{ +} + +wCatButton::~wCatButton() +{ +} + +void +wCatButton::keyPressEvent ( QKeyEvent * e ) +{ + switch(e->key()) + { + case Qt::Key_Left: + case Qt::Key_Up: + case Qt::Key_Right: + case Qt::Key_Down: + e->accept(); + break; + case Qt::Key_Space: + e->accept(); + emit( clicked() ); + break; + case Qt::Key_Tab: +// printf("press tab\n"); + e->accept(); +//<<<<<<< wfield.cpp + //new QKeyEvent( QEvent::KeyPress, Qt::Key_Return, 10, 0); + //new QKeyEvent( QEvent::KeyRelease, Qt::Key_Return, 10, 0); +//======= +//>>>>>>> 1.49.2.4 + break; + default: + e->ignore(); + break; + + } +} + +wCheckBox::wCheckBox(QWidget * parent, const char * name):QCheckBox(parent,name) +{ +} + +wCheckBox::~wCheckBox() +{ +} + +void +wCheckBox::on_toggled() +{ +// printf("wCheckBox state is %d\n",this->state()); + if(this->isChecked()) emit(valueChanged("1")); + else emit(valueChanged("0")); +} diff --git a/src/plugins/field/wfield.h b/src/plugins/field/wfield.h new file mode 100644 index 0000000..3f8cc87 --- /dev/null +++ b/src/plugins/field/wfield.h @@ -0,0 +1,149 @@ +/**************************************************************************** +** $Id: wfield.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the field plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2003-2004 Grigory Panov, Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef QAFIELD_H +#define QAFIELD_H + +#include +#include +#include +#include +#include +#include +#include "qlineedit.h" +//Added by qt3to4: +#include +#include "wdateedit.h" +#include "adatabase.h" +#include "ananas.h" + +class wCatButton; +class wCheckBox; + +/*! + * \en + * \brief Ananas Field widget. + * \_en + * \ru + * \brief Плагин -- виджет предназначенный для редактирования значений любых типов, определенных в бизнес схеме. + * Наследует aWidget. + * + * В отличие от wDBField класс wField не биндится к атрибутам persistent бизнес объектов. То есть время жизни + * хранимых в нем значений равно времени жизни родительской экранной формы. Прикладной программист сам должен + * решить вопрос обработки и хранения значений задаваемых пользователем. + * \_ru + */ +#include + +//class QT_WIDGET_PLUGIN_EXPORT wField : public aWidget +class QDESIGNER_WIDGET_EXPORT wField : public aWidget +{ + Q_OBJECT + + Q_PROPERTY( QString value READ value WRITE setValue) + Q_PROPERTY( QString FieldType READ getFieldType WRITE setFieldType ) + Q_PROPERTY( tEditorType EditorType READ getEditorType WRITE setEditorType ) + Q_ENUMS(tEditorType) + Q_ENUMS(FieldMode) +public: + enum tEditorType { Unknown, Numberic, String, Date, DateTime, Boolean, Catalogue=101, Document}; + + wField( QWidget *parent, const char *name, Qt::WFlags fl = 0 ); +// wField( QWidget *parent, const char *name, WFlags fl, bool dbf = TRUE ); + virtual ~wField(); + + virtual QDialog* createEditor( QWidget *parent ); + +signals: + void valueChanged( const QString & ); + void valueChanged( const QVariant & ); + void lostFocus(); + +public slots: + bool getOpt() const { return false; }; + void setOpt( bool fn ) { if(fn) widgetEditor(); }; + virtual QString value() const; + QString text() const; + virtual void setValue( const QString &fn ); + void setValue( const QDate& d); + virtual QString textValue() {return text();}; + void setFieldType( QString n ); + QString getFieldType() const {return vFieldType;}; + void setEditorType( tEditorType n ); + tEditorType getEditorType() const { return vEditorType; }; + void fieldSelect(); +// void propertyUpdate(QString propName); + virtual void focusInEvent(); + virtual void focusOutEvent(); + void selectAll(); + virtual void SetReadOnly(bool); + +private slots: + void on_selected( qulonglong uid ); + +protected: + QLineEdit *lineEdit; + wDateEdit *dateEdit; + QLabel *objLabel; + wCatButton *objButton; + wCheckBox *checkBox; + tEditorType vEditorType; + QString vFieldType; + QString vValue; +// virtual void updateProp(); + void widgetInit(); +private: + int loaded; + int md_oid, md_fid; +}; + +class wCatButton: public QPushButton +{ + Q_OBJECT + public: + wCatButton(const char * caption, QWidget *parent); + virtual ~wCatButton(); + protected: + void keyPressEvent ( QKeyEvent * e ); +}; +class wCheckBox: public QCheckBox +{ + Q_OBJECT + public: + wCheckBox(QWidget *parent, const char * name =0); + virtual ~wCheckBox(); + + public slots: + void on_toggled(); + signals: + void valueChanged(const QString &); +}; + +#endif diff --git a/src/plugins/field/wfield_plugin.cpp b/src/plugins/field/wfield_plugin.cpp new file mode 100644 index 0000000..4114396 --- /dev/null +++ b/src/plugins/field/wfield_plugin.cpp @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wfield_plugin.h" + +#include +#include +#include + +#include "wfield_taskmenu.h" +#include "wfield.h" + + +wFieldPlugin::wFieldPlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wFieldPlugin::isContainer() const +{ + return false; +} + +bool wFieldPlugin::isInitialized() const +{ + return m_initialized; +} + +void wFieldPlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wFieldTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; +} + +QWidget *wFieldPlugin::createWidget(QWidget *parent) +{ + wField *w = new wField(parent, 0); + return w; +} + +QString wFieldPlugin::name() const +{ + return QLatin1String("wField"); +} + +QString wFieldPlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wFieldPlugin::toolTip() const +{ + return QString("Ananas for QT Field Edit Widget"); +} + +QString wFieldPlugin::whatsThis() const +{ + return QString("Entry to modify field value of Ananas's object"); +} + +QString wFieldPlugin::includeFile() const +{ + return QLatin1String("wfield.h"); +} + +QIcon wFieldPlugin::icon() const +{ +// return QIcon(); + return QIcon( ":/images/wfield.png" ); +} + +QString wFieldPlugin::domXml() const +{ + return "\n\n"; +} + diff --git a/src/plugins/field/wfield_plugin.h b/src/plugins/field/wfield_plugin.h new file mode 100644 index 0000000..ddb61a0 --- /dev/null +++ b/src/plugins/field/wfield_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WFIELD_PLUGIN_H +#define WFIELD_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wFieldPlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wFieldPlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WFIELD_PLUGIN_H diff --git a/src/plugins/field/wfield_taskmenu.cpp b/src/plugins/field/wfield_taskmenu.cpp new file mode 100644 index 0000000..f526022 --- /dev/null +++ b/src/plugins/field/wfield_taskmenu.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wfield_taskmenu.h" +#include "wfield.h" +#include "efield.h" + + +wFieldTaskMenu::wFieldTaskMenu(wField *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wFieldTaskMenu::edit() +{ + /*eField e; + + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->widgetEditor(); +} + +QAction *wFieldTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wFieldTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wFieldTaskMenuFactory::wFieldTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wFieldTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wField *ob = qobject_cast(object)) + return new wFieldTaskMenu(ob, parent); + + return 0; +} diff --git a/src/plugins/field/wfield_taskmenu.h b/src/plugins/field/wfield_taskmenu.h new file mode 100644 index 0000000..7ce4e45 --- /dev/null +++ b/src/plugins/field/wfield_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WFIELD_TASKMENU_H +#define WFIELD_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wField; + +class wFieldTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wFieldTaskMenu(wField *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wField *m_widget; +}; + +class wFieldTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wFieldTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WFIELD_TASKMENU_H diff --git a/src/plugins/grouptree/grouptree.pri b/src/plugins/grouptree/grouptree.pri new file mode 100644 index 0000000..dde3799 --- /dev/null +++ b/src/plugins/grouptree/grouptree.pri @@ -0,0 +1,7 @@ +HEADERS += \ + grouptree/wgrouptree.h \ + grouptree/wgrouptree_plugin.h + +SOURCES += \ + grouptree/wgrouptree.cpp \ + grouptree/wgrouptree_plugin.cpp diff --git a/src/plugins/grouptree/wgrouptree.cpp b/src/plugins/grouptree/wgrouptree.cpp new file mode 100644 index 0000000..637c1f2 --- /dev/null +++ b/src/plugins/grouptree/wgrouptree.cpp @@ -0,0 +1,416 @@ +/**************************************************************************** +** $Id: wgrouptree.cpp,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the document plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +//Added by qt3to4: +#include +#include +#include +#include "wgrouptree.h" +#include "awidget.h" + +wGroupTreeItem::wGroupTreeItem( Q3ListView *parent, const QString &name ) + : Q3ListViewItem( parent, name ) +{ + level = -1; + parent = 0; + id = 0; +} + + +wGroupTreeItem::wGroupTreeItem( wGroupTreeItem *parent, wGroupTreeItem *after, const QString &name, int newlevel, ANANAS_UID newid ) + : Q3ListViewItem( parent, after, name ) +{ + level = newlevel; + id = newid; +} + + +wGroupTreeItem::wGroupTreeItem( wGroupTreeItem *parent, wGroupTreeItem *after, aCatGroup *g ) + : Q3ListViewItem( parent, after ) +{ + level = g->Value( "Level" ).toInt(); + id = g->getUid(); +// setText( 0, g->Value("Name").toString()+" "+QString::number( level )+" ("+QString::number( id )+")" ); + setText( 0, g->displayString() ); +} + + +wGroupTreeItem::~wGroupTreeItem() +{ +} + + + +wGroupTreeItem * +wGroupTreeItem::parentItem() +{ + return ( wGroupTreeItem *) parent(); +} + + +wGroupTree::wGroupTree( QWidget *parent, Qt::WFlags fl ) + : aWidget( parent, "wGroupTree", fl ) +{ + tree = new Q3ListView( this ); + tree->addColumn( "" ); + tree->header()->hide(); + tree->setSorting( 0 ); + tree->setSelectionMode( Q3ListView::Single ); + root = new wGroupTreeItem( tree, "ROOT" ); + root->setOpen( true ); + root->setPixmap(0, rcIcon("wcatalogue.png")); + + Q3GridLayout *l = new Q3GridLayout( this ); + l->addWidget( tree, 0, 0 ); + connect(tree, SIGNAL(selectionChanged(Q3ListViewItem*)), + this, SLOT( on_selectionChanged(Q3ListViewItem*))); +} + + +wGroupTree::~wGroupTree() +{ +} + + +void +wGroupTree::initObject( aDatabase *adb ) +{ + aWidget::initObject( adb ); + findGroupTree(); + //connectSlots(); +} + + +QDialog* +wGroupTree::createEditor( QWidget * )//parent ) +{ + return 0; //new eCatalogue( parent ); +} + + + +/*! + * Create aDocument database object. + */ +aObject * +wGroupTree::createDBObject( aCfgItem obj, aDatabase *adb ) +{ + return new aCatGroup( obj, adb ); +} + + +void +wGroupTree::buildGroupTree( aCfgItem obj, aCatGroup * cg1, wGroupTreeItem * wG ) +{ + aCatGroup cg2 (obj, db); + QString t; + int err = 0; + wGroupTreeItem *item; + CHECK_POINT + + err = cg2.SelectChild( cg1 ); + if ( !err ) + { +// CHECK_POINT +// QListViewItem * parent1 = new QListViewItem ( wG ); +// wG = new wGroupTreeItem ( tree, parent1 ); + do + { +// CHECK_POINT + t = cg2.Value("Name").toString(); +// CHECK_POINT + item = new wGroupTreeItem ( wG, 0, &cg2 ); //cg2.Value("Level").toInt(), cg2.getUid() ); + item->setPixmap( 0, rcIcon( "t_cat_g.png" )); +// buildGroupTree( obj, &cg2, wG ); +// CHECK_POINT + buildGroupTree( obj, &cg2, item ); +// CHECK_POINT + } + while ( cg2.Next() ); + } else { +// CHECK_POINT + printf("table %s err = %d\n", ( const char *)cg2.table()->name(), err); + } +} + + + +void +wGroupTree::findGroupTree() +{ + int oid = 0; + aCfgItem tab, cat; + if ( !db || !md ) return; + CHECK_POINT + aWidget *pc = parentContainer( this ); + if ( !pc ) return; + CHECK_POINT + printf("inserted in %s\n", pc->className()); + if ( pc->className() == QString("wCatalogue") ) { + cat = md->find( pc->getId() ); // md->find(mdc_metadata), md_catalogues, 0 ), md_catalogue, 0 ); + root->setText( 0, md->attr( cat, mda_name ) ); +// CHECK_POINT +// wGroupTreeItem *wG = new wGroupTreeItem ( tree, root, "root" ); +// aCatGroup cg ( cat, db ); + +// CHECK_POINT + buildGroupTree( cat, 0, root ); + CHECK_POINT + } +} + + +/*! + *\~english + * + *\~russian + * ������ ������������� �����. + *\~ + */ +void +wGroupTree::keyPressEvent ( QKeyEvent *e ) +{ + ANANAS_UID id = 0; + wGroupTreeItem * item = ( wGroupTreeItem * ) tree->currentItem(); + printf("key=%04x\n",e->key()); + switch ( e->key() ){ + case Qt::Key_Return: + id = item->id; + if ( e->state() == Qt::ShiftModifier ) { + printf("Shift+Return pressed %Li\n", id); + if ( id ) EditGroup(); + } else { + printf("Return pressed %Li\n", id ); + emit( selected( id ) ); + } + e->accept(); + break; + case Qt::Key_Escape: + break; + case Qt::Key_Delete: + id = item->id; + if ( id ) DeleteGroup(); + break; + case Qt::Key_Insert: + NewGroup(); + item = ( wGroupTreeItem * ) tree->currentItem(); + id = item->id; + if ( id ) EditGroup(); + break; + + default: + e->ignore(); + break; + } + aWidget::keyPressEvent( e ); +} + + + +void +wGroupTree::NewGroup() +{ + wGroupTreeItem *item, *cur; + QString t = "Element"; + int level; + + cur = ( wGroupTreeItem *) tree->currentItem(); + if ( !cur ) cur = root; + level = cur->level + 1; + ( ( aCatGroup *) dbobj )->New(); + dbobj->SetValue("Name", t); + dbobj->setSysValue("level", level ); + dbobj->setSysValue("idp", cur->id ); + dbobj->Update(); + item = new wGroupTreeItem ( cur, 0, ( aCatGroup *) dbobj ); //level, dbobj->getUid() ); + item->id = dbobj->getUid(); + cur->setOpen( true ); + tree->setCurrentItem( item ); + +} + + +void +wGroupTree::DeleteGroup() +{ +CHECK_POINT + aCatGroup g( *getMDObject(), db); + wGroupTreeItem * item = ( wGroupTreeItem * ) tree->currentItem(); + if(item!=root) + { + g.select( item->id ); + g.Delete(); + item->id=0; + item->setText(0,"X"); + } +} + + +void +wGroupTree::EditGroup() +{ + ANANAS_UID id = 0; + wGroupTreeItem * item = ( wGroupTreeItem * ) tree->currentItem(); + if(item!=root) + { + aForm * f = 0; + if ( item ) id = item->id; +CHECK_POINT + if ( id ) { + if ( engine ) { + f = engine->openForm( parentContainer( this )->getId(), 0, md_action_edit, md_form_group, id, this ); + if ( f ) { + f->SelectGroup(id); + connect(f, SIGNAL( update( ANANAS_UID )), this, SLOT(updateItem( ANANAS_UID ))); +// connect(f, SIGNAL(selected( Q_ULLONG )), this, SLOT(on_selected( Q_ULLONG ))); +// f->closeAfterSelect = true; + } + } else printf("No Engine\n"); + + } + } +} + + +//void +//wGroupTree::UpdateItem( aCatGroup *g ) +//{ +//} + + +/*! + * Show appropriated group after catalogue item selected. + */ +void +wGroupTree::on_selected( ANANAS_UID element ) +{ + +} + + +/*! + * Update item after edit. + */ +void +wGroupTree::updateItem( ANANAS_UID element ) +{ + wGroupTreeItem *i = 0; + aCatGroup g( *getMDObject(), db); + + printf("Need update text %Li\n", element); + i = findItem( element ); + if ( i ) { + g.select( element ); + printf("founded text %Li %s\n", element, (const char *) i->text(0)); + i->setText( 0, g.displayString() ); + + } +} + + +wGroupTreeItem * +wGroupTree::findItem( ANANAS_UID id ) +{ + wGroupTreeItem *i = 0; + + Q3ListViewItemIterator it( tree ); + while ( i = ( wGroupTreeItem *) it.current() ) { + if ( i->id == id ) break; + ++it; + } + return i; +} + + +/*! + * Create toolbar for Journal. + */ +Q3ToolBar* +wGroupTree::createToolBar( Q3MainWindow * owner ) +{ + QAction *a; + Q3ToolBar *t = new Q3ToolBar( owner, "GroupTreeTools" ); + + a = new QAction( + rcIcon("doc_new.png"), + tr("New"), + QKeySequence(""),//Insert"), + t, + tr("New group") + ); + a->setToolTip(tr("New group (Ins)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( NewGroup() ) ); + + a = new QAction( + rcIcon("doc_edit.png"), + tr("Edit"), + QKeySequence(""),//Return"), + t, + tr("Edit group") + ); + a->setToolTip(tr("Edit group (Enter)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( EditGroup() ) ); + +/* a = new QAction( + QPixmap::fromMimeSource("doc_view.png"), + tr("View"), + QKeySequence("Shifh+Return"), + t, + tr("View element") + ); + a->setToolTip(tr("View element (Shift+Enter)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( view() ) ); +*/ + a = new QAction( + rcIcon("doc_delete.png"), + tr("Delete group"), + QKeySequence(""),//Delete"), + t, + tr("Delete group") + ); + a->setToolTip(tr("Delete group (Delete)")); + a->addTo( t ); + connect( a, SIGNAL( activated() ), this, SLOT( DeleteGroup() ) ); + + + return 0; +} + +void +wGroupTree::on_selectionChanged( Q3ListViewItem * item) +{ + printf("wGroupTree id =%llu\n",((wGroupTreeItem*) item)->id); + emit(selectionChanged( ((wGroupTreeItem*) item)->id) ); +} diff --git a/src/plugins/grouptree/wgrouptree.h b/src/plugins/grouptree/wgrouptree.h new file mode 100644 index 0000000..296cc68 --- /dev/null +++ b/src/plugins/grouptree/wgrouptree.h @@ -0,0 +1,95 @@ +/**************************************************************************** +** $Id: wgrouptree.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the document plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WGROUPTREE_H +#define WGROUPTREE_H + +#include +#include +#include +//Added by qt3to4: +#include +#include "awidget.h" + +class wGroupTreeItem; + +class QT_WIDGET_PLUGIN_EXPORT wGroupTree : public aWidget +{ + Q_OBJECT +public: + Q3ListView *tree; + wGroupTreeItem *root; + + wGroupTree( QWidget *parent = 0, Qt::WFlags fl = 0 ); + virtual ~wGroupTree(); + + virtual void initObject( aDatabase *adb ); + virtual QDialog* createEditor( QWidget *parent ); + virtual Q3ToolBar* createToolBar( Q3MainWindow *parent ); + virtual aObject *createDBObject( aCfgItem obj, aDatabase *adb ); + void buildGroupTree( aCfgItem obj, aCatGroup * cg1, wGroupTreeItem * wG ); + void findGroupTree(); + wGroupTreeItem *findItem( ANANAS_UID id ); +public slots: + void NewGroup(); + void DeleteGroup(); + void EditGroup(); +// void UpdateItem( aCatGroup *g ); +private slots: + void on_selected( ANANAS_UID element ); +// void updateItem( ANANAS_UID element ); + void updateItem( ANANAS_UID element ); + void on_selectionChanged( Q3ListViewItem *); +signals: + virtual void selected( ANANAS_UID group ); + virtual void selectionChanged( const qulonglong ); +protected: + virtual void keyPressEvent ( QKeyEvent *e ); +private: +}; + + + +class wGroupTreeItem : public Q3ListViewItem +{ +public: + ANANAS_UID id; + int level; + wGroupTreeItem( Q3ListView *parent, const QString &name = QString::null ); + wGroupTreeItem( wGroupTreeItem *parent, wGroupTreeItem *after, const QString &name = QString::null, int newlevel = 0, ANANAS_UID newid = 0 ); + wGroupTreeItem( wGroupTreeItem *parent, wGroupTreeItem *after, aCatGroup *g = 0 ); + virtual ~wGroupTreeItem(); + wGroupTreeItem *parentItem(); +private: +}; + + + +#endif // WGROUPTREE_H + diff --git a/src/plugins/grouptree/wgrouptree_plugin.cpp b/src/plugins/grouptree/wgrouptree_plugin.cpp new file mode 100644 index 0000000..67be9bf --- /dev/null +++ b/src/plugins/grouptree/wgrouptree_plugin.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wgrouptree_plugin.h" + +#include + +#include "wgrouptree.h" + + +wGroupTreePlugin::wGroupTreePlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wGroupTreePlugin::isContainer() const +{ + return false; +} + +bool wGroupTreePlugin::isInitialized() const +{ + return m_initialized; +} + +void wGroupTreePlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + m_initialized = true; +} + +QWidget *wGroupTreePlugin::createWidget(QWidget *parent) +{ + wGroupTree *w = new wGroupTree(parent); + return w; +} + +QString wGroupTreePlugin::name() const +{ + return QLatin1String("wGroupTree"); +} + +QString wGroupTreePlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wGroupTreePlugin::toolTip() const +{ + return QString("Ananas for QT Group Tree Widget"); +} + +QString wGroupTreePlugin::whatsThis() const +{ + return QString("Entry to select group of Ananas's object"); +} + +QString wGroupTreePlugin::includeFile() const +{ + return QLatin1String("wgrouptree.h"); +} + +QIcon wGroupTreePlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wgrouptree.png"); +} + +QString wGroupTreePlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/grouptree/wgrouptree_plugin.h b/src/plugins/grouptree/wgrouptree_plugin.h new file mode 100644 index 0000000..d900af1 --- /dev/null +++ b/src/plugins/grouptree/wgrouptree_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WGROUPTREE_PLUGIN_H +#define WGROUPTREE_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wGroupTreePlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wGroupTreePlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WGROUPTREE_PLUGIN_H diff --git a/src/plugins/images/acombobox.png b/src/plugins/images/acombobox.png new file mode 100644 index 0000000..7d4890a Binary files /dev/null and b/src/plugins/images/acombobox.png differ diff --git a/src/plugins/images/doc_copy.png b/src/plugins/images/doc_copy.png new file mode 100644 index 0000000..4a7c257 Binary files /dev/null and b/src/plugins/images/doc_copy.png differ diff --git a/src/plugins/images/doc_delete.png b/src/plugins/images/doc_delete.png new file mode 100644 index 0000000..c79311f Binary files /dev/null and b/src/plugins/images/doc_delete.png differ diff --git a/src/plugins/images/doc_edit.png b/src/plugins/images/doc_edit.png new file mode 100644 index 0000000..9e70eac Binary files /dev/null and b/src/plugins/images/doc_edit.png differ diff --git a/src/plugins/images/doc_new.png b/src/plugins/images/doc_new.png new file mode 100644 index 0000000..6c8b94d Binary files /dev/null and b/src/plugins/images/doc_new.png differ diff --git a/src/plugins/images/doc_view.png b/src/plugins/images/doc_view.png new file mode 100644 index 0000000..9b17518 Binary files /dev/null and b/src/plugins/images/doc_view.png differ diff --git a/src/plugins/images/wactionbutton.png b/src/plugins/images/wactionbutton.png new file mode 100644 index 0000000..a6a1e08 Binary files /dev/null and b/src/plugins/images/wactionbutton.png differ diff --git a/src/plugins/images/wcatalogue.png b/src/plugins/images/wcatalogue.png new file mode 100644 index 0000000..9b26a30 Binary files /dev/null and b/src/plugins/images/wcatalogue.png differ diff --git a/src/plugins/images/wdbfield.png b/src/plugins/images/wdbfield.png new file mode 100644 index 0000000..f8e8b77 Binary files /dev/null and b/src/plugins/images/wdbfield.png differ diff --git a/src/plugins/images/wdbtable.png b/src/plugins/images/wdbtable.png new file mode 100644 index 0000000..233b076 Binary files /dev/null and b/src/plugins/images/wdbtable.png differ diff --git a/src/plugins/images/wdocument.png b/src/plugins/images/wdocument.png new file mode 100644 index 0000000..61334f2 Binary files /dev/null and b/src/plugins/images/wdocument.png differ diff --git a/src/plugins/images/wfield.png b/src/plugins/images/wfield.png new file mode 100644 index 0000000..7a26951 Binary files /dev/null and b/src/plugins/images/wfield.png differ diff --git a/src/plugins/images/wgrouptree.png b/src/plugins/images/wgrouptree.png new file mode 100644 index 0000000..9b26a30 Binary files /dev/null and b/src/plugins/images/wgrouptree.png differ diff --git a/src/plugins/images/wjournal.png b/src/plugins/images/wjournal.png new file mode 100644 index 0000000..4d92109 Binary files /dev/null and b/src/plugins/images/wjournal.png differ diff --git a/src/plugins/images/wreport.png b/src/plugins/images/wreport.png new file mode 100644 index 0000000..0c4bb0c Binary files /dev/null and b/src/plugins/images/wreport.png differ diff --git a/src/plugins/images/wtable.png b/src/plugins/images/wtable.png new file mode 100644 index 0000000..7198416 Binary files /dev/null and b/src/plugins/images/wtable.png differ diff --git a/src/plugins/journal/ejournal.cpp b/src/plugins/journal/ejournal.cpp new file mode 100644 index 0000000..b360bba --- /dev/null +++ b/src/plugins/journal/ejournal.cpp @@ -0,0 +1,201 @@ +#include "ejournal.h" + +#include +#include +#include + +#include "acfg.h" + +/* + * Constructs a eJournal as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eJournal::eJournal(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eJournal::~eJournal() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eJournal::languageChange() +{ + retranslateUi(this); +} + +void eJournal::init() +{ +/* + int oc, i, f, idx=0; + char *id, *name, *ot; + cfg_objptr o; + char otype[100]; + QString named; + + otypes.clear(); + eType->clear(); + otypes.append("D"); + eType->insertItem(trUtf8("Дата"), idx++); + otypes.append("T"); + eType->insertItem(trUtf8("Время"), idx++); + otypes.append("N %d %d"); + eType->insertItem(trUtf8("Число"), idx++); + otypes.append("C %d"); + eType->insertItem(trUtf8("Строка"), idx++); + + oc=cfgobj_count(NULL, NULL); + for (i=1;i<=oc;i++) { + id=cfgobj_idn(NULL, NULL, i, &o); + ot=(char *)o->name; + name=cfgobj_attr(o, "name"); + named=""; + f=0; + if (strcmp((char *)ot, aot_doc)==0) { + named=trUtf8("Документ."); + f=1; + } + if (strcmp((char *)ot, aot_cat)==0) { + named=trUtf8("Справочник."); + f=1; + } + if (f) { + named=named+trUtf8(name); + sprintf(otype, "O %s", id); + otypes.append(otype); + eType->insertItem(named, idx++); + } + } +*/ +} + + + +/*void eJournal::setData( aCatalogue *f, QWidget *mw ) +{ + aCfg *md = 0; + if ( !f ) return; +// printf("name = '%s'\n", (const char *) mw->name() ); + if (mw->name() == QString("ananas-designer_mainwindow") ) { +// printf("running under ananas designer\n"); + CfgForm *cf = ( ( MainForm *) mw )->cfgForm(); + if ( cf ) { + md = &cf->cfg; +// QString ts = f->getFieldType(); +// char t=' '; + int w=0, d=0, idx=0; + unsigned int i; + long oid , id; + + id = f->getId(); + + otypes.clear(); + eType->clear(); + + QStringList tlist = md->types( md_catalogue ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == id ) { + eType->setCurrentItem( i ); + break; + } + } + } + } else reject(); + } + +} +*/ + +void +eJournal::setData( QWidget *o, aCfg *md ) +{ +// const QObject *o = sender(); + if ( o ) { + if ( o->className() != QString("wJournal") || !md ) { + reject(); + return; + } + } + else { + reject(); + return; + } + wJournal *f = ( wJournal*) o; + int w=0, d=0, idx=0; + unsigned int i; + long oid , id; + + id = f->getId(); + + QStringList tlist = md->types( md_journal ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == id ) { + eType->setCurrentItem( i ); + break; + } + } + } +} + + +void eJournal::getData( QWidget * o ) +{ + +/* int idx=eType->currentItem(); + long oid = 0; + + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); + f->setId( oid ); + } + } +*/ +// const QObject *o = sender(); + if ( !o ) return; + if ( o->className() != QString("wJournal") ) return; + wJournal *f = ( wJournal*) o; + + int idx=eType->currentItem(); + long oid = 0; + + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); + f->setId( oid ); + } + } + +} diff --git a/src/plugins/journal/ejournal.h b/src/plugins/journal/ejournal.h new file mode 100644 index 0000000..fdeeccb --- /dev/null +++ b/src/plugins/journal/ejournal.h @@ -0,0 +1,27 @@ +#ifndef EJOURNAL_H +#define EJOURNAL_H + +#include "ui_ejournal.h" + + +class eJournal : public QDialog, public Ui::eJournal +{ + Q_OBJECT + +public: + eJournal(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eJournal(); + + QStringList otypes; + +public slots: + virtual void init(); + virtual void setData( QWidget * o, aCfg * md ); + virtual void getData( QWidget * o ); + +protected slots: + virtual void languageChange(); + +}; + +#endif // EJOURNAL_H diff --git a/src/plugins/journal/ejournal.ui b/src/plugins/journal/ejournal.ui new file mode 100644 index 0000000..d96107a --- /dev/null +++ b/src/plugins/journal/ejournal.ui @@ -0,0 +1,116 @@ + + + + + eJournal + + + + 0 + 0 + 348 + 109 + + + + Journal + + + + + + + + + + + + + 100 + 32767 + + + + Type + + + false + + + + + + + + 31 + 16 + + + + Expanding + + + Vertical + + + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + + + 91 + 31 + + + + Expanding + + + Horizontal + + + + + + + qPixmapFromMimeSource + + ananas.h + wjournal.h + + + + bOK + clicked() + eJournal + accept() + + + bCancel + clicked() + eJournal + reject() + + + diff --git a/src/plugins/journal/journal.pri b/src/plugins/journal/journal.pri new file mode 100644 index 0000000..61ed3fb --- /dev/null +++ b/src/plugins/journal/journal.pri @@ -0,0 +1,15 @@ +HEADERS += \ + journal/ejournal.h \ + journal/wjournal.h \ + journal/wjournal_plugin.h \ + journal/wjournal_taskmenu.h + +SOURCES += \ + journal/ejournal.cpp \ + journal/wjournal.cpp \ + journal/wjournal_plugin.cpp \ + journal/wjournal_taskmenu.cpp + +FORMS += \ + journal/ejournal.ui + \ No newline at end of file diff --git a/src/plugins/journal/wjournal.cpp b/src/plugins/journal/wjournal.cpp new file mode 100644 index 0000000..5d51361 --- /dev/null +++ b/src/plugins/journal/wjournal.cpp @@ -0,0 +1,351 @@ +/**************************************************************************** +** $Id: wjournal.cpp,v 1.2 2008/11/08 20:16:36 leader Exp $ +** +** Code file of the journal plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include "adatabase.h" +#include "wjournal.h" +#include "ejournal.h" +#include "eselectdoctype.h" +#include "adocjournal.h" +#include "eselectdoctype.h" +#include "wdbtable.h" +#include "alog.h" + + + +wJournal::wJournal( QWidget *parent, Qt::WFlags fl ) +:aWidget( parent, "wJournal", fl ) +{ + dSelectType = new eSelectDocType(); + setInited( false ); +} + + +wJournal::~wJournal() +{ + delete dSelectType; + dSelectType = 0; +} + + + +void +wJournal::initObject( aDatabase *adb ) +{ + eSelectDocType *d = ( eSelectDocType *)dSelectType; + aWidget::initObject( adb ); + d->setJournal( &adb->cfg, getId() ); + + + if(((aDocJournal*)dbobj)->type()==0 && toolbar) + { + date_from = new Q3DateEdit(toolbar); + date_to = new Q3DateEdit(toolbar); + QDate current = QDate::currentDate(); + date_to->setMinimumWidth(100); + date_from->setMinimumWidth(100); + date_to->setDate(current); + date_from->setDate(current.addMonths(-1)); + connect(date_from, SIGNAL(valueChanged(const QDate &)), this, SLOT(setFilterByDate())); + connect(date_to, SIGNAL(valueChanged(const QDate &)), this, SLOT(setFilterByDate())); + } + else + { + date_from = date_to = 0; + } + setFilterByDate(); + QObject *obj; + uint i = 0; + QObjectList lb = this->queryList( "wDBTable", 0, false, false ); + QListIterator itb( lb ); // iterate over the buttons + i = 0; + while ( itb.hasNext() ) + { + obj = itb.next(); + //printf("wDBTable #%u found\n",++i); + aLog::print(aLog::Info, tr("wDBTable #%1 found ").arg(++i)); + connect( (wDBTable *)obj, SIGNAL(selectRecord( qulonglong )), + this, SLOT(select( qulonglong )) ); + connect( (wDBTable *)obj, SIGNAL( insertRequest()), + this, SLOT(insert()) ); + connect( (wDBTable *)obj, SIGNAL(updateRequest()), + this, SLOT(update()) ); + connect( (wDBTable *)obj, SIGNAL(viewRequest()), + this, SLOT(view()) ); + connect( (wDBTable *)obj, SIGNAL(deleteRequest()), + this, SLOT(markDelete()) ); +//<<<<<<< wjournal.cpp +// ((QWidget *)obj)->setFocus(); // set focus to wDBTable + +//======= + //((QWidget *)obj)->setFocus(); // set focus to wDBTable + +//>>>>>>> 1.15.2.6 + } + //--delete lb; // delete the list, not the objects + //--lb=0; + +} + + +bool +wJournal::checkStructure() +{ + + return false; +} + + +/*! + * Create toolbar for Journal. + */ +Q3ToolBar* +wJournal::createToolBar( Q3MainWindow * owner ) +{ + QAction *a,*b,*c,*d, *e; + toolbar = new Q3ToolBar( owner, "JournalTools" ); + a = new QAction( + rcIcon("doc_new.png"), + tr("New"), + QKeySequence(QString("Insert")), + toolbar, + tr("New document") + ); + a->setToolTip(tr("New document ")); + a->addTo( toolbar ); + connect( a, SIGNAL( activated() ), this, SLOT( insert() ) ); + b = new QAction( + rcIcon("doc_edit.png"), + tr("Edit"), + QKeySequence(Qt::Key_Return), + toolbar, + tr("Edit document") + ); + b->setToolTip(tr("Edit document ")); + b->addTo( toolbar ); + connect( b, SIGNAL( activated() ), this, SLOT( update() ) ); + c = new QAction( + rcIcon("doc_view.png"), + tr("View"), + QKeySequence(Qt::SHIFT + Qt::Key_Return), + toolbar, + tr("View document") + ); + c->setToolTip(tr("View document ")); + c->addTo( toolbar ); + connect( c, SIGNAL( activated() ), this, SLOT( view() ) ); + d = new QAction( + rcIcon("doc_delete.png"), + tr("Delete"), + QKeySequence(QString("Del")), + toolbar, + tr("Delete document") + ); + d->setToolTip(tr("Delete document ")); + d->addTo( toolbar ); + connect( d, SIGNAL( activated() ), this, SLOT( markDelete() ) ); + + e = new QAction( + rcIcon("doc_copy.png"), + tr("Copy"), + QKeySequence(Qt::CTRL+Qt::Key_D), + toolbar, + tr("Copy document") + ); + e->setToolTip(tr("Duplicate document ")); + e->addTo( toolbar ); + connect( e, SIGNAL( activated() ), this, SLOT( copy() ) ); + + return toolbar; +} + + + +QDialog* +wJournal::createEditor( QWidget *parent ) +{ + return new eJournal( parent ); +} + + +int +wJournal::select( qulonglong id ) +{ + if ( !dbobj ) return err_abstractobj; + docUid = dbobj->docId(); +// docUid = 0; + docId = db->uidType(docUid); +// printf("selected record uid = %llu, doc uid = %llu doc md id %i\n", id, docUid, docId ); + return 0; +} + + + +qulonglong +wJournal::insert() +{ + aForm * f = 0; + int md_id = 0; + eSelectDocType *d = ( eSelectDocType *)dSelectType; + + if ( dSelectType->exec() == QDialog::Accepted ) { + md_id = d->docId; + if ( md_id > 0 ){ + if ( engine ) { + f = engine->openForm( md_id, 0, md_action_new, 0, 0, (aWidget*)this ); + if ( f ) { +// connect(f, SIGNAL(selected( Q_ULLONG )), this, SLOT(on_selected( Q_ULLONG ))); +// f->closeAfterSelect = true; + } + } else printf("engine = NULL\n"); + + } + } + return 0; +} + + +int +wJournal::update() +{ + if ( !dbobj ) return err_abstractobj; + aDocument *doc = ((aDocJournal*)dbobj)->CurrentDocument(); + //doc->select(docUid); + int res=0; + if(doc->IsConducted()) + { + res = QMessageBox::question(this, + tr("Can not edit document"), + tr("To edit document you have to unconduct it. Or you can view it. Unconduct?"), + tr("&Unconduct"), tr("&View"), + QString::null, 0, 1 ); + } + else + { + delete doc; + engine->openForm( docId, 0, md_action_edit, 0, docUid, (aWidget*)this ); + return 0; + } + if(res==0) + { + doc->UnConduct(); + engine->openForm( docId, 0, md_action_edit, 0, docUid, (aWidget*)this ); + } + else + { + view(); + } + delete doc; + return 0; +} + +int +wJournal::copy() +{ + aDocument *doc = ((aDocJournal*)dbobj)->CurrentDocument(); + if(doc) + { + int res = doc->Copy(); + Refresh(); + return res; + } + return err_copyerror; +} +int +wJournal::view() +{ +//CHECK_POINT + engine->openForm( docId, 0, md_action_view, 0, docUid, (aWidget*)this ); + return 0; +} + + + +int +wJournal::markDelete() +{ + if ( !dbobj ) return err_abstractobj; + int res = QMessageBox::question(this, + tr("Confirm"), + tr("Do you really want to delete document?"), + tr("&Yes"), tr("&No"), + QString::null, 0, 1 ); + if(res) return res; + aDocument *doc = ((aDocJournal*)dbobj)->CurrentDocument(); + if(doc->IsConducted()) doc->UnConduct(); + res = doc->Delete(); + //invalidate selection + docId = docUid = 0; + Refresh(); + delete doc; + doc = 0; + return res; +} + + +QString +wJournal::displayString() +{ + return "***"; +} + + +/*! + * Create aDocJournal database object. + */ +aObject * +wJournal::createDBObject( aCfgItem obj, aDatabase *adb ) +{ + return new aDocJournal( obj, adb ); +} + +void +wJournal::setFilterByDate() +{ + if(date_from && date_to) + { + QObject *obj; + QObjectList lb = this->queryList( "wDBTable" ); + QListIterator itb( lb ); // iterate over the buttons + while ( itb.hasNext() ) + { + obj = itb.next(); + ((wDBTable *)obj)->setFilter(QString("ddate>='%1T00:00:00' AND ddate<='%2T23:59:59'").arg(date_from->date().toString(Qt::ISODate)).arg(date_to->date().toString(Qt::ISODate))); + } + //--delete lb; // delete the list, not the objects + } + Refresh(); +} diff --git a/src/plugins/journal/wjournal.h b/src/plugins/journal/wjournal.h new file mode 100644 index 0000000..6c26952 --- /dev/null +++ b/src/plugins/journal/wjournal.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** $Id: wjournal.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the catlogue plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WJOURNAL_H +#define WJOURNAL_H +#include +#include +#include "awidget.h" + +class QWidget; +/*! + *\en + * Visual object for work with Journals of Documents. + *\_en + *\ru + * \brief Визуальный объект - контейнер для работы с Журналами документов. + * Наследует aWidget. + * + * При создании диалогов - экранных форм журналов все элементы диалога + * (в том числе wDBField, wDBTable) располагаются в этом контейнере. + * В свойстве aObject *dbobj, унаследованном от aWidget, этого класса хранится объект доступа к данным + * журнала в sql таблице базы данных, используемый элементами диалога для выборки и записи данных в базу данных. + * Смотрите метод wJournal::dataObject(). + * В свойстве aCfgItem obj, унаследованном от aWidget, этого класса хранится элемент конфигурации (метаданные), + * описывающий структуру объекта данных (как правило таблицу). + * Смотрите метод wJournal::getMDObject(). + *\_ru + */ + +class QT_WIDGET_PLUGIN_EXPORT wJournal : public aWidget +{ + Q_OBJECT +public: + wJournal( QWidget *parent = 0, Qt::WFlags fl = 0 ); + virtual ~wJournal(); + bool checkStructure(); + virtual void initObject( aDatabase *adb ); + virtual Q3ToolBar* createToolBar( Q3MainWindow *parent ); + virtual QDialog* createEditor( QWidget *parent ); + virtual QString displayString(); + virtual bool isContainer() { return true; }; + virtual aObject* createDBObject( aCfgItem obj, aDatabase *adb ); +// virtual ERR_Code Select( Q_ULLONG id ); + + +public slots: + int select( qulonglong id ); + qulonglong insert(); + int update(); + int view(); + int markDelete(); + int copy(); + +protected slots: + void setFilterByDate(); + +private: + QDialog *dSelectType; + Q3ToolBar *toolbar; + Q3DateEdit *date_from, *date_to; + qulonglong docUid; + int docId; +}; + + +#endif // WJOURNAL_H diff --git a/src/plugins/journal/wjournal_plugin.cpp b/src/plugins/journal/wjournal_plugin.cpp new file mode 100644 index 0000000..e965f72 --- /dev/null +++ b/src/plugins/journal/wjournal_plugin.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wjournal_plugin.h" + +#include +#include +#include + +#include "wjournal_taskmenu.h" +#include "wjournal.h" + + +wJournalPlugin::wJournalPlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wJournalPlugin::isContainer() const +{ + return true; +} + +bool wJournalPlugin::isInitialized() const +{ + return m_initialized; +} + +void wJournalPlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wJournalTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; +} + +QWidget *wJournalPlugin::createWidget(QWidget *parent) +{ + wJournal *w = new wJournal(parent, 0); + return w; +} + +QString wJournalPlugin::name() const +{ + return QLatin1String("wJournal"); +} + +QString wJournalPlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wJournalPlugin::toolTip() const +{ + return QString(); +} + +QString wJournalPlugin::whatsThis() const +{ + return QString(); +} + +QString wJournalPlugin::includeFile() const +{ + return QLatin1String("wjournal.h"); +} + +QIcon wJournalPlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wjournal.png"); +} + +QString wJournalPlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/journal/wjournal_plugin.h b/src/plugins/journal/wjournal_plugin.h new file mode 100644 index 0000000..38adaed --- /dev/null +++ b/src/plugins/journal/wjournal_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WJOURNAL_PLUGIN_H +#define WJOURNAL_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wJournalPlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wJournalPlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WJOURNAL_PLUGIN_H diff --git a/src/plugins/journal/wjournal_taskmenu.cpp b/src/plugins/journal/wjournal_taskmenu.cpp new file mode 100644 index 0000000..e30713f --- /dev/null +++ b/src/plugins/journal/wjournal_taskmenu.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wjournal_taskmenu.h" +#include "wjournal.h" +#include "ejournal.h" + + +wJournalTaskMenu::wJournalTaskMenu(wJournal *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wJournalTaskMenu::edit() +{ + /*eJournal e; + + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->widgetEditor(); +} + +QAction *wJournalTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wJournalTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wJournalTaskMenuFactory::wJournalTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wJournalTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wJournal *ob = qobject_cast(object)) + return new wJournalTaskMenu(ob, parent); + + return 0; +} diff --git a/src/plugins/journal/wjournal_taskmenu.h b/src/plugins/journal/wjournal_taskmenu.h new file mode 100644 index 0000000..5d28257 --- /dev/null +++ b/src/plugins/journal/wjournal_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WJOURNAL_TASKMENU_H +#define WJOURNAL_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wJournal; + +class wJournalTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wJournalTaskMenu(wJournal *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wJournal *m_widget; +}; + +class wJournalTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wJournalTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WJOURNAL_TASKMENU_H diff --git a/src/plugins/plugins.pri b/src/plugins/plugins.pri new file mode 100644 index 0000000..086eaf5 --- /dev/null +++ b/src/plugins/plugins.pri @@ -0,0 +1,12 @@ +INCLUDEPATH += \ + ../plugins/actionbutton \ + ../plugins/catalogue \ + ../plugins/combobox \ + ../plugins/dbfield \ + ../plugins/dbtable \ + ../plugins/document \ + ../plugins/field \ + ../plugins/grouptree \ + ../plugins/journal \ + ../plugins/report \ + ../plugins/table diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro new file mode 100644 index 0000000..16b9581 --- /dev/null +++ b/src/plugins/plugins.pro @@ -0,0 +1,84 @@ +#!define TARGET first for correct temporray paths definitions +TARGET = ananasplugin4 + +include( plugins.pri ) +include( ../lib/lib.pri ) +include ( ../ananas.pri ) +load(qsa) + +TEMPLATE = lib +shared:CONFIG += dll plugin + +DESTDIR = ../../lib/designer +DLLDESTDIR = ../../bin + +INCLUDEPATH += ../plugins ../lib +LIBS += -L../../lib -lananas4 + +shared { + win32:DEFINES+= QT_PLUGIN # ANANAS_DLL +} else { + win32:DEFINES += ANANAS_NO_DLL +} + +unix { + LIBS += -L/usr/X11R6/lib/ +} + +HEADERS = \ + aform.h \ + atoolbar.h \ + awidgets_plugin.h \ + eaddobj.h \ + engine.h \ + qwidgetplugin.h + +SOURCES = \ + aform.cpp \ + atoolbar.cpp \ + awidgets_plugin.cpp \ + engine.cpp \ + eaddobj.cpp + +FORMS = \ + eaddobj.ui + +RESOURCES += \ + plugins.qrc + +TRANSLATIONS = \ + ../../translations/ananas-plugins-en.ts \ + ../../translations/ananas-plugins-ru.ts + +#SLASH = / +unix { + lplugin.path = $(QTDIR)/plugins/designer + lplugin.files = libananasplugin4.so + lplugin.extra = cp -f libananasplugin4.so $(INSTALL_ROOT)$(LIBDIR) || true + lpluginheader.path = $(INCLUDEDIR) + lpluginheader.files = $$HEADERS +} + +win32 { + target.path = $(QTDIR)\plugins\designer + lplugin.path = $(QTDIR)\plugins\designer + lplugin.files = ananasplugin4.* + lplugin.extra = copy ananasplugin4.* $(QTDIR)\lib +} + +#INSTALLS += lplugin +unix{ +# INSTALLS += lpluginheader +} + +include ( actionbutton/actionbutton.pri ) +include ( catalogue/catalogue.pri ) +include ( combobox/combobox.pri ) +include ( dbfield/dbfield.pri ) +include ( dbtable/dbtable.pri ) +include ( document/document.pri ) +include ( field/field.pri ) +include ( grouptree/grouptree.pri ) +include ( journal/journal.pri ) +include ( report/report.pri ) +include ( table/table.pri ) diff --git a/src/plugins/plugins.qrc b/src/plugins/plugins.qrc new file mode 100644 index 0000000..3d31bd5 --- /dev/null +++ b/src/plugins/plugins.qrc @@ -0,0 +1,20 @@ + + + images/acombobox.png + images/doc_copy.png + images/doc_delete.png + images/doc_edit.png + images/doc_new.png + images/doc_view.png + images/wactionbutton.png + images/wcatalogue.png + images/wdbfield.png + images/wdbtable.png + images/wdocument.png + images/wfield.png + images/wgrouptree.png + images/wjournal.png + images/wreport.png + images/wtable.png + + diff --git a/src/plugins/qwidgetplugin.h b/src/plugins/qwidgetplugin.h new file mode 100644 index 0000000..32204a3 --- /dev/null +++ b/src/plugins/qwidgetplugin.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** $Id: qwidgetplugin.h,v 1.2 2008/11/27 20:20:55 leader Exp $ +** +** Definition of QWidgetPlugin class +** +** Created : 010920 +** +** Copyright (C) 2001-2005 Trolltech AS. All rights reserved. +** +** This file is part of the widgets module of the Qt GUI Toolkit. +** +** This file may be distributed under the terms of the Q Public License +** as defined by Trolltech AS of Norway and appearing in the file +** LICENSE.QPL included in the packaging of this file. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** See http://www.trolltech.com/qpl/ for QPL licensing information. +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef QWIDGETPLUGIN_H +#define QWIDGETPLUGIN_H + +#ifndef QT_NO_WIDGETPLUGIN + +#ifdef Q_WS_WIN +#ifdef QT_PLUGIN +#define QT_WIDGET_PLUGIN_EXPORT __declspec(dllexport) +#else +#define QT_WIDGET_PLUGIN_EXPORT __declspec(dllimport) +#endif +#else +#define QT_WIDGET_PLUGIN_EXPORT +#endif + +#endif // QT_NO_WIDGETPLUGIN +#endif // QWIDGETPLUGIN_H diff --git a/src/plugins/report/ereport.cpp b/src/plugins/report/ereport.cpp new file mode 100644 index 0000000..a400818 --- /dev/null +++ b/src/plugins/report/ereport.cpp @@ -0,0 +1,201 @@ +#include "ereport.h" + +#include +#include +#include + +#include "acfg.h" + +/* + * Constructs a eReport as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eReport::eReport(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eReport::~eReport() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eReport::languageChange() +{ + retranslateUi(this); +} + +void eReport::init() +{ +/* + int oc, i, f, idx=0; + char *id, *name, *ot; + cfg_objptr o; + char otype[100]; + QString named; + + otypes.clear(); + eType->clear(); + otypes.append("D"); + eType->insertItem(trUtf8("Дата"), idx++); + otypes.append("T"); + eType->insertItem(trUtf8("Время"), idx++); + otypes.append("N %d %d"); + eType->insertItem(trUtf8("Число"), idx++); + otypes.append("C %d"); + eType->insertItem(trUtf8("Строка"), idx++); + + oc=cfgobj_count(NULL, NULL); + for (i=1;i<=oc;i++) { + id=cfgobj_idn(NULL, NULL, i, &o); + ot=(char *)o->name; + name=cfgobj_attr(o, "name"); + named=""; + f=0; + if (strcmp((char *)ot, aot_doc)==0) { + named=trUtf8("Документ."); + f=1; + } + if (strcmp((char *)ot, aot_cat)==0) { + named=trUtf8("Справочник."); + f=1; + } + if (f) { + named=named+trUtf8(name); + sprintf(otype, "O %s", id); + otypes.append(otype); + eType->insertItem(named, idx++); + } + } +*/ +} + + + +/*void eReport::setData( aCatalogue *f, QWidget *mw ) +{ + aCfg *md = 0; + if ( !f ) return; +// printf("name = '%s'\n", (const char *) mw->name() ); + if (mw->name() == QString("ananas-designer_mainwindow") ) { +// printf("running under ananas designer\n"); + CfgForm *cf = ( ( MainForm *) mw )->cfgForm(); + if ( cf ) { + md = &cf->cfg; +// QString ts = f->getFieldType(); +// char t=' '; + int w=0, d=0, idx=0; + unsigned int i; + long oid , id; + + id = f->getId(); + + otypes.clear(); + eType->clear(); + + QStringList tlist = md->types( md_catalogue ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == id ) { + eType->setCurrentItem( i ); + break; + } + } + } + } else reject(); + } + +} +*/ + +void +eReport::setData( QWidget *o, aCfg *md ) +{ +// const QObject *o = sender(); + if ( o ) { + if ( o->className() != QString("wReport") || !md ) { + reject(); + return; + } + } + else { + reject(); + return; + } + wReport *f = ( wReport*) o; + int w=0, d=0, idx=0; + unsigned int i; + long oid , id; + + id = f->getId(); + + QStringList tlist = md->types( md_journal ); + otypes.clear(); + eType->clear(); + for ( QStringList::Iterator it = tlist.begin(); it != tlist.end(); ++it ) { + otypes.append( (*it).section( "\t", 0, 0 ) ); + eType->insertItem( (*it).section("\t", 1, 1 ), idx++ ); + } + for ( i = 0 ; i < otypes.count(); i++ ) { + oid = 0; + if( otypes[i][0] == 'O' ) { + sscanf( (const char *)otypes[ i ], "O %d", &oid ); + if ( oid == id ) { + eType->setCurrentItem( i ); + break; + } + } + } +} + + +void eReport::getData( QWidget * o ) +{ + +/* int idx=eType->currentItem(); + long oid = 0; + + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); + f->setId( oid ); + } + } +*/ +// const QObject *o = sender(); + if ( !o ) return; + if ( o->className() != QString("wReport") ) return; + wReport *f = ( wReport*) o; + + int idx=eType->currentItem(); + long oid = 0; + + if (f) { + if( otypes[idx][0] == 'O' ) { + sscanf( (const char *)otypes[ idx ], "O %d", &oid ); + f->setId( oid ); + } + } + +} diff --git a/src/plugins/report/ereport.h b/src/plugins/report/ereport.h new file mode 100644 index 0000000..00b7505 --- /dev/null +++ b/src/plugins/report/ereport.h @@ -0,0 +1,27 @@ +#ifndef EREPORT_H +#define EREPORT_H + +#include "ui_ereport.h" + + +class eReport : public QDialog, public Ui::eReport +{ + Q_OBJECT + +public: + eReport(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eReport(); + + QStringList otypes; + +public slots: + virtual void init(); + virtual void setData( QWidget * o, aCfg * md ); + virtual void getData( QWidget * o ); + +protected slots: + virtual void languageChange(); + +}; + +#endif // EREPORT_H diff --git a/src/plugins/report/ereport.ui b/src/plugins/report/ereport.ui new file mode 100644 index 0000000..0983f4b --- /dev/null +++ b/src/plugins/report/ereport.ui @@ -0,0 +1,116 @@ + + + + + eReport + + + + 0 + 0 + 348 + 106 + + + + Catalogue + + + + + + + + + + + + + 100 + 32767 + + + + Type + + + false + + + + + + + + 31 + 16 + + + + Expanding + + + Vertical + + + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + + + 91 + 31 + + + + Expanding + + + Horizontal + + + + + + + qPixmapFromMimeSource + + ananas.h + wreport.h + + + + bOK + clicked() + eReport + accept() + + + bCancel + clicked() + eReport + reject() + + + diff --git a/src/plugins/report/report.pri b/src/plugins/report/report.pri new file mode 100644 index 0000000..d64c02d --- /dev/null +++ b/src/plugins/report/report.pri @@ -0,0 +1,14 @@ +HEADERS += \ + report/ereport.h \ + report/wreport.h \ + report/wreport_plugin.h \ + report/wreport_taskmenu.h + +SOURCES += \ + report/ereport.cpp \ + report/wreport.cpp \ + report/wreport_plugin.cpp \ + report/wreport_taskmenu.cpp \ + +FORMS += \ + report/ereport.ui diff --git a/src/plugins/report/wreport.cpp b/src/plugins/report/wreport.cpp new file mode 100644 index 0000000..324677c --- /dev/null +++ b/src/plugins/report/wreport.cpp @@ -0,0 +1,145 @@ +/**************************************************************************** +** $Id: wreport.cpp,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Code file of the report plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +//--#include +#include +#include "adatabase.h" +#include "wreport.h" +#include "ereport.h" + +//extern aCfg *plugins_aCfg; + + +wReport::wReport( QWidget *parent, Qt::WFlags fl ) +:aWidget( parent, "wReport", fl ) +{ + setInited( false ); +} + + +wReport::~wReport() +{ +} + + + +void +wReport::initObject( aDatabase *adb ) +{ + aWidget::initObject( adb ); +// focusData()->next()->setFocus(); + +//CHECK_POINT +} + + +bool +wReport::checkStructure() +{ + + return false; +} + + + +QDialog* +wReport::createEditor( QWidget *parent ) +{ + return new eReport( parent ); +} + + +int +wReport::select( qulonglong id ) +{ + return 0; +} + + +qulonglong +wReport::insert() +{ + return 0; +} + + +int +wReport::update() +{ + return 0; +} + + +int +wReport::markDelete() +{ + return 0; +} + +ERR_Code +wReport::New() +{ + return err_abstractobj; +} + + +ERR_Code +wReport::Update() +{ + return err_abstractobj; +} + + +ERR_Code +wReport::TurnOn() +{ + return err_abstractobj; +} + + +ERR_Code +wReport::Select( qulonglong id ) +{ + return err_abstractobj; +} + +QString +wReport::displayString() +{ + return QString(""); +} + +qulonglong +wReport::uid() +{ + return 0; +} diff --git a/src/plugins/report/wreport.h b/src/plugins/report/wreport.h new file mode 100644 index 0000000..3bfe09f --- /dev/null +++ b/src/plugins/report/wreport.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** $Id: wreport.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the report plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WREPORT_H +#define WREPORT_H +#include +#include "awidget.h" + +class QWidget; + +class QT_WIDGET_PLUGIN_EXPORT wReport : public aWidget +{ + Q_OBJECT +public: + wReport( QWidget *parent = 0, Qt::WFlags fl = 0 ); + virtual ~wReport(); + bool checkStructure(); + virtual void initObject( aDatabase *adb ); + virtual QDialog* createEditor( QWidget *parent ); + virtual QString displayString(); + virtual bool isContainer() { return true; }; + + virtual qulonglong uid(); + virtual ERR_Code New(); + virtual ERR_Code Update(); + virtual ERR_Code TurnOn(); + virtual ERR_Code Select( qulonglong id ); + +public slots: +// QVariant value( const QString &name ); +// void setValue( const QString &name, QVariant &value ); + int select( qulonglong id ); + qulonglong insert(); + int update(); + int markDelete(); + +private: + +}; + + +#endif // WREPORT_H diff --git a/src/plugins/report/wreport_plugin.cpp b/src/plugins/report/wreport_plugin.cpp new file mode 100644 index 0000000..a459eb7 --- /dev/null +++ b/src/plugins/report/wreport_plugin.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wreport_plugin.h" + +#include +#include +#include + +#include "wreport_taskmenu.h" +#include "wreport.h" + + +wReportPlugin::wReportPlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wReportPlugin::isContainer() const +{ + return true; +} + +bool wReportPlugin::isInitialized() const +{ + return m_initialized; +} + +void wReportPlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + + QExtensionManager *manager = core->extensionManager(); + Q_ASSERT(manager != 0); + manager->registerExtensions(new wReportTaskMenuFactory(manager), + Q_TYPEID(QDesignerTaskMenuExtension)); + + m_initialized = true; +} + +QWidget *wReportPlugin::createWidget(QWidget *parent) +{ + wReport *w = new wReport(parent, 0); + return w; +} + +QString wReportPlugin::name() const +{ + return QLatin1String("wReport"); +} + +QString wReportPlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wReportPlugin::toolTip() const +{ + return QString(); +} + +QString wReportPlugin::whatsThis() const +{ + return QString(); +} + +QString wReportPlugin::includeFile() const +{ + return QLatin1String("wreport.h"); +} + +QIcon wReportPlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wreport.png"); +} + +QString wReportPlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/report/wreport_plugin.h b/src/plugins/report/wreport_plugin.h new file mode 100644 index 0000000..dec2604 --- /dev/null +++ b/src/plugins/report/wreport_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WREPORT_PLUGIN_H +#define WREPORT_PLUGIN_H + +#include + +#include "qwidgetplugin.h" + + +class QT_WIDGET_PLUGIN_EXPORT wReportPlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wReportPlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WREPORT_PLUGIN_H diff --git a/src/plugins/report/wreport_taskmenu.cpp b/src/plugins/report/wreport_taskmenu.cpp new file mode 100644 index 0000000..eda89d4 --- /dev/null +++ b/src/plugins/report/wreport_taskmenu.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include + +#include "wreport_taskmenu.h" +#include "wreport.h" +#include "ereport.h" + + +wReportTaskMenu::wReportTaskMenu(wReport *widget, QObject *parent) + : QObject(parent) +{ + m_widget = widget; + + m_editAction = new QAction(tr("Edit ..."), this); + connect(m_editAction, SIGNAL(triggered()), this, SLOT(edit())); +} + +void wReportTaskMenu::edit() +{ + /*eReport e; + + e.setData(m_widget); + if (e.exec() == QDialog::Accepted) + { + e.getData(m_widget); + }*/ + m_widget->widgetEditor(); +} + +QAction *wReportTaskMenu::preferredEditAction() const +{ + return m_editAction; +} + +QList wReportTaskMenu::taskActions() const +{ + QList list; + list.append(m_editAction); + return list; +} + +wReportTaskMenuFactory::wReportTaskMenuFactory(QExtensionManager *parent) + : QExtensionFactory(parent) +{ +} + +QObject *wReportTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const +{ + if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) + return 0; + + if (wReport *ob = qobject_cast(object)) + return new wReportTaskMenu(ob, parent); + + return 0; +} diff --git a/src/plugins/report/wreport_taskmenu.h b/src/plugins/report/wreport_taskmenu.h new file mode 100644 index 0000000..6f7f61d --- /dev/null +++ b/src/plugins/report/wreport_taskmenu.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2006 Dmitriy Pavlyuk All rights reserved. +** +** This file is part of the widgets plugin of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef WREPORT_TASKMENU_H +#define WREPORT_TASKMENU_H + +#include +#include + + +class QExtensionManager; +class QAction; +class wReport; + +class wReportTaskMenu: public QObject, public QDesignerTaskMenuExtension +{ + Q_OBJECT + Q_INTERFACES(QDesignerTaskMenuExtension) +public: + wReportTaskMenu(wReport *widget, QObject *parent); + + QAction *preferredEditAction() const; + QList taskActions() const; + +private slots: + void edit(); + +private: + QAction *m_editAction; + wReport *m_widget; +}; + +class wReportTaskMenuFactory: public QExtensionFactory +{ + Q_OBJECT +public: + wReportTaskMenuFactory(QExtensionManager *parent = 0); + +protected: + QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const; +}; + +#endif // WREPORT_TASKMENU_H diff --git a/src/plugins/table/etable.cpp b/src/plugins/table/etable.cpp new file mode 100644 index 0000000..630aef7 --- /dev/null +++ b/src/plugins/table/etable.cpp @@ -0,0 +1,288 @@ +#include "etable.h" + +#include +#include +#include + +#include "ananas.h" +#include "wtable.h" + +/* + * Constructs a eTable as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * true to construct a modal dialog. + */ +eTable::eTable(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) + : QDialog(parent, name, modal, fl) +{ + setupUi(this); + + init(); +} + +/* + * Destroys the object and frees any allocated resources + */ +eTable::~eTable() +{ + destroy(); + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void eTable::languageChange() +{ + retranslateUi(this); +} + +void eTable::init() +{ +/* + int oc, i, f, idx=0; + char *id, *name, *ot; + cfg_objptr o; + char otype[100]; + QString named; + + CHECK_POINT + r = tablerow_new(0); + + otypes.clear(); + eType->clear(); + otypes.append("U"); + eType->insertItem(trUtf8("Текстовая метка"), idx++); + otypes.append("D"); + eType->insertItem(trUtf8("Дата"), idx++); + otypes.append("T"); + eType->insertItem(trUtf8("Время"), idx++); + otypes.append("N %d %d"); + eType->insertItem(trUtf8("Число"), idx++); + otypes.append("C %d"); + eType->insertItem(trUtf8("Строка"), idx++); + + oc=cfgobj_count(NULL, NULL); + for (i=1;i<=oc;i++) { + id=cfgobj_idn(NULL, NULL, i, &o); + ot=(char *)o->name; + name=cfgobj_attr(o, "name"); + named=""; + f=0; + if (strcmp((char *)ot, aot_doc)==0) { + named=trUtf8("Документ."); + f=1; + } + if (strcmp((char *)ot, aot_cat)==0) { + named=trUtf8("Справочник."); + f=1; + } + if (f) { + named=named+trUtf8(name); + sprintf(otype, "O %s", id); + otypes.append(otype); + eType->insertItem(named, idx++); + } + } + CHECK_POINT +*/ +} + + +void +eTable::destroy() +{ +// tablerow_free( r ); +} + + + +void eTable::insertColumn(const char *Header, const char *Name, +int idxt, int cw, int tw, int td) +{ +/* + tablefield *f; + char s[30]; + + sprintf(s, "%s %i %i", (const char *)otypes[idxt], tw, td); + + f = tablefield_newsys(Name, s, ""); + tablefield_setheader(f, Header); + f->sizex = cw; + f->flen = tw; + f->decimals = td; + f->ftypeindex = idxt; + tablerow_insertcolumn(r, f, -1); + +// blockSignals( true ); + ListCol->insertItem(trUtf8(Header)); +// eColHeader->setText( trUtf8(Header)); +// eColName->setText(trUtf8(Name)); +// eColWidth->setValue(cw); +// eColTWidth->setValue(tw); +// eColTDec->setValue(td); +// blockSignals( false ); + if (ListCol->count()) ListCol->setCurrentItem(ListCol->count()-1); +*/ +} + + + +void eTable::ColumnAdd() +{ +// insertColumn("Новый", "Новый", 0, 0, 0, 0); +} + + +void eTable::ColumnDel() +{ +/* + int idx; + idx = ListCol->currentItem(); + if (ListCol->count() && idx != -1) { + tablerow_removecolumn( r, idx ); + ListCol->removeItem(idx); + } +*/ +} + + +void eTable::ColumnL() +{ + +} + + +void eTable::ColumnR() +{ + +} + + +void eTable::ColumnSel(int col) +{ +/* + tablefield *f; + + if (col >= 0 && col < tablerow_columns( r )) { + f = tablerow_column( r, col ); + blockSignals( true ); + eColHeader->setText(trUtf8(tablefield_header( f ))); + eColWidth->setValue(f->sizex); + eType->setCurrentItem(f->ftypeindex); + eColName->setText(trUtf8(f->name)); + eColTWidth->setValue(f->flen); + eColTDec->setValue(f->decimals); + blockSignals( false ); + } +*/ +} + + +void eTable::ColumnUpd() +{ +/* + tablefield *f; + + if (signalsBlocked()) return; + int idx = ListCol->currentItem(); + + if ( idx >= 0 && idx < tablerow_columns( r )) { + f = tablerow_column( r, idx ); + if (f->name) free(f->name); + f->name=strdup((const char *) eColName->text().utf8()); + tablefield_setheader( f, (const char *) eColHeader->text().utf8()); + f->sizex = eColWidth->value(); + f->flen = eColTWidth->value(); + f->decimals = eColTDec->value(); + f->ftypeindex = eType->currentItem(); + + printf("set w=%i l=%i d=%i ti=%i\n", f->sizex, f->flen, + f->decimals, f->ftypeindex); + ListCol->blockSignals( TRUE ); + ListCol->changeItem(eColHeader->text(), idx); + ListCol->blockSignals( FALSE ); + } + CHECK_POINT +*/ +} + + +void eTable::setData( QWidget *o, aCfg *md ) +{ + + QStringList sl; + unsigned int i; + QString ft,h,n; + int w=0, l=0, d=0, idxt=0; + char st[20]; + + wTable *t = (wTable *) o; + //--eTabName->setText(t->getName()); + eTabName->setText(t->objectName()); +/* + if (!t->getDefineCols().isEmpty()) { + sl = QStringList::split("\n",t->getDefineCols()); + for (i = 0; i < sl.count(); i++) { + sscanf((const char *)sl[i].section("|",3,3),"%s %d %d", st, &l, &d); + if (st[0]=='O') ft.sprintf("O %d",l); + else ft=st; + w = sl[i].section("|",2,2).toInt(); + h = sl[i].section("|",5,5); + n = sl[i].section("|",4,4); + for (idxt = otypes.count()-1; idxt>0; idxt--) { + if (ft[0]=='O' && otypes[idxt]==ft) break; + else if (otypes[idxt][0]==ft[0]) break; + } + printf("set data %i = %s %s %i %i %i\n", i, + (const char *)h, (const char *)n, idxt, w, l); + insertColumn(h,n,idxt,w,l,d); + } + } +*/ +} + + +void eTable::getData( QWidget *o ) +{ + wTable *t = (wTable *) o; +/* + int i; + QStringList sl; + QString cdef, ft, s; + tablefield *f; + + t->vTable->setNumCols(ListCol->count()); + for (i=0;iftypeindex],f->flen,f->decimals); + cdef.sprintf("%i|%i|%i|%s|%s|%s",i,0, f->sizex, + (const char *) ft, f->name, + tablefield_header( f )); + s = s + cdef +"\n"; + } +// t->vTable->setColumnLabels(sl); + t->setName(eTabName->text()); + CHECK_POINT + printf("getData defs = %s\n",(const char *)s.utf8()); + t->setDefineCols(s); +*/ + t->setName(eTabName->text()); +} + + +void eTable::ColumnTextUpd( const QString &s ) +{ +/* + int idx; + idx = ListCol->currentItem(); + if (idx == -1) return; + ListCol->blockSignals( TRUE ); + ListCol->changeItem(s, ListCol->currentItem()); + ListCol->blockSignals( FALSE ); + CHECK_POINT +*/ +} diff --git a/src/plugins/table/etable.h b/src/plugins/table/etable.h new file mode 100644 index 0000000..497046b --- /dev/null +++ b/src/plugins/table/etable.h @@ -0,0 +1,38 @@ +#ifndef ETABLE_H +#define ETABLE_H + +#include "ui_etable.h" + + +class eTable : public QDialog, public Ui::eTable +{ + Q_OBJECT + +public: + eTable(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); + ~eTable(); + +public slots: + virtual void insertColumn( const char * Header, const char * Name, int idxt, int cw, int tw, int td ); + virtual void ColumnAdd(); + virtual void ColumnDel(); + virtual void ColumnL(); + virtual void ColumnR(); + virtual void ColumnSel( int col ); + virtual void ColumnUpd(); + virtual void setData( QWidget * o, aCfg * md ); + virtual void getData( QWidget * o ); + virtual void ColumnTextUpd( const QString & s ); + +protected slots: + virtual void languageChange(); + +private: + QStringList otypes, ftype, fname, cwidth; + + virtual void init(); + virtual void destroy(); + +}; + +#endif // ETABLE_H diff --git a/src/plugins/table/etable.ui b/src/plugins/table/etable.ui new file mode 100644 index 0000000..fa779c4 --- /dev/null +++ b/src/plugins/table/etable.ui @@ -0,0 +1,297 @@ + + + + + eTable + + + + 0 + 0 + 510 + 318 + + + + Form table + + + + + + List of columns + + + + + + 1 + + + 0 + + + 1 + + + + + + + + + + Table name + + + false + + + + + + + OK + + + true + + + + + + + 30 + + + + + + + Table column + + + + + + Header + + + false + + + + + + + Width + + + false + + + + + + + Field type + + + false + + + + + + + Field name + + + false + + + + + + + View width + + + false + + + + + + + decimals + + + false + + + + + + + Add + + + + + + + Up + + + + + + + Down + + + + + + + Remove + + + + + + + 9999 + + + + + + + 255 + + + + + + + 9 + + + + + + + 100 + + + + + + + 300 + + + + + + + + + + + + + Cancel + + + + + + + qPixmapFromMimeSource + + ananas.h + + + + bOK + clicked() + eTable + accept() + + + bCancel + clicked() + eTable + reject() + + + bColAdd + clicked() + eTable + ColumnAdd() + + + bColDel + clicked() + eTable + ColumnDel() + + + bColL + clicked() + eTable + ColumnL() + + + bColR + clicked() + eTable + ColumnR() + + + ListCol + highlighted(int) + eTable + ColumnSel(int) + + + eColHeader + textChanged(QString) + eTable + ColumnUpd() + + + eType + activated(int) + eTable + ColumnUpd() + + + eColName + textChanged(QString) + eTable + ColumnUpd() + + + eColWidth + valueChanged(QString) + eTable + ColumnUpd() + + + eColTWidth + valueChanged(QString) + eTable + ColumnUpd() + + + eColTDec + valueChanged(QString) + eTable + ColumnUpd() + + + diff --git a/src/plugins/table/table.pri b/src/plugins/table/table.pri new file mode 100644 index 0000000..ffedd6e --- /dev/null +++ b/src/plugins/table/table.pri @@ -0,0 +1,13 @@ +HEADERS += \ + table/etable.h \ + table/wtable.h \ + table/wtable_plugin.h + +SOURCES += \ + table/etable.cpp \ + table/wtable.cpp \ + table/wtable_plugin.cpp + +FORMS += \ + table/etable.ui + \ No newline at end of file diff --git a/src/plugins/table/wtable.cpp b/src/plugins/table/wtable.cpp new file mode 100644 index 0000000..6f52b42 --- /dev/null +++ b/src/plugins/table/wtable.cpp @@ -0,0 +1,216 @@ +/**************************************************************************** +** $Id: wtable.cpp,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Code file of the table plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "acfg.h" +#include "aobject.h" +#include "awidget.h" +#include "wtable.h" + + + +wTable::wTable(QWidget *parent, const char * name):Q3Table(parent, name) +{ + +} + +wTable::~wTable() +{ +} + + +void +wTable::setDocument(int row, aObject *object) +{ +} + +void +wTable::setText(int row, int col, const QString& text) +{ + return Q3Table::setText(row, col,text); +} + + +QString +wTable::text(int col, int row) +{ + return Q3Table::text(col,row); +} + +void +wTable::setHeaderText(int col, const QString& text) +{ + Q3Table::horizontalHeader()->setLabel( col, text ); +} + + +QString +wTable::textHeader(int col) +{ + return Q3Table::horizontalHeader()->label(col); +} + +void +wTable::sortColumn ( int col, bool ascending, bool wholeRows ) +{ + printf("do sort column\n"); + Q3Table::sortColumn( col, ascending, true ); +} + + +void +wTable::setColumnWidth(int col, int width) +{ + Q3Table::setColumnWidth(col,width); +} + + +int +wTable::columnWidth(int col) +{ + return Q3Table::columnWidth(col); +} + +void +wTable::setNumCols ( int r ) +{ + Q3Table::setNumCols(r); +} + +int +wTable::numCols () const +{ + int res = Q3Table::numCols();// - 1; + return res; +} +void +wTable::hideColumn ( int col ) +{ + Q3Table::hideColumn ( col ); +} + +void +wTable::showColumn ( int col ) +{ + Q3Table::showColumn ( col ); +} +/* +bool +wTable::isColumnHidden ( int col ) const +{ +// int i = -2; +// if(col>=0) i=col; + return QTable::isColumnHidden ( col ); +} +*/ +void +wTable::adjustColumn ( int col ) +{ + return Q3Table::adjustColumn ( col ); +} + +void +wTable::setColumnStretchable ( int col, bool stretch ) +{ + return Q3Table::setColumnStretchable ( col, stretch ); +} + +bool +wTable::isColumnStretchable ( int col ) const +{ + return Q3Table::isColumnStretchable ( col ); +} + + +void +wTable::swapColumns ( int col1, int col2, bool swapHeader ) +{ + Q3Table::swapColumns( col1, col2, swapHeader ); + +} + +void +wTable::swapCells ( int row1, int col1, int row2, int col2 ) +{ + Q3Table::swapCells( row1, col1, row2, col2 ); +} + +void +wTable::setCurrentCell ( int row, int col ) +{ + Q3Table::setCurrentCell( row, col ); +} + +void +wTable::setColumnReadOnly ( int col, bool ro ) +{ + Q3Table::setColumnReadOnly( col, ro ); +} + +void +wTable::insertColumns ( int col, int count ) +{ + Q3Table::insertColumns( col, count ); +} + +void +wTable::removeColumn ( int col ) +{ + Q3Table::removeColumn( col ); +} + +void +wTable::editCell ( int row, int col, bool replace ) +{ + Q3Table::editCell( row, col, replace ); +} + +void +wTable::columnClicked ( int col ) +{ +// int i = -2; +// if(col>=0) i=col; + Q3Table::columnClicked ( col );//i-1 ); +} +void +wTable::swapRows ( int row1, int row2, bool swapHeader ) +{ + Q3Table::swapRows ( row1, row2,swapHeader ); +} + + + diff --git a/src/plugins/table/wtable.h b/src/plugins/table/wtable.h new file mode 100644 index 0000000..a550587 --- /dev/null +++ b/src/plugins/table/wtable.h @@ -0,0 +1,115 @@ +/**************************************************************************** +** $Id: wtable.h,v 1.1 2008/11/05 21:16:30 leader Exp $ +** +** Header file of the table plugin of Ananas +** Designer and Engine applications +** +** Created : 20031201 +** +** Copyright (C) 2003-2004 Leader InfoTech. All rights reserved. +** Copyright (C) 2006 Grigory Panov , Yoshkar-Ola. +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WTABLE_H +#define WTABLE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "acfg.h" +#include "aobject.h" +#include "awidget.h" + +/*! + * \en + * \brief Object for view and edit tabel in aTable object. + * \_en + * \ru + * \brief Плагин - виджет для редактирования табличных данных, не хранящихся в бизнес объектах Ананаса. + * Наследует QTable. + * + * В отличие от wDBTable wTable не сохряняет редактируемые в нем данные автоматически + * в persistent бизнес объектах Ананаса. Программист самостоятельно + * должен закодировать на Ананас.Скрипте логику заполнения виджета данными и использования данных, вводимых + * пользователем. + * + * \_ru + */ + + +class QT_WIDGET_PLUGIN_EXPORT wTable : public Q3Table +{ + Q_OBJECT + +public: + + wTable(QWidget* parent, const char * name); + virtual ~wTable(); +public slots: + virtual void setDocument(int row, aObject *object); + void setText(int row, int col, const QString& text); + QString text(int col, int row); + void setHeaderText(int col, const QString& text); + QString textHeader(int col); + virtual void sortColumn ( int col, bool ascending = TRUE, bool wholeRows = TRUE ); + virtual void setColumnWidth(int col, int width); + virtual int columnWidth(int col); + virtual void setNumCols ( int r ); + virtual int numCols () const ; + virtual void hideColumn ( int col ); + virtual void showColumn ( int col ); +// bool isColumnHidden ( int col ) const; + virtual void adjustColumn ( int col ); + virtual void setColumnStretchable ( int col, bool stretch ); + bool isColumnStretchable ( int col ) const; + virtual void swapColumns ( int col1, int col2, bool swapHeader = FALSE ); + virtual void swapCells ( int row1, int col1, int row2, int col2 ); + virtual void setCurrentCell ( int row, int col ); + virtual void setColumnReadOnly ( int col, bool ro ); + virtual void insertColumns ( int col, int count = 1 ); + virtual void removeColumn ( int col ); + virtual void editCell ( int row, int col, bool replace = FALSE ); + virtual void swapRows ( int row1, int row2, bool swapHeader = FALSE ); +signals: +// void pressed ( int row, int col, int button, const QPoint & mousePos ); +// void currentChanged ( int row, int col ); +// void clicked ( int row, int col, int button, const QPoint & mousePos ); +// void valueChanged ( int row, int col ); + +protected slots: + virtual void columnClicked ( int col ); + +private slots: +// void on_pressed ( int row, int col, int button, const QPoint & mousePos ); +// void on_currentChanged ( int row, int col ); +// void on_clicked ( int row, int col, int button, const QPoint & mousePos ); +// void on_valueChanged ( int row, int col ); +protected: + virtual void activateNextCell () {} ; + +}; + +#endif diff --git a/src/plugins/table/wtable_plugin.cpp b/src/plugins/table/wtable_plugin.cpp new file mode 100644 index 0000000..cbc53bc --- /dev/null +++ b/src/plugins/table/wtable_plugin.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Code file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "wtable_plugin.h" + +#include + +#include "wtable.h" + + +wTablePlugin::wTablePlugin(QObject *parent) + : QObject(parent), m_initialized(false) +{ + m_initialized = false; +} + +bool wTablePlugin::isContainer() const +{ + return false; +} + +bool wTablePlugin::isInitialized() const +{ + return m_initialized; +} + +void wTablePlugin::initialize(QDesignerFormEditorInterface *core) +{ + if (m_initialized) + return; + Q_UNUSED(core); + m_initialized = true; +} + +QWidget *wTablePlugin::createWidget(QWidget *parent) +{ + wTable *w = new wTable(parent, 0); + return w; +} + +QString wTablePlugin::name() const +{ + return QLatin1String("wTable"); +} + +QString wTablePlugin::group() const +{ + return QLatin1String("Ananas"); +} + +QString wTablePlugin::toolTip() const +{ + return QString("Ananas for QT Table Widget"); +} + +QString wTablePlugin::whatsThis() const +{ + return QString("Entry to modify tables values of Ananas's object"); +} + +QString wTablePlugin::includeFile() const +{ + return QLatin1String("wtable.h"); +} + +QIcon wTablePlugin::icon() const +{ + //return QIcon(); + return QIcon(":/images/wtable.png"); +} + +QString wTablePlugin::domXml() const +{ + return "\n\n"; +} diff --git a/src/plugins/table/wtable_plugin.h b/src/plugins/table/wtable_plugin.h new file mode 100644 index 0000000..b18a8c9 --- /dev/null +++ b/src/plugins/table/wtable_plugin.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Header file +** +** Copyright (C) 2006 Dmitriy Pavlyuk +** +** This file is part of the Ananas Plugins of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef WTABLE_PLUGIN_H +#define WTABLE_PLUGIN_H + +#include + +#include + + +class QT_WIDGET_PLUGIN_EXPORT wTablePlugin : public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + wTablePlugin(QObject *parent=0); + + bool isContainer() const; + bool isInitialized() const; + void initialize(QDesignerFormEditorInterface *core); + QWidget *createWidget(QWidget *parent); + + QString name() const; + QString group() const; + QString toolTip() const; + QString whatsThis() const; + QString includeFile() const; + QIcon icon() const; + QString domXml() const; + +private: + bool m_initialized; +}; + +#endif // WTABLE_PLUGIN_H diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..e32d287 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs +SUBDIRS += lib plugins +SUBDIRS += designer ananas admin +SUBDIRS += extensions + +#TRANSLATIONS = \ +# ../translations/ananas-en.ts \ +# ../translations/ananas-ru.ts diff --git a/src/test/main.cpp b/src/test/main.cpp new file mode 100644 index 0000000..24b0b78 --- /dev/null +++ b/src/test/main.cpp @@ -0,0 +1,47 @@ +/**************************************************************************** +** $Id: main.cpp,v 1.3 2008/12/06 22:16:55 leader Exp $ +** +** Tool for automatic running Ananas tests +** +** Created : 20051024 +** +** Copyright (C) 2008. Valery Grazhdankin , Moscow +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "ananas.h" +#include +#include + +#include "testametadata.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + int rc = 0; + +// TestQString test1; + TestAMetaData test2; + +// rc += QTest::qExec(&test1, argc, argv); + rc += QTest::qExec(&test2, argc, argv); + printf("\nTotal fails: %i\n",rc); + return rc; +} diff --git a/src/test/test.h b/src/test/test.h new file mode 100644 index 0000000..952cbfa --- /dev/null +++ b/src/test/test.h @@ -0,0 +1,45 @@ +/**************************************************************************** +** $Id: test.h,v 1.1 2008/11/19 20:20:16 leader Exp $ +** +** Tool for automatic running Ananas tests +** +** Created : 20081119 +** +** Copyright (C) 2008. Valery Grazhdankin , Moscow +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include +#include + +double rnd(double m=1); + + +double rnd(double m) +{ + double res; +#ifdef _Windows + res = rand()*m; +#else + res = random()*m; +#endif + return res; + +} diff --git a/src/test/test.pro b/src/test/test.pro new file mode 100644 index 0000000..fefd2e3 --- /dev/null +++ b/src/test/test.pro @@ -0,0 +1,20 @@ +TARGET = ananas4-test +include(../lib/lib.pri) +include(../plugins/plugins.pri) +include(../ananas.pri ) + +SOURCES += \ + main.cpp \ + testametadata.cpp + +HEADERS += \ + test.h \ + testametadata.h +TRANSLATES = + +CONFIG +=qtestlib +FORMS = +TEMPLATE =app +INCLUDEPATH += ../lib ../plugins +LIBS += -L$(QTDIR)/lib -lqsa -L../../lib -lananas4 +LIBS += -L../../lib/designer -lananasplugin4 -lqt4-qdataschema diff --git a/src/test/testametadata.cpp b/src/test/testametadata.cpp new file mode 100644 index 0000000..29ee89c --- /dev/null +++ b/src/test/testametadata.cpp @@ -0,0 +1,176 @@ +/**************************************************************************** +** $Id: testametadata.cpp,v 1.5 2008/12/15 22:22:48 leader Exp $ +** +** Tool for automatic running Ananas tests +** +** Created : 20081119 +** +** Copyright (C) 2008. Valery Grazhdankin , Moscow +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "testametadata.h" +#include "ametadataioxml.h" +#include "ametafield.h" +#include "ananas.h" +#include + + +void TestAMetaData::initTestCase() +{ +// qDebug("TEST INIT"); +// md = new AMetaData(QString("КлассОбъекта"), fromUtf8("ИмяОбъекта"),); +// mdo = new AMetaObject(); +} + + + +void TestAMetaData::cleanupTestCase() +{ +// qDebug("TEST DONE"); +// delete md; +// delete mdo; +} + +/* +void TestAMetaData::toUpper_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + + QTest::newRow("all lower") << "hello" << "HELLO"; + QTest::newRow("mixed") << "Hello" << "HELLO"; + QTest::newRow("all upper") << "HELLO" << "HELLO"; +} + +void TestAMetaData::toUpper() +{ + QFETCH(QString, string); + QFETCH(QString, result); + + QCOMPARE(string.toUpper(), result); +} +*/ + +void TestAMetaData::testAMetaObject() +{ + QByteArray ba("1234567890АБВГД"); + QString ts = QString::fromUtf8("Проверочный текст UTF8"); + + AMetaObject *o = new AMetaObject(QString::fromUtf8("КлассОбъекта"), + QString::fromUtf8("ИмяОбъекта"), 0 ); + + o->setDescription( ts ); + QCOMPARE( o->description(), ts ); + + QCOMPARE( o->className(), QString::fromUtf8("КлассОбъекта")); + QCOMPARE( o->name(), QString::fromUtf8("ИмяОбъекта")); + + o->setId(123456); + QVERIFY( o->id()==123456); + + o->setAttr("String","String"); + o->setAttr("Int", 123456 ); + o->setText("Text", QString::fromUtf8("Проверочный текст")); + o->setRawdata("RAW1", ba ); + o->setRawdata("RAW2", ba ); + +// Test attr functions + QVERIFY( o->attrCount() == 2 ); + QVERIFY( o->attrExists("String") ); + QVERIFY( o->attrExists("Int") ); + QVERIFY( o->attrExists("IntX") == false ); + QVERIFY( o->attr("String") == "String" ); + QVERIFY( o->attr("Int") == 123456 ); + QVERIFY( o->attr( 0 ) == "String" ); + QVERIFY( o->attr( 1 ) == 123456 ); + QVERIFY( o->attr( -1 ) == QVariant() ); + QVERIFY( o->attr( 10 ) == QVariant() ); +// Test text functions + QVERIFY( o->textCount() == 1+1 ); + QVERIFY( o->textExists("Text") ); + QVERIFY( o->textExists("Text0") == false ); + QVERIFY( o->text("Text") == QString::fromUtf8("Проверочный текст") ); + QVERIFY( o->text( 1 ) == QString::fromUtf8("Проверочный текст") ); + QVERIFY( o->text( -1 ) == QString::null ); + QVERIFY( o->text( 10 ) == QString::null ); +// Test rawdata functions + QVERIFY( o->rawdataCount() == 2 ); + QVERIFY( o->rawdataExists("RAW1") ); + QVERIFY( o->rawdataExists("RAW2") ); + QVERIFY( o->rawdataExists("RAW3") == false ); + QVERIFY( o->rawdata("RAW1") == QString( ba.data() ) ); + QVERIFY( o->rawdata("RAW2") == QString( ba.data() ) ); + QVERIFY( o->rawdata( 0 ) == QString( ba.data() ) ); + QVERIFY( o->rawdata( 1 ) == QString( ba.data() ) ); + QVERIFY( o->rawdata( -1 ) == QByteArray() ); + QVERIFY( o->rawdata( 10 ) == QByteArray() ); + delete o; +} + + + +void TestAMetaData::testAMetaObjectGroup() +{ + AMetaObjectGroup *o = new AMetaObjectGroup( QString::fromUtf8("ИмяОбъекта") ); + + QCOMPARE( o->name(), QString::fromUtf8("ИмяОбъекта")); + delete o; +} + + + +void TestAMetaData::testAMetaData() +{ + AMetaData *o = new AMetaData(); + QCOMPARE( o->name(), QString("MetaData") ); + delete o; +} + + +void TestAMetaData::testAMetaField() +{ + AMetaField *o = new AMetaField(); + QCOMPARE( o->className(), QString("MetaField") ); + QCOMPARE( o->description(), QString("") ); + QCOMPARE( o->fieldType(), 0 ); + QCOMPARE( o->fieldSubType(), 0 ); + QCOMPARE( o->width(), 0 ); + QCOMPARE( o->notNull(), false ); + QCOMPARE( o->notNegative(), false ); + QCOMPARE( o->calcSumm(), false ); + delete o; +} + + +void TestAMetaData::testAMetaDataIOXML() +{ + AMetaDataIOXML *o = new AMetaDataIOXML(); + QString xml; + + QCOMPARE( o->write("test.cfg"), 0 ); + QCOMPARE( o->read("test1.cfg"), 0 ); + xml = o->text(); + QCOMPARE( o->write("test2.cfg"), 0 ); + QCOMPARE( o->read("test2.cfg"), 0 ); + QCOMPARE( xml, o->text() ); + //QCOMPARE( o->name(), QString("ROOT") ); + delete o; +} diff --git a/src/test/testametadata.h b/src/test/testametadata.h new file mode 100644 index 0000000..939ca8e --- /dev/null +++ b/src/test/testametadata.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** $Id: testametadata.h,v 1.5 2008/12/15 22:22:48 leader Exp $ +** +** Tool for automatic running Ananas tests +** +** Created : 20081119 +** +** Copyright (C) 2008. Valery Grazhdankin , Moscow +** +** This file is part of the Designer application of the Ananas +** automation accounting system. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.leaderit.ru/page=ananas or email sales@leaderit.ru +** See http://www.leaderit.ru/gpl/ for GPL licensing information. +** +** Contact org@leaderit.ru if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef TESTAMETADATA_H +#define TESTAMETADATA_H +#include "ametadata.h" +#include + +class TestAMetaData: public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void cleanupTestCase(); + +// void toUpper_data(); +// void toUpper(); + + void testAMetaObject(); + void testAMetaObjectGroup(); + void testAMetaData(); + void testAMetaField(); + void testAMetaDataIOXML(); + +private: + AMetaObject *mdo; + AMetaData *md; +}; + +#endif diff --git a/translations/ananas-designer-en.ts b/translations/ananas-designer-en.ts new file mode 100644 index 0000000..8833822 --- /dev/null +++ b/translations/ananas-designer-en.ts @@ -0,0 +1,2061 @@ + + + CfgForm + + CfgForm + + + + Metadata + + + + Actions + + + + Interface + + + + Rights + + + + Languages + + + + Tag + + + + Name + + + + Translation file + + + + Add + + + + Remove + + + + Edit + + + + Clear dead aliases + + + + Image collection + + + + New + + + + &New + + + + Ctrl+N + + + + Open + + + + &Open... + + + + Ctrl+O + + + + Save + + + + &Save + + + + Ctrl+S + + + + Save As + + + + Save &As... + + + + Print + + + + &Print... + + + + Ctrl+P + + + + Exit + + + + E&xit + + + + ActionGroup + + + + Action + + + + Open image dialog + + + + New language + + + + Deleting row + + + + Delete '%1'? + + + + Yes + + + + No + + + + OK + + + + Saving changes + + + + Save changes %1? + + + + Cancel + + + + messageswindow + + + + Clearing dead aliases + + + + %1 dead aliases killed. + + + + Role name + + + + Description + + + + Clear dead roles + + + + New role + + + + Clearing dead roles + + + + %1 dead roles killed. + + + + Unable to write rc file. + + + + CfgForm readrc error + + + + Business scheme: + + + + CfgForm metadata root is null + + + + CfgForm metadata lang is null + + + + lang = %1 + + + + CfgForm %1 metadata lang is null + + + + + InterfaceTreeView + + &New Submenu + + + + New &Command + + + + New &Separator + + + + + MainForm + + Ananas: Designer + + + + &File + + + + &Edit + + + + Configuration + + + + Object + + + + &New + + + + Ctrl+N + + + + &Open... + + + + Ctrl+O + + + + &Save + + + + actFileSave + + + + Ctrl+S + + + + Save &as... + + + + &Print + + + + Ctrl+P + + + + E&xit + + + + Undo + + + + Ctrl+Z + + + + Redo + + + + Ctrl+Y + + + + Cut + + + + Ctrl+X + + + + Copy + + + + Ctrl+C + + + + Paste + + + + Ctrl+V + + + + Find + + + + Ctrl+F + + + + New + + + + Save + + + + ActionGroup + + + + New form + + + + Delete + + + + New field + + + + Rename + + + + Edit + + + + New table + + + + New in group + + + + Move Up + + + + Move Down + + + + New Group + + + + Action + + + + New Submenu + + + + New Command + + + + New Separator + + + + Clear dead aliases + + + + Add + + + + new item + + + + Image Collection + + + + &Help + + + + &About + + + + &Cascade + + + + &Tile + + + + Tile &horizontal + + + + Create new configuration + + + + Open configuration + + + + Tabs + + + + Вырезать + + + + Копировать + + + + Вставить + + + + Содержание + + + + &Содержание... + + + + Индекс + + + + &Индекс... + + + + О программе + + + + &О программе + + + + Конфигурация + + + + Save configuration + + + + Создать/обновить БД + + + + Новая кнопка + + + + Новый атрибут + + + + Новое поле + + + + Add new role + + + + Clear dead roles + + + + Edit role + + + + &Open + + + + &Windows + + + + About Ananas.Designer + + + + <h4>Ananas.Designer %1</h4> is a programm<br>for adjusting accounting automation system<br><br>Copyright 2003-2006 Leader Infotech, Valery Grazdankin <br>Copyright 2003-2006 Project Ananas, Andrey Paskal, Grigory Panov, Andrey Strelnikov<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br><br>Avalable extensions:<br>%2 + + + + + PixmapPreview + + This is not a pixmap + + + + + QObject + + default + + + + Documents + + + + Init application + + + + Init forms designer + + + + Dialog forms designer + + + + Catalogues + + + + Reports + + + + Journals + + + + Information registers + + + + Accumulation registers + + + + Header + + + + Tables + + + + Forms + + + + Web forms + + + + Columns + + + + Resources + + + + Dimensions + + + + Information + + + + Element + + + + Group + + + + New field + + + + New document + + + + New catalogue + + + + New journal + + + + New information register + + + + New accumulation register + + + + New report + + + + New form + + + + New web form + + + + New Table + + + + ------------------- + + + + New Command + + + + New Popup menu + + + + New tool bar + + + + New Submenu + + + + Toolbars + + + + Main menu + + + + Popup menus + + + + New Action Group + + + + New Action + + + + Actions + + + + header + + + + New Column + + + + Elements list dialog + + + + Element dialog + + + + Group dialog + + + + embedded editor + + + + Unknown + + + + Numberic + + + + Ananas List View Item %1 is null + + + + Ananas List View Item swaping + + + + any files (*) + + + + New &Group + + + + New &Action + + + + + aAliasEditor + + Name + + + + + aMetadataTreeView + + &New + + + + + aRoleEditor + + Read + + + + Write + + + + Delete + + + + Turn On + + + + Turn Off + + + + + ananasTreeView + + <font color=darkblue><u><b>Context Menu</b></u></font> + + + + &Rename + + + + &Edit + + + + &Delete + + + + &MoveUp + + + + &MoveDown + + + + &SaveItem + + + + &LoadItem + + + + + dEditAReg + + Accumulating register + + + + Common + + + + Name: + + + + Description: + + + + Aliases + + + + Lang + + + + Name + + + + Accumulation register: + + + + + dEditAction + + Action + + + + Common + + + + Description: + + + + Name + + + + Type + + + + standart command + + + + user script + + + + Enabled icon + + + + ... + + + + X + + + + Disabled icon + + + + Execute + + + + Object + + + + Form + + + + new + + + + edit + + + + view + + + + execute + + + + Params + + + + Aliases + + + + Lang + + + + Action_2 + + + + Action: + + + + Open image dialog + + + + Choose an image + + + + external script + + + + File name + + + + + dEditCat + + Catalogue + + + + Common + + + + Name: + + + + Description: + + + + Aliases + + + + Lang + + + + Name + + + + Catalogue: + + + + Element string view + + + + Group string view + + + + Access + + + + Read + + + + Write + + + + + dEditCfg + + Common + + + + Name + + + + Author + + + + Date + + + + Description + + + + User + + + + Data base server user + + + + Data base password + + + + Data base type + + + + Unknown + + + + mysql + + + + postgres + + + + Data base server address + + + + Data base name + + + + Work directory + + + + Configuration file name + + + + Data base server port + + + + Global module + + + + MySQL + + + + Postgres + + + + Data base header + + + + Business scheme parameters + + + + Business scheme parameters: + + + + + dEditColumns + + Columns + + + + Name: + + + + Action + + + + Column: + + + + + dEditCommand + + Command + + + + Common + + + + Description: + + + + Hot Key: + + + + Ctrl + + + + Alt + + + + Shift + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 0 + + + + A + + + + B + + + + C + + + + D + + + + E + + + + F + + + + G + + + + H + + + + I + + + + J + + + + K + + + + L + + + + M + + + + N + + + + O + + + + P + + + + Q + + + + R + + + + S + + + + T + + + + U + + + + V + + + + W + + + + X + + + + Y + + + + Z + + + + Type: + + + + Menu text + + + + Name: + + + + Actions + + + + Aliases + + + + Lang + + + + Name + + + + Command: + + + + + dEditDialog + + Form + + + + Common + + + + Description: + + + + Form file + + + + Module file + + + + Name + + + + Design + + + + View + + + + Module + + + + Aliases + + + + Lang + + + + Form: + + + + Form mode: + + + + Use for: + + + + Dialog + + + + New + + + + Edit + + + + Selection + + + + Read only + + + + Designer + + + + Preview + + + + dEditDialog edit form + + + + dEditDialog form file does not exists + + + + dEditDialog create form file from metadata + + + + dEditDialog create new form file from template + + + + dEditDialog open file %1 for write + + + + dEditDialog open file %1 for read from templates directory %2 + + + + dEditDialog file %1 not exists + + + + dEditDialog show formdesigner + + + + + dEditDoc + + Document + + + + Common + + + + Name + + + + Description: + + + + Module + + + + Aliases + + + + Document: + + + + String view + + + + Access + + + + Read + + + + Write + + + + + dEditField + + Field + + + + Common + + + + Name + + + + Description + + + + Aliases + + + + Lang + + + + Unknown + + + + Field: + + + + Sum + + + + Width + + + + Decimals + + + + Type + + + + Flags + + + + Sort + + + + Positive + + + + Not null + + + + Saldo source + + + + + dEditIReg + + Information register + + + + Common + + + + Name: + + + + Description: + + + + Aliases + + + + Lang + + + + Name + + + + Information register: + + + + Don't delete record in unconduct + + + + + dEditJournal + + Journal + + + + Common + + + + Name: + + + + Type: + + + + Special + + + + Othes + + + + Description: + + + + Aliases + + + + Documents + + + + Action + + + + Action_2 + + + + Journal: + + + + Access + + + + Read + + + + Write + + + + + dEditLang + + Language + + + + Common + + + + Tag: + + + + Name: + + + + Translation file: + + + + Language: + + + + + dEditReport + + Report + + + + Common + + + + Name: + + + + Description: + + + + Module + + + + Aliases + + + + Lang + + + + Name + + + + Report: + + + + + dEditRole + + Role + + + + Common + + + + Description: + + + + Name: + + + + Role: + + + + + dEditToolbar + + Form1 + + + + Common + + + + Description: + + + + Hot Key: + + + + Ctrl + + + + Alt + + + + Shift + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 0 + + + + A + + + + B + + + + C + + + + D + + + + E + + + + F + + + + G + + + + H + + + + I + + + + J + + + + K + + + + L + + + + M + + + + N + + + + O + + + + P + + + + Q + + + + R + + + + S + + + + T + + + + U + + + + V + + + + W + + + + X + + + + Y + + + + Z + + + + Type: + + + + Name: + + + + Actions + + + + Aliases + + + + Lang + + + + Name + + + + Command: + + + + + dEditWebForm + + Web Form + + + + Common + + + + Description + + + + Name: + + + + Form editor + + + + Client module + + + + Server module + + + + Aliases + + + + Web form: + + + + diff --git a/translations/ananas-designer-ru.ts b/translations/ananas-designer-ru.ts new file mode 100644 index 0000000..05a03d3 --- /dev/null +++ b/translations/ananas-designer-ru.ts @@ -0,0 +1,2224 @@ + + + CfgForm + + CfgForm + + + + New + Новый + + + &New + &Новый + + + Ctrl+N + + + + Open + Открыть + + + &Open... + &Открыть... + + + Ctrl+O + + + + Save + Сохранить + + + &Save + &Сохранить + + + Ctrl+S + + + + Save As + Сохранить как + + + Save &As... + Сохранить &как ... + + + Print + Печать + + + &Print... + &Печать ... + + + Ctrl+P + + + + Exit + Выход + + + E&xit + В&ыход + + + ActionGroup + + + + Action + Действие + + + Configuration: + Бизнес схема: + + + Element + Элемент + + + Group + Группа + + + Saving changes + Сохранение изменений + + + Save changes %1? + Сохранить изменения в "%1"? + + + Yes + Да + + + No + Нет + + + Cancel + Отмена + + + Configuration + Конфигурация + + + Name + Имя + + + Object type + Тип объекта + + + Interface + Интерфейс + + + Command + Команда + + + Metadata + Метаданные + + + Actions + Действия + + + Rights + Права + + + Tag + Метка + + + Translation file + Файл перевода + + + Add + Добавить + + + Remove + Удалить + + + Edit + Редактировать + + + Clear dead aliases + Очистить лишние алиасы + + + Image collection + Коллекция картинок + + + Open image dialog + Выбрать каринку + + + New language + Новый язык + + + Deleting row + Удаление строки + + + Delete '%1'? + Удалить %1'? + + + OK + + + + messageswindow + + + + Languages + Языки + + + Clearing dead aliases + Очистка неиспользуемых псевдонимов + + + %1 dead aliases killed. + %1 псевдоним удален. + + + Role name + Название роли + + + Description + Описание + + + Clear dead roles + Убрать неиспользуемые роли + + + New role + Новая роль + + + Clearing dead roles + Удаление неиспользуемых ролей + + + %1 dead roles killed. + %1 убрано. + + + Unable to write rc file. + Невозможно записать rc файл. + + + CfgForm readrc error + CfgForm - Ошибка readrc + + + Business scheme: + Бизнес схема: + + + CfgForm metadata root is null + CfgForm - пустой корень метаданных + + + CfgForm metadata lang is null + CfgForm - lang в метаданных равен null + + + lang = %1 + lang = %1 + + + CfgForm %1 metadata lang is null + CfgForm - %1 lang в метаданных равен null + + + + InterfaceTreeView + + &New Submenu + Новое &подменю + + + New &Command + Новая &команда + + + New &Separator + Новый &разделитель + + + + MainForm + + Ctrl+N + + + + Ctrl+O + + + + actFileSave + + + + Ctrl+S + + + + Ctrl+P + + + + Ctrl+Z + + + + Ctrl+Y + + + + Ctrl+X + + + + Ctrl+C + + + + Ctrl+V + + + + Ctrl+F + + + + ActionGroup + + + + new item + новый элемент + + + Ananas: Configurator + Ананас: Конфигуратор + + + Configuration + Бизнес схема + + + Object + Объект + + + New + Новый + + + Open + Открыть + + + Save + Сохранить + + + Delete + Удалить + + + Rename + Переименовать + + + Edit + Редактировать + + + About Ananas configuration program + О программе настройки Ананаса + + + Ananas: Designer + Ананас.Дизайнер + + + &File + &Файл + + + &Edit + &Редактировать + + + &New + &Новый + + + &Open... + &Открыть... + + + &Save + &Сохранить + + + Save &as... + Сохранить &как ... + + + &Print + &Печать + + + E&xit + В&ыход + + + Undo + Отменить + + + Redo + Повторить + + + Cut + Вырезать + + + Copy + Скопировать + + + Paste + Вставить + + + Find + Найти + + + New form + Новая форма + + + New field + Новое поле + + + New table + Новая таблица + + + New in group + Новый в группе + + + Image Collection + Набор значков + + + &Windows + &Окна + + + &Help + &Помощь + + + &About + &О программе + + + &Cascade + &Каскадировать + + + &Tile + В &ряд + + + Tile &horizontal + В ряд &горизонтально + + + Move Up + Поднять + + + Move Down + Опустить + + + New Group + Новая Группа + + + Action + Действие + + + New Submenu + Новое подменю + + + New Command + Новая команда + + + New Separator + Новый разделитель + + + Clear dead aliases + Очистить лишние алиасы + + + Add + Добавить + + + <h4>Ananas configurator</h4> is a programm<br>for adjusting accounting automation system<br><br>Copyright 2003-2004 Leader Infotech,<br>Valery Grazdankin, Andrey Paskal.<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.linux.ru.net">http://ananas.linux.ru.net</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + <h4>Ананас.Дизайнер</h4> программа<br>для настройки бизнес схем учетной системы<br><br>Copyright 2003-2005 Leader Infotech,<br>Валерий Гражданкин<br>Copyright 2003-2005, Проект Ананас, Андрей Паскаль.<br>Лицензия: GPL<br><br>тех.поддержка:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Веб сайт:<br><a href="http://ananas.linux.ru.net">http://ananas.linux.ru.net</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + + + Index + Индекс + + + About + О программе + + + Create new configuration + Создать новую схему + + + Open configuration + Открыть схему + + + Save configuration changes + Сохранить изменения + + + Contents + Содержание + + + &Contents... + &Содержание... + + + &Index... + &Индекс... + + + Cteate/Update DB + Создать/обновить БД + + + New button + Новая кнопка + + + New attribute + Новый атрибут + + + New Field + Новое поле + + + Tabs + Закладки + + + Вырезать + + + + Копировать + + + + Вставить + + + + Содержание + + + + &Содержание... + &Содержание... + + + Индекс + + + + &Индекс... + &Индекс... + + + О программе + + + + &О программе + &О программе + + + Конфигурация + Бизнес схема + + + Save configuration + Сохранить схему + + + Создать/обновить БД + + + + Новая кнопка + + + + Новый атрибут + + + + Новое поле + + + + Add new role + Добавить новую роль + + + Clear dead roles + Убрать неиспользуемые роли + + + Edit role + Изменить роль + + + &Window + &Окно + + + Windows + Окна + + + Goto + Переход + + + &Open + &Открыть + + + <h4>Ananas configurator</h4> is a programm<br>for adjusting accounting automation system<br><br>Copyright 2003-2004 Leader Infotech,<br>Valery Grazdankin, Andrey Paskal.<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + <h4>Ананас.Дизайнер</h4> это программа <br>для настройки бизнес схем.<br><br>Copyright 2003-2004 Leader Infotech,<br>Валерий Гражданкин, Андрей Паскаль.<br>Лицензия: GPL<br><br>техническая поддержка:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Веб сайты:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + + + <h4>Ananas configurator %1</h4> is a programm<br>for adjusting accounting automation system<br><br>Copyright 2003-2004 Leader Infotech,<br>Valery Grazdankin, Andrey Paskal.<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + <h4>Ананас.Дизайнер %1</h4> это программа <br>для настройки бизнес схем.<br><br>Copyright 2003-2006 Leader Infotech,<br>Валерий Гражданкин, Андрей Паскаль.<br>Лицензия: GPL<br><br>техническая поддержка:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Веб сайты:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + + + About Ananas.Designer + О программе Ананас.Дизайнер + + + <h4>Ananas.Designer %1</h4> is a programm<br>for adjusting accounting automation system<br><br>Copyright 2003-2006 Leader Infotech, Valery Grazdankin, Copyright 2003-2006 Project Ananas, Andrey Paskal, Grigory Panov, Andrey Strelnikov<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + <h4>Ананас.Дизайнер %1</h4> <br> +Ананас.Дизайнер - программа <br> +для настройки бизнес схем.<br> +Лицензия: GPL<br> +Copyright 2003-2006 Лидер Инфотех, Валерий Гражданкин<br> +Copyright 2003-2006 Проект Ананас, Андрей Паскаль, Григорий Панов, Андрей Стрельников<br> +<br> +<a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> +<br>Доступные расширения:<br>%2 + + + <h4>Ananas.Designer %1</h4> is a programm<br>for adjusting accounting automation system<br><br>Copyright 2003-2006 Leader Infotech, Valery Grazdankin <br>Copyright 2003-2006 Project Ananas, Andrey Paskal, Grigory Panov, Andrey Strelnikov<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br><br>Avalable extensions:<br>%2 + <h4>Ананас.Дизайнер %1</h4> <br> +Ананас.Дизайнер - программа для настройки бизнес схем.<br> +<br> +Лицензия: GPL<br> +Copyright 2003-2006 Лидер Инфотех, Валерий Гражданкин<br> +Copyright 2003-2006 Проект Ананас, Андрей Паскаль, Григорий Панов, Андрей Стрельников<br> +<br> +Техподдержка:<br> +lider-infotech@narod.ru<br> +app@linux.ru.net<br> +Сайты:<br> +<a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br> +<a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> +<br> +Доступные расширения:<br> +%2 + + + + PixmapPreview + + This is not a pixmap + Это не картинка + + + + QObject + + Dialog forms designer + Редактор форм диалога + + + Catalogues + Справочники + + + Documents + Документы + + + Reports + Отчеты + + + Journals + Журналы + + + Information registers + Информационные регистры + + + Accumulation registers + Накопительные регистры + + + Header + Шапка + + + Tables + таблицы + + + Forms + Формы + + + Web forms + Веб-формы + + + Columns + Столбцы + + + Resources + Ресурсы + + + Dimensions + Измерения + + + Information + Информация + + + Element + Элемент + + + Group + Группа + + + New field + Новое поле + + + New document + Новый документ + + + New catalogue + Новый справочник + + + New journal + Новый журнал + + + New information register + Новый информационный регистр + + + New accumulation register + Новый накопительный регистр + + + New report + Новый отчет + + + New form + Новая форма + + + New web form + Новая веб-форма + + + New Table + Новая таблица + + + New Command + Новая команда + + + New Submenu + Новое подменю + + + Interface + Интерфейс + + + New Action Group + Новая группа действий + + + New Action + Новое действие + + + Actions + Действия + + + selection + выбор + + + default + предопределенный + + + Init application + Инициализация приложения + + + Init forms designer + Инициализация редактора форм + + + ------------------- + + + + New Popup menu + Новое всплывающее меню + + + New tool bar + Новая панель инструментов + + + Toolbars + Панели инструментов + + + Main menu + Главное меню + + + Popup menus + Всплывающие меню + + + header + заголовок + + + New Column + Новый столбец + + + Elements list dialog + Диалог списка элементов + + + Element dialog + Диалог элемента + + + Group dialog + Диалог Группы + + + embedded editor + Встроенный редактор + + + &Windows + &Окна + + + Unknown + Неизвестно + + + Numberic + Числовой + + + Ananas List View Item %1 is null + Элемент %1 списка равен null + + + Ananas List View Item swaping + Обмен пунктов списка + + + any files (*) + все файлы (*) + + + New &Group + Новая &Группа + + + New &Action + Новое &действие + + + + aAliasEditor + + Name + Имя + + + + aMetadataTreeView + + &New + &Новый + + + + aRoleEditor + + Read + Прочитать + + + Write + Записать + + + Delete + Удалить + + + Turn On + Включить + + + Turn Off + Выключить + + + + ananasTreeView + + <font color=darkblue><u><b>Context Menu</b></u></font> + <font color=darkblue><u><b>Контекстное меню</b></u></font> + + + &Rename + Пере&именовать + + + &Edit + &Редактировать + + + &Delete + &Удалить + + + &MoveUp + &Поднять + + + &MoveDown + &Опустить + + + &SaveItem + &Сохранить элемент в файл + + + &LoadItem + &Загрузить элемент из файла + + + + dEditAReg + + Accumulating register + Накопительный регистр + + + Common + Общий + + + Name: + Имя: + + + Description: + Описание: + + + Aliases + Псевдонимы + + + Lang + Язык + + + Name + Имя + + + Accumulation register: + Накопительный регистр: + + + + dEditAction + + Action + Действие + + + Common + Общий + + + Description: + Описание: + + + Name + Имя + + + Type + Тип + + + standart command + стандартная команда + + + user script + скрипт + + + Enabled icon + Значек при доступности + + + ... + ... + + + X + + + + Disabled icon + Значек при недоступности + + + Execute + Выполнить + + + Object + Объект + + + Params + Параметры + + + new + новый + + + edit + редактировать + + + execute + выполнить + + + Aliases + Псевдонимы + + + Lang + Язык + + + Action: + Действие: + + + Open image dialog + Выбрать картинку + + + Form + Форма + + + view + просмотр + + + Action_2 + + + + Choose an image + Выбрать изображение + + + external script + внешний скрипт + + + File name + Имя файла + + + + dEditCat + + Catalogue + Справочник + + + Common + Общий + + + Name: + Имя: + + + Description: + Описание: + + + Aliases + Псевдонимы + + + Lang + Язык + + + Name + Имя + + + Catalogue: + Справочник: + + + Element string view + Текстовое представление элемента + + + Group string view + Текстовое представление группы + + + Access + Доступ + + + Read + Читать + + + Write + Изменять + + + + dEditCfg + + mysql + + + + postgres + + + + MySQL + + + + Postgres + + + + Configuration parameters + Параметры схемы + + + Common + Общий + + + Name + Имя + + + Author + Автор + + + Date + Дата + + + Description + Описание + + + User + Пользователь + + + Data base server user + Пользователь сервера баз данных + + + Data base password + Пароль сервера баз данных + + + Data base type + Тип базы данных + + + Unknown + Неизвестно + + + Data base server address + Адрес сервера баз данных + + + Data base name + Имя базы данных + + + Work directory + Рабочий каталог + + + Configuration file name + Имя файла метаданных + + + Data base server port + Порт сервера баз данных + + + Global module + Глобальный модуль + + + Data base header + Заголовок базы данных + + + Configuration parameters: + Параметры схемы: + + + Business scheme parameters + Параметры бизнес схемы + + + Business scheme parameters: + Параметры бизнес схемы: + + + + dEditColumns + + Columns + Столбцы + + + Name: + Имя: + + + Action + Действие + + + Column: + Столбец: + + + + dEditCommand + + Command + Команда + + + Common + Общий + + + Description: + Описание: + + + Hot Key: + Клавиатурная комбинация: + + + Ctrl + + + + Alt + + + + Shift + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 0 + + + + A + + + + B + + + + C + + + + D + + + + E + + + + F + + + + G + + + + H + + + + I + + + + J + + + + K + + + + L + + + + M + + + + N + + + + O + + + + P + + + + Q + + + + R + + + + S + + + + T + + + + U + + + + V + + + + W + + + + X + + + + Y + + + + Z + + + + Type: + Тип: + + + Name: + Имя: + + + Actions + Действия + + + Aliases + Псевдонимы + + + Lang + Язык + + + Name + Имя + + + Command: + Команда: + + + Menu text + Текст меню + + + + dEditDialog + + Form + Форма + + + Common + Общий + + + Name + Имя + + + Module file + Файл модуля + + + Form file + Файл формы + + + Description: + Описание: + + + Design + Дизайн + + + View + Просмотр + + + Module + Модуль + + + Aliases + Псевдонимы + + + Lang + Язык + + + Form: + Форма: + + + Default use for: + По умолчанию используется для: + + + no use + не использовать + + + create new + создать новый + + + view + просмотр + + + Form mode: + Режим формы: + + + Use for: + Использовать для: + + + Dialog + Диалог + + + New + Новый + + + Edit + Редактировать + + + Selection + Выбор + + + Read only + Только чтение + + + Designer + Редактор диалогов + + + Preview + Просмотр + + + dEditDialog edit form + Форма редактирования dEditDialog + + + dEditDialog form file does not exists + Не найден файл dEditDialog + + + dEditDialog create form file from metadata + dEditDialog - файл формы из метаданных + + + dEditDialog create new form file from template + dEditDialog - файл формы из шаблона + + + dEditDialog open file %1 for write + dEditDialog - редактируем файл %1 + + + dEditDialog open file %1 for read from templates directory %2 + dEditDialog - Открываем для чтения файл %1 из каталога шаблонов + + + dEditDialog file %1 not exists + dEditDialog - Файл %1 не найден + + + dEditDialog show formdesigner + dEditDialog - Открываем редактор диалогов + + + + dEditDoc + + Document + Документ + + + Common + Общий + + + Name + Имя + + + Description: + Описание: + + + Module + Модуль + + + Aliases + Псевдонимы + + + Document: + Документ: + + + String view + Текстовое представление + + + Access + Доступ + + + Read + Читать + + + Write + Изменять + + + + dEditField + + Field + Поле + + + Common + Общий + + + Name + Имя + + + Description + Описание + + + Aliases + Псевдонимы + + + Lang + Язык + + + Unknown + Неизвестно + + + Field: + Поле: + + + Sum + Сумма + + + Width + Ширина + + + Decimals + Десятичные + + + Type + Тип + + + Flags + Флаг + + + Sort + Сорт + + + Positive + Положительное + + + Not null + Не нулевое + + + Saldo source + Источник остатков + + + + dEditIReg + + Information register + Информационный регистр + + + Common + Общий + + + Name: + Имя: + + + Description: + Описание: + + + Aliases + Псевдонимы + + + Lang + Язык + + + Name + Имя + + + Information register: + Информационный регистр: + + + Don't delete record in unconduct + Не удалять записи при отмене проведения документа + + + + dEditJournal + + Journal + Журнал + + + Common + Общий + + + Name: + Имя: + + + Description: + Описание: + + + Aliases + Псевдонимы + + + Journal: + Журнал: + + + Type: + Тип: + + + Special + Специальный + + + Othes + Другой + + + Documents + Документы + + + Action + Действие + + + Action_2 + + + + Access + Доступ + + + Read + Читать + + + Write + Изменять + + + + dEditLang + + Language + Язык + + + Common + Общий + + + Tag: + Метка: + + + Name: + Имя: + + + Translation file: + Файл перевода: + + + Language: + Язык: + + + + dEditReport + + Report + Отчет + + + Common + Общий + + + Name: + Имя: + + + Description: + Описание: + + + Module + Модуль + + + Aliases + Псевдонимы + + + Lang + Язык + + + Name + Имя + + + Report: + Отчет: + + + + dEditRole + + Role + Роль + + + Common + Общий + + + Description: + Описание: + + + Name: + Имя: + + + Role: + Роль: + + + + dEditToolbar + + Form1 + + + + Common + Общий + + + Description: + Описание: + + + Hot Key: + Клавиатурная комбинация: + + + Ctrl + + + + Alt + + + + Shift + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 0 + + + + A + + + + B + + + + C + + + + D + + + + E + + + + F + + + + G + + + + H + + + + I + + + + J + + + + K + + + + L + + + + M + + + + N + + + + O + + + + P + + + + Q + + + + R + + + + S + + + + T + + + + U + + + + V + + + + W + + + + X + + + + Y + + + + Z + + + + Type: + Тип: + + + Name: + Имя: + + + Actions + ДействияДействия + + + Aliases + Псевдонимы + + + Lang + Язык + + + Name + Имя + + + Command: + Команда: + + + + dEditWebForm + + Web Form + Веб-форма + + + Common + Общий + + + Description + Описание + + + Name: + Имя: + + + Form editor + Редактор форм + + + Client module + Модуль веб клиента + + + Server module + Модуль веб сервера + + + Aliases + Псевдонимы + + + Web form: + Веб-форма: + + + diff --git a/translations/ananas-engine-en.ts b/translations/ananas-engine-en.ts new file mode 100644 index 0000000..d7df61d --- /dev/null +++ b/translations/ananas-engine-en.ts @@ -0,0 +1,48 @@ + + + MainForm + + About + + + + &Help + + + + Ananas + + + + &Windows + + + + &Cascade + + + + &Tile + + + + Tile &horizontal + + + + About Ananas.Engine program + + + + <h4>Ananas.Engin %1</h4> is a programm<br>for executing application of accounting automation system<br><br>Copyright 2003-2006 Leader Infotech, Valery Grazdankin, Copyright 2003-2006 Project Ananas, Andrey Paskal, Grigory Panov, Andrey Strelnikov<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br><br>Avalable extensions:<br>%2 + + + + + QObject + + Init application + + + + diff --git a/translations/ananas-engine-ru.ts b/translations/ananas-engine-ru.ts new file mode 100644 index 0000000..df55bf9 --- /dev/null +++ b/translations/ananas-engine-ru.ts @@ -0,0 +1,105 @@ + + + MainForm + + About + О программе + + + &Help + &Помощь + + + About Ananas engine program + О программе Ананас + + + <h4>Ananas engine</h4> is a programm<br>for executing application of accounting automation system<br><br>Copyright 2003-2004 Leader Infotech,<br>Valery Grazdankin, Andrey Pascal.<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@altlinux.ru<br>Web sites:<br><a href="http://ananas.linux.ru.net">http://ananas.linux.ru.net</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + <h4>Оболочка АНАНАС</h4> это программа<br>для выполнения приложений системы автоматизации учета<br><br>Права 2003-2004 Лидер ИнфоТех,<br>Валерий Гражданкин, Андрей Паскаль.<br>Лицензия: GPL<br><br>техническая поддержка:<br>lider-infotech@narod.ru<br>app@altlinux.ru<br>Веб сайты:<br><a href="http://ananas.linux.ru.net">http://ananas.linux.ru.net</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + + + Ananas + Ананас + + + <h4>Ananas engine</h4> is a programm<br>for executing application of accounting automation system<br><br>Copyright 2003-2004 Leader Infotech,<br>Valery Grazdankin, Andrey Paskal.<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.linux.ru.net">http://ananas.linux.ru.net</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + <h4>Ананас</h4> +Ананас - платформа автоматизации учета.<br> +Лицензия: GPL<br> +Copyright 2003-2005 Лидер Инфотех, Валерий Гражданкин<br> +Copyright 2003-2005 Проект Ананас, Андрей Паскаль, Григорий Панов, Андрей Стрельников....<br> +<br> +<a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + + + Ananas + Ананас + + + &Windows + &Окна + + + <h4>Ananas engine</h4> is a programm<br>for executing application of accounting automation system<br><br>Copyright 2003-2004 Leader Infotech,<br>Valery Grazdankin, Andrey Paskal.<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + <h4>Ананас</h4> +Ананас - платформа автоматизации учета.<br> +Лицензия: GPL<br> +Copyright 2003-2005 Лидер Инфотех, Валерий Гражданкин<br> +Copyright 2003-2005 Проект Ананас, Андрей Паскаль, Григорий Панов, Андрей Стрельников....<br> +<br> +<a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + + + &Cascade + &Каскадом + + + &Tile + &Черепицей + + + Tile &horizontal + Черепицей &горизонтально + + + <h4>Ananas engine %1</h4> is a programm<br>for executing application of accounting automation system<br><br>Copyright 2003-2004 Leader Infotech,<br>Valery Grazdankin, Andrey Paskal.<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br><br>Avalable extensions:<br>%2 + <h4>Ананас %1</h4> +Ананас - платформа автоматизации учета.<br> +Лицензия: GPL<br> +Copyright 2003-2006 Лидер Инфотех, Валерий Гражданкин<br> +Copyright 2003-2006 Проект Ананас, Андрей Паскаль, Григорий Панов, Андрей Стрельников....<br> +<br> +<a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> + + + About Ananas.Engine program + О программе Ананас + + + <h4>Ananas.Engin %1</h4> is a programm<br>for executing application of accounting automation system<br><br>Copyright 2003-2006 Leader Infotech, Valery Grazdankin, Copyright 2003-2006 Project Ananas, Andrey Paskal, Grigory Panov, Andrey Strelnikov<br>License: GPL<br><br>technical support:<br>lider-infotech@narod.ru<br>app@linux.ru.net<br>Web sites:<br><a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br><a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br><br>Avalable extensions:<br>%2 + <h4>Ананас %1</h4> +Ананас - платформа автоматизации учета.<br> +<br> +Лицензия: GPL<br> +Copyright 2003-2006 Лидер Инфотех, Валерий Гражданкин<br> +Copyright 2003-2006 Проект Ананас, Андрей Паскаль, Григорий Панов, Андрей Стрельников<br> +<br> +Техподдержка:<br> +lider-infotech@narod.ru<br> +app@linux.ru.net<br> +Сайты:<br> +<a href="http://ananas.lrn.ru">http://ananas.lrn.ru</a><br> +<a href="http://www.leaderit.ru">http://www.leaderit.ru</a><br> +<br> +Доступные расширения:<br> +%2 + + + + QObject + + Init application + Инициализация приложения + + + diff --git a/translations/ananas-lib-en.ts b/translations/ananas-lib-en.ts new file mode 100644 index 0000000..1eeaa55 --- /dev/null +++ b/translations/ananas-lib-en.ts @@ -0,0 +1,1518 @@ + + + HelpCfgForm + + Create busines shema + + + + Close + + + + Make group, item, set item paramert and press Ok button. See http://ananas.lrn.ru/index.php?title=Manual:Disigner for details + + + + + MessagesWindow + + Messages window + + + + + QObject + + Unknown + + + + Numberic + + + + Char + + + + Date + + + + Catalogue + + + + Document + + + + Journal + + + + Information Register + + + + Accumuliation Register + + + + Report + + + + Field + + + + Documents + + + + Element + + + + Group + + + + Header + + + + Boolean + + + + aDatabase drop field(s) %1 + + + + aDatabase add field(s) %1 + + + + aDatabase update field(s) %1 + + + + aDatabase query: %1 + + + + aDatabase text: %1 + + + + aDatabase database text: %1 + + + + aDatabase driver text: %1 + + + + aDataTable try set mdobject to null + + + + aDataTable get value of unknown field `%1' + + + + aDataTable get document prefix to `%1' + + + + aService copy: source file %1 not exist + + + + aService copy: replace destination file %1 + + + + aService copy: source file %1 open for read error + + + + aService copy: destination file %1 open for write error + + + + aService copy file %1 to %2 ok + + + + aTests file %1 not exists + + + + aTests file %1 not open for read + + + + Error read configuration line:%1 col:%2 %3 + + + + aDataTable clear filter + + + + aDataTable set filter %1='%2' + + + + aDataTable set filter %1='%2', %3 not exist + + + + + aARegister + + RecordDate + + + + Accumulation Register init + + + + Accumulation Register create main table + + + + Accumulation Register create saldo table + + + + Accumulation Register update + + + + Accumulation register convert datetime from string %1 + + + + Accumulation register not found table %1 + + + + Accumulation register set filter + + + + Accumulation register not found main table + + + + + aBackup + + Can't create temporary directory + + + + Can't connect to database + + + + Can't copy .cfg file + + + + Database import without errors + + + + Can't create directory %s + + + + Invalid resource file + + + + Can't write resource file + + + + Can't write file META-INF/manifest.xml + + + + Can't copy template file + + + + Data export done without errors + + + + Can't start zip + + + + Zip ended anormal + + + + Zip ended with code %1 + + + + Unable to start zip + + + + Zip ended with error + + + + Can't write content.xml + + + + aBackup create temporary directory %1 + + + + aBackup import data: unzip + + + + aBackup unzip + + + + aBackup filename = %1 + + + + aBackup workdir=%1 + + + + aBackup copy unzipped business schema file + + + + aBackup copy business schema file + + + + aBackup import data ok + + + + aBackup create temporary directory + + + + aBackup invalid *.rc file + + + + aBackup valid *.rc file + + + + aBackup template %1 %2 + + + + aBackup write %1 file + + + + aBackup dump base error + + + + aBackup bump base + + + + aBackup write manifest.xml + + + + aBackup zip archive + + + + aBackup export data ok + + + + aBackup start unzip + + + + aBackup unzip dead + + + + aBackup unzip normal + + + + aBackup zip start error + + + + aBackup zip dead + + + + aBackup dump tables ok + + + + aBackup init rc file %1 + + + + aBackup write content.xml + + + + aBackup dump base to xml compleet + + + + aBackup save xml %1 + + + + aBackup create manifest.xml + + + + aBackup delete file %1 + + + + aBackup delete directory %1 + + + + aBackup cleanup temporary files + + + + aBackup template dir `%1' not exists, try create + + + + aBackup create template dir `%1' fail + + + + aBackup create template dir `%1' + + + + aBackup template dir `%1' exists + + + + + aCManifest + + aCManifest save xml %1 + + + + aCManifest read file `%1' + + + + aCManifest read line: %1 column: %2 + + + + aCManifest invalid manifest + + + + + aCatGroup + + aCatGroup new group + + + + aCatGroup new group ok + + + + aCatGroup new group error %1 + + + + + aCatalogue + + aCatalogue delete ido=%1 + + + + aCatalogue update + + + + aCatalogue update groups error %1 + + + + aCatalogue update groups + + + + aCatalogue update elements error %1 + + + + aCatalogue select group id=%1 + + + + aCatalogue new group with id=%1 + + + + aCatalogue delete element with id=%1 + + + + aCatalogue delete group with id=%1 + + + + aCatalogue delete without selection + + + + aCatalogue update group + + + + + aCfg + + Bad configuration + + + + aCfg swap: first element is null + + + + aCfg swap: second element is null + + + + aCfg swap element himself + + + + aCfg swap: first parent null + + + + aCfg swap: second parent null + + + + aCfg swap elements with differernt parents + + + + Document + + + + Catalogue + + + + DocJournal + + + + Report + + + + InfoRegister + + + + AccumulationRegister + + + + Form + + + + aCfg saveOneObject: context save to file `%1' + + + + aCfg saveOneObject: context is null + + + + aCfg loadOneObject: invalid cfg file `%1' + + + + aCfg loadOneObject: invalid file name or not permission to file `%1' + + + + aLog setup new id for %1 + + + + aLog next id is %1 + + + + + aContainer + + aContainer unzip + + + + Can't create temporary directory + + + + aContainer create temporary directory %1 + + + + No manifest found! + + + + aContainer error copy file + + + + aContainer manifest is null + + + + Can't start unzip + + + + aContainer start unzip + + + + Unzip ended anormal + + + + aContainer unzip dead + + + + aContainer unzip normal + + + + Unzip ended with code %1 + + + + Unable to start zip + + + + aContainer zip start error + + + + Zip ended with error + + + + aContainer zip dead + + + + Zip ended with code %1 + + + + aContainer delete file %1 + + + + aContainer delete directory %1 + + + + + aDatabase + + Uniques table updated + + + + + Documents journal updated + + + + + Catalogue %s updated + + + + + Document %s updated + + + + + Can't open database connection + + + + + Users updated + + + + + Users roles updated + + + + + Roles updated + + + + + Rigths updated + + + + + Information registers %s updated + + + + + Accumulation registers %s updated + + + + + aDatabase open connection to %1 + + + + aDatabase drop database %1 + + + + aDatabase generate new unique number for object type %1 + + + + aDatabase generate new unique number %1 for objecttype %2 + + + + aDatabase get object type for unique id=%1 + + + + aDatabase check indices for %1 + + + + aDatabase search index %1 + + + + Catalogue %s processed + + + + + aDatabase catalogue %1 import + + + + aDatabase catalogue %1 export + + + + Document %s processed + + + + + aDatabase document %1 import + + + + aDatabase document %1 export + + + + Information registers %s processed + + + + + aDatabase information register %1 import + + + + aDatabase information register %1 export + + + + Accumulation registers %s processed + + + + + aDatabase accumulation register %1 import + + + + aDatabase accumulation register %1 export + + + + aDatabase export table: invalid XML file + + + + aDatabase import table: invalid XML file + + + + aDatabase import table: table %1 not exists + + + + aDatabase prepared for open connection to %1 + + + + aDatabase open connection failed, try create %1 + + + + aDatabase system database is open + + + + Can't create database + + + + + aDatabase create database %1 + + + + aDatabase open connection to %1 ok + + + + aDatabase import table: get table %1 + + + + + aDocJournal + + aDocJournal md object not exists + + + + aDocJournal columns not defined + + + + aDocJournal column defined + + + + aDocJournal invalid column define + + + + aDocJournal delete document with idd=%1 + + + + aDocJournal new document with idd=%1 + + + + aDocJournal generated next number for %1 is %2 + + + + aDocJournal document not found with idd=%1 + + + + aDocJournal document not found with number=%1 and type=%2 + + + + aDocJournal select document with number=%1 and md name=%2 + + + + + aDocument + + aDocument have no sysjournal + + + + aDocument new document + + + + aDocument select new table line number + + + + aDocument new table line number=%1 + + + + aDocument insert new table line + + + + aDocument delete from sysjournal + + + + aDocument delete from unicues + + + + aDocument delete table %1 + + + + aDocument delete table of conducted document + + + + aDocument deleted table not exist + + + + aDocument deleted table not selected + + + + aDocument delete table from info register + + + + aDocument delete table + + + + aDocument not selected + + + + aDocument table name is empty + + + + aDocument update error=%1 + + + + aDocument conducted table update + + + + aDocument conduct + + + + aDocument delete from accumulation register + + + + aDocument aObject::New() ended with error code = %1 + + + + aDocument metaobject is null=%1 + + + + aDocument new type = %1 + + + + aDocument New() error while added record in sysJournal =%1 + + + + Deprecated method call. aDocument::Conduct(...) + + + + Deprecated method call. aDocument::UnConduct() + + + + Deprecated method call. aDocument::IsConducted() + + + + aDocument::GetDocumentValue(...): Can't find aDocument + + + + + aIRegister + + aIRegister metaobject is null + + + + aIRegister deleted document have invalid idd + + + + aIRegister select period from %1 to %2 + + + + + aOOTemplate + + aOOTemplate temporary directory is %1 + + + + aOOTemplate create temporary directory %1 + + + + aOOTemplate start unzip + + + + aOOTemplate unzip dead + + + + aOOTemplate unzip normal + + + + aOOTemplate open + + + + aOOTemplate value for field %1 not setted + + + + aOOTemplate save %1 open for write + + + + aOOTemplate save working dir =%1 + + + + aOOTemplate start zip + + + + aOOTemplate zip dead + + + + aOOTemplate zip normal to %1 + + + + + aObject + + Table `%s' not found. + + + + + aObject have no database! + + + + aObject md object not found + + + + aObject table with name %1 not found + + + + aObject have no system field %1 + + + + aObject update error. Driver message: %1 + + + + aObject decode doc number %1 + + + + aObject decode doc number ok, pref=%1 num=%2 + + + + aObject table update: no table found with name %1 + + + + aObject display string context is null + + + + + aObjectList + + aObjectList have no database! + + + + aObjectList md object not found + + + + aObjectList have no system field %1 + + + + aObjectList display string context is null + + + + + aReport + + Warning + + + + aReport OpenOfficeExecutable not found in registery + + + + aReport OpenOfficeExecutable found %1 + + + + aReport OpenOfficeExecutable not found in ~/.ananas/configrc + + + + Unable to start OpenOffice (%1) + + + + aReport OpenOfficeExecutable set to %1 + + + + aReport working dir = %1 + + + + aReport name for template = %1 + + + + + aReportBrowser + + Print + + + + Print report + + + + + aTemplate + + aTemplate save file %1 + + + + + aWidget + + aWidget init widget %1 form mode %2 + + + + aWidget init: invalid database + + + + aWidget init: invalid meta object + + + + aWidget init: connect signals wDBTable + + + + aWidget invalid data source object + + + + aWidget widgetEditor: invalid metadata object + + + + aWidget table: invalid data source object + + + + aWidget new: invalid data source object + + + + aWidget select: invalid data source object + + + + aWidget update: invalid data source object + + + + aWidget value not fount widget with name %1 + + + + aWidget set value: not fount widget with name %1 + + + + aWidget doc Id: invalid data source object + + + + + dEditRC + + Resource file + + + + Data base header + + + + Data base name + + + + Data base server type + + + + Unknown + + + + mysql + + + + postgres + + + + Data base server address + + + + Data base server port + + + + Data base server user + + + + Data base server password + + + + Work directory + + + + Resource file name + + + + ... + + + + Configuration file name + + + + OK + + + + Cancel + + + + internal + + + + ananas config resource (*.rc) + + + + ananas config file (*.cfg) + + + + + dImportDB + + Resource file + + + + archive file + + + + Import + + + + any files (*) + + + + ananas business schema archiff file (*.bsa) + + + + + dLogin + + Ananas: Login + + + + Login name + + + + Password + + + + &Cancel + + + + Alt+C + + + + O&K + + + + Alt+K + + + + + dSelectDB + + Information base + + + + Select data base + + + + Name + + + + Resource file + + + + &OK + + + + &Delete + + + + &Cancel + + + + Alt+C + + + + &Help + + + + Alt+H + + + + New group + + + + save + + + + Delete item? + + + + confirm delete + + + + E&xit + + + + New &group + + + + Edi&t + + + + &Import + + + + &Export + + + + Backup + + + + Select item + + + + Please, select item for export + + + + Program + + + + Actions + + + + Service + + + + dSelectDB local settings not found + + + + dSelectDB read settings for group with name %1 + + + + dSelectDB save settings + + + + save settings local? + + + + dSelectDB business schema import + + + + dSelectDB restore: %1 + + + + dSelectDB backup ok + + + + dSelectDB backup: %1 + + + + New shema + + + + &New shema + + + + diff --git a/translations/ananas-lib-ru.ts b/translations/ananas-lib-ru.ts new file mode 100644 index 0000000..07a9771 --- /dev/null +++ b/translations/ananas-lib-ru.ts @@ -0,0 +1,1608 @@ + + + HelpCfgForm + + Create busines shema + Создание бизнес схемы + + + Close + Закрыть + + + Make group, item, set item paramert and press Ok button. See http://ananas.lrn.ru/index.php?title=Manual:Disigner for details + Создайте группу, элемент. Задайте параметры элемента, нажмите Ок. Смотрите описание на http://ananas.lrn.ru/index.php?title=Manual:Disigner + + + + MessagesWindow + + Messages window + Окно сообщений + + + + QObject + + Error read configuration line:%d col:%s %s + Ошибка чтения файла метаданных в строке:%d позиция:%s %s + + + Unknown + Неизвестный + + + Numberic + Число + + + Char + Символ + + + Date + Дата + + + Catalogue + Каталог + + + Document + Документ + + + Field + Поле + + + Journal + Журнал + + + Information Register + Информационный регистр + + + Accumuliation Register + Накопительный регистр + + + Report + Отчет + + + Documents + Документы + + + Element + Элементы + + + Group + Группа + + + Header + Заголовок + + + Boolean + Логический + + + aDatabase drop field(s) %1 + Удалены поля БД: %1 + + + aDatabase add field(s) %1 + Добавлены поля БД: %1 + + + aDatabase update field(s) %1 + Обновлены поля БД: %1 + + + aDatabase query: %1 + Запрос к БД: %1 + + + aDatabase text: %1 + Текст сообщения об ошибке при работе с БД: %1 + + + aDatabase database text: %1 + Текст сообщения об ошибке Сервера БД при работе с БД: %1 + + + aDatabase driver text: %1 + Текст сообщения об ошибке Драйвера при работе с БД: %1 + + + aDataTable try set mdobject to null + aDataTable Попытка установить значение mdobject в null + + + aDataTable get value of unknown field `%1' + aDataTable Попытка получения значения неизвестного поля `%1' + + + aDataTable get document prefix to `%1' + aDataTable Установка префикса документа : `%1' + + + aService copy: source file %1 not exist + aService copy: Исходный файл %1 не обнаружен + + + aService copy: replace destination file %1 + aService copy: Замена целевого файла при копировании: %1 + + + aService copy: source file %1 open for read error + aService copy: Ошибка открытия исходного файла %1 для чтения при копировании + + + aService copy: destination file %1 open for write error + aService copy: Ошибка открытия целевого файла %1 для записи + + + aService copy file %1 to %2 ok + aService: Файл %1 успешно скопирован в файл %2 + + + aTests file %1 not exists + aTests: Файл %1 не существует + + + aTests file %1 not open for read + aTests: Файл %1 невозможно открыть для чтения + + + Error read configuration line:%1 col:%2 %3 + Ошибка чтения конфигурации. Строка: %1, позиция: %2 %3 + + + aDataTable clear filter + aDataTable: Очистка фильтра + + + aDataTable set filter %1='%2' + aDataTable: Установка фильтра %1='%2' + + + aDataTable set filter %1='%2', %3 not exist + aDataTable: Установка фильтра %1='%2', %3 не существует + + + + aARegister + + Record Date + Дата записи + + + RecordDate + Дата записи + + + Accumulation Register init + Инициализация накопительного регистра + + + Accumulation Register create main table + Создание главной таблицы накопительного регистра + + + Accumulation Register create saldo table + Создание таблицы остатков накопительного регистра + + + Accumulation Register update + Обновление накопительного регистра + + + Accumulation register convert datetime from string %1 + Накопительный регистр: Конвертирование в тип ДатаВремя из строки %1 + + + Accumulation register not found table %1 + Накопительный регистр: Не найдена таблица %1 + + + Accumulation register set filter + Накопительный регистр: Установка фильтра + + + Accumulation register not found main table + Накопительный регистр: Не найдена главная таблица + + + + aBackup + + Can't create temporary directory + Не могу создать временную директорию + + + Can't connect to database + Не могу присоединиться к базе данных + + + Can't copy .cfg file + Не могу скопировать cfg файл + + + Database import without errors + Восстановление из резервной копии завершено без ошибок + + + Can't create directory %s + Не могу создать каталог %1 + + + Invalid resource file + Неправильный файл ресурса + + + Can't write resource file + Не могу записать файл ресурса + + + Can't write file META-INF/manifest.xml + Не могу записать файл META-INF/manifest.xml + + + Can't copy template file + Не могу записать файл шаблона + + + Data export done without errors + Резервная копия создана успешно + + + Can't start zip + Не могу запустить zip + + + Zip ended anormal + Запаковка завершилась с ошибкой + + + Zip ended with code %1 + Zip завершился с кодом %1 + + + Unable to start zip + Не могу запустить zip + + + Zip ended with error + Запаковка завершилась с ошибкой + + + Can't write content.xml + Не могу записать файл content.xml + + + aBackup create temporary directory %1 + aBackup: Создание временной папки %1 в файловой системе + + + aBackup import data: unzip + aBackup: Импорт данных: unzip + + + aBackup unzip + aBackup: Распаковка unzip + + + aBackup filename = %1 + aBackup: Имя файла = %1 + + + aBackup workdir=%1 + aBackup: Рабочая папка файловой системы =%1 + + + aBackup copy unzipped business schema file + aBackup: Копирование распакованного файла бизнес схемы + + + aBackup copy business schema file + aBackup: Копирование файла бизнес схемы + + + aBackup import data ok + aBackup: Успешно импортированы данные резервной копии + + + aBackup create temporary directory + aBackup: Создание временной папки в файловой системе + + + aBackup invalid *.rc file + aBackup: Ошибка в *.rc файле + + + aBackup valid *.rc file + aBackup: Нет ошибок в *.rc файле + + + aBackup template %1 %2 + aBackup: шаблон %1 %2 + + + aBackup write %1 file + aBackup: Запись файла %1 + + + aBackup dump base error + aBackup: Ошибка создания дампа БД + + + aBackup bump base + aBackup: Создание дампа БД + + + aBackup write manifest.xml + aBackup: Запись файла manifest.xml + + + aBackup zip archive + aBackup: zip архив + + + aBackup export data ok + aBackup: Успешно выполнен экспорт данных + + + aBackup start unzip + aBackup: Запуск распаковки unzip + + + aBackup unzip dead + aBackup: Ненормальное завершение распаковки zip + + + aBackup unzip normal + aBackup: Нормальное завершение распаковки zip + + + aBackup zip start error + aBackup: Ошибка запуска zip + + + aBackup zip dead + aBackup: Ненормальное завершение упаковки zip + + + aBackup dump tables ok + aBackup: Успешно создан дамп таблиц БД + + + aBackup init rc file %1 + aBackup: Файд инициализации (rc) %1 + + + aBackup write content.xml + aBackup: Запись файла content.xml + + + aBackup dump base to xml compleet + aBackup: Перенос дампа БД в xml файл завершен + + + aBackup save xml %1 + aBackup: Запись xml файла %1 + + + aBackup create manifest.xml + aBackup: Создание файла manifest.xml + + + aBackup delete file %1 + aBackup: Удаление файла %1 + + + aBackup delete directory %1 + aBackup: Удаление папки файловой системы %1 + + + aBackup cleanup temporary files + aBackup: Удаление временных файлов + + + aBackup template dir `%1' not exists, try create + aBackup: Папка `%1' не существует, пробуем создать + + + aBackup create template dir `%1' fail + aBackup: Не удалось создать временную папку `%1' в файловой системе + + + aBackup create template dir `%1' + aBackup: Создание временной папки `%1' в файловой системе + + + aBackup template dir `%1' exists + aBackup: Папка `%1' в файловой системе уже существует + + + + aCManifest + + aCManifest save xml %1 + aCManifest: Запись xml файла %1 + + + aCManifest read file `%1' + aCManifest: Чтение файла `%1 + + + aCManifest read line: %1 column: %2 + aCManifest: Чтение строки: %1 позиции: %2 + + + aCManifest invalid manifest + aCManifest: Ошибки в manifest файле + + + + aCatGroup + + aCatGroup new group + aCatGroup: Новая группа + + + aCatGroup new group ok + aCatGroup: Новая группа успешно создана + + + aCatGroup new group error %1 + aCatGroup: Ошибка при создании новой группы %1 + + + + aCatalogue + + aCatalogue delete ido=%1 + aCatalogue: Удаление ido=%1 + + + aCatalogue update + aCatalogue: Обновление + + + aCatalogue update groups error %1 + aCatalogue: Ошибка обновления групп: %1 + + + aCatalogue update groups + aCatalogue: Обновление групп + + + aCatalogue update elements error %1 + aCatalogue: Ошибка обновления элементов: %1 + + + aCatalogue select group id=%1 + aCatalogue: Выбор группы с идентификатором id=%1 + + + aCatalogue new group with id=%1 + aCatalogue: Новая группа с идентификатором id=%1 + + + aCatalogue delete element with id=%1 + aCatalogue: Удаление элемента с идентификатором id=%1 + + + aCatalogue delete group with id=%1 + aCatalogue: Удаление группы с идентификатором id=%1 + + + aCatalogue delete without selection + aCatalogue: Удаление без выбора + + + aCatalogue update group + aCatalogue: Обновление группы + + + + aCfg + + Bad configuration + Ошибка в файле бизнес схемы + + + aCfg swap: first element is null + aCfg swap: Первый элемент равен null + + + aCfg swap: second element is null + aCfg swap: Второй элемент равен null + + + aCfg swap element himself + aCfg: Замена элемента самим собой + + + aCfg swap: first parent null + aCfg swap: Первый родитель равен null + + + aCfg swap: second parent null + aCfg swap: Второй родитель равен null + + + aCfg swap elements with differernt parents + aCfg: Обмен элементов, имеющих разных родителей + + + Document + Документ + + + Catalogue + Каталог + + + DocJournal + Журнал документов + + + Report + Отчет + + + InfoRegister + Информационный регистр + + + AccumulationRegister + Накопительный регистр + + + Form + Форма + + + aCfg saveOneObject: context save to file `%1' + aCfg saveOneObject: Запись содержимого в файл `%1' + + + aCfg saveOneObject: context is null + aCfg saveOneObject: Содержимое равно null + + + aCfg loadOneObject: invalid cfg file `%1' + aCfg loadOneObject: Ошибка в cfg файле `%1' + + + aCfg loadOneObject: invalid file name or not permission to file `%1' + aCfg loadOneObject: Ошибка в имени файла, либо недостаточно прав для доступа к файлу `%1' + + + aLog setup new id for %1 + aLog setup: Новый идентификатор id для %1 + + + aLog next id is %1 + aLog: Следующий идентификатор равен %1 + + + + aContainer + + aContainer unzip + aContainer: Распаковка unzip + + + Can't create temporary directory + Не могу создать временную папку в файловой системе + + + aContainer create temporary directory %1 + aContainer: Не могу создать временную папку в файловой системе %1 + + + No manifest found! + Не найден файл manifest! + + + aContainer error copy file + aContainer: Ошибка копирования файла + + + aContainer manifest is null + aContainer: Файл manifest равен null + + + Can't start unzip + Не могу запустить unzip + + + aContainer start unzip + aContainer: Запуск unzip + + + Unzip ended anormal + Неудачное завершение распаковки unzip + + + aContainer unzip dead + aContainer: Ненормальное завершение распаковки unzip + + + aContainer unzip normal + aContainer: Нормальное завершение распаковки unzip + + + Unzip ended with code %1 + Unzip вернул код %1 + + + Unable to start zip + Не могу запустить zip + + + aContainer zip start error + aContainer: Ошибка запуска zip + + + Zip ended with error + Запаковка завершилась с ошибкой + + + aContainer zip dead + aContainer: Ненормальное завершение запаковки zip + + + Zip ended with code %1 + Zip завершился с кодом %1 + + + aContainer delete file %1 + aContainer: Удаление файла %1 + + + aContainer delete directory %1 + aContainer: Удаление папки %1 файловой системы + + + + aDatabase + + Can't open database connection + + Не могу установить соединение с сервером баз данных + + + Uniques table updated + + Обновлена таблица уникальных идентификаторов + + + Documents journal updated + + Обновлен журнал документов + + + Users updated + + Обновлена информация о пользователях + + + Users roles updated + + Обновлена информация о ролях + + + Roles updated + + Обновлены роли + + + Rigths updated + + Обновлена информация о правах + + + Catalogue %s updated + + Каталог %s обновлен + + + Document %s updated + + Документ %s обновлен + + + Information registers %s updated + + Информационный регистр %s обновлен + + + Accumulation registers %s updated + + Накопительный регистр %s обновлен + + + Can't open database connection with ananas_system + + Не могу установить соединение с базой данных ananas_system + + + Catalogue %s dump + + Каталог %s данные\n + + + aDatabase open connection to %1 + aDatabase: Открытие соединения с %1 + + + aDatabase drop database %1 + aDatabase: Удаление БД %1 + + + aDatabase generate new unique number for object type %1 + aDatabase: Создание нового уникального номера для объекта типа %1 + + + aDatabase generate new unique number %1 for objecttype %2 + aDatabase: Создание нового уникального номера %1 для объекта типа %2 + + + aDatabase get object type for unique id=%1 + aDatabase: Получение типа объекта по его уникальному идентификатору id=%1 + + + aDatabase check indices for %1 + aDatabase: Проверка индексов для %1 + + + aDatabase search index %1 + aDatabase: Поиск индекса %1 + + + Catalogue %s processed + + Каталог %s обработан + + + + aDatabase catalogue %1 import + aDatabase: Импорт каталога %1 + + + aDatabase catalogue %1 export + aDatabase: Экспорт каталога %1 + + + Document %s processed + + Документ %s обработан + + + aDatabase document %1 import + aDatabase: Импорт Документа %1 + + + aDatabase document %1 export + aDatabase: Экспорт документа %1 + + + Information registers %s processed + + Информационный регистр %s обработан + + + aDatabase information register %1 import + aDatabase: Импорт информационного регистра %1 + + + aDatabase information register %1 export + aDatabase: Экспорт информационного регистра %1 + + + Accumulation registers %s processed + + Накопительный регистр %s обработан + + + aDatabase accumulation register %1 import + aDatabase: Импорт накопительного регистра %1 + + + aDatabase accumulation register %1 export + aDatabase: Экспорт накопительного регистра %1 + + + aDatabase export table: invalid XML file + aDatabase: Эеспорт таблицы БД: Ошибки в XML файле + + + aDatabase import table: invalid XML file + aDatabase: Импорт таблицы БД: Ошибки в XML файле + + + aDatabase import table: table %1 not exists + aDatabase: Импорт таблицы БД: Таблица %1 не существует + + + aDatabase prepared for open connection to %1 + aDatabase: Готов к открытию соединения с % + + + aDatabase open connection failed, try create %1 + aDatabase: Ошибка открытия соединения, пытаюсь создать %1 + + + aDatabase system database is open + aDatabase: Системная БД открыта + + + Can't create database + + Не могу создать БД + + + aDatabase create database %1 + aDatabase: Создание БД %1 + + + aDatabase open connection to %1 ok + aDatabase: Успешное установление соединения с %1 + + + aDatabase import table: get table %1 + aDatabase: Импорт таблицы БД: Таблица %1 + + + + aDocJournal + + aDocJournal md object not exists + aDocJournal: Объект метаданных не существует + + + aDocJournal columns not defined + aDocJournal: Столбцы не определены + + + aDocJournal column defined + aDocJournal: Столбец определен + + + aDocJournal invalid column define + aDocJournal: Неверное определение столбца + + + aDocJournal delete document with idd=%1 + aDocJournal: Удаление документа с идентификатором idd=%1 + + + aDocJournal new document with idd=%1 + aDocJournal: Новый документ с идентификатором idd=%1 + + + aDocJournal generated next number for %1 is %2 + aDocJournal: Создан новый номер %2 для %1 + + + aDocJournal document not found with idd=%1 + aDocJournal: Документ с идентификатором idd=%1 не найден + + + aDocJournal document not found with number=%1 and type=%2 + aDocJournal: Документ с номером=%1 и типом=%2 не найден + + + aDocJournal select document with number=%1 and md name=%2 + aDocJournal: Выбор документа с номером=%1 и с заданным в метаданных именем=%2 + + + + aDocument + + aDocument have no sysjournal + aDocument: Нет системного журнала + + + aDocument new document + aDocument: Новый документ + + + aDocument select new table line number + aDocument Выбор новой строки таблицы + + + aDocument new table line number=%1 + aDocument: Номер новой строки таблицы=%1 + + + aDocument insert new table line + aDocument: Вставка новой строки таблицы + + + aDocument delete from sysjournal + aDocument: Удаление из системного журнала + + + aDocument delete from unicues + aDocument: Удаление из индекса уникальных идентификаторов + + + aDocument delete table %1 + aDocument: Удаление табличной части %1 + + + aDocument delete table of conducted document + aDocument: Удаление табличной части проведенного документа + + + aDocument deleted table not exist + aDocument: Нет табличных частей для удаления + + + aDocument deleted table not selected + aDocument: Удаляемая таблица не существует + + + aDocument delete table from info register + aDocument: Удаление связанных с табличной частью записей из информационного регистра + + + aDocument delete table + aDocument: Удаление табличной части документа + + + aDocument not selected + aDocument: Сначала выберите документ + + + aDocument table name is empty + aDocument: Пустое имя таблицы. Для удаления табличной части документа необходимо указать ее имя + + + aDocument update error=%1 + aDocument: Ошибка обновления документа=%1 + + + aDocument conducted table update + aDocument: Невозможно обновить табличную часть проведенного документа + + + aDocument conduct + aDocument: Проведение документа + + + aDocument delete from accumulation register + aDocument: Удаление из накопительного регистра + + + aDocument aObject::New() ended with error code = %1 + aDocument: aObject::New() вернул ошибку с кодом = %1 + + + aDocument metaobject is null=%1 + aDocument: Объект метаданных пуст =%1 + + + aDocument new type = %1 + aDocument: Тип нового документа = %1 + + + aDocument New() error while added record in sysJournal =%1 + aDocument: New() ошибка при добавлении в системный журнал =%1 + + + Deprecated method call. aDocument::Conduct(...) + Вызов устаревшего метода aDocument::Conduct(...) + + + Deprecated method call. aDocument::UnConduct() + Вызов устаревшего метода aDocument::UnConduct(...) + + + Deprecated method call. aDocument::IsConducted() + Вызов устаревшего метода aDocument::IsConduct(...) + + + aDocument::GetDocumentValue(...): Can't find aDocument + aDocument::GetDocumentValue(...): Невозможно найти документ + + + + aIRegister + + aIRegister metaobject is null + aIRegister: Объект метаданных = null + + + aIRegister deleted document have invalid idd + aIRegister: Неверный идентификатор (idd) удаляемого документа + + + aIRegister select period from %1 to %2 + aIRegister: Задание периода с %1 по %2 + + + + aOOTemplate + + aOOTemplate temporary directory is %1 + aOOTemplate: Временная папка файловой системы: %1 + + + aOOTemplate create temporary directory %1 + aOOTemplate: Создать временную папку файловой системы: %1 + + + aOOTemplate start unzip + aOOTemplate: Запуск unzip + + + aOOTemplate unzip dead + aOOTemplate: Ненормальное завершение распаковки unzip + + + aOOTemplate unzip normal + aOOTemplate: Нормальное завершение распаковки unzip + + + aOOTemplate open + aOOTemplate: Открываем + + + aOOTemplate value for field %1 not setted + aOOTemplate: Значение поля %1 не задано + + + aOOTemplate save %1 open for write + aOOTemplate: Ошибка записи %1 + + + aOOTemplate save working dir =%1 + aOOTemplate: Запись шаблона в рабочей папке %1 + + + aOOTemplate start zip + aOOTemplate: Запуск zip + + + aOOTemplate zip dead + aOOTemplate: Ненормальное завершение упаковки zip + + + aOOTemplate zip normal to %1 + aOOTemplate: Упаковка zip успешно завершена: %1 + + + + aObject + + Table `%s' not found. + + Таблица `%s' не найдена. + + + Table name is empty. + + Пустое имя таблицы. + + + aObject have no database! + aObject: Нет базы данных! + + + aObject md object not found + aObject: Объект метаданных не найден + + + aObject table with name %1 not found + aObject: Не найдена таблица %1 + + + aObject have no system field %1 + aObject: Не найдено системное поле %1 + + + aObject update error. Driver message: %1 + aObject: Ошибка обновления. Сообщение драйвера: %1 + + + aObject decode doc number %1 + aObject: Декодирование номера документа %1 + + + aObject decode doc number ok, pref=%1 num=%2 + aObject: Успешное декодирование номера документа, pref=%1 num=%2 + + + aObject table update: no table found with name %1 + aObject: Обновление таблицы: Таблица с именем %1 не найдена + + + aObject display string context is null + aObject: Содержимое строки для отображения равно null + + + + aObjectList + + aObjectList have no database! + aObjectList: Нет базы данных! + + + aObjectList md object not found + aObjectList: Объект метаданных не найден + + + aObjectList have no system field %1 + aObjectList: Не найдено системное поле %1 + + + aObjectList display string context is null + aObjectList: Содержимое строки для отображения равно null + + + + aReport + + Choose a OpenOffice executable file + Выберите исполняемый файл OpenOffice + + + Warning + Предупреждение + + + Unable to start OpenOffice + Невозможно запустить OpenOffice + + + aReport OpenOfficeExecutable not found in registery + aReport: Исполняемый файл OpenOffice в регистри не найден + + + aReport OpenOfficeExecutable found %1 + aReport: Исполняемый файл OpenOffice не найден: %1 + + + aReport OpenOfficeExecutable not found in ~/.ananas/configrc + aReport: Исполняемый файл OpenOffice не найден в ~/.ananas/configrc + + + Unable to start OpenOffice (%1) + Не могу запустит OpenOffice (%1) + + + aReport OpenOfficeExecutable set to %1 + aReport: Исполняемый файл OpenOffice определен как %1 + + + aReport working dir = %1 + aReport: Рабочая папка файловой системы = %1 + + + aReport name for template = %1 + aReport: Имя шаблона = %1 + + + + aReportBrowser + + Print + Печать + + + Print report + Печать отчета + + + + aTemplate + + aTemplate save file %1 + aTemplate: Запись файла %1 + + + + aWidget + + Error! Can't find widget by name==`%s` + + Ошибка! Не найден виджет с именем `%s' + + + aForm::SetValue() Error! Can't find widget by name==`%s` + + aForm::SetValue() Ошибка! Невозможно найти виджет с именем `%s` + + + aWidget init widget %1 form mode %2 + aWidget: Инициализация виджета %1: режим формы %2 + + + aWidget init: invalid database + aWidget: Инициализация: Не верно задана или недоступна БД + + + aWidget init: invalid meta object + aWidget: Инициализация: Неправильный объект метаданных + + + aWidget init: connect signals wDBTable + aWidget: Инициализация: Соединяем сигналы wDBTable + + + aWidget invalid data source object + aWidget: Неверный объект источника данных + + + aWidget widgetEditor: invalid metadata object + aWidget: widgetEditor: Неправильный объект метаданных + + + aWidget table: invalid data source object + aWidget: table: Неверный объект источника данных + + + aWidget new: invalid data source object + aWidget: new: Неверный объект источника данных + + + aWidget select: invalid data source object + aWidget: select: Неверный объект источника данных + + + aWidget update: invalid data source object + aWidget: update: Неверный объект источника данных + + + aWidget value not fount widget with name %1 + aWidget: Не найдено значения виджета с именем %1 + + + aWidget set value: not fount widget with name %1 + aWidget: Установка значения: Не найден виджет с именем %1 + + + aWidget doc Id: invalid data source object + aWidget: Идентификатор документа Id: Неверный объект источника данных + + + + dEditRC + + Resource file + Файл ресурса + + + Data base header + Заголовок базы данных + + + Data base name + Имя базы данных + + + Data base server type + Тип сервера базы данных + + + Unknown + Неизвестный + + + mysql + mysql + + + postgres + postgres + + + Data base server address + Адрес сервера баз данных + + + Data base server port + Порт сервера база данных + + + Data base server user + Пользователь сервера баз данных + + + Data base server password + Пароль сервера баз данных + + + Work directory + Рабочий каталог + + + Resource file name + Файл ресурса + + + ... + ... + + + Configuration file name + Имя файла метаданных + + + OK + Ок + + + Cancel + Отмена + + + internal + встроенный + + + ananas config resource (*.rc) + Файл ресурсов Ананаса (*.rc) + + + ananas config file (*.cfg) + Файл бизнес схемы Ананаса (*.cfg) + + + + dImportDB + + Resource file + Файл ресурса + + + archive file + Файл резервной копии + + + Import + Ок + + + any files (*) + Все файлы (*) + + + ananas business schema archiff file (*.bsa) + Файлы архивов бизнес схем Ананаса (*.bsa) + + + + dLogin + + Ananas: Login + Ананас: Авторизация + + + Login name + Регистрационное имя + + + Password + Пароль + + + &Cancel + &Отмена + + + Alt+C + Alt+C + + + O&K + O&K + + + Alt+K + Alt+K + + + + dSelectDB + + Information base + Список бизнес схем + + + Select data base + Выбрать бизнес схему + + + Name + Имя + + + Resource file + Файл ресурса + + + &OK + &OK + + + &New + &Новый + + + Alt+N + Alt+N + + + &Group + &Группа + + + Alt+G + Alt+G + + + &Delete + &Удалить + + + Alt+D + Alt+D + + + &Edit + &Изменить + + + Alt+E + Alt+E + + + &Cancel + &Отмена + + + Alt+C + Alt+C + + + &Help + &Помощь + + + Alt+H + Alt+H + + + New group + Новая группа + + + New item + Новая схема + + + save + Сохранить + + + Delete item? + Удалить элемент? + + + confirm delete + Подтверждение удаления + + + E&xit + В&ыход + + + New &group + Новая &группа + + + &New item + &Новая бизнес схема + + + Edi&t + &Редактировать + + + &Import + Восстановить &из резервной копии + + + &Export + С&оздать резервную копию + + + Backup + Резервная копия + + + Select item + Выберите элемент + + + Please, select item for export + Выберите элемент для создания резервной копии + + + &File + &Программа + + + &Actions + &Сервис + + + Program + Программа + + + Actions + Действия + + + Service + Сервис + + + dSelectDB local settings not found + dSelectDB: Пользовательские (локальные) настройки не найдены + + + dSelectDB read settings for group with name %1 + dSelectDB: Чтение настроек для группы с именем %1 + + + dSelectDB save settings + dSelectDB: Сохранение настроек + + + save settings local? + Сохранить настройки локально? + + + dSelectDB business schema import + dSelectDB Импорт бизнес схемы + + + dSelectDB restore: %1 + dSelectDB: Восстанавливаем: %1 + + + Any files (*) + Все файлы (*) + + + dSelectDB backup ok + dSelectDB: Успешно создана резервная копия + + + dSelectDB backup: %1 + dSelectDB Резервная копия: %1 + + + New shema + Новая бизнес схема + + + &New shema + Новая бизнес &схема + + + diff --git a/translations/ananas-plugins-en.ts b/translations/ananas-plugins-en.ts new file mode 100644 index 0000000..1b1ab30 --- /dev/null +++ b/translations/ananas-plugins-en.ts @@ -0,0 +1,964 @@ + + + CatalogForm + + Catalogue + + + + Cancel + + + + displaying %1 from %2 + + + + Can't added new element to mark deleted group + + + + Can't added group to element + + + + Can't added group to mark deleted group + + + + Can't edit mark deleted element + + + + Catalog haven't edit element form + + + + Can't edit mark deleted group + + + + Catalog haven't edit group form + + + + Search + + + + CatalogForm:setData begin + + + + CatalogForm add first element in group + + + + CatalogForm add elements into root + + + + CatalogForm init + + + + Catalog Form image cat.png not loaded + + + + Catalog Form group pixmap not load + + + + Catalog Form element pixmap not load + + + + Catalog Form mark deleted group pixmap not load + + + + Catalog Form edit element form is null + + + + Catalog Form edit group form is null + + + + Catalog Form edit element start + + + + Catalog Form edit element with id=%1 + + + + Catalog Form edit group with id = %1 + + + + Catalog Form main widget is not 'MainForm' + + + + + QObject + + aForm SelectByCurrent %1 ended with %1 + + + + Unknown classname '%1' or metaobject '%2' + + + + + aEditorFactory + + aEditorFactory field metaobject not found + + + + aEditorFactory metadata in null + + + + + aEngine + + OK + + + + Cancel + + + + aEngine open form %1 in mode %2, select %3 + + + + aEngine form create error + + + + aEngine open form mode %1 not supported + + + + Line:%1 Message:%2 Stack:(%3) + + + + + aForm + + Error + + + + Error while open dialog form. Init hasn't been completed. + + + + Error open dialog form. Form not found. + + + + New document - <Ins>, Edit - <Enter>, View - <Shift+Enter> + + + + aForm creating form from ui + + + + aForm form create from ui ok + + + + aForm do not inherits aWidget! + + + + aForm load form module script + + + + aForm defined function %1 + + + + aForm form module script is empty + + + + aForm form not found + + + + aForm not found widget with name %1 + + + + aForm table value: column out of range + + + + aForm set read only + + + + aForm set read/write + + + + Deprecated method call: aForm::show() + + + + Deprecated method call: aForm::close() + + + + Deprecated method call: aForm::turn_on() + + + + aForm conduct: function on_conduct() return false, document not conducted + + + + Deprecated method call: aForm::turn_off() + + + + Deprecated method call: aForm::update() + + + + Expected wDBTable widget but found %1 + + + + aForm not found wDBTabe widget with name %1 + + + + aForm not found wDBTable widget with name %1 + + + + Deprecated method call: aForm::done(...) + + + + Deprecated method call: aForm::setfocus() + + + + + aLineEdit + + Enter string for search + + + + + aListBox + + Press arrow down for go to drop down list + + + + Use Enter for go to item and arrow for navigation + + + + + aListView + + Select + + + + Edit + + + + New element + + + + New group + + + + Undo mark delete + + + + Delete (mark deleted) + + + + Delete (phisical) + + + + Type of new item + + + + <p align="center">Select type of new item</p> + + + + &Elemnt + + + + &Group + + + + Delete item + + + + <p align="center">Mark deleted or delete?</p> + + + + &Mark deleted + + + + &Delete + + + + <Enter> - select, <Ins> - add, <Del> - delete items + + + + <Enter> - edit, <Ins> - add, <Del> - delete items + + + + + addfdialog + + select field + + + + OK + + + + Cancel + + + + field already binding, please select another field. + + + + + eActionButton + + Action button + + + + Update + + + + Close + + + + Simple action + + + + User action + + + + Execute + + + + Turn on + + + + OK + + + + Cancel + + + + + eAddObj + + Form1 + + + + + eCatalogue + + Catalogue + + + + Type + + + + OK + + + + Cancel + + + + + eDBField + + Database field + + + + Field type + + + + Field name + + + + OK + + + + Cancel + + + + + eDBTable + + Cancel + + + + OK + + + + Width + + + + aDBTable + + + + Table name + + + + Column list + + + + Column + + + + Header + + + + Field type + + + + Field name + + + + Column width + + + + decimal + + + + Add + + + + Up + + + + Down + + + + Delete + + + + table in use, please select another table + + + + + eDocument + + Document + + + + Type + + + + OK + + + + Cancel + + + + + eField + + Input field + + + + Positive + + + + Required + + + + Type + + + + Name + + + + OK + + + + Cancel + + + + Width + + + + Decimals + + + + + eJournal + + Journal + + + + Type + + + + OK + + + + Cancel + + + + + eReport + + Catalogue + + + + Type + + + + OK + + + + Cancel + + + + + eSelectDocType + + Select document type + + + + Cancel + + + + OK + + + + Document type + + + + ID + + + + + wCatalogEditor + + wCatalog Editor open form for select=%1 + + + + wCatalog Editor found element forms + + + + wCatalog Editor found group forms + + + + wCatalog Editor meta object forms not found + + + + + wCatalogue + + wCatalogue group value changed to %1 + + + + wCatalogue element value changed to %1 + + + + wCatalogue value for name %1 + + + + wCatalogue set value %1 for name %2 + + + + wCatalogue update + + + + wCatalogue have not data source object + + + + wCatalogue select group error = %1 + + + + wCatalogue set new values for all fields + + + + wCatalogue set new values for group field %1 + + + + wCatalogue value for element field %1 + + + + wCatalogue selection changed to %1 + + + + + wDBTable + + Available columns + + + + Date + + + + Prefix + + + + Number + + + + New + + + + Edit + + + + Delete + + + + View + + + + Refresh + + + + wDBTable init ok + + + + wDBTable init in engine + + + + wDBTable not in Ananas object container + + + + wDBTable init meta object not found + + + + wDBTable container type is %1 + + + + wDBTable filter is %1 + + + + wDBTable init in engine ok + + + + wDBTable: current record not setted + + + + wDBTable: function Value() call + + + + wDBTable: select document %1 + + + + You are going to remove record <br>Are you sure? + + + + &No + + + + Remove record? + + + + &Yes, remove + + + + + wDocument + + wDocument new ok + + + + wDocument set new value %1 for field %2 + + + + + wField + + ^\-{0,1}\d{0,%1}\.{1}\d{0,%2}$ + + + + ^\-{0,1}\d{0,%1}$ + + + + + wGroupTree + + New + + + + New group + + + + New group (Ins) + + + + Edit + + + + Edit group + + + + Edit group (Enter) + + + + Delete group + + + + Delete group (Delete) + + + + + wJournal + + New + + + + New document + + + + Edit + + + + Edit document + + + + View + + + + View document + + + + New document <Ins> + + + + Edit document <Enter> + + + + View document <Shift+Enter> + + + + Delete + + + + Delete document + + + + Delete document <Delete> + + + + Can not edit document + + + + To edit document you have to unconduct it. Or you can view it. Unconduct? + + + + &Unconduct + + + + &View + + + + Confirm + + + + Do you really want to delete document? + + + + &Yes + + + + &No + + + + wDBTable #%1 found + + + + Copy + + + + Copy document + + + + Duplicate document <Ctrl+D> + + + + diff --git a/translations/ananas-plugins-ru.ts b/translations/ananas-plugins-ru.ts new file mode 100644 index 0000000..3282106 --- /dev/null +++ b/translations/ananas-plugins-ru.ts @@ -0,0 +1,1153 @@ + + + CatalogForm + + Catalogue + Справочник + + + Go + Перейти + + + OK + Ок + + + Cancel + Отмена + + + displaying %1 from %2 + показано %1 из %2 + + + Can't added new element to mark deleted group + Невозможно добавить новый элемент в удаленную группу + + + Can't added element to element + Невозможно добавить элемент в элемент + + + Can't added group to element + Невозможно добавить группу в элемент + + + Can't added group to mark deleted group + Невозможно добавить группу в удаленную группу + + + Can't edit mark deleted element + Невозможно редактировать удаленный элемент + + + Catalog haven't edit element form + Не задана форма редактирования элемента + + + Can't edit mark deleted group + Невозможно редактировать удаленную группу + + + Catalog haven't edit group form + Не задана форма редактирования группы + + + Can't added element + Невозможно добавить элемент + + + Search + Поиск + + + CatalogForm:setData begin + + + + CatalogForm add first element in group + CatalogForm: Добавление первого элемента в группу + + + CatalogForm add elements into root + CatalogForm: Добавление элементов в корень + + + CatalogForm init + CatalogForm: Инициализа + + + Catalog Form image cat.png not loaded + CatalogForm: Изображение cat.png не загружено + + + Catalog Form group pixmap not load + CatalogForm: Значек изображения для групп не загружен + + + Catalog Form element pixmap not load + CatalogForm: Значек изображения элемента не загружен + + + Catalog Form mark deleted group pixmap not load + CatalogForm: Значек изображения для удаленной группы не загружен + + + Catalog Form edit element form is null + CatalogForm: Форма редактирования элемента = null + + + Catalog Form edit group form is null + CataloForm: Форма редактирования группы = null + + + Catalog Form edit element start + CatalogForm: Начинаем открывать форму редактирования элемента + + + Catalog Form edit element with id=%1 + CatalogForm: Редактирование элемента с идентификатором id=%1 + + + Catalog Form edit group with id = %1 + CatalogForm: Редактирование группы с идентификатором id = %1 + + + Catalog Form main widget is not 'MainForm' + CatalogForm: Главный виджет не является 'MainForm' + + + + QObject + + report + + отчет + + + text report + + текстовый отчет + + + invalid arguments + + неверный аргумент + + + aForm SelectByCurrent %1 ended with %1 + aForm: Результат выполнения SelectByCurrent по идентификатору %1 равен %1 + + + Unknown classname '%1' or metaobject '%2' + Неизвестное имя класса '%1' или неопределен объект метаданных '%2' + + + + aEditorFactory + + aEditorFactory field metaobject not found + aEditorFactory: Поле в метаданных не найдено + + + aEditorFactory metadata in null + aEditorFactory: Объект метаданных = null + + + + aEngine + + Line:%1 %2 (%3) + Строка:%1 %2 (%3) + + + OK + Ок + + + Cancel + Отмена + + + aEngine open form %1 in mode %2, select %3 + aEngine: Открытие формы %1 в режиме %2, UID = %3 + + + aEngine form create error + aEngine: Ошибка создания формы + + + aEngine open form mode %1 not supported + aEngine: Открытие формы в режиме %1 не поддерживается + + + Line:%1 Message:%2 Stack:(%3) + Строка:%1 Сообщение:%2 Стэк:(%3) + + + + aForm + + Invalid widget class. Widget class have to inherits aWidget. + + Неверно задан класс. Виджет должен быть унаследован от класса aWidget. + + + Error + Ошибка + + + Error while open dialog form. Init hasn't been completed. + Ошибка открытия диалога. Инициализация не завершена. + + + Error open dialog form. Form not found. + Ошибка открытия формы диалога. Форма не найдена. + + + on_formstart() + on_formstart() + + + Error! Can't find widget by name==`%s` + + Ошибка, Не могу найти виджет по имени `%s` + + + Error! Can't find wDBTable `%s` + + Ошибка! Не могу найти wDBTable `%s` + + + on_button(" + on_button(" + + + ") + ") + + + on_conduct() + on_conduct() + + + New document - <Ins>, Edit - <Enter>, View - <Shift+Enter> + Новый документ - <Ins>, Изменить - <Enter>, Просмотр - <Shift+Enter> + + + Error! Can't find widget wDBTable by name==`%s` + + Ошибка! Невозможно найти виджет wDBTable с именем `%s' + + + aForm creating form from ui + aForm: Создание формы из ui файла + + + aForm form create from ui ok + aForm: Форма успешно создана из ui файла + + + aForm do not inherits aWidget! + aForm: Не является наследником aWidget! + + + aForm load form module script + aForm: Загрузка скрипта модуля формы + + + aForm defined function %1 + aForm: Определена функция %1 + + + aForm form module script is empty + aForm: Скрипт модуля формы пуст + + + aForm form not found + aForm: Форма не найдена + + + aForm not found widget with name %1 + aForm: Не найден виджет по имени %1 + + + aForm table value: column out of range + + + + aForm set read only + + + + aForm set read/write + aForm: Установка режима чтение/запись для формы + + + Deprecated method call: aForm::show() + Вызов устаревшего метода: aForm::show() + + + Deprecated method call: aForm::close() + Вызов устаревшего метода: aForm::close() + + + Deprecated method call: aForm::turn_on() + Вызов устаревшего метода: aForm::turn_on() + + + aForm conduct: function on_conduct() return false, document not conducted + aForm: Проведение документа: Функция on_conduct() вернула false. Документ не проведен + + + Deprecated method call: aForm::turn_off() + Вызов устаревшего метода: aForm::turn_off() + + + Deprecated method call: aForm::update() + Вызов устаревшего метода: aForm::update() + + + Expected wDBTable widget but found %1 + Ожидался wDBTable виджет, но обнаружен %1 + + + aForm not found wDBTabe widget with name %1 + aForm: Виджет wDBTabe с именем %1 не обнаружен + + + aForm not found wDBTable widget with name %1 + aForm: Виджет wDBTable с именем %1 не обнаружен + + + Deprecated method call: aForm::done(...) + Вызов устаревшего метода: aForm::done(...) + + + Deprecated method call: aForm::setfocus() + Вызов устаревшего метода: aForm::setfocus() + + + + aLineEdit + + Enter string for search + Задайте строку поиска + + + + aListBox + + Press arrow down for go to drop down list + Нажмите стрелку вниз для перемещения в выпадающий список + + + Use Enter for go to item and arrow for navigation + Используйте стрелки. Для перехода нажмите Enter + + + + aListView + + Select + Выбрать + + + Edit + Изменить + + + New element + Новый элемент + + + New group + Новая группа + + + Undo mark delete + Отменить удаление + + + Delete (mark deleted) + Удалить (логически) + + + Delete (phisical) + Удалить (физически) + + + Type of new item + Тип нового элемента + + + <p align="center">Select type of new item</p> + <p align="center">Выберите тип нового элемента</p> + + + &Elemnt + &Элемент + + + &Group + &Группа + + + Delete item + Удалить элемент + + + <p align="center">Mark deleted or delete?</p> + <p align="center">Пометить удаленным или удалить совсем?</p> + + + &Mark deleted + &Пометить удаленным + + + &Delete + &Удалить + + + <Enter> - select, <Ins> - add, <Del> - delete items + <Enter> - Выбрать, <Ins> - Новый, <Del> - Удалить + + + <Enter> - edit, <Ins> - add, <Del> - delete items + <Enter> - Изменить, <Ins> - Новый, <Del> - Удалить + + + + addfdialog + + select field + выбрать поле + + + OK + Ок + + + Cancel + Отмена + + + field already binding, please select another field. + поле уже используется, выберите другое поле. + + + + eActionButton + + Action button + Действие + + + Script + Скрипт + + + Action + Действие + + + Update + Обновить + + + Close + Закрыть + + + Turn on + Включить + + + Print + Печать + + + Simple action + Простое действие + + + User action + Пользовательское действие + + + Execute + Выполнить + + + Conduct + Провести + + + OK + Ок + + + Cancel + Отмена + + + + eAddObj + + Form1 + + + + + eCatalogue + + Catalogue + Справочник + + + Type + Тип + + + OK + Ок + + + Cancel + Отмена + + + + eDBField + + Database field + Поле базы данных + + + Field type + Тип поля + + + Field name + Имя поля + + + OK + Ок + + + Cancel + Отмена + + + + eDBTable + + Database table + Таблица базы данных + + + Cancel + Отмена + + + OK + Ок + + + Field + Поле + + + Width + Ширина + + + Table + Таблица + + + aDBTable + + + + Table name + Имя таблицы + + + Column list + Список столбцов + + + Column + Столбец + + + Header + Заголовок + + + Field type + Тип поля + + + Field name + Имя поля + + + Column width + Ширина столбца + + + decimal + десятичный + + + Add + Добавить + + + Up + Вверх + + + Down + Вниз + + + Delete + Удалить + + + table in use, please select another table + Таблица занята, выберите другую таблицу + + + + eDocument + + Document + Документ + + + Type + Тип + + + OK + Ок + + + Cancel + Отмена + + + + eField + + Input field + Поле ввода + + + Positive + Положительное + + + Required + Обязательное + + + Type + Тип + + + Name + Имя + + + OK + Ок + + + Cancel + Отмена + + + Width + Ширина + + + Decimals + Десятичное + + + + eJournal + + Journal + Журнал + + + Type + Тип + + + OK + Ок + + + Cancel + Отмена + + + + eReport + + Catalogue + Справочник + + + Type + Тип + + + OK + Ок + + + Cancel + Отмена + + + + eSelectDocType + + Select document type + Выберите тип документа + + + Cancel + Отмена + + + OK + Ок + + + Document type + Тип документа + + + ID + + + + + eTable + + Form table + Таблица формы + + + List of columns + Список столбцов + + + Table name + Имя таблицы + + + Table column + Столбец таблицы + + + Header + Заголовок + + + Width + Ширина + + + Field type + Тип поля + + + Field name + Имя поля + + + View width + Ширина просмотра + + + decimals + десятичные + + + Add + Добавить + + + Up + Вверх + + + Down + Вниз + + + Remove + Удалить + + + Cancel + Отмена + + + + wCatalogEditor + + wCatalog Editor open form for select=%1 + wCatalog: Открытие формы редактора для выбора %1 + + + wCatalog Editor found element forms + wCatalog: Редактор нашел форму для редактирования элемента + + + wCatalog Editor found group forms + wCatalog: Редактор нашел форму для редактирования группы + + + wCatalog Editor meta object forms not found + wCatalog: Не найдены формы в метаданных + + + + wCatalogue + + wCatalogue group value changed to %1 + wCatalogue: Значение группы изменено на %1 + + + wCatalogue element value changed to %1 + wCatalogue: Значение элемента изменено на %1 + + + wCatalogue value for name %1 + wCatalogue: Значение для имени %1 + + + wCatalogue set value %1 for name %2 + wCatalogue: Задаем значение %1 для имени %2 + + + wCatalogue update + wCatalogue: Обновление + + + wCatalogue have not data source object + wCatalogue: Нет объекта источника данных + + + wCatalogue select group error = %1 + wCatalogue: Ошибка выбора группы: %1 + + + wCatalogue set new values for all fields + wCatalogue: Установка новых значений для всех полей + + + wCatalogue set new values for group field %1 + wCatalogue: Установка значения для поля %1 группы + + + wCatalogue value for element field %1 + wCatalogue: Установка значения для поля %1 элемента + + + wCatalogue selection changed to %1 + wCatalogue: Выбор изменен на %1 + + + + wDBField + + field already binding, please select another field. + поле уже используется, выберите другое поле. + + + + wDBTable + + Available columns + Доступные столбцы + + + Date + Дата + + + Prefix + Префикс + + + Number + Номер + + + New + Новый + + + Edit + Изменить + + + Delete + Удалить + + + View + Просмотр + + + Refresh + Обновить + + + wDBTable init ok + wDBTable: Инициализация прошла успешно + + + wDBTable init in engine + wDBTable: Инициализация engine + + + wDBTable not in Ananas object container + wDBTable: Не является контейнером объектов Ananas + + + wDBTable init meta object not found + wDBTable: Объект мета данных не найден + + + wDBTable container type is %1 + wDBTable: Контейнер имеет тип %1 + + + wDBTable filter is %1 + wDBTable: Текущий фильтр: %1 + + + wDBTable init in engine ok + wDBTable: Успешное завершение инициализации в engine + + + wDBTable: current record not setted + wDBTable: Текущая запись не задана + + + wDBTable: function Value() call + wDBTable: Вызов функции Value() + + + wDBTable: select document %1 + wDBTable: Выбор документа %1 + + + Remove record? -- Ananas + Удалить запись? -- Ананас + + + You are going to remove record <br>Are you sure? + Вы собрались удалить запись <br> Действительно удалить? + + + &Yes + &Да + + + &No + &Нет + + + Remove record? + Удалить запись? + + + &Yes, remove + &Да, удалить + + + + wDocument + + wDocument new ok + wDocument: Новый wDocument успешно создан + + + wDocument set new value %1 for field %2 + wDocument: Задаем новое значение %1 полю %2 + + + + wField + + ^\-{0,1}\d{0,%1}\.{1}\d{0,%2}$ + + + + ^\-{0,1}\d{0,%1}$ + + + + + wGroupTree + + New + Новый + + + New group + Новая группа + + + New group (Ins) + Новая группа (Ins) + + + Edit + Изменить + + + Edit group + Изменить группу + + + Edit group (Enter) + Изменить группу (Enter) + + + Delete group + Удалить группу + + + Delete group (Delete) + Удалить группу (Delete) + + + + wJournal + + New + Новый + + + New document + Новый документ + + + New document (Ins) + Новый документ (Ins) + + + Edit + Изменить + + + Edit document + Изменить документ + + + Edit document (Enter) + Изменить документ (Enter) + + + View + Просмотр + + + View document + Просмотр документа + + + View document (Shift+Enter) + Просмотр документа (Shift+Enter) + + + Can not edit document + Не могу редактировать документ + + + To edit document you have to unconduct it. Or you can view it. Unconduct? + Для редактирования документа Вы должны отменить его проведение. Или Вы можете просмотреть его. Отменить проведение? + + + &Unconduct + &Отменить проведение + + + &View + &Просмотр + + + New document <Ins> + Новый документ - <Ins> + + + Edit document <Enter> + Изменить документ - <Enter> + + + View document <Shift+Enter> + Просмотр документа - <Shift+Enter> + + + Delete + Удалить + + + Delete document + Удалить документ + + + Delete document <Delete> + Удалить документ - <Delete> + + + Confirm + Подтвердить + + + Do you really want to delete document? + Вы действительно хотите удалить документ? + + + &Yes + &Да + + + &No + &Нет + + + wDBTable #%1 found + wDBTable: Не удалось обнаружить #%1 + + + Copy + Копировать + + + Copy document + Копировать документ + + + Duplicate document <Ctrl+D> + Создать копию документа <Ctrl+D> + + +