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