--- /dev/null
+############################################################################
+# Workfile: Makefile
+# Author: Daniel Giritzer, S1810567004 (daniel@giritzer.eu)
+# Date: 03.12.2018
+# Description: Universal Makefile for Unix based Operating Systems
+############################################################################
+WORKDIR = $(shell pwd)
+
+all: fltk tinyxml _template linux_package windows_package
+
+fltk:
+ cd $(WORKDIR)/packages/fltk; \
+ make
+
+tinyxml:
+ cd $(WORKDIR)/packages/tinyxml; \
+ make
+
+_template:
+ cd $(WORKDIR)/src; \
+ make
+
+clean_fltk:
+ cd $(WORKDIR)/packages/fltk; \
+ make clean
+
+clean_tinyxml:
+ cd $(WORKDIR)/packages/tinyxml; \
+ make clean
+
+clean__template:
+ cd $(WORKDIR)/src; \
+ make clean
+
+clean_lib:
+ rm -rf $(WORKDIR)/lib/
+ rm -rf $(WORKDIR)/include/tinyxml2.h
+ rm -rf $(WORKDIR)/include/FL
+ rm -rf $(WORKDIR)/install_package/
+
+linux_package:
+ mkdir -p $(WORKDIR)/install_package/linux/lib
+ mkdir -p $(WORKDIR)/install_package/linux/bin
+ $(WORKDIR)/scripts/copydeps.sh $(WORKDIR)/src/bin/Release_Linux/_template $(WORKDIR)/install_package/linux/lib
+ cp $(WORKDIR)/src/bin/Release_Linux/_template $(WORKDIR)/install_package/linux/bin
+ cp $(WORKDIR)/src/start__template $(WORKDIR)/install_package/linux/
+ cp $(WORKDIR)/src/start__template.desktop $(WORKDIR)/install_package/linux/
+ cp $(WORKDIR)/src/Icon.png $(WORKDIR)/install_package/linux/
+ tar -zcvf $(WORKDIR)/install_package/install_linux -C $(WORKDIR)/install_package/linux/ .
+ $(WORKDIR)/scripts/gen_package_linux.sh $(WORKDIR)/install_package/install_linux
+ rm $(WORKDIR)/install_package/install_linux
+
+windows_package:
+ mkdir -p $(WORKDIR)/install_package/windows/
+ cp $(WORKDIR)/src/bin/Release_Windows/_template.exe $(WORKDIR)/install_package/windows/
+ cd $(WORKDIR)/scripts/; \
+ ./gen_package_windows.sh $(WORKDIR)/install_package/windows/*; \
+ mv ./*.exe $(WORKDIR)/install_package/install_windows.exe
+
+
+clean: clean_lib clean__template clean_fltk clean_tinyxml
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_workspace_file>
- <Workspace title="Workspace">
- <Project filename="src/_template.cbp" />
- <Project filename="packages/fltk/fltk.cbp" />
- <Project filename="packages/tinyxml/tinyxml.cbp" />
- </Workspace>
-</CodeBlocks_workspace_file>
--- /dev/null
+#ifndef JSON_H
+#define JSON_H
+
+#include <cstdint>
+#include <cmath>
+#include <cctype>
+#include <string>
+#include <deque>
+#include <map>
+#include <type_traits>
+#include <initializer_list>
+#include <ostream>
+#include <iostream>
+
+namespace json {
+
+using std::map;
+using std::deque;
+using std::string;
+using std::enable_if;
+using std::initializer_list;
+using std::is_same;
+using std::is_convertible;
+using std::is_integral;
+using std::is_floating_point;
+
+namespace {
+ string json_escape( const string &str ) {
+ string output;
+ for( unsigned i = 0; i < str.length(); ++i )
+ switch( str[i] ) {
+ case '\"': output += "\\\""; break;
+ case '\\': output += "\\\\"; break;
+ case '\b': output += "\\b"; break;
+ case '\f': output += "\\f"; break;
+ case '\n': output += "\\n"; break;
+ case '\r': output += "\\r"; break;
+ case '\t': output += "\\t"; break;
+ default : output += str[i]; break;
+ }
+ return std::move( output );
+ }
+}
+
+class JSON
+{
+ union BackingData {
+ BackingData( double d ) : Float( d ){}
+ BackingData( long l ) : Int( l ){}
+ BackingData( bool b ) : m_Bool( b ){}
+ BackingData( string s ) : String( new string( s ) ){}
+ BackingData() : Int( 0 ){}
+
+ deque<JSON> *List;
+ map<string,JSON> *Map;
+ string *String;
+ double Float;
+ long Int;
+ bool m_Bool;
+ } Internal;
+
+ public:
+ enum class Class {
+ Null,
+ Object,
+ Array,
+ String,
+ Floating,
+ Integral,
+ Boolean
+ };
+
+ template <typename Container>
+ class JSONWrapper {
+ Container *object;
+
+ public:
+ JSONWrapper( Container *val ) : object( val ) {}
+ JSONWrapper( std::nullptr_t ) : object( nullptr ) {}
+
+ typename Container::iterator begin() { return object ? object->begin() : typename Container::iterator(); }
+ typename Container::iterator end() { return object ? object->end() : typename Container::iterator(); }
+ typename Container::const_iterator begin() const { return object ? object->begin() : typename Container::iterator(); }
+ typename Container::const_iterator end() const { return object ? object->end() : typename Container::iterator(); }
+ };
+
+ template <typename Container>
+ class JSONConstWrapper {
+ const Container *object;
+
+ public:
+ JSONConstWrapper( const Container *val ) : object( val ) {}
+ JSONConstWrapper( std::nullptr_t ) : object( nullptr ) {}
+
+ typename Container::const_iterator begin() const { return object ? object->begin() : typename Container::const_iterator(); }
+ typename Container::const_iterator end() const { return object ? object->end() : typename Container::const_iterator(); }
+ };
+
+ JSON() : Internal(), Type( Class::Null ){}
+
+ JSON( initializer_list<JSON> list )
+ : JSON()
+ {
+ SetType( Class::Object );
+ for( auto i = list.begin(), e = list.end(); i != e; ++i, ++i )
+ operator[]( i->ToString() ) = *std::next( i );
+ }
+
+ JSON( JSON&& other )
+ : Internal( other.Internal )
+ , Type( other.Type )
+ { other.Type = Class::Null; other.Internal.Map = nullptr; }
+
+ JSON& operator=( JSON&& other ) {
+ ClearInternal();
+ Internal = other.Internal;
+ Type = other.Type;
+ other.Internal.Map = nullptr;
+ other.Type = Class::Null;
+ return *this;
+ }
+
+ JSON( const JSON &other ) {
+ switch( other.Type ) {
+ case Class::Object:
+ Internal.Map =
+ new map<string,JSON>( other.Internal.Map->begin(),
+ other.Internal.Map->end() );
+ break;
+ case Class::Array:
+ Internal.List =
+ new deque<JSON>( other.Internal.List->begin(),
+ other.Internal.List->end() );
+ break;
+ case Class::String:
+ Internal.String =
+ new string( *other.Internal.String );
+ break;
+ default:
+ Internal = other.Internal;
+ }
+ Type = other.Type;
+ }
+
+ JSON& operator=( const JSON &other ) {
+ ClearInternal();
+ switch( other.Type ) {
+ case Class::Object:
+ Internal.Map =
+ new map<string,JSON>( other.Internal.Map->begin(),
+ other.Internal.Map->end() );
+ break;
+ case Class::Array:
+ Internal.List =
+ new deque<JSON>( other.Internal.List->begin(),
+ other.Internal.List->end() );
+ break;
+ case Class::String:
+ Internal.String =
+ new string( *other.Internal.String );
+ break;
+ default:
+ Internal = other.Internal;
+ }
+ Type = other.Type;
+ return *this;
+ }
+
+ ~JSON() {
+ switch( Type ) {
+ case Class::Array:
+ delete Internal.List;
+ break;
+ case Class::Object:
+ delete Internal.Map;
+ break;
+ case Class::String:
+ delete Internal.String;
+ break;
+ default:;
+ }
+ }
+
+ template <typename T>
+ JSON( T b, typename enable_if<is_same<T,bool>::value>::type* = 0 ) : Internal( b ), Type( Class::Boolean ){}
+
+ template <typename T>
+ JSON( T i, typename enable_if<is_integral<T>::value && !is_same<T,bool>::value>::type* = 0 ) : Internal( (long)i ), Type( Class::Integral ){}
+
+ template <typename T>
+ JSON( T f, typename enable_if<is_floating_point<T>::value>::type* = 0 ) : Internal( (double)f ), Type( Class::Floating ){}
+
+ template <typename T>
+ JSON( T s, typename enable_if<is_convertible<T,string>::value>::type* = 0 ) : Internal( string( s ) ), Type( Class::String ){}
+
+ JSON( std::nullptr_t ) : Internal(), Type( Class::Null ){}
+
+ static JSON Make( Class type ) {
+ JSON ret; ret.SetType( type );
+ return ret;
+ }
+
+ static JSON Load( const string & );
+ static JSON Load( const string &, bool & );
+
+ template <typename T>
+ void append( T arg ) {
+ SetType( Class::Array ); Internal.List->emplace_back( arg );
+ }
+
+ template <typename T, typename... U>
+ void append( T arg, U... args ) {
+ append( arg ); append( args... );
+ }
+
+ template <typename T>
+ typename enable_if<is_same<T,bool>::value, JSON&>::type operator=( T b ) {
+ SetType( Class::Boolean ); Internal.m_Bool = b; return *this;
+ }
+
+ template <typename T>
+ typename enable_if<is_integral<T>::value && !is_same<T,bool>::value, JSON&>::type operator=( T i ) {
+ SetType( Class::Integral ); Internal.Int = i; return *this;
+ }
+
+ template <typename T>
+ typename enable_if<is_floating_point<T>::value, JSON&>::type operator=( T f ) {
+ SetType( Class::Floating ); Internal.Float = f; return *this;
+ }
+
+ template <typename T>
+ typename enable_if<is_convertible<T,string>::value, JSON&>::type operator=( T s ) {
+ SetType( Class::String ); *Internal.String = string( s ); return *this;
+ }
+
+ JSON& operator[]( const string &key ) {
+ SetType( Class::Object ); return Internal.Map->operator[]( key );
+ }
+
+ JSON& operator[]( unsigned index ) {
+ SetType( Class::Array );
+ if( index >= Internal.List->size() ) Internal.List->resize( index + 1 );
+ return Internal.List->operator[]( index );
+ }
+
+ JSON &at( const string &key ) {
+ return operator[]( key );
+ }
+
+ const JSON &at( const string &key ) const {
+ return Internal.Map->at( key );
+ }
+
+ JSON &at( unsigned index ) {
+ return operator[]( index );
+ }
+
+ const JSON &at( unsigned index ) const {
+ return Internal.List->at( index );
+ }
+
+ int length() const {
+ if( Type == Class::Array )
+ return Internal.List->size();
+ else
+ return -1;
+ }
+
+ bool hasKey( const string &key ) const {
+ if( Type == Class::Object )
+ return Internal.Map->find( key ) != Internal.Map->end();
+ return false;
+ }
+
+ int size() const {
+ if( Type == Class::Object )
+ return Internal.Map->size();
+ else if( Type == Class::Array )
+ return Internal.List->size();
+ else
+ return -1;
+ }
+
+ Class JSONType() const { return Type; }
+
+ /// Functions for getting primitives from the JSON object.
+ bool IsNull() const { return Type == Class::Null; }
+
+ string ToString() const { bool b; return std::move( ToString( b ) ); }
+ string ToString( bool &ok ) const {
+ ok = (Type == Class::String);
+ return ok ? std::move( json_escape( *Internal.String ) ): string("");
+ }
+
+ double ToFloat() const { bool b; return ToFloat( b ); }
+ double ToFloat( bool &ok ) const {
+ ok = (Type == Class::Floating);
+ return ok ? Internal.Float : 0.0;
+ }
+
+ long ToInt() const { bool b; return ToInt( b ); }
+ long ToInt( bool &ok ) const {
+ ok = (Type == Class::Integral);
+ return ok ? Internal.Int : 0;
+ }
+
+ bool ToBool() const { bool b; return ToBool( b ); }
+ bool ToBool( bool &ok ) const {
+ ok = (Type == Class::Boolean);
+ return ok ? Internal.m_Bool : false;
+ }
+
+ JSONWrapper<map<string,JSON>> ObjectRange() {
+ if( Type == Class::Object )
+ return JSONWrapper<map<string,JSON>>( Internal.Map );
+ return JSONWrapper<map<string,JSON>>( nullptr );
+ }
+
+ JSONWrapper<deque<JSON>> ArrayRange() {
+ if( Type == Class::Array )
+ return JSONWrapper<deque<JSON>>( Internal.List );
+ return JSONWrapper<deque<JSON>>( nullptr );
+ }
+
+ JSONConstWrapper<map<string,JSON>> ObjectRange() const {
+ if( Type == Class::Object )
+ return JSONConstWrapper<map<string,JSON>>( Internal.Map );
+ return JSONConstWrapper<map<string,JSON>>( nullptr );
+ }
+
+
+ JSONConstWrapper<deque<JSON>> ArrayRange() const {
+ if( Type == Class::Array )
+ return JSONConstWrapper<deque<JSON>>( Internal.List );
+ return JSONConstWrapper<deque<JSON>>( nullptr );
+ }
+
+ string dump( int depth = 1, string tab = " ") const {
+ string pad = "";
+ for( int i = 0; i < depth; ++i, pad += tab );
+
+ switch( Type ) {
+ case Class::Null:
+ return "null";
+ case Class::Object: {
+ string s = "{\n";
+ bool skip = true;
+ for( auto &p : *Internal.Map ) {
+ if( !skip ) s += ",\n";
+ s += ( pad + "\"" + p.first + "\" : " + p.second.dump( depth + 1, tab ) );
+ skip = false;
+ }
+ s += ( "\n" + pad.erase( 0, 2 ) + "}" ) ;
+ return s;
+ }
+ case Class::Array: {
+ string s = "[";
+ bool skip = true;
+ for( auto &p : *Internal.List ) {
+ if( !skip ) s += ", ";
+ s += p.dump( depth + 1, tab );
+ skip = false;
+ }
+ s += "]";
+ return s;
+ }
+ case Class::String:
+ return "\"" + json_escape( *Internal.String ) + "\"";
+ case Class::Floating:
+ return std::to_string( Internal.Float );
+ case Class::Integral:
+ return std::to_string( Internal.Int );
+ case Class::Boolean:
+ return Internal.m_Bool ? "true" : "false";
+ default:
+ return "";
+ }
+ return "";
+ }
+
+ friend std::ostream& operator<<( std::ostream&, const JSON & );
+
+ private:
+ void SetType( Class type ) {
+ if( type == Type )
+ return;
+
+ ClearInternal();
+
+ switch( type ) {
+ case Class::Null: Internal.Map = nullptr; break;
+ case Class::Object: Internal.Map = new map<string,JSON>(); break;
+ case Class::Array: Internal.List = new deque<JSON>(); break;
+ case Class::String: Internal.String = new string(); break;
+ case Class::Floating: Internal.Float = 0.0; break;
+ case Class::Integral: Internal.Int = 0; break;
+ case Class::Boolean: Internal.m_Bool = false; break;
+ }
+
+ Type = type;
+ }
+
+ private:
+ /* beware: only call if YOU know that Internal is allocated. No checks performed here.
+ This function should be called in a constructed JSON just before you are going to
+ overwrite Internal...
+ */
+ void ClearInternal() {
+ switch( Type ) {
+ case Class::Object: delete Internal.Map; break;
+ case Class::Array: delete Internal.List; break;
+ case Class::String: delete Internal.String; break;
+ default:;
+ }
+ }
+
+ private:
+
+ Class Type = Class::Null;
+};
+
+inline JSON Array() {
+ return std::move( JSON::Make( JSON::Class::Array ) );
+}
+
+template <typename... T>
+JSON Array( T... args ) {
+ JSON arr = JSON::Make( JSON::Class::Array );
+ arr.append( args... );
+ return std::move( arr );
+}
+
+inline JSON Object() {
+ return std::move( JSON::Make( JSON::Class::Object ) );
+}
+
+inline std::ostream& operator<<( std::ostream &os, const JSON &json ) {
+ os << json.dump();
+ return os;
+}
+
+namespace {
+ JSON parse_next( const string &, size_t &, bool & );
+
+ void consume_ws( const string &str, size_t &offset ) {
+ while( isspace( str[offset] ) ) ++offset;
+ }
+
+ JSON parse_object( const string &str, size_t &offset, bool& rc ) {
+ JSON Object = JSON::Make( JSON::Class::Object );
+
+ ++offset;
+ consume_ws( str, offset );
+ if( str[offset] == '}' ) {
+ ++offset; return std::move( Object );
+ }
+
+ while( true ) {
+ JSON Key = parse_next( str, offset, rc );
+ consume_ws( str, offset );
+ if( str[offset] != ':' ) {
+ //std::cerr << "Error: Object: Expected colon, found '" << str[offset] << "'\n";
+ rc = false;
+ break;
+ }
+ consume_ws( str, ++offset );
+ JSON Value = parse_next( str, offset, rc );
+ Object[Key.ToString()] = Value;
+
+ consume_ws( str, offset );
+ if( str[offset] == ',' ) {
+ ++offset; continue;
+ }
+ else if( str[offset] == '}' ) {
+ ++offset; break;
+ }
+ else {
+ //std::cerr << "ERROR: Object: Expected comma, found '" << str[offset] << "'\n";
+ rc = false;
+ break;
+ }
+ }
+
+ return std::move( Object );
+ }
+
+ JSON parse_array( const string &str, size_t &offset, bool& rc ) {
+ JSON Array = JSON::Make( JSON::Class::Array );
+ unsigned index = 0;
+
+ ++offset;
+ consume_ws( str, offset );
+ if( str[offset] == ']' ) {
+ ++offset; return std::move( Array );
+ }
+
+ while( true ) {
+ Array[index++] = parse_next( str, offset, rc );
+ consume_ws( str, offset );
+
+ if( str[offset] == ',' ) {
+ ++offset; continue;
+ }
+ else if( str[offset] == ']' ) {
+ ++offset; break;
+ }
+ else {
+ //std::cerr << "ERROR: Array: Expected ',' or ']', found '" << str[offset] << "'\n";
+ rc = false;
+ return std::move( JSON::Make( JSON::Class::Array ) );
+ }
+ }
+
+ return std::move( Array );
+ }
+
+ JSON parse_string( const string &str, size_t &offset, bool& rc ) {
+ JSON String;
+ string val;
+ for( char c = str[++offset]; c != '\"' ; c = str[++offset] ) {
+ if( c == '\\' ) {
+ switch( str[ ++offset ] ) {
+ case '\"': val += '\"'; break;
+ case '\\': val += '\\'; break;
+ case '/' : val += '/' ; break;
+ case 'b' : val += '\b'; break;
+ case 'f' : val += '\f'; break;
+ case 'n' : val += '\n'; break;
+ case 'r' : val += '\r'; break;
+ case 't' : val += '\t'; break;
+ case 'u' : {
+ val += "\\u" ;
+ for( unsigned i = 1; i <= 4; ++i ) {
+ c = str[offset+i];
+ if( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') )
+ val += c;
+ else {
+ //std::cerr << "ERROR: String: Expected hex character in unicode escape, found '" << c << "'\n";
+ rc = false;
+ return std::move( JSON::Make( JSON::Class::String ) );
+ }
+ }
+ offset += 4;
+ } break;
+ default : val += '\\'; break;
+ }
+ }
+ else
+ val += c;
+ }
+ ++offset;
+ String = val;
+ return std::move( String );
+ }
+
+ JSON parse_number( const string &str, size_t &offset, bool& rc ) {
+ JSON Number;
+ string val, exp_str;
+ char c;
+ bool isDouble = false;
+ long exp = 0;
+ while( true ) {
+ c = str[offset++];
+ if( (c == '-') || (c >= '0' && c <= '9') )
+ val += c;
+ else if( c == '.' ) {
+ val += c;
+ isDouble = true;
+ }
+ else
+ break;
+ }
+ if( c == 'E' || c == 'e' ) {
+ c = str[ offset++ ];
+ if( c == '-' ){ ++offset; exp_str += '-';}
+ while( true ) {
+ c = str[ offset++ ];
+ if( c >= '0' && c <= '9' )
+ exp_str += c;
+ else if( !isspace( c ) && c != ',' && c != ']' && c != '}' ) {
+ //std::cerr << "ERROR: Number: Expected a number for exponent, found '" << c << "'\n";
+ rc = false;
+ return std::move( JSON::Make( JSON::Class::Null ) );
+ }
+ else
+ break;
+ }
+ exp = std::stol( exp_str );
+ }
+ else if( !isspace( c ) && c != ',' && c != ']' && c != '}' ) {
+ //std::cerr << "ERROR: Number: unexpected character '" << c << "'\n";
+ rc = false;
+ return std::move( JSON::Make( JSON::Class::Null ) );
+ }
+ --offset;
+
+ if( isDouble )
+ Number = std::stod( val ) * std::pow( 10, exp );
+ else {
+ if( !exp_str.empty() )
+ Number = std::stol( val ) * std::pow( 10, exp );
+ else
+ Number = std::stol( val );
+ }
+ return std::move( Number );
+ }
+
+ JSON parse_bool( const string &str, size_t &offset, bool& rc ) {
+ JSON m_Bool;
+ if( str.substr( offset, 4 ) == "true" )
+ m_Bool = true;
+ else if( str.substr( offset, 5 ) == "false" )
+ m_Bool = false;
+ else {
+ //std::cerr << "ERROR: Bool: Expected 'true' or 'false', found '" << str.substr( offset, 5 ) << "'\n";
+ rc = false;
+ return std::move( JSON::Make( JSON::Class::Null ) );
+ }
+ offset += (m_Bool.ToBool() ? 4 : 5);
+ return std::move( m_Bool );
+ }
+
+ JSON parse_null( const string &str, size_t &offset, bool& rc ) {
+ JSON Null;
+ if( str.substr( offset, 4 ) != "null" ) {
+ //std::cerr << "ERROR: Null: Expected 'null', found '" << str.substr( offset, 4 ) << "'\n";
+ rc = false;
+ return std::move( JSON::Make( JSON::Class::Null ) );
+ }
+ offset += 4;
+ return std::move( Null );
+ }
+
+ JSON parse_next( const string &str, size_t &offset, bool& rc ) {
+ char value;
+ consume_ws( str, offset );
+ value = str[offset];
+ switch( value ) {
+ case '[' : return std::move( parse_array( str, offset, rc ) );
+ case '{' : return std::move( parse_object( str, offset, rc ) );
+ case '\"': return std::move( parse_string( str, offset, rc ) );
+ case 't' :
+ case 'f' : return std::move( parse_bool( str, offset, rc ) );
+ case 'n' : return std::move( parse_null( str, offset, rc ) );
+ default : if( ( value <= '9' && value >= '0' ) || value == '-' )
+ return std::move( parse_number( str, offset, rc ) );
+ }
+ //std::cerr << "ERROR: Parse: Unknown starting character '" << value << "'\n";
+ rc = false;
+ return JSON();
+ }
+}
+
+inline JSON JSON::Load( const string &str, bool& rc ) {
+ size_t offset = 0;
+ rc = true;
+ return std::move( parse_next( str, offset, rc ) );
+}
+
+inline JSON JSON::Load( const string &str ) {
+ size_t offset = 0;
+ bool rc = true;
+ return std::move( parse_next( str, offset, rc ) );
+}
+
+} // End Namespace json
+#endif // JSON_H
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
- <FileVersion major="1" minor="6" />
- <Project>
- <Option title="fltk" />
- <Option pch_mode="2" />
- <Option compiler="gcc" />
- <Build>
- <Target title="fltk_linux64">
- <Option output="bin/Debug/fltk" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Debug/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-g" />
- </Compiler>
- <ExtraCommands>
- <Add before="mkdir -p ../../include" />
- <Add before="mkdir -p ../../lib/linux64" />
- <Add before="cp -rf ./FL ../../include" />
- <Add before='./configure LDFLAGS="" --enable-localjpeg --enable-localzlib --enable-localpng --enable-x11=no --disable-xcursor --disable-xinerama --disable-xft --disable-xdbe --disable-xrender --disable-xfixes --disable-threads' />
- <Add before="make clean" />
- <Add before="make -j5" />
- <Add before="cp -rf ./lib/* ../../lib/linux64/" />
- </ExtraCommands>
- </Target>
- <Target title="fltk_linux32">
- <Option output="bin/Debug/fltk" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Debug/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-g" />
- </Compiler>
- <ExtraCommands>
- <Add before="mkdir -p ../../include" />
- <Add before="mkdir -p ../../lib/linux32" />
- <Add before="cp -rf ./FL ../../include" />
- <Add before='./configure "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --enable-localjpeg --enable-localzlib --enable-localpng --enable-x11=no --disable-xcursor --disable-xinerama --disable-xft --disable-xdbe --disable-xrender --disable-xfixes --disable-threads' />
- <Add before="make clean" />
- <Add before="make -j5" />
- <Add before="cp -rf ./lib/* ../../lib/linux32/" />
- </ExtraCommands>
- </Target>
- <Target title="fltk_windows">
- <Option output="bin/Debug/fltk" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Debug/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-g" />
- </Compiler>
- <ExtraCommands>
- <Add before="mkdir -p ../../include" />
- <Add before="mkdir -p ../../lib/mingw32" />
- <Add before="cp -rf ./FL ../../include" />
- <Add before='./configure LDFLAGS="-static-libgcc -static-libstdc++" --enable-cygwin --enable-threads --enable-localjpeg --enable-localzlib --enable-localpng --enable-x11 --disable-xcursor --disable-xinerama --disable-xft --disable-xdbe --disable-xrender --disable-xfixes --disable-threads --host=i686-w64-mingw32' />
- <Add before="make clean" />
- <Add before="make -j5" />
- <Add before="cp -rf ./lib/* ../../lib/mingw32/" />
- </ExtraCommands>
- </Target>
- <Target title="fltk_unpack">
- <Option output="bin/Debug/fltk" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Debug/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-g" />
- </Compiler>
- <ExtraCommands>
- <Add before="tar xvzf fltk-1.3.4-1-source.tar.gz" />
- <Add before="cp -rf ./fltk-1.3.4-1/* ./" />
- <Add before="rm -rf ./fltk-1.3.4-1/" />
- </ExtraCommands>
- </Target>
- </Build>
- <Compiler>
- <Add option="-Wall" />
- </Compiler>
- <Extensions>
- <envvars />
- <code_completion />
- <debugger />
- <lib_finder disable_auto="1" />
- </Extensions>
- </Project>
-</CodeBlocks_project_file>
# But not these files...
!.gitignore
!tinyxml-2.src.zip
-!tinyxml.cbp
\ No newline at end of file
+!Makefile
--- /dev/null
+############################################################################
+# Workfile: Makefile
+# Author: Daniel Giritzer, S1810567004 (daniel@giritzer.eu)
+# Date: 03.12.2018
+# Description: Universal Makefile for Unix based Operating Systems
+############################################################################
+WORKDIR = $(shell pwd)
+
+all: unpack windows linux
+
+.PHONY: unpack
+unpack:
+ unzip -o tinyxml-2.src.zip
+
+.PHONY: windows
+windows:
+ cd $(WORKDIR)/tinyxml2-master; \
+ i686-w64-mingw32-g++ -c -o tinyxml2.o tinyxml2.cpp; \
+ i686-w64-mingw32-ar rvs libtinyxml2.a tinyxml2.o
+ mkdir -p $(WORKDIR)/../../include
+ mkdir -p $(WORKDIR)/../../lib/mingw32
+ cp -rf $(WORKDIR)/tinyxml2-master/libtinyxml2.a $(WORKDIR)/../../lib/mingw32
+ cp -rf $(WORKDIR)/tinyxml2-master/tinyxml2.h $(WORKDIR)/../../include
+
+.PHONY: linux
+linux:
+ cd $(WORKDIR)/tinyxml2-master; \
+ g++ -m32 -c -o tinyxml2.o tinyxml2.cpp; \
+ ar rvs libtinyxml2.a tinyxml2.o
+ mkdir -p $(WORKDIR)/../../include
+ mkdir -p $(WORKDIR)/../../lib/linux32
+ cp -rf $(WORKDIR)/tinyxml2-master/libtinyxml2.a $(WORKDIR)/../../lib/linux32
+ cp -rf $(WORKDIR)/tinyxml2-master/tinyxml2.h $(WORKDIR)/../../include
+
+.PHONY: clean
+clean:
+ rm -rf $(WORKDIR)/tinyxml2-master
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
- <FileVersion major="1" minor="6" />
- <Project>
- <Option title="tinyxml" />
- <Option pch_mode="2" />
- <Option compiler="gcc" />
- <Build>
- <Target title="tinyxml_linux64">
- <Option output="bin/Release/tinyxml" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Release/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- </Compiler>
- <Linker>
- <Add option="-s" />
- </Linker>
- <ExtraCommands>
- <Add before="mkdir -p ../../include" />
- <Add before="mkdir -p ../../lib/linux64" />
- <Add before="cp ./tinyxml2.h ../../include" />
- <Add before="g++ -c -o tinyxml2.o tinyxml2.cpp" />
- <Add before="ar rvs libtinyxml2.a tinyxml2.o" />
- <Add before="cp ./libtinyxml2.a ../../lib/linux64" />
- </ExtraCommands>
- </Target>
- <Target title="tinyxml_linux32">
- <Option output="bin/Release/tinyxml" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Release/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- </Compiler>
- <Linker>
- <Add option="-s" />
- </Linker>
- <ExtraCommands>
- <Add before="mkdir -p ../../include" />
- <Add before="mkdir -p ../../lib/linux32" />
- <Add before="cp ./tinyxml2.h ../../include" />
- <Add before="g++ -m32 -c -o tinyxml2.o tinyxml2.cpp" />
- <Add before="ar rvs libtinyxml2.a tinyxml2.o" />
- <Add before="cp ./libtinyxml2.a ../../lib/linux32" />
- </ExtraCommands>
- </Target>
- <Target title="tinyxml_windows">
- <Option output="bin/Release/tinyxml" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Release/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- </Compiler>
- <Linker>
- <Add option="-s" />
- </Linker>
- <ExtraCommands>
- <Add before="mkdir -p ../../include" />
- <Add before="mkdir -p ../../lib/mingw32" />
- <Add before="cp ./tinyxml2.h ../../include" />
- <Add before="i686-w64-mingw32-g++ -c -o tinyxml2.o tinyxml2.cpp" />
- <Add before="i686-w64-mingw32-ar rvs libtinyxml2.a tinyxml2.o" />
- <Add before="cp ./libtinyxml2.a ../../lib/mingw32" />
- </ExtraCommands>
- </Target>
- <Target title="tinyxml_unpack">
- <Option output="bin/Release/tinyxml" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Release/" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- </Compiler>
- <Linker>
- <Add option="-s" />
- </Linker>
- <ExtraCommands>
- <Add before="rm -rf ./tinyxml2-master/" />
- <Add before="unzip tinyxml-2.src.zip" />
- <Add before="cp -rf ./tinyxml2-master/* ./" />
- <Add before="rm -rf ./tinyxml2-master/" />
- </ExtraCommands>
- </Target>
- </Build>
- <Compiler>
- <Add option="-Wall" />
- </Compiler>
- <Extensions>
- <envvars />
- <code_completion />
- <debugger />
- <lib_finder disable_auto="1" />
- </Extensions>
- </Project>
-</CodeBlocks_project_file>
#include <fstream>
#include <dirent.h>
#include <sys/types.h>
+#include <FL/fl_utf8.h>
#include <unistd.h>
#include <sys/stat.h>
#include <cstring>
void FSHelper::makeDir(const std::string &dir)
{
if(!dirExists(dir))
-#if defined(_WIN32)
- if(mkdir(dir.c_str()) < 0)
-#else
- if(mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0)
-#endif
+ if(fl_mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0)
throw std::string("Failed to create directory: " + dir);
}
for(auto inFile : files)
{
File outFile = inFile;
- unsigned int idx = 0;
-
// ersetze Qellordner mit zielordner
outFile.first.replace(outFile.first.find(from), from.length(), to);
try
';', ':', '+', '=', '*', '/', '<', '>', '?', ',', '[', ']', '{', '}'
};
- int pos = fName.find_first_of(invalidChars, 0, sizeof(invalidChars));
+ unsigned int pos = fName.find_first_of(invalidChars, 0, sizeof(invalidChars));
if (pos != std::string::npos)
return false;
// überprüfe existenz
struct stat info;
- if( stat( dir.c_str(), &info ) != 0 )
+ if( fl_stat( dir.c_str(), &info ) != 0 )
return false;
if( info.st_mode & S_IFDIR )
return true;
return true;
}
+std::vector<std::string> FSHelper::listDirsNonRecursive(const std::string &path,const bool showHiddenDirs)
+{
+ std::vector<std::string> folders;
+ std::string dir = addDirLastSlash(path);
+ DIR *dpdf;
+ struct dirent *epdf;
+ dpdf = opendir(dir.c_str());
+ if(dpdf != nullptr)
+ {
+ while((epdf = readdir(dpdf)) != nullptr)
+ {
+ struct stat s;
+
+ stat((dir + std::string(epdf->d_name)).c_str(), &s);
+ if(showHiddenDirs ? (S_ISDIR(s.st_mode) && std::string(epdf->d_name) != ".." && std::string(epdf->d_name) != "." ) :
+ (S_ISDIR(s.st_mode) && strstr(epdf->d_name,"..") == NULL && strstr(epdf->d_name,".") == NULL ))
+ {
+ if(!(std::find(folders.begin(), folders.end(), dir+epdf->d_name) != folders.end()))
+ folders.push_back(addDirLastSlash(dir+epdf->d_name));
+ }
+ }
+ }
+ closedir(dpdf);
+ return folders;
+}
+
std::string FSHelper::getCurrentWorkingDir()
{
char temp[PATH_MAX];
- if(getcwd(temp, PATH_MAX))
+ if(fl_getcwd(temp, PATH_MAX))
#if defined(_WIN32)
return convertPathToWindows(temp);
#else
// String vector zu char array
std::vector<char*> charParams;
-
-
- if(!log.empty())
- FILE* logFile = freopen(log.c_str(),"a",stdout);
-
// Param Array muss wie folgt aufgebaut sein:
// 0 -> command
// 1 -> param 1
charParams.emplace_back(nullptr); //Letztes element muss ein nullpointer sein
int status;
- pid_t parent_pid;
pid_t child_pid;
- parent_pid = getpid();
-
child_pid = fork();
switch(child_pid)
{
bool validFileName(const std::string &fName);
/////////////////////////////////////////////////
-/// \brief Ersetzt alle / mit \\
+/// \brief Ersetzt alle / mit doppel backslash
/// \param dir Zu verarbeitender pfad
/// \return pfad mit ersetzten Zeichen
/////////////////////////////////////////////////
std::string convertPathToWindows(const std::string &dir);
/////////////////////////////////////////////////
-/// \brief Ersetzt alle \\ mit /
+/// \brief Ersetzt alle doppel backslash mit /
/// \param dir Zu verarbeitender pfad
/// \return pfad mit ersetzten Zeichen
/////////////////////////////////////////////////
/// false nein)
/// \return true bei erfolg, false bei fehler
/////////////////////////////////////////////////
- bool listFilesRecursive(const std::string &path, std::vector<FSHelper::File> &files,const bool showHiddenDirs);
+ bool listFilesRecursive(const std::string &path, std::vector<FSHelper::File> &files,const bool showHiddenDirs = false);
/////////////////////////////////////////////////
/// \brief Diese funktion gibt rekursiv alle Unterordner eines
/// Ordners zurück.
-/// \param [IN] src Ordner dessen Dateien zurückgegeben
+/// \param [IN] src Ordner dessen Unterordner zurückgegeben
/// werden sollen.
/// \param [OUT] string Vektor mit allen gefundenen Ordnern
/// \param [IN] Optional, Gibt an ob auch versteckte Unterordner
/// false nein)
/// \return true bei erfolg, false bei fehler
/////////////////////////////////////////////////
- bool listDirsRecursive(const std::string &path, std::vector<std::string>& dirs,const bool showHiddenDirs);
+ bool listDirsRecursive(const std::string &path, std::vector<std::string>& dirs,const bool showHiddenDirs = false);
+
+/////////////////////////////////////////////////
+/// \brief Diese funktion gibt alle Unterordner eines
+/// Ordners zurück (nicht rekursiv).
+/// \param src Ordner dessen Unterordner zurückgegeben
+/// werden sollen.
+/// \param Optional, Gibt an ob auch versteckte Unterordner
+/// durchsucht werden sollen. (true ja,
+/// false nein)
+/// \return string Vektor mit allen gefundenen Ordnern
+/////////////////////////////////////////////////
+ std::vector<std::string> listDirsNonRecursive(const std::string &path,const bool showHiddenDirs = false);
/////////////////////////////////////////////////
/// \brief Diese funktion führt einen Befehl/ein Programm
--- /dev/null
+############################################################################
+# Workfile: Makefile
+# Author: Daniel Giritzer, S1810567004 (daniel@giritzer.eu)
+# Date: 03.12.2018
+# Description: Universal Makefile for Unix based Operating Systems
+############################################################################
+
+###################################
+#GENERAL | EDIT 1/7
+###################################
+WORKDIR = $(shell pwd)
+SOURCES := $(shell ls *.cxx)
+PROJNAME = _template
+LIBDIR =
+INC = -I$(WORKDIR)/../include -I$(WORKDIR)/../../include
+LDFLAGS = -m32 -std=c++11 -static-libstdc++ -static-libgcc
+CFLAGS = -m32 -Wall -fexceptions -std=c++11 -static-libstdc++ -static-libgcc
+LIB = -lfltk_images -lfltk_png -lfltk_z -lfltk_jpeg -lfltk
+
+###################################
+#GCC | EDIT 2/7
+###################################
+CC_GCC = gcc
+CXX_GCC = g++
+AR_GCC = ar
+LD_GCC = g++
+WINDRES_GCC =
+
+INC_GCC = $(INC)
+LIBDIR_GCC = -L$(WORKDIR)/../lib/linux32 -L$(WORKDIR)/../../lib/linux32
+CFLAGS_GCC = $(CFLAGS)
+RESINC_GCC =
+LDFLAGS_GCC = $(LDFLAGS)
+LIB_GCC = $(LIB) -lm -lpthread -lX11 -lxcb -lXau -lXdmcp -lbsd -lrt -ldl
+
+###################################
+#MinGW | EDIT 3/7
+###################################
+CC_WIN = i686-w64-mingw32-gcc
+CXX_WIN = i686-w64-mingw32-g++
+AR_WIN = i686-w64-mingw32-ar
+LD_WIN = i686-w64-mingw32-g++
+WINDRES_WIN = i686-w64-mingw32-windres
+
+INC_WIN = $(INC)
+LIBDIR_WIN = -L$(WORKDIR)/../lib/mingw32 -L$(WORKDIR)/../../lib/mingw32
+CFLAGS_WIN = $(CFLAGS) -mwindows -DWIN32 -DUSE_OPENGL32 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
+RESINC_WIN =
+LDFLAGS_WIN = $(LDFLAGS) -static
+LIB_WIN = $(LIB) -mwindows -lole32 -luuid -lcomctl32 -lpthread
+
+###################################
+#RELEASE GCC SETTINGS | EDIT: 4/7
+###################################
+INC_RELEASE_GCC = $(INC_GCC)
+CFLAGS_RELEASE_GCC = $(CFLAGS_GCC) -O2
+RESINC_RELEASE_GCC = $(RESINC_GCC)
+RCFLAGS_RELEASE_GCC = $(RCFLAGS_GCC)
+LIBDIR_RELEASE_GCC = $(LIBDIR_GCC)
+LIB_RELEASE_GCC = $(LIB_GCC)
+LDFLAGS_RELEASE_GCC = $(LDFLAGS_GCC) -s
+OBJDIR_RELEASE_GCC = obj/Release_Linux
+DEP_RELEASE_GCC =
+OUT_RELEASE_GCC = bin/Release_Linux
+
+###################################
+#DEBUG GCC SETTINGS | EDIT: 5/7
+###################################
+INC_DEBUG_GCC = $(INC_GCC)
+CFLAGS_DEBUG_GCC = $(CFLAGS_GCC) -g
+RESINC_DEBUG_GCC = $(RESINC_GCC)
+RCFLAGS_DEBUG_GCC = $(RCFLAGS_GCC)
+LIBDIR_DEBUG_GCC = $(LIBDIR_GCC)
+LIB_DEBUG_GCC = $(LIB_GCC)
+LDFLAGS_DEBUG_GCC = $(LDFLAGS_GCC)
+OBJDIR_DEBUG_GCC = obj/Debug_Linux
+DEP_DEBUG_GCC =
+OUT_DEBUG_GCC = bin/Debug_Linux
+
+###################################
+#RELEASE MinGW SETTINGS | EDIT: 6/7
+###################################
+INC_RELEASE_WIN = $(INC_WIN)
+CFLAGS_RELEASE_WIN = $(CFLAGS_WIN) -O2
+RESINC_RELEASE_WIN = $(RESINC_WIN)
+RCFLAGS_RELEASE_WIN = $(RCFLAGS_WIN)
+LIBDIR_RELEASE_WIN = $(LIBDIR_WIN)
+LIB_RELEASE_WIN = $(LIB_WIN)
+LDFLAGS_RELEASE_WIN = $(LDFLAGS_WIN) -s
+OBJDIR_RELEASE_WIN = obj/Release_Windows
+DEP_RELEASE_WIN =
+OUT_RELEASE_WIN = bin/Release_Windows
+
+###################################
+#DEBUG MinGW SETTINGS | EDIT: 7/7
+###################################
+INC_DEBUG_WIN = $(INC_WIN)
+CFLAGS_DEBUG_WIN = $(CFLAGS_WIN) -g
+RESINC_DEBUG_WIN = $(RESINC_WIN)
+RCFLAGS_DEBUG_WIN = $(RCFLAGS_WIN)
+LIBDIR_DEBUG_WIN = $(LIBDIR_WIN)
+LIB_DEBUG_WIN = $(LIB_WIN)
+LDFLAGS_DEBUG_WIN = $(LDFLAGS_WIN)
+OBJDIR_DEBUG_WIN = obj/Debug_Windows
+DEP_DEBUG_WIN =
+OUT_DEBUG_WIN = bin/Debug_Windows
+
+############################
+#OBJECT LISTS | DO NOT EDIT!
+############################
+OBJ_DEBUG_GCC = $(addprefix $(OBJDIR_DEBUG_GCC)/,$(SOURCES:%.cxx=%.o))
+OBJ_RELEASE_GCC = $(addprefix $(OBJDIR_RELEASE_GCC)/,$(SOURCES:%.cxx=%.o))
+OBJ_DEBUG_WIN = $(addprefix $(OBJDIR_DEBUG_WIN)/,$(SOURCES:%.cxx=%.o))
+OBJ_RELEASE_WIN = $(addprefix $(OBJDIR_RELEASE_WIN)/,$(SOURCES:%.cxx=%.o))
+
+##########################
+#FUNCTIONS | DO NOT EDIT!
+##########################
+
+######## General
+all: make_fluid debug release
+clean: clean_debug_linux clean_release_linux clean_debug_windows clean_release_windows
+rebuild: clean debug release
+
+debug Debug: debug_linux debug_windows
+release Release: release_linux release_windows
+
+make_fluid:
+ $(WORKDIR)/../packages/fltk/fltk-1.3.4-1/fluid/fluid -c $(WORKDIR)/ViewFluid.fld
+
+######## DEBUG GCC
+before_debug_linux:
+ test -d $(OUT_DEBUG_GCC) || mkdir -p $(OUT_DEBUG_GCC)
+ test -d $(OBJDIR_DEBUG_GCC) || mkdir -p $(OBJDIR_DEBUG_GCC)
+
+after_debug_linux:
+
+debug_linux: before_debug_linux out_debug_linux after_debug_linux
+
+out_debug_linux: before_debug_linux $(OBJ_DEBUG_GCC) $(DEP_DEBUG_GCC)
+ $(LD_GCC) $(LDFLAGS_DEBUG_GCC) $(LIBDIR_GCC) $(LIBDIR_DEBUG_GCC) $(OBJ_DEBUG_GCC) $(LIB_DEBUG_GCC) -o $(OUT_DEBUG_GCC)/$(PROJNAME)
+
+$(OBJDIR_DEBUG_GCC)/%.o: %.cxx
+ $(CXX_GCC) $(CFLAGS_DEBUG_GCC) $(INC_DEBUG_GCC) -c $< -D_DEBUG -o $@
+
+clean_debug_linux:
+ rm -f $(OBJ_DEBUG_GCC) $(OUT_DEBUG_GCC)/$(PROJNAME)
+ rm -rf $(OUT_DEBUG_GCC)
+ rm -rf $(OBJDIR_DEBUG_GCC)
+
+######## RELEASE GCC
+before_release_linux:
+ test -d $(OUT_RELEASE_GCC) || mkdir -p $(OUT_RELEASE_GCC)
+ test -d $(OBJDIR_RELEASE_GCC) || mkdir -p $(OBJDIR_RELEASE_GCC)
+
+after_release_linux:
+
+release_linux: before_release_linux out_release_linux after_release_linux
+
+out_release_linux: before_release_linux $(OBJ_RELEASE_GCC) $(DEP_RELEASE_GCC)
+ $(LD_GCC) $(LDFLAGS_RELEASE_GCC) $(LIBDIR_GCC) $(LIBDIR_RELEASE_GCC) $(OBJ_RELEASE_GCC) $(LIB_RELEASE_GCC) -o $(OUT_RELEASE_GCC)/$(PROJNAME)
+
+$(OBJDIR_RELEASE_GCC)/%.o: %.cxx
+ $(CXX_GCC) $(CFLAGS_RELEASE_GCC) $(INC_RELEASE_GCC) -c $< -D_RELEASE -o $@
+
+clean_release_linux:
+ rm -f $(OBJ_RELEASE_GCC) $(OUT_RELEASE_GCC)/$(PROJNAME)
+ rm -rf $(OUT_RELEASE_GCC)
+ rm -rf $(OBJDIR_RELEASE_GCC)
+
+######## DEBUG WIN
+before_debug_windows:
+ test -d $(OUT_DEBUG_WIN) || mkdir -p $(OUT_DEBUG_WIN)
+ test -d $(OBJDIR_DEBUG_WIN) || mkdir -p $(OBJDIR_DEBUG_WIN)
+ $(WINDRES_WIN) main.rc $(OBJDIR_DEBUG_WIN)/mainres.o
+
+after_debug_windows:
+
+debug_windows: before_debug_windows out_debug_windows after_debug_windows
+
+out_debug_windows: before_debug_windows $(OBJ_DEBUG_WIN) $(DEP_DEBUG_WIN)
+ $(LD_WIN) $(LDFLAGS_DEBUG_WIN) $(LIBDIR_WIN) $(LIBDIR_DEBUG_WIN) $(OBJ_DEBUG_WIN) $(OBJDIR_DEBUG_WIN)/mainres.o $(LIB_DEBUG_WIN) -o $(OUT_DEBUG_WIN)/$(PROJNAME).exe
+
+$(OBJDIR_DEBUG_WIN)/%.o: %.cxx
+ $(CXX_WIN) $(CFLAGS_DEBUG_WIN) $(INC_DEBUG_WIN) -c $< -D_DEBUG -o $@
+
+clean_debug_windows:
+ rm -f $(OBJ_DEBUG_WIN) $(OUT_DEBUG_WIN)/$(PROJNAME).exe
+ rm -rf $(OUT_DEBUG_WIN)
+ rm -rf $(OBJDIR_DEBUG_WIN)
+
+######## RELEASE WIN
+before_release_windows:
+ test -d $(OUT_RELEASE_WIN) || mkdir -p $(OUT_RELEASE_WIN)
+ test -d $(OBJDIR_RELEASE_WIN) || mkdir -p $(OBJDIR_RELEASE_WIN)
+ $(WINDRES_WIN) main.rc $(OBJDIR_RELEASE_WIN)/mainres.o
+
+after_release_windows:
+
+release_windows: before_release_windows out_release_windows after_release_windows
+
+out_release_windows: before_release_windows $(OBJ_RELEASE_WIN) $(DEP_RELEASE_WIN)
+ $(LD_WIN) $(LDFLAGS_RELEASE_WIN) $(LIBDIR_WIN) $(LIBDIR_RELEASE_WIN) $(OBJ_RELEASE_WIN) $(OBJDIR_RELEASE_WIN)/mainres.o $(LIB_RELEASE_WIN) -o $(OUT_RELEASE_WIN)/$(PROJNAME).exe
+
+$(OBJDIR_RELEASE_WIN)/%.o: %.cxx
+ $(CXX_WIN) $(CFLAGS_RELEASE_WIN) $(INC_RELEASE_WIN) -c $< -D_RELEASE -o $@
+
+clean_release_windows:
+ rm -f $(OBJ_RELEASE_WIN) $(OUT_RELEASE_WIN)/$(PROJNAME).exe
+ rm -rf $(OUT_RELEASE_WIN)
+ rm -rf $(OBJDIR_RELEASE_WIN)
+
+.PHONY: before_debug_linux out_debug_linux after_debug_linux before_release_linux out_release_linux after_release_linux before_debug_windows out_debug_windows after_debug_windows before_release_windows out_release_windows after_release_windows
#include "View.h"
#include <iostream>
#include <FL/fl_ask.H>
+#include <FL/Fl_PNG_Image.H>
+
+#ifdef _WIN32
+#include <FL/x.H>
+#include <windows.h>
+#endif /*_WIN32*/
View::View(ControllerIF::SPtr contr, ModelIF::SPtr model)
{
subscribeSubject(mModel.get());
}
+void View::showErrorMsg(const std::string& message)
+{
+ std::cerr << message << std::endl;
+ std::string printMsg = message;
+ fl_message_title("Error!");
+ printMsg.append("\n\nExit application?");
+ switch ( fl_choice(printMsg.c_str(), "Yes", "No", 0) ) {
+ case 0: exit(EXIT_FAILURE); break;
+ }
+}
+
View::~View()
{
win_exmpl->hide();
void View::updatedBySubject(Subject* s)
{
- if(s == nullptr)
+ if(s == nullptr) {
throw std::string("Nullpointer given as Subject!");
+ }
try
{
win_exmpl->redraw();
}
// ----------- Exception Handling ------------
- catch(std::string& e)
+ catch(const std::string &e)
{
- std::cerr << e << std::endl;
- fl_alert(e.c_str()); //Textbox mit fehlermeldung
+ showErrorMsg(e);
}
-}
+ catch(...)
+ {
+ showErrorMsg("Unknown error occured!");
+ }
+}
void View::show()
{
// Setze fenster style global
Fl::scheme("gtk+");
+ //Setze Fenster Icon
+#ifdef _WIN32
+ win_exmpl->icon((char*)LoadIcon(fl_display, MAKEINTRESOURCE(101)));
+#else
+ Fl_PNG_Image win_icon("Icon.png");
+ win_exmpl->icon(&win_icon);
+#endif /*_WIN32*/
+
+ //Tabelle mit Beispieldaten füllen
+ tbl_example->row_header(true);
+ tbl_example->col_header(true);
+ for(int i = 0; i <= 10; i++)
+ for(int ii = 0; ii <= 10; ii++)
+ tbl_example->SetTableData(std::to_string(i) + " " + std::to_string(ii), i, ii, i + ii);
+
// definiere callback funktionen
btn_exception->callback((Fl_Callback*)btn_exception_cb, (void*)(this) );
// ----------- Exception Handling ------------
catch(const std::string &e)
{
- std::cerr << e << std::endl;
- fl_alert(e.c_str()); //Textbox mit fehlermeldung
+ showErrorMsg(e);
}
catch(...)
{
- fl_alert("Unknown error occured!");
- std::cerr << "Unknown error occured!" << std::endl;
+ showErrorMsg("Unknown error occured!");
}
}
/////////////////////////////////////////////////
void updatedBySubject(Subject* s);
+ /////////////////////////////////////////////////
+ /// \brief Funktion zum darstellen von
+ /// Fehlermeldungen.
+ /// \param message anzuzeigende Fehlermeldung
+ /////////////////////////////////////////////////
+ static void showErrorMsg(const std::string& message);
+
private:
ControllerIF::SPtr mController;
ModelIF::SPtr mModel;
// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "ViewFluid.h"
+#include <FL/fl_draw.H>
+#include <FL/Fl_Table_Row.H>
+#include <string>
+#include <vector>
+
+void SimpleTable::draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H) {
+ static char s[40];
+ switch ( context ) {
+ case CONTEXT_STARTPAGE: // before page is drawn..
+ fl_font(FL_HELVETICA, 16); // set the font for our drawing operations
+ return;
+ case CONTEXT_COL_HEADER: // Draw column headers
+ sprintf(s,"%c",'A'+C); // "A", "B", "C", etc.
+ DrawHeader(s,X,Y,W,H);
+ return;
+ case CONTEXT_ROW_HEADER: // Draw row headers
+ sprintf(s,"%02d:",R+1); // "001:", "002:", etc
+ DrawHeader(s,X,Y,W,H);
+ return;
+ case CONTEXT_CELL: // Draw data in cells
+ if((int)m_TableData.size()-1 < R)
+ SetTableData("", 0, R);
+
+ if((int)m_TableData.at(R).size()-1 < C)
+ SetTableData("", C, 0);
+
+ DrawData(m_TableData.at(R).at(C).c_str(),
+ m_CellColors.at(R).at(C),X,Y,W,H);
+ return;
+ default:
+ return;
+ }
+}
+
+SimpleTable::SimpleTable(int x, int y, int w, int h, const char *l ) : Fl_Table_Row(x,y,w,h,l) {
+}
+
+void SimpleTable::SetTableData(std::string data, unsigned int x , unsigned int y , Fl_Color color ) {
+ if(m_TableData.empty() || (m_TableData.size() < y+1))
+ {
+ m_TableData.resize(y+1);
+ rows(y+1);
+ }
+
+ for (unsigned int i = 0; i < m_TableData.size(); ++i)
+ if(m_TableData.at(i).empty() ||
+ (m_TableData.at(i).size() < x+1))
+ {
+ m_TableData.at(i).resize(x+1, "");
+ cols(x+1);
+ }
+
+ m_TableData.at(y).at(x) = data;
+ SetCellColor(color,x,y);
+}
+
+void SimpleTable::SetCellColor(Fl_Color color, unsigned int x , unsigned int y ) {
+ if(m_CellColors.empty() || (m_CellColors.size() < y+1))
+ {
+ m_CellColors.resize(y+1);
+ rows(y+1);
+ }
+
+ for (unsigned int i = 0; i < m_CellColors.size(); ++i)
+ if(m_CellColors.at(i).empty() ||
+ (m_CellColors.at(i).size() < x+1))
+ {
+ m_CellColors.at(i).resize(x+1, FL_WHITE);
+ cols(x+1);
+ }
+
+ m_CellColors.at(y).at(x) = color;
+}
+
+std::vector<std::vector<std::string>> SimpleTable::GetTableData() {
+ return m_TableData;
+}
+
+void SimpleTable::Resize(unsigned int x , unsigned int y ) {
+ m_TableData.resize(y+1);
+ m_CellColors.resize(y+1);
+ rows(y+1);
+ for (unsigned int i = 0; i < m_TableData.size(); ++i)
+ {
+ m_CellColors.at(i).resize(x+1, FL_WHITE);
+ m_TableData.at(i).resize(x+1, "");
+ }
+ cols(x+1);
+}
+
+void SimpleTable::DrawData(const char *s, Fl_Color cell_color, int X, int Y, int W, int H) {
+ fl_push_clip(X,Y,W,H);
+ // Draw cell bg
+ fl_color(cell_color); fl_rectf(X,Y,W,H);
+ // Draw cell data
+ fl_color(FL_GRAY0); fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);
+ // Draw box border
+ fl_color(color()); fl_rect(X,Y,W,H);
+ fl_pop_clip();
+}
+
+void SimpleTable::DrawHeader(const char *s, int X, int Y, int W, int H) {
+ fl_push_clip(X,Y,W,H);
+ fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, row_header_color());
+ fl_color(FL_BLACK);
+ fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);
+ fl_pop_clip();
+}
ViewFluid::ViewFluid() {
- { win_exmpl = new Fl_Double_Window(340, 150, "Example");
+ { win_exmpl = new Fl_Double_Window(500, 300, "Example");
win_exmpl->box(FL_GTK_DOWN_BOX);
win_exmpl->user_data((void*)(this));
win_exmpl->hotspot(win_exmpl);
- { btn_exception = new Fl_Button(100, 45, 135, 45, "Throw Exception");
+ { btn_exception = new Fl_Button(20, 120, 135, 45, "Throw Exception");
} // Fl_Button* btn_exception
+ { tbl_example = new SimpleTable(170, 0, 330, 300);
+ tbl_example->tooltip("Simple Table Implementation Example");
+ tbl_example->box(FL_THIN_DOWN_FRAME);
+ tbl_example->color(FL_BACKGROUND_COLOR);
+ tbl_example->selection_color(FL_BACKGROUND_COLOR);
+ tbl_example->labeltype(FL_NORMAL_LABEL);
+ tbl_example->labelfont(0);
+ tbl_example->labelsize(14);
+ tbl_example->labelcolor(FL_FOREGROUND_COLOR);
+ tbl_example->align(Fl_Align(FL_ALIGN_TOP));
+ tbl_example->when(FL_WHEN_RELEASE);
+ tbl_example->end();
+ } // SimpleTable* tbl_example
win_exmpl->size_range(585, 555);
win_exmpl->end();
- win_exmpl->resizable(win_exmpl);
} // Fl_Double_Window* win_exmpl
}
version 1.0304
header_name {.h}
code_name {.cxx}
+declblock {\#include <FL/fl_draw.H>} {open public after {\#include <FL/Fl_Table_Row.H>}
+} {}
+
+declblock {\#include <string>} {open public after {\#include <vector>}
+} {}
+
+class SimpleTable {: {public Fl_Table_Row}
+} {
+ Function {draw_cell(TableContext context, int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0)} {return_type void
+ } {
+ code {static char s[40];
+ switch ( context ) {
+ case CONTEXT_STARTPAGE: // before page is drawn..
+ fl_font(FL_HELVETICA, 16); // set the font for our drawing operations
+ return;
+ case CONTEXT_COL_HEADER: // Draw column headers
+ sprintf(s,"%c",'A'+C); // "A", "B", "C", etc.
+ DrawHeader(s,X,Y,W,H);
+ return;
+ case CONTEXT_ROW_HEADER: // Draw row headers
+ sprintf(s,"%02d:",R+1); // "001:", "002:", etc
+ DrawHeader(s,X,Y,W,H);
+ return;
+ case CONTEXT_CELL: // Draw data in cells
+ if((int)m_TableData.size()-1 < R)
+ SetTableData("", 0, R);
+
+ if((int)m_TableData.at(R).size()-1 < C)
+ SetTableData("", C, 0);
+
+ DrawData(m_TableData.at(R).at(C).c_str(),
+ m_CellColors.at(R).at(C),X,Y,W,H);
+ return;
+ default:
+ return;
+ }} {}
+ }
+ Function {SimpleTable(int x, int y, int w, int h, const char *l = 0) : Fl_Table_Row(x,y,w,h,l)} {} {
+ code {} {}
+ }
+ Function {SetTableData(std::string data, unsigned int x = 0, unsigned int y = 0, Fl_Color color = FL_WHITE)} {return_type void
+ } {
+ code {if(m_TableData.empty() || (m_TableData.size() < y+1))
+{
+ m_TableData.resize(y+1);
+ rows(y+1);
+}
+
+for (unsigned int i = 0; i < m_TableData.size(); ++i)
+ if(m_TableData.at(i).empty() ||
+ (m_TableData.at(i).size() < x+1))
+ {
+ m_TableData.at(i).resize(x+1, "");
+ cols(x+1);
+ }
+
+m_TableData.at(y).at(x) = data;
+SetCellColor(color,x,y);} {}
+ }
+ Function {SetCellColor(Fl_Color color, unsigned int x = 0, unsigned int y = 0)} {return_type void
+ } {
+ code {if(m_CellColors.empty() || (m_CellColors.size() < y+1))
+{
+ m_CellColors.resize(y+1);
+ rows(y+1);
+}
+
+for (unsigned int i = 0; i < m_CellColors.size(); ++i)
+ if(m_CellColors.at(i).empty() ||
+ (m_CellColors.at(i).size() < x+1))
+ {
+ m_CellColors.at(i).resize(x+1, FL_WHITE);
+ cols(x+1);
+ }
+
+m_CellColors.at(y).at(x) = color;} {}
+ }
+ Function {GetTableData()} {return_type {std::vector<std::vector<std::string>>}
+ } {
+ code {return m_TableData;} {}
+ }
+ Function {Resize(unsigned int x = 0, unsigned int y = 0)} {} {
+ code {m_TableData.resize(y+1);
+m_CellColors.resize(y+1);
+rows(y+1);
+for (unsigned int i = 0; i < m_TableData.size(); ++i)
+{
+ m_CellColors.at(i).resize(x+1, FL_WHITE);
+ m_TableData.at(i).resize(x+1, "");
+}
+cols(x+1);} {}
+ }
+ decl {using TableData = std::vector<std::vector<std::string>>;} {public local
+ }
+ decl {using TableCellColors = std::vector<std::vector<Fl_Color>>;} {public local
+ }
+ Function {DrawData(const char *s, Fl_Color cell_color, int X, int Y, int W, int H)} {private return_type void
+ } {
+ code {fl_push_clip(X,Y,W,H);
+ // Draw cell bg
+ fl_color(cell_color); fl_rectf(X,Y,W,H);
+ // Draw cell data
+ fl_color(FL_GRAY0); fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);
+ // Draw box border
+ fl_color(color()); fl_rect(X,Y,W,H);
+fl_pop_clip();} {}
+ }
+ Function {DrawHeader(const char *s, int X, int Y, int W, int H)} {private return_type void
+ } {
+ code {fl_push_clip(X,Y,W,H);
+ fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, row_header_color());
+ fl_color(FL_BLACK);
+ fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);
+fl_pop_clip();} {}
+ }
+ decl {TableData m_TableData;} {private local
+ }
+ decl {TableCellColors m_CellColors;} {private local
+ }
+}
+
class ViewFluid {open
} {
Function {ViewFluid()} {open protected
} {
Fl_Window win_exmpl {
label Example open selected
- protected xywh {634 239 340 150} type Double box GTK_DOWN_BOX resizable hotspot size_range {585 555 0 0} visible
+ protected xywh {729 313 500 300} type Double box GTK_DOWN_BOX hotspot size_range {585 555 0 0} visible
} {
Fl_Button btn_exception {
label {Throw Exception}
- xywh {100 45 135 45}
+ protected xywh {20 120 135 45}
}
+ Fl_Table tbl_example {open
+ protected tooltip {Simple Table Implementation Example} xywh {170 0 330 300}
+ class SimpleTable
+ } {}
}
}
}
#ifndef ViewFluid_h
#define ViewFluid_h
#include <FL/Fl.H>
+#include <FL/fl_draw.H>
+#include <FL/Fl_Table_Row.H>
+#include <string>
+#include <vector>
+
+class SimpleTable : public Fl_Table_Row {
+public:
+ void draw_cell(TableContext context, int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0);
+ SimpleTable(int x, int y, int w, int h, const char *l = 0) ;
+ void SetTableData(std::string data, unsigned int x = 0, unsigned int y = 0, Fl_Color color = FL_WHITE);
+ void SetCellColor(Fl_Color color, unsigned int x = 0, unsigned int y = 0);
+ std::vector<std::vector<std::string>> GetTableData();
+ void Resize(unsigned int x = 0, unsigned int y = 0);
+using TableData = std::vector<std::vector<std::string>>;
+using TableCellColors = std::vector<std::vector<Fl_Color>>;
+private:
+ void DrawData(const char *s, Fl_Color cell_color, int X, int Y, int W, int H);
+ void DrawHeader(const char *s, int X, int Y, int W, int H);
+ TableData m_TableData;
+ TableCellColors m_CellColors;
+};
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Button.H>
protected:
ViewFluid();
Fl_Double_Window *win_exmpl;
-public:
Fl_Button *btn_exception;
+ SimpleTable *tbl_example;
};
#endif
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
- <FileVersion major="1" minor="6" />
- <Project>
- <Option title="_template" />
- <Option pch_mode="2" />
- <Option compiler="gcc" />
- <Build>
- <Target title="Release_Linux64">
- <Option output="bin/Release_Linux64/_template" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Release_Linux64/" />
- <Option type="0" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- <Add option="-s" />
- <Add directory="../src" />
- </Compiler>
- <Linker>
- <Add option="-static-libstdc++" />
- <Add option="-static-libgcc" />
- <Add option="../lib/linux64/libfltk.a" />
- <Add option="../lib/linux64/libtinyxml2.a" />
- <Add option="-ldl" />
- <Add option="-lm" />
- <Add option="-lX11" />
- <Add directory="../lib/linux64" />
- </Linker>
- <ExtraCommands>
- <Add before="fluid -c ./ViewFluid.fld" />
- </ExtraCommands>
- </Target>
- <Target title="Release_Linux32">
- <Option output="bin/Release_Linux32/_template" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Release_Linux32/" />
- <Option type="0" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- <Add option="-m32" />
- <Add directory="../src" />
- </Compiler>
- <Linker>
- <Add option="-m32" />
- <Add option="-static-libstdc++" />
- <Add option="-static-libgcc" />
- <Add option="../lib/linux32/libfltk.a" />
- <Add option="../lib/linux32/libtinyxml2.a" />
- <Add option="-ldl" />
- <Add option="-lm" />
- <Add option="-lX11" />
- <Add directory="../lib/linux32" />
- </Linker>
- <ExtraCommands>
- <Add before="fluid -c ./ViewFluid.fld" />
- </ExtraCommands>
- </Target>
- <Target title="Release_Windows">
- <Option output="bin/Release_Windows/_template" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Release_Windows/" />
- <Option type="0" />
- <Option compiler="mingw32_compiler" />
- <Compiler>
- <Add option="-O2" />
- <Add option="-m32" />
- <Add option="-mwindows" />
- <Add option="-DWIN32" />
- <Add option="-DUSE_OPENGL32" />
- <Add option="-D_LARGEFILE_SOURCE" />
- <Add option="-D_LARGEFILE64_SOURCE" />
- <Add option="-D_FILE_OFFSET_BITS=64" />
- <Add directory="../src" />
- </Compiler>
- <Linker>
- <Add option="-m32" />
- <Add option="-mwindows" />
- <Add option="-static-libgcc" />
- <Add option="-static-libstdc++" />
- <Add option="../lib/mingw32/libfltk.a" />
- <Add option="../lib/mingw32/libtinyxml2.a" />
- <Add option="-lole32" />
- <Add option="-luuid" />
- <Add option="-lcomctl32" />
- <Add directory="../lib/mingw32" />
- </Linker>
- <ExtraCommands>
- <Add before="fluid -c ./ViewFluid.fld" />
- </ExtraCommands>
- </Target>
- <Target title="Debug_Linux64">
- <Option output="bin/Debug_Linux64/_template" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Debug_Linux64/" />
- <Option type="0" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-g" />
- <Add directory="../src" />
- </Compiler>
- <Linker>
- <Add option="-static-libstdc++" />
- <Add option="-static-libgcc" />
- <Add option="../lib/linux64/libfltk.a" />
- <Add option="../lib/linux64/libtinyxml2.a" />
- <Add option="-ldl" />
- <Add option="-lm" />
- <Add option="-lX11" />
- <Add directory="../lib/linux64" />
- </Linker>
- <ExtraCommands>
- <Add before="fluid -c ./ViewFluid.fld" />
- </ExtraCommands>
- </Target>
- <Target title="Debug_Linux32">
- <Option output="bin/Debug_Linux32/_template" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Debug_Linux32/" />
- <Option type="0" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-m32" />
- <Add option="-g" />
- <Add directory="../src" />
- </Compiler>
- <Linker>
- <Add option="-m32" />
- <Add option="-static-libstdc++" />
- <Add option="-static-libgcc" />
- <Add option="../lib/linux32/libfltk.a" />
- <Add option="../lib/linux32/libtinyxml2.a" />
- <Add option="-ldl" />
- <Add option="-lm" />
- <Add option="-lX11" />
- <Add directory="../lib/linux32" />
- </Linker>
- <ExtraCommands>
- <Add before="fluid -c ./ViewFluid.fld" />
- </ExtraCommands>
- </Target>
- <Target title="Debug_Windows">
- <Option output="bin/Debug_Windows/_template" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj/Debug_Windows/" />
- <Option type="0" />
- <Option compiler="mingw32_compiler" />
- <Compiler>
- <Add option="-m32" />
- <Add option="-g" />
- <Add option="-mwindows" />
- <Add option="-DWIN32" />
- <Add option="-DUSE_OPENGL32" />
- <Add option="-D_LARGEFILE_SOURCE" />
- <Add option="-D_LARGEFILE64_SOURCE" />
- <Add option="-D_FILE_OFFSET_BITS=64" />
- <Add directory="../src" />
- </Compiler>
- <Linker>
- <Add option="-m32" />
- <Add option="-mwindows" />
- <Add option="-static-libgcc" />
- <Add option="-static-libstdc++" />
- <Add option="../lib/mingw32/libfltk.a" />
- <Add option="../lib/mingw32/libtinyxml2.a" />
- <Add option="-lole32" />
- <Add option="-luuid" />
- <Add option="-lcomctl32" />
- <Add directory="../lib/mingw32" />
- </Linker>
- <ExtraCommands>
- <Add before="fluid -c ./ViewFluid.fld" />
- </ExtraCommands>
- </Target>
- </Build>
- <Compiler>
- <Add option="-std=c++11" />
- <Add directory="../include" />
- </Compiler>
- <Unit filename="Controller.cxx" />
- <Unit filename="Controller.h" />
- <Unit filename="ControllerIF.h" />
- <Unit filename="FSHelper.cxx" />
- <Unit filename="FSHelper.h" />
- <Unit filename="Model.cxx" />
- <Unit filename="Model.h" />
- <Unit filename="ModelIF.h" />
- <Unit filename="Object.h" />
- <Unit filename="Observer.cxx" />
- <Unit filename="Observer.h" />
- <Unit filename="Subject.cxx" />
- <Unit filename="Subject.h" />
- <Unit filename="View.cxx" />
- <Unit filename="View.h" />
- <Unit filename="ViewFluid.cxx" />
- <Unit filename="ViewFluid.fld" />
- <Unit filename="ViewFluid.h" />
- <Unit filename="main.cxx" />
- <Extensions>
- <envvars />
- <code_completion />
- <debugger />
- <lib_finder disable_auto="1" />
- <DoxyBlocks>
- <comment_style block="5" line="0" />
- <doxyfile_project />
- <doxyfile_build />
- <doxyfile_warnings />
- <doxyfile_output />
- <doxyfile_dot />
- <general />
- </DoxyBlocks>
- </Extensions>
- </Project>
-</CodeBlocks_project_file>
--- /dev/null
+101 ICON DISCARDABLE "./Icon.ico"
+1 VERSIONINFO
+FILEVERSION 1,0,0,0
+PRODUCTVERSION 1,0,0,0
+FILEFLAGSMASK 0X3FL
+FILEFLAGS 0L
+FILEOS 0X40004L
+FILETYPE 0X1
+FILESUBTYPE 0
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "CompanyName", "Daniel Giritzer"
+ VALUE "FileDescription", "_template"
+ VALUE "FileVersion", "1.0.0.0"
+ VALUE "InternalName", "_template"
+ VALUE "LegalCopyright", "(c) Daniel Giritzer"
+ VALUE "OriginalFilename", "_template.exe"
+ VALUE "ProductName", "_template"
+ VALUE "ProductVersion", "1.0.0.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 0x04B0
+ END
+END
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+DIR=$(pwd)
+export PATH=$DIR/bin:$PATH
+#export LD_LIBRARY_PATH=$DIR/lib
+_template
+# comment line above, LD_LIBRARY_PATH and uncomment next line to use libs shipped with this package
+#$LD_LIBRARY_PATH/ld-linux.so.2 --library-path $LD_LIBRARY_PATH $DIR/bin/_template
\ No newline at end of file
--- /dev/null
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=_template
+Comment=_template Application
+TryExec=start__template
+Exec=start__template %F
+Icon=Icon
+MimeType=image/x-foo;
\ No newline at end of file