From 35f2b0f99ed06f29fc6e8837246f74432597ec2d Mon Sep 17 00:00:00 2001 From: Alexander Stigsen Date: Fri, 30 Jul 2010 16:24:21 +0200 Subject: [PATCH] Completed macro saving --- src/BundleItemEditorCtrl.cpp | 2 +- src/BundlePane.cpp | 6 +- src/BundlePane.h | 3 +- src/EditorCtrl.cpp | 4 +- src/EditorFrame.cpp | 4 +- src/Macro.cpp | 30 ++++++++++ src/Macro.h | 41 ++++---------- src/MacroPane.cpp | 4 +- src/e.vcproj | 4 ++ src/plistHandler.cpp | 103 +++++++++++++++++++++++++++++++++++ src/plistHandler.h | 12 ++++ src/tm_syntaxhandler.cpp | 41 +++++++++++++- src/tm_syntaxhandler.h | 1 + 13 files changed, 215 insertions(+), 40 deletions(-) create mode 100644 src/Macro.cpp diff --git a/src/BundleItemEditorCtrl.cpp b/src/BundleItemEditorCtrl.cpp index 5654c2fb..b3c53ff7 100644 --- a/src/BundleItemEditorCtrl.cpp +++ b/src/BundleItemEditorCtrl.cpp @@ -439,7 +439,7 @@ bool BundleItemEditorCtrl::LoadBundleItem(const wxString& bundleUri) { case BUNDLE_MACRO: { PListArray cmdArray; - itemDict.GetArray("commands", cmdArray); + if (!itemDict.GetArray("e_commands", cmdArray)) itemDict.GetArray("commands", cmdArray); const wxString jsonSettings = cmdArray.GetJSON(); cxLOCKDOC_WRITE(m_doc) doc.Insert(0, jsonSettings); diff --git a/src/BundlePane.cpp b/src/BundlePane.cpp index a74ac7e6..38ca71d1 100644 --- a/src/BundlePane.cpp +++ b/src/BundlePane.cpp @@ -17,6 +17,7 @@ #include "Env.h" #include "Execute.h" +#include "Macro.h" #include "images/tmBundle.xpm" #include "images/tmCommand.xpm" @@ -1034,7 +1035,7 @@ bool BundlePane::HasSelection() const { return selItem.IsOk(); } -void BundlePane::NewItem(BundleItemType type) { +void BundlePane::NewItem(BundleItemType type, const eMacro* macro) { const wxTreeItemId selItem = m_bundleTree->GetSelection(); if (!selItem.IsOk()) return; // Can't add item if no bundle const BundleItemData* data = (BundleItemData*)m_bundleTree->GetItemData(selItem); @@ -1055,6 +1056,7 @@ void BundlePane::NewItem(BundleItemType type) { case BUNDLE_DRAGCMD: name = _("New DragCommand"); break; case BUNDLE_PREF: name = _("New Preference"); break; case BUNDLE_LANGUAGE: name = _("New Language"); break; + case BUNDLE_MACRO: name = _("New Macro"); break; default: wxASSERT(false); } name = wxGetTextFromUser(_("Name of new item:"), _("New Item"), name, this); @@ -1086,7 +1088,9 @@ void BundlePane::NewItem(BundleItemType type) { break; case BUNDLE_PREF: case BUNDLE_LANGUAGE: + break; case BUNDLE_MACRO: + if (macro) macro->SaveTo(itemDict); break; default: wxASSERT(false); diff --git a/src/BundlePane.h b/src/BundlePane.h index 8e13fa83..04b5a6ab 100644 --- a/src/BundlePane.h +++ b/src/BundlePane.h @@ -32,6 +32,7 @@ class EditorFrame; class ITmLoadBundles; class wxDragImage; class BundleItemData; +class eMacro; class BundlePane : public wxPanel { public: @@ -39,7 +40,7 @@ class BundlePane : public wxPanel { void LoadBundles(); bool HasSelection() const; - void NewItem(BundleItemType type); + void NewItem(BundleItemType type, const eMacro* macro=NULL); private: class SortTreeCtrl : public wxTreeCtrl { diff --git a/src/EditorCtrl.cpp b/src/EditorCtrl.cpp index 823614dc..2791dfe5 100644 --- a/src/EditorCtrl.cpp +++ b/src/EditorCtrl.cpp @@ -2316,7 +2316,7 @@ unsigned int EditorCtrl::InsertNewline() { void EditorCtrl::InsertChar(const wxChar& text) { if (m_macro.IsRecording()) { eMacroCmd& cmd = lastaction != ACTION_INSERT || m_macro.IsEmpty() || m_macro.Last().GetName() != wxT("InsertChars") - ? m_macro.AddWithStrArg(wxT("InsertChars"), wxT("text"), wxT("")) : m_macro.Last(); + ? m_macro.Add(wxT("InsertChars"), wxT("text"), wxT("")) : m_macro.Last(); cmd.ExtendString(0, text); } @@ -5220,7 +5220,7 @@ void EditorCtrl::ShowCompletionPopup(const wxArrayString& completions) { void EditorCtrl::ReplaceCurrentWord(const wxString& word) { if (m_macro.IsRecording()) { - m_macro.AddWithStrArg(wxT("ReplaceCurrentWord"), wxT("text"), word); + m_macro.Add(wxT("ReplaceCurrentWord"), wxT("text"), word); } const interval iv = GetWordIv(GetPos()); diff --git a/src/EditorFrame.cpp b/src/EditorFrame.cpp index 261d0bbc..9e209a35 100644 --- a/src/EditorFrame.cpp +++ b/src/EditorFrame.cpp @@ -1647,9 +1647,9 @@ void EditorFrame::ShowProjectPane(const wxString& project) { } void EditorFrame::SaveMacro() { - if (!IsBundlePaneShownAndSelected()) return; - + if (!IsBundlePaneShownAndSelected() || m_macro.IsEmpty()) return; + m_bundlePane->NewItem(BUNDLE_MACRO, &m_macro); } bool EditorFrame::IsBundlePaneShownAndSelected() const { diff --git a/src/Macro.cpp b/src/Macro.cpp new file mode 100644 index 00000000..009487a3 --- /dev/null +++ b/src/Macro.cpp @@ -0,0 +1,30 @@ +#include "Macro.h" +#include "plistHandler.h" + +void eMacroCmd::SaveTo(PListArray& arr) const { + PListDict dict = arr.InsertNewDict(arr.GetSize()); + + dict.wxSetString("command", m_cmd); + + if (m_argNames.empty()) return; + PListArray args = dict.NewArray("arguments"); + for (size_t i = 0; i < m_argNames.size(); ++i) { + const wxString& name = m_argNames[i]; + const wxVariant& arg = m_args[i]; + PListArray a = args.InsertNewArray(args.GetSize()); + + a.AddString(name); + if (arg.GetType() == wxT("bool")) a.AddBool(arg.GetBool()); + else if (arg.GetType() == wxT("long")) a.AddInt(arg.GetLong()); + else if (arg.GetType() == wxT("string")) a.AddString(arg.GetString()); + else wxASSERT(false); + } +} + +void eMacro::SaveTo(PListDict& dict) const { + PListArray cmdArray = dict.NewArray("e_commands"); + + for (boost::ptr_vector::const_iterator p = m_cmds.begin(); p != m_cmds.end(); ++p) { + p->SaveTo(cmdArray); + } +} \ No newline at end of file diff --git a/src/Macro.h b/src/Macro.h index c4a94971..7f4060d1 100644 --- a/src/Macro.h +++ b/src/Macro.h @@ -22,6 +22,10 @@ #include #include +// Pre-declarations +class PListDict; +class PListArray; + class eMacroArg { public: eMacroArg(const wxString& name, bool value) : m_name(name), m_value(value) {}; @@ -77,15 +81,8 @@ class eMacroCmd { value = str; } - void AddArg(bool value) {m_args.push_back(wxVariant(value));}; - void AddArg(int value) {m_args.push_back(wxVariant(value));}; - void AddArg(const wxChar* value) {m_args.push_back(wxVariant(value));}; - void AddArg(const wxString& value) {m_args.push_back(wxVariant(value));}; - - void AddArg(const wxString& name, bool value) {m_argNames.push_back(name); m_args.push_back(wxVariant(value));}; - void AddArg(const wxString& name, int value) {m_argNames.push_back(name); m_args.push_back(wxVariant(value));}; - void AddArg(const wxString& name, const wxChar* value) {m_argNames.push_back(name); m_args.push_back(wxVariant(value));}; - void AddArg(const wxString& name, const wxString& value) {m_argNames.push_back(name); m_args.push_back(wxVariant(value));}; + template void AddArg(T value) {m_args.push_back(wxVariant(value));}; + template void AddArg(const wxString& name, T value) {m_argNames.push_back(name); m_args.push_back(wxVariant(value));}; template void SetArg(size_t ndx, const wxString& name, T value) { m_argNames.resize(ndx+1); @@ -93,18 +90,8 @@ class eMacroCmd { m_argNames[ndx] = name; m_args[ndx] = value; }; - /*void SetArg(size_t ndx, const wxString& name, const wxChar* value) { - m_argNames.resize(ndx+1); - m_args.resize(ndx+1); - m_argNames[ndx] = name; - m_args[ndx] = value; - }; - void SetArg(size_t ndx, const wxString& name, const wxString& value) { - m_argNames.resize(ndx+1); - m_args.resize(ndx+1); - m_argNames[ndx] = name; - m_args[ndx] = value; - };*/ + + void SaveTo(PListArray& arr) const; private: wxString m_cmd; @@ -145,15 +132,7 @@ class eMacro { return m_cmds.back(); }; - eMacroCmd& AddWithStrArg(const wxString& cmd, const wxString& arg, const wxString& value) { - wxLogDebug(wxT("Adding macro: %s"), cmd); - m_cmds.push_back(new eMacroCmd(cmd)); - m_cmds.back().AddArg(arg, value); - m_isModified = true; - return m_cmds.back(); - }; - - eMacroCmd& Add(const wxString& cmd, const wxString& arg, bool value) { + template eMacroCmd& Add(const wxString& cmd, const wxString& arg, T value) { wxLogDebug(wxT("Adding macro: %s"), cmd); m_cmds.push_back(new eMacroCmd(cmd)); m_cmds.back().AddArg(arg, value); @@ -161,6 +140,8 @@ class eMacro { return m_cmds.back(); }; + void SaveTo(PListDict& dict) const; + private: bool m_record; diff --git a/src/MacroPane.cpp b/src/MacroPane.cpp index f96e8e5a..a3b53b27 100644 --- a/src/MacroPane.cpp +++ b/src/MacroPane.cpp @@ -54,6 +54,8 @@ MacroPane::MacroPane(EditorFrame& frame, wxWindow* parent, eMacro& macro) m_cmdList = new wxListBox(this, ID_CMDLIST); m_argsGrid = new wxGrid(this, ID_ARG_GRID); + m_buttonSave->SetToolTip(_("Save as Bundle Item\n(select in Bundle Editor)")); + UpdateButtons(); // Configure grid @@ -205,7 +207,7 @@ void MacroPane::OnIdle(wxIdleEvent& WXUNUSED(evt)) { } } - const bool canSave = m_parentFrame.IsBundlePaneShownAndSelected(); + const bool canSave = m_parentFrame.IsBundlePaneShownAndSelected() && !m_macro.IsEmpty(); if (m_buttonSave->IsEnabled() != canSave) m_buttonSave->Enable(canSave); if (m_macro.IsModified()) { diff --git a/src/e.vcproj b/src/e.vcproj index b15783cf..466f60f0 100644 --- a/src/e.vcproj +++ b/src/e.vcproj @@ -1637,6 +1637,10 @@ RelativePath="Lines.h" > + + diff --git a/src/plistHandler.cpp b/src/plistHandler.cpp index 1eb8beff..397715cb 100644 --- a/src/plistHandler.cpp +++ b/src/plistHandler.cpp @@ -2738,6 +2738,44 @@ void PListDict::DeleteItem(const char* key) { m_vDict.RemoveAt(ndx); } +void PListDict::SetBool(const char* key, bool value) { + wxASSERT(m_rPlist); + wxASSERT(key); + + const int ndx = m_vDict.Find(pKey[key]); + if (ndx == -1) { + c4_Row rRef; + pKey(rRef) = key; + pRefType(rRef) = REF_BOOL; + pRef(rRef) = value ? 1 : 0; + m_vDict.Add(rRef); + } + else { + const c4_RowRef rItem = m_vDict[ndx]; + wxASSERT(pRefType(rItem) == REF_BOOL); + pRef(rItem) = value ? 1 : 0; + } +} + +void PListDict::SetInt(const char* key, int value) { + wxASSERT(m_rPlist); + wxASSERT(key); + + const int ndx = m_vDict.Find(pKey[key]); + if (ndx == -1) { + c4_Row rRef; + pKey(rRef) = key; + pRefType(rRef) = REF_INTEGER; + pRef(rRef) = value; + m_vDict.Add(rRef); + } + else { + const c4_RowRef rItem = m_vDict[ndx]; + wxASSERT(pRefType(rItem) == REF_INTEGER); + pRef(rItem) = value; + } +} + void PListDict::SetString(const char* key, const char* text) { wxASSERT(m_rPlist); wxASSERT(key && text); @@ -3000,6 +3038,31 @@ PListArray::PListArray(c4_View& array, c4_RowRef& plist) m_vArrays = pArrays(*m_rPlist); } +bool PListArray::IsBool(unsigned int ndx) const { + wxASSERT(m_rPlist); + wxASSERT((int)ndx < m_vArray.GetSize()); + + const c4_RowRef rItem = m_vArray[ndx]; + return pType(rItem) == REF_BOOL; +} + +bool PListArray::IsInt(unsigned int ndx) const { + wxASSERT(m_rPlist); + wxASSERT((int)ndx < m_vArray.GetSize()); + + const c4_RowRef rItem = m_vArray[ndx]; + return pType(rItem) == REF_INTEGER; +} + +bool PListArray::IsString(unsigned int ndx) const { + wxASSERT(m_rPlist); + wxASSERT((int)ndx < m_vArray.GetSize()); + + const c4_RowRef rItem = m_vArray[ndx]; + return pType(rItem) == REF_STRING; +} + + void PListArray::SetArray(c4_View& array, c4_RowRef& plist) { m_vArray = array; @@ -3011,6 +3074,28 @@ void PListArray::SetArray(c4_View& array, c4_RowRef& plist) { m_vArrays = pArrays(*m_rPlist); } +bool PListArray::GetBool(unsigned int ndx) const { + wxASSERT(m_rPlist); + wxASSERT((int)ndx < m_vArray.GetSize()); + + const c4_RowRef rItem = m_vArray[ndx]; + if (pType(rItem) != REF_BOOL) return false; + + const int ref = pRef(rItem); + return ref != 0; +} + +int PListArray::GetInt(unsigned int ndx) const { + wxASSERT(m_rPlist); + wxASSERT((int)ndx < m_vArray.GetSize()); + + const c4_RowRef rItem = m_vArray[ndx]; + if (pType(rItem) != REF_INTEGER) return false; + + const int ref = pRef(rItem); + return ref; +} + const char* PListArray::GetString(unsigned int ndx) const { wxASSERT(m_rPlist); wxASSERT((int)ndx < m_vArray.GetSize()); @@ -3150,6 +3235,20 @@ void PListArray::InsertString(unsigned int ndx, const char* text) { m_vArray.InsertAt(ndx, rRef); } +void PListArray::AddBool(bool value) { + c4_Row rRef; + pRefType(rRef) = REF_BOOL; + pRef(rRef) = value ? 1 : 0; + m_vArray.Add(rRef); +} + +void PListArray::AddInt(int value) { + c4_Row rRef; + pRefType(rRef) = REF_INTEGER; + pRef(rRef) = value; + m_vArray.Add(rRef); +} + void PListArray::AddString(const char* text) { wxASSERT(text); const int ref = m_vStrings.Add(pString[text]); @@ -3160,6 +3259,10 @@ void PListArray::AddString(const char* text) { m_vArray.Add(rRef); } +void PListArray::AddString(const wxString& text) { + AddString(text.ToUTF8()); +} + wxJSONValue PListArray::GetJSONArray() const { wxJSONValue root; diff --git a/src/plistHandler.h b/src/plistHandler.h index 271ae849..72e0d6b9 100644 --- a/src/plistHandler.h +++ b/src/plistHandler.h @@ -242,6 +242,8 @@ class PListDict : public PListItem { bool GetBool(const char* key) const; void DeleteItem(const char* key); + void SetBool(const char* key, bool value); + void SetInt(const char* key, int value); void SetString(const char* key, const char* text); void wxSetString(const char* key, const wxString& text); @@ -277,6 +279,13 @@ class PListArray : public PListItem { void Clear(); unsigned int GetSize() const {return m_vArray.GetSize();}; + + bool IsBool(unsigned int ndx) const; + bool IsInt(unsigned int ndx) const; + bool IsString(unsigned int ndx) const; + + bool GetBool(unsigned int ndx) const; + int GetInt(unsigned int ndx) const; const char* GetString(unsigned int ndx) const; wxString wxGetString(unsigned int ndx) const; bool GetDict(unsigned int ndx, PListDict& dict) const; @@ -286,7 +295,10 @@ class PListArray : public PListItem { PListDict InsertNewDict(unsigned int ndx); PListArray InsertNewArray(unsigned int ndx); void InsertString(unsigned int ndx, const char* str); + void AddBool(bool value); + void AddInt(int value); void AddString(const char* str); + void AddString(const wxString& text); // Plist <-> JSON conversion (support functions) wxString GetJSON() const; diff --git a/src/tm_syntaxhandler.cpp b/src/tm_syntaxhandler.cpp index c22885b3..458f2380 100644 --- a/src/tm_syntaxhandler.cpp +++ b/src/tm_syntaxhandler.cpp @@ -794,18 +794,55 @@ eMacro TmSyntaxHandler::GetMacroContent(const tmAction& action) const { const PListDict macroDict = m_plistHandler.Get(BUNDLE_MACRO, action.bundle->bundleRef, action.plistRef); PListArray commandArray; - if (macroDict.GetArray("commands", commandArray)) { + if (macroDict.GetArray("e_commands", commandArray)) { PListDict cmdDict; for (size_t i = 0; i < commandArray.GetSize(); ++i) { commandArray.GetDict(i, cmdDict); TranslateMacroCmd(cmdDict, macro); } } + else if (macroDict.GetArray("commands", commandArray)) { + PListDict cmdDict; + for (size_t i = 0; i < commandArray.GetSize(); ++i) { + commandArray.GetDict(i, cmdDict); + TranslateTmMacroCmd(cmdDict, macro); + } + } return macro; } - bool TmSyntaxHandler::TranslateMacroCmd(const PListDict& macroDict, eMacro& macro) const { + const wxString cmdStr = macroDict.wxGetString("command"); + eMacroCmd& cmd = macro.Add(cmdStr); + + PListArray args; + if (!macroDict.GetArray("arguments", args)) return true; + + for (size_t i = 0; i < args.GetSize(); ++i) { + PListArray arg; + if (!args.GetArray(i, arg) || arg.GetSize() != 2) { + wxASSERT(false); + return false; + } + + const wxString name = arg.wxGetString(0); + if (arg.IsBool(1)) cmd.AddArg(name, arg.GetBool(1)); + else if (arg.IsInt(1)) cmd.AddArg(name, arg.GetInt(1)); + else if (arg.IsString(1)) { + const wxString value = arg.wxGetString(1); + cmd.AddArg(name, value); + } + else { + wxASSERT(false); + return false; + } + } + + return true; +} + + +bool TmSyntaxHandler::TranslateTmMacroCmd(const PListDict& macroDict, eMacro& macro) const { const wxString cmdStr = macroDict.wxGetString("command"); PListDict argDict; macroDict.GetDict("argument", argDict); diff --git a/src/tm_syntaxhandler.h b/src/tm_syntaxhandler.h index 2015c7db..73f72e9b 100644 --- a/src/tm_syntaxhandler.h +++ b/src/tm_syntaxhandler.h @@ -335,6 +335,7 @@ class TmSyntaxHandler: // Macro parsing bool ParseMacro(const tmBundle& bundle, unsigned int macroId); bool TranslateMacroCmd(const PListDict& macroDict, eMacro& macro) const; + bool TranslateTmMacroCmd(const PListDict& macroDict, eMacro& macro) const; // Preference parsing bool ParsePreferences(const PListDict& prefDict, tmBundle* bundle);