3
<title>The source code</title>
4
<link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
5
<script type="text/javascript" src="../resources/prettify/prettify.js"></script>
7
<body onload="prettyPrint();">
8
<pre class="prettyprint lang-js">// Initialize the state provider
9
Ext.state.Manager.setProvider(new Ext.air.FileProvider({
11
// if first time running
23
Ext.onReady(function(){
26
// maintain window state automatically
27
var win = new Ext.air.NativeWindow({
29
instance: window.nativeWindow,
31
trayIcon: 'ext-air/resources/icons/extlogo16.png',
32
trayTip: 'Simple Tasks',
34
text: 'Open Simple Tasks',
41
air.NativeApplication.nativeApplication.exit();
46
tx.data.conn.open('tasks.db');
48
var grid = new TaskGrid();
49
var selections = grid.getSelectionModel();
52
// Shared actions used by Ext toolbars, menus, etc.
54
newTask: new Ext.Action({
56
iconCls: 'icon-active',
59
taskHeader.ntTitle.focus();
63
deleteTask: new Ext.Action({
65
iconCls: 'icon-delete-task',
66
tooltip: 'Delete Task',
69
Ext.Msg.confirm('Confirm', 'Are you sure you want to delete the selected task(s)?', function(btn){
71
selections.each(function(s){
72
tx.data.tasks.remove(s);
79
complete: new Ext.Action({
80
itemText: 'Mark Complete',
81
iconCls: 'icon-mark-complete',
82
tooltip: 'Mark Complete',
85
selections.each(function(s){
86
s.set('completed', true);
88
tx.data.tasks.applyFilter();
92
active: new Ext.Action({
93
itemText: 'Mark Active',
94
tooltip: 'Mark Active',
95
iconCls: 'icon-mark-active',
98
selections.each(function(s){
99
s.set('completed', false);
101
tx.data.tasks.applyFilter();
105
newList: new Ext.Action({
106
itemText: 'New List',
108
iconCls: 'icon-list-new',
110
var id = tx.data.lists.newList(false, tree.getActiveFolderId()).id;
111
tree.startEdit(id, true);
115
deleteList: new Ext.Action({
117
tooltip: 'Delete List',
118
iconCls: 'icon-list-delete',
121
tree.removeList(tree.getSelectionModel().getSelectedNode());
125
newFolder: new Ext.Action({
126
itemText: 'New Folder',
127
tooltip: 'New Folder',
128
iconCls: 'icon-folder-new',
130
var id = tx.data.lists.newList(true, tree.getActiveFolderId()).id;
131
tree.startEdit(id, true);
135
deleteFolder: new Ext.Action({
137
tooltip: 'Delete Folder',
138
iconCls: 'icon-folder-delete',
140
handler: function(s){
141
tree.removeList(tree.getSelectionModel().getSelectedNode());
145
quit : new Ext.Action({
148
air.NativeApplication.nativeApplication.exit();
152
pasteAsTask : new Ext.Action({
153
itemText: 'Paste as New Task',
154
tooltip: 'Paste as New Task',
155
iconCls: 'icon-paste-new',
157
if(air.Clipboard.generalClipboard.hasFormat(air.ClipboardFormats.TEXT_FORMAT)){
158
var text = air.Clipboard.generalClipboard.getData(air.ClipboardFormats.TEXT_FORMAT);
159
tx.data.tasks.addTask({
160
taskId: Ext.uniqueId(),
161
title: Ext.util.Format.htmlEncode(text.replace(/[\n\r]/g, '')),
164
listId: tx.data.getActiveListId(),
169
Ext.Msg.alert('Warning', 'Could not create task. The clipboard is empty.');
174
tx.actions = actions;
176
var menus = Ext.air.SystemMenu;
185
var importer = new tx.Importer();
186
importer.doImport(function(){
187
tx.data.lists.load();
208
var viewMenu = menus.add('View', [{
212
Ext.getCmp('filter').setActiveItem(0);
215
text: 'Active Tasks',
218
Ext.getCmp('filter').setActiveItem(1);
221
text: 'Completed Tasks',
224
Ext.getCmp('filter').setActiveItem(2);
231
Ext.air.NativeWindowManager.getAboutWindow().activate();
236
var tree = new ListTree({
241
var root = tree.getRootNode();
243
var listSm = tree.getSelectionModel();
245
tx.data.lists.bindTree(tree);
246
tx.data.lists.on('update', function(){
247
tx.data.tasks.applyGrouping();
249
grid.setTitle(grid.titleNode.text);
253
var tb = new Ext.Toolbar({
261
handler: actions.newTask.initialConfig.handler,
262
menu: [actions.newTask, actions.newList, actions.newFolder]
279
tooltip:'Active Tasks',
281
iconCls:'icon-active',
284
tooltip:'Completed Tasks',
286
iconCls:'icon-complete',
290
change: function(btn, item){
291
tx.data.tasks.applyFilter(item.filter);
292
for (var i = 0; i < 3; i++) {
293
viewMenu.items[i].checked = item.menuIndex === i;
296
delay: 10 // delay gives user instant click feedback before filtering tasks
302
var viewport = new Ext.Viewport({
304
items: [tb, tree, grid]
307
grid.on('keydown', function(e){
308
if(e.getKey() == e.DELETE && !grid.editing){
309
actions.deleteTask.execute();
313
tree.el.on('keydown', function(e){
314
if(e.getKey() == e.DELETE && !tree.editor.editing){
315
actions.deleteList.execute();
319
selections.on('selectionchange', function(sm){
320
var disabled = sm.getCount() < 1;
321
actions.complete.setDisabled(disabled);
322
actions.active.setDisabled(disabled);
323
actions.deleteTask.setDisabled(disabled);
326
var taskHeader = new TaskHeader(grid);
329
win.instance.activate();
331
tx.data.tasks.init();
335
var loadList = function(listId){
336
var node = tree.getNodeById(listId);
337
if(node && !node.isSelected()){
341
actions.deleteList.setDisabled(!node || !node.attributes.editable);
342
actions.deleteFolder.setDisabled(!node || node.attributes.editable === false || !node.attributes.isFolder);
344
if (node.attributes.isFolder) {
346
node.cascade(function(n){
347
if (!n.attributes.isFolder) {
348
lists.push(n.attributes.id);
351
tx.data.tasks.loadList(lists);
354
tx.data.tasks.loadList(node.id);
356
grid.titleNode = node;
357
grid.setTitle(node.text);
358
grid.setIconClass(node.attributes.iconCls);
362
listSm.on('selectionchange', function(t, node){
363
loadList(node ? node.id : null);
368
if(Ext.state.Manager.get('defaultReminder') === undefined){
369
Ext.state.Manager.set('defaultReminder', 9 * 60); // default to 9am
372
win.on('closing', function(){
373
Ext.air.NativeWindowManager.closeAll();
376
tx.ReminderManager.init();
378
grid.body.on('dragover', function(e){
379
if(e.hasFormat(Ext.air.DragType.TEXT)){
384
grid.body.on('drop', function(e){
385
if(e.hasFormat(Ext.air.DragType.TEXT)){
386
var text = e.getData(Ext.air.DragType.TEXT);
389
if(text.indexOf("Subject\t") != -1){
390
var tasks = text.split("\n");
391
for(var i = 1, len = tasks.length; i < len; i++){
392
var data = tasks[i].split("\t");
393
var list = tx.data.lists.findList(data[2]);
394
tx.data.tasks.addTask({
395
taskId: Ext.uniqueId(),
396
title: Ext.util.Format.htmlEncode(data[0]),
397
dueDate: Date.parseDate(data[1], 'D n/j/Y') || '',
399
listId: list ? list.id : tx.data.getActiveListId(),
405
tx.data.tasks.addTask({
406
taskId: Ext.uniqueId(),
407
title: Ext.util.Format.htmlEncode(text),
410
listId: tx.data.getActiveListId(),
416
air.trace('An error occured trying to import drag drop tasks.');
b'\\ No newline at end of file'