forked from mia/Aegisub
cf9c0bc8ac
Originally committed to SVN as r1644.
243 lines
7.6 KiB
C++
243 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();
|
|
}
|