Restructered pit-swing to better follow MVC paradigm.

Adding extensibility features for pit-swing.
This commit is contained in:
Jonathan Bernard
2010-03-02 11:59:33 -06:00
parent d77f04f12e
commit a3f9f4b291
8 changed files with 329 additions and 214 deletions

View File

@ -1,17 +1,166 @@
package com.jdbernard.pit.swing
import com.jdbernard.pit.Category
import com.jdbernard.pit.FileProject
import com.jdbernard.pit.Issue
import com.jdbernard.pit.Project
import com.jdbernard.pit.Status
import javax.swing.DefaultListModel
import javax.swing.JOptionPane
import javax.swing.SwingUtilities
import javax.swing.tree.DefaultMutableTreeNode
import javax.swing.tree.DefaultTreeModel
class PITController {
// these will be injected by Griffon
def model
def view
void mvcGroupInit(Map args) {
SwingUtilities.invokeAndWait {
model.issueListRenderer = new IssueListCellRenderer()
model.issueListRenderer.categoryIcons = view.categoryIcons
model.issueListRenderer.statusIcons = view.statusIcons
def config = new File(System.getProperty('user.home'), '.pit')
config = new File(config, 'pit_swing.groovy')
if (config.exists() && config.isFile()) {
def loader = new GroovyClassLoader(PITController.classLoader)
def configBinding = new Binding()
// add default values
configBinding.templates = model.templates
configBinding.issueListRenderer = model.issueListRenderer
def configScript = loader.parseClass(config)
.newInstance(configBinding)
configScript.invokeMethod("run", null)
model.templates = configBinding.templates ?: [:]
if (configBinding.issueListRenderer &&
configBinding.issueListRenderer != model.issueListRenderer)
model.issueListRenderer = configBinding.issueListRenderer
}
}
}
/*
def action = { evt = null ->
/**
* displayProject
* @param project Project to display.
*
*/
void displayProject(Project project) {
view.issueTextArea.text = ""
if (!project) return
if (!model.projectListModels[(project.name)]) {
def dlm = new DefaultListModel()
project.eachIssue(model.filter) { dlm.addElement(it) }
model.projectListModels[(project.name)] = dlm
}
view.issueList.setModel(model.projectListModels[(project.name)])
}
void displayIssue(Issue issue) {
if (!issue) return
view.issueTextArea.text = issue.text
view.issueTextArea.caretPosition = 0
}
void showProjectPopup(Project project, def x, def y) {
model.popupProject = project
view.projectPopupMenu.show(view.projectTree, x, y)
}
void showIssuePopup(Issue issue, def x, def y) {
model.popupIssue = issue
view.issuePopupMenu.show(view.issueList, x, y)
}
def makeNodes(Project project) {
def rootNode = new DefaultMutableTreeNode(project)
project.eachProject(model.filter) { rootNode.add(makeNodes(it)) }
return rootNode
}
def newProject = { evt ->
def name = JOptionPane.showInputDialog(view.frame, 'Project name:',
'New Project...', JOptionPane.QUESTION_MESSAGE)
def project
if (evt.source == view.newProjectButton)
project = model.selectedProject ?: model.rootProject
else project = model.popupProject ?: model.rootProject
def newProject = project.createNewProject(name)
project.projects[(newProject.name)] = newProject
view.projectTree.model = new DefaultTreeModel(
makeNodes(model.rootProject))
}
def deleteProject = { evt ->
def project
if (evt.source == view.deleteProjectButton)
project = model.selectedProject ?: model.rootProject
else project = model.popupProject ?: model.rootModel
project.delete()
model.rootProject = new FileProject(model.rootProject.source)
}
def newIssue = { evt = null ->
view.titleTextField.text = ""
view.categoryComboBox.selectedItem = Category.BUG
view.statusComboBox.selectedItem = Status.NEW
view.prioritySpinner.setValue(5)
view.newIssueDialog.visible = true
}
def createIssue = { evt = null ->
def issueText = ""
if (model.templates[(view.categoryComboBox.selectedItem)]) {
issueText = model.templates[(view.categoryComboBox.selectedItem)]
issueText = issueText.replaceFirst(/TITLE/,
view.titleTextField.text)
}
def issue = model.selectedProject.createNewIssue(
category: view.categoryComboBox.selectedItem,
status: view.statusComboBox.selectedItem,
priority: view.prioritySpinner.value,
text: issueText)
model.projectListModels[(model.selectedProject.name)] = null
displayProject(model.selectedProject)
view.newIssueDialog.visible = false
}
def deleteIssue = { evt ->
def issue
if (evt.source == view.deleteIssueButton)
issue = view.issueList.selectedValue
else issue = model.popupIssue
model.selectedProject.issues.remove(issue.id)
model.projectListModels[(model.selectedProject.name)]
.removeElement(issue)
issue.delete()
}
def changeCategory = { evt ->
model.popupIssue.status = status
view.issueList.invalidate()
view.issueList.repaint()
}
*/
}