# # This file is part of Documancer (http://documancer.sf.net) # # Copyright (C) 2003-2005 Vaclav Slavik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # $Id: BooksManagerDialog.py,v 1.17 2005/01/30 19:46:30 vaclavslavik Exp $ # # Dialog for adding and removing documenation books # import sys from wxPython.wx import * import copy import utils, book, providers from book import ATTR_INDEXED ID_BOOKS_LIST = wxNewId() ID_NEW = wxNewId() ID_REMOVE = wxNewId() ID_TITLE = wxNewId() ID_PROVIDER = wxNewId() ID_INDEXED = wxNewId() # begin wxGlade: dependencies # end wxGlade class BooksManagerDialog(wxDialog): def __init__(self, *args, **kwds): self.inUpdateBook = 0 self.selectedBook = None self.books = {} for b in book.books: self.books[b] = book.books[b].getData() self.booksSorted = self.books.keys() self.booksSorted.sort() # begin wxGlade: BooksManagerDialog.__init__ kwds["style"] = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER wxDialog.__init__(self, *args, **kwds) self.splitter = wxSplitterWindow(self, -1) self.rightpane = wxPanel(self.splitter, -1) self.notebook_2 = wxNotebook(self.rightpane, -1, style=0) self.notebook_2_pane_1 = wxPanel(self.notebook_2, -1) self.leftpane = wxPanel(self.splitter, -1) self.books_list = wxListCtrl(self.leftpane, ID_BOOKS_LIST, style=wxLC_REPORT|wxSUNKEN_BORDER) self.newbook = wxButton(self.leftpane, ID_NEW, "&New") self.remove = wxButton(self.leftpane, ID_REMOVE, "&Remove") self.label_2 = wxStaticText(self.rightpane, -1, "&Book title:") self.title = wxTextCtrl(self.rightpane, ID_TITLE, "") self.label_3 = wxStaticText(self.notebook_2_pane_1, -1, "Content &provider:") self.provider = wxChoice(self.notebook_2_pane_1, ID_PROVIDER, choices=[""]) self.config_container = wxPanel(self.notebook_2_pane_1, -1) self.indexed = wxCheckBox(self.notebook_2_pane_1, ID_INDEXED, "Enable fulltext &search for this book") self.static_line_1 = wxStaticLine(self, -1) self.ok = wxButton(self, wxID_OK, "OK") self.cancel = wxButton(self, wxID_CANCEL, "Cancel") self.__set_properties() self.__do_layout() # end wxGlade self.configPanel = None EVT_LIST_ITEM_SELECTED(self, ID_BOOKS_LIST, self.OnBookSelected) EVT_TEXT(self, ID_TITLE, self.OnSettingsChange) EVT_CHOICE(self, ID_PROVIDER, self.OnSettingsChange) EVT_CHECKBOX(self, ID_INDEXED, self.OnSettingsChange) EVT_BUTTON(self, ID_NEW, self.OnNew) EVT_BUTTON(self, ID_REMOVE, self.OnRemove) def __set_properties(self): # begin wxGlade: BooksManagerDialog.__set_properties self.SetTitle("Books Manager") self.SetSize(wxDLG_SZE(self, (381, 272))) self.provider.SetSelection(0) self.indexed.SetValue(1) self.splitter.SplitVertically(self.leftpane, self.rightpane, 265) self.ok.SetDefault() # end wxGlade self.rightpane.Hide() self.provider.Clear() for p in providers.providers.values(): self.provider.Append(p.getName()) self.books_list.InsertColumn(0, "Title") self.books_list.InsertColumn(1, "Type") self.UpdateBooksList() def __do_layout(self): # begin wxGlade: BooksManagerDialog.__do_layout sizer_11 = wxBoxSizer(wxVERTICAL) sizer_12 = wxBoxSizer(wxHORIZONTAL) sizer_7 = wxBoxSizer(wxVERTICAL) sizer_9 = wxBoxSizer(wxVERTICAL) sizer_10 = wxBoxSizer(wxHORIZONTAL) sizer_14 = wxBoxSizer(wxVERTICAL) sizer_13_copy = wxBoxSizer(wxHORIZONTAL) sizer_14.Add(self.books_list, 1, wxALL|wxEXPAND, 5) sizer_13_copy.Add(self.newbook, 0, 0, 0) sizer_13_copy.Add(self.remove, 0, wxLEFT|wxRIGHT, 5) sizer_14.Add(sizer_13_copy, 0, wxLEFT|wxRIGHT|wxBOTTOM|wxALIGN_RIGHT, 5) self.leftpane.SetAutoLayout(1) self.leftpane.SetSizer(sizer_14) sizer_14.Fit(self.leftpane) sizer_14.SetSizeHints(self.leftpane) sizer_7.Add(self.label_2, 0, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 5) sizer_7.Add(self.title, 0, wxALL|wxEXPAND, 5) sizer_10.Add(self.label_3, 0, wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5) sizer_10.Add(self.provider, 1, wxALIGN_CENTER_VERTICAL, 0) sizer_9.Add(sizer_10, 0, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 5) sizer_9.Add(self.config_container, 1, wxALL|wxEXPAND, 5) sizer_9.Add(self.indexed, 0, wxALL|wxEXPAND, 5) self.notebook_2_pane_1.SetAutoLayout(1) self.notebook_2_pane_1.SetSizer(sizer_9) sizer_9.Fit(self.notebook_2_pane_1) sizer_9.SetSizeHints(self.notebook_2_pane_1) self.notebook_2.AddPage(self.notebook_2_pane_1, "Content") sizer_7.Add(wxNotebookSizer(self.notebook_2), 1, wxLEFT|wxRIGHT|wxEXPAND, 5) self.rightpane.SetAutoLayout(1) self.rightpane.SetSizer(sizer_7) sizer_7.Fit(self.rightpane) sizer_7.SetSizeHints(self.rightpane) sizer_11.Add(self.splitter, 1, wxEXPAND, 0) sizer_11.Add(self.static_line_1, 0, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 5) sizer_12.Add(self.ok, 0, 0, 0) sizer_12.Add(self.cancel, 0, wxLEFT, 5) sizer_11.Add(sizer_12, 0, wxALL|wxALIGN_RIGHT, 5) self.SetAutoLayout(1) self.SetSizer(sizer_11) self.Layout() self.Centre() # end wxGlade def SetConfigPanel(self, provider): panel = providers.providers[provider].\ getConfigurationDialog(self.config_container) if self.configPanel != None: self.configPanel.Destroy() self.configPanel = panel psizer = wxBoxSizer(wxHORIZONTAL) psizer.Add(self.configPanel, 0, wxEXPAND) self.config_container.SetAutoLayout(1) self.config_container.SetSizer(psizer) self.configPanel.Show() self.configPanel.SetSize(self.config_container.GetSize()) self.configPanel.SetDialog(self) self.rightpane.Show() def OnBookSelected(self, event): self.selectedBook = event.GetIndex() self.SelectBook(self.books[self.booksSorted[self.selectedBook]]) def OnSettingsChange(self, event): self.UpdateBook() def OnNew(self, event): name = wxGetTextFromUser("Please enter book's name:", "New Book", parent=self) if name != '': bk = book.BookData(name,providers.providers.keys()[0],{}) self.books[name] = bk self.booksSorted.append(name) self.booksSorted.sort() self.selectedBook = self.booksSorted.index(name) self.UpdateBooksList() self.SelectBook(bk) def OnRemove(self, event): name = self.booksSorted[self.selectedBook] if wxMessageBox('Are you sure you want to delete book "%s"?' % name, 'Delete book', wxYES_NO | wxICON_QUESTION) == wxYES: del self.books[name] self.booksSorted.remove(name) if len(self.books) != 0: self.selectedBook = 0 else: self.selectedBook = None self.UpdateBooksList() def UpdateBooksList(self): """Updates list of book displayed on the right side.""" self.books_list.DeleteAllItems() if self.selectedBook == None: current = utils.config().Read('/GuiState/last_book', '') if current != '': if current in self.booksSorted: self.selectedBook = self.booksSorted.index(current) i = 0 for bkey in self.booksSorted: b = self.books[bkey] self.books_list.InsertStringItem(i, b.title) provname = providers.providers[b.provider].getName() self.books_list.SetStringItem(i, 1, provname) i += 1 self.books_list.SetColumnWidth(0, wxLIST_AUTOSIZE) if self.selectedBook != None: self.books_list.SetItemState(self.selectedBook, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED) def SelectBook(self, book): self.inUpdateBook = 1 self.selectedBook = self.booksSorted.index(book.title) self.title.SetValue(book.title) provname = providers.providers[book.provider].getName() self.provider.SetStringSelection(provname) self.indexed.SetValue(ATTR_INDEXED in book.attr and book.attr[ATTR_INDEXED] == '1') self.inUpdateBook = 0 self.SetConfigPanel(book.provider) self.configPanel.SetData(book.attr) def UpdateBook(self): if self.selectedBook == None: return if self.inUpdateBook: return self.inUpdateBook = 1 book = self.books[self.booksSorted[self.selectedBook]] book.title = self.title.GetValue() provname = providers.providers[book.provider].getName() if provname != self.provider.GetStringSelection(): provname = self.provider.GetStringSelection() book.provider = providers.providersNameToId[provname] self.SetConfigPanel(book.provider) self.books_list.SetStringItem(self.selectedBook, 0, book.title) self.books_list.SetStringItem(self.selectedBook, 1, provname) attr = self.configPanel.GetData() for a in attr: book.attr[a] = attr[a] if self.indexed.GetValue(): book.attr[ATTR_INDEXED] = '1' else: book.attr[ATTR_INDEXED] = '0' self.inUpdateBook = 0 def CommitChanges(self, curBook): # add new books and update existing ones: for b in self.books.values(): if b.title not in book.books: book.books[b.title] = book.Book(b) else: book.books[b.title].setData(b) # remove books that are now obsolete: books2 = {} # unlike self.book, this one has correct keys even if # book's name was modified by the user for b in self.books.values(): books2[b.title] = b todel = [] for b in book.books: if b not in books2: todel.append(b) for b in todel: book.deleteBook(b) if curBook != None and curBook.title in book.books: return book.books[curBook.title] else: if len(book.books) > 0: return book.books[self.books.keys()[0]] else: return None # end of class BooksManagerDialog