Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / docs / source / main.html
diff --git a/docs/source/main.html b/docs/source/main.html
new file mode 100644 (file)
index 0000000..45c5c62
--- /dev/null
@@ -0,0 +1,426 @@
+<html>\r
+<head>\r
+  <title>The source code</title>\r
+    <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
+    <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
+</head>\r
+<body  onload="prettyPrint();">\r
+    <pre class="prettyprint lang-js">// Initialize the state provider\r
+Ext.state.Manager.setProvider(new Ext.air.FileProvider({\r
+       file: 'tasks.state',\r
+       // if first time running\r
+       defaultState : {\r
+               mainWindow : {\r
+                       width:780,\r
+                       height:580,\r
+                       x:10,\r
+                       y:10\r
+               },\r
+               defaultReminder: 480\r
+       }\r
+}));\r
+\r
+Ext.onReady(function(){\r
+    Ext.QuickTips.init();\r
+\r
+       // maintain window state automatically\r
+       var win = new Ext.air.NativeWindow({\r
+               id: 'mainWindow',\r
+               instance: window.nativeWindow,\r
+               minimizeToTray: true,\r
+               trayIcon: 'ext-air/resources/icons/extlogo16.png',\r
+               trayTip: 'Simple Tasks',\r
+               trayMenu : [{\r
+                       text: 'Open Simple Tasks',\r
+                       handler: function(){\r
+                               win.activate();\r
+                       }\r
+               }, '-', {\r
+                       text: 'Exit',\r
+                       handler: function(){\r
+                               air.NativeApplication.nativeApplication.exit();\r
+                       }\r
+               }]\r
+       });\r
+       \r
+    tx.data.conn.open('tasks.db');\r
+    \r
+    var grid = new TaskGrid();\r
+       var selections = grid.getSelectionModel();\r
+       \r
+       \r
+       // Shared actions used by Ext toolbars, menus, etc.\r
+       var actions = {\r
+               newTask: new Ext.Action({\r
+                       text: 'New Task',\r
+                       iconCls: 'icon-active',\r
+                       tooltip: 'New Task',\r
+                       handler: function(){\r
+                               taskHeader.ntTitle.focus();\r
+                       }\r
+               }),\r
+               \r
+               deleteTask: new Ext.Action({\r
+                       itemText: 'Delete',\r
+                       iconCls: 'icon-delete-task',\r
+                       tooltip: 'Delete Task',\r
+                       disabled: true,\r
+                       handler: function(){\r
+                               Ext.Msg.confirm('Confirm', 'Are you sure you want to delete the selected task(s)?', function(btn){\r
+                                       if (btn == 'yes') {\r
+                                               selections.each(function(s){\r
+                                                       tx.data.tasks.remove(s);\r
+                                               });\r
+                                       }\r
+                               });\r
+                       }\r
+               }),\r
+               \r
+               complete: new Ext.Action({\r
+                       itemText: 'Mark Complete',\r
+                       iconCls: 'icon-mark-complete',\r
+                       tooltip: 'Mark Complete',\r
+                       disabled: true,\r
+                       handler: function(){\r
+                               selections.each(function(s){\r
+                                       s.set('completed', true);\r
+                               });\r
+                               tx.data.tasks.applyFilter();\r
+                       }\r
+               }),\r
+               \r
+               active: new Ext.Action({\r
+                       itemText: 'Mark Active',\r
+                       tooltip: 'Mark Active',\r
+                       iconCls: 'icon-mark-active',\r
+                       disabled: true,\r
+                       handler: function(){\r
+                               selections.each(function(s){\r
+                                       s.set('completed', false);\r
+                               });\r
+                               tx.data.tasks.applyFilter();\r
+                       }\r
+               }),\r
+               \r
+               newList: new Ext.Action({\r
+                       itemText: 'New List',\r
+                       tooltip: 'New List',\r
+                       iconCls: 'icon-list-new',\r
+                       handler: function(){\r
+                               var id = tx.data.lists.newList(false, tree.getActiveFolderId()).id;\r
+                               tree.startEdit(id, true);\r
+                       }\r
+               }),\r
+               \r
+               deleteList: new Ext.Action({\r
+                       itemText: 'Delete',\r
+                       tooltip: 'Delete List',\r
+                       iconCls: 'icon-list-delete',\r
+                       disabled: true,\r
+                       handler: function(){\r
+                               tree.removeList(tree.getSelectionModel().getSelectedNode());\r
+                       }\r
+               }),\r
+               \r
+               newFolder: new Ext.Action({\r
+                       itemText: 'New Folder',\r
+                       tooltip: 'New Folder',\r
+                       iconCls: 'icon-folder-new',\r
+                       handler: function(){\r
+                               var id = tx.data.lists.newList(true, tree.getActiveFolderId()).id;\r
+                               tree.startEdit(id, true);\r
+                       }\r
+               }),\r
+               \r
+               deleteFolder: new Ext.Action({\r
+                       itemText: 'Delete',\r
+                       tooltip: 'Delete Folder',\r
+                       iconCls: 'icon-folder-delete',\r
+                       disabled: true,\r
+                       handler: function(s){\r
+                               tree.removeList(tree.getSelectionModel().getSelectedNode());\r
+                       }\r
+               }),\r
+               \r
+               quit : new Ext.Action({\r
+                       text: 'Exit',\r
+                       handler: function(){\r
+                               air.NativeApplication.nativeApplication.exit();\r
+                       }\r
+               }),\r
+               \r
+               pasteAsTask : new Ext.Action({\r
+                       itemText: 'Paste as New Task',\r
+                       tooltip: 'Paste as New Task',\r
+            iconCls: 'icon-paste-new',\r
+            handler: function(){\r
+                if(air.Clipboard.generalClipboard.hasFormat(air.ClipboardFormats.TEXT_FORMAT)){\r
+                                   var text = air.Clipboard.generalClipboard.getData(air.ClipboardFormats.TEXT_FORMAT);\r
+                                       tx.data.tasks.addTask({\r
+                           taskId: Ext.uniqueId(),\r
+                           title: Ext.util.Format.htmlEncode(text.replace(/[\n\r]/g, '')),\r
+                           dueDate: new Date(),\r
+                           description: '', \r
+                           listId: tx.data.getActiveListId(),\r
+                           completed: false, \r
+                                               reminder: ''\r
+                       });\r
+                               }else{\r
+                    Ext.Msg.alert('Warning', 'Could not create task. The clipboard is empty.');\r
+                }\r
+                       }\r
+               }) \r
+       };\r
+    tx.actions = actions;\r
+\r
+    var menus = Ext.air.SystemMenu;\r
+       \r
+       menus.add('File', [\r
+               actions.newTask, \r
+               actions.newList, \r
+               actions.newFolder, \r
+               '-',{\r
+                       text:'Import...',\r
+                       handler: function(){\r
+                               var importer = new tx.Importer();\r
+                               importer.doImport(function(){\r
+                                       tx.data.lists.load();\r
+                                       root.reload();\r
+                                       loadList('root');\r
+                                       Ext.Msg.hide();\r
+                               });\r
+                       }\r
+               },{\r
+                       text:'Export...',\r
+                       handler: function(){\r
+                               new tx.Exporter();\r
+                       }\r
+               },\r
+               '-', \r
+               actions.quit\r
+       ]);\r
+\r
+       menus.add('Edit', [\r
+               actions.pasteAsTask\r
+       ]);\r
+\r
+        \r
+    var viewMenu = menus.add('View', [{\r
+        text: 'All Tasks',\r
+        checked: true,\r
+        handler: function(){\r
+            Ext.getCmp('filter').setActiveItem(0);\r
+        }\r
+    },{\r
+        text: 'Active Tasks',\r
+        checked: false,\r
+        handler: function(){\r
+            Ext.getCmp('filter').setActiveItem(1);\r
+        }\r
+    },{\r
+        text: 'Completed Tasks',\r
+        checked: false,\r
+        handler: function(){\r
+            Ext.getCmp('filter').setActiveItem(2);\r
+        }\r
+    }]);\r
+\r
+    menus.add('Help', [{\r
+        text: 'About',\r
+        handler: function(){\r
+            Ext.air.NativeWindowManager.getAboutWindow().activate();\r
+        }\r
+    }]);\r
+\r
+\r
+    var tree = new ListTree({\r
+               actions: actions,\r
+               store: tx.data.lists\r
+       });\r
+\r
+       var root = tree.getRootNode();  \r
+\r
+       var listSm = tree.getSelectionModel();\r
+       \r
+    tx.data.lists.bindTree(tree);\r
+       tx.data.lists.on('update', function(){\r
+               tx.data.tasks.applyGrouping();\r
+               if(grid.titleNode){\r
+                       grid.setTitle(grid.titleNode.text);\r
+               }\r
+       });\r
+       \r
+       var tb = new Ext.Toolbar({\r
+               region:'north',\r
+               id:'main-tb',\r
+               height:26,\r
+               items: [{\r
+                               xtype:'splitbutton',\r
+                               iconCls:'icon-edit',\r
+                               text:'New',\r
+                               handler: actions.newTask.initialConfig.handler,\r
+                               menu: [actions.newTask, actions.newList, actions.newFolder]\r
+                       },'-',\r
+                       actions.deleteTask,\r
+                       actions.complete,\r
+                       actions.active,\r
+            '-',\r
+            actions.pasteAsTask,\r
+            '->',{\r
+                               xtype:'switch',\r
+                               id:'filter',\r
+                activeItem:0,\r
+                               items: [{\r
+                               tooltip:'All Tasks',\r
+                                       filter: 'all',\r
+                               iconCls:'icon-all',\r
+                               menuIndex: 0\r
+                },{\r
+                               tooltip:'Active Tasks',\r
+                               filter: false,\r
+                               iconCls:'icon-active',\r
+                    menuIndex: 1\r
+                           },{\r
+                               tooltip:'Completed Tasks',\r
+                                       filter: true,\r
+                               iconCls:'icon-complete',\r
+                    menuIndex: 2\r
+                           }],\r
+                               listeners: {\r
+                                       change: function(btn, item){\r
+                                               tx.data.tasks.applyFilter(item.filter);\r
+                                               for (var i = 0; i < 3; i++) {\r
+                                                       viewMenu.items[i].checked = item.menuIndex === i;\r
+                                               }\r
+                                       },\r
+                                       delay: 10 // delay gives user instant click feedback before filtering tasks\r
+                               }\r
+                       }, ' ', ' ', ' '                \r
+               ]\r
+       });\r
+\r
+       var viewport = new Ext.Viewport({\r
+        layout:'border',\r
+        items: [tb, tree, grid]\r
+    });\r
+       \r
+       grid.on('keydown', function(e){\r
+         if(e.getKey() == e.DELETE && !grid.editing){\r
+             actions.deleteTask.execute();\r
+         }\r
+    });\r
+\r
+    tree.el.on('keydown', function(e){\r
+         if(e.getKey() == e.DELETE && !tree.editor.editing){\r
+             actions.deleteList.execute();\r
+         }\r
+    });\r
+\r
+    selections.on('selectionchange', function(sm){\r
+       var disabled = sm.getCount() < 1;\r
+       actions.complete.setDisabled(disabled);\r
+       actions.active.setDisabled(disabled);\r
+       actions.deleteTask.setDisabled(disabled);\r
+    });\r
+\r
+       var taskHeader = new TaskHeader(grid);\r
+\r
+       win.show();\r
+       win.instance.activate();\r
+       \r
+       tx.data.tasks.init();\r
+\r
+       tree.root.select();\r
+\r
+       var loadList = function(listId){\r
+               var node = tree.getNodeById(listId);\r
+               if(node && !node.isSelected()){\r
+                       node.select();\r
+                       return;\r
+               }\r
+               actions.deleteList.setDisabled(!node || !node.attributes.editable);\r
+               actions.deleteFolder.setDisabled(!node || node.attributes.editable === false || !node.attributes.isFolder);\r
+               if(node){\r
+                       if (node.attributes.isFolder) {\r
+                               var lists = [];\r
+                               node.cascade(function(n){\r
+                                       if (!n.attributes.isFolder) {\r
+                                               lists.push(n.attributes.id);\r
+                                       }\r
+                               });\r
+                               tx.data.tasks.loadList(lists);\r
+                       }\r
+                       else {\r
+                               tx.data.tasks.loadList(node.id);\r
+                       }\r
+                       grid.titleNode = node;\r
+                       grid.setTitle(node.text);\r
+                       grid.setIconClass(node.attributes.iconCls);\r
+               }\r
+       }\r
+\r
+       listSm.on('selectionchange', function(t, node){\r
+               loadList(node ? node.id : null);\r
+       });\r
+       \r
+       root.reload();\r
+       \r
+       if(Ext.state.Manager.get('defaultReminder') === undefined){\r
+               Ext.state.Manager.set('defaultReminder', 9 * 60); // default to 9am\r
+       }\r
+       \r
+       win.on('closing', function(){\r
+               Ext.air.NativeWindowManager.closeAll();\r
+       });\r
+       \r
+       tx.ReminderManager.init();\r
+       \r
+       grid.body.on('dragover', function(e){\r
+               if(e.hasFormat(Ext.air.DragType.TEXT)){\r
+                       e.preventDefault();\r
+               }\r
+       });\r
+       \r
+       grid.body.on('drop', function(e){\r
+               if(e.hasFormat(Ext.air.DragType.TEXT)){\r
+                       var text = e.getData(Ext.air.DragType.TEXT);\r
+                       try{\r
+                               // from outlook\r
+                               if(text.indexOf("Subject\t") != -1){\r
+                                       var tasks = text.split("\n");\r
+                                       for(var i = 1, len = tasks.length; i < len; i++){\r
+                                               var data = tasks[i].split("\t");\r
+                                               var list = tx.data.lists.findList(data[2]);\r
+                                               tx.data.tasks.addTask({\r
+                                       taskId: Ext.uniqueId(),\r
+                                       title: Ext.util.Format.htmlEncode(data[0]),\r
+                                       dueDate: Date.parseDate(data[1], 'D n/j/Y') || '',\r
+                                       description: '', \r
+                                       listId: list ? list.id : tx.data.getActiveListId(),\r
+                                       completed: false, \r
+                                                       reminder: ''\r
+                                   });\r
+                                       }\r
+                               }else{\r
+                                       tx.data.tasks.addTask({\r
+                               taskId: Ext.uniqueId(),\r
+                               title: Ext.util.Format.htmlEncode(text),\r
+                               dueDate: new Date(),\r
+                               description: '', \r
+                               listId: tx.data.getActiveListId(),\r
+                               completed: false, \r
+                                               reminder: ''\r
+                           });\r
+                               }\r
+                       }catch(e){\r
+                               air.trace('An error occured trying to import drag drop tasks.');\r
+                       }\r
+               }\r
+       });\r
+});\r
+\r
+    \r
+\r
+</pre>    \r
+</body>\r
+</html>
\ No newline at end of file