diff --git a/aegisub/Makefile.am b/aegisub/Makefile.am index c2edee1eb..22a893893 100644 --- a/aegisub/Makefile.am +++ b/aegisub/Makefile.am @@ -163,6 +163,7 @@ aegisub_SOURCES = \ export_framerate.cpp \ export_visible_lines.cpp \ fft.cpp \ + font_file_lister.cpp \ frame_main.cpp \ frame_main_events.cpp \ gl_text.cpp \ diff --git a/aegisub/dialog_attachments.cpp b/aegisub/dialog_attachments.cpp index c5e893608..92e32002b 100644 --- a/aegisub/dialog_attachments.cpp +++ b/aegisub/dialog_attachments.cpp @@ -76,6 +76,7 @@ DialogAttachments::DialogAttachments(wxWindow *parent) mainSizer->Add(buttonSizer,0,wxALL | wxEXPAND,5); mainSizer->SetSizeHints(this); SetSizer(mainSizer); + CenterOnParent(); } diff --git a/aegisub/dialog_fonts_collector.cpp b/aegisub/dialog_fonts_collector.cpp index 04bb2e9dd..53ff681d6 100644 --- a/aegisub/dialog_fonts_collector.cpp +++ b/aegisub/dialog_fonts_collector.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2005, Rodrigo Braz Monteiro +// Copyright (c) 2007, Rodrigo Braz Monteiro // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -40,9 +40,6 @@ #include #include #include -#ifdef __WINDOWS__ -#include -#endif #include "ass_override.h" #include "ass_file.h" #include "ass_dialogue.h" @@ -53,6 +50,17 @@ #include "frame_main.h" #include "subs_grid.h" #include "main.h" +#include "font_file_lister.h" +#include "utils.h" + + +/////// +// IDs +enum IDs { + START_BUTTON = 1150, + BROWSE_BUTTON, + RADIO_BOX +}; /////////////// @@ -71,11 +79,6 @@ DialogFontsCollector::DialogFontsCollector(wxWindow *parent) } DestBox = new wxTextCtrl(this,-1,dest,wxDefaultPosition,wxSize(250,20),0); BrowseButton = new wxButton(this,BROWSE_BUTTON,_("&Browse...")); - AttachmentCheck = new wxCheckBox(this,ATTACHMENT_CHECK,_("As attachments"),wxDefaultPosition); - AttachmentCheck->SetValue(Options.AsBool(_T("Fonts Collector Attachment"))); - ArchiveCheck = new wxCheckBox(this,ARCHIVE_CHECK,_("As a zipped archive"),wxDefaultPosition); - ArchiveCheck->SetValue(Options.AsBool(_T("Fonts Collector Archive"))); - if (ArchiveCheck->GetValue()) AttachmentCheck->SetValue(false); wxSizer *DestBottomSizer = new wxBoxSizer(wxHORIZONTAL); DestLabel = new wxStaticText(this,-1,_("Choose the folder where the fonts will be collected to.\nIt will be created if it doesn't exist.")); DestBottomSizer->Add(DestBox,1,wxEXPAND | wxRIGHT,5); @@ -83,11 +86,23 @@ DialogFontsCollector::DialogFontsCollector(wxWindow *parent) wxSizer *DestSizer = new wxStaticBoxSizer(wxVERTICAL,this,_("Destination")); DestSizer->Add(DestLabel,0,wxEXPAND | wxBOTTOM,5); DestSizer->Add(DestBottomSizer,0,wxEXPAND,0); - DestSizer->Add(AttachmentCheck,0,wxTOP,5); - DestSizer->Add(ArchiveCheck,0,wxTOP,5); + + // Action radio box + wxArrayString choices; + choices.Add(_T("Check fonts for availability")); + choices.Add(_T("Copy fonts to folder")); + choices.Add(_T("Copy fonts to zipped archive")); + choices.Add(_T("Attach fonts to current subtitles")); + CollectAction = new wxRadioBox(this,RADIO_BOX,_T("Action"),wxDefaultPosition,wxDefaultSize,choices,1); // Log box - LogBox = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(300,210),wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH); + LogBox = new wxStyledTextCtrl(this,-1,wxDefaultPosition,wxSize(300,210),0,_T("")); + LogBox->SetWrapMode(wxSTC_WRAP_WORD); + LogBox->SetMarginWidth(1,0); + LogBox->SetReadOnly(true); + LogBox->StyleSetForeground(1,wxColour(0,200,0)); + LogBox->StyleSetForeground(2,wxColour(200,0,0)); + LogBox->StyleSetForeground(3,wxColour(200,100,0)); wxSizer *LogSizer = new wxStaticBoxSizer(wxVERTICAL,this,_("Log")); LogSizer->Add(LogBox,1,wxEXPAND,0); @@ -107,6 +122,7 @@ DialogFontsCollector::DialogFontsCollector(wxWindow *parent) // Main sizer wxSizer *MainSizer = new wxBoxSizer(wxVERTICAL); + MainSizer->Add(CollectAction,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5); MainSizer->Add(DestSizer,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5); MainSizer->Add(LogSizer,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5); MainSizer->Add(ButtonSizer,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5); @@ -114,6 +130,7 @@ DialogFontsCollector::DialogFontsCollector(wxWindow *parent) // Set sizer SetSizer(MainSizer); MainSizer->SetSizeHints(this); + CenterOnParent(); // Run dummy event to update label Update(); @@ -123,45 +140,17 @@ DialogFontsCollector::DialogFontsCollector(wxWindow *parent) ////////////// // Destructor DialogFontsCollector::~DialogFontsCollector() { + FontFileLister::ClearData(); } -//////////////////////////////// -// Get fonts from ass overrides -void FontsCollectorThread::GetFonts (wxString tagName,int par_n,AssOverrideParameter *param,void *usr) { - if (tagName == _T("\\fn")) { - instance->AddFont(param->AsText(),false); - } -} - - -/////////////// -// Adds a font -void FontsCollectorThread::AddFont(wxString fontname,bool isStyle) { - if (fonts.Index(fontname) == wxNOT_FOUND) { - fonts.Add(fontname); - - // Dialogue - if (!isStyle) { - collector->LogBox->AppendText(wxString(_T("\"")) + fontname + _("\" found on dialogue line ") + wxString::Format(_T("%i"),curLine) + _T(".\n")); - } - } -} - - -/////////////////// -// Static instance -FontsCollectorThread *FontsCollectorThread::instance; - - /////////////// // Event table BEGIN_EVENT_TABLE(DialogFontsCollector, wxDialog) EVT_BUTTON(START_BUTTON,DialogFontsCollector::OnStart) EVT_BUTTON(BROWSE_BUTTON,DialogFontsCollector::OnBrowse) EVT_BUTTON(wxID_CLOSE,DialogFontsCollector::OnClose) - EVT_CHECKBOX(ATTACHMENT_CHECK,DialogFontsCollector::OnCheckAttach) - EVT_CHECKBOX(ARCHIVE_CHECK,DialogFontsCollector::OnCheckArchive) + EVT_RADIOBOX(RADIO_BOX,DialogFontsCollector::OnRadio) END_EVENT_TABLE() @@ -171,19 +160,24 @@ void DialogFontsCollector::OnStart(wxCommandEvent &event) { // Check if it's OK to do it wxString foldername = DestBox->GetValue(); wxFileName folder(foldername); - bool zipOut = ArchiveCheck->IsChecked(); + int action = CollectAction->GetSelection(); // Make folder if it doesn't exist - if (!zipOut && !folder.DirExists()) folder.Mkdir(0777,wxPATH_MKDIR_FULL); + if (action == 1 && !folder.DirExists()) { + folder.Mkdir(0777,wxPATH_MKDIR_FULL); + if (!folder.DirExists()) { + wxMessageBox(_("Invalid destination"),_("Error"),wxICON_EXCLAMATION | wxOK); + return; + } + } - // Start - if (zipOut || folder.DirExists()) { - // Start thread - wxThread *worker = new FontsCollectorThread(AssFile::top,foldername,this); - worker->Create(); - worker->Run(); + // Start thread + wxThread *worker = new FontsCollectorThread(AssFile::top,foldername,this); + worker->Create(); + worker->Run(); - // Set options + // Set options + if (action == 1 || action == 2) { wxString dest = foldername; wxFileName filename(AssFile::top->filename); if (filename.GetPath() == dest) { @@ -191,21 +185,16 @@ void DialogFontsCollector::OnStart(wxCommandEvent &event) { } Options.SetText(_T("Fonts Collector Destination"),dest); Options.Save(); - - // Set buttons - StartButton->Enable(false); - BrowseButton->Enable(false); - DestBox->Enable(false); - CloseButton->Enable(false); - AttachmentCheck->Enable(false); - ArchiveCheck->Enable(false); - if (!worker->IsDetached()) worker->Wait(); } - // Folder not available - else { - wxMessageBox(_("Invalid destination"),_("Error"),wxICON_EXCLAMATION | wxOK); - } + // Set buttons + StartButton->Enable(false); + BrowseButton->Enable(false); + DestBox->Enable(false); + CloseButton->Enable(false); + CollectAction->Enable(false); + DestLabel->Enable(false); + if (!worker->IsDetached()) worker->Wait(); } @@ -220,7 +209,7 @@ void DialogFontsCollector::OnClose(wxCommandEvent &event) { // Browse location void DialogFontsCollector::OnBrowse(wxCommandEvent &event) { // Chose file name - if (ArchiveCheck->IsChecked()) { + if (CollectAction->GetSelection()==2) { wxFileName fname(DestBox->GetValue()); wxString dest = wxFileSelector(_("Select archive file name"),DestBox->GetValue(),fname.GetFullName(),_T(".zip"),_T("Zip Archives (*.zip)|*.zip"),wxFD_SAVE|wxFD_OVERWRITE_PROMPT); if (!dest.empty()) { @@ -238,41 +227,34 @@ void DialogFontsCollector::OnBrowse(wxCommandEvent &event) { } -//////////////////// -// Check Attachment -void DialogFontsCollector::OnCheckAttach(wxCommandEvent &event) { - bool check = AttachmentCheck->IsChecked(); - BrowseButton->Enable(!check); - DestBox->Enable(!check); - if (check) { - ArchiveCheck->SetValue(false); - Update(); - } -} - - -///////////////// -// Check Archive -void DialogFontsCollector::OnCheckArchive(wxCommandEvent &event) { - bool check = ArchiveCheck->IsChecked(); - if (check) { - BrowseButton->Enable(check); - DestBox->Enable(check); - } - Update(); +///////////////////// +// Radio box changed +void DialogFontsCollector::OnRadio(wxCommandEvent &event) { + Update(event.GetInt()); } /////////////////// // Update controls -void DialogFontsCollector::Update() { - bool check = ArchiveCheck->IsChecked(); - if (check) { - AttachmentCheck->SetValue(false); - DestLabel->SetLabel(_("Enter the name of the destination zip file to collect the fonts to.\nIf a folder is entered, a default name will be used.")); +void DialogFontsCollector::Update(int value) { + // Get value if -1 + if (value == -1) { + value = CollectAction->GetSelection(); } - else { - // Set label + + // Check + if (value == 0) { + DestBox->Enable(false); + BrowseButton->Enable(false); + DestLabel->SetLabel(_T("N/A\n")); + DestLabel->Enable(false); + } + + // Collect to folder + else if (value == 1) { + DestBox->Enable(true); + BrowseButton->Enable(true); + DestLabel->Enable(true); DestLabel->SetLabel(_("Choose the folder where the fonts will be collected to.\nIt will be created if it doesn't exist.")); // Remove filename from browser box @@ -288,61 +270,29 @@ void DialogFontsCollector::Update() { else DestBox->SetValue(((AegisubApp*)wxTheApp)->folderName); } } -} - -////////////////////// -// Get font filenames -wxArrayString FontsCollectorThread::GetFontFiles (wxString face) { - wxArrayString files; - int n = 0; - - for (FontMap::iterator entry = regFonts.begin();entry != regFonts.end();entry++) { - wxString curData = (*entry).first; - if (face == curData.Left(face.Length())) { - files.Add((*entry).second); - n++; - } + // Collect to zip + else if (value == 2) { + DestBox->Enable(true); + BrowseButton->Enable(true); + DestLabel->Enable(true); + DestLabel->SetLabel(_("Enter the name of the destination zip file to collect the fonts to.\nIf a folder is entered, a default name will be used.")); } - if (n==0) throw wxString(_T("Font not found")); - return files; + // Attach + else if (value == 3) { + DestBox->Enable(false); + BrowseButton->Enable(false); + DestLabel->Enable(false); + DestLabel->SetLabel(_T("N/A\n")); + } } /////////////////////// // Collect font files void FontsCollectorThread::CollectFontData () { -#ifdef __WINDOWS__ - // Prepare key - wxRegKey *reg = new wxRegKey(_T("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts")); - // Try win9x - if (!reg->Exists()) { - delete reg; - reg = new wxRegKey(_T("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts")); - if (!reg->Exists()) { - delete reg; - throw _T("Could not locate fonts directory"); - } - } - wxString curName; - wxString curVal; - long index; - int n = 0; - - // Iterate through - bool ok = reg->GetFirstValue(curName,index); - while (ok) { - reg->QueryValue(curName,curVal); - //AddFontData(curName,curVal); - regFonts[curName] = curVal; - ok = reg->GetNextValue(curName,index); - n++; - } - - // Clean up - delete reg; -#endif + FontFileLister::GatherData(); } @@ -374,54 +324,20 @@ wxThread::ExitCode FontsCollectorThread::Entry() { /////////// // Collect void FontsCollectorThread::Collect() { - // Prepare - bool attaching; - attaching = collector->AttachmentCheck->IsChecked(); - bool zipOut = collector->ArchiveCheck->IsChecked(); - - // Make sure there is a separator at the end - if (!zipOut) destination += _T("\\"); - - // For zipped files, enter a default name if none was given - else { - wxFileName dest(destination); - wxString subsPath = subs->filename; - if (subsPath.IsEmpty()) subsPath = AegisubApp::folderName + _T("/unnamed.ass"); - wxFileName subsname(subsPath); - - // Folder picked - if (dest.IsDir()) { - if (!dest.DirExists()) destination = subsname.GetPath() + _T("/"); - destination += _T("/") + subsname.GetName() + _T(".zip"); - } - - // File picked - else { - if (!dest.DirExists()) destination = subsname.GetPath(); - else destination = dest.GetPath(); - destination += _T("/") + dest.GetName() + _T(".zip"); - } - - // Clean up name - wxFileName finalDest(destination); - destination = finalDest.GetFullPath(); + // Set destination folder + int oper = collector->CollectAction->GetSelection(); + destFolder = collector->DestBox->GetValue(); + if (oper == 1 && !wxFileName::DirExists(destFolder)) { + AppendText(_("Invalid destination directory."),1); + return; } - // Reset log box - wxTextCtrl *LogBox = collector->LogBox; - wxMutexGuiEnter(); - LogBox->SetValue(_T("")); - LogBox->SetDefaultStyle(wxTextAttr(wxColour(0,0,180))); - LogBox->AppendText(_("Searching for fonts in file...\n")); - LogBox->SetDefaultStyle(wxTextAttr(wxColour(0,0,0))); - LogBox->Refresh(); - LogBox->Update(); - wxSafeYield(); - wxMutexGuiLeave(); + // Collect font data + AppendText(_("Collecting font data from system... ")); + CollectFontData(); + AppendText(_("done.\n\nScanning file for fonts...")); - // Scans file - bool fileModified = false; - AssStyle *curStyle; + // Scan file AssDialogue *curDiag; curLine = 0; for (std::list::iterator cur=subs->Line.begin();cur!=subs->Line.end();cur++) { @@ -429,12 +345,6 @@ void FontsCollectorThread::Collect() { curStyle = AssEntry::GetAsStyle(*cur); if (curStyle) { AddFont(curStyle->font,true); - wxMutexGuiEnter(); - LogBox->AppendText(wxString(_T("\"")) + curStyle->font + _("\" found on style \"") + curStyle->name + _T("\".\n")); - LogBox->Refresh(); - LogBox->Update(); - wxSafeYield(); - wxMutexGuiLeave(); } // Collect from dialogue @@ -449,137 +359,148 @@ void FontsCollectorThread::Collect() { } } -#ifdef __WINDOWS__ - // Collect font data - wxMutexGuiEnter(); - LogBox->SetDefaultStyle(wxTextAttr(wxColour(0,0,180))); - LogBox->AppendText(_("\nReading fonts from registry...\n")); - LogBox->SetDefaultStyle(wxTextAttr(wxColour(0,0,0))); - wxSafeYield(); - wxMutexGuiLeave(); - CollectFontData(); - - // Get fonts folder - wxString source; - TCHAR szPath[MAX_PATH]; - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_FONTS,NULL,0,szPath))) { - source = wxString(szPath); + // Copy fonts + AppendText(_("Done.\n\n")); + switch (oper) { + case 0: AppendText(_("Checking fonts...\n")); break; + case 1: AppendText(_("Copying fonts to folder...\n")); break; + case 2: AppendText(_("Copying fonts to archive...\n")); break; + case 3: AppendText(_("Attaching fonts to file...\n")); break; } - else source = wxGetOSDirectory() + _T("\\fonts"); - source += _T("\\"); - - // Open zip stream if saving to compressed archive - wxFFileOutputStream *out = NULL; - wxZipOutputStream *zip = NULL; - if (zipOut) { - out = new wxFFileOutputStream(destination); - zip = new wxZipOutputStream(*out); + bool ok = true; + for (size_t i=0;iSetDefaultStyle(wxTextAttr(wxColour(255,128,0))); - LogBox->AppendText(wxString(_T("\"")) + work[j] + _("\" already exists on destination.\n")); - LogBox->Refresh(); - LogBox->Update(); - wxSafeYield(); - wxMutexGuiLeave(); - } - - // Copy - else { - // Attach to file - bool success; - if (attaching) { - try { - subs->InsertAttachment(srcFile); - fileModified = true; - success = true; - } - catch (...) { success = false; } - } - - // Copy to zip destination - else if (zipOut) { - // Open file - wxFFileInputStream in(srcFile); - - // Write to archive - zip->PutNextEntry(work[j]); - zip->Write(in); - } - - // Copy to destination - else { - success = Copy(srcFile,dstFile); - } - - // Report - wxMutexGuiEnter(); - if (success) { - LogBox->SetDefaultStyle(wxTextAttr(wxColour(0,180,0))); - LogBox->AppendText(wxString(_T("\"")) + work[j] + _("\" copied.\n")); - } - else { - LogBox->SetDefaultStyle(wxTextAttr(wxColour(220,0,0))); - LogBox->AppendText(wxString(_("Failed copying \"")) + srcFile + _T("\".\n")); - } - LogBox->Refresh(); - LogBox->Update(); - wxSafeYield(); - wxMutexGuiLeave(); - } - } - } - } - - catch (...) { - wxMutexGuiEnter(); - LogBox->SetDefaultStyle(wxTextAttr(wxColour(220,0,0))); - LogBox->AppendText(wxString(_("Could not find font ")) + fonts[i] + _T("\n")); - wxMutexGuiLeave(); - } + // Final result + if (ok) { + if (oper == 0) AppendText(_("Done. All fonts found."),1); + else AppendText(_("Done. All fonts copied."),1); } - - // Close ZIP archive - if (zipOut) { - zip->Close(); - delete zip; - delete out; - - wxMutexGuiEnter(); - LogBox->SetDefaultStyle(wxTextAttr(wxColour(0,180,0))); - LogBox->AppendText(wxString::Format(_("Finished writing to %s.\n"),destination.c_str())); - wxMutexGuiLeave(); - } -#endif - - // Flag file as modified - if (fileModified) { - subs->FlagAsModified(_("font attachment")); - collector->main->SubsBox->CommitChanges(); + else { + if (oper == 0) AppendText(_("Done. Some fonts could not be found."),2); + else AppendText(_("Done. Some fonts could not be copied."),2); } } + + +//////////////// +// Process font +bool FontsCollectorThread::ProcessFont(wxString name) { + // Action + int action = collector->CollectAction->GetSelection(); + + // Font name + AppendText(wxString::Format(_T("\"%s\"... "),name.c_str())); + + // Get font list + wxArrayString files = FontFileLister::GetFilesWithFace(name); + bool result = files.Count() != 0; + + // No files found + if (!result) { + AppendText(_("Not found.\n"),2); + return false; + } + + // Just checking, found + else if (action == 0) { + AppendText(_("Found.\n"),1); + return true; + } + + // Copy font + AppendText(_T("\n")); + for (size_t i=0;iAddFont(param->AsText(),false); + } +} + + +/////////////// +// Adds a font +void FontsCollectorThread::AddFont(wxString fontname,bool isStyle) { + if (fonts.Index(fontname) == wxNOT_FOUND) { + fonts.Add(fontname); + + if (isStyle) AppendText(wxString(_T("\"")) + fontname + _("\" found on style \"") + curStyle->name + _T("\".\n")); + if (!isStyle) AppendText(wxString(_T("\"")) + fontname + _("\" found on dialogue line ") + wxString::Format(_T("%i"),curLine) + _T(".\n")); + } +} + + +/////////////// +// Append text +void FontsCollectorThread::AppendText(wxString text,int colour) { + wxStyledTextCtrl *LogBox = collector->LogBox; + wxMutexGuiEnter(); + LogBox->SetReadOnly(false); + int pos = LogBox->GetLength(); + LogBox->AppendText(text); + if (colour) { + LogBox->StartStyling(pos,31); + LogBox->SetStyling(text.Length(),colour); + } + LogBox->GotoPos(pos); + LogBox->SetReadOnly(true); + wxSafeYield(); + wxMutexGuiLeave(); +} + + +/////////////////// +// Static instance +FontsCollectorThread *FontsCollectorThread::instance; diff --git a/aegisub/dialog_fonts_collector.h b/aegisub/dialog_fonts_collector.h index 0f0d5417b..25c0c24c7 100644 --- a/aegisub/dialog_fonts_collector.h +++ b/aegisub/dialog_fonts_collector.h @@ -1,4 +1,4 @@ -// Copyright (c) 2005, Rodrigo Braz Monteiro +// Copyright (c) 2007, Rodrigo Braz Monteiro // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -40,7 +40,7 @@ //////////// // Includes #include -#include +#include ////////////// @@ -51,29 +51,30 @@ class DialogFontsCollector; class FrameMain; -//////////// -// Typedefs -typedef std::map FontMap; - - ///////////////// // Worker thread class FontsCollectorThread : public wxThread { private: AssFile *subs; + AssStyle *curStyle; wxString destination; DialogFontsCollector *collector; int curLine; + wxString destFolder; static FontsCollectorThread *instance; - std::map regFonts; wxArrayString fonts; + bool ProcessFont(wxString fontname); + int CopyFont(wxString filename); + bool ArchiveFont(wxString filename); + bool AttachFont(wxString filename); + void Collect(); - wxArrayString GetFontFiles (wxString face); void AddFont(wxString fontname,bool isStyle); void CollectFontData(); + void AppendText(wxString text,int colour=0); public: FontsCollectorThread(AssFile *subs,wxString destination,DialogFontsCollector *collector); @@ -90,21 +91,19 @@ class DialogFontsCollector : public wxDialog { private: wxTextCtrl *DestBox; - wxTextCtrl *LogBox; + wxStyledTextCtrl *LogBox; wxButton *BrowseButton; wxButton *StartButton; wxButton *CloseButton; - wxCheckBox *AttachmentCheck; - wxCheckBox *ArchiveCheck; wxStaticText *DestLabel; + wxRadioBox *CollectAction; FrameMain *main; void OnStart(wxCommandEvent &event); void OnClose(wxCommandEvent &event); void OnBrowse(wxCommandEvent &event); - void OnCheckAttach(wxCommandEvent &event); - void OnCheckArchive(wxCommandEvent &event); - void Update(); + void OnRadio(wxCommandEvent &event); + void Update(int value=-1); public: DialogFontsCollector(wxWindow *parent); @@ -112,13 +111,3 @@ public: DECLARE_EVENT_TABLE() }; - - -/////// -// IDs -enum { - BROWSE_BUTTON = 1100, - START_BUTTON, - ATTACHMENT_CHECK, - ARCHIVE_CHECK -}; diff --git a/aegisub/font_file_lister.cpp b/aegisub/font_file_lister.cpp new file mode 100644 index 000000000..8b3652200 --- /dev/null +++ b/aegisub/font_file_lister.cpp @@ -0,0 +1,177 @@ +// Copyright (c) 2007, Niels Martin Hansen, Rodrigo Braz Monteiro +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +#pragma once + + +//////////// +// Includes +#include +#include +#ifdef WIN32 +#include +#endif +#include "font_file_lister.h" +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SFNT_NAMES_H + + +//////////////////// +// Static instances +FontFileLister *FontFileLister::instance = NULL; + + +/////////////// +// Constructor +FontFileLister::FontFileLister() { + // Initialize freetype2 + FT_Init_FreeType(&ft2lib); +} + + +////////////// +// Destructor +FontFileLister::~FontFileLister() { +} + + +//////////////////////////////////////// +// Get instance and call function there +wxArrayString FontFileLister::GetFilesWithFace(wxString facename) { + if (!instance) instance = new FontFileLister(); + return instance->DoGetFilesWithFace(facename); +} +void FontFileLister::GatherData() { + if (!instance) instance = new FontFileLister(); + instance->DoGatherData(); +} +void FontFileLister::ClearData() { + if (!instance) instance = new FontFileLister(); + instance->DoClearData(); +} + + +//////////////////////////////////////////////// +// Get list of files that match a specific face +wxArrayString FontFileLister::DoGetFilesWithFace(wxString facename) { + FontMap::iterator iter = fontTable.find(facename); + if (iter != fontTable.end()) return iter->second; + else return wxArrayString(); +} + + +////////////// +// Clear data +void FontFileLister::DoClearData() { + fontFiles.clear(); + fontTable.clear(); +} + + +/////////////////////////// +// Gather data from system +void FontFileLister::DoGatherData() { + // Get fonts folder + wxString source; + #ifdef WIN32 + TCHAR szPath[MAX_PATH]; + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_FONTS,NULL,0,szPath))) { + source = wxString(szPath); + } + else source = wxGetOSDirectory() + _T("\\fonts"); + source += _T("\\"); + #endif + if (source == _T("")) return; + + // Get the list of fonts in the fonts folder + wxArrayString fontfiles; + wxDir::GetAllFiles(source, &fontfiles, wxEmptyString, wxDIR_FILES); + + // Loop through each file + int fterr; + for (unsigned int i=0;ifamily_name, wxConvLocal)); + FT_Done_Face(face); + } + } +} + + +//////////// +// Add font +void FontFileLister::AddFont(wxString filename,wxString facename) { + // Add filename to general list + if (fontFiles.Index(filename) == wxNOT_FOUND) { + fontFiles.Add(filename); + } + + // Add filename to mapping of this face + wxArrayString &arr = fontTable[facename]; + if (arr.Index(filename) == wxNOT_FOUND) arr.Add(filename); +} + + +///////////////////////////////// +// Check if a filename is cached +bool FontFileLister::IsFilenameCached(wxString filename) { + return fontFiles.Index(filename) != wxNOT_FOUND; +} + + +////////////// +// Save cache +void FontFileLister::SaveCache() { + // TODO +} + + +////////////// +// Load cache +void FontFileLister::LoadCache() { + // TODO +} diff --git a/aegisub/font_file_lister.h b/aegisub/font_file_lister.h new file mode 100644 index 000000000..d0e4186bb --- /dev/null +++ b/aegisub/font_file_lister.h @@ -0,0 +1,78 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +#pragma once + + +//////////// +// Includes +#include +#include + + +//////////// +// Typedefs +typedef struct FT_LibraryRec_ *FT_Library; +typedef std::map FontMap; + + +//////////////////// +// Font file lister +class FontFileLister { +private: + static FontFileLister *instance; + FT_Library ft2lib; + + FontMap fontTable; + wxArrayString fontFiles; + + virtual void DoGatherData(); + + FontFileLister(); + virtual ~FontFileLister(); + + wxArrayString DoGetFilesWithFace(wxString facename); + void DoClearData(); + bool IsFilenameCached(wxString filename); + void AddFont(wxString filename,wxString facename); + void SaveCache(); + void LoadCache(); + +public: + static wxArrayString GetFilesWithFace(wxString facename); + static void GatherData(); + static void ClearData(); +}; diff --git a/aegisub/frame_main.cpp b/aegisub/frame_main.cpp index 8a5cb8150..cf84be145 100644 --- a/aegisub/frame_main.cpp +++ b/aegisub/frame_main.cpp @@ -599,7 +599,7 @@ void FrameMain::LoadSubtitles (wxString filename,wxString charset) { // Save wxString backup = path + origfile.GetName() + _T(".ORIGINAL.") + origfile.GetExt(); - Backup(filename,backup); + CopyFile(filename,backup); } // Sync diff --git a/aegisub/utils.cpp b/aegisub/utils.cpp index d5ad6e1c2..de9a6e633 100644 --- a/aegisub/utils.cpp +++ b/aegisub/utils.cpp @@ -66,19 +66,11 @@ int CountMatches(wxString parent,wxString child) { /////////////// // Copy a file -#ifdef __WINDOWS__ -bool Copy(wxString src,wxString dst) { - BOOL result = CopyFile(src.wc_str(),dst.wc_str(),false); - return (result != 0); -} -#endif - -//////////////// -// Backup a file -bool Backup(wxString src,wxString dst) { +bool CopyFile(wxString src,wxString dst) { // Windows #if defined(__WINDOWS__) - return Copy(src,dst); + BOOL result = CopyFile(src.wc_str(),dst.wc_str(),false); + return (result != 0); // Linux #elif defined(__UNIX__) diff --git a/aegisub/utils.h b/aegisub/utils.h index 9813efcce..626fa7052 100644 --- a/aegisub/utils.h +++ b/aegisub/utils.h @@ -54,8 +54,7 @@ typedef std::vector > IntPairVector; __int64 abs64(__int64 input); #endif int CountMatches(wxString parent,wxString child); -bool Copy(wxString src,wxString dst); -bool Backup(wxString src,wxString dst); +bool CopyFile(wxString src,wxString dst); wxString MakeRelativePath(wxString path,wxString reference); wxString DecodeRelativePath(wxString path,wxString reference); wxString PrettyFloat(wxString src);