bool RunDemo(SD3dDemo _demo) { SetupWindow(); _demo.m_pInit(); bool bQuit = false; while(!bQuit) { CheckMessages(bQuit); if(!bQuit) { _demo.m_pRender(); } } _demo.m_pCleanUp(); CleanUpWindow(); return true; }
status_t FolderShaper::ShapeRef (entry_ref * a_ref, const char * a_template, bool a_do_open) { PRINT(("ShapeRef(%s, %s)\n", a_ref->name, a_template)); status_t status; // store original_name BEntry original_entry (a_ref, true); original_entry. GetRef (a_ref); BString original_name = a_ref->name; BPath original_path (& original_entry); BString original_path_string = original_path.Path(); NameSafe(& original_path_string); BPath original_parent_path; original_path.GetParent(& original_parent_path); BDirectory parent_dir(original_parent_path.Path()); // temp name BString new_name = a_ref->name; new_name.Prepend("New "); int32 counter = 2; while(parent_dir.Contains(new_name.String())) { new_name = a_ref->name; new_name.Append(" (temporary "); new_name << counter; new_name.Append(")"); counter ++; } PRINT(("original_name: %s\n", original_name.String())); PRINT(("new_name: %s\n", new_name.String())); PRINT(("original_path: %s\n", original_path.Path())); PRINT(("original_path_string: %s\n", original_path_string.String())); PRINT(("original_parent_path: %s\n", original_parent_path.Path())); BPath template_path (m_tmpl_dir, a_template); BEntry tmp_entry; // traverse link to template if ((status = tmp_entry.SetTo(template_path.Path(), true)) != B_OK) { // message return status; } template_path.SetTo(& tmp_entry); BString template_path_string = template_path.Path(); NameSafe(& template_path_string); PRINT(("template_path_string: %s\n", template_path_string.String())); BPath new_path (original_parent_path.Path(), new_name.String()); BString new_path_string = new_path.Path(); NameSafe(& new_path_string); PRINT(("new_path_string: %s\n", new_path_string.String())); BString command; if(m_do_keep_position) { // copy X/Y position attribute from Original Folder command = "copyattr -n _trk/pinfo_le "; command.Append(original_path_string); command.Append(" "); command.Append(template_path_string); PRINT(("copy X/Y position: \n%s\n", command.String())); system(command.String()); } else { BNode template_node(& tmp_entry); template_node.RemoveAttr("_trk/pinfo_le"); } // copy template -> "New name" (temp) command = "copyattr -d -r "; command.Append(template_path_string); command.Append(" "); command.Append(new_path_string); PRINT(("copy template -> temp: \n%s\n", command.String())); system(command.String()); // New folder exists? BDirectory new_directory; if((status = new_directory.SetTo(new_path.Path())) != B_OK) { ErrorMessage("new_directory.SetTo() ", status); // ... probably want a BAlert return status; } BDirectory original_dir; if((status = original_dir.SetTo(original_path.Path())) != B_OK) { ErrorMessage("original_dir.SetTo() ", status); // ... probably want a BAlert return status; } // Move stuff from original folder to new folder BEntry original_content_entry; while(original_dir.GetNextEntry(&original_content_entry) == B_OK) { if ((status = original_content_entry .MoveTo(& new_directory, NULL, ! m_do_clobber)) != B_OK && (status != B_FILE_EXISTS || (! m_do_clobber) == true)) { ErrorMessage("original_content_entry.MoveTo() ", status); return status; // ... definitely needs a fat BAlert } } // Move original folder to Trash // alt. // Delete bool was_open = false; if (m_do_move) { // Is Folder Open ? was_open = IsFolderOpen(a_ref); // Close Original Folder status = MoveRefToTrash(a_ref); // This calls Tracker to move the ref. // If the folder is open, Tracker will close it. for (int j = 0; j < 250; j++) { PRINT(("loop: %d\n", j)); if (original_entry.Exists() == false) break; snooze(20000); // give Tracker some Time to Move // .... consider using node-monitoring instead to // catch when Tracker has moved the folder to Trash } } else { status = original_entry.Remove(); if (status != B_OK) { ErrorMessage("original_content_entry.MoveTo() ", status); // BAlert.. Could not remove original folder // return status; } } // Rename New Folder -> Original Name BEntry new_entry(new_path.Path()); status = new_entry.Rename(original_name.String()); if (status != B_OK) ErrorMessage("new_entry.Rename() ", status); entry_ref new_ref; status = new_entry.GetRef(& new_ref); if (status != B_OK) ErrorMessage("new_entry.GetRef() ", status); // Open New Folder if (was_open) PRINT(("was_open == true\n")); if (! was_open) PRINT(("was_open == false\n")); if (((m_do_open == FS_IF_ORIGINAL_OPEN) && was_open) || m_do_open == FS_ALWAYS_OPEN) { // open folder command = original_path_string; command.Prepend("/boot/system/Tracker "); command.Append(" &"); system(command.String()); // wait for new folder to open WaitForOpeningFolder(& new_ref); // Clean Up All if (m_do_clean_up) CleanUpWindow(& new_ref); } return B_OK; }