Coverage Report - de.glossmaker.gloss.observer.GlossItemsChangePublisher
 
Classes in this File Line Coverage Branch Coverage Complexity
GlossItemsChangePublisher
9%
18/183
4%
2/48
1,733
 
 1  
 package de.glossmaker.gloss.observer;
 2  
 
 3  
 import guihelper.statusbar.EStatusBarMessageLevel;
 4  
 import guihelper.statusbar.StatusBarMessagePublisher;
 5  
 
 6  
 import java.beans.PropertyChangeSupport;
 7  
 import java.util.ArrayList;
 8  
 
 9  
 import org.apache.log4j.Logger;
 10  
 
 11  
 import de.glossmaker.gloss.datastructure.EOperation;
 12  
 import de.glossmaker.gloss.datastructure.GlossItem;
 13  
 import de.glossmaker.gloss.datastructure.GlossItems;
 14  
 import de.glossmaker.gloss.language.Translation;
 15  
 import de.glossmaker.gloss.listener.EActionCommands;
 16  
 import de.glossmaker.gloss.listener.UndoListener;
 17  
 import de.glossmaker.gloss.undo.UndoGlossStack;
 18  
 
 19  
 /**
 20  
  * 
 21  
  * 
 22  
  * @author Markus Flingelli
 23  
  */
 24  
 public class GlossItemsChangePublisher extends PropertyChangeSupport {
 25  
         private static final long serialVersionUID = -5282100948062214767L;
 26  1
         private static final Logger mLogger = Logger.getLogger(GlossItemsChangePublisher.class);
 27  1
         private static GlossItemsChangePublisher mGlossItemsChangePublisher = null;
 28  1
         private static StatusBarMessagePublisher mStatusMessagePublisher = null;
 29  1
         private static UndoListener mUndoListener = null;
 30  1
         private Translation mTranslation = null;
 31  
         
 32  1
         private GlossItems mGlossItems = null;
 33  1
         private boolean mIsFileOpen = false;
 34  1
         private String mFileName = null;
 35  
         
 36  
         private GlossItemsChangePublisher(GlossItems items) {
 37  1
                 super(items);
 38  1
                 mGlossItems = items;
 39  1
                 mStatusMessagePublisher = StatusBarMessagePublisher.getInstance();                
 40  1
                 mTranslation = Translation.getInstance();
 41  1
         }
 42  
         
 43  
         public static GlossItemsChangePublisher getInstance(GlossItems items) {
 44  6
                 if (mGlossItemsChangePublisher == null) {
 45  1
                         mGlossItemsChangePublisher = new GlossItemsChangePublisher(items);
 46  1
                         mUndoListener = UndoListener.getInstance(items);
 47  1
                         mGlossItemsChangePublisher.addPropertyChangeListener(mUndoListener);
 48  
                 }
 49  
                 
 50  6
                 return mGlossItemsChangePublisher;
 51  
         }
 52  
         
 53  
         public boolean isFileChanged() {
 54  0
                 return UndoGlossStack.getInstance().undoSize() > 0;
 55  
         }
 56  
         
 57  
         public boolean isFileOpen() {
 58  0
                 return mIsFileOpen;
 59  
         }
 60  
         
 61  
         public String getFileName() {
 62  0
                 return mFileName;
 63  
         }
 64  
         
 65  
         /** Used for undo/redo import glossary file. */
 66  
         public void clear() {
 67  0
                 mGlossItems.clear();
 68  0
         }
 69  
         
 70  
         public void clearContent() {
 71  0
                 mGlossItems.clear();
 72  0
                 mIsFileOpen = false;
 73  0
                 mStatusMessagePublisher.publish(EStatusBarMessageLevel.INFO, mTranslation.getValue("statusbar.info.new_file.text"));
 74  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.CREATE_NEW_FILE.toString(), null, mGlossItems);
 75  0
         }
 76  
 
 77  
         public void saveFile() {
 78  0
                 mGlossItems.writeToFile(mFileName);
 79  0
                 mStatusMessagePublisher.publish(EStatusBarMessageLevel.INFO, mTranslation.getValue("statusbar.info.file_saved.text", mFileName));
 80  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.SAVE_FILE.toString(), null, mFileName);
 81  0
         }
 82  
         
 83  
         public void saveFileAs(String fileName) {
 84  0
                 mIsFileOpen = true;
 85  0
                 mGlossItems.writeToFile(fileName);
 86  0
                 mStatusMessagePublisher.publish(EStatusBarMessageLevel.INFO, mTranslation.getValue("statusbar.info.file_saved.text", fileName));
 87  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.SAVE_FILE_AS.toString(), null, fileName);
 88  0
         }
 89  
 
 90  
         public void openFile(String fileName) {
 91  0
                 mFileName = fileName;
 92  0
                 mIsFileOpen = true;
 93  0
                 mGlossItems.readFromFile(fileName);
 94  0
                 if (mGlossItems.size() > 0) {
 95  0
                         mStatusMessagePublisher.publish(EStatusBarMessageLevel.INFO, mTranslation.getValue("statusbar.info.file_opened.text", fileName));
 96  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.OPEN_FILE.toString(), null, fileName);
 97  
                 } else {
 98  0
                         mStatusMessagePublisher.publish(EStatusBarMessageLevel.INFO, mTranslation.getValue("statusbar.info.file_not_opened.text", fileName));
 99  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.FILE_NOT_OPENED.toString(), null, fileName);
 100  
                 }
 101  0
         }
 102  
         
 103  
         public boolean setKey(GlossItem item, String key) {
 104  0
                 boolean result = true;
 105  0
                 String oldKey = item.getKey();
 106  0
                 if (key.equals(oldKey) == false) {
 107  0
                         if (mGlossItems.existsKey(key) == false) {
 108  0
                                 ArrayList<Object> oldValues = new ArrayList<Object>();
 109  0
                                 oldValues.add(oldKey);
 110  0
                                 oldValues.add(item);
 111  0
                                 item.setKey(key);
 112  0
                                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_KEY_CHANGED.toString(), oldValues, key);
 113  0
                                 mLogger.info("oldKey=" + oldKey + ", key=" + item.getKey());
 114  0
                         } else {
 115  0
                                 result = false;
 116  0
                                 String message = mTranslation.getValue("statusbar.warning.key_exists.text", key);
 117  0
                                 mStatusMessagePublisher.publish(EStatusBarMessageLevel.WARNING, message);
 118  0
                                 mLogger.info(message);
 119  
                         }
 120  
                 } 
 121  0
                 return result;
 122  
         }
 123  
         
 124  
         public void setHeading(GlossItem item, String heading) {
 125  0
                 String oldHeading = item.getHeading();
 126  0
                 if (heading.equals(oldHeading) == false) {
 127  0
                         ArrayList<Object> oldValues = new ArrayList<Object>();
 128  0
                         oldValues.add(oldHeading);
 129  0
                         oldValues.add(item);
 130  0
                         item.setHeading(heading);
 131  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_HEADING_CHANGED.toString(), oldValues, heading);
 132  0
                         mLogger.info("oldHeading=" + oldHeading + ", heading=" + item.getHeading());
 133  
                 }
 134  0
         }
 135  
         
 136  
         public void setWord(GlossItem item, String word, boolean isAutoUpdate) {
 137  0
                 changeWord(item, word, isAutoUpdate, EActionCommands.GLOSS_ITEM_WORD_CHANGED);
 138  0
         }
 139  
         
 140  
         public void setWordInTree(GlossItem item, String word, boolean isAutoUpdate) {
 141  0
                 changeWord(item, word, isAutoUpdate, EActionCommands.GLOSS_ITEM_WORD_IN_TREE_CHANGED);
 142  0
         }
 143  
         
 144  
         
 145  
         private void changeWord (GlossItem item, String word, boolean isAutoUpdate, EActionCommands sender) {
 146  0
                 String oldWord = item.getWord();
 147  0
                 ArrayList<Object> oldValues = new ArrayList<Object>();
 148  0
                 oldValues.add(oldWord);
 149  0
                 oldValues.add(item);
 150  0
                 oldValues.add(isAutoUpdate);
 151  0
                 if (!isAutoUpdate) {
 152  0
                         if (word.equals(item.getWord()) == false) {
 153  0
                                 item.setWord(word);
 154  0
                                 mGlossItemsChangePublisher.firePropertyChange(sender.toString(), oldValues, word);
 155  0
                                 mLogger.info("oldWord=" + word + ", word=" + item.getWord());
 156  
                         }
 157  
                 } else {
 158  0
                         GlossItem oldItem = (GlossItem) item.cloneItem();
 159  0
                         if (word.length() > 0) {
 160  0
                                 item.setHeading(word.subSequence(0, 1).toString());
 161  
                         } else {
 162  0
                                 item.setHeading("");
 163  
                         }
 164  0
                         item.setWord(word);
 165  0
                         item.setKey(word);                
 166  0
                         oldValues.add(oldItem);
 167  0
                         GlossItem clone = (GlossItem) item.cloneItem();
 168  0
                         oldValues.add(clone);                        
 169  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_PER_AUTO_UPDATE_CHANGED.toString(), oldValues, oldItem);
 170  0
                         if (sender.equals(EActionCommands.GLOSS_ITEM_WORD_IN_TREE_CHANGED)) {
 171  0
                                 mGlossItemsChangePublisher.firePropertyChange(sender.toString(), oldValues, word);
 172  
                         }
 173  
                 }
 174  0
         }
 175  
         public void setDefinition(GlossItem item, String definition) {
 176  0
                 String oldDefintion = item.getDefinition();
 177  0
                 if (definition.equals(item.getDefinition()) == false) {
 178  0
                         ArrayList<Object> oldValues = new ArrayList<Object>();
 179  0
                         oldValues.add(oldDefintion);
 180  0
                         oldValues.add(item);
 181  0
                         item.setDefinition(definition);
 182  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_DEFINITION_CHANGED.toString(), oldValues, definition);
 183  0
                         mLogger.info("oldDefinition=" + oldDefintion + ", definition=" + definition);
 184  
                 }
 185  0
         }
 186  
         
 187  
         public boolean addGlossItem(String heading) {
 188  0
                 boolean result = true;
 189  0
                 if (mGlossItems.existsKey("") == false) {
 190  0
                         String word = mTranslation.getValue("tree.popup.add_item.word_text");
 191  0
                         if (heading.equals("") == false) {
 192  0
                                 word = heading;
 193  
                         }
 194  0
                         GlossItem item = new GlossItem("", heading, word, "");
 195  0
                         mGlossItems.add(item);
 196  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_ADDED.toString(), null, item);
 197  0
                         mLogger.info("New item added.");
 198  0
                 } else {
 199  0
                         result = false;
 200  0
                         String message = mTranslation.getValue("statusbar.warning.empty_key.text");
 201  0
                         mStatusMessagePublisher.publish(EStatusBarMessageLevel.WARNING, message);
 202  0
                         mLogger.info(message);
 203  
                 }
 204  
                 
 205  0
                 return result;
 206  
         }
 207  
         
 208  
         public boolean addGlossItem(GlossItem item) {
 209  0
                 boolean result = mGlossItems.add(item);
 210  0
                 if (result) {
 211  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_ADDED.toString(), null, item);
 212  0
                         mLogger.info("New item added.");
 213  
                 } else {
 214  0
                         String message = mTranslation.getValue("statusbar.warning.empty_key.text");
 215  0
                         mStatusMessagePublisher.publish(EStatusBarMessageLevel.WARNING, message);
 216  0
                         mLogger.info(message);
 217  
                 }
 218  
                 
 219  0
                 return result;
 220  
         }
 221  
         
 222  
         public boolean removeGlossItem(GlossItem item) {
 223  0
                 boolean result = mGlossItems.remove(item.getKey());
 224  0
                 if (result) {
 225  0
                         mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_REMOVED.toString(), null, item);
 226  0
                         String message = mTranslation.getValue("statusbar.info.item_removed", item.getKey()); 
 227  0
                         mStatusMessagePublisher.publish(EStatusBarMessageLevel.INFO, message);
 228  0
                         mLogger.info(message);
 229  
                 }
 230  
                 
 231  0
                 return result;
 232  
         }
 233  
         
 234  
         /** This method removes all item that have the Heading <code>heading</code>. */
 235  
         public void removeGlossItemHeading(String heading) {
 236  0
                 GlossItems oldItems = new GlossItems();
 237  0
                 int count = mGlossItems.getHeadingCount(heading);
 238  0
                 int i = 0;
 239  0
                 while (i < count) {
 240  0
                         GlossItem item = mGlossItems.get(heading, 0);
 241  0
                         oldItems.add(item);
 242  0
                         mGlossItems.remove(item);
 243  0
                         i++;
 244  0
                 }
 245  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.GLOSS_ITEM_HEADING_REMOVED.toString(), oldItems, mGlossItems);
 246  0
         }
 247  
         
 248  
         public void importGlossItems(GlossItems items) {
 249  0
                 GlossItems oldItems = mGlossItems.clone();
 250  0
                 for(int i = 0; i < items.size(); i++) {
 251  0
                         GlossItem item = items.get(i);
 252  0
                         if (item.getOperation() != null) {
 253  0
                                 if (item.getOperation() == EOperation.IMPORT || item.getOperation() == EOperation.OVERRIDE) {
 254  0
                                         if (mGlossItems.existsKey(item.getKey())) {
 255  0
                                                 mGlossItems.remove(item.getKey());
 256  
                                         }
 257  0
                                         mGlossItems.add(item);
 258  0
                                 } else if (item.getOperation() == EOperation.MERGE) {
 259  0
                                         if (mGlossItems.existsKey(item.getKey())) {
 260  0
                                                 GlossItem oldItem = mGlossItems.get(item.getKey());
 261  0
                                                 oldItem.setDefinition(oldItem.getDefinition() + "\r\n" + item.getDefinition());
 262  0
                                         } else {
 263  0
                                                 mGlossItems.add(item);
 264  
                                         }
 265  
                                 }
 266  
                         } else {
 267  0
                                 mGlossItems.add(item);
 268  
                         }
 269  
                 }
 270  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.FILE_IMPORTED.toString(), oldItems, mGlossItems.clone());
 271  0
         }
 272  
         
 273  
         public void closeImportFileDialog() {
 274  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.CLOSE_IMPORT_DIALOG.toString(), 0, 1);
 275  0
         }
 276  
         
 277  
         public void fireUndoOrRedo(String command) {
 278  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.FIRE_UNDO.toString(), null, command);
 279  0
         }
 280  
         
 281  
         public void addUndoListener() {
 282  0
                 mGlossItemsChangePublisher.addPropertyChangeListener(mUndoListener);
 283  0
         }
 284  
         
 285  
         public void removeUndoListener() {
 286  0
                 mGlossItemsChangePublisher.removePropertyChangeListener(mUndoListener);
 287  0
         }
 288  
         
 289  
         public void languageChanged() {
 290  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.LANGUAGE_CHANGED.toString(), 0, 1);
 291  0
         }
 292  
         
 293  
         public void showTableView() {
 294  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.SHOW_TABLE_VIEW.toString(), 0, 1);
 295  0
         }
 296  
         
 297  
         public void showTreeView() {
 298  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.SHOW_TREE_VIEW.toString(), 0, 1);
 299  0
         }
 300  
         
 301  
         public void updateTopPanel(GlossItem item) {
 302  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.UPDATE_TOPPANEL.toString(), null, item);
 303  0
         }
 304  
         
 305  
         public void showSpecialCharacters(boolean value) {
 306  0
                 mGlossItemsChangePublisher.firePropertyChange(EActionCommands.SPECIAL_CHARS.toString(), !value, value);
 307  0
         }
 308  
         
 309  
 }