Class: Osaka::TypicalApplication

Inherits:
Object
  • Object
show all
Defined in:
lib/osaka/typicalapplication.rb

Direct Known Subclasses

Calculator, Keynote, Numbers, Pages, Preview, TextEdit

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ TypicalApplication

Returns a new instance of TypicalApplication.



20
21
22
23
# File 'lib/osaka/typicalapplication.rb', line 20

def initialize(name)
  @name = name
  @control = RemoteControl.new(name)
end

Instance Attribute Details

#controlObject

Returns the value of attribute control.



18
19
20
# File 'lib/osaka/typicalapplication.rb', line 18

def control
  @control
end

Instance Method Details

#activateObject



167
168
169
170
171
172
# File 'lib/osaka/typicalapplication.rb', line 167

def activate
  if (control.mac_version == :lion)
    control.launch unless control.running?
  end
  control.activate
end

#close(option = :user_chose) ⇒ Object



162
163
164
165
# File 'lib/osaka/typicalapplication.rb', line 162

def close(option = :user_chose)
  control.keystroke("w", :command)
  wait_for_window_and_dialogs_to_close(option)
end

#close_dialog_sheet_with_dont_saveObject



59
60
61
62
63
# File 'lib/osaka/typicalapplication.rb', line 59

def close_dialog_sheet_with_dont_save
  if (control.exists?(at.sheet(1)))
    control.click!(at.button("Don’t Save").sheet(1))
  end
end

#copyObject



182
183
184
# File 'lib/osaka/typicalapplication.rb', line 182

def copy
  control.keystroke("c", :command)
end

#create_dialog(dialog_class, location) ⇒ Object



203
204
205
# File 'lib/osaka/typicalapplication.rb', line 203

def create_dialog(dialog_class, location)
  dialog_class.new(control.name, location + (location.has_top_level_element? ? "" : control.base_location))
end

#create_document(filename) {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



99
100
101
102
103
104
# File 'lib/osaka/typicalapplication.rb', line 99

def create_document(filename)
  new_document
  yield self
  save_as(filename)
  close
end

#cutObject



190
191
192
# File 'lib/osaka/typicalapplication.rb', line 190

def cut
  control.keystroke("x", :command)
end

#do_and_wait_for_new_standard_windowObject



82
83
84
85
86
87
88
89
90
# File 'lib/osaka/typicalapplication.rb', line 82

def do_and_wait_for_new_standard_window
  control.activate
  latest_window_list = original_window_list = control.standard_window_list
  yield
  while ((latest_window_list - original_window_list).size == 0)
    latest_window_list = control.standard_window_list
  end
  (latest_window_list - original_window_list)[0]
end

#do_and_wait_for_new_windowObject



72
73
74
75
76
77
78
79
80
# File 'lib/osaka/typicalapplication.rb', line 72

def do_and_wait_for_new_window
  control.activate
  latest_window_list = original_window_list = control.window_list
  yield
  while ((latest_window_list - original_window_list).size == 0)
    latest_window_list = control.window_list
  end
  (latest_window_list - original_window_list)[0]
end

#duplicateObject



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/osaka/typicalapplication.rb', line 110

def duplicate
  unless duplicate_available?
    raise(Osaka::VersioningError, "MacOS Versioning Error: Duplicate is not available on this Mac version")
  end
  do_and_wait_for_new_standard_window {
    control.click_menu_bar(at.menu_item("Duplicate"), "File")
  }
  new_instance = clone
  new_instance.control.set_current_window(do_and_wait_for_new_standard_window {
    sleep(0.4) # This sleep is added because mountain lion keynote crashes without it!
    control.keystroke!(:return)
  }) unless control.mac_version == :lion

  new_instance
end

#duplicate_and_close_originalObject



126
127
128
129
130
# File 'lib/osaka/typicalapplication.rb', line 126

def duplicate_and_close_original
  new_instance = duplicate
  close
  @control = new_instance.control
end

#duplicate_available?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/osaka/typicalapplication.rb', line 106

def duplicate_available?
  control.exists?(at.menu_item("Duplicate").menu(1).menu_bar_item("File").menu_bar(1))
end

#focusObject



174
175
176
# File 'lib/osaka/typicalapplication.rb', line 174

def focus
  control.focus
end

#get_infoObject



30
31
32
33
# File 'lib/osaka/typicalapplication.rb', line 30

def get_info
  script_info = control.tell("get info for (path to application \"#{@name}\")")
  ApplicationInfo.new(script_info)
end

#initialize_copy(other) ⇒ Object



25
26
27
28
# File 'lib/osaka/typicalapplication.rb', line 25

def initialize_copy(other)
  super
  @control = other.control.clone
end

#new_documentObject



92
93
94
95
96
97
# File 'lib/osaka/typicalapplication.rb', line 92

def new_document
  control.set_current_window(do_and_wait_for_new_standard_window {
    control.keystroke("n", :command)
  })
  control.focus
end

#open(filename) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/osaka/typicalapplication.rb', line 35

def open (filename)
  abolutePathFileName = File.absolute_path(filename)
  new_window = do_and_wait_for_new_standard_window {
    control.tell("open \"#{abolutePathFileName}\"")
  }
  control.set_current_window(new_window)
end

#pasteObject



186
187
188
# File 'lib/osaka/typicalapplication.rb', line 186

def paste
  control.keystroke("v", :command)
end


198
199
200
201
# File 'lib/osaka/typicalapplication.rb', line 198

def print_dialog
  control.keystroke("p", :command).wait_until_exists(at.sheet(1))
  create_dialog(TypicalPrintDialog, at.sheet(1))
end

#quit(option = :user_chose) ⇒ Object



65
66
67
68
69
70
# File 'lib/osaka/typicalapplication.rb', line 65

def quit(option = :user_chose)
  if control.running?
    control.quit
    wait_for_application_to_quit(option)
  end
end

#raise_error_on_open_standard_windows(error_message) ⇒ Object



213
214
215
# File 'lib/osaka/typicalapplication.rb', line 213

def raise_error_on_open_standard_windows(error_message)
  raise Osaka::ApplicationWindowsMustBeClosed, error_message if ! control.standard_window_list.empty?
end

#running?Boolean

Returns:

  • (Boolean)


178
179
180
# File 'lib/osaka/typicalapplication.rb', line 178

def running?
  control.running?
end

#saveObject



132
133
134
# File 'lib/osaka/typicalapplication.rb', line 132

def save
  control.keystroke("s", :command)
end

#save_as(filename) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/osaka/typicalapplication.rb', line 140

def save_as(filename)
  if save_pops_up_dialog?
    save
  else
    if duplicate_available?
      duplicate_and_close_original
      save
    else
      control.keystroke("s", [:command, :shift])
    end
  end

  wait_for_save_dialog_and_save_file(filename)
end

#save_pops_up_dialog?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/osaka/typicalapplication.rb', line 136

def save_pops_up_dialog?
  control.exists?(at.menu_item("Save…").menu(1).menu_bar_item("File").menu_bar(1))
end

#select_allObject



194
195
196
# File 'lib/osaka/typicalapplication.rb', line 194

def select_all
  control.keystroke("a", :command)
end

#select_file_from_open_dialog(filename, dialog_location) ⇒ Object



207
208
209
210
211
# File 'lib/osaka/typicalapplication.rb', line 207

def select_file_from_open_dialog(filename, dialog_location)
  dialog = create_dialog(TypicalOpenDialog, dialog_location)
  dialog.set_folder(File.dirname(filename))
  dialog.select_file(File.basename(filename))
end

#wait_for_application_to_quit(option) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/osaka/typicalapplication.rb', line 51

def wait_for_application_to_quit(option)
  if (option != :user_chose)
    while control.running?
      close_dialog_sheet_with_dont_save
    end
  end
end

#wait_for_save_dialog_and_save_file(filename) ⇒ Object



155
156
157
158
159
160
# File 'lib/osaka/typicalapplication.rb', line 155

def wait_for_save_dialog_and_save_file(filename)
  control.wait_until_exists(at.sheet(1))
  dialog = create_dialog(TypicalSaveDialog, at.sheet(1))
  dialog.save(filename)
  control.set_current_window(File.basename(filename))
end

#wait_for_window_and_dialogs_to_close(option) ⇒ Object



43
44
45
46
47
48
49
# File 'lib/osaka/typicalapplication.rb', line 43

def wait_for_window_and_dialogs_to_close(option)
  if (option != :user_chose)
    control.until_not_exists!(control.base_location) {
      close_dialog_sheet_with_dont_save
    }
  end
end