Browse Source

Merge branch 'master' into syntax

merge-requests/365/head
Jørgen Lien Sellæg 11 years ago
parent
commit
0ea71028c4
  1. 35
      juci/CMakeLists.txt
  2. 77
      juci/api.h
  3. 8
      juci/api_ext.cc
  4. 3
      juci/juci.h
  5. 21
      juci/menu.cc
  6. 4
      juci/menu.h
  7. 57
      juci/plugin/CMakeLists.txt
  8. 118
      juci/plugin/plugin.cc
  9. 28
      juci/plugin/plugin.h
  10. 8
      juci/plugin/plugin_ext.cc
  11. 39
      juci/plugin/randomtext.txt
  12. 7
      juci/window.cc

35
juci/CMakeLists.txt

@ -1,8 +1,10 @@
cmake_minimum_required (VERSION 2.8.4)
set(project_name juci)
set(module juci_to_python_api)
project (${project_name})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
INCLUDE(FindPkgConfig)
@ -28,7 +30,7 @@ endif()
#Boost_INCLUDE_DIRS - Boost include directories
#Boost_LIBRARY_DIRS - Link directories for Boost libraries
#Boost_LIBRARIES - Boost component libraries to be linked
find_package(Boost 1.5 REQUIRED)
find_package(Boost 1.5 REQUIRED COMPONENTS python)
#If boost is not found
if(${Boost_FOUND})
@ -60,20 +62,33 @@ else()
endif()
# name of the executable on Windows will be example.exe
add_executable(${project_name}
# list of every needed file to create the executable
keybindings
menu
source
window
juci
#there is no need for extentions
)
#list of every needed file to create the executable
keybindings
menu
source
window
juci
api
#there is no need for extentions
)
add_library(${module} SHARED
api.h
api_ext.cc
)
# dependencies
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS})
link_directories(${GTKMM_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS})
link_directories(${GTKMM_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS} ${PYTHON_INCLUDE_DIRS})
#module:
set_target_properties(${module} PROPERTIES PREFIX "")
target_link_libraries(${module} ${PYTHON_LIBRARIES} ${Boost_LIBRARIES})
#executable:
target_link_libraries(${project_name} ${GTKMM_LIBRARIES} ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})

77
juci/api.h

@ -0,0 +1,77 @@
#include <boost/python.hpp>
#include <Python.h>
#include <string>
//
// Plugin API
//
namespace juci_api{
//
// calls from python to C++
//
namespace cpp{
//
// Replaceword:
// replaces a word in the editor with a string
//
void ReplaceWord(const std::string word_){
//TODO implement api::ReplaceWord / change string to iter?
//some_namespace::controller::replaceWord(word_*);
std::cout << "unimplemented function: 'api::ReplaceWord()' called"
<< std::endl;
}
//
// ReplaceLine:
// Replaces a line in the editor with a string
//
void ReplaceLine(const std::string line_){
//TODO implement api::ReplaceLine / change string to iter?
//some_namespace::controller::replaceLine(line_);
std::cout << "unimplemented function: 'api::ReplaceLine()' called"
<< std::endl;
}
}//namespace cpp
//
// calls from C++ to Python
//
namespace py{
const std::string g_project_root("~/bachelor/app/juci/");
//helpers
boost::python::api::object openPythonScript(const std::string path,
boost::python::api::object python_name_space) {
std::string temp = g_project_root + path + ".py";
boost::python::str the_path(temp);
return boost::python::exec_file(the_path, python_name_space);//, python_name_space);
}
//void snippet(std::string& word);
void plugin(const std::string& plugin_name){
try{
/* initialize python interpreter */
Py_Initialize();
boost::python::api::object main_module = boost::python::import("__main__");
boost::python::api::object main_namespace = main_module.attr("__dict__");
/* runs script from python */
//boost::python::object ignored1 = setPythonVar("word", word, main_namespace);
boost::python::api::object ignored2 = openPythonScript(plugin_name, main_namespace);
/* extracts desired values */
//boost::python::object pySnippet = boost::python::eval("getSnippet()", main_namespace);
//word = boost::python::extract<std::string>(pySnippet);
/* add snippet to textView */
//TODO add snippet
}catch(boost::python::error_already_set const&){
PyErr_Print();
}
}
}// py
}//juci_api

8
juci/api_ext.cc

@ -0,0 +1,8 @@
#include "api.h"
BOOST_PYTHON_MODULE(jucy_to_python_api) {
using namespace boost::python;
// text editing
def("replaceLine", &juci_api::cpp::ReplaceLine);
def("replaceWord", &juci_api::cpp::ReplaceWord);
}// module::juci

3
juci/juci.h

@ -14,7 +14,8 @@ public:
Gtk::Box window_box_;
std::shared_ptr<Source::Controller> source();
private:
Menu::Controller menu;
Keybindings::Controller keybindings_;
Menu::Controller menu_;
Source::Controller source_;
/*signal handler*/
void onSystemQuit();

21
juci/menu.cc

@ -7,7 +7,7 @@
Menu::Model::Model() {
ui_string_ =
"<ui> "
"<ui> "
" <menubar name='MenuBar'> "
" <menu action='FileMenu'> "
" <menu action='FileNew'> "
@ -47,18 +47,18 @@ Menu::Model::Model() {
Menu::Model::~Model() {
}
/***********************************/
/* VIEW */
/***********************************/
// VIEW
Menu::View::View(Gtk::Orientation orientation) :
view_(orientation) {
}
Glib::RefPtr<Gtk::Box> Menu::View::view(
Gtk::Box& Menu::View::view(
Glib::RefPtr<Gtk::UIManager> ui_manager) {
view_.pack_start(*ui_manager->get_widget("/MenuBar"), Gtk::PACK_SHRINK);
return Glib::RefPtr<Gtk::Box>(&view_);
return view_;
}
Menu::View::~View() {
@ -87,6 +87,7 @@ Menu::Controller::Controller(Keybindings::Controller keybindings) :
[this]() {
OnFileNewCCFile();
});
keybindings_.action_group()->add(Gtk::Action::create("FileNewH",
Gtk::Stock::NEW, "New h file", "Create a new h file"),
Gtk::AccelKey("<control><alt>h"),
@ -168,6 +169,10 @@ Menu::Controller::Controller(Keybindings::Controller keybindings) :
Menu::Controller::~Controller() {
}
Gtk::Box& Menu::Controller::view() {
return menu_view_.view(keybindings_.ui_manager());
}
void Menu::Controller::OnFileNewEmptyfile() {
std::cout << "New file clicked" << std::endl;
//TODO(Oyvang) Legg til funksjon
@ -179,14 +184,14 @@ void Menu::Controller::OnFileNewCCFile() {
}
void Menu::Controller::OnFileNewHeaderFile() {
std::cout << "New cc file clicked" << std::endl;
std::cout << "New header file clicked" << std::endl;
//TODO(Oyvang) Legg til funksjon
}
void Menu::Controller::OnSystemQuit() {
//TODO(Oyvang, Zalox, Forgie) Add everything that needs to be done before quiting
/*Quit the system*/
Gtk::Main::quit(); //TODO(Oyvang, Zalox, Forgie) methode is depricated, find a better solution.
}
void Menu::Controller::OnPluginAddSnippet() {

4
juci/menu.h

@ -19,7 +19,7 @@ namespace Menu {
public:
explicit View(Gtk::Orientation orient);
virtual ~View();
Glib::RefPtr<Gtk::Box> view(Glib::RefPtr<Gtk::UIManager> ui_manager);
Gtk::Box& view(Glib::RefPtr<Gtk::UIManager> ui_manager);
protected:
Gtk::Box view_;
@ -29,7 +29,7 @@ namespace Menu {
public:
explicit Controller(Keybindings::Controller keybindings);
virtual ~Controller();
Gtk::Box& view();
private:
Keybindings::Controller keybindings_;
View menu_view_;

57
juci/plugin/CMakeLists.txt

@ -0,0 +1,57 @@
cmake_minimum_required (VERSION 2.4)
set(project_name plugin)
project (${project_name})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
include(FindPkgConfig)
#Boost_FOUND - True if headers and requested libraries were found
#Boost_INCLUDE_DIRS - Boost include directories
#Boost_LIBRARY_DIRS - Link directories for Boost libraries
#Boost_LIBRARIES - Boost component libraries to be linked
find_package(Boost 1.55 REQUIRED COMPONENTS python system )
if(!${Boost_FOUND})
message(FATAL_ERROR "Boost libraries not found")
endif()
#GTKMM_FOUND - True if headers and requested libraries were found
#GTKMM_INCLUDE_DIRS - GTKMM include directories
#GTKMM_LIBRARY_DIRS - Link directories for GTKMM libraries
#GTKMM_LIBRARIES - GTKMM component libraries to be linked
pkg_check_modules(GTKMM REQUIRED gtkmm-3.0)
if(!${GTKMM_FOUND})
message(FATAL_ERROR "Gtkmm not found")
endif()
#PYTHONLIBS_FOUND - True if headers and requested libraries were found
#PYTHON_INCLUDE_DIRS - GTKMM include directories
#PYTHON_LIBRARIES - GTKMM component libraries to be linked
#$PYTHONLIBS_VERSION_STRING - ersion string
find_package(PythonLibs 2.7 REQUIRED)
if(!${PYTHONLIBS_FOUND})
message(FATAL_ERROR "Pythonlibs not found")
else()
message("Found python libs ${PYTHONLIBS_VERSION_STRING}")
endif()
ADD_LIBRARY(plugintest_ext MODULE
plugin.h
plugin.cc
plugin_ext.cc
)
set_target_properties(plugintest_ext PROPERTIES PREFIX "")
target_link_libraries(plugintest_ext ${Boost_LIBRARIES})
add_executable(${project_name}
plugin.h
plugin.cc
)
include_directories(${PYTHON_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS})
link_directories(${GTKMM_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS} ${PYTHON_LIBRARIES})
target_link_libraries(${project_name} ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} ${GTKMM_LIBRARIES})

118
juci/plugin/plugin.cc

@ -0,0 +1,118 @@
#include "plugin.h"
////////////////////////////////////////////////////////////////////////////////
//
// setPythonVar:
// initiates a string value (k_var_value) to a declared variable name
// (k_var_name) within a given namespace(python_name_space)
//
////////////////////////////////////////////////////////////////////////////////
bp::object Plugin::setPythonVar(const std::string k_var_name,
const std::string k_var_value,
bp::object python_name_space ) {
std::string temp = k_var_name + " = \"" + k_var_value + "\"";
bp::str the_var(temp);
return bp::exec(the_var, python_name_space);
}
////////////////////////////////////////////////////////////////////////////////
//
// openPythonScript:
// Opens a python plugin script within a file path and a python namespace
//
////////////////////////////////////////////////////////////////////////////////
bp::object Plugin::openPythonScript(const std::string path,
bp::object python_name_space) {
std::string temp = g_project_root + "plugins/" + path + "/" + path + ".py";
bp::str the_path(temp);
return bp::exec_file(the_path, python_name_space);
}
////////////////////////////////////////////////////////////////////////////////
//
// for testing purposes only
//
////////////////////////////////////////////////////////////////////////////////
std::string Plugin::get_test_value2(){
return "STRING FROM WITHIN C++";
}
/* public functions */
////////////////////////////////////////////////////////////////////////////////
//
// snippet:
// takes a std::string and converts it into a matching snippet
// if no matching snippet, returns the same string
//
////////////////////////////////////////////////////////////////////////////////
void Plugin::snippet(std::string& word){
try{
/* initialize python interpreter */
Py_Initialize();
bp::object main_module = bp::import("__main__");
bp::object main_namespace = main_module.attr("__dict__");
/* runs script from python */
bp::object ignored1 = setPythonVar("word", word, main_namespace);
bp::object ignored2 = openPythonScript(__func__, main_namespace);
/* extracts desired values */
bp::object pySnippet = bp::eval("getSnippet()", main_namespace);
word = bp::extract<std::string>(pySnippet);
/* add snippet to textView */
//TODO add snippet
}catch(bp::error_already_set const&){
PyErr_Print();
}
}
////////////////////////////////////////////////////////////////////////////////
//
// get_test_value:
// for testing purposes
// uses a python module generated from c++
// calls c++ function from python
// returns string to c++ from python
// prints the string from python within c++
//
////////////////////////////////////////////////////////////////////////////////
void Plugin::get_test_value(){
try{
/* initialize python interpreter */
Py_Initialize();
bp::object main_module = bp::import("__main__");
bp::object main_namespace = main_module.attr("__dict__");
/* runs script from python */
const std::string path("test");
bp::object ignored2 = openPythonScript(path, main_namespace);
/* extracts desired values */
bp::object pySnippet = bp::eval("get_test_value()", main_namespace);
std::string mword = bp::extract<std::string>(pySnippet);
/* add snippet to textView */
std::cout << mword << std::endl;
//TODO add snippet
}catch(bp::error_already_set const&){
PyErr_Print();
}
}
int main(int argc, char *argv[])
{
std::string word("ifelse");
Plugin::snippet(word);
//Plugin::get_test_value();
std::cout << word << std::endl;
return 0;
}

28
juci/plugin/plugin.h

@ -0,0 +1,28 @@
#ifndef JUCI_PLUGIN_H_
#define JUCI_PLUGIN_H_
#include <boost/python.hpp>
#include <Python.h>
#include <string>
#include <iostream>
namespace bp = boost::python;
const std::string g_project_root("~/q6/testing/plugin/");
//TODO (forgie) get current working directory..
class Plugin{
public:
static void snippet(std::string& word);
static void get_test_value();
static std::string get_test_value2();
private:
static bp::object setPythonVar(const std::string varName,
const std::string varValue,
bp::object python_name_space);
static bp::object openPythonScript(const std::string path,
bp::object python_name_space);
};
#endif // JUCI_PLUGIN_H_

8
juci/plugin/plugin_ext.cc

@ -0,0 +1,8 @@
#include "plugin.h"
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(plugintest_ext)
{
def("get_test_value2", &Plugin::get_test_value2);
}

39
juci/plugin/randomtext.txt

@ -0,0 +1,39 @@
/*
void theprogram()
{
std::string input;
std::cout << "Enter string to transform: ";
std::getline(std::cin, input);
//std::string inttransformed = CallPythonPlugIn(input);
std::cout << "The transformed string is: " << input << std::endl;
}
int test1()
{
try{
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
object ignored = exec("result = 5 ** 2", main_namespace);
int five_squared = extract<int>(main_namespace["result"]);
printf("%d\n", five_squared);
return five_squared;
}
catch(error_already_set const&){
PyErr_Print();
}
return -1;
}
void test2(int theNum, int &test)
{
int seven = 7;
test = 7+ theNum;
std::cout << theNum << std::endl;
}
*/

7
juci/window.cc

@ -2,14 +2,15 @@
Window::Window() :
window_box_(Gtk::ORIENTATION_HORIZONTAL),
menu() {
menu_(keybindings_) {
set_title("example juCi++");
set_default_size(600, 600);
// window_box_.add(*source_.sourceview());
add(window_box_);
add_accel_group(menu.ui_manager()->get_accel_group());
window_box_.pack_start(menu.view());
add_accel_group(keybindings_.ui_manager()->get_accel_group());
window_box_.pack_start(menu_.view());
show_all_children();
}
std::shared_ptr<Source::Controller> Window::source() {

Loading…
Cancel
Save