123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- /*
- * Copyright (c) 2006-2010 Chris Smith, Shane Mc Cormack, Gregory Holmes
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
- package com.dmdirc.addons.ui_swing.dialogs.channelsetting;
-
- import com.dmdirc.Channel;
- import com.dmdirc.config.Identity;
- import com.dmdirc.config.IdentityManager;
- import com.dmdirc.addons.ui_swing.UIUtilities;
- import com.dmdirc.addons.ui_swing.dialogs.StandardDialog;
- import com.dmdirc.addons.ui_swing.components.expandingsettings.SettingsPanel;
- import com.dmdirc.addons.ui_swing.components.expandingsettings.SettingsPanel.OptionType;
-
- import java.awt.Window;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
-
- import javax.swing.JButton;
- import javax.swing.JScrollPane;
- import javax.swing.JTabbedPane;
- import javax.swing.WindowConstants;
-
- import net.miginfocom.swing.MigLayout;
-
- /**
- * Allows the user to modify channel settings (modes, topics, etc).
- */
- public final class ChannelSettingsDialog extends StandardDialog implements
- ActionListener {
-
- /**
- * A version number for this class. It should be changed whenever the class
- * structure is changed (or anything else that would prevent serialized
- * objects being unserialized with the new class).
- */
- private static final long serialVersionUID = 8;
- /** Channel settings dialogs, semi singleton use. */
- private static volatile ChannelSettingsDialog me;
- /** The channel object that this dialog belongs to. */
- private final Channel channel;
- /** Tabbed pane. */
- private JTabbedPane tabbedPane;
- /** Client settings panel. */
- private SettingsPanel channelSettingsPane;
- /** List modes panel. */
- private ChannelModesPane channelModesPane;
- /** List modes panel. */
- private TopicPane topicModesPane;
- /** List modes panel. */
- private ChannelListModesPane channelListModesPane;
- /** Channel identity file. */
- private final Identity identity;
-
- /**
- * Creates a new instance of ChannelSettingsDialog.
- *
- * @param newChannel The channel object that we're editing settings for
- */
- private ChannelSettingsDialog(final Channel newChannel,
- final Window parentWindow) {
- super(parentWindow, ModalityType.MODELESS);
-
- channel = newChannel;
- identity = IdentityManager.getChannelConfig(channel.getServer().
- getNetwork(), channel.getChannelInfo().getName());
-
- initComponents();
- initListeners();
- }
-
- /**
- * Creates the dialog if one doesn't exist, and displays it.
- *
- * @param channel The channel object that we're editing settings for
- * @param parentWindow Parent window
- */
- public static void showChannelSettingsDialog(
- final Channel channel, final Window parentWindow) {
- me = getChannelSettingsDialog(channel, parentWindow);
-
- me.display();
- me.requestFocusInWindow();
- }
-
- /**
- * Returns the current instance of the ChannelSettingsDialog.
- *
- * @param channel The channel object that we're editing settings for
- * @param parentWindow Parent window
- *
- * @return The current ChannelSettingsDialog instance
- */
- public static ChannelSettingsDialog getChannelSettingsDialog(
- final Channel channel, final Window parentWindow) {
- synchronized (ChannelSettingsDialog.class) {
- if (me == null) {
- me = new ChannelSettingsDialog(channel, parentWindow);
- }
- }
-
- return me;
- }
-
- /** Initialises the main UI components. */
- private void initComponents() {
- tabbedPane = new JTabbedPane();
-
- setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- setTitle("Channel settings for " + channel);
- setResizable(false);
-
- orderButtons(new JButton(), new JButton());
-
- getContentPane().setLayout(new MigLayout(
- "fill, wrap 1, ins panel, hmax 80sp"));
- getContentPane().add(tabbedPane, "growy, pushy, wmin 460, wmax 460");
- getContentPane().add(getLeftButton(), "split 3, right");
- getContentPane().add(getRightButton(), "right");
-
- initTopicTab();
-
- initIrcTab();
-
- initListModesTab();
-
- initSettingsTab();
-
- tabbedPane.setSelectedIndex(channel.getConfigManager().
- getOptionInt("dialogstate", "channelsettingsdialog"));
- }
-
- /** Initialises the Topic tab. */
- private void initTopicTab() {
- topicModesPane = new TopicPane(channel, this);
- tabbedPane.addTab("Topic", topicModesPane);
- }
-
- /** Initialises the IRC Settings tab. */
- private void initIrcTab() {
- channelModesPane = new ChannelModesPane(channel);
-
- final JScrollPane channelModesSP = new JScrollPane(channelModesPane);
- channelModesSP.setHorizontalScrollBarPolicy(
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- channelModesSP.setOpaque(UIUtilities.getTabbedPaneOpaque());
- channelModesSP.getViewport().setOpaque(UIUtilities.getTabbedPaneOpaque());
- channelModesSP.setBorder(null);
-
- tabbedPane.addTab("Channel Modes", channelModesSP);
- }
-
- /** Initialises the IRC Settings tab. */
- private void initListModesTab() {
- channelListModesPane = new ChannelListModesPane(channel);
- tabbedPane.addTab("List Modes", channelListModesPane);
- }
-
- /** Initialises the channel Settings (identities) tab. */
- private void initSettingsTab() {
- initSettingsPanel();
-
- tabbedPane.addTab("Client Settings", channelSettingsPane);
- }
-
- /** Initialises the channel settings. */
- private void initSettingsPanel() {
- channelSettingsPane = new SettingsPanel(identity,
- "These settings are specific to this channel on this network,"
- + " any settings specified here will overwrite global settings");
-
- channelSettingsPane.addOption("channel.splitusermodes",
- "Split user modes", OptionType.CHECKBOX);
- channelSettingsPane.addOption("channel.sendwho",
- "Send channel WHOs", OptionType.CHECKBOX);
- channelSettingsPane.addOption("channel.showmodeprefix",
- "Show mode prefixes", OptionType.CHECKBOX);
- channelSettingsPane.addOption("ui.shownickcoloursinnicklist",
- "Show colours in nicklist", OptionType.CHECKBOX);
- channelSettingsPane.addOption("ui.shownickcoloursintext",
- "Show colours in textpane", OptionType.CHECKBOX);
- channelSettingsPane.addOption("general.cyclemessage",
- "Cycle message", OptionType.TEXTFIELD);
- channelSettingsPane.addOption("general.kickmessage",
- "Kick message", OptionType.TEXTFIELD);
- channelSettingsPane.addOption("general.partmessage",
- "Part message", OptionType.TEXTFIELD);
- channelSettingsPane.addOption("ui.backgroundcolour",
- "Background colour", OptionType.COLOUR);
- channelSettingsPane.addOption("ui.foregroundcolour",
- "Foreground colour", OptionType.COLOUR);
- channelSettingsPane.addOption("ui.frameBufferSize",
- "Frame buffer size", OptionType.SPINNER);
- channelSettingsPane.addOption("ui.textPaneFontName",
- "Textpane font name",
- OptionType.FONT);
- channelSettingsPane.addOption("ui.textPaneFontSize",
- "Textpane font size",
- OptionType.SPINNER);
- channelSettingsPane.addOption("ui.inputbuffersize",
- "Input buffer size", OptionType.SPINNER);
- channelSettingsPane.addOption("ui.inputbackgroundcolour",
- "Inputfield background colour", OptionType.COLOUR);
- channelSettingsPane.addOption("ui.inputforegroundcolour",
- "Inputfield foreground colour", OptionType.COLOUR);
- channelSettingsPane.addOption("ui.nicklistbackgroundcolour",
- "Nicklist background colour", OptionType.COLOUR);
- channelSettingsPane.addOption("ui.nicklistforegroundcolour",
- "Nicklist foreground colour", OptionType.COLOUR);
- channelSettingsPane.addOption("channel.encoding", "Encoding",
- OptionType.COMBOBOX);
- }
-
- /** Initialises listeners for this dialog. */
- private void initListeners() {
- getOkButton().addActionListener(this);
- getCancelButton().addActionListener(this);
- }
-
- /**
- * Called whenever the user clicks on one of the two buttons.
- *
- * @param actionEvent Event generated by this action
- */
- @Override
- public void actionPerformed(final ActionEvent actionEvent) {
- if (getOkButton().equals(actionEvent.getSource())) {
- save();
- } else if (getCancelButton().equals(actionEvent.getSource())) {
- dispose();
- }
- }
-
- /** Saves the settings. */
- public void save() {
- channelModesPane.setChangedBooleanModes();
- topicModesPane.setChangedTopic();
- channelSettingsPane.save();
- channelListModesPane.save();
-
- identity.setOption("dialogstate", "channelsettingsdialog",
- String.valueOf(tabbedPane.getSelectedIndex()));
-
- dispose();
- }
-
- /** {@inheritDoc} */
- @Override
- public void dispose() {
- if (me == null) {
- return;
- }
- synchronized (me) {
- super.dispose();
- me = null;
- }
- }
- }
|