Commit 230b60e6 authored by Brian Sidebotham's avatar Brian Sidebotham

* Merge changes from trunk

parents a71823b4 24ed7f50
...@@ -35,36 +35,39 @@ set( USE_KIWAY_DLLS true ) # this is now mandatory, the code is the same anyway ...@@ -35,36 +35,39 @@ set( USE_KIWAY_DLLS true ) # this is now mandatory, the code is the same anyway
# have this option turned OFF, the xml export's referential integrity is broken # have this option turned OFF, the xml export's referential integrity is broken
# on library part name. Hence the default is ON now, as of 29-Jan-2014. # on library part name. Hence the default is ON now, as of 29-Jan-2014.
option( KICAD_KEEPCASE option( KICAD_KEEPCASE
"ON= case specific string matching on component names, OFF= match names as if they were spelt using uppercase." "Use case sensitive string matching for component names (default ON)."
ON ON
) )
option( USE_WX_GRAPHICS_CONTEXT option( USE_WX_GRAPHICS_CONTEXT
"Use wxGraphicsContext for rendering ( default OFF). Warning, this is experimental" ) "Use wxGraphicsContext for rendering (default OFF). Warning, this is experimental" )
option( USE_WX_OVERLAY option( USE_WX_OVERLAY
"Use wxOverlay: Always ON for MAC ( default OFF). Warning, this is experimental" ) "Use wxOverlay: Always ON for MAC (default OFF). Warning, this is experimental" )
option( KICAD_SCRIPTING option( KICAD_SCRIPTING
"set this option ON to build the scripting support inside kicad binaries" "Build the Python scripting support inside KiCad binaries (default OFF)."
) )
option( KICAD_SCRIPTING_MODULES option( KICAD_SCRIPTING_MODULES
"set this option ON to build kicad modules that can be used from scripting languages" "Build KiCad Python modules that can be used from scripting languages (default OFF)."
) )
option( KICAD_SCRIPTING_WXPYTHON option( KICAD_SCRIPTING_WXPYTHON
"set this option ON to build wxpython implementation for wx interface building in python and py.shell" "Build wxPython implementation for wx interface building in Python and py.shell (default OFF)."
) )
option( KICAD_BUILD_STATIC option( KICAD_BUILD_STATIC
"Builds Kicad and all libraries static" "Build dependencies as static libraries. OSX only. (default OFF)."
) )
option( KICAD_BUILD_DYNAMIC option( KICAD_BUILD_DYNAMIC
"Builds Kicad and all libraries dynamic (required for wxPython)" "Build dependencies as shared libraries. Required for wxPython support. OXS only. (default OFF)."
) )
option( USE_OSX_DEPS_BUILDER
"Build dependencies from source instead of dependencies installed on system. OSX only. (default OFF)."
)
# WARNING: KiCad developers strongly advise you to build Boost with supplied patches, # WARNING: KiCad developers strongly advise you to build Boost with supplied patches,
# as it is known to work with KiCad. Other versions may contain bugs that may result # as it is known to work with KiCad. Other versions may contain bugs that may result
...@@ -269,7 +272,6 @@ if( USE_WX_GRAPHICS_CONTEXT ) ...@@ -269,7 +272,6 @@ if( USE_WX_GRAPHICS_CONTEXT )
endif() endif()
# Allow user to override the default settings for adding images to menu items. By default # Allow user to override the default settings for adding images to menu items. By default
# images in menu items are enabled on all platforms except OSX. This can be over ridden by # images in menu items are enabled on all platforms except OSX. This can be over ridden by
# defining -DUSE_IMAGES_IN_MENUS=ON/OFF to force the preferred behavior. # defining -DUSE_IMAGES_IN_MENUS=ON/OFF to force the preferred behavior.
...@@ -353,9 +355,30 @@ include( ExternalProject ) ...@@ -353,9 +355,30 @@ include( ExternalProject )
#================================================ #================================================
include( CheckFindPackageResult ) include( CheckFindPackageResult )
##########################
# Find wxWidgets library #
##########################
# Here you can define what libraries of wxWidgets you need for your
# application. You can figure out what libraries you need here;
# http://www.wxwidgets.org/manuals/2.8/wx_librarieslist.html
# Turn on wxWidgets compatibility mode for some classes # Turn on wxWidgets compatibility mode for some classes
add_definitions( -DWX_COMPATIBILITY ) add_definitions( -DWX_COMPATIBILITY )
# See line 41 of CMakeModules/FindwxWidgets.cmake
set( wxWidgets_CONFIG_OPTIONS --static=no )
# On Apple only wxwidgets 2.9 or higher doesn't need to find aui part of base
# Seems no longer needed on wx-3
if( APPLE AND ( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES OR KICAD_SCRIPTING_WXPYTHON) )
find_package( wxWidgets 3.0.0 COMPONENTS gl adv html core net base xml REQUIRED )
else()
find_package( wxWidgets 3.0.0 COMPONENTS gl aui adv html core net base xml REQUIRED )
endif()
# Include wxWidgets macros.
include( ${wxWidgets_USE_FILE} )
####################### #######################
# Find OpenGL library # # Find OpenGL library #
####################### #######################
...@@ -372,7 +395,10 @@ check_find_package_result( OPENGL_FOUND "OpenGL" ) ...@@ -372,7 +395,10 @@ check_find_package_result( OPENGL_FOUND "OpenGL" )
# Always defined, empty if no libraries are to be built # Always defined, empty if no libraries are to be built
add_custom_target( lib-dependencies ) add_custom_target( lib-dependencies )
if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) # Only download and build all dependencies from source on OSX if the user specifically requests
# it. Otherwise, respect the developers wishes to use the dependencies already installed on
# their systme.
if( APPLE AND USE_OSX_DEPS_BUILDER )
# This should be built in all cases, if swig exec is not avaiable # This should be built in all cases, if swig exec is not avaiable
# will be impossible also enable SCRIPTING being for PCBNEW required immediately # will be impossible also enable SCRIPTING being for PCBNEW required immediately
...@@ -417,21 +443,14 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) ...@@ -417,21 +443,14 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
set( PYTHON_DEST ${LIBWXPYTHON_ROOT}/wxPython/lib/python2.6/site-packages ) set( PYTHON_DEST ${LIBWXPYTHON_ROOT}/wxPython/lib/python2.6/site-packages )
set(wxWidgets_BIN_DIR ${LIBWXPYTHON_ROOT}/bin/wxrc )
set(wxWidgets_CONFIG_EXECUTABLE ${LIBWXPYTHON_ROOT}/bin/wx-config )
set(wxWidgets_INCLUDE_DIRS ${LIBWXPYTHON_ROOT}/include/wx-3.0 )
set(wxWidgets_LIBRARY_DIRS ${LIBWXPYTHON_ROOT}/lib )
add_dependencies( lib-dependencies libwxpython ) add_dependencies( lib-dependencies libwxpython )
add_dependencies( lib-dependencies swig ) add_dependencies( lib-dependencies swig )
else() else()
include( download_wxwidgets ) include( download_wxwidgets )
add_dependencies( lib-dependencies libwx ) add_dependencies( lib-dependencies libwx )
endif() endif()
include( download_libpng ) include( download_libpng )
include( download_pkgconfig ) include( download_pkgconfig )
set( PKG_CONFIG_EXECUTABLE "${PKGCONFIG_ROOT}/bin/pkg-config" ) set( PKG_CONFIG_EXECUTABLE "${PKGCONFIG_ROOT}/bin/pkg-config" )
include( download_glew ) include( download_glew )
...@@ -450,11 +469,13 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) ...@@ -450,11 +469,13 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
add_dependencies( lib-dependencies pkgconfig ) add_dependencies( lib-dependencies pkgconfig )
if( KICAD_BUILD_DYNAMIC AND APPLE ) if( KICAD_BUILD_DYNAMIC AND APPLE )
add_custom_target( osx_fix_bundles ALL DEPENDS cvpcb eeschema gerbview kicad pcbnew bitmap2component pcb_calculator pl_editor) add_custom_target( osx_fix_bundles ALL DEPENDS
add_custom_command(TARGET osx_fix_bundles POST_BUILD COMMAND ${PROJECT_SOURCE_DIR}/scripts/osx_fixbundle.sh ${PROJECT_SOURCE_DIR} COMMENT "Migrating dylibs to bundles") cvpcb eeschema gerbview kicad pcbnew bitmap2component pcb_calculator pl_editor)
add_custom_command(TARGET osx_fix_bundles
POST_BUILD COMMAND ${PROJECT_SOURCE_DIR}/scripts/osx_fixbundle.sh ${PROJECT_SOURCE_DIR}
COMMENT "Migrating dylibs to bundles")
endif() endif()
endif()
endif( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC)
##################### #####################
# Find GLEW library # # Find GLEW library #
...@@ -492,31 +513,6 @@ else() ...@@ -492,31 +513,6 @@ else()
include( download_boost ) include( download_boost )
endif() endif()
##########################
# Find wxWidgets library #
##########################
# Here you can define what libraries of wxWidgets you need for your
# application. You can figure out what libraries you need here;
# http://www.wxwidgets.org/manuals/2.8/wx_librarieslist.html
# See line 41 of CMakeModules/FindwxWidgets.cmake
set( wxWidgets_CONFIG_OPTIONS --static=no )
# On Apple only wxwidgets 2.9 or higher doesn't need to find aui part of base
# Seems no more needed on wx-3
if( APPLE AND ( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES OR KICAD_SCRIPTING_WXPYTHON) )
find_package( wxWidgets COMPONENTS gl adv html core net base xml QUIET )
else()
find_package( wxWidgets COMPONENTS gl aui adv html core net base xml QUIET )
endif()
if( NOT (KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC) )
check_find_package_result( wxWidgets_FOUND "wxWidgets" )
endif()
# Include wxWidgets macros.
include( ${wxWidgets_USE_FILE} )
# Include MinGW resource compiler. # Include MinGW resource compiler.
include( MinGWResourceCompiler ) include( MinGWResourceCompiler )
...@@ -553,16 +549,8 @@ set( INC_AFTER ...@@ -553,16 +549,8 @@ set( INC_AFTER
# Find Python and other scripting resources # Find Python and other scripting resources
if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
if( APPLE )
set( PYTHON_LIBRARY /System/Library/Frameworks/Python.framework/Versions/2.6/Python )
set( PYTHON_INCLUDE_DIR /System/Library/Frameworks/Python.framework/Versions//2.6/include/python2.6 )
set( PythonInterp_FIND_VERSION 2.6 )
set( PythonLibs_FIND_VERSION 2.6 )
endif()
# force a python version < 3.0 # force a python version < 3.0
set( PythonInterp_FIND_VERSION 2.6) set( PythonInterp_FIND_VERSION 2.6 )
set( PythonLibs_FIND_VERSION 2.6 ) set( PythonLibs_FIND_VERSION 2.6 )
find_package( PythonInterp ) find_package( PythonInterp )
...@@ -572,6 +560,7 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) ...@@ -572,6 +560,7 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
if( NOT PYTHON_VERSION_MAJOR EQUAL 2 ) if( NOT PYTHON_VERSION_MAJOR EQUAL 2 )
message( FATAL_ERROR "Python 2.x is required." ) message( FATAL_ERROR "Python 2.x is required." )
endif() endif()
# Get the correct Python site package install path from the Python interpreter found by # Get the correct Python site package install path from the Python interpreter found by
# FindPythonInterp unless the user specifically defined a custom path. # FindPythonInterp unless the user specifically defined a custom path.
if( NOT PYTHON_SITE_PACKAGE_PATH ) if( NOT PYTHON_SITE_PACKAGE_PATH )
......
#.rst:
# CMakeParseArguments
# -------------------
#
#
#
# CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords>
# <multi_value_keywords> args...)
#
# CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions
# for parsing the arguments given to that macro or function. It
# processes the arguments and defines a set of variables which hold the
# values of the respective options.
#
# The <options> argument contains all options for the respective macro,
# i.e. keywords which can be used when calling the macro without any
# value following, like e.g. the OPTIONAL keyword of the install()
# command.
#
# The <one_value_keywords> argument contains all keywords for this macro
# which are followed by one value, like e.g. DESTINATION keyword of the
# install() command.
#
# The <multi_value_keywords> argument contains all keywords for this
# macro which can be followed by more than one value, like e.g. the
# TARGETS or FILES keywords of the install() command.
#
# When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the
# keywords listed in <options>, <one_value_keywords> and
# <multi_value_keywords> a variable composed of the given <prefix>
# followed by "_" and the name of the respective keyword. These
# variables will then hold the respective value from the argument list.
# For the <options> keywords this will be TRUE or FALSE.
#
# All remaining arguments are collected in a variable
# <prefix>_UNPARSED_ARGUMENTS, this can be checked afterwards to see
# whether your macro was called with unrecognized parameters.
#
# As an example here a my_install() macro, which takes similar arguments
# as the real install() command:
#
# ::
#
# function(MY_INSTALL)
# set(options OPTIONAL FAST)
# set(oneValueArgs DESTINATION RENAME)
# set(multiValueArgs TARGETS CONFIGURATIONS)
# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
# ...
#
#
#
# Assume my_install() has been called like this:
#
# ::
#
# my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
#
#
#
# After the cmake_parse_arguments() call the macro will have set the
# following variables:
#
# ::
#
# MY_INSTALL_OPTIONAL = TRUE
# MY_INSTALL_FAST = FALSE (this option was not used when calling my_install()
# MY_INSTALL_DESTINATION = "bin"
# MY_INSTALL_RENAME = "" (was not used)
# MY_INSTALL_TARGETS = "foo;bar"
# MY_INSTALL_CONFIGURATIONS = "" (was not used)
# MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL"
#
#
#
# You can then continue and process these variables.
#
# Keywords terminate lists of values, e.g. if directly after a
# one_value_keyword another recognized keyword follows, this is
# interpreted as the beginning of the new option. E.g.
# my_install(TARGETS foo DESTINATION OPTIONAL) would result in
# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION
# would be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor.
#=============================================================================
# Copyright 2010 Alexander Neundorf <neundorf@kde.org>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
if(__CMAKE_PARSE_ARGUMENTS_INCLUDED)
return()
endif()
set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE)
function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames)
# first set all result variables to empty/FALSE
foreach(arg_name ${_singleArgNames} ${_multiArgNames})
set(${prefix}_${arg_name})
endforeach()
foreach(option ${_optionNames})
set(${prefix}_${option} FALSE)
endforeach()
set(${prefix}_UNPARSED_ARGUMENTS)
set(insideValues FALSE)
set(currentArgName)
# now iterate over all arguments and fill the result variables
foreach(currentArg ${ARGN})
list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword
list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword
list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword
if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1)
if(insideValues)
if("${insideValues}" STREQUAL "SINGLE")
set(${prefix}_${currentArgName} ${currentArg})
set(insideValues FALSE)
elseif("${insideValues}" STREQUAL "MULTI")
list(APPEND ${prefix}_${currentArgName} ${currentArg})
endif()
else()
list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg})
endif()
else()
if(NOT ${optionIndex} EQUAL -1)
set(${prefix}_${currentArg} TRUE)
set(insideValues FALSE)
elseif(NOT ${singleArgIndex} EQUAL -1)
set(currentArgName ${currentArg})
set(${prefix}_${currentArgName})
set(insideValues "SINGLE")
elseif(NOT ${multiArgIndex} EQUAL -1)
set(currentArgName ${currentArg})
set(${prefix}_${currentArgName})
set(insideValues "MULTI")
endif()
endif()
endforeach()
# propagate the result variables to the caller:
foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames})
set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE)
endforeach()
set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE)
endfunction()
#.rst:
# FindPackageHandleStandardArgs
# -----------------------------
#
#
#
# FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> ... ) # FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> ... )
# #
# This function is intended to be used in FindXXX.cmake modules files. # This function is intended to be used in FindXXX.cmake modules files.
# It handles the REQUIRED, QUIET and version-related arguments to FIND_PACKAGE(). # It handles the REQUIRED, QUIET and version-related arguments to
# It also sets the <UPPERCASED_NAME>_FOUND variable. # find_package(). It also sets the <packagename>_FOUND variable. The
# The package is considered found if all variables <var1>... listed contain # package is considered found if all variables <var1>... listed contain
# valid results, e.g. valid filepaths. # valid results, e.g. valid filepaths.
# #
# There are two modes of this function. The first argument in both modes is # There are two modes of this function. The first argument in both
# the name of the Find-module where it is called (in original casing). # modes is the name of the Find-module where it is called (in original
# casing).
# #
# The first simple mode looks like this: # The first simple mode looks like this:
#
# ::
#
# FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> (DEFAULT_MSG|"Custom failure message") <var1>...<varN> ) # FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> (DEFAULT_MSG|"Custom failure message") <var1>...<varN> )
# If the variables <var1> to <varN> are all valid, then <UPPERCASED_NAME>_FOUND #
# will be set to TRUE. # If the variables <var1> to <varN> are all valid, then
# If DEFAULT_MSG is given as second argument, then the function will generate # <UPPERCASED_NAME>_FOUND will be set to TRUE. If DEFAULT_MSG is given
# itself useful success and error messages. You can also supply a custom error message # as second argument, then the function will generate itself useful
# for the failure case. This is not recommended. # success and error messages. You can also supply a custom error
# message for the failure case. This is not recommended.
# #
# The second mode is more powerful and also supports version checking: # The second mode is more powerful and also supports version checking:
# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME [REQUIRED_VARS <var1>...<varN>] #
# [VERSION_VAR <versionvar> # ::
#
# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME [FOUND_VAR <resultVar>]
# [REQUIRED_VARS <var1>...<varN>]
# [VERSION_VAR <versionvar>]
# [HANDLE_COMPONENTS]
# [CONFIG_MODE] # [CONFIG_MODE]
# [FAIL_MESSAGE "Custom failure message"] ) # [FAIL_MESSAGE "Custom failure message"] )
# #
# As above, if <var1> through <varN> are all valid, <UPPERCASED_NAME>_FOUND #
# will be set to TRUE. #
# After REQUIRED_VARS the variables which are required for this package are listed. # In this mode, the name of the result-variable can be set either to
# Following VERSION_VAR the name of the variable can be specified which holds # either <UPPERCASED_NAME>_FOUND or <OriginalCase_Name>_FOUND using the
# the version of the package which has been found. If this is done, this version # FOUND_VAR option. Other names for the result-variable are not
# will be checked against the (potentially) specified required version used # allowed. So for a Find-module named FindFooBar.cmake, the two
# in the find_package() call. The EXACT keyword is also handled. The default # possible names are FooBar_FOUND and FOOBAR_FOUND. It is recommended
# messages include information about the required version and the version # to use the original case version. If the FOUND_VAR option is not
# which has been actually found, both if the version is ok or not. # used, the default is <UPPERCASED_NAME>_FOUND.
# Use the option CONFIG_MODE if your FindXXX.cmake module is a wrapper for #
# a find_package(... NO_MODULE) call, in this case all the information # As in the simple mode, if <var1> through <varN> are all valid,
# provided by the config-mode of find_package() will be evaluated # <packagename>_FOUND will be set to TRUE. After REQUIRED_VARS the
# automatically. # variables which are required for this package are listed. Following
# Via FAIL_MESSAGE a custom failure message can be specified, if this is not # VERSION_VAR the name of the variable can be specified which holds the
# used, the default message will be displayed. # version of the package which has been found. If this is done, this
# version will be checked against the (potentially) specified required
# version used in the find_package() call. The EXACT keyword is also
# handled. The default messages include information about the required
# version and the version which has been actually found, both if the
# version is ok or not. If the package supports components, use the
# HANDLE_COMPONENTS option to enable handling them. In this case,
# find_package_handle_standard_args() will report which components have
# been found and which are missing, and the <packagename>_FOUND variable
# will be set to FALSE if any of the required components (i.e. not the
# ones listed after OPTIONAL_COMPONENTS) are missing. Use the option
# CONFIG_MODE if your FindXXX.cmake module is a wrapper for a
# find_package(... NO_MODULE) call. In this case VERSION_VAR will be
# set to <NAME>_VERSION and the macro will automatically check whether
# the Config module was found. Via FAIL_MESSAGE a custom failure
# message can be specified, if this is not used, the default message
# will be displayed.
# #
# Example for mode 1: # Example for mode 1:
# #
# FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) # ::
#
# find_package_handle_standard_args(LibXml2 DEFAULT_MSG LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR)
#
#
# #
# LibXml2 is considered to be found, if both LIBXML2_LIBRARY and # LibXml2 is considered to be found, if both LIBXML2_LIBRARY and
# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE. # LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to
# If it is not found and REQUIRED was used, it fails with FATAL_ERROR, # TRUE. If it is not found and REQUIRED was used, it fails with
# independent whether QUIET was used or not. # FATAL_ERROR, independent whether QUIET was used or not. If it is
# If it is found, success will be reported, including the content of <var1>. # found, success will be reported, including the content of <var1>. On
# On repeated Cmake runs, the same message won't be printed again. # repeated Cmake runs, the same message won't be printed again.
# #
# Example for mode 2: # Example for mode 2:
# #
# FIND_PACKAGE_HANDLE_STANDARD_ARGS(BISON REQUIRED_VARS BISON_EXECUTABLE # ::
# VERSION_VAR BISON_VERSION) #
# In this case, BISON is considered to be found if the variable(s) listed # find_package_handle_standard_args(LibXslt FOUND_VAR LibXslt_FOUND
# after REQUIRED_VAR are all valid, i.e. BISON_EXECUTABLE in this case. # REQUIRED_VARS LibXslt_LIBRARIES LibXslt_INCLUDE_DIRS
# Also the version of BISON will be checked by using the version contained # VERSION_VAR LibXslt_VERSION_STRING)
# in BISON_VERSION. #
# Since no FAIL_MESSAGE is given, the default messages will be printed. # In this case, LibXslt is considered to be found if the variable(s)
# listed after REQUIRED_VAR are all valid, i.e. LibXslt_LIBRARIES and
# LibXslt_INCLUDE_DIRS in this case. The result will then be stored in
# LibXslt_FOUND . Also the version of LibXslt will be checked by using
# the version contained in LibXslt_VERSION_STRING. Since no
# FAIL_MESSAGE is given, the default messages will be printed.
# #
# Another example for mode 2: # Another example for mode 2:
# #
# FIND_PACKAGE(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) # ::
# FIND_PACKAGE_HANDLE_STANDARD_ARGS(Automoc4 CONFIG_MODE) #
# In this case, FindAutmoc4.cmake wraps a call to FIND_PACKAGE(Automoc4 NO_MODULE) # find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4)
# and adds an additional search directory for automoc4. # find_package_handle_standard_args(Automoc4 CONFIG_MODE)
# The following FIND_PACKAGE_HANDLE_STANDARD_ARGS() call produces a proper #
# In this case, FindAutmoc4.cmake wraps a call to find_package(Automoc4
# NO_MODULE) and adds an additional search directory for automoc4. Here
# the result will be stored in AUTOMOC4_FOUND. The following
# FIND_PACKAGE_HANDLE_STANDARD_ARGS() call produces a proper
# success/error message. # success/error message.
#============================================================================= #=============================================================================
...@@ -82,179 +127,225 @@ ...@@ -82,179 +127,225 @@
# (To distribute this file outside of CMake, substitute the full # (To distribute this file outside of CMake, substitute the full
# License text for the above reference.) # License text for the above reference.)
INCLUDE(FindPackageMessage) include(FindPackageMessage)
INCLUDE(CMakeParseArguments) include(CMakeParseArguments)
# internal helper macro # internal helper macro
MACRO(_FPHSA_FAILURE_MESSAGE _msg) macro(_FPHSA_FAILURE_MESSAGE _msg)
IF (${_NAME}_FIND_REQUIRED) if (${_NAME}_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "${_msg}") message(FATAL_ERROR "${_msg}")
ELSE (${_NAME}_FIND_REQUIRED) else ()
IF (NOT ${_NAME}_FIND_QUIETLY) if (NOT ${_NAME}_FIND_QUIETLY)
MESSAGE(STATUS "${_msg}") message(STATUS "${_msg}")
ENDIF (NOT ${_NAME}_FIND_QUIETLY) endif ()
ENDIF (${_NAME}_FIND_REQUIRED) endif ()
ENDMACRO(_FPHSA_FAILURE_MESSAGE _msg) endmacro()
# internal helper macro to generate the failure message when used in CONFIG_MODE: # internal helper macro to generate the failure message when used in CONFIG_MODE:
MACRO(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE)
# <name>_CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: # <name>_CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found:
IF(${_NAME}_CONFIG) if(${_NAME}_CONFIG)
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing: ${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing: ${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})")
ELSE(${_NAME}_CONFIG) else()
# If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version.
# List them all in the error message: # List them all in the error message:
IF(${_NAME}_CONSIDERED_CONFIGS) if(${_NAME}_CONSIDERED_CONFIGS)
SET(configsText "") set(configsText "")
LIST(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount)
MATH(EXPR configsCount "${configsCount} - 1") math(EXPR configsCount "${configsCount} - 1")
FOREACH(currentConfigIndex RANGE ${configsCount}) foreach(currentConfigIndex RANGE ${configsCount})
LIST(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename)
LIST(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version)
SET(configsText "${configsText} ${filename} (version ${version})\n") set(configsText "${configsText} ${filename} (version ${version})\n")
ENDFOREACH(currentConfigIndex) endforeach()
if (${_NAME}_NOT_FOUND_MESSAGE)
set(configsText "${configsText} Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n")
endif()
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}") _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}")
ELSE(${_NAME}_CONSIDERED_CONFIGS) else()
# Simple case: No Config-file was found at all: # Simple case: No Config-file was found at all:
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}")
ENDIF(${_NAME}_CONSIDERED_CONFIGS) endif()
ENDIF(${_NAME}_CONFIG) endif()
ENDMACRO(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) endmacro()
FUNCTION(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)
# set up the arguments for CMAKE_PARSE_ARGUMENTS and check whether we are in # set up the arguments for CMAKE_PARSE_ARGUMENTS and check whether we are in
# new extended or in the "old" mode: # new extended or in the "old" mode:
SET(options CONFIG_MODE) set(options CONFIG_MODE HANDLE_COMPONENTS)
SET(oneValueArgs FAIL_MESSAGE VERSION_VAR) set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR)
SET(multiValueArgs REQUIRED_VARS) set(multiValueArgs REQUIRED_VARS)
SET(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} )
LIST(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX)
IF(${INDEX} EQUAL -1) if(${INDEX} EQUAL -1)
SET(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG})
SET(FPHSA_REQUIRED_VARS ${ARGN}) set(FPHSA_REQUIRED_VARS ${ARGN})
SET(FPHSA_VERSION_VAR) set(FPHSA_VERSION_VAR)
ELSE(${INDEX} EQUAL -1) else()
CMAKE_PARSE_ARGUMENTS(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) CMAKE_PARSE_ARGUMENTS(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN})
IF(FPHSA_UNPARSED_ARGUMENTS) if(FPHSA_UNPARSED_ARGUMENTS)
MESSAGE(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"")
ENDIF(FPHSA_UNPARSED_ARGUMENTS) endif()
IF(NOT FPHSA_FAIL_MESSAGE) if(NOT FPHSA_FAIL_MESSAGE)
SET(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG")
ENDIF(NOT FPHSA_FAIL_MESSAGE) endif()
ENDIF(${INDEX} EQUAL -1) endif()
# now that we collected all arguments, process them # now that we collected all arguments, process them
IF("${FPHSA_FAIL_MESSAGE}" STREQUAL "DEFAULT_MSG") if("${FPHSA_FAIL_MESSAGE}" STREQUAL "DEFAULT_MSG")
SET(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}")
ENDIF("${FPHSA_FAIL_MESSAGE}" STREQUAL "DEFAULT_MSG") endif()
# In config-mode, we rely on the variable <package>_CONFIG, which is set by find_package() # In config-mode, we rely on the variable <package>_CONFIG, which is set by find_package()
# when it successfully found the config-file, including version checking: # when it successfully found the config-file, including version checking:
IF(FPHSA_CONFIG_MODE) if(FPHSA_CONFIG_MODE)
LIST(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG)
LIST(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS)
SET(FPHSA_VERSION_VAR ${_NAME}_VERSION) set(FPHSA_VERSION_VAR ${_NAME}_VERSION)
ENDIF(FPHSA_CONFIG_MODE) endif()
IF(NOT FPHSA_REQUIRED_VARS) if(NOT FPHSA_REQUIRED_VARS)
MESSAGE(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()")
ENDIF(NOT FPHSA_REQUIRED_VARS) endif()
LIST(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR)
STRING(TOUPPER ${_NAME} _NAME_UPPER) string(TOUPPER ${_NAME} _NAME_UPPER)
STRING(TOLOWER ${_NAME} _NAME_LOWER) string(TOLOWER ${_NAME} _NAME_LOWER)
if(FPHSA_FOUND_VAR)
if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$")
set(_FOUND_VAR ${FPHSA_FOUND_VAR})
else()
message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.")
endif()
else()
set(_FOUND_VAR ${_NAME_UPPER}_FOUND)
endif()
# collect all variables which were not found, so they can be printed, so the # collect all variables which were not found, so they can be printed, so the
# user knows better what went wrong (#6375) # user knows better what went wrong (#6375)
SET(MISSING_VARS "") set(MISSING_VARS "")
SET(DETAILS "") set(DETAILS "")
SET(${_NAME_UPPER}_FOUND TRUE)
# check if all passed variables are valid # check if all passed variables are valid
FOREACH(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) unset(${_FOUND_VAR})
IF(NOT ${_CURRENT_VAR}) foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS})
SET(${_NAME_UPPER}_FOUND FALSE) if(NOT ${_CURRENT_VAR})
SET(MISSING_VARS "${MISSING_VARS} ${_CURRENT_VAR}") set(${_FOUND_VAR} FALSE)
ELSE(NOT ${_CURRENT_VAR}) set(MISSING_VARS "${MISSING_VARS} ${_CURRENT_VAR}")
SET(DETAILS "${DETAILS}[${${_CURRENT_VAR}}]") else()
ENDIF(NOT ${_CURRENT_VAR}) set(DETAILS "${DETAILS}[${${_CURRENT_VAR}}]")
ENDFOREACH(_CURRENT_VAR) endif()
endforeach()
if(NOT "${${_FOUND_VAR}}" STREQUAL "FALSE")
set(${_FOUND_VAR} TRUE)
endif()
# component handling
unset(FOUND_COMPONENTS_MSG)
unset(MISSING_COMPONENTS_MSG)
if(FPHSA_HANDLE_COMPONENTS)
foreach(comp ${${_NAME}_FIND_COMPONENTS})
if(${_NAME}_${comp}_FOUND)
if(NOT DEFINED FOUND_COMPONENTS_MSG)
set(FOUND_COMPONENTS_MSG "found components: ")
endif()
set(FOUND_COMPONENTS_MSG "${FOUND_COMPONENTS_MSG} ${comp}")
else()
if(NOT DEFINED MISSING_COMPONENTS_MSG)
set(MISSING_COMPONENTS_MSG "missing components: ")
endif()
set(MISSING_COMPONENTS_MSG "${MISSING_COMPONENTS_MSG} ${comp}")
if(${_NAME}_FIND_REQUIRED_${comp})
set(${_FOUND_VAR} FALSE)
set(MISSING_VARS "${MISSING_VARS} ${comp}")
endif()
endif()
endforeach()
set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}")
set(DETAILS "${DETAILS}[c${COMPONENT_MSG}]")
endif()
# version handling: # version handling:
SET(VERSION_MSG "") set(VERSION_MSG "")
SET(VERSION_OK TRUE) set(VERSION_OK TRUE)
SET(VERSION ${${FPHSA_VERSION_VAR}} ) set(VERSION ${${FPHSA_VERSION_VAR}} )
IF (${_NAME}_FIND_VERSION) if (${_NAME}_FIND_VERSION)
IF(VERSION) if(VERSION)
IF(${_NAME}_FIND_VERSION_EXACT) # exact version required if(${_NAME}_FIND_VERSION_EXACT) # exact version required
IF (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}") if (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}")
SET(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") set(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"")
SET(VERSION_OK FALSE) set(VERSION_OK FALSE)
ELSE (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}") else ()
SET(VERSION_MSG "(found suitable exact version \"${VERSION}\")") set(VERSION_MSG "(found suitable exact version \"${VERSION}\")")
ENDIF (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}") endif ()
ELSE(${_NAME}_FIND_VERSION_EXACT) # minimum version specified: else() # minimum version specified:
IF ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}") if ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}")
SET(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") set(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"")
SET(VERSION_OK FALSE) set(VERSION_OK FALSE)
ELSE ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}") else ()
SET(VERSION_MSG "(found suitable version \"${VERSION}\", required is \"${${_NAME}_FIND_VERSION}\")") set(VERSION_MSG "(found suitable version \"${VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")")
ENDIF ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}") endif ()
ENDIF(${_NAME}_FIND_VERSION_EXACT) endif()
ELSE(VERSION) else()
# if the package was not found, but a version was given, add that to the output: # if the package was not found, but a version was given, add that to the output:
IF(${_NAME}_FIND_VERSION_EXACT) if(${_NAME}_FIND_VERSION_EXACT)
SET(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")")
ELSE(${_NAME}_FIND_VERSION_EXACT) else()
SET(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")")
ENDIF(${_NAME}_FIND_VERSION_EXACT) endif()
ENDIF(VERSION) endif()
ELSE (${_NAME}_FIND_VERSION) else ()
IF(VERSION) if(VERSION)
SET(VERSION_MSG "(found version \"${VERSION}\")") set(VERSION_MSG "(found version \"${VERSION}\")")
ENDIF(VERSION) endif()
ENDIF (${_NAME}_FIND_VERSION) endif ()
IF(VERSION_OK) if(VERSION_OK)
SET(DETAILS "${DETAILS}[v${VERSION}(${${_NAME}_FIND_VERSION})]") set(DETAILS "${DETAILS}[v${VERSION}(${${_NAME}_FIND_VERSION})]")
ELSE(VERSION_OK) else()
SET(${_NAME_UPPER}_FOUND FALSE) set(${_FOUND_VAR} FALSE)
ENDIF(VERSION_OK) endif()
# print the result: # print the result:
IF (${_NAME_UPPER}_FOUND) if (${_FOUND_VAR})
FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG}" "${DETAILS}") FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}")
ELSE (${_NAME_UPPER}_FOUND) else ()
IF(FPHSA_CONFIG_MODE) if(FPHSA_CONFIG_MODE)
_FPHSA_HANDLE_FAILURE_CONFIG_MODE() _FPHSA_HANDLE_FAILURE_CONFIG_MODE()
ELSE(FPHSA_CONFIG_MODE) else()
IF(NOT VERSION_OK) if(NOT VERSION_OK)
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})")
ELSE(NOT VERSION_OK) else()
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing: ${MISSING_VARS}) ${VERSION_MSG}") _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing: ${MISSING_VARS}) ${VERSION_MSG}")
ENDIF(NOT VERSION_OK) endif()
ENDIF(FPHSA_CONFIG_MODE) endif()
ENDIF (${_NAME_UPPER}_FOUND) endif ()
SET(${_NAME_UPPER}_FOUND ${${_NAME_UPPER}_FOUND} PARENT_SCOPE) set(${_FOUND_VAR} ${${_FOUND_VAR}} PARENT_SCOPE)
ENDFUNCTION(FIND_PACKAGE_HANDLE_STANDARD_ARGS _FIRST_ARG) endfunction()
#.rst:
# FindPackageMessage
# ------------------
#
#
#
# FIND_PACKAGE_MESSAGE(<name> "message for user" "find result details")
#
# This macro is intended to be used in FindXXX.cmake modules files. It
# will print a message once for each unique find result. This is useful
# for telling the user where a package was found. The first argument
# specifies the name (XXX) of the package. The second argument
# specifies the message to display. The third argument lists details
# about the find result so that if they change the message will be
# displayed again. The macro also obeys the QUIET argument to the
# find_package command.
#
# Example:
#
# ::
#
# if(X11_FOUND)
# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}"
# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]")
# else()
# ...
# endif()
#=============================================================================
# Copyright 2008-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
function(FIND_PACKAGE_MESSAGE pkg msg details)
# Avoid printing a message repeatedly for the same find result.
if(NOT ${pkg}_FIND_QUIETLY)
string(REGEX REPLACE "[\n]" "" details "${details}")
set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg})
if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}")
# The message has not yet been printed.
message(STATUS "${msg}")
# Save the find details in the cache to avoid printing the same
# message again.
set("${DETAILS_VAR}" "${details}"
CACHE INTERNAL "Details about finding ${pkg}")
endif()
endif()
endfunction()
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# modules that you will use, you need to name them as components to # modules that you will use, you need to name them as components to
# the package: # the package:
# #
# FIND_PACKAGE(wxWidgets COMPONENTS core base ...) # find_package(wxWidgets COMPONENTS core base ...)
# #
# There are two search branches: a windows style and a unix style. For # There are two search branches: a windows style and a unix style. For
# windows, the following variables are searched for and set to # windows, the following variables are searched for and set to
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
# example, to use the base toolkit found in the /usr/local path, set # example, to use the base toolkit found in the /usr/local path, set
# the variable (before calling the FIND_PACKAGE command) as such: # the variable (before calling the FIND_PACKAGE command) as such:
# #
# SET(wxWidgets_CONFIG_OPTIONS --toolkit=base --prefix=/usr) # set(wxWidgets_CONFIG_OPTIONS --toolkit=base --prefix=/usr)
# #
# The following are set after the configuration is done for both # The following are set after the configuration is done for both
# windows and unix style: # windows and unix style:
...@@ -62,19 +62,25 @@ ...@@ -62,19 +62,25 @@
# #
# Sample usage: # Sample usage:
# # Note that for MinGW users the order of libs is important! # # Note that for MinGW users the order of libs is important!
# FIND_PACKAGE(wxWidgets COMPONENTS net gl core base) # find_package(wxWidgets COMPONENTS net gl core base)
# IF(wxWidgets_FOUND) # if(wxWidgets_FOUND)
# INCLUDE(${wxWidgets_USE_FILE}) # include(${wxWidgets_USE_FILE})
# # and for each of your dependent executable/library targets: # # and for each of your dependent executable/library targets:
# TARGET_LINK_LIBRARIES(<YourTarget> ${wxWidgets_LIBRARIES}) # target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})
# ENDIF(wxWidgets_FOUND) # endif(wxWidgets_FOUND)
# #
# If wxWidgets is required (i.e., not an optional part): # If wxWidgets is required (i.e., not an optional part):
# FIND_PACKAGE(wxWidgets REQUIRED net gl core base) # find_package(wxWidgets REQUIRED net gl core base)
# INCLUDE(${wxWidgets_USE_FILE}) # include(${wxWidgets_USE_FILE})
# # and for each of your dependent executable/library targets: # # and for each of your dependent executable/library targets:
# TARGET_LINK_LIBRARIES(<YourTarget> ${wxWidgets_LIBRARIES}) # target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})
#
# If a wxWidgets version or greater is required:
# find_package(wxWidgets 2.8.12 COMPONENTS net gl core base REQUIRED)
#
# If specific wxWidgets version is required:
# find_package(wxWidgets 2.8.12 EXACT COMPONENTS net gl core base REQUIRED)
#
#============================================================================= #=============================================================================
# Copyright 2004-2009 Kitware, Inc. # Copyright 2004-2009 Kitware, Inc.
# Copyright 2007-2009 Miguel A. Figueroa-Villanueva <miguelf at ieee dot org> # Copyright 2007-2009 Miguel A. Figueroa-Villanueva <miguelf at ieee dot org>
...@@ -94,7 +100,7 @@ ...@@ -94,7 +100,7 @@
# Remember to connect back to the upper text. # Remember to connect back to the upper text.
# Sample usage with monolithic wx build: # Sample usage with monolithic wx build:
# #
# FIND_PACKAGE(wxWidgets COMPONENTS mono) # find_package(wxWidgets COMPONENTS mono)
# ... # ...
# NOTES # NOTES
...@@ -138,24 +144,24 @@ ...@@ -138,24 +144,24 @@
# checking whether a minimal set was found. # checking whether a minimal set was found.
# FIXME: This and all the DBG_MSG calls should be removed after the # FIXME: This and all the dbg_msg calls should be removed after the
# module stabilizes. # module stabilizes.
# #
# Helper macro to control the debugging output globally. There are # Helper macro to control the debugging output globally. There are
# two versions for controlling how verbose your output should be. # two versions for controlling how verbose your output should be.
MACRO(DBG_MSG _MSG) macro(dbg_msg _MSG)
# MESSAGE(WARNING "${_MSG}") # message(STATUS "${_MSG}")
ENDMACRO(DBG_MSG) endmacro(dbg_msg)
MACRO(DBG_MSG_V _MSG) macro(dbg_msg_v _MSG)
# MESSAGE(WARNING "${_MSG}") # message(STATUS "${_MSG}")
ENDMACRO(DBG_MSG_V) endmacro(dbg_msg_v)
# Clear return values in case the module is loaded more than once. # Clear return values in case the module is loaded more than once.
SET(wxWidgets_FOUND FALSE) set(wxWidgets_FOUND FALSE)
SET(wxWidgets_INCLUDE_DIRS "") set(wxWidgets_INCLUDE_DIRS "")
SET(wxWidgets_LIBRARIES "") set(wxWidgets_LIBRARIES "")
SET(wxWidgets_LIBRARY_DIRS "") set(wxWidgets_LIBRARY_DIRS "")
SET(wxWidgets_CXX_FLAGS "") set(wxWidgets_CXX_FLAGS "")
# Using SYSTEM with INCLUDE_DIRECTORIES in conjunction with wxWidgets on # Using SYSTEM with INCLUDE_DIRECTORIES in conjunction with wxWidgets on
# the Mac produces compiler errors. Set wxWidgets_INCLUDE_DIRS_NO_SYSTEM # the Mac produces compiler errors. Set wxWidgets_INCLUDE_DIRS_NO_SYSTEM
...@@ -165,9 +171,9 @@ SET(wxWidgets_CXX_FLAGS "") ...@@ -165,9 +171,9 @@ SET(wxWidgets_CXX_FLAGS "")
# http://www.cmake.org/pipermail/cmake/2008-April/021115.html # http://www.cmake.org/pipermail/cmake/2008-April/021115.html
# http://www.cmake.org/pipermail/cmake/2008-April/021146.html # http://www.cmake.org/pipermail/cmake/2008-April/021146.html
# #
IF(APPLE) if(APPLE)
SET(wxWidgets_INCLUDE_DIRS_NO_SYSTEM 1) set(wxWidgets_INCLUDE_DIRS_NO_SYSTEM 1)
ENDIF(APPLE) endif(APPLE)
# DEPRECATED: This is a patch to support the DEPRECATED use of # DEPRECATED: This is a patch to support the DEPRECATED use of
# wxWidgets_USE_LIBS. # wxWidgets_USE_LIBS.
...@@ -175,66 +181,66 @@ ENDIF(APPLE) ...@@ -175,66 +181,66 @@ ENDIF(APPLE)
# If wxWidgets_USE_LIBS is set: # If wxWidgets_USE_LIBS is set:
# - if using <components>, then override wxWidgets_USE_LIBS # - if using <components>, then override wxWidgets_USE_LIBS
# - else set wxWidgets_FIND_COMPONENTS to wxWidgets_USE_LIBS # - else set wxWidgets_FIND_COMPONENTS to wxWidgets_USE_LIBS
IF(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS) if(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS)
SET(wxWidgets_FIND_COMPONENTS ${wxWidgets_USE_LIBS}) set(wxWidgets_FIND_COMPONENTS ${wxWidgets_USE_LIBS})
ENDIF(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS) endif(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS)
DBG_MSG("wxWidgets_FIND_COMPONENTS : ${wxWidgets_FIND_COMPONENTS}") dbg_msg("wxWidgets_FIND_COMPONENTS : ${wxWidgets_FIND_COMPONENTS}")
# Add the convenience use file if available. # Add the convenience use file if available.
# #
# Get dir of this file which may reside in: # Get dir of this file which may reside in:
# - CMAKE_MAKE_ROOT/Modules on CMake installation # - CMAKE_MAKE_ROOT/Modules on CMake installation
# - CMAKE_MODULE_PATH if user prefers his own specialized version # - CMAKE_MODULE_PATH if user prefers his own specialized version
SET(wxWidgets_USE_FILE "") set(wxWidgets_USE_FILE "")
GET_FILENAME_COMPONENT( get_filename_component(
wxWidgets_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) wxWidgets_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
# Prefer an existing customized version, but the user might override # Prefer an existing customized version, but the user might override
# the FindwxWidgets module and not the UsewxWidgets one. # the FindwxWidgets module and not the UsewxWidgets one.
IF(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") if(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
SET(wxWidgets_USE_FILE set(wxWidgets_USE_FILE
"${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
ELSE(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") else(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
SET(wxWidgets_USE_FILE UsewxWidgets) set(wxWidgets_USE_FILE UsewxWidgets)
ENDIF(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") endif(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
#===================================================================== #=====================================================================
#===================================================================== #=====================================================================
IF(WIN32 AND NOT CYGWIN AND NOT MSYS AND NOT CMAKE_HOST_UNIX ) if(WIN32 AND NOT CYGWIN AND NOT MSYS AND NOT CMAKE_HOST_UNIX )
DBG_MSG( "setting win32 style" ) dbg_msg( "setting win32 style" )
SET(wxWidgets_FIND_STYLE "win32") set(wxWidgets_FIND_STYLE "win32")
ELSE() else()
IF(CMAKE_HOST_UNIX OR MSYS) if(CMAKE_HOST_UNIX OR MSYS)
DBG_MSG( "unix style" ) dbg_msg( "unix style" )
SET(wxWidgets_FIND_STYLE "unix") set(wxWidgets_FIND_STYLE "unix")
ENDIF() endif()
ENDIF() endif()
#===================================================================== #=====================================================================
# WIN32_FIND_STYLE # WIN32_FIND_STYLE
#===================================================================== #=====================================================================
IF(wxWidgets_FIND_STYLE STREQUAL "win32") if(wxWidgets_FIND_STYLE STREQUAL "win32")
DBG_MSG("Using win32 path") dbg_msg("Using win32 path")
# Useful common wx libs needed by almost all components. # Useful common wx libs needed by almost all components.
SET(wxWidgets_COMMON_LIBRARIES png tiff jpeg zlib regex expat) set(wxWidgets_COMMON_LIBRARIES png tiff jpeg zlib regex expat)
# DEPRECATED: Use FIND_PACKAGE(wxWidgets COMPONENTS mono) instead. # DEPRECATED: Use find_package(wxWidgets COMPONENTS mono) instead.
IF(NOT wxWidgets_FIND_COMPONENTS) if(NOT wxWidgets_FIND_COMPONENTS)
IF(wxWidgets_USE_MONOLITHIC) if(wxWidgets_USE_MONOLITHIC)
SET(wxWidgets_FIND_COMPONENTS mono) set(wxWidgets_FIND_COMPONENTS mono)
ELSE(wxWidgets_USE_MONOLITHIC) else(wxWidgets_USE_MONOLITHIC)
SET(wxWidgets_FIND_COMPONENTS core base) # this is default set(wxWidgets_FIND_COMPONENTS core base) # this is default
ENDIF(wxWidgets_USE_MONOLITHIC) endif(wxWidgets_USE_MONOLITHIC)
ENDIF(NOT wxWidgets_FIND_COMPONENTS) endif(NOT wxWidgets_FIND_COMPONENTS)
# Add the common (usually required libs) unless # Add the common (usually required libs) unless
# wxWidgets_EXCLUDE_COMMON_LIBRARIES has been set. # wxWidgets_EXCLUDE_COMMON_LIBRARIES has been set.
IF(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES) if(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES)
LIST(APPEND wxWidgets_FIND_COMPONENTS list(APPEND wxWidgets_FIND_COMPONENTS
${wxWidgets_COMMON_LIBRARIES}) ${wxWidgets_COMMON_LIBRARIES})
ENDIF(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES) endif(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES)
#------------------------------------------------------------------- #-------------------------------------------------------------------
# WIN32: Helper MACROS # WIN32: Helper MACROS
...@@ -244,41 +250,41 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -244,41 +250,41 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
# if _CONFIGURATION = mswunivud, then _UNV=univ, _UCD=u _DBG=d # if _CONFIGURATION = mswunivud, then _UNV=univ, _UCD=u _DBG=d
# if _CONFIGURATION = mswu, then _UNV="", _UCD=u _DBG="" # if _CONFIGURATION = mswu, then _UNV="", _UCD=u _DBG=""
# #
MACRO(WX_GET_NAME_COMPONENTS _CONFIGURATION _UNV _UCD _DBG) macro(wx_get_name_components _CONFIGURATION _UNV _UCD _DBG)
STRING(REGEX MATCH "univ" ${_UNV} "${_CONFIGURATION}") string(REGEX MATCH "univ" ${_UNV} "${_CONFIGURATION}")
STRING(REGEX REPLACE "msw.*(u)[d]*$" "u" ${_UCD} "${_CONFIGURATION}") string(REGEX REPLACE "msw.*(u)[d]*$" "u" ${_UCD} "${_CONFIGURATION}")
IF(${_UCD} STREQUAL ${_CONFIGURATION}) if(${_UCD} STREQUAL ${_CONFIGURATION})
SET(${_UCD} "") set(${_UCD} "")
ENDIF(${_UCD} STREQUAL ${_CONFIGURATION}) endif(${_UCD} STREQUAL ${_CONFIGURATION})
STRING(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}") string(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}")
ENDMACRO(WX_GET_NAME_COMPONENTS) endmacro(wx_get_name_components)
# #
# Find libraries associated to a configuration. # Find libraries associated to a configuration.
# #
MACRO(WX_FIND_LIBS _UNV _UCD _DBG) macro(wx_find_libs _UNV _UCD _DBG)
DBG_MSG_V("m_unv = ${_UNV}") dbg_msg_v("m_unv = ${_UNV}")
DBG_MSG_V("m_ucd = ${_UCD}") dbg_msg_v("m_ucd = ${_UCD}")
DBG_MSG_V("m_dbg = ${_DBG}") dbg_msg_v("m_dbg = ${_DBG}")
# FIXME: What if both regex libs are available. regex should be # FIXME: What if both regex libs are available. regex should be
# found outside the loop and only wx${LIB}${_UCD}${_DBG}. # found outside the loop and only wx${LIB}${_UCD}${_DBG}.
# Find wxWidgets common libraries. # Find wxWidgets common libraries.
FOREACH(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla) foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla)
FIND_LIBRARY(WX_${LIB}${_DBG} find_library(WX_${LIB}${_DBG}
NAMES NAMES
wx${LIB}${_UCD}${_DBG} # for regex wx${LIB}${_UCD}${_DBG} # for regex
wx${LIB}${_DBG} wx${LIB}${_DBG}
PATHS ${WX_LIB_DIR} PATHS ${WX_LIB_DIR}
NO_DEFAULT_PATH NO_DEFAULT_PATH
) )
MARK_AS_ADVANCED(WX_${LIB}${_DBG}) mark_as_advanced(WX_${LIB}${_DBG})
ENDFOREACH(LIB) endforeach(LIB)
DBG_MSG( "WX_LIB_DIR:${WX_LIB_DIR}" ) dbg_msg( "WX_LIB_DIR:${WX_LIB_DIR}" )
# Find wxWidgets multilib base libraries. # Find wxWidgets multilib base libraries.
FIND_LIBRARY(WX_base${_DBG} find_library(WX_base${_DBG}
NAMES NAMES
wxbase31${_UCD}${_DBG} wxbase31${_UCD}${_DBG}
wxbase30${_UCD}${_DBG} wxbase30${_UCD}${_DBG}
...@@ -290,9 +296,9 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -290,9 +296,9 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
PATHS ${WX_LIB_DIR} PATHS ${WX_LIB_DIR}
NO_DEFAULT_PATH NO_DEFAULT_PATH
) )
MARK_AS_ADVANCED(WX_base${_DBG}) mark_as_advanced(WX_base${_DBG})
FOREACH(LIB net odbc xml) foreach(LIB net odbc xml)
FIND_LIBRARY(WX_${LIB}${_DBG} find_library(WX_${LIB}${_DBG}
NAMES NAMES
wxbase31${_UCD}${_DBG}_${LIB} wxbase31${_UCD}${_DBG}_${LIB}
wxbase30${_UCD}${_DBG}_${LIB} wxbase30${_UCD}${_DBG}_${LIB}
...@@ -304,11 +310,11 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -304,11 +310,11 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
PATHS ${WX_LIB_DIR} PATHS ${WX_LIB_DIR}
NO_DEFAULT_PATH NO_DEFAULT_PATH
) )
MARK_AS_ADVANCED(WX_${LIB}${_DBG}) mark_as_advanced(WX_${LIB}${_DBG})
ENDFOREACH(LIB) endforeach(LIB)
# Find wxWidgets monolithic library. # Find wxWidgets monolithic library.
FIND_LIBRARY(WX_mono${_DBG} find_library(WX_mono${_DBG}
NAMES NAMES
wxmsw${_UNV}31${_UCD}${_DBG} wxmsw${_UNV}31${_UCD}${_DBG}
wxmsw${_UNV}30${_UCD}${_DBG} wxmsw${_UNV}30${_UCD}${_DBG}
...@@ -320,12 +326,12 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -320,12 +326,12 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
PATHS ${WX_LIB_DIR} PATHS ${WX_LIB_DIR}
NO_DEFAULT_PATH NO_DEFAULT_PATH
) )
MARK_AS_ADVANCED(WX_mono${_DBG}) mark_as_advanced(WX_mono${_DBG})
# Find wxWidgets multilib libraries. # Find wxWidgets multilib libraries.
FOREACH(LIB core adv aui html media xrc dbgrid gl qa richtext foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
stc ribbon propgrid) stc ribbon propgrid)
FIND_LIBRARY(WX_${LIB}${_DBG} find_library(WX_${LIB}${_DBG}
NAMES NAMES
wxmsw${_UNV}31${_UCD}${_DBG}_${LIB} wxmsw${_UNV}31${_UCD}${_DBG}_${LIB}
wxmsw${_UNV}30${_UCD}${_DBG}_${LIB} wxmsw${_UNV}30${_UCD}${_DBG}_${LIB}
...@@ -337,102 +343,102 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -337,102 +343,102 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
PATHS ${WX_LIB_DIR} PATHS ${WX_LIB_DIR}
NO_DEFAULT_PATH NO_DEFAULT_PATH
) )
MARK_AS_ADVANCED(WX_${LIB}${_DBG}) mark_as_advanced(WX_${LIB}${_DBG})
ENDFOREACH(LIB) endforeach(LIB)
ENDMACRO(WX_FIND_LIBS) endmacro(wx_find_libs)
# #
# Clear all library paths, so that FIND_LIBRARY refinds them. # Clear all library paths, so that FIND_LIBRARY refinds them.
# #
# Clear a lib, reset its found flag, and mark as advanced. # Clear a lib, reset its found flag, and mark as advanced.
MACRO(WX_CLEAR_LIB _LIB) macro(wx_clear_lib _LIB)
SET(${_LIB} "${_LIB}-NOTFOUND" CACHE FILEPATH "Cleared." FORCE) set(${_LIB} "${_LIB}-NOTFOUND" CACHE FILEPATH "Cleared." FORCE)
SET(${_LIB}_FOUND FALSE) set(${_LIB}_FOUND FALSE)
MARK_AS_ADVANCED(${_LIB}) mark_as_advanced(${_LIB})
ENDMACRO(WX_CLEAR_LIB) endmacro(wx_clear_lib)
# Clear all debug or release library paths (arguments are "d" or ""). # Clear all debug or release library paths (arguments are "d" or "").
MACRO(WX_CLEAR_ALL_LIBS _DBG) macro(wx_clear_all_libs _DBG)
# Clear wxWidgets common libraries. # Clear wxWidgets common libraries.
FOREACH(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla) foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla)
WX_CLEAR_LIB(WX_${LIB}${_DBG}) wx_clear_lib(WX_${LIB}${_DBG})
ENDFOREACH(LIB) endforeach(LIB)
# Clear wxWidgets multilib base libraries. # Clear wxWidgets multilib base libraries.
WX_CLEAR_LIB(WX_base${_DBG}) wx_clear_lib(WX_base${_DBG})
FOREACH(LIB net odbc xml) foreach(LIB net odbc xml)
WX_CLEAR_LIB(WX_${LIB}${_DBG}) wx_clear_lib(WX_${LIB}${_DBG})
ENDFOREACH(LIB) endforeach(LIB)
# Clear wxWidgets monolithic library. # Clear wxWidgets monolithic library.
WX_CLEAR_LIB(WX_mono${_DBG}) wx_clear_lib(WX_mono${_DBG})
# Clear wxWidgets multilib libraries. # Clear wxWidgets multilib libraries.
FOREACH(LIB core adv aui html media xrc dbgrid gl qa richtext foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
stc ribbon propgrid) stc ribbon propgrid)
WX_CLEAR_LIB(WX_${LIB}${_DBG}) wx_clear_lib(WX_${LIB}${_DBG})
ENDFOREACH(LIB) endforeach(LIB)
ENDMACRO(WX_CLEAR_ALL_LIBS) endmacro(wx_clear_all_libs)
# Clear all wxWidgets debug libraries. # Clear all wxWidgets debug libraries.
MACRO(WX_CLEAR_ALL_DBG_LIBS) macro(wx_clear_all_dbg_libs)
WX_CLEAR_ALL_LIBS("d") wx_clear_all_libs("d")
ENDMACRO(WX_CLEAR_ALL_DBG_LIBS) endmacro(wx_clear_all_dbg_libs)
# Clear all wxWidgets release libraries. # Clear all wxWidgets release libraries.
MACRO(WX_CLEAR_ALL_REL_LIBS) macro(wx_clear_all_rel_libs)
WX_CLEAR_ALL_LIBS("") wx_clear_all_libs("")
ENDMACRO(WX_CLEAR_ALL_REL_LIBS) endmacro(wx_clear_all_rel_libs)
# #
# Set the wxWidgets_LIBRARIES variable. # Set the wxWidgets_LIBRARIES variable.
# Also, Sets output variable wxWidgets_FOUND to FALSE if it fails. # Also, Sets output variable wxWidgets_FOUND to FALSE if it fails.
# #
MACRO(WX_SET_LIBRARIES _LIBS _DBG) macro(wx_set_libraries _LIBS _DBG)
DBG_MSG_V("Looking for ${${_LIBS}}") dbg_msg_v("Looking for ${${_LIBS}}")
IF(WX_USE_REL_AND_DBG) if(WX_USE_REL_AND_DBG)
FOREACH(LIB ${${_LIBS}}) foreach(LIB ${${_LIBS}})
DBG_MSG_V("Searching for ${LIB} and ${LIB}d") dbg_msg_v("Searching for ${LIB} and ${LIB}d")
DBG_MSG_V("WX_${LIB} : ${WX_${LIB}}") dbg_msg_v("WX_${LIB} : ${WX_${LIB}}")
DBG_MSG_V("WX_${LIB}d : ${WX_${LIB}d}") dbg_msg_v("WX_${LIB}d : ${WX_${LIB}d}")
IF(WX_${LIB} AND WX_${LIB}d) if(WX_${LIB} AND WX_${LIB}d)
DBG_MSG_V("Found ${LIB} and ${LIB}d") dbg_msg_v("Found ${LIB} and ${LIB}d")
LIST(APPEND wxWidgets_LIBRARIES list(APPEND wxWidgets_LIBRARIES
debug ${WX_${LIB}d} optimized ${WX_${LIB}} debug ${WX_${LIB}d} optimized ${WX_${LIB}}
) )
ELSE(WX_${LIB} AND WX_${LIB}d) else(WX_${LIB} AND WX_${LIB}d)
DBG_MSG_V("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}") dbg_msg_v("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}")
SET(wxWidgets_FOUND FALSE) set(wxWidgets_FOUND FALSE)
ENDIF(WX_${LIB} AND WX_${LIB}d) endif(WX_${LIB} AND WX_${LIB}d)
ENDFOREACH(LIB) endforeach(LIB)
ELSE(WX_USE_REL_AND_DBG) else(WX_USE_REL_AND_DBG)
FOREACH(LIB ${${_LIBS}}) foreach(LIB ${${_LIBS}})
DBG_MSG_V("Searching for ${LIB}${_DBG}") dbg_msg_v("Searching for ${LIB}${_DBG}")
DBG_MSG_V("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}") dbg_msg_v("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}")
IF(WX_${LIB}${_DBG}) if(WX_${LIB}${_DBG})
DBG_MSG_V("Found ${LIB}${_DBG}") dbg_msg_v("Found ${LIB}${_DBG}")
LIST(APPEND wxWidgets_LIBRARIES ${WX_${LIB}${_DBG}}) list(APPEND wxWidgets_LIBRARIES ${WX_${LIB}${_DBG}})
ELSE(WX_${LIB}${_DBG}) else(WX_${LIB}${_DBG})
DBG_MSG_V( dbg_msg_v(
"- not found due to missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}") "- not found due to missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}")
SET(wxWidgets_FOUND FALSE) set(wxWidgets_FOUND FALSE)
ENDIF(WX_${LIB}${_DBG}) endif(WX_${LIB}${_DBG})
ENDFOREACH(LIB) endforeach(LIB)
ENDIF(WX_USE_REL_AND_DBG) endif(WX_USE_REL_AND_DBG)
DBG_MSG_V("OpenGL") dbg_msg_v("OpenGL")
LIST(FIND ${_LIBS} gl WX_USE_GL) list(FIND ${_LIBS} gl WX_USE_GL)
IF(NOT WX_USE_GL EQUAL -1) if(NOT WX_USE_GL EQUAL -1)
DBG_MSG_V("- is required.") dbg_msg_v("- is required.")
LIST(APPEND wxWidgets_LIBRARIES opengl32 glu32) list(APPEND wxWidgets_LIBRARIES opengl32 glu32)
ENDIF(NOT WX_USE_GL EQUAL -1) endif(NOT WX_USE_GL EQUAL -1)
LIST(APPEND wxWidgets_LIBRARIES winmm comctl32 rpcrt4 wsock32) list(APPEND wxWidgets_LIBRARIES winmm comctl32 rpcrt4 wsock32)
ENDMACRO(WX_SET_LIBRARIES) endmacro(wx_set_libraries)
#------------------------------------------------------------------- #-------------------------------------------------------------------
# WIN32: Start actual work. # WIN32: Start actual work.
#------------------------------------------------------------------- #-------------------------------------------------------------------
# Look for an installation tree. # Look for an installation tree.
FIND_PATH(wxWidgets_ROOT_DIR find_path(wxWidgets_ROOT_DIR
NAMES include/wx/wx.h NAMES include/wx/wx.h
PATHS PATHS
$ENV{wxWidgets_ROOT_DIR} $ENV{wxWidgets_ROOT_DIR}
...@@ -442,7 +448,7 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -442,7 +448,7 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
D:/ D:/
$ENV{ProgramFiles} $ENV{ProgramFiles}
PATH_SUFFIXES PATH_SUFFIXES
wxWidgets-3.1.0 wxWidgets-3.0.1
wxWidgets-3.0.0 wxWidgets-3.0.0
wxWidgets-2.9.5 wxWidgets-2.9.5
wxWidgets-2.9.4 wxWidgets-2.9.4
...@@ -479,30 +485,30 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -479,30 +485,30 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
) )
# If wxWidgets_ROOT_DIR changed, clear lib dir. # If wxWidgets_ROOT_DIR changed, clear lib dir.
IF(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR) if(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR)
DBG_MSG( "WX_ROOT_DIR != wxWidgets_ROOT_DIR" ) dbg_msg( "WX_ROOT_DIR != wxWidgets_ROOT_DIR" )
SET(WX_ROOT_DIR ${wxWidgets_ROOT_DIR} set(WX_ROOT_DIR ${wxWidgets_ROOT_DIR}
CACHE INTERNAL "wxWidgets_ROOT_DIR") CACHE INTERNAL "wxWidgets_ROOT_DIR")
SET(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND" set(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND"
CACHE PATH "Cleared." FORCE) CACHE PATH "Cleared." FORCE)
ENDIF(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR) endif(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR)
IF(WX_ROOT_DIR) if(WX_ROOT_DIR)
DBG_MSG( "WX_ROOT_DIR == wxWidgets_ROOT_DIR" ) dbg_msg( "WX_ROOT_DIR == wxWidgets_ROOT_DIR" )
# Select one default tree inside the already determined wx tree. # Select one default tree inside the already determined wx tree.
# Prefer static/shared order usually consistent with build # Prefer static/shared order usually consistent with build
# settings. # settings.
IF(MINGW) if(MINGW)
DBG_MSG( "MINGW" ) dbg_msg( "MINGW" )
SET(WX_LIB_DIR_PREFIX gcc) set(WX_LIB_DIR_PREFIX gcc)
ELSE(MINGW) else(MINGW)
SET(WX_LIB_DIR_PREFIX vc) set(WX_LIB_DIR_PREFIX vc)
ENDIF(MINGW) endif(MINGW)
IF(BUILD_SHARED_LIBS) if(BUILD_SHARED_LIBS)
DBG_MSG( "BUILD_SHARED_LIBS" ) dbg_msg( "BUILD_SHARED_LIBS" )
FIND_PATH(wxWidgets_LIB_DIR find_path(wxWidgets_LIB_DIR
NAMES NAMES
msw/wx/setup.h msw/wx/setup.h
mswd/wx/setup.h mswd/wx/setup.h
...@@ -518,9 +524,9 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -518,9 +524,9 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
DOC "Path to wxWidgets libraries?" DOC "Path to wxWidgets libraries?"
NO_DEFAULT_PATH NO_DEFAULT_PATH
) )
ELSE(BUILD_SHARED_LIBS) else(BUILD_SHARED_LIBS)
DBG_MSG( "!BUILD_SHARED_LIBS WX_LIB_DIR:${WX_LIB_DIR}" ) dbg_msg( "!BUILD_SHARED_LIBS WX_LIB_DIR:${WX_LIB_DIR}" )
FIND_PATH(wxWidgets_LIB_DIR find_path(wxWidgets_LIB_DIR
NAMES NAMES
msw/wx/setup.h msw/wx/setup.h
mswd/wx/setup.h mswd/wx/setup.h
...@@ -536,111 +542,111 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -536,111 +542,111 @@ IF(wxWidgets_FIND_STYLE STREQUAL "win32")
DOC "Path to wxWidgets libraries?" DOC "Path to wxWidgets libraries?"
NO_DEFAULT_PATH NO_DEFAULT_PATH
) )
ENDIF(BUILD_SHARED_LIBS) endif(BUILD_SHARED_LIBS)
# If wxWidgets_LIB_DIR changed, clear all libraries. # If wxWidgets_LIB_DIR changed, clear all libraries.
IF(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR) if(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR)
SET(WX_LIB_DIR ${wxWidgets_LIB_DIR} CACHE INTERNAL "wxWidgets_LIB_DIR") set(WX_LIB_DIR ${wxWidgets_LIB_DIR} CACHE INTERNAL "wxWidgets_LIB_DIR")
WX_CLEAR_ALL_DBG_LIBS() wx_clear_all_dbg_libs()
WX_CLEAR_ALL_REL_LIBS() wx_clear_all_rel_libs()
ENDIF(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR) endif(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR)
IF(WX_LIB_DIR) if(WX_LIB_DIR)
# If building shared libs, define WXUSINGDLL to use dllimport. # If building shared libs, define WXUSINGDLL to use dllimport.
IF(WX_LIB_DIR MATCHES ".*[dD][lL][lL].*") if(WX_LIB_DIR MATCHES ".*[dD][lL][lL].*")
SET(wxWidgets_DEFINITIONS WXUSINGDLL) set(wxWidgets_DEFINITIONS WXUSINGDLL)
DBG_MSG_V("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}") dbg_msg_v("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}")
ENDIF(WX_LIB_DIR MATCHES ".*[dD][lL][lL].*") endif(WX_LIB_DIR MATCHES ".*[dD][lL][lL].*")
# Search for available configuration types. # Search for available configuration types.
FOREACH(CFG mswunivud mswunivd mswud mswd mswunivu mswuniv mswu msw) foreach(CFG mswunivud mswunivd mswud mswd mswunivu mswuniv mswu msw)
SET(WX_${CFG}_FOUND FALSE) set(WX_${CFG}_FOUND FALSE)
IF(EXISTS ${WX_LIB_DIR}/${CFG}) if(EXISTS ${WX_LIB_DIR}/${CFG})
LIST(APPEND WX_CONFIGURATION_LIST ${CFG}) list(APPEND WX_CONFIGURATION_LIST ${CFG})
SET(WX_${CFG}_FOUND TRUE) set(WX_${CFG}_FOUND TRUE)
SET(WX_CONFIGURATION ${CFG}) set(WX_CONFIGURATION ${CFG})
ENDIF(EXISTS ${WX_LIB_DIR}/${CFG}) endif(EXISTS ${WX_LIB_DIR}/${CFG})
ENDFOREACH(CFG) endforeach(CFG)
DBG_MSG_V("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}") dbg_msg_v("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}")
IF(WX_CONFIGURATION) if(WX_CONFIGURATION)
SET(wxWidgets_FOUND TRUE) set(wxWidgets_FOUND TRUE)
# If the selected configuration wasn't found force the default # If the selected configuration wasn't found force the default
# one. Otherwise, use it but still force a refresh for # one. Otherwise, use it but still force a refresh for
# updating the doc string with the current list of available # updating the doc string with the current list of available
# configurations. # configurations.
IF(NOT WX_${wxWidgets_CONFIGURATION}_FOUND) if(NOT WX_${wxWidgets_CONFIGURATION}_FOUND)
SET(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING set(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING
"Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE) "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
ELSE(NOT WX_${wxWidgets_CONFIGURATION}_FOUND) else(NOT WX_${wxWidgets_CONFIGURATION}_FOUND)
SET(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING set(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING
"Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE) "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
ENDIF(NOT WX_${wxWidgets_CONFIGURATION}_FOUND) endif(NOT WX_${wxWidgets_CONFIGURATION}_FOUND)
# If release config selected, and both release/debug exist. # If release config selected, and both release/debug exist.
IF(WX_${wxWidgets_CONFIGURATION}d_FOUND) if(WX_${wxWidgets_CONFIGURATION}d_FOUND)
OPTION(wxWidgets_USE_REL_AND_DBG OPTION(wxWidgets_USE_REL_AND_DBG
"Use release and debug configurations?" TRUE) "Use release and debug configurations?" TRUE)
SET(WX_USE_REL_AND_DBG ${wxWidgets_USE_REL_AND_DBG}) set(WX_USE_REL_AND_DBG ${wxWidgets_USE_REL_AND_DBG})
ELSE(WX_${wxWidgets_CONFIGURATION}d_FOUND) else(WX_${wxWidgets_CONFIGURATION}d_FOUND)
# If the option exists (already in cache), force it false. # If the option exists (already in cache), force it false.
IF(wxWidgets_USE_REL_AND_DBG) if(wxWidgets_USE_REL_AND_DBG)
SET(wxWidgets_USE_REL_AND_DBG FALSE CACHE BOOL set(wxWidgets_USE_REL_AND_DBG FALSE CACHE BOOL
"No ${wxWidgets_CONFIGURATION}d found." FORCE) "No ${wxWidgets_CONFIGURATION}d found." FORCE)
ENDIF(wxWidgets_USE_REL_AND_DBG) endif(wxWidgets_USE_REL_AND_DBG)
SET(WX_USE_REL_AND_DBG FALSE) set(WX_USE_REL_AND_DBG FALSE)
ENDIF(WX_${wxWidgets_CONFIGURATION}d_FOUND) endif(WX_${wxWidgets_CONFIGURATION}d_FOUND)
# Get configuration parameters from the name. # Get configuration parameters from the name.
WX_GET_NAME_COMPONENTS(${wxWidgets_CONFIGURATION} UNV UCD DBG) wx_get_name_components(${wxWidgets_CONFIGURATION} UNV UCD DBG)
# Set wxWidgets lib setup include directory. # Set wxWidgets lib setup include directory.
IF(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h) if(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h)
SET(wxWidgets_INCLUDE_DIRS set(wxWidgets_INCLUDE_DIRS
${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}) ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION})
ELSE(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h) else(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h)
DBG_MSG("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exists.") dbg_msg("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exists.")
SET(wxWidgets_FOUND FALSE) set(wxWidgets_FOUND FALSE)
ENDIF(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h) endif(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h)
# Set wxWidgets main include directory. # Set wxWidgets main include directory.
IF(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h) if(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h)
LIST(APPEND wxWidgets_INCLUDE_DIRS ${WX_ROOT_DIR}/include) list(APPEND wxWidgets_INCLUDE_DIRS ${WX_ROOT_DIR}/include)
ELSE(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h) else(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h)
DBG_MSG("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h") dbg_msg("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h")
SET(wxWidgets_FOUND FALSE) set(wxWidgets_FOUND FALSE)
ENDIF(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h) endif(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h)
# Find wxWidgets libraries. # Find wxWidgets libraries.
WX_FIND_LIBS("${UNV}" "${UCD}" "${DBG}") wx_find_libs("${UNV}" "${UCD}" "${DBG}")
IF(WX_USE_REL_AND_DBG) if(WX_USE_REL_AND_DBG)
WX_FIND_LIBS("${UNV}" "${UCD}" "d") wx_find_libs("${UNV}" "${UCD}" "d")
ENDIF(WX_USE_REL_AND_DBG) endif(WX_USE_REL_AND_DBG)
# Settings for requested libs (i.e., include dir, libraries, etc.). # Settings for requested libs (i.e., include dir, libraries, etc.).
WX_SET_LIBRARIES(wxWidgets_FIND_COMPONENTS "${DBG}") wx_set_libraries(wxWidgets_FIND_COMPONENTS "${DBG}")
# Add necessary definitions for unicode builds # Add necessary definitions for unicode builds
IF("${UCD}" STREQUAL "u") if("${UCD}" STREQUAL "u")
LIST(APPEND wxWidgets_DEFINITIONS UNICODE _UNICODE) list(APPEND wxWidgets_DEFINITIONS UNICODE _UNICODE)
ENDIF("${UCD}" STREQUAL "u") endif("${UCD}" STREQUAL "u")
# Add necessary definitions for debug builds # Add necessary definitions for debug builds
SET(wxWidgets_DEFINITIONS_DEBUG _DEBUG __WXDEBUG__) set(wxWidgets_DEFINITIONS_DEBUG _DEBUG __WXDEBUG__)
ENDIF(WX_CONFIGURATION) endif(WX_CONFIGURATION)
ENDIF(WX_LIB_DIR) endif(WX_LIB_DIR)
ENDIF(WX_ROOT_DIR) endif(WX_ROOT_DIR)
#===================================================================== #=====================================================================
# UNIX_FIND_STYLE # UNIX_FIND_STYLE
#===================================================================== #=====================================================================
ELSE(wxWidgets_FIND_STYLE STREQUAL "win32") else(wxWidgets_FIND_STYLE STREQUAL "win32")
DBG_MSG("NOT win32 path") dbg_msg("NOT win32 path")
IF(wxWidgets_FIND_STYLE STREQUAL "unix") if(wxWidgets_FIND_STYLE STREQUAL "unix")
DBG_MSG("unix find style") dbg_msg("unix find style")
#----------------------------------------------------------------- #-----------------------------------------------------------------
# UNIX: Helper MACROS # UNIX: Helper MACROS
...@@ -648,221 +654,255 @@ ELSE(wxWidgets_FIND_STYLE STREQUAL "win32") ...@@ -648,221 +654,255 @@ ELSE(wxWidgets_FIND_STYLE STREQUAL "win32")
# #
# Set the default values based on "wx-config --selected-config". # Set the default values based on "wx-config --selected-config".
# #
MACRO(WX_CONFIG_SELECT_GET_DEFAULT) macro(wx_config_select_get_default)
EXECUTE_PROCESS( execute_process(
COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
${wxWidgets_CONFIG_OPTIONS} --selected-config ${wxWidgets_CONFIG_OPTIONS} --selected-config
OUTPUT_VARIABLE _wx_selected_config OUTPUT_VARIABLE _wx_selected_config
RESULT_VARIABLE _wx_result RESULT_VARIABLE _wx_result
ERROR_QUIET ERROR_QUIET
) )
IF(_wx_result EQUAL 0) if(_wx_result EQUAL 0)
FOREACH(_opt_name debug static unicode universal) foreach(_opt_name debug static unicode universal)
STRING(TOUPPER ${_opt_name} _upper_opt_name) string(TOUPPER ${_opt_name} _upper_opt_name)
IF(_wx_selected_config MATCHES ".*${_opt_name}.*") if(_wx_selected_config MATCHES ".*${_opt_name}.*")
SET(wxWidgets_DEFAULT_${_upper_opt_name} ON) set(wxWidgets_DEFAULT_${_upper_opt_name} ON)
ELSE(_wx_selected_config MATCHES ".*${_opt_name}.*") else(_wx_selected_config MATCHES ".*${_opt_name}.*")
SET(wxWidgets_DEFAULT_${_upper_opt_name} OFF) set(wxWidgets_DEFAULT_${_upper_opt_name} OFF)
ENDIF(_wx_selected_config MATCHES ".*${_opt_name}.*") endif(_wx_selected_config MATCHES ".*${_opt_name}.*")
ENDFOREACH(_opt_name) endforeach(_opt_name)
ELSE(_wx_result EQUAL 0) else(_wx_result EQUAL 0)
FOREACH(_upper_opt_name DEBUG STATIC UNICODE UNIVERSAL) foreach(_upper_opt_name DEBUG STATIC UNICODE UNIVERSAL)
SET(wxWidgets_DEFAULT_${_upper_opt_name} OFF) set(wxWidgets_DEFAULT_${_upper_opt_name} OFF)
ENDFOREACH(_upper_opt_name) endforeach(_upper_opt_name)
ENDIF(_wx_result EQUAL 0) endif(_wx_result EQUAL 0)
ENDMACRO(WX_CONFIG_SELECT_GET_DEFAULT) endmacro(wx_config_select_get_default)
# #
# Query a boolean configuration option to determine if the system # Query a boolean configuration option to determine if the system
# has both builds available. If so, provide the selection option # has both builds available. If so, provide the selection option
# to the user. # to the user.
# #
MACRO(WX_CONFIG_SELECT_QUERY_BOOL _OPT_NAME _OPT_HELP) macro(wx_config_select_query_bool _OPT_NAME _OPT_HELP)
EXECUTE_PROCESS( execute_process(
COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=yes ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=yes
RESULT_VARIABLE _wx_result_yes RESULT_VARIABLE _wx_result_yes
OUTPUT_QUIET OUTPUT_QUIET
ERROR_QUIET ERROR_QUIET
) )
EXECUTE_PROCESS( execute_process(
COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=no ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=no
RESULT_VARIABLE _wx_result_no RESULT_VARIABLE _wx_result_no
OUTPUT_QUIET OUTPUT_QUIET
ERROR_QUIET ERROR_QUIET
) )
STRING(TOUPPER ${_OPT_NAME} _UPPER_OPT_NAME) string(TOUPPER ${_OPT_NAME} _UPPER_OPT_NAME)
IF(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0) if(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0)
OPTION(wxWidgets_USE_${_UPPER_OPT_NAME} OPTION(wxWidgets_USE_${_UPPER_OPT_NAME}
${_OPT_HELP} ${wxWidgets_DEFAULT_${_UPPER_OPT_NAME}}) ${_OPT_HELP} ${wxWidgets_DEFAULT_${_UPPER_OPT_NAME}})
ELSE(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0) else(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0)
# If option exists (already in cache), force to available one. # If option exists (already in cache), force to available one.
IF(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME}) if(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME})
IF(_wx_result_yes EQUAL 0) if(_wx_result_yes EQUAL 0)
SET(wxWidgets_USE_${_UPPER_OPT_NAME} ON CACHE BOOL ${_OPT_HELP} FORCE) set(wxWidgets_USE_${_UPPER_OPT_NAME} ON CACHE BOOL ${_OPT_HELP} FORCE)
ELSE(_wx_result_yes EQUAL 0) else(_wx_result_yes EQUAL 0)
SET(wxWidgets_USE_${_UPPER_OPT_NAME} OFF CACHE BOOL ${_OPT_HELP} FORCE) set(wxWidgets_USE_${_UPPER_OPT_NAME} OFF CACHE BOOL ${_OPT_HELP} FORCE)
ENDIF(_wx_result_yes EQUAL 0) endif(_wx_result_yes EQUAL 0)
ENDIF(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME}) endif(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME})
ENDIF(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0) endif(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0)
ENDMACRO(WX_CONFIG_SELECT_QUERY_BOOL) endmacro(wx_config_select_query_bool)
# #
# Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting # Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting
# among multiple builds. # among multiple builds.
# #
MACRO(WX_CONFIG_SELECT_SET_OPTIONS) macro(wx_config_select_set_options)
SET(wxWidgets_SELECT_OPTIONS ${wxWidgets_CONFIG_OPTIONS}) set(wxWidgets_SELECT_OPTIONS ${wxWidgets_CONFIG_OPTIONS})
FOREACH(_opt_name debug static unicode universal) foreach(_opt_name debug static unicode universal)
STRING(TOUPPER ${_opt_name} _upper_opt_name) string(TOUPPER ${_opt_name} _upper_opt_name)
IF(DEFINED wxWidgets_USE_${_upper_opt_name}) if(DEFINED wxWidgets_USE_${_upper_opt_name})
IF(wxWidgets_USE_${_upper_opt_name}) if(wxWidgets_USE_${_upper_opt_name})
LIST(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=yes) list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=yes)
ELSE(wxWidgets_USE_${_upper_opt_name}) else(wxWidgets_USE_${_upper_opt_name})
LIST(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no) list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no)
ENDIF(wxWidgets_USE_${_upper_opt_name}) endif(wxWidgets_USE_${_upper_opt_name})
ENDIF(DEFINED wxWidgets_USE_${_upper_opt_name}) endif(DEFINED wxWidgets_USE_${_upper_opt_name})
ENDFOREACH(_opt_name) endforeach(_opt_name)
ENDMACRO(WX_CONFIG_SELECT_SET_OPTIONS) endmacro(wx_config_select_set_options)
#----------------------------------------------------------------- #-----------------------------------------------------------------
# UNIX: Start actual work. # UNIX: Start actual work.
#----------------------------------------------------------------- #-----------------------------------------------------------------
# Support cross-compiling, only search in the target platform. # Support cross-compiling, only search in the target platform.
FIND_PROGRAM(wxWidgets_CONFIG_EXECUTABLE wx-config find_program(wxWidgets_CONFIG_EXECUTABLE wx-config
ONLY_CMAKE_FIND_ROOT_PATH ONLY_CMAKE_FIND_ROOT_PATH
) )
IF(wxWidgets_CONFIG_EXECUTABLE) if(wxWidgets_CONFIG_EXECUTABLE)
SET(wxWidgets_FOUND TRUE) set(wxWidgets_FOUND TRUE)
# get defaults based on "wx-config --selected-config" # get defaults based on "wx-config --selected-config"
WX_CONFIG_SELECT_GET_DEFAULT() wx_config_select_get_default()
# for each option: if both builds are available, provide option # for each option: if both builds are available, provide option
WX_CONFIG_SELECT_QUERY_BOOL(debug "Use debug build?") wx_config_select_query_bool(debug "Use debug build?")
WX_CONFIG_SELECT_QUERY_BOOL(unicode "Use unicode build?") wx_config_select_query_bool(unicode "Use unicode build?")
WX_CONFIG_SELECT_QUERY_BOOL(universal "Use universal build?") wx_config_select_query_bool(universal "Use universal build?")
WX_CONFIG_SELECT_QUERY_BOOL(static "Link libraries statically?") wx_config_select_query_bool(static "Link libraries statically?")
# process selection to set wxWidgets_SELECT_OPTIONS # process selection to set wxWidgets_SELECT_OPTIONS
WX_CONFIG_SELECT_SET_OPTIONS() wx_config_select_set_options()
DBG_MSG("wxWidgets_SELECT_OPTIONS=${wxWidgets_SELECT_OPTIONS}") dbg_msg("wxWidgets_SELECT_OPTIONS=${wxWidgets_SELECT_OPTIONS}")
# run the wx-config program to get cxxflags # run the wx-config program to get cxxflags
EXECUTE_PROCESS( execute_process(
COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
${wxWidgets_SELECT_OPTIONS} --cxxflags ${wxWidgets_SELECT_OPTIONS} --cxxflags
OUTPUT_VARIABLE wxWidgets_CXX_FLAGS OUTPUT_VARIABLE wxWidgets_CXX_FLAGS
RESULT_VARIABLE RET RESULT_VARIABLE RET
ERROR_QUIET ERROR_QUIET
) )
IF(RET EQUAL 0) if(RET EQUAL 0)
STRING(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS) string(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS)
SEPARATE_ARGUMENTS(wxWidgets_CXX_FLAGS) separate_arguments(wxWidgets_CXX_FLAGS)
DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") dbg_msg_v("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")
# parse definitions from cxxflags; # parse definitions from cxxflags;
# drop -D* from CXXFLAGS and the -D prefix # drop -D* from CXXFLAGS and the -D prefix
STRING(REGEX MATCHALL "-D[^;]+" string(REGEX MATCHALL "-D[^;]+"
wxWidgets_DEFINITIONS "${wxWidgets_CXX_FLAGS}") wxWidgets_DEFINITIONS "${wxWidgets_CXX_FLAGS}")
STRING(REGEX REPLACE "-D[^;]+(;|$)" "" string(REGEX REPLACE "-D[^;]+(;|$)" ""
wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
STRING(REGEX REPLACE ";$" "" string(REGEX REPLACE ";$" ""
wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
STRING(REPLACE "-D" "" string(REPLACE "-D" ""
wxWidgets_DEFINITIONS "${wxWidgets_DEFINITIONS}") wxWidgets_DEFINITIONS "${wxWidgets_DEFINITIONS}")
# parse include dirs from cxxflags; drop -I prefix # parse include dirs from cxxflags; drop -I prefix
STRING(REGEX MATCHALL "-I[^;]+" string(REGEX MATCHALL "-I[^;]+"
wxWidgets_INCLUDE_DIRS "${wxWidgets_CXX_FLAGS}") wxWidgets_INCLUDE_DIRS "${wxWidgets_CXX_FLAGS}")
STRING(REGEX REPLACE "-I[^;]+;" "" string(REGEX REPLACE "-I[^;]+;" ""
wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
STRING(REPLACE "-I" "" string(REPLACE "-I" ""
wxWidgets_INCLUDE_DIRS "${wxWidgets_INCLUDE_DIRS}") wxWidgets_INCLUDE_DIRS "${wxWidgets_INCLUDE_DIRS}")
# Flags are a string, not a list, fix it here # Flags are a string, not a list, fix it here
string(REPLACE ";" " " string(REPLACE ";" " "
wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
DBG_MSG_V("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}") dbg_msg_v("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}")
DBG_MSG_V("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}") dbg_msg_v("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}")
DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") dbg_msg_v("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")
ELSE(RET EQUAL 0) else(RET EQUAL 0)
SET(wxWidgets_FOUND FALSE) set(wxWidgets_FOUND FALSE)
DBG_MSG_V( dbg_msg_v("${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}")
"${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}") endif(RET EQUAL 0)
ENDIF(RET EQUAL 0)
# run the wx-config program to get the libs # run the wx-config program to get the libs
# - NOTE: wx-config doesn't verify that the libs requested exist # - NOTE: wx-config doesn't verify that the libs requested exist
# it just produces the names. Maybe a TRY_COMPILE would # it just produces the names. Maybe a TRY_COMPILE would
# be useful here... # be useful here...
STRING(REPLACE ";" "," string(REPLACE ";" ","
wxWidgets_FIND_COMPONENTS "${wxWidgets_FIND_COMPONENTS}") wxWidgets_FIND_COMPONENTS "${wxWidgets_FIND_COMPONENTS}")
EXECUTE_PROCESS( execute_process(
COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
${wxWidgets_SELECT_OPTIONS} --libs ${wxWidgets_FIND_COMPONENTS} ${wxWidgets_SELECT_OPTIONS} --libs ${wxWidgets_FIND_COMPONENTS}
OUTPUT_VARIABLE wxWidgets_LIBRARIES OUTPUT_VARIABLE wxWidgets_LIBRARIES
RESULT_VARIABLE RET RESULT_VARIABLE RET
ERROR_QUIET ERROR_QUIET
) )
IF(RET EQUAL 0) if(RET EQUAL 0)
STRING(STRIP "${wxWidgets_LIBRARIES}" wxWidgets_LIBRARIES) string(STRIP "${wxWidgets_LIBRARIES}" wxWidgets_LIBRARIES)
SEPARATE_ARGUMENTS(wxWidgets_LIBRARIES) separate_arguments(wxWidgets_LIBRARIES)
STRING(REPLACE "-framework;" "-framework " string(REPLACE "-framework;" "-framework "
wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}") wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
STRING(REPLACE "-arch;" "-arch " string(REPLACE "-arch;" "-arch "
wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}") wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
STRING(REPLACE "-isysroot;" "-isysroot " string(REPLACE "-isysroot;" "-isysroot "
wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}") wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
# extract linkdirs (-L) for rpath (i.e., LINK_DIRECTORIES) # extract linkdirs (-L) for rpath (i.e., LINK_DIRECTORIES)
STRING(REGEX MATCHALL "-L[^;]+" string(REGEX MATCHALL "-L[^;]+"
wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARIES}") wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARIES}")
STRING(REPLACE "-L" "" string(REPLACE "-L" ""
wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}") wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}")
DBG_MSG_V("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}") dbg_msg_v("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}")
DBG_MSG_V("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}") dbg_msg_v("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}")
ELSE(RET EQUAL 0) else(RET EQUAL 0)
SET(wxWidgets_FOUND FALSE) set(wxWidgets_FOUND FALSE)
DBG_MSG("${wxWidgets_CONFIG_EXECUTABLE} --libs ${wxWidgets_FIND_COMPONENTS} FAILED with RET=${RET}") dbg_msg("${wxWidgets_CONFIG_EXECUTABLE} --libs ${wxWidgets_FIND_COMPONENTS} FAILED with RET=${RET}")
ENDIF(RET EQUAL 0) endif(RET EQUAL 0)
ENDIF(wxWidgets_CONFIG_EXECUTABLE) endif(wxWidgets_CONFIG_EXECUTABLE)
#===================================================================== #=====================================================================
# Neither UNIX_FIND_STYLE, nor WIN32_FIND_STYLE # Neither UNIX_FIND_STYLE, nor WIN32_FIND_STYLE
#===================================================================== #=====================================================================
ELSE(wxWidgets_FIND_STYLE STREQUAL "unix") else(wxWidgets_FIND_STYLE STREQUAL "unix")
IF(NOT wxWidgets_FIND_QUIETLY) if(NOT wxWidgets_FIND_QUIETLY)
MESSAGE(STATUS message(STATUS
"${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): \n" "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): \n"
" Platform unknown/unsupported. It's neither WIN32 nor UNIX " " Platform unknown/unsupported. It's neither WIN32 nor UNIX "
"find style." "find style."
) )
ENDIF(NOT wxWidgets_FIND_QUIETLY) endif(NOT wxWidgets_FIND_QUIETLY)
ENDIF(wxWidgets_FIND_STYLE STREQUAL "unix") endif(wxWidgets_FIND_STYLE STREQUAL "unix")
ENDIF(wxWidgets_FIND_STYLE STREQUAL "win32") endif(wxWidgets_FIND_STYLE STREQUAL "win32")
# Check if a specfic version was requested by find_package().
if(wxWidgets_FOUND AND wxWidgets_FIND_VERSION)
find_file(_filename wx/version.h PATHS ${wxWidgets_INCLUDE_DIRS})
dbg_msg("_filename: ${_filename}")
if(NOT _filename)
message(FATAL_ERROR "wxWidgets wx/version.h file not found in ${wxWidgets_INCLUDE_DIRS}.")
endif()
file(READ ${_filename} _wx_version_h)
string(REGEX REPLACE "^(.*\n)?#define wxMAJOR_VERSION[ ]+([0-9]+).*"
"\\2" wxWidgets_VERSION_MAJOR "${_wx_version_h}" )
string(REGEX REPLACE "^(.*\n)?#define wxMINOR_VERSION[ ]+([0-9]+).*"
"\\2" wxWidgets_VERSION_MINOR "${_wx_version_h}" )
string(REGEX REPLACE "^(.*\n)?#define wxRELEASE_NUMBER[ ]+([0-9]+).*"
"\\2" wxWidgets_VERSION_PATCH "${_wx_version_h}" )
set(wxWidgets_VERSION_STRING
"${wxWidgets_VERSION_MAJOR}.${wxWidgets_VERSION_MINOR}.${wxWidgets_VERSION_PATCH}" )
dbg_msg("wxWidgets_VERSION_STRING: ${wxWidgets_VERSION_STRING}")
endif()
# Debug output: # Debug output:
DBG_MSG("wxWidgets_FOUND : ${wxWidgets_FOUND}") dbg_msg("wxWidgets_FOUND : ${wxWidgets_FOUND}")
DBG_MSG("wxWidgets_INCLUDE_DIRS : ${wxWidgets_INCLUDE_DIRS}") dbg_msg("wxWidgets_INCLUDE_DIRS : ${wxWidgets_INCLUDE_DIRS}")
DBG_MSG("wxWidgets_LIBRARY_DIRS : ${wxWidgets_LIBRARY_DIRS}") dbg_msg("wxWidgets_LIBRARY_DIRS : ${wxWidgets_LIBRARY_DIRS}")
DBG_MSG("wxWidgets_LIBRARIES : ${wxWidgets_LIBRARIES}") dbg_msg("wxWidgets_LIBRARIES : ${wxWidgets_LIBRARIES}")
DBG_MSG("wxWidgets_CXX_FLAGS : ${wxWidgets_CXX_FLAGS}") dbg_msg("wxWidgets_CXX_FLAGS : ${wxWidgets_CXX_FLAGS}")
DBG_MSG("wxWidgets_USE_FILE : ${wxWidgets_USE_FILE}") dbg_msg("wxWidgets_USE_FILE : ${wxWidgets_USE_FILE}")
dbg_msg("wxWidgets_FIND_VERSION : ${wxWidgets_FIND_VERSION}")
dbg_msg("wxWidgets_VERSION_MAJOR : ${wxWidgets_VERSION_MAJOR}")
dbg_msg("wxWidgets_VERSION_MINOR : ${wxWidgets_VERSION_MINOR}")
dbg_msg("wxWidgets_VERSION_PATCH : ${wxWidgets_VERSION_PATCH}")
#===================================================================== #=====================================================================
#===================================================================== #=====================================================================
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(wxWidgets DEFAULT_MSG wxWidgets_FOUND)
# Maintain consistency with all other variables. # Maintain consistency with all other variables.
SET(wxWidgets_FOUND ${WXWIDGETS_FOUND}) dbg_msg("wxWidgets_FOUND : ${wxWidgets_FOUND}")
set(WXWIDGETS_FOUND ${wxWidgetsS_FOUND})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(wxWidgets
FOUND_VAR wxWidgets_FOUND
REQUIRED_VARS wxWidgets_LIBRARIES
VERSION_VAR wxWidgets_VERSION_STRING
)
#===================================================================== #=====================================================================
# Macros for use in wxWidgets apps. # Macros for use in wxWidgets apps.
...@@ -873,23 +913,23 @@ SET(wxWidgets_FOUND ${WXWIDGETS_FOUND}) ...@@ -873,23 +913,23 @@ SET(wxWidgets_FOUND ${WXWIDGETS_FOUND})
#===================================================================== #=====================================================================
# Resource file compiler. # Resource file compiler.
FIND_PROGRAM(wxWidgets_wxrc_EXECUTABLE wxrc find_program(wxWidgets_wxrc_EXECUTABLE wxrc
${wxWidgets_ROOT_DIR}/utils/wxrc/vc_msw ${wxWidgets_ROOT_DIR}/utils/wxrc/vc_msw
) )
# #
# WX_SPLIT_ARGUMENTS_ON(<keyword> <left> <right> <arg1> <arg2> ...) # wx_split_arguments_on(<keyword> <left> <right> <arg1> <arg2> ...)
# #
# Sets <left> and <right> to contain arguments to the left and right, # Sets <left> and <right> to contain arguments to the left and right,
# respectively, of <keyword>. # respectively, of <keyword>.
# #
# Example usage: # Example usage:
# FUNCTION(WXWIDGETS_ADD_RESOURCES outfiles) # function(wxwidgets_add_resources outfiles)
# WX_SPLIT_ARGUMENTS_ON(OPTIONS wxrc_files wxrc_options ${ARGN}) # wx_split_arguments_on(OPTIONS wxrc_files wxrc_options ${ARGN})
# ... # ...
# ENDFUNCTION(WXWIDGETS_ADD_RESOURCES) # endfunction(wxwidgets_add_resources)
# #
# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o file.C) # wxwidgets_add_resources(sources ${xrc_files} OPTIONS -e -o file.C)
# #
# NOTE: This is a generic piece of code that should be renamed to # NOTE: This is a generic piece of code that should be renamed to
# SPLIT_ARGUMENTS_ON and put in a file serving the same purpose as # SPLIT_ARGUMENTS_ON and put in a file serving the same purpose as
...@@ -898,32 +938,32 @@ FIND_PROGRAM(wxWidgets_wxrc_EXECUTABLE wxrc ...@@ -898,32 +938,32 @@ FIND_PROGRAM(wxWidgets_wxrc_EXECUTABLE wxrc
# here a bit more generalized. So, there are already two find modules # here a bit more generalized. So, there are already two find modules
# using this approach. # using this approach.
# #
FUNCTION(WX_SPLIT_ARGUMENTS_ON _keyword _leftvar _rightvar) function(wx_split_arguments_on _keyword _leftvar _rightvar)
# FIXME: Document that the input variables will be cleared. # FIXME: Document that the input variables will be cleared.
#LIST(APPEND ${_leftvar} "") #list(APPEND ${_leftvar} "")
#LIST(APPEND ${_rightvar} "") #list(APPEND ${_rightvar} "")
SET(${_leftvar} "") set(${_leftvar} "")
SET(${_rightvar} "") set(${_rightvar} "")
SET(_doing_right FALSE) set(_doing_right FALSE)
FOREACH(element ${ARGN}) foreach(element ${ARGN})
IF("${element}" STREQUAL "${_keyword}") if("${element}" STREQUAL "${_keyword}")
SET(_doing_right TRUE) set(_doing_right TRUE)
ELSE("${element}" STREQUAL "${_keyword}") else("${element}" STREQUAL "${_keyword}")
IF(_doing_right) if(_doing_right)
LIST(APPEND ${_rightvar} "${element}") list(APPEND ${_rightvar} "${element}")
ELSE(_doing_right) else(_doing_right)
LIST(APPEND ${_leftvar} "${element}") list(APPEND ${_leftvar} "${element}")
ENDIF(_doing_right) endif(_doing_right)
ENDIF("${element}" STREQUAL "${_keyword}") endif("${element}" STREQUAL "${_keyword}")
ENDFOREACH(element) endforeach(element)
SET(${_leftvar} ${${_leftvar}} PARENT_SCOPE) set(${_leftvar} ${${_leftvar}} PARENT_SCOPE)
SET(${_rightvar} ${${_rightvar}} PARENT_SCOPE) set(${_rightvar} ${${_rightvar}} PARENT_SCOPE)
ENDFUNCTION(WX_SPLIT_ARGUMENTS_ON) endfunction(wx_split_arguments_on)
# #
# WX_GET_DEPENDENCIES_FROM_XML( # wx_get_dependencies_from_xml(
# <depends> # <depends>
# <match_pattern> # <match_pattern>
# <clean_pattern> # <clean_pattern>
...@@ -933,7 +973,7 @@ ENDFUNCTION(WX_SPLIT_ARGUMENTS_ON) ...@@ -933,7 +973,7 @@ ENDFUNCTION(WX_SPLIT_ARGUMENTS_ON)
# #
# FIXME: Add documentation here... # FIXME: Add documentation here...
# #
FUNCTION(WX_GET_DEPENDENCIES_FROM_XML function(wx_get_dependencies_from_xml
_depends _depends
_match_patt _match_patt
_clean_patt _clean_patt
...@@ -941,55 +981,55 @@ FUNCTION(WX_GET_DEPENDENCIES_FROM_XML ...@@ -941,55 +981,55 @@ FUNCTION(WX_GET_DEPENDENCIES_FROM_XML
_depends_path _depends_path
) )
STRING(REGEX MATCHALL string(REGEX MATCHALL
${_match_patt} ${_match_patt}
dep_file_list dep_file_list
"${${_xml_contents}}" "${${_xml_contents}}"
) )
FOREACH(dep_file ${dep_file_list}) foreach(dep_file ${dep_file_list})
STRING(REGEX REPLACE ${_clean_patt} "" dep_file "${dep_file}") string(REGEX REPLACE ${_clean_patt} "" dep_file "${dep_file}")
# make the file have an absolute path # make the file have an absolute path
IF(NOT IS_ABSOLUTE "${dep_file}") if(NOT IS_ABSOLUTE "${dep_file}")
SET(dep_file "${${_depends_path}}/${dep_file}") set(dep_file "${${_depends_path}}/${dep_file}")
ENDIF(NOT IS_ABSOLUTE "${dep_file}") endif(NOT IS_ABSOLUTE "${dep_file}")
# append file to dependency list # append file to dependency list
LIST(APPEND ${_depends} "${dep_file}") list(APPEND ${_depends} "${dep_file}")
ENDFOREACH(dep_file) endforeach(dep_file)
SET(${_depends} ${${_depends}} PARENT_SCOPE) set(${_depends} ${${_depends}} PARENT_SCOPE)
ENDFUNCTION(WX_GET_DEPENDENCIES_FROM_XML) endfunction(wx_get_dependencies_from_xml)
# #
# WXWIDGETS_ADD_RESOURCES(<sources> <xrc_files> # wxwidgets_add_resources(<sources> <xrc_files>
# OPTIONS <options> [NO_CPP_CODE]) # OPTIONS <options> [NO_CPP_CODE])
# #
# Adds a custom command for resource file compilation of the # Adds a custom command for resource file compilation of the
# <xrc_files> and appends the output files to <sources>. # <xrc_files> and appends the output files to <sources>.
# #
# Example usages: # Example usages:
# WXWIDGETS_ADD_RESOURCES(sources xrc/main_frame.xrc) # wxwidgets_add_resources(sources xrc/main_frame.xrc)
# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o altname.cxx) # wxwidgets_add_resources(sources ${xrc_files} OPTIONS -e -o altname.cxx)
# #
FUNCTION(WXWIDGETS_ADD_RESOURCES _outfiles) function(wxwidgets_add_resources _outfiles)
WX_SPLIT_ARGUMENTS_ON(OPTIONS rc_file_list rc_options ${ARGN}) wx_split_arguments_on(OPTIONS rc_file_list rc_options ${ARGN})
# Parse files for dependencies. # Parse files for dependencies.
SET(rc_file_list_abs "") set(rc_file_list_abs "")
SET(rc_depends "") set(rc_depends "")
FOREACH(rc_file ${rc_file_list}) foreach(rc_file ${rc_file_list})
GET_FILENAME_COMPONENT(depends_path ${rc_file} PATH) get_filename_component(depends_path ${rc_file} PATH)
GET_FILENAME_COMPONENT(rc_file_abs ${rc_file} ABSOLUTE) get_filename_component(rc_file_abs ${rc_file} ABSOLUTE)
LIST(APPEND rc_file_list_abs "${rc_file_abs}") list(APPEND rc_file_list_abs "${rc_file_abs}")
# All files have absolute paths or paths relative to the location # All files have absolute paths or paths relative to the location
# of the rc file. # of the rc file.
FILE(READ "${rc_file_abs}" rc_file_contents) file(READ "${rc_file_abs}" rc_file_contents)
# get bitmap/bitmap2 files # get bitmap/bitmap2 files
WX_GET_DEPENDENCIES_FROM_XML( wx_get_dependencies_from_xml(
rc_depends rc_depends
"<bitmap[^<]+" "<bitmap[^<]+"
"^<bitmap[^>]*>" "^<bitmap[^>]*>"
...@@ -998,7 +1038,7 @@ FUNCTION(WXWIDGETS_ADD_RESOURCES _outfiles) ...@@ -998,7 +1038,7 @@ FUNCTION(WXWIDGETS_ADD_RESOURCES _outfiles)
) )
# get url files # get url files
WX_GET_DEPENDENCIES_FROM_XML( wx_get_dependencies_from_xml(
rc_depends rc_depends
"<url[^<]+" "<url[^<]+"
"^<url[^>]*>" "^<url[^>]*>"
...@@ -1007,70 +1047,70 @@ FUNCTION(WXWIDGETS_ADD_RESOURCES _outfiles) ...@@ -1007,70 +1047,70 @@ FUNCTION(WXWIDGETS_ADD_RESOURCES _outfiles)
) )
# get wxIcon files # get wxIcon files
WX_GET_DEPENDENCIES_FROM_XML( wx_get_dependencies_from_xml(
rc_depends rc_depends
"<object[^>]*class=\"wxIcon\"[^<]+" "<object[^>]*class=\"wxIcon\"[^<]+"
"^<object[^>]*>" "^<object[^>]*>"
rc_file_contents rc_file_contents
depends_path depends_path
) )
ENDFOREACH(rc_file) endforeach(rc_file)
# #
# Parse options. # Parse options.
# #
# If NO_CPP_CODE option specified, then produce .xrs file rather # If NO_CPP_CODE option specified, then produce .xrs file rather
# than a .cpp file (i.e., don't add the default --cpp-code option). # than a .cpp file (i.e., don't add the default --cpp-code option).
LIST(FIND rc_options NO_CPP_CODE index) list(FIND rc_options NO_CPP_CODE index)
IF(index EQUAL -1) if(index EQUAL -1)
LIST(APPEND rc_options --cpp-code) list(APPEND rc_options --cpp-code)
# wxrc's default output filename for cpp code. # wxrc's default output filename for cpp code.
SET(outfile resource.cpp) set(outfile resource.cpp)
ELSE(index EQUAL -1) else(index EQUAL -1)
LIST(REMOVE_AT rc_options ${index}) list(REMOVE_AT rc_options ${index})
# wxrc's default output filename for xrs file. # wxrc's default output filename for xrs file.
SET(outfile resource.xrs) set(outfile resource.xrs)
ENDIF(index EQUAL -1) endif(index EQUAL -1)
# Get output name for use in ADD_CUSTOM_COMMAND. # Get output name for use in add_custom_command.
# - short option scanning # - short option scanning
LIST(FIND rc_options -o index) list(FIND rc_options -o index)
IF(NOT index EQUAL -1) if(NOT index EQUAL -1)
MATH(EXPR filename_index "${index} + 1") MATH(EXPR filename_index "${index} + 1")
LIST(GET rc_options ${filename_index} outfile) list(GET rc_options ${filename_index} outfile)
#LIST(REMOVE_AT rc_options ${index} ${filename_index}) #list(REMOVE_AT rc_options ${index} ${filename_index})
ENDIF(NOT index EQUAL -1) endif(NOT index EQUAL -1)
# - long option scanning # - long option scanning
STRING(REGEX MATCH "--output=[^;]*" outfile_opt "${rc_options}") string(REGEX MATCH "--output=[^;]*" outfile_opt "${rc_options}")
IF(outfile_opt) if(outfile_opt)
STRING(REPLACE "--output=" "" outfile "${outfile_opt}") string(REPLACE "--output=" "" outfile "${outfile_opt}")
ENDIF(outfile_opt) endif(outfile_opt)
#STRING(REGEX REPLACE "--output=[^;]*;?" "" rc_options "${rc_options}") #string(REGEX REPLACE "--output=[^;]*;?" "" rc_options "${rc_options}")
#STRING(REGEX REPLACE ";$" "" rc_options "${rc_options}") #string(REGEX REPLACE ";$" "" rc_options "${rc_options}")
IF(NOT IS_ABSOLUTE "${outfile}") if(NOT IS_ABSOLUTE "${outfile}")
SET(outfile "${CMAKE_CURRENT_BINARY_DIR}/${outfile}") set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${outfile}")
ENDIF(NOT IS_ABSOLUTE "${outfile}") endif(NOT IS_ABSOLUTE "${outfile}")
ADD_CUSTOM_COMMAND( add_custom_command(
OUTPUT "${outfile}" OUTPUT "${outfile}"
COMMAND ${wxWidgets_wxrc_EXECUTABLE} ${rc_options} ${rc_file_list_abs} COMMAND ${wxWidgets_wxrc_EXECUTABLE} ${rc_options} ${rc_file_list_abs}
DEPENDS ${rc_file_list_abs} ${rc_depends} DEPENDS ${rc_file_list_abs} ${rc_depends}
) )
# Add generated header to output file list. # Add generated header to output file list.
LIST(FIND rc_options -e short_index) list(FIND rc_options -e short_index)
LIST(FIND rc_options --extra-cpp-code long_index) list(FIND rc_options --extra-cpp-code long_index)
IF(NOT short_index EQUAL -1 OR NOT long_index EQUAL -1) if(NOT short_index EQUAL -1 OR NOT long_index EQUAL -1)
GET_FILENAME_COMPONENT(outfile_ext ${outfile} EXT) get_filename_component(outfile_ext ${outfile} EXT)
STRING(REPLACE "${outfile_ext}" ".h" outfile_header "${outfile}") string(REPLACE "${outfile_ext}" ".h" outfile_header "${outfile}")
LIST(APPEND ${_outfiles} "${outfile_header}") list(APPEND ${_outfiles} "${outfile_header}")
SET_SOURCE_FILES_PROPERTIES( set_source_files_properties(
"${outfile_header}" PROPERTIES GENERATED TRUE "${outfile_header}" PROPERTIES GENERATED TRUE
) )
ENDIF(NOT short_index EQUAL -1 OR NOT long_index EQUAL -1) endif(NOT short_index EQUAL -1 OR NOT long_index EQUAL -1)
# Add generated file to output file list. # Add generated file to output file list.
LIST(APPEND ${_outfiles} "${outfile}") list(APPEND ${_outfiles} "${outfile}")
SET(${_outfiles} ${${_outfiles}} PARENT_SCOPE) set(${_outfiles} ${${_outfiles}} PARENT_SCOPE)
ENDFUNCTION(WXWIDGETS_ADD_RESOURCES) endfunction(wxwidgets_add_resources)
...@@ -119,8 +119,8 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, ...@@ -119,8 +119,8 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_showOriginAxis = false; // true to draw the grid origin m_showOriginAxis = false; // true to draw the grid origin
m_cursorShape = 0; m_cursorShape = 0;
m_LastGridSizeId = 0; m_LastGridSizeId = 0;
m_DrawGrid = true; // hide/Show grid. default = show m_drawGrid = true; // hide/Show grid. default = show
m_GridColor = DARKGRAY; // Grid color m_gridColor = DARKGRAY; // Default grid color
m_showPageLimits = false; m_showPageLimits = false;
m_drawBgColor = BLACK; // the background color of the draw canvas: m_drawBgColor = BLACK; // the background color of the draw canvas:
// BLACK for Pcbnew, BLACK or WHITE for eeschema // BLACK for Pcbnew, BLACK or WHITE for eeschema
......
...@@ -425,13 +425,13 @@ void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER&, int ) ...@@ -425,13 +425,13 @@ void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER&, int )
bool DISPLAY_FOOTPRINTS_FRAME::IsGridVisible() const bool DISPLAY_FOOTPRINTS_FRAME::IsGridVisible() const
{ {
return m_DrawGrid; return m_drawGrid;
} }
void DISPLAY_FOOTPRINTS_FRAME::SetGridVisibility(bool aVisible) void DISPLAY_FOOTPRINTS_FRAME::SetGridVisibility(bool aVisible)
{ {
m_DrawGrid = aVisible; m_drawGrid = aVisible;
} }
......
...@@ -48,7 +48,7 @@ int LIB_EDIT_FRAME::BlockCommand( int key ) ...@@ -48,7 +48,7 @@ int LIB_EDIT_FRAME::BlockCommand( int key )
switch( key ) switch( key )
{ {
default: default:
cmd = key & 0x255; cmd = key & 0xFF;
break; break;
case -1: case -1:
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item ); static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item );
static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item ); static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item );
DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aContainer, COMPONENT_TREE_SEARCH_CONTAINER* aContainer,
int aDeMorganConvert ) int aDeMorganConvert )
: DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ), : DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ),
...@@ -44,6 +44,7 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxStr ...@@ -44,6 +44,7 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxStr
m_external_browser_requested( false ), m_external_browser_requested( false ),
m_received_doubleclick_in_tree( false ) m_received_doubleclick_in_tree( false )
{ {
m_parent = aParent;
m_search_container->SetTree( m_libraryComponentTree ); m_search_container->SetTree( m_libraryComponentTree );
m_searchBox->SetFocus(); m_searchBox->SetFocus();
m_componentDetails->SetEditable( false ); m_componentDetails->SetEditable( false );
...@@ -260,7 +261,8 @@ void DIALOG_CHOOSE_COMPONENT::OnHandlePreviewRepaint( wxPaintEvent& aRepaintEven ...@@ -260,7 +261,8 @@ void DIALOG_CHOOSE_COMPONENT::OnHandlePreviewRepaint( wxPaintEvent& aRepaintEven
void DIALOG_CHOOSE_COMPONENT::renderPreview( LIB_PART* aComponent, int aUnit ) void DIALOG_CHOOSE_COMPONENT::renderPreview( LIB_PART* aComponent, int aUnit )
{ {
wxPaintDC dc( m_componentView ); wxPaintDC dc( m_componentView );
dc.SetBackground( *wxWHITE_BRUSH ); EDA_COLOR_T bgcolor = m_parent->GetDrawBgColor();
dc.SetBackground( bgcolor == BLACK ? *wxBLACK_BRUSH : *wxWHITE_BRUSH );
dc.Clear(); dc.Clear();
if( aComponent == NULL ) if( aComponent == NULL )
......
...@@ -30,20 +30,27 @@ class COMPONENT_TREE_SEARCH_CONTAINER; ...@@ -30,20 +30,27 @@ class COMPONENT_TREE_SEARCH_CONTAINER;
class LIB_ALIAS; class LIB_ALIAS;
class LIB_PART; class LIB_PART;
class wxTreeItemId; class wxTreeItemId;
class SCH_BASE_FRAME;
class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE
{ {
SCH_BASE_FRAME* m_parent;
COMPONENT_TREE_SEARCH_CONTAINER* const m_search_container;
const int m_deMorganConvert;
bool m_external_browser_requested;
bool m_received_doubleclick_in_tree;
public: public:
/** /**
* Create dialog to choose component. * Create dialog to choose component.
* *
* @param aParent Parent window. * @param aParent a SCH_BASE_FRAME parent window.
* @param aTitle Dialog title. * @param aTitle Dialog title.
* @param aSearchContainer The tree selection search container. Needs to be pre-populated * @param aSearchContainer The tree selection search container. Needs to be pre-populated
* This dialog does not take over ownership of this object. * This dialog does not take over ownership of this object.
* @param aDeMorganConvert preferred deMorgan conversion (TODO: should happen in dialog) * @param aDeMorganConvert preferred deMorgan conversion (TODO: should happen in dialog)
*/ */
DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aSearchContainer, COMPONENT_TREE_SEARCH_CONTAINER* aSearchContainer,
int aDeMorganConvert ); int aDeMorganConvert );
virtual ~DIALOG_CHOOSE_COMPONENT(); virtual ~DIALOG_CHOOSE_COMPONENT();
...@@ -80,11 +87,6 @@ private: ...@@ -80,11 +87,6 @@ private:
bool updateSelection(); bool updateSelection();
void selectIfValid( const wxTreeItemId& aTreeId ); void selectIfValid( const wxTreeItemId& aTreeId );
void renderPreview( LIB_PART* aComponent, int aUnit ); void renderPreview( LIB_PART* aComponent, int aUnit );
COMPONENT_TREE_SEARCH_CONTAINER* const m_search_container;
const int m_deMorganConvert;
bool m_external_browser_requested;
bool m_received_doubleclick_in_tree;
}; };
#endif /* DIALOG_CHOOSE_COMPONENT_H */ #endif /* DIALOG_CHOOSE_COMPONENT_H */
...@@ -3,14 +3,12 @@ ...@@ -3,14 +3,12 @@
*/ */
#include <fctsys.h> #include <fctsys.h>
#include <gr_basic.h>
#include <draw_frame.h> #include <draw_frame.h>
#include <class_drawpanel.h> #include <class_drawpanel.h>
#include <general.h> #include <general.h>
#include <dialog_color_config.h> #include <dialog_color_config.h>
#include <layers_id_colors_and_visibility.h>
#define ID_COLOR_SETUP 1800 #define ID_COLOR_SETUP 1800
...@@ -86,7 +84,7 @@ static BUTTONINDEX buttonGroups[] = { ...@@ -86,7 +84,7 @@ static BUTTONINDEX buttonGroups[] = {
}; };
static EDA_COLOR_T currentColors[ NB_SCH_LAYERS ]; static EDA_COLOR_T currentColors[ LAYERSCH_ID_COUNT ];
IMPLEMENT_DYNAMIC_CLASS( DIALOG_COLOR_CONFIG, wxDialog ) IMPLEMENT_DYNAMIC_CLASS( DIALOG_COLOR_CONFIG, wxDialog )
...@@ -188,7 +186,7 @@ void DIALOG_COLOR_CONFIG::CreateControls() ...@@ -188,7 +186,7 @@ void DIALOG_COLOR_CONFIG::CreateControls()
iconDC.SelectObject( bitmap ); iconDC.SelectObject( bitmap );
EDA_COLOR_T color = GetLayerColor( LayerNumber( buttons->m_Layer ) ); EDA_COLOR_T color = GetLayerColor( LAYERSCH_ID( buttons->m_Layer ) );
currentColors[ buttons->m_Layer ] = color; currentColors[ buttons->m_Layer ] = color;
iconDC.SetPen( *wxBLACK_PEN ); iconDC.SetPen( *wxBLACK_PEN );
...@@ -235,6 +233,9 @@ void DIALOG_COLOR_CONFIG::CreateControls() ...@@ -235,6 +233,9 @@ void DIALOG_COLOR_CONFIG::CreateControls()
m_SelBgColor->SetSelection( ( m_parent->GetDrawBgColor() == BLACK ) ? 1 : 0 ); m_SelBgColor->SetSelection( ( m_parent->GetDrawBgColor() == BLACK ) ? 1 : 0 );
m_columnBoxSizer->Add( m_SelBgColor, 1, wxGROW | wxRIGHT | wxTOP | wxBOTTOM, 5 ); m_columnBoxSizer->Add( m_SelBgColor, 1, wxGROW | wxRIGHT | wxTOP | wxBOTTOM, 5 );
currentColors[ LAYER_BACKGROUND ] = m_parent->GetDrawBgColor();
// Provide a line to separate all of the controls added so far from the // Provide a line to separate all of the controls added so far from the
// "OK", "Cancel", and "Apply" buttons (which will be added after that // "OK", "Cancel", and "Apply" buttons (which will be added after that
// line). // line).
...@@ -317,24 +318,27 @@ void DIALOG_COLOR_CONFIG::SetColor( wxCommandEvent& event ) ...@@ -317,24 +318,27 @@ void DIALOG_COLOR_CONFIG::SetColor( wxCommandEvent& event )
bool DIALOG_COLOR_CONFIG::UpdateColorsSettings() bool DIALOG_COLOR_CONFIG::UpdateColorsSettings()
{ {
// Update color of background // Update color of background
if( m_SelBgColor->GetSelection() == 0 ) EDA_COLOR_T bgcolor = WHITE;
m_parent->SetDrawBgColor( WHITE );
else if( m_SelBgColor->GetSelection() > 0 )
m_parent->SetDrawBgColor( BLACK ); bgcolor = BLACK;
m_parent->SetDrawBgColor( bgcolor );
currentColors[ LAYER_BACKGROUND ] = bgcolor;
bool warning = false; bool warning = false;
for( LayerNumber ii = LAYER_WIRE; ii < NB_SCH_LAYERS; ++ii ) for( LAYERSCH_ID clyr = LAYER_WIRE; clyr < LAYERSCH_ID_COUNT; ++clyr )
{ {
SetLayerColor( currentColors[ ii ], ii ); SetLayerColor( currentColors[ clyr ], clyr );
if( m_parent->GetDrawBgColor() == GetLayerColor( ii ) ) if( bgcolor == GetLayerColor( clyr ) && clyr != LAYER_BACKGROUND )
warning = true; warning = true;
} }
m_parent->SetGridColor( GetLayerColor( LAYER_GRID ) ); m_parent->SetGridColor( GetLayerColor( LAYER_GRID ) );
if( m_parent->GetDrawBgColor() == GetLayerColor( LAYER_GRID ) ) if( bgcolor == GetLayerColor( LAYER_GRID ) )
warning = true; warning = true;
return warning; return warning;
...@@ -348,7 +352,8 @@ void DIALOG_COLOR_CONFIG::OnOkClick( wxCommandEvent& event ) ...@@ -348,7 +352,8 @@ void DIALOG_COLOR_CONFIG::OnOkClick( wxCommandEvent& event )
// Prompt the user if an item has the same color as the background // Prompt the user if an item has the same color as the background
// because this item cannot be seen: // because this item cannot be seen:
if( warning ) if( warning )
wxMessageBox( _("Warning:\nSome items have the same color as the background\nand they will not be seen on screen") ); wxMessageBox( _("Warning:\nSome items have the same color as the background\n"
"and they will not be seen on screen") );
m_parent->GetCanvas()->Refresh(); m_parent->GetCanvas()->Refresh();
......
...@@ -70,7 +70,7 @@ static struct IFACE : public KIFACE_I ...@@ -70,7 +70,7 @@ static struct IFACE : public KIFACE_I
bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ); bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits );
void OnKifaceEnd( PGM_BASE* aProgram ); void OnKifaceEnd();
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 ) wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 )
{ {
...@@ -154,15 +154,15 @@ PGM_BASE& Pgm() ...@@ -154,15 +154,15 @@ PGM_BASE& Pgm()
} }
static EDA_COLOR_T s_layerColor[NB_SCH_LAYERS]; static EDA_COLOR_T s_layerColor[LAYERSCH_ID_COUNT];
EDA_COLOR_T GetLayerColor( LayerNumber aLayer ) EDA_COLOR_T GetLayerColor( LAYERSCH_ID aLayer )
{ {
wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) ); wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) );
return s_layerColor[aLayer]; return s_layerColor[aLayer];
} }
void SetLayerColor( EDA_COLOR_T aColor, int aLayer ) void SetLayerColor( EDA_COLOR_T aColor, LAYERSCH_ID aLayer )
{ {
wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) ); wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) );
s_layerColor[aLayer] = aColor; s_layerColor[aLayer] = aColor;
...@@ -178,7 +178,8 @@ static PARAM_CFG_ARRAY& cfg_params() ...@@ -178,7 +178,8 @@ static PARAM_CFG_ARRAY& cfg_params()
// These are KIFACE specific, they need to be loaded once when the // These are KIFACE specific, they need to be loaded once when the
// eeschema KIFACE comes in. // eeschema KIFACE comes in.
#define CLR(x, y, z) ca.push_back( new PARAM_CFG_SETCOLOR( true, wxT( x ), &s_layerColor[y], z )); #define CLR(x, y, z)\
ca.push_back( new PARAM_CFG_SETCOLOR( true, wxT( x ), &s_layerColor[y], z ) );
CLR( "ColorWireEx", LAYER_WIRE, GREEN ) CLR( "ColorWireEx", LAYER_WIRE, GREEN )
CLR( "ColorBusEx", LAYER_BUS, BLUE ) CLR( "ColorBusEx", LAYER_BUS, BLUE )
...@@ -204,6 +205,7 @@ static PARAM_CFG_ARRAY& cfg_params() ...@@ -204,6 +205,7 @@ static PARAM_CFG_ARRAY& cfg_params()
CLR( "ColorErcWEx", LAYER_ERC_WARN, GREEN ) CLR( "ColorErcWEx", LAYER_ERC_WARN, GREEN )
CLR( "ColorErcEEx", LAYER_ERC_ERR, RED ) CLR( "ColorErcEEx", LAYER_ERC_ERR, RED )
CLR( "ColorGridEx", LAYER_GRID, DARKGRAY ) CLR( "ColorGridEx", LAYER_GRID, DARKGRAY )
CLR( "ColorBgCanvasEx", LAYER_BACKGROUND, WHITE )
} }
return ca; return ca;
...@@ -220,9 +222,11 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ) ...@@ -220,9 +222,11 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
// Give a default colour for all layers // Give a default colour for all layers
// (actual color will be initialized by config) // (actual color will be initialized by config)
for( int ii = 0; ii < NB_SCH_LAYERS; ii++ ) for( LAYERSCH_ID ii = LAYER_FIRST; ii < LAYERSCH_ID_COUNT; ++ii )
SetLayerColor( DARKGRAY, ii ); SetLayerColor( DARKGRAY, ii );
SetLayerColor( WHITE, LAYER_BACKGROUND );
// Must be called before creating the main frame in order to // Must be called before creating the main frame in order to
// display the real hotkeys in menus or tool tips // display the real hotkeys in menus or tool tips
ReadHotkeyConfig( wxT("SchematicFrame"), s_Eeschema_Hokeys_Descr ); ReadHotkeyConfig( wxT("SchematicFrame"), s_Eeschema_Hokeys_Descr );
...@@ -233,10 +237,9 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ) ...@@ -233,10 +237,9 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
} }
void IFACE::OnKifaceEnd( PGM_BASE* aProgram ) void IFACE::OnKifaceEnd()
{ {
wxConfigSaveSetups( KifaceSettings(), cfg_params() ); wxConfigSaveSetups( KifaceSettings(), cfg_params() );
end_common(); end_common();
} }
...@@ -307,6 +307,7 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) ...@@ -307,6 +307,7 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event )
{ {
wxArrayString units; wxArrayString units;
GRIDS grid_list = GetScreen()->GetGrids(); GRIDS grid_list = GetScreen()->GetGrids();
bool saveProjectConfig = false;
DIALOG_EESCHEMA_OPTIONS dlg( this ); DIALOG_EESCHEMA_OPTIONS dlg( this );
...@@ -357,19 +358,33 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) ...@@ -357,19 +358,33 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event )
int sep, firstId; int sep, firstId;
dlg.GetRefIdSeparator( sep, firstId); dlg.GetRefIdSeparator( sep, firstId);
if( sep != (int)LIB_PART::GetSubpartIdSeparator() || if( sep != (int)LIB_PART::GetSubpartIdSeparator() ||
firstId != (int)LIB_PART::GetSubpartFirstId() ) firstId != (int)LIB_PART::GetSubpartFirstId() )
{ {
LIB_PART::SetSubpartIdNotation( sep, firstId ); LIB_PART::SetSubpartIdNotation( sep, firstId );
SaveProjectSettings( true ); saveProjectConfig = true;
} }
SetDefaultBusThickness( dlg.GetBusWidth() ); SetDefaultBusThickness( dlg.GetBusWidth() );
SetDefaultLineThickness( dlg.GetLineWidth() ); SetDefaultLineThickness( dlg.GetLineWidth() );
if( dlg.GetTextSize() != GetDefaultTextSize() )
{
SetDefaultTextSize( dlg.GetTextSize() ); SetDefaultTextSize( dlg.GetTextSize() );
saveProjectConfig = true;
}
if( g_RepeatStep.x != dlg.GetRepeatHorizontal() ||
g_RepeatStep.y != dlg.GetRepeatVertical() ||
g_RepeatDeltaLabel != dlg.GetRepeatLabel() )
{
g_RepeatStep.x = dlg.GetRepeatHorizontal(); g_RepeatStep.x = dlg.GetRepeatHorizontal();
g_RepeatStep.y = dlg.GetRepeatVertical(); g_RepeatStep.y = dlg.GetRepeatVertical();
g_RepeatDeltaLabel = dlg.GetRepeatLabel(); g_RepeatDeltaLabel = dlg.GetRepeatLabel();
saveProjectConfig = true;
}
SetAutoSaveInterval( dlg.GetAutoSaveInterval() * 60 ); SetAutoSaveInterval( dlg.GetAutoSaveInterval() * 60 );
SetGridVisibility( dlg.GetShowGrid() ); SetGridVisibility( dlg.GetShowGrid() );
m_showAllPins = dlg.GetShowHiddenPins(); m_showAllPins = dlg.GetShowHiddenPins();
...@@ -414,6 +429,9 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) ...@@ -414,6 +429,9 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event )
SaveSettings( config() ); // save values shared by eeschema applications. SaveSettings( config() ); // save values shared by eeschema applications.
if( saveProjectConfig )
SaveProjectSettings( true );
m_canvas->Refresh( true ); m_canvas->Refresh( true );
} }
...@@ -546,7 +564,6 @@ static const wxChar SimulatorCommandEntry[] = wxT( "SimCmdLine" ); ...@@ -546,7 +564,6 @@ static const wxChar SimulatorCommandEntry[] = wxT( "SimCmdLine" );
// Library editor wxConfig entry names. // Library editor wxConfig entry names.
static const wxChar lastLibExportPathEntry[] = wxT( "LastLibraryExportPath" ); static const wxChar lastLibExportPathEntry[] = wxT( "LastLibraryExportPath" );
static const wxChar lastLibImportPathEntry[] = wxT( "LastLibraryImportPath" ); static const wxChar lastLibImportPathEntry[] = wxT( "LastLibraryImportPath" );
static const wxChar libeditdrawBgColorEntry[] = wxT( "LibeditBgColor" );
static const wxChar defaultPinNumSizeEntry[] = wxT( "LibeditPinNumSize" ); static const wxChar defaultPinNumSizeEntry[] = wxT( "LibeditPinNumSize" );
static const wxChar defaultPinNameSizeEntry[] = wxT( "LibeditPinNameSize" ); static const wxChar defaultPinNameSizeEntry[] = wxT( "LibeditPinNameSize" );
static const wxChar DefaultPinLengthEntry[] = wxT( "DefaultPinLength" ); static const wxChar DefaultPinLengthEntry[] = wxT( "DefaultPinLength" );
...@@ -561,9 +578,6 @@ PARAM_CFG_ARRAY& SCH_EDIT_FRAME::GetConfigurationSettings() ...@@ -561,9 +578,6 @@ PARAM_CFG_ARRAY& SCH_EDIT_FRAME::GetConfigurationSettings()
&m_showPageLimits, true ) ); &m_showPageLimits, true ) );
m_configSettings.push_back( new PARAM_CFG_INT( true, wxT( "Units" ), m_configSettings.push_back( new PARAM_CFG_INT( true, wxT( "Units" ),
(int*)&g_UserUnit, MILLIMETRES ) ); (int*)&g_UserUnit, MILLIMETRES ) );
m_configSettings.push_back( new PARAM_CFG_SETCOLOR( true, wxT( "SchEditorBgColor" ),
&m_drawBgColor,
WHITE ) );
m_configSettings.push_back( new PARAM_CFG_BOOL( true, wxT( "PrintMonochrome" ), m_configSettings.push_back( new PARAM_CFG_BOOL( true, wxT( "PrintMonochrome" ),
&m_printMonochrome, true ) ); &m_printMonochrome, true ) );
...@@ -582,7 +596,8 @@ void SCH_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) ...@@ -582,7 +596,8 @@ void SCH_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg )
wxConfigLoadSetups( aCfg, GetConfigurationSettings() ); wxConfigLoadSetups( aCfg, GetConfigurationSettings() );
m_GridColor = GetLayerColor( LAYER_GRID ); SetGridColor( GetLayerColor( LAYER_GRID ) );
SetDrawBgColor( GetLayerColor( LAYER_BACKGROUND ) );
SetDefaultBusThickness( aCfg->Read( DefaultBusWidthEntry, DEFAULTBUSTHICKNESS ) ); SetDefaultBusThickness( aCfg->Read( DefaultBusWidthEntry, DEFAULTBUSTHICKNESS ) );
SetDefaultLineThickness( aCfg->Read( DefaultDrawLineWidthEntry, DEFAULTDRAWLINETHICKNESS ) ); SetDefaultLineThickness( aCfg->Read( DefaultDrawLineWidthEntry, DEFAULTDRAWLINETHICKNESS ) );
...@@ -744,8 +759,8 @@ void LIB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) ...@@ -744,8 +759,8 @@ void LIB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg )
wxConfigPathChanger cpc( aCfg, m_configPath ); wxConfigPathChanger cpc( aCfg, m_configPath );
EDA_COLOR_T itmp = ColorByName( aCfg->Read( libeditdrawBgColorEntry, wxT("WHITE") ) ); SetGridColor( GetLayerColor( LAYER_GRID ) );
SetDrawBgColor( itmp ); SetDrawBgColor( GetLayerColor( LAYER_BACKGROUND ) );
wxString pro_dir = Prj().GetProjectFullName(); wxString pro_dir = Prj().GetProjectFullName();
...@@ -765,7 +780,6 @@ void LIB_EDIT_FRAME::SaveSettings( wxConfigBase* aCfg ) ...@@ -765,7 +780,6 @@ void LIB_EDIT_FRAME::SaveSettings( wxConfigBase* aCfg )
wxConfigPathChanger cpc( aCfg, m_configPath ); wxConfigPathChanger cpc( aCfg, m_configPath );
aCfg->Write( libeditdrawBgColorEntry, ColorGetName( GetDrawBgColor() ) );
aCfg->Write( lastLibExportPathEntry, m_lastLibExportPath ); aCfg->Write( lastLibExportPathEntry, m_lastLibExportPath );
aCfg->Write( lastLibImportPathEntry, m_lastLibImportPath ); aCfg->Write( lastLibImportPathEntry, m_lastLibImportPath );
aCfg->Write( DefaultPinLengthEntry, (long) GetDefaultPinLength() ); aCfg->Write( DefaultPinLengthEntry, (long) GetDefaultPinLength() );
......
...@@ -36,8 +36,12 @@ class SCH_SHEET; ...@@ -36,8 +36,12 @@ class SCH_SHEET;
#define GR_DEFAULT_DRAWMODE GR_COPY #define GR_DEFAULT_DRAWMODE GR_COPY
// this enum is for color management // this enum is for color management
// Using here "LAYER" in name is due to historical reasons.
// Eeschema does not actually use layers. It just uses "LAYER_XX" as identifier
// mainly for item color
typedef enum { typedef enum {
LAYER_WIRE, LAYER_FIRST,
LAYER_WIRE = LAYER_FIRST,
LAYER_BUS, LAYER_BUS,
LAYER_JUNCTION, LAYER_JUNCTION,
LAYER_LOCLABEL, LAYER_LOCLABEL,
...@@ -61,12 +65,13 @@ typedef enum { ...@@ -61,12 +65,13 @@ typedef enum {
LAYER_ERC_ERR, LAYER_ERC_ERR,
LAYER_DEVICE_BACKGROUND, LAYER_DEVICE_BACKGROUND,
LAYER_GRID, LAYER_GRID,
NB_SCH_LAYERS LAYER_BACKGROUND,
} LayerNumber; LAYERSCH_ID_COUNT
} LAYERSCH_ID;
inline LayerNumber operator++( LayerNumber& a ) inline LAYERSCH_ID operator++( LAYERSCH_ID& a )
{ {
a = LayerNumber( int( a ) + 1 ); a = LAYERSCH_ID( int( a ) + 1 );
return a; return a;
} }
...@@ -104,7 +109,8 @@ void SetDefaultTextSize( int aSize ); ...@@ -104,7 +109,8 @@ void SetDefaultTextSize( int aSize );
int GetDefaultBusThickness(); int GetDefaultBusThickness();
void SetDefaultBusThickness( int aThickness ); void SetDefaultBusThickness( int aThickness );
EDA_COLOR_T GetLayerColor( LayerNumber aLayer ); EDA_COLOR_T GetLayerColor( LAYERSCH_ID aLayer );
void SetLayerColor( EDA_COLOR_T aColor, LAYERSCH_ID aLayer );
// Color to draw selected items // Color to draw selected items
EDA_COLOR_T GetItemSelectedColor(); EDA_COLOR_T GetItemSelectedColor();
...@@ -112,6 +118,4 @@ EDA_COLOR_T GetItemSelectedColor(); ...@@ -112,6 +118,4 @@ EDA_COLOR_T GetItemSelectedColor();
// Color to draw items flagged invisible, in libedit (they are invisible in Eeschema // Color to draw items flagged invisible, in libedit (they are invisible in Eeschema
EDA_COLOR_T GetInvisibleItemColor(); EDA_COLOR_T GetInvisibleItemColor();
void SetLayerColor( EDA_COLOR_T aColor, int aLayer );
#endif // _GENERAL_H_ #endif // _GENERAL_H_
...@@ -35,7 +35,6 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, ...@@ -35,7 +35,6 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent,
EDA_DRAW_FRAME( aKiway, aParent, aWindowType, aTitle, aPosition, EDA_DRAW_FRAME( aKiway, aParent, aWindowType, aTitle, aPosition,
aSize, aStyle, aFrameName ) aSize, aStyle, aFrameName )
{ {
SetDrawBgColor( WHITE ); // the background color of the draw canvas, BLACK or WHITE
} }
...@@ -47,6 +46,18 @@ void SCH_BASE_FRAME::OnOpenLibraryViewer( wxCommandEvent& event ) ...@@ -47,6 +46,18 @@ void SCH_BASE_FRAME::OnOpenLibraryViewer( wxCommandEvent& event )
viewlibFrame->Raise(); viewlibFrame->Raise();
} }
// Virtual from EDA_DRAW_FRAME
EDA_COLOR_T SCH_BASE_FRAME::GetDrawBgColor() const
{
return GetLayerColor( LAYER_BACKGROUND );
}
void SCH_BASE_FRAME::SetDrawBgColor( EDA_COLOR_T aColor)
{
m_drawBgColor= aColor;
SetLayerColor( aColor, LAYER_BACKGROUND );
}
SCH_SCREEN* SCH_BASE_FRAME::GetScreen() const SCH_SCREEN* SCH_BASE_FRAME::GetScreen() const
{ {
......
...@@ -504,7 +504,7 @@ bool SCH_SCREEN::Save( FILE* aFile ) const ...@@ -504,7 +504,7 @@ bool SCH_SCREEN::Save( FILE* aFile ) const
} }
// This section is not used, but written for file compatibility // This section is not used, but written for file compatibility
if( fprintf( aFile, "EELAYER %d %d\n", NB_SCH_LAYERS, 0 ) < 0 if( fprintf( aFile, "EELAYER %d %d\n", LAYERSCH_ID_COUNT, 0 ) < 0
|| fprintf( aFile, "EELAYER END\n" ) < 0 ) || fprintf( aFile, "EELAYER END\n" ) < 0 )
return false; return false;
......
...@@ -507,13 +507,13 @@ void LIB_VIEW_FRAME::LoadSettings( wxConfigBase* aCfg ) ...@@ -507,13 +507,13 @@ void LIB_VIEW_FRAME::LoadSettings( wxConfigBase* aCfg )
{ {
EDA_DRAW_FRAME::LoadSettings( aCfg ); EDA_DRAW_FRAME::LoadSettings( aCfg );
wxConfigPathChanger cpc( aCfg, m_configPath ); SetGridColor( GetLayerColor( LAYER_GRID ) );
SetDrawBgColor( GetLayerColor( LAYER_BACKGROUND ) );
EDA_COLOR_T itmp = ColorByName( aCfg->Read( LIBVIEW_BGCOLOR, wxT( "WHITE" ) ) ); wxConfigPathChanger cpc( aCfg, m_configPath );
SetDrawBgColor( itmp );
aCfg->Read( LIBLIST_WIDTH_KEY, &m_libListWidth, 100 ); aCfg->Read( LIBLIST_WIDTH_KEY, &m_libListWidth, 150 );
aCfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 100 ); aCfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 150 );
// Set parameters to a reasonable value. // Set parameters to a reasonable value.
if( m_libListWidth > m_FrameSize.x/2 ) if( m_libListWidth > m_FrameSize.x/2 )
...@@ -538,7 +538,6 @@ void LIB_VIEW_FRAME::SaveSettings( wxConfigBase* aCfg ) ...@@ -538,7 +538,6 @@ void LIB_VIEW_FRAME::SaveSettings( wxConfigBase* aCfg )
m_cmpListWidth = m_cmpList->GetSize().x; m_cmpListWidth = m_cmpList->GetSize().x;
aCfg->Write( CMPLIST_WIDTH_KEY, m_cmpListWidth ); aCfg->Write( CMPLIST_WIDTH_KEY, m_cmpListWidth );
aCfg->Write( LIBVIEW_BGCOLOR, ColorGetName( GetDrawBgColor() ) );
} }
......
...@@ -60,9 +60,9 @@ protected: ...@@ -60,9 +60,9 @@ protected:
int m_LastGridSizeId; // the command id offset (>= 0) of the last selected grid int m_LastGridSizeId; // the command id offset (>= 0) of the last selected grid
// 0 is for the grid corresponding to // 0 is for the grid corresponding to
// a wxCommand ID = ID_POPUP_GRID_LEVEL_1000. // a wxCommand ID = ID_POPUP_GRID_LEVEL_1000.
bool m_DrawGrid; // hide/Show grid bool m_drawGrid; // hide/Show grid
bool m_showPageLimits; ///< true to display the page limits bool m_showPageLimits; ///< true to display the page limits
EDA_COLOR_T m_GridColor; // Grid color EDA_COLOR_T m_gridColor; // Grid color
EDA_COLOR_T m_drawBgColor; ///< the background color of the draw canvas EDA_COLOR_T m_drawBgColor; ///< the background color of the draw canvas
///< BLACK for Pcbnew, BLACK or WHITE for eeschema ///< BLACK for Pcbnew, BLACK or WHITE for eeschema
...@@ -258,8 +258,16 @@ public: ...@@ -258,8 +258,16 @@ public:
virtual void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ) = 0; virtual void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ) = 0;
// the background color of the draw canvas: // the background color of the draw canvas:
EDA_COLOR_T GetDrawBgColor() const { return m_drawBgColor; } // Virtual because some frames can have a specific way to get/set the bg color
void SetDrawBgColor( EDA_COLOR_T aColor) { m_drawBgColor= aColor ; } /**
* @return the EDA_COLOR_T for the canvas background
*/
virtual EDA_COLOR_T GetDrawBgColor() const { return m_drawBgColor; }
/**
* @param aColor: the EDA_COLOR_T for the canvas background
*/
virtual void SetDrawBgColor( EDA_COLOR_T aColor) { m_drawBgColor= aColor ; }
int GetCursorShape() const { return m_cursorShape; } int GetCursorShape() const { return m_cursorShape; }
...@@ -355,7 +363,7 @@ public: ...@@ -355,7 +363,7 @@ public:
*/ */
virtual bool IsGridVisible() const virtual bool IsGridVisible() const
{ {
return m_DrawGrid; return m_drawGrid;
} }
/** /**
...@@ -365,7 +373,7 @@ public: ...@@ -365,7 +373,7 @@ public:
*/ */
virtual void SetGridVisibility( bool aVisible ) virtual void SetGridVisibility( bool aVisible )
{ {
m_DrawGrid = aVisible; m_drawGrid = aVisible;
} }
/** /**
...@@ -374,7 +382,7 @@ public: ...@@ -374,7 +382,7 @@ public:
*/ */
virtual EDA_COLOR_T GetGridColor() const virtual EDA_COLOR_T GetGridColor() const
{ {
return m_GridColor; return m_gridColor;
} }
/** /**
...@@ -383,7 +391,7 @@ public: ...@@ -383,7 +391,7 @@ public:
*/ */
virtual void SetGridColor( EDA_COLOR_T aColor ) virtual void SetGridColor( EDA_COLOR_T aColor )
{ {
m_GridColor = aColor; m_gridColor = aColor;
} }
/** /**
......
...@@ -68,6 +68,11 @@ public: ...@@ -68,6 +68,11 @@ public:
} }
void SetGridOrigin( const wxPoint& aPoint ) {} // overload EDA_DRAW_FRAME void SetGridOrigin( const wxPoint& aPoint ) {} // overload EDA_DRAW_FRAME
// Virtual from EDA_DRAW_FRAME
// the background color of the draw canvas:
EDA_COLOR_T GetDrawBgColor() const;
void SetDrawBgColor( EDA_COLOR_T aColor);
const TITLE_BLOCK& GetTitleBlock() const; // overload EDA_DRAW_FRAME const TITLE_BLOCK& GetTitleBlock() const; // overload EDA_DRAW_FRAME
void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ); // overload EDA_DRAW_FRAME void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ); // overload EDA_DRAW_FRAME
......
...@@ -115,7 +115,7 @@ public: ...@@ -115,7 +115,7 @@ public:
class SCH_ITEM : public EDA_ITEM class SCH_ITEM : public EDA_ITEM
{ {
protected: protected:
LayerNumber m_Layer; LAYERSCH_ID m_Layer;
EDA_ITEMS m_connections; ///< List of items connected to this item. EDA_ITEMS m_connections; ///< List of items connected to this item.
public: public:
...@@ -145,14 +145,14 @@ public: ...@@ -145,14 +145,14 @@ public:
* Function GetLayer * Function GetLayer
* returns the layer this item is on. * returns the layer this item is on.
*/ */
LayerNumber GetLayer() const { return m_Layer; } LAYERSCH_ID GetLayer() const { return m_Layer; }
/** /**
* Function SetLayer * Function SetLayer
* sets the layer this item is on. * sets the layer this item is on.
* @param aLayer The layer number. * @param aLayer The layer number.
*/ */
void SetLayer( LayerNumber aLayer ) { m_Layer = aLayer; } void SetLayer( LAYERSCH_ID aLayer ) { m_Layer = aLayer; }
/** /**
* Function GetPenSize virtual pure * Function GetPenSize virtual pure
......
...@@ -514,6 +514,19 @@ public: ...@@ -514,6 +514,19 @@ public:
*/ */
void ReCreateLayerBox( bool aForceResizeToolbar = true ); void ReCreateLayerBox( bool aForceResizeToolbar = true );
/**
* Function SetCurrentNetClass
* Must be called after a netclass selection (or after a netclass parameter change
* calls BOARD_DESIGN_SETTINGS::SetCurrentNetClass() and update trace width and via size
* combo boxes on main toolbar
* Initialize vias and tracks values displayed in comb boxes of the auxiliary toolbar
* and some others parameters (netclass name ....)
* @param aNetClassName = the new netclass name
* @return true if lists of tracks and vias sizes are modified
*/
bool SetCurrentNetClass( const wxString& aNetClassName );
/** /**
* Function OnModify * Function OnModify
* must be called after a board change to set the modified flag. * must be called after a board change to set the modified flag.
......
...@@ -166,6 +166,7 @@ set( PCBNEW_CLASS_SRCS ...@@ -166,6 +166,7 @@ set( PCBNEW_CLASS_SRCS
modview_frame.cpp modview_frame.cpp
pcbframe.cpp pcbframe.cpp
pcb_base_edit_frame.cpp pcb_base_edit_frame.cpp
append_board_to_current.cpp
attribut.cpp attribut.cpp
board_items_to_polygon_shape_transform.cpp board_items_to_polygon_shape_transform.cpp
board_undo_redo.cpp board_undo_redo.cpp
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004-2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file append_board_to_current.cpp
* @brief append a board to the currently edited board.
*/
#include <fctsys.h>
#include <confirm.h>
#include <wxPcbStruct.h>
#include <pcbnew.h>
#include <io_mgr.h>
#include <class_module.h>
#include <class_zone.h>
#include <class_board.h>
#include <pcb_draw_panel_gal.h>
// Defined in files.cpp:
extern IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl );
bool PCB_EDIT_FRAME::AppendBoardFile( const wxString& aFullFileName, int aCtl )
{
IO_MGR::PCB_FILE_T pluginType = plugin_type( aFullFileName, aCtl );
PLUGIN::RELEASER pi( IO_MGR::PluginFind( pluginType ) );
// keep trace of existing items, in order to know what are the new items
// (for undo command for instance)
// Tracks are inserted, not append, so mark existing tracks to know what are
// the new tracks
for( TRACK* track = GetBoard()->m_Track; track; track = track->Next() )
track->SetFlags( FLAG0 );
// Other items are append to the item list, so keep trace to the
// last existing item is enough
MODULE* module = GetBoard()->m_Modules.GetLast();
BOARD_ITEM* drawing = GetBoard()->m_Drawings.GetLast();
int zonescount = GetBoard()->GetAreaCount();
// Keep also the count of copper layers, because we can happen boards
// with different copper layers counts,
// and the enabled layers
int initialCopperLayerCount = GetBoard()->GetCopperLayerCount();
LSET initialEnabledLayers = GetBoard()->GetEnabledLayers();
try
{
PROPERTIES props;
char xbuf[30];
char ybuf[30];
// EAGLE_PLUGIN can use this info to center the BOARD, but it does not yet.
sprintf( xbuf, "%d", GetPageSizeIU().x );
sprintf( ybuf, "%d", GetPageSizeIU().y );
props["page_width"] = xbuf;
props["page_height"] = ybuf;
GetDesignSettings().m_NetClasses.Clear();
pi->Load( aFullFileName, GetBoard(), &props );
}
catch( const IO_ERROR& ioe )
{
for( TRACK* track = GetBoard()->m_Track; track; track = track->Next() )
track->ClearFlags( FLAG0 );
wxString msg = wxString::Format( _(
"Error loading board.\n%s" ),
GetChars( ioe.errorText )
);
DisplayError( this, msg );
return false;
}
// Now prepare a block move command to place the new items, and
// prepare the undo command.
BLOCK_SELECTOR& blockmove = GetScreen()->m_BlockLocate;
HandleBlockBegin( NULL, BLOCK_PRESELECT_MOVE, wxPoint( 0, 0) );
PICKED_ITEMS_LIST& blockitemsList = blockmove.GetItems();
PICKED_ITEMS_LIST undoListPicker;
ITEM_PICKER picker( NULL, UR_NEW );
EDA_RECT bbox; // the new items bounding box, for block move
bool bboxInit = true; // true until the bounding box is initialized
for( TRACK* track = GetBoard()->m_Track; track; track = track->Next() )
{
if( track->GetFlags() & FLAG0 )
{
track->ClearFlags( FLAG0 );
continue;
}
track->SetFlags( IS_MOVED );
picker.SetItem( track );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
if( bboxInit )
bbox = track->GetBoundingBox();
else
bboxInit = false;
bbox.Merge(track->GetBoundingBox() );
}
if( module )
module = module->Next();
else
module = GetBoard()->m_Modules;
for( ; module; module = module->Next() )
{
module->SetFlags( IS_MOVED );
picker.SetItem( module );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
if( bboxInit )
bbox = module->GetBoundingBox();
else
bbox.Merge(module->GetBoundingBox() );
bboxInit = false;
}
if( drawing )
drawing = drawing->Next();
else
drawing = GetBoard()->m_Drawings;
for( ; drawing; drawing = drawing->Next() )
{
drawing->SetFlags( IS_MOVED );
picker.SetItem( drawing );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
if( bboxInit )
bbox = drawing->GetBoundingBox();
else
bbox.Merge(drawing->GetBoundingBox() );
bboxInit = false;
}
for( ZONE_CONTAINER* zone = GetBoard()->GetArea( zonescount ); zone;
zone = GetBoard()->GetArea( zonescount ) )
{
zone->SetFlags( IS_MOVED );
picker.SetItem( zone );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
zonescount++;
if( bboxInit )
bbox = zone->GetBoundingBox();
else
bbox.Merge(zone->GetBoundingBox() );
bboxInit = false;
}
SaveCopyInUndoList( undoListPicker, UR_NEW );
// we should not ask PLUGINs to do these items:
int copperLayerCount = GetBoard()->GetCopperLayerCount();
if( copperLayerCount > initialCopperLayerCount )
GetBoard()->SetCopperLayerCount( copperLayerCount );
// Enable all used layers, and make them visible:
LSET enabledLayers = GetBoard()->GetEnabledLayers();
enabledLayers |= initialEnabledLayers;
GetBoard()->SetEnabledLayers( enabledLayers );
GetBoard()->SetVisibleLayers( enabledLayers );
ReCreateLayerBox();
ReFillLayerWidget();
if( IsGalCanvasActive() )
static_cast<PCB_DRAW_PANEL_GAL*>( GetGalCanvas() )->SyncLayersVisibility( GetBoard() );
GetBoard()->BuildListOfNets();
GetBoard()->SynchronizeNetsAndNetClasses();
SetStatusText( wxEmptyString );
BestZoom();
// Finish block move command:
wxPoint cpos = GetNearestGridPosition( bbox.Centre() );
blockmove.SetOrigin( bbox.GetOrigin() );
blockmove.SetSize( bbox.GetSize() );
blockmove.SetLastCursorPosition( cpos );
HandleBlockEnd( NULL );
return true;
}
...@@ -185,7 +185,7 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey ) ...@@ -185,7 +185,7 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey )
switch( aKey ) switch( aKey )
{ {
default: default:
cmd = aKey & 0x255; cmd = aKey & 0xFF;
break; break;
case 0: case 0:
...@@ -219,6 +219,8 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey ) ...@@ -219,6 +219,8 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey )
void PCB_EDIT_FRAME::HandleBlockPlace( wxDC* DC ) void PCB_EDIT_FRAME::HandleBlockPlace( wxDC* DC )
{ {
GetBoard()->m_Status_Pcb &= ~DO_NOT_SHOW_GENERAL_RASTNEST;
if( !m_canvas->IsMouseCaptured() ) if( !m_canvas->IsMouseCaptured() )
{ {
DisplayError( this, wxT( "Error in HandleBlockPLace : m_mouseCaptureCallback = NULL" ) ); DisplayError( this, wxT( "Error in HandleBlockPLace : m_mouseCaptureCallback = NULL" ) );
...@@ -274,7 +276,6 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) ...@@ -274,7 +276,6 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC )
{ {
bool nextcmd = false; // Will be set to true if a block place is needed bool nextcmd = false; // Will be set to true if a block place is needed
bool cancelCmd = false; bool cancelCmd = false;
// If coming here after cancel block, clean up and exit // If coming here after cancel block, clean up and exit
if( GetScreen()->m_BlockLocate.GetState() == STATE_NO_BLOCK ) if( GetScreen()->m_BlockLocate.GetState() == STATE_NO_BLOCK )
{ {
...@@ -369,6 +370,7 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) ...@@ -369,6 +370,7 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC )
if( ! nextcmd ) if( ! nextcmd )
{ {
GetBoard()->m_Status_Pcb |= DO_NOT_SHOW_GENERAL_RASTNEST;
GetScreen()->ClearBlockCommand(); GetScreen()->ClearBlockCommand();
m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString,
false ); false );
...@@ -562,6 +564,10 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a ...@@ -562,6 +564,10 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a
{ {
BASE_SCREEN* screen = aPanel->GetScreen(); BASE_SCREEN* screen = aPanel->GetScreen();
// do not show local module rastnest in block move, it is not usable.
bool tmp = g_Show_Module_Ratsnest;
g_Show_Module_Ratsnest = false;
if( aErase ) if( aErase )
{ {
if( screen->m_BlockLocate.GetMoveVector().x || screen->m_BlockLocate.GetMoveVector().y ) if( screen->m_BlockLocate.GetMoveVector().x || screen->m_BlockLocate.GetMoveVector().y )
...@@ -589,6 +595,8 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a ...@@ -589,6 +595,8 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a
if( blockDrawItems ) if( blockDrawItems )
drawPickedItems( aPanel, aDC, screen->m_BlockLocate.GetMoveVector() ); drawPickedItems( aPanel, aDC, screen->m_BlockLocate.GetMoveVector() );
} }
g_Show_Module_Ratsnest = tmp;
} }
...@@ -795,6 +803,7 @@ void PCB_EDIT_FRAME::Block_Move() ...@@ -795,6 +803,7 @@ void PCB_EDIT_FRAME::Block_Move()
BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii ); BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii );
itemsList->SetPickedItemStatus( UR_MOVED, ii ); itemsList->SetPickedItemStatus( UR_MOVED, ii );
item->Move( MoveVector ); item->Move( MoveVector );
item->ClearFlags( IS_MOVED );
switch( item->Type() ) switch( item->Type() )
{ {
......
...@@ -80,7 +80,7 @@ int FOOTPRINT_EDIT_FRAME::BlockCommand( int key ) ...@@ -80,7 +80,7 @@ int FOOTPRINT_EDIT_FRAME::BlockCommand( int key )
switch( key ) switch( key )
{ {
default: default:
cmd = key & 0x255; cmd = key & 0xFF;
break; break;
case - 1: case - 1:
...@@ -400,6 +400,11 @@ void CopyMarkedItems( MODULE* module, wxPoint offset ) ...@@ -400,6 +400,11 @@ void CopyMarkedItems( MODULE* module, wxPoint offset )
if( module == NULL ) if( module == NULL )
return; return;
// Reference and value cannot be copied, they are unique.
// Ensure they are not selected
module->Reference().ClearFlags();
module->Value().ClearFlags();
for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() )
{ {
if( !pad->IsSelected() ) if( !pad->IsSelected() )
...@@ -440,6 +445,12 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) ...@@ -440,6 +445,12 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
if( module == NULL ) if( module == NULL )
return; return;
if( module->Reference().IsSelected() )
module->Reference().MoveTransformWithModule( offset );
if( module->Value().IsSelected() )
module->Value().MoveTransformWithModule( offset );
D_PAD* pad = module->Pads(); D_PAD* pad = module->Pads();
for( ; pad != NULL; pad = pad->Next() ) for( ; pad != NULL; pad = pad->Next() )
...@@ -461,7 +472,7 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) ...@@ -461,7 +472,7 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
static_cast<TEXTE_MODULE*>( item )->Move( offset ); static_cast<TEXTE_MODULE*>( item )->MoveTransformWithModule( offset );
break; break;
case PCB_MODULE_EDGE_T: case PCB_MODULE_EDGE_T:
...@@ -477,9 +488,9 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) ...@@ -477,9 +488,9 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
default: default:
; ;
} }
item->ClearFlags();
} }
ClearMarkItems( module );
} }
...@@ -518,6 +529,9 @@ void DeleteMarkedItems( MODULE* module ) ...@@ -518,6 +529,9 @@ void DeleteMarkedItems( MODULE* module )
item->DeleteStructure(); item->DeleteStructure();
} }
// Ref and value can be flagged, but cannot be deleted
ClearMarkItems( module );
} }
...@@ -534,6 +548,12 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -534,6 +548,12 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all )
if( module == NULL ) if( module == NULL )
return; return;
if( module->Reference().IsSelected() || force_all )
module->Reference().MirrorTransformWithModule( offset.x );
if( module->Value().IsSelected() || force_all )
module->Value().MirrorTransformWithModule( offset.x );
for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() )
{ {
// Skip pads not selected, i.e. not inside the block to mirror: // Skip pads not selected, i.e. not inside the block to mirror:
...@@ -584,15 +604,15 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -584,15 +604,15 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all )
break; break;
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
static_cast<TEXTE_MODULE*>( item )->MirrorWithModule( offset.x ); static_cast<TEXTE_MODULE*>( item )->MirrorTransformWithModule( offset.x );
break; break;
default: default:
break; break;
} }
item->ClearFlags();
} }
ClearMarkItems( module );
} }
...@@ -607,6 +627,12 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -607,6 +627,12 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all )
if( module == NULL ) if( module == NULL )
return; return;
if( module->Reference().IsSelected() || force_all )
module->Reference().RotateTransformWithModule( offset, 900 );
if( module->Value().IsSelected() || force_all )
module->Value().RotateTransformWithModule( offset, 900 );
for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() )
{ {
if( !pad->IsSelected() && !force_all ) if( !pad->IsSelected() && !force_all )
...@@ -622,7 +648,7 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -622,7 +648,7 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all )
for( EDA_ITEM* item = module->GraphicalItems(); item; item = item->Next() ) for( EDA_ITEM* item = module->GraphicalItems(); item; item = item->Next() )
{ {
if( !item->IsSelected() && !force_all) if( !item->IsSelected() && !force_all )
continue; continue;
switch( item->Type() ) switch( item->Type() )
...@@ -644,26 +670,27 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -644,26 +670,27 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all )
break; break;
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
static_cast<TEXTE_MODULE*>( item )->RotateWithModule( wxPoint( 0, 0 ), 900 ); static_cast<TEXTE_MODULE*>( item )->RotateTransformWithModule( offset, 900 );
break; break;
default: default:
break; break;
} }
item->ClearFlags();
} }
ClearMarkItems( module );
} }
void ClearMarkItems( MODULE* module ) void ClearMarkItems( MODULE* module )
{ {
EDA_ITEM* item;
if( module == NULL ) if( module == NULL )
return; return;
item = module->GraphicalItems(); module->Reference().ClearFlags();
module->Value().ClearFlags();
EDA_ITEM* item = module->GraphicalItems();
for( ; item != NULL; item = item->Next() ) for( ; item != NULL; item = item->Next() )
{ {
...@@ -692,6 +719,24 @@ int MarkItemsInBloc( MODULE* module, EDA_RECT& Rect ) ...@@ -692,6 +719,24 @@ int MarkItemsInBloc( MODULE* module, EDA_RECT& Rect )
if( module == NULL ) if( module == NULL )
return 0; return 0;
ClearMarkItems( module ); // Just in case ...
pos = module->Reference().GetTextPosition();
if( Rect.Contains( pos ) )
{
module->Reference().SetFlags( SELECTED );
ItemsCount++;
}
pos = module->Value().GetTextPosition();
if( Rect.Contains( pos ) )
{
module->Value().SetFlags( SELECTED );
ItemsCount++;
}
pad = module->Pads(); pad = module->Pads();
for( ; pad != NULL; pad = pad->Next() ) for( ; pad != NULL; pad = pad->Next() )
......
...@@ -130,7 +130,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -130,7 +130,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
const wxPoint& offset ) const wxPoint& offset )
{ {
int ux0, uy0, dx, dy, radius, StAngle, EndAngle; int ux0, uy0, dx, dy, radius, StAngle, EndAngle;
int type_trace;
int typeaff; int typeaff;
LAYER_ID curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer; LAYER_ID curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
...@@ -154,8 +153,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -154,8 +153,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) panel->GetParent(); PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) panel->GetParent();
type_trace = m_Shape;
ux0 = m_Start.x - offset.x; ux0 = m_Start.x - offset.x;
uy0 = m_Start.y - offset.y; uy0 = m_Start.y - offset.y;
...@@ -176,7 +173,7 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -176,7 +173,7 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
if( DC->LogicalToDeviceXRel( m_Width ) <= MIN_DRAW_WIDTH ) if( DC->LogicalToDeviceXRel( m_Width ) <= MIN_DRAW_WIDTH )
typeaff = LINE; typeaff = LINE;
switch( type_trace ) switch( m_Shape )
{ {
case S_SEGMENT: case S_SEGMENT:
if( typeaff == LINE ) if( typeaff == LINE )
...@@ -245,10 +242,9 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -245,10 +242,9 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
break; break;
case S_POLYGON: case S_POLYGON:
{
// We must compute true coordinates from m_PolyPoints // We must compute true coordinates from m_PolyPoints
// which are relative to module position, orientation 0 // which are relative to module position, orientation 0
std::vector<wxPoint> points = m_PolyPoints; std::vector<wxPoint> points = m_PolyPoints;
for( unsigned ii = 0; ii < points.size(); ii++ ) for( unsigned ii = 0; ii < points.size(); ii++ )
...@@ -260,6 +256,10 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -260,6 +256,10 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
} }
GRPoly( panel->GetClipBox(), DC, points.size(), &points[0], true, m_Width, color, color ); GRPoly( panel->GetClipBox(), DC, points.size(), &points[0], true, m_Width, color, color );
}
break;
default:
break; break;
} }
} }
...@@ -312,3 +312,41 @@ EDA_ITEM* EDGE_MODULE::Clone() const ...@@ -312,3 +312,41 @@ EDA_ITEM* EDGE_MODULE::Clone() const
return new EDGE_MODULE( *this ); return new EDGE_MODULE( *this );
} }
void EDGE_MODULE::Flip(const wxPoint& aCentre )
{
wxPoint pt;
switch( GetShape() )
{
case S_ARC:
SetAngle( -GetAngle() );
//Fall through
default:
case S_SEGMENT:
pt = GetStart();
pt.y -= aCentre.y;
pt.y = -pt.y;
pt.y += aCentre.y;
SetStart( pt );
pt = GetEnd();
pt.y -= aCentre.y;
pt.y = -pt.y;
pt.y += aCentre.y;
SetEnd( pt );
NEGATE( m_Start0.y );
NEGATE( m_End0.y );
break;
case S_POLYGON:
// polygon corners coordinates are always relative to the
// footprint position, orientation 0
for( unsigned ii = 0; ii < m_PolyPoints.size(); ii++ )
NEGATE( m_PolyPoints[ii].y );
}
SetLayer( FlipLayer( GetLayer() ) );
}
...@@ -68,6 +68,9 @@ public: ...@@ -68,6 +68,9 @@ public:
SetLocalCoord(); SetLocalCoord();
} }
/// Flip entity relative to aCentre
void Flip( const wxPoint& aCentre );
void SetStart0( const wxPoint& aPoint ) { m_Start0 = aPoint; } void SetStart0( const wxPoint& aPoint ) { m_Start0 = aPoint; }
const wxPoint& GetStart0() const { return m_Start0; } const wxPoint& GetStart0() const { return m_Start0; }
......
...@@ -947,31 +947,7 @@ void MODULE::Flip( const wxPoint& aCentre ) ...@@ -947,31 +947,7 @@ void MODULE::Flip( const wxPoint& aCentre )
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_MODULE_EDGE_T: case PCB_MODULE_EDGE_T:
{ ( (EDGE_MODULE*) item )->Flip( m_Pos );
EDGE_MODULE* em = (EDGE_MODULE*) item;
wxPoint s = em->GetStart();
s.y -= m_Pos.y;
s.y = -s.y;
s.y += m_Pos.y;
em->SetStart( s );
wxPoint e = em->GetEnd();
e.y -= m_Pos.y;
e.y = -e.y;
e.y += m_Pos.y;
em->SetEnd( e );
NEGATE( em->m_Start0.y );
NEGATE( em->m_End0.y );
if( em->GetShape() == S_ARC )
{
em->SetAngle( -em->GetAngle() );
}
em->SetLayer( FlipLayer( em->GetLayer() ) );
}
break; break;
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
......
...@@ -105,33 +105,45 @@ void TEXTE_MODULE::Flip(const wxPoint& aCentre ) ...@@ -105,33 +105,45 @@ void TEXTE_MODULE::Flip(const wxPoint& aCentre )
void TEXTE_MODULE::FlipWithModule( int aOffset ) void TEXTE_MODULE::FlipWithModule( int aOffset )
{ {
// flipping the footprint is relative to the X axis
m_Pos.y = aOffset - (m_Pos.y - aOffset); m_Pos.y = aOffset - (m_Pos.y - aOffset);
NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient ); NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient );
wxPoint tmp = GetPos0();
tmp.y = -tmp.y;
SetPos0( tmp );
SetLayer( FlipLayer( GetLayer() ) ); SetLayer( FlipLayer( GetLayer() ) );
m_Mirror = IsBackLayer( GetLayer() ); m_Mirror = IsBackLayer( GetLayer() );
} }
void TEXTE_MODULE::MirrorWithModule( int aOffset ) void TEXTE_MODULE::MirrorTransformWithModule( int aOffset )
{ {
wxPoint tmp = GetTextPosition(); // Used in modedit, to transform the footprint
tmp.x = aOffset - (tmp.x - aOffset); // the mirror is relative to the Y axis
SetTextPosition( tmp ); // the position is mirrored, but the text itself is not mirrored
tmp.y = GetPos0().y; // Note also in module editor, m_Pos0 = m_Pos
SetPos0( tmp ); m_Pos.x = aOffset - (m_Pos.x - aOffset);
m_Pos0 = m_Pos;
NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient ); NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient );
} }
void TEXTE_MODULE::RotateWithModule( const wxPoint& aOffset, double aAngle ) void TEXTE_MODULE::RotateTransformWithModule( const wxPoint& aOffset, double aAngle )
{ {
wxPoint pos = GetTextPosition(); // Used in modedit, to transform the footprint
RotatePoint( &pos, aOffset, aAngle ); // Note also in module editor, m_Pos0 = m_Pos
SetTextPosition( pos ); RotatePoint( &m_Pos, aOffset, aAngle );
SetPos0( GetTextPosition() ); m_Pos0 = m_Pos;
SetOrientation( GetOrientation() + aAngle ); SetOrientation( GetOrientation() + aAngle );
} }
void TEXTE_MODULE::MoveTransformWithModule( const wxPoint& aMoveVector )
{
// Used in modedit, to transform the footprint
// Note also in module editor, m_Pos0 = m_Pos
m_Pos0 += aMoveVector;
m_Pos = m_Pos0;
}
void TEXTE_MODULE::Copy( TEXTE_MODULE* source ) void TEXTE_MODULE::Copy( TEXTE_MODULE* source )
{ {
......
...@@ -94,17 +94,21 @@ public: ...@@ -94,17 +94,21 @@ public:
void Flip( const wxPoint& aCentre ); void Flip( const wxPoint& aCentre );
/// Rotate entity during module rotation /// Rotate text during module rotation transform, in footprint editor
void RotateWithModule( const wxPoint& aOffset, double aAngle ); void RotateTransformWithModule( const wxPoint& aOffset, double aAngle );
/// Flip entity during module flip /// Flip entity during module flip
void FlipWithModule( int aOffset ); void FlipWithModule( int aOffset );
/// Mirror entiry during module mirroring /// Mirror text during module mirroring transform, in footprint editor
void MirrorWithModule( int aOffset ); /// the text itself is not mirrored, only position.
void MirrorTransformWithModule( int aOffset );
/// move text during module mirroring transform, in footprint editor
void MoveTransformWithModule( const wxPoint& aMoveVector );
/// @deprecated it seems (but the type is used to 'protect' /// @deprecated it seems (but the type is used to 'protect'
//reference and value from deletion, and for identification) // reference and value from deletion, and for identification)
void SetType( TEXT_TYPE aType ) { m_Type = aType; } void SetType( TEXT_TYPE aType ) { m_Type = aType; }
TEXT_TYPE GetType() const { return m_Type; } TEXT_TYPE GetType() const { return m_Type; }
......
...@@ -284,11 +284,11 @@ void DIALOG_COPPER_ZONE::initDialog() ...@@ -284,11 +284,11 @@ void DIALOG_COPPER_ZONE::initDialog()
// unfortunately this option does not work well both on // unfortunately this option does not work well both on
// wxWidgets 2.8 ( column witdth too small), and // wxWidgets 2.8 ( column witdth too small), and
// wxWidgets 2.9 ( column witdth too large) // wxWidgets 2.9 ( column witdth too large)
ctrlWidth += LAYER_BITMAP_SIZE_X + 16; // Add bitmap width + margin between bitmap and text ctrlWidth += LAYER_BITMAP_SIZE_X + 25; // Add bitmap width + margin between bitmap and text
m_LayerSelectionCtrl->SetColumnWidth( 0, ctrlWidth ); m_LayerSelectionCtrl->SetColumnWidth( 0, ctrlWidth );
ctrlWidth += 4; // add small margin between text and window borders ctrlWidth += 25; // add small margin between text and window borders
// and room for vertical scroll bar
m_LayerSelectionCtrl->SetMinSize( wxSize( ctrlWidth, -1 ) ); m_LayerSelectionCtrl->SetMinSize( wxSize( ctrlWidth, -1 ) );
wxString netNameDoNotShowFilter = wxT( "Net-*" ); wxString netNameDoNotShowFilter = wxT( "Net-*" );
......
...@@ -143,13 +143,15 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init() ...@@ -143,13 +143,15 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
wxImageList* imageList = new wxImageList( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y ); wxImageList* imageList = new wxImageList( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL ); m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL );
int ii = 0;
int lyrSelect = ( (PCB_SCREEN*) m_parent->GetScreen() )->m_Active_Layer; int lyrSelect = ( (PCB_SCREEN*) m_parent->GetScreen() )->m_Active_Layer;
if( m_zone ) if( m_zone )
lyrSelect = m_zone->GetLayer(); lyrSelect = m_zone->GetLayer();
for( LSEQ seq = LSET::AllNonCuMask().Seq(); seq; ++seq, ++ii ) int ctrlWidth = 0; // Min width for m_LayerSelectionCtrl to show the layers names
int imgIdx = 0;
for( LSEQ seq = LSET::AllNonCuMask().Seq(); seq; ++seq, ++imgIdx )
{ {
LAYER_ID layer = *seq; LAYER_ID layer = *seq;
...@@ -160,11 +162,25 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init() ...@@ -160,11 +162,25 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
msg.Trim(); msg.Trim();
int itemIndex = m_LayerSelectionCtrl->InsertItem( int itemIndex = m_LayerSelectionCtrl->InsertItem(
m_LayerSelectionCtrl->GetItemCount(), msg, ii ); m_LayerSelectionCtrl->GetItemCount(), msg, imgIdx );
if(lyrSelect == layer ) if(lyrSelect == layer )
m_LayerSelectionCtrl->Select( itemIndex ); m_LayerSelectionCtrl->Select( itemIndex );
wxSize tsize( GetTextSize( msg, m_LayerSelectionCtrl ) );
ctrlWidth = std::max( ctrlWidth, tsize.x );
} }
// The most easy way to ensure the right size is to use wxLIST_AUTOSIZE
// unfortunately this option does not work well both on
// wxWidgets 2.8 ( column witdth too small), and
// wxWidgets 2.9 ( column witdth too large)
ctrlWidth += LAYER_BITMAP_SIZE_X + 25; // Add bitmap width + margin between bitmap and text
m_LayerSelectionCtrl->SetColumnWidth( 0, ctrlWidth );
ctrlWidth += 25; // add small margin between text and window borders
// and room for vertical scroll bar
m_LayerSelectionCtrl->SetMinSize( wxSize( ctrlWidth, -1 ) );
} }
......
...@@ -167,7 +167,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC ) ...@@ -167,7 +167,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
// Display info about track Net class, and init track and vias sizes: // Display info about track Net class, and init track and vias sizes:
g_CurrentTrackSegment->SetNetCode( GetBoard()->GetHighLightNetCode() ); g_CurrentTrackSegment->SetNetCode( GetBoard()->GetHighLightNetCode() );
GetDesignSettings().SetCurrentNetClass( g_CurrentTrackSegment->GetNetClassName() ); SetCurrentNetClass( g_CurrentTrackSegment->GetNetClassName() );
g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer ); g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer );
g_CurrentTrackSegment->SetWidth( GetDesignSettings().GetCurrentTrackWidth() ); g_CurrentTrackSegment->SetWidth( GetDesignSettings().GetCurrentTrackWidth() );
......
...@@ -69,10 +69,11 @@ static const wxChar autosavePrefix[] = wxT( "_autosave-" ); ...@@ -69,10 +69,11 @@ static const wxChar autosavePrefix[] = wxT( "_autosave-" );
* @param aCtl is where to put the OpenProjectFiles() control bits. * @param aCtl is where to put the OpenProjectFiles() control bits.
* *
* @param aFileName on entry is a probable choice, on return is the chosen filename. * @param aFileName on entry is a probable choice, on return is the chosen filename.
* @param aKicadFilesOnly true to list kiacad pcb files plugins only, false to list all plugins.
* *
* @return bool - true if chosen, else false if user aborted. * @return bool - true if chosen, else false if user aborted.
*/ */
bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName ) bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName, bool aKicadFilesOnly = false )
{ {
// This is a subset of all PLUGINs which are trusted to be able to // This is a subset of all PLUGINs which are trusted to be able to
// load a BOARD. User may occasionally use the wrong plugin to load a // load a BOARD. User may occasionally use the wrong plugin to load a
...@@ -93,7 +94,9 @@ bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName ) ...@@ -93,7 +94,9 @@ bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName )
wxFileName fileName( *aFileName ); wxFileName fileName( *aFileName );
wxString fileFilters; wxString fileFilters;
for( unsigned i=0; i<DIM( loaders ); ++i ) unsigned pluginsCount = aKicadFilesOnly ? 2 : DIM( loaders );
for( unsigned i=0; i < pluginsCount; ++i )
{ {
if( i > 0 ) if( i > 0 )
fileFilters += wxChar( '|' ); fileFilters += wxChar( '|' );
...@@ -291,10 +294,12 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) ...@@ -291,10 +294,12 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event )
int open_ctl; int open_ctl;
wxString fileName; wxString fileName;
if( !AskLoadBoardFileName( this, &open_ctl, &fileName ) ) if( !AskLoadBoardFileName( this, &open_ctl, &fileName, true ) )
break; break;
AppendBoardFile( fileName, open_ctl ); AppendBoardFile( fileName, open_ctl );
m_canvas->Refresh();
} }
break; break;
...@@ -343,7 +348,7 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) ...@@ -343,7 +348,7 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event )
// The KIWAY_PLAYER::OpenProjectFiles() API knows nothing about plugins, so // The KIWAY_PLAYER::OpenProjectFiles() API knows nothing about plugins, so
// determine how to load the BOARD here, with minor assistance from KICTL_EAGLE_BRD // determine how to load the BOARD here, with minor assistance from KICTL_EAGLE_BRD
// bit flag. // bit flag.
static IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl ) IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl )
{ {
IO_MGR::PCB_FILE_T pluginType; IO_MGR::PCB_FILE_T pluginType;
...@@ -369,19 +374,6 @@ static IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl ) ...@@ -369,19 +374,6 @@ static IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl )
} }
bool PCB_EDIT_FRAME::AppendBoardFile( const wxString& aFullFileName, int aCtl )
{
return false;
// I'll never use it, and it was mucking up OpenProjectFiles() with
// complicated cruft. If you must, put it here separate from that important
// function.
// Actually I think this serves too many masters. Just do panelization in
// a good gerber file manager.
}
bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl ) bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
{ {
// This is for python: // This is for python:
...@@ -567,7 +559,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in ...@@ -567,7 +559,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
GetBoard()->m_Status_Pcb = 0; GetBoard()->m_Status_Pcb = 0;
// Update info shown by the horizontal toolbars // Update info shown by the horizontal toolbars
GetDesignSettings().SetCurrentNetClass( NETCLASS::Default ); SetCurrentNetClass( NETCLASS::Default );
ReFillLayerWidget(); ReFillLayerWidget();
ReCreateLayerBox(); ReCreateLayerBox();
...@@ -581,9 +573,6 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in ...@@ -581,9 +573,6 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
// See case RATSNEST_VISIBLE: in BOARD::SetElementVisibility() // See case RATSNEST_VISIBLE: in BOARD::SetElementVisibility()
GetBoard()->SetVisibleElements( GetBoard()->GetVisibleElements() ); GetBoard()->SetVisibleElements( GetBoard()->GetVisibleElements() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
// Display the loaded board: // Display the loaded board:
Zoom_Automatique( false ); Zoom_Automatique( false );
...@@ -689,7 +678,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF ...@@ -689,7 +678,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
// Select default Netclass before writing file. // Select default Netclass before writing file.
// Useful to save default values in headers // Useful to save default values in headers
GetDesignSettings().SetCurrentNetClass( NETCLASS::Default ); SetCurrentNetClass( NETCLASS::Default );
ClearMsgPanel(); ClearMsgPanel();
...@@ -713,7 +702,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF ...@@ -713,7 +702,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
); );
DisplayError( this, msg ); DisplayError( this, msg );
lowerTxt = _( "Failed to create " ) + pcbFileName.GetFullPath(); lowerTxt.Printf( _( "Failed to create '%s'" ), GetChars( pcbFileName.GetFullPath() ) );
AppendMsgPanel( upperTxt, lowerTxt, CYAN ); AppendMsgPanel( upperTxt, lowerTxt, CYAN );
...@@ -739,9 +728,9 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF ...@@ -739,9 +728,9 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
wxRemoveFile( autoSaveFileName.GetFullPath() ); wxRemoveFile( autoSaveFileName.GetFullPath() );
if( !!backupFileName ) if( !!backupFileName )
upperTxt = _( "Backup file: " ) + backupFileName; upperTxt.Printf( _( "Backup file: '%s'" ), GetChars( backupFileName ) );
lowerTxt = _( "Wrote board file: " ) + pcbFileName.GetFullPath(); lowerTxt.Printf( _( "Wrote board file: '%s'" ), GetChars( pcbFileName.GetFullPath() ) );
AppendMsgPanel( upperTxt, lowerTxt, CYAN ); AppendMsgPanel( upperTxt, lowerTxt, CYAN );
......
...@@ -668,7 +668,11 @@ bool PCB_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand ) ...@@ -668,7 +668,11 @@ bool PCB_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand )
case PCB_TRACE_T: case PCB_TRACE_T:
case PCB_VIA_T: case PCB_VIA_T:
if( aIdCommand == HK_EDIT_ITEM ) if( aIdCommand == HK_EDIT_ITEM )
{
// Be sure the corresponding netclass is selected before edit:
SetCurrentNetClass( ( (BOARD_CONNECTED_ITEM*)item )->GetNetClassName() );
evt_type = ID_POPUP_PCB_EDIT_TRACKSEG; evt_type = ID_POPUP_PCB_EDIT_TRACKSEG;
}
break; break;
......
...@@ -43,6 +43,7 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() ...@@ -43,6 +43,7 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
{ {
wxString text; wxString text;
wxMenuBar* menuBar = GetMenuBar(); wxMenuBar* menuBar = GetMenuBar();
wxMenuItem * menutitem;
wxFileHistory& fhist = Kiface().GetFileHistory(); wxFileHistory& fhist = Kiface().GetFileHistory();
...@@ -95,10 +96,14 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() ...@@ -95,10 +96,14 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
KiBitmap( open_project_xpm ) ); KiBitmap( open_project_xpm ) );
} }
AddMenuItem( filesMenu, ID_APPEND_FILE, menutitem = AddMenuItem( filesMenu, ID_APPEND_FILE,
_( "&Append Board" ), _( "&Append Board" ),
_( "Append another Pcbnew board to the current loaded board" ), _( "Append another Pcbnew board to the current loaded board. Available only when Pcbnew runs in stand alone mode" ),
KiBitmap( import_xpm ) ); KiBitmap( import_xpm ) );
if( ! Kiface().IsSingle() ) // disable when under a project mgr
menutitem->Enable( false );
filesMenu->AppendSeparator(); filesMenu->AppendSeparator();
text = AddHotkeyName( _( "&Save" ), g_Board_Editor_Hokeys_Descr, HK_SAVE_BOARD ); text = AddHotkeyName( _( "&Save" ), g_Board_Editor_Hokeys_Descr, HK_SAVE_BOARD );
......
...@@ -818,25 +818,13 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) ...@@ -818,25 +818,13 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform ) void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform )
{ {
wxPoint pos;
double angle = 900; // Necessary +- 900 (+- 90 degrees).
// Be prudent: because RotateMarkedItems is used to rotate some items
// used the same value as RotateMarkedItems
switch( transform ) switch( transform )
{ {
case ID_MODEDIT_MODULE_ROTATE: case ID_MODEDIT_MODULE_ROTATE:
module->Reference().RotateWithModule( wxPoint(0,0), angle );
module->Value().RotateWithModule( wxPoint(0,0), angle );
RotateMarkedItems( module, wxPoint(0,0), true ); RotateMarkedItems( module, wxPoint(0,0), true );
break; break;
case ID_MODEDIT_MODULE_MIRROR: case ID_MODEDIT_MODULE_MIRROR:
module->Reference().MirrorWithModule( 0 );
module->Value().MirrorWithModule( 0 );
// Mirror pads and graphic items of the footprint:
MirrorMarkedItems( module, wxPoint(0,0), true ); MirrorMarkedItems( module, wxPoint(0,0), true );
break; break;
......
...@@ -166,10 +166,8 @@ void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition ) ...@@ -166,10 +166,8 @@ void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
case PCB_TRACE_T: case PCB_TRACE_T:
case PCB_VIA_T: case PCB_VIA_T:
case PCB_PAD_T: case PCB_PAD_T:
GetDesignSettings().SetCurrentNetClass( SetCurrentNetClass(
((BOARD_CONNECTED_ITEM*)DrawStruct)->GetNetClassName() ); ((BOARD_CONNECTED_ITEM*)DrawStruct)->GetNetClassName() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
break; break;
default: default:
......
...@@ -464,9 +464,7 @@ void PCB_EDIT_FRAME::createPopupMenuForTracks( TRACK* Track, wxMenu* PopMenu ) ...@@ -464,9 +464,7 @@ void PCB_EDIT_FRAME::createPopupMenuForTracks( TRACK* Track, wxMenu* PopMenu )
wxPoint cursorPosition = GetCrossHairPosition(); wxPoint cursorPosition = GetCrossHairPosition();
wxString msg; wxString msg;
GetDesignSettings().SetCurrentNetClass( Track->GetNetClassName() ); SetCurrentNetClass( Track->GetNetClassName() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
int flags = Track->GetFlags(); int flags = Track->GetFlags();
...@@ -834,12 +832,7 @@ void PCB_EDIT_FRAME::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu ) ...@@ -834,12 +832,7 @@ void PCB_EDIT_FRAME::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu )
if( flags ) // Currently in edit, no others commands possible if( flags ) // Currently in edit, no others commands possible
return; return;
if( GetDesignSettings().GetCurrentNetClassName() != Pad->GetNetClassName() ) SetCurrentNetClass( Pad->GetNetClassName() );
{
GetDesignSettings().SetCurrentNetClass( Pad->GetNetClassName() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
}
wxString msg = Pad->GetSelectMenuText(); wxString msg = Pad->GetSelectMenuText();
......
...@@ -1079,3 +1079,17 @@ void PCB_EDIT_FRAME::ToPlotter( wxCommandEvent& event ) ...@@ -1079,3 +1079,17 @@ void PCB_EDIT_FRAME::ToPlotter( wxCommandEvent& event )
dlg.ShowModal(); dlg.ShowModal();
} }
bool PCB_EDIT_FRAME::SetCurrentNetClass( const wxString& aNetClassName )
{
bool change = GetDesignSettings().SetCurrentNetClass( aNetClassName );
if( change )
{
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
}
return change;
}
...@@ -534,7 +534,13 @@ void ROUTER_TOOL::performRouting() ...@@ -534,7 +534,13 @@ void ROUTER_TOOL::performRouting()
frame->SetActiveLayer( ToLAYER_ID( m_startLayer ) ); frame->SetActiveLayer( ToLAYER_ID( m_startLayer ) );
if( m_startItem && m_startItem->Net() >= 0 ) if( m_startItem && m_startItem->Net() >= 0 )
{
highlightNet( true, m_startItem->Net() ); highlightNet( true, m_startItem->Net() );
// Update track width and via size shown in main toolbar comboboxes
frame->SetCurrentNetClass( m_startItem->Parent()->GetNetClass()->GetName() );
}
else
frame->SetCurrentNetClass( NETCLASS::Default );
ctls->ForceCursorPosition( false ); ctls->ForceCursorPosition( false );
ctls->SetAutoPan( true ); ctls->SetAutoPan( true );
......
...@@ -153,11 +153,19 @@ void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, GR_DRAWMODE aDrawMode, const ...@@ -153,11 +153,19 @@ void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, GR_DRAWMODE aDrawMode, const
*/ */
for( TRACK* track = m_Track; track; track = track->Next() ) for( TRACK* track = m_Track; track; track = track->Next() )
{ {
if( track->IsMoving() )
continue;
track->Draw( aPanel, DC, aDrawMode ); track->Draw( aPanel, DC, aDrawMode );
} }
// SEGZONE is outdated, only her for compatibility with
// very old designs
for( SEGZONE* zone = m_Zone; zone; zone = zone->Next() ) for( SEGZONE* zone = m_Zone; zone; zone = zone->Next() )
{ {
if( zone->IsMoving() )
continue;
zone->Draw( aPanel, DC, aDrawMode ); zone->Draw( aPanel, DC, aDrawMode );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment