Files
GDevelop/Core/GDCore/IDE/Dialogs/EditExpressionDialog.cpp

1678 lines
65 KiB
C++

/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY) && !defined(GD_NO_WX_GUI)
#include <algorithm>
#include <vector>
#include "GDCore/String.h"
//(*InternalHeaders(EditExpressionDialog)
#include <wx/bitmap.h>
#include <wx/font.h>
#include <wx/image.h>
#include <wx/intl.h>
#include <wx/string.h>
//*)
#include <wx/bitmap.h>
#include <wx/icon.h>
#include <wx/image.h>
#include <wx/msgdlg.h>
#include <wx/settings.h>
#include <wx/textdlg.h>
#include "EditExpressionDialog.h"
#include "GDCore/CommonTools.h"
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/Dialogs/AdvancedEntryDialog.h"
#include "GDCore/IDE/Dialogs/ChooseBehaviorDialog.h"
#include "GDCore/IDE/Dialogs/ChooseLayerDialog.h"
#include "GDCore/IDE/Dialogs/ChooseObjectDialog.h"
#include "GDCore/IDE/Dialogs/ChooseVariableDialog.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/IDE/Events/ExpressionsCorrectnessTesting.h"
#include "GDCore/IDE/wxTools/SkinHelper.h"
#include "GDCore/IDE/wxTools/TreeItemExpressionMetadata.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Tools/HelpFileAccess.h"
using namespace std;
namespace gd {
//(*IdInit(EditExpressionDialog)
const long EditExpressionDialog::ID_CUSTOM1 = wxNewId();
const long EditExpressionDialog::ID_BUTTON1 = wxNewId();
const long EditExpressionDialog::ID_HYPERLINKCTRL1 = wxNewId();
const long EditExpressionDialog::ID_STATICBITMAP5 = wxNewId();
const long EditExpressionDialog::ID_HYPERLINKCTRL2 = wxNewId();
const long EditExpressionDialog::ID_PANEL1 = wxNewId();
const long EditExpressionDialog::ID_STATICTEXT1 = wxNewId();
const long EditExpressionDialog::ID_BUTTON2 = wxNewId();
const long EditExpressionDialog::ID_BUTTON3 = wxNewId();
const long EditExpressionDialog::ID_BUTTON4 = wxNewId();
const long EditExpressionDialog::ID_BUTTON5 = wxNewId();
const long EditExpressionDialog::ID_STATICTEXT2 = wxNewId();
const long EditExpressionDialog::ID_BUTTON6 = wxNewId();
const long EditExpressionDialog::ID_BUTTON7 = wxNewId();
const long EditExpressionDialog::ID_BUTTON13 = wxNewId();
const long EditExpressionDialog::ID_BUTTON14 = wxNewId();
const long EditExpressionDialog::ID_BITMAPBUTTON2 = wxNewId();
const long EditExpressionDialog::ID_BITMAPBUTTON1 = wxNewId();
const long EditExpressionDialog::ID_BUTTON15 = wxNewId();
const long EditExpressionDialog::ID_BUTTON12 = wxNewId();
const long EditExpressionDialog::ID_BUTTON8 = wxNewId();
const long EditExpressionDialog::ID_BUTTON9 = wxNewId();
const long EditExpressionDialog::ID_BUTTON16 = wxNewId();
const long EditExpressionDialog::ID_BUTTON33 = wxNewId();
const long EditExpressionDialog::ID_BUTTON29 = wxNewId();
const long EditExpressionDialog::ID_BUTTON28 = wxNewId();
const long EditExpressionDialog::ID_BUTTON27 = wxNewId();
const long EditExpressionDialog::ID_BUTTON26 = wxNewId();
const long EditExpressionDialog::ID_BUTTON18 = wxNewId();
const long EditExpressionDialog::ID_BUTTON19 = wxNewId();
const long EditExpressionDialog::ID_BUTTON20 = wxNewId();
const long EditExpressionDialog::ID_BUTTON21 = wxNewId();
const long EditExpressionDialog::ID_BUTTON22 = wxNewId();
const long EditExpressionDialog::ID_BUTTON23 = wxNewId();
const long EditExpressionDialog::ID_BUTTON24 = wxNewId();
const long EditExpressionDialog::ID_BUTTON25 = wxNewId();
const long EditExpressionDialog::ID_BUTTON30 = wxNewId();
const long EditExpressionDialog::ID_BUTTON31 = wxNewId();
const long EditExpressionDialog::ID_BUTTON32 = wxNewId();
const long EditExpressionDialog::ID_BUTTON17 = wxNewId();
const long EditExpressionDialog::ID_PANEL2 = wxNewId();
const long EditExpressionDialog::ID_TREECTRL1 = wxNewId();
const long EditExpressionDialog::ID_BUTTON10 = wxNewId();
const long EditExpressionDialog::ID_PANEL3 = wxNewId();
const long EditExpressionDialog::ID_TREECTRL2 = wxNewId();
const long EditExpressionDialog::ID_BUTTON11 = wxNewId();
const long EditExpressionDialog::ID_PANEL4 = wxNewId();
//*)
BEGIN_EVENT_TABLE(EditExpressionDialog, wxDialog)
//(*EventTable(EditExpressionDialog)
//*)
END_EVENT_TABLE()
EditExpressionDialog::EditExpressionDialog(wxWindow* parent,
const gd::String& expression_,
gd::Project& project_,
gd::Layout& layout_)
: expression(expression_),
project(project_),
layout(layout_),
lastErrorPos(gd::String::npos) {
//(*Initialize(EditExpressionDialog)
wxFlexGridSizer* FlexGridSizer4;
wxFlexGridSizer* FlexGridSizer3;
wxFlexGridSizer* FlexGridSizer5;
wxFlexGridSizer* FlexGridSizer2;
wxFlexGridSizer* FlexGridSizer7;
wxBoxSizer* BoxSizer1;
wxFlexGridSizer* FlexGridSizer1;
wxFlexGridSizer* FlexGridSizer17;
wxGridSizer* GridSizer2;
Create(parent,
wxID_ANY,
_("Edit the expression"),
wxDefaultPosition,
wxDefaultSize,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER,
_T("wxID_ANY"));
wxIcon FrameIcon;
FrameIcon.CopyFromBitmap(wxBitmap(wxImage(_T("res/expressionicon.png"))));
SetIcon(FrameIcon);
mgr = new wxAuiManager(this, wxAUI_MGR_DEFAULT);
centerPanel = new wxPanel(this,
ID_PANEL1,
wxDefaultPosition,
wxDefaultSize,
wxTAB_TRAVERSAL,
_T("ID_PANEL1"));
FlexGridSizer1 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer1->AddGrowableCol(0);
FlexGridSizer1->AddGrowableRow(0);
FlexGridSizer2 = new wxFlexGridSizer(0, 2, 0, 0);
FlexGridSizer2->AddGrowableCol(0);
FlexGridSizer2->AddGrowableRow(0);
ExpressionEdit = new wxStyledTextCtrl(centerPanel,
ID_CUSTOM1,
wxDefaultPosition,
wxSize(200, 28),
0,
_T("ID_CUSTOM1"));
FlexGridSizer2->Add(
ExpressionEdit,
1,
wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
OkBt = new wxButton(centerPanel,
ID_BUTTON1,
_("Ok"),
wxDefaultPosition,
wxDefaultSize,
0,
wxDefaultValidator,
_T("ID_BUTTON1"));
FlexGridSizer2->Add(
OkBt, 1, wxALL | wxALIGN_BOTTOM | wxALIGN_CENTER_HORIZONTAL, 5);
FlexGridSizer7 = new wxFlexGridSizer(0, 3, 0, 0);
FlexGridSizer7->AddGrowableCol(0);
FlexGridSizer7->AddGrowableRow(0);
errorTxt = new wxHyperlinkCtrl(centerPanel,
ID_HYPERLINKCTRL1,
_("No errors."),
wxEmptyString,
wxDefaultPosition,
wxDefaultSize,
wxHL_ALIGN_LEFT | wxNO_BORDER,
_T("ID_HYPERLINKCTRL1"));
errorTxt->SetToolTip(_("Click to position cursor on the error."));
FlexGridSizer7->Add(
errorTxt,
0,
wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
FlexGridSizer2->Add(
FlexGridSizer7,
0,
wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
FlexGridSizer17 = new wxFlexGridSizer(0, 3, 0, 0);
FlexGridSizer17->AddGrowableRow(0);
StaticBitmap2 = new wxStaticBitmap(centerPanel,
ID_STATICBITMAP5,
gd::SkinHelper::GetIcon("help", 16),
wxDefaultPosition,
wxDefaultSize,
wxNO_BORDER,
_T("ID_STATICBITMAP5"));
FlexGridSizer17->Add(StaticBitmap2,
1,
wxTOP | wxBOTTOM | wxLEFT | wxALIGN_CENTER_HORIZONTAL |
wxALIGN_CENTER_VERTICAL,
5);
HyperlinkCtrl1 =
new wxHyperlinkCtrl(centerPanel,
ID_HYPERLINKCTRL2,
_("Help"),
wxEmptyString,
wxDefaultPosition,
wxDefaultSize,
wxHL_CONTEXTMENU | wxHL_ALIGN_CENTRE | wxNO_BORDER,
_T("ID_HYPERLINKCTRL2"));
HyperlinkCtrl1->SetToolTip(_("Display help about this window"));
FlexGridSizer17->Add(
HyperlinkCtrl1,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
FlexGridSizer2->Add(
FlexGridSizer17, 1, wxRIGHT | wxALIGN_RIGHT | wxALIGN_BOTTOM, 5);
FlexGridSizer1->Add(
FlexGridSizer2,
1,
wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
centerPanel->SetSizer(FlexGridSizer1);
FlexGridSizer1->Fit(centerPanel);
FlexGridSizer1->SetSizeHints(centerPanel);
mgr->AddPane(centerPanel,
wxAuiPaneInfo()
.Name(_T("PaneName"))
.DefaultPane()
.Caption(_("Pane caption"))
.CaptionVisible(false)
.CloseButton(false)
.Center()
.DockFixed()
.Floatable(false)
.Movable(false)
.PaneBorder(false));
mathPanel = new wxPanel(this,
ID_PANEL2,
wxDefaultPosition,
wxDefaultSize,
wxTAB_TRAVERSAL,
_T("ID_PANEL2"));
FlexGridSizer3 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer3->AddGrowableCol(0);
StaticText1 = new wxStaticText(mathPanel,
ID_STATICTEXT1,
_("Basic operations"),
wxDefaultPosition,
wxDefaultSize,
0,
_T("ID_STATICTEXT1"));
FlexGridSizer3->Add(
StaticText1,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
BoxSizer1 = new wxBoxSizer(wxHORIZONTAL);
PlusBt = new wxButton(mathPanel,
ID_BUTTON2,
_("+"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON2"));
BoxSizer1->Add(PlusBt,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
MinusBt = new wxButton(mathPanel,
ID_BUTTON3,
_("-"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON3"));
BoxSizer1->Add(MinusBt,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
MultBt = new wxButton(mathPanel,
ID_BUTTON4,
_("*"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON4"));
BoxSizer1->Add(MultBt,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
DivBt = new wxButton(mathPanel,
ID_BUTTON5,
_("/"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON5"));
BoxSizer1->Add(
DivBt, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0);
FlexGridSizer3->Add(
BoxSizer1,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
StaticText2 = new wxStaticText(mathPanel,
ID_STATICTEXT2,
_("Complex operations"),
wxDefaultPosition,
wxDefaultSize,
0,
_T("ID_STATICTEXT2"));
FlexGridSizer3->Add(
StaticText2,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
GridSizer2 = new wxGridSizer(0, 4, 0, 0);
POBt = new wxButton(mathPanel,
ID_BUTTON6,
_("("),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON6"));
GridSizer2->Add(
POBt, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0);
PFBt = new wxButton(mathPanel,
ID_BUTTON7,
_(")"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON7"));
GridSizer2->Add(
PFBt, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0);
Button2 = new wxButton(mathPanel,
ID_BUTTON13,
_("pow"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON13"));
Button2->SetToolTip(_("pow(x,n) raise x to power n"));
GridSizer2->Add(Button2,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button3 = new wxButton(mathPanel,
ID_BUTTON14,
_("E10"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON14"));
GridSizer2->Add(Button3,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
BitmapButton2 = new wxBitmapButton(mathPanel,
ID_BITMAPBUTTON2,
wxBitmap(wxImage(_T("res/sqrt.png"))),
wxDefaultPosition,
wxSize(25, 23),
wxBU_AUTODRAW,
wxDefaultValidator,
_T("ID_BITMAPBUTTON2"));
BitmapButton2->SetToolTip(_("sqrt(x) compute the square root of x."));
GridSizer2->Add(BitmapButton2,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
BitmapButton1 = new wxBitmapButton(mathPanel,
ID_BITMAPBUTTON1,
wxBitmap(wxImage(_T("res/nth root.png"))),
wxDefaultPosition,
wxSize(25, 23),
wxBU_AUTODRAW,
wxDefaultValidator,
_T("ID_BITMAPBUTTON1"));
BitmapButton1->SetToolTip(
_("Nth root of a number. nthroot(27, 3) will return 3."));
GridSizer2->Add(BitmapButton1,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button4 = new wxButton(mathPanel,
ID_BUTTON15,
_("exp"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON15"));
Button4->SetToolTip(_("Exponential"));
GridSizer2->Add(Button4,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button1 = new wxButton(mathPanel,
ID_BUTTON12,
_("log"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON12"));
Button1->SetToolTip(_("Natural logarithm"));
GridSizer2->Add(Button1,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
CosBt = new wxButton(mathPanel,
ID_BUTTON8,
_("cos"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON8"));
CosBt->SetToolTip(_("Cosine"));
GridSizer2->Add(
CosBt, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0);
SinBt = new wxButton(mathPanel,
ID_BUTTON9,
_("sin"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON9"));
SinBt->SetToolTip(_("Sine"));
GridSizer2->Add(
SinBt, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0);
Button5 = new wxButton(mathPanel,
ID_BUTTON16,
_("tan"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON16"));
Button5->SetToolTip(_("Tangent"));
GridSizer2->Add(Button5,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button21 = new wxButton(mathPanel,
ID_BUTTON33,
_("log10"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON33"));
wxFont Button21Font(6,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button21->SetFont(Button21Font);
Button21->SetToolTip(_("Base-10 logarithm"));
GridSizer2->Add(Button21,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button17 = new wxButton(mathPanel,
ID_BUTTON29,
_("cosh"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON29"));
wxFont Button17Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button17->SetFont(Button17Font);
Button17->SetToolTip(_("Hyperbolic cosine"));
GridSizer2->Add(Button17,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button16 = new wxButton(mathPanel,
ID_BUTTON28,
_("sinh"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON28"));
wxFont Button16Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button16->SetFont(Button16Font);
Button16->SetToolTip(_("Hyperbolic sine"));
GridSizer2->Add(Button16,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button15 = new wxButton(mathPanel,
ID_BUTTON27,
_("tanh"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON27"));
wxFont Button15Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button15->SetFont(Button15Font);
Button15->SetToolTip(_("Hyperbolic tangent"));
GridSizer2->Add(Button15,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button14 = new wxButton(mathPanel,
ID_BUTTON26,
_("floor"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON26"));
wxFont Button14Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button14->SetFont(Button14Font);
Button14->SetToolTip(_("Round to the smallest following integer."));
GridSizer2->Add(Button14,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button7 = new wxButton(mathPanel,
ID_BUTTON18,
_("acos"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON18"));
wxFont Button7Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button7->SetFont(Button7Font);
GridSizer2->Add(Button7,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button8 = new wxButton(mathPanel,
ID_BUTTON19,
_("asin"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON19"));
wxFont Button8Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button8->SetFont(Button8Font);
GridSizer2->Add(Button8,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button9 = new wxButton(mathPanel,
ID_BUTTON20,
_("atan"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON20"));
wxFont Button9Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button9->SetFont(Button9Font);
GridSizer2->Add(Button9,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
ceilBt = new wxButton(mathPanel,
ID_BUTTON21,
_("ceil"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON21"));
ceilBt->SetToolTip(_("Round to the greatest following integer."));
GridSizer2->Add(ceilBt,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button10 = new wxButton(mathPanel,
ID_BUTTON22,
_("a\ncosh"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON22"));
wxFont Button10Font(6,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button10->SetFont(Button10Font);
GridSizer2->Add(Button10,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button11 = new wxButton(mathPanel,
ID_BUTTON23,
_("a\nsinh"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON23"));
wxFont Button11Font(6,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button11->SetFont(Button11Font);
GridSizer2->Add(Button11,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button12 = new wxButton(mathPanel,
ID_BUTTON24,
_("a\ntanh"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON24"));
wxFont Button12Font(6,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button12->SetFont(Button12Font);
GridSizer2->Add(Button12,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
intBt = new wxButton(mathPanel,
ID_BUTTON25,
_("int"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON25"));
intBt->SetToolTip(_("in(x) convert x in an integer."));
GridSizer2->Add(
intBt, 1, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0);
Button18 = new wxButton(mathPanel,
ID_BUTTON30,
_("sec"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON30"));
wxFont Button18Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button18->SetFont(Button18Font);
Button18->SetToolTip(_("Secant ( 1/cos(x) )"));
GridSizer2->Add(Button18,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button19 = new wxButton(mathPanel,
ID_BUTTON31,
_("csc"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON31"));
wxFont Button19Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button19->SetFont(Button19Font);
Button19->SetToolTip(_("Cosecant ( 1/sin(x) )"));
GridSizer2->Add(Button19,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button20 = new wxButton(mathPanel,
ID_BUTTON32,
_("cot"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON32"));
wxFont Button20Font(7,
wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL,
false,
wxEmptyString,
wxFONTENCODING_DEFAULT);
Button20->SetFont(Button20Font);
Button20->SetToolTip(_("Cotangent ( 1/tan(x) )"));
GridSizer2->Add(Button20,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
Button6 = new wxButton(mathPanel,
ID_BUTTON17,
_("abs"),
wxDefaultPosition,
wxSize(25, 23),
0,
wxDefaultValidator,
_T("ID_BUTTON17"));
Button6->SetToolTip(_("abs(x) return the absolute value of x."));
GridSizer2->Add(Button6,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
FlexGridSizer3->Add(
GridSizer2,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
mathPanel->SetSizer(FlexGridSizer3);
FlexGridSizer3->Fit(mathPanel);
FlexGridSizer3->SetSizeHints(mathPanel);
mgr->AddPane(mathPanel,
wxAuiPaneInfo()
.Name(_T("mathPane"))
.DefaultPane()
.Caption(_("Mathematical functions and operators"))
.CaptionVisible()
.CloseButton(false)
.Bottom()
.Resizable(false));
objectsPanel = new wxPanel(this,
ID_PANEL3,
wxDefaultPosition,
wxDefaultSize,
wxTAB_TRAVERSAL,
_T("ID_PANEL3"));
FlexGridSizer4 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer4->AddGrowableCol(0);
FlexGridSizer4->AddGrowableRow(0);
ObjList = new wxTreeCtrl(objectsPanel,
ID_TREECTRL1,
wxDefaultPosition,
wxSize(195, 177),
wxTR_HIDE_ROOT | wxTR_DEFAULT_STYLE,
wxDefaultValidator,
_T("ID_TREECTRL1"));
FlexGridSizer4->Add(
ObjList,
1,
wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
AddPropBt = new wxButton(objectsPanel,
ID_BUTTON10,
_("Add"),
wxDefaultPosition,
wxDefaultSize,
0,
wxDefaultValidator,
_T("ID_BUTTON10"));
FlexGridSizer4->Add(
AddPropBt,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
objectsPanel->SetSizer(FlexGridSizer4);
FlexGridSizer4->Fit(objectsPanel);
FlexGridSizer4->SetSizeHints(objectsPanel);
mgr->AddPane(objectsPanel,
wxAuiPaneInfo()
.Name(_T("objectsPane"))
.DefaultPane()
.Caption(_("Objects functions"))
.CaptionVisible()
.CloseButton(false)
.Bottom());
freeFunctionsPanel = new wxPanel(this,
ID_PANEL4,
wxDefaultPosition,
wxDefaultSize,
wxTAB_TRAVERSAL,
_T("ID_PANEL4"));
FlexGridSizer5 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer5->AddGrowableCol(0);
FlexGridSizer5->AddGrowableRow(0);
ValList = new wxTreeCtrl(freeFunctionsPanel,
ID_TREECTRL2,
wxDefaultPosition,
wxSize(178, 147),
wxTR_HIDE_ROOT | wxTR_DEFAULT_STYLE,
wxDefaultValidator,
_T("ID_TREECTRL2"));
FlexGridSizer5->Add(
ValList,
1,
wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
0);
AddValBt = new wxButton(freeFunctionsPanel,
ID_BUTTON11,
_("Add"),
wxDefaultPosition,
wxDefaultSize,
0,
wxDefaultValidator,
_T("ID_BUTTON11"));
FlexGridSizer5->Add(
AddValBt,
1,
wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL,
5);
freeFunctionsPanel->SetSizer(FlexGridSizer5);
FlexGridSizer5->Fit(freeFunctionsPanel);
FlexGridSizer5->SetSizeHints(freeFunctionsPanel);
mgr->AddPane(freeFunctionsPanel,
wxAuiPaneInfo()
.Name(_T("freeFunctionsPane"))
.DefaultPane()
.Caption(_("Other functions"))
.CaptionVisible()
.CloseButton(false)
.Bottom());
mgr->Update();
Connect(ID_BUTTON1,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnOkBtClick);
Connect(ID_HYPERLINKCTRL1,
wxEVT_COMMAND_HYPERLINK,
(wxObjectEventFunction)&EditExpressionDialog::OnerrorTxtClick);
Connect(ID_HYPERLINKCTRL2,
wxEVT_COMMAND_HYPERLINK,
(wxObjectEventFunction)&EditExpressionDialog::OnhelpBtClick);
Connect(ID_BUTTON2,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnPlusBtClick);
Connect(ID_BUTTON3,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnMinusBtClick);
Connect(ID_BUTTON4,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnMultBtClick);
Connect(ID_BUTTON5,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnDivBtClick);
Connect(ID_BUTTON6,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnPOBtClick);
Connect(ID_BUTTON7,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnPFBtClick);
Connect(ID_BUTTON13,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton2Click);
Connect(ID_BUTTON14,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton3Click);
Connect(ID_BITMAPBUTTON2,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnBitmapButton2Click);
Connect(ID_BITMAPBUTTON1,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnBitmapButton1Click);
Connect(ID_BUTTON15,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton4Click);
Connect(ID_BUTTON12,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton1Click);
Connect(ID_BUTTON8,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnCosBtClick);
Connect(ID_BUTTON9,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnSinBtClick);
Connect(ID_BUTTON16,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton5Click);
Connect(ID_BUTTON33,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton21Click);
Connect(ID_BUTTON29,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton17Click);
Connect(ID_BUTTON28,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton16Click);
Connect(ID_BUTTON27,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton15Click);
Connect(ID_BUTTON26,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton14Click);
Connect(ID_BUTTON18,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton7Click);
Connect(ID_BUTTON19,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton8Click);
Connect(ID_BUTTON20,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton9Click);
Connect(ID_BUTTON21,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnceilBtClick);
Connect(ID_BUTTON22,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton10Click);
Connect(ID_BUTTON23,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton11Click);
Connect(ID_BUTTON24,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton12Click);
Connect(ID_BUTTON25,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnintBtClick);
Connect(ID_BUTTON30,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton18Click);
Connect(ID_BUTTON31,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton19Click);
Connect(ID_BUTTON32,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton20Click);
Connect(ID_BUTTON17,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnButton6Click);
Connect(
ID_TREECTRL1,
wxEVT_COMMAND_TREE_ITEM_ACTIVATED,
(wxObjectEventFunction)&EditExpressionDialog::OnObjListItemDoubleClicked);
Connect(ID_TREECTRL1,
wxEVT_COMMAND_TREE_SEL_CHANGED,
(wxObjectEventFunction)&EditExpressionDialog::OnObjListItemActivated);
Connect(ID_BUTTON10,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnAddPropBtClick);
Connect(
ID_TREECTRL2,
wxEVT_COMMAND_TREE_ITEM_ACTIVATED,
(wxObjectEventFunction)&EditExpressionDialog::OnValListItemDoubleClicked);
Connect(ID_TREECTRL2,
wxEVT_COMMAND_TREE_SEL_CHANGED,
(wxObjectEventFunction)&EditExpressionDialog::OnValListItemActivated);
Connect(ID_BUTTON11,
wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction)&EditExpressionDialog::OnAddValBtClick);
//*)
Connect(ID_CUSTOM1,
wxEVT_STC_MODIFIED,
(wxObjectEventFunction)&EditExpressionDialog::TextModified);
Connect(ID_CUSTOM1,
wxEVT_STC_UPDATEUI,
(wxObjectEventFunction)&EditExpressionDialog::UpdateTextCtrl);
imageListObj = new wxImageList(16, 16);
imageListObj->Add((wxBitmap("res/actions/uneaction.png", wxBITMAP_TYPE_ANY)));
ObjList->AssignImageList(imageListObj);
imageListVal = new wxImageList(16, 16);
imageListVal->Add((wxBitmap("res/actions/uneaction.png", wxBITMAP_TYPE_ANY)));
ValList->AssignImageList(imageListVal);
ExpressionEdit->SetText(expression);
ExpressionEdit->SetLexer(wxSTC_LEX_CPP);
ExpressionEdit->StyleSetFont(wxSTC_STYLE_DEFAULT,
gd::EventsRenderingHelper::Get()->GetFont());
ExpressionEdit->StyleClearAll();
ExpressionEdit->StyleSetForeground(4, *wxBLACK); // Numbers
ExpressionEdit->StyleSetForeground(10, *wxRED); // Operators
ExpressionEdit->StyleSetForeground(6, *wxBLUE); // String
ExpressionEdit->StyleSetForeground(5, wxColour(0, 28, 158)); //(Key)Word
ExpressionEdit->StyleSetBackground(34, wxColour(119, 255, 119)); // Brace
ExpressionEdit->StyleSetBackground(35, wxColour(255, 119, 119)); // Brace
// Prepare keyword highlighting
gd::String keywords;
const vector<std::shared_ptr<PlatformExtension> > extensions =
project.GetCurrentPlatform().GetAllPlatformExtensions();
for (std::size_t i = 0; i < extensions.size(); ++i) {
// Verify if that extension is enabled
if (find(project.GetUsedExtensions().begin(),
project.GetUsedExtensions().end(),
extensions[i]->GetName()) == project.GetUsedExtensions().end())
continue;
// Add keywords of static expressions
const std::map<gd::String, gd::ExpressionMetadata>& allExprs =
extensions[i]->GetAllExpressions();
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allExprs.begin();
it != allExprs.end();
++it)
keywords += " " + it->first;
const std::map<gd::String, gd::ExpressionMetadata>& allStrExprs =
extensions[i]->GetAllStrExpressions();
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allStrExprs.begin();
it != allStrExprs.end();
++it)
keywords += " " + it->first;
// Add keywords of objects expressions
std::vector<gd::String> objectsTypes =
extensions[i]->GetExtensionObjectsTypes();
for (std::size_t j = 0; j < objectsTypes.size(); ++j) {
const std::map<gd::String, gd::ExpressionMetadata>& allExprs =
extensions[i]->GetAllExpressionsForObject(objectsTypes[j]);
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allExprs.begin();
it != allExprs.end();
++it)
keywords += " " + it->first;
const std::map<gd::String, gd::ExpressionMetadata>& allStrExprs =
extensions[i]->GetAllStrExpressionsForObject(objectsTypes[j]);
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allStrExprs.begin();
it != allStrExprs.end();
++it)
keywords += " " + it->first;
}
// Add keywords of behaviors expressions
std::vector<gd::String> behaviorsTypes = extensions[i]->GetBehaviorsTypes();
for (std::size_t j = 0; j < behaviorsTypes.size(); ++j) {
const std::map<gd::String, gd::ExpressionMetadata>& allExprs =
extensions[i]->GetAllExpressionsForBehavior(behaviorsTypes[j]);
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allExprs.begin();
it != allExprs.end();
++it)
keywords += " " + it->first;
const std::map<gd::String, gd::ExpressionMetadata>& allStrExprs =
extensions[i]->GetAllStrExpressionsForBehavior(behaviorsTypes[j]);
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allStrExprs.begin();
it != allStrExprs.end();
++it)
keywords += " " + it->first;
}
}
ExpressionEdit->SetKeyWords(0, keywords);
ExpressionEdit->SetWrapMode(wxSTC_WRAP_WORD);
ExpressionEdit->SetMarginLeft(1);
RefreshLists();
mgr->GetArtProvider()->SetColor(
wxAUI_DOCKART_SASH_COLOUR,
wxSystemSettings::GetColour(wxSYS_COLOUR_MENU));
mgr->GetArtProvider()->SetColor(
wxAUI_DOCKART_BACKGROUND_COLOUR,
wxSystemSettings::GetColour(wxSYS_COLOUR_MENU));
mgr->GetPane(centerPanel).MinSize(450, 50).BestSize(450, 50);
mgr->GetPane(mathPanel).MinSize(130, 300).MaxSize(130, 300).Resizable(false);
mgr->GetPane(objectsPanel).MinSize(200, 300);
mgr->GetPane(freeFunctionsPanel).MinSize(200, 300);
mgr->Update();
#if defined(WINDOWS)
SetSize(580, 438); // Values tuned for looking best on Windows
#else
SetSize(580, 440);
#endif
}
EditExpressionDialog::~EditExpressionDialog() {
//(*Destroy(EditExpressionDialog)
//*)
mgr->UnInit();
}
/**
* Syntax highlighting
*/
void EditExpressionDialog::UpdateTextCtrl(wxStyledTextEvent& event) {
char currentChar = ExpressionEdit->GetCharAt(ExpressionEdit->GetCurrentPos());
if (currentChar != '(' && currentChar != ')') {
ExpressionEdit->BraceHighlight(wxSTC_INVALID_POSITION,
wxSTC_INVALID_POSITION);
return;
}
int otherBrace = ExpressionEdit->BraceMatch(ExpressionEdit->GetCurrentPos());
if (otherBrace != wxSTC_INVALID_POSITION)
ExpressionEdit->BraceHighlight(ExpressionEdit->GetCurrentPos(), otherBrace);
else
ExpressionEdit->BraceBadLight(ExpressionEdit->GetCurrentPos());
}
/**
* Realtime expression checking
*/
void EditExpressionDialog::TextModified(wxStyledTextEvent& event) {
// Syntax checking
expression = ExpressionEdit->GetText();
gd::CallbacksForExpressionCorrectnessTesting callbacks(project, layout);
gd::ExpressionParser expressionParser(expression);
if (!expressionParser.ParseMathExpression(
project.GetCurrentPlatform(), project, layout, callbacks)) {
errorTxt->SetLabel(expressionParser.GetFirstError());
lastErrorPos = expressionParser.GetFirstErrorPosition();
} else {
errorTxt->SetLabel(_("No errors."));
lastErrorPos = gd::String::npos;
}
errorTxt->Refresh(); // Need to call manually update.
}
void EditExpressionDialog::OnOkBtClick(wxCommandEvent& event) {
gd::CallbacksForExpressionCorrectnessTesting callbacks(project, layout);
gd::ExpressionParser expressionParser(expression);
if (!expressionParser.ParseMathExpression(
project.GetCurrentPlatform(), project, layout, callbacks)) {
if (wxMessageBox(_("The expression is malformed. Are you sure you want to "
"validate this expression\?"),
_("The expression contains one or more errors."),
wxYES_NO | wxICON_EXCLAMATION,
this) == wxNO)
return;
}
EndModal(1);
}
void EditExpressionDialog::RefreshLists() {
ObjList->DeleteAllItems();
ObjList->AddRoot(_("All properties"), 0);
ValList->DeleteAllItems();
ValList->AddRoot(_("All special values"), 0);
const vector<std::shared_ptr<PlatformExtension> > extensions =
project.GetCurrentPlatform().GetAllPlatformExtensions();
// Insert extension objects expressions
for (std::size_t i = 0; i < extensions.size(); ++i) {
// Verify if that extension is enabled
if (find(project.GetUsedExtensions().begin(),
project.GetUsedExtensions().end(),
extensions[i]->GetName()) == project.GetUsedExtensions().end())
continue;
std::vector<gd::String> objectsTypes =
extensions[i]->GetExtensionObjectsTypes();
std::vector<gd::String> behaviorsTypes = extensions[i]->GetBehaviorsTypes();
wxTreeItemId extensionItem = ObjList->GetRootItem();
for (std::size_t j = 0; j < objectsTypes.size(); ++j) {
wxTreeItemId objectTypeItem =
objectsTypes[j] == ""
? ObjList->AppendItem(extensionItem, _("All objects"), 0)
: ObjList->AppendItem(extensionItem,
_("Object") + wxString(" ") +
extensions[i]
->GetObjectMetadata(objectsTypes[j])
.GetFullName(),
0);
// Add each object expression
std::map<gd::String, gd::ExpressionMetadata> allObjExpr =
extensions[i]->GetAllExpressionsForObject(objectsTypes[j]);
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allObjExpr.begin();
it != allObjExpr.end();
++it) {
if (it->second.IsShown()) {
// Search and/or add group item
wxTreeItemIdValue cookie;
wxTreeItemId groupItem =
ObjList->GetFirstChild(objectTypeItem, cookie);
while (groupItem.IsOk() &&
ObjList->GetItemText(groupItem) != it->second.GetGroup()) {
groupItem = ObjList->GetNextSibling(groupItem);
}
if (!groupItem.IsOk())
groupItem =
ObjList->AppendItem(objectTypeItem, it->second.GetGroup(), 0);
// Add expression item
int IDimage = 0;
if (it->second.GetBitmapIcon().IsOk()) {
imageListObj->Add(it->second.GetBitmapIcon());
IDimage = imageListObj->GetImageCount() - 1;
}
gd::TreeItemExpressionMetadata* associatedData =
new gd::TreeItemExpressionMetadata(it->first, it->second);
ObjList->AppendItem(
groupItem, it->second.GetFullName(), IDimage, -1, associatedData);
}
}
}
for (std::size_t j = 0; j < behaviorsTypes.size(); ++j) {
wxTreeItemId behaviorTypeItem =
behaviorsTypes[j] == ""
? ObjList->AppendItem(extensionItem, _("All objects"), 0)
: ObjList->AppendItem(
extensionItem,
_("Behavior") + wxString(" ") +
extensions[i]
->GetBehaviorMetadata(behaviorsTypes[j])
.GetFullName(),
0);
// Add each behavior expression
std::map<gd::String, gd::ExpressionMetadata> allAutoExpr =
extensions[i]->GetAllExpressionsForBehavior(behaviorsTypes[j]);
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allAutoExpr.begin();
it != allAutoExpr.end();
++it) {
if (it->second.IsShown()) {
// Search and/or add group item
wxTreeItemIdValue cookie;
wxTreeItemId groupItem =
ObjList->GetFirstChild(behaviorTypeItem, cookie);
while (groupItem.IsOk() &&
ObjList->GetItemText(groupItem) != it->second.GetGroup()) {
groupItem = ObjList->GetNextSibling(groupItem);
}
if (!groupItem.IsOk())
groupItem =
ObjList->AppendItem(behaviorTypeItem, it->second.GetGroup(), 0);
// Add expression item
int IDimage = 0;
if (it->second.GetBitmapIcon().IsOk()) {
imageListObj->Add(it->second.GetBitmapIcon());
IDimage = imageListObj->GetImageCount() - 1;
}
gd::TreeItemExpressionMetadata* associatedData =
new gd::TreeItemExpressionMetadata(it->first, it->second);
ObjList->AppendItem(
groupItem, it->second.GetFullName(), IDimage, -1, associatedData);
}
}
}
// Add each expression
extensionItem = ValList->GetRootItem();
std::map<gd::String, gd::ExpressionMetadata> allExpr =
extensions[i]->GetAllExpressions();
for (std::map<gd::String, gd::ExpressionMetadata>::const_iterator it =
allExpr.begin();
it != allExpr.end();
++it) {
if (it->second.IsShown()) {
// Search and/or add group item
wxTreeItemIdValue cookie;
wxTreeItemId groupItem = ValList->GetFirstChild(extensionItem, cookie);
while (groupItem.IsOk() &&
ValList->GetItemText(groupItem) != it->second.GetGroup()) {
groupItem = ValList->GetNextSibling(groupItem);
}
if (!groupItem.IsOk())
groupItem =
ValList->AppendItem(extensionItem, it->second.GetGroup(), 0);
// Add expression item
int IDimage = 0;
if (it->second.GetBitmapIcon().IsOk()) {
imageListVal->Add(it->second.GetBitmapIcon());
IDimage = imageListVal->GetImageCount() - 1;
}
gd::TreeItemExpressionMetadata* associatedData =
new gd::TreeItemExpressionMetadata(it->first, it->second);
ValList->AppendItem(
groupItem, it->second.GetFullName(), IDimage, -1, associatedData);
}
}
}
ObjList->Expand(ObjList->GetRootItem());
ValList->Expand(ValList->GetRootItem());
}
void EditExpressionDialog::OnPlusBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("+");
}
void EditExpressionDialog::OnMinusBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("-");
}
void EditExpressionDialog::OnMultBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("*");
}
void EditExpressionDialog::OnDivBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("/");
}
void EditExpressionDialog::OnPOBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("(");
}
void EditExpressionDialog::OnPFBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText(")");
}
void EditExpressionDialog::OnCosBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("cos(");
}
void EditExpressionDialog::OnSinBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("sin(");
}
/**
* Show a dialog for completing a parameter
*/
gd::String EditExpressionDialog::ShowParameterDialog(
const gd::ParameterMetadata& parameterMetadata,
bool& userCancelled,
gd::String objectNameAssociated) {
if (parameterMetadata.type == "expression") {
gd::AdvancedTextEntryDialog dialog(this,
_("Parameter"),
parameterMetadata.description,
"0",
AdvancedTextEntryDialog::MathExpression,
&project,
&layout);
if (dialog.ShowModal() == wxOK)
return dialog.text;
else
userCancelled = true;
} else if (parameterMetadata.type == "string") {
gd::AdvancedTextEntryDialog dialog(this,
_("Parameter"),
parameterMetadata.description,
"\"\"",
AdvancedTextEntryDialog::TextExpression,
&project,
&layout);
if (dialog.ShowModal() == wxOK)
return dialog.text;
else
userCancelled = true;
} else if (gd::ParameterMetadata::IsObject(parameterMetadata.type)) {
gd::ChooseObjectDialog dialog(this,
project,
layout,
true,
parameterMetadata.supplementaryInformation);
if (dialog.ShowModal() == 0) return "";
return dialog.GetChosenObject();
} else if (parameterMetadata.type == "layer") {
gd::ChooseLayerDialog dialog(this, layout);
if (dialog.ShowModal() == 0) return "";
return dialog.GetChosenLayer();
} else if (parameterMetadata.type == "scenevar") {
gd::ChooseVariableDialog dialog(this, layout.GetVariables());
dialog.SetAssociatedLayout(&project, &layout);
if (dialog.ShowModal() == 0) return "";
return dialog.GetSelectedVariable();
} else if (parameterMetadata.type == "globalvar") {
gd::ChooseVariableDialog dialog(this, project.GetVariables());
dialog.SetAssociatedProject(&project);
if (dialog.ShowModal() == 0) return "";
return dialog.GetSelectedVariable();
} else if (parameterMetadata.type == "objectvar") {
gd::Object* object = NULL;
if (layout.HasObjectNamed(objectNameAssociated))
object = &layout.GetObject(objectNameAssociated);
else if (project.HasObjectNamed(objectNameAssociated))
object = &project.GetObject(objectNameAssociated);
else
return wxGetTextFromUser(
parameterMetadata.description, _("Variable"), "", this);
gd::ChooseVariableDialog dialog(this, object->GetVariables());
dialog.SetAssociatedObject(&project, &layout, object);
if (dialog.ShowModal() == 1) return dialog.GetSelectedVariable();
return "";
} else if (parameterMetadata.type == "camera") {
gd::String param = wxGetTextFromUser(
parameterMetadata.description, _("Camera number"), "0", this);
return param;
} else {
gd::String param = wxGetTextFromUser(
parameterMetadata.description, _("Parameter"), "", this);
return param;
}
return "";
}
void EditExpressionDialog::OnAddPropBtClick(wxCommandEvent& event) {
if (!itemObj.IsOk()) return;
gd::TreeItemExpressionMetadata* infos =
dynamic_cast<gd::TreeItemExpressionMetadata*>(
ObjList->GetItemData(itemObj));
if (infos != NULL) {
if (infos->GetExpressionMetadata().parameters.empty())
return; // Not even a parameter for the object ?
bool cancelled = false;
gd::String object = ShowParameterDialog(
infos->GetExpressionMetadata().parameters[0], cancelled);
if (cancelled) return;
// Add parameters
gd::String parametersStr, behaviorStr;
for (std::size_t i = 1;
i < infos->GetExpressionMetadata().parameters.size();
++i) {
if (infos->GetExpressionMetadata().parameters[i].codeOnly) continue;
if (i == 1 &&
infos->GetExpressionMetadata().parameters[i].type == "behavior") {
gd::ChooseBehaviorDialog dialog(this,
project,
layout,
object,
infos->GetExpressionMetadata()
.parameters[i]
.supplementaryInformation);
if (dialog.DeduceBehavior() || dialog.ShowModal() == 1)
behaviorStr = dialog.GetChosenBehavior() +
gd::PlatformExtension::GetNamespaceSeparator();
} else {
if (!parametersStr.empty()) parametersStr += ",";
parametersStr += ShowParameterDialog(
infos->GetExpressionMetadata().parameters[i], cancelled, object);
if (cancelled) return;
}
}
if (ExpressionEdit->GetText() == "0") ExpressionEdit->SetText("");
ExpressionEdit->AddText(object + "." + behaviorStr + infos->GetName() +
"(" + parametersStr + ")");
return;
}
}
void EditExpressionDialog::OnAddValBtClick(wxCommandEvent& event) {
if (!itemVal.IsOk()) return;
gd::TreeItemExpressionMetadata* infos =
dynamic_cast<gd::TreeItemExpressionMetadata*>(
ValList->GetItemData(itemVal));
if (infos != NULL) {
gd::String parametersStr;
for (std::size_t i = 0;
i < infos->GetExpressionMetadata().parameters.size();
++i) {
if (infos->GetExpressionMetadata().parameters[i].codeOnly) continue;
if (!parametersStr.empty()) parametersStr += ",";
bool userCancelled = false;
parametersStr += ShowParameterDialog(
infos->GetExpressionMetadata().parameters[i], userCancelled);
if (userCancelled) return;
}
if (ExpressionEdit->GetText() == "0") ExpressionEdit->SetText("");
ExpressionEdit->AddText(infos->GetName() + "(" + parametersStr + ")");
return;
}
}
void EditExpressionDialog::OnObjListItemActivated(wxTreeEvent& event) {
itemObj = event.GetItem();
}
void EditExpressionDialog::OnObjListItemDoubleClicked(wxTreeEvent& event) {
itemObj = event.GetItem();
wxCommandEvent uselessEvent;
OnAddPropBtClick(uselessEvent);
}
void EditExpressionDialog::OnValListItemActivated(wxTreeEvent& event) {
itemVal = event.GetItem();
}
void EditExpressionDialog::OnValListItemDoubleClicked(wxTreeEvent& event) {
itemVal = event.GetItem();
wxCommandEvent uselessEvent;
OnAddValBtClick(uselessEvent);
}
void EditExpressionDialog::OnButton2Click(wxCommandEvent& event) {
ExpressionEdit->AddText("pow(x,n)");
}
void EditExpressionDialog::OnButton3Click(wxCommandEvent& event) {
ExpressionEdit->AddText("exp(");
}
void EditExpressionDialog::OnBitmapButton2Click(wxCommandEvent& event) {
ExpressionEdit->AddText("sqrt(");
}
void EditExpressionDialog::OnBitmapButton1Click(wxCommandEvent& event) {
ExpressionEdit->AddText("nthroot(x,n)");
}
void EditExpressionDialog::OnButton4Click(wxCommandEvent& event) {
ExpressionEdit->AddText("exp(");
}
void EditExpressionDialog::OnButton1Click(wxCommandEvent& event) {
ExpressionEdit->AddText("log(");
}
void EditExpressionDialog::OnButton5Click(wxCommandEvent& event) {
ExpressionEdit->AddText("tan(");
}
void EditExpressionDialog::OnButton6Click(wxCommandEvent& event) {
ExpressionEdit->AddText("abs(");
}
void EditExpressionDialog::OnButton7Click(wxCommandEvent& event) {
ExpressionEdit->AddText("acos(");
}
void EditExpressionDialog::OnButton8Click(wxCommandEvent& event) {
ExpressionEdit->AddText("asin(");
}
void EditExpressionDialog::OnButton9Click(wxCommandEvent& event) {
ExpressionEdit->AddText("atan(");
}
void EditExpressionDialog::OnintBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("int(");
}
void EditExpressionDialog::OnerrorTxtClick(wxCommandEvent& event) {
if (lastErrorPos != gd::String::npos) ExpressionEdit->GotoPos(lastErrorPos);
}
void EditExpressionDialog::OnButton21Click(wxCommandEvent& event) {
ExpressionEdit->AddText("log10(");
}
void EditExpressionDialog::OnButton14Click(wxCommandEvent& event) {
ExpressionEdit->AddText("floor(");
}
void EditExpressionDialog::OnceilBtClick(wxCommandEvent& event) {
ExpressionEdit->AddText("ceil(");
}
void EditExpressionDialog::OnButton10Click(wxCommandEvent& event) {
ExpressionEdit->AddText("acosh(");
}
void EditExpressionDialog::OnButton11Click(wxCommandEvent& event) {
ExpressionEdit->AddText("asinh(");
}
void EditExpressionDialog::OnButton12Click(wxCommandEvent& event) {
ExpressionEdit->AddText("atanh(");
}
void EditExpressionDialog::OnButton18Click(wxCommandEvent& event) {
ExpressionEdit->AddText("sec(");
}
void EditExpressionDialog::OnButton19Click(wxCommandEvent& event) {
ExpressionEdit->AddText("csc(");
}
void EditExpressionDialog::OnButton20Click(wxCommandEvent& event) {
ExpressionEdit->AddText("cot(");
}
void EditExpressionDialog::OnButton15Click(wxCommandEvent& event) {
ExpressionEdit->AddText("tanh(");
}
void EditExpressionDialog::OnButton16Click(wxCommandEvent& event) {
ExpressionEdit->AddText("sinh(");
}
void EditExpressionDialog::OnButton17Click(wxCommandEvent& event) {
ExpressionEdit->AddText("cosh(");
}
void EditExpressionDialog::OnhelpBtClick(wxCommandEvent& event) {
gd::HelpFileAccess::Get()->OpenPage(
"game_develop/documentation/manual/edit_expr");
}
} // namespace gd
#endif