Beispiel #1
0
void frmMain::OnTreeSelChanged(wxTreeEvent& event)
{
    denyCollapseItem=wxTreeItemId();
	// Reset the listviews/SQL pane
    if (event.GetItem())
        execSelChange(event.GetItem(), true);
}
Beispiel #2
0
void frmMain::OnTreeSelChanged(wxTreeEvent &event)
{
	/*
	    * Do not honour the tree selection change, while a property dialog is
	    * closed and refresh is in progress
	*/
	if (m_refreshing)
		return;

	denyCollapseItem = wxTreeItemId();
	// Reset the listviews/SQL pane
	if (event.GetItem())
		execSelChange(event.GetItem(), true);
}
Beispiel #3
0
void frmMain::OnExpand(wxTreeEvent &event)
{
	wxCookieType cookie;
	wxTreeItemId item = browser->GetFirstChild(event.GetItem(), cookie);
	if (item && !browser->GetItemData(item))
	{
		// the expanding node has a dummy item.
		// delete dummy item, and expand kids.
		execSelChange(event.GetItem(), browser->GetSelection() == item);

		// we don't have any kids, so don't expand
		if (!browser->GetChildrenCount(event.GetItem()))
			event.Veto();
	}
}
Beispiel #4
0
bool frmMain::CheckAlive()
{
    bool userInformed = false;
    bool closeIt = false;

    wxTreeItemIdValue foldercookie;
    wxTreeItemId folderitem = browser->GetFirstChild(browser->GetRootItem(), foldercookie);
    while (folderitem)
    {
        if (browser->ItemHasChildren(folderitem))
        {
            wxCookieType cookie;
            wxTreeItemId serverItem=browser->GetFirstChild(folderitem, cookie);
            while (serverItem)
            {
                pgServer *server=(pgServer*)browser->GetObject(serverItem);

                if (server && server->IsCreatedBy(serverFactory) && server->connection())
                {
                    if (server->connection()->IsAlive())
                    {
                        wxCookieType cookie2;
                        wxTreeItemId item = browser->GetFirstChild(serverItem, cookie2);
                        while (item)
                        {
                            pgObject *obj=browser->GetObject(item);
                            if (obj && obj->IsCreatedBy(databaseFactory.GetCollectionFactory()))
                            {
                                wxCookieType cookie3;
                                item = browser->GetFirstChild(obj->GetId(), cookie3);
                                while (item)
                                {
                                    pgDatabase *db=(pgDatabase*)browser->GetObject(item);
                                    if (db && db->IsCreatedBy(databaseFactory))
                                    {
                                        pgConn *conn=db->GetConnection();
                                        if (conn)
                                        {
                                            if (!conn->IsAlive() && (conn->GetStatus() == PGCONN_BROKEN || conn->GetStatus() == PGCONN_BAD))
                                            {
                                                conn->Close();
                                                if (!userInformed)
                                                {
                                                    wxMessageDialog dlg(this, _("Do you want to attempt to reconnect to the database?"),
                                                    wxString::Format(_("Connection to database %s lost."), db->GetName().c_str()), 
                                                        wxICON_EXCLAMATION|wxYES_NO|wxYES_DEFAULT);

                                                    closeIt = (dlg.ShowModal() == wxID_NO);
                                                    userInformed = true;
                                                }
                                                if (closeIt)
                                                {
                                                    db->Disconnect();
                                                    
                                                    browser->DeleteChildren(db->GetId());
                                                    db->UpdateIcon(browser);
                                                }
	        									else 
	        									{
                                                    // Create a server object and connect it.
                                                    wxBusyInfo waiting(wxString::Format(_("Reconnecting to database %s"),
                                                        db->GetName().c_str()), this);

                                                    // Give the UI a chance to redraw
                                                    wxSafeYield();
                                                    wxMilliSleep(100);
                                                    wxSafeYield();

	        										if (!conn->Reconnect())
                                                    {
                                                        db->Disconnect();
                                                    
                                                        browser->DeleteChildren(db->GetId());
                                                        db->UpdateIcon(browser);
                                                    }
                                                    else
                                                        // Indicate things are back to normal
                                                        userInformed = false;
	        									}

                                            }
                                        }
                                    }
                                    item = browser->GetNextChild(obj->GetId(), cookie3);
                                }
                            }
                            item = browser->GetNextChild(serverItem, cookie2);
                        }
                    }
                    else
                    {
                        if (server->connection()->GetStatus() == PGCONN_BROKEN || server->connection()->GetStatus() == PGCONN_BAD)
                        {
                            server->connection()->Close();
                            if (!userInformed)
                            {
                                wxMessageDialog dlg(this, _("Do you want to attempt to reconnect to the server?"),
                                    wxString::Format(_("Connection to server %s lost."), server->GetName().c_str()), 
                                    wxICON_EXCLAMATION|wxYES_NO|wxYES_DEFAULT);

                                closeIt = (dlg.ShowModal() == wxID_NO);
                                userInformed = true;
                            }
                            if (closeIt)
                            {
                                server->Disconnect(this);
                                browser->SelectItem(serverItem);
                                execSelChange(serverItem, true);
                                browser->DeleteChildren(serverItem);
                            }
	        				else 
	        				{
                                // Create a server object and connect it.
                                wxBusyInfo waiting(wxString::Format(_("Reconnecting to server %s (%s:%d)"),
                                    server->GetDescription().c_str(), server->GetName().c_str(), server->GetPort()), this);

                                // Give the UI a chance to redraw
                                wxSafeYield();
                                wxMilliSleep(100);
                                wxSafeYield();

	        					if (!server->connection()->Reconnect())
                                {
                                    server->Disconnect(this);
                                    browser->SelectItem(serverItem);
                                    execSelChange(serverItem, true);
                                    browser->DeleteChildren(serverItem);
                                }
                                else
                                    // Indicate things are back to normal
                                    userInformed = false;
	        				}
                        }
                    }
                }

                serverItem = browser->GetNextChild(serversObj->GetId(), cookie);
            }
        }
        folderitem = browser->GetNextChild(browser->GetRootItem(), foldercookie);
    }
    return userInformed;
}
Beispiel #5
0
void frmMain::Refresh(pgObject *data)
{
    StartMsg(data->GetTranslatedMessage(REFRESHINGDETAILS));
    browser->Freeze();

    wxTreeItemId currentItem=data->GetId();

    // Scan the child nodes and make a list of those that are expanded
    // This is not an exact science as node names may change etc.
    wxArrayString expandedNodes;
    GetExpandedChildNodes(currentItem, expandedNodes);

    browser->DeleteChildren(currentItem);

    // refresh information about the object
    data->SetDirty();
    
    pgObject *newData = data->Refresh(browser, currentItem);

    bool done = !data->GetConnection() || data->GetConnection()->GetStatus() == PGCONN_OK;
    
    if (newData != data)
    {
        wxLogInfo(wxT("Deleting %s %s for refresh"), data->GetTypeName().c_str(), data->GetQuotedFullIdentifier().c_str());

        if (data == currentObject)
            currentObject = newData;

        if (newData)
        {
            wxLogInfo(wxT("Replacing with new node %s %s for refresh"), newData->GetTypeName().c_str(), newData->GetQuotedFullIdentifier().c_str());

            newData->SetId(currentItem);    // not done automatically
            browser->SetItemData(currentItem, newData);

            // Update the node text if this is an object, as it may have been renamed
            if (!newData->IsCollection())
                browser->SetItemText(currentItem, newData->GetDisplayName());

            delete data;
        }
        else
        {
            wxLogInfo(wxT("No object to replace: vanished after refresh."));
            
            // If the connection is dead, just return here
            if (data->GetConnection()->GetStatus() != PGCONN_OK)
            {
                CheckAlive();
                browser->Thaw();
                return;
            }
    
            wxTreeItemId delItem=currentItem;
            currentItem=browser->GetItemParent(currentItem);
            browser->SelectItem(currentItem);
            browser->Delete(delItem);
        }
    }

    if (currentItem)
    {
        execSelChange(currentItem, currentItem == browser->GetSelection());

        // Attempt to expand any child nodes that were previously expanded
        ExpandChildNodes(currentItem, expandedNodes);
    }

    browser->Thaw();
    EndMsg(done);
}
Beispiel #6
0
void frmMain::Refresh(pgObject *data)
{
	bool done = false;
	pgObject *obj = NULL;

	StartMsg(data->GetTranslatedMessage(REFRESHINGDETAILS));
	browser->Freeze();

	wxTreeItemId currentItem = data->GetId();
	if (currentItem)
		obj = browser->GetObject(currentItem);

	if (obj && obj->CheckOpenDialogs(browser, currentItem))
	{
		wxString msg = _("There are properties dialogues open for one or more objects that would be refreshed. Please close the properties dialogues and try again.");
		wxMessageBox(msg, _("Cannot refresh browser"), wxICON_WARNING | wxOK);
	}
	else
	{
		if (data->GetMetaType() == PGM_SCHEMA && !data->IsCollection() && data->GetConnection()->BackendMinimumVersion(9, 3))
		{
			// Event triggers backend functions are at schema level.
			// Hence, we can consider that Event Triggers at schema level and partly at database.
			// So, if any schema is refreshed, we need to the event trigger collection as well.
			// It's a special case, which effects the schema operations on the event triggers as well.
			// To solve this, we are navigating to the parent node (database node), and then locating event trigger collections.
			// Once we've found the event triggers collection, we refresh it.
			//
			wxTreeItemId dbItem = browser->GetItemParent(browser->GetItemParent(browser->GetSelection()));
			pgCollection *eventTrgCol = browser->FindCollection(eventTriggerFactory, dbItem);

			if(eventTrgCol)
			Refresh(eventTrgCol);
		}

		// Scan the child nodes and make a list of those that are expanded
		// This is not an exact science as node names may change etc.
		wxArrayString expandedNodes;
		GetExpandedChildNodes(currentItem, expandedNodes);

		browser->DeleteChildren(currentItem);

		// refresh information about the object
		data->SetDirty();

		pgObject *newData = data->Refresh(browser, currentItem);
		done = !data->GetConnection() || data->GetConnection()->GetStatus() == PGCONN_OK;

		if (newData != data)
		{
			wxLogInfo(wxT("Deleting %s %s for refresh"), data->GetTypeName().c_str(), data->GetQuotedFullIdentifier().c_str());

			if (data == currentObject)
				currentObject = newData;

			if (newData)
			{
				wxLogInfo(wxT("Replacing with new node %s %s for refresh"), newData->GetTypeName().c_str(), newData->GetQuotedFullIdentifier().c_str());

				newData->SetId(currentItem);    // not done automatically
				browser->SetItemData(currentItem, newData);

				// Update the node text if this is an object, as it may have been renamed
				if (!newData->IsCollection())
					browser->SetItemText(currentItem, newData->GetDisplayName());

				delete data;
				data = NULL;
			}
			else
			{
				wxLogInfo(wxT("No object to replace: vanished after refresh."));

				// If the connection is dead, just return here
				if (data->GetConnection()->GetStatus() != PGCONN_OK)
				{
					CheckAlive();
					browser->Thaw();
					return;
				}

				wxTreeItemId delItem = currentItem;
				currentItem = browser->GetItemParent(currentItem);
				browser->SelectItem(currentItem);
				browser->Delete(delItem);
			}
		}

		if (currentItem)
		{
			// Select the current node
			execSelChange(currentItem, currentItem == browser->GetSelection());

			// Attempt to expand any child nodes that were previously expanded
			ExpandChildNodes(currentItem, expandedNodes);
		}
	}

	browser->Thaw();
	EndMsg(done);
}