From ee2233a2b1c49a0a87becdb59fad83698bbfe977 Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 9 Aug 2012 12:07:08 +0000 Subject: [PATCH] Merge from V6_main_20120808 08Aug12 --- HELLO_version.h.in | 32 +- Makefile.am | 53 +- adm_local/Makefile.am | 30 +- adm_local/unix/Makefile.am | 30 +- adm_local/unix/config_files/Makefile.am | 30 +- adm_local/unix/config_files/check_GUI.m4 | 40 +- adm_local/unix/config_files/check_HELLO.m4 | 31 +- adm_local/unix/make_common_starter.am | 36 +- bin/Makefile.am | 30 +- bin/VERSION.in | 4 +- bin/myrunSalome.py | 34 +- bin/runAppli.in | 30 +- bin/test_hello.py | 57 + build_configure | 91 +- clean_configure | 39 +- configure.ac | 164 ++- doc/Makefile.am | 64 +- doc/dev_guide.html | 576 --------- doc/dev_guide.txt | 477 -------- doc/doxyfile.in | 81 ++ doc/images/head.png | Bin 0 -> 78545 bytes doc/index.doc | 1065 +++++++++++++++++ doc/static/doxygen.css | 836 +++++++++++++ doc/static/footer.html | 12 + doc/static/header.html.in | 20 + idl/HELLO_Gen.idl | 97 +- idl/Makefile.am | 46 +- resources/ExecHELLO.png | Bin 831 -> 0 bytes resources/HELLOCatalog.xml.in | 108 +- resources/Makefile.am | 37 +- resources/{SalomeApp.xml => SalomeApp.xml.in} | 14 +- resources/goodbye.png | Bin 0 -> 2244 bytes resources/handshake.png | Bin 0 -> 2257 bytes resources/testme.png | Bin 0 -> 2191 bytes src/HELLO/HELLO.cxx | 287 ++++- src/HELLO/HELLO.hxx | 69 +- src/HELLO/Makefile.am | 33 +- src/HELLOGUI/HELLOGUI.cxx | 904 ++++++++++++-- src/HELLOGUI/HELLOGUI.h | 100 +- src/HELLOGUI/HELLO_icons.ts | 42 +- src/HELLOGUI/HELLO_msg_en.ts | 203 ++-- src/HELLOGUI/HELLO_msg_fr.ts | 203 ++-- src/HELLOGUI/Makefile.am | 32 +- src/Makefile.am | 36 +- 44 files changed, 4164 insertions(+), 1909 deletions(-) create mode 100755 bin/test_hello.py delete mode 100644 doc/dev_guide.html delete mode 100644 doc/dev_guide.txt create mode 100755 doc/doxyfile.in create mode 100755 doc/images/head.png create mode 100644 doc/index.doc create mode 100755 doc/static/doxygen.css create mode 100755 doc/static/footer.html create mode 100755 doc/static/header.html.in delete mode 100644 resources/ExecHELLO.png rename resources/{SalomeApp.xml => SalomeApp.xml.in} (64%) create mode 100644 resources/goodbye.png create mode 100644 resources/handshake.png create mode 100644 resources/testme.png diff --git a/HELLO_version.h.in b/HELLO_version.h.in index 4b40fb5..d4dbfdc 100644 --- a/HELLO_version.h.in +++ b/HELLO_version.h.in @@ -1,24 +1,25 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // File : HELLO_version.h // Author : Vadim SANDLER // Module : SALOME @@ -32,5 +33,6 @@ #define HELLO_VERSION_STR "@VERSION@" #define HELLO_VERSION @XVERSION@ +#define HELLO_DEVELOPMENT @VERSION_DEV@ #endif // __HELLO_VERSION_H__ diff --git a/Makefile.am b/Makefile.am index 89ed790..3d708d8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # -* Makefile *- # Author : Patrick GOLDBRONN (CEA) # Date : 28/06/2001 @@ -27,13 +25,18 @@ # include $(top_srcdir)/adm_local/unix/make_common_starter.am -ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \ - -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ - -I ${GUI_ROOT_DIR}/adm_local/unix/config_files +if HELLO_ENABLE_GUI + ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \ + -I ${GUI_ROOT_DIR}/adm_local/unix/config_files \ + -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files +else !HELLO_ENABLE_GUI + ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \ + -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files +endif SUBDIRS = idl adm_local resources src bin doc -DISTCLEANFILES = a.out aclocal.m4 configure +DISTCLEANFILES = a.out aclocal.m4 configure local-install.sh hack_libtool salomeinclude_DATA = HELLO_version.h @@ -43,3 +46,13 @@ EXTRA_DIST += \ dist-hook: rm -rf `find $(distdir) -name CVS` + +usr_docs: + (cd doc && $(MAKE) $(AM_MAKEFLAGS) usr_docs) + +docs: usr_docs + +dev_docs: + (cd doc && $(MAKE) $(AM_MAKEFLAGS) dev_docs) + + diff --git a/adm_local/Makefile.am b/adm_local/Makefile.am index f35273f..9863d29 100644 --- a/adm_local/Makefile.am +++ b/adm_local/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + include $(top_srcdir)/adm_local/unix/make_common_starter.am SUBDIRS = unix diff --git a/adm_local/unix/Makefile.am b/adm_local/unix/Makefile.am index 5f6d5f7..0d5ee76 100644 --- a/adm_local/unix/Makefile.am +++ b/adm_local/unix/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + include $(top_srcdir)/adm_local/unix/make_common_starter.am SUBDIRS = config_files diff --git a/adm_local/unix/config_files/Makefile.am b/adm_local/unix/config_files/Makefile.am index bb3a217..2cd4f82 100644 --- a/adm_local/unix/config_files/Makefile.am +++ b/adm_local/unix/config_files/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + include $(top_srcdir)/adm_local/unix/make_common_starter.am dist_admlocalm4_DATA = \ diff --git a/adm_local/unix/config_files/check_GUI.m4 b/adm_local/unix/config_files/check_GUI.m4 index 41f3a8d..ef18369 100755 --- a/adm_local/unix/config_files/check_GUI.m4 +++ b/adm_local/unix/config_files/check_GUI.m4 @@ -1,24 +1,25 @@ -dnl Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE dnl -dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS dnl -dnl This library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public -dnl License as published by the Free Software Foundation; either -dnl version 2.1 of the License. +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. dnl -dnl This library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with this library; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA dnl -dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com dnl + # Check availability of Salome binary distribution # # Author : Marc Tajchman (CEA, 2002) @@ -93,4 +94,13 @@ AC_SUBST(GUI_ROOT_DIR) ])dnl +AC_DEFUN([CHECK_SALOME_GUI],[ + CHECK_GUI_MODULE() + SalomeGUI_ok=${LightGUI_ok} +])dnl +AC_DEFUN([CHECK_CORBA_IN_GUI],[ + CHECK_GUI_MODULE() + CORBA_IN_GUI=${FullGUI_ok} + AC_SUBST(CORBA_IN_GUI) +])dnl diff --git a/adm_local/unix/config_files/check_HELLO.m4 b/adm_local/unix/config_files/check_HELLO.m4 index 3e8038b..d17f286 100755 --- a/adm_local/unix/config_files/check_HELLO.m4 +++ b/adm_local/unix/config_files/check_HELLO.m4 @@ -1,24 +1,25 @@ -dnl Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE dnl -dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS dnl -dnl This library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public -dnl License as published by the Free Software Foundation; either -dnl version 2.1 of the License. +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. dnl -dnl This library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with this library; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA dnl -dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com dnl + # Check availability of HELLO module binary distribution # # Author : Marc Tajchman (CEA, 2002) diff --git a/adm_local/unix/make_common_starter.am b/adm_local/unix/make_common_starter.am index 36ad8c3..4f70a70 100644 --- a/adm_local/unix/make_common_starter.am +++ b/adm_local/unix/make_common_starter.am @@ -1,24 +1,30 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +# ============================================================ +# The following is to avoid PACKAGE_... env variable +# redefinition compilation warnings +# ============================================================ # +AM_CXXFLAGS = @KERNEL_CXXFLAGS@ -include SALOMEconfig.h +AM_CPPFLAGS = @KERNEL_CXXFLAGS@ -include SALOMEconfig.h + # ============================================================ # This file defines the common definitions used in several # Makefile. This file must be included, if needed, by the file diff --git a/bin/Makefile.am b/bin/Makefile.am index f9eb701..1807821 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # -* Makefile *- # Author : Guillaume Boulant (CSSI) # Module : COMPONENT diff --git a/bin/VERSION.in b/bin/VERSION.in index 6b2d2af..3d5f95f 100755 --- a/bin/VERSION.in +++ b/bin/VERSION.in @@ -1 +1,3 @@ -SALOME 2 EXEMPLE MODULE C++ : HELLO : @VERSION@ +[SALOME HELLO] : @VERSION@ +[DEVELOPMENT] : @VERSION_DEV@ +[DESCRIPTION] : Sample SALOME module diff --git a/bin/myrunSalome.py b/bin/myrunSalome.py index e0909d2..2806c8b 100755 --- a/bin/myrunSalome.py +++ b/bin/myrunSalome.py @@ -1,26 +1,26 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE -# -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +#!/usr/bin/env python +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -#!/usr/bin/env python +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + def test(clt): """ Test function that creates an instance of HELLO component diff --git a/bin/runAppli.in b/bin/runAppli.in index d6c8e33..91a8c2c 100755 --- a/bin/runAppli.in +++ b/bin/runAppli.in @@ -1,24 +1,24 @@ #!/bin/sh -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # if [ -z "${KERNEL_ROOT_DIR}" ] ; then diff --git a/bin/test_hello.py b/bin/test_hello.py new file mode 100755 index 0000000..24e38f3 --- /dev/null +++ b/bin/test_hello.py @@ -0,0 +1,57 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +## +# Test functionality of HELLO module +## + +# initialize salome session +import salome +salome.salome_init() + +# get reference to the HELLO engine +import HELLO_ORB +hello = salome.lcc.FindOrLoadComponent('FactoryServer', 'HELLO') + +# test HELLO module +print "Say hello to John: should be OK" +if hello.hello(salome.myStudy, "John") != HELLO_ORB.OP_OK: + print "ERROR: wrong operation code is returned" +else: + print "OK" +print "Say hello to John: should answer 'already met'" +if hello.hello(salome.myStudy, "John") != HELLO_ORB.OP_ERR_ALREADY_MET: + print "ERROR: wrong operation code is returned" +else: + print "OK" +print "Say goodbye to Margaret: should answer 'did not meet yet'" +if hello.goodbye(salome.myStudy, "Margaret") != HELLO_ORB.OP_ERR_DID_NOT_MEET: + print "ERROR: wrong operation code is returned" +else: + print "OK" +print "Say hello to John: should be OK" +if hello.goodbye(salome.myStudy, "John") != HELLO_ORB.OP_OK: + print "ERROR: wrong operation code is returned" +else: + print "OK" +print "Say hello to John: should answer 'did not meet yet'" +if hello.goodbye(salome.myStudy, "John") != HELLO_ORB.OP_ERR_DID_NOT_MEET: + print "ERROR: wrong operation code is returned" +else: + print "OK" diff --git a/build_configure b/build_configure index 4f365ac..2255b84 100755 --- a/build_configure +++ b/build_configure @@ -1,25 +1,26 @@ #!/bin/bash -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # Tool for updating list of .in file for the SALOME project # and regenerating configure script # Author : @@ -41,43 +42,33 @@ fi ######################################################################## # Test if the GUI_ROOT_DIR is set correctly -if test ! -d "${GUI_ROOT_DIR}"; then - echo "failed : GUI_ROOT_DIR variable is not correct !" - exit -fi +#if test ! -d "${GUI_ROOT_DIR}"; then +# echo "failed : GUI_ROOT_DIR variable is not correct !" +# exit +#fi cd ${CONF_DIR} ABS_CONF_DIR=`pwd` -mkdir -p salome_adm/unix/config_files -#cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files/* salome_adm/unix/config_files -#cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/pythonbe.py salome_adm/unix - -cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/SALOMEconfig.h.in salome_adm/unix - -#cp -f ${GUI_ROOT_DIR}/adm_local/unix/config_files/* salome_adm/unix/config_files - -# remove KERNEL deprecated configure files -#for deprecated in ac_cc_warnings.m4 ac_cxx_partial_specialization.m4 \ -# check_mico.m4 config.guess ltmain.sh ac_cxx_bool.m4 ltconfig ac_cxx_typename.m4 \ -# check_pthreads.m4 config.sub libtool.m4 ac_cxx_mutable.m4 missing -# do -# rm -f salome_adm/unix/config_files/${deprecated} -# done - +######################################################################## # ____________________________________________________________________ # aclocal creates the aclocal.m4 file from the standard macro and the -# custom macro embedded in the directory salome_adm/unix/config_files +# custom macro embedded in the directory adm_local/unix/config_files # and KERNEL config_files directory. # output: # aclocal.m4 # autom4te.cache (directory) -echo "====================================================== aclocal" - -aclocal -I adm_local/unix/config_files \ - -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ - -I ${GUI_ROOT_DIR}/adm_local/unix/config_files || exit 1 +echo "======================================================= aclocal" + +if test -d "${GUI_ROOT_DIR}"; then + aclocal -I adm_local/unix/config_files \ + -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ + -I ${GUI_ROOT_DIR}/adm_local/unix/config_files || exit 1 +else + aclocal -I adm_local/unix/config_files \ + -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files || exit 1 +fi # ____________________________________________________________________ # libtoolize creates some configuration files (ltmain.sh, @@ -85,10 +76,10 @@ aclocal -I adm_local/unix/config_files \ # version. The files are created in the directory specified with the # AC_CONFIG_AUX_DIR() tag (see configure.ac). # output: -# salome_adm/unix/config_files/config.guess -# salome_adm/unix/config_files/config.sub -# salome_adm/unix/config_files/ltmain.sh -#echo "====================================================== libtoolize" +# adm_local/unix/config_files/config.guess +# adm_local/unix/config_files/config.sub +# adm_local/unix/config_files/ltmain.sh +echo "==================================================== libtoolize" libtoolize --force --copy --automake || exit 1 @@ -108,11 +99,11 @@ autoconf # AC_CONFIG_AUX_DIR() tag (see configure.ac). This step also # creates the Makefile.in files from the Makefile.am files. # output: -# salome_adm/unix/config_files/compile -# salome_adm/unix/config_files/depcomp -# salome_adm/unix/config_files/install-sh -# salome_adm/unix/config_files/missing -# salome_adm/unix/config_files/py-compile +# adm_local/unix/config_files/compile +# adm_local/unix/config_files/depcomp +# adm_local/unix/config_files/install-sh +# adm_local/unix/config_files/missing +# adm_local/unix/config_files/py-compile # Makefile.in (from Makefile.am) echo "====================================================== automake" diff --git a/clean_configure b/clean_configure index f57f7b3..1f4c3ce 100755 --- a/clean_configure +++ b/clean_configure @@ -1,35 +1,28 @@ #!/bin/sh -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + rm -rf autom4te.cache aclocal.m4 configure make_config find . -name "*~" -print -exec rm {} \; find . -name "*.pyc" -print -exec rm {} \; #exit # ==================== ON SORT AVANT -find bin -name Makefile.in | xargs rm -f -find doc -name Makefile.in | xargs rm -f -find idl -name Makefile.in | xargs rm -f -find resources -name Makefile.in | xargs rm -f -find salome_adm -name Makefile.in | xargs rm -f -find src -name Makefile.in | xargs rm -f -rm -f Makefile.in +find . -name Makefile.in | xargs rm -f +( cd adm_local/unix/config_files && rm -f config.* depcomp install-sh ltmain.sh missing py-compile ) diff --git a/configure.ac b/configure.ac index 3859142..bdf7dad 100644 --- a/configure.ac +++ b/configure.ac @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # PLEASE DO NOT MODIFY configure.in FILE # ALL CHANGES WILL BE DISCARDED BY THE NEXT # build_configure COMMAND @@ -29,14 +27,16 @@ # Modified by : Marc Tajchman (CEA) # Created from configure.in.base # -AC_INIT([Salome2 Project HELLO module],[5.1.0], [webmaster.salome@opencascade.com], [SalomeHELLO]) -AC_CONFIG_AUX_DIR(salome_adm/unix/config_files) +AC_INIT([Salome2 Project HELLO module],[6.5.0], [webmaster.salome@opencascade.com], [SalomeHELLO]) +AC_CONFIG_AUX_DIR(adm_local/unix/config_files) AC_CANONICAL_HOST AC_CANONICAL_TARGET -AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE([-Wno-portability]) XVERSION=`echo $VERSION | awk -F. '{printf("0x%02x%02x%02x",$1,$2,$3)}'` AC_SUBST(XVERSION) +VERSION_DEV=1 +AC_SUBST(VERSION_DEV) # set up MODULE_NAME variable for dynamic construction of directories (resources, etc.) MODULE_NAME=hello @@ -81,6 +81,7 @@ echo AC_PROG_MAKE_SET AC_PROG_INSTALL +AC_LOCAL_INSTALL dnl dnl libtool macro check for CC, LD, NM, LN_S, RANLIB, STRIP + for shared libraries @@ -102,7 +103,7 @@ dnl Fix up the INSTALL macro if it s a relative path. We want the dnl full-path to the binary instead. case "$INSTALL" in *install-sh*) - INSTALL='\${KERNEL_ROOT_DIR}'/salome_adm/unix/config_files/install-sh + INSTALL='\${KERNEL_ROOT_DIR}'/adm_local/unix/config_files/install-sh ;; esac @@ -162,11 +163,57 @@ AM_PATH_PYTHON(2.3) echo echo --------------------------------------------- -echo testing QT +echo Testing GUI +echo --------------------------------------------- +echo + +CHECK_GUI_MODULE + +gui_ok=no +if test "${SalomeGUI_need}" != "no" -a "${FullGUI_ok}" = "yes" ; then + gui_ok=yes +fi + +AM_CONDITIONAL(HELLO_ENABLE_GUI, [test "${gui_ok}" = "yes"]) + +if test "${SalomeGUI_need}" == "yes"; then + if test "${FullGUI_ok}" != "yes"; then + AC_MSG_WARN(For configure HELLO module necessary full GUI!) + fi +elif test "${SalomeGUI_need}" == "auto"; then + if test "${FullGUI_ok}" != "yes"; then + AC_MSG_WARN(Full GUI not found. Build will be done without GUI!) + fi +elif test "${SalomeGUI_need}" == "no"; then + echo Build without GUI option has been chosen +fi + +if test "${gui_ok}" = "yes"; then + echo + echo --------------------------------------------- + echo testing QT + echo --------------------------------------------- + echo + + CHECK_QT + +fi + +echo +echo --------------------------------------------- +echo testing MPI echo --------------------------------------------- echo -CHECK_QT +CHECK_MPI + +echo +echo --------------------------------------------- +echo testing HDF5 +echo --------------------------------------------- +echo + +CHECK_HDF5 echo echo --------------------------------------------- @@ -207,32 +254,19 @@ CORBA=adm_local/unix/$corba echo echo --------------------------------------------- -echo Testing Kernel +echo Testing html generators echo --------------------------------------------- echo -CHECK_KERNEL +CHECK_HTML_GENERATORS echo echo --------------------------------------------- -echo Testing GUI -echo --------------------------------------------- -echo - -CHECK_SALOME_GUI - -echo -echo --------------------------------------------- -echo Testing full GUI +echo Testing Kernel echo --------------------------------------------- echo -CHECK_CORBA_IN_GUI -if test "x${CORBA_IN_GUI}" != "xyes"; then - echo "failed : For configure HELLO1 module necessary full GUI !" - exit -fi - +CHECK_KERNEL echo echo --------------------------------------------- @@ -241,7 +275,14 @@ echo --------------------------------------------- echo echo Configure -variables="cc_ok threads_ok boost_ok python_ok omniORB_ok qt_ok Kernel_ok SalomeGUI_ok" + +if test "${gui_ok}" = "yes"; then + variables="cc_ok threads_ok boost_ok python_ok omniORB_ok qt_ok hdf5_ok doxygen_ok Kernel_ok gui_ok" +elif test "${SalomeGUI_need}" != "no"; then + variables="cc_ok threads_ok boost_ok python_ok omniORB_ok hdf5_ok doxygen_ok Kernel_ok gui_ok" +else + variables="cc_ok threads_ok boost_ok python_ok omniORB_ok hdf5_ok doxygen_ok Kernel_ok" +fi for var in $variables do @@ -270,25 +311,38 @@ AC_OUTPUT_COMMANDS([ \ chmod +x ./bin/*; \ ]) +AC_HACK_LIBTOOL +AC_CONFIG_COMMANDS([hack_libtool],[ +sed -i "s%^CC=\"\(.*\)\"%hack_libtool (){ \n\ + $(pwd)/hack_libtool \1 \"\$[@]\" \n\ +}\n\ +CC=\"hack_libtool\"%g" libtool +sed -i "s%\(\s*\)for searchdir in \$newlib_search_path \$lib_search_path \$sys_lib_search_path \$shlib_search_path; do%\1searchdirs=\"\$newlib_search_path \$lib_search_path \$sys_lib_search_path \$shlib_search_path\"\n\1for searchdir in \$searchdirs; do%g" libtool +sed -i "s%\(\s*\)searchdirs=\"\$newlib_search_path \$lib_search_path \(.*\)\"%\1searchdirs=\"\$newlib_search_path \$lib_search_path\"\n\1sss_beg=\"\"\n\1sss_end=\"\2\"%g" libtool +sed -i "s%\(\s*\)\(for searchdir in \$searchdirs; do\)%\1for sss in \$searchdirs; do\n\1 if ! test -d \$sss; then continue; fi\n\1 ssss=\$(cd \$sss; pwd)\n\1 if test \"\$ssss\" != \"\" \&\& test -d \$ssss; then\n\1 case \$ssss in\n\1 /usr/lib | /usr/lib64 ) ;;\n\1 * ) sss_beg=\"\$sss_beg \$ssss\" ;;\n\1 esac\n\1 fi\n\1done\n\1searchdirs=\"\$sss_beg \$sss_end\"\n\1\2%g" libtool +],[]) + # This list is initiated using autoscan and must be updated manually # when adding a new file .in to manage. When you execute # autoscan, the Makefile list is generated in the output file configure.scan. # This could be helpfull to update de configuration. AC_OUTPUT([ \ - ./salome_adm/unix/SALOMEconfig.h \ - ./adm_local/Makefile \ - ./adm_local/unix/Makefile \ - ./adm_local/unix/config_files/Makefile \ - ./bin/VERSION \ - ./bin/runAppli \ - ./bin/Makefile \ - ./doc/Makefile \ - ./HELLO_version.h \ - ./resources/HELLOCatalog.xml \ - ./src/Makefile \ - ./src/HELLO/Makefile \ - ./src/HELLOGUI/Makefile \ - ./resources/Makefile \ - ./idl/Makefile \ + adm_local/Makefile \ + adm_local/unix/Makefile \ + adm_local/unix/config_files/Makefile \ + bin/VERSION \ + bin/runAppli \ + bin/Makefile \ + doc/Makefile \ + doc/doxyfile \ + doc/static/header.html \ + HELLO_version.h \ + resources/HELLOCatalog.xml \ + resources/SalomeApp.xml \ + src/Makefile \ + src/HELLO/Makefile \ + src/HELLOGUI/Makefile \ + resources/Makefile \ + idl/Makefile \ Makefile \ ]) diff --git a/doc/Makefile.am b/doc/Makefile.am index ab3e5c7..89ec504 100755 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,26 +1,54 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + include $(top_srcdir)/adm_local/unix/make_common_starter.am -dist_doc_DATA = dev_guide.html +EXTRA_DIST += images static/footer.html static/doxygen.css + +guidocdir = $(docdir)/gui/HELLO +guidoc_DATA = images/head.png + +usr_docs: doxyfile + $(DOXYGEN) doxyfile + +docs: usr_docs + +dev_docs: + +clean-local: + @for filen in `find . -maxdepth 1` ; do \ + case $${filen} in \ + ./Makefile | ./doxyfile ) ;; \ + . | .. | ./static) ;; \ + *) echo "Removing $${filen}" ; rm -rf $${filen} ;; \ + esac ; \ + done ; + +install-data-local: usr_docs + $(INSTALL) -d $(DESTDIR)$(docdir)/gui/HELLO + @for filen in `find . -maxdepth 1` ; do \ + case $${filen} in \ + ./Makefile | ./doxyfile | ./doxyfile.bak ) ;; \ + . | .. | ./static ) ;; \ + *) echo "Installing $${filen}" ; cp -rp $${filen} $(DESTDIR)$(docdir)/gui/HELLO ;; \ + esac ; \ + done ; -EXTRA_DIST += dev_guide.txt +uninstall-local: + rm -rf $(DESTDIR)$(docdir)/gui/HELLO diff --git a/doc/dev_guide.html b/doc/dev_guide.html deleted file mode 100644 index 6ef44b4..0000000 --- a/doc/dev_guide.html +++ /dev/null @@ -1,576 +0,0 @@ - - - - - - -Guide pour le développement d'un module SALOME 2 en C++ - - - -
-

Guide pour le développement d'un module SALOME 2 en C++

- --- - - - -
Auteur:Crouzet N.
- -
-

1   Présentation

-

Ce document a pour objectif de décrire les différentes étapes -du développement d'un module SALOME 2 en C++. -Il fait suite au document "Guide pour le développement d'un module SALOME 2 en -Python", qui documente de module PYHELLO, et en reprend la démarche : -construction pas à pas d'un module HELLO. -Comme de nombreux points ne sont pas repris, il est recommendé de lire ce -document préalablement.

-
-
-

2   Les étapes de construction du module exemple

-

Le composant choisi pour illustrer le processus de construction en C++ -est le même que celui choisi pour illustrer la construction du module python : -il implémentera donc la même interface idl Corba. -Il sera complété par un GUI graphique écrit en Qt.

-

Les différentes étapes du développement seront les suivantes :

-
-
    -
  • créer une arborescence de module
  • -
  • créer un composant SALOME 2 chargeable par un container C++
  • -
  • configurer le module pour que le composant soit connu de SALOME
  • -
  • ajouter un GUI graphique
  • -
  • rendre le composant utilisable dans le superviseur
  • -
-
-
-
-

3   Création de l'arborescence du module

-

Dans un premier temps, on se contentera de mettre dans le module exemple un composant -SALOME écrit en C++ qui sera chargeable par un container C++. -Il suffit donc d'une interface idl et d'une implantation C++ du composant. -Pour mettre en oeuvre ceci dans un module SALOME 2, il nous faut reproduire l'arborescence de -fichier standard suivante:

-
-+ HELLO1_SRC
-  + build_configure
-  + configure.in.base
-  + Makefile.in
-  + adm_local
-    + unix
-      + make_commence.in
-      + make_omniorb.in
-      + config_files
-  + bin
-    + VERSION
-    + runAppli.in
-    + runSalome.py
-  + idl
-    + Makefile.in
-    + HELLO_Gen.idl
-  + src
-    + Makefile.in
-    + HELLO
-      + Makefile.in
-      + HELLO.cxx 
-      + HELLO.hxx 
-  + doc
-
-

Pour cela, on recopie l'arborescence de PYHELLO, et on modifie où nécessaire -PYHELLO en HELLO:

-
-cp -r PYHELLO1_SRC HELLO1_SRC
-cd HELLO1_SRC
-mv idl/PYHELLO_Gen.idl idl/HELLO_Gen.idl
-mv src/PYHELLO src/HELLO
-
-
-
-

4   Interface idl

-

Dans le répertoire idl, nous modifions le fichier idl HELLO_Gen.idl : le -module défini est renommé HELLO_ORB, et l'interface en HELLO_Gen. -Le service rendu reste le même : à partir d'une chaine de caractères -fournie comme unique argument, retour d'une chaine de caractères obtenue -par concaténation de "Hello, " et de la chaine d'entrée. -Ce service est spécifié par la fonction makeBanner.

-

Un utilitaire de documentation basé sur doxygen a été mis en place pour -compiler une documentation des services corba à partir de commentaires se -trouvant dans les fichiers idl. Nous rajouter donc à notre idl quelques -commentaires, en respectant le formalisme doxygen. -Un commentaire doxygen commence par "/!" et se finit pas "/". -Pour structurer un minimum les pages générées, on les regroupes par module ou -sujet. Dans notre exemple, nous utilisons la directive:

-
-\ingroup EXAMPLES 
-
-

spécifiant que la documentation générée fait partie du groupe EXAMPLES. -(pour plus d'information sur doxygen, consulter le site www.doxygen.org).

-

Pour finir, nous mettons à jour le Makefile avec le nouveau nom de composant:

-
-IDL_FILES = HELLO_Gen.idl
-
-
-
-

5   Implémentation C++

-
-

5.1   Les sources

-

L'implémentation C++ de notre module CORBA HELLO (interface idl HELLO_Gen) est faite dans le répertoire -/src/HELLO:

-
-HELLO.hxx
-HELLO.cxx
-
-

Au début du header de notre module (HELLO.hxx), les inclusions suivantes sont -nécessaires:

-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(HELLO_Gen)
-#include "SALOME_Component_i.hxx"
-
-

Le fichier SALOMEconfig.h contient un certain nombre de définitions utiles -pour assurer l'indépendance du code par rapport à la version de CORBA -utilisée. SALOME_Component_i.hxx contient l'interface de la classe -d'implémentation C++ du composant de base Salome (idl Engines::Component). -Enfin, la macro CORBA_SERVER_HEADER assure l'indépendance des noms de fichiers -d'inclusion par rapport à l'implémentation de l'ORB CORBA.

-

Après cela, nous définissons une classe d'implémentation, nommée HELLO, dérivant de -POA_HELLO_ORB::HELLO_Gen (classe abstraite générée automatiquement par CORBA lors de la -compilation de l'idl) et de Engines_Component_i (car l'interface idl HELLO_Gen -dérive de Engines::Component comme tout composant Salome2). Cette classe -contient un constructeur dont les arguments sont imposés par CORBA, un -destructeur virtuel, et une méthode makeBanner fournissant le service souhaité:

-
-class HELLO:
-  public POA_HELLO_ORB::HELLO_Gen,
-  public Engines_Component_i
-{
-public:
-    HELLO(CORBA::ORB_ptr orb,
-            PortableServer::POA_ptr poa,
-            PortableServer::ObjectId * contId,
-            const char *instanceName,
-            const char *interfaceName);
-    virtual ~HELLO();
-    char* makeBanner(const char* name);
-};
-
-

La fonction makeBanner prend comme argument et renvoit un char*, projection C++ du type CORBA/IDL -string. -La documentation complète du mapping c++ de l'IDL est fournie par l'OMG sur -son site internet : http://www.omg.org/cgi-bin/doc?ptc/00-01-02.

-

Enfin, nous fournissons l'interface (normalisé) de la fonction HELLOEngine_factory, qui -sera appelée par le "FactoryServer C++" pour charger le composant HELLO:

-
-extern "C"
-    PortableServer::ObjectId * HELLOEngine_factory(
-            CORBA::ORB_ptr orb,
-            PortableServer::POA_ptr poa,
-            PortableServer::ObjectId * contId,
-            const char *instanceName,
-            const char *interfaceName);
-
-

Dans le fichier source (HELLO.cxx) se trouvent les définitions -du constructeur et de la fonction d'instanciation -HELLOEngine_factory (toutes deux normalisées!), et de makeBanner:

-
-char* HELLO::makeBanner(const char* name)
-{
-    string banner="Hello, ";
-    banner+=name;
-    return CORBA::string_dup(banner.c_str());
-}
-
-

Dans cette fonction, l'emploi de string_dup (fonction déclarée dans le -namespace CORBA) n'est pas obligatoire (on aurait pu utiliser l'opérateur new), -mais conseillé car ces fonctions permettent aux ORB d'utiliser des mécanismes -spéciaux de gestion de la mémoire sans avoir à redéfinir les opérateurs new -globaux.

-
-
-

5.2   Makefile

-

Dans le makefile, il faut définir certaines cibles:

-
-VPATH=.:@srcdir@:@top_srcdir@/idl
-LIB = libHELLOEngine.la
-LIB_SRC = HELLO.cxx
-LIB_SERVER_IDL = HELLO_Gen.idl
-LIB_CLIENT_IDL = SALOME_Component.idl SALOME_Exception.idl Logger.idl
-CPPFLAGS += -I${KERNEL_ROOT_DIR}/include/salome
-LDFLAGS+= -lSalomeContainer -lOpUtil -L${KERNEL_ROOT_DIR}/lib/salome
-
-

Passons en revue chacune de ces cibles. -- LIB contient le nom normalisé (lib<Nom_Module>Engine.la) le nom de la -librairie, LIB_SRC définit le nom des fichiers sources, et VPATH les -repertoire où l'on peut les trouver. -- LIB_SERVER_IDL contient le nom des fichiers idl implémentés par le module. -- LIB_CLIENT_IDL contient le nom des idl où sont définis les services CORBA -utilisés par le module. HELLO utilise Logger.idl via les macros "MESSAGE", -SALOME_Component.idl et SALOME_Exception.idl via l'héritage de HELLO_ORB:: -- Il faut ajouter à CPPFLAGS le chemin pour les fichiers includes utilisés -(SALOMEconfig.h, SALOME_Component_i.hxx et utilities.h se trouvent dans -${KERNEL_ROOT_DIR}/include/salome):: -- La classe HELLO utilise les librairies lib (pour Engines_Component_i) et -libOptUtil (pour PortableServer et Salome_Exception). On indique donc le nom -de ces librairies et leur chemin dans LDFLAGS. -D'autres librairies sont souvent utiles, par exemple libsalomeDS si on -implémente la persistence, ou libSalomeNS si on utilise le naming service.

-
-
-
-

6   Pilotage du composant depuis Python (mode TUI)

-

Lors de la compilation du module, la cible lib du Makefile dans /idl a -provoqué la génération d'un stub python (souche côté client générée à partir -de l'idl et offrant une interface dans le langage client - ici python. -Concrètement, un module python HELLO_ORB contenant une classe -_objref_HELLO_Gen sont créés, permettant de faire appel aux services de notre -module C++ depuis python. Mettons ceci en application. Pour cela, nous lançons -Salome en mode TUI:

-
-cd $HELLO_ROOT_DIR/bin/salome
-python -i runSalome.py --modules=HELLO --xterm --logger --containers=cpp,python --killall
-
-

Depuis la fenêtre python, nous importons le module LifeCycle, et utilisons ses -services pour charger notre composant Dans la conteneur C++ FactoryServer:

-
->>> import LifeCycleCORBA
->>> lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb)
->>> import HELLO_ORB
->>> hello = lcc.FindOrLoadComponent("FactoryServer", "HELLO")
-
-

L'import de HELLO_ORB est nécessaire avant l'appel de FindOrLoadComponent, -pour permettre de retourner un objet typé (opération de "narrowing"). Sinon, -l'objet retourné est générique de type Engines::Component. Vérifions que notre -objet hello est correctement typé, et appelons le service makeBanner:

-
->>> print hello
-<HELLO_ORB._objref_HELLO_Gen instance at 0x8274e94>
->>> mybanner=hello.makeBanner("Nicolas")
->>> print mybanner
-Hello, Nicolas
-
-

Les commandes précédentes ont été regroupées dans la fonction test du script -/bin/runSalome.py.

-
-
-

7   Interface graphique

-
-

7.1   Introduction

-

Pour aller plus loin dans l'intégration de notre module, nous allons ajouter -une interface graphique (développée en Qt), s'intégrant dans l'interface -applicative de Salome (IAPP). -On ne détaillera pas ici le fonctionnement de l'IAPP de Salome, mais pour -résumer, l'IAPP gère une boucle d'évènements (clics souris, clavier, etc), et -redirige après traitement ces évènements vers le module actif (le principe est -qu'à un instant donné, un module est actif. Lorsqu'un module est activé, son -IHM est chargée dynamiquement). -Le programmeur de la GUI d'un module a donc à charge de définir les méthodes -permettant de traiter correctement les évènements transmis. Parmi ces -méthodes, citons les principales : OnGUIEvent(), OnMousePress(), OnMouseMove(), -OnKeyPress(), DefinePopup(), CustomPopup().

-
-
-

7.2   Choix des widgets

-
-

7.2.1   Description xml

-

La description des items de notre module se fait dans le fichier XML -/ressources/HELLO_en.xml. Ce fichier est utilisé par l'IAPP pour charger -dynamiquement l'IHM du module quand celle-ci est activée. -Le principe est de définir par des balises les menus et boutons souhaités, et -d'y associer des ID, qui seront récupérés par les fonctions gérant les -évènemements IHM. Plusieures possibilités sont offertes:

-
    -
  • ajout d'items à des menus déjà existant, auquel cas il faut reprendre les -balises du menu pré-existant, et y ajouter les nouveaux items. Dans -l'exemple qui suis, on ajoute le Menu Hello et l'item MyNewItem au -menu File, dont l'ID vaut 1:

    -
    -<menu-item label-id="File" item-id="1" pos-id="">
    -     <submenu label-id="Hello" item-id="19" pos-id="8">
    -        <popup-item item-id="190" pos-id="" label-id="MyNewItem" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
    -      </submenu>
    -      <endsubmenu />
    -</menu-item>
    -
    -
  • -
  • Création de nouveaux menus. Pour le module HELLO, nous ajoutons un menu -HELLO, avec un unique item de label "Get banner":

    -
    -<menubar>
    - <menu-item label-id="HELLO" item-id="90" pos-id="3">
    -  <popup-item item-id="901" label-id="Get banner" icon-id="" tooltip-id="Get HELLO banner" accel-id="" toggle-id="" execute-action=""/>
    - </menu-item>
    -</menubar>
    -
    -
  • -
  • Ajout d'un bouton dans la barre à boutons. Dans l'exemple suivant, nous -créons un deuxième point d'entrée pour notre action "Get banner", sous forme -d'un bouton associé au même ID "901". L'icône est spécifiée par la le champ -icon-id, qui doit être un fichier graphique 20x20 pixels au format png:

    -
    -<toolbar label-id="HELLO">
    - <toolbutton-item item-id="901" label-id="Get banner" icon-id="ExecHELLO.png"
    -tooltip-id="Get HELLO banner" accel-id="" toggle-id="" execute-action=""/>
    -</toolbar>
    -
    -
  • -
-
-
-

7.2.2   Convention

-

A chaque menu ou item est associé un ID. Les numéros entre 1 et 40 sont -réservés à l'IAPP. Les numéros d'ID suivent une certaine règle, quoique -celle-ci ne soit pas obligatoire. Au menu "HELLO" est associé l'ID 90. Son -unique item "Get banner" a l'ID 901. Un deuxième item aurait l'ID 902, et un -sous item l'ID 9021.

-
-
-
-

7.3   Implémentation de l'IHM

-

L'implémentation C++ de l'IHM est faite dans le répertoire /src/HELLOGUI. -Le header HELLOGUI.h déclare de la classe HELLOGUI, et -contient des directives Qt (Q_OBJECT). De ce fait, il doit être processé par -le compilateur moc (Qt Meta Model Compiler). Pour cette raison, l'extension du -fichier est .h et dans le Makefile nous ajoutons la cible:

-
-LIB_MOC = HELLOGUI.h
-
-

Le fichier source HELLO.cxx contient la définition des fonctions membres, et -le Makefile permet de construire une librairie libHELLOGUI (le nom est -normalisé poour permettre le chargement dynamique : lib<NomModule>GUI.

-
-

7.3.1   Gestion des évènements

-

Pour l'IHM d'HELLO, nous définissons la fonction HELLOGUI::OnGUIEvent, qui -sera appelé à chaque évènement. Cette fonction contient essentiellement une -structure switch permettant de traiter l'ID reçu en argument:

-
-switch (theCommandID)
-  {
-  case 901:
-    // Traitement de "Get banner"
-    ...
-  case 190:
-    // Traitement de "MyNewItem"
-    ...
-  }
-
-

Le traitement standard consiste à récupérer des données d'entrée (ici, le -prénom via une fenêtre de dialogue QInputDialog::getText), à récupérer une -poignée sur le composant CORBA interfacé afin d'appeler le service souhaité -(ici, getBanner), et d'afficher le résultat obtenu ().

-
-
-

7.3.2   Classes disponibles

-

Pour les dialogues avec l'utilisateur, il est possible d'utiliser n'importe -quelle classe fournie par Qt (http://doc.trolltech.com/3.2/classes.html). -Cependant, lorque c'eset possible, il est préférable d'utiliser les fonctions -QAD (Qt Application Desktop), définies dans KERNEL_SRC/src/SALOMEGUI, qui -encapsulent les fonctions Qt correspondantes et gèrent mieux les -communications avec l'IAPP. Ainsi, dans HELLOGUI, nous utilisons la classe -QAD_MessageBox en lieu et place de la classe Qt QMessageBox.

-
-
-

7.3.3   Gestion du multi-linguisme

-

Qt fournit un outil d'aide au support du multi-linguisme. Celui-ci est -repris dans salome. Le principe est simple : toutes les chaînes de caractères -utilisées pour les labels des menus et les dialogues avec l'utilisateur -sont encapsulés dans des appels à la fonction Qt tr() (pour translate), qui -prend en argument un nom de label. Par exemple, pour demander à l'utilisateur -de rentrer un prénom, nous utilisons la fonction getText, où les deux premiers -arguments sont des labels encapsulés par tr():

-
-myName = QInputDialog::getText( tr("QUE_HELLO_LABEL"), tr("QUE_HELLO_NAME"),
-                                QLineEdit::Normal, QString::null, &ok);
-
-

Le nom des label est préfixé à titre indicatif par trois lettres et un underscore. Les codes -suivants sont utilisés:

-
-- MEN_ : label menu
-- BUT_ : label bouton
-- TOT_ : aide tooltip
-- ERR_ : message d'erreur
-- WRN_ : message d'alerte
-- INF_ : message d'information
-- QUE_ : question
-- PRP_ : prompt dans la barre des status
-
-

La traduction des labels encapsulés par tr() est faite pour différents -langages cibles (par exemple français et anglais) dans des fichiers nommés "<nom_module>_msg_<langage>.po". -<langage> correspond au code du langage, on a choisi en pour l'anglais et -fr pour le français. Ce fichier doit contenir pour chaque clé sa -traduction, par exemple:

-
-msgid "HELLOGUI::INF_HELLO_BANNER"
-msgstr "HELLO Information"
-
-

Le squelette de ce fichier peut être généré par l'utilitaire Qt findtr:

-
-findtr HELLOGUI.cxx > HELLO_msg_en.po
-
-

puis éditer le fichier HELLO_msg_en.po pour remplir les traductions. -Ces fichiers sont ensuite compilés par l'utilitaire msg2qm pour générer -des binaires .qm. Pour cela, il faut remplir la cible LIB_MOC dans le -Makefile:

-
-PO_FILES =  HELLO_msg_en.po HELLO_msg_fr.po
-
-

Pour l'utilisateur final, le choix du langage se fait au niveau de chaque -module dans le fichier ressources/config, en utilisant la commande:

-
-langage=<langage>
-
-
-
-
-
-

8   Règles syntaxiques de nommage

-

Dans ce qui précède, nous avons utilisé un certain nombre de règles de -nommage. Le présent chapitre se propose de faire le point sur ces règles. -Celles-ci ne sont pas toutes obligatoires, mais simplifient la compréhension -si on les suit!

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RègleFormalismeExemple HELLOCommentaire
Nom du module<Module>HELLOC'est le nom qui figure dans le -catalogue des modules
Base CVS<Module>EXAMPLESSi la base cvs contient plusieurs -modules, on prend un autre nom
Repertoire source<Module>_SRCHELLO1_SRCL'indice 1 est utilisé car on prévoit -plusieurs version du module
Fichier idl<Module>_Gen.idlHELLO_Gen.idl 
Nom du module -CORBA<Module>_ORBHELLO_ORBOn évite d'utiliser le nom du module -(conflits)
Nom de -l'interface CORBA<Module>_GenHELLO_GenLa compilation de l'idl génère une -classe abstraite -POA_<Module>_ORB::<Module>_Gen
fichier source<Module>.cxxHELLO.cxxDans le répertoire /src/<Module>
Classe -d'implémentation<Module>HELLOCette classe hérite de -POA_HELLO_ORB::HELLO_Gen
Fonction -d'instanciation<Module>_ -Engine_factoryHELLO_Engine -factoryCette fonction est appelée par -le FactoryServer de Salome
Catalogue des -modules<Module>Catalog -.xmlHELLOCatalog -.xmlDans /ressources
Nom de la -librairie C++lib<Module>EnginelibHELLOEngineDans le répertoire /src/<Module>
Librairie C++ -de l'IHMlib<Module>GUIlibHELLOGUIDans le répertoire /src/<Module>GUI
Variable -d'environnement<Module>_ROOT_DIRHELLO_ROOT_DIR 

...

-

...

-

...

-

...

-
-
-
- - diff --git a/doc/dev_guide.txt b/doc/dev_guide.txt deleted file mode 100644 index ee2f3b2..0000000 --- a/doc/dev_guide.txt +++ /dev/null @@ -1,477 +0,0 @@ -=========================================================== -Guide pour le développement d'un module SALOME 2 en C++ -=========================================================== - -:Auteur: Crouzet N. - -.. contents:: -.. sectnum:: - -Présentation -========================= -Ce document a pour objectif de décrire les différentes étapes -du développement d'un module SALOME 2 en C++. -Il fait suite au document "Guide pour le développement d'un module SALOME 2 en -Python", qui documente de module PYHELLO, et en reprend la démarche : -construction pas à pas d'un module HELLO. -Comme de nombreux points ne sont pas repris, il est recommendé de lire ce -document préalablement. - - -Les étapes de construction du module exemple -==================================================== -Le composant choisi pour illustrer le processus de construction en C++ -est le même que celui choisi pour illustrer la construction du module python : -il implémentera donc la même interface idl Corba. -Il sera complété par un GUI graphique écrit en Qt. - -Les différentes étapes du développement seront les suivantes : - - - créer une arborescence de module - - créer un composant SALOME 2 chargeable par un container C++ - - configurer le module pour que le composant soit connu de SALOME - - ajouter un GUI graphique - - rendre le composant utilisable dans le superviseur - -Création de l'arborescence du module -======================================= -Dans un premier temps, on se contentera de mettre dans le module exemple un composant -SALOME écrit en C++ qui sera chargeable par un container C++. -Il suffit donc d'une interface idl et d'une implantation C++ du composant. -Pour mettre en oeuvre ceci dans un module SALOME 2, il nous faut reproduire l'arborescence de -fichier standard suivante:: - - + HELLO1_SRC - + build_configure - + configure.in.base - + Makefile.in - + adm_local - + unix - + make_commence.in - + make_omniorb.in - + config_files - + bin - + VERSION - + runAppli.in - + runSalome.py - + idl - + Makefile.in - + HELLO_Gen.idl - + src - + Makefile.in - + HELLO - + Makefile.in - + HELLO.cxx - + HELLO.hxx - + doc - -Pour cela, on recopie l'arborescence de PYHELLO, et on modifie où nécessaire -PYHELLO en HELLO:: - - cp -r PYHELLO1_SRC HELLO1_SRC - cd HELLO1_SRC - mv idl/PYHELLO_Gen.idl idl/HELLO_Gen.idl - mv src/PYHELLO src/HELLO - - -Interface idl -================== -Dans le répertoire idl, nous modifions le fichier idl HELLO_Gen.idl : le -module défini est renommé HELLO_ORB, et l'interface en HELLO_Gen. -Le service rendu reste le même : à partir d'une chaine de caractères -fournie comme unique argument, retour d'une chaine de caractères obtenue -par concaténation de "Hello, " et de la chaine d'entrée. -Ce service est spécifié par la fonction makeBanner. - -Un utilitaire de documentation basé sur doxygen a été mis en place pour -compiler une documentation des services corba à partir de commentaires se -trouvant dans les fichiers idl. Nous rajouter donc à notre idl quelques -commentaires, en respectant le formalisme doxygen. -Un commentaire doxygen commence par "/*!" et se finit pas "*/". -Pour structurer un minimum les pages générées, on les regroupes par module ou -sujet. Dans notre exemple, nous utilisons la directive:: - - \ingroup EXAMPLES - -spécifiant que la documentation générée fait partie du groupe EXAMPLES. -(pour plus d'information sur doxygen, consulter le site www.doxygen.org). - -Pour finir, nous mettons à jour le Makefile avec le nouveau nom de composant:: - - IDL_FILES = HELLO_Gen.idl - - -Implémentation C++ -================== - -Les sources ------------ - -L'implémentation C++ de notre module CORBA HELLO (interface idl HELLO_Gen) est faite dans le répertoire -/src/HELLO:: - - HELLO.hxx - HELLO.cxx - -Au début du header de notre module (HELLO.hxx), les inclusions suivantes sont -nécessaires:: - - #include - #include CORBA_SERVER_HEADER(HELLO_Gen) - #include "SALOME_Component_i.hxx" - -Le fichier SALOMEconfig.h contient un certain nombre de définitions utiles -pour assurer l'indépendance du code par rapport à la version de CORBA -utilisée. SALOME_Component_i.hxx contient l'interface de la classe -d'implémentation C++ du composant de base Salome (idl Engines::Component). -Enfin, la macro CORBA_SERVER_HEADER assure l'indépendance des noms de fichiers -d'inclusion par rapport à l'implémentation de l'ORB CORBA. - -Après cela, nous définissons une classe d'implémentation, nommée HELLO, dérivant de -POA_HELLO_ORB::HELLO_Gen (classe abstraite générée automatiquement par CORBA lors de la -compilation de l'idl) et de Engines_Component_i (car l'interface idl HELLO_Gen -dérive de Engines::Component comme tout composant Salome2). Cette classe -contient un constructeur dont les arguments sont imposés par CORBA, un -destructeur virtuel, et une méthode makeBanner fournissant le service souhaité:: - - class HELLO: - public POA_HELLO_ORB::HELLO_Gen, - public Engines_Component_i - { - public: - HELLO(CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName); - virtual ~HELLO(); - char* makeBanner(const char* name); - }; - -La fonction makeBanner prend comme argument et renvoit un char*, projection C++ du type CORBA/IDL -string. -La documentation complète du mapping c++ de l'IDL est fournie par l'OMG sur -son site internet : http://www.omg.org/cgi-bin/doc?ptc/00-01-02. - -Enfin, nous fournissons l'interface (normalisé) de la fonction HELLOEngine_factory, qui -sera appelée par le "FactoryServer C++" pour charger le composant HELLO:: - - extern "C" - PortableServer::ObjectId * HELLOEngine_factory( - CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName); - -Dans le fichier source (HELLO.cxx) se trouvent les définitions -du constructeur et de la fonction d'instanciation -HELLOEngine_factory (toutes deux normalisées!), et de makeBanner:: - - char* HELLO::makeBanner(const char* name) - { - string banner="Hello, "; - banner+=name; - return CORBA::string_dup(banner.c_str()); - } - -Dans cette fonction, l'emploi de string_dup (fonction déclarée dans le -namespace CORBA) n'est pas obligatoire (on aurait pu utiliser l'opérateur new), -mais conseillé car ces fonctions permettent aux ORB d'utiliser des mécanismes -spéciaux de gestion de la mémoire sans avoir à redéfinir les opérateurs new -globaux. - -Makefile --------- - -Dans le makefile, il faut définir certaines cibles:: - - VPATH=.:@srcdir@:@top_srcdir@/idl - LIB = libHELLOEngine.la - LIB_SRC = HELLO.cxx - LIB_SERVER_IDL = HELLO_Gen.idl - LIB_CLIENT_IDL = SALOME_Component.idl SALOME_Exception.idl Logger.idl - CPPFLAGS += -I${KERNEL_ROOT_DIR}/include/salome - LDFLAGS+= -lSalomeContainer -lOpUtil -L${KERNEL_ROOT_DIR}/lib/salome - -Passons en revue chacune de ces cibles. -- LIB contient le nom *normalisé* (libEngine.la) le nom de la -librairie, LIB_SRC définit le nom des fichiers sources, et VPATH les -repertoire où l'on peut les trouver. -- LIB_SERVER_IDL contient le nom des fichiers idl implémentés par le module. -- LIB_CLIENT_IDL contient le nom des idl où sont définis les services CORBA -utilisés par le module. HELLO utilise Logger.idl via les macros "MESSAGE", -SALOME_Component.idl et SALOME_Exception.idl via l'héritage de HELLO_ORB:: -- Il faut ajouter à CPPFLAGS le chemin pour les fichiers includes utilisés -(SALOMEconfig.h, SALOME_Component_i.hxx et utilities.h se trouvent dans -${KERNEL_ROOT_DIR}/include/salome):: -- La classe HELLO utilise les librairies lib (pour Engines_Component_i) et -libOptUtil (pour PortableServer et Salome_Exception). On indique donc le nom -de ces librairies et leur chemin dans LDFLAGS. -D'autres librairies sont souvent utiles, par exemple libsalomeDS si on -implémente la persistence, ou libSalomeNS si on utilise le naming service. - - -Pilotage du composant depuis Python (mode TUI) -============================================== - -Lors de la compilation du module, la cible lib du Makefile dans /idl a -provoqué la génération d'un stub python (souche côté client générée à partir -de l'idl et offrant une interface dans le langage client - ici python. -Concrètement, un module python HELLO_ORB contenant une classe -_objref_HELLO_Gen sont créés, permettant de faire appel aux services de notre -module C++ depuis python. Mettons ceci en application. Pour cela, nous lançons -Salome en mode TUI:: - - cd $HELLO_ROOT_DIR/bin/salome - python -i runSalome.py --modules=HELLO --xterm --logger --containers=cpp,python --killall - -Depuis la fenêtre python, nous importons le module LifeCycle, et utilisons ses -services pour charger notre composant Dans la conteneur C++ FactoryServer:: - - >>> import LifeCycleCORBA - >>> lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) - >>> import HELLO_ORB - >>> hello = lcc.FindOrLoadComponent("FactoryServer", "HELLO") - -L'import de HELLO_ORB est nécessaire avant l'appel de FindOrLoadComponent, -pour permettre de retourner un objet typé (opération de "narrowing"). Sinon, -l'objet retourné est générique de type Engines::Component. Vérifions que notre -objet hello est correctement typé, et appelons le service makeBanner:: - - >>> print hello - - >>> mybanner=hello.makeBanner("Nicolas") - >>> print mybanner - Hello, Nicolas - -Les commandes précédentes ont été regroupées dans la fonction test du script -/bin/runSalome.py. - - -Interface graphique -=================== - -Introduction ------------- - -Pour aller plus loin dans l'intégration de notre module, nous allons ajouter -une interface graphique (développée en Qt), s'intégrant dans l'interface -applicative de Salome (IAPP). -On ne détaillera pas ici le fonctionnement de l'IAPP de Salome, mais pour -résumer, l'IAPP gère une boucle d'évènements (clics souris, clavier, etc), et -redirige après traitement ces évènements vers le module actif (le principe est -qu'à un instant donné, *un* module est actif. Lorsqu'un module est activé, son -IHM est chargée dynamiquement). -Le programmeur de la GUI d'un module a donc à charge de définir les méthodes -permettant de traiter correctement les évènements transmis. Parmi ces -méthodes, citons les principales : OnGUIEvent(), OnMousePress(), OnMouseMove(), -OnKeyPress(), DefinePopup(), CustomPopup(). - -Choix des widgets ------------------ - -Description xml -``````````````` -La description des items de notre module se fait dans le fichier XML -/ressources/HELLO_en.xml. Ce fichier est utilisé par l'IAPP pour charger -dynamiquement l'IHM du module quand celle-ci est activée. -Le principe est de définir par des balises les menus et boutons souhaités, et -d'y associer des ID, qui seront récupérés par les fonctions gérant les -évènemements IHM. Plusieures possibilités sont offertes: - -- ajout d'items à des menus déjà existant, auquel cas il faut reprendre les - balises du menu pré-existant, et y ajouter les nouveaux items. Dans - l'exemple qui suis, on ajoute le Menu **Hello** et l'item **MyNewItem** au - menu File, dont l'ID vaut 1:: - - - - - - - - -- Création de nouveaux menus. Pour le module HELLO, nous ajoutons un menu - HELLO, avec un unique item de label "Get banner":: - - - - - - - -- Ajout d'un bouton dans la barre à boutons. Dans l'exemple suivant, nous - créons un deuxième point d'entrée pour notre action "Get banner", sous forme - d'un bouton associé au même ID "901". L'icône est spécifiée par la le champ - icon-id, qui doit être un fichier graphique 20x20 pixels au format png:: - - - - - -Convention -`````````` -A chaque menu ou item est associé un ID. Les numéros entre 1 et 40 sont -réservés à l'IAPP. Les numéros d'ID suivent une certaine règle, quoique -celle-ci ne soit pas obligatoire. Au menu "HELLO" est associé l'ID 90. Son -unique item "Get banner" a l'ID 901. Un deuxième item aurait l'ID 902, et un -sous item l'ID 9021. - - -Implémentation de l'IHM ------------------------ - -L'implémentation C++ de l'IHM est faite dans le répertoire /src/HELLOGUI. -Le header HELLOGUI.h déclare de la classe HELLOGUI, et -contient des directives Qt (Q_OBJECT). De ce fait, il doit être processé par -le compilateur moc (Qt Meta Model Compiler). Pour cette raison, l'extension du -fichier est .h et dans le Makefile nous ajoutons la cible:: - - LIB_MOC = HELLOGUI.h - -Le fichier source HELLO.cxx contient la définition des fonctions membres, et -le Makefile permet de construire une librairie libHELLOGUI (le nom est -normalisé poour permettre le chargement dynamique : libGUI. - -Gestion des évènements -`````````````````````` -Pour l'IHM d'HELLO, nous définissons la fonction HELLOGUI::OnGUIEvent, qui -sera appelé à chaque évènement. Cette fonction contient essentiellement une -structure switch permettant de traiter l'ID reçu en argument:: - - switch (theCommandID) - { - case 901: - // Traitement de "Get banner" - ... - case 190: - // Traitement de "MyNewItem" - ... - } - -Le traitement standard consiste à récupérer des données d'entrée (ici, le -prénom via une fenêtre de dialogue QInputDialog::getText), à récupérer une -poignée sur le composant CORBA interfacé afin d'appeler le service souhaité -(ici, getBanner), et d'afficher le résultat obtenu (). - -Classes disponibles -```````````````````` -Pour les dialogues avec l'utilisateur, il est possible d'utiliser n'importe -quelle classe fournie par Qt (http://doc.trolltech.com/3.2/classes.html). -Cependant, lorque c'eset possible, il est préférable d'utiliser les fonctions -QAD (Qt Application Desktop), définies dans KERNEL_SRC/src/SALOMEGUI, qui -encapsulent les fonctions Qt correspondantes et gèrent mieux les -communications avec l'IAPP. Ainsi, dans HELLOGUI, nous utilisons la classe -QAD_MessageBox en lieu et place de la classe Qt QMessageBox. - - -Gestion du multi-linguisme -`````````````````````````` -Qt fournit un outil d'aide au support du multi-linguisme. Celui-ci est -repris dans salome. Le principe est simple : toutes les chaînes de caractères -utilisées pour les labels des menus et les dialogues avec l'utilisateur -sont encapsulés dans des appels à la fonction Qt tr() (pour translate), qui -prend en argument un nom de label. Par exemple, pour demander à l'utilisateur -de rentrer un prénom, nous utilisons la fonction getText, où les deux premiers -arguments sont des labels encapsulés par tr():: - - myName = QInputDialog::getText( tr("QUE_HELLO_LABEL"), tr("QUE_HELLO_NAME"), - QLineEdit::Normal, QString::null, &ok); - -Le nom des label est préfixé à titre indicatif par trois lettres et un underscore. Les codes -suivants sont utilisés:: - - - MEN_ : label menu - - BUT_ : label bouton - - TOT_ : aide tooltip - - ERR_ : message d'erreur - - WRN_ : message d'alerte - - INF_ : message d'information - - QUE_ : question - - PRP_ : prompt dans la barre des status - - -La traduction des labels encapsulés par tr() est faite pour différents -langages cibles (par exemple français et anglais) dans des fichiers nommés "_msg_.po". - correspond au code du langage, on a choisi **en** pour l'anglais et -**fr** pour le français. Ce fichier doit contenir pour chaque clé sa -traduction, par exemple:: - - msgid "HELLOGUI::INF_HELLO_BANNER" - msgstr "HELLO Information" - -Le squelette de ce fichier peut être généré par l'utilitaire Qt findtr:: - - findtr HELLOGUI.cxx > HELLO_msg_en.po - -puis éditer le fichier HELLO_msg_en.po pour remplir les traductions. -Ces fichiers sont ensuite compilés par l'utilitaire **msg2qm** pour générer -des binaires *.qm*. Pour cela, il faut remplir la cible LIB_MOC dans le -Makefile:: - - PO_FILES = HELLO_msg_en.po HELLO_msg_fr.po - -Pour l'utilisateur final, le choix du langage se fait au niveau de chaque -module dans le fichier ressources/config, en utilisant la commande:: - - langage= - - - -Règles syntaxiques de nommage -============================= - -Dans ce qui précède, nous avons utilisé un certain nombre de règles de -nommage. Le présent chapitre se propose de faire le point sur ces règles. -Celles-ci ne sont pas toutes obligatoires, mais simplifient la compréhension -si on les suit! - -+-------------------+------------------+----------------+---------------------------------------+ -| Règle | Formalisme | Exemple HELLO | Commentaire | -+===================+==================+================+=======================================+ -| Nom du module | | HELLO | C'est le nom qui figure dans le | -| | | | catalogue des modules | -+-------------------+------------------+----------------+---------------------------------------+ -| Base CVS | | EXAMPLES | Si la base cvs contient plusieurs | -| | | | modules, on prend un autre nom | -+-------------------+------------------+----------------+---------------------------------------+ -| Repertoire source | _SRC | HELLO1_SRC | L'indice 1 est utilisé car on prévoit | -| | | | plusieurs version du module | -+-------------------+------------------+----------------+---------------------------------------+ -| Fichier idl | _Gen.idl | HELLO_Gen.idl | | -| | | | | -+-------------------+------------------+----------------+---------------------------------------+ -| Nom du module | _ORB | HELLO_ORB | On évite d'utiliser le nom du module | -| CORBA | | | (conflits) | -+-------------------+------------------+----------------+---------------------------------------+ -| Nom de | _Gen | HELLO_Gen | La compilation de l'idl génère une | -| l'interface CORBA | | | classe abstraite | -| | | | POA__ORB::_Gen | -+-------------------+------------------+----------------+---------------------------------------+ -| fichier source | .cxx | HELLO.cxx | Dans le répertoire /src/ | -| | | | | -+-------------------+------------------+----------------+---------------------------------------+ -| Classe | | HELLO | Cette classe hérite de | -| d'implémentation | | | POA_HELLO_ORB::HELLO_Gen | -+-------------------+------------------+----------------+---------------------------------------+ -| Fonction | _ | HELLO_Engine | Cette fonction est appelée par | -| d'instanciation | Engine_factory | factory | le FactoryServer de Salome | -+-------------------+------------------+----------------+---------------------------------------+ -| Catalogue des | Catalog | HELLOCatalog | Dans /ressources | -| modules | .xml | .xml | | -+-------------------+------------------+----------------+---------------------------------------+ -| Nom de la | libEngine| libHELLOEngine | Dans le répertoire /src/ | -| librairie C++ | | | | -+-------------------+------------------+----------------+---------------------------------------+ -| Librairie C++ | libGUI | libHELLOGUI | Dans le répertoire /src/GUI | -| de l'IHM | | | | -+-------------------+------------------+----------------+---------------------------------------+ -| Variable | _ROOT_DIR| HELLO_ROOT_DIR | | -| d'environnement | | | | -+-------------------+------------------+----------------+---------------------------------------+ -| ... | ... | ... | ... | -| | | | | -+-------------------+------------------+----------------+---------------------------------------+ - diff --git a/doc/doxyfile.in b/doc/doxyfile.in new file mode 100755 index 0000000..bf1a6b7 --- /dev/null +++ b/doc/doxyfile.in @@ -0,0 +1,81 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = "HELLO sample module reference manual v.@VERSION@" +OUTPUT_DIRECTORY = . +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +TAB_SIZE = 5 + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES + +#--------------------------------------------------------------------------- +#Input related options +#--------------------------------------------------------------------------- +INPUT = @srcdir@ +FILE_PATTERNS = *.doc +EXCLUDE = +IMAGE_PATH = @srcdir@/images +EXAMPLE_PATH = + +#--------------------------------------------------------------------------- +#HTML related options +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = . +HTML_HEADER = @builddir@/static/header.html +HTML_FOOTER = @srcdir@/static/footer.html +HTML_STYLESHEET = @srcdir@/static/doxygen.css +TOC_EXPAND = YES +DISABLE_INDEX = NO +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 300 + +#--------------------------------------------------------------------------- +#SORT related options +#--------------------------------------------------------------------------- +SORT_GROUP_NAMES = NO + + +#--------------------------------------------------------------------------- +#LaTeX related option +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO + +#--------------------------------------------------------------------------- +#RTF related options +#--------------------------------------------------------------------------- +GENERATE_RTF = NO + +#--------------------------------------------------------------------------- +#External reference options +#--------------------------------------------------------------------------- +TAGFILES = +ALLEXTERNALS = NO +SEARCHENGINE = NO diff --git a/doc/images/head.png b/doc/images/head.png new file mode 100755 index 0000000000000000000000000000000000000000..307d9ef9a4c07f8fba2c8721309a978433bcf63c GIT binary patch literal 78545 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 D4zrO! literal 0 HcmV?d00001 diff --git a/doc/index.doc b/doc/index.doc new file mode 100644 index 0000000..8ae85b1 --- /dev/null +++ b/doc/index.doc @@ -0,0 +1,1065 @@ +/*! + +\mainpage Introduction to HELLO sample module + +The purpose of the \b HELLO module is to describe briefly the different +steps in the development of a SALOME module in C++. + +Contents: +- \subpage dev_steps +- \subpage tree_structure +- \subpage build_proc_files +- \subpage idl_dir +- \subpage src_dir +- \subpage bin_dir +- \subpage doc_dir +- \subpage build_procedure +- \subpage run_procedure +- \subpage load_module +- \subpage catalog_def +- \subpage load_lcc +- \subpage load_iapp + +\ref dev_steps ">> Next" + +\page dev_steps Steps in construction of the example module + +The example module chosen to illustrate the process of SALOME module +development is very simple. The module contains a single +component and this component provides several services called \b +hello and \b goodbye. +Each of these functions accepts a reference to the SALOME study and +a character string as the arguments and returns the status of the operation. +The component also provides a simple GUI. + +The steps in the development are as follows: +- create a module tree structure +- create a SALOME component that can be loaded by a C++ SALOME container +- configure the module so that the component is known to SALOME +- add a GUI + +\ref index "<< Previous"
\ref tree_structure ">> Next" + +\page tree_structure Create the module tree structure + +The first step in the development process is the creation of the +module tree file hierarchy. The typical SALOME module usually includes +some set of the configuration files (used in the build procedure of a +module), Makefiles, IDL file that provides a definition of a CORBA +services implemented in a module and a set of source files which are +compiled by the build procedure to the module CORBA engine library and +(optionally) GUI library. + +The following file structure is typical for the SALOME module: + +
++ HELLO1_SRC
+   + build_configure
+   + clean_configure
+   + configure.ac
+   + Makefile.am
+   + HELLO_version.h.in
+   + AUTHORS
+   + COPYING
+   + ChangeLog
+   + INSTALL
+   + NEWS
+   + README
+   + adm_local
+     + Makefile.am
+     + unix
+       + Makefile.am
+       + make_common_starter.am
+       + config_files
+         + Makefile.am
+         + check_GUI.m4
+         + check_HELLO.m4
+   + bin
+     + Makefile.am
+     + VERSION.in
+     + runAppli.in
+     + myrunSalome.py
+   + idl
+     + Makefile.am
+     + HELLO_Gen.idl
+   + src
+     + Makefile.am
+     + HELLO
+       + Makefile.am
+       + HELLO.hxx
+       + HELLO.cxx
+     + HELLOGUI
+       + Makefile.am
+       + HELLOGUI.h
+       + HELLOGUI.cxx
+       + HELLO_msg_en.ts
+       + HELLO_icons.ts
+   + resources
+     + Makefile.am
+     + HELLO.png
+     + goodbye.png
+     + handshake.png
+     + testme.png
+     + HELLOCatalog.xml.in
+     + SalomeApp.xml.in
+   + doc
+     + Makefile.am
+     + doxyfile.in
+     + index.doc
+     + images
+       + head.png
+     + static
+       + doxygen.css
+       + footer.html
+       + header.html.in
+
+ +Note that other files can be optionally present. + +The usual way of the sources directory tree structure initial creation +is to copy it from the existing SALOME module. + +\warning The files of the platform base module (KERNEL) must not be +copied to initialise a module tree structure. It is usually preferable +to copy files from another module such as GEOM or MED. + +The module name is HELLO, the component name is HELLO and all the +files are put in a directory named HELLO1_SRC. +Below is a short description of these files. Note, that files with .in +suffix are the autoconf templates from which the actual files are +generated during the build procedure. + +- \c build_configure +- \c configure.ac +- \c Makefile.am +- \c make_common_starter.am +- \c clean_configure + +These files are a part of the build system based on GNU +automake/autoconf auto-tools. These files define the build procedure, +namely, compilation and installation rules like compiler and linker +options, installation destination folder, package version etc. + +- \c AUTHORS +- \c COPYING +- \c ChangeLog +- \c INSTALL +- \c NEWS +- \c README + +These files are also a usual part of the GNU auto-tools based build +procedure. These files are used by developers to provide an additional +information on a product, like license, authors and distribution +information, change log between versions of a product, installation +hints, etc. + +- \c HELLO_version.h.in + +This is an optional C++ header file, specifying the version +macro-definitions which can be used, for example, in other modules to +check the version of the SALOME module (HELLO module in this +case). + +- \c adm_local + +This directory contains additional administrative files used by the +build procedure. + +- \c adm_local/unix/config_files/check_GUI.m4 +- \c adm_local/unix/config_files/check_HELLO.m4 + +These files are another part of the GNU auto-tools based build +procedure. The scripts written in m4 language are usually used to test +an availability of some 3rd-party pre-requisite product, compiler +feature, different configuration options. For example, check_GUI.m4 +file provides a procedure to test availability of SALOME GUI +module and thus specify if GUI library of HELLO module should be built +or no. + +- \c bin + +This directory usually contains different scripts. + +- \c bin/VERSION.in + +This file is used to document the module, it must give its version (at +least) and (optionally) compatibilities or incompatibilities with +other modules. This file is strongly recommended but is not essential +for operation of the module. + +- \c bin/runAppli.in +- \c bin/myrunSalome.py + +These files are not essential but make the example easier to +use. These are scripts that can be used to run SALOME session with +HELLO module. + +- \c idl + +This directory contains IDL files that specify the CORBA services +supplied by SALOME module. + +- \c idl/HELLO_Gen.idl + +This is the CORBA IDL definition of the services implemented by SALOME +HELLO module. + +- \c src + +This is a root directory of the module source codes. Usually it contains +one or more sub-directories that provide an implementation of module +libraries, executables, Python API modules, etc. The hierarchy of the +sources tree is arbitrary; it follows the specific module needs. + +- \c src/HELLO + +This directory provides implementation of engine library. + +- \c src/HELLO/HELLO.hxx +- \c src/HELLO/HELLO.cxx + +These files provide the implementation of a CORBA engine library of +the HELLO module. In particular, this is an implementation of the +services defined in the \c HELLO_Gen.idl file. + +- \c HELLOGUI + +It is an optional directory that provides an implementation of HELLO +module's GUI library. + +Strictly speaking, the GUI library is optional for each SALOME module. +In some cases it's enough to implement CORBA engine only. Then, +the services of the module will be avaiable in a CORBA environment. +The module can be loaded to the SALOME container and its services +can be used in the SALOME supervision computation schemas, in Python +scripts or/and in C++ implementation of other modules. + +A GUI library is necessary only if it is planned to access the module +functionality from the SALOME GUI session via menu actions, dialog boxes +and so on. + +- \c src/HELLOGUI/HELLOGUI.h +- \c src/HELLOGUI/HELLOGUI.cxx + +These files provide the implementation of a GUI library of +the HELLO module. In particular, these files specify menus, toolbars, +dialog boxes and other such staff. + +- \c src/HELLOGUI/HELLO_msg_en.ts +- \c src/HELLOGUI/HELLO_icons.ts + +These files provide a description (internationalization) of GUI +resources of the HELLO module. \c HELLO_msg_en.ts provides an English +translation of the string resources used in a module (there can be also +translation files for other languages, for instance French; these files +are distinguished by the language suffix). \c HELLO_icons.ts +defines images and icons resources used within the GUI library of +HELLO module. Please refer to Qt linguist documentation for more +details. + +- \c resources + +This optional directory usually contains different resources files +required for the correct operation of SALOME module. + +- \c resources/HELLO.png +- \c resources/handshake.png +- \c resources/goodbye.png +- \c resources/testme.png + +These are different module icon files. \c HELLO.png file provides main icon +of HELLO module to be shown in the SALOME GUI desktop. Other files are +the icons for the functions implemented by the module; they are used +in the menus and toolbars. + +- \c resources/HELLOCatalog.xml.in + +The XML description of the CORBA services provided by the HELLO +module. This file is parsed by SALOME supervision module (YACS) to generate +the list of service nodes to be used in the calculation schemas. The +simplest way to create this file is to use Catalog Generator utility +provided by the SALOME KERNEL module, that can automatically generate +XML description file from the IDL file. In GUI, this utility is available +via the Tools main menu. + +- \c resources/SalomeApp.xml.in + +This file is essential for each SALOME module. It provides some parameters of +the module which define its behavior in SALOME. In particular it +should provide a section with the name corresponding to the name of a +module ("HELLO" in our case) with the following parameters: +\code +
+ + + + +
+\endcode + +The \a "name" parameter defines GUI name of a module. The \a "icon" +parameter defines a GUI icon of a module. Optional \a "version" parameter +defines the version fo the module. The \a "documentation" parameter +provides a name for the help-related resource section (see below). + +The section \a "resources" of a file specifies the directory that contains +resources of a module (icons, translation files, etc). + +\code +
+ +
+\endcode + +The section \a "hello_help" provides information on the location of +the help page(s) and the eventual sub-menu in the Help menu. The name of this section +can be arbitrary, in such a case it should be specified in the main module's resources +section (see above). Alternatively, this section's name can have syntax +\a "_documentation", where \a module_name is a name of the module. +If such section is present in the resource file, it is not necessary to specify it +in the module's main section. + +Parameter \a "sub_menu" of the documentation section allows sepecifying the name of the +sub-menu in the Help main menu where the documentation materials of a module should be +put. + +\code +
+ + +
+\endcode + +- \c doc + +This directory containes the files related to the module's documentation. + +- \c doc/doxyfile.in + +The \b Doxygen configuration file. The Doxygen is used to build this +documentation. The file \c doxyfile.in provides a rules for the +generation of module documentation. + +- \c doc/index.doc + +An input file for the Doxygen, which provides a source of this documentation. + +- \c doc/images + +This sub-folder contains images used in the documentation. + +- \c doc/static + +This sub-folder contains auxiliary files used when generating documentation +by Doxygen, like header (\c header.html.in) and footer (\c footer.html) +of the HTML pages, style sheet (\c doxygen.css) etc. + +\ref dev_steps "<< Previous"
\ref build_proc_files ">> Next" + +\page build_proc_files Build procedure input files + +In most cases SALOME uses \b autoconf, \b automake and other GNU auto-tools +to build the modules. The \c configure script is used for the build procedure +to test the system configuration and to pre-configure the module construction +\c Makefile files. + +The \c build_configure script provides a procedure that uses +\c configure.ac and set of \c Makefile.am files as input and uses \b autoconf +to generate the \c configure script and \b automake to generate \c Makefile.in +files. + +The files with an \c .in extension are the skeletons that are the input +of the \c configure script (to be more precise, these files should be +listed in the end of the \c configure.ac file in the \c AC_OUTPUT() +autoconf macro) and are transformed to the resulting files during the +configuration process. + +Almost all files used for this process are located in SALOME +base module KERNEL that is referenced by the \c KERNEL_ROOT_DIR +environment variable, namely in its \c salome_adm sub-folder. +Similarly, the \c GUI_ROOT_DIR environment variable is used for the +graphical user interface (GUI) module of SALOME; this module also +provides a set of configuration utilities (m4 files) in its +\c adm_local folder. However, some files must be modified as a +function of the target module. This is the case for \c build_configure +and \c configure.ac files which usually need to be adapted to the module needs. + +The file \c make_common_starter.am file in the \c adm_local directory of +the HELLO module provides basic build rules to be used in other +\c Makefile.am files. To refer to this file in any \c Makefile.am it is +necessary to use \a "include" clause: + +\code +include $(top_srcdir)/adm_local/unix/make_common_starter.am +\endcode + +The \c adm_local/unix/config_files is a directory in which the m4 files +that are used to test the configuration of the system in the configuration +process can be placed. If the \c salome_adm files are not sufficient, +additional configuration files can be put to the \c adm_local directory. + +\ref tree_structure "<< Previous"
\ref idl_dir ">> Next" + +\page idl_dir The idl directory + +The \c idl directory requires a \c Makefile.am that must make the +compilation of the CORBA IDL \c HELLO_Gen.idl file and install all the +generated files into the correct module installation directories. The +\a BASEIDL_FILES target has to be modified to reach this goal. + +The IDL file itself must define a CORBA component for which the name must +be different from the module name to avoid name conflicts and define a +CORBA interface that is derived at least from the \a EngineComponent interface +of the \a Engines module. In case of HELLO module, the name of the CORBA +component is \b HELLO_ORB and the name of the interface is \b HELLO_Gen. + +\ref build_proc_files "<< Previous"
\ref src_dir ">> Next" + +\page src_dir The src directory + +The \c src directory contains all source files required to build CORBA engine and +(optionally) GUI libraries of the module. Each of these entities usually +has (but this is not actually obligatory) its own directory. + +The \c Makefile.am simply triggers the path of sub-directories described +by the \a SUBDIRS target. + +- \c src/HELLO sub-directory + +This sub-directory contains the C++ source files that implement the engine +library of the module. The \c Makefile.am defines the rules used to build +the engine library from these source files. The name of the module +engine library is predefined and should be set as \c lib\Engine.so +where \c MODULE is a name of the module. In the case of the HELLO +module, the name of the engine library should be \c libHELLOEngine.so. + +The \c HELLO.h, \c HELLO.cxx files implement \a HELLO class that is derived +from the \a HELLO_Gen interface of the \a POA_HELLO_ORB CORBA module and the +\a SALOME_Component_i class (base implementation of SALOME module engine +exported by the KERNEL module). + +In particular, \a HELLO class implements \a hello() and \a goodbye() functions +that are defined in the IDL interface \a HELLO_ORB::HELLO_Gen. + +\code +HELLO_ORB::status HELLO::hello( SALOMEDS::Study_ptr study, const char* name ) +{ +... +} +HELLO_ORB::status HELLO::goodbye( SALOMEDS::Study_ptr study, const char* name ) +{ +... +} +\endcode + +In addition, \c HELLO.cxx implements a factory function which is used by +the SALOME container to create an instance of the HELLO CORBA engine +by demand: + +\code +extern "C" +{ + PortableServer::ObjectId* HELLOEngine_factory( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName) + { + HELLO* myHELLO = new HELLO(orb, poa, contId, instanceName, interfaceName); + return myHELLO->getId(); + } +} +\endcode + +- \c src/HELLOGUI sub-directory + +This directory contains the C++ source files that implement the GUI +library of HELLO module. By default, the name of the module +GUI library is predefined and should be set as \c lib\.so +where \c MODULE is a name of the module. In the case of the HELLO +module, the name of the GUI library should be \c libHELLO.so. It is +also possible to use custom name of the GUI library of a module, but +in this case, in order to be possible to use this module in SALOME GUI +desktop, the name of the GUI library should be defined in the +\c SalomeApp.xml file, in the module's main section, using \a "library" +parameter, for example: + +\code +
+ + + +
+\endcode + +The implementation of GUI library of the HELLO module should be done +according to the architecture and rules specified by the SALOME GUI +module. The main GUI module class (a\ HELLOGUI in our case) should be +derived from the \a SalomeApp_Module class. + +The developer has to redefine a set of methods which define the +module behavior in GUI, for example, create menus, toolbars, define +context popup menus, objects selection behavior, implement dialog +boxes etc. + +Here below is a short description of these methods. For more details +please refer to the SALOME GUI module documentation. + +- \a initialize() - module initialization; usually used to create + GUI actions, menus, toolbars and so on; +- \a activateModule() - module activation; perform actions which should + be done when the module is activated by the user, for example, show + related menus and toolbars; +- \a deactivateModule() - module deactivation; perform actions which should + be done when the module is deactivated by the user, for example, + hide related menus and toolbars; +- \a windows() - get a list and a position of the dockable windows to be + associated with the module; these windows will be automatically + opened and positioned according to the settings defined by the value + returned by this function; +- \a viewManagers() - get a list of the compatible viewers; these viewers + will be automatically opened/raised on the module activation; +- \a contextMenuPopup() - create and return context popup menu according + to the current selection; +- \a createPreferences() - initialize module's preferences; +- \a preferencesChanged() - callback function that is called when some + module's preference is changed by the user; allows to perform the + corresponding actions; +- \a createSelection() - create and return menu selection object; this is + a part of the context popup menu definition API; +- \a engineIOR() - get the reference to the module CORBA engine; +- \a moduleIcon() and \a iconName() - these methods can be used to customize + the module's main icon; +- \a displayer() - get the reference to the module's \a Displayer class; this + is the part of common Show/Hide functionality mechanism; +- \a storeVisualParameters() and \a restoreVisualParameters() - these methods + can be redefined to store/restore different visualization attributes of the + presentable data if it is supported by the module, for example transparency, + colors, display mode and other presentable parameters; +- \a canCopy(), \a copy(), \a canPaste(), \a paste() - these methods are the + part of the common Copy/Paste functionality; +- \a isDraggable(), \a isDropAccepted(), \a dropObjects() - these methods + are the part of the common Drag-n-Drop functionality; +- \a createOperation() - this function can be used as a part of the + transaction-based operations mechanism. +- \a renameAllowed(), \a renameObject() - can be used for in-place (Object + browser) renaming of the data entities, if it is supported by the module. + +Note, that all of these methods are optional and need not be +obligatory implemented because \a SalomeApp_Module class provides a +base implementation of these functions. It's sometimes enough to +implement only some of them, depending on the module needs. + +In the case of HELLO module, only the following methods are +implemented (other ones are just stubs, added for sample reasons): + +- \a engineIOR() that initializes HELLO module's engine: + +\code +QString HELLOGUI::engineIOR() const +{ + init(); // initialize engine, if necessary + CORBA::String_var anIOR = getApp()->orb()->object_to_string( myEngine.in() ); + return QString( anIOR.in() ); +} +\endcode + +- \a initialize() that creates actions, menus and toolbars for module's services + service: + +\code +void HELLOGUI::initialize( CAM_Application* app ) +{ + // call the parent implementation + SalomeApp_Module::initialize( app ); + + // get reference to the desktop (used as a parent for actions) + QWidget* dsk = app->desktop(); + // get resources manager + SUIT_ResourceMgr* resMgr = app->resourceMgr(); + + // create actions + // ... Test me operation + createAction( OpTestMe, // operation id + tr( "TLT_OP_TESTME" ), // tooltip + resMgr->loadPixmap( "HELLO",tr( "ICON_OP_TESTME" ) ), // icon + tr( "MEN_OP_TESTME" ), // menu title + tr( "STS_OP_TESTME" ), // status tip + 0, // accelerator (not set) + dsk, // parent + false, // togglable flag (no) + this, // action receiver + SLOT( testMe() ) ); // action slot + // create other actions ............ + + // create menus + int menuId; + menuId = createMenu( tr( "MEN_FILE" ), -1, -1 ); // File menu + createMenu( separator(), menuId, -1, 10 ); // add separator to File menu + menuId = createMenu( tr( "MEN_FILE_HELLO" ), menuId, -1, 10 ); // File - Hello submenu + createMenu( OpTestMe, menuId ); // File - Hello - Test me + // create other menus ............ + + // create toolbars + int aToolId; + aToolId = createTool ( tr( "TOOL_TEST" ) ); // Test toolbar + createTool( OpTestMe, aToolId ); // Test - Test me + // create other toolbars ............ + + // set-up popup menu + QtxPopupMgr* mgr = popupMgr(); + mgr->insert( action( OpHello ), -1, -1 ); // Hello + mgr->setRule( action( OpHello ), baseRule + " and isComponent", QtxPopupMgr::VisibleRule ); + // create other popup menu commands ............ +} +\endcode + +- \a activateModule() that activates menus and toolbars + +\code +bool HELLOGUI::activateModule( SUIT_Study* theStudy ) +{ + // call parent implementation + bool bOk = SalomeApp_Module::activateModule( theStudy ); + + // show own menus + setMenuShown( true ); + // show own toolbars + setToolShown( true ); + + // return the activation status + return bOk; +} +\endcode + +- \a deactivateModule() that deactivates menus and toolbars + +\code +bool HELLOGUI::deactivateModule( SUIT_Study* theStudy ) +{ + // hide own menus + setMenuShown( false ); + // hide own toolbars + setToolShown( false ); + + // call parent implementation and return the activation status + return SalomeApp_Module::deactivateModule( theStudy ); +} +\endcode + +- \a windows() that set-ups dockable windows requested by the module + +\code +void HELLOGUI::windows( QMap& theMap ) const +{ + // want Object browser, in the left area + theMap.insert( SalomeApp_Application::WT_ObjectBrowser, + Qt::LeftDockWidgetArea ); + // want Python console, in the bottom area + theMap.insert( SalomeApp_Application::WT_PyConsole, + Qt::BottomDockWidgetArea ); +} +\endcode + +- \a isDragable(), \a isDropAccepted() and \a dropObjects() methods that handle +the Drag-n-Drop operation + +\code +bool HELLOGUI::isDragable( const SUIT_DataObject* what ) const +{ + // we allow dragging any HELLO object, except the top-level component + const SalomeApp_ModuleObject* aModObj = dynamic_cast( what ); + return ( aModObj == 0 ); +} + +bool HELLOGUI::isDropAccepted( const SUIT_DataObject* where ) const +{ + // we allow dropping of all objects + return true; +} + +void HELLOGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where, + const int row, Qt::DropAction action ) +{ + if (action != Qt::CopyAction && action != Qt::MoveAction) + return; // unsupported action + + // get parent object + SalomeApp_DataObject* dataObj = dynamic_cast( where ); + if ( !dataObj ) return; // wrong parent + _PTR(SObject) parentObj = dataObj->object(); + + // collect objects being dropped + HELLO_ORB::object_list_var objects = new HELLO_ORB::object_list(); + objects->length( what.count() ); + int count = 0; + for ( int i = 0; i < what.count(); i++ ) { + dataObj = dynamic_cast( what[i] ); + if ( !dataObj ) continue; // skip wrong objects + _PTR(SObject) sobj = dataObj->object(); + objects[i] = _CAST(SObject, sobj)->GetSObject(); + count++; + } + objects->length( count ); + + // call engine function + engine()->copyOrMove( objects.in(), // what + _CAST(SObject, parentObj)->GetSObject(), // where + row, // row + action == Qt::CopyAction ); // isCopy + + // update Object browser + getApp()->updateObjectBrowser( false ); +} +\endcode + +An implemention of the \a hello() and \a goodbye() methods is quite simple. +These operations show the dialog box proposing the user to enter the name and +pass the name entered by the user to the engine side, using the corresponding +CORBA service. + +\code +void HELLOGUI::hello() +{ + SalomeApp_Study* study = dynamic_cast( application()->activeStudy() ); + _PTR(Study) studyDS = study->studyDS(); + + // request user name + bool ok; + QString name = QInputDialog::getText( getApp()->desktop(), tr( "QUE_HELLO_TITLE" ), tr( "QUE_ENTER_NAME" ), + QLineEdit::Normal, QString::null, &ok ); + + if ( ok && !name.trimmed().isEmpty() ) { + // say hello to SALOME + HELLO_ORB::status status = engine()->hello( _CAST(Study, studyDS)->GetStudy(), (const char*)name.toLatin1() ); + + // update Object browser + getApp()->updateObjectBrowser(true); + + // process operation status + switch( status ) { + case HELLO_ORB::OP_OK: + // everything's OK + SUIT_MessageBox::information( getApp()->desktop(), + tr( "INF_HELLO_TITLE" ), + tr( "INF_HELLO_MSG" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_ALREADY_MET: + // error: already said hello + SUIT_MessageBox::warning( getApp()->desktop(), + tr( "INF_HELLO_TITLE" ), + tr( "ERR_HELLO_ALREADY_MET" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_UNKNOWN: + default: + // other errors + SUIT_MessageBox::critical( getApp()->desktop(), + tr( "INF_HELLO_TITLE" ), + tr( "ERR_ERROR" ), + tr( "BUT_OK" ) ); + break; + } + } +} + +void HELLOGUI::goodbye() +{ + SalomeApp_Application* app = dynamic_cast( application() ); + SalomeApp_Study* study = dynamic_cast( application()->activeStudy() ); + _PTR(Study) studyDS = study->studyDS(); + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + + QString name; + + // get selection + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + if ( selected.Extent() == 1 ) { + Handle(SALOME_InteractiveObject) io = selected.First(); + _PTR(SObject) so = studyDS->FindObjectID( io->getEntry() ); + if ( so ) { + _PTR(SComponent) comp = so->GetFatherComponent(); + if ( comp && comp->ComponentDataType() == "HELLO" && io->getEntry() != comp->GetID() ) { + name = so->GetName().c_str(); + } + } + } + + // request user name if not specified + if ( name.isEmpty() ) { + bool ok; + name = QInputDialog::getText( getApp()->desktop(), tr( "QUE_GOODBYE_TITLE" ), tr( "QUE_ENTER_NAME" ), + QLineEdit::Normal, QString::null, &ok ); + } + + if ( !name.trimmed().isEmpty() ) { + // say goodby to SALOME + HELLO_ORB::status status = engine()->goodbye( _CAST(Study, studyDS)->GetStudy(), (const char*)name.toLatin1() ); + + // update Object browser + getApp()->updateObjectBrowser(true); + + // process operation status + switch( status ) { + case HELLO_ORB::OP_OK: + // everything's OK + SUIT_MessageBox::information( getApp()->desktop(), + tr( "INF_GOODBYE_TITLE" ), + tr( "INF_GOODBYE_MSG" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_DID_NOT_MEET: + // error: did not say hello yet + SUIT_MessageBox::warning( getApp()->desktop(), + tr( "INF_GOODBYE_TITLE" ), + tr( "ERR_GOODBYE_DID_NOT_MEET" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_UNKNOWN: + default: + // other errors + SUIT_MessageBox::critical( getApp()->desktop(), + tr( "INF_GOODBYE_TITLE" ), + tr( "ERR_ERROR" ), + tr( "BUT_OK" ) ); + break; + } + } +} +\endcode + +Also, \c HELLOGUI.cxx provide an implementation of a factory function that is used +by the SALOME GUI to create an instance of the HELLO GUI class by demand. +It implements also another factory function to retrieve the +version number of the module (in the About dialog box for example): + +\code +extern "C" { + CAM_Module* createModule() + { + return new HELLOGUI(); + } + + char* getModuleVersion() + { + return (char*)HELLO_VERSION_STR; + } +} +\endcode + +\ref idl_dir "<< Previous"
\ref bin_dir ">> Next" + +\page bin_dir The bin directory + +The file \c VERSION.in is used to document the module, it must define its +version and (optionally) its compatibilities or incompatibilities with +other modules. Therefore, it is strongly recommended but is not +essential for correct operation of the module. + +The \c runAppli.in file is the equivalent of the \c runSalome script +distributed by the KERNEL module but configured to start SALOME +session with HELLO module only. + +The \c myrunSalome.py file reuses part of functionality provided by the +KERNEL's \c runSalome.py script. It is used to run SALOME session and +start HELLO module in this session. + +\ref src_dir "<< Previous"
\ref doc_dir ">> Next" + +\page doc_dir The doc directory + +This directory provides documentation files of the module. The +documentation of the module can be implemented in the arbitrary +way. But if you want your documentation to appear in the SALOME GUI +desktop's Help menu, some specific actions should be done as follows. + +The documentation should be generated in the HTML format. For example, +the documentation of the HELLO module is generated using Doxygen +tool. It allows to generate structured set of HTML pages from the set +of input plain text files. Input source files should include Doxygen +tags and optionally direct HTML tags. For more details please refer to +the Doxygen documentation. + +The resulting documentation of a module should include at least one +file \c index.html. All the HTML and image files should be exported by +the build procedure to the following directory: +\c \/share/doc/salome/gui/\ +where \c module_installation_dir is a module installation folder and +\c MODULE is its name. For example, for HELLO module, at least one file +should exist: +\c \/share/doc/salome/gui/HELLO/index.html. + +The SALOME GUI automatically searches for the index.html file in the +mentioned module directory. If the file is found, the corresponding +menu command is automatically added to the Help menu of the SALOME GUI +desktop. + +\ref bin_dir "<< Previous"
\ref build_procedure ">> Next" + +\page build_procedure Construction, installation + +Before building HELLO module, please ensure that SALOME environment is +set properly. Assume that SALOME environment is set in env_products.sh +script. In order to build and install HELLO module, you have to +perform several steps: + +
+[bash% ] source env_products.sh
+[bash% ] mkdir HELLO_BUILD
+[bash% ] cd HELLO_BUILD
+[bash% ] ../HELLO1_SRC/build_configure
+[bash% ] ../HELLO1_SRC/configure --prefix=\
+[bash% ] make
+[bash% ] make install
+
+ +The first command creates a build directory for the HELLO module. Then +next step is to cd to this build directory. From this directory you +sequentially invoke \c build_configure, \c configure, \c make and \c make install +commands. On each step, you have to ensure that the operation is +finished correctly (no errors raised). + +The \c \ variable above defines the +destination directory to which the HELLO module should be +installed. After the last step is finished, the HELLO module is built +and installed to the \c \ directory. + +\ref doc_dir "<< Previous"
\ref run_procedure ">> Next" + +\page run_procedure Running SALOME + +Go to the the \c \ directory and type: + +
+[bash% ] ./bin/salome/runAppli
+
+ +This command runs SALOME session configured for KERNEL and the HELLO +module. At the end of running, the user will be prompted by the +Python interpreter command line configured for SALOME that provides +access to SALOME Python API (including CORBA interfaces). + +The \c runAppli file is a shell script that executes a Python commands +running SALOME session by passing arguments to it in a command line: + +
+${KERNEL_ROOT_DIR}/bin/salome/envSalome.py python -i $HELLO_ROOT_DIR/bin/salome/myrunSalome.py --modules=HELLO --killall
+
+ +These arguments state that the \c myrunSalome.py script located in the +HELLO module will be used, that the HELLO component will be +activated and all previously running SALOME sessions should be +shutdowned. + +This command will not function unless the following environment +variables have previously been set: + +
+export KERNEL_ROOT_DIR=\
+export HELLO_ROOT_DIR=\
+
+ +\warning It is possible that the SALOME run will not reach the end. +In some circumstances, the time to start CORBA servers may be long and +could exceed the timeout. If the reasons is that the time to +load dynamic libraries is long, it is possible that a second run +immediately afterwards will be successful. + +\ref build_procedure "<< Previous"
\ref load_module ">> Next" + +\page load_module Loading HELLO component + +The \a HELLO_ORB module has to be imported before making a request to +load the component into the container, to obtain access to methods of +the component. This container is made accessible in the \c myrunSalome.py +by means of the \a container variable: + +
+>> import salome
+>> salome.salome_init()
+>> import HELLO_ORB
+>> c = container.load_impl("HELLO", "HELLO")
+>> c.hello(salome.myStudy, "Christian")
+
+ +The last instruction invokes HELLO module's service \a hello(). Proceed as +follows to see the CORBA objects created by these actions: + +
+>> clt.showNS()
+
+ +\ref run_procedure "<< Previous"
\ref catalog_def ">> Next" + +\page catalog_def HELLO module catalog definition + +In the example from the previous chapter, the HELLO component was +loaded by making a direct request to the SALOME container. This is not +the standard method for loading of a component. The normal way uses +the SALOME LifeCycle service that invokes SALOME Module Catalog +services to identify the component and its properties and then calls +the requested container to load the component. + +Before this method can be used, the component must be declared in a +catalog in the XML format, for which the name must be +\c \Catalog.xml. In our case, it will be \c HELLOCatalog.xml. +Usually this catalog is put to the resources sub-directory of the +directory tree. The simplest way to create this file is to use Catalog +Generator utility provided by the SALOME KERNEL module, that can +automatically generate XML description file from the IDL file. + +\ref load_module "<< Previous"
\ref load_lcc ">> Next" + +\page load_lcc Loading HELLO component via LifeCycle service + +The method of loading the component is not very different from that +is described above. The services of the LifeCycle module are used in +this case instead of calling the container directly. The call sequence +is contained in the \c myrunSalome.py \a test() function. + +
+    import salome
+    salome.salome_init()
+    c = test(clt)
+    c.hello(salome.myStudy, "Christian")
+
+ +The test function creates the LifeCycle object. It then asks for the +HELLO component to be loaded in the \a FactoryServer container: + +\code +def test(clt): + """ + Test function that creates an instance of HELLO component + usage : hello=test(clt) + """ + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import HELLO_ORB + hello = lcc.FindOrLoadComponent("FactoryServer", "HELLO") + return hello +\endcode + +\ref catalog_def "<< Previous"
\ref load_iapp ">> Next" + +\page load_iapp Loading from the GUI (IAPP) + +In order to activate HELLO module in the SALOME GUI desktop, the user +should press the HELLO module's button on the \a Modules toolbar or +select the name of the module in the combo box on this toolbar. + +The image file to be used as an icon of a module should be exported by +the module build procedure. The icon file name is defined in \c SalomeApp.xml: +\code +
+ + +
+\endcode + +\ref load_lcc "<< Previous" + +*/ diff --git a/doc/static/doxygen.css b/doc/static/doxygen.css new file mode 100755 index 0000000..7a2dcbd --- /dev/null +++ b/doc/static/doxygen.css @@ -0,0 +1,836 @@ +/* The standard CSS for doxygen */ + +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; +} + +/* @group Heading Levels */ + +h1 { + font-size: 150%; +} + +h2 { + font-size: 120%; +} + +h3 { + font-size: 100%; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd, p.starttd { + margin-top: 2px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + padding: 2px; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code { + color: #4665A2; +} + +a.codeRef { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.version { + border:1px solid #0000FF; + color: #CCCCCC; + font-family: Arial, Helvetica, sans-serif; + font-size: 9pt; + text-align: center; + width:100px; + -moz-border-radius: 8px; + margin: 5px; +} + +div.footer1 { + background-color: #DFE5F1; + border: 1px solid #AAAAAA; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; + padding: 10px; + margin-top: 15px; +} + + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #C4CFE5; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.memitem { + padding: 0; + margin-bottom: 10px; +} + +.memname { + white-space: nowrap; + font-weight: bold; + margin-left: 6px; +} + +.memproto { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 8px; + border-top-left-radius: 8px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 8px; + -moz-border-radius-topleft: 8px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 8px; + -webkit-border-top-left-radius: 8px; + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + +} + +.memdoc { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 2px 5px; + background-color: #FBFCFD; + border-top-width: 0; + /* opera specific markup */ + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + + + + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0px; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; + margin: 5px; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; +} + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +div.ingroups +{ + font-size: 8pt; + padding-left: 5px; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.title { + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +dl +{ + padding: 0 0 0 10px; +} + +dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug +{ + border-left:4px solid; + padding: 0 0 0 6px; +} + +dl.note +{ + border-color: #D0D000; +} + +dl.warning, dl.attention +{ + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + border-color: #00D000; +} + +dl.deprecated +{ + border-color: #505050; +} + +dl.todo +{ + border-color: #00C0E0; +} + +dl.test +{ + border-color: #3030E0; +} + +dl.bug +{ + border-color: #C08050; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + background-color: #175783; + border: 1px solid; + height: 80px; + background-repeat: no-repeat; +/* font: 300% arial,sans-serif;*/ + margin: 0px; + padding: 0px; +} + +#projectbrief +{ + font: 120% arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + background: url("head.png"); + background-color: #175783; + border: 1px solid; + height: 80px; + background-repeat: no-repeat; + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + diff --git a/doc/static/footer.html b/doc/static/footer.html new file mode 100755 index 0000000..4c89a2b --- /dev/null +++ b/doc/static/footer.html @@ -0,0 +1,12 @@ + + + +
+
+ Copyright © 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
+ Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+
+
+ + + \ No newline at end of file diff --git a/doc/static/header.html.in b/doc/static/header.html.in new file mode 100755 index 0000000..4571b43 --- /dev/null +++ b/doc/static/header.html.in @@ -0,0 +1,20 @@ + + + + + +$title + +$treeview +$search +$mathjax + + + + +
+
Version: @VERSION@
+ +
diff --git a/idl/HELLO_Gen.idl b/idl/HELLO_Gen.idl index 9245978..49cfec2 100644 --- a/idl/HELLO_Gen.idl +++ b/idl/HELLO_Gen.idl @@ -1,52 +1,89 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + #ifndef __HELLO_GEN__ #define __HELLO_GEN__ + /*! - \defgroup EXAMPLES SALOME EXAMPLES components - */ + \defgroup EXAMPLES SALOME EXAMPLES components +*/ #include "SALOME_Component.idl" #include "SALOME_Exception.idl" - -/*! \ingroup EXAMPLES - -This package contains the interface HELLO_ORB used -for %HELLO component as an example in %SALOME application. +/*! + \ingroup EXAMPLES + This package contains the interface HELLO_ORB used + for %HELLO component as an example in %SALOME application. */ module HELLO_ORB { - /*! \brief Interface of the %HELLO component + typedef sequence object_list; + + /*! + \brief Operation result codes + */ + enum status { + OP_OK, //!< OK result + OP_ERR_ALREADY_MET, //!< ERROR: already met + OP_ERR_DID_NOT_MEET, //!< ERROR: did not meet yet + OP_ERR_UNKNOWN //!< ERROR: other problems + }; + + /*! + \brief Interface of the %HELLO component */ - interface HELLO_Gen : Engines::Component + interface HELLO_Gen : Engines::EngineComponent { - /*! - Set the Name and return the string concatenation of "hello, " and the given name. - */ - string makeBanner(in string name) - raises (SALOME::SALOME_Exception); + /*! + \brief Say hello to \a name + \param study SALOME study + \param name person's name + \return operation status + */ + status hello( in SALOMEDS::Study study, in string name ) + raises (SALOME::SALOME_Exception); + + /*! + \brief Say goodbye to \a name + \param study SALOME study + \param name person's name + \return operation status + */ + status goodbye( in SALOMEDS::Study study, in string name ) + raises (SALOME::SALOME_Exception); + + /*! + \brief Copy or move objects to the specified position + + This function is used in the drag-n-drop functionality. + + \param what objects being copied/moved + \param where parent object where objects are copied/moved to + \param row position in the parent object's children list at which objects are copied/moved + \param isCopy \c true if object are copied or \c false otherwise + */ + void copyOrMove( in object_list what, in SALOMEDS::SObject where, in long row, in boolean isCopy ); }; }; #endif - diff --git a/idl/Makefile.am b/idl/Makefile.am index 5911ed4..2b818ab 100644 --- a/idl/Makefile.am +++ b/idl/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # This Makefile is responsible of generating the client and server # implementation of IDL interfaces for both C++ and python usage. # The building process of the C++ files is in charge of each source @@ -28,6 +26,8 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am BASEIDL_FILES = HELLO_Gen.idl +BASEIDL_FILES_PY=$(BASEIDL_FILES:%.idl=%_idl.py) + # This variable defines the files to be installed dist_salomeidl_DATA = $(BASEIDL_FILES) @@ -45,7 +45,6 @@ nodist_salomeinclude_HEADERS = $(BASEIDL_FILES:%.idl=%.hh) libSalomeIDLHELLO_la_CPPFLAGS = \ $(KERNEL_CXXFLAGS) \ - -I$(top_builddir)/salome_adm/unix \ -I$(top_builddir)/idl \ @CORBA_CXXFLAGS@ \ @CORBA_INCLUDES@ @@ -67,8 +66,7 @@ IDLCXXFLAGS = \ -bcxx \ @IDLCXXFLAGS@ \ -I$(top_builddir)/idl/salome \ - -I$(KERNEL_ROOT_DIR)/idl/salome \ - -I$(top_builddir)/salome_adm/unix + -I$(KERNEL_ROOT_DIR)/idl/salome IDLPYFLAGS = \ @IDLPYFLAGS@ \ -I$(KERNEL_ROOT_DIR)/idl/salome @@ -86,9 +84,15 @@ install-exec-local: $(BASEIDL_FILES:%=$(top_srcdir)/idl/%) $(OMNIORB_IDL) $(IDLPYFLAGS) -C$(DESTDIR)$(salomepythondir) $$file ; \ done -# uninstall-local removes too much, but it works in distcheck +# we want to remove only staff generated for IDL files and nothing more uninstall-local: - rm -rf $(DESTDIR)$(salomepythondir)/* + @for modulen in HELLO_ORB ; do \ + test -d $(DESTDIR)$(salomepythondir)/$${modulen} && echo "Removing $(DESTDIR)$(salomepythondir)/$${modulen}" && rm -rf $(DESTDIR)$(salomepythondir)/$${modulen} ; \ + test -d $(DESTDIR)$(salomepythondir)/$${modulen}__POA && echo "Removing $(DESTDIR)$(salomepythondir)/$${modulen}__POA" && rm -rf $(DESTDIR)$(salomepythondir)/$${modulen}__POA ; \ + done ; \ + for filen in $(BASEIDL_FILES_PY) ; do \ + echo "Removing $(DESTDIR)$(salomepythondir)/$${filen}" && rm -f $(DESTDIR)$(salomepythondir)/$${filen}* ; \ + done mostlyclean-local: -rm -f *.hh *.cc .depidl diff --git a/resources/ExecHELLO.png b/resources/ExecHELLO.png deleted file mode 100644 index 16a20c116e8243a6b49ed862613d2cc49bdf4caa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmV-F1Hk-=P)A+3!%gdoE?w?yY*XMamxaAW~()k6;QGVVf3ZPpQcy+38CrH3{Qk zoaxN-vWJ+OcH(Y#5qvHK|CitMf1CdUU;7AQ8zF4-#i736F~#EMso~pq*Ek7JMLa$}POH_T(b)M|f)>8t;^3f3 zKA)#ntMKyW+7Z-s>l6xWsZ53jrMAEC5{41RXe`Snj$`6DMr+Vop|xgsc$hE@Sz20V zb@eG)%b|Y+_m{*NND_%L1}POFH@MUObOdhQq^%&CMdWZvC2q+x@_Pg_JQ$DGG%bJbwIyVzG#2o#E=$@5yGf z#Bm5%IplY1BB@I((}Bdlpj1;;nAaqNZEDBWHP2)F0;K|LMcrchIBe@ z&Ye4p5H>e&{)pCc=qTd1Z_6|q4IIZIpUy{Fg7-dG2KQ=nb2l+s9 - + - - - - - - - - + + + + + + + + + - - HELLO - HELLO GUI - Data - C. Caremoli - @VERSION@ - EDF - RD - 1 - HELLO.png - 'linux' ~ OS - - - + + HELLO + Hello + OTHER + Vadim SANDLER + @VERSION@ + Sample module + 1 + 1 + HELLO.png + + + + HELLO_Gen + Hello engine + + + hello + Vadim SANDLER + @VERSION@ + Hello function + 1 + + + study + Study + study + + + name + string + user name + + + + + return + status + operation status + + + + + + goodbye + Vadim SANDLER + @VERSION@ + Goodbye function + 0 + + + study + Study + study + + + name + string + user name + + + + + return + status + operation status + + + + + + + + diff --git a/resources/Makefile.am b/resources/Makefile.am index ab665ba..fd4f412 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -1,32 +1,31 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # $Header$ # include $(top_srcdir)/adm_local/unix/make_common_starter.am dist_salomeres_DATA = \ -SalomeApp.xml \ HELLO.png \ -ExecHELLO.png +handshake.png \ +goodbye.png \ +testme.png # VSR: little trick to avoid putting if HELLOCatalog.xml to the distribution archive -nodist_salomeres_SCRIPTS = HELLOCatalog.xml +nodist_salomeres_SCRIPTS = HELLOCatalog.xml SalomeApp.xml diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml.in similarity index 64% rename from resources/SalomeApp.xml rename to resources/SalomeApp.xml.in index e3dc963..6162805 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml.in @@ -1,5 +1,5 @@ - - + + + +
- + +
+
+ +
diff --git a/resources/goodbye.png b/resources/goodbye.png new file mode 100644 index 0000000000000000000000000000000000000000..849fe21a4ab3c000db3fca8fc5ad5467eb921924 GIT binary patch literal 2244 zcmV;#2s`(QP)Wx8C#_wr|~f-ItBAt}$y%sw5*(a(c+SOQ|eUJbyH zzkc@}4?On6N68g7@y4tF;-^pjhGZrWGC|m^5{Gq!u-tw3SGeVi`$;4-9C+pBp&vc| zlkdEJ{G<>30;mJgr5~495cb{Qdhmht<{i7q^%l5(*ChM)OyY=`IP__ID@1_@QsAaD zxS3w0QtZ8P7mqyrV9)5trtbqo>tqq12tWwYmO`TAnC8j_g0(W}7#;dptFbyn7=x=E zMur9eLFCtIRF-Lbt8CePP0y!xY(F*FUw8@F3nbU?`>}4d)*_`KYPV>u6$x8)bQE^v zv=*y10)em=t7ELugv}~*ADm`kd5vHH>X*Fu{NL7}n@JMJkqhM3N5J_cg}_>iwiazJ0(8iXu^3~q zwv%Nhj;O5^$z*b1EkV6Py;35d%_M+Cw?1&i5wJpbyx_RFsWd&k9j9v@5o?1sV2wp< zgT;b$ST3(n^E@nuuvMkyH3;LFOS9k#BOvkXtF-)pRy$_wnqe9>kD00CSlyn%8U?!PsA*KK8;4@3y_W?RzKROTTmCgd8gLkjZ37xJgtZ ziIiOl0E9#c*)^O*NQsn^Og4+(Y*4S&#Gxa{#JLN_XD$U0{rSSg@X)~i@y*xL+mn@8 z0|HbcNhX`iY##2DUZci=gKu(vsmMToo_xL^C*dN51R)SYA(eyd>TI;eL_XF;_^k%j zYL!DrkFgN|Q5;9E>rM{z=SR0qj0-8OKv;y7B-|{0g+T`MY0|FbwKv}8^z6(g>*W#!0HIoZW4uU z+Ch_`<>A#EESE~mOwaP%ONUyeTo*-`C0S4;v1H5CSO_LI6f%bVxf4Xa_CAphb1H!s6m0wMLEk z`FY+vG3}o(uKo!)2~>ghMgSM3Xe%jC&z)b2T0wBba(J z6w+$7@H~%JqeiJzWMOdu&#Tk)JYIPDaD4EsQ?CMl1WMf&J-!@3xB0QY6yoIjGiMvG z{O4%0QLm4W4EE8JO{0yb-3|!+7WI0adZR(3R->_2p|V!s((8~e<7z=@bDL0{xesK0e=Ge*U&rVIx;`=^c!^3a+SRK)BH3|JD zOG``4&7EcT%skU`7nq$}tiL;b?jNx>zmK&(4HVa({v++t%6U^n_P)J5H>d8#T7NJ0l?M0_lw|r~d`@-ZrYr S8hHr-0000~kCIW%_B8zuS65Za=V# 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 +#include CORBA_CLIENT_HEADER(SALOMEDS) +#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes) + +#include #include +namespace { + static std::string studyName( const std::string& name ) + { + std::string fullName = "/Hello/"; + fullName += name; + return fullName; + } +} -//============================================================================= /*! - * standard constructor - */ -//============================================================================= - -HELLO::HELLO(CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName) : - Engines_Component_i(orb, poa, contId, instanceName, interfaceName) + \brief Constructor + + Creates an instance of the HELLO component engine + + \param orb reference to the ORB + \param poa reference to the POA + \param contId CORBA object ID, pointing to the owner SALOME container + \param instanceName SALOME component instance name + \param interfaceName SALOME component interface name +*/ +HELLO::HELLO( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ) + : Engines_Component_i( orb, poa, contId, instanceName, interfaceName ) { - MESSAGE("activate object"); - _thisObj = this ; - _id = _poa->activate_object(_thisObj); + _thisObj = this; + _id = _poa->activate_object( _thisObj ); // register and activate this servant object } +/*! + \brief Destructor + + Clean up allocated resources +*/ HELLO::~HELLO() { + // nothing to do } +/*! + \brief Say hello to \a name + \param study SALOME study + \param name person's name + \return operation status +*/ +HELLO_ORB::status HELLO::hello( SALOMEDS::Study_ptr study, const char* name ) +{ + // set exception handler to catch unexpected CORBA exceptions + Unexpect aCatch(SALOME_SalomeException); + + // set result status to error initially + HELLO_ORB::status result = HELLO_ORB::OP_ERR_UNKNOWN; + + // check if reference to study is valid + if ( !CORBA::is_nil( study ) ) { + // get full object path + std::string fullName = studyName( name ); + // check if the object with the same name is already registered in the study + SALOMEDS::SObject_var sobj = study->FindObjectByPath( fullName.c_str() ); + if ( !CORBA::is_nil( sobj ) ) { + // person is already registered in the study -> ERROR + result = HELLO_ORB::OP_ERR_ALREADY_MET; + } + else { + // person is not registered yet -> register + SALOMEDS::StudyBuilder_var studyBuilder = study->NewBuilder(); // study builder + SALOMEDS::UseCaseBuilder_var useCaseBuilder = study->GetUseCaseBuilder(); // use case builder + + // find HELLO component; create it if not found + SALOMEDS::SComponent_var father = study->FindComponent( "HELLO" ); + if ( CORBA::is_nil( father ) ) { + // create component + father = studyBuilder->NewComponent( "HELLO" ); + // set name attribute + father->SetAttrString( "AttributeName", "Hello" ); + // set icon attribute + father->SetAttrString( "AttributePixMap", "ICON_HELLO" ); + // register component in the study + studyBuilder->DefineComponentInstance( father, HELLO_Gen::_this() ); + // add component to the use case tree + // (to support tree representation customization and drag-n-drop) + useCaseBuilder->SetRootCurrent(); + useCaseBuilder->Append( father ); // component object is added as the top level item + } + + // create new sub-object, as a child of the component object + sobj = studyBuilder->NewObject( father ); + sobj->SetAttrString( "AttributeName", name ); + // add object to the use case tree + // (to support tree representation customization and drag-n-drop) + useCaseBuilder->AppendTo( father, sobj ); -char* HELLO::makeBanner(const char* name) + // cleanup + father->UnRegister(); + sobj->UnRegister(); + + // set operation status + result = HELLO_ORB::OP_OK; + } + } + + // return result of the operation + return result; +} + +/*! + \brief Say goodbye to \a name + \param study SALOME study + \param name person's name + \return operation status +*/ +HELLO_ORB::status HELLO::goodbye( SALOMEDS::Study_ptr study, const char* name ) { - string banner="Hello, "; - banner+=name; - return CORBA::string_dup(banner.c_str()); + // set exception handler to catch unexpected CORBA exceptions + Unexpect aCatch(SALOME_SalomeException); + + // set result status to error initially + HELLO_ORB::status result = HELLO_ORB::OP_ERR_UNKNOWN; + + // check if reference to study is valid + if ( !CORBA::is_nil( study ) ) { + // get full object path + std::string fullName = studyName( name ); + + // initially set error status: person is not registered + result = HELLO_ORB::OP_ERR_DID_NOT_MEET; + + // check if the object with the same name is registered in the study + // find all objects with same name + SALOMEDS::StudyBuilder_var studyBuilder = study->NewBuilder(); // study builder + SALOMEDS::UseCaseBuilder_var useCaseBuilder = study->GetUseCaseBuilder(); // use case builder + SALOMEDS::SObject_var sobj = study->FindObjectByPath( fullName.c_str() ); + while ( !CORBA::is_nil( sobj ) ) { + std::list toRemove; + toRemove.push_back( sobj ); + SALOMEDS::UseCaseIterator_var useCaseIt = useCaseBuilder->GetUseCaseIterator( sobj ); // use case iterator + for ( useCaseIt->Init( true ); useCaseIt->More(); useCaseIt->Next() ) + toRemove.push_back( useCaseIt->Value() ); + // perform removing of all found objects (recursively with children) + std::list::const_iterator it; + for( it = toRemove.begin(); it != toRemove.end(); ++it ) { + sobj = *it; + // remove object from the study + // - normally it's enough to call RemoveObject() method + // RemoveObject`WithChildren() also removes all children recursively if there are any + // - it's not necessary to remove it from use case builder, it is done automatically + studyBuilder->RemoveObjectWithChildren( sobj ); + + // cleanup + sobj->UnRegister(); + + // set operation status to OK as at least one object is removed + result = HELLO_ORB::OP_OK; + } + sobj = study->FindObjectByPath( fullName.c_str() ); + } + } + + // return result of the operation + return result; } +/*! + \brief Copy or move objects to the specified position + + This function is used in the drag-n-drop functionality. + + \param what objects being copied/moved + \param where parent object where objects are copied/moved to + \param row position in the parent object's children list at which objects are copied/moved + \param isCopy \c true if object are copied or \c false otherwise +*/ +void HELLO::copyOrMove( const HELLO_ORB::object_list& what, + SALOMEDS::SObject_ptr where, + CORBA::Long row, CORBA::Boolean isCopy ) +{ + if ( CORBA::is_nil( where ) ) return; // bad parent + SALOMEDS::Study_var study = where->GetStudy(); // study + SALOMEDS::StudyBuilder_var studyBuilder = study->NewBuilder(); // study builder + SALOMEDS::UseCaseBuilder_var useCaseBuilder = study->GetUseCaseBuilder(); // use case builder + SALOMEDS::SComponent_var father = where->GetFatherComponent(); // father component + std::string dataType = father->ComponentDataType(); + if ( dataType != "HELLO" ) return; // not a HELLO component + + SALOMEDS::SObject_var objAfter; + if ( row >= 0 && useCaseBuilder->HasChildren( where ) ) { + // insert at given row -> find insertion position + SALOMEDS::UseCaseIterator_var useCaseIt = useCaseBuilder->GetUseCaseIterator( where ); + int i; + for ( i = 0; i < row && useCaseIt->More(); i++, useCaseIt->Next() ); + if ( i == row && useCaseIt->More() ) { + objAfter = useCaseIt->Value(); + } + } + + for ( int i = 0; i < what.length(); i++ ) { + SALOMEDS::SObject_var sobj = what[i]; + if ( CORBA::is_nil( sobj ) ) continue; // skip bad object + if ( isCopy ) { + // copying is performed + // get name of the object + CORBA::String_var name = sobj->GetName(); + // create new object, as a child of the component object + SALOMEDS::SObject_var new_sobj = studyBuilder->NewObject( father ); + new_sobj->SetAttrString( "AttributeName", name.in() ); + sobj = new_sobj; + } + // insert the object or its copy to the use case tree + if ( !CORBA::is_nil( objAfter ) ) + useCaseBuilder->InsertBefore( sobj, objAfter ); // insert at given row + else + useCaseBuilder->AppendTo( where, sobj ); // append to the end of list + } +} extern "C" { - PortableServer::ObjectId * HELLOEngine_factory( - CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName) + /*! + \brief Exportable factory function: create an instance of the HELLO component engine + \param orb reference to the ORB + \param poa reference to the POA + \param contId CORBA object ID, pointing to the owner SALOME container + \param instanceName SALOME component instance name + \param interfaceName SALOME component interface name + \return CORBA object identifier of the registered servant + */ + PortableServer::ObjectId* HELLOEngine_factory( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ) { - MESSAGE("PortableServer::ObjectId * HELLOEngine_factory()"); - SCRUTE(interfaceName); - HELLO * myHELLO - = new HELLO(orb, poa, contId, instanceName, interfaceName); - return myHELLO->getId() ; + HELLO* component = new HELLO( orb, poa, contId, instanceName, interfaceName ); + return component->getId(); } } diff --git a/src/HELLO/HELLO.hxx b/src/HELLO/HELLO.hxx index e37ad37..01d892c 100644 --- a/src/HELLO/HELLO.hxx +++ b/src/HELLO/HELLO.hxx @@ -1,57 +1,56 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + #ifndef _HELLO_HXX_ #define _HELLO_HXX_ #include #include CORBA_SERVER_HEADER(HELLO_Gen) -#include "SALOME_Component_i.hxx" +#include class HELLO: public POA_HELLO_ORB::HELLO_Gen, public Engines_Component_i { - public: - HELLO(CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName); - virtual ~HELLO(); - - // - - char* makeBanner(const char* name); - + HELLO( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ); + virtual ~HELLO(); + + HELLO_ORB::status hello ( SALOMEDS::Study_ptr study, const char* name ); + HELLO_ORB::status goodbye( SALOMEDS::Study_ptr study, const char* name ); + void copyOrMove( const HELLO_ORB::object_list& what, + SALOMEDS::SObject_ptr where, + CORBA::Long row, CORBA::Boolean isCopy ); }; extern "C" - PortableServer::ObjectId * HELLOEngine_factory( - CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName); - +PortableServer::ObjectId* HELLOEngine_factory( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ); #endif diff --git a/src/HELLO/Makefile.am b/src/HELLO/Makefile.am index 54fe4af..5a93b3b 100755 --- a/src/HELLO/Makefile.am +++ b/src/HELLO/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # SuperVisionTest AddComponent : example of component that adds two numbers # File : Makefile.in # Author : , CEA @@ -38,8 +36,7 @@ libHELLOEngine_la_CPPFLAGS = \ $(CORBA_CXXFLAGS) \ $(CORBA_INCLUDES) \ $(KERNEL_CXXFLAGS) \ - -I$(top_builddir)/idl \ - -I$(top_builddir)/salome_adm/unix + -I$(top_builddir)/idl libHELLOEngine_la_LDFLAGS = \ ../../idl/libSalomeIDLHELLO.la \ diff --git a/src/HELLOGUI/HELLOGUI.cxx b/src/HELLOGUI/HELLOGUI.cxx index cd43b10..8d88e49 100644 --- a/src/HELLOGUI/HELLOGUI.cxx +++ b/src/HELLOGUI/HELLOGUI.cxx @@ -1,148 +1,910 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + #include "HELLOGUI.h" +#include "HELLO_version.h" + +#include +#include +#include + +#include #include #include #include -#include + +#include + +#include #include +#include +#include -// QT Includes #include -#include -using namespace std; +//! The only instance of the reference to engine +HELLO_ORB::HELLO_Gen_var HELLOGUI::myEngine; + +/*! + \brief Constructor + + Creates an instance of the HELLO GUI module. + Initializes (loads if necessary) HELLO module engine. -// Constructor + \note Since SalomeApp_Module uses virtual inheritance + from LightApp_Module class, it's necessary to call both + base classes constructors, even though HELLOGUI class + inherits directly only SalomeApp_Module. +*/ HELLOGUI::HELLOGUI() : - SalomeApp_Module( "HELLO" ) // default name + SalomeApp_Module( "HELLO" ), // module name + LightApp_Module( "HELLO" ) // module name { + init(); // internal initialization } -// Gets an reference to the module's engine -HELLO_ORB::HELLO_Gen_ptr HELLOGUI::InitHELLOGen( SalomeApp_Application* app ) +/*! + \brief Destructor + + Destroys any allocated resources. +*/ +HELLOGUI::~HELLOGUI() { - Engines::Component_var comp = app->lcc()->FindOrLoad_Component( "FactoryServer","HELLO" ); - HELLO_ORB::HELLO_Gen_ptr clr = HELLO_ORB::HELLO_Gen::_narrow(comp); - ASSERT(!CORBA::is_nil(clr)); - return clr; + // nothing to do } -// Module's initialization -void HELLOGUI::initialize( CAM_Application* app ) +/*! + \brief Get a reference to the HELLO module CORBA engine + + \note This function returns vartype in order to minimize possible crashes + when using this function with assignment operations. + On the other hand, this simplifies usage of this function when using it outside + the assignment operations, to minimize memory leaks caused by orphan CORBA + references (no need to take care of reference counting). + + \return reference to the module engine +*/ +HELLO_ORB::HELLO_Gen_var HELLOGUI::engine() { + init(); // initialize engine, if necessary + return myEngine; +} - SalomeApp_Module::initialize( app ); +/*! + \brief Module initialization. + + Overloaded from CAM_Module class. + + Perform general module initialization (like creation of actions, + menus, toolbars, etc). - InitHELLOGen( dynamic_cast( app ) ); + \note This function is invoked only once per study, when the module + is first time activated by the user. + The study associated with the application might not exist + (created or opened) when this function is invoked, so it is not + recommended to perform any study-dependant actions here. - QWidget* aParent = application()->desktop(); - SUIT_ResourceMgr* aResourceMgr = app->resourceMgr(); + \param app pointer to the current application instance +*/ +void HELLOGUI::initialize( CAM_Application* app ) +{ + // call the parent implementation + SalomeApp_Module::initialize( app ); + + // get reference to the desktop (used as a parent for actions) + QWidget* dsk = app->desktop(); + // get resources manager + SUIT_ResourceMgr* resMgr = app->resourceMgr(); // create actions - createAction( 190, tr( "TLT_MY_NEW_ITEM" ), QIcon(), tr( "MEN_MY_NEW_ITEM" ), tr( "STS_MY_NEW_ITEM" ), 0, aParent, false, - this, SLOT( OnMyNewItem() ) ); - QPixmap aPixmap = aResourceMgr->loadPixmap( "HELLO",tr( "ICON_GET_BANNER" ) ); - createAction( 901, tr( "TLT_GET_BANNER" ), QIcon( aPixmap ), tr( "MEN_GET_BANNER" ), tr( "STS_GET_BANNER" ), 0, aParent, false, - this, SLOT( OnGetBanner() ) ); + // ... Test me operation + createAction( OpTestMe, // operation id + tr( "TLT_OP_TESTME" ), // tooltip + resMgr->loadPixmap( "HELLO",tr( "ICON_OP_TESTME" ) ), // icon + tr( "MEN_OP_TESTME" ), // menu title + tr( "STS_OP_TESTME" ), // status tip + 0, // accelerator (not set) + dsk, // parent + false, // togglable flag (no) + this, // action receiver + SLOT( testMe() ) ); // action slot + // ... Hello operation + createAction( OpHello, // operation id + tr( "TLT_OP_HELLO" ), // tooltip + resMgr->loadPixmap( "HELLO",tr( "ICON_OP_HELLO" ) ), // icon + tr( "MEN_OP_HELLO" ), // menu title + tr( "STS_OP_HELLO" ), // status tip + 0, // accelerator (not set) + dsk, // parent + false, // togglable flag (no) + this, // action receiver + SLOT( hello() ) ); // action slot + // ... Goodbye operation + createAction( OpGoodbye, // operation id + tr( "TLT_OP_GOODBYE" ), // tooltip + resMgr->loadPixmap( "HELLO",tr( "ICON_OP_GOODBYE" ) ), // icon + tr( "MEN_OP_GOODBYE" ), // menu title + tr( "STS_OP_GOODBYE" ), // status tip + 0, // accelerator (not set) + dsk, // parent + false, // togglable flag (no) + this, // action receiver + SLOT( goodbye() ) ); // action slot // create menus - int aMenuId; - aMenuId = createMenu( tr( "MEN_FILE" ), -1, -1 ); - createMenu( separator(), aMenuId, -1, 10 ); - aMenuId = createMenu( tr( "MEN_FILE_HELLO" ), aMenuId, -1, 10 ); - createMenu( 190, aMenuId ); - - aMenuId = createMenu( tr( "MEN_HELLO" ), -1, -1, 30 ); - createMenu( 901, aMenuId, 10 ); + int menuId; + menuId = createMenu( tr( "MEN_FILE" ), -1, -1 ); // File menu + createMenu( separator(), menuId, -1, 10 ); // add separator to File menu + menuId = createMenu( tr( "MEN_FILE_HELLO" ), menuId, -1, 10 ); // File - Hello submenu + createMenu( OpTestMe, menuId ); // File - Hello - Test me + menuId = createMenu( tr( "MEN_HELLO" ), -1, -1, 30 ); // Hello menu + createMenu( OpHello, menuId, 10 ); // Hello - Hello + createMenu( OpGoodbye, menuId, 10 ); // Hello - Goodbye // create toolbars - int aToolId = createTool ( tr( "TOOL_HELLO" ) ); - createTool( 901, aToolId ); + int aToolId; + aToolId = createTool ( tr( "TOOL_TEST" ) ); // Test toolbar + createTool( OpTestMe, aToolId ); // Test - Test me + aToolId = createTool ( tr( "TOOL_HELLO" ) ); // Hello toolbar + createTool( OpHello, aToolId ); // Hello - Hello + createTool( OpGoodbye, aToolId ); // Hello - Goodbye + + // set-up popup menu + QtxPopupMgr* mgr = popupMgr(); + mgr->insert( action( OpHello ), -1, -1 ); // Hello + mgr->insert( action( OpGoodbye ), -1, -1 ); // Goodbye + mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( OpTestMe ), -1, -1 ); // Test me + QString baseRule = "client='ObjectBrowser' and selcount=1 and $component={'HELLO'}"; + mgr->setRule( action( OpHello ), baseRule + " and isComponent", QtxPopupMgr::VisibleRule ); + mgr->setRule( action( OpGoodbye ), baseRule + " and !isComponent", QtxPopupMgr::VisibleRule ); } -// Module's engine IOR +/*! + \brief Get module engine IOR + + Overloaded from SalomeApp_Module class. + + \return string representing module engine IOR +*/ QString HELLOGUI::engineIOR() const { - CORBA::String_var anIOR = getApp()->orb()->object_to_string( InitHELLOGen( getApp() ) ); + init(); // initialize engine, if necessary + CORBA::String_var anIOR = getApp()->orb()->object_to_string( myEngine.in() ); return QString( anIOR.in() ); } -// Module's activation +/*! + \brief Get module icon. + + Overloaded from CAM_Module class. + + Load and return the module icon pixmap. This icon is shown + in the Object browser, in modules toolbar, etc. + + Default implementation uses iconName() function to retrieve the name + of the image file to be used as the module icon; tries to load this + file from module's resources and create pixmap from it. + Returns valid QPixmap instance if image is loaded correctly. + This function can be customized to provide another way to get module icon. + + \return module icon pixmap + \sa iconName() +*/ +QPixmap HELLOGUI::moduleIcon() const +{ + // nothing to do, in this example just call the parent implementation + return SalomeApp_Module::moduleIcon(); +} + +/*! + \brief Get module icon's file name. + + Overloaded from CAM_Module class. + + This function is used to get module icon image file name. + Default implementation tries to retrieve the name of the + icon file from the application using moduleIcon() function, which + in its turn retrieves the information about the module icon + from the configuration file (e.g. SalomeApp.xml, LightApp.xml). + This function can be customized to provide another way to get module icon's + file name. + + \return module icon file name + \sa moduleIcon() +*/ +QString HELLOGUI::iconName() const +{ + // nothing to do, in this example just call the parent implementation + return SalomeApp_Module::iconName(); +} + +/*! + \brief Request dockable windows to be available when module is active. + + Overloaded from LightApp_Module class. + + Fills and returns the list of dockable windows which should be + available when the module is active. It is a map of integer values + where \c key is an enumerator from LightApp_Application::WindowTypes + enumeration, specifying window type, and \c value is an enumerator + from Qt::DockWidgetArea, specifying the window's default position + in the main window layout. + + Empty map means no dockable windows available when the module is active. + + \param theMap this map should be filled to specify the list of + required dockable windows withe their default positions +*/ +void HELLOGUI::windows( QMap& theMap ) const +{ + // want Object browser, in the left area + theMap.insert( SalomeApp_Application::WT_ObjectBrowser, + Qt::LeftDockWidgetArea ); + // want Python console, in the bottom area + theMap.insert( SalomeApp_Application::WT_PyConsole, + Qt::BottomDockWidgetArea ); +} + +/*! + \brief Request view windows (types) to be activated when module is activated.. + + Overloaded from LightApp_Module class. + + Fills and returns the list of 3D/2D view windows types compatible + with this module. The views of the specified type(s) will be automatically + activated (raised to the top of view stack) each time when the module + is activated by the user (the views will be automatically created if they + do not exist at the module activation). + Empty list means no compatible view windows for the module. + + Example: + \code + theList.append( OCCViewer_Viewer::Type() ); + theList.append( SVTK_Viewer::Type() ); + \endcode + + \param theList this list should be filled to specify the list of + compatible view window types +*/ +void HELLOGUI::viewManagers( QStringList& /*theList*/ ) const +{ + // no compatible view managers, nothing to do here +} + +/*! + \brief Create popup selection handler. + + Overloaded from LightApp_Module class. + + This function can be used to create custom popup menu handler. + The application takes ownership over the returned pointer, + so you should not destroy it. + + This function is part of the context popup menu management mechanism. + Selection object (instance of LightApp_Selection class or its successor) + analizes the currently selected items and defines selection-dependant + variables which are processed by the popup manager (QtxPopupMgr class). + + These variables can be included into the lexical constructions, named + "rules", which are associated with the popup menu actions (refer to the + QtxPopupMgr class for more details). + + Exampe: + \code + // obtain popup manager + QtxPopupMgr* mgr = popupMgr(); + // create new action, with ID = 100 + createAction( 100, "Action", QIcon(), "Action", "My action", 0, application()->desktop(), + false, this, SLOT( OnMyAction() ) ); + // define popup rule for action + QString rule = "client='ObjectBrowser' and $type in {'MyType1' 'MyType2'} and selcount=1"; + // set visibility rule for action + mgr->setRule( 100, rule, QtxPopupMgr::VisibleRule ); + \endcode + + In the above code, \a selcount variable is automatically defined + by LightApp_Selection class, but \a type variable should be set by + the successor class. Note, that LightApp_Selection class implements + several useful variables which can be used in the lexical rules. + + \return new selection object + \sa contextMenuPopup() +*/ +LightApp_Selection* HELLOGUI::createSelection() const +{ + // nothing to do, in this example just call the parent implementation + // see also initialize() + return SalomeApp_Module::createSelection(); +} + +/*! + \brief Create displayer object. + + Overloaded from LightApp_Module class. + + This function can be used to create and return custom displayer object. + The application does not take the ownership over the returned value. + + Displayer is a part of the presentations management system. + If can be used to implement visualization operations, like create, show + or hide presentation in the viewer of specific type, etc. + + \return pointer to the module displayer + */ +LightApp_Displayer* HELLOGUI::displayer() +{ + // nothing to do, in this example just call the parent implementation + return SalomeApp_Module::displayer(); +} + +/*! + \brief Create context popup menu. + + Overloaded from CAM_Module class. + + This function can be used to customize context popup menu management. + The module should fill \a menu with the items (e.g. by inserting own + QAction items). The menu contents can be context-depending, the parameter + \a type can be used to test the context of the popup menu invocation + (e.g. "ObjectBrowser"). + Parameter \a title can be used to return the string value to be used + popup menu title if required. + + Default implementation from LightApp_Module class calls createSelection() + function to create popup selection handler and initialized the popup menu + using popup manager. + + \param type popup menu context + \param menu pointer to the popup menu + \param title custom popup menu title can be returned here + \sa createSelection() +*/ +void HELLOGUI::contextMenuPopup( const QString& type, QMenu* menu, QString& title ) +{ + // nothing to do, in this example just call the parent implementation + // see also initialize() + return SalomeApp_Module::contextMenuPopup( type, menu, title ); +} + +/*! + \brief Export module preferences. + + Overloaded from LightApp_Module class. + + This function is invoked only once when the common "Preferences" + dialog box is first time activated by the user (via the "File/Preferences" + menu command) or when module is first time activated. + + This function should be used to export module preferences to the + common "Preferences" dialog box and associate them with the corresponding + widgets. The preferences items are arranged to the tree-like structure, where + top-level items represent just a containers for the underlying items. + Each low-level preferences item is linked to the resources item (via "section" + and "parameter" attributes). See QtxResourceMgr class for more details about + resources management. + + Example: + \code + // create top-level preferences tab page + int settingsId = addPreference( "Settings" ); + // create general settings group box + int generalId = addPreference( tr( "General" ), settingsId ); + // set group box property - number of columns - to 2 + setPreferenceProperty( generalId, "columns", 2 ); + // create shading color preferences item (color button) + addPreference( "Shading color", generalId, LightApp_Preferences::Color, + "HELLO", "shading_color" ); + // create precision preferences item (spin box) + int precisionId = addPreference( tr( "GEOM_PREF_length_precision" ), generalId, + LightApp_Preferences::IntSpin, "HELLO", "precision" ); + // set precision preferences item properties + setPreferenceProperty( precisionId, "min", 0 ); + setPreferenceProperty( precisionId, "max", 10 ); + \endcode + + \sa preferencesChanged() +*/ +void HELLOGUI::createPreferences() +{ + // no module preferences, nothing to do here +} + +/*! + \brief Process preference item change event. + + Overloaded from LightApp_Module class. + + This function is called every time when the preference item + owned by this module is changed by the user (usually this occurs when + the user presses "OK" or "Apply" button in the "Preferences" dialog box). + + The module can perform any specific actions if necessary to response + to the preferences changes. + + \param section resources item section name + \param parameter resources item parameter name + + \sa createPreferences() +*/ +void HELLOGUI::preferencesChanged( const QString& section, const QString& parameter ) +{ + // nothing to do, in this example just call the parent implementation + SalomeApp_Module::preferencesChanged( section, parameter ); +} + +/*! + \brief Store visual state. + + Overloaded from SalomeApp_Module class. + + This method is called just before the study document is saved, + so the module has a possibility to store any visual parameters + in the AttributeParameter study attribute (if required). + + \param savePoint save point unique identifier +*/ +void HELLOGUI::storeVisualParameters( int /*savePoint*/ ) +{ + // no specific visual state, nothing to do here +} + +/*! + \brief Restore visual state. + + Overloaded from SalomeApp_Module class. + + This method is called after the study document is opened, + so the module has a possibility to restore the visual parameters + from the AttributeParameter study attribute (if required). + + \param savePoint save point unique identifier +*/ +void HELLOGUI::restoreVisualParameters( int /*savePoint*/ ) +{ + // no specific visual state, nothing to do here +} + +/*! + \brief Handle active study changing action. + + Overloaded from LightApp_Module class. + + This function is called each time when the active study is changed + (usually this happens when users switches between different studies' + desktops). + + Can be used to perform any relevant actions. +*/ +void HELLOGUI::studyActivated() +{ + // no any specific action required, nothing to do here +} + +/*! + \brief Check if the module can perform "copy" operation. + + Overloaded from LightApp_Module class. + + This function is a part of the general copy/paste mechanism. + + Can be re-implemented to customize the copy/paste handling + in the module. Default implementation returns \c false. + + \return \c true if the module can perform "copy" operation or \c false otherwise + \sa canPaste(), copy(), paste() +*/ +bool HELLOGUI::canCopy() const +{ + // copy/paste is not supported, in this example just call the parent implementation + return SalomeApp_Module::canCopy(); +} + +/*! + \brief Check if the module can perform "paste" operation. + + Overloaded from LightApp_Module class. + + This function is a part of the general copy/paste mechanism. + + Can be re-implemented to customize the copy/paste handling + in the module. Default implementation returns \c false. + + \return \c true if the module can perform "paste" operation or \c false otherwise + \sa canCopy(), copy(), paste() +*/ +bool HELLOGUI::canPaste() const +{ + // copy/paste is not supported, in this example just call the parent implementation + return SalomeApp_Module::canPaste(); +} + +/*! + \brief Perform "copy" operation. + + Overloaded from LightApp_Module class. + + This function is a part of the general copy/paste mechanism. + + Can be re-implemented to customize the copy/paste handling + in the module. Default implementation does nothing. + + \sa canCopy(), canPaste(), paste() +*/ +void HELLOGUI::copy() +{ + // copy/paste is not supported, nothing to do here +} + +/*! + \brief Perform "paste" operation. + + Overloaded from LightApp_Module class. + + This function is a part of the general copy/paste mechanism. + + Can be re-implemented to customize the copy/paste handling + in the module. Default implementation does nothing. + + \sa canCopy(), canPaste(), copy() +*/ +void HELLOGUI::paste() +{ + // copy/paste is not supported, nothing to do here +} + +/*! + \brief Check if the module allows "drag" operation of its objects. + + Overloaded from LightApp_Module class. + + This function is a part of the general drag-n-drop mechanism. + The goal of this function is to check data object passed as a parameter + and decide if it can be dragged or no. + + \param what data object being tested for drag operation + \return \c true if module allows dragging of the specified object + \sa isDropAccepted(), dropObjects() +*/ +bool HELLOGUI::isDraggable( const SUIT_DataObject* what ) const +{ + // we allow dragging any HELLO object, except the top-level component + const SalomeApp_ModuleObject* aModObj = dynamic_cast( what ); + return ( aModObj == 0 ); +} + +/*! + \brief Check if the module allows "drop" operation on the given object. + + Overloaded from LightApp_Module class. + + This function is a part of the general drag-n-drop mechanism. + The goal of this function is to check data object passed as a parameter + and decide if it can be used as a target for the "drop" operation. + The processing of the drop operation itself is done in the dropObjects() function. + + \param where target data object + \return \c true if module supports dropping on the \a where data object + \sa isDraggable(), dropObjects() +*/ +bool HELLOGUI::isDropAccepted( const SUIT_DataObject* where ) const +{ + // we allow dropping of all objects + // (temporarily implementation, we also need to check objects being dragged) + return true; +} + +/*! + \brief Complete drag-n-drop operation. + + Overloaded from LightApp_Module class. + + This function is a part of the general drag-n-drop mechanism. + Its goal is to handle dropping of the objects being dragged according + to the chosen operation (copy or move). The dropping is performed in the + context of the parent data object \a where and the \a row (position in the + children index) at which the data should be dropped. If \a row is equal to -1, + this means that objects are added to the end of the children list. + + \param what objects being dropped + \param where target data object + \param row child index at which the drop operation is performed + \param action drag-n-drop operation (Qt::DropAction) - copy or move + + \sa isDraggable(), isDropAccepted() +*/ +void HELLOGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where, + const int row, Qt::DropAction action ) +{ + if (action != Qt::CopyAction && action != Qt::MoveAction) + return; // unsupported action + + // get parent object + SalomeApp_DataObject* dataObj = dynamic_cast( where ); + if ( !dataObj ) return; // wrong parent + _PTR(SObject) parentObj = dataObj->object(); + + // collect objects being dropped + HELLO_ORB::object_list_var objects = new HELLO_ORB::object_list(); + objects->length( what.count() ); + int count = 0; + for ( int i = 0; i < what.count(); i++ ) { + dataObj = dynamic_cast( what[i] ); + if ( !dataObj ) continue; // skip wrong objects + _PTR(SObject) sobj = dataObj->object(); + objects[i] = _CAST(SObject, sobj)->GetSObject(); + count++; + } + objects->length( count ); + + // call engine function + engine()->copyOrMove( objects.in(), // what + _CAST(SObject, parentObj)->GetSObject(), // where + row, // row + action == Qt::CopyAction ); // isCopy + + // update Object browser + getApp()->updateObjectBrowser( false ); +} + +/*! + \brief Module activation. + + Overloaded from CAM_Module class. + + This function is called each time the module is activated + by the user. It is usually used to perform any relevant actions, + like displaying menus and toolbars, connecting specific signals/slots, etc. + + \param theStudy current study object + \return \c true if activation is completed correctly or \c false + if module activation fails + + \sa deactivateModule() +*/ bool HELLOGUI::activateModule( SUIT_Study* theStudy ) { + // call parent implementation bool bOk = SalomeApp_Module::activateModule( theStudy ); + // show own menus setMenuShown( true ); + // show own toolbars setToolShown( true ); + // return the activation status return bOk; } -// Module's deactivation +/*! + \brief Module deactivation. + + Overloaded from CAM_Module class. + + This function is called each time the module is deactivated + by the user. It is usually used to perform any relevant actions, + like hiding menus and toolbars, disconnecting specific signals/slots, etc. + + \param theStudy current study object + \return \c true if deactivation is completed correctly or \c false + if module deactivation fails + + \sa activateModule() +*/ bool HELLOGUI::deactivateModule( SUIT_Study* theStudy ) { + // hide own menus setMenuShown( false ); + // hide own toolbars setToolShown( false ); + // call parent implementation and return the activation status return SalomeApp_Module::deactivateModule( theStudy ); } -// Default windows -void HELLOGUI::windows( QMap& theMap ) const +/*! + \brief Create specific operation object. + + Overloaded from LightApp_Module class. + + This function is a part of operation management mechanism. + It can be used to create module specific operations, if module + implements transaction handling basing on the GUI operations instances. + + This function is automatically called from startOperation() function. + After operation is created, it can be started/stopped/paused/resumed etc. + Compatibility between diferent simultaneously running operations is also + checked by invoking of the corresponding methods of the LightApp_Operation + class. + + The application takes ownership over the returned pointer, + so you should not destroy it. + + Default implementation in LightApp_Module class processes common Show/Hide + operations. + + \param id unique operation identifier + \return new operation object +*/ +LightApp_Operation* HELLOGUI::createOperation( const int id ) const { - theMap.clear(); - theMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea ); - theMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea ); + // no specific operations, in this example just call the parent implementation + return SalomeApp_Module::createOperation( id ); } -// Action slot -void HELLOGUI::OnMyNewItem() +/*! + \brief Action slot: Test me +*/ +void HELLOGUI::testMe() { - SUIT_MessageBox::warning( getApp()->desktop(),tr( "INF_HELLO_BANNER" ), tr( "INF_HELLO_MENU" ) ); + SUIT_MessageBox::information( getApp()->desktop(), + tr( "INF_TESTME_TITLE" ), + tr( "INF_TESTME_MSG" ), + tr( "BUT_OK" ) ); } -// Action slot -void HELLOGUI::OnGetBanner() +/*! + \brief Action slot: Hello +*/ +void HELLOGUI::hello() { - // Dialog to get the Name - bool ok = FALSE; - QString myName = QInputDialog::getText( getApp()->desktop(), tr( "QUE_HELLO_LABEL" ), tr( "QUE_HELLO_NAME" ), - QLineEdit::Normal, QString::null, &ok ); + SalomeApp_Study* study = dynamic_cast( application()->activeStudy() ); + _PTR(Study) studyDS = study->studyDS(); - if ( ok && !myName.isEmpty()) // if we got a name, get a HELLO component and ask for makeBanner - { - HELLO_ORB::HELLO_Gen_ptr hellogen = HELLOGUI::InitHELLOGen( getApp() ); - QString banner = hellogen->makeBanner( (const char*)myName.toLatin1() ); - SUIT_MessageBox::information( getApp()->desktop(), tr( "INF_HELLO_BANNER" ), banner, tr( "BUT_OK" ) ); + // request user name + bool ok; + QString name = QInputDialog::getText( getApp()->desktop(), tr( "QUE_HELLO_TITLE" ), tr( "QUE_ENTER_NAME" ), + QLineEdit::Normal, QString::null, &ok ); + + if ( ok && !name.trimmed().isEmpty() ) { + // say hello to SALOME + HELLO_ORB::status status = engine()->hello( _CAST(Study, studyDS)->GetStudy(), (const char*)name.toLatin1() ); + + // update Object browser + getApp()->updateObjectBrowser(true); + + // process operation status + switch( status ) { + case HELLO_ORB::OP_OK: + // everything's OK + SUIT_MessageBox::information( getApp()->desktop(), + tr( "INF_HELLO_TITLE" ), + tr( "INF_HELLO_MSG" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_ALREADY_MET: + // error: already said hello + SUIT_MessageBox::warning( getApp()->desktop(), + tr( "INF_HELLO_TITLE" ), + tr( "ERR_HELLO_ALREADY_MET" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_UNKNOWN: + default: + // other errors + SUIT_MessageBox::critical( getApp()->desktop(), + tr( "INF_HELLO_TITLE" ), + tr( "ERR_ERROR" ), + tr( "BUT_OK" ) ); + break; + } + } +} + +/*! + \brief Action slot: Goodbye +*/ +void HELLOGUI::goodbye() +{ + SalomeApp_Application* app = dynamic_cast( application() ); + SalomeApp_Study* study = dynamic_cast( application()->activeStudy() ); + _PTR(Study) studyDS = study->studyDS(); + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + + QString name; + + // get selection + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + if ( selected.Extent() == 1 ) { + Handle(SALOME_InteractiveObject) io = selected.First(); + _PTR(SObject) so = studyDS->FindObjectID( io->getEntry() ); + if ( so ) { + _PTR(SComponent) comp = so->GetFatherComponent(); + if ( comp && comp->ComponentDataType() == "HELLO" && io->getEntry() != comp->GetID() ) { + name = so->GetName().c_str(); + } + } + } + + // request user name if not specified + if ( name.isEmpty() ) { + bool ok; + name = QInputDialog::getText( getApp()->desktop(), tr( "QUE_GOODBYE_TITLE" ), tr( "QUE_ENTER_NAME" ), + QLineEdit::Normal, QString::null, &ok ); + } + + if ( !name.trimmed().isEmpty() ) { + // say goodby to SALOME + HELLO_ORB::status status = engine()->goodbye( _CAST(Study, studyDS)->GetStudy(), (const char*)name.toLatin1() ); + + // update Object browser + getApp()->updateObjectBrowser(true); + + // process operation status + switch( status ) { + case HELLO_ORB::OP_OK: + // everything's OK + SUIT_MessageBox::information( getApp()->desktop(), + tr( "INF_GOODBYE_TITLE" ), + tr( "INF_GOODBYE_MSG" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_DID_NOT_MEET: + // error: did not say hello yet + SUIT_MessageBox::warning( getApp()->desktop(), + tr( "INF_GOODBYE_TITLE" ), + tr( "ERR_GOODBYE_DID_NOT_MEET" ).arg( name ), + tr( "BUT_OK" ) ); + break; + case HELLO_ORB::OP_ERR_UNKNOWN: + default: + // other errors + SUIT_MessageBox::critical( getApp()->desktop(), + tr( "INF_GOODBYE_TITLE" ), + tr( "ERR_ERROR" ), + tr( "BUT_OK" ) ); + break; + } + } +} + +/*! + \brief Perform internal initialization + + In particular, this function initializes module engine. +*/ +void HELLOGUI::init() +{ + // initialize HELLO module engine (load, if necessary) + if ( CORBA::is_nil( myEngine ) ) { + Engines::EngineComponent_var comp = + SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "HELLO" ); + myEngine = HELLO_ORB::HELLO_Gen::_narrow( comp ); } } // Export the module extern "C" { + // FACTORY FUNCTION: create an instance of the Hello module GUI CAM_Module* createModule() { return new HELLOGUI(); } + // VERSIONING FUNCTION: get Hello module's version identifier + char* getModuleVersion() + { + return (char*)HELLO_VERSION_STR; // HELLO_VERSION_STR is defined in HELLO_version.h + } } diff --git a/src/HELLOGUI/HELLOGUI.h b/src/HELLOGUI/HELLOGUI.h index c875ae3..45f2699 100644 --- a/src/HELLOGUI/HELLOGUI.h +++ b/src/HELLOGUI/HELLOGUI.h @@ -1,26 +1,27 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// HELLOGUI : HELLO component GUI implemetation +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// HELLOGUI : HELLO component GUI implemetation + #ifndef _HELLOGUI_H_ #define _HELLOGUI_H_ @@ -30,26 +31,73 @@ #include CORBA_CLIENT_HEADER(HELLO_Gen) class SalomeApp_Application; + class HELLOGUI: public SalomeApp_Module { Q_OBJECT + //! operations + enum { + OpTestMe = 190, //!< Test me + OpHello = 901, //!< Hello + OpGoodbye = 902, //!< Goodbye + }; + public: HELLOGUI(); + ~HELLOGUI(); + + static HELLO_ORB::HELLO_Gen_var engine(); + + virtual void initialize( CAM_Application* app ); + virtual QString engineIOR() const; + + virtual QPixmap moduleIcon() const; + virtual QString iconName() const; + + virtual void windows( QMap& theMap ) const; + virtual void viewManagers( QStringList& theList ) const; - void initialize( CAM_Application* ); - QString engineIOR() const; - void windows( QMap& ) const; + virtual LightApp_Selection* createSelection() const; + virtual LightApp_Displayer* displayer(); - static HELLO_ORB::HELLO_Gen_ptr InitHELLOGen( SalomeApp_Application* ); + virtual void contextMenuPopup( const QString& type, QMenu* menu, QString& title ); + + virtual void createPreferences(); + virtual void preferencesChanged( const QString& section, const QString& parameter ); + + virtual void storeVisualParameters( int savePoint ); + virtual void restoreVisualParameters( int savePoint ); + + virtual void studyActivated(); + + virtual bool canCopy() const; + virtual bool canPaste() const; + virtual void copy(); + virtual void paste(); + + virtual bool isDraggable( const SUIT_DataObject* what ) const; + virtual bool isDropAccepted( const SUIT_DataObject* where ) const; + virtual void dropObjects( const DataObjectList& what, SUIT_DataObject* where, + const int row, Qt::DropAction action ); public slots: - bool deactivateModule( SUIT_Study* ); - bool activateModule( SUIT_Study* ); + virtual bool activateModule( SUIT_Study* theStudy ); + virtual bool deactivateModule( SUIT_Study* theStudy ); + +protected: + virtual LightApp_Operation* createOperation( const int id ) const; protected slots: - void OnMyNewItem(); - void OnGetBanner(); + void testMe(); + void hello(); + void goodbye(); + +private: + static void init(); + +private: + static HELLO_ORB::HELLO_Gen_var myEngine; }; -#endif +#endif // _HELLOGUI_H_ diff --git a/src/HELLOGUI/HELLO_icons.ts b/src/HELLOGUI/HELLO_icons.ts index e412af0..c816295 100644 --- a/src/HELLOGUI/HELLO_icons.ts +++ b/src/HELLOGUI/HELLO_icons.ts @@ -1,33 +1,23 @@ + - - + @default - ICON_GET_BANNER - ExecHELLO.png + ICON_HELLO + HELLO.png + + + ICON_OP_HELLO + handshake.png + + + ICON_OP_GOODBYE + goodbye.png + + + ICON_OP_TESTME + testme.png diff --git a/src/HELLOGUI/HELLO_msg_en.ts b/src/HELLOGUI/HELLO_msg_en.ts index 6a9d9d6..bb511fa 100644 --- a/src/HELLOGUI/HELLO_msg_en.ts +++ b/src/HELLOGUI/HELLO_msg_en.ts @@ -1,92 +1,115 @@ + - - - - @default - - MEN_FILE - &File - - - MEN_FILE_HELLO - Hello - - - MEN_GET_BANNER - Get banner - - - MEN_HELLO - HELLO - - - MEN_MY_NEW_ITEM - My menu item - - - STS_GET_BANNER - Get HELLO banner - - - STS_MY_NEW_ITEM - Call my menu item - - - TLT_GET_BANNER - Get HELLO banner - - - TLT_MY_NEW_ITEM - My menu item - - - TOOL_HELLO - HELLO - - - - HELLOGUI - - BUT_OK - OK - - - INF_HELLO_BANNER - HELLO Information - - - INF_HELLO_MENU - This is just a test - - - QUE_HELLO_LABEL - Name Import - - - QUE_HELLO_NAME - Please, Enter your name - - + + + HELLOGUI + + MEN_FILE + &File + + + MEN_FILE_HELLO + Hello + + + MEN_HELLO + Hello + + + MEN_OP_HELLO + Hello + + + MEN_OP_GOODBYE + Goodbye + + + MEN_OP_TESTME + Test me + + + STS_OP_HELLO + Say hello to SALOME + + + STS_OP_GOODBYE + Say goodbye to SALOME + + + STS_OP_TESTME + Invoke test menu item + + + TLT_OP_HELLO + Hi, there! + + + TLT_OP_GOODBYE + Bye-bye! + + + TLT_OP_TESTME + Test me + + + TOOL_TEST + Test + + + TOOL_HELLO + Hello + + + BUT_OK + OK + + + INF_TESTME_TITLE + HELLO: test me + + + INF_TESTME_MSG + This is just a test of the custom menu action + + + QUE_ENTER_NAME + Please, enter your name + + + QUE_HELLO_TITLE + Say hello to SALOME + + + INF_HELLO_TITLE + Hello + + + INF_HELLO_MSG + Hello, %1! + + + ERR_HELLO_ALREADY_MET + %1, we already met! + + + ERR_ERROR + Unknown error + + + QUE_GOODBYE_TITLE + Say goodbye to SALOME + + + INF_GOODBYE_TITLE + Goodbye + + + INF_GOODBYE_MSG + Bye-bye, %1! + + + ERR_GOODBYE_DID_NOT_MEET + %1, we did not say hello yet! + + diff --git a/src/HELLOGUI/HELLO_msg_fr.ts b/src/HELLOGUI/HELLO_msg_fr.ts index 67a9965..81dc150 100644 --- a/src/HELLOGUI/HELLO_msg_fr.ts +++ b/src/HELLOGUI/HELLO_msg_fr.ts @@ -1,92 +1,115 @@ + - - - - @default - - MEN_FILE - &File - - - MEN_FILE_HELLO - Hello - - - MEN_GET_BANNER - Get banner - - - MEN_HELLO - HELLO - - - MEN_MY_NEW_ITEM - My menu item - - - STS_GET_BANNER - Get HELLO banner - - - STS_MY_NEW_ITEM - Call my menu item - - - TLT_GET_BANNER - Get HELLO banner - - - TLT_MY_NEW_ITEM - My menu item - - - TOOL_HELLO - HELLO - - - - HELLOGUI - - BUT_OK - OK - - - INF_HELLO_BANNER - Information HELLO - - - INF_HELLO_MENU - Ceci est un simple test - - - QUE_HELLO_LABEL - Import Prnom - - - QUE_HELLO_NAME - Entrez votre prnom, s'il vous plait - - + + + HELLOGUI + + MEN_FILE + &Fichier + + + MEN_FILE_HELLO + Hello + + + MEN_HELLO + Hello + + + MEN_OP_HELLO + Salut + + + MEN_OP_GOODBYE + Au revoir + + + MEN_OP_TESTME + Essayez moi + + + STS_OP_HELLO + Saluer SALOME + + + STS_OP_GOODBYE + Dire au revoir à SALOME + + + STS_OP_TESTME + Test d'une action personnalisée dans le menu + + + TLT_OP_HELLO + Salut à toi ! + + + TLT_OP_GOODBYE + Au revoir ! + + + TLT_OP_TESTME + Essayez moi + + + TOOL_TEST + Test + + + TOOL_HELLO + Salut + + + BUT_OK + OK + + + INF_TESTME_TITLE + HELLO: essayez moi + + + INF_TESTME_MSG + Ce n'est qu'un test d'action de menu personnalisée + + + QUE_ENTER_NAME + Indiquez votre nom + + + QUE_HELLO_TITLE + Saluer SALOME + + + INF_HELLO_TITLE + Salut + + + INF_HELLO_MSG + Salut %1 ! + + + ERR_HELLO_ALREADY_MET + %1, nous nous connaissons déjà ! + + + ERR_ERROR + Erreur inconnue + + + QUE_GOODBYE_TITLE + Dire au revoir à SALOME + + + INF_GOODBYE_TITLE + Au revoir + + + INF_GOODBYE_MSG + Au revoir %1 ! + + + ERR_GOODBYE_DID_NOT_MEET + %1, nous ne nous sommes pas encore rencontrés ! + + diff --git a/src/HELLOGUI/Makefile.am b/src/HELLOGUI/Makefile.am index 2b26728..3e1cf03 100644 --- a/src/HELLOGUI/Makefile.am +++ b/src/HELLOGUI/Makefile.am @@ -1,24 +1,22 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # -* Makefile *- # Author : # Modified by : Alexander BORODIN (OCN) - autotools usage @@ -53,7 +51,7 @@ libHELLO_la_CPPFLAGS = \ $(GUI_CXXFLAGS) \ -I$(srcdir)/../HELLO \ -I$(top_builddir)/idl \ - -I$(top_builddir)/salome_adm/unix + -I$(top_builddir) libHELLO_la_LDFLAGS = \ ../../idl/libSalomeIDLHELLO.la \ diff --git a/src/Makefile.am b/src/Makefile.am index a28933c..412a499 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,28 +1,30 @@ -# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # File : Makefile.in # Author : (CEA) # Modified by : Alexander BORODIN (OCN) - autotools usage # include $(top_srcdir)/adm_local/unix/make_common_starter.am -SUBDIRS = HELLO HELLOGUI +SUBDIRS = HELLO + +if HELLO_ENABLE_GUI + SUBDIRS += HELLOGUI +endif -- 2.39.2