From: <jde...@us...> - 2010-06-14 10:03:25
|
Revision: 12156 http://pcgen.svn.sourceforge.net/pcgen/?rev=12156&view=rev Author: jdempsey Date: 2010-06-14 10:03:19 +0000 (Mon, 14 Jun 2010) Log Message: ----------- New summary tab - Implement TODOs in CharacterFacade (String only no links) - Implement "Things To Be Done" panel Modified Paths: -------------- sandbox/cdomui/code/src/java/pcgen/core/facade/CharacterFacade.java sandbox/cdomui/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java sandbox/cdomui/code/src/java/pcgen/gui2/tabs/SummaryInfoTab.java Added Paths: ----------- sandbox/cdomui/code/src/java/pcgen/core/facade/TodoFacade.java sandbox/cdomui/code/src/java/pcgen/gui2/facade/TodoFacadeImpl.java Modified: sandbox/cdomui/code/src/java/pcgen/core/facade/CharacterFacade.java =================================================================== --- sandbox/cdomui/code/src/java/pcgen/core/facade/CharacterFacade.java 2010-06-14 02:36:37 UTC (rev 12155) +++ sandbox/cdomui/code/src/java/pcgen/core/facade/CharacterFacade.java 2010-06-14 10:03:19 UTC (rev 12156) @@ -331,4 +331,9 @@ * @return A reference to the text for the character's stats total */ public ReferenceFacade<String> getStatTotalTextRef(); + + /** + * @return A list of things to be done for the character + */ + public ListFacade<TodoFacade> getTodoList(); } Added: sandbox/cdomui/code/src/java/pcgen/core/facade/TodoFacade.java =================================================================== --- sandbox/cdomui/code/src/java/pcgen/core/facade/TodoFacade.java (rev 0) +++ sandbox/cdomui/code/src/java/pcgen/core/facade/TodoFacade.java 2010-06-14 10:03:19 UTC (rev 12156) @@ -0,0 +1,61 @@ +/** + * TodoFacade.java + * Copyright 2010 James Dempsey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 14/06/2010 5:12:24 PM + * + * $Id$ + */ +package pcgen.core.facade; + +/** + * The interface <code>TodoFacade</code> defines what methods must be provided + * to support a Todo entry for a character. + * + * <br/> + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ +public interface TodoFacade +{ + /** + * The possible types of tabs for a character. + */ + public enum CharacterTab + { + SummaryTab, ClassesTab, SkillsTab, FeatsAbilitiesTab + } + + /** + * @return The message to be displayed. Is normally a key to localised + * message, starting with in_ but may also be plain text. + */ + public String getMessageKey(); + + /** + * @return The character tab on which the task can be completed. + */ + public CharacterTab getTab(); + + /** + * @return The internal name of the field where the task can be completed. + */ + public String getFieldName(); +} Property changes on: sandbox/cdomui/code/src/java/pcgen/core/facade/TodoFacade.java ___________________________________________________________________ Added: svn:keywords + Date Author Revision Id Added: svn:eol-style + native Modified: sandbox/cdomui/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java =================================================================== --- sandbox/cdomui/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2010-06-14 02:36:37 UTC (rev 12155) +++ sandbox/cdomui/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2010-06-14 10:03:19 UTC (rev 12156) @@ -72,7 +72,9 @@ import pcgen.core.facade.SkillFacade; import pcgen.core.facade.StatFacade; import pcgen.core.facade.TempBonusFacade; +import pcgen.core.facade.TodoFacade; import pcgen.core.facade.UIDelegate; +import pcgen.core.facade.TodoFacade.CharacterTab; import pcgen.core.facade.util.DefaultListFacade; import pcgen.core.facade.util.ListFacade; import pcgen.core.pclevelinfo.PCLevelInfo; @@ -137,6 +139,7 @@ private DefaultReferenceFacade<String> poolPointText; private DefaultReferenceFacade<String> statTotalLabelText; private DefaultReferenceFacade<String> statTotalText; + private DefaultListFacade<TodoFacade> todoList; /** * Create a new mock character. The character will be blank with no race, @@ -212,10 +215,12 @@ statTotalLabelText = new DefaultReferenceFacade<String>(); statTotalText = new DefaultReferenceFacade<String>(); + todoList = new DefaultListFacade<TodoFacade>(); charLevelsFacade = new CharacterLevelsFacadeImpl(pc, delegate); - updateScorePurchasePool(false); + updateScorePurchasePool(false); + initTodoList(); } private void refreshLanguageList() @@ -251,6 +256,44 @@ ageCategoryList.addElement(new SimpleFacadeImpl(ageCat)); } } + + /** + * Create an initial list of todo items + */ + private void initTodoList() + { + if (isNewCharName(theCharacter.getName())) + { + addTodo(new TodoFacadeImpl(CharacterTab.SummaryTab, + "Name", "in_sumTodoName")); + } + if (theCharacter.getRace() == null + || Constants.s_NONESELECTED.equals(theCharacter.getRace() + .getKeyName())) + { + addTodo(new TodoFacadeImpl(CharacterTab.SummaryTab, "Race", + "in_irTodoRace")); + } + + // Stats todo already done in updateScorePurchasePool + updateLevelTodo(); + } + + /** + * Identify if the supplied name is a default one generated by the system + * e.g. Unnamed 1 or Unnamed 2 + * @param name The name to be checked. + * @return True if the name is a default. + */ + private boolean isNewCharName(String name) + { + if (name == null) + { + return true; + } + + return name.startsWith("Unnamed"); //$NON-NLS-1$ + } /* (non-Javadoc) * @see pcgen.core.facade.CharacterFacade#addAbility(pcgen.core.facade.AbilityCategoryFacade, pcgen.core.facade.AbilityFacade) @@ -353,6 +396,8 @@ refreshLanguageList(); currentXP.setReference(theCharacter.getXP()); xpForNextlevel.setReference(theCharacter.minXPForNextECL()); + + updateLevelTodo(); } /* (non-Javadoc) @@ -393,8 +438,26 @@ refreshLanguageList(); currentXP.setReference(theCharacter.getXP()); xpForNextlevel.setReference(theCharacter.minXPForNextECL()); + + updateLevelTodo(); } + /** + * Update the todo list to reflect the change in level or experience. + */ + private void updateLevelTodo() + { + if (theCharacter.getXP() >= theCharacter.minXPForNextECL()) + { + addTodo(new TodoFacadeImpl(CharacterTab.SummaryTab, "Class", + SettingsHandler.getGame().getLevelUpMessage())); + } + else + { + removeTodo(SettingsHandler.getGame().getLevelUpMessage()); + } + } + /* (non-Javadoc) * @see pcgen.core.facade.CharacterFacade#getClassLevel(pcgen.core.facade.ClassFacade) */ @@ -1130,6 +1193,17 @@ refreshLanguageList(); age.setReference(theCharacter.getAge()); updateAgeCategoryForAge(); + if (theCharacter.getRace() == null + || Constants.s_NONESELECTED.equals(theCharacter.getRace() + .getKeyName())) + { + addTodo(new TodoFacadeImpl(CharacterTab.SummaryTab, "Race", + "in_irTodoRace")); + } + else + { + removeTodo("in_irTodoRace"); + } } /* (non-Javadoc) @@ -1164,8 +1238,60 @@ { this.name.setReference(name); theCharacter.setName(name); + if (isNewCharName(theCharacter.getName())) + { + addTodo(new TodoFacadeImpl(CharacterTab.SummaryTab, "Name", + "in_sumTodoName")); + } + else + { + removeTodo("in_sumTodoName"); + } } + /** + * Search the todo list for an item with the specified messageKey. + * @param messageKey The key to be searched for + * @return The TodoFacade item, or null if none found. + */ + private TodoFacade findTodoByMessage(String messageKey) + { + if (messageKey != null) + { + for (TodoFacade item : todoList) + { + if (messageKey.equals(item.getMessageKey())) + { + return item; + } + } + } + + return null; + } + + + /** + * Add a task to be done to the todo list, if it is not already there. + * @param item The item to be added + */ + private void addTodo(TodoFacade item) + { + if (findTodoByMessage(item.getMessageKey()) == null) + { + todoList.addElement(item); + } + } + + /** + * Remove a task to be done from the todo list. + * @param messageKey The message key of the item to be removed + */ + private void removeTodo(String messageKey) + { + todoList.removeElement(findTodoByMessage(messageKey)); + } + /* (non-Javadoc) * @see pcgen.core.facade.CharacterFacade#getDeityRef() */ @@ -1333,6 +1459,7 @@ delegate.showInfoMessage(Constants.s_APPNAME, SettingsHandler.getGame() .getLevelUpMessage()); } + updateLevelTodo(); } /* (non-Javadoc) @@ -1359,6 +1486,7 @@ delegate.showInfoMessage(Constants.s_APPNAME, SettingsHandler.getGame() .getLevelUpMessage()); } + updateLevelTodo(); } /* (non-Javadoc) @@ -1562,6 +1690,17 @@ "in_sumStatTotal", Integer.toString(statTotal), Integer .toString(modTotal))); } + + if (allAbilitiesAreZero() || (SettingsHandler.getGame().isPurchaseStatMode() && + (theCharacter.getPointBuyPoints() > getUsedStatPool(theCharacter)))) + { + addTodo(new TodoFacadeImpl(CharacterTab.SummaryTab, + "Ability Scores", "in_sumTodoStats")); + } + else + { + removeTodo("in_sumTodoStats"); + } } @@ -1580,4 +1719,12 @@ { return statTotalText; } + + /* (non-Javadoc) + * @see pcgen.core.facade.CharacterFacade#getTodoList() + */ + public ListFacade<TodoFacade> getTodoList() + { + return todoList; + } } Added: sandbox/cdomui/code/src/java/pcgen/gui2/facade/TodoFacadeImpl.java =================================================================== --- sandbox/cdomui/code/src/java/pcgen/gui2/facade/TodoFacadeImpl.java (rev 0) +++ sandbox/cdomui/code/src/java/pcgen/gui2/facade/TodoFacadeImpl.java 2010-06-14 10:03:19 UTC (rev 12156) @@ -0,0 +1,82 @@ +/** + * TodoFacadeImpl.java + * Copyright 2010 (C) James Dempsey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 14/06/2010 5:15:14 PM + * + * $Id$ + */ +package pcgen.gui2.facade; + +import pcgen.core.facade.TodoFacade; + +/** + * The Class <code>TodoFacadeImpl</code> represents a task + * to be done for a character. + * + * <br/> + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ +public class TodoFacadeImpl implements TodoFacade +{ + + private final CharacterTab tab; + private final String fieldName; + private final String messageKey; + + /** + * Create a new todo task. + * @param tab The tab on which the task exists + * @param fieldName The field on which the task exists + * @param messageKey The il8n property key of the task details. + */ + public TodoFacadeImpl(CharacterTab tab, String fieldName, String messageKey) + { + this.tab = tab; + this.fieldName = fieldName; + this.messageKey = messageKey; + } + + /* (non-Javadoc) + * @see pcgen.core.facade.TodoFacade#getFieldName() + */ + public String getFieldName() + { + return fieldName; + } + + /* (non-Javadoc) + * @see pcgen.core.facade.TodoFacade#getMessage() + */ + public String getMessageKey() + { + return messageKey; + } + + /* (non-Javadoc) + * @see pcgen.core.facade.TodoFacade#getTabName() + */ + public CharacterTab getTab() + { + return tab; + } + +} Property changes on: sandbox/cdomui/code/src/java/pcgen/gui2/facade/TodoFacadeImpl.java ___________________________________________________________________ Added: svn:keywords + Date Author Revision Id Added: svn:eol-style + native Modified: sandbox/cdomui/code/src/java/pcgen/gui2/tabs/SummaryInfoTab.java =================================================================== --- sandbox/cdomui/code/src/java/pcgen/gui2/tabs/SummaryInfoTab.java 2010-06-14 02:36:37 UTC (rev 12155) +++ sandbox/cdomui/code/src/java/pcgen/gui2/tabs/SummaryInfoTab.java 2010-06-14 10:03:19 UTC (rev 12156) @@ -20,6 +20,7 @@ */ package pcgen.gui2.tabs; +import java.awt.BorderLayout; import java.awt.Component; import java.awt.Font; import java.awt.GridBagConstraints; @@ -53,6 +54,7 @@ import javax.swing.border.TitledBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.text.html.HTMLDocument; import pcgen.core.facade.AlignmentFacade; import pcgen.core.facade.CharacterFacade; @@ -63,6 +65,9 @@ import pcgen.core.facade.RaceFacade; import pcgen.core.facade.ReferenceFacade; import pcgen.core.facade.SimpleFacade; +import pcgen.core.facade.TodoFacade; +import pcgen.core.facade.event.ListEvent; +import pcgen.core.facade.event.ListListener; import pcgen.core.facade.event.ReferenceEvent; import pcgen.core.facade.event.ReferenceListener; import pcgen.core.facade.util.DefaultListFacade; @@ -77,6 +82,7 @@ import pcgen.gui2.util.SignIcon; import pcgen.gui2.util.SimpleTextIcon; import pcgen.gui2.util.SignIcon.Sign; +import pcgen.system.LanguageBundle; /** * @@ -121,6 +127,7 @@ private final JEditorPane infoPane; private final JLabel statTotalLabel; private final JLabel statTotal; + private final JEditorPane todoPane; public SummaryInfoTab() { @@ -156,6 +163,7 @@ this.infoPane = new JEditorPane(); this.statTotalLabel = new JLabel(); this.statTotal = new JLabel(); + this.todoPane = new JEditorPane(); initComponents(); } @@ -177,6 +185,7 @@ add(basicsPanel, gbc); setPanelTitle(todoPanel, "Things To Be Done"); + initTodoPanel(todoPanel); gbc.gridy = 1; gbc.gridheight = GridBagConstraints.REMAINDER; add(todoPanel, gbc); @@ -205,6 +214,31 @@ titleFont)); } + /** + * Initialise the "Things to be Done" panel. Creates the required + * components and places them in the panel. + * @param panel The panel to be initialised + */ + private void initTodoPanel(JPanel panel) + { + panel.setLayout(new BorderLayout()); + todoPane.setOpaque(false); + todoPane.setContentType("text/html"); //$NON-NLS-1$ + String bodyRule = + "body { font-family: " + textFont.getFamily() + "; " + + "font-size: " + textFont.getSize() + "pt; }"; + ((HTMLDocument) todoPane.getDocument()).getStyleSheet().addRule( + bodyRule); + StringBuffer todoText = new StringBuffer("<html><body></body></html>"); //$NON-NLS-1$ + todoPane.setText(todoText.toString()); + todoPane.setEditable(false); + + JScrollPane scroll = new JScrollPane(todoPane); + scroll.setBorder(BorderFactory.createEmptyBorder()); + + panel.add(scroll, BorderLayout.CENTER); + } + private void initMiddlePanel(JPanel middlePanel) { middlePanel.setLayout(new GridBagLayout()); @@ -625,6 +659,7 @@ stateTable.put(Models.ExpSubtractAction, new ExpSubtractAction(character)); stateTable.put(Models.StatTotalLabelHandler, statTotalLabelHandler); stateTable.put(Models.StatTotalHandler, statTotalHandler); + stateTable.put(Models.TodoListHandler, new TodoListHandler(character)); return stateTable; } @@ -670,7 +705,8 @@ ExpSubtractAction, NextLevelHandler, StatTotalLabelHandler, - StatTotalHandler + StatTotalHandler, + TodoListHandler } public void storeState(Hashtable<Object, Object> state) @@ -687,6 +723,7 @@ ((NextLevelHandler) state.get(Models.NextLevelHandler)).uninstall(); ((LabelHandler) state.get(Models.StatTotalLabelHandler)).uninstall(); ((LabelHandler) state.get(Models.StatTotalHandler)).uninstall(); + ((TodoListHandler) state.get(Models.TodoListHandler)).uninstall(); } public void restoreState(Hashtable<?, ?> state) @@ -703,6 +740,7 @@ ((NextLevelHandler) state.get(Models.NextLevelHandler)).install(); ((LabelHandler) state.get(Models.StatTotalLabelHandler)).install(); ((LabelHandler) state.get(Models.StatTotalHandler)).install(); + ((TodoListHandler) state.get(Models.TodoListHandler)).install(); genderComboBox.setModel((ComboBoxModel) state.get(Models.GenderComboBoxModel)); handsComboBox.setModel((ComboBoxModel) state.get(Models.HandsComboBoxModel)); @@ -1300,5 +1338,98 @@ } } + + /** + * The Class <code>TodoListHandler</code> manages the text displayed in the + * things to be done panel for the character. The text will be updated each + * time the character's todo list changes. The handler also knows how to react + * to install and uninstall actions when the displayed character changes. + */ + private class TodoListHandler + implements ListListener<TodoFacade> + { + + private CharacterFacade character; + + /** + * Create a new instance for the character. + * @param character The character being managed. + */ + public TodoListHandler(CharacterFacade character) + { + this.character = character; + install(); + } + + /** + * Attach the handler to the on-screen field. e.g. When the character + * is made active. + */ + public void install() + { + character.getTodoList().addListListener(this); + refreshTodoList(); + } + + /** + * Detach the handler from the on-screen field. e.g. when the + * character is no longer being displayed. + */ + public void uninstall() + { + character.getTodoList().removeListListener(this); + } + + /* (non-Javadoc) + * @see pcgen.core.facade.event.ListListener#elementAdded(pcgen.core.facade.event.ListEvent) + */ + public void elementAdded(ListEvent<TodoFacade> e) + { + refreshTodoList(); + } + + /* (non-Javadoc) + * @see pcgen.core.facade.event.ListListener#elementRemoved(pcgen.core.facade.event.ListEvent) + */ + public void elementRemoved(ListEvent<TodoFacade> e) + { + refreshTodoList(); + } + + /* (non-Javadoc) + * @see pcgen.core.facade.event.ListListener#elementsChanged(pcgen.core.facade.event.ListEvent) + */ + public void elementsChanged(ListEvent<TodoFacade> e) + { + refreshTodoList(); + } + + /** + * Recreate the "Things to be Done" list based on the character's todo list. + */ + private void refreshTodoList() + { + StringBuffer todoText = new StringBuffer("<html><body>"); //$NON-NLS-1$ + + int i = 1; + for (TodoFacade item : character.getTodoList()) + { + todoText.append(i++).append(". "); //$NON-NLS-1$ + if (item.getMessageKey().startsWith("in_")) //$NON-NLS-1$ + { + todoText.append(LanguageBundle.getString(item.getMessageKey())); + } + else + { + todoText.append(item.getMessageKey()); + } + todoText.append("<br>"); //$NON-NLS-1$ + } + todoText.append("</body></html>"); //$NON-NLS-1$ + todoPane.setText(todoText.toString()); + todoPane.setEditable(false); + } + + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |