Пример #1
0
// ポストペインでキーを押した時
void CMainWindow::onKeyDownOnPostPane(wxKeyEvent& event)
{
#ifdef _WIN32
	if (event.GetModifiers() == wxMOD_CONTROL){
    #else
    if (event.GetModifiers() == wxMOD_ALT){
    #endif
        if (event.GetKeyCode() == WXK_SPACE){
            moveToUnread();
        }
    }
	#ifdef _WIN32
	if (event.GetModifiers() == wxMOD_CONTROL){
    #else
	if (event.GetModifiers() == wxMOD_ALT & wxMOD_CMD){
    #endif
		if (event.GetKeyCode() == WXK_UP){
			m_view->selectPreviousChannel();
		} else if (event.GetKeyCode() == WXK_DOWN){
			m_view->selectNextChannel();
		}
	}
	else
	{ 
		m_inputManager->setChangingText(true);
		if (event.GetKeyCode() == WXK_UP)
		{
			m_view->setTextPostPane(m_inputManager->getHistory());}
		else if (event.GetKeyCode() == WXK_DOWN){
			m_view->setTextPostPane(m_inputManager->getHistoryBefore());
		}
	}
}
// チャンネルペインを右クリック時
void CMainWindow::onChannelRightClicked(CChannelSelectEvent& event)
{
    enum
    {
        Id_DeleteServer = 1, Id_AddChannel = 2, Id_DeleteChannel = 3,
        Id_ChangeTopic = 4, Id_ChangeNickname = 5, Id_Refresh = 6,
        Id_Disconnect = 7
    };

    int serviceId = event.getServerId();
    CChatServiceBase* service = m_serviceHolder->getService(serviceId);

    wxMenu menu;
    if (event.isServerSelected()){
        menu.Append(Id_DeleteServer, "サーバの削除");
        menu.Append(Id_Refresh, "サーバの再読み込み");
        if (service->IsConnected()){
            menu.Append(Id_Disconnect, "サーバの切断");
        }
        if (service->IsConnected()){
            menu.AppendSeparator();
        }
    }
    if (service->IsConnected()){
        menu.Append(Id_AddChannel, "チャンネルの追加");
        if (event.isServerSelected() == false){
            menu.Append(Id_DeleteChannel, "チャンネルの削除");
            menu.Append(Id_ChangeTopic, "トピックの変更");
        }
        menu.Append(Id_ChangeNickname, "ニックネームの変更");
    }

    wxString channel = event.getChannelName();
    switch (this->GetPopupMenuSelectionFromUser(menu)) {
    case Id_DeleteServer:
        deleteService(serviceId);
        break;
    case Id_AddChannel:
        showAddChannleDialog(serviceId);
        break;
    case Id_DeleteChannel:
        m_serviceHolder->deleteChannel(serviceId, channel);
        break;
    case Id_ChangeTopic:
        showChangeTopicDialog(serviceId, channel);
        break;
    case Id_ChangeNickname:
        showChangeNicknameDialog(serviceId);
        break;
    case Id_Refresh:
        updateService(serviceId);
        break;
    case Id_Disconnect:
        disconnect(serviceId);
        break;
    }
}

//////////////////////////////////////////////////////////////////////

// メッセージ投稿終了時
void CMainWindow::onFinishPostMessage(wxThreadEvent& event)
{
}

// 認証情報の受信時
void CMainWindow::onGetAuth(CAuthEvent& event)
{
    // サービスIDが不明な場合
    CChatServiceBase* service = m_serviceHolder->getService(
            event.getConnectionId());
    if (service == NULL){
        return;
    }

    // 認証に失敗
    if (!event.isAuthSucceeded()){

        wxMessageBox("接続に失敗しました");

        // サービスの削除
        m_serviceHolder->deleteService(event.getConnectionId());

        // 表示の更新
        m_view->displayChannels(m_serviceHolder->getServices());

    } else{
        // コンテンツの更新
        service->onAuthSucceeed();
        service->setConnected(true);

        // 表示の更新
        updateAllView(event.getConnectionId(), service->getCurrentChannel());
    }

}
//
// 切断情報の受信時
void CMainWindow::onDisconnect(CDisconnectEvent& event)
{
    CChatServiceBase* service = m_serviceHolder->getService(
            event.getConnectionId());
    if (service != NULL){
        disconnect(event.getConnectionId());
        wxMessageBox(
                wxString::Format(wxT("サーバー[%s(%s)]切断されました。再接続を行う際は更新してください。"),
                        service->getName(), service->getHost()));
    }
}