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



157
158
159
160
161
162
# File 'lib/osaka/typicalapplication.rb', line 157

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

#close(option = :user_chose) ⇒ Object



152
153
154
155
# File 'lib/osaka/typicalapplication.rb', line 152

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



172
173
174
# File 'lib/osaka/typicalapplication.rb', line 172

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

#create_dialog(dialog_class, location) ⇒ Object



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

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:



89
90
91
92
93
94
# File 'lib/osaka/typicalapplication.rb', line 89

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

#cutObject



180
181
182
# File 'lib/osaka/typicalapplication.rb', line 180

def cut
  control.keystroke("x", :command)
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



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/osaka/typicalapplication.rb', line 100

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_window {
    control.click_menu_bar(at.menu_item("Duplicate"), "File")
  }
  new_instance = clone
  new_instance.control.set_current_window(do_and_wait_for_new_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



116
117
118
119
120
# File 'lib/osaka/typicalapplication.rb', line 116

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

#duplicate_available?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/osaka/typicalapplication.rb', line 96

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

#focusObject



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

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



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

def new_document
  control.set_current_window(do_and_wait_for_new_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_window {
    control.tell("open \"#{abolutePathFileName}\"")
  }
  control.set_current_window(new_window)
end

#pasteObject



176
177
178
# File 'lib/osaka/typicalapplication.rb', line 176

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


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

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



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

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)


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

def running?
  control.running?
end

#saveObject



122
123
124
# File 'lib/osaka/typicalapplication.rb', line 122

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

#save_as(filename) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/osaka/typicalapplication.rb', line 130

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)


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

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

#select_allObject



184
185
186
# File 'lib/osaka/typicalapplication.rb', line 184

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

#select_file_from_open_dialog(filename, dialog_location) ⇒ Object



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

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



145
146
147
148
149
150
# File 'lib/osaka/typicalapplication.rb', line 145

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