manqod 1.1505.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/bin/manqod +309 -0
  2. data/doc/HOWTOS +11 -0
  3. data/doc/INSTALL +6 -0
  4. data/doc/LICENCE +450 -0
  5. data/doc/README +33 -0
  6. data/doc/benchmarkings/ListLoader.rb +177 -0
  7. data/doc/manqod.png +0 -0
  8. data/doc/manqod.svg +99 -0
  9. data/doc/server.conf.example +24 -0
  10. data/lib/About.rb +93 -0
  11. data/lib/BarMenu/BarMenuItem.rb +46 -0
  12. data/lib/BarMenu.rb +76 -0
  13. data/lib/ButtonMenu/ButtonMenuItem.rb +82 -0
  14. data/lib/ButtonMenu/EndSeparator.rb +14 -0
  15. data/lib/ButtonMenu/StartSeparator.rb +14 -0
  16. data/lib/ButtonMenu.rb +154 -0
  17. data/lib/Common/Conf.rb +119 -0
  18. data/lib/Common/Eprint.rb +180 -0
  19. data/lib/Common/EventCache.rb +41 -0
  20. data/lib/Common/Fixnum.rb +18 -0
  21. data/lib/Common/Images.rb +41 -0
  22. data/lib/Common/ManqodDB.rb +40 -0
  23. data/lib/Common/MyExec.rb +77 -0
  24. data/lib/Common/MyImage.rb +47 -0
  25. data/lib/Common/Nick.rb +25 -0
  26. data/lib/Common/String.rb +15 -0
  27. data/lib/FormHolder/Form/InputHolder/Button.rb +133 -0
  28. data/lib/FormHolder/Form/InputHolder/Calendar.rb +101 -0
  29. data/lib/FormHolder/Form/InputHolder/CalendarButton.rb +117 -0
  30. data/lib/FormHolder/Form/InputHolder/ColorButton.rb +54 -0
  31. data/lib/FormHolder/Form/InputHolder/Combo.rb +82 -0
  32. data/lib/FormHolder/Form/InputHolder/ComboWithNew.rb +103 -0
  33. data/lib/FormHolder/Form/InputHolder/Common/Model.rb +337 -0
  34. data/lib/FormHolder/Form/InputHolder/ConstCombo.rb +18 -0
  35. data/lib/FormHolder/Form/InputHolder/ConstText.rb +17 -0
  36. data/lib/FormHolder/Form/InputHolder/Duration.rb +73 -0
  37. data/lib/FormHolder/Form/InputHolder/EditableList.rb +57 -0
  38. data/lib/FormHolder/Form/InputHolder/FieldCombo.rb +40 -0
  39. data/lib/FormHolder/Form/InputHolder/FieldList.rb +40 -0
  40. data/lib/FormHolder/Form/InputHolder/FileChooser.rb +131 -0
  41. data/lib/FormHolder/Form/InputHolder/FontButton.rb +37 -0
  42. data/lib/FormHolder/Form/InputHolder/FormImage.rb +74 -0
  43. data/lib/FormHolder/Form/InputHolder/HScale.rb +44 -0
  44. data/lib/FormHolder/Form/InputHolder/Hidden.rb +41 -0
  45. data/lib/FormHolder/Form/InputHolder/Label.rb +40 -0
  46. data/lib/FormHolder/Form/InputHolder/List.rb +176 -0
  47. data/lib/FormHolder/Form/InputHolder/MultiLine.rb +63 -0
  48. data/lib/FormHolder/Form/InputHolder/Password.rb +41 -0
  49. data/lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb +269 -0
  50. data/lib/FormHolder/Form/InputHolder/QBuilder.rb +333 -0
  51. data/lib/FormHolder/Form/InputHolder/RadioGroup.rb +82 -0
  52. data/lib/FormHolder/Form/InputHolder/SourceView.rb +100 -0
  53. data/lib/FormHolder/Form/InputHolder/Spin.rb +49 -0
  54. data/lib/FormHolder/Form/InputHolder/Text.rb +55 -0
  55. data/lib/FormHolder/Form/InputHolder/TimeStamp.rb +82 -0
  56. data/lib/FormHolder/Form/InputHolder/TimeStampButton.rb +93 -0
  57. data/lib/FormHolder/Form/InputHolder/Toggle.rb +43 -0
  58. data/lib/FormHolder/Form/InputHolder.rb +458 -0
  59. data/lib/FormHolder/Form.rb +529 -0
  60. data/lib/FormHolder.rb +203 -0
  61. data/lib/Gtk.rb +101 -0
  62. data/lib/GtkAttributes.rb +76 -0
  63. data/lib/Kernel.rb +48 -0
  64. data/lib/ListHolder/EditableList/CellRenderers/Combo.rb +91 -0
  65. data/lib/ListHolder/EditableList/CellRenderers/ComboText.rb +22 -0
  66. data/lib/ListHolder/EditableList/CellRenderers/ConstCombo.rb +12 -0
  67. data/lib/ListHolder/EditableList/CellRenderers/ConstText.rb +23 -0
  68. data/lib/ListHolder/EditableList/CellRenderers/Pixbuf.rb +18 -0
  69. data/lib/ListHolder/EditableList/CellRenderers/Progress.rb +36 -0
  70. data/lib/ListHolder/EditableList/CellRenderers/Text.rb +51 -0
  71. data/lib/ListHolder/EditableList/CellRenderers/Toggle.rb +35 -0
  72. data/lib/ListHolder/EditableList/Column.rb +223 -0
  73. data/lib/ListHolder/EditableList/DrbListModel.rb +809 -0
  74. data/lib/ListHolder/EditableList/ListPrintOperation/ColumnsHeaderLayout.rb +56 -0
  75. data/lib/ListHolder/EditableList/ListPrintOperation/CustomPageSetup.rb +100 -0
  76. data/lib/ListHolder/EditableList/ListPrintOperation/FooterLayout.rb +26 -0
  77. data/lib/ListHolder/EditableList/ListPrintOperation/HeaderLayout.rb +35 -0
  78. data/lib/ListHolder/EditableList/ListPrintOperation/IterLayout.rb +89 -0
  79. data/lib/ListHolder/EditableList/ListPrintOperation.rb +365 -0
  80. data/lib/ListHolder/EditableList.rb +309 -0
  81. data/lib/ListHolder/GanttHolder/Gantt/Rectangle.rb +290 -0
  82. data/lib/ListHolder/GanttHolder/Gantt.rb +317 -0
  83. data/lib/ListHolder/GanttHolder/GanttFooter.rb +27 -0
  84. data/lib/ListHolder/GanttHolder/GanttScaler.rb +60 -0
  85. data/lib/ListHolder/GanttHolder.rb +31 -0
  86. data/lib/ListHolder/HistoryWindow.rb +63 -0
  87. data/lib/ListHolder/ListButtonHolder/ArchiveButton.rb +37 -0
  88. data/lib/ListHolder/ListButtonHolder/ButtonGroup.rb +32 -0
  89. data/lib/ListHolder/ListButtonHolder/FilterButton.rb +28 -0
  90. data/lib/ListHolder/ListButtonHolder/ListButton.rb +305 -0
  91. data/lib/ListHolder/ListButtonHolder/OrderingButton.rb +26 -0
  92. data/lib/ListHolder/ListButtonHolder/SumPanelButton.rb +23 -0
  93. data/lib/ListHolder/ListButtonHolder.rb +94 -0
  94. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Combo.rb +94 -0
  95. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/ConstCombo.rb +11 -0
  96. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Text.rb +26 -0
  97. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Toggle.rb +41 -0
  98. data/lib/ListHolder/ListPanel/ListFilter/FRenderer.rb +58 -0
  99. data/lib/ListHolder/ListPanel/ListFilter.rb +42 -0
  100. data/lib/ListHolder/ListPanel/ListSum/Text.rb +32 -0
  101. data/lib/ListHolder/ListPanel/ListSum.rb +72 -0
  102. data/lib/ListHolder/ListPanel.rb +60 -0
  103. data/lib/ListHolder.rb +241 -0
  104. data/lib/LoginWindow.rb +77 -0
  105. data/lib/MainRouter.rb +64 -0
  106. data/lib/ManqodCommon.rb +295 -0
  107. data/lib/ManqodHelp/FormatEditor/FormatJustificationWidget.rb +76 -0
  108. data/lib/ManqodHelp/FormatsEditor.rb +139 -0
  109. data/lib/ManqodHelp/HelpBrowser/FormatTagTable/FormatTag.rb +84 -0
  110. data/lib/ManqodHelp/HelpBrowser/FormatTagTable.rb +39 -0
  111. data/lib/ManqodHelp/HelpBrowser.rb +135 -0
  112. data/lib/ManqodHelp/HelpIndex.rb +62 -0
  113. data/lib/ManqodHelp/HelpToolbar.rb +16 -0
  114. data/lib/ManqodHelp.rb +120 -0
  115. data/lib/ManqodRPC.rb +37 -0
  116. data/lib/Memcache.rb +82 -0
  117. data/lib/MyConfig.rb +93 -0
  118. data/lib/Print/PrintItem/TextLayout.rb +47 -0
  119. data/lib/Print/PrintItem.rb +240 -0
  120. data/lib/Print.rb +199 -0
  121. data/lib/PrintEditor/ItemInfo/ItemImage.rb +30 -0
  122. data/lib/PrintEditor/ItemInfo/ItemList.rb +44 -0
  123. data/lib/PrintEditor/ItemInfo/ItemTextAlignment.rb +27 -0
  124. data/lib/PrintEditor/ItemInfo.rb +129 -0
  125. data/lib/PrintEditor/PageLayout.rb +91 -0
  126. data/lib/PrintEditor/PrintEditorItem.rb +310 -0
  127. data/lib/PrintEditor.rb +195 -0
  128. data/lib/RelationBuilder/RTable/RField.rb +91 -0
  129. data/lib/RelationBuilder/RTable.rb +293 -0
  130. data/lib/RelationBuilder/Relation/RelationHandle.rb +70 -0
  131. data/lib/RelationBuilder/Relation.rb +161 -0
  132. data/lib/RelationBuilder/RunQuery.rb +55 -0
  133. data/lib/RelationBuilder/SearchWindow.rb +72 -0
  134. data/lib/RelationBuilder.rb +468 -0
  135. data/lib/SB/ListProgress.rb +150 -0
  136. data/lib/SB/Messaging.rb +77 -0
  137. data/lib/SB.rb +29 -0
  138. data/lib/mynotebook.rb +131 -0
  139. data/lib/mytouchwindow.rb +162 -0
  140. data/lib/mywindow.rb +134 -0
  141. data/lib/wysiwyg-print-label.rb +57 -0
  142. metadata +231 -0
data/doc/manqod.svg ADDED
@@ -0,0 +1,99 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+ <svg
4
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
5
+ xmlns:cc="http://web.resource.org/cc/"
6
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7
+ xmlns:svg="http://www.w3.org/2000/svg"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
10
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11
+ version="1.0"
12
+ width="120"
13
+ height="120"
14
+ id="svg2"
15
+ sodipodi:version="0.32"
16
+ inkscape:version="0.45.1"
17
+ sodipodi:docname="manqod.svg"
18
+ sodipodi:docbase="/home/balint/manqod"
19
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
20
+ <metadata
21
+ id="metadata2220">
22
+ <rdf:RDF>
23
+ <cc:Work
24
+ rdf:about="">
25
+ <dc:format>image/svg+xml</dc:format>
26
+ <dc:type
27
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
28
+ </cc:Work>
29
+ </rdf:RDF>
30
+ </metadata>
31
+ <sodipodi:namedview
32
+ inkscape:window-height="975"
33
+ inkscape:window-width="1280"
34
+ inkscape:pageshadow="2"
35
+ inkscape:pageopacity="0.0"
36
+ guidetolerance="10.0"
37
+ gridtolerance="10.0"
38
+ objecttolerance="10.0"
39
+ borderopacity="1.0"
40
+ bordercolor="#666666"
41
+ pagecolor="#ffffff"
42
+ id="base"
43
+ inkscape:zoom="3.3916667"
44
+ inkscape:cx="60"
45
+ inkscape:cy="60"
46
+ inkscape:window-x="0"
47
+ inkscape:window-y="0"
48
+ inkscape:current-layer="svg2" />
49
+ <defs
50
+ id="defs4">
51
+ <marker
52
+ refX="0"
53
+ refY="0"
54
+ orient="auto"
55
+ style="overflow:visible"
56
+ id="Arrow1Lend">
57
+ <path
58
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
59
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
60
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
61
+ id="path3211" />
62
+ </marker>
63
+ <marker
64
+ refX="0"
65
+ refY="0"
66
+ orient="auto"
67
+ style="overflow:visible"
68
+ id="Arrow1Lstart">
69
+ <path
70
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
71
+ transform="matrix(0.8,0,0,0.8,10,0)"
72
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
73
+ id="path3208" />
74
+ </marker>
75
+ <filter
76
+ id="filter3341">
77
+ <feGaussianBlur
78
+ id="feGaussianBlur3343"
79
+ stdDeviation="0.55820388"
80
+ inkscape:collect="always" />
81
+ </filter>
82
+ <filter
83
+ inkscape:collect="always"
84
+ id="filter3226">
85
+ <feGaussianBlur
86
+ inkscape:collect="always"
87
+ stdDeviation="2.1985714"
88
+ id="feGaussianBlur3228" />
89
+ </filter>
90
+ </defs>
91
+ <path
92
+ id="path2174"
93
+ style="opacity:0.95679139;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#593600;stroke-width:7.66729735;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter3226)"
94
+ transform="matrix(-0.6622058,0,0,0.6022433,99.834328,0.4997877)"
95
+ d="M 36.27118,25.946988 C 51.47057,12.240538 53.06342,13.330338 63.41404,13.003188 C 78.44657,12.528048 81.9109,22.364018 84.84261,30.146038 C 88.67761,40.325788 84.21223,51.406798 80.5569,58.717468 C 75.93338,67.964498 70.14034,76.097998 67.69975,85.860328 C 65.78395,93.523538 67.70719,103.13467 67.70719,111.15619 C 67.70719,118.79594 66.13417,128.52125 66.19939,136.02621 C 66.31258,149.05231 67.22526,152.77325 67.37543,158.46493 C 67.59145,166.65259 66.87035,168.28128 66.87035,172.42632"
96
+ inkscape:export-filename="/home/balint/manqod/manqod.png"
97
+ inkscape:export-xdpi="90"
98
+ inkscape:export-ydpi="90" />
99
+ </svg>
@@ -0,0 +1,24 @@
1
+ # this is the main server uri (this usually matches with your server's and client's server.conf)
2
+ #
3
+ # for the host part you can use a fqdn or an ip
4
+ # use ip addresses to avoid waiting for the dns queries
5
+ #
6
+ #server_uri = "druby://192.168.1.1:5549"
7
+
8
+ # the server needs to connect back to clients, so client sends it's address on initial connection
9
+ # by default manqod will use your address returned by gethostname and send that to the server
10
+ # use client_uri, if you don't have a fqdn, or the server is not be able to resolve your fqdn, or can't reach you by the resolved fqdn
11
+ #
12
+ # for the port part you can fix the port or set 0, than your OS will asign one
13
+ #
14
+ #client_uri = "druby://192.168.1.2:0"
15
+
16
+ #the name of the connection, it was entered in the manqod-server-console on connection creation - not the visible name in the combo on the login window
17
+ #connection = "books"
18
+
19
+ #the authentication parameters in cleartext
20
+ #username = "guest"
21
+ #password = "password"
22
+
23
+ #these values might be overridden by the commandline parameters
24
+
data/lib/About.rb ADDED
@@ -0,0 +1,93 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class About < Gtk::VBox
6
+ include ManqodCommon
7
+ class Versions < Gtk::HBox
8
+ def initialize
9
+ super(true,3)
10
+ end
11
+ def add(text)
12
+ pack_start(Gtk::Label.new(text),true,true,2)
13
+ self
14
+ end
15
+ end
16
+
17
+ class Svn
18
+ def initialize(dir)
19
+ @dir=dir
20
+ @efilename="#{dir}/.svn/entries"
21
+ @svn = `which svn`.strip
22
+ end
23
+ attr_accessor :entries, :efilename, :revision, :format, :source, :last_update
24
+ def load
25
+ if FileTest.exists?(efilename)
26
+ @entries=Array.new
27
+ @entries=File.new(efilename,"r").readlines
28
+ return false if entries.nil?
29
+ @format=entries[0]
30
+ i=0
31
+ while entries[i].index("dir")!=0 and i<entries.size do i=i+1;end
32
+ @revision=entries[i+1]
33
+ while entries[i].index("svn://")!=0 and i<entries.size do i=i+1;end
34
+ @source=entries[i]
35
+ while entries[i]!="\n" and i<entries.size do i=i+1;end
36
+ while entries[i]=="\n" and i<entries.size do i=i+1;end
37
+ @last_update=entries[i]
38
+ true
39
+ else
40
+ einfo("file not found: #{efilename}")
41
+ false
42
+ end
43
+ end
44
+ def up
45
+ cr=revision
46
+ `cd #{@dir} && #{@svn} up`
47
+ self.load
48
+ cr!=revision
49
+ end
50
+ end
51
+
52
+ def initialize
53
+ @title="about"
54
+ super(false,3)
55
+ path=File::expand_path(File.join(File.dirname(__FILE__),".."))
56
+ svn=Svn.new(path)
57
+
58
+ if svn.load
59
+ pack_start(rev=Gtk::Label.new("manqod version subversion revision #{svn.revision}"))
60
+ pack_start(Gtk::HBox.new.pack_start(Gtk::Label.new).
61
+ pack_start(upb=Gtk::Button.new("update"),false,false).
62
+ pack_start(Gtk::Label.new),false,false
63
+ )
64
+ pack_start(Gtk::Label.new("manqod subversion source #{svn.source}"))
65
+ pack_start(lu=Gtk::Label.new("manqod subversion last update #{svn.last_update}"))
66
+ upb.signal_connect("clicked"){|me|
67
+ if svn.up
68
+ rev.set_text("#{rev.text} -> #{svn.revision}")
69
+ lu.set_text("#{lu.text} -> #{svn.last_update}")
70
+ warn("Manqod has been updated, please restart manqod!")
71
+ else
72
+ warn("No updates available!")
73
+ end
74
+ }
75
+ else
76
+ pack_start(Gtk::Label.new("manqod version unknown"))
77
+ end
78
+ pack_start(Gtk::Label.new("Logged in: #{nick}"))
79
+ pack_start(Gtk::Label.new("LICENCE"))
80
+ pack_start(Gtk::Label.new("
81
+ the author of this program(manqod) is Dobai-Pataky Balint(dpblnt@gmail.com)
82
+ manqod is released under the CDDL licence(http://www.opensource.org/licenses/cddl1.php) don't worry this only means the following:
83
+ * you can use it, copy it, modify it
84
+ * if you want your modifications to be distributed send them back to me, i'll merge them in
85
+ * nobody can sell it"))
86
+ pack_end(Versions.new.add("GTK+- #{Gtk::VERSION.join(".")}").add("Ruby #{RUBY_VERSION}").add("GLib #{GLib::VERSION.join(".")}").add("Ruby/GLib #{GLib::BINDING_VERSION.join(".")}").add("Ruby/GTK #{Gtk::BINDING_VERSION.join(".")}"))
87
+ end
88
+ attr_accessor :title
89
+
90
+ def update(notifier)
91
+ @title=notifier.text
92
+ end
93
+ end
@@ -0,0 +1,46 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class BarMenuItem < Gtk::ImageMenuItem
6
+ include ManqodCommon
7
+ include Conf
8
+
9
+ def initialize(menubar,iid)
10
+ @menubar=menubar
11
+ @id=iid
12
+ if row=admin.qrow("select gtkmenu.*,
13
+ modules.modname
14
+ from gtkmenu
15
+ left join modules on gtkmenu.module = modules.id
16
+ where gtkmenu.id='#{id}'")
17
+ @modname=row["modname"]
18
+ if row["module"].to_i == -1
19
+ @target=nil
20
+ else
21
+ @target=row['target']
22
+ end
23
+ end
24
+ @text=row['display']
25
+ super(text)
26
+ set_image(Gtk::Image.new(image_of_id(row['imageid'].to_i,"gtk-menu")))
27
+ child.modify_font(Pango::FontDescription.new(get_conf(0,0,"bar-menu-font")))
28
+ signal_connect("activate"){
29
+ edebug("menuitem #{id} #{target} emiting signal","menu","debug")
30
+ @menubar.update(self)
31
+ }
32
+ self
33
+ end
34
+ attr_accessor :target
35
+ attr_accessor :id
36
+ attr_accessor :modname
37
+ attr_accessor :text
38
+
39
+ def inspect
40
+ "SubMenuItem(#{id},#{text})"
41
+ end
42
+ def to_s
43
+ inspect
44
+ end
45
+ end
46
+
data/lib/BarMenu.rb ADDED
@@ -0,0 +1,76 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class BarMenu < Gtk::MenuBar
6
+ include ManqodCommon
7
+ include Conf
8
+
9
+
10
+ def initialize(mainrouter,pack_dir="horizontal")
11
+ super()
12
+ set_pack_direction(if pack_dir=="vertical" then Gtk::MenuBar::PACK_DIRECTION_TTB; else Gtk::MenuBar::PACK_DIRECTION_LTR;end)
13
+ @mainrouter=mainrouter
14
+ @last=nil
15
+ reinitialize
16
+ end
17
+ attr_accessor :last
18
+ attr_reader :mainrouter
19
+
20
+ def reinitialize
21
+ def remove_main_menu_items(pmenu)
22
+ pmenu.each{|menu_item|
23
+ pmenu.remove(menu_item)
24
+ }
25
+ end
26
+ def recmenuitem(parentid,pmenu)
27
+ admin_rows("select gtkmenu.*,
28
+ ifnull(childcnt.cnt,'0') as childs
29
+ from gtkmenu
30
+ left join (select count(id) as cnt,parent from gtkmenu group by parent) as childcnt on childcnt.parent=gtkmenu.id
31
+ left join (select count(id) as cnt,userid,groupid from usergroups group by groupid,userid) as ugrp on ugrp.groupid = gtkmenu.groupid
32
+ where gtkmenu.parent='#{parentid}' and userid='#{nick_id}' and ugrp.cnt>0
33
+ order by oid"){|row|
34
+ menuitem=BarMenuItem.new(self,row['id'])
35
+ @last=menuitem if row['id']==get_conf(0,0,"lastmenu")
36
+ if row['childs'].to_i > 0
37
+ menuitem.submenu=Gtk::Menu.new()
38
+ recmenuitem(row['id'],if row['parent'].to_i==-1 then pmenu else menuitem.submenu end)
39
+ end
40
+ pmenu.append(menuitem) unless row['parent'].to_i == -1
41
+ }
42
+ end
43
+ remove_main_menu_items(self)
44
+ recmenuitem(-1,self)
45
+ show_all
46
+ end
47
+
48
+ def update(notifier)
49
+ case notifier.class.name
50
+ when 'MyWindow'
51
+ reinitialize
52
+ @mainrouter.update(last) if last
53
+ when 'BarMenuItem'
54
+ if notifier.target
55
+ last=notifier
56
+ set_conf(0,0,"lastmenu",notifier.id) if notifier.modname != "quit"
57
+ edebug("#{last.target} emiting signal","menu","debug")
58
+ #setting the window insensitive so user can't interact while destroying and reiniting stuff
59
+ # get_ancestor(Gtk::Window).set_sensitive(false)
60
+ set_sensitive(false)
61
+ @mainrouter.update(last)
62
+ set_sensitive(true) unless destroyed?
63
+ # get_ancestor(Gtk::Window).set_sensitive(true) if !self.destroyed?
64
+ end
65
+ else
66
+ edebug("unknown routing: #{notifier.class.name}","menu","warning")
67
+ end
68
+ end
69
+
70
+ def to_s
71
+ "Main Menu"
72
+ end
73
+ def inspect
74
+ to_s
75
+ end
76
+ end
@@ -0,0 +1,82 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class ButtonMenuItem < Gtk::Button
6
+ include Observable
7
+ include ManqodCommon
8
+ def initialize(menu_id,parent_menu)
9
+ @menu_id=menu_id
10
+ @submenu=nil
11
+ @parent_menu=parent_menu
12
+ @image_size=nil
13
+ if row=admin.qrow("select gtkmenu.*,
14
+ modules.modname
15
+ from gtkmenu
16
+ left join modules on gtkmenu.module = modules.id
17
+ where gtkmenu.id='#{menu_id}'")
18
+ @modname=row["modname"]
19
+ if row["module"].to_i == -1
20
+ @target=nil
21
+ else
22
+ @target=row['target']
23
+ end
24
+ @text=row['display']
25
+ @image_id=row['imageid'].to_i
26
+ end
27
+ super()
28
+ set_use_underline(true)
29
+ set_relief(Gtk::ReliefStyle::NONE)
30
+ set_no_show_all(true)
31
+ set_label(text)
32
+ # set_image(Gtk::Image.new(image_of_id(@image_id,"gtk-large-toolbar")))
33
+ # resize_image("gtk-large-toolbar")
34
+ set_image_position(Gtk::PositionType::TOP)
35
+ signal_connect("clicked"){|me|
36
+ edebug(self.inspect+" clicked, so emiting signal","menu","debug")
37
+ parent_menu.submenu.hide_tree
38
+ show_up(self)
39
+ self.changed
40
+ notify_observers(self)
41
+ }
42
+ self
43
+ end
44
+ attr_accessor :target
45
+ attr_accessor :menu_id
46
+ attr_accessor :submenu
47
+ attr_accessor :text
48
+ attr_accessor :parent_menu
49
+ attr_accessor :modname
50
+
51
+ def update(notifier)
52
+ edebug(self.inspect+" we've been called, so emiting signal","menu","debug")
53
+ changed
54
+ notify_observers(notifier)
55
+ end
56
+
57
+ def to_s
58
+ "ButtonMenuItem(#{text})"
59
+ end
60
+
61
+ def show_up(caller)
62
+ edebug(inspect+" showup","menu","debug")
63
+ if submenu
64
+ if caller==self
65
+ submenu.show_items("gtk-small-toolbar",nil)
66
+ else
67
+ submenu.show_items("gtk-large-toolbar",caller)
68
+ end
69
+ parent_menu.show_up(self) if parent_menu
70
+ else
71
+ parent_menu.show_up(parent_menu) if parent_menu
72
+ end
73
+ end
74
+ def resize_image(new_size)
75
+ if @image_size!=new_size
76
+ set_image(Gtk::Image.new(image_of_id(@image_id,new_size)))
77
+ @image_size=new_size
78
+ end
79
+ end
80
+
81
+ end
82
+
@@ -0,0 +1,14 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class EndSeparator < Gtk::Arrow
6
+ def initialize(pack_dir)
7
+ super(if pack_dir == "vertical" then Gtk::Arrow::UP;else Gtk::Arrow::LEFT;end,Gtk::SHADOW_OUT)
8
+ set_size_request(20,10)
9
+ set_no_show_all(true)
10
+ end
11
+ def inspect
12
+ "EndSeparator of "+get_ancestor(MenuHolder).inspect
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class StartSeparator < Gtk::Arrow
6
+ def initialize(pack_dir)
7
+ super(if pack_dir == "vertical" then Gtk::Arrow::DOWN;else Gtk::Arrow::RIGHT;end,Gtk::SHADOW_OUT)
8
+ set_size_request(20,10)
9
+ set_no_show_all(true)
10
+ end
11
+ def inspect
12
+ "StartSeparator of "+get_ancestor(MenuHolder).inspect
13
+ end
14
+ end
data/lib/ButtonMenu.rb ADDED
@@ -0,0 +1,154 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class MenuHolder < Gtk::Alignment
6
+ include Observable
7
+ include ManqodCommon
8
+ include Conf
9
+
10
+ def initialize(parent_menu,pack_dir="horizontal")
11
+ @parent_menu=parent_menu
12
+ @pack_dir=pack_dir
13
+ @last=nil
14
+ if pack_dir=="vertical" then super(1,1,0,1);else super(1,1,1,0);end
15
+ @holder=if pack_dir=="vertical" then Gtk::VBox.new; else Gtk::HBox.new;end
16
+ holder.set_homogeneous(false)
17
+ holder.set_border_width(0)
18
+ add(holder)
19
+ # add(Gtk::Frame.new.add(holder))
20
+ # set_layout_style(Gtk::ButtonBox::SPREAD)
21
+ # set_icon_size_set(true)
22
+ # set_icon_size(Gtk::IconSize.from_name("gtk-small-toolbar"))
23
+ reinitialize
24
+ end
25
+ attr_accessor :last
26
+ attr_accessor :parent_menu
27
+ attr_accessor :holder
28
+ attr_accessor :pack_dir
29
+
30
+ def reinitialize
31
+ def remove_main_menu_items(pmenu)
32
+ pmenu.holder.each{|menu_item| pmenu.remove(menu_item)}
33
+ end
34
+ def recmenuitem(parentid,pmenu)
35
+ menuitem=nil
36
+ admin_rows("select gtkmenu.*,
37
+ ifnull(childs.cnt,0) as child_cnt
38
+ from gtkmenu
39
+ left join (select count(id) as cnt,parent from gtkmenu group by gtkmenu.parent) as childs on childs.parent = gtkmenu.id
40
+ left join (select count(id) as cnt, groupid from usergroups where userid='#{nick_id}' group by groupid) as perm on perm.groupid = gtkmenu.groupid
41
+ where gtkmenu.parent='#{parentid}' and (perm.cnt>0) order by oid"){|row|
42
+ menuitem=ButtonMenuItem.new(row['id'],pmenu)
43
+ if pmenu.nil?
44
+ menuitem.add_observer(self)
45
+ else
46
+ menuitem.add_observer(pmenu)
47
+ end
48
+ @last=menuitem if row['id'].to_i==get_conf(0,0,"lastmenu").to_i
49
+ if row['child_cnt'].to_i > 0
50
+ menuitem.submenu=MenuHolder.new(menuitem,pack_dir)
51
+ @last=menuitem.submenu.last if menuitem.submenu.last
52
+ end
53
+ holder.pack_start(menuitem,false,true)
54
+ holder.pack_start(menuitem.submenu,false,true) if menuitem.submenu
55
+ }
56
+ edebug("#{menuitem.inspect}(parentid: #{parentid}) added","menu","debug")
57
+ menuitem# unless menuitem.nil?
58
+ end
59
+
60
+ remove_main_menu_items(self)
61
+ case parent_menu.class.name
62
+ when 'MainRouter'
63
+ fomenu=recmenuitem(-1,nil)
64
+ add_observer(parent_menu)
65
+ if last.nil?
66
+ begin
67
+ fomenu.show_up(fomenu)
68
+ rescue =>err
69
+ tell_exception("no main menu!",backtrace_to_debug(err),"menu","error",false,false,"you might not have permission to view the main menu")
70
+ end
71
+ else
72
+ last.show_up(last)
73
+ end
74
+ when 'ButtonMenuItem'
75
+ holder.pack_start(StartSeparator.new(pack_dir),true,true) if !parent_menu.parent_menu.nil?
76
+ recmenuitem(parent_menu.menu_id,parent_menu)
77
+ holder.pack_end(EndSeparator.new(pack_dir),true,true) if !parent_menu.parent_menu.nil?
78
+ else
79
+ edebug("reinitialize: unknown routing(#{caller.class.name})","menu","warning")
80
+ end
81
+ # show_all
82
+ end
83
+
84
+ def show_items(new_size,caller)
85
+ before_caller=true
86
+ holder.each{|menuitem|
87
+ menuitem.resize_image(new_size) if menuitem.class.name == "ButtonMenuItem"
88
+ # set_child_packing(menuitem,false,true,1,Gtk::PackType::START) if before_caller
89
+ # set_child_packing(menuitem,false,true,1,Gtk::PackType::END) if !before_caller
90
+ menuitem.show
91
+ before_caller=false if caller == menuitem
92
+ edebug("#{menuitem} showing","menu")
93
+ }
94
+ end
95
+
96
+ def hide_tree
97
+ holder.each{|menuitem|
98
+ menuitem.submenu.hide_items if menuitem.class.name=="ButtonMenuItem" and menuitem.submenu
99
+ }
100
+ hide_items
101
+ end
102
+
103
+ def hide_items(except_this=nil)
104
+ holder.each{|menuitem|
105
+ if menuitem==except_this
106
+ menuitem.show
107
+ edebug(menuitem.inspect+" showing","menu","debug")
108
+ else
109
+ menuitem.hide
110
+ edebug(menuitem.inspect+" hiding","menu","debug")
111
+ end #if menuitem.class.name == "MenuItem"
112
+ # end
113
+ }
114
+ end
115
+
116
+ def update(notifier)
117
+ case notifier.class.name
118
+ when 'MyWindow'
119
+ edebug(inspect+" emiting signal","menu","debug")
120
+ # reinitialize
121
+ if last
122
+ last.show_up(last)
123
+ changed
124
+ notify_observers(last)
125
+ end
126
+ when 'ButtonMenuItem'
127
+ if notifier.target
128
+ @last=notifier
129
+ set_conf(0,0,"lastmenu",notifier.menu_id) if notifier.modname != "quit"
130
+ edebug(inspect+" emiting signal","menu","debug")
131
+ changed
132
+ #focused=get_ancestor(Gtk::Window).focus
133
+ #setting the window insensitive so user can't interact while destroying and reinitint stuff
134
+ # get_ancestor(Gtk::Window).
135
+ set_sensitive(false)
136
+ measure(last,"cyan"){notify_observers(last)}
137
+ # get_ancestor(Gtk::Window).
138
+ set_sensitive(true) unless destroyed?
139
+ #.set_focus(focused)
140
+ end
141
+ else
142
+ edebug(".update: unknown routing(#{notifier.class.name})","menu","warning")
143
+ end
144
+ end
145
+
146
+ def inspect
147
+ ret="ButtonMenuHolder"
148
+ ret=ret+" of "+parent_menu.text if parent_menu.class.name == "ButtonMenuItem"
149
+ ret
150
+ end
151
+ def to_s
152
+ inspect
153
+ end
154
+ end