diff --git a/English.lproj/AutoOpDialog.nib/classes.nib b/English.lproj/AutoOpDialog.nib/classes.nib
index f2ae6da5..0b3d37f7 100644
--- a/English.lproj/AutoOpDialog.nib/classes.nib
+++ b/English.lproj/AutoOpDialog.nib/classes.nib
@@ -15,9 +15,11 @@
};
SUPERCLASS = NSObject;
},
+ {CLASS = DialogWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = ListView; LANGUAGE = ObjC; SUPERCLASS = NSTableView; },
{CLASS = SingleLineFormatter; LANGUAGE = ObjC; SUPERCLASS = NSFormatter; },
+ {CLASS = TextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
{CLASS = TreeView; LANGUAGE = ObjC; SUPERCLASS = NSOutlineView; }
);
IBVersion = 1;
diff --git a/English.lproj/AutoOpDialog.nib/keyedobjects.nib b/English.lproj/AutoOpDialog.nib/keyedobjects.nib
index 7a53e638..c7ac18dd 100644
Binary files a/English.lproj/AutoOpDialog.nib/keyedobjects.nib and b/English.lproj/AutoOpDialog.nib/keyedobjects.nib differ
diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib
index 1d40f7ec..00ec1c30 100644
--- a/English.lproj/MainMenu.nib/classes.nib
+++ b/English.lproj/MainMenu.nib/classes.nib
@@ -75,7 +75,8 @@
},
{CLASS = ServerTreeView; LANGUAGE = ObjC; SUPERCLASS = NSOutlineView; },
{CLASS = SingleLineFormatter; LANGUAGE = ObjC; SUPERCLASS = NSFormatter; },
- {CLASS = Splitter; LANGUAGE = ObjC; SUPERCLASS = NSSplitView; }
+ {CLASS = Splitter; LANGUAGE = ObjC; SUPERCLASS = NSSplitView; },
+ {CLASS = TextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; }
);
IBVersion = 1;
}
\ No newline at end of file
diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib
index 4f956c66..541b5cb2 100644
--- a/English.lproj/MainMenu.nib/info.nib
+++ b/English.lproj/MainMenu.nib/info.nib
@@ -29,14 +29,14 @@
3
IBOpenObjects
+ 29
+ 432
367
21
387
327
374
426
- 432
- 29
IBSystem Version
8R2232
diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib
index 02e82fb4..51772efb 100644
Binary files a/English.lproj/MainMenu.nib/keyedobjects.nib and b/English.lproj/MainMenu.nib/keyedobjects.nib differ
diff --git a/LimeChat.tmproj b/LimeChat.tmproj
index 563cfc2b..54aeef0c 100644
--- a/LimeChat.tmproj
+++ b/LimeChat.tmproj
@@ -2,6 +2,8 @@
+ currentDocument
+ ruby/dialog/autoopdialog.rb
documents
@@ -18,10 +20,29 @@
fileHierarchyDrawerWidth
294
metaData
-
+
+ ruby/dialog/autoopdialog.rb
+
+ caret
+
+ column
+ 17
+ line
+ 114
+
+ firstVisibleColumn
+ 0
+ firstVisibleLine
+ 106
+
+
+ openDocuments
+
+ ruby/dialog/autoopdialog.rb
+
showFileHierarchyDrawer
windowFrame
- {{599, 93}, {991, 1073}}
+ {{619, 94}, {991, 1073}}
diff --git a/LimeChat.xcodeproj/project.pbxproj b/LimeChat.xcodeproj/project.pbxproj
index 2450d0c2..ce5e03da 100644
--- a/LimeChat.xcodeproj/project.pbxproj
+++ b/LimeChat.xcodeproj/project.pbxproj
@@ -66,6 +66,7 @@
78496EFD0C2890200084A836 /* preferencedialog.rb in Resources */ = {isa = PBXBuildFile; fileRef = 78496EFC0C2890200084A836 /* preferencedialog.rb */; };
7867EA4B0C227AD40017B510 /* NickSheet.nib in Resources */ = {isa = PBXBuildFile; fileRef = 7867EA490C227AD40017B510 /* NickSheet.nib */; };
78755D730C2AC0B30073FF42 /* logrenderer.rb in Resources */ = {isa = PBXBuildFile; fileRef = 78755D720C2AC0B30073FF42 /* logrenderer.rb */; };
+ 7877E0620C65B84E002F13C7 /* textfield.rb in Resources */ = {isa = PBXBuildFile; fileRef = 7877E0610C65B84E002F13C7 /* textfield.rb */; };
788C5E660C5F4F5A0034C46E /* growlcontroller.rb in Resources */ = {isa = PBXBuildFile; fileRef = 788C5E650C5F4F5A0034C46E /* growlcontroller.rb */; };
7890B4E90C659E4700DF983F /* autoopdialog.rb in Resources */ = {isa = PBXBuildFile; fileRef = 7890B4E80C659E4700DF983F /* autoopdialog.rb */; };
7890B4ED0C659E5D00DF983F /* AutoOpDialog.nib in Resources */ = {isa = PBXBuildFile; fileRef = 7890B4EB0C659E5D00DF983F /* AutoOpDialog.nib */; };
@@ -167,6 +168,7 @@
786926F40BB6EC1B0081019B /* main.m */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.objc; name = main.m; path = objc/main.m; sourceTree = ""; };
7869272D0BB6ED9E0081019B /* rb_main.rb */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = text.script.ruby; name = rb_main.rb; path = objc/rb_main.rb; sourceTree = ""; };
78755D720C2AC0B30073FF42 /* logrenderer.rb */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = text.script.ruby; path = logrenderer.rb; sourceTree = ""; };
+ 7877E0610C65B84E002F13C7 /* textfield.rb */ = {isa = PBXFileReference; fileEncoding = "-2147483647"; lastKnownFileType = text.script.ruby; path = textfield.rb; sourceTree = ""; };
78785B580BEDCF6800456645 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/ServerDialog.nib; sourceTree = ""; };
787FD46C0BFE960100F2F22D /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; };
788C5E650C5F4F5A0034C46E /* growlcontroller.rb */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = text.script.ruby; path = growlcontroller.rb; sourceTree = ""; };
@@ -377,6 +379,7 @@
78229BB80C288188001DD4C3 /* view */ = {
isa = PBXGroup;
children = (
+ 7877E0610C65B84E002F13C7 /* textfield.rb */,
78DA4EBF0C461D52008780C8 /* memberlistview.rb */,
78DA4EC00C461D52008780C8 /* servertreeview.rb */,
780D09EF0C2F2C20007C0F4F /* splitter.rb */,
@@ -553,6 +556,7 @@
78AD78E40C61B8F8001E77F4 /* Localizable.strings in Resources */,
7890B4E90C659E4700DF983F /* autoopdialog.rb in Resources */,
7890B4ED0C659E5D00DF983F /* AutoOpDialog.nib in Resources */,
+ 7877E0620C65B84E002F13C7 /* textfield.rb in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/ruby/controller/appcontroller.rb b/ruby/controller/appcontroller.rb
index e8a71f57..fe7bdcf5 100644
--- a/ruby/controller/appcontroller.rb
+++ b/ruby/controller/appcontroller.rb
@@ -197,8 +197,8 @@ def tab
when Preferences::General::TAB_UNREAD
move(:down, :unread)
true
- when Preferences::General::TAB_COMPLEMENT_NICK
- complement_nick
+ when Preferences::General::TAB_COMPLETE_NICK
+ complete_nick
true
else
false
@@ -247,7 +247,7 @@ def number(n)
private
- def complement_nick
+ def complete_nick
u, c = @world.sel
return unless u && c
@world.select_text if @window.firstResponder != @window.fieldEditor_forObject(true, @text)
diff --git a/ruby/controller/menucontroller.rb b/ruby/controller/menucontroller.rb
index 37b4b89c..3c27163f 100644
--- a/ruby/controller/menucontroller.rb
+++ b/ruby/controller/menucontroller.rb
@@ -207,8 +207,6 @@ def treeDialog_onClose(sender)
@tree_dialog = nil
end
-
-
def onAutoOp(sender)
unless @autoop_dialog
@autoop_dialog = AutoOpDialog.alloc.init
@@ -220,7 +218,7 @@ def onAutoOp(sender)
end
def autoOpDialog_onOk(sender, conf)
- puts 'ok'
+ @world.update_autoop(conf)
end
def autoOpDialog_onClose(sender)
@@ -228,9 +226,6 @@ def autoOpDialog_onClose(sender)
end
-
-
-
def onDcc(sender)
@world.dcc.show
end
diff --git a/ruby/controller/preferences.rb b/ruby/controller/preferences.rb
index a544d8cc..a7ba6fbc 100644
--- a/ruby/controller/preferences.rb
+++ b/ruby/controller/preferences.rb
@@ -50,7 +50,7 @@ class General
persistent_attr :connect_on_doubleclick, :disconnect_on_doubleclick, :join_on_doubleclick, :leave_on_doubleclick
persistent_attr :use_growl
- TAB_COMPLEMENT_NICK = 0
+ TAB_COMPLETE_NICK = 0
TAB_UNREAD = 1
TAB_NONE = 100
diff --git a/ruby/dialog/autoopdialog.rb b/ruby/dialog/autoopdialog.rb
index 89f5f81e..4333878d 100644
--- a/ruby/dialog/autoopdialog.rb
+++ b/ruby/dialog/autoopdialog.rb
@@ -18,12 +18,14 @@ def start(conf)
@c = @w.units
@c.each {|u| u.owner = @w; u.channels.each {|c| c.owner = u }}
NSBundle.loadNibNamed_owner('AutoOpDialog', self)
+ @window.key_delegate = self
+ @list.key_delegate = self
reload_tree
reload_list
@tree.expandItem(@w)
@c.each {|i| @tree.expandItem(i) }
- update
@window.makeFirstResponder(@edit)
+ update_buttons
show
end
@@ -42,7 +44,6 @@ def reload_tree
end
def reload_list
- @list.deselectAll(self)
@list.reloadData
end
@@ -51,8 +52,14 @@ def windowWillClose(sender)
end
def onOk(sender)
+ s = @edit.stringValue.to_s
+ unless s.empty?
+ onAdd(sender)
+ return
+ end
+
@c.each {|u| u.owner = nil; u.channels.each {|c| c.owner = nil }}
- fire_event('onOk', @c)
+ fire_event('onOk', @w)
@window.close
end
@@ -65,19 +72,33 @@ def onAdd(sender)
return unless sel
masks = sel.autoop
s = @edit.stringValue.to_s
+ return if s.empty?
i = masks.index(s)
- if i
- masks[i] = s
- else
- masks << s
- end
+ return if i
+ masks << s
masks.sort!
reload_list
+ i = masks.index(s)
+ @list.select(i)
@edit.setStringValue('')
end
def onOverwrite(sender)
- onAdd(sender)
+ sel = current_sel
+ return unless sel
+ masks = sel.autoop
+ s = @edit.stringValue.to_s
+ return if s.empty?
+ i = masks.index(s)
+ return if i
+ i = @list.selectedRows[0]
+ return unless i
+ masks[i] = s
+ masks.sort!
+ reload_list
+ i = masks.index(s)
+ @list.select(i)
+ @edit.setStringValue('')
end
def onDelete(sender)
@@ -88,11 +109,37 @@ def onDelete(sender)
return unless i
masks.delete_at(i)
i -= 1 if masks.length <= i
- @list.select(i)
+ if i >= 0
+ @list.select(i)
+ else
+ @edit.focus
+ end
reload_list
end
+ # window
+
+ def dialogWindow_onDown
+ sel = current_row
+ if sel
+ sel += 1
+ @tree.select(sel)
+ end
+ @edit.focus
+ end
+
+ def dialogWindow_onUp
+ sel = current_row
+ if sel
+ if sel > 0
+ sel -= 1
+ @tree.select(sel)
+ end
+ end
+ @edit.focus
+ end
+
# tree
def outlineView_numberOfChildrenOfItem(sender, item)
@@ -128,6 +175,7 @@ def outlineView_objectValueForTableColumn_byItem(sender, column, item)
end
def outlineViewSelectionDidChange(notification)
+ @list.deselectAll(self)
reload_list
end
@@ -146,18 +194,104 @@ def tableView_objectValueForTableColumn_row(sender, column, row)
sel.autoop[row]
end
+ def tableViewSelectionDidChange(n)
+ update_buttons
+ end
- def outlineViewSelectionDidChange(n)
- reload_list
+ def listView_onMoveUp(sender)
+ @edit.focus
end
- def current_sel
- sel = @tree.selectedRows
- sel.empty? ? nil : @tree.itemAtRow(sel[0])
+ def listView_onDelete(sender)
+ onDelete(sender)
+ end
+
+
+ # edit
+
+ objc_method 'control:textView:doCommandBySelector:', 'c@:@@:'
+ def control_textView_doCommandBySelector(control, textview, selector)
+ case selector
+ when 'moveDown:'
+ sel = current_sel
+ if sel
+ masks = sel.autoop
+ if masks.length > 0
+ @list.select(0)
+ @window.makeFirstResponder(@list)
+ end
+ end
+ true
+ else
+ false
+ end
end
+ def controlTextDidChange(sender)
+ update_buttons
+ end
+
+
private
+
+ def current_sel
+ sel = @tree.selectedRows[0]
+ sel ? @tree.itemAtRow(sel) : nil
+ end
+
+ def current_row
+ @tree.selectedRows[0]
+ end
+
+ def update_buttons
+ update_addButton
+ update_overwriteButton
+ update_deleteButton
+ end
+
+ def update_addButton
+ sel = current_sel
+ unless sel
+ @addButton.setEnabled(false)
+ return
+ end
+ s = @edit.stringValue.to_s
+ if s.empty?
+ @addButton.setEnabled(false)
+ return
+ end
+ masks = sel.autoop
+ i = masks.index(s)
+ if i
+ @addButton.setEnabled(false)
+ return
+ end
+ @addButton.setEnabled(true)
+ end
+
+ def update_overwriteButton
+ sel = current_sel
+ unless sel
+ @overwriteButton.setEnabled(false)
+ return
+ end
+ s = @edit.stringValue.to_s
+ if s.empty?
+ @overwriteButton.setEnabled(false)
+ return
+ end
+ masks = sel.autoop
+ i = masks.index(s)
+ if i
+ @overwriteButton.setEnabled(false)
+ return
+ end
+ i = @list.selectedRows[0]
+ @overwriteButton.setEnabled(i != nil)
+ end
- def update
+ def update_deleteButton
+ i = @list.selectedRows[0]
+ @deleteButton.setEnabled(i != nil)
end
end
diff --git a/ruby/irc/channel.rb b/ruby/irc/channel.rb
index 79912f1b..0af233d5 100644
--- a/ruby/irc/channel.rb
+++ b/ruby/irc/channel.rb
@@ -31,6 +31,10 @@ def setup(seed)
def update_config(seed)
@config = seed.dup
end
+
+ def update_autoop(conf)
+ @config.autoop = conf.autoop
+ end
def terminate
close_dialog
diff --git a/ruby/irc/unit.rb b/ruby/irc/unit.rb
index 18d841e5..ebd55613 100644
--- a/ruby/irc/unit.rb
+++ b/ruby/irc/unit.rb
@@ -89,6 +89,14 @@ def update_order(conf)
@channels = ary
end
+ def update_autoop(conf)
+ @config.autoop = conf.autoop
+ conf.channels.each do |i|
+ c = find_channel(i.name)
+ c.update_autoop(i) if c
+ end
+ end
+
def store_config
u = @config.dup
u.id = @id
diff --git a/ruby/irc/world.rb b/ruby/irc/world.rb
index 0748e18b..8fc40c9f 100644
--- a/ruby/irc/world.rb
+++ b/ruby/irc/world.rb
@@ -78,6 +78,15 @@ def update_order(w)
save
end
+ def update_autoop(w)
+ @config.autoop = w.autoop
+ w.units.each do |i|
+ u = find_unit_by_id(i.id)
+ u.update_autoop(i) if u
+ end
+ save
+ end
+
def store_tree
w = @config.dup
w.units = @units.map {|u| u.store_config }
@@ -239,10 +248,7 @@ def input_text(s)
end
def select_text
- @window.makeFirstResponder(@text)
- e = @text.currentEditor
- e.setSelectedRange(NSRange.new(@text.stringValue.length,0))
- e.scrollRangeToVisible(e.selectedRange)
+ @text.focus
end
def select(item)
diff --git a/ruby/view/dialogwindow.rb b/ruby/view/dialogwindow.rb
index 45f3cf18..12959c89 100644
--- a/ruby/view/dialogwindow.rb
+++ b/ruby/view/dialogwindow.rb
@@ -9,9 +9,35 @@ def sendEvent(e)
if @key_delegate
if e.oc_type == NSKeyDown
k = e.keyCode
- case k
- when 53 # esc
- @key_delegate.dialogWindow_onEscape
+ m = e.modifierFlags
+ shift = m & NSShiftKeyMask > 0
+ ctrl = m & NSControlKeyMask > 0
+ alt = m & NSAlternateKeyMask > 0
+ cmd = m & NSCommandKeyMask > 0
+
+ if !shift && !ctrl && !alt && !cmd
+ # none
+ case k
+ when 53 # esc
+ if @key_delegate.respond_to?(:dialogWindow_onEscape)
+ @key_delegate.dialogWindow_onEscape
+ return
+ end
+ end
+ elsif !shift && ctrl && !alt && !cmd || !shift && !ctrl && !alt && cmd
+ # cmd or ctrl
+ case k
+ when 125 #down
+ if @key_delegate.respond_to?(:dialogWindow_onDown)
+ @key_delegate.dialogWindow_onDown
+ return
+ end
+ when 126 #up
+ if @key_delegate.respond_to?(:dialogWindow_onUp)
+ @key_delegate.dialogWindow_onUp
+ return
+ end
+ end
end
end
end
diff --git a/ruby/view/listview.rb b/ruby/view/listview.rb
index d185907c..ec401a9f 100644
--- a/ruby/view/listview.rb
+++ b/ruby/view/listview.rb
@@ -3,6 +3,7 @@
class ListView < OSX::NSTableView
include OSX
+ attr_accessor :key_delegate
def countSelectedRows
selectedRowIndexes.count.to_i
@@ -44,4 +45,24 @@ def rightMouseDown(event)
end
super_rightMouseDown(event)
end
+
+ def keyDown(e)
+ if @key_delegate
+ case e.keyCode
+ when 51,117
+ sel = selectedRows[0]
+ if sel
+ @key_delegate.listView_onDelete(self)
+ return
+ end
+ when 126
+ sel = selectedRows[0]
+ if sel && sel == 0
+ @key_delegate.listView_onMoveUp(self)
+ return
+ end
+ end
+ end
+ super_keyDown(e)
+ end
end
diff --git a/ruby/view/textfield.rb b/ruby/view/textfield.rb
new file mode 100644
index 00000000..e8e4a83e
--- /dev/null
+++ b/ruby/view/textfield.rb
@@ -0,0 +1,13 @@
+# Created by Satoshi Nakagawa.
+# You can redistribute it and/or modify it under the Ruby's license or the GPL2.
+
+class TextField < OSX::NSTextField
+ include OSX
+
+ def focus
+ window.makeFirstResponder(self)
+ e = currentEditor
+ e.setSelectedRange(NSRange.new(stringValue.length, 0))
+ e.scrollRangeToVisible(e.selectedRange)
+ end
+end