Looks good to me. But, performance is slow, if I have more number of tables (about more than 10 tables).
I have modified your patch, but for some reason not working.. PFA.. (please check if we can do something about it..) -- Thanks & Regards, Ashesh Vashi EnterpriseDB INDIA: Enterprise Postgres Company<http://www.enterprisedb.com> On Wed, Apr 14, 2010 at 12:29 AM, Guillaume Lelarge <guilla...@lelarge.info>wrote: > Le 13/04/2010 09:01, Guillaume Lelarge a écrit : > > Hi Ashesh, > > > > Le 12/04/2010 11:14, Ashesh Vashi a écrit : > >> [...] > >> Right click on GQB will popup a menu (Refresh). > >> This will adjust the size of the scroll windows, if the table's size > goes > >> beyond the current size. > >> > > > > I checked your patch this morning. Works great. Thanks Ashesh. > > > >> 1200x800 is the default minimum size of the scrolled window defined by > the > >> constants: > >> *#define GQB_MIN_WIDTH 1280* > >> *#define GQB_MIN_HEIGHT 800* > >> * > >> * > >> I tried adding the same code, when adding a new table/view. > >> But, if I select a table for next to get created (by double click on > >> left-side tree) and then press left clicks few times, the application is > >> crashing.. Hence, just added this code to work with the pop-up menu. :-( > >> > > > > Didn't try this, but will do tonight. It would be better if it > > automatically grows the canvas size. > > > > It seems to work with this patch (to apply above your own patch). Can > you try it, please? It didn't crash for me, but I'm not a good tester. > > > -- > Guillaume. > http://www.postgresqlfr.org > http://dalibo.com >
Index: include/gqb/gqbEvents.h =================================================================== --- include/gqb/gqbEvents.h (revision 8266) +++ include/gqb/gqbEvents.h (working copy) @@ -24,6 +24,7 @@ GQB_RMJ_DELETE = 2000, GQB_RMJ_SETTYPE, GQB_RMT_DELETE, - GQB_RMT_SETALIAS + GQB_RMT_SETALIAS, + GQB_REFRESH }; #endif Index: include/gqb/gqbViewController.h =================================================================== --- include/gqb/gqbViewController.h (revision 8266) +++ include/gqb/gqbViewController.h (working copy) @@ -30,6 +30,9 @@ #include "gqb/gqbGridJoinTable.h" #include "gqb/gqbBrowser.h" +#define GQB_MIN_WIDTH 1280 +#define GQB_MIN_HEIGHT 800 + class gqbView; enum pointerMode @@ -67,7 +70,7 @@ public: gqbController(gqbModel *_model, wxWindow *gqbParent, wxNotebook *gridParent, wxSize size); ~gqbController(); - void addTableToModel(gqbTable *table, wxPoint p); + gqbQueryObject* addTableToModel(gqbTable *table, wxPoint p); gqbQueryJoin* addJoin(gqbQueryObject *sTable, gqbColumn *sColumn, gqbQueryObject *dTable, gqbColumn *dColumn, type_Join kind); void removeJoin(gqbQueryJoin *join); void removeTableFromModel(gqbQueryObject *table, gqbGridProjTable *gridTable, gqbGridOrderTable *orderLTable, gqbGridOrderTable *orderRTable); @@ -124,29 +127,32 @@ void newTableAdded(gqbQueryObject *item); bool clickOnJoin (gqbQueryJoin *join, wxPoint &pt, wxPoint &origin, wxPoint &dest); void updateTable(gqbQueryObject *table); + const wxSize& getModelSize() { return modelSize; } - // Functions for all gqb extra Panels (projection, criteria..) + // Functions for all gqb extra Panels (projection, criteria..) void emptyPanelsData(); + void updateModelSize(gqbQueryObject* obj, bool updateAnyWay); + private: - gqbController *controller; // owned by caller application shouldn't be destroy - // by this class - gqbModel *model; // owned by caller application shouldn't be destroy - // by this class - gqbGraphBehavior *graphBehavior; // This points to the Graph behavior for objects, - // if change the way objects were draw changes too. - gqbIteratorBase *iterator; //include here for reuse of iterator, should be - // delete when class destroy + gqbController *controller; // owned by caller application shouldn't be destroy + // by this class + gqbModel *model; // owned by caller application shouldn't be destroy + // by this class + gqbGraphBehavior *graphBehavior; // This points to the Graph behavior for objects, + // if change the way objects were draw changes too. + gqbIteratorBase *iterator; //include here for reuse of iterator, should be + // delete when class destroy wxPanel *projectionPanel, *criteriaPanel, *orderPanel, *joinsPanel; - gqbGridProjTable *gridTable; // Data model for the columns grid internals - gqbGridRestTable *restrictionsGridTable; // Data model for restricions grid internals - gqbGridJoinTable *joinsGridTable; // Data model for joins grid internals + gqbGridProjTable *gridTable; // Data model for the columns grid internals + gqbGridRestTable *restrictionsGridTable; // Data model for restricions grid internals + gqbGridJoinTable *joinsGridTable; // Data model for joins grid internals - gqbGridOrderTable *orderByLGridTable, *orderByRGridTable; // Data model for order by grid internals - wxSize canvasSize; + gqbGridOrderTable *orderByLGridTable, *orderByRGridTable; // Data model for order by grid internals + wxSize canvasSize, modelSize; bool changeTOpressed; - // just a point to the selected item on the collection, shouldn't be destroy inside this class + // just a point to the selected item on the collection, shouldn't be destroy inside this class gqbQueryObject *collectionSelected, *joinSource, *joinDest, *cTempSelected; gqbQueryJoin *joinSelected, *jTempSelected; gqbColumn *joinSCol, *joinDCol; @@ -155,11 +161,14 @@ pointerMode mode; // pointer is used as normally or as in joins by example wxImage joinCursorImage; wxCursor joinCursor; - wxMenu *m_rightJoins, *m_rightTables; + wxMenu *m_rightJoins, *m_rightTables, *m_gqbPopup; void OnMenuJoinDelete(wxCommandEvent& event); void OnMenuTableDelete(wxCommandEvent& event); void OnMenuTableSetAlias(wxCommandEvent& event); + void OnRefresh(wxCommandEvent& ev); + wxArrayString joinTypeChoices; + DECLARE_EVENT_TABLE() }; Index: frm/frmQuery.cpp =================================================================== --- frm/frmQuery.cpp (revision 8266) +++ frm/frmQuery.cpp (working copy) @@ -467,7 +467,7 @@ // Graphical Canvas // initialize values model=new gqbModel(); - controller = new gqbController(model,sqlNotebook, outputPane, wxSize(1280,800)); + controller = new gqbController(model,sqlNotebook, outputPane, wxSize(GQB_MIN_WIDTH, GQB_MIN_HEIGHT)); firstTime=true; // Inform to GQB that the tree of table haven't filled. gqbUpdateRunning = false; // Are we already updating the SQL query - event recursion protection. adjustSizesTimer=NULL; // Timer used to avoid a bug when close outputPane Index: gqb/gqbView.cpp =================================================================== --- gqb/gqbView.cpp (revision 8266) +++ gqb/gqbView.cpp (working copy) @@ -47,6 +47,7 @@ EVT_MENU(GQB_RMJ_DELETE, gqbView::OnMenuJoinDelete) EVT_MENU(GQB_RMT_DELETE, gqbView::OnMenuTableDelete) EVT_MENU(GQB_RMT_SETALIAS, gqbView::OnMenuTableSetAlias) +EVT_MENU(GQB_REFRESH, gqbView::OnRefresh) END_EVENT_TABLE() gqbView::gqbView(wxWindow *gqbParent, wxNotebook *gridParent, wxSize size, gqbController *controller, gqbModel *model) @@ -72,6 +73,7 @@ joinCursor= wxCursor(joinCursorImage); m_rightJoins=NULL; m_rightTables=NULL; + m_gqbPopup=NULL; jTempSelected=NULL; cTempSelected=NULL; @@ -102,6 +104,8 @@ this->orderByLGridTable = new gqbGridOrderTable(1,model->getOrdByAvailColumns(),model->getOrdByAvailParents(),NULL); this->orderByRGridTable = new gqbGridOrderTable(2,model->getOrdByColumns(), model->getOrdByParents(),model->getOrdByKind()); this->orderPanel = new gqbOrderPanel(controller->getTabs(), orderByLGridTable, orderByRGridTable); + + SetVirtualSizeHints(size); } @@ -117,6 +121,9 @@ if(m_rightJoins) delete m_rightJoins; + + if (m_gqbPopup) + delete m_gqbPopup; } @@ -154,6 +161,9 @@ m_rightTables = new wxMenu; m_rightTables->Append(GQB_RMT_SETALIAS, _("&Set Alias for table")); m_rightTables->Append(GQB_RMT_DELETE, _("&Delete Table")); + m_rightTables->AppendSeparator(); + m_rightTables->Append(GQB_REFRESH, _("&Refresh")); + } cTempSelected=(gqbQueryObject *) (gqbObjectCollection *) anySelected; jTempSelected=NULL; @@ -166,12 +176,23 @@ { m_rightJoins = new wxMenu; m_rightJoins->Append(GQB_RMJ_DELETE, _("&Delete Join")); + m_rightJoins->AppendSeparator(); + m_rightJoins->Append(GQB_REFRESH, _("&Refresh")); } cTempSelected=NULL; jTempSelected=(gqbQueryJoin *) anySelected;; PopupMenu(m_rightJoins, event.GetPosition()); } } + else + { + if(!m_gqbPopup) + { + m_gqbPopup = new wxMenu; + m_gqbPopup->Append(GQB_REFRESH, _("&Refresh")); + } + PopupMenu(m_gqbPopup, event.GetPosition()); + } } @@ -645,3 +666,87 @@ this->Refresh(); } + +void gqbView::OnRefresh(wxCommandEvent& ev) +{ + updateModelSize(NULL, true); + this->Update(); +} + + +/* +* updateModelSize +* - Update the model size. +* - Calculate the maximum width and maximum height of the model +* * When removed a table/view from model, the obj parameter must be null, +* and update parameter should be true, otherwise update parameter should +* be false (Dragging event) +*/ +void gqbView::updateModelSize(gqbQueryObject* obj, bool updateAnyWay) +{ + static int callCount = 0; + callCount++; + if (!obj) + { + // Do not update model size, everytime it gets called + // Update the size once in 10 times + // Update the size only if update flag is true + if (callCount < 10 && !updateAnyWay) + return; + callCount = 0; + // Figure out the actual model size. + // Remove table + int w = 0, h = 0, maxW = 0, maxH = 0; + if(!iterator) + // Get an iterator for the objects (tables/views) in the model. + iterator = this->model->createQueryIterator(); + else + iterator->ResetIterator(); + + while (iterator->HasNext()) + { + gqbQueryObject *tmp= (gqbQueryObject *)iterator->Next();; + w = tmp->position.x + tmp->getWidth(); + h = tmp->position.y + tmp->getHeight(); + + if (maxW < w) + maxW = w; + if (maxH < h) + maxH = h; + } + + // Reset Model size + modelSize.Set(maxW, maxH); + } + else + { + int w = 0, h = 0; + w = obj->position.x + obj->getWidth(); + h = obj->position.y + obj->getHeight(); + + if (w > modelSize.GetWidth()) + modelSize.SetWidth(w); + if (h > modelSize.GetHeight()) + modelSize.SetHeight(h); + } + bool updateView = false; + + if ((modelSize.GetWidth() > GQB_MIN_WIDTH || canvasSize.GetWidth() > GQB_MIN_WIDTH) && + modelSize.GetWidth() != canvasSize.GetWidth()) + { + canvasSize.SetWidth((modelSize.GetWidth() > GQB_MIN_WIDTH ? modelSize.GetWidth() : GQB_MIN_WIDTH)); + updateView = true; + } + if ((modelSize.GetHeight() > GQB_MIN_HEIGHT || canvasSize.GetHeight() > GQB_MIN_HEIGHT) && + modelSize.GetHeight() != canvasSize.GetHeight()) + { + canvasSize.SetHeight((modelSize.GetHeight() > GQB_MIN_HEIGHT ? modelSize.GetHeight() : GQB_MIN_HEIGHT)); + updateView = true; + } + + if (updateView) + { + SetVirtualSize(canvasSize); + } +} + Index: gqb/gqbController.cpp =================================================================== --- gqb/gqbController.cpp (revision 8266) +++ gqb/gqbController.cpp (working copy) @@ -29,7 +29,7 @@ wxWindowID CTL_NTBKPANELS = ::wxNewId(); -gqbController::gqbController(gqbModel *_model, wxWindow *gqbParent, wxNotebook *gridParent, wxSize size=wxSize(800,1280)) +gqbController::gqbController(gqbModel *_model, wxWindow *gqbParent, wxNotebook *gridParent, wxSize size=wxSize(GQB_MIN_WIDTH, GQB_MIN_HEIGHT)) : wxObject() { pparent = gqbParent; @@ -80,10 +80,11 @@ // Add a table to the model -void gqbController::addTableToModel(gqbTable *table, wxPoint p) +gqbQueryObject* gqbController::addTableToModel(gqbTable *table, wxPoint p) { gqbQueryObject *added = model->addTable(table,p); view->newTableAdded(added); + return added; } Index: gqb/gqbBrowser.cpp =================================================================== --- gqb/gqbBrowser.cpp (revision 8266) +++ gqb/gqbBrowser.cpp (working copy) @@ -127,8 +127,13 @@ if(result==wxDragCopy) { controller->getView()->CalcUnscrolledPosition(xx,yy,&xx,&yy); - controller->addTableToModel(item,wxPoint(xx,yy)); + gqbQueryObject* queryObj = controller->addTableToModel(item,wxPoint(xx,yy)); controller->getView()->Refresh(); + if (queryObj) + { + controller->getView()->Update(); + controller->getView()->updateModelSize(queryObj, false); + } } } }
-- Sent via pgadmin-support mailing list (pgadmin-support@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-support