include (${gazebo_cmake_dir}/GazeboUtils.cmake)

include ( ${QT_USE_FILE} )

link_directories(
  ${Boost_LIBRARY_DIRS}
  ${tinyxml_LIBRARY_DIRS}
)

include_directories(
  ${CMAKE_SOURCE_DIR}/deps
)

include_directories(${tinyxml_INCLUDE_DIRS})

add_definitions(${QT_DEFINITIONS})

add_subdirectory(qtpropertybrowser)

set (internal_qt_headers)

set (sources
  Actions.cc
  AlignWidget.cc
  ApplyWrenchDialog.cc
  CloneWindow.cc
  ConfigWidget.cc
  Conversions.cc
  DataLogger.cc
  Editor.cc
  EntityMaker.cc
  GLWidget.cc
  GuiEvents.cc
  GuiIface.cc
  HotkeyDialog.cc
  InsertModelWidget.cc
  JointControlWidget.cc
  KeyEventHandler.cc
  LayersWidget.cc
  LightMaker.cc
  LogPlayWidget.cc
  MainWindow.cc
  ModelAlign.cc
  ModelListWidget.cc
  ModelMaker.cc
  ModelManipulator.cc
  ModelRightMenu.cc
  ModelSnap.cc
  MouseEventHandler.cc
  RenderWidget.cc
  SaveDialog.cc
  SpaceNav.cc
  SplashScreen.cc
  TimePanel.cc
  TimeWidget.cc
  ToolsWidget.cc
  TopicSelector.cc
  TopToolbar.cc
  UserCmdHistory.cc
  ViewAngleWidget.cc
)

if (NOT USE_EXTERNAL_TINYXML)
  include_directories (${CMAKE_SOURCE_DIR}/deps/win/tinyxml)
  set (sources ${sources}
       ${CMAKE_SOURCE_DIR}/deps/win/tinyxml/tinystr.cpp
       ${CMAKE_SOURCE_DIR}/deps/win/tinyxml/tinyxml.cpp
       ${CMAKE_SOURCE_DIR}/deps/win/tinyxml/tinyxmlerror.cpp
       ${CMAKE_SOURCE_DIR}/deps/win/tinyxml/tinyxmlparser.cpp)
endif()

set (qt_headers
  Actions.hh
  AlignWidget.hh
  ApplyWrenchDialog.hh
  CloneWindow.hh
  ConfigWidget.hh
  DataLogger.hh
  Editor.hh
  GLWidget.hh
  HotkeyDialog.hh
  InsertModelWidget.hh
  JointControlWidget.hh
  LayersWidget.hh
  LogPlayWidget.hh
  MainWindow.hh
  ModelListWidget.hh
  ModelRightMenu.hh
  RenderWidget.hh
  SaveDialog.hh
  SplashScreen.hh
  TimePanel.hh
  TimeWidget.hh
  ToolsWidget.hh
  TopicSelector.hh
  TopToolbar.hh
  UserCmdHistory.hh
  ViewAngleWidget.hh
)

set (headers
  qt.h
  qt_test.h
  Conversions.hh
  EntityMaker.hh
  GuiIface.hh
  GuiEvents.hh
  GuiPlugin.hh
  GuiTypes.hh
  KeyEventHandler.hh
  LightMaker.hh
  ModelAlign.hh
  ModelManipulator.hh
  ModelSnap.hh
  MouseEventHandler.hh
  ModelMaker.hh
  SpaceNav.hh
)

if (HAVE_OCULUS)
  set (sources ${sources}
    OculusWindow.cc
  )
  set (qt_headers ${qt_headers}
    OculusWindow.hh
  )
endif ()

#if (HAVE_QWT)
#  set (sources ${sources}
#    Diagnostics.cc
#    IncrementalPlot.cc
#  )
#  set (qt_headers ${qt_headers}
#    Diagnostics.hh
#    IncrementalPlot.hh
#  )
#endif()

set (qt_tests
  BuildingEditor_TEST.cc
  ConfigWidget_TEST.cc
  DataLogger_TEST.cc
  GLWidget_TEST.cc
  GLWidget_TEST2.cc
  GuiIface_TEST.cc
  HotkeyDialog_TEST.cc
  LightMaker_TEST.cc
  ModelAlign_TEST.cc
  ModelListWidget_TEST.cc
  ModelMaker_TEST.cc
  ModelManipulator_TEST.cc
  RenderWidget_TEST.cc
  SaveDialog_TEST.cc
  SplashScreen_TEST.cc
  TimePanel_TEST.cc
  TimeWidget_TEST.cc
  TopToolbar_TEST.cc
  ViewAngleWidget_TEST.cc
)

add_subdirectory(viewers)
add_subdirectory(terrain)
add_subdirectory(building)
add_subdirectory(model)

if (HAVE_GRAPHVIZ)
  add_definitions(-DWITH_CGRAPH)
  add_definitions(-DHAVE_STRING_H)
  # Activate Export macro for building the library itself
  # if QGVCORE_LIB is not set or equal 0 (null), import macro is used
  add_definitions(-DQGVCORE_LIB)
  include_directories(${GRAPHVIZ_INCLUDE_DIR})
  include_directories(${CMAKE_CURRENT_SOURCE_DIR}/qgv)
  include_directories(${CMAKE_CURRENT_SOURCE_DIR}/qgv/private)
  add_subdirectory(qgv)
endif()

# MainWindow is using screen rendering
if (ENABLE_SCREEN_TESTS)
  set (qt_tests
      ${qt_tests}
      ApplyWrenchDialog_TEST.cc
      LaserVisualization_TEST.cc
      LayersWidget_TEST.cc
      MainWindow_TEST.cc
      ModelSnap_TEST.cc
      Projection_TEST.cc)
endif()

# Generate executables for each of the QT unit tests
gz_build_qt_tests(${qt_tests})

set (resources resources.qrc)

QT4_WRAP_CPP(headers_MOC ${qt_headers} ${internal_qt_headers})
QT4_ADD_RESOURCES(resources_RCC ${resources})

gz_add_library(gazebo_gui ${sources} ${headers_MOC} ${resources_RCC})
gz_add_executable(gzclient main.cc ${resources_RCC})

add_dependencies(gazebo_gui gazebo_msgs)
add_dependencies(gzclient gazebo_gui)

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBUILDING_DLL_GZ_GUI")

target_link_libraries(gazebo_gui
  libgazebo_client
  gazebo_common
  gazebo_transport
  gazebo_rendering
  gazebo_msgs
  gzqtpropertybrowser
  ${QT_LIBRARIES}
  ${ogre_libraries}
  ${Boost_LIBRARIES}
  ${tinyxml_LIBRARIES}
)

if (UNIX)
  target_link_libraries(gazebo_gui pthread)
endif()

if (HAVE_GRAPHVIZ)
  target_link_libraries(gazebo_gui ${GRAPHVIZ_LIBRARIES})
endif()

target_link_libraries(gzclient gazebo_gui)

if (UNIX)
  target_link_libraries(gzclient pthread)
endif()

if (SPNAV_LIBRARY)
  target_link_libraries(gazebo_gui ${SPNAV_LIBRARY})
  target_link_libraries(gzclient ${SPNAV_LIBRARY})
endif()

set (gtest_sources
  Conversions_TEST.cc
)

gz_build_tests(${gtest_sources} EXTRA_LIBS gazebo_gui)

add_definitions(${QT_DEFINITIONS})

set (gui_headers "" CACHE INTERNAL "gui headers" FORCE)
foreach (hdr ${headers} ${qt_headers})
  APPEND_TO_CACHED_STRING(gui_headers
    "GUI Headers" "#include \"gazebo/gui/${hdr}\"\n")
endforeach()
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/gui.hh.in ${CMAKE_CURRENT_BINARY_DIR}/gui.hh )

gz_install_library(gazebo_gui)
gz_install_includes("gui" ${headers} ${qt_headers} ${CMAKE_CURRENT_BINARY_DIR}/gui.hh)
gz_install_executable(gzclient)

if (UNIX)
  manpage(gzclient 1)
endif()
