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