⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exporter.cpp

📁 非常好用的可移植的多平台C/C++源代码编辑器
💻 CPP
字号:
/***************************************************************
 * Name:      exporter.cpp
 * Purpose:   Code::Blocks plugin
 * Author:    Ceniza<ceniza@gda.utp.edu.co>
 * Copyright: (c) Ceniza
 * License:   GPL
 **************************************************************/

#if defined(__GNUG__) && !defined(__APPLE__)
 #pragma implementation "exporter.h"
#endif

#include "exporter.h"
#include <configmanager.h>
#include <manager.h>
#include <cbeditor.h>
#include <editormanager.h>
#include <editorcolorset.h>
#include <messagemanager.h>
#include <cbexception.h>
#include <licenses.h> // defines some common licenses (like the GPL)
#include "HTMLExporter.h"
#include "RTFExporter.h"
#include "ODTExporter.h"

static int idFileExportHTML = wxNewId();
static int idFileExportRTF = wxNewId();
static int idFileExportODT = wxNewId();

// Implement the plugin's hooks
CB_IMPLEMENT_PLUGIN(Exporter);

BEGIN_EVENT_TABLE(Exporter, cbPlugin)
  EVT_MENU(idFileExportHTML, Exporter::OnExportHTML)
  EVT_MENU(idFileExportRTF, Exporter::OnExportRTF)
  EVT_MENU(idFileExportODT, Exporter::OnExportODT)
  EVT_UPDATE_UI(idFileExportHTML, Exporter::OnUpdateUI)
  EVT_UPDATE_UI(idFileExportRTF, Exporter::OnUpdateUI)
  EVT_UPDATE_UI(idFileExportODT, Exporter::OnUpdateUI)
END_EVENT_TABLE()

Exporter::Exporter()
{
  //ctor
  m_PluginInfo.name = _T("Source HTML, RTF and ODT Exporter");
  m_PluginInfo.title = _("Source HTML, RTF and ODT exporter");
  m_PluginInfo.version = _T("0.4");
  m_PluginInfo.description = _("Plugin to export syntax highlighted source files to HTML, RTF or ODT.");
  m_PluginInfo.author = _T("Ceniza");
  m_PluginInfo.authorEmail = _T("ceniza@gda.utp.edu.co");
  m_PluginInfo.authorWebsite = _T("");
  m_PluginInfo.thanksTo = _("Code::Blocks Development Team");
  m_PluginInfo.license = LICENSE_GPL;
  m_PluginInfo.hasConfigure = false;

  ConfigManager::AddConfiguration(m_PluginInfo.title, _T("/exporter"));
}

Exporter::~Exporter()
{
  //dtor
}

void Exporter::OnAttach()
{
  // do whatever initialization you need for your plugin
  // NOTE: after this function, the inherited member variable
  // m_IsAttached will be TRUE...
  // You should check for it in other functions, because if it
  // is FALSE, it means that the application did *not* "load"
  // (see: does not need) this plugin...
}

void Exporter::OnRelease(bool appShutDown)
{
  // do de-initialization for your plugin
  // if appShutDown is false, the plugin is unloaded because Code::Blocks is being shut down,
  // which means you must not use any of the SDK Managers
  // NOTE: after this function, the inherited member variable
  // m_IsAttached will be FALSE...
}

void Exporter::BuildMenu(wxMenuBar *menuBar)
{
  // find "File" menu position
  int fileMenuPos = menuBar->FindMenu(_("File"));

  if (fileMenuPos == -1)
  {
    cbThrow("Can't find \"File\" menu position?!?");
  }

  // find actual "File" menu
  wxMenu *file = menuBar->GetMenu(fileMenuPos);

  if (!file)
  {
    cbThrow("Can't find \"File\" menu?!?");
  }

  // decide where to insert in "File" menu
  size_t printPos = file->GetMenuItemCount() - 4; // the default location
  int printID = file->FindItem(_("Print..."));

  if (printID != wxNOT_FOUND)
  {
    file->FindChildItem(printID, &printPos);
    ++printPos; // after "Print"
  }

  // insert menu items
  file->Insert(printPos, idFileExportODT, _("Export to ODT"), _("Exports the current file to ODT"));
  file->Insert(printPos, idFileExportRTF, _("Export to RTF"), _("Exports the current file to RTF"));
  file->Insert(printPos, idFileExportHTML, _("Export to HTML"), _("Exports the current file to HTML"));
}

void Exporter::RemoveMenu(wxMenuBar *menuBar)
{
  wxMenu *menu = 0;
  wxMenuItem *itemHTML = menuBar->FindItem(idFileExportHTML, &menu);

  if (menu && itemHTML)
  {
    menu->Remove(itemHTML);
  }

  wxMenuItem *itemRTF = menuBar->FindItem(idFileExportRTF, &menu);

  if (menu && itemRTF)
  {
    menu->Remove(itemRTF);
  }

  wxMenuItem *itemODT = menuBar->FindItem(idFileExportODT, &menu);

  if (menu && itemODT)
  {
    menu->Remove(itemODT);
  }
}

void Exporter::OnUpdateUI(wxUpdateUIEvent &event)
{
  if (Manager::isappShuttingDown())
  {
    event.Skip();
    return;
  }

  wxMenuBar *mbar = Manager::Get()->GetAppWindow()->GetMenuBar();

  if (mbar)
  {
    EditorManager *em = EDMAN();

    // Enabled if there's a source file opened (be sure it isn't the "Start here" page)
    bool disable = !em || !em->GetActiveEditor() || !em->GetBuiltinActiveEditor();
    mbar->Enable(idFileExportHTML, !disable);
    mbar->Enable(idFileExportRTF, !disable);
    mbar->Enable(idFileExportODT, !disable);
  }

  event.Skip();
}

void Exporter::OnExportHTML(wxCommandEvent &event)
{
  HTMLExporter exp;
  ExportFile(&exp, _T("html"), _("HTML files|*.html;*.htm"));
}

void Exporter::OnExportRTF(wxCommandEvent &event)
{
  RTFExporter exp;
  ExportFile(&exp, _T("rtf"), _("RTF files|*.rtf"));
}


void Exporter::OnExportODT(wxCommandEvent &event)
{
  ODTExporter exp;
  ExportFile(&exp, _T("odt"), _("ODT files|*.odt"));
}

void Exporter::ExportFile(BaseExporter *exp, const wxString &default_extension, const wxString &wildcard)
{
  if (!m_IsAttached)
  {
    return;
  }

  EditorManager *em = EDMAN();
  cbEditor *cb = em->GetBuiltinActiveEditor();
  wxString filename = wxFileSelector(_("Choose the filename"), _T(""), _T(""), default_extension, wildcard, wxSAVE | wxOVERWRITE_PROMPT);

  if (filename.IsEmpty())
  {
    return;
  }

  wxScintilla *ed = cb->GetControl();
  wxMemoryBuffer mb = ed->GetStyledText(0, ed->GetLength() - 1);
  EditorColorSet *ecs = cb->GetColorSet();

  exp->Export(filename, cb->GetFilename(), mb, ecs);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -