~ubuntu-branches/ubuntu/utopic/pgadmin3/utopic-proposed

« back to all changes in this revision

Viewing changes to pgadmin/gqb/gqbController.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Gerfried Fuchs
  • Date: 2011-06-07 23:03:54 UTC
  • mfrom: (1.3.1 upstream) (13 sid)
  • mto: This revision was merged to the branch mainline in revision 14.
  • Revision ID: james.westby@ubuntu.com-20110607230354-3td4j9y71u4ahcvj
Tags: 1.14.0~beta1-1
* New upstream development release, adding Build-Depends on
  postgresql-server-dev-all >= 117~.
* Add Build-Depends on quilt, (un)patch to debian/rules and patch for fixing
  the include for kwlist.h in pgadmin/db/keywords.c.
* Add pg_config --includedir-server output to CPPFLAGS.
* Remove unrecognized configure options: --with-wx-config,
  --with-pgsql-include, --enable-gtk2, --enable-unicode.
* Clean up manually the files that are left behind after the broken
  distclean.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
//////////////////////////////////////////////////////////////////////////
2
2
//
3
3
// pgAdmin III - PostgreSQL Tools
4
 
// 
5
 
// Copyright (C) 2002 - 2010, The pgAdmin Development Team
 
4
//
 
5
// Copyright (C) 2002 - 2011, The pgAdmin Development Team
6
6
// This software is released under the PostgreSQL Licence
7
7
//
8
8
// gqbController.cpp - Controller part of MVC Software Pattern used by GQB
29
29
 
30
30
wxWindowID CTL_NTBKPANELS = ::wxNewId();
31
31
 
32
 
gqbController::gqbController(gqbModel *_model, wxWindow *gqbParent, wxNotebook *gridParent, wxSize size=wxSize(GQB_MIN_WIDTH, GQB_MIN_HEIGHT))
33
 
: wxObject()
 
32
gqbController::gqbController(gqbModel *_model, wxWindow *gqbParent, ctlAuiNotebook *gridParent, wxSize size = wxSize(GQB_MIN_WIDTH, GQB_MIN_HEIGHT))
 
33
        : wxObject()
34
34
{
35
 
    pparent = gqbParent;
36
 
    model=_model;
37
 
    wxSize tablesBrowserSize = wxSize(200,800);   //Initial Size
38
 
 
39
 
    // Initialize Main Splitter
40
 
    gqbMainContainer = new wxSplitterWindow(gqbParent,GQB_HORZ_SASH,wxDefaultPosition,wxDefaultSize,wxSP_3D);
41
 
    tabs = new wxNotebook(gqbMainContainer, CTL_NTBKPANELS, wxDefaultPosition, wxDefaultSize);
42
 
 
43
 
    // Initialize view container with tables browser
44
 
    // GQB-TODO: change 976 with a enum value of events.h
45
 
    gqbContainer = new gqbSplitter(gqbMainContainer,976,wxDefaultPosition,wxDefaultSize,wxSP_3D);
46
 
 
47
 
    // Initialize view canvas and tables tree
48
 
    browserPanel = new wxPanel(gqbContainer, wxID_ANY,wxDefaultPosition,tablesBrowserSize);
49
 
    tablesBrowser = new gqbBrowser(browserPanel, GQB_BROWSER, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS | wxSIMPLE_BORDER,this);
50
 
    view=new gqbView(gqbContainer, gridParent, size, this, model);
51
 
 
52
 
    // Set Drag Target
53
 
    view->SetDropTarget(new DnDText(tablesBrowser));
54
 
 
55
 
    // Set Scroll Bar & split
56
 
    view->SetScrollbars( 10, 10, 127, 80 );
57
 
    gqbContainer->SplitVertically(browserPanel,view);
58
 
 
59
 
    tabs->InsertPage(ti_colsGridPanel, view->getColsGridPanel(), _("Columns"));
60
 
    tabs->InsertPage(ti_criteriaPanel, view->getCriteriaPanel(), _("Criteria"));
61
 
    tabs->InsertPage(ti_orderPanel, view->getOrderPanel(), _("Ordering"));
62
 
    tabs->InsertPage(ti_joinsPanel, view->getJoinsPanel(), _("Joins"));
63
 
    gqbMainContainer->SplitHorizontally(gqbContainer,tabs);
64
 
 
65
 
    // Fix Sash resize bug
66
 
    gqbContainer->setTablesBrowser(tablesBrowser);
67
 
    gqbContainer->setBrowserPanel(browserPanel);
 
35
        pparent = gqbParent;
 
36
        model = _model;
 
37
        wxSize tablesBrowserSize = wxSize(200, 800);  //Initial Size
 
38
 
 
39
        // Initialize Main Splitter
 
40
        gqbMainContainer = new wxSplitterWindow(gqbParent, GQB_HORZ_SASH, wxDefaultPosition, wxDefaultSize, wxSP_3D);
 
41
        tabs = new wxNotebook(gqbMainContainer, CTL_NTBKPANELS, wxDefaultPosition, wxDefaultSize);
 
42
 
 
43
        // Initialize view container with tables browser
 
44
        // GQB-TODO: change 976 with a enum value of events.h
 
45
        gqbContainer = new gqbSplitter(gqbMainContainer, 976, wxDefaultPosition, wxDefaultSize, wxSP_3D);
 
46
 
 
47
        // Initialize view canvas and tables tree
 
48
        browserPanel = new wxPanel(gqbContainer, wxID_ANY, wxDefaultPosition, tablesBrowserSize);
 
49
        tablesBrowser = new gqbBrowser(browserPanel, GQB_BROWSER, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS | wxSIMPLE_BORDER, this);
 
50
        view = new gqbView(gqbContainer, gridParent, size, this, model);
 
51
 
 
52
        // Set Drag Target
 
53
        view->SetDropTarget(new DnDText(tablesBrowser));
 
54
 
 
55
        // Set Scroll Bar & split
 
56
        view->SetScrollbars( 10, 10, 127, 80 );
 
57
        gqbContainer->SplitVertically(browserPanel, view);
 
58
 
 
59
        tabs->InsertPage(ti_colsGridPanel, view->getColsGridPanel(), _("Columns"));
 
60
        tabs->InsertPage(ti_criteriaPanel, view->getCriteriaPanel(), _("Criteria"));
 
61
        tabs->InsertPage(ti_orderPanel, view->getOrderPanel(), _("Ordering"));
 
62
        tabs->InsertPage(ti_joinsPanel, view->getJoinsPanel(), _("Joins"));
 
63
        gqbMainContainer->SplitHorizontally(gqbContainer, tabs);
 
64
 
 
65
        // Fix Sash resize bug
 
66
        gqbContainer->setTablesBrowser(tablesBrowser);
 
67
        gqbContainer->setBrowserPanel(browserPanel);
68
68
}
69
69
 
70
70
 
71
71
// Destructor
72
72
gqbController::~gqbController()
73
73
{
74
 
    if(view)
75
 
    {
76
 
        delete view;
77
 
        view=NULL;
78
 
    }
 
74
        if(view)
 
75
        {
 
76
                delete view;
 
77
                view = NULL;
 
78
        }
79
79
}
80
80
 
81
81
 
82
82
// Add a table to the model
83
 
gqbQueryObject* gqbController::addTableToModel(gqbTable *table, wxPoint p)
 
83
gqbQueryObject *gqbController::addTableToModel(gqbTable *table, wxPoint p)
84
84
{
85
 
    gqbQueryObject *added = model->addTable(table,p);
86
 
    view->newTableAdded(added);
87
 
    return added;
 
85
        gqbQueryObject *added = model->addTable(table, p);
 
86
        view->newTableAdded(added);
 
87
        return added;
88
88
}
89
89
 
90
90
 
91
91
// Remove a table from the model
92
 
void gqbController::removeTableFromModel(gqbQueryObject *mtable, gqbGridProjTable *gridTable=NULL, gqbGridOrderTable *orderLTable=NULL, gqbGridOrderTable *orderRTable=NULL)
 
92
void gqbController::removeTableFromModel(gqbQueryObject *mtable, gqbGridProjTable *gridTable = NULL, gqbGridOrderTable *orderLTable = NULL, gqbGridOrderTable *orderRTable = NULL)
93
93
{
94
 
    model->deleteTable(mtable);
95
 
    gridTable->removeAllRows(mtable);             // GQB-TODO: move this functions to model??
96
 
    orderLTable->emptyTableData(mtable);
97
 
    orderRTable->emptyTableData(mtable);
 
94
        model->deleteTable(mtable);
 
95
        gridTable->removeAllRows(mtable);             // GQB-TODO: move this functions to model??
 
96
        orderLTable->emptyTableData(mtable);
 
97
        orderRTable->emptyTableData(mtable);
98
98
}
99
99
 
100
100
 
101
101
// Add (Select to be use in projection) a column for table in a model
102
 
void gqbController::processColumnInModel(gqbQueryObject *table, gqbColumn *column,  gqbGridProjTable *gridTable=NULL)
 
102
void gqbController::processColumnInModel(gqbQueryObject *table, gqbColumn *column,  gqbGridProjTable *gridTable = NULL)
103
103
{
104
 
    if(!table->existsColumn(column))
105
 
    {
106
 
        table->addColumn(column);
107
 
        if(gridTable)
108
 
        {
109
 
            gridTable->AppendItem(0,table);
110
 
            gridTable->AppendItem(1,column);
111
 
            gridTable->AppendItem(2,NULL);
112
 
        }
113
 
    }
114
 
    else
115
 
    {
116
 
        // Removes but don't delete because we needed the column at table [this is just a pointer to it]
117
 
        table->removeColumn(column);
118
 
        if(gridTable)
119
 
        {
120
 
            gridTable->removeRow(table,column);
121
 
        }
122
 
    }
 
104
        if(!table->existsColumn(column))
 
105
        {
 
106
                table->addColumn(column);
 
107
                if(gridTable)
 
108
                {
 
109
                        gridTable->AppendItem(0, table);
 
110
                        gridTable->AppendItem(1, column);
 
111
                        gridTable->AppendItem(2, NULL);
 
112
                }
 
113
        }
 
114
        else
 
115
        {
 
116
                // Removes but don't delete because we needed the column at table [this is just a pointer to it]
 
117
                table->removeColumn(column);
 
118
                if(gridTable)
 
119
                {
 
120
                        gridTable->removeRow(table, column);
 
121
                }
 
122
        }
123
123
}
124
124
 
125
125
 
126
126
// Get selected item at position pt, marks item as selected and if there is a previous selected then unselect it
127
 
gqbObject* gqbController::getModelSelected(wxPoint &pt, gqbQueryObject *lastSelected, gqbQueryJoin *lastJoinSelected, bool mark)
 
127
gqbObject *gqbController::getModelSelected(wxPoint &pt, gqbQueryObject *lastSelected, gqbQueryJoin *lastJoinSelected, bool mark)
128
128
{
129
 
    gqbQueryObject *sel=NULL;
130
 
    gqbQueryJoin *jSel=NULL;
131
 
    gqbIteratorBase *iterator=model->createDownQueryIterator();
132
 
    bool found=false;
 
129
        gqbQueryObject *sel = NULL;
 
130
        gqbQueryJoin *jSel = NULL;
 
131
        gqbIteratorBase *iterator = model->createDownQueryIterator();
 
132
        bool found = false;
133
133
 
134
 
    while(!found && iterator->HasNext())
135
 
    {
136
 
        // Try to find if click over a table
137
 
        sel=(gqbQueryObject *)iterator->Next();
138
 
        if( ((pt.x - sel->position.x > 0 )&&(sel->position.x + sel->getWidth() > pt.x)) && ((pt.y - sel->position.y > 0)&&(sel->position.y + sel->getHeight() > pt.y)) )
139
 
        {    
140
 
                        // GQB-TODO: this function should be move to the view to allow to 
 
134
        while(!found && iterator->HasNext())
 
135
        {
 
136
                // Try to find if click over a table
 
137
                sel = (gqbQueryObject *)iterator->Next();
 
138
                if( ((pt.x - sel->position.x > 0 ) && (sel->position.x + sel->getWidth() > pt.x)) && ((pt.y - sel->position.y > 0) && (sel->position.y + sel->getHeight() > pt.y)) )
 
139
                {
 
140
                        // GQB-TODO: this function should be move to the view to allow to
141
141
                        // recalculate it if the graphBehavior changes
142
 
            if(mark)
143
 
                sel->setSelected(true);
144
 
 
145
 
            jSel=NULL;
146
 
            found=true;
147
 
            break;
148
 
        }
149
 
 
150
 
        // Try to find if user click over a Join
151
 
        if(sel->getHaveJoins())
152
 
        {
153
 
            gqbIteratorBase *joinsIterator = sel->createJoinsIterator();
154
 
            while(joinsIterator->HasNext())
155
 
            {
156
 
                // GQB-TODO: don't pass anchor because join it's passed as parameter yet.
157
 
                jSel = (gqbQueryJoin *) joinsIterator->Next();
158
 
                wxPoint o = jSel->getSourceAnchor();
159
 
                wxPoint d = jSel->getDestAnchor();
160
 
 
161
 
                if(view->clickOnJoin(jSel,pt,o,d))
162
 
                {
163
 
                    if(mark)
164
 
                        jSel->setSelected(true);
165
 
                    found=true;
166
 
                    sel=NULL;
167
 
                    break;
168
 
                }
169
 
 
170
 
            }
171
 
            delete joinsIterator;
172
 
        }
173
 
    }
174
 
 
175
 
    delete iterator;
176
 
 
177
 
    if(found)
178
 
    {
179
 
        if(mark)
180
 
        {
181
 
            if(lastSelected && lastSelected!=sel) // Unselect previous table selected if exists
182
 
                lastSelected->setSelected(false);
183
 
                                                  // Unselect previous join selected if exists
184
 
            if(lastJoinSelected && lastJoinSelected!=jSel)
185
 
                lastJoinSelected->setSelected(false);
186
 
        }
187
 
        if(sel)
188
 
            return sel;
189
 
        else if(jSel)
190
 
            return jSel;
191
 
    }
192
 
 
193
 
    return NULL;
 
142
                        if(mark)
 
143
                                sel->setSelected(true);
 
144
 
 
145
                        jSel = NULL;
 
146
                        found = true;
 
147
                        break;
 
148
                }
 
149
 
 
150
                // Try to find if user click over a Join
 
151
                if(sel->getHaveJoins())
 
152
                {
 
153
                        gqbIteratorBase *joinsIterator = sel->createJoinsIterator();
 
154
                        while(joinsIterator->HasNext())
 
155
                        {
 
156
                                // GQB-TODO: don't pass anchor because join it's passed as parameter yet.
 
157
                                jSel = (gqbQueryJoin *) joinsIterator->Next();
 
158
                                wxPoint o = jSel->getSourceAnchor();
 
159
                                wxPoint d = jSel->getDestAnchor();
 
160
 
 
161
                                if(view->clickOnJoin(jSel, pt, o, d))
 
162
                                {
 
163
                                        if(mark)
 
164
                                                jSel->setSelected(true);
 
165
                                        found = true;
 
166
                                        sel = NULL;
 
167
                                        break;
 
168
                                }
 
169
 
 
170
                        }
 
171
                        delete joinsIterator;
 
172
                }
 
173
        }
 
174
 
 
175
        delete iterator;
 
176
 
 
177
        if(found)
 
178
        {
 
179
                if(mark)
 
180
                {
 
181
                        if(lastSelected && lastSelected != sel) // Unselect previous table selected if exists
 
182
                                lastSelected->setSelected(false);
 
183
                        // Unselect previous join selected if exists
 
184
                        if(lastJoinSelected && lastJoinSelected != jSel)
 
185
                                lastJoinSelected->setSelected(false);
 
186
                }
 
187
                if(sel)
 
188
                        return sel;
 
189
                else if(jSel)
 
190
                        return jSel;
 
191
        }
 
192
 
 
193
        return NULL;
194
194
}
195
195
 
196
196
 
197
197
// Unselect any previously selected item in the model
198
 
void gqbController::unsetModelSelected(bool queryTable=true)
 
198
void gqbController::unsetModelSelected(bool queryTable = true)
199
199
{
200
 
    gqbQueryObject *sel=NULL;
201
 
    gqbQueryJoin *jSel=NULL;
202
 
 
203
 
    if(queryTable)                                // QueryTable
204
 
    {
205
 
        gqbIteratorBase *iterator=model->createQueryIterator();
206
 
        while(iterator->HasNext())
207
 
        {
208
 
            sel=(gqbQueryObject *)iterator->Next();
209
 
            if(sel->getSelected())
210
 
            {
211
 
                sel->setSelected(false);
212
 
            }
213
 
        }
214
 
        delete iterator;
215
 
    }
216
 
 
217
 
    if(!queryTable)                               // QueryJoin
218
 
    {
219
 
        gqbIteratorBase *iterator=model->createQueryIterator();
220
 
        gqbQueryObject *sel=NULL;
221
 
        while(iterator->HasNext())
222
 
        {
223
 
            sel=(gqbQueryObject *)iterator->Next();
224
 
            if(sel->getHaveJoins())
225
 
            {
226
 
                gqbIteratorBase *joinsIterator = sel->createJoinsIterator();
227
 
                while(joinsIterator->HasNext())
228
 
                {
229
 
                    // GQB-TODO: don't pass anchor because join it's passed as parameter yet.
230
 
                    jSel = (gqbQueryJoin *) joinsIterator->Next();
231
 
                    if(jSel->getSelected())
232
 
                    {
233
 
                        jSel->setSelected(false);
234
 
                    }
235
 
                }
236
 
 
237
 
                delete joinsIterator;
238
 
            }
239
 
        }
240
 
        delete iterator;
241
 
    }
 
200
        gqbQueryObject *sel = NULL;
 
201
        gqbQueryJoin *jSel = NULL;
 
202
 
 
203
        if(queryTable)                                // QueryTable
 
204
        {
 
205
                gqbIteratorBase *iterator = model->createQueryIterator();
 
206
                while(iterator->HasNext())
 
207
                {
 
208
                        sel = (gqbQueryObject *)iterator->Next();
 
209
                        if(sel->getSelected())
 
210
                        {
 
211
                                sel->setSelected(false);
 
212
                        }
 
213
                }
 
214
                delete iterator;
 
215
        }
 
216
 
 
217
        if(!queryTable)                               // QueryJoin
 
218
        {
 
219
                gqbIteratorBase *iterator = model->createQueryIterator();
 
220
                gqbQueryObject *sel = NULL;
 
221
                while(iterator->HasNext())
 
222
                {
 
223
                        sel = (gqbQueryObject *)iterator->Next();
 
224
                        if(sel->getHaveJoins())
 
225
                        {
 
226
                                gqbIteratorBase *joinsIterator = sel->createJoinsIterator();
 
227
                                while(joinsIterator->HasNext())
 
228
                                {
 
229
                                        // GQB-TODO: don't pass anchor because join it's passed as parameter yet.
 
230
                                        jSel = (gqbQueryJoin *) joinsIterator->Next();
 
231
                                        if(jSel->getSelected())
 
232
                                        {
 
233
                                                jSel->setSelected(false);
 
234
                                        }
 
235
                                }
 
236
 
 
237
                                delete joinsIterator;
 
238
                        }
 
239
                }
 
240
                delete iterator;
 
241
        }
242
242
}
243
243
 
244
244
 
246
246
// Generate the SQL Sentence from the model
247
247
wxString gqbController::generateSQL()
248
248
{
249
 
    wxString sentence=wxT("");
250
 
    if(model->tablesCount()>0)
251
 
    {
252
 
        sentence+=wxT("SELECT \n");
 
249
        wxString sentence = wxT("");
 
250
        if(model->tablesCount() > 0)
 
251
        {
 
252
                sentence += wxT("SELECT \n");
253
253
 
254
254
                // Add selected columns for Query
255
 
        gqbQueryObject *sel=NULL;
256
 
        gqbIteratorBase *iteratorRestrictions=NULL;
257
 
        gqbIteratorBase *iteratorModel=NULL;
258
 
        gqbIteratorBase *iteratorJoins=NULL;
259
 
 
260
 
        // Projection Part [Select x,x,x...]
261
 
        gqbObjsArray *cols=model->getOrderedColumns();
262
 
        gqbObjsArray *tables=model->getColumnsParents();
263
 
        wxArrayString *alias=model->getColumnsAlias();
264
 
 
265
 
        int i,size=cols->GetCount();
266
 
 
267
 
        for(i=0;i<size;i++)
268
 
        {
269
 
            if(alias->Item(i).length()>0)
270
 
                        {
271
 
                                if(((gqbQueryObject*)tables->Item(i))->getAlias().length()>0)
272
 
                                {
273
 
                            sentence += wxT("  ") +
274
 
                                                        qtIdent(((gqbQueryObject*)tables->Item(i))->getAlias()) +
275
 
                                                            wxT(".") +
276
 
                                                            qtIdent(((gqbColumn*)cols->Item(i))->getName()) +
277
 
                                                            wxT(" AS ") + 
278
 
                                                            qtIdent(alias->Item(i)) +
279
 
                                                            wxT(", \n");
280
 
                                }
281
 
                                else
282
 
                                {
283
 
                            sentence += wxT("  ") +
284
 
                                                        qtIdent(((gqbQueryObject*)tables->Item(i))->getName()) + 
285
 
                                                                wxT(".") +
286
 
                                                                qtIdent(((gqbColumn*)cols->Item(i))->getName()) +
287
 
                                                                wxT(" AS ") + 
288
 
                                                                qtIdent(alias->Item(i)) +
289
 
                                                                wxT(", \n");
290
 
                                }
291
 
                        }
292
 
            else
293
 
                        {
294
 
                if(((gqbQueryObject*)tables->Item(i))->getAlias().length()>0)
295
 
                                {
296
 
                                    sentence += wxT("  ") +
297
 
                                                        qtIdent(((gqbQueryObject*)tables->Item(i))->getAlias()) + 
298
 
                                                                wxT(".") +
299
 
                                                                qtIdent(((gqbColumn*)cols->Item(i))->getName()) + 
300
 
                                                                wxT(", \n");
301
 
                                }
302
 
                                else
303
 
                                {
304
 
                                    sentence += wxT("  ") +
305
 
                                                        qtIdent(((gqbQueryObject*)tables->Item(i))->getName()) +
306
 
                                                                wxT(".") +
307
 
                                                                qtIdent(((gqbColumn*)cols->Item(i))->getName()) +
308
 
                                                                wxT(", \n");
309
 
                                }
310
 
                        }
311
 
        }
312
 
 
313
 
        if(!size)
314
 
            sentence+=wxT("  * \n");
315
 
        else
316
 
        {
317
 
            // remove last ", "
318
 
            sentence.Truncate(sentence.Length()-3);
319
 
            sentence+=wxT("\n");
320
 
        }
321
 
 
322
 
        sentence+=wxT("FROM \n");
323
 
 
324
 
        iteratorModel=model->createQueryIterator();
325
 
        while(iteratorModel->HasNext())
326
 
        {
327
 
            sel=(gqbQueryObject *)iteratorModel->Next();
328
 
            gqbSchema *schema = (gqbSchema *)sel->parent->getOwner();
329
 
            if(sel->getAlias().length()>0)
330
 
            {
331
 
                sentence += wxT("  ") +
332
 
                                                qtIdent(schema->getName()) +
333
 
                                                        wxT(".") +
334
 
                                                        qtIdent(sel->getName()) +
335
 
                                                        wxT(" ") + 
336
 
                                                        qtIdent(sel->getAlias()) +
337
 
                                                        wxT(", \n");
338
 
            }
339
 
            else
340
 
            {
341
 
                sentence += wxT("  ") +
342
 
                                                qtIdent(schema->getName()) +
343
 
                                                        wxT(".") +
344
 
                                                        qtIdent(sel->getName()) + 
345
 
                                                        wxT(", \n");
346
 
            }
347
 
 
348
 
        }
349
 
        sentence.Truncate(sentence.Length()-3);   // remove last ", "
350
 
 
351
 
        // WHERE PART
352
 
        // [Joins]
353
 
        bool first=true, truncAnd=false;
354
 
        gqbQueryJoin *tmp;
355
 
        iteratorModel->ResetIterator();
356
 
        while(iteratorModel->HasNext())
357
 
        {
358
 
            sel=(gqbQueryObject *)iteratorModel->Next();
359
 
            if(sel->getHaveJoins())
360
 
            {
361
 
                truncAnd=true;
362
 
                iteratorJoins=sel->createJoinsIterator();
363
 
                while(iteratorJoins->HasNext())
364
 
                {
365
 
                    if(first)
366
 
                    {
367
 
                        first=false;
368
 
                        sentence+= wxT("\nWHERE \n");
369
 
                    }
370
 
                    tmp = (gqbQueryJoin *)iteratorJoins->Next();
371
 
 
372
 
                    if(tmp->getSourceQTable()->getAlias().length()>0)
373
 
                        sentence+= wxT("  ") + 
374
 
                                                           qtIdent(tmp->getSourceQTable()->getAlias()) + 
375
 
                                                                   wxT(".") +
376
 
                                                                   qtIdent(tmp->getSourceCol());
377
 
                    else
378
 
                        sentence+= wxT("  ") + 
379
 
                                                           qtIdent(tmp->getSourceQTable()->getName()) + 
380
 
                                                                   wxT(".") +
381
 
                                                                   qtIdent(tmp->getSourceCol());
382
 
 
383
 
                    switch(tmp->getKindofJoin())
384
 
                    {
385
 
                        case _equally:
386
 
                            sentence+= wxT(" = ");
387
 
                            break;
388
 
                        case _greater:
389
 
                            sentence+= wxT(" > ");
390
 
                            break;
391
 
                        case _lesser:
392
 
                            sentence+= wxT(" < ");
393
 
                            break;
394
 
                        case _equgreater:
395
 
                            sentence+= wxT(" >= ");
396
 
                            break;
397
 
                        case _equlesser:
398
 
                            sentence+= wxT(" <= ");
399
 
                            break;
400
 
 
401
 
                    }
402
 
 
403
 
                    if(tmp->getDestQTable()->getAlias().length()>0)
404
 
                        sentence += qtIdent(tmp->getDestQTable()->getAlias()) + 
405
 
                                                            wxT(".") +
406
 
                                                                        qtIdent(tmp->getDestCol()) + 
407
 
                                                                        wxT(" AND\n");
408
 
                    else
409
 
                        sentence += qtIdent(tmp->getDestQTable()->getName()) + 
410
 
                                                            wxT(".") +
411
 
                                                                        qtIdent(tmp->getDestCol()) +
412
 
                                                                        wxT(" AND\n");
413
 
                }
414
 
                delete iteratorJoins;
415
 
            }
416
 
        }
417
 
        delete iteratorModel;
418
 
 
419
 
        gqbRestrictions *restrictions=model->getRestrictions();
420
 
 
421
 
        // Remove last " AND " from joins if there isn't restrictions, only left white space
422
 
                if(truncAnd && (restrictions->restrictionsCount()<=0))
423
 
                sentence.Truncate(sentence.Length()-5);
424
 
 
425
 
        // Never found a join
426
 
        if (!truncAnd && (restrictions->restrictionsCount()>0))
427
 
            sentence+= wxT("\nWHERE \n");
428
 
 
429
 
        //GQB-TODO: VALIDATE RESTRICTIONS
430
 
        iteratorRestrictions=restrictions->createRestrictionsIterator();
431
 
        gqbQueryRestriction *r = NULL;
432
 
 
433
 
        while(iteratorRestrictions->HasNext())
434
 
        {
435
 
            r=(gqbQueryRestriction *)iteratorRestrictions->Next();
436
 
            sentence += wxT("  ") +
437
 
                                        r->getLeft() +
438
 
                                                wxT(" ") +
439
 
                                                r->getRestriction() +
440
 
                                                wxT(" ") +
441
 
                                                r->getValue_s() +
442
 
                                                wxT(" ") + 
443
 
                                                r->getConnector() +
444
 
                                                wxT(" \n");
445
 
        }
446
 
        delete iteratorRestrictions;
447
 
 
448
 
        if(restrictions->restrictionsCount()>0)
449
 
        {
450
 
            if(r->getConnector().Contains(wxT("AND")))
451
 
            {
452
 
                sentence.Truncate(sentence.Length()-6);
453
 
            }
454
 
            else
455
 
            {
456
 
                sentence.Truncate(sentence.Length()-5);
457
 
            }
458
 
        }
459
 
        // ORDER BY PART
460
 
        gqbObjsArray* orderByColumns=model->getOrdByColumns();
461
 
        gqbObjsArray* orderByParents=model->getOrdByParents();
462
 
        charArray* typeOfOrder=model->getOrdByKind();
463
 
 
464
 
        size=orderByColumns->GetCount();
465
 
        if(size>0)
466
 
        {
467
 
            sentence+=wxT("\nORDER BY\n");
468
 
        }
469
 
        wxString typeOrder=wxT("");
470
 
        for(i=0;i<size;i++)
471
 
        {
472
 
            switch(typeOfOrder->Item(i))
473
 
            {
474
 
                case 'A':
475
 
                    typeOrder=wxT(" ASC");
476
 
                    break;
477
 
                case 'D':
478
 
                    typeOrder=wxT(" DESC");
479
 
                    break;
480
 
            };
481
 
            if(((gqbQueryObject*)orderByParents->Item(i))->getAlias().length()>0)
482
 
                sentence += wxT("  ") +
483
 
                                            qtIdent(((gqbQueryObject*)orderByParents->Item(i))->getAlias()) +
484
 
                                                        wxT(".") +
485
 
                                                        qtIdent(((gqbColumn*)orderByColumns->Item(i))->getName()) + 
486
 
                                                        typeOrder + 
487
 
                                                        wxT(", \n");
488
 
            else
489
 
                sentence += wxT("  ") +
490
 
                                            qtIdent(((gqbQueryObject*)orderByParents->Item(i))->getName()) +
491
 
                                                        wxT(".") +
492
 
                                                        qtIdent(((gqbColumn*)orderByColumns->Item(i))->getName()) +
493
 
                                                        typeOrder + 
494
 
                                                        wxT(", \n");
495
 
        }
496
 
 
497
 
        if(size>0)
498
 
            sentence.Truncate(sentence.Length()-3);
499
 
 
500
 
        sentence+=wxT(";");
501
 
    }                                             // Close Tables Count > 0 on model
502
 
    return sentence;
503
 
}
504
 
 
505
 
 
506
 
gqbQueryRestriction* gqbController::addRestriction()
507
 
{
508
 
    return model->addRestriction();
509
 
}
510
 
 
511
 
 
512
 
gqbQueryJoin* gqbController::addJoin(gqbQueryObject *sTable, gqbColumn *sColumn, gqbQueryObject *dTable, gqbColumn *dColumn, type_Join kind)
513
 
{
514
 
    return sTable->addJoin(sTable,dTable,sColumn,dColumn,kind);
 
255
                gqbQueryObject *sel = NULL;
 
256
                gqbIteratorBase *iteratorRestrictions = NULL;
 
257
                gqbIteratorBase *iteratorModel = NULL;
 
258
                gqbIteratorBase *iteratorJoins = NULL;
 
259
 
 
260
                // Projection Part [Select x,x,x...]
 
261
                gqbObjsArray *cols = model->getOrderedColumns();
 
262
                gqbObjsArray *tables = model->getColumnsParents();
 
263
                wxArrayString *alias = model->getColumnsAlias();
 
264
 
 
265
                int i, size = cols->GetCount();
 
266
 
 
267
                for(i = 0; i < size; i++)
 
268
                {
 
269
                        if(alias->Item(i).length() > 0)
 
270
                        {
 
271
                                if(((gqbQueryObject *)tables->Item(i))->getAlias().length() > 0)
 
272
                                {
 
273
                                        sentence += wxT("  ") +
 
274
                                                    qtIdent(((gqbQueryObject *)tables->Item(i))->getAlias()) +
 
275
                                                    wxT(".") +
 
276
                                                    qtIdent(((gqbColumn *)cols->Item(i))->getName()) +
 
277
                                                    wxT(" AS ") +
 
278
                                                    qtIdent(alias->Item(i)) +
 
279
                                                    wxT(", \n");
 
280
                                }
 
281
                                else
 
282
                                {
 
283
                                        sentence += wxT("  ") +
 
284
                                                    qtIdent(((gqbQueryObject *)tables->Item(i))->getName()) +
 
285
                                                    wxT(".") +
 
286
                                                    qtIdent(((gqbColumn *)cols->Item(i))->getName()) +
 
287
                                                    wxT(" AS ") +
 
288
                                                    qtIdent(alias->Item(i)) +
 
289
                                                    wxT(", \n");
 
290
                                }
 
291
                        }
 
292
                        else
 
293
                        {
 
294
                                if(((gqbQueryObject *)tables->Item(i))->getAlias().length() > 0)
 
295
                                {
 
296
                                        sentence += wxT("  ") +
 
297
                                                    qtIdent(((gqbQueryObject *)tables->Item(i))->getAlias()) +
 
298
                                                    wxT(".") +
 
299
                                                    qtIdent(((gqbColumn *)cols->Item(i))->getName()) +
 
300
                                                    wxT(", \n");
 
301
                                }
 
302
                                else
 
303
                                {
 
304
                                        sentence += wxT("  ") +
 
305
                                                    qtIdent(((gqbQueryObject *)tables->Item(i))->getName()) +
 
306
                                                    wxT(".") +
 
307
                                                    qtIdent(((gqbColumn *)cols->Item(i))->getName()) +
 
308
                                                    wxT(", \n");
 
309
                                }
 
310
                        }
 
311
                }
 
312
 
 
313
                if(!size)
 
314
                        sentence += wxT("  * \n");
 
315
                else
 
316
                {
 
317
                        // remove last ", "
 
318
                        sentence.Truncate(sentence.Length() - 3);
 
319
                        sentence += wxT("\n");
 
320
                }
 
321
 
 
322
                sentence += wxT("FROM \n");
 
323
 
 
324
                iteratorModel = model->createQueryIterator();
 
325
                while(iteratorModel->HasNext())
 
326
                {
 
327
                        sel = (gqbQueryObject *)iteratorModel->Next();
 
328
                        gqbSchema *schema = (gqbSchema *)sel->parent->getOwner();
 
329
                        if(sel->getAlias().length() > 0)
 
330
                        {
 
331
                                sentence += wxT("  ") +
 
332
                                            qtIdent(schema->getName()) +
 
333
                                            wxT(".") +
 
334
                                            qtIdent(sel->getName()) +
 
335
                                            wxT(" ") +
 
336
                                            qtIdent(sel->getAlias()) +
 
337
                                            wxT(", \n");
 
338
                        }
 
339
                        else
 
340
                        {
 
341
                                sentence += wxT("  ") +
 
342
                                            qtIdent(schema->getName()) +
 
343
                                            wxT(".") +
 
344
                                            qtIdent(sel->getName()) +
 
345
                                            wxT(", \n");
 
346
                        }
 
347
 
 
348
                }
 
349
                sentence.Truncate(sentence.Length() - 3); // remove last ", "
 
350
 
 
351
                // WHERE PART
 
352
                // [Joins]
 
353
                bool first = true, truncAnd = false;
 
354
                gqbQueryJoin *tmp;
 
355
                iteratorModel->ResetIterator();
 
356
                while(iteratorModel->HasNext())
 
357
                {
 
358
                        sel = (gqbQueryObject *)iteratorModel->Next();
 
359
                        if(sel->getHaveJoins())
 
360
                        {
 
361
                                truncAnd = true;
 
362
                                iteratorJoins = sel->createJoinsIterator();
 
363
                                while(iteratorJoins->HasNext())
 
364
                                {
 
365
                                        if(first)
 
366
                                        {
 
367
                                                first = false;
 
368
                                                sentence += wxT("\nWHERE \n");
 
369
                                        }
 
370
                                        tmp = (gqbQueryJoin *)iteratorJoins->Next();
 
371
 
 
372
                                        if(tmp->getSourceQTable()->getAlias().length() > 0)
 
373
                                                sentence += wxT("  ") +
 
374
                                                            qtIdent(tmp->getSourceQTable()->getAlias()) +
 
375
                                                            wxT(".") +
 
376
                                                            qtIdent(tmp->getSourceCol());
 
377
                                        else
 
378
                                                sentence += wxT("  ") +
 
379
                                                            qtIdent(tmp->getSourceQTable()->getName()) +
 
380
                                                            wxT(".") +
 
381
                                                            qtIdent(tmp->getSourceCol());
 
382
 
 
383
                                        switch(tmp->getKindofJoin())
 
384
                                        {
 
385
                                                case _equally:
 
386
                                                        sentence += wxT(" = ");
 
387
                                                        break;
 
388
                                                case _greater:
 
389
                                                        sentence += wxT(" > ");
 
390
                                                        break;
 
391
                                                case _lesser:
 
392
                                                        sentence += wxT(" < ");
 
393
                                                        break;
 
394
                                                case _equgreater:
 
395
                                                        sentence += wxT(" >= ");
 
396
                                                        break;
 
397
                                                case _equlesser:
 
398
                                                        sentence += wxT(" <= ");
 
399
                                                        break;
 
400
 
 
401
                                        }
 
402
 
 
403
                                        if(tmp->getDestQTable()->getAlias().length() > 0)
 
404
                                                sentence += qtIdent(tmp->getDestQTable()->getAlias()) +
 
405
                                                            wxT(".") +
 
406
                                                            qtIdent(tmp->getDestCol()) +
 
407
                                                            wxT(" AND\n");
 
408
                                        else
 
409
                                                sentence += qtIdent(tmp->getDestQTable()->getName()) +
 
410
                                                            wxT(".") +
 
411
                                                            qtIdent(tmp->getDestCol()) +
 
412
                                                            wxT(" AND\n");
 
413
                                }
 
414
                                delete iteratorJoins;
 
415
                        }
 
416
                }
 
417
                delete iteratorModel;
 
418
 
 
419
                gqbRestrictions *restrictions = model->getRestrictions();
 
420
 
 
421
                // Remove last " AND " from joins if there isn't restrictions, only left white space
 
422
                if(truncAnd && (restrictions->restrictionsCount() <= 0))
 
423
                        sentence.Truncate(sentence.Length() - 5);
 
424
 
 
425
                // Never found a join
 
426
                if (!truncAnd && (restrictions->restrictionsCount() > 0))
 
427
                        sentence += wxT("\nWHERE \n");
 
428
 
 
429
                //GQB-TODO: VALIDATE RESTRICTIONS
 
430
                iteratorRestrictions = restrictions->createRestrictionsIterator();
 
431
                gqbQueryRestriction *r = NULL;
 
432
 
 
433
                while(iteratorRestrictions->HasNext())
 
434
                {
 
435
                        r = (gqbQueryRestriction *)iteratorRestrictions->Next();
 
436
                        sentence += wxT("  ") +
 
437
                                    r->getLeft() +
 
438
                                    wxT(" ") +
 
439
                                    r->getRestriction() +
 
440
                                    wxT(" ") +
 
441
                                    r->getValue_s() +
 
442
                                    wxT(" ") +
 
443
                                    r->getConnector() +
 
444
                                    wxT(" \n");
 
445
                }
 
446
                delete iteratorRestrictions;
 
447
 
 
448
                if(restrictions->restrictionsCount() > 0)
 
449
                {
 
450
                        if(r->getConnector().Contains(wxT("AND")))
 
451
                        {
 
452
                                sentence.Truncate(sentence.Length() - 6);
 
453
                        }
 
454
                        else
 
455
                        {
 
456
                                sentence.Truncate(sentence.Length() - 5);
 
457
                        }
 
458
                }
 
459
                // ORDER BY PART
 
460
                gqbObjsArray *orderByColumns = model->getOrdByColumns();
 
461
                gqbObjsArray *orderByParents = model->getOrdByParents();
 
462
                charArray *typeOfOrder = model->getOrdByKind();
 
463
 
 
464
                size = orderByColumns->GetCount();
 
465
                if(size > 0)
 
466
                {
 
467
                        sentence += wxT("\nORDER BY\n");
 
468
                }
 
469
                wxString typeOrder = wxT("");
 
470
                for(i = 0; i < size; i++)
 
471
                {
 
472
                        switch(typeOfOrder->Item(i))
 
473
                        {
 
474
                                case 'A':
 
475
                                        typeOrder = wxT(" ASC");
 
476
                                        break;
 
477
                                case 'D':
 
478
                                        typeOrder = wxT(" DESC");
 
479
                                        break;
 
480
                        };
 
481
                        if(((gqbQueryObject *)orderByParents->Item(i))->getAlias().length() > 0)
 
482
                                sentence += wxT("  ") +
 
483
                                            qtIdent(((gqbQueryObject *)orderByParents->Item(i))->getAlias()) +
 
484
                                            wxT(".") +
 
485
                                            qtIdent(((gqbColumn *)orderByColumns->Item(i))->getName()) +
 
486
                                            typeOrder +
 
487
                                            wxT(", \n");
 
488
                        else
 
489
                                sentence += wxT("  ") +
 
490
                                            qtIdent(((gqbQueryObject *)orderByParents->Item(i))->getName()) +
 
491
                                            wxT(".") +
 
492
                                            qtIdent(((gqbColumn *)orderByColumns->Item(i))->getName()) +
 
493
                                            typeOrder +
 
494
                                            wxT(", \n");
 
495
                }
 
496
 
 
497
                if(size > 0)
 
498
                        sentence.Truncate(sentence.Length() - 3);
 
499
 
 
500
                sentence += wxT(";");
 
501
        }                                             // Close Tables Count > 0 on model
 
502
        return sentence;
 
503
}
 
504
 
 
505
 
 
506
gqbQueryRestriction *gqbController::addRestriction()
 
507
{
 
508
        return model->addRestriction();
 
509
}
 
510
 
 
511
 
 
512
gqbQueryJoin *gqbController::addJoin(gqbQueryObject *sTable, gqbColumn *sColumn, gqbQueryObject *dTable, gqbColumn *dColumn, type_Join kind)
 
513
{
 
514
        return sTable->addJoin(sTable, dTable, sColumn, dColumn, kind);
515
515
}
516
516
 
517
517
 
518
518
void gqbController::removeJoin(gqbQueryJoin *join)
519
519
{
520
 
    join->getSourceQTable()->removeJoin(join,true);
 
520
        join->getSourceQTable()->removeJoin(join, true);
521
521
}
522
522
 
523
523
 
524
524
void gqbController::setPointerMode(pointerMode pm)
525
525
{
526
 
    view->setPointerMode(pm);
 
526
        view->setPointerMode(pm);
527
527
}
528
528
 
529
529
 
530
530
void gqbController::emptyModel()
531
531
{
532
 
    view->emptyPanelsData();
533
 
    model->emptyAll();
 
532
        view->emptyPanelsData();
 
533
        model->emptyAll();
534
534
}
535
535
 
536
536
 
537
537
void gqbController::calcGridColsSizes()
538
538
{
539
 
    // Recalculate best internals sizes for all columns inside grids.
540
 
    ((gqbGridPanel *)view->getColsGridPanel())->SetGridColsSize();
541
 
    ((gqbCriteriaPanel *)view->getCriteriaPanel())->SetGridColsSize();
542
 
    ((gqbOrderPanel *)view->getOrderPanel())->SetGridColsSize();
543
 
    ((gqbJoinsPanel *)view->getJoinsPanel())->SetGridColsSize();
 
539
        // Recalculate best internals sizes for all columns inside grids.
 
540
        ((gqbGridPanel *)view->getColsGridPanel())->SetGridColsSize();
 
541
        ((gqbCriteriaPanel *)view->getCriteriaPanel())->SetGridColsSize();
 
542
        ((gqbOrderPanel *)view->getOrderPanel())->SetGridColsSize();
 
543
        ((gqbJoinsPanel *)view->getJoinsPanel())->SetGridColsSize();
544
544
}
545
545
 
546
546
 
547
547
void gqbController::setSashVertPosition(int pos)
548
548
{
549
 
    gqbContainer->UpdateSize();
550
 
    gqbContainer->SetSashPosition(pos,true);
551
 
    gqbContainer->SetMinimumPaneSize(pos);
552
 
    gqbContainer->UpdateSize();
 
549
        gqbContainer->UpdateSize();
 
550
        gqbContainer->SetSashPosition(pos, true);
 
551
        gqbContainer->SetMinimumPaneSize(pos);
 
552
        gqbContainer->UpdateSize();
553
553
}
554
554
 
555
 
int gqbController::getSashHorizPosition(){
 
555
int gqbController::getSashHorizPosition()
 
556
{
556
557
        return gqbMainContainer->GetSashPosition();
557
558
}
558
559
 
559
560
 
560
561
void gqbController::setSashHorizPosition(int pos)
561
562
{
562
 
    gqbMainContainer->UpdateSize();
563
 
    gqbMainContainer->SetSashPosition(pos,true);
 
563
        gqbMainContainer->UpdateSize();
 
564
        gqbMainContainer->SetSashPosition(pos, true);
564
565
 
565
 
  if(pos>=150 && pos<=200)
566
 
  {
567
 
          gqbMainContainer->SetMinimumPaneSize(pos);
568
 
  }
569
 
  else
570
 
  {
571
 
      gqbMainContainer->SetMinimumPaneSize(150);        
572
 
  }
573
 
  gqbMainContainer->UpdateSize();
 
566
        if(pos >= 150 && pos <= 200)
 
567
        {
 
568
                gqbMainContainer->SetMinimumPaneSize(pos);
 
569
        }
 
570
        else
 
571
        {
 
572
                gqbMainContainer->SetMinimumPaneSize(150);
 
573
        }
 
574
        gqbMainContainer->UpdateSize();
574
575
}
575
576
 
576
577
 
581
582
// GQB-TODO: fix 976 for real one value here and above
582
583
 
583
584
BEGIN_EVENT_TABLE(gqbSplitter, wxSplitterWindow)
584
 
EVT_SPLITTER_SASH_POS_CHANGED(976, gqbSplitter::onVerticalSashResize)
 
585
        EVT_SPLITTER_SASH_POS_CHANGED(976, gqbSplitter::onVerticalSashResize)
585
586
END_EVENT_TABLE()
586
587
 
587
 
gqbSplitter::gqbSplitter(wxWindow* parent, wxWindowID id, const wxPoint& point, const wxSize& size, long style)
588
 
:wxSplitterWindow(parent,id,point,size,style)
 
588
gqbSplitter::gqbSplitter(wxWindow *parent, wxWindowID id, const wxPoint &point, const wxSize &size, long style)
 
589
        : wxSplitterWindow(parent, id, point, size, style),
 
590
          tablesBrowser(NULL),
 
591
          browserPanel(NULL)
589
592
{
590
593
}
591
594
 
592
595
 
593
 
void gqbSplitter::onVerticalSashResize(wxSplitterEvent& event)
 
596
void gqbSplitter::onVerticalSashResize(wxSplitterEvent &event)
594
597
{
595
 
    wxSize s = tablesBrowser->GetSize();
596
 
    s.SetWidth(event.GetSashPosition());
597
 
    browserPanel->SetSize(s);
598
 
    tablesBrowser->SetSize(s);
599
 
    // GQB-TODO: Set a minimun value
 
598
        if(tablesBrowser != NULL && browserPanel != NULL)
 
599
        {
 
600
                wxSize s = tablesBrowser->GetSize();
 
601
                s.SetWidth(event.GetSashPosition());
 
602
                browserPanel->SetSize(s);
 
603
                tablesBrowser->SetSize(s);
 
604
                // GQB-TODO: Set a minimun value
 
605
        }
600
606
}