KOffice – TDE office suite
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TODO-Kexi-js 57KB

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