1. 程式人生 > >openfire-Spark二次開發——修改設定視窗

openfire-Spark二次開發——修改設定視窗

spark開發了幾周了,該總結一下了。
今天說說修改設定介面的視窗。
這裡寫圖片描述

這是spark的設定介面。
裡面有很多項設定,但是也有許多內容暫時不需要的比如ROAR,顯示樣式中的主題,因為我已經辛辛苦苦的套上了新主題,如果再變換主題就沒意思了。暫時先閹了。
這個視窗的具體實現類

org.jivesoftware.sparkimpl.preference.PreferenceDialog//設定視窗的類

上面的類中有如下屬性

    private JDialog preferenceDialog;
    private JOptionPane pane = null;
    private
PreferencesPanel prefPanel;//這是左邊那些面板列表的定義

進入PreferencePanel中後發現建構函式宣告如下

 public PreferencesPanel(Iterator<Preference> preferences) {
        this.setLayout(new GridBagLayout());

        titleLabel.setText(Res.getString("title.preferences"));
        titleLabel.setFont(new Font("Dialog", Font.BOLD, 15
)); scrollPane = new JScrollPane(list); scrollPane.setPreferredSize(new Dimension(125, 0)); scrollPane.setMinimumSize(new Dimension(125,100)); list.setFixedCellHeight(50); add(scrollPane, new GridBagConstraints(0, 0, 1, 1, 0.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new
Insets(5, 5, 5, 5), 50, 0)); add(flowPanel, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); list.setCellRenderer(new JLabelIconRenderer()); list.addListSelectionListener(this); // Populate with current preferences while (preferences.hasNext()) { Preference preference = preferences.next(); listModel.addElement(new PreferenceUI(preference)); } list.setSelectedIndex(0); }

不難發現Iterator<Preference>就是左邊的各種元件。選中Preference按下ctrl+T檢視他的實現樹。
這裡寫圖片描述
這個基本是我們想看到的。先幹掉一個Privacy Plugin壓壓驚。

但是問題來了。如果是修改外掛裡面的內容則在上圖中的類中找到相應外掛修改。如果直接不載入這個外掛。那麼肯定要在啟動的時候去除載入這個外掛。

主面板點選設定後會彈出總的設定對話方塊。
首先主面板類

/spark/src/java/org/jivesoftware/MainWindow.java

//其中的build方法
private void buildMenu() {

        // setup file menu
        final JMenuItem exitMenuItem = new JMenuItem();

        // Setup ResourceUtils
        ResourceUtils.resButton(connectMenu, "&" + Default.getString(Default.APPLICATION_NAME));
        ResourceUtils.resButton(contactsMenu, Res.getString("menuitem.contacts"));
        ResourceUtils.resButton(actionsMenu, Res.getString("menuitem.actions"));
        ResourceUtils.resButton(exitMenuItem, Res.getString("menuitem.exit"));
        ResourceUtils.resButton(pluginsMenu, Res.getString("menuitem.plugins"));

        exitMenuItem.setIcon(null);

        mainWindowBar.add(connectMenu);
        mainWindowBar.add(contactsMenu);
        mainWindowBar.add(actionsMenu);
        //mainWindowBar.add(pluginsMenu);
        mainWindowBar.add(helpMenu);


        preferenceMenuItem = new JMenuItem(SparkRes.getImageIcon(SparkRes.PREFERENCES_IMAGE));
        preferenceMenuItem.setText(Res.getString("title.spark.preferences"));
        preferenceMenuItem.addActionListener(this);  //新增的點選響應事件
        connectMenu.add(preferenceMenuItem);//這就是設定按鈕,


        alwaysOnTopItem = new JCheckBoxMenuItem();//面板總在最前面按鈕
        ResourceUtils.resButton(alwaysOnTopItem, Res.getString("menuitem.always.on.top"));
        alwaysOnTopItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent actionEvent) {
                    if (alwaysOnTopItem.isSelected())
                    {
                        SettingsManager.getLocalPreferences().setMainWindowAlwaysOnTop(true);
                        MainWindow.getInstance().setAlwaysOnTop(true);
                    }
                    else
                    {
                        SettingsManager.getLocalPreferences().setMainWindowAlwaysOnTop(false);
                        MainWindow.getInstance().setAlwaysOnTop(false);
                    }
                }
        });

        if (SettingsManager.getLocalPreferences().isMainWindowAlwaysOnTop())
        {
            alwaysOnTopItem.setSelected(true);
            this.setAlwaysOnTop(true);
        }
        connectMenu.add(alwaysOnTopItem);

        if(!Default.getBoolean("DISABLE_EXIT"))
            connectMenu.addSeparator();

        //EventQueue.invokeLater(new Runnable() {
       //   public void run() {

        JMenuItem logoutMenuItem = new JMenuItem();   //登出按鈕
        ResourceUtils.resButton(logoutMenuItem, Res.getString("menuitem.logout.no.status"));
        logoutMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                logout(false);
           }
        });

        JMenuItem logoutWithStatus = new JMenuItem();  //登出記錄理由按鈕
        ResourceUtils.resButton(logoutWithStatus, Res.getString("menuitem.logout.with.status"));
        logoutWithStatus.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                logout(true);
            }
        });

        if ((Spark.isWindows() || Spark.isLinux()) || Spark.isMac() && !Default.getBoolean("DISABLE_EXIT")) {
            connectMenu.add(logoutMenuItem);
            connectMenu.add(logoutWithStatus);
        connectMenu.addSeparator();
    }

        if (!Default.getBoolean("DISABLE_EXIT")) {
            connectMenu.add(exitMenuItem);
        }

        JMenuItem updateMenu= new JMenuItem("", SparkRes.getImageIcon(SparkRes.DOWNLOAD_16x16));    
        ResourceUtils.resButton(updateMenu, Res.getString("menuitem.check.for.updates"));
        updateMenu.addActionListener(new ActionListener() {    
        @Override
        public void actionPerformed(ActionEvent e) {
        checkForUpdates(true);

        }
    });         

在PreferencesPanel的構造中載入了一個設定集合。只要找到這個集合,去掉相應的內容即可。根據spark的命名規則,感覺我們應該找類似PreferenceManager之類的東西、
就在

public PreferencesPanel(Iterator<Preference> preferences)
//點選Preference,發現與他同級的目錄下就有個PreferenceManager。果然如此。
//在PreferenceManager的構造方法中發現如下
  PrivacyPreferences privacy = new PrivacyPreferences();
  addPreference(privacy);  //把這個直接註釋了。
  privacy.load();

執行spark。
這裡寫圖片描述
已經沒有了Privacy Plugin