~ubuntu-branches/debian/sid/kexi/sid

« back to all changes in this revision

Viewing changes to src/doc/dev/TODO-Kexi-js

  • Committer: Package Import Robot
  • Author(s): Pino Toscano
  • Date: 2017-06-24 20:10:10 UTC
  • Revision ID: package-import@ubuntu.com-20170624201010-5lrzd5r2vwthwifp
Tags: upstream-3.0.1.1
ImportĀ upstreamĀ versionĀ 3.0.1.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
-----------------------------------------------------------------------------
 
2
 Kexi Development TODO Document
 
3
 From jstaniek's Point of View
 
4
 
 
5
 Also includes: win32 porting and multiplatform 
 
6
  features, planning, improving ideas, details
 
7
 
 
8
 Copyright (C) 2003-2007 Jaroslaw Staniek staniek at kde.org / OpenOffice Software
 
9
 Kexi home page: http://www.kexi-project.org/
 
10
-----------------------------------------------------------------------------
 
11
 
 
12
TODO: Kexi can use database as only medium for storing _all_ project's data
 
13
        and then can treat .kexi files as:
 
14
         -just export/import format for Kexi projects
 
15
         -medium for storing projects that use sqlite driver
 
16
         -simply: shortcut to project stored in database
 
17
 
 
18
HINT: DO NOT USE signals/slots for lowlevel data manipulation (e.g. loading data for tableviews)!
 
19
 
 
20
TODO: after kexi main window is activated again (from minimized state), 
 
21
     always 1st opened subwindow is activated
 
22
TODO: when editor in table cell is active: after click outside of it, editor should be closed (accepted)
 
23
 
 
24
TODO: FIX: QMetaObject::findSignal:KexiQueryPart: Conflict 
 
25
        with KexiProjectHandler::itemListChanged(KexiProjectHandler*) in KexiView
 
26
 
 
27
TODO: FIX vertical alignment in table view's cells based on corrent QFontMetrics (make tests for 
 
28
    different font sizes and names)
 
29
 
 
30
TODO: change texts in projectwizard to more descriptive:
 
31
"Authentication" --> "Database server's user authentication"
 
32
"Database Location" --> "Database Server Location"
 
33
 
 
34
TODO: [complexity=big] add command line kexi tools
 
35
 
 
36
TODO: install kexi-specific icons in apps/kexi/icons not as global
 
37
 
 
38
TODO(GUI):
 
39
-add "Change data source" button in project wizard
 
40
-after pressing this button, show "connections selection dialog"
 
41
-create "connections selection dialog" instead of project wizard:
 
42
--add "Always show me this advanced dialog" checkbox to connections selection dialog
 
43
--add "Set selected connection as default" checkbox to connections selection dialog
 
44
-old project wizard is now "connection wizard" (for creating new connection);
 
45
 "connection" created by user stores full info needed to get databases list
 
46
-connection data is a mime type of local xml file, so it can be used to create shortcuts
 
47
-kexi project is just connection extended with providing database name and user (local)
 
48
 settings for this given database
 
49
-on startup: by default offer:
 
50
--creating empty temporary db on startup with name "New database"
 
51
--creating new database using database wizard
 
52
--opening existing Kexi projects
 
53
--importing existing non-kexi databases
 
54
 
 
55
FIX: corrupted database can be created sometimes (eg. for tests/newapi sqlite dbcreation)
 
56
        --reason: maybe file was not flushed and app too early exited?
 
57
 
 
58
<SQLITE>
 
59
from: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
 
60
 
 
61
TODO: 
 
62
"Although SQLite parses named transactions, the names are ignored. 
 
63
SQLite does not support nested transactions. If you split the SQL statements in a transaction 
 
64
over several sqlite_exec() calls, you must be prepared to handle failure in each of these calls. 
 
65
If a failure occurs SQLite will return a non-zero value. After that, SQLite will revert to the 
 
66
default behavior of giving each SQL statement its own transaction until a new transaction is started."
 
67
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
68
---so: check if any sqlite_exec() failed and if so - update connection state as if rollback has been done.
 
69
 
 
70
TODO: use callbacks for fetching data (to avoid data copying)
 
71
TODO: "The SQLite library includes functions sqlite_encode_binary() and sqlite_decode_binary() 
 
72
in "encode.c". They can be used to safely encode binary data in a string form suitable for storing 
 
73
in SQLite, and safe for use in SQL queries. These functions are an "addition" to the SQLite library. 
 
74
They are not compiled into the library by default, and are not present in the precompiled binaries 
 
75
distributed on the download page."
 
76
 
 
77
TODO: add possibility in cursor: "Operating in-place on data returned by sqlite_get_table()"
 
78
 
 
79
TODO: add custom collation using sqlite3_create_collation() for:
 
80
  - non-latin1 characters
 
81
  - non-latin1 characters with NOCASE option
 
82
TODO: add option for use ":memory:" special file. 
 
83
  - Allow to use it also e.g. for migration, etc.
 
84
  - Allow to attach it as special portion of db
 
85
 
 
86
TODO: Use hints coming from "Understanding The Architecture Of SQLite" slides
 
87
      (optimization, etc.), http://www.sqlite.org/php2004/slides-all.html
 
88
 
 
89
TODO: table merge automaton:
 
90
                        Imagine you have a simple database with two tables, and a third to join them as a
 
91
                        many-to-many relationship. Someone sends me an SQLite database as a file which has the
 
92
                        same structure, but the data is different. I want to merge these two databases
 
93
                        together keeping all of the relationships intact, without duplicating data.
 
94
 
 
95
                        For example, if the tables were "customers" and "products" and the one in between
 
96
                        "orders", there is the possibility that some customers and/or products might be the
 
97
                        same, but with different primary keys. The problem is that since the databases were
 
98
                        independently created, a simple union will break the relationships since the primary
 
99
                        keys will overlap.
 
100
                        
 
101
                        I can think of brute force ways to do this, but I was wondering if anyone might have a
 
102
                        good algorithm or technique to accomplish this efficiently.
 
103
                        
 
104
TODO: add support for PRAGMA page_size on new db creation, 
 
105
                        and e.g. propose default values for win32
 
106
                        http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows
 
107
                        (see also other optimization mentioned here)
 
108
TODO: consider using legacy_file_format (http://sqlite.org/pragma.html#pragma_legacy_file_format)
 
109
 
 
110
TODO: In Memory database/tables: how to load an sqlite file to be entirely fit in the memory?
 
111
   clever solution: "You could set the cache size as big as your database file (via pragma). 
 
112
   This should load all (used) data into memory. This is probably not a good solution 
 
113
   if your application does not run for a longer time. "
 
114
TODO: add autovacuum support on SQLite db creation?
 
115
 
 
116
TODO: use sqlite3_set_authorizer() to get fine-grained access control support
 
117
TODO: use SQLite's > 3.3.6 ability to load new SQL functions and collating sequences from shared libraries and DLLs
 
118
      http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions
 
119
TODO: use Virtual Tables to get external virtual data like CSV live queries
 
120
      http://www.sqlite.org/cvstrac/wiki?p=VirtualTables
 
121
TODO: use triggers to get undo/redo: http://www.sqlite.org/cvstrac/wiki?p=UndoRedo
 
122
 
 
123
TODO: implement autoincrement for any field (also multiple fields) using the triggers; example:
 
124
        CREATE TABLE test (a integer, b integer, txt text);
 
125
        CREATE TRIGGER test_a_seq_trigger AFTER INSERT ON test FOR EACH ROW BEGIN update test set a=(ifnull((select max(a)+1 from test), 1)) where rowid=new.rowid and new.a isnull; END;
 
126
        CREATE TRIGGER test_b_seq_trigger AFTER INSERT ON test FOR EACH ROW BEGIN update test set b=(ifnull((select max(b)+1 from test), 1)) where rowid=new.rowid and new.b isnull; END;
 
127
        insert into test values (null, null, 'foo');
 
128
        insert into test values (null, 7, 'bar');
 
129
        insert into test values (null, null, 'text');
 
130
        a|b|txt
 
131
        1|1|foo
 
132
        2|7|bar
 
133
        3|8|text
 
134
        Then, support the following grammar in KEXISQL:
 
135
        CREATE TABLE test (a integer autoincrement, b integer autoincrement, txt text);
 
136
                                     ^^^^^^^^^^^^^           ^^^^^^^^^^^^^
 
137
 
 
138
</SQLITE>
 
139
 
 
140
<RENAME_PROPOSALS>
 
141
ALSO TODO: move all simple widget classes (e.g. KexiSettings, KexiTabBrowser) 
 
142
from core, to more detailed dirs,
 
143
and projectWizard/ to wizards/ (there will be more wizards soon)
 
144
 
 
145
</RENAME_PROPOSALS>
 
146
 
 
147
TODO:
 
148
- add kexi__parts (p_id integer, p_type) table and appropriate part objects in kexi__objects
 
149
 
 
150
 
 
151
 
 
152
MOST RECENT TODO:
 
153
- reuse recent project tab as separate window for "More projects..." menu action [difficulty: 1]
 
154
- implement contents update for "recentprojects" menu action [difficulty: 2]
 
155
- implement: drag-and-drop of the project file to the outside of Kexi, [difficulty: 2]
 
156
- saveas== saving another shortcut to a project if it is server-based [difficulty: 2]
 
157
 
 
158
TODO: improve security for password information in .kexis files
 
159
TODO: for .kexis files' connection data - if password attr. is not present - ask for password
 
160
IDEA: integrate password information in .kexis files with KWallet
 
161
 
 
162
 
 
163
TODO: Put Connection::dropTable() and Conenction::dropQuery() INSIDE TRANSACTION!!!!!!!
 
164
 
 
165
TOP REQUESTED FEATURES LIST @ PL EXPO 2004:
 
166
- ODBC driver (hello mattr!)
 
167
- Access -> Kexi migration tool (done)
 
168
- scripting
 
169
 
 
170
=== General TODO ===
 
171
- avoid using veryvery long names for objects
 
172
- IDEA: Learning module. A special optional pane which shows what commands are sent to server 
 
173
   for learning purposes.
 
174
- IDEA: Server-side wrapper for db connections (very simple) that allows anonymous [1]
 
175
  (or any predefined group of users [2])
 
176
  -- wrapper handles connections by validating *virtual* usernames and passwords for [1] case, 
 
177
     or providing unique virtual user names and passwords for [2] case
 
178
  -- on the server side, wrapper connects to database server (it can be available locally or remotely)
 
179
     using it's private user name and password. Thus, we only need one *physical* user name and password 
 
180
     for multiple users. Virtual names/passwords are mapped to physical one.
 
181
     This is a solution for hosted database servers where it's hard to create as many users 
 
182
     as actually needed.
 
183
  -- Priviledges are mapped as well, and translated. By default, user A could be able to create his/her
 
184
     own database and drop it. He/she couldn't be able to do the same with user's B databases, 
 
185
     until user B allow this. The same for creating tables, and writing data.
 
186
  -- wrapper secures server from too large data sets being sent to server 
 
187
     (parameters need to be configurable)
 
188
  -- it's all dedicated for Kexi; so it's NOT a generic wrapper for any database client.
 
189
- add "ADVANCED" find dialog: like in Mozilla Advanced Address Book Search window
 
190
 
 
191
=== USABILITY TODO ===
 
192
-add "Simple/Advanced Usage" global option
 
193
--for simple usage:
 
194
--use captions everywhere possible, instead of names (tables, fiels, etc.); names should be autogenerated
 
195
 
 
196
=== i18n ===
 
197
- plugins/forms/kexiformpart.cpp "Best Fit" instead of "To Fit" (pl=Najlepsze dopasowanie)
 
198
- KexiQueryDesignerGuiEditor::initTableColumns(): i18n("Visible") --> i18n("Column visible", "Visible")
 
199
- add comment for translators: i18n("'empty' is an adjective here", "Empty database")
 
200
-"Could rename table \"%1\" using the same name."
 
201
  --> "Could NOT rename table \"%1\" using the same name."
 
202
 
 
203
I am using update_kexi_po to recreate kexi.po file. THis will run cd calligra/ && make -f admin/Makefile.common package-messages
 
204
 
 
205
 
 
206
=== Import/Export Framework TODO ===
 
207
-KEXIDB: add lower level functions like: "getting table names list", "getting table schema",
 
208
  "getting index schema"
 
209
 
 
210
=== Combo box editor TODO ====
 
211
-new layout: a lineedit + dropdown button + popup tableview, when needed
 
212
-use (and add few) methods for tableview to enable adjusting it for use it as dropdown tv
 
213
--add scrolling for mouse dragging
 
214
-dropdown tv has to contain:
 
215
--QSizeGrip at the bottom corner
 
216
-in kexidb: implement combobox settings for the foreign field:
 
217
--ordered set of fields that are visible in popup tableview (ie. just query that is bound with the column)
 
218
-use multi-key relations from kexidb
 
219
- copy should handle "displayed" value, not the real one 
 
220
  (maybe let's use a custom clipboard mimetype? (containing a bound value) -- otherwise 
 
221
  it will be not posible to paste the copied value)
 
222
- fix support for query as the row source
 
223
- (forms combo) repaint (remove focus rectangle) when other widget is focused using a mouse click
 
224
 
 
225
=== Table View TODO ====
 
226
- do not accept when entering "-" for unsigned numeric types
 
227
- add a functions for moving/cutting/copying/pasting rows
 
228
- extended support for enums (combo boxes)
 
229
- add top-left button that allow select all rows
 
230
- enable clicked vheader button to select given row
 
231
- enable column dragging
 
232
- add action "restore original column order"
 
233
- add possibility of renaming column by 1) dbl-clicking header 2) "rename column" action
 
234
- more actions (as in Format and Insert menus of MSA2k3)
 
235
- add own impl. (based on Qt) for date/time editor because:
 
236
-- no focusSection(), etc. is available in current impl.
 
237
-- frames cannot be easily removed
 
238
-store last sorting column (and type) and load it on KexiTableView::setData()
 
239
 (not it's only cleared)
 
240
- replace KexiDB::RowData usage in KexiTableItem with something faster
 
241
- TODO RELATED TO CELL EDITORS:
 
242
        - signal on situation when user e.g. pressed alpha key when only numeric chars is allowed
 
243
        - signal when null/empty value forcell isn't permitted
 
244
        - signal when repeated value isn't permitted
 
245
        - add support for cut, copy & paste of cell's contents (get shortcuts from KStdAccel)
 
246
HINT: removing Qt::WStaticContents from KexiTableView ctor fixed repaint problem
 
247
        the problem was with repainting when hscrollbar disapperars....
 
248
- KexiTableView loads all data from the table: very slow and consumes a lot of memory:
 
249
        (e.g. for each record with 3 fields: 1 integer, 1 text and 1 float consumed ~350B)
 
250
  - ctors and dtors are WAY TOO SLOW!
 
251
  - add an option: for bigger tables load only part of the table data
 
252
  - optimize MySQL record size
 
253
- add focus rectangles for cells: 
 
254
  http://mfc.dundas.com/mfc/grid/index.aspx?section=Grid&body=focusrectangles.htm
 
255
- add more cell types & options:
 
256
  http://mfc.dundas.com/mfc/grid/index.aspx?section=Grid&body=celltypes.htm
 
257
        --including: red corner with a note; sliders; radio buttons
 
258
- highlight sorted column's cells slightly darker, like in current KListView's impl.
 
259
- clicking on a header section (to sort), it ensures current cell is visible, but 
 
260
  only y-position should be changed, not x
 
261
- add support for crossed out rows - that can be used for results of DELETE queries
 
262
  (see http://www.gnome-db.org/images/screenshots/mergeant_table_data.png)
 
263
- add combo boxes for fields filtering in column headers, 
 
264
  as in http://www.sqlmanager.net/i/scr/mysql/manager/Main%20100.gif
 
265
- display autonumber indicator in autonumbered column(s)
 
266
- reimplement header widget to better show sorting indicators
 
267
- display tooltip over cells that are to small to display entire contents
 
268
- Add icons for conditional formatting: http://blogs.msdn.com/excel/archive/2006/05/09/594200.aspx
 
269
  (displaying icons is already possible using custom properties, BTW)
 
270
- display [null]  values in boolean fields, e.g. as [?]
 
271
- allow to select entire rows, columns and grids as in a spreadsheet; 
 
272
  offer copy/cut/paste/copy-to-file/clear for such selections
 
273
- tooltips: 
 
274
-- implement tooltip manager (this will allow to create custom tooltips)
 
275
-- use  if ( QApplication::isEffectEnabled( UI_AnimateTooltip ) == FALSE ||....
 
276
   as in qtooltip.cpp:564
 
277
-- implement custom tooltip for large texts and BLOB, add "zoom" option at the bottom of the tooltip
 
278
   (zooming should not show a modal dialog but rather a widget inside the TV)
 
279
-- add the same zoom option to the context menu
 
280
-- also show tooltips when the content is only partially visible
 
281
- fix horizontal scrollbar's width updating: large tables like 'tabkodypocztowe1' hide the 'last' and 'new' buttons
 
282
- display default values for BLOB types
 
283
 
 
284
- add "None" option for editors supporting 3rdState, e.g. int, string (needed for "default"
 
285
  property of the Table Designer)
 
286
- fix repainting cells when moving down/up arrow at the window boundaries 
 
287
  (weird, win32 is not affected)
 
288
 
 
289
- (e.g. in table designer): in an empty row 1. drop down a type combo. 2. do not select enything an click outside
 
290
 of it. 3. 
 
291
- do not autoscroll vertically the contents if the current column is wider than the view 
 
292
  (my example: 'microsoft_terminology' table's 1st column) because the text us unreadable 
 
293
  valid even when we use arow keys only
 
294
 
 
295
- KexiComboBoxTableEdit::createInternalEditor():
 
296
   set d->internalEditor visible and use it to enable data entering by hand 
 
297
   (for now only types based that use KexiInputTableEdit (Text, Integer..) allows data entry using keyboard
 
298
 
 
299
- display error message on top of table view if data fetching failed
 
300
- add a vertical [A B ... Z] shortcut list for text-based sorting, like on "My Connections" page of linkedin.com
 
301
 
 
302
==== ALTER TABLE TODO: =============
 
303
-add a function for editing indices (including multi-field indices)
 
304
  2 methods: 1) in additional dock 2) in property editor
 
305
-add all missing properties (even when most are not working)
 
306
-add "index" information icon @ the left hand of line with key(s) that is/are indexed
 
307
-in propeditor: auto-sync pkey, unique, required & indexed properties on changing;
 
308
  add message boxes if needed
 
309
-for 'column width' property: add 'default' value at the beginning
 
310
-propose index key (ask for name) on saving tables without index (allow to bypass this message)
 
311
- re-add "tablepart_toggle_pkey" action after shared toggle actions fix:
 
312
--when propeditor is focused, there's a problem with syncing on/off state of toolbar button
 
313
  of "tablepart_toggle_pkey" action 
 
314
  --> altertable view doesn't receive the signal about toggling (because it's not focused)
 
315
 
 
316
==== Forms TODO ====
 
317
-add "datasheet view" to db-aware forms
 
318
-add [NewFormDefaults] option group and:
 
319
--add "autoTabStop" (bool) 
 
320
^^^ implement above so Form::autoAssignTabStops() will be called before form saving 
 
321
    and before switching to data mode (this is already performed in FormIO::saveFormToDom().
 
322
- add setting expressions for data-aware widget's dataSource
 
323
- add setting anonymous (not stored) queries as form's dataSource
 
324
- display "Autonumber" string for data-aware widgets
 
325
- implement shared action categories to filter out them in 'assigning actions to push buttons'
 
326
- implement "restore default properties" action for widgets
 
327
- allow form's surface resizing when there's global layout defined
 
328
- fix repainting form's surface boundaries repainting when its size is changed by entering 
 
329
  value in the propeditor
 
330
- fix spring behaviour: it cannot be shrinked if its inside a layout
 
331
- KTextEdit doesn't allow to set custom cursor (also in Qt Designer)
 
332
- support for multiple widgets selection in the property editor (requires changes to kexiproperty)
 
333
- handle older and newer formats in FormIO::loadFormFromDom()
 
334
- KAcceleratorManager::setNoAccel(QWidget*) - use it in data mode, 
 
335
    define "auto accels" form's property and if it's false
 
336
- find a way to create more meaningfull default names for widgets than button1, button2.
 
337
  Maybe convert widget text (if available) using string2Identifier()?
 
338
  Maybe ask user to enter meaningfull name (+"do not ask this question again" checkbox)?
 
339
  See also http://charlespetzold.com/etc/DoesVisualStudioRotTheMind.html
 
340
- For newer widget types, add information for compatible widgets that 
 
341
  can be used instead of them. For best flexibility save this information in a form XML. 
 
342
  Example use: We have Kexi version N and N+1. In N+1 there's KexiFrame widget introduced that
 
343
  extends QFrame with more features. Kexi N has no KexiFrame implemented but only QFrame.
 
344
  When KexiFrame witget type has been encountered in the form's XML string, 
 
345
  Kexi N it is able to insert QFrame instead of KexiFrame (unsupported properties will be just ignored).
 
346
  The result of substitution may be not accurate, so thing twice before adding such information
 
347
  for a given widget type.
 
348
- add "buttonStyle" property for pushbutton widget with following values:
 
349
-- Button - the deafult
 
350
-- Hiperlink - clickable hiperlink will be displayed instead of button itself
 
351
-- Image - an clickable image will be displayed instead of button itself
 
352
   For this value, aditional properties will make sense: 
 
353
--- image, mouseOverImage, mouseDownImage
 
354
-- Thus, we'll have more consistent solution than MSA, which allows to 
 
355
   mess the form by setting hiperlinks directly also in Image box and Label widgets
 
356
- add "icon" property for pushbutton
 
357
- For "OnCLick" property:
 
358
-- allow to set hiperlink (and anchor) as value (i.e. so called "target location")
 
359
  (see MSA's hiperlinkaddress, hiperlinksubaddress properties)
 
360
- frame widget:
 
361
-- add such fancy frame: http://www.themaninblue.com/writing/perspective/2004/08/05/
 
362
- tab widget: add color property for setting particular tab 
 
363
- add a Scratchpad as in QtDesigner4, allows to drag&drop widgets between forms...
 
364
- Use RESET clause for Q_PROPERTY, eg. RESET unsetPalette for paletteBackgroundColor.
 
365
  Then, use bool QMetaProperty::reset ( QObject * o ) const to reset property value in the propeditor.
 
366
- Autoforms: allow to define groups of fields so the fileds can be displayed with nice groupo boxes.
 
367
  (e.g. http://www.glom.org/screenshots/glom_data_details.png)
 
368
  This definition shgould be made during table design, so we can reuse groupping information also in
 
369
  autoreports and auto web forms. Especially usable for tables with lots of fields.
 
370
  We could even define the groupping levels so top-level groups can be splitted using Tab Wigget.
 
371
- fix support for blob visible values for the combo box widget
 
372
- unhide "widgetType" property for Auto Field
 
373
 
 
374
==== Property Editor TODO: =========
 
375
- text does not fit well inside combobox editor
 
376
- double editor should be klineedit with doublevalidator, not spinbox
 
377
- add a hint for propertybuffer to allow properties to be displayed side-by-side
 
378
  e.g. width, height properties ca be displayed this way. See also property editor 
 
379
        at http://freshmeat.net/screenshots/41728/
 
380
-KexiProperty: make it really shared (using QShared?)
 
381
-for each row (property) allow to define double-click-action dependent on property type,
 
382
 * e.g. bool editor: toggle true/false,
 
383
 * enum editor: select next value (circularly),
 
384
 * fire selection dialog for filename editor, color editor, pixmap editor, etc.
 
385
 * expand children for cells of type like "Rect"
 
386
 * other types- by default: just move cursor to editor
 
387
- add support for "set" types (e.g. AlignTop|AlignBottom) and port form's objpropertybuffer to this
 
388
- add "description" label on the bottom of the property editor; 
 
389
  it should reuse Property::description() text
 
390
- support Variant type (needs update in Editor) so Property::setValue() won't show a "INCOMPATIBLE TYPES!" warning
 
391
  (needed e.g. by KexiTableDesignerView for "defaultValue" property)
 
392
 
 
393
==== Query Designer TODO: ======
 
394
- add tables dropping from the browser
 
395
- add a dialog for inserting multiple tables at a time
 
396
- fix connections drawing
 
397
- make "1" and "inf" signs a bit larger (scalable)
 
398
- 'totals' are unused yet
 
399
- update query after change in Connection cache
 
400
- for queries like 'select * from a, b, c' allow to enter * in 'table' column
 
401
--this should also work when we're recreating field rows on switching from SQL view to design view
 
402
- query part: react on KexiProject::aboutItemDelete() and KexiProject::aboutItemRename() signals
 
403
- query parameters:
 
404
-- use a special dialog with validators compatible with the field type for getting query parameters
 
405
   (currently KInputDialog is used)
 
406
-- use dialog like KInputDialog::getItemList() for supporting multiple values as query parameters
 
407
- support add "PARAMETERS [prompt1] datatype1, [prompt2] datatype2;" syntax to the parser, 
 
408
  and add query "Query parameters" dialog/pane, allowing to order parameters that user should 
 
409
  provide (Ks. eksp., p. 73)
 
410
- ADDINs: a tree dialog showing query dependencies, and query templates like these http://www.4tops.com/query_tree.htm
 
411
 
 
412
==== SQL Editor TODO: =====
 
413
- intergrate editor's (KPart) actions with KexiMainWindow's Actions
 
414
- win32: katepart on win32: void KateSyntaxDocument::setupModeList (bool force)
 
415
   Works slowly for the 1st time because there is no cache. 
 
416
   Workaround: removed most of apps/katepart/syntax/*.xml files
 
417
- win32: fix freeze on 1st char entering
 
418
- win32: fix mmap for win9x (InterlockedCompareExchange() replacement is needed 
 
419
  -> see kdelibs/win/mmap.c)
 
420
- call qApp->processEvents() on highlighting schema loading, 
 
421
  so 'wait' cursor can be visible on 1st loading.
 
422
- allow saving invalid queries (KexiQueryDesignerSQLView::storeNewData())
 
423
  (for invelid queries, after opening SQL view should be shown automatically)
 
424
- allow to copy error message (e.g. using a copy button) 
 
425
  + allow to select message text (use active label?)
 
426
 
 
427
==== Main window TODO ====
 
428
- propeditor dock window is hidden when a window in data view mode is active 
 
429
  (or no window is present). This feature is partially disabled 
 
430
  (using PROPEDITOR_VISIBILITY_CHANGES), though,
 
431
  --REENABLE when blinking and dock width changes will be removed in KMDI
 
432
- add sorting projects information using KexiProjectData::lastOpened
 
433
- also add this info as "Database>Open Recent" menu subentry
 
434
- display errors when plugin library could not be instantiated due to a broken lib
 
435
- Project Navigator: display multiline item names is needed
 
436
- display progress bar (in the statusbar?) to indicate there're pending jobs
 
437
- enlarge the default main window size, currently it's ~50% ofthe desktop size 
 
438
  - not convenient as user is forced to enlarge the window by hand (settings are stored though)
 
439
- add "File->Save All" action
 
440
- add settings dialog, KConfigXT based simple version 
 
441
   + about:config-like using kconfigeditor http://extragear.kde.org/apps/kconfigeditor/
 
442
     (possible reuse of koproperty)
 
443
 
 
444
TODO: add SharedAction::setVisible() and use QMenuData::setItemVisible() where needed
 
445
 
 
446
CCPASTEUR: 
 
447
        -perhaps we'd reuse KDE Menu editor GUI?
 
448
 
 
449
=== KexiDB TODO ===
 
450
- add to field's properties list: input mask, validation rule, column width
 
451
- improve Expression class, add code for generating expression 
 
452
 strings in Connection::queryStatement()
 
453
- add dynamic resize for dict members like Connection::m_tables
 
454
- make KexiDB really ASYNC, multithreaded!
 
455
- implement relationships (foreign key information) between tables + storage
 
456
-- Support three standard types of integrity rules as described at http://allenbrowne.com/ser-64.html
 
457
    plus: Cascade to Null Relations
 
458
-- SQLite now supports it: http://sqlite.org/foreignkeys.html
 
459
-- support composite foreign keys (SQLite now supports them too)
 
460
- implement GROUP BY clause + storage
 
461
- add schema to kexi__* tables on createTable()
 
462
- add support for creation temporary databases
 
463
- look at Connection::isReadOnly() to see if we can perform certain operations 
 
464
   requiring write access (create db, update db props, etc.)
 
465
- reuse ConnectionData::useLocalSocketFile for connections using socket file
 
466
- Connection::alterTableName():
 
467
--alter table name for server DB backends!
 
468
--what about objects (queries/forms) that use old name?
 
469
- PGSQL: use setval(sequence) to allow setting autonumber values by hand
 
470
   http://www.postgresql.org/docs/7.4/interactive/functions-sequence.html
 
471
- optionally, introduce EDITABLE_AUTONUMBER_FIELDS driver flag
 
472
PiggZ_  js: and to ensure you always have id 1 and 2, well.....they would be anyway at db creation time as sequence = 0
 
473
        js      PiggZ_: but users ofter want to enter it anyway
 
474
        js      eg. sqlite increments its autonumber to 1001 if you enter 1000
 
475
        js      we want nothing more that that
 
476
        js      s/than that
 
477
        PiggZ_  personally, i never want to enter a value into autonumber.....autonumber usually = pkey, so its best to let the db handle it
 
478
        js      If use want strict sequences to be used, he can:
 
479
        js      1) hide autonumber column at all
 
480
        js      2) set it not-editable
 
481
        js      3) or just do not touch this column
 
482
        PiggZ_  well then, its probably best to set the value of the sequence if a value is manually entered...if possible
 
483
 
 
484
- add an QAsciiDict of (reserved) SQL keywords and use it in Driver::escapeIdentifier()
 
485
- add FieldType and move things like typeGroupString() there
 
486
- CRASH: removing tables when a query still uses it. 
 
487
  HOW TO FIX: Add TableSchema::Ptr, QuerySchema::Ptr, etc.
 
488
-- related to above: add a possibility to return all objects (and optionally all opened objects)
 
489
  thad depend on a given table
 
490
-- we could also add a GUI tree to show these dependencies
 
491
- add permissions information to connection : and - for sqlite - check if file is RO
 
492
   and then set RO flag
 
493
- add kexi__toremove table, and use it to remove objects on begin connection
 
494
- [Kexi 0.2?] sometimes a user has got only one database availaliable on a server 
 
495
  (eg. when server is commercially hosted). Somethime user isn't just able 
 
496
  to create database because of insuffficient privileges. 
 
497
  Solutions --> add a possibility of sharing multiple projects within the same database
 
498
      * kexi__* tables will be shared
 
499
      * prefixes can be needed for table names (add option to set or unset this)
 
500
      * prefixes will be hidden (stripped out) by KexiDB from real names, eg. 'mydb_mytable' -> 'mytable'
 
501
      * let's set default prefix equal to database name
 
502
      * within a group of "projects sharing the same databse" it will be easier to:
 
503
       ** mount (attach) external projects to an opened Kexi project
 
504
       ** run queries using tables from many projects
 
505
      * disadvantages:
 
506
       ** decreased modularity and data encapsulation
 
507
       ** possible problems with transactions and user access rights
 
508
       ** custom table names can look weird outside Kexi
 
509
       ** the feature adds another level of complexity to KexiDB
 
510
-define "login timeout" setting (in seconds) so connecting can rely on this value.
 
511
 The setting could be assigned to a given connection data, 
 
512
 but could be also defined globally for the application. 
 
513
 (note: db:login-timeout is defined by opendocument spec.)
 
514
- take a look at agrep: http://www.tgries.de/agrep/ -- looks loke it manages to convert 
 
515
  non latin1 characters to latin1, eg. '' to 'a':
 
516
  "*  option -ia searches case-insensitive
 
517
     ISO characters are mapped to the nearest lower ASCII equivalent."
 
518
- support for COMPOUND KEYS, ie. keys with 2+ fields; http://en.wikipedia.org/wiki/Compound_key
 
519
- OPTIMIZATION: use PREPARE and EXECUTE statements for some backends, eg. for pgsql:
 
520
        (excerpt from http://www.postgresql.org/docs/8.0/interactive/sql-prepare.html)
 
521
        1. Create a prepared query for an INSERT statement, and then execute it:
 
522
                PREPARE fooplan (int, text, bool, numeric) AS
 
523
                        INSERT INTO foo VALUES($1, $2, $3, $4);
 
524
                EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
 
525
        2. Create a prepared query for a SELECT statement, and then execute it:
 
526
                PREPARE usrrptplan (int, date) AS
 
527
                        SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
 
528
                        AND l.date = $2;
 
529
                EXECUTE usrrptplan(1, current_date);
 
530
        3. For completnedd, provide KexiDB API for "DEALLOCATE" as well
 
531
- Implement "copy table" feature. 
 
532
  To copy table t1 as t2 with data use: "create table t2 as select * from t1"
 
533
  To copy table t1 as t2 without data use: "create table t2 as select * from t1 limit 0"
 
534
  NOTE: pkeys, triggers, default values are not copied?
 
535
 
 
536
- BLOBs in MySQL: max_allowed_packet is 1MiB; read http://dev.mysql.com/doc/mysql/en/blob.html
 
537
 and http://dev.mysql.com/doc/mysql/en/server-parameters.html
 
538
-- http://bugs.mysql.com/bug.php?id=1605 "MySQL protocol (it does not send 'chunked streams'
 
539
for blobs...The client has to read the _entire_ blob into memory."; use:
 
540
 "select substring(document, 1, 10240) from documents where docid='3'"  this to get chunks:
 
541
 "select substring(document, 10241, 10240) from documents where docid='3'"
 
542
 ....
 
543
-- Other approach: store binary data using two tables 1st for metainfo about the data, 
 
544
 2nd for data chunks (e.g. 64KiB each): http://php.dreamwerx.net/forums/viewtopic.php?t=6
 
545
 
 
546
?????   is it possible to just use a database and store the kexi stuff in a .kexi file?
 
547
        jstaniek        ruurd: you just dont want to create kexi__* tables on your database?
 
548
        ruurd   yes, and use an existing database.
 
549
        jstaniek        ruurd: that's planned but note:
 
550
        jstaniek        this option doesn't offer you atomic changes to database schema, by definition, because two database conenctions are started concurrently.
 
551
        jstaniek        So we'll need to behave with care...
 
552
        jstaniek        ruurd: of course this is easier to do with read only databases or even databases where you don't plan to change schema (but just process db records)
 
553
- add Connection::ping() or so, using http://dev.mysql.com/doc/mysql/en/mysql-ping.html
 
554
  and use it after being idle for a while (eg. call it every minute; also add an option for the delay)
 
555
- Move ObjectStatus to kexidb. Merge with Object.
 
556
- Support for opening .sql files: just import it on opening to in-memory database and dump it back into
 
557
  .sql text on exisitng. Add optional compressing.
 
558
- Add support for compressed kexi files (better keep the same .kexi extension instead of .kexiz)
 
559
- Implement tree structures using idea #5 described here http://www.depesz.com/various-sqltrees.php
 
560
  (does pgsql require this hack?)
 
561
- double values are still rounded: consider storing them in memory as a decimal type 
 
562
  (e.g. using a special Q_LLONG+decimalplace class); needed e.g. in KexiQueryParameters::getParameters()
 
563
- handle input mask using a special KexiDB::FieldInputMask class
 
564
  --needed in forms (KexiDBLineEdit::setColumnInfo()) and table views
 
565
- add setValue() to cursors: this will REQUIRE a buffered cursor, since we cannot run sql 
 
566
  before fetching is done... See http://kexi-project.org/cgi-bin/irclogger_log/kexi?date=2006-08-03,Thu&sel=229#l225
 
567
- use ThreadWeaver library for threaded KexiDB version
 
568
- tables can use queries as a row source for lookup fields, what can lead to infinite recursion;
 
569
  FIX this by either: 1) not allowing to use such table in a query (see kexi/to_fix/Ksiazka_adresowa2_recursive_query_deadlock.kexi)
 
570
  or 2) delayed loading of query column
 
571
- parse server-specific messages like "column t is not unique" in sqlite with and use this
 
572
 
 
573
=== KexiDB Parser TODO ===
 
574
- add a method for replacing a single given table name in the statement (useful on table renames)
 
575
- add clever query relatins parsing 
 
576
      (needed for switching back to GUI editor from text mode)
 
577
- add flexible support for date/time constants
 
578
- store text position information (line, column) for every token so it can be used 
 
579
   in SQL editor to place cursor in case of errors
 
580
- add translation method for SQL operators to driver, 
 
581
  so SQLite can return "CONCAT" and mysql return "||" for concatenation oeprator, and so on
 
582
- improvement in terms of data recovery: 
 
583
  assume you're entering a long record and db connection is dead before saving...
 
584
  the record could be buffered locally before closing Kexi application... and on next startup, re-sent.
 
585
  This can work in simple cases (when complex transactions are not involved).
 
586
- report "ambiguous field name 'id'" error for ambiguous queries like "SELECT a.id, b.id FROM a, b ORDER BY id"
 
587
- add types checking to **Expr::validate()
 
588
- consider switching from bison/flex to http://www.antlr.org/
 
589
- make parser reentrant (for now we've used a workaround)
 
590
 
 
591
=== KexiDB MySQL Driver TODO ===
 
592
- use InnoDB instead of MyISAM tables because of transactions support
 
593
 http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html
 
594
 Kexi's MySQL driver uses MyISAM engine, but transaction support needs InnoDB
 
595
 (there should be also an option available to set on CREATE TABLE, and on an default for CREATE DATABASE)
 
596
 
 
597
=== KexiDB PostgreSQL Driver TODO ===
 
598
- port to libpq
 
599
- set version information in drv_useDatabase()
 
600
  There's connection_base::server_version() in libpqxx trunk - 
 
601
  http://thaiopensource.org/development/libpqxx/file/trunk/include/pqxx/connection_base.hxx
 
602
 
 
603
=== KEXIDB TESTS=== 
 
604
- add tests for DatabaseProperties
 
605
- add tests for PreparedStatement
 
606
- add tests for migration
 
607
 
 
608
=== Startup TODO ===
 
609
- reuse KexiNameWidget in KexiNewProjectWizard!
 
610
- use KPasswordDialog::disableCoreDumps() for security reasons
 
611
- IDEA for connection shortcuts:
 
612
  Mysql Query Browser has a simple xml file defined:
 
613
  http://dev.mysql.com/doc/query-browser/en/mysql-gui-appendix-store-connections.html
 
614
- allow to choose if the file should be locked (opened in EXCLUSIVE mode) or not
 
615
  (THIS SHOULD BE DEFAULT BEHAVIOUR)
 
616
- (linux) remove stupid message 'Please select the file to open' 
 
617
   when opening exisiting server project and clicking 'OK'
 
618
- database files accessed remotely: make it work without copying a file to temp. dir. 
 
619
  (maybe even without copying entire file? - patching sqlite required)
 
620
- add "Open read only" checkbox to the file browser
 
621
  (Driver::ReadOnlyConnection option already allows to open in read only mode)
 
622
 
 
623
=== CLI TODO ===
 
624
- add kexicmd as a symlink to kexi binary, for totally non-gui usage
 
625
- just drop all tables when database already exist 
 
626
        (so recreating database will be available even 
 
627
        if you have only access to one database).
 
628
- GRANT privileges for non-root (current?) user for newly created db
 
629
 
 
630
=== Mimetypes/icons TODO ===
 
631
- new mimetypes: 
 
632
   application/x-vnd.kexi.project.sqlite2
 
633
   application/x-vnd.kexi.project.sqlite3
 
634
   application/x-vnd.kexi.project.shortcut
 
635
  other:
 
636
   application/x-vnd.kexi.connections.shortcut
 
637
   application/x-vnd.kexi.table.shortcut
 
638
   application/x-vnd.kexi.query.shortcut
 
639
- remove x-vnd.kexi.desktop in kdelibs
 
640
- copy mimetypes and magic def. to kdelibs (keep it within Kexi for compat.)
 
641
- remake kexi mime type svg icons
 
642
- copy kexi mime icons to kdelibs, remove old one
 
643
** Ask SQLite devs for a possibility for adding a field to indicate kexi-sqlite 
 
644
   format without opening database
 
645
 
 
646
 
 
647
=== Docs TODO ===
 
648
 
 
649
-translate the current content from polish to english
 
650
-?? migrate english content to wiki format
 
651
-move polish content to .po translation file
 
652
-Add this to the preface http://encyklopedia.helion.pl/index.php/Kartotekowa_baza_danych
 
653
-www: mention what features are already available and what is planned in terms of:
 
654
-- general features, example: http://www.e-cen.pl/index.php?co=wiecej&id=26&dzial=8
 
655
-- scripting, example: http://www.e-cen.pl/index.php?co=wiecej&id=22&dzial=6
 
656
- add chapters for: 
 
657
-- simple printouts
 
658
-- "assign action" to a button
 
659
-- CSV import/export/copy/paste (csv import is explained on kexi@kde.org ML; 2007-03-23)
 
660
 
 
661
=== 2005 PRO TODO ===
 
662
-greatly improve sql parser
 
663
-greatly improve sql gui designer
 
664
--totals (sum, avg)
 
665
-more docs
 
666
-more widgets for db-aware forms
 
667
-add simple reporting
 
668
-finish server support
 
669
--connection creator
 
670
--fix permission problems
 
671
 
 
672
 
 
673
=== after-0.9 TODO ===
 
674
TODO: add time zones support: 1994-11-05T08:15:30-05:00
 
675
TODO: update to sqlite3.1 and use it's features http://www.sqlite.org/releasenotes310.html
 
676
TODO: 0.2: reuse http://segfault.is-a-geek.net:8001/feedback-kinitiator/
 
677
        gfx can be found here: http://cvs.sourceforge.net/viewcvs.py/kinitiator/
 
678
 
 
679
TODO: look at recent Martin's stuff: http://homepages.cs.ncl.ac.uk/m.a.ellis/kexi/
 
680
 
 
681
 
 
682
Core TODO:
 
683
- update shared actons availability ONLY AFTER we've switched to other kexidialog base,
 
684
  not just on LOST FOCUS
 
685
- for now: clicking on empty menu bar's item (eg. "Format") causes to losing shared actions state
 
686
- make core/ non-gui lib. Move data creation code out of KexiDialogBase.
 
687
 
 
688
Reports TODO
 
689
- reuse most of KexiFormPart code in KexiReportPart (eg. creating shared actions)
 
690
- line widget should use special resize handle set -- with only two rectangles (Forms too)
 
691
 
 
692
KMDI TODO
 
693
- do not execute KMdiMainFrm::switchOffMaximizeModeForMenu() when true==QApplication::closingDown()
 
694
 
 
695
QUICK TODO: 
 
696
Forms:
 
697
-change form's object caption to "caption" property, when changed and conversely!
 
698
 
 
699
TODO:::::::
 
700
1. test dipesh.kexi - ID column is not used on row updating!!!
 
701
 
 
702
2. dipesh       np, I also found a crasher witch is maybe related.
 
703
        dipesh  just change a value, go to design mode and switch back to dataview...
 
704
        dipesh  [KCrash handler]
 
705
        dipesh  #3 0xb59b156f in KexiFormScrollView::createEditor ()
 
706
        dipesh  from /usr/lib/kde3/kexihandler_form.so
 
707
        dipesh  #4 0xb7e5f502 in KexiDataAwareObjectInterface::startEditCurrentCell ()
 
708
        dipesh  from /usr/lib/libkexidatatable.so.0
 
709
        dipesh  #5 0xb59b276a in KexiFormScrollView::valueChanged ()
 
710
        dipesh  from /usr/lib/kde3/kexihandler_form.so
 
711
        dipesh  I look where the crasher is coming from.
 
712
        dipesh  oh, in KexiFormScrollView::createEditor
 
713
        dipesh  column( col ) returns NULL
 
714
        jstaniek        dipesh: it's only within your example project...
 
715
        dipesh  therefore column( col )->readOnly() crashes...
 
716
 
 
717
reuse KWallet http://events.kde.org/info/kastle/presentations/kwallet-kastle-2003.ps
 
718
 
 
719
=== Interesting features ===
 
720
- Add random names/surnames generator: http://www.ruf.rice.edu/~pound/
 
721
  Good for generating good-looking random data for a given table.
 
722
-- Autodetect 'name' columns or ask user to describe what he wants. 
 
723
   Comply with data validation rules.
 
724
-- use famous 'Lorem ipsum dolor sit amet...' test text for longtext types
 
725
 
 
726
 
 
727
=== QUICK TODO ===
 
728
 
 
729
TODO: in KexiMainWindowImpl::slotProjectOpen() add support for starting new kexi instance for selected conn data
 
730
      (we need to remember from what filename has been a conndata loaded)
 
731
TODO: move ConnectionData::savePassword to QMap<ConnectionData*,bool> KexiDBConnectionSet::savePasswordMap or so
 
732
TODO: Forms: fix label width resizing when entering text within inline editor
 
733
TODO: Forms copy more properties (like palette) to inline editor from e.g. text label
 
734
TODO: Forms: fix: double clicking unselected widget doesn't switch us to inline editing mode
 
735
TODO: Forms: object tree: enable sorting by name after clicking "name" header; 
 
736
             enable sorting by class,name by clicking "class" header
 
737
 
 
738
Startup TODO:
 
739
- when using a startup item, touch the file for better sorting:
 
740
http://www.koders.com/c/fid97791600CA5D0A2EA559490BD9444B0775B2370A.aspx
 
741
 
 
742
- add "Save Special->Shortcut file for this project" action
 
743
- add "Save Shortcut file for this connection" action
 
744
- FOR SLOW CONNECTIONS: show progress bar on:
 
745
-- retrieving a list of projects (in KexiProjectSelectorDialog)
 
746
-- opening a project (in status bar?)
 
747
- Also, add "cancel" button near the progress bar (reuse the one from KMail?)
 
748
 
 
749
 
 
750
TODO: If a form has no focus, FormManager::windowChanged() and KexiFormView::setFocusInternal()
 
751
 don't work properly (setFocus() is not available...)
 
752
 
 
753
FORMS:
 
754
-Image Box: 
 
755
--pasting large images makes chooser button invisible; maybe place it on top of the widget?
 
756
--set better default for focusPolicy, implement setFocus()
 
757
--add filter property (using KImageEffect)
 
758
--make image-related actions undoable/redoable in design time
 
759
--add 'print' action
 
760
--add for movies/animations support using QMovie to KexiDBImageBox 
 
761
  or (most probably) inherit KexiDBImageBox as KexiDBMovieBox
 
762
---KexiBLOBBuffer::pixmap() shouldn't be used but data() should be used to create QMovie object 
 
763
   in each movie widget itself because even if the same QMovie was used in many movie widgets:
 
764
   a) speeds can vary between movie widgets, b) different forms can be opended in different moments
 
765
   so playing starts in different moments, c) one or more movies can be stopped while others not
 
766
---add following related properties: int playbackSpeed (in frames per second, 0==default), 
 
767
   bool autoStart (true==default), playbackControls (false==default), bool loopPlayback (true==default)
 
768
   bool pauseAfterEnd (0==nothing==default)
 
769
-property pane: shrink widget name displayed at the top by adding "..." to avoid problems
 
770
 with pane's size when selected widget has very long name
 
771
- resize handles are always black: this is bad on black background!
 
772
- use KURLLabel as an option for push button widget
 
773
 
 
774
 
 
775
Combo Box Editor
 
776
- ADD "restrict to list" OPTION: don't copy 1st row's value if there's no value in the combo
 
777
  --> needed for 1st column of Query Designer
 
778
 
 
779
KEXIDB:
 
780
- ConnectionData: make local sockets default for unix, instead of tcp/ip
 
781
 
 
782
GENERAL:
 
783
- removed conflict between standalone and Calligra version by:
 
784
-- inserting "standalone" word into module names, 
 
785
   eg. kexidb_mysqldriver.so -> kexidb_mysqldriver_standalone.so
 
786
-- renaming kexi to kexi-standalone
 
787
- rename "data view mode" to "browse view mode" (as in Filemaker)
 
788
- add "File->Mail..." action (requires closing and copying of the sqlite file, if locked)
 
789
 
 
790
MARKETING:
 
791
- add "Created With Kexi" page and a link to it from k-p.org and kexi.pl
 
792
- when releasing new Kexi version publish: A first look at Kexi x.y" page, like this:
 
793
  http://software.newsforge.com/article.pl?sid=05/09/28/1345228
 
794
- short reasoning for using db abstraction layers: 
 
795
  http://developers.slashdot.org/comments.pl?sid=164824&cid=13755151
 
796
 
 
797
 
 
798
ACCESIBILITY - Mouseless Operation Problems (Calligra 1.4.1):
 
799
- MORE: http://accessibility.kde.org/reports/calligra-1.4.1-accessibility-assessment.pdf
 
800
- It is not possible to select the data type of a
 
801
field in the table editor. Alt+DownArrow does not work.
 
802
- When editing the fields of a table, it is not
 
803
obvious how to flag a field as a primary key. 
 
804
WORKAROUND: Use Popup Context Menu (Menu key) and select Primary Key, OR use Edit | Primary
 
805
Key on the main menu, OR use Property Editor.
 
806
- In the Property Editor, is not obvious how to
 
807
change a boolean property. Alt+DownArrow does not work.
 
808
- It is not possible to change the value of a
 
809
property in the property editor that has a picklist of possible values, for example,
 
810
SubType. Alt+DownArrow does not work.
 
811
- When creating a query, it is not possible to add a table to the query.
 
812
- Not possible to select a column, table,
 
813
totals in Query Columns panel. Alt+DownArrow does not work.
 
814
- It is not possible to add a widget to a form.
 
815
- Pressing Tab key while focus is in the Form
 
816
Editor window, but not on any widgets on the form, crashes Kexi.
 
817
- It is not possible to change the size of a
 
818
widget in the form editor without the mouse.
 
819
 
 
820
TODO: 
 
821
- update conn dialog gui
 
822
example: http://www.ntpb.co.uk/kexi/msn.png
 
823
 
 
824
 
 
825
Migration (Import Project Wizard) TODO:
 
826
- change drivers comboboxes to KexiDBDriverList
 
827
  (impl. this one with drv name and description columns)
 
828
- close currently opened file-based project if it's the same as imported one
 
829
  (do not save anything)
 
830
- 'select source db type' page: change "sqlite/msa/mysql/pg" to "sqlite/msa/server database"
 
831
  because type of server db is in fact selected on the next page (source conn selection)
 
832
- set the same path for "destination" file browser as for "source" one
 
833
- add "do not create system tables" option to the wizard
 
834
- reuse the migration framework to support "offline mode" - for instance usable while moving with 
 
835
  out of network with a laptop, by copying the relevant remote tables to a local temp db; 
 
836
  this is already implemnted e.g. in MSA 2k7:
 
837
  http://blogs.msdn.com/access/archive/2006/10/13/sharepoint-apps-offline-and-intro-to-sharepoint-designer.aspx
 
838
  coming back online requeres data merges what is not easy as resolving potential conflict may be needed
 
839
  (example: http://clintc.officeisp.net/Blogs/2006/40%20-%20SharePoint%20Offline/10%20-%20Conflict%20Resolution%20UI.JPG)
 
840
 
 
841
MDB Migration:
 
842
- add checks for "no space left on device" error (otherwise Kexi will crash)
 
843
- fix currency converting
 
844
- use MSysRelationdhips table to read MSA db relationships (easy, it's not encoded)
 
845
 
 
846
=== Kexi Web Site TODO ===
 
847
- move to mediawiki (JJ?)
 
848
- Add "Features" page like this http://www.agata.org.br/us/index.php?file=features.php
 
849
- Extend "Credits" page with Gold Users/Translators, etc. like here: 
 
850
   http://www.agata.org.br/us/index.php?file=thanks.php
 
851
 
 
852
AUTOFIELD:
 
853
- copy/paste doesn't preserve caption text (maybe caption should be copied 
 
854
  to from QueryColumnInfo to a property)
 
855
 
 
856
KexiFrame:
 
857
- fix highlight for data mode! (very old bug)
 
858
 
 
859
Migration:
 
860
- fix: server as destination is broken
 
861
 
 
862
CSV Import TODO:
 
863
- switch from dialog to wizard; add filedlg widget as the 1st page
 
864
- add better detection for CSV data with \t delimiters (needed for pasting from spreadsheets)
 
865
- add option for storing import settings
 
866
- always test using e.g. this file: http://cvs.sourceforge.net/viewcvs.py/*checkout*/wcuniverse/priv/units/units.csv
 
867
- change boolean "First row contains column names" to 3-value combo:
 
868
  "Get column names:" ["None", "From the first row", "From the first imported row"]
 
869
- add "skip empty columns" and "skip empty rows" option
 
870
- (advanced) there can be a column that is a result of exporting combo box visible values;
 
871
  in this case add option for normalizing the table using existing (or new) lookup table
 
872
- add clear message when :
 
873
-- primary key cannot be set because of non-unique values
 
874
-- number cannot be set because non-number values
 
875
-- etc.
 
876
- add "fix non-unique valuesID /add missing ID values" option for PK column
 
877
- add option for skipping particular columns
 
878
- add option for filtering import results afterwards:
 
879
-- to limit number of rows stored in db and 
 
880
-- to process columns using expressions
 
881
 
 
882
CSV Export TODO:
 
883
- add progress bar and wizard
 
884
- add "Include row count as first column - include row number in the first 
 
885
   column of each row" option
 
886
- add "Include column types on top" option
 
887
- add "Fixed columns width" option (can be extended to support "fixed width text" format)
 
888
- add "Set text to (null) on NULL value - use the string "(null)" to represent 
 
889
   a NULL value in the document" option
 
890
- add "Replace empty/Null fields with..." option
 
891
- add "Lines terminated with.." option (\n or \r\n or \r)
 
892
- add option for compression (gzip, zip, bzip2...)
 
893
- MORE TODOs here: http://www.aquafold.com/docs-qw-save-results.html
 
894
- by default, use delimiter=\t and quote=none for clipboard (needed for copying to spreadsheets)
 
895
- add "Strip leading and trailing blanks off of text values" option
 
896
- deal with lookup fields: for every such field
 
897
-- add option for exporting lookup tables as separate files
 
898
-- add option for exporting a) both visible values and indices b) indices only c) visible values only
 
899
   -for now c) is supported
 
900
 
 
901
XML Export TODO:
 
902
- consider export to at least these three formats: http://csv2xml.sourceforge.net/xmlmodes.html
 
903
  (templates/XSLT could be also supported)
 
904
 
 
905
General TODO:
 
906
- handle KApplication::shutDown()
 
907
 
 
908
TODO:
 
909
- on opening detect whether a table exists (empty table view should not be displayed)
 
910
- Another Kexi instance started from KexiMainWindow using QProcess freezes after opening
 
911
  3rd table or so. Move to KProcess on Linux.
 
912
 
 
913
TODO:
 
914
- if you place e.g. a label in a container like a tabwidget and doubleclick it to edit the content, 
 
915
  the label jumps around. ccpasteur said he fixed it last year ;)
 
916
- only change bg color of tab widget, not its outer area; fix changing tabs bg color
 
917
 
 
918
Import
 
919
- error "BLOB/TEXT column 'isbn' used in key specification without a key length"
 
920
  when importing books.mdb into a mysql db
 
921
 
 
922
Forms:
 
923
- after setting "auto" tab order, we need to close and open the form to get tab stops to work properly
 
924
 
 
925
TODO: 
 
926
- use KLineEdit::displayText() to get partially filled date or time values like 20__-__-__;
 
927
  then use this for checking data validity (?)
 
928
 
 
929
TODOs from Jeff Denman:
 
930
- add command line option for performing a complete database import, especially for MSA files
 
931
- instead of always displaying "object names" in the project navigator: 
 
932
  display "captions" but offer an option to display "names" instead;
 
933
   AND, optionally: offer a full-width window with the list of database objects
 
934
- import bug for MSA: no values for this field after import:
 
935
        Field Size:             Decimal
 
936
        Precision:              10
 
937
        Scale:          2
 
938
        Decimal Places: Auto
 
939
 
 
940
TODO Data Types
 
941
-Currency
 
942
  MS Access: Currency values and numeric data used in mathematical calculations involving data 
 
943
  with one to four decimal places. Accurate to 15 digits on the left side of the decimal separator 
 
944
  and to 4 digits on the right side. 
 
945
-Decimal Number (NUMERIC?)
 
946
  MS Access: Decimal Stores numbers from -10^381 through 10^381 (.adp), 
 
947
  from -10^281 through 10^281 (.mdb); decimal precision: 28 B, storage size: 12 B
 
948
 
 
949
 
 
950
TODO Migration from Native SQLite3
 
951
- use sqlite3_column_decltype() http://sqlite.org/capi3ref.html#sqlite3_column_decltype
 
952
  and sqlite3_column_name() to know column names and types. 
 
953
  Add reasonable case-insensitive mappings like "INTEGER|integer|INT|int" -> [integer]
 
954
 - or: for import data from native-sqlite databases: use "pragma table_info(tablename)"
 
955
 -- maybe also use "pragma table_info" for sanity checking, or more in kexidb driver??
 
956
- use "pragma user_version={32bit int}" (http://www.sqlite.org/pragma.html) to set, say, kexidb version. 
 
957
  This information is stored in a fixed place in the sqlite3 header, so it's possible to read it using
 
958
  KDE Mime Type system (a magic data defined in share/mimelnk/magic).
 
959
 
 
960
MDB Import
 
961
- FIXME sometimes order of imported fields is invalid: PKEY field jumps to end.. (books2.mdb)
 
962
 
 
963
TODO: table view
 
964
- for FP numbers: allow to start entering value from "." or ","
 
965
 
 
966
Forms TODO
 
967
- add "navigationCaption" property to table and form, so "Records:" Label in the record nav. becomes e.g. "Bananas:"
 
968
  see: http://blogs.msdn.com/thirdoffive/archive/2006/04/06/560454.aspx
 
969
 
 
970
Forms TODO
 
971
- Checkbox widget with focus policy set to Tab has problems with KexiDataAwareObjectInterface::acceptEditor() 
 
972
  because m_editor is set to _currently focused_ widget (problem where there are e.g. >1 checkboxes)
 
973
  Partially fixed by setting StrongFocus policy as default; 
 
974
 FIX THIS for other focus policies too...
 
975
 
 
976
 
 
977
KDElibs4 TODO:
 
978
- wizard
 
979
- do not require .la in libltdl
 
980
 
 
981
Kexi 2.0 TODOs:
 
982
- decrease # of shared libs, see Clarification at the bottom 
 
983
  of http://people.redhat.com/drepper/no_static_linking.html
 
984
 
 
985
== April 1 2007 TODO ==
 
986
- show the screenshot of kexi displaying yes/no/maybe-dialogs, as for the "Woman edition"
 
987
 
 
988
TODO:
 
989
Kexi >2.0 (probably late 2007): Add SQLite >3.3 driver. Offer exporting similar to the one between 2.8->3.0.
 
990
 Think about backporting the >3.3 driver to Kexi 1.1.
 
991
 
 
992
 
 
993
 
 
994
- for table t1(a,b,c) delete column t1.c:
 
995
 
 
996
CREATE TABLE t1_new(a,b);
 
997
INSERT INTO t1_new SELECT a,b FROM t1;
 
998
DROP TABLE t1;
 
999
ALTER TABLE t1_new RENAME TO t1;
 
1000
 
 
1001
- for table t1(a,b,c) rename column t1.c to t1.d:
 
1002
 
 
1003
CREATE TABLE t1_new(a,b,d);
 
1004
INSERT INTO t1_new SELECT a,b,c FROM t1;
 
1005
DROP TABLE t1;
 
1006
ALTER TABLE t1_new RENAME TO t1;
 
1007
 
 
1008
 
 
1009
== Forms TODO ==
 
1010
- enable edit->copy, actions, etc. for Data View
 
1011
- ImageBox: show a tootip with large image and its name if the image was cropped
 
1012
  or only its name if the image is not cropped
 
1013
- AutoField: highlighting the label when the buddy is focused
 
1014
- AutoField: handle label editing after double clicking
 
1015
- AutoField: draw required field in bold (or optionally add (*))
 
1016
- display default values in other widgets showing text
 
1017
- new action for button widgets: open table/query 
 
1018
  +with query parameters taken from a line edit
 
1019
- provide "Edit->Clear Table Contents" action in forms too
 
1020
- autofield: after setting form's data source to a valid value, 
 
1021
   "unbound" mark should disappear in design time
 
1022
- rename "Source field" to "Widget's data source" in the data source pane
 
1023
- Designer bug: "Click a container widget (or a form surface itself), 
 
1024
   where widgets are inserted and select one of the layout 
 
1025
   types from the context menu item Layout Widgets. "
 
1026
   "I tried this with the Frame, the Group box and the Tab 
 
1027
   widget, the menu item Layout Widgets is not available. You 
 
1028
   have to select the widgets inserted in the contrainer widget 
 
1029
   to make the menu item available. "
 
1030
- unhide "Editor type" property for auto fields (it's hidden in 1.1 due to a crash)
 
1031
 
 
1032
TODO:
 
1033
- inform Raphael about calligra.org/1.5/ url, give him the php code
 
1034
 
 
1035
Table Designer TODO
 
1036
- i18n("Lookup") == Odnosnik (Ks. eksperta, s. 53)
 
1037
- add setting for default length of the text type
 
1038
- allow to set default values for BLOB types (requires a change in KoProperty as well)
 
1039
- 2.0: Add drag-and-drop-to-create-lookup-column to the "lookup column" tab of the property pane.
 
1040
  This should be implemented by displaying a list of fields and allowing to drop one into the
 
1041
  table view. Then, lookup column properties should be autoconfigured.
 
1042
- lookup column: support these properties of LookupFieldSchema:
 
1043
  columnWidths(), columnHeadersVisible(), maximumListRows(), limitToList(), displayWidget()
 
1044
- show warning if there are no bound and visible columns defined (for now, this is just ignored 
 
1045
  and user cannot select a value from the list in the data view)
 
1046
 
 
1047
=== Simple Printouts TODO ===
 
1048
- cell contents can be too large for a single page - split it to man pages if needed (true for large texts, blobs..)
 
1049
- add support for BLOBs
 
1050
- fix printing and previewing for horizontal arragement
 
1051
 
 
1052
 
 
1053
Form/TV Shortcuts:
 
1054
 
 
1055
+To move to the record number box (record number box: A small box that displays the current record number 
 
1056
 in the lower-left corner in Datasheet view and Form view. To move to a specific record, you can type 
 
1057
 the record number in the box, and press ENTER.); then type the record number and press ENTER
 
1058
 F5
 
1059
+ Add moving to next record when Tab is pressed at the last field
 
1060
+ Add moving to prev record when BackTab is pressed at the 1st field
 
1061
 
 
1062
 
 
1063
== TODOs for 1.1.2 ==
 
1064
- support combo box within the autofield widget
 
1065
(done?): notify and update data source after schema changes
 
1066
- todo: fix things like SELECT *, cars.owner AS ab, 1.3 AS wyr1, persons.surname FROM cars LEFT OUTER JOIN persons ON cars.owner=persons.id  WHERE cars.owner > 3
 
1067
      (crash - see Simple_Database.kexi - persons_and_cars query has lookup fields and OUTER JOIN is NOT PARSED
 
1068
       -- we should generate the SQL in a different way for the Query Designer)
 
1069
- fix horizontal scrollbar hiding in the "Available fields" list box (a problem with layouts?)
 
1070
- display a message when connection is lost...
 
1071
 
 
1072
 
 
1073
TODO:
 
1074
- fix crashes when table schema referenced by a combo box changes
 
1075
- replace QDate{Time}Edit in koproperty with KLineEdit, similar to the one in KexiTableView
 
1076
 
 
1077
TODO: "Database "z3" created but could not be closed after creation." err. on win32 after creating a pgsql db
 
1078
TODO: PqxxMigrate::drv_copyTable():  we've switched from BLOBs to LongText
 
1079
  ==KexiDB::Field::LongText part shoud be removed; add other backward-copatibility code (how?)
 
1080
       if (fieldsExpanded.at(index)->field->type()==KexiDB::Field::BLOB || fieldsExpanded.at(index)->field->type()==KexiDB::Field::LongText)
 
1081
 
 
1082
 
 
1083
Startup templates
 
1084
- TODO: : use main/startup/TemplateItem.ui and main/startup/TemplateWidget.h
 
1085
   http://lxr.kde.org/source/KDE/kdebase/kicker/kicker/ui/addapplet.cpp?v=3.5-branch#188
 
1086
- TODO look at schemas at http://www.databaseanswers.org/data_models/index.htm
 
1087
 
 
1088
Find/Replace REPLACE
 
1089
- use this for replace: virtual bool columnEditable(int col);
 
1090
 
 
1091
TODO
 
1092
- compare KexiUtils' tristate class with http://boost.org/doc/html/tribool.html
 
1093
 
 
1094
TODO
 
1095
- implement more mimetypes for blob fields
 
1096
 
 
1097
== TODOs for 2.0 ==
 
1098
Query Designer
 
1099
- fix selecting table items with mouse click
 
1100
- fix painting for sql history
 
1101
Table Designer
 
1102
- update state of "PK" button when user moves cursor between table rows
 
1103
Table View
 
1104
- set inital scroll to (0,0)
 
1105
- fix displaying cells when scrolled vertically
 
1106
 
 
1107
 
 
1108
 
 
1109
 
 
1110
TODO: fix displaying default values in comboboxes (form and tableview)
 
1111
TODO: use KCompletionBox in (editable/noneditable) comboboxes
 
1112
 
 
1113
KDE4: TODO:
 
1114
- fix KMenu::addTitle():
 
1115
  http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/kmenu_8cpp-source.html#l00144
 
1116
 
 
1117
TODO: check reports at scan.coverity.com
 
1118
TODO: shared actions are not so usable now as we move actions down to KexiWindow
 
1119
 
 
1120
NOTE (put into wiki): use QWidget::setAutoFillBackground(true) on widgets that should have their own backgrounds
 
1121
 
 
1122
TODO: report crash in QDockWidgetPrivate::nonClientAreaMouseEvent() when dragging and dropping dock widget
 
1123
 (state=0, crash when accesing state->ctrlDrag):
 
1124
        QtGuid4.dll!QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent * event=0x00d9c474)  Line 863       C++
 
1125
        QtGuid4.dll!QDockWidget::event(QEvent * event=0x00d9c474)  Line 1353    C++
 
1126
        QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver=0x049d1cb0, QEvent * e=0x00d9c474)  Line 3558 C++
 
1127
        QtGuid4.dll!QApplication::notify(QObject * receiver=0x049d1cb0, QEvent * e=0x00d9c474)  Line 3499       C++
 
1128
        kdeui.dll!KApplication::notify(QObject * receiver=0x049d1cb0, QEvent * event=0x00d9c474)  Line 300      C++
 
1129
        QtCored4.dll!QCoreApplication::notifyInternal(QObject * receiver=0x049d1cb0, QEvent * event=0x00d9c474)  Line 533       C++
 
1130
        QtCored4.dll!QCoreApplication::sendSpontaneousEvent(QObject * receiver=0x049d1cb0, QEvent * event=0x00d9c474)  Line 205 C++
 
1131
        QtGuid4.dll!QETWidget::translateMouseEvent(const tagMSG & msg={...})  Line 2774 C++
 
1132
        QtGuid4.dll!QtWndProc(HWND__ * hwnd=0x00041540, unsigned int message=161, unsigned int wParam=2, long lParam=9307228)  Line 1407        C++
 
1133
        USER32.DLL!GetSysColor()        
 
1134
        USER32.DLL!GetSysColor()        
 
1135
        USER32.DLL!DispatchMessageW()   
 
1136
        QtGuid4.dll!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...})  Line 992   C++
 
1137
        QtCored4.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...})  Line 142        C++
 
1138
        QtCored4.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...})  Line 187 C++
 
1139
        QtCored4.dll!QCoreApplication::exec()  Line 752 C++
 
1140
        QtGuid4.dll!QApplication::exec()  Line 3056     C++
 
1141
 
 
1142
HINT: QWidget::setFocus() is not virtual, use event()
 
1143
HINT: 
 
1144
 -QVector::insert(i) inserts a value, not sets value at i as in QPtrVector::insert()! use vector[ i ] = value.
 
1145
 -QVector::remove() entirely removes a value, not clears the value as in QPtrVector::remove()! use vector[ i ] = 0
 
1146
 -QVector::take(), like above
 
1147
 -QVector::count() == QVector::size() - counts null and not null values, unlike QPtrVector::count()!
 
1148
   to count nonnull values use vectore.size()-vector.count(0)
 
1149
- KexiDataAwarePropertySet: remove() is now called eraseAt(); insert() is now called set(); 
 
1150
  removeCurrentPropertySet() is now called eraseCurrentPropertySet()