KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > planetamessenger > mos > ui > JProfileTree


1 /*
2     =========================================================================
3     Package ui - Implements user interface components
4  
5     This module is developed and maintained by PlanetaMessenger.org.
6     Specs, New and updated versions can be found in
7     http://www.planetamessenger.org
8     If you want contact the Team please send a email to Project Manager
9     Leidson Campos Alves Ferreira at leidson@planetamessenger.org
10
11     Copyright (C) since 2001 by PlanetaMessenger.org
12
13     This program is free software; you can redistribute it and/or modify
14     it under the terms of the GNU General Public License as published by
15     the Free Software Foundation; either version 2 of the License, or
16     (at your option) any later version.
17
18     This program is distributed in the hope that it will be useful,
19     but WITHOUT ANY WARRANTY; without even the implied warranty of
20     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21     GNU General Public License for more details.
22
23     You should have received a copy of the GNU General Public License
24     along with this program; if not, write to the Free Software
25     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26  
27     =========================================================================
28  */

29 /**
30  *
31  * $Id: JProfileTree.java,v 1.31 2007/02/23 21:54:24 popolony2k Exp $
32  * $Author: popolony2k $
33  * $Name: $
34  * $Revision: 1.31 $
35  * $State: Exp $
36  *
37  */

38
39 package org.planetamessenger.mos.ui;
40
41 import org.planetamessenger.mos.engine.*;
42 import org.planetamessenger.plugin.*;
43 import javax.swing.tree.*;
44 import java.util.*;
45
46
47
48 public class JProfileTree extends javax.swing.JTree JavaDoc implements javax.swing.event.TreeModelListener JavaDoc {
49   
50   javax.swing.tree.DefaultTreeCellEditor JavaDoc cellEditor = null;
51   javax.swing.tree.DefaultTreeModel JavaDoc treeModel = null;
52   JProfileMutableTreeNode rootNode = null;
53   
54
55    /**
56     * Constructor. Creates and initializes
57     * a JTree component.
58     * @param strRootLabel The Root label of this Tree
59     * component;
60     */

61   public JProfileTree( java.lang.String JavaDoc strRootLabel ) {
62     
63     super();
64     
65     JProfileTreeItem item;
66     DefaultTreeCellRenderer treeRenderer;
67     
68     
69     putClientProperty( "JTree.lineStyle", "Angled" );
70
71     item = new JProfileTreeItem( strRootLabel, -1, -1, null, JProfileTreeItem.TYPE_NONE );
72     rootNode = new JProfileMutableTreeNode( item );
73     treeModel = new javax.swing.tree.DefaultTreeModel JavaDoc( rootNode );
74     treeRenderer = new JProfileTreeRenderer();
75
76     treeModel.addTreeModelListener( this );
77     setModel( treeModel );
78     setEditable( true );
79     setCellRenderer( treeRenderer );
80     getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
81     //setShowsRootHandles( true );
82
//setRootVisible( true );
83
//getCellRenderer().setLeafIcon( null );
84
treeRenderer.setOpenIcon( null );
85     treeRenderer.setClosedIcon( null );
86
87     initCellEditor();
88     initProfileTree();
89   }
90
91   /**
92    * Init the cell editor options.
93    */

94   private void initCellEditor() {
95
96     cellEditor = new javax.swing.tree.DefaultTreeCellEditor JavaDoc( this, ( javax.swing.tree.DefaultTreeCellRenderer JavaDoc ) getCellRenderer(), ( javax.swing.DefaultCellEditor JavaDoc ) new JProfileTreeCellEditor() );
97     setCellEditor( cellEditor );
98   }
99
100   /**
101    * Init the profile tree control
102    * of this dialog.
103    */

104   private void initProfileTree() {
105     
106     JLookAndFeelInfo plafInfo;
107     JProfileMutableTreeNode node;
108     org.planetamessenger.db.JResultSet resultSet = JSharedObjects.getProfileManager().getAllProfiles();
109     String JavaDoc strProfileDesc;
110     String JavaDoc strClassName;
111     String JavaDoc strFileName;
112     java.sql.ResultSet JavaDoc rs;
113     int nProfileId;
114     int nPluginId;
115     
116     
117     if( resultSet != null ) {
118       try {
119         while( resultSet.getResultSet().next() ) {
120           nProfileId = resultSet.getResultSet().getInt( "profile_id" );
121           strProfileDesc = resultSet.getResultSet().getString( "profile_desc" );
122           strClassName = resultSet.getResultSet().getString( "class_name" );
123           strFileName = resultSet.getResultSet().getString( "file_name" );
124           node = addTreeItem( rootNode, nProfileId, -1, strProfileDesc, null, JProfileTreeItem.TYPE_PROFILE, false );
125           rs = JSharedObjects.getProfileManager().getAllPlugins().getResultSet();
126           plafInfo = JSharedObjects.getLookAndFeelManager().getLookAndFeel( strFileName, strClassName );
127
128           if( plafInfo == null )
129             plafInfo = JSharedObjects.getLookAndFeelManager().getLookAndFeel( "", javax.swing.UIManager.getSystemLookAndFeelClassName() );
130             
131           // Add the Look and feel item
132
addTreeItem( node, nProfileId, -1, "", plafInfo, JProfileTreeItem.TYPE_LOOKNFEEL, false );
133
134           /*
135            * We'll search for all installed plugins
136            * for this profile and put it on the Tree
137            * list.
138            */

139           try {
140             while( rs.next() ) {
141               nPluginId = rs.getInt( "plugin_id" );
142               
143               if( JSharedObjects.getProfileManager().checkPluginInstall( nPluginId, nProfileId ) ) {
144                 JPluginProperties properties = JSharedObjects.getPluginEngine().getPluginPropertiesByClassName( rs.getString( "class_name" ) );
145                 JProtocolTreeItem protocolItem = new JProtocolTreeItem( properties.getName(), rs.getString( "class_name" ), nPluginId );
146                 
147                 addTreeItem( node, nProfileId, nPluginId, properties.getName(), null, JProfileTreeItem.TYPE_PLUGIN, false );
148               }
149             }
150           } catch( java.sql.SQLException JavaDoc e ) {
151             System.out.println( "JProfileTree.initProfileTree() - SQLException " + e );
152           }
153         }
154         
155         resultSet.close();
156         
157       } catch( java.sql.SQLException JavaDoc e ) {
158         System.err.println( "JProfileTree.initProfileTree() - SQLException " + e );
159       }
160     }
161     
162     expandRow( 0 );
163   }
164
165   /**
166    * Add a Tree item into screen control.
167    * @param parentNode The parent's item node;
168    * @param nProfileId The item's ProfileId;
169    * @param nPluginId The item's pluginid;
170    * @param strItem The item that will be added.
171    * (for Look and feel type, this parameter is
172    * ignored and can be empty a string or null
173    * value);
174    * @param plafInfo The Look and feel Info.
175    * (for non-Look and feel type this parameter
176    * is ignored and can be null);
177    * @param nItemType The item's type;
178    * @param bEdit Begin editing mode flag;
179    */

180   private JProfileMutableTreeNode addTreeItem( JProfileMutableTreeNode parentNode, int nProfileId, int nPluginId, String JavaDoc strItem, JLookAndFeelInfo plafInfo, int nItemType, boolean bEdit ) {
181
182     JProfileTreeItem item = new JProfileTreeItem( ( nItemType != JProfileTreeItem.TYPE_LOOKNFEEL ? strItem : plafInfo.getName() ), nProfileId, nPluginId, plafInfo, nItemType );
183     JProfileMutableTreeNode node = new JProfileMutableTreeNode( item );
184
185     parentNode.add( node );
186     treeModel.reload();
187
188     if( bEdit )
189       startEditingAtPath( this.getPathForRow( 0 ).pathByAddingChild( node ) );
190
191     return node;
192   }
193
194   /**
195    * Check if the profile already exists
196    * in system database.
197    * @param strProfileName The profile that will
198    * be checked;
199    */

200   static public boolean checkProfile( java.lang.String JavaDoc strProfileName ) {
201
202     boolean bProfileCheck = JSharedObjects.getProfileManager().checkProfile( strProfileName );
203
204     if( bProfileCheck ) {
205       javax.swing.JOptionPane.showMessageDialog( null, JSharedObjects.getLanguageManager().getStringEx( "PROFILE_ALREADY_EXIST_WARNING" ), JSharedObjects.getLanguageManager().getStringEx( "ERROR" ), javax.swing.JOptionPane.ERROR_MESSAGE );
206       return true;
207     }
208     
209     return false;
210   }
211
212    /**
213     * Add a new profile into this profile.
214     * @param strProfileName The new profile.
215     */

216   public void addProfile( java.lang.String JavaDoc strProfileName ) {
217     
218     int nProfileId;
219     JProfileMutableTreeNode profileNode;
220     JLookAndFeelInfo plafInfo = JSharedObjects.getLookAndFeelManager().getLookAndFeel( "", javax.swing.UIManager.getSystemLookAndFeelClassName() );
221
222     if( checkProfile( strProfileName ) )
223       return;
224     else
225       nProfileId = JSharedObjects.getProfileManager().profileAdd( strProfileName );
226     
227     profileNode = addTreeItem( rootNode, nProfileId, -1, strProfileName, null, JProfileTreeItem.TYPE_PROFILE, false );
228     
229     // Add the look and feel combobox item
230
addTreeItem( profileNode, nProfileId, -1, "", plafInfo, JProfileTreeItem.TYPE_LOOKNFEEL, false );
231     expandRow( 0 );
232     
233     // Start editing
234
startEditingAtPath( this.getPathForRow( 0 ).pathByAddingChild( profileNode ) );
235   }
236
237   /**
238    * Checks if the selected item is
239    * a profile item.
240    */

241   public JProfileTreeItem getSelectedItem() {
242     
243     javax.swing.tree.TreePath JavaDoc path = getSelectionPath();
244     
245     
246     if( path != null ) {
247       try {
248         int nPathCount = path.getPathCount();
249
250         if( nPathCount > 0 ) {
251           JProfileMutableTreeNode node = ( JProfileMutableTreeNode ) path.getPathComponent( nPathCount - 1 );
252           JProfileTreeItem item = ( JProfileTreeItem ) node.getUserObject();
253           
254           if( ( item.getItemType() == JProfileTreeItem.TYPE_PROFILE ) ||
255               ( item.getItemType() == JProfileTreeItem.TYPE_PLUGIN ) ||
256               ( item.getItemType() == JProfileTreeItem.TYPE_LOOKNFEEL ) )
257             return item;
258         }
259         
260         return null;
261         
262       } catch( java.lang.IllegalArgumentException JavaDoc e ) {
263         System.err.println( "JProfileTree.getSelectedItem() - Invalid item" );
264         return null;
265       }
266     }
267     
268     return null;
269   }
270
271   /**
272    * Remove the current selected item.
273    */

274   public void removeSelectedItem() {
275     
276     javax.swing.tree.TreePath JavaDoc path = getSelectionPath();
277     
278     
279     if( path != null ) {
280       int nPathCount = path.getPathCount();
281       
282       if( nPathCount > 0 ) {
283         try {
284           JProfileMutableTreeNode node = ( JProfileMutableTreeNode ) path.getPathComponent( nPathCount - 1 );
285           JProfileTreeItem item = ( JProfileTreeItem ) node.getUserObject();
286
287
288           switch( item.getItemType() ) {
289
290             case JProfileTreeItem.TYPE_PROFILE : {
291               if( item.getProfileId() == JSharedObjects.getProfileManager().getProfileId() ) {
292                 javax.swing.JOptionPane.showMessageDialog( this, JSharedObjects.getLanguageManager().getStringEx( "CANNOT_REMOVE_ACTIVE_PROFILE_WARNING" ), JSharedObjects.getLanguageManager().getStringEx( "ERROR" ), javax.swing.JOptionPane.ERROR_MESSAGE );
293                 return;
294               }
295               else
296                 JSharedObjects.getProfileManager().profileDel( item.getProfileId() );
297               
298             } break;
299             
300           }
301           
302           if( item.getItemType() != JProfileTreeItem.TYPE_NONE )
303             treeModel.removeNodeFromParent( node );
304           
305         } catch( java.lang.IllegalArgumentException JavaDoc e ) {
306           System.err.println( "JProfileTree.removeSelectedItem() - Can't remove the root item" );
307         }
308       }
309     }
310   }
311
312   /**
313    * Make the selected item as default
314    * profile.
315    */

316   public void setDefaultProfile() {
317     
318     javax.swing.tree.TreePath JavaDoc path = getSelectionPath();
319     
320     
321     if( path != null ) {
322       try {
323         JProfileMutableTreeNode node = ( JProfileMutableTreeNode ) path.getPathComponent( 1 );
324         JProfileTreeItem item = ( JProfileTreeItem ) node.getUserObject();
325         
326         
327         if( item.getItemType() == JProfileTreeItem.TYPE_PROFILE )
328           JSharedObjects.getProfileManager().updateDefaultProfile( item.getProfileId() );
329         
330       } catch( java.lang.IllegalArgumentException JavaDoc e ) {
331         System.err.println( "JprofileTree.removeSelectedItem() - Can't remove the root item" );
332       }
333     }
334   }
335
336   /**
337    * Add a new plugin node to this Tree
338    * component.
339    * @param plugin Plugin that will be
340    * assigned to this node;
341    * @param bPluginOptions If true show the
342    * Add/Invite user plugin options only,
343    * else show Register new user plugin
344    * only.
345    */

346   public boolean addPlugin( JProtocolTreeItem plugin ) {
347     
348     javax.swing.tree.TreePath JavaDoc path = getSelectionPath();
349     
350     
351     if( path != null ) {
352       JProfileMutableTreeNode profileNode = ( JProfileMutableTreeNode ) path.getPathComponent( 1 );
353       JProfileTreeItem profileItem = ( JProfileTreeItem ) profileNode.getUserObject();
354       boolean bPluginCheck = JSharedObjects.getProfileManager().checkPluginInstall( profileItem.getProfileId(), plugin.getPluginId() );
355       
356       
357       if( !bPluginCheck )
358         addTreeItem( profileNode, profileItem.getProfileId(), plugin.getPluginId(), plugin.toString(), null, JProfileTreeItem.TYPE_PLUGIN, false );
359       
360       expandPath( path );
361       
362       return true;
363     }
364     
365     return false;
366   }
367
368    /**
369     * Implements the TreeModelListener
370     * interface events.
371     * @param treeModelEvent see JDK docs;
372     */

373   public void treeNodesChanged( javax.swing.event.TreeModelEvent JavaDoc treeModelEvent ) {
374     
375     JProfileMutableTreeNode node = ( JProfileMutableTreeNode ) getSelectionPath().getPathComponent( 1 );
376     JProfileTreeItem item = ( JProfileTreeItem ) node.getUserObject();
377     
378     if( item.getItemType() == JProfileTreeItem.TYPE_PROFILE )
379       JSharedObjects.getProfileManager().profileUpdate( item.getProfileId(), item.getText() );
380   }
381
382   /**
383    * Implements the TreeModelListener
384    * interface events.
385    * @param treeModelEvent see JDK docs;
386    */

387   public void treeNodesInserted( javax.swing.event.TreeModelEvent JavaDoc treeModelEvent ) {
388     
389   }
390
391   /**
392    * Implements the TreeModelListener
393    * interface events.
394    * @param treeModelEvent see JDK docs;
395    */

396   public void treeNodesRemoved( javax.swing.event.TreeModelEvent JavaDoc treeModelEvent ) {
397
398   }
399
400   /**
401    * Implements the TreeModelListener
402    * interface events.
403    * @param treeModelEvent see JDK docs;
404    */

405   public void treeStructureChanged( javax.swing.event.TreeModelEvent JavaDoc treeModelEvent ) {
406
407   }
408   
409   /**
410    * Override the JTree isPathEditable method to
411    * check if a tree item is editable.
412    * @param See jdk docs;
413    */

414   public boolean isPathEditable( javax.swing.tree.TreePath JavaDoc path ) {
415    
416     int nPathCount = path.getPathCount();
417       
418     JProfileMutableTreeNode node = ( JProfileMutableTreeNode ) path.getPathComponent( nPathCount - 1 );
419     JProfileTreeItem item = ( JProfileTreeItem ) node.getUserObject();
420           
421     if( ( item.getItemType() == JProfileTreeItem.TYPE_LOOKNFEEL ) ||
422         ( item.getItemType() == JProfileTreeItem.TYPE_PROFILE ) )
423       return true;
424     else
425       return false;
426   }
427   
428   
429   /**
430    * Implements a Cell editor class to perform specific
431    * editor operations.
432    */

433   
434   private class JProfileTreeCellEditor extends javax.swing.DefaultCellEditor JavaDoc {
435     
436     javax.swing.JComboBox JavaDoc lookAndFeelCombo = null;
437     
438     
439     /**
440      * Constructor. Initializes all class
441      * data.
442      */

443     JProfileTreeCellEditor() {
444       
445       super( new javax.swing.JTextField JavaDoc() );
446
447       ArrayList<JLookAndFeelInfo> plafList = JSharedObjects.getLookAndFeelManager().getLookAndFeelList();
448       
449       lookAndFeelCombo = new javax.swing.JComboBox JavaDoc();
450       lookAndFeelCombo.setModel( new javax.swing.DefaultComboBoxModel JavaDoc() );
451       lookAndFeelCombo.setBorder( javax.swing.border.LineBorder.createBlackLineBorder() );
452
453       for( int nCount = 0; nCount < plafList.size(); nCount++ )
454         lookAndFeelCombo.addItem( plafList.get( nCount ) );
455
456       // Add the combo event listener
457
lookAndFeelCombo.addItemListener( new java.awt.event.ItemListener JavaDoc() {
458                                           public void itemStateChanged( java.awt.event.ItemEvent JavaDoc evt ) {
459                                             lookAndFeelChanged( evt );
460                                           }
461                                         } );
462       
463       // Only one click to start editing
464
setClickCountToStart( 1 );
465     }
466     
467     /**
468      * Event handler for Look and feel combobox
469      * item.
470      * Change the current Look for the new combo selection;
471      * @param evt The event object generated;
472      */

473     private void lookAndFeelChanged( java.awt.event.ItemEvent JavaDoc evt ) {
474
475       if( evt.getStateChange() != java.awt.event.ItemEvent.DESELECTED ) {
476
477         if( evt.getItem() instanceof JLookAndFeelInfo ) {
478           JLookAndFeelInfo plafInfo = ( JLookAndFeelInfo ) evt.getItem();
479           JProfileTreeItem item = getSelectedItem();
480           boolean bOperationOk;
481
482           if( item == null )
483             return;
484           
485           // Stop editing
486
if( isEditing() )
487             stopEditing();
488
489           // Only change L&F when is the current profile
490
if( item.getProfileId() == JSharedObjects.getProfileManager().getProfileId() )
491             bOperationOk = JSharedObjects.getLookAndFeelManager().loadLookAndFeel( plafInfo );
492           else
493             bOperationOk = JSharedObjects.getLookAndFeelManager().isSupportedLookAndFeel( plafInfo );
494
495           if( !bOperationOk )
496             javax.swing.JOptionPane.showMessageDialog( null, JSharedObjects.getLookAndFeelManager().getLastError(), JSharedObjects.getLanguageManager().getStringEx( "WARNING" ), javax.swing.JOptionPane.WARNING_MESSAGE );
497           else {
498             JSharedObjects.getLookAndFeelManager().updateProfile( item.getProfileId(), plafInfo );
499             item.setLookAndFeelInfo( plafInfo );
500           }
501         }
502       }
503     }
504
505     /**
506      * Overrides the Cell editor method
507      * for this JTreeCellEditor.
508      * See JDK API for the parameters.
509      */

510     public java.awt.Component JavaDoc getTreeCellEditorComponent( javax.swing.JTree JavaDoc tree, java.lang.Object JavaDoc value, boolean isSelected, boolean isExpanded, boolean leaf, int row ) {
511       
512       javax.swing.tree.TreePath JavaDoc path = getSelectionPath();
513       javax.swing.tree.DefaultTreeCellEditor JavaDoc editor = ( javax.swing.tree.DefaultTreeCellEditor JavaDoc ) tree.getCellEditor();
514       JProfileMutableTreeNode node = ( JProfileMutableTreeNode ) ( path == null ? value : path.getLastPathComponent() );
515       JProfileTreeItem item = ( JProfileTreeItem ) node.getUserObject();
516
517       if( item.getItemType() == JProfileTreeItem.TYPE_LOOKNFEEL ) {
518
519         JLookAndFeelInfo plafInfo;
520         JLookAndFeelInfo selectedPlafInfo = item.getLookAndFeelInfo();
521         javax.swing.DefaultComboBoxModel JavaDoc model = ( javax.swing.DefaultComboBoxModel JavaDoc ) lookAndFeelCombo.getModel();
522                                                      
523         for( int nCount = 0; nCount < model.getSize(); nCount++ ) {
524           plafInfo = ( JLookAndFeelInfo ) model.getElementAt( nCount );
525                                                        
526           if( plafInfo.equals( selectedPlafInfo ) ) {
527             model.setSelectedItem( plafInfo );
528             break;
529           }
530         }
531
532         return lookAndFeelCombo;
533       }
534
535       return super.getTreeCellEditorComponent( tree, value, isSelected, isExpanded, leaf, row );
536     }
537   } // JProfileTreeCellEditor class
538

539   
540   /**
541    * Implements a specific TreeCellRendere to perform
542    * a correct icon appearance for each node type.
543    */

544   private class JProfileTreeRenderer extends DefaultTreeCellRenderer {
545    
546     /**
547      * Constructor. Initializes all class data.
548      */

549     JProfileTreeRenderer() {
550     
551       super();
552     }
553     
554     /**
555      * Override the default Cell renderer.
556      * Set the right icon depending of node type.
557      * @param See JDK docs;
558      */

559     public java.awt.Component JavaDoc getTreeCellRendererComponent( javax.swing.JTree JavaDoc tree, Object JavaDoc value, boolean bSelected, boolean bExpanded, boolean bIsLeaf, int nRow, boolean bHasFocus ) {
560
561       JProfileMutableTreeNode node = ( JProfileMutableTreeNode ) value;
562       JProfileTreeItem item = ( JProfileTreeItem ) node.getUserObject();
563       java.awt.Component JavaDoc comp = super.getTreeCellRendererComponent( tree, value, bSelected, bExpanded, bIsLeaf, nRow, bHasFocus );
564
565
566       if( item == null )
567         return comp;
568       
569       switch( item.getItemType() ) {
570
571         case JProfileTreeItem.TYPE_PLUGIN : {
572                                                  if( bIsLeaf ) {
573                                                    setIcon( JSharedObjects.getResources().getIcon( JResources.PLUGIN_ICON ) );
574                                                    setLeafIcon( JSharedObjects.getResources().getIcon( JResources.LOOKNFEEL_ICON ) );
575                                                    return this;
576                                                  }
577                                                } break;
578
579         case JProfileTreeItem.TYPE_LOOKNFEEL : {
580                                                  if( bIsLeaf ) {
581                                                    setIcon( JSharedObjects.getResources().getIcon( JResources.LOOKNFEEL_ICON ) );
582                                                    return this;
583                                                  }
584                                                } break;
585       }
586
587       return comp;
588     }
589   }
590 }
591
592 // JProfileTree Class
Popular Tags