view src/mainframe.cpp @ 0:cb3403ca39b1

First release.
author pyon@macmini
date Sun, 30 Aug 2015 21:53:19 +0900
parents
children e4aa0e7a07ad
line wrap: on
line source

// Filename: mainframe.cpp
// Last Change: 2015-08-30 Sun 21:49:16.
//
#include <wx/filedlg.h>
#include <wx/textfile.h>
#include <wx/clipbrd.h>
#include <wx/utils.h>
#include <wx/msgdlg.h>

#include "mainframe.h"
#include "adddialog.h"

// resources
#if !defined(__WXMSW__) && !defined(__WXPM__)
    #include "sample.xpm"
#endif

MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) 
    : wxFrame( parent, id, title, pos, size, style ), m_timer( this, ID_TIMER )
{
	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
    this->SetBackgroundColour( wxColour( wxT("WHEAT") ) );
    SetIcon( wxICON( sample ) );

    // menu bar
	m_menubar = new wxMenuBar( 0 );
	m_menuFile = new wxMenu();
	wxMenuItem* m_menuItemAbout = new wxMenuItem( m_menuFile, ID_MNABOUT, wxString( wxT("About") ), wxEmptyString, wxITEM_NORMAL );
	m_menuFile->Append( m_menuItemAbout );
	
	wxMenuItem* m_menuItemExit = new wxMenuItem( m_menuFile, ID_MNEXIT, wxString( wxT("Exit") ), wxEmptyString, wxITEM_NORMAL );
	m_menuFile->Append( m_menuItemExit );
	
	m_menubar->Append( m_menuFile, wxT("File") ); 
	
	m_menuPlugin = new wxMenu();
	wxMenuItem* m_menuItemLoadPgin = new wxMenuItem( m_menuPlugin, ID_MNLDPGIN, wxString( wxT("Load") ), wxEmptyString, wxITEM_NORMAL );
	m_menuPlugin->Append( m_menuItemLoadPgin );
	
	wxMenuItem* m_menuItemSavePgin = new wxMenuItem( m_menuPlugin, ID_MNSVPGIN, wxString( wxT("Save as") ), wxEmptyString, wxITEM_NORMAL );
	m_menuPlugin->Append( m_menuItemSavePgin );
	
	m_menubar->Append( m_menuPlugin, wxT("Plugin") ); 
	
	this->SetMenuBar( m_menubar );
	
    // controls
	wxBoxSizer* bSizerTop = new wxBoxSizer( wxVERTICAL );

    //
	wxBoxSizer* bSizerShow = new wxBoxSizer( wxHORIZONTAL );

	m_textCtrlShow = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
	bSizerShow->Add( m_textCtrlShow, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );

	m_toggleBtn = new wxToggleButton( this, ID_TGL, wxT("ON"), wxDefaultPosition, wxSize( 60, -1 ), 0 );
	bSizerShow->Add( m_toggleBtn, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );

	bSizerTop->Add( bSizerShow, 0, wxEXPAND, 5 );
	
    //
	wxBoxSizer* bSizerList = new wxBoxSizer( wxHORIZONTAL );
	
	m_listView = new wxListView( this, ID_LIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL );
	bSizerList->Add( m_listView, 1, wxALL|wxEXPAND, 5 );
    wxListItem itemCol;
    itemCol.SetText( wxT("No") );
    m_listView->InsertColumn( 0, itemCol );
    m_listView->SetColumnWidth( 0, 40 );
    itemCol.SetText( wxT("text") );
    m_listView->InsertColumn( 1, itemCol );
    m_listView->SetColumnWidth( 1, 80 );
    itemCol.SetText( wxT("time") );
    m_listView->InsertColumn( 2, itemCol );
    m_listView->SetColumnWidth( 2, 40 );
    itemCol.SetText( wxT("type") );
    m_listView->InsertColumn( 3, itemCol );
    m_listView->SetColumnWidth( 3, 40 );
    itemCol.SetText( wxT("desc") );
    m_listView->InsertColumn( 4, itemCol );
    m_listView->SetColumnWidth( 4, 80 );
    //m_listView->EnableAlternateRowColours( true );
	
	wxBoxSizer* bSizerBtn = new wxBoxSizer( wxVERTICAL );
	
	m_buttonUp = new wxButton( this, ID_BTNUP, wxT("↑"), wxDefaultPosition, wxSize( 40, -1 ), 0 );
	bSizerBtn->Add( m_buttonUp, 0, wxALL, 5 );
	
	m_buttonDown = new wxButton( this, ID_BTNDOWN, wxT("↓"), wxDefaultPosition, wxSize( 40, -1 ), 0 );
	bSizerBtn->Add( m_buttonDown, 0, wxALL, 5 );
	
	m_buttonDel = new wxButton( this, ID_BTNDEL, wxT("-"), wxDefaultPosition, wxSize( 40, -1 ), 0 );
	bSizerBtn->Add( m_buttonDel, 0, wxALL, 5 );
	
	m_buttonAdd = new wxButton( this, ID_BTNADD, wxT("+"), wxDefaultPosition, wxSize( 40, -1 ), 0 );
	bSizerBtn->Add( m_buttonAdd, 0, wxALL, 5 );
	
	bSizerBtn->Add( 0, 0, 1, wxEXPAND, 5 );

	m_buttonExit = new wxButton( this, ID_EXIT, wxT("Exit"), wxDefaultPosition, wxSize( 60, -1 ), 0 );
	bSizerBtn->Add( m_buttonExit, 0, wxALL, 5 );
	
	bSizerList->Add( bSizerBtn, 0, wxEXPAND, 5 );
	bSizerTop->Add( bSizerList, 1, wxEXPAND, 5 );
	
	this->SetSizer( bSizerTop );
	this->Layout();

	this->Centre( wxBOTH );
}

MainFrame::~MainFrame()
{
}

// Event Table
BEGIN_EVENT_TABLE( MainFrame, wxFrame )
    EVT_MENU( ID_MNABOUT,  MainFrame::OnMNAbout )
    EVT_MENU( ID_MNEXIT,   MainFrame::OnMNExit )
    EVT_MENU( ID_MNLDPGIN, MainFrame::OnMNLoad )
    EVT_MENU( ID_MNSVPGIN, MainFrame::OnMNSaveAs )
    EVT_LIST_ITEM_ACTIVATED( ID_LIST, MainFrame::OnDClickItem )
    EVT_LIST_ITEM_SELECTED( ID_LIST, MainFrame::OnSelectItem )
    EVT_TIMER( ID_TIMER, MainFrame::OnTimer )
    EVT_BUTTON( ID_BTNUP,     MainFrame::OnBtnUp )
    EVT_BUTTON( ID_BTNDOWN,   MainFrame::OnBtnDown )
    EVT_BUTTON( ID_BTNDEL,    MainFrame::OnBtnDel )
    EVT_BUTTON( ID_BTNADD,    MainFrame::OnBtnAdd )
    EVT_BUTTON( ID_EXIT,      MainFrame::OnBtnExit )
    EVT_TOGGLEBUTTON( ID_TGL, MainFrame::OnToggle )
    /*
    EVT_IDLE( MainFrame::OnIdle )
    EVT_CLOSE( MainFrame::OnClose )
    */
END_EVENT_TABLE()

/* Event Handlers & Functions */
// Event Handlers
void MainFrame::OnMNAbout( wxCommandEvent& WXUNUSED(event) )
{
    wxInfoMessageBox( this );
}

void MainFrame::OnMNExit( wxCommandEvent& WXUNUSED(event) )
{
    Close();
}

void MainFrame::OnMNLoad( wxCommandEvent& WXUNUSED(event) )
{
    wxString plugin_dir = wxGetCwd() + wxFILE_SEP_PATH + wxT("plugin");
    wxFileDialog fd( this, wxT("Select Plug-in file"), plugin_dir, wxEmptyString, wxT("Plug-in files (*.qbrd)|*.qbrd"), wxFD_OPEN|wxFD_FILE_MUST_EXIST );
    if ( fd.ShowModal() == wxID_CANCEL ) return;     // the user changed idea...     

    wxTextFile file;
    file.Open( fd.GetPath() );
    m_listView->DeleteAllItems();
    for ( int i = 0, n = 0; i < file.GetLineCount(); i++ ) {
        if ( file[i].StartsWith( wxT("#") ) ) 
            continue;
        wxArrayString s = wxSplit( file[i], ',', '\\' );

        m_listView->InsertItem( n, wxString::Format( wxT("%d"), n + 1 ) );
        m_listView->SetItem( n, 1, s[0] );
        m_listView->SetItem( n, 2, s[1] );
        m_listView->SetItem( n, 3, s[2] );
        n++;
    }
    file.Close();

    m_current = 0;
    m_last = m_listView->GetItemText( m_current, 1 );
    m_listView->SetItemState( m_current, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
}

void MainFrame::OnMNSaveAs( wxCommandEvent& WXUNUSED(event) )
{
    wxString plugin_dir = wxGetCwd() + wxFILE_SEP_PATH + wxT("plugin");
    wxFileDialog fd( this, wxT("Save Plug-in file"), plugin_dir , wxEmptyString, wxT("Plug-in files (*.qbrd)|*.qbrd"), wxFD_SAVE|wxFD_OVERWRITE_PROMPT );
    if ( fd.ShowModal() == wxID_CANCEL ) return;     // the user changed idea...     
    
    wxTextFile file( fd.GetPath() );
    if ( file.Exists() ) {
        file.Open();
        file.Clear();
    }
    else {
        file.Create();
    }
    for ( int r = 0; r < m_listView->GetItemCount(); r++ ) {
        wxArrayString s;
        for ( int c = 0; c < m_listView->GetColumnCount(); c++ ) {
            s.Add( m_listView->GetItemText( r, c ) );
        }
        file.AddLine( wxJoin( s, ',', '\\' ) );
    }
    file.Write();
    file.Close();
}

void MainFrame::OnDClickItem( wxListEvent& event )
{
    long i = event.GetIndex();
}

void MainFrame::OnSelectItem( wxListEvent& event )
{
    long i = event.GetIndex();
    m_current = i;
}

// ↑
void MainFrame::OnBtnUp( wxCommandEvent& WXUNUSED(event) )
{
    long item = -1;
    item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
    if ( item == -1 || item == 0 ) return;
    SwapListItem( item, item - 1 );
    ReNumberList();
}

// ↓
void MainFrame::OnBtnDown( wxCommandEvent& WXUNUSED(event) )
{
    long item = -1;
    item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
    if ( item == -1 || item == m_listView->GetItemCount() - 1 ) return;
    SwapListItem( item, item + 1 );
    ReNumberList();
}

// −
void MainFrame::OnBtnDel( wxCommandEvent& WXUNUSED(event) )
{
    long item = -1;
    for ( ;; ) {
        item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
        if ( item == -1 ) break;
        m_listView->DeleteItem( item );
        ReNumberList();
    }
}

// +
void MainFrame::OnBtnAdd( wxCommandEvent& WXUNUSED(event) )
{
    long item = -1;
    for ( ;; ) {
        item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
        if ( item == -1 ) break;
        m_listView->InsertItem( item + 1, wxEmptyString );
        ReNumberList();
    }
    /*
    AddDialog adlg( this, wxID_ANY, wxT("a"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE );
    if ( adlg.ShowModal() == wxID_OK ) {
    }
    */
}

void MainFrame::OnTimer( wxTimerEvent& WXUNUSED(event) )
{
    if ( wxTheClipboard->Open() ) {

        wxTextDataObject data;
        wxTheClipboard->GetData( data );
        wxString s = data.GetText();
        if ( !m_last.IsSameAs( s ) ) {    // the clipboard was changed by user
            wxTheClipboard->Close();
            m_textCtrlShow->SetValue( s );
            for ( int r = 0; r < m_listView->GetItemCount(); r++ )
                m_listView->SetItemState( r, 0, wxLIST_STATE_SELECTED );
            m_counter = 5;
            m_current = 0;
            m_last = s;
            m_timer.StartOnce( (int)m_counter * 1000 );
            return;
        }

        wxString text = m_listView->GetItemText( m_current, 1 );
        wxTheClipboard->SetData( new wxTextDataObject( text ) );
        wxTheClipboard->Close();
        m_textCtrlShow->SetValue( text );
        m_listView->SetItemState( ( m_current + m_listView->GetItemCount() ) % m_listView->GetItemCount() - 1, 0, wxLIST_STATE_SELECTED );
        m_listView->SetItemState( m_current, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
        m_last = text;

        wxString time = m_listView->GetItemText( m_current, 2 );
        time.ToLong( &m_counter, 10 );
        m_timer.StartOnce( (int)m_counter * 1000 );

        if ( m_current == m_listView->GetItemCount() - 1 ) m_current = 0;
        else m_current++;
    }
}

void MainFrame::OnToggle( wxCommandEvent& WXUNUSED(event) )
{
    if ( m_toggleBtn->GetValue() ) {
        m_toggleBtn->SetLabel( wxT("OFF") );
        EnableButtons( false );
        if ( m_listView->GetItemCount() > 0 ) {
            m_timer.StartOnce( 1000 );
        }
    }
    else {
        m_timer.Stop();
        m_toggleBtn->SetLabel( wxT("ON") );
        EnableButtons( true );
    }
}

void MainFrame::OnBtnExit( wxCommandEvent& WXUNUSED(event) )
{
    Close();
}

// Functions
void MainFrame::EnableButtons( bool enable )
{
    if ( enable ) {
        m_buttonUp->Enable( true );
        m_buttonDown->Enable( true );
        m_buttonDel->Enable( true );
        m_buttonAdd->Enable( true );
    }
    else {
        m_buttonUp->Enable( false );
        m_buttonDown->Enable( false );
        m_buttonDel->Enable( false );
        m_buttonAdd->Enable( false );
    }
}

void MainFrame::ReNumberList()
{
    for ( int i = 0; i < m_listView->GetItemCount(); i++ ) {
        m_listView->SetItem( i, 0, wxString::Format( wxT("%d"), i + 1 ) );
    }
}

void MainFrame::SwapListItem( long item1, long item2 )
{
    for ( int c = 0; c < m_listView->GetColumnCount(); c++ ) {
        wxString buf = m_listView->GetItemText( item1, c );
        m_listView->SetItem( item1, c, m_listView->GetItemText( item2, c ) );
        m_listView->SetItem( item2, c, buf );
    }
    m_listView->SetItemState( item1, 0, wxLIST_STATE_SELECTED );
    m_listView->SetItemState( item2, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
}