Plugins/Dual Window Interface/AIJumpControlPlugin.m
author Zachary West <zacw@adium.im>
Mon Nov 02 18:30:22 2009 -0500 (2009-11-02)
changeset 2728 bb4935318350
parent 1946 866f1f27b315
permissions -rw-r--r--
Instead of inserting a <hr/> when we lose focus, which ends up breaking more than you'd expect, add a message class for the next message. Fixes #13300.

This removes the "Show Focus Lines" preference (always a good thing), and always inserts the mark in the scrollbar. It will be up to the style to implement the "focus" class to show the location. All previous messages of class "focus" will have "focus" removed when focus is lost again.
zacw@1543
     1
//
zacw@1543
     2
//  AIJumpControlPlugin.m
zacw@1543
     3
//  Adium
zacw@1543
     4
//
zacw@1543
     5
//  Created by Zachary West on 2009-04-04.
zacw@1543
     6
//
zacw@1543
     7
zacw@1543
     8
#import "AIJumpControlPlugin.h"
zacw@1543
     9
#import <AIUtilities/AIMenuAdditions.h>
zacw@1543
    10
#import <AIUtilities/JVMarkedScroller.h>
zacw@1543
    11
#import <AIUtilities/AIWindowAdditions.h>
zacw@1543
    12
#import <Adium/AIInterfaceControllerProtocol.h>
zacw@1543
    13
#import <Adium/AIMenuControllerProtocol.h>
zacw@1543
    14
#import <Adium/AIChat.h>
zacw@1543
    15
#import "AIMessageViewController.h"
zacw@1543
    16
#import "AIMessageTabViewItem.h"
zacw@1543
    17
zacw@1715
    18
#define PREF_KEY_FOCUS_LINE	@"Draw Focus Lines"
zacw@1715
    19
zacw@1581
    20
@interface AIJumpControlPlugin()
zacw@1581
    21
- (NSObject<AIMessageDisplayController> *)currentController;
zacw@1581
    22
@end
zacw@1581
    23
zacw@1543
    24
@implementation AIJumpControlPlugin
zacw@1543
    25
- (void)installPlugin
zacw@1543
    26
{
zacw@1581
    27
	menuItem_previous = [[NSMenuItem alloc] initWithTitle:AILocalizedString(@"Jump to Previous Mark", "Jump to the previous mark in the message window")
zacw@1581
    28
															   target:self
zacw@1581
    29
															   action:@selector(jumpToPrevious)
zacw@1581
    30
														keyEquivalent:@"["
zacw@1581
    31
															  keyMask:NSAlternateKeyMask | NSCommandKeyMask];
zacw@1543
    32
	
zacw@1581
    33
	[adium.menuController addMenuItem:menuItem_previous toLocation:LOC_Display_Jump];
zacw@1543
    34
	
zacw@1581
    35
	menuItem_next = [[NSMenuItem alloc] initWithTitle:AILocalizedString(@"Jump to Next Mark", "Jump to the next mark in the message window")
zacw@1581
    36
														   target:self
zacw@1581
    37
														   action:@selector(jumpToNext)
zacw@1581
    38
													keyEquivalent:@"]"
zacw@1581
    39
														  keyMask:NSAlternateKeyMask | NSCommandKeyMask];
zacw@1543
    40
	
zacw@1581
    41
	[adium.menuController addMenuItem:menuItem_next toLocation:LOC_Display_Jump];
zacw@1543
    42
	
zacw@1581
    43
	menuItem_focus = [[NSMenuItem alloc] initWithTitle:AILocalizedString(@"Jump to Focus Mark", "Jump to the next location in the message window where the user last saw content")
zacw@1581
    44
															target:self
zacw@1581
    45
															action:@selector(jumpToFocus)
zacw@1581
    46
													 keyEquivalent:@""];
zacw@1543
    47
	
zacw@1581
    48
	[adium.menuController addMenuItem:menuItem_focus toLocation:LOC_Display_Jump];
zacw@1543
    49
	
zacw@1581
    50
	menuItem_add = [[NSMenuItem alloc] initWithTitle:AILocalizedString(@"Add Mark", "Inserts a custom mark into the message window")
zacw@1581
    51
														  target:self
zacw@1581
    52
														  action:@selector(addMark)
zacw@1581
    53
												   keyEquivalent:@""];
zacw@1543
    54
	
zacw@1581
    55
	[adium.menuController addMenuItem:menuItem_add toLocation:LOC_Display_Jump];
zacw@1543
    56
}
zacw@1543
    57
zacw@1543
    58
- (void)uninstallPlugin
zacw@1543
    59
{
zacw@1581
    60
	[adium.menuController removeMenuItem:menuItem_previous];
zacw@1581
    61
	[adium.menuController removeMenuItem:menuItem_next];
zacw@1581
    62
	[adium.menuController removeMenuItem:menuItem_focus];
zacw@1581
    63
	[adium.menuController removeMenuItem:menuItem_add];
zacw@1543
    64
}
zacw@1543
    65
zacw@1543
    66
#pragma mark Jump handling
zacw@1543
    67
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
zacw@1543
    68
{
zacw@1581
    69
	if (menuItem == menuItem_previous) {
zacw@1581
    70
		return [self.currentController previousMarkExists];
zacw@1581
    71
	} else if (menuItem == menuItem_next) {
zacw@1581
    72
		return [self.currentController nextMarkExists];
zacw@1581
    73
	} else if (menuItem == menuItem_focus) {
zacw@1581
    74
		return [self.currentController focusMarkExists];
zacw@1581
    75
	}
zacw@1581
    76
	
zacw@1715
    77
	return (nil != adium.interfaceController.activeChat);
zacw@1543
    78
}
zacw@1543
    79
zacw@1543
    80
- (NSObject<AIMessageDisplayController> *)currentController
zacw@1543
    81
{
zacw@1588
    82
	return adium.interfaceController.activeChat.chatContainer.messageViewController.messageDisplayController;
zacw@1543
    83
}
zacw@1543
    84
zacw@1543
    85
- (void)jumpToPrevious
zacw@1543
    86
{
zacw@1543
    87
	[self.currentController jumpToPreviousMark];
zacw@1543
    88
}
zacw@1543
    89
zacw@1543
    90
- (void)jumpToNext
zacw@1543
    91
{
zacw@1543
    92
	[self.currentController jumpToNextMark];
zacw@1543
    93
}
zacw@1543
    94
zacw@1543
    95
- (void)jumpToFocus
zacw@1543
    96
{
zacw@1543
    97
	[self.currentController jumpToFocusMark];
zacw@1543
    98
}
zacw@1543
    99
zacw@1543
   100
- (void)addMark
zacw@1543
   101
{
zacw@1543
   102
	[self.currentController addMark];
zacw@1543
   103
}
zacw@1543
   104
zacw@1543
   105
@end