/*
 * Copyright (c) 2006-2015 DMDirc Developers
 *
 * 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.jpq;

import com.dmdirc.config.ConfigBinder;
import com.dmdirc.config.ConfigBinding;
import com.dmdirc.events.ChannelJoinEvent;
import com.dmdirc.events.ChannelPartEvent;
import com.dmdirc.events.ChannelQuitEvent;
import com.dmdirc.events.DisplayProperty;
import com.dmdirc.events.DisplayableEvent;
import com.dmdirc.interfaces.GroupChat;

import com.google.common.annotations.VisibleForTesting;

import net.engio.mbassy.listener.Handler;

/**
 * Handles {@link ChannelJoinEvent}, {@link ChannelPartEvent}, {@link ChannelQuitEvent} events and
 * hides them if the required.
 */
public class GroupChatHandler {

    private final GroupChat groupChat;
    private final ConfigBinder binder;
    private boolean hideEvents;

    public GroupChatHandler(final String domain, final GroupChat groupChat) {
        this.groupChat = groupChat;
        binder = groupChat.getWindowModel().getConfigManager().getBinder()
                .withDefaultDomain(domain);
    }

    /**
     * Loads this handler, adds required listeners and bindings.
     */
    public void load() {
        groupChat.getEventBus().subscribe(this);
        binder.bind(this, GroupChatHandler.class);
    }

    /**
     * Unloads this handler, removes required listeners and bindings.
     */
    public void unload() {
        groupChat.getEventBus().unsubscribe(this);
        binder.unbind(this);
    }

    @VisibleForTesting
    @ConfigBinding(key = "hidejpq")
    void handleSettingChange(final boolean value) {
        hideEvents = value;
    }

    @SuppressWarnings("TypeMayBeWeakened")
    @VisibleForTesting
    @Handler
    void handleJoin(final ChannelJoinEvent event) {
        if (event.getChannel().equals(groupChat)) {
            hideEvent(event);
        }
    }

    @SuppressWarnings("TypeMayBeWeakened")
    @VisibleForTesting
    @Handler
    void handlePart(final ChannelPartEvent event) {
        if (event.getChannel().equals(groupChat)) {
            hideEvent(event);
        }
    }

    @SuppressWarnings("TypeMayBeWeakened")
    @VisibleForTesting
    @Handler
    void handleQuit(final ChannelQuitEvent event) {
        if (event.getChannel().equals(groupChat)) {
            hideEvent(event);
        }
    }

    private void hideEvent(final DisplayableEvent event) {
        if (hideEvents) {
            event.setDisplayProperty(DisplayProperty.DO_NOT_DISPLAY, true);
        }
    }
}

@@ -1271,24 +1271,73 @@
 lJoinEvent;%0A
+import com.dmdirc.events.ChannelNickChangeEvent;%0A
 import com.d
@@ -1359,32 +1359,32 @@
 annelPartEvent;%0A
-
 import com.dmdir
@@ -1916,16 +1916,53 @@
 eEvents;
+%0A    private boolean hideNickChanges;
 %0A%0A    pu
@@ -2746,32 +2746,199 @@
 = value;%0A    %7D%0A%0A
+    @VisibleForTesting%0A    @ConfigBinding(key = %22hidenickchanges%22)%0A    void handleSettingChangeNickname(final boolean value) %7B%0A        hideNickChanges = value;%0A    %7D%0A%0A
     @SuppressWar
@@ -3556,32 +3556,32 @@
 s(groupChat)) %7B%0A
-
             hide
@@ -3607,24 +3607,331 @@
    %7D%0A    %7D%0A%0A
+    @SuppressWarnings(%22TypeMayBeWeakened%22)%0A    @VisibleForTesting%0A    @Handler%0A    void handleNickChange(final ChannelNickChangeEvent event) %7B%0A        if (event.getChannel().equals(groupChat) && hideNickChanges) %7B%0A            event.setDisplayProperty(DisplayProperty.DO_NOT_DISPLAY, true);%0A        %7D%0A    %7D%0A%0A
     private 

Add ability to hide nick change events in the jpq plugin.