From 60109087e524b0c2356f4c5e16c0253fa9d6965d Mon Sep 17 00:00:00 2001 From: Jonathan Bernard Date: Wed, 24 Feb 2010 03:05:37 -0600 Subject: [PATCH] Small enhancements to libpit to facilitate pit-swing. Added delete() and createNewProject(String) to Project class. Added nicer toString() method to Category enum. --- libpit/project.properties | 6 +- libpit/release/pit-1.1.4.jar | Bin 31598 -> 0 bytes libpit/release/pit-1.1.5.jar | Bin 0 -> 32092 bytes libpit/session.vim | 23 ++-- libpit/src/com/jdbernard/pit/Category.groovy | 4 +- libpit/src/com/jdbernard/pit/FileIssue.groovy | 5 + .../src/com/jdbernard/pit/FileProject.groovy | 11 +- libpit/src/com/jdbernard/pit/Project.groovy | 4 + .../test/com/jdbernard/pit/MockProject.groovy | 6 + .../com/jdbernard/pit/swing/PITView.groovy | 118 +++++++++++++++--- version.properties | 2 +- 11 files changed, 145 insertions(+), 34 deletions(-) delete mode 100644 libpit/release/pit-1.1.4.jar create mode 100644 libpit/release/pit-1.1.5.jar diff --git a/libpit/project.properties b/libpit/project.properties index 1348ca1..4281214 100644 --- a/libpit/project.properties +++ b/libpit/project.properties @@ -1,10 +1,10 @@ -#Mon Feb 22 07:08:09 CST 2010 +#Wed Feb 24 03:03:11 CST 2010 build.dir=build src.dir=src lib.shared.dir=../shared-libs test.dir=test -build.number=2 -expected.application.version=1.1.4 +build.number=4 +expected.application.version=1.1.5 lib.dir=lib release.dir=release release.jar=pit-${application.version}.jar diff --git a/libpit/release/pit-1.1.4.jar b/libpit/release/pit-1.1.4.jar deleted file mode 100644 index 8dc6a2af0488018c02a06c95d88afe5363f4bef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31598 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%0DKSf34B8i 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 diff --git a/libpit/release/pit-1.1.5.jar b/libpit/release/pit-1.1.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..1c5ee244464851ab3d81d6819259f524b53fce33 GIT binary patch literal 32092 zcmaI61CXXcv?W+}mu=g&ZJS-TZQHhOTYuTMtGZlWHn-orH#7Tob~ht388_m~ zxHs=PM^Oe831erDysBy;tz7uQ?fF2^b5aa=%{C>=bDunms$3You);Q9cd+H zXC>8uqJYU}p5Qz?bE1_|WRz80a;XC^dEqwk|>qGgnwqtSRD zlAc&SJ3Tu8S1>?8gXsS~Zm@sB7~9)2{LgUzPXzpbA*@V(n>yJUIhp+5uz>%^X~_Qv z*1^){f8n8k{sRxw&qfr300cBb0t7_(|B4qeaxpcxck-k+wlQ*c&eekUz+FkKTa00? zRoY53_c;;?8%#4ZnZOSIwT@|`#oi>re3{4>gNvzMoW^R#$~XNuE&(Ey6D%k!3_!vq z+~yn(8BemEfNJ2vlWdY`nmSpZ$q69Np)YW;m zk8GUN|z|sV|jXzu^dJan0Y=t%DTNB17^nREoP6(@XiH zOX4gt@j;eRfsrF`yQ)#JS`B7)3QU@<%7}XWhBjLd!fsQ4X(Y*;W-Di=^kEqZxgr%; z2!3N`D_>w=8S;%1!QfwCfa%ti24`-c-xo5RLp? zW#mi_`ANlof%Pi>B7#9vr$v-((gKZvV`Lualbu!6>(S284`Wjtqh2Oqm8Gy@&6F{H zq6>FPMT*svR@ZRGhf&l_)p*;_UN?3MEvY-kX3=YdkL}D8&d*vnf32>5kxT0{O_F4z zW3CCN=|K#mk+KM9!(V5d-9NP8b71qdqb|Og$XLzlN%FK0k+Z3_Hq``H)29r*M5L#K zNp{ixtF)N5Jp-9+rJf@~vcW-SR-I(Lsh;Rag-m9V)lh!!$mZ=?ZpL5}Xj_7iuec0V zx!O3cDJyY=i^IGPMCT*OgQ$+4Ul$Pl(0afuI_%g+?2#<3Z@;!)jL6Q3Y20+2n`4c! zJuY!4QIb;}f*Ï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 L1M)GiKi>Tx{D8?p literal 0 HcmV?d00001 diff --git a/libpit/session.vim b/libpit/session.vim index ae6b9ff..d194a25 100644 --- a/libpit/session.vim +++ b/libpit/session.vim @@ -43,9 +43,9 @@ badd +1 test/com/jdbernard/pit/IssueTest.groovy badd +6 src/com/jdbernard/pit/Project.groovy badd +1 test/com/jdbernard/pit/ProjectTest.groovy badd +1 src/com/jdbernard/pit/FileIssue.groovy -badd +0 test/com/jdbernard/pit/FileIssueTest.groovy +badd +1 test/com/jdbernard/pit/FileIssueTest.groovy badd +1 src/com/jdbernard/pit/FileProject.groovy -badd +0 test/com/jdbernard/pit/FileProjectTest.groovy +badd +1 test/com/jdbernard/pit/FileProjectTest.groovy args build.xml edit build.xml set splitbelow splitright @@ -701,12 +701,12 @@ setlocal nowinfixwidth setlocal wrap setlocal wrapmargin=0 silent! normal! zE -let s:l = 103 - ((26 * winheight(0) + 39) / 78) +let s:l = 1 - ((0 * winheight(0) + 39) / 78) if s:l < 1 | let s:l = 1 | endif exe s:l normal! zt -103 -normal! 04l +1 +normal! 0 wincmd w exe 'vert 1resize ' . ((&columns * 91 + 91) / 182) exe 'vert 2resize ' . ((&columns * 90 + 91) / 182) @@ -1260,12 +1260,12 @@ setlocal nowinfixwidth setlocal wrap setlocal wrapmargin=0 silent! normal! zE -let s:l = 40 - ((39 * winheight(0) + 39) / 78) +let s:l = 1 - ((0 * winheight(0) + 39) / 78) if s:l < 1 | let s:l = 1 | endif exe s:l normal! zt -40 -normal! 029l +1 +normal! 0 wincmd w argglobal edit test/com/jdbernard/pit/FileProjectTest.groovy @@ -1364,17 +1364,16 @@ setlocal nowinfixwidth setlocal wrap setlocal wrapmargin=0 silent! normal! zE -let s:l = 154 - ((77 * winheight(0) + 39) / 78) +let s:l = 1 - ((0 * winheight(0) + 39) / 78) if s:l < 1 | let s:l = 1 | endif exe s:l normal! zt -154 +1 normal! 0 wincmd w -2wincmd w exe 'vert 1resize ' . ((&columns * 91 + 91) / 182) exe 'vert 2resize ' . ((&columns * 90 + 91) / 182) -tabnext 6 +tabnext 1 if exists('s:wipebuf') silent exe 'bwipe ' . s:wipebuf endif diff --git a/libpit/src/com/jdbernard/pit/Category.groovy b/libpit/src/com/jdbernard/pit/Category.groovy index 7a4eaf1..cc095fe 100644 --- a/libpit/src/com/jdbernard/pit/Category.groovy +++ b/libpit/src/com/jdbernard/pit/Category.groovy @@ -8,9 +8,11 @@ public enum Category { public static Category toCategory(String s) { for(c in Category.values()) - if (c.toString().startsWith(s.toUpperCase())) return c + if (c.name().startsWith(s.toUpperCase())) return c throw new IllegalArgumentException("No category matches ${s}.") } public String getSymbol() { toString()[0].toLowerCase() } + + public String toString() { return "${name()[0]}${name()[1..-1].toLowerCase()}" } } diff --git a/libpit/src/com/jdbernard/pit/FileIssue.groovy b/libpit/src/com/jdbernard/pit/FileIssue.groovy index df42258..7b59cb8 100644 --- a/libpit/src/com/jdbernard/pit/FileIssue.groovy +++ b/libpit/src/com/jdbernard/pit/FileIssue.groovy @@ -36,6 +36,11 @@ public class FileIssue extends Issue { public String getFilename() { return makeFilename(id, category, priority) } + public void setText(String text) { + super.setText(text) + source.write(text) + } + public static boolean isValidFilename(String name) { return name ==~ /(\d+)([bcft])(\d).*/ } diff --git a/libpit/src/com/jdbernard/pit/FileProject.groovy b/libpit/src/com/jdbernard/pit/FileProject.groovy index 199899d..4d8b2fc 100644 --- a/libpit/src/com/jdbernard/pit/FileProject.groovy +++ b/libpit/src/com/jdbernard/pit/FileProject.groovy @@ -5,7 +5,7 @@ class FileProject extends Project { protected File source public FileProject(File dir) { - super(dir.name) + super(dir.canonicalFile.name) if (!dir.isDirectory()) throw new IllegalArgumentException( @@ -65,6 +65,15 @@ class FileProject extends Project { return issue } + public FileProject createNewProject(String name) { + def newDir = new File(source, name) + newDir.mkdirs() + + return new FileProject(newDir) + } + + public boolean delete() { return source.delete() } + @Override public String toString() { return name } diff --git a/libpit/src/com/jdbernard/pit/Project.groovy b/libpit/src/com/jdbernard/pit/Project.groovy index 507453b..9c47f9a 100644 --- a/libpit/src/com/jdbernard/pit/Project.groovy +++ b/libpit/src/com/jdbernard/pit/Project.groovy @@ -30,4 +30,8 @@ public abstract class Project { String toString() { return name } public abstract Issue createNewIssue(Map options) + + public abstract Project createNewProject(String name) + + public abstract boolean delete() } diff --git a/libpit/test/com/jdbernard/pit/MockProject.groovy b/libpit/test/com/jdbernard/pit/MockProject.groovy index 2eb569d..9e1c2ee 100644 --- a/libpit/test/com/jdbernard/pit/MockProject.groovy +++ b/libpit/test/com/jdbernard/pit/MockProject.groovy @@ -7,4 +7,10 @@ class MockProject extends Project { public Issue createNewIssue(Map options) { throw new UnsupportedOperationException() } + + public Project createNewProject(String name) { + throw new UnsupportedOperationException() + } + + public boolean delete() { return true } } diff --git a/pit-swing/griffon-app/views/com/jdbernard/pit/swing/PITView.groovy b/pit-swing/griffon-app/views/com/jdbernard/pit/swing/PITView.groovy index 48ee612..6927c79 100644 --- a/pit-swing/griffon-app/views/com/jdbernard/pit/swing/PITView.groovy +++ b/pit-swing/griffon-app/views/com/jdbernard/pit/swing/PITView.groovy @@ -1,11 +1,15 @@ package com.jdbernard.pit.swing import com.jdbernard.pit.Category +import com.jdbernard.pit.Filter import com.jdbernard.pit.Issue import com.jdbernard.pit.Project import com.jdbernard.pit.FileProject +import groovy.beans.Bindable +import java.awt.event.MouseEvent import javax.swing.DefaultListModel import javax.swing.JFileChooser +import javax.swing.JOptionPane import javax.swing.JSplitPane import javax.swing.ListSelectionModel import javax.swing.tree.DefaultMutableTreeNode @@ -14,34 +18,78 @@ import javax.swing.tree.DefaultTreeModel import javax.swing.tree.TreeSelectionModel import net.miginfocom.swing.MigLayout -// VIEW-Specific data +/* ******************** + * VIEW-Specific data + * ********************/ + +// cache the ListModels projectListModels = [:] -categoryIcons = [(Category.BUG): imageIcon('/bug.png'), - (Category.CLOSED): imageIcon('/closed.png'), - (Category.FEATURE): imageIcon('/feature.png'), - (Category.TASK): imageIcon('/task.png')] +// map of category -> list icon +categoryIcons = [:] -openDialog = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY) +// filter for projects and issues +filter = new Filter(categories: []) -// event methods -displayProject = { evt = null -> - def project= evt?.newLeadSelectionPath?.lastPathComponent?.userObject +@Bindable def popupProject = null + +// initialize category-related view data +Category.values().each { + categoryIcons[(it)] = imageIcon("/${it.name().toLowerCase()}.png") + filter.categories.add(it) +} + +/* *************** + * event methods + * ***************/ + +/** + * displayProject + * @param project Project to display. + * + */ +displayProject = { project = null -> issueTextArea.text = "" if (!project) return if (!projectListModels[(project.name)]) { def model = new DefaultListModel() - project.eachIssue { model.addElement(it) } + project.eachIssue(filter) { model.addElement(it) } projectListModels[(project.name)] = model } issueList.setModel(projectListModels[(project.name)]) } -displayIssue = { evt = null -> - if (issueList.selectedValue) - issueTextArea.text = issueList.selectedValue.text +displayIssue = { issue = null -> + if (issue) issueTextArea.text = issue.text +} + +showProjectPopup = { project, x, y -> + popupProject = project + projectPopupMenu[1].enabled = project != null + projectPopupMenu.show(projectTree, x, y) +} + +/* **************** + * GUI components + * ****************/ +openDialog = fileChooser(fileSelectionMode: JFileChooser.DIRECTORIES_ONLY) + +projectPopupMenu = popupMenu() { + menuItem('New Project...', + actionPerformed: { + def name = JOptionPane.showInputDialog(frame, 'Project name:', + 'New Project...', JOptionPane.QUESTION_MESSAGE) + + if (!popupProject) popupProject = model.rootProject + def newProject = popupProject.createNewProject(name) + + projectTree.model = new DefaultTreeModel( + makeNodes(model.rootProject)) + }) + menuItem('Delete Project', + actionPerformed: { popupProject.delete() }) } frame = application(title:'Personal Issue Tracker', @@ -69,6 +117,29 @@ frame = application(title:'Personal Issue Tracker', projectDir = openDialog.selectedFile model.rootProject = new FileProject(projectDir) }) + + menuItem('Exit', actionPerformed: { app.shutdown() }) + } + + menu('View') { + Category.values().each { + checkBoxMenuItem(it.toString(), + selected: filter.categories.contains(it), + actionPerformed: { evt -> + def cat = Category.toCategory(evt.source.text) + if (filter.categories.contains(cat)) { + filter.categories.remove(cat) + evt.source.selected = false + } else { + filter.categories.add(cat) + evt.source.selected = true + } + projectListModels.clear() + displayProject(projectTree.leadSelectionPath + ?.lastPathComponent?.userObject) + }) + } + } } @@ -89,7 +160,19 @@ frame = application(title:'Personal Issue Tracker', new DefaultTreeModel(makeNodes(model.rootProject)) } else new DefaultTreeModel() }), - valueChanged: displayProject) + valueChanged: { evt -> + displayProject(evt?.newLeadSelectionPath + ?.lastPathComponent?.userObject) + }, + mouseClicked: { evt -> + if (evt.button == MouseEvent.BUTTON3) { + showProjectPopup( + projectTree.getPathForLocation(evt.x, evt.y) + ?.lastPathComponent?.userObject, + evt.x, evt.y) + } + }) + projectTree.selectionModel.selectionMode = TreeSelectionModel.SINGLE_TREE_SELECTION } @@ -103,7 +186,7 @@ frame = application(title:'Personal Issue Tracker', cellRenderer: new IssueListCellRenderer( issueIcons: categoryIcons), selectionMode: ListSelectionModel.SINGLE_SELECTION, - valueChanged: displayIssue) + valueChanged: { displayIssue(issueList.selectedValue) }) } scrollPane(constraints: "bottom") { issueTextArea = textArea() @@ -112,8 +195,11 @@ frame = application(title:'Personal Issue Tracker', } } +/* ****************** + * Auxilary methods + * ******************/ def makeNodes(Project project) { def rootNode = new DefaultMutableTreeNode(project) - project.eachProject { rootNode.add(makeNodes(it)) } + project.eachProject(filter) { rootNode.add(makeNodes(it)) } return rootNode } diff --git a/version.properties b/version.properties index a70b734..86ae6c2 100644 --- a/version.properties +++ b/version.properties @@ -1 +1 @@ -application.version=1.1.4 +application.version=1.1.5