Aegisub/traydict/dict_window.cpp

244 lines
7.6 KiB
C++

// Copyright (c) 2006, 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 TrayDict 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.
//
// -----------------------------------------------------------------------------
//
// TRAYDICT
//
// Website: http://aegisub.cellosoft.com
// Contact: mailto:zeratul@cellosoft.com
//
///////////
// Headers
#include <wx/wxprec.h>
#include <wx/taskbar.h>
#include "dict_window.h"
#include "systray.h"
#include "dictionary.h"
#include "dictionary_display.h"
#include "main.h"
///////////////
// Constructor
DictWindow::DictWindow()
: wxFrame(NULL,-1,_T("TrayDict v1.00 - EXPERIMENTAL - By Rodrigo Braz Monteiro"),wxDefaultPosition,wxSize(620,500),wxRESIZE_BORDER | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN)
{
// Icons
SetIcon(wxICON(wxicon));
systray = new Systray(this);
// Menu bar
//menu = new wxMenuBar();
//SetMenuBar(menu);
// Status bar
//wxStatusBar *bar = CreateStatusBar(3,0);
//int widths[] = { 85, -1, -1 };
//bar->SetStatusWidths(3,widths);
// Panel
wxPanel *panel = new wxPanel(this);
// Manager
manager = new wxAuiManager(this);
// Search bar
entry = new wxComboBox(panel,ENTRY_FIELD,_T(""),wxDefaultPosition,wxDefaultSize,0,NULL,wxCB_DROPDOWN | wxTE_PROCESS_ENTER);
wxButton *searchButton = new wxButton(panel,BUTTON_SEARCH,_T("Search"),wxDefaultPosition,wxSize(80,-1));
wxSizer *entrySizer = new wxBoxSizer(wxHORIZONTAL);
entrySizer->Add(entry,1,wxEXPAND | wxRIGHT,5);
entrySizer->Add(searchButton,0,wxEXPAND,0);
// Options
checkKanji = new wxCheckBox(panel,CHECK_KANJI,_T("Kanji"));
checkKana = new wxCheckBox(panel,CHECK_KANA,_T("Kana"));
checkRomaji = new wxCheckBox(panel,CHECK_ROMAJI,_T("Romaji"));
checkEnglish = new wxCheckBox(panel,CHECK_ENGLISH,_T("English"));
checkEdict = new wxCheckBox(panel,CHECK_ENGLISH,_T("EDICT"));
checkEnamdict = new wxCheckBox(panel,CHECK_ENGLISH,_T("ENAMDICT"));
checkCompdic = new wxCheckBox(panel,CHECK_ENGLISH,_T("COMPDIC"));
checkJplaces = new wxCheckBox(panel,CHECK_ENGLISH,_T("J_PLACES"));
checkKanji->SetValue(true);
checkKana->SetValue(true);
checkRomaji->SetValue(true);
checkEnglish->SetValue(true);
checkEdict->SetValue(true);
checkEnamdict->SetValue(false);
checkCompdic->SetValue(false);
checkJplaces->SetValue(false);
wxSizer *optionsSizer = new wxBoxSizer(wxHORIZONTAL);
optionsSizer->Add(new wxStaticText(panel,-1,_T("Display:")),0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkKanji,0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkKana,0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkRomaji,0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkEnglish,0,wxCENTER | wxRIGHT,20);
optionsSizer->Add(new wxStaticText(panel,-1,_T("Dictionary:")),0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkEdict,0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkEnamdict,0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkCompdic,0,wxCENTER | wxRIGHT,5);
optionsSizer->Add(checkJplaces,0,wxCENTER | wxRIGHT,0);
optionsSizer->AddStretchSpacer(1);
// Upper pane
wxSizer *searchSizer = new wxBoxSizer(wxVERTICAL);
searchSizer->Add(entrySizer,0,wxEXPAND | wxALL,5);
searchSizer->Add(optionsSizer,0,wxEXPAND | wxALL,5);
panel->SetSizer(searchSizer);
manager->AddPane(panel,wxTOP,_("Search"));
wxAuiPaneInfo &searchPane = manager->GetPane(panel);
searchPane.MinSize(searchSizer->GetMinSize());
searchPane.FloatingSize(searchSizer->GetMinSize());
searchPane.Resizable(false);
searchPane.RightDockable(false);
searchPane.LeftDockable(false);
searchPane.CloseButton(false);
// Results
results = new DictionaryDisplay(this);
manager->AddPane(results,wxCENTER,_("Results"));
manager->Update();
results->InitGecko();
// Create dictionary files
if (false) {
Dictionary::Convert(TrayDict::folderName + _T("edict"),TrayDict::folderName + _T("edict.dic"));
Dictionary::Convert(TrayDict::folderName + _T("enamdict"),TrayDict::folderName + _T("enamdict.dic"));
Dictionary::Convert(TrayDict::folderName + _T("compdic"),TrayDict::folderName + _T("compdic.dic"));
Dictionary::Convert(TrayDict::folderName + _T("j_places"),TrayDict::folderName + _T("j_places.dic"));
}
// Load dictionary files
dict.push_back(new Dictionary(_T("edict"),checkEdict));
dict.push_back(new Dictionary(_T("enamdict"),checkEnamdict));
dict.push_back(new Dictionary(_T("compdic"),checkCompdic));
dict.push_back(new Dictionary(_T("j_places"),checkJplaces));
// Register hotkey
RegisterHotKey(HOTKEY_ID,wxMOD_WIN,'Z');
}
//////////////
// Destructor
DictWindow::~DictWindow() {
if (systray->IsOk()) {
systray->RemoveIcon();
}
delete systray;
for (size_t i=0;i<dict.size();i++) delete dict[i];
dict.clear();
}
/////////////////
// Go to systray
void DictWindow::GoToTray() {
if (systray->IsOk()) {
Hide();
}
}
///////////////
// Event table
BEGIN_EVENT_TABLE(DictWindow,wxFrame)
EVT_ICONIZE(DictWindow::OnIconize)
EVT_BUTTON(BUTTON_SEARCH,DictWindow::OnSearch)
EVT_TEXT_ENTER(ENTRY_FIELD,DictWindow::OnSearch)
EVT_HOTKEY(HOTKEY_ID,DictWindow::OnHotkey)
//EVT_CLOSE(DictWindow::OnClose)
END_EVENT_TABLE()
/////////////////
// Iconize event
void DictWindow::OnIconize(wxIconizeEvent &event) {
if (event.Iconized()) {
GoToTray();
}
}
//////////////////
// Hotkey pressed
void DictWindow::OnHotkey(wxKeyEvent &event) {
if (IsShown()) GoToTray();
else systray->BringUp();
}
/////////////////////////
// Search button pressed
void DictWindow::OnSearch(wxCommandEvent &event) {
Search(entry->GetValue());
}
//////////
// Search
void DictWindow::Search(wxString text) {
// Prepare
int bitmask = (checkKanji->GetValue() ? 1 : 0) | (checkKana->GetValue() ? 2 : 0) | (checkRomaji->GetValue() ? 4 : 0) | (checkEnglish->GetValue() ? 8 : 0);
// Clear text
results->ResultsStart();
entry->SetSelection(0,entry->GetValue().Length());
// Search each dictionary
for (size_t i=0;i<dict.size();i++) {
if (dict[i]->check->GetValue() && dict[i]->check->IsEnabled()) {
// Search
ResultSet res;
dict[i]->Search(res,text);
// Sort results by relevance
res.results.sort();
// Print
results->PrintResults(res);
}
}
// Done
results->ResultsDone();
}
////////////////
// Close window
void DictWindow::OnClose(wxCloseEvent &event) {
if (event.CanVeto()) {
event.Veto();
GoToTray();
}
else Destroy();
}