1 19 package org.lucane.applications.forum.gui; 20 21 import java.awt.BorderLayout ; 22 import java.awt.Dimension ; 23 import java.awt.GridBagConstraints ; 24 import java.awt.GridBagLayout ; 25 import java.awt.GridLayout ; 26 import java.util.ArrayList ; 27 import java.util.Iterator ; 28 29 import javax.swing.BorderFactory ; 30 import javax.swing.JButton ; 31 import javax.swing.JLabel ; 32 import javax.swing.JPanel ; 33 import javax.swing.JScrollPane ; 34 import javax.swing.JSplitPane ; 35 import javax.swing.JTree ; 36 import javax.swing.SwingConstants ; 37 import javax.swing.tree.DefaultMutableTreeNode ; 38 import javax.swing.tree.DefaultTreeModel ; 39 import javax.swing.tree.TreePath ; 40 41 import org.lucane.applications.forum.ForumPlugin; 42 import org.lucane.applications.forum.model.ForumInfo; 43 import org.lucane.applications.forum.model.ForumMessage; 44 import org.lucane.client.util.WidgetState; 45 import org.lucane.client.widgets.HTMLEditor; 46 import org.lucane.client.widgets.ManagedWindow; 47 48 public class MainWindow 49 { 50 private ForumPlugin plugin; 51 52 private JSplitPane splitForumList; 53 private JSplitPane splitMessageView; 54 private ManagedWindow mainWindow; 55 private ForumList forums; 56 private JTree messages; 57 private JLabel author; 58 private JLabel date; 59 private HTMLEditor content; 60 61 private JButton btnRefresh; 62 private JButton btnNewMessage; 63 private JButton btnReply; 64 private JButton btnEdit; 65 private JButton btnToggleVisible; 66 67 public MainWindow(ForumPlugin plugin) 68 { 69 this.plugin = plugin; 70 createMainWindow(plugin); 71 } 72 73 private void createMainWindow(ForumPlugin plugin) 74 { 75 forums = new ForumList(); 76 forums.addListSelectionListener(new ForumSelectionListener(plugin, this)); 77 78 messages = new JTree (); 79 messages.setModel(new DefaultTreeModel (null)); 80 messages.setRootVisible(false); 81 messages.setShowsRootHandles(true); 82 messages.addTreeSelectionListener(new MessageSelectionListener(plugin, this)); 83 84 ButtonActionListener actionListener = new ButtonActionListener(plugin, this); 85 86 btnRefresh = new JButton (tr("btn.refresh"), plugin.getImageIcon("actions/refresh.png")); 87 btnRefresh.setName("mainWindow.btnRefresh"); 88 btnRefresh.setHorizontalAlignment(SwingConstants.LEFT); 89 btnRefresh.addActionListener(actionListener); 90 btnRefresh.setVisible(false); 91 btnNewMessage = new JButton (tr("btn.newMessage"), plugin.getImageIcon("actions/new.png")); 92 btnNewMessage.setName("mainWindow.btnNewMessage"); 93 btnNewMessage.setHorizontalAlignment(SwingConstants.LEFT); 94 btnNewMessage.addActionListener(actionListener); 95 btnNewMessage.setVisible(false); 96 btnReply = new JButton (tr("btn.reply"), plugin.getImageIcon("actions/reply.png")); 97 btnReply.setName("mainWindow.btnReply"); 98 btnReply.setHorizontalAlignment(SwingConstants.LEFT); 99 btnReply.addActionListener(actionListener); 100 btnReply.setVisible(false); 101 btnEdit = new JButton (tr("btn.edit"), plugin.getImageIcon("actions/edit.png")); 102 btnEdit.setName("mainWindow.btnEdit"); 103 btnEdit.setHorizontalAlignment(SwingConstants.LEFT); 104 btnEdit.addActionListener(actionListener); 105 btnEdit.setVisible(false); 106 btnToggleVisible = new JButton (tr("btn.delete"), plugin.getImageIcon("actions/delete.png")); 107 btnToggleVisible.setName("mainWindow.btnToggleVisible"); 108 btnToggleVisible.setHorizontalAlignment(SwingConstants.LEFT); 109 btnToggleVisible.addActionListener(actionListener); 110 btnToggleVisible.setVisible(false); 111 112 JPanel panel = new JPanel (new BorderLayout ()); 113 JPanel buttons = new JPanel (new BorderLayout ()); 114 JPanel container = new JPanel (new GridLayout (5, 1)); 115 container.add(btnRefresh); 116 container.add(btnNewMessage); 117 container.add(btnReply); 118 container.add(btnEdit); 119 container.add(btnToggleVisible); 120 buttons.add(container, BorderLayout.NORTH); 121 panel.add(buttons, BorderLayout.EAST); 122 panel.add(new JScrollPane (messages), BorderLayout.CENTER); 123 124 splitForumList = new JSplitPane (JSplitPane.HORIZONTAL_SPLIT, 125 new JScrollPane (forums), panel); 126 splitForumList.setName("splitForumList"); 127 splitForumList.setDividerLocation(150); 128 WidgetState.restore(plugin.getLocalConfig(), splitForumList); 129 130 131 JPanel messageView = createMessageView(plugin); 132 splitMessageView = new JSplitPane (JSplitPane.VERTICAL_SPLIT, 133 splitForumList, messageView); 134 splitMessageView.setName("splitMessageView"); 135 splitMessageView.setDividerLocation(300); 136 WidgetState.restore(plugin.getLocalConfig(), splitForumList); 137 138 139 mainWindow = new ManagedWindow(plugin, plugin.getTitle()); 140 mainWindow.setName("mainWindow"); 141 mainWindow.getContentPane().setLayout(new BorderLayout ()); 142 mainWindow.getContentPane().add(splitMessageView, BorderLayout.CENTER); 143 mainWindow.setPreferredSize(new Dimension (700, 550)); 144 mainWindow.setExitPluginOnClose(true); 145 } 146 147 private JPanel createMessageView(ForumPlugin plugin) 148 { 149 JPanel view = new JPanel (new GridBagLayout ()); 150 151 author = new JLabel (""); 152 date = new JLabel (""); 153 154 content = new HTMLEditor(); 155 content.setToolbarVisible(false); 156 content.setEditable(false); 157 content.setBorder(BorderFactory.createTitledBorder(tr("lbl.message"))); 158 159 GridBagConstraints c = new GridBagConstraints (); 160 c.fill = GridBagConstraints.BOTH; 161 c.gridx = 0; 162 c.gridy = 0; 163 164 c.weighty = 0.1; 165 c.weightx = 0.9; 166 view.add(author, c); 167 168 c.weightx = 0.1; 169 c.gridx++; 170 view.add(date, c); 171 172 c.gridx = 0; 173 c.gridy = 1; 174 c.gridwidth = 2; 175 c.weighty = 3; 176 view.add(content, c); 177 178 return view; 179 } 180 181 private String tr(String s) 182 { 183 return plugin.tr(s); 184 } 185 186 public void showMessageWindow(ForumPlugin plugin, String forum, ForumMessage message, boolean edit) 187 { 188 MessageWindow mw = new MessageWindow(plugin, this, forum, message, edit); 189 mw.show(); 190 } 191 192 public void refreshButtons(ForumInfo forum) 193 { 194 boolean read = false; 195 boolean write = false; 196 boolean moderate = false; 197 198 if(forum != null) 199 { 200 read = true; 201 write = forum.getAccess().equals(ForumInfo.WRITE); 202 moderate = forum.getAccess().equals(ForumInfo.MODERATE); 203 } 204 205 boolean messageSelected = (messages.getSelectionCount() == 1); 206 btnReply.setEnabled(messageSelected); 207 btnEdit.setEnabled(messageSelected); 208 btnToggleVisible.setEnabled(messageSelected); 209 210 if(messageSelected) 212 { 213 TreePath selection = messages.getSelectionPath(); 214 DefaultMutableTreeNode node = (DefaultMutableTreeNode )selection.getLastPathComponent(); 215 ForumMessage message = (ForumMessage)node.getUserObject(); 216 if(message.isVisible()) 217 { 218 btnToggleVisible.setText(tr("btn.delete")); 219 btnToggleVisible.setIcon(plugin.getImageIcon("actions/delete.png")); 220 } 221 else 222 { 223 btnToggleVisible.setText(tr("btn.undelete")); 224 btnToggleVisible.setIcon(plugin.getImageIcon("actions/undelete.png")); 225 } 226 } 227 228 btnRefresh.setVisible(read); 229 btnNewMessage.setVisible(write || moderate); 230 btnReply.setVisible(write || moderate); 231 btnEdit.setVisible(moderate); 232 btnToggleVisible.setVisible(moderate); 233 } 234 235 public void updateMessages(ArrayList messages) 236 { 237 DefaultMutableTreeNode root = new DefaultMutableTreeNode (); 238 updateMessages(-1, root, messages); 239 this.messages.setModel(new DefaultTreeModel (root)); 240 241 for(int i=0;i<this.messages.getRowCount();i++) 242 { 243 this.messages.expandRow(i); 244 } 245 } 246 247 private void updateMessages(int idMsg, DefaultMutableTreeNode parent, ArrayList messages) 248 { 249 Iterator i = messages.iterator(); 250 while(i.hasNext()) 251 { 252 ForumMessage msg = (ForumMessage)i.next(); 253 254 if(msg.getIdRef() == idMsg) 255 { 256 DefaultMutableTreeNode node = new DefaultMutableTreeNode (msg); 257 parent.add(node); 258 updateMessages(msg.getId(), node, messages); 259 } 260 } 261 } 262 263 public ManagedWindow getMainWindow() 264 { 265 return mainWindow; 266 } 267 268 public ForumList getForumList() 269 { 270 return forums; 271 } 272 273 public JTree getMessages() 274 { 275 return messages; 276 } 277 278 public JLabel getMessageAuthor() 279 { 280 return author; 281 } 282 283 public JLabel getMessageDate() 284 { 285 return date; 286 } 287 288 public HTMLEditor getMessageContent() 289 { 290 return content; 291 } 292 } | Popular Tags |